From 0ed772b05460f35997de2db83ff12908a492f3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 21 Apr 2026 20:50:04 +0200 Subject: [PATCH 01/19] add back cm5-themes --- client/components/codeEditor/codeEditor.jsx | 6 +++-- .../homebrew/editor/snippetbar/snippetbar.jsx | 4 +-- package-lock.json | 25 +++++++------------ package.json | 1 + 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/client/components/codeEditor/codeEditor.jsx b/client/components/codeEditor/codeEditor.jsx index 219e87d8b..1e4688192 100644 --- a/client/components/codeEditor/codeEditor.jsx +++ b/client/components/codeEditor/codeEditor.jsx @@ -28,14 +28,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'; diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 112e3b701..6beff1510 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -23,11 +23,11 @@ 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) .filter(([name, value]) => diff --git a/package-lock.json b/package-lock.json index 7ee752e0e..2f2e011da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,6 +34,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", + "codemirror-5-themes": "^0.1.1", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", @@ -6576,6 +6577,14 @@ "node": ">= 0.12.0" } }, + "node_modules/codemirror-5-themes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-0.1.1.tgz", + "integrity": "sha512-6LDToIExW3/rHhmNe4wV4TO7xUJGWSfpXpSNXYgqHgY5hpnQVd0ce6wf0IvXScrWQehcHkb+1Mk5I49C6ArauA==", + "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", @@ -11096,22 +11105,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/mongoose/node_modules/mongodb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.1.tgz", diff --git a/package.json b/package.json index 7872f8173..b20334daf 100644 --- a/package.json +++ b/package.json @@ -110,6 +110,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", + "codemirror-5-themes": "^0.1.1", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", From 21cb91e0c682fe0c8b52ed5b960b72c765015888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 21 Apr 2026 23:10:32 +0200 Subject: [PATCH 02/19] update cm theme library --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2f2e011da..f3e7e19b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^0.1.1", + "codemirror-5-themes": "^1.0.1", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", @@ -6578,9 +6578,9 @@ } }, "node_modules/codemirror-5-themes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-0.1.1.tgz", - "integrity": "sha512-6LDToIExW3/rHhmNe4wV4TO7xUJGWSfpXpSNXYgqHgY5hpnQVd0ce6wf0IvXScrWQehcHkb+1Mk5I49C6ArauA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.0.1.tgz", + "integrity": "sha512-uNXlMjVdOalYw9ARpxQzY4TsEJwmq/TzYg9aQO1UjMQMNxXwmR8l+uM9Yg77cFAl3tlJjAWX24n9ZEzH8U3cmQ==", "dependencies": { "@codemirror/view": "^6.41.1" } diff --git a/package.json b/package.json index b20334daf..c75d90951 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^0.1.1", + "codemirror-5-themes": "^1.0.1", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", From cd946bffafbe9cf321361d52464f4d98d7f6186f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 21 Apr 2026 23:19:02 +0200 Subject: [PATCH 03/19] remove old cm themes library --- client/homebrew/editor/editor.jsx | 4 +- package-lock.json | 624 ++++-------------------------- package.json | 3 +- 3 files changed, 73 insertions(+), 558 deletions(-) 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/package-lock.json b/package-lock.json index f3e7e19b8..62d5939b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,11 +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.0.1", + "codemirror-5-themes": "^1.1.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", @@ -2504,9 +2503,9 @@ } }, "node_modules/@codemirror/search": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.6.0.tgz", - "integrity": "sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.0.tgz", + "integrity": "sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -4698,14 +4697,14 @@ "license": "MIT" }, "node_modules/@typescript-eslint/project-service": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.58.2.tgz", - "integrity": "sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", + "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.58.2", - "@typescript-eslint/types": "^8.58.2", + "@typescript-eslint/tsconfig-utils": "^8.59.0", + "@typescript-eslint/types": "^8.59.0", "debug": "^4.4.3" }, "engines": { @@ -4720,14 +4719,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.58.2.tgz", - "integrity": "sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", + "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2" + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4738,9 +4737,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.58.2.tgz", - "integrity": "sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", + "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", "dev": true, "license": "MIT", "engines": { @@ -4755,9 +4754,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.2.tgz", - "integrity": "sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", + "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", "dev": true, "license": "MIT", "engines": { @@ -4769,16 +4768,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.58.2.tgz", - "integrity": "sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", + "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.58.2", - "@typescript-eslint/tsconfig-utils": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/visitor-keys": "8.58.2", + "@typescript-eslint/project-service": "8.59.0", + "@typescript-eslint/tsconfig-utils": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/visitor-keys": "8.59.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -4849,16 +4848,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.58.2.tgz", - "integrity": "sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", + "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.58.2", - "@typescript-eslint/types": "8.58.2", - "@typescript-eslint/typescript-estree": "8.58.2" + "@typescript-eslint/scope-manager": "8.59.0", + "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/typescript-estree": "8.59.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4873,13 +4872,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.58.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.58.2.tgz", - "integrity": "sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==", + "version": "8.59.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", + "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.58.2", + "@typescript-eslint/types": "8.59.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -4903,489 +4902,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", @@ -6578,9 +6094,9 @@ } }, "node_modules/codemirror-5-themes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.0.1.tgz", - "integrity": "sha512-uNXlMjVdOalYw9ARpxQzY4TsEJwmq/TzYg9aQO1UjMQMNxXwmR8l+uM9Yg77cFAl3tlJjAWX24n9ZEzH8U3cmQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.1.0.tgz", + "integrity": "sha512-X1vHWmDb/isVu5WNG+O7pHAmYi7sDXJhRAfimD0Dmz5kkbru9gYe2C7QzpmFTJmxwSaHcyZUE0B2bn+ayR6caA==", "dependencies": { "@codemirror/view": "^6.41.1" } @@ -7140,9 +6656,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.340", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.340.tgz", - "integrity": "sha512-908qahOGocRMinT2nM3ajCEM99H4iPdv84eagPP3FfZy/1ZGeOy2CZYzjhms81ckOPCXPlW7LkY4XpxD8r1DrA==", + "version": "1.5.341", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.341.tgz", + "integrity": "sha512-1sZTssferjgDgaqRTc0ieP+ozzpOy7LQTPTtEW3yQFn4+ORdIAZWV5BthXPyHF7YqLvFJCUPhNhdAJQYlYUgiw==", "license": "ISC" }, "node_modules/emittery": { @@ -7175,13 +6691,13 @@ } }, "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=20.19.0" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" @@ -10457,9 +9973,9 @@ } }, "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -10515,9 +10031,9 @@ } }, "node_modules/kareem": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.2.0.tgz", - "integrity": "sha512-VS8MWZz/cT+SqBCpVfNN4zoVz5VskR3N4+sTmUXme55e9avQHntpwpNq0yjnosISXqwJ3AQVjlbI4Dyzv//JtA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.3.0.tgz", + "integrity": "sha512-kpSuLD3/7RenBnjnJdOHXCKC8dTd1JzeOiJhN0necWWci6cC+qX+VuwPnMVgb+a4+KNJSfgqahpnfWaeDXCimw==", "license": "Apache-2.0", "engines": { "node": ">=18.0.0" @@ -11085,12 +10601,12 @@ } }, "node_modules/mongoose": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.4.1.tgz", - "integrity": "sha512-4rFBWa+/wdBQSfvnOPJBpiSG6UCEbhSQh865dEdaH9Y8WfHBUC+I2XT28dp0IBIGrEwmh+gzrgZgea5PbmrHWA==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.5.0.tgz", + "integrity": "sha512-B4blGFkFL1s0G24URuMvx0qTlx+gRVLmfO7WcSz8NcmW/XHEJ3G69capdyW1iRsGKiycp1tkwKHnxHbnwjwmPw==", "license": "MIT", "dependencies": { - "kareem": "3.2.0", + "kareem": "3.3.0", "mongodb": "~7.1", "mpath": "0.9.0", "mquery": "6.0.0", @@ -11743,13 +11259,13 @@ } }, "node_modules/parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", "dev": true, "license": "MIT", "dependencies": { - "entities": "^6.0.0" + "entities": "^8.0.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" @@ -12247,9 +11763,9 @@ } }, "node_modules/react-router": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.1.tgz", - "integrity": "sha512-5BCvFskyAAVumqhEKh/iPhLOIkfxcEUz8WqFIARCkMg8hZZzDYX9CtwxXA0e+qT8zAxmMC0x3Ckb9iMONwc5jg==", + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.2.tgz", + "integrity": "sha512-yCqNne6I8IB6rVCH7XUvlBK7/QKyqypBFGv+8dj4QBFJiiRX+FG7/nkdAvGElyvVZ/HQP5N19wzteuTARXi5Gw==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -12543,15 +12059,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, diff --git a/package.json b/package.json index c75d90951..34b49f9b8 100644 --- a/package.json +++ b/package.json @@ -106,11 +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.0.1", + "codemirror-5-themes": "^1.1.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", From a253e5d85ab9b4e34707c8abc6ea95fbffecf83e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 21 Apr 2026 23:50:28 +0200 Subject: [PATCH 04/19] restore two keybinds --- client/components/codeEditor/customKeyMaps.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/components/codeEditor/customKeyMaps.js b/client/components/codeEditor/customKeyMaps.js index 447352a05..7a9f64d6d 100644 --- a/client/components/codeEditor/customKeyMaps.js +++ b/client/components/codeEditor/customKeyMaps.js @@ -1,6 +1,6 @@ /* 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)=>{ @@ -192,6 +192,8 @@ export const generalKeymap = 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 = Prec.highest(keymap.of([ @@ -219,5 +221,4 @@ export const markdownKeymap = Prec.highest(keymap.of([ { key: 'Shift-Mod-6', run: makeHeader(6) }, { key: 'Shift-Mod-Enter', run: newColumn }, { key: 'Mod-Enter', run: newPage }, - ])); From f59d8f9b0596124411429a095b1a5df9f407f8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Tue, 21 Apr 2026 23:57:32 +0200 Subject: [PATCH 05/19] add back things we had --- client/components/codeEditor/codeEditor.jsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/client/components/codeEditor/codeEditor.jsx b/client/components/codeEditor/codeEditor.jsx index 1e4688192..c63b9f2c8 100644 --- a/client/components/codeEditor/codeEditor.jsx +++ b/client/components/codeEditor/codeEditor.jsx @@ -13,6 +13,8 @@ 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'; @@ -232,6 +234,8 @@ const CodeEditor = forwardRef( //multiple cursors and selections drawSelection(), + rectangularSelection, + crosshairCursor, EditorState.allowMultipleSelections.of(true), dropCursor(), programmaticCursorLineField, From 7d19c4bcd710d18b5d662703d7f8d1b899c831a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 00:03:29 +0200 Subject: [PATCH 06/19] fix cm error --- client/components/codeEditor/codeEditor.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/components/codeEditor/codeEditor.jsx b/client/components/codeEditor/codeEditor.jsx index c63b9f2c8..5f46fc3e4 100644 --- a/client/components/codeEditor/codeEditor.jsx +++ b/client/components/codeEditor/codeEditor.jsx @@ -234,8 +234,8 @@ const CodeEditor = forwardRef( //multiple cursors and selections drawSelection(), - rectangularSelection, - crosshairCursor, + rectangularSelection(), + crosshairCursor(), EditorState.allowMultipleSelections.of(true), dropCursor(), programmaticCursorLineField, From a46c776398e2fffab81bf4d9174d972b54431f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 00:38:57 +0200 Subject: [PATCH 07/19] proper selection highlight --- themes/codeMirror/darkbrewery.js | 2 +- themes/codeMirror/default.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/codeMirror/darkbrewery.js b/themes/codeMirror/darkbrewery.js index 4dca1e466..d9a6a74e8 100644 --- a/themes/codeMirror/darkbrewery.js +++ b/themes/codeMirror/darkbrewery.js @@ -54,7 +54,7 @@ export default EditorView.theme({ '.cm-activeLine' : { backgroundColor : '#868c9323', }, - '.cm-selected' : { + '.cm-selectionBackground ' : { backgroundColor : '#d7d4f0', }, '.cm-pageLine' : { 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' : { From 649f606a0e6d7f4b64b3653c6cd3b2d9247ba12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 00:46:12 +0200 Subject: [PATCH 08/19] lets try this --- themes/codeMirror/darkbrewery.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/themes/codeMirror/darkbrewery.js b/themes/codeMirror/darkbrewery.js index d9a6a74e8..5f3a466ff 100644 --- a/themes/codeMirror/darkbrewery.js +++ b/themes/codeMirror/darkbrewery.js @@ -57,6 +57,9 @@ export default EditorView.theme({ '.cm-selectionBackground ' : { backgroundColor : '#d7d4f0', }, + '.cm-focused .cm-selectionBackground ' : { + backgroundColor : '#d7d4f0', + }, '.cm-pageLine' : { backgroundColor : '#7ca97c', color : '#000', From e0ee22a8dfcc70967801326a9ca6dd6e87cc9eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 00:49:42 +0200 Subject: [PATCH 09/19] add important --- themes/codeMirror/darkbrewery.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/codeMirror/darkbrewery.js b/themes/codeMirror/darkbrewery.js index 5f3a466ff..3dfc392c3 100644 --- a/themes/codeMirror/darkbrewery.js +++ b/themes/codeMirror/darkbrewery.js @@ -58,7 +58,7 @@ export default EditorView.theme({ backgroundColor : '#d7d4f0', }, '.cm-focused .cm-selectionBackground ' : { - backgroundColor : '#d7d4f0', + backgroundColor : '#d7d4f0 !important', }, '.cm-pageLine' : { backgroundColor : '#7ca97c', From 5c675fe04ad19d0d685b0b0b83f186b5732514b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 01:09:48 +0200 Subject: [PATCH 10/19] update themes --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62d5939b6..20700e546 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.1.0", + "codemirror-5-themes": "^1.2.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", @@ -6094,9 +6094,9 @@ } }, "node_modules/codemirror-5-themes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.1.0.tgz", - "integrity": "sha512-X1vHWmDb/isVu5WNG+O7pHAmYi7sDXJhRAfimD0Dmz5kkbru9gYe2C7QzpmFTJmxwSaHcyZUE0B2bn+ayR6caA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.2.0.tgz", + "integrity": "sha512-hcIIeZPvKEU6EcPi6Rla7VV4vs9WRRPPxiBPXTSZtObUuEjkPgsi1DMNMHEglC7j/GTmASdvoDM67lfZaAjX9Q==", "dependencies": { "@codemirror/view": "^6.41.1" } diff --git a/package.json b/package.json index 34b49f9b8..5fd246803 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.1.0", + "codemirror-5-themes": "^1.2.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", From 0f5404fef8da4d97d722d8298dd4ba7dbf0649a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 01:19:28 +0200 Subject: [PATCH 11/19] lock sync --- package-lock.json | 22 +++++++++++++++++++--- themes/codeMirror/darkbrewery.js | 4 ++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 20700e546..0c6b61317 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6656,9 +6656,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.341", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.341.tgz", - "integrity": "sha512-1sZTssferjgDgaqRTc0ieP+ozzpOy7LQTPTtEW3yQFn4+ORdIAZWV5BthXPyHF7YqLvFJCUPhNhdAJQYlYUgiw==", + "version": "1.5.342", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.342.tgz", + "integrity": "sha512-GTuy59SdGxYgz+HN8KwOjFAVF2gfoKEmv0PFholcvVtbI9GPDND0m6ynGX3gAKOavcHRLrcfNy0QMbHbAemYdw==", "license": "ISC" }, "node_modules/emittery": { @@ -10621,6 +10621,22 @@ "url": "https://opencollective.com/mongoose" } }, + "node_modules/mongoose/node_modules/gcp-metadata": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/mongoose/node_modules/mongodb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.1.tgz", diff --git a/themes/codeMirror/darkbrewery.js b/themes/codeMirror/darkbrewery.js index 3dfc392c3..c90e06256 100644 --- a/themes/codeMirror/darkbrewery.js +++ b/themes/codeMirror/darkbrewery.js @@ -54,10 +54,10 @@ export default EditorView.theme({ '.cm-activeLine' : { backgroundColor : '#868c9323', }, - '.cm-selectionBackground ' : { + '.cm-selectionBackground' : { backgroundColor : '#d7d4f0', }, - '.cm-focused .cm-selectionBackground ' : { + '.cm-focused .cm-selectionBackground' : { backgroundColor : '#d7d4f0 !important', }, '.cm-pageLine' : { From db82bd8123083f64adf25991f12f799de05f603d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 01:26:34 +0200 Subject: [PATCH 12/19] fix darkbrewery --- themes/codeMirror/darkbrewery.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/codeMirror/darkbrewery.js b/themes/codeMirror/darkbrewery.js index c90e06256..fd010e6e0 100644 --- a/themes/codeMirror/darkbrewery.js +++ b/themes/codeMirror/darkbrewery.js @@ -57,7 +57,7 @@ export default EditorView.theme({ '.cm-selectionBackground' : { backgroundColor : '#d7d4f0', }, - '.cm-focused .cm-selectionBackground' : { + '&.cm-focused .cm-selectionBackground' : { backgroundColor : '#d7d4f0 !important', }, '.cm-pageLine' : { @@ -93,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' }, From 93ce778c0d823576c2f2d3ef95c13cfa9f52194d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 01:29:37 +0200 Subject: [PATCH 13/19] fix tests and update library --- package-lock.json | 24 ++++-------------------- package.json | 4 ++-- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c6b61317..fc582c2f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.2.0", + "codemirror-5-themes": "^1.3.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", @@ -6094,9 +6094,9 @@ } }, "node_modules/codemirror-5-themes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.2.0.tgz", - "integrity": "sha512-hcIIeZPvKEU6EcPi6Rla7VV4vs9WRRPPxiBPXTSZtObUuEjkPgsi1DMNMHEglC7j/GTmASdvoDM67lfZaAjX9Q==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.3.0.tgz", + "integrity": "sha512-FO8HG4m4GdcphVtJFcj8wcx9nhktb4UMnSu8ia5yCNd3G89pBGqrIxw2UAEluJP4D2gLZWQOwdPaU8Ik3Bqt2w==", "dependencies": { "@codemirror/view": "^6.41.1" } @@ -10621,22 +10621,6 @@ "url": "https://opencollective.com/mongoose" } }, - "node_modules/mongoose/node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/mongoose/node_modules/mongodb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.1.tgz", diff --git a/package.json b/package.json index 5fd246803..e1d15eebe 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", @@ -109,7 +109,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.2.0", + "codemirror-5-themes": "^1.3.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", From 49e4f0a597cddc06d2a7ee14ffd6aa9d0780278a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 12:34:50 +0200 Subject: [PATCH 14/19] css reordering --- client/components/codeEditor/codeEditor.less | 147 +++++++++++++++--- .../components/codeEditor/customHighlight.js | 2 - client/homebrew/editor/editor.less | 110 ------------- 3 files changed, 125 insertions(+), 134 deletions(-) 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..345e253d3 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 --- 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; From f863871173b4d92ddd4ded6a8690403fa3b0c9e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 17:05:17 +0200 Subject: [PATCH 15/19] move darkvision to library, and sort themes --- client/components/codeEditor/customKeyMaps.js | 4 +- .../homebrew/editor/snippetbar/snippetbar.jsx | 9 +- package-lock.json | 8 +- package.json | 2 +- themes/codeMirror/darkvision.css | 126 ------------------ 5 files changed, 15 insertions(+), 134 deletions(-) delete mode 100644 themes/codeMirror/darkvision.css diff --git a/client/components/codeEditor/customKeyMaps.js b/client/components/codeEditor/customKeyMaps.js index 7a9f64d6d..86b108ac3 100644 --- a/client/components/codeEditor/customKeyMaps.js +++ b/client/components/codeEditor/customKeyMaps.js @@ -188,13 +188,13 @@ 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 = Prec.highest(keymap.of([ //{ key: 'Shift-Tab', run: indentMore }, diff --git a/client/homebrew/editor/snippetbar/snippetbar.jsx b/client/homebrew/editor/snippetbar/snippetbar.jsx index 6beff1510..07a20fa08 100644 --- a/client/homebrew/editor/snippetbar/snippetbar.jsx +++ b/client/homebrew/editor/snippetbar/snippetbar.jsx @@ -29,7 +29,7 @@ import cm5Themes from 'codemirror-5-themes'; 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/package-lock.json b/package-lock.json index fc582c2f9..565fe43bb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.3.0", + "codemirror-5-themes": "^1.4.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", @@ -6094,9 +6094,9 @@ } }, "node_modules/codemirror-5-themes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.3.0.tgz", - "integrity": "sha512-FO8HG4m4GdcphVtJFcj8wcx9nhktb4UMnSu8ia5yCNd3G89pBGqrIxw2UAEluJP4D2gLZWQOwdPaU8Ik3Bqt2w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.4.0.tgz", + "integrity": "sha512-3WKAmpTLqcE1MXFLHdNtwQYaxlWZXS69MY79UiNsFpW9KedMkf/vBYBjUAmacDXPKAJjdPSNMGmCPIZi21yoXA==", "dependencies": { "@codemirror/view": "^6.41.1" } diff --git a/package.json b/package.json index e1d15eebe..b25885497 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.3.0", + "codemirror-5-themes": "^1.4.0", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", 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; - } -} From 7139993e159bc50172f5d939f9f36fdfc4732add Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Wed, 22 Apr 2026 17:32:26 +0200 Subject: [PATCH 16/19] repair shortcuts to put the cursor at the center if there is no selection --- client/components/codeEditor/customKeyMaps.js | 122 ++++++++++++++---- 1 file changed, 96 insertions(+), 26 deletions(-) diff --git a/client/components/codeEditor/customKeyMaps.js b/client/components/codeEditor/customKeyMaps.js index 86b108ac3..7da06b119 100644 --- a/client/components/codeEditor/customKeyMaps.js +++ b/client/components/codeEditor/customKeyMaps.js @@ -20,72 +20,142 @@ const indentLess = (view)=>{ const makeBold = (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, cursor; + + if(from === to) { + text = '****'; + cursor = from + 2; + } else if(selected.startsWith('**') && selected.endsWith('**')) { + text = selected.slice(2, -2); + cursor = from + text.length; + } else { + text = `**${selected}**`; + cursor = from + text.length; + } + view.dispatch({ changes : { from, to, insert: text }, - selection : { anchor: from + text.length }, + selection : { anchor: cursor }, }); + 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}*`; + + let text, cursor; + + if(from === to) { + text = '**'; + cursor = from + 1; + } else if(selected.startsWith('*') && selected.endsWith('*')) { + text = selected.slice(2, -2); + cursor = from + text.length; + } else { + text = `*${selected}*`; + cursor = from + text.length; + } + view.dispatch({ changes : { from, to, insert: text }, - selection : { anchor: from + text.length }, + selection : { anchor: cursor }, }); + return true; }; 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}`; + + let text, cursor; + + if(from === to) { + text = ''; + cursor = from + 3; + } else if(selected.startsWith('') && selected.endsWith('')) { + text = selected.slice(3, -4); + cursor = from + text.length; + } else { + text = `${selected}`; + cursor = from + text.length; + } + view.dispatch({ changes : { from, to, insert: text }, - selection : { anchor: from + text.length }, + selection : { anchor: cursor }, }); + return true; }; - 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}^`; + + let text, cursor; + + if(from === to) { + text = '^^'; + cursor = from + 1; + } else if(selected.startsWith('^') && selected.endsWith('^')) { + text = selected.slice(1, -1); + cursor = from + text.length; + } else { + text = `^${selected}^`; + cursor = from + text.length; + } + view.dispatch({ changes : { from, to, insert: text }, - selection : { anchor: from + text.length }, + selection : { anchor: cursor }, }); + return true; }; 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}^^`; + + let text, cursor; + + if(from === to) { + text = '^^^^'; + cursor = from + 2; + } else if(selected.startsWith('^^') && selected.endsWith('^^')) { + text = selected.slice(2, -2); + cursor = from + text.length; + } else { + text = `^^${selected}^^`; + cursor = from + text.length; + } + view.dispatch({ changes : { from, to, insert: text }, - selection : { anchor: from + text.length }, + selection : { anchor: cursor }, }); + return true; }; -const makeNbsp = (view)=>{ - const { from, to } = view.state.selection.main; - view.dispatch({ changes: { from, to, insert: ' ' } }); - return true; +const makeNbsp = (view) => { + const { from } = view.state.selection.main; + + const prev2 = from >= 2 + ? view.state.doc.sliceString(from - 2, from) + : ''; + + const insert = (prev2 === ':>' || prev2 === '>>') ? '>' : ':>'; + + view.dispatch({ + changes: { from, to: from, insert }, + selection: { anchor: from + insert.length }, + }); + + return true; }; const makeSpace = (view)=>{ @@ -193,7 +263,7 @@ export const generalKeymap = Prec.high(keymap.of([ { 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}, + { key: 'Mod-d', run: deleteLine }, ])); export const markdownKeymap = Prec.highest(keymap.of([ From 1cd4a698540d302bc1d2597c30fcd5be54ad6db7 Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 23 Apr 2026 13:00:32 -0400 Subject: [PATCH 17/19] Make common "wrapSelected" function --- client/components/codeEditor/customKeyMaps.js | 171 ++++-------------- 1 file changed, 37 insertions(+), 134 deletions(-) diff --git a/client/components/codeEditor/customKeyMaps.js b/client/components/codeEditor/customKeyMaps.js index 7da06b119..a05cbacd9 100644 --- a/client/components/codeEditor/customKeyMaps.js +++ b/client/components/codeEditor/customKeyMaps.js @@ -17,125 +17,28 @@ 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); - let text, cursor; + let text, selection; if(from === to) { - text = '****'; - cursor = from + 2; - } else if(selected.startsWith('**') && selected.endsWith('**')) { - text = selected.slice(2, -2); - cursor = from + text.length; - } else { - text = `**${selected}**`; - cursor = from + text.length; + 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: cursor }, - }); - - return true; -}; - -const makeItalic = (view)=>{ - const { from, to } = view.state.selection.main; - const selected = view.state.doc.sliceString(from, to); - - let text, cursor; - - if(from === to) { - text = '**'; - cursor = from + 1; - } else if(selected.startsWith('*') && selected.endsWith('*')) { - text = selected.slice(2, -2); - cursor = from + text.length; - } else { - text = `*${selected}*`; - cursor = from + text.length; - } - - view.dispatch({ - changes : { from, to, insert: text }, - selection : { anchor: cursor }, - }); - - return true; -}; - -const makeUnderline = (view)=>{ - const { from, to } = view.state.selection.main; - const selected = view.state.doc.sliceString(from, to); - - let text, cursor; - - if(from === to) { - text = ''; - cursor = from + 3; - } else if(selected.startsWith('') && selected.endsWith('')) { - text = selected.slice(3, -4); - cursor = from + text.length; - } else { - text = `${selected}`; - cursor = from + text.length; - } - - view.dispatch({ - changes : { from, to, insert: text }, - selection : { anchor: cursor }, - }); - - return true; -}; -const makeSuper = (view)=>{ - const { from, to } = view.state.selection.main; - const selected = view.state.doc.sliceString(from, to); - - let text, cursor; - - if(from === to) { - text = '^^'; - cursor = from + 1; - } else if(selected.startsWith('^') && selected.endsWith('^')) { - text = selected.slice(1, -1); - cursor = from + text.length; - } else { - text = `^${selected}^`; - cursor = from + text.length; - } - - view.dispatch({ - changes : { from, to, insert: text }, - selection : { anchor: cursor }, - }); - - return true; -}; - -const makeSub = (view)=>{ - const { from, to } = view.state.selection.main; - const selected = view.state.doc.sliceString(from, to); - - let text, cursor; - - if(from === to) { - text = '^^^^'; - cursor = from + 2; - } else if(selected.startsWith('^^') && selected.endsWith('^^')) { - text = selected.slice(2, -2); - cursor = from + text.length; - } else { - text = `^^${selected}^^`; - cursor = from + text.length; - } - - view.dispatch({ - changes : { from, to, insert: text }, - selection : { anchor: cursor }, + selection }); return true; @@ -151,8 +54,8 @@ const makeNbsp = (view) => { const insert = (prev2 === ':>' || prev2 === '>>') ? '>' : ':>'; view.dispatch({ - changes: { from, to: from, insert }, - selection: { anchor: from + insert.length }, + changes : { from, to: from, insert }, + selection : { anchor: from + insert.length }, }); return true; @@ -268,27 +171,27 @@ export const generalKeymap = Prec.high(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 }, ])); From 4fee82d3b73d717c1d5b7cb72f0863552326815c Mon Sep 17 00:00:00 2001 From: Trevor Buckner Date: Thu, 23 Apr 2026 14:36:55 -0400 Subject: [PATCH 18/19] Simplify regex, fix crash on empty desc.length, only highlight if there is a Term line with content --- client/components/codeEditor/customHighlight.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/components/codeEditor/customHighlight.js b/client/components/codeEditor/customHighlight.js index 345e253d3..8797704cc 100644 --- a/client/components/codeEditor/customHighlight.js +++ b/client/components/codeEditor/customHighlight.js @@ -137,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, @@ -175,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, }); }); } From cadf9ca63bdc0d8e3b26ccd678fe414b1fd9751f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Losada=20Hern=C3=A1ndez?= Date: Fri, 24 Apr 2026 01:05:29 +0200 Subject: [PATCH 19/19] update codemirror themes --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 565fe43bb..f7657daf1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.4.0", + "codemirror-5-themes": "^1.5.1", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5", @@ -6094,9 +6094,9 @@ } }, "node_modules/codemirror-5-themes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/codemirror-5-themes/-/codemirror-5-themes-1.4.0.tgz", - "integrity": "sha512-3WKAmpTLqcE1MXFLHdNtwQYaxlWZXS69MY79UiNsFpW9KedMkf/vBYBjUAmacDXPKAJjdPSNMGmCPIZi21yoXA==", + "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" } diff --git a/package.json b/package.json index b25885497..6989c444f 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "@vitejs/plugin-react": "^5.1.2", "body-parser": "^2.2.0", "classnames": "^2.5.1", - "codemirror-5-themes": "^1.4.0", + "codemirror-5-themes": "^1.5.1", "cookie-parser": "^1.4.7", "core-js": "^3.49.0", "cors": "^2.8.5",