diff --git a/client/components/codeEditor/codeEditor.jsx b/client/components/codeEditor/codeEditor.jsx
index 836006ec4..0bea4f18a 100644
--- a/client/components/codeEditor/codeEditor.jsx
+++ b/client/components/codeEditor/codeEditor.jsx
@@ -13,9 +13,12 @@ import {
ViewPlugin,
drawSelection,
dropCursor,
+ rectangularSelection,
+ crosshairCursor,
} from '@codemirror/view';
import { EditorState, Compartment, StateEffect, StateField } from '@codemirror/state';
import { foldAll as foldAllCmd, unfoldAll as unfoldAllCmd, foldGutter, foldKeymap, syntaxHighlighting } from '@codemirror/language';
+import { foldEffect } from '@codemirror/language';
import { defaultKeymap, history, undo, redo, undoDepth, redoDepth } from '@codemirror/commands';
import { languages } from '@codemirror/language-data';
import { css } from '@codemirror/lang-css';
@@ -27,14 +30,16 @@ import { closeBrackets } from '@codemirror/autocomplete';
const autoCloseBrackets = closeBrackets({ brackets: ['()', '[]', '{{}}'] });
-import * as themesImport from '@uiw/codemirror-themes-all';
import defaultCM5Theme from '@themes/codeMirror/default.js';
import darkbrewery from '@themes/codeMirror/darkbrewery.js';
+import cm5Themes from 'codemirror-5-themes';
-const themes = { default: defaultCM5Theme, darkbrewery, ...themesImport };
+const themes = { default: defaultCM5Theme, ...cm5Themes, darkbrewery };
const themeCompartment = new Compartment();
const highlightCompartment = new Compartment();
+console.log(themes);
+
import { generalKeymap, markdownKeymap } from './customKeyMaps.js';
import foldOnPages from './customFolding.js';
import { customHighlightStyle, tokenizeCustomMarkdown, tokenizeCustomCSS } from './customHighlight.js';
@@ -229,6 +234,8 @@ const CodeEditor = forwardRef(
//multiple cursors and selections
drawSelection(),
+ rectangularSelection(),
+ crosshairCursor(),
EditorState.allowMultipleSelections.of(true),
dropCursor(),
programmaticCursorLineField,
@@ -392,7 +399,19 @@ const CodeEditor = forwardRef(
foldAll : ()=>{
const view = viewRef.current;
if(!view) return;
- view.dispatch(foldAllCmd(view));
+
+ const doc = view.state.doc;
+ const pages = pageMap.current;
+
+ const effects = pages.map((start, i)=>{
+ const next = pages[i + 1] || doc.length;
+ const from = i ? doc.line(doc.lineAt(start).number + 1).from : 0;
+ const to = doc.line(doc.lineAt(next).number).from - 1;
+
+ return to > from ? foldEffect.of({ from, to }) : null;
+ }).filter(Boolean);
+
+ view.dispatch({ effects });
},
unfoldAll : ()=>{
const view = viewRef.current;
diff --git a/client/components/codeEditor/codeEditor.less b/client/components/codeEditor/codeEditor.less
index 3f3869756..84ed8058d 100644
--- a/client/components/codeEditor/codeEditor.less
+++ b/client/components/codeEditor/codeEditor.less
@@ -1,31 +1,134 @@
// Icon fonts for emoji/autocomplete
-@import (less) "@themes/fonts/iconFonts/diceFont.less";
-@import (less) "@themes/fonts/iconFonts/elderberryInn.less";
-@import (less) "@themes/fonts/iconFonts/gameIcons.less";
-@import (less) "@themes/fonts/iconFonts/fontAwesome.less";
+@import (less) '@themes/fonts/iconFonts/diceFont.less';
+@import (less) '@themes/fonts/iconFonts/elderberryInn.less';
+@import (less) '@themes/fonts/iconFonts/gameIcons.less';
+@import (less) '@themes/fonts/iconFonts/fontAwesome.less';
@keyframes sourceMoveAnimation {
50% {
- color: white;
- background-color: red;
+ color : white;
+ background-color : red;
}
100% {
- color: unset;
- background-color: unset;
+ color : unset;
+ background-color : unset;
}
}
:where(.codeEditor) {
- font-family: monospace;
- height: 100%;
- width:100%;
-
- .cm-content {
- tab-size:2 !important;
+ width : 100%;
+ height : calc(100% - 25px);
+ font-family : monospace;
+
+ .cm-editor {
+ height : 100%;
+ outline : none !important;
}
- @media screen and (pointer: coarse) {
- font-size: 16px;
+ &.brewSnippets .cm-snippetLine,
+ :where(&.brewText) .cm-pageLine {
+ background : #33333328;
+ border-top : #333399 solid 1px;
+ }
+
+ &.brewSnippets {
+ .cm-pageLine {
+ color : #777777;
+ background : #3E4E3E1B;
+ border-top : #3399423B solid 1px;
+ }
+ }
+
+ &:where(.brewText), &.brewSnippets {
+
+
+ .cm-pageLine[data-page-number]::after {
+ float : right;
+ color : grey;
+ content : attr(data-page-number);
+ }
+ .cm-columnSplit {
+ font-style : italic;
+ color : grey;
+ background-color : fade(#229999, 15%);
+ border-bottom : #229999 solid 1px;
+ }
+ .cm-define {
+ &:not(.term):not(.definition) {
+ font-weight : bold;
+ color : #949494;
+ background : #E5E5E5;
+ border-radius : 3px;
+ }
+ &.term { color : rgb(96, 117, 143); }
+ &.definition { color : rgb(97, 57, 178); }
+ }
+ .cm-block:not(.cm-comment) {
+ font-weight : bold;
+ color : purple;
+ }
+ .cm-inline-block,
+ .cm-define .cm-inline-block {
+ font-weight : bold;
+ color : red;
+ span:not(.cm-comment) { color : inherit; }
+ }
+ .cm-injection:not(.cm-comment) {
+ font-weight : bold;
+ color : green;
+ span { color : inherit; }
+ }
+ .cm-emoji:not(.cm-comment) {
+ padding-bottom : 1px;
+ margin-left : 2px;
+ font-weight : bold;
+ color : #360034;
+ outline : solid 2px #FF96FC;
+ outline-offset : -2px;
+ background : #FFC8FF;
+ border-radius : 6px;
+ }
+ .cm-superscript:not(.cm-comment) {
+ font-size : 0.9em;
+ font-weight : bold;
+ vertical-align : super;
+ color : goldenrod;
+ }
+ .cm-subscript:not(.cm-comment) {
+ font-size : 0.9em;
+ font-weight : bold;
+ vertical-align : sub;
+ color : rgb(123, 123, 15);
+ }
+ .cm-definitionList {
+ .cm-definitionTerm { color : rgb(96, 117, 143); }
+ .cm-definitionColon:not(:has(.cm-comment)) {
+ font-weight : bold;
+ color : #949494;
+ background : #E5E5E5;
+ border-radius : 3px;
+ }
+ .cm-definitionDesc { color : rgb(97, 57, 178); }
+ }
+
+ .cm-tooltip-autocomplete {
+
+ li {
+ display : flex;
+ gap : 10px;
+ align-items : center;
+ justify-content : flex-start;
+
+ .cm-completionIcon { display : none; }
+ .cm-tooltip-autocomplete .cm-completionLabel { translate : 0 -2px; }
+ }
+ }
+ }
+
+ .cm-content { tab-size : 2 !important; }
+
+ @media screen and (pointer : coarse) {
+ font-size : 16px;
}
.cm-gutterElement span {
@@ -44,14 +147,14 @@
/* Flash animation for source moves */
.cm-line.sourceMoveFlash {
- animation-name: sourceMoveAnimation;
- animation-duration: 0.4s;
+ animation-name : sourceMoveAnimation;
+ animation-duration : 0.4s;
}
/* Search input */
.cm-searchField {
- width: 25em !important;
- outline: 1px inset #00000055 !important;
+ width : 25em !important;
+ outline : 1px inset #00000055 !important;
}
/* Tab character visualization (optional) */
@@ -67,6 +170,6 @@
/* Emoji preview styling */
.emojiPreview {
- font-size: 1.5em;
- line-height: 1.2em;
+ font-size : 1.5em;
+ line-height : 1.2em;
}
diff --git a/client/components/codeEditor/customHighlight.js b/client/components/codeEditor/customHighlight.js
index 3fa164757..8797704cc 100644
--- a/client/components/codeEditor/customHighlight.js
+++ b/client/components/codeEditor/customHighlight.js
@@ -125,8 +125,6 @@ export function tokenizeCustomMarkdown(text) {
from : offset,
to : offset + desc.length,
});
-
- return;
}
// --- multiline def list ---
@@ -139,14 +137,14 @@ export function tokenizeCustomMarkdown(text) {
for (let i = lineNumber + 1; i < lines.length; i++) {
const nextLine = lines[i];
const onlyColonsMatch = /^:*$/.test(nextLine);
- const defMatch = /^(::)(.*\S.*)?\s*$/.exec(nextLine);
+ const defMatch = /^(::)(.+)$/.exec(nextLine);
if(!onlyColonsMatch && defMatch) {
defs.push({ colons: defMatch[1], desc: defMatch[2], line: i });
endLine = i;
} else break;
}
- if(defs.length > 0) {
+ if(defs.length > 0 && lineText.trim().length > 0) {
tokens.push({
line : startLine,
type : customTags.definitionList,
@@ -177,7 +175,7 @@ export function tokenizeCustomMarkdown(text) {
line : d.line,
type : customTags.definitionDesc,
from : d.colons.length,
- to : d.colons.length + d.desc.length,
+ to : d.colons.length + d.desc?.length,
});
});
}
diff --git a/client/components/codeEditor/customKeyMaps.js b/client/components/codeEditor/customKeyMaps.js
index 4bf1142ae..a05cbacd9 100644
--- a/client/components/codeEditor/customKeyMaps.js
+++ b/client/components/codeEditor/customKeyMaps.js
@@ -1,6 +1,7 @@
/* eslint max-lines: ["error", { "max": 300 }] */
import { keymap } from '@codemirror/view';
-import { undo, redo, indentMore } from '@codemirror/commands';
+import { undo, redo, indentMore, deleteLine } from '@codemirror/commands';
+import { Prec } from '@codemirror/state';
const indentLess = (view)=>{
const { from, to } = view.state.selection.main;
@@ -16,75 +17,48 @@ const indentLess = (view)=>{
return true;
};
-const makeBold = (view)=>{
+const wrapSelection = (prefix, suffix) => (view) => {
const { from, to } = view.state.selection.main;
const selected = view.state.doc.sliceString(from, to);
- const text = selected.startsWith('**') && selected.endsWith('**')
- ? selected.slice(2, -2)
- : `**${selected}**`;
+
+ let text, selection;
+
+ if(from === to) {
+ text = prefix + suffix;
+ selection = { anchor: from + prefix.length, head: from + prefix.length };
+ }
+ else if(selected.startsWith(prefix) && selected.endsWith(suffix)) {
+ text = selected.slice(prefix.length, -suffix.length);
+ selection = { anchor: from, head: from + text.length };
+ }
+ else {
+ text = `${prefix}${selected}${suffix}`;
+ selection = { anchor: from, head: from + text.length };
+ }
+
view.dispatch({
changes : { from, to, insert: text },
- selection : { anchor: from + text.length },
+ selection
});
+
return true;
};
-const makeItalic = (view)=>{
- const { from, to } = view.state.selection.main;
- const selected = view.state.doc.sliceString(from, to);
- const text = selected.startsWith('*') && selected.endsWith('*')
- ? selected.slice(1, -1)
- : `*${selected}*`;
- view.dispatch({
- changes : { from, to, insert: text },
- selection : { anchor: from + text.length },
- });
- return true;
-};
+const makeNbsp = (view) => {
+ const { from } = view.state.selection.main;
-const makeUnderline = (view)=>{
- const { from, to } = view.state.selection.main;
- const selected = view.state.doc.sliceString(from, to);
- const text = selected.startsWith('') && selected.endsWith('')
- ? selected.slice(3, -4)
- : `${selected}`;
- view.dispatch({
- changes : { from, to, insert: text },
- selection : { anchor: from + text.length },
- });
- return true;
-};
+ const prev2 = from >= 2
+ ? view.state.doc.sliceString(from - 2, from)
+ : '';
-const makeSuper = (view)=>{
- const { from, to } = view.state.selection.main;
- const selected = view.state.doc.sliceString(from, to);
- const text = selected.startsWith('^') && selected.endsWith('^')
- ? selected.slice(1, -1)
- : `^${selected}^`;
- view.dispatch({
- changes : { from, to, insert: text },
- selection : { anchor: from + text.length },
- });
- return true;
-};
+ const insert = (prev2 === ':>' || prev2 === '>>') ? '>' : ':>';
-const makeSub = (view)=>{
- const { from, to } = view.state.selection.main;
- const selected = view.state.doc.sliceString(from, to);
- const text = selected.startsWith('^^') && selected.endsWith('^^')
- ? selected.slice(2, -2)
- : `^^${selected}^^`;
- view.dispatch({
- changes : { from, to, insert: text },
- selection : { anchor: from + text.length },
- });
- return true;
-};
+ view.dispatch({
+ changes : { from, to: from, insert },
+ selection : { anchor: from + insert.length },
+ });
-const makeNbsp = (view)=>{
- const { from, to } = view.state.selection.main;
- view.dispatch({ changes: { from, to, insert: ' ' } });
- return true;
+ return true;
};
const makeSpace = (view)=>{
@@ -187,36 +161,37 @@ const newPage = (view)=>{
return true;
};
-export const generalKeymap = keymap.of([
+export const generalKeymap = Prec.high(keymap.of([
{ key: 'Tab', run: indentMore },
{ key: 'Mod-z', run: undo }, //i think it may be unnecessary
{ key: 'Mod-Shift-z', run: redo },
-]);
+ { key: 'Mod-y', run: redo },
+ { key: 'Mod-d', run: deleteLine },
+]));
-export const markdownKeymap = keymap.of([
+export const markdownKeymap = Prec.highest(keymap.of([
//{ key: 'Shift-Tab', run: indentMore },
- { key: 'Shift-Tab', run: indentLess },
- { key: 'Mod-b', run: makeBold },
- { key: 'Mod-i', run: makeItalic },
- { key: 'Mod-u', run: makeUnderline },
- { key: 'Shift-Mod-=', run: makeSuper },
- { key: 'Mod-=', run: makeSub },
- { key: 'Mod-.', run: makeNbsp },
- { key: 'Shift-Mod-.', run: makeSpace },
- { key: 'Shift-Mod-,', run: removeSpace },
- { key: 'Mod-m', run: makeSpan },
- { key: 'Shift-Mod-m', run: makeDiv },
- { key: 'Mod-/', run: makeComment },
- { key: 'Mod-k', run: makeLink },
- { key: 'Mod-l', run: makeList('UL') },
- { key: 'Shift-Mod-l', run: makeList('OL') },
- { key: 'Shift-Mod-1', run: makeHeader(1) },
- { key: 'Shift-Mod-2', run: makeHeader(2) },
- { key: 'Shift-Mod-3', run: makeHeader(3) },
- { key: 'Shift-Mod-4', run: makeHeader(4) },
- { key: 'Shift-Mod-5', run: makeHeader(5) },
- { key: 'Shift-Mod-6', run: makeHeader(6) },
+ { key: 'Shift-Tab', run: indentLess },
+ { key: 'Mod-b', run: wrapSelection('**', '**') }, // makeBold
+ { key: 'Mod-i', run: wrapSelection('*', '*') }, // makeItalic
+ { key: 'Mod-u', run: wrapSelection('', '') }, // makeUnderline
+ { key: 'Shift-Mod-=', run: wrapSelection('^', '^') }, // makeSuper
+ { key: 'Mod-=', run: wrapSelection('^^', '^^') }, // makeSub
+ { key: 'Mod-.', run: makeNbsp },
+ { key: 'Shift-Mod-.', run: makeSpace },
+ { key: 'Shift-Mod-,', run: removeSpace },
+ { key: 'Mod-m', run: makeSpan },
+ { key: 'Shift-Mod-m', run: makeDiv },
+ { key: 'Mod-/', run: makeComment },
+ { key: 'Mod-k', run: makeLink },
+ { key: 'Mod-l', run: makeList('UL') },
+ { key: 'Shift-Mod-l', run: makeList('OL') },
+ { key: 'Shift-Mod-1', run: makeHeader(1) },
+ { key: 'Shift-Mod-2', run: makeHeader(2) },
+ { key: 'Shift-Mod-3', run: makeHeader(3) },
+ { key: 'Shift-Mod-4', run: makeHeader(4) },
+ { key: 'Shift-Mod-5', run: makeHeader(5) },
+ { key: 'Shift-Mod-6', run: makeHeader(6) },
+ { key: 'Mod-Enter', run: newPage },
{ key: 'Shift-Mod-Enter', run: newColumn },
- { key: 'Mod-Enter', run: newPage },
-
-]);
+]));
diff --git a/client/homebrew/editor/editor.jsx b/client/homebrew/editor/editor.jsx
index 0da396697..017cb7933 100644
--- a/client/homebrew/editor/editor.jsx
+++ b/client/homebrew/editor/editor.jsx
@@ -11,11 +11,11 @@ import MetadataEditor from './metadataEditor/metadataEditor.jsx';
const EDITOR_THEME_KEY = 'HB_editor_theme';
-import * as themesImport from '@uiw/codemirror-themes-all';
import defaultCM5Theme from '@themes/codeMirror/default.js';
import darkbrewery from '@themes/codeMirror/darkbrewery.js';
+import cm5Themes from 'codemirror-5-themes';
-const themes = { default: defaultCM5Theme, darkbrewery, ...themesImport };
+const themes = { default: defaultCM5Theme, ...cm5Themes, darkbrewery };
const EditorThemes = Object.entries(themes)
.filter(([name, value])=>Array.isArray(value) &&
diff --git a/client/homebrew/editor/editor.less b/client/homebrew/editor/editor.less
index 7503749fc..a55fad852 100644
--- a/client/homebrew/editor/editor.less
+++ b/client/homebrew/editor/editor.less
@@ -6,116 +6,6 @@
height : 100%;
container : editor / inline-size;
background : white;
- :where(.codeEditor) {
- height : calc(100% - 25px);
- .cm-editor { height : 100%;
- outline:none !important;
- }
- &.brewSnippets .cm-snippetLine {
- background : #33333328;
- border-top : #333399 solid 1px;
- }
-
- :where(&.brewText) .cm-pageLine {
- background : #33333328;
- border-top : #333399 solid 1px;
- }
-
- &.brewSnippets {
- .cm-pageLine {
- background : #3e4e3e1b;
- border-top : #3399423b solid 1px;
- color:#777;
- }
- }
-
- &:where(.brewText), &.brewSnippets {
-
-
- .cm-tooltip-autocomplete {
-
- li {
- display : flex;
- gap : 10px;
- align-items : center;
- justify-content : flex-start;
-
- .cm-completionIcon { display : none; }
- .cm-tooltip-autocomplete .cm-completionLabel { translate : 0 -2px; }
- }
- }
-
- .cm-pageLine[data-page-number]::after {
- content:attr(data-page-number);
- float:right;
- color : grey;
- }
- .cm-columnSplit {
- font-style : italic;
- color : grey;
- background-color : fade(#229999, 15%);
- border-bottom : #229999 solid 1px;
- }
- .cm-define {
- &:not(.term):not(.definition) {
- font-weight : bold;
- color : #949494;
- background : #E5E5E5;
- border-radius : 3px;
- }
- &.term { color : rgb(96, 117, 143); }
- &.definition { color : rgb(97, 57, 178); }
- }
- .cm-block:not(.cm-comment) {
- font-weight : bold;
- color : purple;
- }
- .cm-inline-block:not(.cm-comment) {
- font-weight : bold;
- color : red ;
- span { color : inherit }
- }
- .cm-injection:not(.cm-comment) {
- font-weight : bold;
- color : green;
- span { color : inherit }
- }
- .cm-emoji:not(.cm-comment) {
- padding-bottom : 1px;
- margin-left : 2px;
- font-weight : bold;
- color : #360034;
- outline : solid 2px #FF96FC;
- outline-offset : -2px;
- background : #FFC8FF;
- border-radius : 6px;
- }
- .cm-superscript:not(.cm-comment) {
- font-size : 0.9em;
- font-weight : bold;
- vertical-align : super;
- color : goldenrod;
- }
- .cm-subscript:not(.cm-comment) {
- font-size : 0.9em;
- font-weight : bold;
- vertical-align : sub;
- color : rgb(123, 123, 15);
- }
- .cm-definitionList {
- .cm-definitionTerm { color : rgb(96, 117, 143); }
- .cm-definitionColon {
- font-weight : bold;
- color : #949494;
- background : #E5E5E5;
- border-radius : 3px;
- }
- .cm-definitionDesc { color : rgb(97, 57, 178); }
- }
-
- }
-
- }
.brewJump {
position : absolute;
diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx
index 112e3b701..07a20fa08 100644
--- a/client/homebrew/editor/snippetbar/snippetbar.jsx
+++ b/client/homebrew/editor/snippetbar/snippetbar.jsx
@@ -23,13 +23,13 @@ const ThemeSnippets = {
V3_Blank : V3_Blank,
};
-import * as themesImport from '@uiw/codemirror-themes-all';
import defaultCM5Theme from '@themes/codeMirror/default.js';
import darkbrewery from '@themes/codeMirror/darkbrewery.js';
+import cm5Themes from 'codemirror-5-themes';
-const themes = { default: defaultCM5Theme, darkbrewery, ...themesImport };
+const themes = { default: defaultCM5Theme, ...cm5Themes, darkbrewery };
-const EditorThemes = Object.entries(themes)
+const themeNames = Object.entries(themes)
.filter(([name, value]) =>
Array.isArray(value) &&
!name.endsWith('Init') &&
@@ -37,6 +37,13 @@ const EditorThemes = Object.entries(themes)
)
.map(([name]) => name);
+const EditorThemes = [
+ 'default',
+ ...themeNames
+ .filter(name => name !== 'default')
+ .sort((a, b) => a.localeCompare(b))
+];
+
const execute = function(val, props){
if(_.isFunction(val)) return val(props);
return val;
diff --git a/client/homebrew/navbar/share.navitem.jsx b/client/homebrew/navbar/share.navitem.jsx
index d0c659e2c..e329a4560 100644
--- a/client/homebrew/navbar/share.navitem.jsx
+++ b/client/homebrew/navbar/share.navitem.jsx
@@ -17,7 +17,7 @@ const getRedditLink = (brew)=>{
return `https://www.reddit.com/r/UnearthedArcana/submit?title=${encodeURIComponent(brew.title.toWellFormed())}&text=${encodeURIComponent(text)}`;
};
-export default ({ brew })=>(
+export default ({ brew, currentPage })=>(
share
@@ -28,6 +28,12 @@ export default ({ brew })=>(
{navigator.clipboard.writeText(`${global.config.baseUrl}/share/${getShareId(brew)}`);}}>
copy url
+ {currentPage > 1 &&
+ {navigator.clipboard.writeText(`${global.config.baseUrl}/share/${getShareId(brew)}#p${currentPage}`);}}>
+ copy url (page {currentPage})
+ }
post to reddit
diff --git a/client/homebrew/pages/editPage/editPage.jsx b/client/homebrew/pages/editPage/editPage.jsx
index 176158e2c..b41f1bc74 100644
--- a/client/homebrew/pages/editPage/editPage.jsx
+++ b/client/homebrew/pages/editPage/editPage.jsx
@@ -365,7 +365,7 @@ const EditPage = (props)=>{
-
+
diff --git a/client/homebrew/pages/sharePage/sharePage.jsx b/client/homebrew/pages/sharePage/sharePage.jsx
index 093fc8965..8df241d7b 100644
--- a/client/homebrew/pages/sharePage/sharePage.jsx
+++ b/client/homebrew/pages/sharePage/sharePage.jsx
@@ -92,6 +92,19 @@ const SharePage = (props)=>{
clone to new
+ {navigator.clipboard.writeText(`${global.config.baseUrl}/share/${processShareId()}`);}}>
+ copy url
+
+ {currentBrewRendererPageNum > 1 &&
+ {navigator.clipboard.writeText(`${global.config.baseUrl}/share/${processShareId()}#p${currentBrewRendererPageNum}`);}}>
+ copy url (page {currentBrewRendererPageNum})
+ }
>
)}
diff --git a/package-lock.json b/package-lock.json
index a80272b25..7446ab4f8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -30,10 +30,10 @@
"@googleapis/drive": "^20.1.0",
"@lezer/highlight": "^1.2.3",
"@sanity/diff-match-patch": "^3.2.0",
- "@uiw/codemirror-themes-all": "^4.25.8",
"@vitejs/plugin-react": "^5.1.2",
"body-parser": "^2.2.0",
"classnames": "^2.5.1",
+ "codemirror-5-themes": "^1.5.1",
"cookie-parser": "^1.4.7",
"core-js": "^3.49.0",
"cors": "^2.8.5",
@@ -4897,489 +4897,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@uiw/codemirror-theme-abcdef": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-abcdef/-/codemirror-theme-abcdef-4.25.9.tgz",
- "integrity": "sha512-F6bZcm20N3r4ZeCMdyjjII/fYHqE17sbRk6pFWfU+NPxe522A/uaRKpEaBK/iDwYqpKZgI3XUz7j3KcYzA99Mg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-abyss": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-abyss/-/codemirror-theme-abyss-4.25.9.tgz",
- "integrity": "sha512-zcMHX3abHsaV+IRhnHeWA5aYTP/9HTk/MR5Zh3pfwASv8YMsQlcjBva8vEZULV9pJDferW/9GXbKbbPdmceJeg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-androidstudio": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-androidstudio/-/codemirror-theme-androidstudio-4.25.9.tgz",
- "integrity": "sha512-HPIWpEC9ElhpJ2NZUKB6z+eStQzFDrkIGW9pTJxYHSCv2Los7FgD/R6eGqjTS4LVlBf9FR+KU/5E6dLT8DQHlw==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-andromeda": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-andromeda/-/codemirror-theme-andromeda-4.25.9.tgz",
- "integrity": "sha512-JSqK8/sVFbFfTyv/okaT4c8suulf9zasqd4YBuTSkPZo+Sd/50blxMSVe5IWwDSiW5hkiupb7FC2IP1siHhncw==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-atomone": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-atomone/-/codemirror-theme-atomone-4.25.9.tgz",
- "integrity": "sha512-EXG/+p+Y9j/StU2yAtz/+JZj/8WaSGqwjsad79CSBgpHrSU0ERzv4urYWXgEmLTKKkFimwTigy7qOJlLAwkN2A==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-aura": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-aura/-/codemirror-theme-aura-4.25.9.tgz",
- "integrity": "sha512-cJyInS81wh0lWYs1XDiyFSxCCXrJ+4qifBsDHSYELdLgbnr441T3Kr6a9lyUobtL4DZVaIaCKE9rajrFdJIeAw==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-basic": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-basic/-/codemirror-theme-basic-4.25.9.tgz",
- "integrity": "sha512-40x+anangMmPziZSeEcg6P5YDLn7fF1ioS5VxEPXMGUTbikv0au4PXVNsf7CtP0VwO4MmGt87zZI6rQIexEP3w==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-bbedit": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-bbedit/-/codemirror-theme-bbedit-4.25.9.tgz",
- "integrity": "sha512-SGXQ0tLsqcRvxXCrdeU/MiQ3liNKvr8DCxaSt4N5LP7EPGO94ebuvba0F+H/3LpeJJrn5Xq0FuhaPlMYJ10RXg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-bespin": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-bespin/-/codemirror-theme-bespin-4.25.9.tgz",
- "integrity": "sha512-Zr35B1FpM+VMIoHot397GP/dQBWkFz6SlFqf3JSX6wlwgy2d4ot3YF9fBglGkM3C3ITmkBBQRnlvELwke+dXBg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-console": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-console/-/codemirror-theme-console-4.25.9.tgz",
- "integrity": "sha512-vhN9QKStneKyiNzu+DuA5JOss9WfzecuDjvmEYApQL9zvRmNUAP6La0C2vpZCji1Y23OAFZUJvTU+eKbept3cw==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- }
- },
- "node_modules/@uiw/codemirror-theme-copilot": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-copilot/-/codemirror-theme-copilot-4.25.9.tgz",
- "integrity": "sha512-MLBXBEp+jDQC+BbFUQxxwsOKvhbCsIpIjwBgNfR4KKKQxD6tF6u+CE7ERcrRWJ6cCV2lDrs1IZRZGPQCSpHMIA==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-darcula": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-darcula/-/codemirror-theme-darcula-4.25.9.tgz",
- "integrity": "sha512-lrex1DXg/mx2BX1UtnyFlat7w6c3RyE5GMvyR8uPfXNAXMUEKjYxNRdUuQ9WGlOMzQZ3x+UbKnUZd/r6AmXwsw==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-dracula": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-dracula/-/codemirror-theme-dracula-4.25.9.tgz",
- "integrity": "sha512-0VTnpPCHPc+7LqYsQOX6nvW32XiiT+O6kJjReUbV7Eio3vPHsb+b9P4DKhz4AAvIIYMxmHkMuautHKuWktFXSg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-duotone": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-duotone/-/codemirror-theme-duotone-4.25.9.tgz",
- "integrity": "sha512-6IPZncdrtcgnU1EtQ1/IzaULZ+Jw5uAeVeQCae+rFBnW/m6Q8nWB8+iVnk8kCevgjT5ScZmRd9h4yqtSeJbUwQ==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-eclipse": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-eclipse/-/codemirror-theme-eclipse-4.25.9.tgz",
- "integrity": "sha512-0pT0vRyLAotj5UjIZbHSmsZ8oz7l8IU5bhx5p7MDrTOdi73ZjyTsG4YsDzSXndERnfgkBbZJrlZiExBkXnhtUA==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-github": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-github/-/codemirror-theme-github-4.25.9.tgz",
- "integrity": "sha512-AGpTamNiySKNzq3Jc7QjpwgQRVaHUaBtmOKiUDghYSfEGjsc5uW4NUW70sSU3BnkGv+lCTUnF3175KM24BWZbw==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-gruvbox-dark": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-gruvbox-dark/-/codemirror-theme-gruvbox-dark-4.25.9.tgz",
- "integrity": "sha512-9qIa1z4zwubN2kHAs+lJvdrmMMMf69JeyVPAwSoNaImL8wUQ/J3291qcfuoZjv8RsqSzrKTgxqLHtkAhB7xcwg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-kimbie": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-kimbie/-/codemirror-theme-kimbie-4.25.9.tgz",
- "integrity": "sha512-zLjT7MkotuT07rx4ZPZOM1/H+sa+kCmJr5BDu2ASNpF7Sj4w0cTNcAyxKHj+N6LcgIM8PICxqB97CJhlurNTBA==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-material": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-material/-/codemirror-theme-material-4.25.9.tgz",
- "integrity": "sha512-6f2x+gmj2hHagqy6VkpnPbK7SWyP6kKruGgqpyIy09/f9pAUCqkW8mRY5ZEr28tA+YEGQaSY0Z2IBCHl8OKJog==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-monokai": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-monokai/-/codemirror-theme-monokai-4.25.9.tgz",
- "integrity": "sha512-qKWRZOGpBCasZJdYU+SsXd92TjncF3QYHpraCPe29bxN22jeIxi2UC4MCuJHwa8hHljHOCSdx1XG/GuUMn7XiQ==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-monokai-dimmed": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-monokai-dimmed/-/codemirror-theme-monokai-dimmed-4.25.9.tgz",
- "integrity": "sha512-6/Z9tF4UFngaXifAKC4DI2l61G3rtcWOxvCwgs5zzNVMTciUI+Bl/K7eCvjf2y0LfLmK8Ovob8ODDBcVgwzp5g==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-noctis-lilac": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-noctis-lilac/-/codemirror-theme-noctis-lilac-4.25.9.tgz",
- "integrity": "sha512-HXjQutWsVYfiBM6ze4SomXmSJNzYYJ/fUYJ3TJLhnp5cjIPNBsMsgOAaWp3L64xUqqorb0+1y6kdmUKxTEp6rQ==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-nord": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-nord/-/codemirror-theme-nord-4.25.9.tgz",
- "integrity": "sha512-5c568xmMidwICADxACB1zIhKoEgqbdVrdeOUZ2p5pE6NNKGR4ATzk9OSqhvr1ZhZPNOktxqSLLRzihFaZG0bDQ==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-okaidia": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-okaidia/-/codemirror-theme-okaidia-4.25.9.tgz",
- "integrity": "sha512-lIJFUs/ws0prQz+dVo5ZIp0o6vxW7p6nf8iRFETN5S3KA3nJUR2cTF6u8mYLFwHMrFs2eReRsFyH94wjmuPWvg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-quietlight": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-quietlight/-/codemirror-theme-quietlight-4.25.9.tgz",
- "integrity": "sha512-BWFcFb3WHTCVROkjExh/TMMTJ5SNcDafaVEIwneKypiHoTJoIY6RlSRBj6GA3O5IgKdrGmhje87s0Gx2OLIndg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-red": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-red/-/codemirror-theme-red-4.25.9.tgz",
- "integrity": "sha512-pSOs2ByCVGJXbABhfTEU4TlRh/Wa9BJlDUa219iq1jO3AUDUM/LIPNLhmQvMtOituMX8WKJprspBrDcveXsisg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-solarized": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-solarized/-/codemirror-theme-solarized-4.25.9.tgz",
- "integrity": "sha512-axUgU9+3JKXW83F+te454qcyTmQAm0+2Fxv0yoegiH6bdl7DjFq/lNVGGZtLwN47AQCj2Qwrheeet2t3GbY9VQ==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-sublime": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-sublime/-/codemirror-theme-sublime-4.25.9.tgz",
- "integrity": "sha512-/Ha1K3P0sqFWrsYtCu6Uih/t8C73dVY6m5rObjCnnokr//kOusKwlwt1fJiEFdIcSKlH2WBIvW5tb75tcYitnw==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-tokyo-night": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tokyo-night/-/codemirror-theme-tokyo-night-4.25.9.tgz",
- "integrity": "sha512-NkSqguMpzRjsRBbTIfOrGS35tQkE3K8AAetZHlbRZC7fnI52RreZ11X41cOYrc/Dapt8xqUPlhlvclymGFgy8g==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-tokyo-night-day": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tokyo-night-day/-/codemirror-theme-tokyo-night-day-4.25.9.tgz",
- "integrity": "sha512-1ziFletBO6tfRtX4FVWij1wYIf95uYi54dgnMz5CXe4A4u710rJ3uS3C4ijlnclRbwHjNTqtrMWNuicKDBMsPg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-tokyo-night-storm": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tokyo-night-storm/-/codemirror-theme-tokyo-night-storm-4.25.9.tgz",
- "integrity": "sha512-qz8Vg+ze12TuLk+fqwx3oga3H6rDE+81PpKMGLfbI1BwPDgg7GZGTGrWZoN1Bpf6EV0dA4WO8K6lbzFhlS6S1Q==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-tomorrow-night-blue": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-tomorrow-night-blue/-/codemirror-theme-tomorrow-night-blue-4.25.9.tgz",
- "integrity": "sha512-iG2wCXO/rkJIrvW7rJY7Ehh4yushw8X4vQnstjArxofR6uNrE9ay3Ut7M0cxrwY7z8YIU5f7NQFODE/h3HNmVA==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-vscode": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-vscode/-/codemirror-theme-vscode-4.25.9.tgz",
- "integrity": "sha512-9KTnScHTSk97yGnyNYvDm6QZuBCdbO1OzMQ5bHtoBSPSVtH0LjY3bS6CXsBagb22v8OLPx/XwrBYOjKFp409CQ==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-white": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-white/-/codemirror-theme-white-4.25.9.tgz",
- "integrity": "sha512-75PHfVejBvgF1EbponpEOgND/T6MJYZ673aODPuR7mKPZNfn8649qOSrp7wvMN/NEZ+W5CxV3U7tb9MQWPcM4A==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-theme-xcode": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-xcode/-/codemirror-theme-xcode-4.25.9.tgz",
- "integrity": "sha512-sMiDpOiW0iiNsLyqL1Vx6wZKOSoVUNfmWbBDtaYzlkRcKzkyJQp68cPIq5VG8Mhl2z+PX5cPbOA0nZEegNLicA==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
- "node_modules/@uiw/codemirror-themes": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.25.9.tgz",
- "integrity": "sha512-DAHKb/L9ELwjY4nCf/MP/mIllHOn4GQe7RR4x8AMJuNeh9nGRRoo1uPxrxMmUL/bKqe6kDmDbIZ2AlhlqyIJuw==",
- "license": "MIT",
- "dependencies": {
- "@codemirror/language": "^6.0.0",
- "@codemirror/state": "^6.0.0",
- "@codemirror/view": "^6.0.0"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- },
- "peerDependencies": {
- "@codemirror/language": ">=6.0.0",
- "@codemirror/state": ">=6.0.0",
- "@codemirror/view": ">=6.0.0"
- }
- },
- "node_modules/@uiw/codemirror-themes-all": {
- "version": "4.25.9",
- "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes-all/-/codemirror-themes-all-4.25.9.tgz",
- "integrity": "sha512-OVcGb6dkgJ8NgcHFvSQkRLHHIRswZhBKK0XZZzRVMxDnCIXfmnDfeChNoKjuzwBr+C0jS7UAAqrWbcqrLj3mhg==",
- "license": "MIT",
- "dependencies": {
- "@uiw/codemirror-theme-abcdef": "4.25.9",
- "@uiw/codemirror-theme-abyss": "4.25.9",
- "@uiw/codemirror-theme-androidstudio": "4.25.9",
- "@uiw/codemirror-theme-andromeda": "4.25.9",
- "@uiw/codemirror-theme-atomone": "4.25.9",
- "@uiw/codemirror-theme-aura": "4.25.9",
- "@uiw/codemirror-theme-basic": "4.25.9",
- "@uiw/codemirror-theme-bbedit": "4.25.9",
- "@uiw/codemirror-theme-bespin": "4.25.9",
- "@uiw/codemirror-theme-console": "4.25.9",
- "@uiw/codemirror-theme-copilot": "4.25.9",
- "@uiw/codemirror-theme-darcula": "4.25.9",
- "@uiw/codemirror-theme-dracula": "4.25.9",
- "@uiw/codemirror-theme-duotone": "4.25.9",
- "@uiw/codemirror-theme-eclipse": "4.25.9",
- "@uiw/codemirror-theme-github": "4.25.9",
- "@uiw/codemirror-theme-gruvbox-dark": "4.25.9",
- "@uiw/codemirror-theme-kimbie": "4.25.9",
- "@uiw/codemirror-theme-material": "4.25.9",
- "@uiw/codemirror-theme-monokai": "4.25.9",
- "@uiw/codemirror-theme-monokai-dimmed": "4.25.9",
- "@uiw/codemirror-theme-noctis-lilac": "4.25.9",
- "@uiw/codemirror-theme-nord": "4.25.9",
- "@uiw/codemirror-theme-okaidia": "4.25.9",
- "@uiw/codemirror-theme-quietlight": "4.25.9",
- "@uiw/codemirror-theme-red": "4.25.9",
- "@uiw/codemirror-theme-solarized": "4.25.9",
- "@uiw/codemirror-theme-sublime": "4.25.9",
- "@uiw/codemirror-theme-tokyo-night": "4.25.9",
- "@uiw/codemirror-theme-tokyo-night-day": "4.25.9",
- "@uiw/codemirror-theme-tokyo-night-storm": "4.25.9",
- "@uiw/codemirror-theme-tomorrow-night-blue": "4.25.9",
- "@uiw/codemirror-theme-vscode": "4.25.9",
- "@uiw/codemirror-theme-white": "4.25.9",
- "@uiw/codemirror-theme-xcode": "4.25.9",
- "@uiw/codemirror-themes": "4.25.9"
- },
- "funding": {
- "url": "https://jaywcjlove.github.io/#/sponsor"
- }
- },
"node_modules/@ungap/structured-clone": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
@@ -6569,6 +6086,14 @@
"node": ">= 0.12.0"
}
},
+ "node_modules/codemirror-5-themes": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.5.1.tgz",
+ "integrity": "sha512-vHUyvOYy8yhqCDkps5LwoUFXHXIuKjE32n6EPP5v004fXmkZkrAC9mUsr+anNyOniaixE1W+xwcM4lgnbYfWsQ==",
+ "dependencies": {
+ "@codemirror/view": "^6.41.1"
+ }
+ },
"node_modules/collect-v8-coverage": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
diff --git a/package.json b/package.json
index 7872f8173..6989c444f 100644
--- a/package.json
+++ b/package.json
@@ -58,7 +58,7 @@
"server"
],
"transformIgnorePatterns": [
- "node_modules/(?!(nanoid|@exodus/bytes|parse5|@asamuzakjp|@csstools)/)"
+ "node_modules/(?!(nanoid|@exodus/bytes|parse5|@asamuzakjp|@csstools|entities)/)"
],
"transform": {
"^.+\\.[jt]s$": "babel-jest",
@@ -106,10 +106,10 @@
"@googleapis/drive": "^20.1.0",
"@lezer/highlight": "^1.2.3",
"@sanity/diff-match-patch": "^3.2.0",
- "@uiw/codemirror-themes-all": "^4.25.8",
"@vitejs/plugin-react": "^5.1.2",
"body-parser": "^2.2.0",
"classnames": "^2.5.1",
+ "codemirror-5-themes": "^1.5.1",
"cookie-parser": "^1.4.7",
"core-js": "^3.49.0",
"cors": "^2.8.5",
diff --git a/themes/codeMirror/darkbrewery.js b/themes/codeMirror/darkbrewery.js
index 4dca1e466..fd010e6e0 100644
--- a/themes/codeMirror/darkbrewery.js
+++ b/themes/codeMirror/darkbrewery.js
@@ -54,9 +54,12 @@ export default EditorView.theme({
'.cm-activeLine' : {
backgroundColor : '#868c9323',
},
- '.cm-selected' : {
+ '.cm-selectionBackground' : {
backgroundColor : '#d7d4f0',
},
+ '&.cm-focused .cm-selectionBackground' : {
+ backgroundColor : '#d7d4f0 !important',
+ },
'.cm-pageLine' : {
backgroundColor : '#7ca97c',
color : '#000',
@@ -90,7 +93,7 @@ export default EditorView.theme({
'.cm-strong' : { color: '#309dd2', fontWeight: 'bold' },
'.cm-em' : { fontStyle: 'italic' },
'.cm-keyword' : { color: '#fff' },
- '.cm-atom, cm-value, cm-color' : { color: '#c1939a' },
+ '.cm-atom, .cm-value, .cm-color' : { color: '#c1939a' },
'.cm-number' : { color: '#2986cc' },
'.cm-def' : { color: '#2986cc' },
'.cm-list' : { color: '#3cbf30' },
diff --git a/themes/codeMirror/darkvision.css b/themes/codeMirror/darkvision.css
deleted file mode 100644
index c88455c91..000000000
--- a/themes/codeMirror/darkvision.css
+++ /dev/null
@@ -1,126 +0,0 @@
-/*This document is old, from back when Codemirror was version 5,
-if someone wants to update it, feel free, it needs to be like default.js or darkbrewery.js
-Then imported in snippetbar.jsx and codeEditor.jsx.
-*/
-
-.CodeMirror {
- background: #0C0C0C;
- color: #B9BDB6;
-}
-
-/* Brew BG */
-.brewRenderer {
- background-color: #0C0C0C;
-}
-
-.cm-s-darkvision {
- /* Blinking cursor and selection */
- .CodeMirror-cursor {
- border-left: 1px solid #B9BDB6;
- }
- .CodeMirror-selected {
- background: #E0E8FF40;
- }
-
- /* Line number stuff */
- .cm-gutter-elt {
- color: #81969A;
- }
- .CodeMirror-linenumber {
- background-color: #0C0C0C;
- }
- .cm-gutter {
- background-color: #0C0C0C;
- }
-
- /* column splits */
- .editor .codeEditor .columnSplit {
- font-style: italic;
- color: inherit;
- background-color:#1F5763;
- border-bottom: #299 solid 1px;
- }
-
- /* # headings */
- .cm-header {
- color: #C51B1B;
- -webkit-text-stroke-width: 0.1px;
- }
- /* bold points */
- .cm-strong {
- font-weight: bold;
- color: #309DD2;
- }
- /* Link headings */
- .cm-link {
- color: #DD6300;
- }
- /* links */
- .cm-string {
- color: #5CE638;
- }
- /*@import*/
- .cm-def {
- color: #2986CC;
- }
- /* Bullets and such */
- .cm-variable-2 {
- color: #3CBF30;
- }
-
- /* Tags (divs) */
- .cm-tag {
- color: #E3FF00;
- }
- .cm-attribute {
- color: #E3FF00;
- }
- .cm-atom {
- color: #CF7EA9;
- }
- .cm-qualifier {
- color: #EE1919;
- }
- .cm-comment {
- color: #BBC700;
- }
- .cm-keyword {
- color: #CC66FF;
- }
- .cm-property {
- color: aqua;
- }
- .cm-error {
- color: #C50202;
- }
- .CodeMirror-foldmarker {
- color: #F0FF00;
- }
- /* New page */
- .cm-builtin {
- color: #FFF;
- }
-}
-
-.editor .codeEditor {
- /* blocks */
- .block:not(.cm-comment) {
- color: magenta;
- }
- /* definition lists */
- .define.definition {
- color: #FFAA3E;
- }
- .define.term {
- color: #7290d9;
- }
- .define:not(.term):not(.definition) {
- background: #333;
- }
- /* New page */
- .pageLine {
- background: #000;
- color: #000;
- border-bottom: 1px solid #FFF;
- }
-}
diff --git a/themes/codeMirror/default.js b/themes/codeMirror/default.js
index 0625ded76..78579a123 100644
--- a/themes/codeMirror/default.js
+++ b/themes/codeMirror/default.js
@@ -42,7 +42,7 @@ export default EditorView.theme({
'.cm-gutterElement.cm-activeLineGutter' : {
backgroundColor : '#becee374',
},
- '.cm-selected' : {
+ '.cm-selectionBackground ' : {
backgroundColor : '#d7d4f0',
},
'.cm-foldmarker' : {