feat(code): switch to CodeMirror 6

This commit is contained in:
Elian Doran 2025-05-10 19:10:30 +03:00
parent ddf43a5e24
commit cfa8987b25
No known key found for this signature in database
10 changed files with 172 additions and 171 deletions

View File

@ -23,6 +23,7 @@
"@popperjs/core": "2.11.8",
"@triliumnext/ckeditor5": "workspace:*",
"@triliumnext/commons": "workspace:*",
"@triliumnext/codemirror": "workspace:*",
"bootstrap": "5.3.6",
"dayjs": "1.11.13",
"dayjs-plugin-utc": "0.1.2",

View File

@ -135,74 +135,6 @@ declare global {
trust: boolean;
}) => void;
interface CodeMirrorOpts {
value: string;
viewportMargin: number;
indentUnit: number;
matchBrackets: boolean;
matchTags: { bothTags: boolean };
highlightSelectionMatches: {
showToken: boolean;
annotateScrollbar: boolean;
};
lineNumbers: boolean;
lineWrapping: boolean;
keyMap?: "vim" | "default";
lint?: boolean;
gutters?: string[];
tabindex?: number;
dragDrop?: boolean;
placeholder?: string;
readOnly?: boolean;
}
var CodeMirror: {
(el: HTMLElement, opts: CodeMirrorOpts): CodeMirrorInstance;
keyMap: {
default: Record<string, string>;
};
modeURL: string;
modeInfo: ModeInfo[];
findModeByMIME(mime: string): ModeInfo;
autoLoadMode(instance: CodeMirrorInstance, mode: string)
registerHelper(type: string, filter: string | null, callback: (text: string, options: object) => unknown);
Pos(line: number, col: number);
}
interface ModeInfo {
name: string;
mode: string;
mime: string;
mimes: string[];
}
interface CodeMirrorInstance {
getValue(): string;
setValue(val: string);
clearHistory();
setOption(name: string, value: string);
refresh();
focus();
getCursor(): { line: number, col: number, ch: number };
setCursor(line: number, col: number);
getSelection(): string;
lineCount(): number;
on(event: string, callback: () => void);
operation(callback: () => void);
scrollIntoView(pos: number);
doc: {
getValue(): string;
markText(
from: { line: number, ch: number } | number,
to: { line: number, ch: number } | number,
opts: {
className: string
});
setSelection(from: number, to: number);
replaceRange(text: string, from: number, to: number);
}
}
var katex: {
renderToString(text: string, opts: {
throwOnError: boolean

View File

@ -1,7 +1,5 @@
import TypeWidget from "./type_widget.js";
import libraryLoader from "../../services/library_loader.js";
import options from "../../services/options.js";
import type FNote from "../../entities/fnote.js";
import CodeMirror from "@triliumnext/codemirror";
/**
* An abstract {@link TypeWidget} which implements the CodeMirror editor, meant to be used as a parent for
@ -19,54 +17,27 @@ import type FNote from "../../entities/fnote.js";
export default class AbstractCodeTypeWidget extends TypeWidget {
protected $editor!: JQuery<HTMLElement>;
protected codeEditor!: CodeMirrorInstance;
protected codeEditor!: CodeMirror;
doRender() {
this.initialized = this.#initEditor();
}
async #initEditor() {
await libraryLoader.requireLibrary(libraryLoader.CODE_MIRROR);
// these conflict with backward/forward navigation shortcuts
delete CodeMirror.keyMap.default["Alt-Left"];
delete CodeMirror.keyMap.default["Alt-Right"];
CodeMirror.modeURL = `${window.glob.assetPath}/node_modules/codemirror/mode/%N/%N.js`;
const jsMode = CodeMirror.modeInfo.find((mode) => mode.name === "JavaScript");
if (jsMode) {
jsMode.mimes.push(...["application/javascript;env=frontend", "application/javascript;env=backend"]);
}
const sqlMode = CodeMirror.modeInfo.find((mode) => mode.name === "SQLite");
if (sqlMode) {
sqlMode.mimes = ["text/x-sqlite", "text/x-sqlite;schema=trilium"];
}
this.codeEditor = CodeMirror(this.$editor[0], {
value: "",
viewportMargin: Infinity,
indentUnit: 4,
matchBrackets: true,
matchTags: { bothTags: true },
highlightSelectionMatches: { showToken: false, annotateScrollbar: false },
lineNumbers: true,
// we line wrap partly also because without it horizontal scrollbar displays only when you scroll
// all the way to the bottom of the note. With line wrap, there's no horizontal scrollbar so no problem
lineWrapping: options.is("codeLineWrapEnabled"),
...this.getExtraOpts()
this.codeEditor = new CodeMirror({
parent: this.$editor[0],
});
this.onEditorInitialized();
}
/**
* Can be extended in derived classes to add extra options to the CodeMirror constructor. The options are appended
* at the end, so it is possible to override the default values introduced by the abstract editor as well.
*
* @returns the extra options to be passed to the CodeMirror constructor.
*/
getExtraOpts(): Partial<CodeMirrorOpts> {
return {};
}
// /**
// * Can be extended in derived classes to add extra options to the CodeMirror constructor. The options are appended
// * at the end, so it is possible to override the default values introduced by the abstract editor as well.
// *
// * @returns the extra options to be passed to the CodeMirror constructor.
// */
// getExtraOpts(): Partial<CodeMirror> {
// return {};
// }
/**
* Called as soon as the CodeMirror library has been loaded and the editor was constructed. Can be extended in
@ -85,29 +56,29 @@ export default class AbstractCodeTypeWidget extends TypeWidget {
* @param {*} content the new content of the note.
*/
_update(note: { mime: string }, content: string) {
// CodeMirror breaks pretty badly on null, so even though it shouldn't happen (guarded by a consistency check)
// we provide fallback
this.codeEditor.setValue(content || "");
this.codeEditor.clearHistory();
// // CodeMirror breaks pretty badly on null, so even though it shouldn't happen (guarded by a consistency check)
// // we provide fallback
// this.codeEditor.setValue(content || "");
// this.codeEditor.clearHistory();
let info = CodeMirror.findModeByMIME(note.mime);
if (!info) {
// Switch back to plain text if CodeMirror does not have a mode for whatever MIME type we're editing.
// To avoid inheriting a mode from a previously open code note.
info = CodeMirror.findModeByMIME("text/plain");
}
// let info = CodeMirror.findModeByMIME(note.mime);
// if (!info) {
// // Switch back to plain text if CodeMirror does not have a mode for whatever MIME type we're editing.
// // To avoid inheriting a mode from a previously open code note.
// info = CodeMirror.findModeByMIME("text/plain");
// }
this.codeEditor.setOption("mode", info.mime);
CodeMirror.autoLoadMode(this.codeEditor, info.mode);
// this.codeEditor.setOption("mode", info.mime);
// CodeMirror.autoLoadMode(this.codeEditor, info.mode);
}
show() {
this.$widget.show();
if (this.codeEditor) {
// show can be called before render
this.codeEditor.refresh();
}
// if (this.codeEditor) {
// // show can be called before render
// this.codeEditor.refresh();
// }
}
focus() {
@ -116,15 +87,15 @@ export default class AbstractCodeTypeWidget extends TypeWidget {
}
scrollToEnd() {
this.codeEditor.setCursor(this.codeEditor.lineCount(), 0);
this.codeEditor.focus();
// this.codeEditor.setCursor(this.codeEditor.lineCount(), 0);
// this.codeEditor.focus();
}
cleanup() {
if (this.codeEditor) {
this.spacedUpdate.allowUpdateWithoutChange(() => {
this.codeEditor.setValue("");
});
// this.spacedUpdate.allowUpdateWithoutChange(() => {
// this.codeEditor.setValue("");
// });
}
}
}

View File

@ -41,19 +41,19 @@ export default class EditableCodeTypeWidget extends AbstractCodeTypeWidget {
super.doRender();
}
getExtraOpts(): Partial<CodeMirrorOpts> {
return {
keyMap: options.is("vimKeymapEnabled") ? "vim" : "default",
lint: true,
gutters: ["CodeMirror-lint-markers"],
tabindex: 300,
dragDrop: false, // with true the editor inlines dropped files which is not what we expect
placeholder: t("editable_code.placeholder")
};
}
// getExtraOpts(): Partial<CodeMirrorOpts> {
// return {
// keyMap: options.is("vimKeymapEnabled") ? "vim" : "default",
// lint: true,
// gutters: ["CodeMirror-lint-markers"],
// tabindex: 300,
// dragDrop: false, // with true the editor inlines dropped files which is not what we expect
// placeholder: t("editable_code.placeholder")
// };
// }
onEditorInitialized() {
this.codeEditor.on("change", () => this.spacedUpdate.scheduleUpdate());
// this.codeEditor.on("change", () => this.spacedUpdate.scheduleUpdate());
}
async doRefresh(note: FNote) {
@ -72,7 +72,8 @@ export default class EditableCodeTypeWidget extends AbstractCodeTypeWidget {
getData() {
return {
content: this.codeEditor.getValue()
// content: this.codeEditor.getValue()
content: ""
};
}

View File

@ -35,10 +35,13 @@
],
"references": [
{
"path": "../../packages/ckeditor5/tsconfig.lib.json"
"path": "../../packages/codemirror/tsconfig.lib.json"
},
{
"path": "../../packages/commons/tsconfig.lib.json"
},
{
"path": "../../packages/ckeditor5/tsconfig.lib.json"
}
]
}

View File

@ -4,11 +4,14 @@
"include": [],
"references": [
{
"path": "../../packages/ckeditor5"
"path": "../../packages/codemirror"
},
{
"path": "../../packages/commons"
},
{
"path": "../../packages/ckeditor5"
},
{
"path": "./tsconfig.app.json"
},

View File

@ -18,5 +18,8 @@
"nx": {
"name": "codemirror"
},
"dependencies": {}
"dependencies": {
"@codemirror/commands": "6.8.1",
"@codemirror/view": "6.36.7"
}
}

View File

@ -1 +1,13 @@
export * from './lib/codemirror.js';
import { defaultKeymap } from "@codemirror/commands";
import { EditorView, keymap, type EditorViewConfig } from "@codemirror/view";
export default class CodeMirror extends EditorView {
constructor(config: EditorViewConfig) {
super({
...config,
extensions: [
keymap.of(defaultKeymap)
]
});
}
}

View File

@ -1,3 +0,0 @@
export function codemirror(): string {
return 'codemirror';
}

120
pnpm-lock.yaml generated
View File

@ -200,6 +200,9 @@ importers:
'@triliumnext/ckeditor5':
specifier: workspace:*
version: link:../../packages/ckeditor5
'@triliumnext/codemirror':
specifier: workspace:*
version: link:../../packages/codemirror
'@triliumnext/commons':
specifier: workspace:*
version: link:../../packages/commons
@ -1149,7 +1152,14 @@ importers:
specifier: ^9.0.7
version: 9.12.7(bufferutil@4.0.9)(utf-8-validate@6.0.5)
packages/codemirror: {}
packages/codemirror:
dependencies:
'@codemirror/commands':
specifier: 6.8.1
version: 6.8.1
'@codemirror/view':
specifier: 6.36.7
version: 6.36.7
packages/commons:
dependencies:
@ -2135,6 +2145,18 @@ packages:
'@ckeditor/ckeditor5-word-count@45.0.0':
resolution: {integrity: sha512-72Fd2mUKN8dXRMKGKLPhUiQHhoGnp0ZyPwP8Ezcpbwfn/mh5SBxP3LyQGg35sKy1xJgDYywHlWvjVhw95LgIjg==}
'@codemirror/commands@6.8.1':
resolution: {integrity: sha512-KlGVYufHMQzxbdQONiLyGQDUW0itrLZwq3CcY7xpv9ZLRHqzkBSoteocBHtMCoY7/Ci4xhzSrToIeLg7FxHuaw==}
'@codemirror/language@6.11.0':
resolution: {integrity: sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==}
'@codemirror/state@6.5.2':
resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==}
'@codemirror/view@6.36.7':
resolution: {integrity: sha512-kCWGW/chWGPgZqfZ36Um9Iz0X2IVpmCjg1P/qY6B6a2ecXtWRRAigmpJ6YgUQ5lTWXMyyVdfmpzhLZmsZQMbtg==}
'@cspotcode/source-map-support@0.8.1':
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
@ -3323,6 +3345,15 @@ packages:
'@leichtgewicht/ip-codec@2.0.5':
resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==}
'@lezer/common@1.2.3':
resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==}
'@lezer/highlight@1.2.1':
resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==}
'@lezer/lr@1.4.2':
resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==}
'@ljharb/resumer@0.0.1':
resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==}
engines: {node: '>= 0.4'}
@ -3349,6 +3380,9 @@ packages:
resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==}
engines: {node: '>= 10.0.0'}
'@marijn/find-cluster-break@1.0.2':
resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
'@mermaid-js/layout-elk@0.1.7':
resolution: {integrity: sha512-G3AJ2jMaCAqky2CT3z/sf3pK5UuS3tne98GsXDl3PkKByCmPmOYmJPf+6oX5PUlV3HNWWHuSgtZ9NU/CZDSuHQ==}
peerDependencies:
@ -12627,6 +12661,9 @@ packages:
peerDependencies:
webpack: ^5.27.0
style-mod@4.1.2:
resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==}
stylehacks@5.1.1:
resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==}
engines: {node: ^10 || ^12 || >=14.0}
@ -13544,6 +13581,9 @@ packages:
resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==}
deprecated: Use your platform's native performance.now() and performance.timeOrigin.
w3c-keyname@2.2.8:
resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
w3c-xmlserializer@2.0.0:
resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==}
engines: {node: '>=10'}
@ -15096,23 +15136,27 @@ snapshots:
- supports-color
- utf-8-validate
'@ckeditor/ckeditor5-collaboration-core@45.0.0':
'@ckeditor/ckeditor5-collaboration-core@45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
'@ckeditor/ckeditor5-comments': 45.0.0
'@ckeditor/ckeditor5-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-icons': 45.0.0
'@ckeditor/ckeditor5-theme-lark': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-track-changes': 45.0.0
'@ckeditor/ckeditor5-track-changes': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-ui': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-utils': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@types/luxon': 3.4.2
ckeditor5: 45.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
luxon: 3.5.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
'@ckeditor/ckeditor5-comments@45.0.0':
dependencies:
'@ckeditor/ckeditor5-clipboard': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-collaboration-core': 45.0.0
'@ckeditor/ckeditor5-collaboration-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-engine': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-enter': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@ -15133,7 +15177,7 @@ snapshots:
'@ckeditor/ckeditor5-comments@45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
'@ckeditor/ckeditor5-clipboard': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-collaboration-core': 45.0.0
'@ckeditor/ckeditor5-collaboration-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-engine': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-enter': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@ -15399,18 +15443,6 @@ snapshots:
- supports-color
- utf-8-validate
'@ckeditor/ckeditor5-emoji@45.0.0':
dependencies:
'@ckeditor/ckeditor5-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-icons': 45.0.0
'@ckeditor/ckeditor5-mention': 45.0.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)
'@ckeditor/ckeditor5-typing': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-ui': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-utils': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
ckeditor5: 45.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
es-toolkit: 1.32.0
fuzzysort: 3.1.0
'@ckeditor/ckeditor5-emoji@45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
'@ckeditor/ckeditor5-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@ -16014,7 +16046,7 @@ snapshots:
'@ckeditor/ckeditor5-operations-compressor': 45.0.0
'@ckeditor/ckeditor5-revision-history': 45.0.0
'@ckeditor/ckeditor5-theme-lark': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-track-changes': 45.0.0
'@ckeditor/ckeditor5-track-changes': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-ui': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-utils': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
ckeditor5: 45.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
@ -16227,7 +16259,7 @@ snapshots:
- supports-color
- utf-8-validate
'@ckeditor/ckeditor5-track-changes@45.0.0':
'@ckeditor/ckeditor5-track-changes@45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
'@ckeditor/ckeditor5-clipboard': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-code-block': 45.0.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@ -16256,6 +16288,10 @@ snapshots:
ckeditor5: 45.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
ckeditor5-collaboration: 45.0.0
es-toolkit: 1.32.0
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
'@ckeditor/ckeditor5-typing@45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
@ -16362,6 +16398,32 @@ snapshots:
- supports-color
- utf-8-validate
'@codemirror/commands@6.8.1':
dependencies:
'@codemirror/language': 6.11.0
'@codemirror/state': 6.5.2
'@codemirror/view': 6.36.7
'@lezer/common': 1.2.3
'@codemirror/language@6.11.0':
dependencies:
'@codemirror/state': 6.5.2
'@codemirror/view': 6.36.7
'@lezer/common': 1.2.3
'@lezer/highlight': 1.2.1
'@lezer/lr': 1.4.2
style-mod: 4.1.2
'@codemirror/state@6.5.2':
dependencies:
'@marijn/find-cluster-break': 1.0.2
'@codemirror/view@6.36.7':
dependencies:
'@codemirror/state': 6.5.2
style-mod: 4.1.2
w3c-keyname: 2.2.8
'@cspotcode/source-map-support@0.8.1':
dependencies:
'@jridgewell/trace-mapping': 0.3.9
@ -17748,6 +17810,16 @@ snapshots:
'@leichtgewicht/ip-codec@2.0.5': {}
'@lezer/common@1.2.3': {}
'@lezer/highlight@1.2.1':
dependencies:
'@lezer/common': 1.2.3
'@lezer/lr@1.4.2':
dependencies:
'@lezer/common': 1.2.3
'@ljharb/resumer@0.0.1':
dependencies:
'@ljharb/through': 2.3.14
@ -17787,6 +17859,8 @@ snapshots:
- supports-color
optional: true
'@marijn/find-cluster-break@1.0.2': {}
'@mermaid-js/layout-elk@0.1.7(mermaid@11.6.0)':
dependencies:
d3: 7.9.0
@ -21507,7 +21581,7 @@ snapshots:
ckeditor5-collaboration@45.0.0:
dependencies:
'@ckeditor/ckeditor5-collaboration-core': 45.0.0
'@ckeditor/ckeditor5-collaboration-core': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
ckeditor5@45.0.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41):
dependencies:
@ -21530,7 +21604,7 @@ snapshots:
'@ckeditor/ckeditor5-editor-decoupled': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-editor-inline': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-editor-multi-root': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-emoji': 45.0.0
'@ckeditor/ckeditor5-emoji': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-engine': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-enter': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@ckeditor/ckeditor5-essentials': 45.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@ -29151,6 +29225,8 @@ snapshots:
dependencies:
webpack: 5.99.8(@swc/core@1.11.24(@swc/helpers@0.5.17))(esbuild@0.25.4)(webpack-cli@6.0.1)
style-mod@4.1.2: {}
stylehacks@5.1.1(postcss@8.5.3):
dependencies:
browserslist: 4.24.4
@ -30276,6 +30352,8 @@ snapshots:
dependencies:
browser-process-hrtime: 1.0.0
w3c-keyname@2.2.8: {}
w3c-xmlserializer@2.0.0:
dependencies:
xml-name-validator: 3.0.0