diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 40423c776..5e8fb1301 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -10,6 +10,7 @@ on: paths: - 'docs/**' - 'apps/edit-docs/**' + - 'apps/build-docs/**' - 'packages/share-theme/**' # Allow manual triggering from Actions tab @@ -23,6 +24,7 @@ on: paths: - 'docs/**' - 'apps/edit-docs/**' + - 'apps/build-docs/**' - 'packages/share-theme/**' jobs: @@ -60,6 +62,8 @@ jobs: - name: Validate Built Site run: | test -f site/index.html || (echo "ERROR: site/index.html not found" && exit 1) + test -f site/developer-guide/index.html || (echo "ERROR: site/developer-guide/index.html not found" && exit 1) + echo "✓ User Guide and Developer Guide built successfully" - name: Deploy uses: ./.github/actions/deploy-to-cloudflare-pages diff --git a/_regroup/package.json b/_regroup/package.json index 6c1f01e99..ce0e70d45 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -38,10 +38,10 @@ "@playwright/test": "1.56.1", "@stylistic/eslint-plugin": "5.5.0", "@types/express": "5.0.5", - "@types/node": "24.9.2", + "@types/node": "24.10.0", "@types/yargs": "17.0.34", "@vitest/coverage-v8": "3.2.4", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-plugin-simple-import-sort": "12.1.1", "esm": "3.2.25", "jsdoc": "4.0.5", diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index 0a19e8072..f22baec81 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -9,7 +9,7 @@ "keywords": [], "author": "Elian Doran ", "license": "AGPL-3.0-only", - "packageManager": "pnpm@10.19.0", + "packageManager": "pnpm@10.20.0", "devDependencies": { "@redocly/cli": "2.10.0", "archiver": "7.0.1", diff --git a/apps/build-docs/src/build-docs.ts b/apps/build-docs/src/build-docs.ts index 39a3dd30b..5d1a0cdd6 100644 --- a/apps/build-docs/src/build-docs.ts +++ b/apps/build-docs/src/build-docs.ts @@ -14,17 +14,12 @@ import BuildContext from "./context.js"; const DOCS_ROOT = "../../../docs"; const OUTPUT_DIR = "../../site"; -async function buildDocsInner() { - const i18n = await import("@triliumnext/server/src/services/i18n.js"); - await i18n.initializeTranslations(); +async function importAndExportDocs(sourcePath: string, outputSubDir: string) { + const note = await importData(sourcePath); - const sqlInit = (await import("../../server/src/services/sql_init.js")).default; - await sqlInit.createInitialDatabase(true); - - const note = await importData(join(__dirname, DOCS_ROOT, "User Guide")); - - // Export - const zipFilePath = "output.zip"; + // Use a meaningful name for the temporary zip file + const zipName = outputSubDir || "user-guide"; + const zipFilePath = `output-${zipName}.zip`; try { const { exportToZip } = (await import("@triliumnext/server/src/services/export/zip.js")).default; const branch = note.getParentBranches()[0]; @@ -36,25 +31,50 @@ async function buildDocsInner() { const fileOutputStream = fsExtra.createWriteStream(zipFilePath); await exportToZip(taskContext, branch, "share", fileOutputStream); await waitForStreamToFinish(fileOutputStream); - await extractZip(zipFilePath, OUTPUT_DIR); + + // Output to root directory if outputSubDir is empty, otherwise to subdirectory + const outputPath = outputSubDir ? join(OUTPUT_DIR, outputSubDir) : OUTPUT_DIR; + await extractZip(zipFilePath, outputPath); } finally { if (await fsExtra.exists(zipFilePath)) { await fsExtra.rm(zipFilePath); } } +} + +async function buildDocsInner() { + const i18n = await import("@triliumnext/server/src/services/i18n.js"); + await i18n.initializeTranslations(); + + const sqlInit = (await import("../../server/src/services/sql_init.js")).default; + await sqlInit.createInitialDatabase(true); + + // Wait for becca to be loaded before importing data + const beccaLoader = await import("../../server/src/becca/becca_loader.js"); + await beccaLoader.beccaLoaded; + + // Build User Guide + console.log("Building User Guide..."); + await importAndExportDocs(join(__dirname, DOCS_ROOT, "User Guide"), "user-guide"); + + // Build Developer Guide + console.log("Building Developer Guide..."); + await importAndExportDocs(join(__dirname, DOCS_ROOT, "Developer Guide"), "developer-guide"); // Copy favicon. await fs.copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "favicon.ico")); + await fs.copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "user-guide", "favicon.ico")); + await fs.copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "developer-guide", "favicon.ico")); console.log("Documentation built successfully!"); } export async function importData(path: string) { const buffer = await createImportZip(path); - const importService = (await import("@triliumnext/server/src/services/import/zip.js")).default; - const TaskContext = (await import("@triliumnext/server/src/services/task_context.js")).default; + const importService = (await import("../../server/src/services/import/zip.js")).default; + const TaskContext = (await import("../../server/src/services/task_context.js")).default; const context = new TaskContext("no-progress-reporting", "importNotes", null); - const becca = (await import("@triliumnext/server/src/becca/becca.js")).default; + const becca = (await import("../../server/src/becca/becca.js")).default; const rootNote = becca.getRoot(); if (!rootNote) { diff --git a/apps/build-docs/src/index.html b/apps/build-docs/src/index.html new file mode 100644 index 000000000..47a0bfb34 --- /dev/null +++ b/apps/build-docs/src/index.html @@ -0,0 +1,10 @@ + + + + + Redirecting... + + +

If you are not redirected automatically, click here.

+ + \ No newline at end of file diff --git a/apps/build-docs/src/main.ts b/apps/build-docs/src/main.ts index 8e6804fe5..d94ada167 100644 --- a/apps/build-docs/src/main.ts +++ b/apps/build-docs/src/main.ts @@ -1,7 +1,7 @@ import { join } from "path"; import BuildContext from "./context"; import buildSwagger from "./swagger"; -import { existsSync, mkdirSync, rmSync } from "fs"; +import { cpSync, existsSync, mkdirSync, rmSync } from "fs"; import buildDocs from "./build-docs"; import buildScriptApi from "./script-api"; @@ -21,6 +21,10 @@ async function main() { await buildDocs(context); buildSwagger(context); buildScriptApi(context); + + // Copy index and 404 files. + cpSync(join(__dirname, "index.html"), join(context.baseDir, "index.html")); + cpSync(join(context.baseDir, "user-guide/404.html"), join(context.baseDir, "404.html")); } main(); diff --git a/apps/client/package.json b/apps/client/package.json index 813719026..5ecf18cac 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -15,7 +15,7 @@ "circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular" }, "dependencies": { - "@eslint/js": "9.39.0", + "@eslint/js": "9.39.1", "@excalidraw/excalidraw": "0.18.0", "@fullcalendar/core": "6.1.19", "@fullcalendar/daygrid": "6.1.19", @@ -39,7 +39,7 @@ "color": "5.0.2", "dayjs": "1.11.19", "dayjs-plugin-utc": "0.1.2", - "debounce": "2.2.0", + "debounce": "3.0.0", "draggabilly": "3.0.0", "force-graph": "1.51.0", "globals": "16.5.0", @@ -59,7 +59,7 @@ "normalize.css": "8.0.1", "panzoom": "9.4.3", "preact": "10.27.2", - "react-i18next": "16.2.3", + "react-i18next": "16.2.4", "reveal.js": "5.2.1", "svg-pan-zoom": "3.6.2", "tabulator-tables": "6.3.1", diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index 5105b13f3..52c029ffb 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -109,7 +109,8 @@ "export_type_single": "Solo questa nota, senza le sottostanti", "format_opml": "OPML - formato per scambio informazioni outline. Formattazione, immagini e files non sono inclusi.", "opml_version_1": "OPML v.1.0 - solo testo semplice", - "opml_version_2": "OPML v2.0 - supporta anche HTML" + "opml_version_2": "OPML v2.0 - supporta anche HTML", + "share-format": "HTML per la pubblicazione sul web - utilizza lo stesso tema utilizzato per le note condivise, ma può essere pubblicato come sito web statico." }, "password_not_set": { "body1": "Le note protette sono crittografate utilizzando una password utente, ma la password non è stata ancora impostata.", diff --git a/apps/client/src/widgets/ribbon/EditedNotesTab.tsx b/apps/client/src/widgets/ribbon/EditedNotesTab.tsx index 5bab1c816..4bdae4126 100644 --- a/apps/client/src/widgets/ribbon/EditedNotesTab.tsx +++ b/apps/client/src/widgets/ribbon/EditedNotesTab.tsx @@ -13,8 +13,8 @@ export default function EditedNotesTab({ note }: TabContext) { useEffect(() => { if (!note) return; server.get(`edited-notes/${note.getLabelValue("dateNote")}`).then(async editedNotes => { - editedNotes = editedNotes.filter((n) => n.noteId !== note.noteId); - const noteIds = editedNotes.flatMap((n) => n.noteId); + editedNotes = editedNotes.filter((n) => n.noteId !== note.noteId); + const noteIds = editedNotes.flatMap((n) => n.noteId); await froca.getNotes(noteIds, true); // preload all at once setEditedNotes(editedNotes); }); @@ -41,11 +41,11 @@ export default function EditedNotesTab({ note }: TabContext) { )} ) - }))} + }), " ")} ) : (
{t("edited_notes.no_edited_notes_found")}
)} - ) + ) } diff --git a/apps/client/src/widgets/type_widgets/options/text_notes.tsx b/apps/client/src/widgets/type_widgets/options/text_notes.tsx index 4e2475922..0dd102145 100644 --- a/apps/client/src/widgets/type_widgets/options/text_notes.tsx +++ b/apps/client/src/widgets/type_widgets/options/text_notes.tsx @@ -72,8 +72,8 @@ function EditorFeatures() { return ( - - + + ); } diff --git a/apps/server/package.json b/apps/server/package.json index 8c74bef67..2c9b0aefb 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -78,7 +78,7 @@ "cookie-parser": "1.4.7", "csrf-csrf": "3.2.2", "dayjs": "1.11.19", - "debounce": "2.2.0", + "debounce": "3.0.0", "debug": "4.4.3", "ejs": "3.1.10", "electron": "38.5.0", @@ -110,12 +110,12 @@ "multer": "2.0.2", "normalize-strings": "1.1.1", "ollama": "0.6.2", - "openai": "6.7.0", + "openai": "6.8.0", "rand-token": "1.0.1", "safe-compare": "1.1.4", "sanitize-filename": "1.6.3", "sanitize-html": "2.17.0", - "sax": "1.4.1", + "sax": "1.4.2", "serve-favicon": "2.5.1", "stream-throttle": "0.1.3", "strip-bom": "5.0.0", diff --git a/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json b/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json index 352732be4..c9517ba7b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json +++ b/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json @@ -1 +1 @@ -[{"id":"_help_BOCnjTMBCoxW","title":"Feature Highlights","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Feature Highlights"},{"name":"iconClass","value":"bx bx-star","type":"label"}]},{"id":"_help_Otzi9La2YAUX","title":"Installation & Setup","type":"book","attributes":[{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_poXkQfguuA0U","title":"Desktop Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation"},{"name":"iconClass","value":"bx bx-desktop","type":"label"}],"children":[{"id":"_help_nRqcgfTb97uV","title":"Using the desktop application as a server","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application "},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_Rp0q8bSP6Ayl","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]}]},{"id":"_help_WOcw2SLH6tbX","title":"Server Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation"},{"name":"iconClass","value":"bx bx-server","type":"label"}],"children":[{"id":"_help_Dgg7bR3b6K9j","title":"1. Installing the server","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_3tW6mORuTHnB","title":"Packaged version for Linux","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_rWX5eY045zbE","title":"Using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker"},{"name":"iconClass","value":"bx bxl-docker","type":"label"}]},{"id":"_help_moVgBcoxE3EK","title":"On NixOS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_J1Bb6lVlwU5T","title":"Manually","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]},{"id":"_help_DCmT6e7clMoP","title":"Using Kubernetes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes"},{"name":"iconClass","value":"bx bxl-kubernetes","type":"label"}]},{"id":"_help_klCWNks3ReaQ","title":"Multiple server instances","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances"},{"name":"iconClass","value":"bx bxs-user-account","type":"label"}]}]},{"id":"_help_vcjrb3VVYPZI","title":"2. Reverse proxy","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_ud6MShXL4WpO","title":"Nginx","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_fDLvzOx29Pfg","title":"Apache using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_LLzSMXACKhUs","title":"Trusted proxy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_l2VkvOwUNfZj","title":"HTTPS (TLS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS)"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_0hzsNCP31IAB","title":"Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Authentication"},{"name":"iconClass","value":"bx bx-user","type":"label"}]},{"id":"_help_7DAiwaf8Z7Rz","title":"Multi-Factor Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication"},{"name":"iconClass","value":"bx bx-stopwatch","type":"label"}]},{"id":"_help_yeEaYqosGLSh","title":"Third-party cloud hosting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting"},{"name":"iconClass","value":"bx bx-cloud","type":"label"}]},{"id":"_help_iGTnKjubbXkA","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]}]},{"id":"_help_cbkrhQjrkKrh","title":"Synchronization","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Synchronization"},{"name":"iconClass","value":"bx bx-sync","type":"label"}]},{"id":"_help_RDslemsQ6gCp","title":"Mobile Frontend","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Mobile Frontend"},{"name":"iconClass","value":"bx bx-mobile-alt","type":"label"}]},{"id":"_help_MtPxeAWVAzMg","title":"Web Clipper","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Web Clipper"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_n1lujUxCwipy","title":"Upgrading TriliumNext","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext"},{"name":"iconClass","value":"bx bx-up-arrow-alt","type":"label"}]},{"id":"_help_ODY7qQn5m2FT","title":"Backup","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Backup"},{"name":"iconClass","value":"bx bx-hdd","type":"label"}]},{"id":"_help_tAassRL4RSQL","title":"Data directory","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Data directory"},{"name":"iconClass","value":"bx bx-folder-open","type":"label"}]}]},{"id":"_help_gh7bpGYxajRS","title":"Basic Concepts and Features","type":"book","attributes":[{"name":"iconClass","value":"bx bx-help-circle","type":"label"}],"children":[{"id":"_help_Vc8PjrjAGuOp","title":"UI Elements","type":"book","attributes":[{"name":"iconClass","value":"bx bx-window-alt","type":"label"}],"children":[{"id":"_help_x0JgW8UqGXvq","title":"Vertical and horizontal layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout"},{"name":"iconClass","value":"bx bxs-layout","type":"label"}]},{"id":"_help_x3i7MxGccDuM","title":"Global menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_oPVyFC7WL2Lp","title":"Note Tree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree"},{"name":"iconClass","value":"bx bxs-tree-alt","type":"label"}],"children":[{"id":"_help_YtSN43OrfzaA","title":"Note tree contextual menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_yTjUdsOi4CIE","title":"Multiple selection","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_DvdZhoQZY9Yd","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]}]},{"id":"_help_BlN9DFI679QC","title":"Ribbon","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon"},{"name":"iconClass","value":"bx bx-dots-horizontal","type":"label"}]},{"id":"_help_3seOhtN8uLIY","title":"Tabs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs"},{"name":"iconClass","value":"bx bx-dock-top","type":"label"}]},{"id":"_help_xYmIYSP6wE3F","title":"Launch Bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar"},{"name":"iconClass","value":"bx bx-sidebar","type":"label"}]},{"id":"_help_8YBEPzcpUgxw","title":"Note buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons"},{"name":"iconClass","value":"bx bx-dots-vertical-rounded","type":"label"}]},{"id":"_help_4TIF1oA4VQRO","title":"Options","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]},{"id":"_help_luNhaphA37EO","title":"Split View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View"},{"name":"iconClass","value":"bx bx-dock-right","type":"label"}]},{"id":"_help_XpOYSgsLkTJy","title":"Floating buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons"},{"name":"iconClass","value":"bx bx-rectangle","type":"label"}]},{"id":"_help_RnaPdbciOfeq","title":"Right Sidebar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar"},{"name":"iconClass","value":"bx bxs-dock-right","type":"label"}]},{"id":"_help_r5JGHN99bVKn","title":"Recent Changes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_ny318J39E5Z0","title":"Zoom","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom"},{"name":"iconClass","value":"bx bx-zoom-in","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_lgKX7r3aL30x","title":"Note Tooltip","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip"},{"name":"iconClass","value":"bx bx-message-detail","type":"label"}]}]},{"id":"_help_BFs8mudNFgCS","title":"Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes"},{"name":"iconClass","value":"bx bx-notepad","type":"label"}],"children":[{"id":"_help_p9kXRFAkwN4o","title":"Note Icons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_0vhv7lsOLy82","title":"Attachments","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_IakOLONlIfGI","title":"Cloning Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes"},{"name":"iconClass","value":"bx bx-duplicate","type":"label"}],"children":[{"id":"_help_TBwsyfadTA18","title":"Branch prefix","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix"},{"name":"iconClass","value":"bx bx-rename","type":"label"}]}]},{"id":"_help_bwg0e8ewQMak","title":"Protected Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_MKmLg5x6xkor","title":"Archived Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes"},{"name":"iconClass","value":"bx bx-box","type":"label"}]},{"id":"_help_vZWERwf8U3nx","title":"Note Revisions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_aGlEvb9hyDhS","title":"Sorting Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes"},{"name":"iconClass","value":"bx bx-sort-up","type":"label"}]},{"id":"_help_NRnIZmSMc5sj","title":"Printing & Exporting as PDF","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF"},{"name":"iconClass","value":"bx bx-printer","type":"label"}]},{"id":"_help_CoFPLs3dRlXc","title":"Read-Only Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_0ESUbbAxVnoK","title":"Note List","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note List"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]}]},{"id":"_help_wArbEsdSae6g","title":"Navigation","type":"book","attributes":[{"name":"iconClass","value":"bx bx-navigation","type":"label"}],"children":[{"id":"_help_kBrnXNG3Hplm","title":"Tree Concepts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}]},{"id":"_help_MMiBEQljMQh2","title":"Note Navigation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation"},{"name":"iconClass","value":"bx bxs-navigation","type":"label"}]},{"id":"_help_Ms1nauBra7gq","title":"Quick search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_F1r9QtzQLZqm","title":"Jump to...","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to"},{"name":"iconClass","value":"bx bx-send","type":"label"}]},{"id":"_help_eIg8jdvaoNNd","title":"Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_u3YFHC9tQlpm","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmarks","type":"label"}]},{"id":"_help_OR8WJ7Iz9K4U","title":"Note Hoisting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting"},{"name":"iconClass","value":"bx bxs-chevrons-up","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick edit.clone"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_9sRHySam5fXb","title":"Workspaces","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces"},{"name":"iconClass","value":"bx bx-door-open","type":"label"}]},{"id":"_help_xWtq5NUHOwql","title":"Similar Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes"},{"name":"iconClass","value":"bx bx-bar-chart","type":"label"}]},{"id":"_help_McngOG2jbUWX","title":"Search in note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]}]},{"id":"_help_A9Oc6YKKc65v","title":"Keyboard Shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_Wy267RK4M69c","title":"Themes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes"},{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_VbjZvtUek0Ln","title":"Theme Gallery","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]}]},{"id":"_help_mHbBMPDPkVV5","title":"Import & Export","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export"},{"name":"iconClass","value":"bx bx-import","type":"label"}],"children":[{"id":"_help_Oau6X9rCuegd","title":"Markdown","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}],"children":[{"id":"_help_rJ9grSgoExl9","title":"Supported syntax","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown/Supported syntax"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]}]},{"id":"_help_syuSEKf2rUGr","title":"Evernote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}]},{"id":"_help_GnhlmrATVqcH","title":"OneNote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}]}]},{"id":"_help_rC3pL2aptaRE","title":"Zen mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Zen mode"},{"name":"iconClass","value":"bx bxs-yin-yang","type":"label"}]}]},{"id":"_help_s3YCWHBfmYuM","title":"Quick Start","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Quick Start"},{"name":"iconClass","value":"bx bx-run","type":"label"}]},{"id":"_help_i6dbnitykE5D","title":"FAQ","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/FAQ"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_KSZ04uQ2D1St","title":"Note Types","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types"},{"name":"iconClass","value":"bx bx-edit","type":"label"}],"children":[{"id":"_help_iPIMuisry3hd","title":"Text","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text"},{"name":"iconClass","value":"bx bx-note","type":"label"}],"children":[{"id":"_help_NwBbFdNZ9h7O","title":"Block quotes & admonitions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Block quotes & admonitions"},{"name":"iconClass","value":"bx bx-info-circle","type":"label"}]},{"id":"_help_oSuaNgyyKnhu","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmark","type":"label"}]},{"id":"_help_veGu4faJErEM","title":"Content language & Right-to-left support","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Content language & Right-to-le"},{"name":"iconClass","value":"bx bx-align-right","type":"label"}]},{"id":"_help_2x0ZAX9ePtzV","title":"Cut to subnote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Cut to subnote"},{"name":"iconClass","value":"bx bx-cut","type":"label"}]},{"id":"_help_UYuUB1ZekNQU","title":"Developer-specific formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_QxEyIjRBizuC","title":"Code blocks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks"},{"name":"iconClass","value":"bx bx-code","type":"label"}]}]},{"id":"_help_AgjCISero73a","title":"Footnotes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Footnotes"},{"name":"iconClass","value":"bx bx-bracket","type":"label"}]},{"id":"_help_nRhnJkTT8cPs","title":"Formatting toolbar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Formatting toolbar"},{"name":"iconClass","value":"bx bx-text","type":"label"}]},{"id":"_help_Gr6xFaF6ioJ5","title":"General formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/General formatting"},{"name":"iconClass","value":"bx bx-bold","type":"label"}]},{"id":"_help_AxshuNRegLAv","title":"Highlights list","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Highlights list"},{"name":"iconClass","value":"bx bx-highlight","type":"label"}]},{"id":"_help_mT0HEkOsz6i1","title":"Images","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images"},{"name":"iconClass","value":"bx bx-image-alt","type":"label"}],"children":[{"id":"_help_0Ofbk1aSuVRu","title":"Image references","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images/Image references"},{"name":"iconClass","value":"bx bxs-file-image","type":"label"}]}]},{"id":"_help_nBAXQFj20hS1","title":"Include Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Include Note"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_CohkqWQC1iBv","title":"Insert buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Insert buttons"},{"name":"iconClass","value":"bx bx-plus","type":"label"}]},{"id":"_help_oiVPnW8QfnvS","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_QEAPj01N5f7w","title":"Links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links"},{"name":"iconClass","value":"bx bx-link-alt","type":"label"}],"children":[{"id":"_help_3IDVtesTQ8ds","title":"External links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/External links"},{"name":"iconClass","value":"bx bx-link-external","type":"label"}]},{"id":"_help_hrZ1D00cLbal","title":"Internal (reference) links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/Internal (reference) links"},{"name":"iconClass","value":"bx bx-link","type":"label"}]}]},{"id":"_help_S6Xx8QIWTV66","title":"Lists","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Lists"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_QrtTYPmdd1qq","title":"Markdown-like formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Markdown-like formatting"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}]},{"id":"_help_YfYAtQBcfo5V","title":"Math Equations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Math Equations"},{"name":"iconClass","value":"bx bx-math","type":"label"}]},{"id":"_help_dEHYtoWWi8ct","title":"Other features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Other features"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_gLt3vA97tMcp","title":"Premium features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features"},{"name":"iconClass","value":"bx bx-star","type":"label"}],"children":[{"id":"_help_ZlN4nump6EbW","title":"Slash Commands","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Slash Commands"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_pwc194wlRzcH","title":"Text Snippets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Text Snippets"},{"name":"iconClass","value":"bx bx-align-left","type":"label"}]}]},{"id":"_help_BFvAtE74rbP6","title":"Table of contents","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Table of contents"},{"name":"iconClass","value":"bx bx-heading","type":"label"}]},{"id":"_help_NdowYOC1GFKS","title":"Tables","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Tables"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_6f9hih2hXXZk","title":"Code","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Code"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_m523cpzocqaD","title":"Saved Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Saved Search"},{"name":"iconClass","value":"bx bx-file-find","type":"label"}]},{"id":"_help_iRwzGnHPzonm","title":"Relation Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Relation Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_bdUJEHsAPYQR","title":"Note Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Note Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_HcABDtFCkbFN","title":"Render Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Render Note"},{"name":"iconClass","value":"bx bx-extension","type":"label"}]},{"id":"_help_s1aBHPd79XYj","title":"Mermaid Diagrams","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams"},{"name":"iconClass","value":"bx bx-selection","type":"label"}],"children":[{"id":"_help_RH6yLjjWJHof","title":"ELK layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_WWgeUaBb7UfC","title":"Syntax reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://mermaid.js.org/intro/syntax-reference.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_grjYqerjn243","title":"Canvas","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Canvas"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_1vHRoWCEjj0L","title":"Web View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Web View"},{"name":"iconClass","value":"bx bx-globe-alt","type":"label"}]},{"id":"_help_gBbsAeiuUxI5","title":"Mind Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mind Map"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_W8vYD3Q1zjCR","title":"File","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File"},{"name":"iconClass","value":"bx bx-file-blank","type":"label"}]}]},{"id":"_help_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Calendar"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Table"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Kanban Board","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Kanban Board"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Geo Map"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_zP3PMqaG71Ct","title":"Presentation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Presentation"},{"name":"iconClass","value":"bx bx-slideshow","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Grid View"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_mULW0Q3VojwY","title":"List View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]}]},{"id":"_help_BgmBlOIl72jZ","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting"},{"name":"iconClass","value":"bx bx-bug","type":"label"}],"children":[{"id":"_help_wy8So3yZZlH9","title":"Reporting issues","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Reporting issues"},{"name":"iconClass","value":"bx bx-bug-alt","type":"label"}]},{"id":"_help_x59R8J8KV5Bp","title":"Anonymized Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Anonymized Database"},{"name":"iconClass","value":"bx bx-low-vision","type":"label"}]},{"id":"_help_qzNzp9LYQyPT","title":"Error logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs"},{"name":"iconClass","value":"bx bx-comment-error","type":"label"}],"children":[{"id":"_help_bnyigUA2UK7s","title":"Backend (server) logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Backend (server) logs"},{"name":"iconClass","value":"bx bx-server","type":"label"}]},{"id":"_help_9yEHzMyFirZR","title":"Frontend logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Frontend logs"},{"name":"iconClass","value":"bx bx-window-alt","type":"label"}]}]},{"id":"_help_vdlYGAcpXAgc","title":"Synchronization fails with 504 Gateway Timeout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Synchronization fails with 504"},{"name":"iconClass","value":"bx bx-error","type":"label"}]},{"id":"_help_s8alTXmpFR61","title":"Refreshing the application","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Refreshing the application"},{"name":"iconClass","value":"bx bx-refresh","type":"label"}]}]},{"id":"_help_pKK96zzmvBGf","title":"Theme development","type":"book","attributes":[{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_7NfNr5pZpVKV","title":"Creating a custom theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating a custom theme"},{"name":"iconClass","value":"bx bxs-color","type":"label"}]},{"id":"_help_WFGzWeUK6arS","title":"Customize the Next theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Customize the Next theme"},{"name":"iconClass","value":"bx bx-news","type":"label"}]},{"id":"_help_WN5z4M8ASACJ","title":"Reference","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Reference"},{"name":"iconClass","value":"bx bx-book-open","type":"label"}]},{"id":"_help_AlhDUqhENtH7","title":"Custom app-wide CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Custom app-wide CSS"},{"name":"iconClass","value":"bx bxs-file-css","type":"label"}]}]},{"id":"_help_tC7s2alapj8V","title":"Advanced Usage","type":"book","attributes":[{"name":"iconClass","value":"bx bx-rocket","type":"label"}],"children":[{"id":"_help_zEY4DaJG4YT5","title":"Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes"},{"name":"iconClass","value":"bx bx-list-check","type":"label"}],"children":[{"id":"_help_HI6GBBIduIgv","title":"Labels","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Labels"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_Cq5X6iKQop6R","title":"Relations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Relations"},{"name":"iconClass","value":"bx bx-transfer","type":"label"}]},{"id":"_help_bwZpz2ajCEwO","title":"Attribute Inheritance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_OFXdgB2nNk1F","title":"Promoted Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_KC1HB96bqqHX","title":"Templates","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Templates"},{"name":"iconClass","value":"bx bx-copy","type":"label"}]},{"id":"_help_BCkXAVs63Ttv","title":"Note Map (Link map, Tree map)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map)"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_R9pX4DGra2Vt","title":"Sharing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing"},{"name":"iconClass","value":"bx bx-share-alt","type":"label"}],"children":[{"id":"_help_Qjt68inQ2bRj","title":"Serving directly the content of a note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_ycBFjKrrwE9p","title":"Exporting HTML for web publishing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish"},{"name":"iconClass","value":"bx bxs-file-html","type":"label"}]},{"id":"_help_sLIJ6f1dkJYW","title":"Reverse proxy configuration","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration"},{"name":"iconClass","value":"bx bx-world","type":"label"}]}]},{"id":"_help_5668rwcirq1t","title":"Advanced Showcases","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_l0tKav7yLHGF","title":"Day Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_R7abl2fc6Mxi","title":"Weight Tracker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker"},{"name":"iconClass","value":"bx bx-line-chart","type":"label"}]},{"id":"_help_xYjQUYhpbUEW","title":"Task Manager","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager"},{"name":"iconClass","value":"bx bx-calendar-check","type":"label"}]}]},{"id":"_help_J5Ex1ZrMbyJ6","title":"Custom Request Handler","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Request Handler"},{"name":"iconClass","value":"bx bx-globe","type":"label"}]},{"id":"_help_d3fAXQ2diepH","title":"Custom Resource Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Resource Providers"},{"name":"iconClass","value":"bx bxs-file-plus","type":"label"}]},{"id":"_help_pgxEVkzLl1OP","title":"ETAPI (REST API)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/ETAPI (REST API)"},{"name":"iconClass","value":"bx bx-extension","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/etapi/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_47ZrP6FNuoG8","title":"Default Note Title","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Default Note Title"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_wX4HbRucYSDD","title":"Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database"},{"name":"iconClass","value":"bx bx-data","type":"label"}],"children":[{"id":"_help_oyIAJ9PvvwHX","title":"Manually altering the database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database"},{"name":"iconClass","value":"bx bxs-edit","type":"label"}],"children":[{"id":"_help_YKWqdJhzi2VY","title":"SQL Console","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console"},{"name":"iconClass","value":"bx bx-data","type":"label"}]}]},{"id":"_help_6tZeKvSHEUiB","title":"Demo Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Demo Notes"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_Gzjqa934BdH4","title":"Configuration (config.ini or environment variables)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e"},{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_c5xB8m4g2IY6","title":"Trilium instance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance"},{"name":"iconClass","value":"bx bx-windows","type":"label"}]},{"id":"_help_LWtBjFej3wX3","title":"Cross-Origin Resource Sharing (CORS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing "},{"name":"iconClass","value":"bx bx-lock","type":"label"}]}]},{"id":"_help_ivYnonVFBxbQ","title":"Bulk Actions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Bulk Actions"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_4FahAwuGTAwC","title":"Note source","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note source"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_1YeN2MzFUluU","title":"Technologies used","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}],"children":[{"id":"_help_MI26XDLSAlCD","title":"CKEditor","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_N4IDkixaDG9C","title":"MindElixir","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_H0mM1lTxF9JI","title":"Excalidraw","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_MQHyy2dIFgxS","title":"Leaflet","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]}]},{"id":"_help_m1lbrzyKDaRB","title":"Note ID","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note ID"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_0vTSyvhPTAOz","title":"Internal API","type":"book","attributes":[{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/internal/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_2mUhVmZK8RF3","title":"Hidden Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Hidden Notes"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]},{"id":"_help_uYF7pmepw27K","title":"Metrics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Metrics"},{"name":"iconClass","value":"bx bxs-data","type":"label"}],"children":[{"id":"_help_bOP3TB56fL1V","title":"grafana-dashboard.json","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]},{"id":"_help_GBBMSlVSOIGP","title":"AI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI"},{"name":"iconClass","value":"bx bx-bot","type":"label"}],"children":[{"id":"_help_WkM7gsEUyCXs","title":"Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers"},{"name":"iconClass","value":"bx bx-select-multiple","type":"label"}],"children":[{"id":"_help_7EdTxPADv95W","title":"Ollama","type":"book","attributes":[{"name":"iconClass","value":"bx bx-message-dots","type":"label"}],"children":[{"id":"_help_vvUCN7FDkq7G","title":"Installing Ollama","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers/Ollama/Installing Ollama"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_ZavFigBX9AwP","title":"OpenAI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers/OpenAI"},{"name":"iconClass","value":"bx bx-message-dots","type":"label"}]},{"id":"_help_e0lkirXEiSNc","title":"Anthropic","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers/Anthropic"},{"name":"iconClass","value":"bx bx-message-dots","type":"label"}]}]}]},{"id":"_help_CdNpE2pqjmI6","title":"Scripting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting"},{"name":"iconClass","value":"bx bxs-file-js","type":"label"}],"children":[{"id":"_help_yIhgI5H7A2Sm","title":"Frontend Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics"},{"name":"iconClass","value":"bx bx-info-circle","type":"label"}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_TjLYAo3JMO8X","title":"\"New Task\" launcher button","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/New Task launcher button"},{"name":"iconClass","value":"bx bx-task","type":"label"}]},{"id":"_help_7kZPMD0uFwkH","title":"Downloading responses from Google Forms","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/Downloading responses from Goo"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_DL92EjAaXT26","title":"Using promoted attributes to configure scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Examples/Using promoted attributes to c"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GPERMystNGTB","title":"Events","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Events"},{"name":"iconClass","value":"bx bx-rss","type":"label"}]},{"id":"_help_MgibgPcfeuGz","title":"Custom Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets"},{"name":"iconClass","value":"bx bxs-widget","type":"label"}],"children":[{"id":"_help_YNxAqkI5Kg1M","title":"Word count widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets/Word count widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_SynTBQiBsdYJ","title":"Widget Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Custom Widgets/Widget Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GLks18SNjxmC","title":"Script API","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API"},{"name":"iconClass","value":"bx bx-code-curly","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"enforceAttributes":true,"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend/interfaces/FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/backend"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_vElnKeDNPSVl","title":"Logging","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Logging"},{"name":"iconClass","value":"bx bx-terminal","type":"label"}]}]},{"id":"_help_Fm0j45KqyHpU","title":"Miscellaneous","type":"book","attributes":[{"name":"iconClass","value":"bx bx-info-circle","type":"label"}],"children":[{"id":"_help_WFbFXrgnDyyU","title":"Privacy Policy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Privacy Policy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_NcsmUYZRWEW4","title":"Patterns of personal knowledge","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Patterns of personal knowledge"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}] \ No newline at end of file +[{"id":"_help_BOCnjTMBCoxW","title":"Feature Highlights","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Feature Highlights"},{"name":"iconClass","value":"bx bx-star","type":"label"}]},{"id":"_help_Otzi9La2YAUX","title":"Installation & Setup","type":"book","attributes":[{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_poXkQfguuA0U","title":"Desktop Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation"},{"name":"iconClass","value":"bx bx-desktop","type":"label"}],"children":[{"id":"_help_nRqcgfTb97uV","title":"Using the desktop application as a server","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application "},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_Rp0q8bSP6Ayl","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]},{"id":"_help_Un4wj2Mak2Ky","title":"Nix flake","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]}]},{"id":"_help_WOcw2SLH6tbX","title":"Server Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation"},{"name":"iconClass","value":"bx bx-server","type":"label"}],"children":[{"id":"_help_Dgg7bR3b6K9j","title":"1. Installing the server","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_3tW6mORuTHnB","title":"Packaged version for Linux","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_rWX5eY045zbE","title":"Using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker"},{"name":"iconClass","value":"bx bxl-docker","type":"label"}]},{"id":"_help_moVgBcoxE3EK","title":"On NixOS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_J1Bb6lVlwU5T","title":"Manually","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]},{"id":"_help_DCmT6e7clMoP","title":"Using Kubernetes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes"},{"name":"iconClass","value":"bx bxl-kubernetes","type":"label"}]},{"id":"_help_klCWNks3ReaQ","title":"Multiple server instances","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances"},{"name":"iconClass","value":"bx bxs-user-account","type":"label"}]}]},{"id":"_help_vcjrb3VVYPZI","title":"2. Reverse proxy","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_ud6MShXL4WpO","title":"Nginx","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_fDLvzOx29Pfg","title":"Apache using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_LLzSMXACKhUs","title":"Trusted proxy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_l2VkvOwUNfZj","title":"HTTPS (TLS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS)"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_0hzsNCP31IAB","title":"Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Authentication"},{"name":"iconClass","value":"bx bx-user","type":"label"}]},{"id":"_help_7DAiwaf8Z7Rz","title":"Multi-Factor Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication"},{"name":"iconClass","value":"bx bx-stopwatch","type":"label"}]},{"id":"_help_Un4wj2Mak2Ky","title":"Nix flake","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_yeEaYqosGLSh","title":"Third-party cloud hosting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting"},{"name":"iconClass","value":"bx bx-cloud","type":"label"}]},{"id":"_help_iGTnKjubbXkA","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]}]},{"id":"_help_cbkrhQjrkKrh","title":"Synchronization","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Synchronization"},{"name":"iconClass","value":"bx bx-sync","type":"label"}]},{"id":"_help_RDslemsQ6gCp","title":"Mobile Frontend","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Mobile Frontend"},{"name":"iconClass","value":"bx bx-mobile-alt","type":"label"}]},{"id":"_help_MtPxeAWVAzMg","title":"Web Clipper","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Web Clipper"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_n1lujUxCwipy","title":"Upgrading TriliumNext","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext"},{"name":"iconClass","value":"bx bx-up-arrow-alt","type":"label"}]},{"id":"_help_ODY7qQn5m2FT","title":"Backup","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Backup"},{"name":"iconClass","value":"bx bx-hdd","type":"label"}]},{"id":"_help_tAassRL4RSQL","title":"Data directory","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Data directory"},{"name":"iconClass","value":"bx bx-folder-open","type":"label"}]}]},{"id":"_help_gh7bpGYxajRS","title":"Basic Concepts and Features","type":"book","attributes":[{"name":"iconClass","value":"bx bx-help-circle","type":"label"}],"children":[{"id":"_help_Vc8PjrjAGuOp","title":"UI Elements","type":"book","attributes":[{"name":"iconClass","value":"bx bx-window-alt","type":"label"}],"children":[{"id":"_help_x0JgW8UqGXvq","title":"Vertical and horizontal layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout"},{"name":"iconClass","value":"bx bxs-layout","type":"label"}]},{"id":"_help_x3i7MxGccDuM","title":"Global menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_oPVyFC7WL2Lp","title":"Note Tree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree"},{"name":"iconClass","value":"bx bxs-tree-alt","type":"label"}],"children":[{"id":"_help_YtSN43OrfzaA","title":"Note tree contextual menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_yTjUdsOi4CIE","title":"Multiple selection","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_DvdZhoQZY9Yd","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]}]},{"id":"_help_BlN9DFI679QC","title":"Ribbon","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon"},{"name":"iconClass","value":"bx bx-dots-horizontal","type":"label"}]},{"id":"_help_3seOhtN8uLIY","title":"Tabs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs"},{"name":"iconClass","value":"bx bx-dock-top","type":"label"}]},{"id":"_help_xYmIYSP6wE3F","title":"Launch Bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar"},{"name":"iconClass","value":"bx bx-sidebar","type":"label"}]},{"id":"_help_8YBEPzcpUgxw","title":"Note buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons"},{"name":"iconClass","value":"bx bx-dots-vertical-rounded","type":"label"}]},{"id":"_help_4TIF1oA4VQRO","title":"Options","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]},{"id":"_help_luNhaphA37EO","title":"Split View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View"},{"name":"iconClass","value":"bx bx-dock-right","type":"label"}]},{"id":"_help_XpOYSgsLkTJy","title":"Floating buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons"},{"name":"iconClass","value":"bx bx-rectangle","type":"label"}]},{"id":"_help_RnaPdbciOfeq","title":"Right Sidebar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar"},{"name":"iconClass","value":"bx bxs-dock-right","type":"label"}]},{"id":"_help_r5JGHN99bVKn","title":"Recent Changes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_ny318J39E5Z0","title":"Zoom","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom"},{"name":"iconClass","value":"bx bx-zoom-in","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_lgKX7r3aL30x","title":"Note Tooltip","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip"},{"name":"iconClass","value":"bx bx-message-detail","type":"label"}]}]},{"id":"_help_BFs8mudNFgCS","title":"Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes"},{"name":"iconClass","value":"bx bx-notepad","type":"label"}],"children":[{"id":"_help_p9kXRFAkwN4o","title":"Note Icons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_0vhv7lsOLy82","title":"Attachments","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_IakOLONlIfGI","title":"Cloning Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes"},{"name":"iconClass","value":"bx bx-duplicate","type":"label"}],"children":[{"id":"_help_TBwsyfadTA18","title":"Branch prefix","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix"},{"name":"iconClass","value":"bx bx-rename","type":"label"}]}]},{"id":"_help_bwg0e8ewQMak","title":"Protected Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_MKmLg5x6xkor","title":"Archived Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes"},{"name":"iconClass","value":"bx bx-box","type":"label"}]},{"id":"_help_vZWERwf8U3nx","title":"Note Revisions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_aGlEvb9hyDhS","title":"Sorting Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes"},{"name":"iconClass","value":"bx bx-sort-up","type":"label"}]},{"id":"_help_NRnIZmSMc5sj","title":"Printing & Exporting as PDF","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF"},{"name":"iconClass","value":"bx bx-printer","type":"label"}]},{"id":"_help_CoFPLs3dRlXc","title":"Read-Only Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_0ESUbbAxVnoK","title":"Note List","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note List"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]}]},{"id":"_help_wArbEsdSae6g","title":"Navigation","type":"book","attributes":[{"name":"iconClass","value":"bx bx-navigation","type":"label"}],"children":[{"id":"_help_kBrnXNG3Hplm","title":"Tree Concepts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}]},{"id":"_help_MMiBEQljMQh2","title":"Note Navigation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation"},{"name":"iconClass","value":"bx bxs-navigation","type":"label"}]},{"id":"_help_Ms1nauBra7gq","title":"Quick search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_F1r9QtzQLZqm","title":"Jump to...","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to"},{"name":"iconClass","value":"bx bx-send","type":"label"}]},{"id":"_help_eIg8jdvaoNNd","title":"Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_u3YFHC9tQlpm","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmarks","type":"label"}]},{"id":"_help_OR8WJ7Iz9K4U","title":"Note Hoisting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting"},{"name":"iconClass","value":"bx bxs-chevrons-up","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick edit.clone"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_9sRHySam5fXb","title":"Workspaces","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces"},{"name":"iconClass","value":"bx bx-door-open","type":"label"}]},{"id":"_help_xWtq5NUHOwql","title":"Similar Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes"},{"name":"iconClass","value":"bx bx-bar-chart","type":"label"}]},{"id":"_help_McngOG2jbUWX","title":"Search in note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]}]},{"id":"_help_A9Oc6YKKc65v","title":"Keyboard Shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_Wy267RK4M69c","title":"Themes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes"},{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_VbjZvtUek0Ln","title":"Theme Gallery","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]}]},{"id":"_help_mHbBMPDPkVV5","title":"Import & Export","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export"},{"name":"iconClass","value":"bx bx-import","type":"label"}],"children":[{"id":"_help_Oau6X9rCuegd","title":"Markdown","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}],"children":[{"id":"_help_rJ9grSgoExl9","title":"Supported syntax","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown/Supported syntax"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]}]},{"id":"_help_syuSEKf2rUGr","title":"Evernote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}]},{"id":"_help_GnhlmrATVqcH","title":"OneNote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}]}]},{"id":"_help_rC3pL2aptaRE","title":"Zen mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Zen mode"},{"name":"iconClass","value":"bx bxs-yin-yang","type":"label"}]}]},{"id":"_help_s3YCWHBfmYuM","title":"Quick Start","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Quick Start"},{"name":"iconClass","value":"bx bx-run","type":"label"}]},{"id":"_help_i6dbnitykE5D","title":"FAQ","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/FAQ"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_KSZ04uQ2D1St","title":"Note Types","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types"},{"name":"iconClass","value":"bx bx-edit","type":"label"}],"children":[{"id":"_help_iPIMuisry3hd","title":"Text","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text"},{"name":"iconClass","value":"bx bx-note","type":"label"}],"children":[{"id":"_help_NwBbFdNZ9h7O","title":"Block quotes & admonitions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Block quotes & admonitions"},{"name":"iconClass","value":"bx bx-info-circle","type":"label"}]},{"id":"_help_oSuaNgyyKnhu","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmark","type":"label"}]},{"id":"_help_veGu4faJErEM","title":"Content language & Right-to-left support","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Content language & Right-to-le"},{"name":"iconClass","value":"bx bx-align-right","type":"label"}]},{"id":"_help_2x0ZAX9ePtzV","title":"Cut to subnote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Cut to subnote"},{"name":"iconClass","value":"bx bx-cut","type":"label"}]},{"id":"_help_UYuUB1ZekNQU","title":"Developer-specific formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_QxEyIjRBizuC","title":"Code blocks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks"},{"name":"iconClass","value":"bx bx-code","type":"label"}]}]},{"id":"_help_AgjCISero73a","title":"Footnotes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Footnotes"},{"name":"iconClass","value":"bx bx-bracket","type":"label"}]},{"id":"_help_nRhnJkTT8cPs","title":"Formatting toolbar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Formatting toolbar"},{"name":"iconClass","value":"bx bx-text","type":"label"}]},{"id":"_help_Gr6xFaF6ioJ5","title":"General formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/General formatting"},{"name":"iconClass","value":"bx bx-bold","type":"label"}]},{"id":"_help_AxshuNRegLAv","title":"Highlights list","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Highlights list"},{"name":"iconClass","value":"bx bx-highlight","type":"label"}]},{"id":"_help_mT0HEkOsz6i1","title":"Images","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images"},{"name":"iconClass","value":"bx bx-image-alt","type":"label"}],"children":[{"id":"_help_0Ofbk1aSuVRu","title":"Image references","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images/Image references"},{"name":"iconClass","value":"bx bxs-file-image","type":"label"}]}]},{"id":"_help_nBAXQFj20hS1","title":"Include Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Include Note"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_CohkqWQC1iBv","title":"Insert buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Insert buttons"},{"name":"iconClass","value":"bx bx-plus","type":"label"}]},{"id":"_help_oiVPnW8QfnvS","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_QEAPj01N5f7w","title":"Links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links"},{"name":"iconClass","value":"bx bx-link-alt","type":"label"}],"children":[{"id":"_help_3IDVtesTQ8ds","title":"External links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/External links"},{"name":"iconClass","value":"bx bx-link-external","type":"label"}]},{"id":"_help_hrZ1D00cLbal","title":"Internal (reference) links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/Internal (reference) links"},{"name":"iconClass","value":"bx bx-link","type":"label"}]}]},{"id":"_help_S6Xx8QIWTV66","title":"Lists","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Lists"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_QrtTYPmdd1qq","title":"Markdown-like formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Markdown-like formatting"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}]},{"id":"_help_YfYAtQBcfo5V","title":"Math Equations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Math Equations"},{"name":"iconClass","value":"bx bx-math","type":"label"}]},{"id":"_help_dEHYtoWWi8ct","title":"Other features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Other features"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_gLt3vA97tMcp","title":"Premium features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features"},{"name":"iconClass","value":"bx bx-star","type":"label"}],"children":[{"id":"_help_ZlN4nump6EbW","title":"Slash Commands","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Slash Commands"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_pwc194wlRzcH","title":"Text Snippets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Text Snippets"},{"name":"iconClass","value":"bx bx-align-left","type":"label"}]}]},{"id":"_help_BFvAtE74rbP6","title":"Table of contents","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Table of contents"},{"name":"iconClass","value":"bx bx-heading","type":"label"}]},{"id":"_help_NdowYOC1GFKS","title":"Tables","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Tables"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_6f9hih2hXXZk","title":"Code","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Code"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_m523cpzocqaD","title":"Saved Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Saved Search"},{"name":"iconClass","value":"bx bx-file-find","type":"label"}]},{"id":"_help_iRwzGnHPzonm","title":"Relation Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Relation Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_bdUJEHsAPYQR","title":"Note Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Note Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_HcABDtFCkbFN","title":"Render Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Render Note"},{"name":"iconClass","value":"bx bx-extension","type":"label"}]},{"id":"_help_s1aBHPd79XYj","title":"Mermaid Diagrams","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams"},{"name":"iconClass","value":"bx bx-selection","type":"label"}],"children":[{"id":"_help_RH6yLjjWJHof","title":"ELK layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_WWgeUaBb7UfC","title":"Syntax reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://mermaid.js.org/intro/syntax-reference.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_grjYqerjn243","title":"Canvas","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Canvas"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_1vHRoWCEjj0L","title":"Web View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Web View"},{"name":"iconClass","value":"bx bx-globe-alt","type":"label"}]},{"id":"_help_gBbsAeiuUxI5","title":"Mind Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mind Map"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_W8vYD3Q1zjCR","title":"File","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File"},{"name":"iconClass","value":"bx bx-file-blank","type":"label"}]}]},{"id":"_help_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Calendar"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Table"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Kanban Board","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Kanban Board"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Geo Map"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_zP3PMqaG71Ct","title":"Presentation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Presentation"},{"name":"iconClass","value":"bx bx-slideshow","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Grid View"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_mULW0Q3VojwY","title":"List View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]}]},{"id":"_help_BgmBlOIl72jZ","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting"},{"name":"iconClass","value":"bx bx-bug","type":"label"}],"children":[{"id":"_help_wy8So3yZZlH9","title":"Reporting issues","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Reporting issues"},{"name":"iconClass","value":"bx bx-bug-alt","type":"label"}]},{"id":"_help_x59R8J8KV5Bp","title":"Anonymized Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Anonymized Database"},{"name":"iconClass","value":"bx bx-low-vision","type":"label"}]},{"id":"_help_qzNzp9LYQyPT","title":"Error logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs"},{"name":"iconClass","value":"bx bx-comment-error","type":"label"}],"children":[{"id":"_help_bnyigUA2UK7s","title":"Backend (server) logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Backend (server) logs"},{"name":"iconClass","value":"bx bx-server","type":"label"}]},{"id":"_help_9yEHzMyFirZR","title":"Frontend logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Frontend logs"},{"name":"iconClass","value":"bx bx-window-alt","type":"label"}]}]},{"id":"_help_vdlYGAcpXAgc","title":"Synchronization fails with 504 Gateway Timeout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Synchronization fails with 504"},{"name":"iconClass","value":"bx bx-error","type":"label"}]},{"id":"_help_s8alTXmpFR61","title":"Refreshing the application","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Refreshing the application"},{"name":"iconClass","value":"bx bx-refresh","type":"label"}]}]},{"id":"_help_pKK96zzmvBGf","title":"Theme development","type":"book","attributes":[{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_7NfNr5pZpVKV","title":"Creating a custom theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating a custom theme"},{"name":"iconClass","value":"bx bxs-color","type":"label"}]},{"id":"_help_WFGzWeUK6arS","title":"Customize the Next theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Customize the Next theme"},{"name":"iconClass","value":"bx bx-news","type":"label"}]},{"id":"_help_WN5z4M8ASACJ","title":"Reference","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Reference"},{"name":"iconClass","value":"bx bx-book-open","type":"label"}]},{"id":"_help_AlhDUqhENtH7","title":"Custom app-wide CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Custom app-wide CSS"},{"name":"iconClass","value":"bx bxs-file-css","type":"label"}]}]},{"id":"_help_tC7s2alapj8V","title":"Advanced Usage","type":"book","attributes":[{"name":"iconClass","value":"bx bx-rocket","type":"label"}],"children":[{"id":"_help_zEY4DaJG4YT5","title":"Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes"},{"name":"iconClass","value":"bx bx-list-check","type":"label"}],"children":[{"id":"_help_HI6GBBIduIgv","title":"Labels","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Labels"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_Cq5X6iKQop6R","title":"Relations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Relations"},{"name":"iconClass","value":"bx bx-transfer","type":"label"}]},{"id":"_help_bwZpz2ajCEwO","title":"Attribute Inheritance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_OFXdgB2nNk1F","title":"Promoted Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_KC1HB96bqqHX","title":"Templates","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Templates"},{"name":"iconClass","value":"bx bx-copy","type":"label"}]},{"id":"_help_BCkXAVs63Ttv","title":"Note Map (Link map, Tree map)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map)"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_R9pX4DGra2Vt","title":"Sharing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing"},{"name":"iconClass","value":"bx bx-share-alt","type":"label"}],"children":[{"id":"_help_Qjt68inQ2bRj","title":"Serving directly the content of a note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_ycBFjKrrwE9p","title":"Exporting HTML for web publishing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish"},{"name":"iconClass","value":"bx bxs-file-html","type":"label"}]},{"id":"_help_sLIJ6f1dkJYW","title":"Reverse proxy configuration","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration"},{"name":"iconClass","value":"bx bx-world","type":"label"}]}]},{"id":"_help_5668rwcirq1t","title":"Advanced Showcases","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_l0tKav7yLHGF","title":"Day Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_R7abl2fc6Mxi","title":"Weight Tracker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker"},{"name":"iconClass","value":"bx bx-line-chart","type":"label"}]},{"id":"_help_xYjQUYhpbUEW","title":"Task Manager","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager"},{"name":"iconClass","value":"bx bx-calendar-check","type":"label"}]}]},{"id":"_help_J5Ex1ZrMbyJ6","title":"Custom Request Handler","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Request Handler"},{"name":"iconClass","value":"bx bx-globe","type":"label"}]},{"id":"_help_d3fAXQ2diepH","title":"Custom Resource Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Resource Providers"},{"name":"iconClass","value":"bx bxs-file-plus","type":"label"}]},{"id":"_help_pgxEVkzLl1OP","title":"ETAPI (REST API)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/ETAPI (REST API)"},{"name":"iconClass","value":"bx bx-extension","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/etapi/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_47ZrP6FNuoG8","title":"Default Note Title","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Default Note Title"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_wX4HbRucYSDD","title":"Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database"},{"name":"iconClass","value":"bx bx-data","type":"label"}],"children":[{"id":"_help_oyIAJ9PvvwHX","title":"Manually altering the database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database"},{"name":"iconClass","value":"bx bxs-edit","type":"label"}],"children":[{"id":"_help_YKWqdJhzi2VY","title":"SQL Console","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console"},{"name":"iconClass","value":"bx bx-data","type":"label"}]}]},{"id":"_help_6tZeKvSHEUiB","title":"Demo Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Demo Notes"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_Gzjqa934BdH4","title":"Configuration (config.ini or environment variables)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e"},{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_c5xB8m4g2IY6","title":"Trilium instance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance"},{"name":"iconClass","value":"bx bx-windows","type":"label"}]},{"id":"_help_LWtBjFej3wX3","title":"Cross-Origin Resource Sharing (CORS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing "},{"name":"iconClass","value":"bx bx-lock","type":"label"}]}]},{"id":"_help_ivYnonVFBxbQ","title":"Bulk Actions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Bulk Actions"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_4FahAwuGTAwC","title":"Note source","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note source"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_1YeN2MzFUluU","title":"Technologies used","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}],"children":[{"id":"_help_MI26XDLSAlCD","title":"CKEditor","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_N4IDkixaDG9C","title":"MindElixir","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_H0mM1lTxF9JI","title":"Excalidraw","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_MQHyy2dIFgxS","title":"Leaflet","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]}]},{"id":"_help_m1lbrzyKDaRB","title":"Note ID","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note ID"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_0vTSyvhPTAOz","title":"Internal API","type":"book","attributes":[{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/internal/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_2mUhVmZK8RF3","title":"Hidden Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Hidden Notes"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]},{"id":"_help_uYF7pmepw27K","title":"Metrics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Metrics"},{"name":"iconClass","value":"bx bxs-data","type":"label"}],"children":[{"id":"_help_bOP3TB56fL1V","title":"grafana-dashboard.json","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_64ZTlUPgEPtW","title":"Safe mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Safe mode"},{"name":"iconClass","value":"bx bxs-virus-block","type":"label"}]},{"id":"_help_HAIOFBoYIIdO","title":"Nightly release","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Nightly release"},{"name":"iconClass","value":"bx bx-moon","type":"label"}]}]},{"id":"_help_GBBMSlVSOIGP","title":"AI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI"},{"name":"iconClass","value":"bx bx-bot","type":"label"}],"children":[{"id":"_help_WkM7gsEUyCXs","title":"Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers"},{"name":"iconClass","value":"bx bx-select-multiple","type":"label"}],"children":[{"id":"_help_7EdTxPADv95W","title":"Ollama","type":"book","attributes":[{"name":"iconClass","value":"bx bx-message-dots","type":"label"}],"children":[{"id":"_help_vvUCN7FDkq7G","title":"Installing Ollama","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers/Ollama/Installing Ollama"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_ZavFigBX9AwP","title":"OpenAI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers/OpenAI"},{"name":"iconClass","value":"bx bx-message-dots","type":"label"}]},{"id":"_help_e0lkirXEiSNc","title":"Anthropic","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Providers/Anthropic"},{"name":"iconClass","value":"bx bx-message-dots","type":"label"}]}]}]},{"id":"_help_CdNpE2pqjmI6","title":"Scripting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting"},{"name":"iconClass","value":"bx bxs-file-js","type":"label"}],"children":[{"id":"_help_yIhgI5H7A2Sm","title":"Frontend Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics"},{"name":"iconClass","value":"bx bx-window","type":"label"}],"children":[{"id":"_help_MgibgPcfeuGz","title":"Custom Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets"},{"name":"iconClass","value":"bx bxs-widget","type":"label"}],"children":[{"id":"_help_YNxAqkI5Kg1M","title":"Word count widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_SynTBQiBsdYJ","title":"Widget Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_M8IppdwVHSjG","title":"Right pane widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_VqGQnnPGnqAU","title":"CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_TjLYAo3JMO8X","title":"\"New Task\" launcher button","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button"},{"name":"iconClass","value":"bx bx-task","type":"label"}]},{"id":"_help_7kZPMD0uFwkH","title":"Downloading responses from Google Forms","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/Downloading responses from Goo"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_DL92EjAaXT26","title":"Using promoted attributes to configure scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]},{"id":"_help_SPirpZypehBG","title":"Backend scripts","type":"book","attributes":[{"name":"iconClass","value":"bx bx-server","type":"label"}],"children":[{"id":"_help_fZ2IGYFXjkEy","title":"Server-side imports","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts/Server-side imports"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_GPERMystNGTB","title":"Events","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts/Events"},{"name":"iconClass","value":"bx bx-rss","type":"label"}]}]},{"id":"_help_GLks18SNjxmC","title":"Script API","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API"},{"name":"iconClass","value":"bx bx-code-curly","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"enforceAttributes":true,"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend/interfaces/FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/backend"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_vElnKeDNPSVl","title":"Logging","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Logging"},{"name":"iconClass","value":"bx bx-terminal","type":"label"}]}]},{"id":"_help_Fm0j45KqyHpU","title":"Miscellaneous","type":"book","attributes":[{"name":"iconClass","value":"bx bx-info-circle","type":"label"}],"children":[{"id":"_help_WFbFXrgnDyyU","title":"Privacy Policy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Privacy Policy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_NcsmUYZRWEW4","title":"Patterns of personal knowledge","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Patterns of personal knowledge"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}] \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html index 3d922c880..3a3c2fdf8 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/ETAPI (REST API).html @@ -1,5 +1,5 @@

ETAPI is Trilium's public/external REST API. It is available since Trilium v0.50.

@@ -7,7 +7,7 @@

As an alternative to calling the API directly, there are client libraries to simplify this

Obtaining a token

@@ -25,10 +25,10 @@ Authorization: ETAPITOKEN

Since v0.56 you can also use basic auth format:

GET https://myserver.com/etapi/app-info
 Authorization: Basic BATOKEN

Basic Auth is meant to be used with tools which support only basic auth.

Interaction using Bash scripts

@@ -44,10 +44,10 @@ NOTE_ID="i6ra4ZshJhgN" curl "$SERVER/etapi/notes/$NOTE_ID/content" -H "Authorization: $TOKEN"

Make sure to replace the values of:

As another example, to obtain a .zip export of a note and place it in a directory called out, simply replace the last statement in diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Nightly release.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Nightly release.html new file mode 100644 index 000000000..d3cdc2008 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Nightly release.html @@ -0,0 +1,35 @@ +

Nightly releases are versions built every day, containing the latest improvements + and bugfixes, directly from the main development branch. These versions + are generally useful in preparation for a release, to ensure that there + are no significant bugs that need to be addressed first, or they can be + used to confirm whether a particular bug is fixed or feature is well implemented.

+

Regarding the stability

+

Despite being on a development branch, generally the main branch is pretty + stable since PRs are tested before they are merged. If you notice any issues, + feel free to report them either via a ticket or via the Matrix.

+

Downloading the nightly release manually

+

Go to github.com/TriliumNext/Trilium/releases/tag/nightly and + look for the artifacts starting with TriliumNotes-main. Choose + the appropriate one for your platform (e.g. windows-x64.zip).

+

Depending on your use case, you can either test the portable version or + even use the installer.

+ + +

Automatically download and install the latest nightly

+

This is pretty useful if you are a beta tester that wants to periodically + update their version:

+

On Ubuntu:

#!/usr/bin/env bash
+
+name=TriliumNotes-linux-x64-nightly.deb
+rm -f $name*
+wget https://github.com/TriliumNext/Trilium/releases/download/nightly/$name
+sudo apt-get install ./$name
+rm $name
\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Safe mode.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Safe mode.html new file mode 100644 index 000000000..87c50d2b7 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Safe mode.html @@ -0,0 +1,12 @@ +

Safe mode is triggered by setting the TRILIUM_SAFE_MODE environment + variable to a truthy value, usually 1.

+

In each artifact there is a trilium-safe-mode.sh (or .bat) + script to enable it.

+

What it does:

+ \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake.html new file mode 100644 index 000000000..6436cfbe8 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake.html @@ -0,0 +1,64 @@ +

Since TriliumNext 0.94.1, the desktop and server applications can be built + using Nix.

+

System requirements

+

Installation of Nix on Mac or Linux (download page). + About 3-4 gigabytes of additional storage space, for build artifacts.

+

Run directly

+

Using nix run, + the desktop app can be started as: nix run github:TriliumNext/Trilium/v0.95.0 +

+

Running the server requires explicitly specifying the desired package: nix run github:TriliumNext/Trilium/v0.95.0#server +

+

Instead of a version (v0.95.0 above), you can also specify + a commit hash (or a branch name). This makes it easy to test development + builds.

+

Install on NixOS

+

Add to your flake.nix:

{
+  inputs = {
+    nixpkgs.url = # ...;
+    trilium-notes = {
+      url = "github:TriliumNext/Trilium/v0.95.0";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+  };
+
+  outputs =
+    {
+      self,
+      # ...
+      trilium-notes,
+      ...
+    }:
+    {
+      nixosConfigurations = {
+        "nixos" = nixpkgs.lib.nixosSystem {
+          system = "x86_64-linux";
+          modules = [
+            ./configuration.nix
+          ];
+          specialArgs = {
+            inherit
+              trilium-notes
+              ;
+          };
+        };
+      };
+    };
+}
+
+

Add to your configuration.nix:

{
+  # ...
+  trilium-notes,
+  ...
+}:
+
+{
+  # ...
+
+  services.trilium-server.package = trilium-notes.packages.x86_64-linux.server;
+
+  environment.systemPackages = [
+    trilium-notes.packages.x86_64-linux.desktop
+  ];
+}
+

The flake aims to be compatible with the latest NixOS stable and unstable.

\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.html new file mode 100644 index 000000000..e9944f59e --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.html @@ -0,0 +1 @@ +

This is a clone of a note. Go to its primary location.

\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mermaid Diagrams.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mermaid Diagrams.html index a312fef93..3699a257b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mermaid Diagrams.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mermaid Diagrams.html @@ -1,7 +1,6 @@
Depending on the chart being edited and user preference, there are two layouts supported by the Mermaid note type:

    -
  • Horizontal, where the source code (editable part) is on the left side +
  • Horizontal, where the source code (editable part) is on the left side of the screen and the preview is to the right.
  • -
  • Vertical, where the source code is at the bottom of the screen and the +
  • Vertical, where the source code is at the bottom of the screen and the preview is at the top.

It's possible to switch between the two layouts at any time by pressing @@ -25,48 +24,44 @@ icon in the Floating buttons area.

Interaction

    -
  • The source code of the diagram (in Mermaid format) is displayed on the +
  • The source code of the diagram (in Mermaid format) is displayed on the left or bottom side of the note (depending on the layout).
      -
    • Changing the diagram code will refresh automatically the diagram.
    • +
    • Changing the diagram code will refresh automatically the diagram.
  • -
  • The preview of the diagram is displayed at the right or top side of the +
  • The preview of the diagram is displayed at the right or top side of the note (depending on the layout):
      -
    • There are dedicated buttons at the bottom-right of the preview to control +
    • There are dedicated buttons at the bottom-right of the preview to control the zoom in, zoom out or re-center the diagram:
    • -
    • The preview can be moved around by holding the left mouse button and dragging.
    • -
    • Zooming can also be done by using the scroll wheel.
    • -
    • The zoom and position on the preview will remain fixed as the diagram - changes, to be able to work more easily with large diagrams.
    • -
    +
  • The preview can be moved around by holding the left mouse button and dragging.
  • +
  • Zooming can also be done by using the scroll wheel.
  • +
  • The zoom and position on the preview will remain fixed as the diagram + changes, to be able to work more easily with large diagrams.
  • +
-
  • The size of the source/preview panes can be adjusted by hovering over +
  • The size of the source/preview panes can be adjusted by hovering over the border between them and dragging it with the mouse.
  • -
  • In the Floating buttons area: +
  • In the Floating buttons area:
      -
    • The source/preview can be laid out left-right or bottom-top via the Move editing pane to the left / bottom option.
    • -
    • Press Lock editing to automatically mark the note as read-only. +
    • The source/preview can be laid out left-right or bottom-top via the Move editing pane to the left / bottom option.
    • +
    • Press Lock editing to automatically mark the note as read-only. In this mode, the code pane is hidden and the diagram is displayed full-size. Similarly, press Unlock editing to mark a read-only note as editable.
    • -
    • Press the Copy image reference to the clipboard to be able to insert - the image representation of the diagram into a text note. See Image references for more information.
    • -
    • Press the Export diagram as SVG to download a scalable/vector rendering - of the diagram. Can be used to present the diagram without degrading when - zooming.
    • -
    • Press the Export diagram as PNG to download a normal image (at +
    • Press the Copy image reference to the clipboard to be able to insert + the image representation of the diagram into a text note. See Image references for more information.
    • +
    • Press the Export diagram as SVG to download a scalable/vector rendering + of the diagram. Can be used to present the diagram without degrading when + zooming.
    • +
    • Press the Export diagram as PNG to download a normal image (at 1x scale, raster) of the diagram. Can be used to send the diagram in more traditional channels such as e-mail.
    • -
    -
  • + +

    Errors in the diagram

    If there is an error in the source code, the error will be displayed in diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Events.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Backend scripts/Events.html similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Events.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Backend scripts/Events.html diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Backend scripts/Server-side imports.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Backend scripts/Server-side imports.html new file mode 100644 index 000000000..7820ccfe2 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Backend scripts/Server-side imports.html @@ -0,0 +1,7 @@ +

    Older versions of Trilium Notes allowed the use of Common.js module imports + inside backend scripts, such as:

    const isBetween = require('dayjs/plugin/isBetween')
    +api.dayjs.extend(isBetween)
    +

    For newer versions, Node.js imports are not officially supported anymore, + since we've added a bundler which makes it more difficult to reuse dependencies.

    +

    Theoretically it's still possible to use imports by manually setting up + a node_modules in the server directory via npm or pnpm.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.html similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.html diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS.html new file mode 100644 index 000000000..249da3ad3 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS.html @@ -0,0 +1,9 @@ +

    In doRender():

    this.cssBlock(`#my-widget {
    +	position: absolute;
    +    bottom: 40px;
    +    left: 60px;
    +    z-index: 1;
    +}`)
    +
    +

    Reference: https://trilium.rocks/X7pxYpiu0lgU +

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html new file mode 100644 index 000000000..7b571b628 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html @@ -0,0 +1,30 @@ +
      +
    • doRender must not be overridden, instead doRenderBody() has + to be overridden.
    • +
    • parentWidget() must be set to “rightPane”.
    • +
    • widgetTitle() getter can optionally be overriden, otherwise + the widget will be displayed as “Untitled widget”.
    • +
    const template = `<div>Hi</div>`;
    +
    +class ToDoListWidget extends api.RightPanelWidget {
    +    
    +    get widgetTitle() {
    +        return "Title goes here";
    +    }
    +        
    +    get parentWidget() { return "right-pane" }
    +    
    +    doRenderBody() {
    +        this.$body.empty().append($(template));
    +    }   
    +    
    +    async refreshWithNote(note) {
    +        this.toggleInt(false);                
    +        this.triggerCommand("reEvaluateRightPaneVisibility");
    +        this.toggleInt(true);
    +        this.triggerCommand("reEvaluateRightPaneVisibility");
    +    }
    +}
    +
    +module.exports = new ToDoListWidget();
    +

    The implementation is in src/public/app/widgets/right_panel_widget.js.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics.html similarity index 71% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics.html index 273dbaae6..57a0a834b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics.html @@ -16,11 +16,11 @@ module.exports = new MyWidget();

    To implement this widget:

      -
    1. Create a new JS Frontend note in Trilium and paste in the code +
    2. Create a new JS Frontend note in Trilium and paste in the code above.
    3. -
    4. Assign the #widget attribute to +
    5. Assign the #widget attribute to the note.
    6. -
    7. Restart Trilium or reload the window.
    8. +
    9. Restart Trilium or reload the window.

    To verify that the widget is working, open the developer tools (Cmd + Shift + I) and run document.querySelector("#my-widget"). If the element @@ -87,5 +87,18 @@ module.exports = new MyWidget(); } module.exports = new MyWidget(); -

    Reload the application one last time. When you click the button, a "Hello - World!" message should appear, confirming that your widget is fully functional.

    \ No newline at end of file +

    parentWidget() can be given the following values:

    +
      +
    • left-pane - This renders the widget on the left side of the + screen where the note tree lives.
    • +
    • center-pane - This renders the widget in the center of the + layout in the same location that notes and splits appear.
    • +
    • note-detail-pane - This renders the widget with the + note in the center pane. This means it can appear multiple times with splits.
    • +
    • right-pane - This renders the widget to the right of any opened + notes.
    • +
    +

    Reload the application + one last time. When you click the button, a "Hello World!" message should + appear, confirming that your widget is fully functional.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets/Word count widget.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets/Word count widget.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets/Word count widget_image.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget_image.png similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Custom Widgets/Word count widget_image.png rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget_image.png diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/Downloading responses from Goo.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/Downloading responses from Goo.html similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/Downloading responses from Goo.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/Downloading responses from Goo.html diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/New Task launcher button.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button.html similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/New Task launcher button.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button.html diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/New Task launcher button_i.png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button_i.png similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/New Task launcher button_i.png rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button_i.png diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/Using promoted attributes .png b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes .png similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/Using promoted attributes .png rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes .png diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c.html similarity index 100% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c.html diff --git a/apps/server/src/assets/translations/it/server.json b/apps/server/src/assets/translations/it/server.json index 1b88e03d7..0b64f0fee 100644 --- a/apps/server/src/assets/translations/it/server.json +++ b/apps/server/src/assets/translations/it/server.json @@ -420,7 +420,7 @@ "end-time": "Ora di fine", "geolocation": "Geolocalizzazione", "built-in-templates": "Modelli integrati", - "board": "Tavola", + "board": "Kanban Board", "status": "Stato", "board_note_first": "Prima nota", "board_note_second": "Seconda nota", diff --git a/apps/server/src/assets/translations/tw/server.json b/apps/server/src/assets/translations/tw/server.json index 8d29cc64f..33c9faa8c 100644 --- a/apps/server/src/assets/translations/tw/server.json +++ b/apps/server/src/assets/translations/tw/server.json @@ -417,7 +417,7 @@ "end-time": "結束時間", "geolocation": "地理位置", "built-in-templates": "內建模版", - "board": "儀表板", + "board": "看板", "status": "狀態", "board_note_first": "第一個筆記", "board_note_second": "第二個筆記", diff --git a/apps/server/src/services/export/zip.ts b/apps/server/src/services/export/zip.ts index 3043e1636..53e0eb540 100644 --- a/apps/server/src/services/export/zip.ts +++ b/apps/server/src/services/export/zip.ts @@ -253,6 +253,10 @@ async function exportToZip(taskContext: TaskContext<"export">, branch: BBranch, for (let i = 0; i < targetPath.length - 1; i++) { const meta = noteIdToMeta[targetPath[i]]; + if (meta === rootMeta && format === "share") { + continue; + } + if (meta.dirFileName) { url += `${encodeURIComponent(meta.dirFileName)}/`; } @@ -371,10 +375,12 @@ async function exportToZip(taskContext: TaskContext<"export">, branch: BBranch, } if (noteMeta.children?.length || 0 > 0) { - const directoryPath = filePathPrefix + noteMeta.dirFileName; + const directoryPath = filePathPrefix !== "" || format !== "share" ? filePathPrefix + noteMeta.dirFileName : ""; // create directory - archive.append("", { name: `${directoryPath}/`, date: dateUtils.parseDateTime(note.utcDateModified) }); + if (directoryPath) { + archive.append("", { name: `${directoryPath}/`, date: dateUtils.parseDateTime(note.utcDateModified) }); + } for (const childMeta of noteMeta.children || []) { saveNote(childMeta, `${directoryPath}/`); diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index f06871857..1788e38b9 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -27,6 +27,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { private assetsMeta: NoteMeta[] = []; private indexMeta: NoteMeta | null = null; private searchIndex: Map = new Map(); + private rootMeta: NoteMeta | null = null; prepareMeta(metaFile: NoteMetaFile): void { const assets = [ @@ -50,6 +51,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { noImport: true, dataFileName: "index.html" }; + this.rootMeta = metaFile.files[0]; metaFile.files.push(this.indexMeta); } @@ -58,7 +60,7 @@ export default class ShareThemeExportProvider extends ZipExportProvider { if (!noteMeta?.notePath?.length) { throw new Error("Missing note path."); } - const basePath = "../".repeat(noteMeta.notePath.length - 1); + const basePath = "../".repeat(Math.max(0, noteMeta.notePath.length - 2)); let searchContent = ""; if (note) { @@ -71,6 +73,9 @@ export default class ShareThemeExportProvider extends ZipExportProvider { if (typeof content === "string") { content = content.replace(/href="[^"]*\.\/([a-zA-Z0-9_\/]{12})[^"]*"/g, (match, id) => { if (match.includes("/assets/")) return match; + if (id === this.rootMeta?.noteId) { + return `href="${basePath}"`; + } return `href="#root/${id}"`; }); content = this.rewriteFn(content, noteMeta); diff --git a/apps/website/package.json b/apps/website/package.json index 51a78d27c..e3bbd8c4b 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -14,11 +14,11 @@ "preact": "10.27.2", "preact-iso": "2.11.0", "preact-render-to-string": "6.6.3", - "react-i18next": "16.2.3" + "react-i18next": "16.2.4" }, "devDependencies": { "@preact/preset-vite": "2.10.2", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-config-preact": "2.0.0", "typescript": "5.9.3", "user-agent-data-types": "0.4.2", diff --git a/apps/website/src/translations/it/translation.json b/apps/website/src/translations/it/translation.json index 03792e5ed..915396c1a 100644 --- a/apps/website/src/translations/it/translation.json +++ b/apps/website/src/translations/it/translation.json @@ -70,7 +70,7 @@ "calendar_description": "Organizza i tuoi eventi personali o professionali utilizzando un calendario, con supporto per eventi di un giorno intero o di più giorni. Visualizza i tuoi eventi a colpo d'occhio con le viste settimanale, mensile e annuale. Interazione semplice per aggiungere o trascinare eventi.", "table_title": "Tabella", "table_description": "Visualizza e modifica le informazioni relative alle note in una struttura tabellare, con vari tipi di colonne quali testo, numeri, caselle di controllo, data e ora, collegamenti e colori, oltre al supporto per le relazioni. Facoltativamente, è possibile visualizzare le note all'interno di una gerarchia ad albero all'interno della tabella.", - "board_title": "Board", + "board_title": "Kanban Board", "board_description": "Organizza le tue attività o lo stato dei tuoi progetti in una lavagna Kanban con un modo semplice per creare nuovi elementi e colonne e modificare facilmente il loro stato trascinandoli sulla lavagna.", "geomap_title": "Geomappa", "geomap_description": "Pianifica le tue vacanze o segna i tuoi punti di interesse direttamente su una mappa geografica utilizzando indicatori personalizzabili. Visualizza le tracce GPX registrate per seguire gli itinerari.", diff --git a/apps/website/src/translations/zh-Hant/translation.json b/apps/website/src/translations/zh-Hant/translation.json index 79ac2185b..f5ef4764b 100644 --- a/apps/website/src/translations/zh-Hant/translation.json +++ b/apps/website/src/translations/zh-Hant/translation.json @@ -70,7 +70,7 @@ "calendar_description": "使用行事曆規劃個人或專業活動,支援全天及多日活動。透過週、月、年檢視模式,一覽所有活動。通過簡單互動即可新增或拖曳活動。", "table_title": "表格", "table_description": "以表格結構顯示並編輯筆記資訊,支援多種欄位類型,包括文字、數字、核取方塊、日期與時間、連結及顏色,並支援關聯功能。可選擇性地在表格內以樹狀層級結構顯示筆記內容。", - "board_title": "儀表板", + "board_title": "看板", "board_description": "將您的任務或專案狀態整理成看板,輕鬆建立新項目與欄位,並透過在看板上拖曳即可簡單變更狀態。", "geomap_title": "地理地圖", "geomap_description": "使用可自訂的標記,直接在地圖上規劃您的假期行程或標記感興趣的地點。顯示已記錄的GPX軌跡,以便追蹤行程路線。", diff --git a/apps/website/tsconfig.json b/apps/website/tsconfig.json index 4d67635d7..68e45adef 100644 --- a/apps/website/tsconfig.json +++ b/apps/website/tsconfig.json @@ -10,7 +10,8 @@ "jsxImportSource": "preact", "skipLibCheck": true, "types": [ - "vite/client" + "vite/client", + "vitest/config" ], "paths": { "react": ["../../node_modules/preact/compat/"], diff --git a/docs/Developer Guide/!!!meta.json b/docs/Developer Guide/!!!meta.json index 93338db97..e75df02a9 100644 --- a/docs/Developer Guide/!!!meta.json +++ b/docs/Developer Guide/!!!meta.json @@ -14,8 +14,31 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "label:shareAlias", + "value": "promoted,alias=Slug,single,text", + "isInheritable": true, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-code-alt", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "developer-guide", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", + "dataFileName": "Developer Guide.md", "attachments": [], "dirFileName": "Developer Guide", "children": [ @@ -27,18 +50,32 @@ "T2W7WCZrYZBU" ], "title": "Environment Setup", - "notePosition": 50, + "notePosition": 260, "prefix": null, "isExpanded": false, "type": "text", "mime": "text/html", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "TLXJwBDo8Rdv", + "isInheritable": false, + "position": 10 + }, { "type": "label", "name": "iconClass", "value": "bx bx-cog", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "environment-setup", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -53,7 +90,356 @@ "cxfTSHIUQtt2" ], "title": "Project Structure", - "notePosition": 190, + "notePosition": 270, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "a0mkxxB4Uvbf", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-component", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "project-structure", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Project Structure.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "zdQzavvHDl1k", + "notePath": [ + "jdjRLhLV3TtI", + "zdQzavvHDl1k" + ], + "title": "Documentation", + "notePosition": 280, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "documentation", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-book-open", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "T2W7WCZrYZBU", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "Documentation.md", + "attachments": [], + "dirFileName": "Documentation", + "children": [ + { + "isClone": false, + "noteId": "LjqM0VUL1CrU", + "notePath": [ + "jdjRLhLV3TtI", + "zdQzavvHDl1k", + "LjqM0VUL1CrU" + ], + "title": "Documentation references in the application", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "doc-references", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Documentation references in th.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "a0mkxxB4Uvbf", + "notePath": [ + "jdjRLhLV3TtI", + "a0mkxxB4Uvbf" + ], + "title": "Building", + "notePosition": 290, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "building", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-terminal", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "attachments": [], + "dirFileName": "Building", + "children": [ + { + "isClone": false, + "noteId": "czgXkoEYwclZ", + "notePath": [ + "jdjRLhLV3TtI", + "a0mkxxB4Uvbf", + "czgXkoEYwclZ" + ], + "title": "Running a development build", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "mXFYlhuEr1mZ", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "T2W7WCZrYZBU", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "dev-build", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Running a development build.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "mXFYlhuEr1mZ", + "notePath": [ + "jdjRLhLV3TtI", + "a0mkxxB4Uvbf", + "mXFYlhuEr1mZ" + ], + "title": "Docker", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "docker", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxl-docker", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Docker.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "aGlhNBEA9wwo", + "notePath": [ + "jdjRLhLV3TtI", + "a0mkxxB4Uvbf", + "aGlhNBEA9wwo" + ], + "title": "Build information", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "build-info", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-info-circle", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Build information.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "fI16A7NrT713", + "notePath": [ + "jdjRLhLV3TtI", + "a0mkxxB4Uvbf", + "fI16A7NrT713" + ], + "title": "Live reload (HMR)", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "live-reload", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Live reload (HMR).md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "PXzm2t3sCdsP", + "notePath": [ + "jdjRLhLV3TtI", + "a0mkxxB4Uvbf", + "PXzm2t3sCdsP" + ], + "title": "Build deliveries locally", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "build-deliveries", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-package", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Build deliveries locally.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "4nwtTJyjNDKd", + "notePath": [ + "jdjRLhLV3TtI", + "a0mkxxB4Uvbf", + "4nwtTJyjNDKd" + ], + "title": "Releasing a new version", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zdQzavvHDl1k", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-rocket", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Releasing a new version.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "qalhAaJoQ7AN", + "notePath": [ + "jdjRLhLV3TtI", + "qalhAaJoQ7AN" + ], + "title": "Dependencies", + "notePosition": 310, "prefix": null, "isExpanded": false, "type": "text", @@ -62,26 +448,90 @@ { "type": "label", "name": "iconClass", - "value": "bx bx-list-ul", + "value": "bx bxs-component", "isInheritable": false, - "position": 10 + "position": 20 } ], "format": "markdown", - "dataFileName": "Project Structure.md", "attachments": [], - "dirFileName": "Project Structure", + "dirFileName": "Dependencies", "children": [ + { + "isClone": false, + "noteId": "fa6hAJ9Ith3A", + "notePath": [ + "jdjRLhLV3TtI", + "qalhAaJoQ7AN", + "fa6hAJ9Ith3A" + ], + "title": "Per-dependency checks", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "Xfi1ScuBTKJf", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "updating-deps", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Per-dependency checks.md", + "attachments": [], + "dirFileName": "Per-dependency checks", + "children": [ + { + "isClone": false, + "noteId": "Xfi1ScuBTKJf", + "notePath": [ + "jdjRLhLV3TtI", + "qalhAaJoQ7AN", + "fa6hAJ9Ith3A", + "Xfi1ScuBTKJf" + ], + "title": "bettersqlite binaries", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "bettersqlite-binaries", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "bettersqlite binaries.md", + "attachments": [] + } + ] + }, { "isClone": false, "noteId": "Jg7clqogFOyD", "notePath": [ "jdjRLhLV3TtI", - "cxfTSHIUQtt2", + "qalhAaJoQ7AN", "Jg7clqogFOyD" ], "title": "CKEditor", - "notePosition": 10, + "notePosition": 20, "prefix": null, "isExpanded": false, "type": "text", @@ -100,6 +550,13 @@ "value": "bx bx-package", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ckeditor", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -112,7 +569,7 @@ "noteId": "BRhQZHgwaGyw", "notePath": [ "jdjRLhLV3TtI", - "cxfTSHIUQtt2", + "qalhAaJoQ7AN", "Jg7clqogFOyD", "BRhQZHgwaGyw" ], @@ -122,145 +579,29 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "plugin-migration", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Plugin migration guide.md", "attachments": [] - } - ] - } - ] - }, - { - "isClone": false, - "noteId": "YjerxU7Aii8X", - "notePath": [ - "jdjRLhLV3TtI", - "YjerxU7Aii8X" - ], - "title": "Troubleshooting", - "notePosition": 200, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "label", - "name": "iconClass", - "value": "bx bx-bug", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "attachments": [], - "dirFileName": "Troubleshooting", - "children": [ - { - "isClone": false, - "noteId": "g9nFZ6dRz1Cg", - "notePath": [ - "jdjRLhLV3TtI", - "YjerxU7Aii8X", - "g9nFZ6dRz1Cg" - ], - "title": "better-sqlite3 was compiled against a different Node.js version", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "better-sqlite3 was compiled ag.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "wbVIolLKDhe2", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2" - ], - "title": "Development and architecture", - "notePosition": 220, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Development and architecture", - "children": [ - { - "isClone": false, - "noteId": "TLXJwBDo8Rdv", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "TLXJwBDo8Rdv" - ], - "title": "Internationalisation / Translations", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "ky5zpmxXZhhr", - "isInheritable": false, - "position": 10 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-globe", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Internationalisation Translat.md", - "attachments": [], - "dirFileName": "Internationalisation Translations", - "children": [ - { - "isClone": false, - "noteId": "ky5zpmxXZhhr", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "TLXJwBDo8Rdv", - "ky5zpmxXZhhr" - ], - "title": "Guidelines", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Guidelines.md", - "attachments": [] }, { "isClone": false, - "noteId": "VTebBD3jZjdp", + "noteId": "5gBYmUqiupBl", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "TLXJwBDo8Rdv", - "VTebBD3jZjdp" + "qalhAaJoQ7AN", + "Jg7clqogFOyD", + "5gBYmUqiupBl" ], - "title": "i18n-ally", + "title": "Differences from upstream", "notePosition": 20, "prefix": null, "isExpanded": false, @@ -270,168 +611,292 @@ { "type": "relation", "name": "internalLink", - "value": "ky5zpmxXZhhr", + "value": "lY19SLxUMj3J", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "fullContentWidth", + "value": "", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "differences-from-upstream", + "isInheritable": false, + "position": 20 } ], "format": "markdown", - "dataFileName": "i18n-ally.md", + "dataFileName": "Differences from upstream.md", "attachments": [] }, { "isClone": false, - "noteId": "KhDvxPlQQybs", + "noteId": "lY19SLxUMj3J", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "TLXJwBDo8Rdv", - "KhDvxPlQQybs" + "qalhAaJoQ7AN", + "Jg7clqogFOyD", + "lY19SLxUMj3J" ], - "title": "Server translations", + "title": "ckeditor5-math", "notePosition": 30, "prefix": null, "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Server translations.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "fI16A7NrT713", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "fI16A7NrT713" - ], - "title": "Live reload", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Live reload.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "7BCukQTCm7fv", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "7BCukQTCm7fv" - ], - "title": "Themes", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Themes.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "n9wYW9nUTynV", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "n9wYW9nUTynV" - ], - "title": "Synchronisation", - "notePosition": 40, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Synchronisation", - "children": [ - { - "isClone": false, - "noteId": "wA6tm9xcWWaB", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "n9wYW9nUTynV", - "wA6tm9xcWWaB" + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "ckeditor5-math", + "isInheritable": false, + "position": 40 + } ], - "title": "Content hashing", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], "format": "markdown", - "dataFileName": "Content hashing.md", - "attachments": [] + "dataFileName": "ckeditor5-math.md", + "attachments": [ + { + "attachmentId": "UlSZYhYX8Kfj", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "ckeditor5-math_image.png" + } + ] } ] + } + ] + }, + { + "isClone": false, + "noteId": "yeqU0zo0ZQ83", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83" + ], + "title": "Architecture", + "notePosition": 320, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "architecture", + "isInheritable": false, + "position": 10 }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-arch", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "sorted", + "value": "", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "attachments": [], + "dirFileName": "Architecture", + "children": [ { "isClone": false, - "noteId": "aGlhNBEA9wwo", + "noteId": "3mz4ZYhi9Cy8", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "aGlhNBEA9wwo" + "yeqU0zo0ZQ83", + "3mz4ZYhi9Cy8" ], - "title": "Build information", - "notePosition": 50, + "title": "Backlinks", + "notePosition": 10, "prefix": null, "isExpanded": false, "type": "text", "mime": "text/html", "attributes": [ { - "type": "relation", - "name": "internalLink", - "value": "PXzm2t3sCdsP", + "type": "label", + "name": "shareAlias", + "value": "backlinks", "isInheritable": false, - "position": 10 + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-link-alt", + "isInheritable": false, + "position": 30 } ], "format": "markdown", - "dataFileName": "Build information.md", + "dataFileName": "Backlinks.md", "attachments": [] }, + { + "isClone": false, + "noteId": "h8AsuFjSD4fB", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "h8AsuFjSD4fB" + ], + "title": "Branch prefixes", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "branch-prefix", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Branch prefixes.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "oqg9OpK8xfcm", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "oqg9OpK8xfcm" + ], + "title": "CI", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "ci", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "attachments": [], + "dirFileName": "CI", + "children": [ + { + "isClone": false, + "noteId": "IxkDdjTogO18", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "oqg9OpK8xfcm", + "IxkDdjTogO18" + ], + "title": "Main", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "PXzm2t3sCdsP", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "main", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Main.md", + "attachments": [ + { + "attachmentId": "c3aGEk60ZR2Q", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Main_image.png" + }, + { + "attachmentId": "q9OGTAguCyWf", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Main_image.png" + } + ] + } + ] + }, { "isClone": false, "noteId": "vNMojjUN76jc", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc" ], - "title": "Database", - "notePosition": 60, + "title": "Database structure", + "notePosition": 40, "prefix": null, "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "database", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-data", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "attachments": [], - "dirFileName": "Database", + "dirFileName": "Database structure", "children": [ { "isClone": false, "noteId": "e6GnYOXeIWjg", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "e6GnYOXeIWjg" ], @@ -476,6 +941,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "attachments", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -487,7 +959,7 @@ "noteId": "ciL84vNBNi9y", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "ciL84vNBNi9y" ], @@ -501,23 +973,16 @@ { "type": "relation", "name": "internalLink", - "value": "r11Bh3uxFGRj", + "value": "DSkl8C325tEC", "isInheritable": false, "position": 10 }, - { - "type": "relation", - "name": "internalLink", - "value": "DSkl8C325tEC", - "isInheritable": false, - "position": 20 - }, { "type": "relation", "name": "internalLink", "value": "tM3rIZQzlum4", "isInheritable": false, - "position": 30 + "position": 20 }, { "type": "label", @@ -525,6 +990,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "attributes", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -536,7 +1008,7 @@ "noteId": "VIcWnKGs0sMh", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "VIcWnKGs0sMh" ], @@ -553,6 +1025,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "blobs", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -564,7 +1043,7 @@ "noteId": "GskLPkgY5n6E", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "GskLPkgY5n6E" ], @@ -602,6 +1081,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "branches", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -613,7 +1099,7 @@ "noteId": "ohhExR078MPU", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "ohhExR078MPU" ], @@ -630,6 +1116,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "entity-changes", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -641,7 +1134,7 @@ "noteId": "bRqbIg633nCs", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "bRqbIg633nCs" ], @@ -665,6 +1158,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "etapi-tokens", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -676,7 +1176,7 @@ "noteId": "DSkl8C325tEC", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "DSkl8C325tEC" ], @@ -714,6 +1214,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "notes", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -725,7 +1232,7 @@ "noteId": "4oeftEmy77Bt", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "4oeftEmy77Bt" ], @@ -742,6 +1249,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "options", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -753,7 +1267,7 @@ "noteId": "VyFirdgAOoh5", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "VyFirdgAOoh5" ], @@ -777,6 +1291,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "recent-notes", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -788,7 +1309,7 @@ "noteId": "s7ZBiaJVNumK", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vNMojjUN76jc", "s7ZBiaJVNumK" ], @@ -826,6 +1347,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "revisions", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -834,16 +1362,795 @@ } ] }, + { + "isClone": false, + "noteId": "tM3rIZQzlum4", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "tM3rIZQzlum4" + ], + "title": "Deleted notes", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "deleted-notes", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-trash", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Deleted notes.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "oLhKpfi2kGON", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "oLhKpfi2kGON" + ], + "title": "Demo document", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "demo-document", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-file-archive", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Demo document.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "UzRirf46Xi46", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "UzRirf46Xi46" + ], + "title": "Hidden notes", + "notePosition": 80, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "hidden-notes", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-low-vision", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Hidden notes.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "m2W35hwSDUeh", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "m2W35hwSDUeh" + ], + "title": "Icons", + "notePosition": 90, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "oLhKpfi2kGON", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "PXzm2t3sCdsP", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "icons", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Icons.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "TLXJwBDo8Rdv", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "TLXJwBDo8Rdv" + ], + "title": "Internationalisation / Translations", + "notePosition": 100, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "ky5zpmxXZhhr", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-globe", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "i18n", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Internationalisation Translat.md", + "attachments": [], + "dirFileName": "Internationalisation Translations", + "children": [ + { + "isClone": false, + "noteId": "ky5zpmxXZhhr", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "TLXJwBDo8Rdv", + "ky5zpmxXZhhr" + ], + "title": "Guidelines", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "guidelines", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Guidelines.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "VTebBD3jZjdp", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "TLXJwBDo8Rdv", + "VTebBD3jZjdp" + ], + "title": "i18n-ally", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "ky5zpmxXZhhr", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "i18n-ally", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "i18n-ally.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "KhDvxPlQQybs", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "TLXJwBDo8Rdv", + "KhDvxPlQQybs" + ], + "title": "Server translations", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "server-translation", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Server translations.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "Usiyzn9C4WFv", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "Usiyzn9C4WFv" + ], + "title": "Launchers", + "notePosition": 110, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "launchers", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Launchers.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "qjQNyaYXSNWu", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "qjQNyaYXSNWu" + ], + "title": "Note Revisions", + "notePosition": 120, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "revisions", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-history", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Note Revisions.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "7RBJMqVz2EsJ", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ" + ], + "title": "Note Types", + "notePosition": 130, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [], + "format": "markdown", + "attachments": [], + "dirFileName": "Note Types", + "children": [ + { + "isClone": false, + "noteId": "AdNRgGrYeTCy", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy" + ], + "title": "Adding a new note type", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "new-note-type", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "attachments": [], + "dirFileName": "Adding a new note type", + "children": [ + { + "isClone": false, + "noteId": "UFtOg3sLumZM", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "UFtOg3sLumZM" + ], + "title": "First steps", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "lgFwLJT72mdf", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "oLhKpfi2kGON", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "first-steps", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "First steps.md", + "attachments": [], + "dirFileName": "First steps", + "children": [ + { + "isClone": false, + "noteId": "aSO1wqK7L1ma", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "UFtOg3sLumZM", + "aSO1wqK7L1ma" + ], + "title": "mind_map.js", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "code", + "mime": "application/javascript;env=frontend", + "attributes": [], + "dataFileName": "mind_map.js", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "lgFwLJT72mdf", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "lgFwLJT72mdf" + ], + "title": "Note type checklist", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "UFtOg3sLumZM", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OGYpAbrmEXbX", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-list-check", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "checklist", + "isInheritable": false, + "position": 50 + } + ], + "format": "markdown", + "dataFileName": "Note type checklist.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "PoxUNujeKJ7T", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "PoxUNujeKJ7T" + ], + "title": "Saving data via spaced update", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "OGYpAbrmEXbX", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "saving-data", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Saving data via spaced update.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "xYVE7qA3EBwb", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "xYVE7qA3EBwb" + ], + "title": "Loading data", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "PoxUNujeKJ7T", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "loading-data", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Loading data.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "OGYpAbrmEXbX", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "OGYpAbrmEXbX" + ], + "title": "SVG rendering", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "svg-rendering", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "SVG rendering.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "Q8hgB8EEen80", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "Q8hgB8EEen80" + ], + "title": "Copy image reference to the clipboard", + "notePosition": 60, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "copy-image-reference", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Copy image reference to the cl.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "AwWq8bJRl6XD", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7RBJMqVz2EsJ", + "AdNRgGrYeTCy", + "AwWq8bJRl6XD" + ], + "title": "Export diagram as SVG", + "notePosition": 70, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "OGYpAbrmEXbX", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "export-to-svg", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Export diagram as SVG.md", + "attachments": [] + } + ] + } + ] + }, + { + "isClone": false, + "noteId": "6dC7ha5vjqqS", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "6dC7ha5vjqqS" + ], + "title": "Options", + "notePosition": 140, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "options", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-cog", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Options.md", + "attachments": [], + "dirFileName": "Options", + "children": [ + { + "isClone": false, + "noteId": "NcHcYOEn4ol5", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "6dC7ha5vjqqS", + "NcHcYOEn4ol5" + ], + "title": "Creating a new option", + "notePosition": 50, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "new-option", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Creating a new option.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "W0msUwLxm40d", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "W0msUwLxm40d" + ], + "title": "Printing and exporting to PDF", + "notePosition": 150, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "k7RavjuXQt8z", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "printing", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-printer", + "isInheritable": false, + "position": 50 + } + ], + "format": "markdown", + "dataFileName": "Printing and exporting to PDF.md", + "attachments": [] + }, { "isClone": false, "noteId": "UvXpeSqfYc6d", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "UvXpeSqfYc6d" ], "title": "Protected entities", - "notePosition": 80, + "notePosition": 160, "prefix": null, "isExpanded": false, "type": "text", @@ -869,865 +2176,36 @@ "value": "s7ZBiaJVNumK", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "protected-entities", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-lock-alt", + "isInheritable": false, + "position": 50 } ], "format": "markdown", "dataFileName": "Protected entities.md", "attachments": [] }, - { - "isClone": false, - "noteId": "tM3rIZQzlum4", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "tM3rIZQzlum4" - ], - "title": "Deleted notes", - "notePosition": 90, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Deleted notes.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "r11Bh3uxFGRj", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "r11Bh3uxFGRj" - ], - "title": "Special notes", - "notePosition": 100, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Special notes.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "h8AsuFjSD4fB", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "h8AsuFjSD4fB" - ], - "title": "Branch prefixes", - "notePosition": 110, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Branch prefixes.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "qjQNyaYXSNWu", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "qjQNyaYXSNWu" - ], - "title": "Revisions", - "notePosition": 120, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Revisions.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "3mz4ZYhi9Cy8", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "3mz4ZYhi9Cy8" - ], - "title": "Backlinks", - "notePosition": 130, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Backlinks.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "ItZRqNGeGSU0", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "ItZRqNGeGSU0" - ], - "title": "Note types", - "notePosition": 140, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "DSkl8C325tEC", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Note types.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "64ZTlUPgEPtW", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "64ZTlUPgEPtW" - ], - "title": "Safe mode", - "notePosition": 150, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Safe mode.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "m2W35hwSDUeh", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "m2W35hwSDUeh" - ], - "title": "Icons", - "notePosition": 160, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "PXzm2t3sCdsP", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "oLhKpfi2kGON", - "isInheritable": false, - "position": 20 - } - ], - "format": "markdown", - "dataFileName": "Icons.md", - "attachments": [], - "dirFileName": "Icons", - "children": [ - { - "isClone": false, - "noteId": "rUkJPiX0sJSk", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "m2W35hwSDUeh", - "rUkJPiX0sJSk" - ], - "title": "Removed icons", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Removed icons.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "GzrBXey1UTUW", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "m2W35hwSDUeh", - "GzrBXey1UTUW" - ], - "title": "Icons on Mac", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Icons on Mac.md", - "attachments": [ - { - "attachmentId": "gMQM37l1tgDc", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Icons on Mac_image.png" - }, - { - "attachmentId": "KBbeDSs1hueu", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Icons on Mac_image.png" - } - ], - "dirFileName": "Icons on Mac", - "children": [ - { - "isClone": false, - "noteId": "0btkkp7llQdO", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "m2W35hwSDUeh", - "GzrBXey1UTUW", - "0btkkp7llQdO" - ], - "title": "Slightly blurry icon on Mac", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Slightly blurry icon on Mac.md", - "attachments": [ - { - "attachmentId": "6USSTMu15E6N", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Slightly blurry icon on Ma.png" - }, - { - "attachmentId": "KEkBj1bOyfQ5", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Slightly blurry icon on Ma.png" - }, - { - "attachmentId": "XaG2VbiqKYtR", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "2_Slightly blurry icon on Ma.png" - } - ] - }, - { - "isClone": false, - "noteId": "8zAJ5J8SFEp8", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "m2W35hwSDUeh", - "GzrBXey1UTUW", - "8zAJ5J8SFEp8" - ], - "title": "Adaptive icon", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Adaptive icon.md", - "attachments": [ - { - "attachmentId": "38usIA7IJTpY", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Adaptive icon_image.png" - }, - { - "attachmentId": "4eQa9Eqkuekv", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Adaptive icon_image.png" - }, - { - "attachmentId": "gM1I22x3bYDv", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "2_Adaptive icon_image.png" - }, - { - "attachmentId": "Im2xMquSwizu", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "3_Adaptive icon_image.png" - }, - { - "attachmentId": "l2xu0BHxfPfq", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "4_Adaptive icon_image.png" - }, - { - "attachmentId": "wM6YPPsas7tA", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "5_Adaptive icon_image.png" - }, - { - "attachmentId": "zPLIBv0Xvgwm", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "6_Adaptive icon_image.png" - } - ] - } - ] - } - ] - }, - { - "isClone": false, - "noteId": "oLhKpfi2kGON", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "oLhKpfi2kGON" - ], - "title": "Demo document", - "notePosition": 170, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Demo document.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "mXFYlhuEr1mZ", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "mXFYlhuEr1mZ" - ], - "title": "Docker", - "notePosition": 180, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Docker.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "6dC7ha5vjqqS", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "6dC7ha5vjqqS" - ], - "title": "Options", - "notePosition": 190, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Options.md", - "attachments": [], - "dirFileName": "Options", - "children": [ - { - "isClone": false, - "noteId": "Qk5Q0Xty3ITv", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "6dC7ha5vjqqS", - "Qk5Q0Xty3ITv" - ], - "title": "Check box option", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Check box option.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "VnqYvYEuMMvb", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "6dC7ha5vjqqS", - "VnqYvYEuMMvb" - ], - "title": "Trigger UI refresh", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Trigger UI refresh.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "3TbiQZODAp6y", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "6dC7ha5vjqqS", - "3TbiQZODAp6y" - ], - "title": "Displaying the option in settings", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Displaying the option in setti.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "1TVWljchsc0t", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "6dC7ha5vjqqS", - "1TVWljchsc0t" - ], - "title": "Refresh widget with option change", - "notePosition": 40, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Refresh widget with option cha.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "NcHcYOEn4ol5", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "6dC7ha5vjqqS", - "NcHcYOEn4ol5" - ], - "title": "Creating a new option", - "notePosition": 50, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Creating a new option.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "AdNRgGrYeTCy", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy" - ], - "title": "Adding a new note type", - "notePosition": 210, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Adding a new note type", - "children": [ - { - "isClone": false, - "noteId": "UFtOg3sLumZM", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "UFtOg3sLumZM" - ], - "title": "First steps", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "lgFwLJT72mdf", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "oLhKpfi2kGON", - "isInheritable": false, - "position": 20 - } - ], - "format": "markdown", - "dataFileName": "First steps.md", - "attachments": [], - "dirFileName": "First steps", - "children": [ - { - "isClone": false, - "noteId": "aSO1wqK7L1ma", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "UFtOg3sLumZM", - "aSO1wqK7L1ma" - ], - "title": "mind_map.js", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "code", - "mime": "application/javascript;env=frontend", - "attributes": [], - "dataFileName": "mind_map.js", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "lgFwLJT72mdf", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "lgFwLJT72mdf" - ], - "title": "Note type checklist", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "UFtOg3sLumZM", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "OGYpAbrmEXbX", - "isInheritable": false, - "position": 20 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-list-check", - "isInheritable": false, - "position": 40 - } - ], - "format": "markdown", - "dataFileName": "Note type checklist.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "PoxUNujeKJ7T", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "PoxUNujeKJ7T" - ], - "title": "Saving data via spaced update", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "OGYpAbrmEXbX", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Saving data via spaced update.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "xYVE7qA3EBwb", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "xYVE7qA3EBwb" - ], - "title": "Loading data", - "notePosition": 40, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "PoxUNujeKJ7T", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Loading data.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "OGYpAbrmEXbX", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "OGYpAbrmEXbX" - ], - "title": "SVG rendering", - "notePosition": 50, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "SVG rendering.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "Q8hgB8EEen80", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "Q8hgB8EEen80" - ], - "title": "Copy image reference to the clipboard", - "notePosition": 60, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Copy image reference to the cl.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "AwWq8bJRl6XD", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "AdNRgGrYeTCy", - "AwWq8bJRl6XD" - ], - "title": "Export diagram as SVG", - "notePosition": 70, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "OGYpAbrmEXbX", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Export diagram as SVG.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "W0msUwLxm40d", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "W0msUwLxm40d" - ], - "title": "Printing", - "notePosition": 220, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Printing.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "Usiyzn9C4WFv", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "Usiyzn9C4WFv" - ], - "title": "Launchers", - "notePosition": 230, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Launchers.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "k7RavjuXQt8z", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "k7RavjuXQt8z" - ], - "title": "Syntax highlighting", - "notePosition": 240, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Syntax highlighting.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "UzRirf46Xi46", - "notePath": [ - "jdjRLhLV3TtI", - "wbVIolLKDhe2", - "UzRirf46Xi46" - ], - "title": "Hidden notes", - "notePosition": 250, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Hidden notes.md", - "attachments": [] - }, { "isClone": false, "noteId": "vphziLmQeQHY", "notePath": [ "jdjRLhLV3TtI", - "wbVIolLKDhe2", + "yeqU0zo0ZQ83", "vphziLmQeQHY" ], "title": "Share", - "notePosition": 260, + "notePosition": 170, "prefix": null, "isExpanded": false, "type": "text", @@ -1739,295 +2217,29 @@ "value": "bx bx-share-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "share", + "isInheritable": false, + "position": 20 } ], "format": "markdown", "dataFileName": "Share.md", "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "VHhyVRYK43gI", - "notePath": [ - "jdjRLhLV3TtI", - "VHhyVRYK43gI" - ], - "title": "Building and deployment", - "notePosition": 230, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Building and deployment", - "children": [ - { - "isClone": false, - "noteId": "Un4wj2Mak2Ky", - "notePath": [ - "jdjRLhLV3TtI", - "VHhyVRYK43gI", - "Un4wj2Mak2Ky" - ], - "title": "Nix flake", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Nix flake.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "ibAPHul7Efvr", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr" - ], - "title": "Old documentation", - "notePosition": 260, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Old documentation", - "children": [ - { - "isClone": false, - "noteId": "PXzm2t3sCdsP", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "PXzm2t3sCdsP" - ], - "title": "Build deliveries locally", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Build deliveries locally.md", - "attachments": [] }, { "isClone": false, - "noteId": "rLWcPPQi7Eso", + "noteId": "n9wYW9nUTynV", "notePath": [ "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "rLWcPPQi7Eso" + "yeqU0zo0ZQ83", + "n9wYW9nUTynV" ], - "title": "Releasing a version", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Releasing a version.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "czgXkoEYwclZ", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "czgXkoEYwclZ" - ], - "title": "Running a development build", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Running a development build.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "sUqOpnrQyEC7", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "sUqOpnrQyEC7" - ], - "title": "Building and deployment", - "notePosition": 40, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Building and deployment", - "children": [ - { - "isClone": true, - "noteId": "PXzm2t3sCdsP", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "sUqOpnrQyEC7", - "PXzm2t3sCdsP" - ], - "title": "Build deliveries locally", - "prefix": null, - "dataFileName": "Build deliveries locally.clone.md", - "type": "text", - "format": "markdown", - "isExpanded": false - }, - { - "isClone": false, - "noteId": "zdQzavvHDl1k", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "sUqOpnrQyEC7", - "zdQzavvHDl1k" - ], - "title": "Documentation", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Documentation.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "oqg9OpK8xfcm", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "sUqOpnrQyEC7", - "oqg9OpK8xfcm" - ], - "title": "CI", - "notePosition": 50, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "CI", - "children": [ - { - "isClone": false, - "noteId": "IxkDdjTogO18", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "sUqOpnrQyEC7", - "oqg9OpK8xfcm", - "IxkDdjTogO18" - ], - "title": "Main", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "PXzm2t3sCdsP", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Main.md", - "attachments": [ - { - "attachmentId": "c3aGEk60ZR2Q", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Main_image.png" - }, - { - "attachmentId": "q9OGTAguCyWf", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Main_image.png" - } - ] - } - ] - }, - { - "isClone": true, - "noteId": "rLWcPPQi7Eso", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "sUqOpnrQyEC7", - "rLWcPPQi7Eso" - ], - "title": "Releasing a version", - "prefix": null, - "dataFileName": "Releasing a version.clone.md", - "type": "text", - "format": "markdown", - "isExpanded": false - }, - { - "isClone": true, - "noteId": "czgXkoEYwclZ", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "sUqOpnrQyEC7", - "czgXkoEYwclZ" - ], - "title": "Running a development build", - "prefix": null, - "dataFileName": "Running a development build.clone.md", - "type": "text", - "format": "markdown", - "isExpanded": false - } - ] - }, - { - "isClone": false, - "noteId": "Kqzuchw6MmPm", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "Kqzuchw6MmPm" - ], - "title": "Dependency Management", - "notePosition": 50, + "title": "Synchronisation", + "notePosition": 180, "prefix": null, "isExpanded": false, "type": "text", @@ -2035,87 +2247,33 @@ "attributes": [ { "type": "label", - "name": "iconClass", - "value": "bx bx-package", + "name": "shareAlias", + "value": "sync", "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "attachments": [], - "dirFileName": "Dependency Management", - "children": [ - { - "isClone": false, - "noteId": "YH5JPX12BYFk", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "Kqzuchw6MmPm", - "YH5JPX12BYFk" - ], - "title": "Adding a new client library", - "notePosition": 0, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Adding a new client library.md", - "attachments": [] + "position": 20 }, { - "isClone": false, - "noteId": "C5CNXGgti17i", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "Kqzuchw6MmPm", - "C5CNXGgti17i" - ], - "title": "Having a simpler packaging system", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Having a simpler packaging sys.md", - "attachments": [] + "type": "label", + "name": "iconClass", + "value": "bx bx-sync", + "isInheritable": false, + "position": 30 } - ] - }, - { - "isClone": false, - "noteId": "6BWwXzPCph4G", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "6BWwXzPCph4G" ], - "title": "Project maintenance", - "notePosition": 60, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], "format": "markdown", "attachments": [], - "dirFileName": "Project maintenance", + "dirFileName": "Synchronisation", "children": [ { "isClone": false, - "noteId": "fa6hAJ9Ith3A", + "noteId": "wA6tm9xcWWaB", "notePath": [ "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "6BWwXzPCph4G", - "fa6hAJ9Ith3A" + "yeqU0zo0ZQ83", + "n9wYW9nUTynV", + "wA6tm9xcWWaB" ], - "title": "Updating dependencies", + "title": "Content hashing", "notePosition": 10, "prefix": null, "isExpanded": false, @@ -2123,768 +2281,299 @@ "mime": "text/html", "attributes": [ { - "type": "relation", - "name": "internalLink", - "value": "Xfi1ScuBTKJf", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Updating dependencies.md", - "attachments": [], - "dirFileName": "Updating dependencies", - "children": [ - { - "isClone": false, - "noteId": "Xfi1ScuBTKJf", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "6BWwXzPCph4G", - "fa6hAJ9Ith3A", - "Xfi1ScuBTKJf" - ], - "title": "bettersqlite binaries", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "PXzm2t3sCdsP", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "bettersqlite binaries.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "v5zBZNLR358v", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "6BWwXzPCph4G", - "fa6hAJ9Ith3A", - "v5zBZNLR358v" - ], - "title": "Node.js, Electron and `better-sqlite3`", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Node.js, Electron and `better-.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "aPQ1fSuoBCTC", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "6BWwXzPCph4G", - "fa6hAJ9Ith3A", - "aPQ1fSuoBCTC" - ], - "title": "Testing compatibility", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Testing compatibility.md", - "attachments": [] - } - ] - } - ] - }, - { - "isClone": false, - "noteId": "re0QTuqiYnVb", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "re0QTuqiYnVb" - ], - "title": "Scripting", - "notePosition": 80, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Scripting", - "children": [ - { - "isClone": false, - "noteId": "gz6zq5rlHqMa", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "re0QTuqiYnVb", - "gz6zq5rlHqMa" - ], - "title": "Widgets", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Widgets.md", - "attachments": [], - "dirFileName": "Widgets", - "children": [ - { - "isClone": false, - "noteId": "M8IppdwVHSjG", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "re0QTuqiYnVb", - "gz6zq5rlHqMa", - "M8IppdwVHSjG" - ], - "title": "Right pane widget", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Right pane widget.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "VqGQnnPGnqAU", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "re0QTuqiYnVb", - "gz6zq5rlHqMa", - "VqGQnnPGnqAU" - ], - "title": "CSS", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "CSS.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "fZ2IGYFXjkEy", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "re0QTuqiYnVb", - "fZ2IGYFXjkEy" - ], - "title": "Server-side imports", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Server-side imports.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "Sow7ThJozkzJ", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "Sow7ThJozkzJ" - ], - "title": "Documentation", - "notePosition": 90, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Documentation.md", - "attachments": [ - { - "attachmentId": "2bUrJyt2yfsd", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Documentation_image.png" - } - ], - "dirFileName": "Documentation", - "children": [ - { - "isClone": false, - "noteId": "LjqM0VUL1CrU", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "Sow7ThJozkzJ", - "LjqM0VUL1CrU" - ], - "title": "Documentation references in the application", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Documentation references in th.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "dtKC3FmoWOrv", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dtKC3FmoWOrv" - ], - "title": "Testing", - "notePosition": 100, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Testing.md", - "attachments": [], - "dirFileName": "Testing", - "children": [ - { - "isClone": false, - "noteId": "C5MUQczZ5R9N", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dtKC3FmoWOrv", - "C5MUQczZ5R9N" - ], - "title": "Integration testing", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Integration testing", - "children": [ - { - "isClone": false, - "noteId": "pH4RsxqifVpK", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dtKC3FmoWOrv", - "C5MUQczZ5R9N", - "pH4RsxqifVpK" - ], - "title": "Setting up authentication", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Setting up authentication.md", - "attachments": [ - { - "attachmentId": "aWFXFuXNon7J", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Setting up authentication_.png" - }, - { - "attachmentId": "JRbtB4byzewo", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Setting up authentication_.png" - } - ] - }, - { - "isClone": false, - "noteId": "bIfKwfCnqpeI", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dtKC3FmoWOrv", - "C5MUQczZ5R9N", - "bIfKwfCnqpeI" - ], - "title": "Test database", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Test database.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "w6gMvKh0UAVT", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dtKC3FmoWOrv", - "C5MUQczZ5R9N", - "w6gMvKh0UAVT" - ], - "title": "Running tests", - "notePosition": 40, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Running tests.md", - "attachments": [] - } - ] - } - ] - }, - { - "isClone": false, - "noteId": "dHfw0XZE515z", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z" - ], - "title": "Sub-projects", - "notePosition": 110, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Sub-projects", - "children": [ - { - "isClone": false, - "noteId": "JkTy2zz8Zbyq", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "JkTy2zz8Zbyq" - ], - "title": "CKEditor", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "CKEditor", - "children": [ - { - "isClone": false, - "noteId": "5yWZVlKPjLCC", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "JkTy2zz8Zbyq", - "5yWZVlKPjLCC" - ], - "title": "Environment setup", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "CaInsmrlZhR6", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Environment setup.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "CaInsmrlZhR6", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "JkTy2zz8Zbyq", - "CaInsmrlZhR6" - ], - "title": "Building the editor", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "5yWZVlKPjLCC", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Building the editor.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "5gBYmUqiupBl", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "JkTy2zz8Zbyq", - "5gBYmUqiupBl" - ], - "title": "Differences from upstream", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "lY19SLxUMj3J", - "isInheritable": false, - "position": 10 - }, - { - "type": "label", - "name": "fullContentWidth", - "value": "", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Differences from upstream.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "Q9FyKVERd1Lb", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "JkTy2zz8Zbyq", - "Q9FyKVERd1Lb" - ], - "title": "Updating to a newer version of CKEditor", - "notePosition": 40, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "5yWZVlKPjLCC", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "CaInsmrlZhR6", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "yAFSS6awVbaZ", - "isInheritable": false, - "position": 30 - } - ], - "format": "markdown", - "dataFileName": "Updating to a newer version of.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "yAFSS6awVbaZ", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "JkTy2zz8Zbyq", - "yAFSS6awVbaZ" - ], - "title": "Versions and external plugins", - "notePosition": 50, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "lY19SLxUMj3J", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Versions and external plugins.md", - "attachments": [] - } - ] - }, - { - "isClone": false, - "noteId": "lY19SLxUMj3J", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "lY19SLxUMj3J" - ], - "title": "ckeditor5-math", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "JkTy2zz8Zbyq", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "UMN2ABrBU5D7", + "type": "label", + "name": "shareAlias", + "value": "content-hashing", "isInheritable": false, "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "CaInsmrlZhR6", - "isInheritable": false, - "position": 30 } ], "format": "markdown", - "dataFileName": "ckeditor5-math.md", - "attachments": [ - { - "attachmentId": "UlSZYhYX8Kfj", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "ckeditor5-math_image.png" - } - ], - "dirFileName": "ckeditor5-math", - "children": [ - { - "isClone": false, - "noteId": "vpbbBaypScLb", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "lY19SLxUMj3J", - "vpbbBaypScLb" - ], - "title": "Updating with upstream", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "UMN2ABrBU5D7", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Updating with upstream.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "UMN2ABrBU5D7", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "dHfw0XZE515z", - "lY19SLxUMj3J", - "UMN2ABrBU5D7" - ], - "title": "Release management & continuous integration", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Release management & continuou.md", - "attachments": [] - } - ] - } - ] - }, - { - "isClone": false, - "noteId": "QRLbiDXNxoWN", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "QRLbiDXNxoWN" - ], - "title": "Troubleshooting", - "notePosition": 120, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Troubleshooting", - "children": [ - { - "isClone": false, - "noteId": "QUb0fRhbpT8E", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "QRLbiDXNxoWN", - "QUb0fRhbpT8E" - ], - "title": "Error [TransformError]: The package \"@esbuild/linux-x64\" could not be found, and is needed by esbuild.", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Error [TransformError] The pac.md", + "dataFileName": "Content hashing.md", "attachments": [] } ] }, { "isClone": false, - "noteId": "x6lgrdztQwVB", + "noteId": "k7RavjuXQt8z", "notePath": [ "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "x6lgrdztQwVB" + "yeqU0zo0ZQ83", + "k7RavjuXQt8z" ], - "title": "Installation", - "notePosition": 130, + "title": "Syntax highlighting", + "notePosition": 190, "prefix": null, "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], - "format": "markdown", - "attachments": [], - "dirFileName": "Installation", - "children": [ + "attributes": [ { - "isClone": false, - "noteId": "bOjeTrUViwLw", - "notePath": [ - "jdjRLhLV3TtI", - "ibAPHul7Efvr", - "x6lgrdztQwVB", - "bOjeTrUViwLw" - ], - "title": "Download latest nightly and install it", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Download latest nightly and in.md", - "attachments": [] + "type": "label", + "name": "shareAlias", + "value": "syntax-highlighting", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-highlight", + "isInheritable": false, + "position": 30 } - ] + ], + "format": "markdown", + "dataFileName": "Syntax highlighting.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "7BCukQTCm7fv", + "notePath": [ + "jdjRLhLV3TtI", + "yeqU0zo0ZQ83", + "7BCukQTCm7fv" + ], + "title": "Themes", + "notePosition": 200, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "themes", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-palette", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Themes.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "YjerxU7Aii8X", + "notePath": [ + "jdjRLhLV3TtI", + "YjerxU7Aii8X" + ], + "title": "Troubleshooting", + "notePosition": 360, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-bug", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "troubleshooting", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "attachments": [], + "dirFileName": "Troubleshooting", + "children": [ + { + "isClone": false, + "noteId": "g9nFZ6dRz1Cg", + "notePath": [ + "jdjRLhLV3TtI", + "YjerxU7Aii8X", + "g9nFZ6dRz1Cg" + ], + "title": "better-sqlite3 was compiled against a different Node.js version", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "better-sqlite3", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "better-sqlite3 was compiled ag.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "QUb0fRhbpT8E", + "notePath": [ + "jdjRLhLV3TtI", + "YjerxU7Aii8X", + "QUb0fRhbpT8E" + ], + "title": "Error [TransformError]: The package \"@esbuild/linux-x64\" could not be found, and is needed by esbuild.", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "esbuild-error", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Error [TransformError] The pac.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "dtKC3FmoWOrv", + "notePath": [ + "jdjRLhLV3TtI", + "dtKC3FmoWOrv" + ], + "title": "Testing", + "notePosition": 380, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "testing", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-eyedropper", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "w6gMvKh0UAVT", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "Testing.md", + "attachments": [], + "dirFileName": "Testing", + "children": [ + { + "isClone": false, + "noteId": "C5MUQczZ5R9N", + "notePath": [ + "jdjRLhLV3TtI", + "dtKC3FmoWOrv", + "C5MUQczZ5R9N" + ], + "title": "Integration testing", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "integration", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Integration testing.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "bIfKwfCnqpeI", + "notePath": [ + "jdjRLhLV3TtI", + "dtKC3FmoWOrv", + "bIfKwfCnqpeI" + ], + "title": "Test database", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "test-database", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Test database.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "w6gMvKh0UAVT", + "notePath": [ + "jdjRLhLV3TtI", + "dtKC3FmoWOrv", + "w6gMvKh0UAVT" + ], + "title": "End-to-end tests", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "running-tests", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "End-to-end tests.md", + "attachments": [] } ] } diff --git a/docs/Developer Guide/Developer Guide.md b/docs/Developer Guide/Developer Guide.md new file mode 100644 index 000000000..2dd9f42de --- /dev/null +++ b/docs/Developer Guide/Developer Guide.md @@ -0,0 +1,4 @@ +# Developer Guide +This documentation is intended for developers planning to implement new features or maintain the Trilium Notes application, as it describes the architecture of the application. + +For the user-facing documentation, including how to write scripts and the various APIs, consult the [user guide](https://docs.triliumnotes.org/user-guide/) instead. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Backlinks.md b/docs/Developer Guide/Developer Guide/Architecture/Backlinks.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Backlinks.md rename to docs/Developer Guide/Developer Guide/Architecture/Backlinks.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Branch prefixes.md b/docs/Developer Guide/Developer Guide/Architecture/Branch prefixes.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Branch prefixes.md rename to docs/Developer Guide/Developer Guide/Architecture/Branch prefixes.md diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/CI/1_Main_image.png b/docs/Developer Guide/Developer Guide/Architecture/CI/1_Main_image.png similarity index 100% rename from docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/CI/1_Main_image.png rename to docs/Developer Guide/Developer Guide/Architecture/CI/1_Main_image.png diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/CI/Main.md b/docs/Developer Guide/Developer Guide/Architecture/CI/Main.md similarity index 87% rename from docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/CI/Main.md rename to docs/Developer Guide/Developer Guide/Architecture/CI/Main.md index f7e96aa61..cae0613af 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/CI/Main.md +++ b/docs/Developer Guide/Developer Guide/Architecture/CI/Main.md @@ -2,7 +2,7 @@ The main workflow of the CI: * Builds the Docker image and publishes in the GitHub Docker registry. -* Builds using a portion of the [delivery script](../../Build%20deliveries%20locally.md) artifacts for the following platforms: +* Builds using a portion of the [delivery script](../../Building/Build%20deliveries%20locally.md) artifacts for the following platforms: * Windows `x86_64` as .zip file * Windows `x86_64` installer (using Squirrel) * macOS `x86_64` and `aarch64`. diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/CI/Main_image.png b/docs/Developer Guide/Developer Guide/Architecture/CI/Main_image.png similarity index 100% rename from docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/CI/Main_image.png rename to docs/Developer Guide/Developer Guide/Architecture/CI/Main_image.png diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/attachments.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/attachments.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/attachments.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/attachments.md diff --git a/docs/Developer Guide/Developer Guide/Architecture/Database structure/attributes.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/attributes.md new file mode 100644 index 000000000..959073ec8 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Architecture/Database structure/attributes.md @@ -0,0 +1,2 @@ +# attributes +
    Column NameData TypeNullityDefault valueDescription
    attributeIdTextNon-null Unique Id of the attribute (e.g. qhC1vzU4nwSE), can also have a special unique ID for Special notes (e.g. _lbToday_liconClass).
    noteIdTextNon-null The ID of the note this atttribute belongs to
    typeTextNon-null The type of attribute (label or relation).
    nameTextNon-null The name/key of the attribute.
    valueTextNon-null""
    • For label attributes, a free-form value of the attribute.
    • For relation attributes, the ID of the note the relation is pointing to.
    positionIntegerNon-null0The position of the attribute compared to the other attributes. Some predefined attributes such as originalFileName have a value of 1000.
    utcDateModifiedTextNon-null Modification date in UTC format (e.g. 2023-11-08 16:43:44.204Z)
    isDeletedIntegerNon-null 1 if the entity is deleted, 0 otherwise.
    deleteIdTextNullablenull 
    isInheritableIntegerNullable0 
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Architecture/Database structure/blobs.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/blobs.md new file mode 100644 index 000000000..63bf8c24d --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Architecture/Database structure/blobs.md @@ -0,0 +1,2 @@ +# blobs +
    Column NameData TypeNullityDefault valueDescription
    blobIdTextNon-null 

    The unique ID of the blob (e.g. XXbfAJXqWrYnSXcelLFA).

    contentTextNullablenull

    The content of the blob, can be either:

    • text (for plain text notes or HTML notes).
    • binary (for images and other types of attachments)
    dateModifiedTextNon-null Creation date with timezone offset (e.g. 2023-11-08 18:43:44.204+0200)
    utcDateModifiedTextNon-null 

    Creation date in UTC format (e.g. 2023-11-08 16:43:44.204Z).

    Blobs cannot be modified, so this timestamp specifies when the blob was created.

    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/branches.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/branches.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/branches.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/branches.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/entity_changes.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/entity_changes.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/entity_changes.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/entity_changes.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/etapi_tokens.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/etapi_tokens.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/etapi_tokens.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/etapi_tokens.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/notes.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/notes.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/notes.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/notes.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/options.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/options.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/options.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/options.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/recent_notes.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/recent_notes.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/recent_notes.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/recent_notes.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/revisions.md b/docs/Developer Guide/Developer Guide/Architecture/Database structure/revisions.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Database/revisions.md rename to docs/Developer Guide/Developer Guide/Architecture/Database structure/revisions.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Deleted notes.md b/docs/Developer Guide/Developer Guide/Architecture/Deleted notes.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Deleted notes.md rename to docs/Developer Guide/Developer Guide/Architecture/Deleted notes.md diff --git a/docs/Developer Guide/Developer Guide/Architecture/Demo document.md b/docs/Developer Guide/Developer Guide/Architecture/Demo document.md new file mode 100644 index 000000000..90429bdb1 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Architecture/Demo document.md @@ -0,0 +1,22 @@ +# Demo document +The demo document is an exported .zip that resides in `apps/server/src/assets/db/demo.zip`. + +During on-boarding, if the user selects that they are a new user then the `demo.zip` is imported into the root note. + +## Modifying the document + +1. In the Git root, run `pnpm edit-docs:edit-demo`. +2. Wait for the desktop application to show up with the docs. +3. Simply make the needed modifications. +4. Wait for a few seconds for the change to be processed in the background. +5. Commit the change in Git. + +## Testing the changes + +1. Run: + + ``` + rm -r data + pnpm server:start + ``` +2. And then do the on-boarding again. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Hidden notes.md b/docs/Developer Guide/Developer Guide/Architecture/Hidden notes.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Hidden notes.md rename to docs/Developer Guide/Developer Guide/Architecture/Hidden notes.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons.md b/docs/Developer Guide/Developer Guide/Architecture/Icons.md similarity index 59% rename from docs/Developer Guide/Developer Guide/Development and architecture/Icons.md rename to docs/Developer Guide/Developer Guide/Architecture/Icons.md index 791e26f6c..826ebc9bb 100644 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Icons.md +++ b/docs/Developer Guide/Developer Guide/Architecture/Icons.md @@ -21,7 +21,7 @@ These are stored in `images`: ## App icons -
    NameResolutionDescription
    ios/apple-touch-icon.png180x180Used as apple-touch-icon, but only in login.ejs and set_password.ejs for some reason.
    mac/icon.icns512x512Provided as --icon to electron-packager for mac-arm64 and mac-x64 builds.
    png/128x128.png128x128Used in linux-x64 build, to provide an icon.png.
    png/256x256-dev.png256x256Used by the Electron window icon, if in dev mode.
    png/256x256.pngUsed by the Electron window icon, if not in dev mode.
    win/icon.ico
    • ICO 16x16
    • ICO 32x32
    • ICO 48x48
    • ICO 64x64
    • ICO 128x128
    • PNG 256x256
    • Used by the win-x64 build.
    • Used by Squirrel Windows installer for: setup icon, app icon, control panel icon
    • Used as the favicon.
    win/setup-banner.gif640x480Used by the Squirrel Windows installer during the installation process. Has only one frame.
    +
    NameResolutionDescription
    ios/apple-touch-icon.png180x180Used as apple-touch-icon, but only in login.ejs and set_password.ejs for some reason.
    mac/icon.icns512x512Provided as --icon to electron-packager for mac-arm64 and mac-x64 builds.
    png/128x128.png128x128Used in linux-x64 build, to provide an icon.png.
    png/256x256-dev.png256x256Used by the Electron window icon, if in dev mode.
    png/256x256.pngUsed by the Electron window icon, if not in dev mode.
    win/icon.ico
    • ICO 16x16
    • ICO 32x32
    • ICO 48x48
    • ICO 64x64
    • ICO 128x128
    • PNG 256x256
    • Used by the win-x64 build.
    • Used by Squirrel Windows installer for: setup icon, app icon, control panel icon
    • Used as the favicon.
    win/setup-banner.gif640x480Used by the Squirrel Windows installer during the installation process. Has only one frame.
    ## Additional locations where the branding is used diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translat.md b/docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translat.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translat.md rename to docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translat.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translations/Guidelines.md b/docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translations/Guidelines.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translations/Guidelines.md rename to docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translations/Guidelines.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translations/Server translations.md b/docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translations/Server translations.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translations/Server translations.md rename to docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translations/Server translations.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translations/i18n-ally.md b/docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translations/i18n-ally.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Internationalisation Translations/i18n-ally.md rename to docs/Developer Guide/Developer Guide/Architecture/Internationalisation Translations/i18n-ally.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Launchers.md b/docs/Developer Guide/Developer Guide/Architecture/Launchers.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Launchers.md rename to docs/Developer Guide/Developer Guide/Architecture/Launchers.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Revisions.md b/docs/Developer Guide/Developer Guide/Architecture/Note Revisions.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Revisions.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Revisions.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Copy image reference to the cl.md b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Copy image reference to the cl.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Copy image reference to the cl.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Copy image reference to the cl.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Export diagram as SVG.md b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Export diagram as SVG.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Export diagram as SVG.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Export diagram as SVG.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/First steps.md b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/First steps.md similarity index 95% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/First steps.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/First steps.md index f60138817..fa860fe59 100644 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/First steps.md +++ b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/First steps.md @@ -41,7 +41,7 @@ Go to `src/becca/entities/rows.ts` and add the new note type to `ALLOWED_NOTE_TY ## Final steps -* Update the Demo document to showcase the new note type. +* Update the Demo document to showcase the new note type. ## Troubleshooting diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/First steps/mind_map.js b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/First steps/mind_map.js similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/First steps/mind_map.js rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/First steps/mind_map.js diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Loading data.md b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Loading data.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Loading data.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Loading data.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Note type checklist.md b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Note type checklist.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Note type checklist.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Note type checklist.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/SVG rendering.md b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/SVG rendering.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/SVG rendering.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/SVG rendering.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Saving data via spaced update.md b/docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Saving data via spaced update.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Adding a new note type/Saving data via spaced update.md rename to docs/Developer Guide/Developer Guide/Architecture/Note Types/Adding a new note type/Saving data via spaced update.md diff --git a/docs/Developer Guide/Developer Guide/Architecture/Options.md b/docs/Developer Guide/Developer Guide/Architecture/Options.md new file mode 100644 index 000000000..ce0d348f5 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Architecture/Options.md @@ -0,0 +1,43 @@ +# Options +## Read an option + +Add the import to the service (make sure the relative path is correct): + +```javascript +import options from "../../services/options.js"; +``` + +Them simply read the option: + +```javascript +this.firstDayOfWeek = options.getInt("firstDayOfWeek"); +``` + +## Adding new options + +### Checkbox option + +Refer to this example in `backup.tsx`: + +```javascript +export function AutomaticBackup() { + const [ dailyBackupEnabled, setDailyBackupEnabled ] = useTriliumOptionBool("dailyBackupEnabled"); + + return ( + + + + + + {t("backup.backup_recommendation")} + + ) +} +``` + +> [!TIP] +> To trigger a UI refresh (e.g. `utils#reloadFrontendApp`), simply pass a `true` as the second argument to `useTriliumOption` methods. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Creating a new option.md b/docs/Developer Guide/Developer Guide/Architecture/Options/Creating a new option.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Options/Creating a new option.md rename to docs/Developer Guide/Developer Guide/Architecture/Options/Creating a new option.md diff --git a/docs/Developer Guide/Developer Guide/Architecture/Printing and exporting to PDF.md b/docs/Developer Guide/Developer Guide/Architecture/Printing and exporting to PDF.md new file mode 100644 index 000000000..ad057206b --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Architecture/Printing and exporting to PDF.md @@ -0,0 +1,18 @@ +# Printing and exporting to PDF +Note printing is handled by `note_detail.js`, in the `printActiveNoteEvent` method. Exporting to PDF works similarly. + +## How it works + +Both printing and exporting as PDF use the same mechanism: a note is rendered individually in a separate webpage that is then sent to the browser or the Electron application either for printing or exporting as PDF. + +The webpage that renders a single note can actually be accessed in a web browser. For example `http://localhost:8080/#root/WWRGzqHUfRln/RRZsE9Al8AIZ?ntxId=0o4fzk` becomes `http://localhost:8080/?print#root/WWRGzqHUfRln/RRZsE9Al8AIZ`. + +Accessing the print note in a web browser allows for easy debugging to understand why a particular note doesn't render well. The mechanism for rendering is similar to the one used in Note List. + +## Syntax highlighting + +Syntax highlighting for code blocks is supported as well: + +* It works by injecting a Highlight.js stylesheet into the print. +* The theme used is hard-coded (the _Visual Studio Light theme_, at the time of writing) in order not to have a dark background in print. +* Syntax highlighting is handled by the content renderer. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Architecture/Protected entities.md b/docs/Developer Guide/Developer Guide/Architecture/Protected entities.md new file mode 100644 index 000000000..f7d4e5b2e --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Architecture/Protected entities.md @@ -0,0 +1,6 @@ +# Protected entities +The following entities can be made protected, via their `isProtected` flag: + +* attachments +* notes +* revisions \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Share.md b/docs/Developer Guide/Developer Guide/Architecture/Share.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Share.md rename to docs/Developer Guide/Developer Guide/Architecture/Share.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Synchronisation/Content hashing.md b/docs/Developer Guide/Developer Guide/Architecture/Synchronisation/Content hashing.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Synchronisation/Content hashing.md rename to docs/Developer Guide/Developer Guide/Architecture/Synchronisation/Content hashing.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Syntax highlighting.md b/docs/Developer Guide/Developer Guide/Architecture/Syntax highlighting.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Syntax highlighting.md rename to docs/Developer Guide/Developer Guide/Architecture/Syntax highlighting.md diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Themes.md b/docs/Developer Guide/Developer Guide/Architecture/Themes.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Themes.md rename to docs/Developer Guide/Developer Guide/Architecture/Themes.md diff --git a/docs/Developer Guide/Developer Guide/Building/Build deliveries locally.md b/docs/Developer Guide/Developer Guide/Building/Build deliveries locally.md new file mode 100644 index 000000000..3c78ae4aa --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Building/Build deliveries locally.md @@ -0,0 +1,34 @@ +# Build deliveries locally +## Building the desktop + +Go to `apps/desktop`, and: + +* To generate the packages, run `pnpm electron-forge:make`. +* To only build the Flatpak, run `pnpm electron-forge:make-flatpak`. +* To only build without packaging it, run `pnpm electron-forge:package`. + +## Building the server + +Go to `apps/server` and run `pnpm package` to run the build script. The built artifacts will appear in `apps/server/dist`, whereas the packaged build will be available in `apps/server/out`. + +## On NixOS + +Under NixOS the following `nix-shell` is needed: + +``` +nix-shell -p jq +``` + +For Linux builds: + +``` +nix-shell -p jq fakeroot dpkg +``` + +To test the Linux builds, use `steam-run`: + +```javascript +$ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run +[nix-shell] cd dist/trilium-linux-x64 +[nix-shell] steam-run ./trilium +``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Building/Build information.md b/docs/Developer Guide/Developer Guide/Building/Build information.md new file mode 100644 index 000000000..b1fd0437b --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Building/Build information.md @@ -0,0 +1,4 @@ +# Build information +* Provides context about when the build was made and the corresponding Git revision. +* The information is displayed to the client when going in the about dialog. +* The build information is hard-coded in `apps/server/src/services/build.ts`. This file is generated automatically via `chore:update-build-info` which itself is run automatically whenever making a build in the CI. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Building/Docker.md b/docs/Developer Guide/Developer Guide/Building/Docker.md new file mode 100644 index 000000000..ea5782ad2 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Building/Docker.md @@ -0,0 +1,8 @@ +# Docker +To build the server for Docker: + +* Go to `apps/server` and run: + * `pnpm docker-build-debian` or + * `pnpm docker-build-alpine`. +* Similarly, to build the rootless versions: `pnpm docker-build-rootless-debian` or `pnpm docker-build-rootless-alpine`. +* To not only build but also run the Docker container, simply replace `docker-build` with `docker-start` (e.g. `pnpm docker-start-debian`). \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Building/Live reload (HMR).md b/docs/Developer Guide/Developer Guide/Building/Live reload (HMR).md new file mode 100644 index 000000000..8ae38f99a --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Building/Live reload (HMR).md @@ -0,0 +1,10 @@ +# Live reload (HMR) +Trilium uses Vite's HMR (hot module reloading) mechanism. + +## Server live reload + +If running the server using `pnpm server:start`, the server will watch for changes. For React components, they will be hot-reloaded without requiring a refresh. For other services, it will reload the page. + +## Desktop live reload + +`pnpm desktop:start` acts the same as `pnpm server:start` with hot-reloading for client-side changes. Changes on the desktop side require a complete re-run of the `pnpm desktop:start` command. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Building/Releasing a new version.md b/docs/Developer Guide/Developer Guide/Building/Releasing a new version.md new file mode 100644 index 000000000..19e3427ec --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Building/Releasing a new version.md @@ -0,0 +1,19 @@ +# Releasing a new version +Releasing is mostly handled by the CI: + +* The version on GitHub is published automatically, including the description with the change log which is taken from the documentation. +* A PR is created automatically on the Winget repository to update to the new version. + +Releases are usually made directly from the `main` branch. + +The process is as follows: + +1. Edit the Documentation to add a corresponding entry in the _Release notes_ section. +2. In the root `package.json`, set `version` to the new version to be released. +3. Run `chore:update-version` to automatically update the version of the rest of the `package.json` files. +4. Run `pnpm i` to update the package lock as well. +5. Commit the changes to the `package.json` files and the `package-lock.json`. The commit message is usually `chore(release): prepare for v1.2.3`. +6. Tag the newly created commit: `git tag v1.2.3` +7. Push the commit and the newly created tag: `git push; git push --tags`. +8. Wait for the CI to finish. +9. When the release is automatically created in GitHub, download it to make sure it works OK. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Building/Running a development build.md b/docs/Developer Guide/Developer Guide/Building/Running a development build.md new file mode 100644 index 000000000..c69e19d50 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Building/Running a development build.md @@ -0,0 +1,33 @@ +# Running a development build +First, follow the Environment Setup. + +## Client + +The client is not meant to be run by itself, despite being described as an app. See the documentation on the server instead. + +## Server + +* To run the server in development mode, run `server:start`. The dev port is `8080`. +* To run the server in production mode (with its own copy of the assets), run `server:start-prod`. +* To build for Docker, see Docker. + +To run with a custom port, change the `TRILIUM_PORT` environment variable from the `package.json`. + +## Desktop + +* To run in development mode, use `pnpm desktop:start`. +* To run in production mode, use `pnpm desktop:start-prod`. + +## Safe mode + +Safe mode is off by default, to enable it temporarily on a Unix shell, prepend the environment variable setting: + +``` +pnpm cross-env TRILIUM_SAFE_MODE=1 pnpm server:start +``` + +## Running on NixOS + +When doing development, the Electron binary retrieved from NPM is not going to be compatible with NixOS, resulting in errors when trying to run it. However Trilium handles it automatically when running `pnpm desktop:start`. + +If there's no `electron` the system path it will attempt to use `nix-shell` to obtain it. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Project Structure/CKEditor.md b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Project Structure/CKEditor.md rename to docs/Developer Guide/Developer Guide/Dependencies/CKEditor.md diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Differences from upstream.md b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/Differences from upstream.md similarity index 81% rename from docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Differences from upstream.md rename to docs/Developer Guide/Developer Guide/Dependencies/CKEditor/Differences from upstream.md index a5230d8f7..d8e2db46b 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Differences from upstream.md +++ b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/Differences from upstream.md @@ -1,5 +1,5 @@ # Differences from upstream -* Embeds [`~~isaul32/ckeditor5-math~~`](https://github.com/isaul32/ckeditor5-math)  ckeditor5-math, which is a third-party plugin for adding math support. CKEditor itself also has a [math plugin](https://ckeditor.com/docs/ckeditor5/latest/features/math-equations.html) with MathType and ChemType but it's premium-only. +* Embeds [`~~isaul32/ckeditor5-math~~`](https://github.com/isaul32/ckeditor5-math)  ckeditor5-math, which is a third-party plugin for adding math support. CKEditor itself also has a [math plugin](https://ckeditor.com/docs/ckeditor5/latest/features/math-equations.html) with MathType and ChemType but it's premium-only. * Zadam left a TODO in `findandreplaceUI`: `// FIXME: keyboard shortcut doesn't work:` [`https://github.com/ckeditor/ckeditor5/issues/10645`](https://github.com/ckeditor/ckeditor5/issues/10645) * `packages\ckeditor5-build-balloon-block\src\mention_customization.js` introduces note insertion via `@` character. diff --git a/docs/Developer Guide/Developer Guide/Project Structure/CKEditor/Plugin migration guide.md b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/Plugin migration guide.md similarity index 98% rename from docs/Developer Guide/Developer Guide/Project Structure/CKEditor/Plugin migration guide.md rename to docs/Developer Guide/Developer Guide/Dependencies/CKEditor/Plugin migration guide.md index 8b87f2721..47a4b5e83 100644 --- a/docs/Developer Guide/Developer Guide/Project Structure/CKEditor/Plugin migration guide.md +++ b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/Plugin migration guide.md @@ -34,7 +34,7 @@ In the newly copied package, go to `package.json` and edit: 2. In `peerDependencies`, change `ckeditor5` to the same version as from the previous step. 3. Similarly, update `vitest` dependencies to match the monorepo one. 4. Remove the `prepare` entry from the `scripts` section. -5. Change `build:dist` to simply `build` in order to integrate it with NX. +5. Change `build:dist` to simply `build`. 6. In `tsconfig.dist.json`, change `typings/types` to `../typings/types.d.ts` to be compatible with the latest TypeScript version. ## Step 4. Install missing dependencies and build errors diff --git a/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/ckeditor5-math.md b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/ckeditor5-math.md new file mode 100644 index 000000000..e47a59f12 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/ckeditor5-math.md @@ -0,0 +1,16 @@ +# ckeditor5-math +
    ckeditor5-math in action.
    + +A fork of [isaul32/ckeditor5-math](https://github.com/isaul32/ckeditor5-math), which is the CKEditor5 plugin which adds the math functionality. We keep our own version to be able to use it on the latest version of CKEditor, alongside some custom improvements. + +## Development environment + +* Tested on Node.js 20. +* The package manager is yarn 1 (v1.22.22 is known to be working fine for it at the time of writing). + +Important commands: + +* To check if the code has any formatting issues: `yarn lint` +* To start a live preview: `yarn start` +* To run the tests: `yarn test` + * Note that this requires Chromium, on NixOS this can be achieved by running a `nix-shell -p chromium`, and running `CHROME_BIN=$(which chromium) yarn test` inside it. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math_image.png b/docs/Developer Guide/Developer Guide/Dependencies/CKEditor/ckeditor5-math_image.png similarity index 100% rename from docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math_image.png rename to docs/Developer Guide/Developer Guide/Dependencies/CKEditor/ckeditor5-math_image.png diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies.md b/docs/Developer Guide/Developer Guide/Dependencies/Per-dependency checks.md similarity index 96% rename from docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies.md rename to docs/Developer Guide/Developer Guide/Dependencies/Per-dependency checks.md index fb27cb6bf..309042ffc 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies.md +++ b/docs/Developer Guide/Developer Guide/Dependencies/Per-dependency checks.md @@ -1,2 +1,2 @@ -# Updating dependencies -
    DependencyName in library_loaderThings to check for a basic sanity check Protected by unit tests
    better-sqlite3 See bettersqlite binaries.  
    jsdom 
    • Note map
    • Clipper
    • Note similarity
    Protected by typings, should catch any potential changes in API.Yes
    async-mutex 
    • Sync
      
    axios 
    • Can't be directly tested, as it's exposed only via the backend script API.
      
    sax 
    • EverNote imports
      
    • ws
    • debounce
     
    • Check any action is reported from server to client (e.g. delete a note).
      
    ejs 
    • Onboarding / first setup
      
    dayjs 
    • Day notes
      
    semver 
    • Application should start.
      
    https-proxy-agent ???  
    sax 
    • EverNote import
      
    ini 
    • Affects config, generally if the application starts then it should be OK.
      
    jsplumbRELATION_MAP
    • Relation map note type
      
    jquery.mark.es6MARKJS
    • In search, when highlighting the text that matched.
    • In search in HTML, which might not actually be used since it seems to have been replaced by CKEditor's own find & replace dialog.
      
    knockout.js 
    • Used in rendering the login and main layout of the application.
      
    normalize.min.css 
    • Used in shared notes.
      
    wheel-zoom.min.jsWHEEL_ZOOM
    • When opening a image that is in attachment.
    • When opening a stand-alone image note.
    • When zooming in a mermaid chart.
      
    fancytree 
    • The note tree should be fully functional.
      
    bootstrap 
    • Check mostly the on-boarding pages, when there is no database.
      
    electron-debug 
    • Run electron using npm run start-electron and check that the debug hotkeys are still working (Ctrl+Shift+I on Windows/Linux, Cmd+Alt+I for dev tools, Cmd/Ctrl+R for reload).
      
    electron-dl    
    eslint    
    marked 
    • Importing a markdown note.
     Yes
    force-graph 
    • Note map
      
    \ No newline at end of file +# Per-dependency checks +
    DependencyName in library_loaderThings to check for a basic sanity check Protected by unit tests
    better-sqlite3 See bettersqlite binaries.  
    jsdom 
    • Note map
    • Clipper
    • Note similarity
    Protected by typings, should catch any potential changes in API.Yes
    async-mutex 
    • Sync
      
    axios 
    • Can't be directly tested, as it's exposed only via the backend script API.
      
    sax 
    • EverNote imports
      
    • ws
    • debounce
     
    • Check any action is reported from server to client (e.g. delete a note).
      
    ejs 
    • Onboarding / first setup
      
    dayjs 
    • Day notes
      
    semver 
    • Application should start.
      
    https-proxy-agent ???  
    sax 
    • EverNote import
      
    ini 
    • Affects config, generally if the application starts then it should be OK.
      
    jsplumbRELATION_MAP
    • Relation map note type
      
    jquery.mark.es6MARKJS
    • In search, when highlighting the text that matched.
    • In search in HTML, which might not actually be used since it seems to have been replaced by CKEditor's own find & replace dialog.
      
    knockout.js 
    • Used in rendering the login and main layout of the application.
      
    normalize.min.css 
    • Used in shared notes.
      
    wheel-zoom.min.jsWHEEL_ZOOM
    • When opening a image that is in attachment.
    • When opening a stand-alone image note.
    • When zooming in a mermaid chart.
      
    fancytree 
    • The note tree should be fully functional.
      
    bootstrap 
    • Check mostly the on-boarding pages, when there is no database.
      
    electron-debug 
    • Run electron using npm run start-electron and check that the debug hotkeys are still working (Ctrl+Shift+I on Windows/Linux, Cmd+Alt+I for dev tools, Cmd/Ctrl+R for reload).
      
    electron-dl    
    eslint    
    marked 
    • Importing a markdown note.
     Yes
    force-graph 
    • Note map
      
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Dependencies/Per-dependency checks/bettersqlite binaries.md b/docs/Developer Guide/Developer Guide/Dependencies/Per-dependency checks/bettersqlite binaries.md new file mode 100644 index 000000000..5a473b5e5 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Dependencies/Per-dependency checks/bettersqlite binaries.md @@ -0,0 +1,25 @@ +# bettersqlite binaries +### The native node bindings + +`better-sqlite3` has native Node bindings. With updates of `better-sqlite3`, but also of Electron and Node.js versions, these bindings need to be updated. + +Note that Electron and Node.js versions need different versions of these bindings, since Electron usually packs a different version of Node.js. + +During development, `pnpm install` tries to build or reuse prebuilt natives for the current Node.js version. This makes `npm run start-server` work out of the box. Trying to run `npm run start-electron` with these versions generally causes an error such as this: + +``` +Uncaught Exception: +Error: The module '/Users/elian/Projects/Notes/node_modules/better-sqlite3/build/Release/better_sqlite3.node' +was compiled against a different Node.js version using +NODE_MODULE_VERSION 108. This version of Node.js requires +NODE_MODULE_VERSION 116. Please try re-compiling or re-installing +the module (for instance, using `npm rebuild` or `npm install`). +``` + +### How the natives are handled + +To avoid issues between the `server` and the `desktop`, the `desktop` build gets its own copy of the `bettersqlite3` dependency in its `node_module`. This copy is then rebuilt automatically to match the Electron version. + +This process of rebuilding is handled by `scripts/electron-rebuild.mts` which runs automatically after `pnpm install` (via `postinstall`). + +If needed, the script can be run manually again via `pnpm postinstall`. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Build information.md b/docs/Developer Guide/Developer Guide/Development and architecture/Build information.md deleted file mode 100644 index 475d902f5..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Build information.md +++ /dev/null @@ -1,4 +0,0 @@ -# Build information -* Provides context about when the build was made and the corresponding Git revision. -* The information is displayed to the client when going in the about dialog. -* The build information is hard-coded in `src/services/build.ts`. This file is generated automatically via `npm run update-build-info` which itself is run automatically whenever making a build in the CI, or a [local delivery](../Old%20documentation/Build%20deliveries%20locally.md). \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/attributes.md b/docs/Developer Guide/Developer Guide/Development and architecture/Database/attributes.md deleted file mode 100644 index 4e7ca6a4c..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Database/attributes.md +++ /dev/null @@ -1,2 +0,0 @@ -# attributes -
    Column NameData TypeNullityDefault valueDescription
    attributeIdTextNon-null Unique Id of the attribute (e.g. qhC1vzU4nwSE), can also have a special unique ID for Special notes (e.g. _lbToday_liconClass).
    noteIdTextNon-null The ID of the note this atttribute belongs to
    typeTextNon-null The type of attribute (label or relation).
    nameTextNon-null The name/key of the attribute.
    valueTextNon-null""
    • For label attributes, a free-form value of the attribute.
    • For relation attributes, the ID of the note the relation is pointing to.
    positionIntegerNon-null0The position of the attribute compared to the other attributes. Some predefined attributes such as originalFileName have a value of 1000.
    utcDateModifiedTextNon-null Modification date in UTC format (e.g. 2023-11-08 16:43:44.204Z)
    isDeletedIntegerNon-null 1 if the entity is deleted, 0 otherwise.
    deleteIdTextNullablenull 
    isInheritableIntegerNullable0 
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Database/blobs.md b/docs/Developer Guide/Developer Guide/Development and architecture/Database/blobs.md deleted file mode 100644 index d0efc5434..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Database/blobs.md +++ /dev/null @@ -1,2 +0,0 @@ -# blobs -
    Column NameData TypeNullityDefault valueDescription
    blobIdTextNon-null The unique ID of the blob (e.g. XXbfAJXqWrYnSXcelLFA).

    Important: this ID is actually a hash of the content, see AbstractBeccaEntity#saveBlob! It is a logic error to modify an existing blob.

    contentTextNullablenull

    The content of the blob, can be either:

    • text (for plain text notes or HTML notes).
    • binary (for images and other types of attachments)
    dateModifiedTextNon-null Creation date with timezone offset (e.g. 2023-11-08 18:43:44.204+0200)
    utcDateModifiedTextNon-null Creation date in UTC format (e.g. 2023-11-08 16:43:44.204Z).

    Blobs cannot be modified, so this timestamp specifies when the blob was created.

    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Demo document.md b/docs/Developer Guide/Developer Guide/Development and architecture/Demo document.md deleted file mode 100644 index 5987385de..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Demo document.md +++ /dev/null @@ -1,19 +0,0 @@ -# Demo document -The demo document is an exported .zip that resides in `db/demo.zip`. - -During on-boarding, if the user selects that they are a new user then the `demo.zip` is imported into the root note. - -## Modifying the document - -On a dev server, remove all your existing notes in order to ensure a clean setup. Right click → Import to note and select the .zip file in `db/demo.zip`. Make sure to disable “Safe import”. - -After making the necessary modifications, simply export the “Trilium Demo” note as “HTML in ZIP archive” and replace `db/demo.zip` with the newly exported one. - -## Testing the changes - -``` -rm -r data -npm run start-server -``` - -And then do the on-boarding again. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Docker.md b/docs/Developer Guide/Developer Guide/Development and architecture/Docker.md deleted file mode 100644 index a39be7526..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Docker.md +++ /dev/null @@ -1,18 +0,0 @@ -# Docker -To run a Docker build: - -``` -./bin/builder-docker.sh -``` - -To run the built Docker image: - -``` -sudo docker run -p 8081:8080 triliumnext/trilium:v0.90.6-beta -``` - -To enter a shell in the Docker container: - -``` -sudo docker run -it --entrypoint=/bin/sh zadam/trilium:0.63-latest -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/1_Icons on Mac_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/1_Icons on Mac_image.png deleted file mode 100644 index 4fa4deed1..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/1_Icons on Mac_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac.md b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac.md deleted file mode 100644 index 0921f7476..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac.md +++ /dev/null @@ -1,8 +0,0 @@ -# Icons on Mac -Looks great in Finder: - -
    - -Looks great in Dock: - -
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/1_Adaptive icon_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/1_Adaptive icon_image.png deleted file mode 100644 index 4fa4deed1..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/1_Adaptive icon_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/1_Slightly blurry icon on Ma.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/1_Slightly blurry icon on Ma.png deleted file mode 100644 index 1a0232adf..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/1_Slightly blurry icon on Ma.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/2_Adaptive icon_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/2_Adaptive icon_image.png deleted file mode 100644 index e42926852..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/2_Adaptive icon_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/2_Slightly blurry icon on Ma.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/2_Slightly blurry icon on Ma.png deleted file mode 100644 index c30743ece..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/2_Slightly blurry icon on Ma.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/3_Adaptive icon_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/3_Adaptive icon_image.png deleted file mode 100644 index 99b0ce3d4..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/3_Adaptive icon_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/4_Adaptive icon_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/4_Adaptive icon_image.png deleted file mode 100644 index afcfacc11..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/4_Adaptive icon_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/5_Adaptive icon_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/5_Adaptive icon_image.png deleted file mode 100644 index e99523df8..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/5_Adaptive icon_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/6_Adaptive icon_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/6_Adaptive icon_image.png deleted file mode 100644 index eacecb265..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/6_Adaptive icon_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Adaptive icon.md b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Adaptive icon.md deleted file mode 100644 index f3947eb0e..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Adaptive icon.md +++ /dev/null @@ -1,15 +0,0 @@ -# Adaptive icon -| | | -| --- | --- | -| Before |
    | -| After |
    | -| With new scale |
    | - -## Scale - -| | | -| --- | --- | -| 0.9 |
    | -| 0.85 |
    | -| 0.8 |
    | -| 0.75 |
    | \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Adaptive icon_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Adaptive icon_image.png deleted file mode 100644 index eeec79a01..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Adaptive icon_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Slightly blurry icon on Ma.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Slightly blurry icon on Ma.png deleted file mode 100644 index c32a45801..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Slightly blurry icon on Ma.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Slightly blurry icon on Mac.md b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Slightly blurry icon on Mac.md deleted file mode 100644 index a59a8abfe..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac/Slightly blurry icon on Mac.md +++ /dev/null @@ -1,50 +0,0 @@ -# Slightly blurry icon on Mac -Slightly blurry in extended preview on Mac - -
    - -In the screenshot, the icon is around 650px whereas the closest image we have is 512px, so that might explain the blur. Adding an `ic10` (`1024x1024`, aka `512x512@2x` to see what happens). - -Before: - -``` -File: ../images/app-icons/mac/icon.icns - ic09: 62069 bytes, png: 512x512 -``` - -After: - -``` -File: ../images/app-icons/mac/icon.icns - icp4: 1140 bytes, png: 16x16 - icp5: 1868 bytes, png: 32x32 - ic07: 9520 bytes, png: 128x128 - ic09: 62069 bytes, png: 512x512 - ic10: 180442 bytes, png: 512x512@2x -``` - -Even with a 1024x1024 icon, the image is still blurry. - -Comparing the `.icns` file from the Electron build reveals that the `.icns` file has been tampered with: - -
    The electron.icns from the resulting buildThe icon source
    File: images/app-icons/mac/electron.icns
    -  icp4: 1140 bytes, png: 16x16
    -  icp5: 1868 bytes, png: 32x32
    -  ic07: 9520 bytes, png: 128x128
    -  ic09: 62069 bytes, png: 512x512
    -  ic10: 180442 bytes, png: 512x512@2x
    File: images/app-icons/mac/icon.icns
    -  icp4: 1648 bytes, png: 16x16
    -  icp5: 4364 bytes, png: 32x32
    -  ic07: 26273 bytes, png: 128x128
    -  ic09: 206192 bytes, png: 512x512
    -  ic10: 716034 bytes, png: 512x512@2x
    - -The bluriness might come from the image itself: [https://stackoverflow.com/questions/54030521/convert-svg-to-png-with-sharp-edges](https://stackoverflow.com/questions/54030521/convert-svg-to-png-with-sharp-edges)  - -Rendering with Inkscape (left) vs ImageMagick (right): - -
    - -Now in macOS it's also rendering quite nicely: - -
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac_image.png b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac_image.png deleted file mode 100644 index f587c31cf..000000000 Binary files a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Icons on Mac_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Removed icons.md b/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Removed icons.md deleted file mode 100644 index 97b126515..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Icons/Removed icons.md +++ /dev/null @@ -1,27 +0,0 @@ -# Removed icons -The following icons were removed: - -## Main images - -These are stored in `images`: - -| Name | Resolution | Description | -| --- | --- | --- | -| `icon-black.png` | 36x36 | Does not appear to be used. | -| `icon-color.png` | 36x36 | Used only by some tests in `test-etapi`. | -| `icon-grey.png` | 36x36 | Does not appear to be used. | -| `icon.svg` | 210x297 | Does not appear to be used. | - -## App icons - -| Name | Resolution | Description | -| --- | --- | --- | -| `png/16x16-bw.png` | 16x16 | Do not appear to be used. | -| `png/16x16.png` | | | -| `png/24x24.png` | 24x24 | | -| `png/32x32.png` | 32x32 | | -| `png/48x48.png` | 48x48 | | -| `png/64x64.png` | 64x64 | | -| `png/96x96.png` | 96x96 | | -| `png/512x512.png` | 512x512 | Does not appear to be used. | -| `win/setup-banner.xcf` | | GIMP source for `win/setup-banner.gif`. Provided only for future editing. | \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Live reload.md b/docs/Developer Guide/Developer Guide/Development and architecture/Live reload.md deleted file mode 100644 index 0efebd014..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Live reload.md +++ /dev/null @@ -1,20 +0,0 @@ -# Live reload -## Server live reload - -If running the server using `npm run start-server`, the server will watch for changes in `src/public` and trigger a frontend reload if that occurs. - -## Electron live reload - -Similarly, `npm run start-electron` supports live refresh  as well. - -However, a core difference is that Electron watches `dist/src/public` instead of `src/public` since Electron runs on its own copy of the files. - -To ameliorate that, a separate watch script has been implemented which automatically copies files from `src/public` to `dist/src/public` whenever a change is detected. To run it: - -``` -npm run -``` - -## Technical details - -* This mechanism is managed at server level by watching for changes in`services/ws.ts`. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Note types.md b/docs/Developer Guide/Developer Guide/Development and architecture/Note types.md deleted file mode 100644 index e8b9c6a3c..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Note types.md +++ /dev/null @@ -1,30 +0,0 @@ -# Note types -The note type is defined by the `type` column in notes. - -Possible types: - -
    Note Typetype valueCorresponding MIME typeContent of the note's blobRelevant attributes
    Texttext The HTML of the note. 
    Relation Map relationMapapplication/json

    A JSON describing the note:

    {
    -    "notes": [
    -        {
    -            "noteId": "gFQDL11KEm9G",
    -            "x": 142,
    -            "y": 405
    -        },
    -        {
    -            "noteId": "8GcjEKyrrCgl",
    -            "x": 100.10406374385552,
    -            "y": 757.0364424520196
    -        }
    -    ],
    -    "transform": {
    -        "scale": 0.3,
    -        "x": 480.29766098682165,
    -        "y": 116.83892021963081
    -    }
    -}
    None
    Render Noterendertext/html or blank.An empty blob.~renderNote pointing to the HTML note to render.
    Canvascanvasapplication/json
    {
    -	"appState": {},
    -	"elemenets": {},
    -	"files": {},
    -	"type": "excalidraw",
    -	"version": 2
    -}
    None
    Mermaid Diagrammermaidtext/mermaid or text/plainThe plain text content of the Mermaid diagram.None
    Bookbooktext/html or blank.An empty blob.
    • #viewType which can be either grid or list.
    • #expanded

    both options are shown to the user via the “Book Properties” ribbon widget.

    Web ViewwebViewblankAn empty blob.#webViewSrc pointing to an URL to render.
    CodecodeDepends on the language (e.g. text/plain, text/x-markdown, text/x-c++src).The plain text content. 
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Options.md b/docs/Developer Guide/Developer Guide/Development and architecture/Options.md deleted file mode 100644 index a56f2bbed..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Options.md +++ /dev/null @@ -1,14 +0,0 @@ -# Options -## Read an option - -Add the import to the service (make sure the relative path is correct): - -```javascript -import options from "../../services/options.js"; -``` - -Them simply read the option: - -```javascript -this.firstDayOfWeek = options.getInt("firstDayOfWeek"); -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Check box option.md b/docs/Developer Guide/Developer Guide/Development and architecture/Options/Check box option.md deleted file mode 100644 index fa2258336..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Check box option.md +++ /dev/null @@ -1,37 +0,0 @@ -# Check box option -In the TPL: - -``` -
    -

    Background effects

    - -

    On the desktop application, it's possible to use a semi-transparent background tinted in the colors of the user's wallpaper to add a touch of color.

    - -
    - -
    -
    -``` - -In `doRender()`: - -``` -doRender() { - this.$backgroundEffects = this.$widget.find("input.background-effects"); - - this.$backgroundEffects.on("change", () => this.updateCheckboxOption("backgroundEffects", this.$backgroundEffects)); -} -``` - -In `optionsLoaded(options)`: - -``` -async optionsLoaded(options) { - - this.setCheckboxState(this.$backgroundEffects, options.backgroundEffects); - -} -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Displaying the option in setti.md b/docs/Developer Guide/Developer Guide/Development and architecture/Options/Displaying the option in setti.md deleted file mode 100644 index b135025e0..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Displaying the option in setti.md +++ /dev/null @@ -1,36 +0,0 @@ -# Displaying the option in settings -Go to `src/public/app/widgets/type_widgets/options` and select a corresponding category, such as `appearance` and edit one of the JS files. - -For example, to create a select: - -First, modify the template (`TPL`), to add the new widget: - -``` -
    - - -
    -``` - -Secondly, create a reference to the new element in `doRender()`: - -``` -this.$firstDayOfWeek = this.$widget.find(".first-day-of-week-select"); -``` - -Then in `optionsLoaded` adjust the value to the one set in the database: - -``` -this.$firstDayOfWeek.val(options.firstDayOfWeek); -``` - -To actually update the option, add a listener in `doRender`: - -``` -this.$firstDayOfWeek.on("change", () => { - this.updateOption("firstDayOfWeek", this.$firstDayOfWeek.val()); -}); -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Refresh widget with option cha.md b/docs/Developer Guide/Developer Guide/Development and architecture/Options/Refresh widget with option cha.md deleted file mode 100644 index a79f1ac1d..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Refresh widget with option cha.md +++ /dev/null @@ -1,10 +0,0 @@ -# Refresh widget with option change -To make a widget react to a change of a given option, simply add the following to the widget: - -```javascript -async entitiesReloadedEvent({loadResults}) { - if (loadResults.getOptionNames().includes("firstDayOfWeek")) { - // Do something. - } -} -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Trigger UI refresh.md b/docs/Developer Guide/Developer Guide/Development and architecture/Options/Trigger UI refresh.md deleted file mode 100644 index d8cf12f2a..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Options/Trigger UI refresh.md +++ /dev/null @@ -1,12 +0,0 @@ -# Trigger UI refresh -Call `utils.reloadFrontendApp`, but make sure to wait for the option to be saved first. - -``` -this.$backgroundEffects.on("change", async () => { - - await this.updateCheckboxOption("backgroundEffects", this.$backgroundEffects); - - utils.reloadFrontendApp("background effect change"); - -}); -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Printing.md b/docs/Developer Guide/Developer Guide/Development and architecture/Printing.md deleted file mode 100644 index 9614ee786..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Printing.md +++ /dev/null @@ -1,15 +0,0 @@ -# Printing -Note printing is handled by `note_detail.js`, in the `printActiveNoteEvent` method. - -The application uses the [`print-this`](https://www.npmjs.com/package/print-this) library to isolate `.note-detail-printable:visible` and prepare it for printing. - -Some scripts like KaTeX are manually injected in the footer, and the CSS to be used is manually defined. The most important one is `print.css`. - -## Syntax highlighting - -Syntax highlighting for code blocks is supported as well: - -* It works by injecting a Highlight.js stylesheet into the print. -* The theme used is hard-coded (the _Visual Studio Light theme_, at the time of writing) in order not to have a dark background in print. -* The Highlight.js library is not needed since the `.note-detail-printable` which is rendered already has the `.hljs` classes added to it in order to achieve the syntax highlighting. -* The user's choice of whether to enable syntax highlighting is also respected. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Protected entities.md b/docs/Developer Guide/Developer Guide/Development and architecture/Protected entities.md deleted file mode 100644 index 225c740e7..000000000 --- a/docs/Developer Guide/Developer Guide/Development and architecture/Protected entities.md +++ /dev/null @@ -1,6 +0,0 @@ -# Protected entities -The following entities can be made protected, via their `isProtected` flag: - -* attachments -* notes -* revisions \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md similarity index 66% rename from docs/Developer Guide/Developer Guide/Old documentation/Documentation.md rename to docs/Developer Guide/Developer Guide/Documentation.md index 987582cac..4874aaa1d 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Documentation.md +++ b/docs/Developer Guide/Developer Guide/Documentation.md @@ -1,29 +1,32 @@ # Documentation -
    - -There are multiple types of documentation for Trilium: +There are multiple types of documentation for Trilium: * The _User Guide_ represents the user-facing documentation. This documentation can be browsed by users directly from within Trilium, by pressing F1. * The _Developer's Guide_ represents a set of Markdown documents that present the internals of Trilium, for developers. * _Release Notes_, this contains the change log for each released or soon-to-be-released version. The release notes are used automatically by the CI when releasing a version. * The _Script API_, which is an automatically generated documentation for the front-end and back-end APIs for scripts. -## Editing documentation +## Location of the documentation + +All documentation is stored in the [Trilium](https://github.com/TriliumNext/Trilium) repository: + +* `docs/Developer Guide` contains Markdown documentation that can be modified either externally (using a Markdown editor, or internally using Trilium). +* `docs/Release Notes` is also stored in Markdown format and can be freely edited. +* `docs/Script API` contains auto-generated files and thus must not be modified. +* `docs/User Guide` contains also Markdown-only documentation but must generally not be edited externally. + * The reason is that the `pnpm edit-docs:edit-docs` feature will not only import/export this documentation, but also generate the corresponding HTML documentation and meta structure in `src/public/app/doc_notes/en/User Guide`. + * It's theoretically possible to edit the Markdown files externally and then run `docs:edit` and trigger a change in order to build the documentation, but that would not be a very productive workflow. + +## Editing the documentation There are two ways to modify documentation: * Using a special mode of Trilium. * By manually editing the files. -### Using `docs:edit` +### Using the `edit-docs` app -To edit the documentation using Trilium, set up a working development environment and run the following commands: - -* On most operating systems, `npm run electron:switch` followed by `npm run docs:edit` -* On NixOS, `npm run docs:edit-nix`. - -> [!NOTE] -> `npm run docs:edit` acts very similar to `npm run electron:start` in the sense that you cannot both be editing documentation and starting a server. Using both `npm run electron:start` and `docs:edit` is possible, since they are using the same Electron instance. +To edit the documentation using Trilium, set up a working development environment via Environment Setup and run the following command: `pnpm edit-docs:edit-docs`. How it works: @@ -50,24 +53,30 @@ Important aspects to consider: * The Trilium import/export mechanism is not perfect, so if you make some modifications to the documentation using `docs:edit`, at the next import/export/import cycle some whitespace might get thrown in. It's generally safe to commit the changes as-is. * Since we are importing Markdown, editing HTML and then exporting the HTML back to Markdown there might be some edge cases where the formatting is not properly preserved. Try to identify such cases and report them in order to get them fixed (this will benefit also the users). -## Location of the documentation +## Automation -All documentation is stored in the [Notes](https://github.com/TriliumNext/Trilium) repository: +The documentation is built via `apps/build-docs`: -* `docs/Developer Guide` contains Markdown documentation that can be modified either externally (using a Markdown editor, or internally using Trilium). -* `docs/Release Notes` is also stored in Markdown format and can be freely edited. -* `docs/Script API` contains auto-generated files and thus must not be modified. -* `docs/User Guide` contains also Markdown-only documentation but must generally not be edited externally. - * The reason is that the `docs:edit` feature will not only import/export this documentation, but also generate the corresponding HTML documentation and meta structure in `src/public/app/doc_notes/en/User Guide`. - * It's theoretically possible to edit the Markdown files externally and then run `docs:edit` and trigger a change in order to build the documentation, but that would not be a very productive workflow. +1. The output directory is cleared. +2. The User Guide and the Developer Guide are built. + 1. The documentation from the repo is archived and imported into an in-memory instance. + 2. The documentation is exported using the shared theme. +3. The API docs (internal and ETAPI) are statically rendered via Redocly. +4. The script API is generated via `typedoc` + +The `deploy-docs` workflow triggers the documentation build and uploads it to CloudFlare Pages. ## Updating the Script API As mentioned previously, the Script API is not manually editable since it is auto-generated using TypeDoc. -To update the API documentation, simply run `npm run docs:build`. Compare the changes (if any) and commit them. +To update the API documentation, simply run `pnpm docs:build`. Compare the changes (if any) and commit them. -Note that in order to simulate the environment a script would have, some fake source files (in the sense that they are only used for documentation) are being used as entrypoints for the documentation: +Note that in order to simulate the environment a script would have, some fake source files (in the sense that they are only used for documentation) are being used as entrypoints for the documentation. Look for `backend_script_entrypoint` and `frontend_script_entrypoint` in `apps/build-docs/src`. -* For back-end scripts, the script is located in `src/services/backend_script_entrypoint.ts`. -* For front-end scripts, the script is located in `src/public/app/services/frontend_script_entrypoint.ts`. \ No newline at end of file +## Building locally + +In the Git root: + +* Run `pnpm docs:build`. The built documentation will be available in `site` at Git root. +* To also run a webserver to test it, run `pnpm docs:preview` (this will not build the documentation) and navigate to `localhost:9000`. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Documentation/Documentation references in th.md b/docs/Developer Guide/Developer Guide/Documentation/Documentation references in th.md similarity index 69% rename from docs/Developer Guide/Developer Guide/Old documentation/Documentation/Documentation references in th.md rename to docs/Developer Guide/Developer Guide/Documentation/Documentation references in th.md index 1c9a9fea9..79c1bd80e 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Documentation/Documentation references in th.md +++ b/docs/Developer Guide/Developer Guide/Documentation/Documentation references in th.md @@ -13,6 +13,8 @@ https://triliumnext.github.io/Docs/Wiki/ There is a pattern of “?” buttons throughout the application which make use of the `data-help-page` attribute. Whenever these buttons are pressed, the user is redirected to the corresponding wiki page by prepending the wiki root URL to the `data-help-page` attribute. +### Deprecated `help-page` attribute + Since the current wiki has a different structure than the original, for example to link to [https://github.com/TriliumNext/Docs/blob/main/Wiki/tree-concepts.md](https://github.com/TriliumNext/Docs/blob/main/Wiki/tree-concepts.md) the `data-help-page` attribute must be set to `tree-concepts.md`. For links to headings, simply add the heading after the `.md`: `tree-concepts.md#prefix` @@ -20,4 +22,12 @@ For links to headings, simply add the heading after the `.md`: `tree-concepts.md You can identify those by looking for: * `.attr("data-help-page"` -* `data-help-page="` \ No newline at end of file +* `data-help-page="` + +### More modern `data-in-app-help` attribute + +Instead of opening in a web browser, this opens the help directly in the application in a split view. This is handled via the `data-in-app-help` attribute, where the value is the note ID of the help page without the `_help_` prefix. + +### React + +Use the `HelpButton` component in the same fashion as the `data-in-app-help` attribute. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Environment Setup.md b/docs/Developer Guide/Developer Guide/Environment Setup.md index f1d706429..95d14cd50 100644 --- a/docs/Developer Guide/Developer Guide/Environment Setup.md +++ b/docs/Developer Guide/Developer Guide/Environment Setup.md @@ -26,8 +26,11 @@ As a quick heads-up of some differences when compared to `npm`: Run `pnpm i` at the top of the `Notes` repository to install the dependencies. +> [!NOTE] +> Dependencies are kept up to date periodically in the project. Generally it's a good rule to do `pnpm i` after each `git pull` on the main branch. + ## IDE -Our recommended IDE for working on TriliumNext is Visual Studio Code (or VSCodium if you are looking for a fully open-source alternative). +Our recommended IDE for working on Trilium is Visual Studio Code (or VSCodium if you are looking for a fully open-source alternative). -By default we include a number of suggested extensions which should appear when opening the repository in VS Code. Most of the extensions are for integrating various technologies we are using such as Playwright and Vitest for testing and NX for mono-repo management. \ No newline at end of file +By default we include a number of suggested extensions which should appear when opening the repository in VS Code. Most of the extensions are for integrating various technologies we are using such as Playwright and Vitest for testing or for Internationalisation / Translations. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Build deliveries locally.md b/docs/Developer Guide/Developer Guide/Old documentation/Build deliveries locally.md deleted file mode 100644 index 31a6ee0e2..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Build deliveries locally.md +++ /dev/null @@ -1,32 +0,0 @@ -# Build deliveries locally -In the project root: - -| Platform | Architecture | Application | Build command | -| --- | --- | --- | --- | -| macOS | x86\_64 | Desktop / Electron app | `./bin/build-mac-x64.sh` | -| ARM 64 | Desktop / Electron app | `./bin/build-mac-arm64.sh` | | -| Linux | x86\_64 | Desktop / Electron app | `./bin/build-linux-x64.sh` | -| Server | `./bin/build-server.sh` | | | -| Windows | x86\_64 | Desktop / Electron app | `./bin/build-win-x64.sh` | - -Under NixOS the following `nix-shell` is needed: - -``` -nix-shell -p jq -``` - -For Linux builds: - -``` -nix-shell -p jq fakeroot dpkg -``` - -The resulting build will be in the `dist` directory under the project root. - -### Testing the Linux builds under NixOS - -
    Desktop clientServer
    $ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
    -[nix-shell] cd dist/trilium-linux-x64
    -[nix-shell] steam-run ./trilium
    $ NIXPKGS_ALLOW_UNFREE=1 nix-shell -p steam-run
    -[nix-shell] cd dist/trilium-linux-x64-server
    -[nix-shell] steam-run ./trilium.sh
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Build deliveries locally.clone.md b/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Build deliveries locally.clone.md deleted file mode 100644 index 3ee7c825b..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Build deliveries locally.clone.md +++ /dev/null @@ -1,2 +0,0 @@ -# Build deliveries locally -This is a clone of a note. Go to its [primary location](../Build%20deliveries%20locally.md). \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Documentation.md b/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Documentation.md deleted file mode 100644 index 672b64f7c..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Documentation.md +++ /dev/null @@ -1,34 +0,0 @@ -# Documentation -Development notes are published on [triliumnext.github.io/Notes](https://triliumnext.github.io/Notes) by the CI using GitHub Pages. - -The GitHub Pages deployment works by taking the files from the Notes repository, in the `docs` directory. - -## How it works - -There is a script that uses `wget` to download all the files from a share, that means: - -1. You must have a local instance of Trilium Notes server. -2. You must have the documentation imported, up to date and shared. - -Note that currently the documentation source file is not distributed (the note export), until a way is found to automate this process. Contact `eliandoran` should you require to obtain a copy of the documentation. - -## Setting up `.env` file - -Go to `bin/docs` and copy `.env.example` to `.env` and edit it: - -1. Change the `SHARE_PROTOCOL` to either `http` or `https` depending on your setup. -2. Change `SHARE_HOST` to match the domain name or the URL to the host (without the protocol or any slashes). - -Generally `ROOT_NOTE_ID` should not be changed since the note ID must match if the files were imported correctly. - -## Triggering a build - -Run: - -``` -./bin/docs/prepare.sh -``` - -This will attempt to download all the notes from the share URL and put them in `docs`, rewritten for GitHub Pages. - -Commit the results and follow the normal development process to push them. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Releasing a version.clone.md b/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Releasing a version.clone.md deleted file mode 100644 index 3e2019da0..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Releasing a version.clone.md +++ /dev/null @@ -1,2 +0,0 @@ -# Releasing a version -This is a clone of a note. Go to its [primary location](../Releasing%20a%20version.md). \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Running a development build.clone.md b/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Running a development build.clone.md deleted file mode 100644 index d56a46aea..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Building and deployment/Running a development build.clone.md +++ /dev/null @@ -1,2 +0,0 @@ -# Running a development build -This is a clone of a note. Go to its [primary location](../Running%20a%20development%20build.md). \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Dependency Management/Adding a new client library.md b/docs/Developer Guide/Developer Guide/Old documentation/Dependency Management/Adding a new client library.md deleted file mode 100644 index 64ffcf528..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Dependency Management/Adding a new client library.md +++ /dev/null @@ -1,116 +0,0 @@ -# Adding a new client library -In the past some libraries have been copy-pasted (and adapted if needed) to the repository. However, new libraries must be obtained exclusively through npm. - -The first step is to install the desired library. As an example we are going to install `i18next`: - -``` -npm i i18next -``` - -### Step 1. Understanding the structure of the import - -After installing the dependency, it's important to know how it's structured. You can do this by looking at the directory structure of the newly imported dependency: - -``` -$ tree node_modules/i18next -node_modules/i18next -├── dist -│ ├── cjs -│ │ └── i18next.js -│ ├── esm -│ │ ├── i18next.bundled.js -│ │ ├── i18next.js -│ │ └── package.json -│ └── umd -│ ├── i18next.js -│ └── i18next.min.js -├── i18next.js -├── i18next.min.js -├── index.d.mts -├── index.d.ts -├── index.js -├── index.v4.d.ts -├── LICENSE -├── package.json -├── README.md -└── typescript - ├── helpers.d.ts - ├── options.d.ts - ├── t.d.ts - └── t.v4.d.ts -``` - -Generally you should be looking for a `.min.js` file. Note that the `esm` and `cjs` variants generally don't work, we are looking for the classic, no module dependency. - -### Step 2. Exposing the library from the server - -The library must be delivered by the server and this is done via `src/routes/assets.ts`. In the `register` function, add a new entry near the bottom of the function: - -```javascript -app.use(`/${assetPath}/node_modules/i18next/`, persistentCacheStatic(path.join(srcRoot, "..", 'node_modules/i18next/'))); -``` - -### Step 3. Adding it to the library loader - -The library loader is a client module which is in charge of downloading the library from the server and importing it. The loader is located in `src/public/app/services/library_loader.js`. - -To add a new library, start by creating a constant for it, with the value pointing to the minified JS identified at the first step: - -```javascript -const I18NEXT = { - js: [ - "node_modules/i18next/i18next.min.js" - ] -}; -``` - -Then add it to the `export default` section: - -```diff - export default { - requireCss, - requireLibrary, - CKEDITOR, - CODE_MIRROR, - ESLINT, - RELATION_MAP, - PRINT_THIS, - CALENDAR_WIDGET, - KATEX, - WHEEL_ZOOM, - FORCE_GRAPH, - MERMAID, - EXCALIDRAW, -- MARKJS -+ MARKJS, -+ I18NEXT - } -``` - -### Step 4. Using the library - -To import the library, simply use the following mechanism: - -```diff -import library_loader from "./library_loader.js"; - -await library_loader.requireLibrary(library_loader.I18NEXT); -``` - -Make sure to replace `I18NEXT` with the library that was created at the previous steps. - -Note that because we are not using a module management mechanism such as ES Modules or Common.js modules, the `requireLibrary` method does not actually return anything.  - -To benefit from the library, it must export on its own an object in `window`. - -In the case of `i18next`, it sets `window.i18next` and that can be used directly: - -```diff -i18next.init({}); -``` - -### Step 5. Adding Electron support - -For Electron, the `node_modules` are copied as a separate step by `bin/copy-dist.ts`. - -Scroll all the way down to the `nodeModulesFolder` and append an entry for the newly added libraries. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Dependency Management/Having a simpler packaging sys.md b/docs/Developer Guide/Developer Guide/Old documentation/Dependency Management/Having a simpler packaging sys.md deleted file mode 100644 index 05271e390..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Dependency Management/Having a simpler packaging sys.md +++ /dev/null @@ -1,8 +0,0 @@ -# Having a simpler packaging system -The current build scripts are a bit complicated and maintaining them is not easy. - -[Electron Forge](https://www.electronforge.io/) seems more mature and has a boatload of features, including Flatpak, snaps, Windows installers & more. - -Have a look also at the [Plugins](https://www.electronforge.io/config/plugins) section since there are quite a few interesting things there as well. - -Afterwards consider running a new round of Reducing binary size, especially taking into consideration removing of the unnecessary locales. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Documentation_image.png b/docs/Developer Guide/Developer Guide/Old documentation/Documentation_image.png deleted file mode 100644 index 542bb7858..000000000 Binary files a/docs/Developer Guide/Developer Guide/Old documentation/Documentation_image.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Installation/Download latest nightly and in.md b/docs/Developer Guide/Developer Guide/Old documentation/Installation/Download latest nightly and in.md deleted file mode 100644 index 0d5f2a2e4..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Installation/Download latest nightly and in.md +++ /dev/null @@ -1,12 +0,0 @@ -# Download latest nightly and install it -On Ubuntu: - -``` -#!/usr/bin/env bash - -name=TriliumNotes-linux-x64-nightly.deb -rm -f $name* -wget https://github.com/TriliumNext/Trilium/releases/download/nightly/$name -sudo apt-get install ./$name -rm $name -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/Node.js, Electron and `better-.md b/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/Node.js, Electron and `better-.md deleted file mode 100644 index 93b94ab72..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/Node.js, Electron and `better-.md +++ /dev/null @@ -1,36 +0,0 @@ -# Node.js, Electron and `better-sqlite3` -## Node.js, Electron and `better-sqlite3` - -`better-sqlite3` requires a native module in order to work. In order to ease the installation process, prebuilt binaries are provided by the library developers. - -Trilium Next started with version [8.4.0](https://github.com/WiseLibs/better-sqlite3/releases/tag/v8.4.0) for `better-sqlite3` - -| | | | | -| --- | --- | --- | --- | -| `better-sqlite3` version | SQLite version | Node.js prebuilds | Electron.js prebuilds | -| 8.4.0 | <3.43.0 | v20 | ??? | -| 8.5.0 | v20 | v25 | | -| 8.5.1 | | v26 | | -| 8.5.2 | v20 (macOS + arm64) | | | -| 8.6.0 | 3.43.0 | | | -| 8.7.0 | 3.43.1 | | | -| 9.0.0 | 3.43.2 | | v27 | -| 9.1.0 | 3.44.0 | | | -| 9.1.1 | macOS + Alpine | | | -| 9.2.0 | 3.44.2 | | | -| 9.2.1 / 9.2.2 | | v28 | | -| 9.3.0 | 3.45.0 | | | -| 9.4.0 | 3.45.1 | | | -| 9.4.1 | Windows arm, arm64 | | | -| 9.4.2 | | 21 | | | -| 11.1.0 (prerelease) | | | v31 | -| 11.1.1 | | | | -| 11.1.2 | | | | \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/Testing compatibility.md b/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/Testing compatibility.md deleted file mode 100644 index 381326055..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/Testing compatibility.md +++ /dev/null @@ -1,15 +0,0 @@ -# Testing compatibility -| `better-sqlite3` version
    [Change log](https://github.com/WiseLibs/better-sqlite3/releases) | SQLite version
    [Change log](https://www.sqlite.org/changes.html) | Compatibility with upstream Trilium | -| --- | --- | --- | -| 8.4.0 | <3.43.0 | Compatible, same version. | -| 8.6.0 | 3.43.0 | | -| 8.7.0 | 3.43.1 | | -| 9.0.0 | 3.43.2 | | -| 9.1.0 + 9.1.1 | 3.44.0 | | -| 9.2.0 + 9.2.1 + 9.2.2 | 3.44.2 | | -| 9.3.0 | 3.45.0 | | -| 9.4.0, 9.4.1, 9.4.2, 9.4.3, 9.4.4, 9.4.5 | 3.45.1 | | -| 9.5.0 | 3.45.2 | | -| 9.6.0 / 10.0.0 | 3.45.3 | | -| 10.1.0 / 11.0.0 / 11.1.1 / 11.1.2 / 11.2.0 / 11.2.1 | 3.46.0 | | -| 11.3.0 | 3.46.1 | | \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/bettersqlite binaries.md b/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/bettersqlite binaries.md deleted file mode 100644 index 12fdd7e70..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Project maintenance/Updating dependencies/bettersqlite binaries.md +++ /dev/null @@ -1,41 +0,0 @@ -# bettersqlite binaries -### The native node bindings - -`better-sqlite3` has native Node bindings. With updates of `better-sqlite3`, but also of Electron and Node.js versions, these bindings need to be updated. - -Note that Electron and Node.js versions need different versions of these bindings, since Electron usually packs a different version of Node.js. - -During development, `npm install` tries to build or reuse prebuilt natives for the current Node.js version. This makes `npm run start-server` work out of the box. Trying to run `npm run start-electron` with these versions generally causes an error such as this: - -``` -Uncaught Exception: -Error: The module '/Users/elian/Projects/Notes/node_modules/better-sqlite3/build/Release/better_sqlite3.node' -was compiled against a different Node.js version using -NODE_MODULE_VERSION 108. This version of Node.js requires -NODE_MODULE_VERSION 116. Please try re-compiling or re-installing -the module (for instance, using `npm rebuild` or `npm install`). -``` - -### How the natives are handled - -Locally, this can be fixed by rebuilding the binaries, which is what `npm run switch-electron` does, which uses `electron-rebuild` under the hood. - -When the deliveries are built (see Build deliveries locally), it is not feasible to rebuild the dependencies since we are building for multiple platforms. Luckily, `better-sqlite3` provides these prebuilt binaries from us, available as artifacts on [their GitHub releases page](https://github.com/WiseLibs/better-sqlite3/releases/).  - -The build script manages the natives for `better-sqlite3` by keeping a copy of the `.node` file for every platform in `bin/better-sqlite3`. - -Whenever the version of `better-sqlite3` changes, the `.node` files must also be renewed based on their releases page. To simplify this process, a script was created in `bin/better-sqlite3/update.sh`. - -## How to update the natives - -The update script needs to know the version of Electron or Node.js for which to download the prebuilt binaries. - -If you get errors during download, check on the [releases page](https://github.com/WiseLibs/better-sqlite3/releases/) to ensure that this particular combination of Electron/Node actually exists for the given release. - -To determine the `NODE_MODULE_VERSION` that is required, look for `This version of Node.js requires` -`NODE_MODULE_VERSION` in the error when starting Trilium via: - -* `npm run start-electron` (or run any Electron [delivery](../../Build%20deliveries%20locally.md)), case in which the `ELECTRON_VERSION` variable needs to be changed. -* `npm run start-server` (or run the Linux server delivery), case in which the `NODE_VERSION` variable needs to be changed. - -Check which files got changed after running the update script and for each platform that got changed, test it locally via Build deliveries locally or via the CI. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Releasing a version.md b/docs/Developer Guide/Developer Guide/Old documentation/Releasing a version.md deleted file mode 100644 index 63b75ddec..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Releasing a version.md +++ /dev/null @@ -1,22 +0,0 @@ -# Releasing a version -On NixOS: - -``` -nix-shell -p dpkg fakeroot jq nodejs_20 -``` - -Then simply run from project root: - -``` -./bin/release.sh 1.2.3 -``` - -where `1.2.3` is the desired release version. - -If a version ends with `-beta`, it will automatically be marked as pre-release in GitHub. - -This will automatically generate a release in GitHub if everything goes according to plan. - -Note that the Windows installer is not automatically uploaded yet, it has to be taken from the [main workflow of the CI from the `develop` branch](Building%20and%20deployment/CI/Main.md). - -Make sure to check test the artifacts of the release. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Running a development build.md b/docs/Developer Guide/Developer Guide/Old documentation/Running a development build.md deleted file mode 100644 index 539dc3d03..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Running a development build.md +++ /dev/null @@ -1,89 +0,0 @@ -# Running a development build -As always, install the dependencies for the first time (and re-run whenever there are errors about missing dependencies): - -``` -npm install -``` - -## Run server - -Run with default settings: - -``` -npm run start-server -``` - -Run with custom port: - -``` -TRILIUM_PORT=8082 npm run start-server -``` - -## Run Electron - -Rebuild `better-sqlite3` dependency: - -``` -npm run switch-electron -``` - -Then run Electron: - -``` -npm run start-electron -``` - -To run Electron using the same data directory as the production version: - -``` -npm run start-electron-no-dir -``` - -When done, switch back the `better-sqlite3` dependency: - -``` -npm run switch-server -``` - -## Quick switch - -To start Electron without running `switch-electron` first: - -``` -npm run qstart-electron -``` - -Similarly, to start the server without running `switch-server` first: - -``` -npm run qstart-server -``` - -## Safe mode - -Safe mode is off by default, to enable it temporarily on a Unix shell, prepend the environment variable setting: - -``` -TRILIUM_SAFE_MODE=1 npm run start-server -``` - -To have the same behaviour on Windows, we would need to alter `package.json`: - -```diff --"start-electron": "npm run prepare-dist && cross-env TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./dist/electron-main.js --inspect=5858 .", -+"start-electron": "npm run prepare-dist && cross-env TRILIUM_SAFE_MODE=1 TRILIUM_DATA_DIR=./data TRILIUM_SYNC_SERVER_HOST=http://tsyncserver:4000 TRILIUM_ENV=dev electron ./dist/electron-main.js --inspect=5858 .", -``` - -## Running on NixOS - -When doing development, the Electron binary retrieved from NPM is not going to be compatible with NixOS, resulting in errors when trying to run it. To bypass this, there is a special command to run electron using `nix-shell`: - -``` -npm run start-electron-nix -``` - -Similarly to the original command, to use the same data directory as the production version: - -``` -npm run start-electron-no-dir-nix -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Server-side imports.md b/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Server-side imports.md deleted file mode 100644 index c19366cee..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Server-side imports.md +++ /dev/null @@ -1,16 +0,0 @@ -# Server-side imports -Trilium Notes allowed the use of Common.js module imports inside backend scripts, such as: - -``` -const isBetween = require('dayjs/plugin/isBetween') -api.dayjs.extend(isBetween) -``` - -For TriliumNext, the backend has been switched to use ESM which has a slightly more complicated syntax. Instead of `require` we now have `import` but which is asynchronous so it will require an `await`: - -``` -const isBetween = (await import("dayjs/plugin/isBetween")).default; -api.dayjs.extend(isBetween); -``` - -Note that `.default` is also usually needed to obtain the same behaviour as a CJS import. When in doubt, use `console.log` to see the output of the value returned by `await import`. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Widgets.md b/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Widgets.md deleted file mode 100644 index 57de0ad15..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Widgets.md +++ /dev/null @@ -1,33 +0,0 @@ -# Widgets -To create a basic widget, simply create a code note with type “JS frontend”. Add the `#widget` label in order for it to be loaded at startup. - -``` -const template = `
    `; - -class MyWidget extends api.BasicWidget { - get position() { return 1; } - get parentWidget() { return "left-pane" } - - doRender() { - this.$widget = $(template); - return this.$widget; - } -} - -module.exports = new MyWidget(); -``` - -`parentWidget()` can be given the following values: - -* `left-pane` - This renders the widget on the left side of the screen where the note tree lives. -* `center-pane` - This renders the widget in the center of the layout in the same location that notes and splits appear. -* `note-detail-pane` - This renders the widget _with_ the note in the center pane. This means it can appear multiple times with splits. -* `right-pane` - This renders the widget to the right of any opened notes. - -* * * - -Reference: - -* [https://trilium.rocks/X7pxYpiu0lgU](https://trilium.rocks/X7pxYpiu0lgU) -* [https://github.com/zadam/trilium/wiki/Widget-Basics](https://github.com/zadam/trilium/wiki/Widget-Basics) -* [https://github.com/zadam/trilium/wiki/Frontend-Basics](https://github.com/zadam/trilium/wiki/Frontend-Basics) \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Building the editor.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Building the editor.md deleted file mode 100644 index 940617026..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Building the editor.md +++ /dev/null @@ -1,21 +0,0 @@ -# Building the editor -First, make sure Environment setup is set up. - -## Trigger the build - -``` -cd packages/ckeditor5-build-trilium -yarn build -``` - -This will trigger a change in the `build` directory. - -## Copy the build artifact to the main repo - -Go to `packages/ckeditor5-build-balloon-trilium/build` and copy `ckeditor.js` and `ckeditor.js.map` to `libraries/ckeditor` in the `Notes` repository. - -An example shell command to copy it: - -``` -cp build/ckeditor.* ~/Projects/TriliumNext/Notes/libraries/ckeditor/ -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Environment setup.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Environment setup.md deleted file mode 100644 index 76819a12b..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Environment setup.md +++ /dev/null @@ -1,26 +0,0 @@ -# Environment setup -## Clone the repository - -To set up the repository: - -``` -git clone https://github.com/TriliumNext/trilium-ckeditor5.git -``` - -## Install dependencies - -First, install root dependencies: - -``` -cd trilium-ckeditor5 -yarn install -``` - -Secondly, install the Trilium build dependencies: - -``` -cd packages/ckeditor5-build-trilium -yarn install -``` - -To trigger the build, see Building the editor. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Updating to a newer version of.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Updating to a newer version of.md deleted file mode 100644 index 6e7808f67..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Updating to a newer version of.md +++ /dev/null @@ -1,65 +0,0 @@ -# Updating to a newer version of CKEditor -## Before updating - -Make sure that all the plugins are compatible with this version:  Versions and external plugins. If not, they will need to be updated to the same version as the one you are updating, by altering their `package.json`. - -If the plugin is external to the Trilium organisation, it needs to be forked first. - -## Environment setup - -The first step is to add the CKEditor source as a remote. This only needs to be done once. - -``` -git remote add upstream ssh://git@github.com/ckeditor/ckeditor5.git -git fetch upstream -``` - -## Update steps - -Due to how the repository is structured, updates to the CKEditor are a bit difficult. - -1. `git fetch upstream` -2. Pick a version and merge with it: `git merge -X theirs v99.2.0` -3. When there are complicated conflicts, sometimes it's easier to take everything from the target version instead, for a given path: `git checkout v99.2.0 -- "packages/ckeditor5-list/**"`. -4. Go in `packages/ckeditor5-build-trilium/package.json` and run `node sync-version.js` to update the `package.json` with the new versions. Review and commit the change. -5. Follow again the dependency setup in Environment setup, as they have changed. -6. [Run the build](Building%20the%20editor.md) and check that it works. - -## Final steps - -1. Start the TriliumNext server -2. If updated to a newer version of CKEditor, check type `CKEDITOR_VERSION` in the browser/Electron console to ensure that the correct version is used. -3. Do a basic sanity check as well. -4. Commit and push the change on both sides (in the `trilium-ckeditor5` repo and in the `Notes` repo). - -## Troubleshooting client side errors - -These errors might show up when testing the Trilium app: - -``` -ReferenceError: CKEditor is not defined -``` - -Usually this is a side effect of another error, check the logs carefully to see if there is any other related error (perhaps a `CKEditorError`). - -* * * - -``` -Uncaught error: Message: CKEditorError: ckeditor-duplicated-modules -``` - -Most likely cause is one of the external plugins is incompatible with this version. - -For example, to disable the Math plugin, go to `packages/ckeditor5-build-trilium/src/config.ts` and modify: - -```diff --import Math from '@triliumnext/ckeditor5-math/src/math'; --import AutoformatMath from '@triliumnext/ckeditor5-math/src/autoformatmath'; - -export const COMMON_PLUGINS = [ -- Math, -- AutoformatMath, -] -``` - -In this case, make sure to align the version of all the external plugins with the one you are updating to, usually by forking the external plugin and updating its versions. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Versions and external plugins.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Versions and external plugins.md deleted file mode 100644 index 2fe124c31..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Versions and external plugins.md +++ /dev/null @@ -1,8 +0,0 @@ -# Versions and external plugins -## External plugins - -| | | | -| --- | --- | --- | -| trilium-ckeditor5 | 43.2.0 | | -| `ckeditor5-math` | | See ckeditor5-math. | -| | | | \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math.md deleted file mode 100644 index 91b6b265f..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math.md +++ /dev/null @@ -1,29 +0,0 @@ -# ckeditor5-math -
    ckeditor5-math in action.
    - -A fork of [isaul32/ckeditor5-math](https://github.com/isaul32/ckeditor5-math), which is the CKEditor5 plugin which adds the math functionality. The fork was created to handle #297: Insert Math appears to be broken. - -## Development environment - -* Tested on Node.js 20. -* The package manager is yarn 1 (v1.22.22 is known to be working fine for it at the time of writing). - -Important commands: - -* To check if the code has any formatting issues: `yarn lint` -* To start a live preview: `yarn start` -* To run the tests: `yarn test` - * Note that this requires Chromium, on NixOS this can be achieved by running a `nix-shell -p chromium`, and running `CHROME_BIN=$(which chromium) yarn test` inside it. - -## 📦 Packages - -The built artifact of the plugin is released by the CI and available on the [GitHub NPM registry](https://github.com/TriliumNext/ckeditor5-math/pkgs/npm/ckeditor5-math). - -Note that due to limitations on GitHub's registry, it is not possible to install this package without setting up a personal access token (even though the package itself is public). See [missing note] for more information. - -## ⬆️ Integrating with CKEditor - -1. Release a new version: Release management & continuous integration -2. In `trilium-ckeditor5`, go to `packages/ckeditor5-build-trilium/package.json` in the CKEditor repository and change the dependency of `@triliumnext/ckeditor5-math` to the newly released version. -3. Run `yarn install`. -4. Proceed with Building the editor to integrate everything into TriliumNext and then commit the change. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Release management & continuou.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Release management & continuou.md deleted file mode 100644 index 1511f4bfc..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Release management & continuou.md +++ /dev/null @@ -1,16 +0,0 @@ -# Release management & continuous integration -To automate the release process, a GitHub workflow has been added which builds the package and releases it over to GitHub NPM registry. - -The workflow publishes a release whenever a tag with the correct format is pushed. - -The steps are as follows: - -1. Ensure that the source code is clean and ready for a release. -2. Go to `package.json` and bump the `version` field. -3. Commit the changes. -4. Tag the commit with `v1.2.3`, with the correct version number. -5. Push the changes. - -Then follow the CI and it should indicate success. Afterwards, check the [package](https://github.com/TriliumNext/ckeditor5-math/pkgs/npm/ckeditor5-math)section to ensure that the package is in the “Recent Versions” section. - -If the changes could benefit upstream, consider opening a pull request with the changes there as well. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Updating with upstream.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Updating with upstream.md deleted file mode 100644 index b69003358..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Updating with upstream.md +++ /dev/null @@ -1,21 +0,0 @@ -# Updating with upstream -If there was a change in the upstream repository ([isaul32/ckeditor5-math](https://github.com/isaul32/ckeditor5-math)), it can be integrated as follows: - -1. Add the upstream as remote (`git remote add upstream ssh://git@github.com/isaul32/ckeditor5-math.git`). -2. Fetch the changes: `git fetch upstream` -3. Merge with a tag: `git merge v43.1.2` -4. Solve the conflict in `package.json` by: - 1. Taking the same version as the upcoming one and appending `-hotfix1`. - 2. Keeping the `@triliumnext/ckeditor5-math` name. -5. Install dependencies: `yarn install` -6. Check that the build works via `yarn prepublishOnly`. -7. Commit the changes, push them. -8. Release a version with Release management & continuous integration. - -## CI job not triggered after pushing all the upstream tags - -If the CI job was not triggered, you might have accidentally pushed a lot of tags using `git push --tags`. Manually delete the tag and push it again: - -```diff -git push -d origin v43.1.2-hotfix1 && git push --tags -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/1_Setting up authentication_.png b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/1_Setting up authentication_.png deleted file mode 100644 index 020472c6d..000000000 Binary files a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/1_Setting up authentication_.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Running tests.md b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Running tests.md deleted file mode 100644 index 3ab98a39c..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Running tests.md +++ /dev/null @@ -1,38 +0,0 @@ -# Running tests -## First-time run - -Before starting Playwright, it has to be installed locally via: - -``` -npx playwright install -``` - -## Starting the integration test server - -There are two types of integration test servers: - -* `npm run integration-mem-db` will run a server with dev mode disabled. - * This is usually what the end user will see when accessing a server instance. - * It will not test the Electron/desktop side of the application. - * Changes to the public scripts will not take effect until running `npm run webpack`. -* `npm run integration-mem-db-dev` will run a server with dev mode enabled. - * This is usually what a dev sees when running `npm run start-server`. - * The difference with the production one is that the assets are loaded directly from files and as such it does not require `npm run webpack` to see changes. - -Either options will open up a server on [localhost:8082](http://localhost:8082) that can be accessed either manually via the browser or via Playwright. - -When asked for a password, the password is `demo1234`. - -## Starting the interactive test runner - -After starting the integration test server, to run the Playwright UI, run in the terminal: - -``` -npx playwright test --ui -``` - -It is also possible to run the interactive code generator instead: - -``` -npx playwright codegen -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication.md b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication.md deleted file mode 100644 index 4df7880fe..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication.md +++ /dev/null @@ -1,12 +0,0 @@ -# Setting up authentication -There is a setup test that stores the authentication token so that it can be reused throughout all the tests. - -If tests fail due to being stuck on login, then it must be run. - -To run it manually press “all” near the “Status:” text on top-left of the window - -
    - -Then check “setup” and look for `auth.setup.ts` and press its corresponding Run button: - -
    \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication_.png b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication_.png deleted file mode 100644 index 4b260dfbc..000000000 Binary files a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication_.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Project Structure.md b/docs/Developer Guide/Developer Guide/Project Structure.md index ff0c954a2..82688cf2a 100644 --- a/docs/Developer Guide/Developer Guide/Project Structure.md +++ b/docs/Developer Guide/Developer Guide/Project Structure.md @@ -1,5 +1,5 @@ # Project Structure -As the application grew in complexity, our build system was growing even more difficult to maintain and was spread across multiple repositories. As such we have decided to use a mono-repo approach, and to do so we chose to have NX manage our mono-repo. +As the application grew in complexity, we decided to switch to a monorepo based on `pnpm`. Our initial monorepo implementation used NX, but we've switched to pure `pnpm` workspaces and our own build scripts. ## Project structure @@ -12,45 +12,18 @@ The mono-repo is mainly structured in: * `packages`, containing dependencies used by one or more `apps`. * `commons`, containing shared code for all the apps. -## Working with NX - -### Running tasks via the CLI +## Working with the project For example to run the server instance: ``` -pnpm exec nx run server:serve +pnpm server:start ``` -NX has built-in cache support which should make development much faster. Sometimes, it can get in the way; to skip the cache simply append `--skip-nx-cache` to the command you are running. +## Running and building -### Running tasks using Visual Studio Code - -If you are using Visual Studio Code as your development tool for Trilium, consider using the NX Console. It allows running tasks/targets much easier via the dedicated tab. Right-click a target in the list for more options, such as bypassing the cache. - -## Important tasks - -Each application has a number of tasks (called _targets_ by NX). Here's a non-exhaustive list of the tasks that are useful during development. - -To run any of the task use `pnpm exec nx run project:task`, or use the Visual Studio Code integration as described above. - -* `client`: - * The client is not meant to be run by itself, despite being described as an app. See the documentation on the server instead. -* `server`: - * To run the server in development mode, run `client:serve` (which will only serve the public assets), followed by `server:serve` (which will proxy the assets of the client as well). The dev port remains the same as always, `8080`. - * To run the server in production mode (with its own copy of the assets), run `server:start-prod`. - * To build the server for Docker, run `docker-build` which will automatically build and tag the image if Docker is installed locally. - * Similarly, run `docker-start` to build and run the Docker image. -* `desktop`: - * To run the desktop, run `desktop:serve`. - * Unlike the server, this one does not require the client since it will automatically get a production copy of it. The only downside is that modifications to the code will only take effect after restarting the task. - -## Building packages - -Generally, the building process of a project generates a `dist` folder containing everything needed for production. To trigger a build run `pnpm nx build project` where `project` is the name of a project from either `apps` or `packages`. +Each application has a number of tasks. Here's a non-exhaustive list of the tasks that are useful during development. See Building. ## Managing dependencies across the mono-repo -We are using [pnpm workspaces](https://pnpm.io/workspaces) to manage the project structure, further augmented by NX which is described in a different section. - -The workspace configuration is in `pnpm-workspace.yaml` at project level but it generally should not be modified. \ No newline at end of file +We are using [pnpm workspaces](https://pnpm.io/workspaces) to manage the project structure. The workspace configuration is in `pnpm-workspace.yaml` at project level but it generally should not be modified. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing.md b/docs/Developer Guide/Developer Guide/Testing.md similarity index 77% rename from docs/Developer Guide/Developer Guide/Old documentation/Testing.md rename to docs/Developer Guide/Developer Guide/Testing.md index 95efd9919..a1f8a1983 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Testing.md +++ b/docs/Developer Guide/Developer Guide/Testing.md @@ -17,17 +17,14 @@ Note that some integration tests rely on an in-memory database in order to funct ### REST API testing for the server -Some original work was done by Zadam in `/test-etapi`, using `.http` files. - -New effort using `vitest` and `supertest` to initialize the Express server and run assertions without having to make actual requests to the server. +API tests are handled via `vitest` and `supertest` to initialize the Express server and run assertions without having to make actual requests to the server. An important aspect is that we have access to the Express `app` which allows for interesting assertions such as checking the state of the server, registering debug middleware and so on. -One example is `src/share/routes.spec.ts`. +One example is `src/share/routes.spec.ts`, or for the ETAPI in `apps/server/spec/etapi`. These integration tests are run alongside unit tests. ## End-to-end testing -* This tests both the client and the server, by running the server and then using Playwright to query the state of the page. -* These can be found in `/e2e`. \ No newline at end of file +See e2e tests. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Testing/End-to-end tests.md b/docs/Developer Guide/Developer Guide/Testing/End-to-end tests.md new file mode 100644 index 000000000..387940158 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Testing/End-to-end tests.md @@ -0,0 +1,31 @@ +# End-to-end tests +* This tests both the client and the server, by running the server and then using Playwright to query the state of the page. +* These can be found in `apps/server-e2e` and `apps/desktop/e2e`. + +## First-time run + +Before starting Playwright, it has to be installed locally via: + +``` +pnpm playwright install +``` + +## Starting the integration test server + +Simply run `pnpm e2e` in one of the e2e projects. + +The integration server doesn't have authentication enabled to avoid login issues. + +## Starting the interactive test runner + +After starting the integration test server, to run the Playwright UI, run in the terminal: + +``` +pnpm playwright test --ui +``` + +It is also possible to run the interactive code generator instead: + +``` +pnpm playwright codegen +``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Special notes.md b/docs/Developer Guide/Developer Guide/Testing/Integration testing.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Special notes.md rename to docs/Developer Guide/Developer Guide/Testing/Integration testing.md diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Test database.md b/docs/Developer Guide/Developer Guide/Testing/Test database.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Test database.md rename to docs/Developer Guide/Developer Guide/Testing/Test database.md diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Troubleshooting/Error [TransformError] The pac.md b/docs/Developer Guide/Developer Guide/Troubleshooting/Error [TransformError] The pac.md similarity index 99% rename from docs/Developer Guide/Developer Guide/Old documentation/Troubleshooting/Error [TransformError] The pac.md rename to docs/Developer Guide/Developer Guide/Troubleshooting/Error [TransformError] The pac.md index 8a93a52be..82a5d93a8 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Troubleshooting/Error [TransformError] The pac.md +++ b/docs/Developer Guide/Developer Guide/Troubleshooting/Error [TransformError] The pac.md @@ -36,5 +36,5 @@ The solution is to remove `node_modules` and reinstall all dependencies: ``` rm -r node_modules -npm install +pnpm install ``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md b/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md index af8d7c70a..a048e3b4e 100644 --- a/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md +++ b/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md @@ -1,6 +1,6 @@ # better-sqlite3 was compiled against a different Node.js version This generally can happen when running the development version of either the `desktop` or `server`, but it should not happen as often as it used to. The reason is that `better-sqlite3` is a native dependency and has different builds for either the system's Node.js (as used by the `server`), or Electron's one (as used by the `desktop`). -To solve this, go to `apps/server` and run `pnpm rebuild`. For Electron this step is not necessary as it's already handled by the `rebuild-deps` NX target. +To solve this, go to `apps/server` and run `pnpm rebuild`. For Electron (`desktop`) this step generally not necessary, however `pnpm postinstall` should solve it. If you can reproduce this issue consistently, please open a bug report. \ No newline at end of file diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index 7c23b54d6..a38998354 100644 --- a/docs/User Guide/!!!meta.json +++ b/docs/User Guide/!!!meta.json @@ -55,7 +55,7 @@ "name": "iconClass", "value": "bx bx-help-circle", "isInheritable": false, - "position": 40 + "position": 30 } ], "format": "markdown", @@ -366,6 +366,41 @@ "format": "markdown", "dataFileName": "System Requirements.md", "attachments": [] + }, + { + "isClone": false, + "noteId": "Un4wj2Mak2Ky", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "poXkQfguuA0U", + "Un4wj2Mak2Ky" + ], + "title": "Nix flake", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "nix-flake", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxl-tux", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Nix flake.md", + "attachments": [] } ] }, @@ -1131,6 +1166,22 @@ "dataFileName": "Multi-Factor Authentication.md", "attachments": [] }, + { + "isClone": true, + "noteId": "Un4wj2Mak2Ky", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Un4wj2Mak2Ky" + ], + "title": "Nix flake", + "prefix": null, + "dataFileName": "Nix flake.clone.md", + "type": "text", + "format": "markdown", + "isExpanded": false + }, { "isClone": false, "noteId": "yeEaYqosGLSh", @@ -8814,17 +8865,24 @@ { "type": "relation", "name": "internalLink", - "value": "XpOYSgsLkTJy", + "value": "WWgeUaBb7UfC", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "0Ofbk1aSuVRu", + "value": "XpOYSgsLkTJy", "isInheritable": false, "position": 20 }, + { + "type": "relation", + "name": "internalLink", + "value": "0Ofbk1aSuVRu", + "isInheritable": false, + "position": 30 + }, { "type": "label", "name": "shareAlias", @@ -8838,13 +8896,6 @@ "value": "bx bx-selection", "isInheritable": false, "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "WWgeUaBb7UfC", - "isInheritable": false, - "position": 30 } ], "format": "markdown", @@ -12589,6 +12640,13 @@ "type": "text", "mime": "text/markdown", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "9qPsTWBorUhQ", + "isInheritable": false, + "position": 10 + }, { "type": "label", "name": "shareAlias", @@ -12602,13 +12660,6 @@ "value": "bx bx-extension", "isInheritable": false, "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "9qPsTWBorUhQ", - "isInheritable": false, - "position": 40 } ], "format": "markdown", @@ -13996,6 +14047,67 @@ "attachments": [] } ] + }, + { + "isClone": false, + "noteId": "64ZTlUPgEPtW", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "64ZTlUPgEPtW" + ], + "title": "Safe mode", + "notePosition": 250, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "safe-mode", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-virus-block", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Safe mode.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "HAIOFBoYIIdO", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "HAIOFBoYIIdO" + ], + "title": "Nightly release", + "notePosition": 260, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-moon", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Nightly release.md", + "attachments": [] } ] }, @@ -14532,152 +14644,238 @@ { "type": "label", "name": "iconClass", - "value": "bx bx-info-circle", + "value": "bx bx-window", "isInheritable": false, "position": 40 } ], "format": "markdown", "dataFileName": "Frontend Basics.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "es8OU2GuguFU", - "notePath": [ - "pOsGYCXsbNQG", - "CdNpE2pqjmI6", - "es8OU2GuguFU" - ], - "title": "Examples", - "notePosition": 50, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "label", - "name": "shareAlias", - "value": "examples", - "isInheritable": false, - "position": 20 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-code-alt", - "isInheritable": false, - "position": 30 - } - ], - "format": "markdown", "attachments": [], - "dirFileName": "Examples", + "dirFileName": "Frontend Basics", "children": [ { "isClone": false, - "noteId": "TjLYAo3JMO8X", + "noteId": "MgibgPcfeuGz", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "es8OU2GuguFU", - "TjLYAo3JMO8X" + "yIhgI5H7A2Sm", + "MgibgPcfeuGz" ], - "title": "\"New Task\" launcher button", + "title": "Custom Widgets", "notePosition": 10, "prefix": null, "isExpanded": false, "type": "text", - "mime": "text/html", + "mime": "text/markdown", "attributes": [ { - "type": "relation", - "name": "internalLink", - "value": "xYjQUYhpbUEW", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "xYmIYSP6wE3F", + "type": "label", + "name": "shareAlias", + "value": "custom-widget", "isInheritable": false, "position": 20 }, - { - "type": "relation", - "name": "internalLink", - "value": "6f9hih2hXXZk", - "isInheritable": false, - "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "zEY4DaJG4YT5", - "isInheritable": false, - "position": 40 - }, - { - "type": "relation", - "name": "internalLink", - "value": "m1lbrzyKDaRB", - "isInheritable": false, - "position": 50 - }, - { - "type": "relation", - "name": "internalLink", - "value": "s8alTXmpFR61", - "isInheritable": false, - "position": 60 - }, - { - "type": "relation", - "name": "internalLink", - "value": "yIhgI5H7A2Sm", - "isInheritable": false, - "position": 70 - }, { "type": "label", "name": "iconClass", - "value": "bx bx-task", + "value": "bx bxs-widget", "isInheritable": false, - "position": 80 - }, - { - "type": "label", - "name": "shareAlias", - "value": "new-task-button", - "isInheritable": false, - "position": 90 + "position": 30 } ], "format": "markdown", - "dataFileName": "New Task launcher button.md", - "attachments": [ + "dataFileName": "Custom Widgets.md", + "attachments": [], + "dirFileName": "Custom Widgets", + "children": [ { - "attachmentId": "9C2JA6tdtRpN", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "New Task launcher button_i.png" + "isClone": false, + "noteId": "YNxAqkI5Kg1M", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "YNxAqkI5Kg1M" + ], + "title": "Word count widget", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "6tZeKvSHEUiB", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s8alTXmpFR61", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "word-count", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "Word count widget.md", + "attachments": [ + { + "attachmentId": "JhM9NWfebzPi", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Word count widget_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "SynTBQiBsdYJ", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "SynTBQiBsdYJ" + ], + "title": "Widget Basics", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GLks18SNjxmC", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "widget-basics", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s8alTXmpFR61", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "Widget Basics.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "M8IppdwVHSjG", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "M8IppdwVHSjG" + ], + "title": "Right pane widget", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "right-pane-widget", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Right pane widget.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "VqGQnnPGnqAU", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "VqGQnnPGnqAU" + ], + "title": "CSS", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "css", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "CSS.md", + "attachments": [] } ] }, { "isClone": false, - "noteId": "7kZPMD0uFwkH", + "noteId": "es8OU2GuguFU", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "es8OU2GuguFU", - "7kZPMD0uFwkH" + "yIhgI5H7A2Sm", + "es8OU2GuguFU" ], - "title": "Downloading responses from Google Forms", + "title": "Examples", "notePosition": 20, "prefix": null, "isExpanded": false, @@ -14687,49 +14885,182 @@ { "type": "label", "name": "shareAlias", - "value": "responses-from-google-forms", + "value": "examples", "isInheritable": false, "position": 20 - } - ], - "format": "markdown", - "dataFileName": "Downloading responses from Goo.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "DL92EjAaXT26", - "notePath": [ - "pOsGYCXsbNQG", - "CdNpE2pqjmI6", - "es8OU2GuguFU", - "DL92EjAaXT26" - ], - "title": "Using promoted attributes to configure scripts", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ + }, { "type": "label", - "name": "shareAlias", - "value": "promoted-attributes-config", + "name": "iconClass", + "value": "bx bx-code-alt", "isInheritable": false, - "position": 20 + "position": 30 } ], "format": "markdown", - "dataFileName": "Using promoted attributes to c.md", - "attachments": [ + "attachments": [], + "dirFileName": "Examples", + "children": [ { - "attachmentId": "7P3jzVEa1mk7", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Using promoted attributes .png" + "isClone": false, + "noteId": "TjLYAo3JMO8X", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "es8OU2GuguFU", + "TjLYAo3JMO8X" + ], + "title": "\"New Task\" launcher button", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "xYjQUYhpbUEW", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xYmIYSP6wE3F", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "m1lbrzyKDaRB", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s8alTXmpFR61", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "yIhgI5H7A2Sm", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-task", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "new-task-button", + "isInheritable": false, + "position": 90 + } + ], + "format": "markdown", + "dataFileName": "New Task launcher button.md", + "attachments": [ + { + "attachmentId": "9C2JA6tdtRpN", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "New Task launcher button_i.png" + } + ] + }, + { + "isClone": false, + "noteId": "7kZPMD0uFwkH", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "es8OU2GuguFU", + "7kZPMD0uFwkH" + ], + "title": "Downloading responses from Google Forms", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "responses-from-google-forms", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Downloading responses from Goo.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "DL92EjAaXT26", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "es8OU2GuguFU", + "DL92EjAaXT26" + ], + "title": "Using promoted attributes to configure scripts", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "promoted-attributes-config", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Using promoted attributes to c.md", + "attachments": [ + { + "attachmentId": "7P3jzVEa1mk7", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Using promoted attributes .png" + } + ] } ] } @@ -14737,162 +15068,76 @@ }, { "isClone": false, - "noteId": "GPERMystNGTB", + "noteId": "SPirpZypehBG", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "GPERMystNGTB" + "SPirpZypehBG" ], - "title": "Events", - "notePosition": 70, + "title": "Backend scripts", + "notePosition": 30, "prefix": null, "isExpanded": false, "type": "text", - "mime": "text/markdown", + "mime": "text/html", "attributes": [ { - "type": "relation", - "name": "internalLink", - "value": "CdNpE2pqjmI6", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "c5xB8m4g2IY6", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "zEY4DaJG4YT5", + "type": "label", + "name": "shareAlias", + "value": "backend-basics", "isInheritable": false, "position": 30 }, - { - "type": "label", - "name": "shareAlias", - "value": "events", - "isInheritable": false, - "position": 10 - }, { "type": "label", "name": "iconClass", - "value": "bx bx-rss", + "value": "bx bx-server", "isInheritable": false, - "position": 20 + "position": 40 } ], "format": "markdown", - "dataFileName": "Events.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "MgibgPcfeuGz", - "notePath": [ - "pOsGYCXsbNQG", - "CdNpE2pqjmI6", - "MgibgPcfeuGz" - ], - "title": "Custom Widgets", - "notePosition": 80, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/markdown", - "attributes": [ - { - "type": "label", - "name": "shareAlias", - "value": "custom-widget", - "isInheritable": false, - "position": 20 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bxs-widget", - "isInheritable": false, - "position": 30 - } - ], - "format": "markdown", - "dataFileName": "Custom Widgets.md", "attachments": [], - "dirFileName": "Custom Widgets", + "dirFileName": "Backend scripts", "children": [ { "isClone": false, - "noteId": "YNxAqkI5Kg1M", + "noteId": "fZ2IGYFXjkEy", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "MgibgPcfeuGz", - "YNxAqkI5Kg1M" + "SPirpZypehBG", + "fZ2IGYFXjkEy" ], - "title": "Word count widget", + "title": "Server-side imports", "notePosition": 10, "prefix": null, "isExpanded": false, "type": "text", "mime": "text/html", "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "6tZeKvSHEUiB", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "6f9hih2hXXZk", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "s8alTXmpFR61", - "isInheritable": false, - "position": 30 - }, { "type": "label", "name": "shareAlias", - "value": "word-count", + "value": "server-imports", "isInheritable": false, - "position": 40 + "position": 20 } ], "format": "markdown", - "dataFileName": "Word count widget.md", - "attachments": [ - { - "attachmentId": "JhM9NWfebzPi", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Word count widget_image.png" - } - ] + "dataFileName": "Server-side imports.md", + "attachments": [] }, { "isClone": false, - "noteId": "SynTBQiBsdYJ", + "noteId": "GPERMystNGTB", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "MgibgPcfeuGz", - "SynTBQiBsdYJ" + "SPirpZypehBG", + "GPERMystNGTB" ], - "title": "Widget Basics", + "title": "Events", "notePosition": 20, "prefix": null, "isExpanded": false, @@ -14902,34 +15147,41 @@ { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "CdNpE2pqjmI6", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "BFs8mudNFgCS", + "value": "c5xB8m4g2IY6", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "GLks18SNjxmC", + "value": "zEY4DaJG4YT5", "isInheritable": false, "position": 30 }, { "type": "label", "name": "shareAlias", - "value": "widget-basics", + "value": "events", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-rss", "isInheritable": false, "position": 20 } ], "format": "markdown", - "dataFileName": "Widget Basics.md", + "dataFileName": "Events.md", "attachments": [] } ] @@ -14943,7 +15195,7 @@ "GLks18SNjxmC" ], "title": "Script API", - "notePosition": 90, + "notePosition": 100, "prefix": null, "isExpanded": false, "type": "text", @@ -15106,7 +15358,7 @@ "vElnKeDNPSVl" ], "title": "Logging", - "notePosition": 100, + "notePosition": 110, "prefix": null, "isExpanded": false, "type": "text", diff --git a/docs/User Guide/User Guide/AI.md b/docs/User Guide/User Guide/AI.md index d17f454c3..57302d77d 100644 --- a/docs/User Guide/User Guide/AI.md +++ b/docs/User Guide/User Guide/AI.md @@ -21,7 +21,7 @@ You will then need to set up the AI “provider” that you wish to use to creat In the following example, we're going to use our self-hosted Ollama instance to create the embeddings for our Notes. You can see additional documentation about installing your own Ollama locally in Installing Ollama. -To see what embedding models Ollama has available, you can check out [this search](https://ollama.com/search?c=embedding)on their website, and then `pull` whichever one you want to try out. As of 4/15/25, my personal favorite is `mxbai-embed-large`. +To see what embedding models Ollama has available, you can check out [this search](https://ollama.com/search?c=embedding) on their website, and then `pull` whichever one you want to try out. A popular choice is `mxbai-embed-large`. First, we'll need to select the Ollama provider from the tabs of providers, then we will enter in the Base URL for our Ollama. Since our Ollama is running on our local machine, our Base URL is `http://localhost:11434`. We will then hit the “refresh” button to have it fetch our models: diff --git a/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md b/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md index 20cf37c5e..13a4a5d94 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md +++ b/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md @@ -15,7 +15,7 @@ New tasks are created in the TODO note which has `~child:template` [relation](.. ### Attributes -Task template defines several [promoted attributes](../Attributes/Promoted%20Attributes.md) - todoDate, doneDate, tags, location. Importantly it also defines `~runOnAttributeChange` relation - [event](../../Scripting/Events.md) handler which is run on attribute change. This [script](../../Scripting.md) handles when e.g. we fill out the doneDate attribute - meaning the task is done and should be moved to "Done" note and removed from TODO, locations and tags. +Task template defines several [promoted attributes](../Attributes/Promoted%20Attributes.md) - todoDate, doneDate, tags, location. Importantly it also defines `~runOnAttributeChange` relation - [event](../../Scripting/Backend%20scripts/Events.md) handler which is run on attribute change. This [script](../../Scripting.md) handles when e.g. we fill out the doneDate attribute - meaning the task is done and should be moved to "Done" note and removed from TODO, locations and tags. ### New task button diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes.md b/docs/User Guide/User Guide/Advanced Usage/Attributes.md index 1cfe040d8..89d397e33 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes.md @@ -3,14 +3,14 @@ In Trilium, attributes are key-value pairs assigned to notes, providing additional metadata or functionality. There are two primary types of attributes: -1. Labels can be used for a variety of purposes, such as storing metadata or configuring the behaviour of notes. Labels are also searchable, enhancing note retrieval. +1. Labels can be used for a variety of purposes, such as storing metadata or configuring the behavior of notes. Labels are also searchable, enhancing note retrieval. For more information, including predefined labels, see Labels. 2. Relations define connections between notes, similar to links. These can be used for metadata and scripting purposes. For more information, including a list of predefined relations, see Relations. -These attributes play a crucial role in organizing, categorising, and enhancing the functionality of notes. +These attributes play a crucial role in organizing, categorizing, and enhancing the functionality of notes. ## Viewing the list of attributes diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md b/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md index 1a90f31cb..cb68dab93 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md @@ -39,4 +39,4 @@ This is a list of labels that Trilium natively supports. > [!TIP] > Some labels presented here end with a `*`. That means that there are multiple labels with the same prefix, consult the specific page linked in the description of that label for more information. -
    LabelDescription
    disableVersioningDisables automatic creation of Note Revisions for a particular note. Useful for e.g. large, but unimportant notes - e.g. large JS libraries used for scripting.
    versioningLimitLimits the maximum number of Note Revisions for a particular note, overriding the global settings.
    calendarRootMarks the note which should be used as root for Day Notes. Only one should be marked as such.
    archivedHides notes from default search results and dialogs. Archived notes can optionally be hidden in the Note Tree.
    excludeFromExportExcludes this note and its children when exporting.
    run, runOnInstance, runAtHourSee Events.
    disableInclusionScripts with this label won't be included into parent script execution.
    sorted

    Keeps child notes sorted by title alphabetically.

    When given a value, it will sort by the value of another label instead. If one of the child notes doesn't have the specified label, the title will be used for them instead.

    sortDirection

    If sorted is applied, specifies the direction of the sort:

    • ASC, ascending (default)
    • DESC, descending
    sortFoldersFirstIf sorted is applied, folders (notes with children) will be sorted as a group at the top, and the rest will be sorted.
    topIf sorted is applied to the parent note, keeps given note on top in its parent.
    hidePromotedAttributesHide Promoted Attributes on this note. Generally useful when defining inherited attributes, but the parent note doesn't need them.
    readOnlyMarks a note to be always be read-only, if it's a supported note (text, code, mermaid).
    autoReadOnlyDisabledDisables automatic read-only mode for the given note.
    appCssMarks CSS notes which are loaded into the Trilium application and can thus be used to modify Trilium's looks. See Custom app-wide CSS for more info.
    appThemeMarks CSS notes which are full Trilium themes and are thus available in Trilium options. See Theme development for more information.
    appThemeBaseSet to next, next-light, or next-dark to use the corresponding TriliumNext theme (auto, light or dark) as the base for a custom theme, instead of the legacy one. See Customize the Next theme for more information.
    cssClassValue of this label is then added as CSS class to the node representing given note in the Note Tree. This can be useful for advanced theming. Can be used in template notes.
    iconClassvalue of this label is added as a CSS class to the icon on the tree which can help visually distinguish the notes in the tree. Example might be bx bx-home - icons are taken from boxicons. Can be used in template notes.
    pageSizeSpecifies the number of items per page in Note List.
    customRequestHandlerSee Custom Request Handler.
    customResourceProviderSee Custom Resource Providers.
    widgetMarks this note as a custom widget which will be added to the Trilium component tree. See Custom Widgets for more information.
    searchHomeNew search notes will be created as children of this note (see Saved Search).
    workspace and related attributesSee Workspaces.
    inboxdefault inbox location for new notes - when you create a note using new note button in the sidebar, notes will be created as child notes in the note marked as with #inbox label.
    sqlConsoleHomeDefault location of SQL Console notes
    bookmarkedIndicates this note is a bookmark.
    bookmarkFolderNote with this label will appear in bookmarks as folder (allowing access to its children). See Bookmarks for more information.
    share*See the attribute reference in Sharing.
    displayRelations, hideRelationsComma delimited names of relations which should be displayed/hidden in a Relation Map (both the note type and the Note Map (Link map, Tree map) general functionality).
    titleTemplate

    Default title of notes created as children of this note. This value is evaluated as a JavaScript string and thus can be enriched with dynamic content via the injected now and parentNote variables.

    Examples:

    • \({parentNote.getLabel('authorName')}'s literary works
    • Log for \){now.format('YYYY-MM-DD HH:mm:ss')}
    • to mirror the parent's template.

    See Default Note Title for more info.

    templateThis note will appear in the selection of available template when creating new note. See Templates for more information.
    tocControls the display of the Table of contents for a given note. #toc or #toc=show to always display the table of contents, #toc=false to always hide it.
    colordefines color of the note in note tree, links etc. Use any valid CSS color value like 'red' or #a13d5f
    Note: this color may be automatically adjusted when displayed to ensure sufficient contrast with the background.
    keyboardShortcutDefines a keyboard shortcut which will immediately jump to this note. Example: 'ctrl+alt+e'. Requires frontend reload for the change to take effect.
    keepCurrentHoistingOpening this link won't change hoisting even if the note is not displayable in the current hoisted subtree.
    executeButtonTitle of the button which will execute the current code note
    executeDescriptionLonger description of the current code note displayed together with the execute button
    excludeFromNoteMapNotes with this label will be hidden from the Note Map.
    newNotesOnTopNew notes will be created at the top of the parent note, not on the bottom.
    hideHighlightWidgetHides the Highlights list widget
    hideChildrenOverviewHides the Note List for that particular note.
    printLandscapeWhen exporting to PDF, changes the orientation of the page to landscape instead of portrait.
    printPageSizeWhen exporting to PDF, changes the size of the page. Supported values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
    geolocationIndicates the latitude and longitude of a note, to be displayed in a Geo Map.
    calendar:*Defines specific options for the Calendar View.
    viewTypeSets the view of child notes (e.g. grid or list). See Note List for more information.
    \ No newline at end of file +
    LabelDescription
    disableVersioningDisables automatic creation of Note Revisions for a particular note. Useful for e.g. large, but unimportant notes - e.g. large JS libraries used for scripting.
    versioningLimitLimits the maximum number of Note Revisions for a particular note, overriding the global settings.
    calendarRootMarks the note which should be used as root for Day Notes. Only one should be marked as such.
    archivedHides notes from default search results and dialogs. Archived notes can optionally be hidden in the Note Tree.
    excludeFromExportExcludes this note and its children when exporting.
    run, runOnInstance, runAtHourSee Events.
    disableInclusionScripts with this label won't be included into parent script execution.
    sorted

    Keeps child notes sorted by title alphabetically.

    When given a value, it will sort by the value of another label instead. If one of the child notes doesn't have the specified label, the title will be used for them instead.

    sortDirection

    If sorted is applied, specifies the direction of the sort:

    • ASC, ascending (default)
    • DESC, descending
    sortFoldersFirstIf sorted is applied, folders (notes with children) will be sorted as a group at the top, and the rest will be sorted.
    topIf sorted is applied to the parent note, keeps given note on top in its parent.
    hidePromotedAttributesHide Promoted Attributes on this note. Generally useful when defining inherited attributes, but the parent note doesn't need them.
    readOnlyMarks a note to be always be read-only, if it's a supported note (text, code, mermaid).
    autoReadOnlyDisabledDisables automatic read-only mode for the given note.
    appCssMarks CSS notes which are loaded into the Trilium application and can thus be used to modify Trilium's looks. See Custom app-wide CSS for more info.
    appThemeMarks CSS notes which are full Trilium themes and are thus available in Trilium options. See Theme development for more information.
    appThemeBaseSet to next, next-light, or next-dark to use the corresponding TriliumNext theme (auto, light or dark) as the base for a custom theme, instead of the legacy one. See Customize the Next theme for more information.
    cssClassValue of this label is then added as CSS class to the node representing given note in the Note Tree. This can be useful for advanced theming. Can be used in template notes.
    iconClassvalue of this label is added as a CSS class to the icon on the tree which can help visually distinguish the notes in the tree. Example might be bx bx-home - icons are taken from boxicons. Can be used in template notes.
    pageSizeSpecifies the number of items per page in Note List.
    customRequestHandlerSee Custom Request Handler.
    customResourceProviderSee Custom Resource Providers.
    widgetMarks this note as a custom widget which will be added to the Trilium component tree. See Custom Widgets for more information.
    searchHomeNew search notes will be created as children of this note (see Saved Search).
    workspace and related attributesSee Workspaces.
    inboxdefault inbox location for new notes - when you create a note using new note button in the sidebar, notes will be created as child notes in the note marked as with #inbox label.
    sqlConsoleHomeDefault location of SQL Console notes
    bookmarkedIndicates this note is a bookmark.
    bookmarkFolderNote with this label will appear in bookmarks as folder (allowing access to its children). See Bookmarks for more information.
    share*See the attribute reference in Sharing.
    displayRelations, hideRelationsComma delimited names of relations which should be displayed/hidden in a Relation Map (both the note type and the Note Map (Link map, Tree map) general functionality).
    titleTemplate

    Default title of notes created as children of this note. This value is evaluated as a JavaScript string and thus can be enriched with dynamic content via the injected now and parentNote variables.

    Examples:

    • \({parentNote.getLabel('authorName')}'s literary works
    • Log for \){now.format('YYYY-MM-DD HH:mm:ss')}
    • to mirror the parent's template.

    See Default Note Title for more info.

    templateThis note will appear in the selection of available template when creating new note. See Templates for more information.
    tocControls the display of the Table of contents for a given note. #toc or #toc=show to always display the table of contents, #toc=false to always hide it.
    colordefines color of the note in note tree, links etc. Use any valid CSS color value like 'red' or #a13d5f
    Note: this color may be automatically adjusted when displayed to ensure sufficient contrast with the background.
    keyboardShortcutDefines a keyboard shortcut which will immediately jump to this note. Example: 'ctrl+alt+e'. Requires frontend reload for the change to take effect.
    keepCurrentHoistingOpening this link won't change hoisting even if the note is not displayable in the current hoisted subtree.
    executeButtonTitle of the button which will execute the current code note
    executeDescriptionLonger description of the current code note displayed together with the execute button
    excludeFromNoteMapNotes with this label will be hidden from the Note Map.
    newNotesOnTopNew notes will be created at the top of the parent note, not on the bottom.
    hideHighlightWidgetHides the Highlights list widget
    hideChildrenOverviewHides the Note List for that particular note.
    printLandscapeWhen exporting to PDF, changes the orientation of the page to landscape instead of portrait.
    printPageSizeWhen exporting to PDF, changes the size of the page. Supported values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
    geolocationIndicates the latitude and longitude of a note, to be displayed in a Geo Map.
    calendar:*Defines specific options for the Calendar View.
    viewTypeSets the view of child notes (e.g. grid or list). See Note List for more information.
    \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md b/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md index 454e7d007..6e1e9aa1f 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md @@ -43,7 +43,7 @@ These relations are supported and used internally by Trilium. | Label | Description | | --- | --- | -| `runOn*` | See Events | +| `runOn*` | See Events | | `template` | note's attributes will be inherited even without a parent-child relationship, note's content and subtree will be added to instance notes if empty. See documentation for details. | | `inherit` | note's attributes will be inherited even without a parent-child relationship. See Templates for a similar concept. See Attribute Inheritance in the documentation. | | `renderNote` | notes of type Render Note will be rendered using a code note (HTML or script) and it is necessary to point using this relation to which note should be rendered | diff --git a/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md b/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md index 52991f136..6d2c1e734 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md +++ b/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md @@ -14,7 +14,7 @@ const {secret, title, content} = req.body; if (req.method == 'POST' && secret === 'secret-password') { // notes must be saved somewhere in the tree hierarchy specified by a parent note. // This is defined by a relation from this code note to the "target" parent note - // alternetively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note) + // alternatively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note) const targetParentNoteId = api.currentNote.getRelationValue('targetNote'); const {note} = api.createTextNote(targetParentNoteId, title, content); @@ -37,7 +37,7 @@ This script note has also following two attributes: Let's test this by using an HTTP client to send a request: ``` -POST http://my.trilium.org/custom/create-note +POST http://your-trilium-server/custom/create-note Content-Type: application/json { @@ -70,7 +70,7 @@ For more information, see [Custom Resource Providers](Custom%20Resource%20Provi REST request paths often contain parameters in the URL, e.g.: ``` -http://my.trilium.org/custom/notes/123 +http://your-trilium-server/custom/notes/123 ``` The last part is dynamic so the matching of the URL must also be dynamic - for this reason the matching is done with regular expressions. Following `customRequestHandler` value would match it: @@ -85,4 +85,4 @@ Additionally, this also defines a matching group with the use of parenthesis whi const noteId = api.pathParams[0]; ``` -Often you also need query params (as in e.g. `http://my.trilium.org/custom/notes?noteId=123`), you can get those with standard express `req.query.noteId`. \ No newline at end of file +Often you also need query params (as in e.g. `http://your-trilium-server/custom/notes?noteId=123`), you can get those with standard express `req.query.noteId`. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Nightly release.md b/docs/User Guide/User Guide/Advanced Usage/Nightly release.md new file mode 100644 index 000000000..c9c2aac09 --- /dev/null +++ b/docs/User Guide/User Guide/Advanced Usage/Nightly release.md @@ -0,0 +1,34 @@ +# Nightly release +Nightly releases are versions built every day, containing the latest improvements and bugfixes, directly from the main development branch. These versions are generally useful in preparation for a release, to ensure that there are no significant bugs that need to be addressed first, or they can be used to confirm whether a particular bug is fixed or feature is well implemented. + +## Regarding the stability + +Despite being on a development branch, generally the main branch is pretty stable since PRs are tested before they are merged. If you notice any issues, feel free to report them either via a ticket or via the Matrix. + +## Downloading the nightly release manually + +Go to [github.com/TriliumNext/Trilium/releases/tag/nightly](https://github.com/TriliumNext/Trilium/releases/tag/nightly) and look for the artifacts starting with `TriliumNotes-main`. Choose the appropriate one for your platform (e.g. `windows-x64.zip`). + +Depending on your use case, you can either test the portable version or even use the installer. + +> [!NOTE] +> If you choose the installable version (e.g. the .exe on Windows), it will replace your stable installation. + +> [!IMPORTANT] +> By default, the nightly uses the same database as the production version. Generally you could easily downgrade if needed. However, if there are changes to the database or sync version, it will not be possible to downgrade without having to restore from a backup. + +## Automatically download and install the latest nightly + +This is pretty useful if you are a beta tester that wants to periodically update their version: + +On Ubuntu: + +``` +#!/usr/bin/env bash + +name=TriliumNotes-linux-x64-nightly.deb +rm -f $name* +wget https://github.com/TriliumNext/Trilium/releases/download/nightly/$name +sudo apt-get install ./$name +rm $name +``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Safe mode.md b/docs/User Guide/User Guide/Advanced Usage/Safe mode.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Safe mode.md rename to docs/User Guide/User Guide/Advanced Usage/Safe mode.md diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md b/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md index 70dd3632a..36aebff51 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md @@ -13,7 +13,7 @@ Note search enables you to find notes by searching for text in the title, conten To search for notes, click on the magnifying glass icon on the toolbar or press the keyboard [shortcut](../Keyboard%20Shortcuts.md). 1. Set the text to search for in the _Search string_ field. - 1. Apart from searching for words ad-literam, there is also the possibility to search for attributes or properties of notes. + 1. Apart from searching for words literally, there is also the possibility to search for attributes or properties of notes. 2. See the examples below for more information. 2. To limit the search to a note and its sub-children, set a note in _Ancestor_. 1. This value is also pre-filled if the search is triggered from a [hoisted note](Note%20Hoisting.md) or a [workspace](Workspaces.md). diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md index 8cb069e53..d461a3506 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md @@ -25,7 +25,7 @@ When you delete a note in Trilium, it is actually only marked for deletion (soft Within (by default) 7 days, it is possible to undelete these soft-deleted notes - open the Recent Changes dialog, and you will see a list of all modified notes including the deleted ones. Notes available for undeletion have a link to do so. This is kind of "trash can" functionality known from e.g. Windows. -Clicking an undelete will recover the note, it's content and attributes - note should be just as before being deleted. This action will also undelete note's children which have been deleted in the same action. +Clicking an undelete will recover the note, its content and attributes - note should be just as before being deleted. This action will also undelete note's children which have been deleted in the same action. To be able to undelete a note, it is necessary that deleted note's parent must be undeleted (otherwise there's no place where we can undelete it to). This might become a problem when you delete more notes in succession - the solution is then undelete in the reverse order of your deletion. diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md index 795e02602..d0ba7aecf 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md @@ -56,7 +56,7 @@ Right click either the _Available launchers_ or _Visible launchers_ sections and 2. Optionally, set a `keyboardShortcut` to trigger the launcher. 3. **Custom Widget** - Allows defining a custom widget to be rendered inside the launcher. See [Widget Basics](../../Scripting/Custom%20Widgets/Widget%20Basics.md) for more information. + Allows defining a custom widget to be rendered inside the launcher. See [Widget Basics](../../Scripting/Frontend%20Basics/Custom%20Widgets/Widget%20Basics.md) for more information. 4. **Spacers** Launchers that create some distance between other launchers for better visual distinction. diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md index 8fd7e37d2..5cbfc0ff3 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md @@ -20,7 +20,7 @@ If you are using the _Fixed_ formatting toolbar, all the formatting buttons for * As a more advanced use, it's possible to change the note type in order to modify the [source code](../../Advanced%20Usage/Note%20source.md) of a note. * _**Protect the note**_ toggles whether the current note is encrypted and accessible only by entering the protected session. See [Protected Notes](../Notes/Protected%20Notes.md) for more information. * _**Editable**_ changes whether the current note: - * Enters [read-only mode](../Notes/Read-Only%20Notes.md) automatically if the note is too big (default behaviour). + * Enters [read-only mode](../Notes/Read-Only%20Notes.md) automatically if the note is too big (default behavior). * Is always in read-only mode (however it can still be edited temporarily). * Is always editable, regardless of its size. * _**Bookmark**_ toggles the display of the current note into the [Launch Bar](Launch%20Bar.md) for easy access. See [Bookmarks](../Navigation/Bookmarks.md) for more information. diff --git a/docs/User Guide/User Guide/Collections.md b/docs/User Guide/User Guide/Collections.md index b97b4d952..3a9fc9728 100644 --- a/docs/User Guide/User Guide/Collections.md +++ b/docs/User Guide/User Guide/Collections.md @@ -1,5 +1,5 @@ # Collections -Collections are a unique type of notes that don't have a content, but instead display its child notes in various presentation methods. +Collections are a unique type of note that don't have content, but instead display their child notes in various presentation methods. ## Main collections @@ -28,7 +28,7 @@ To change the configuration of a collection or even switch to a different collec ## Archived notes -By default, [archived notes](Basic%20Concepts%20and%20Features/Notes/Archived%20Notes.md) will not be shown in collections. This behaviour can be changed by going to _Collection Properties_ in the Ribbon and checking _Show archived notes_. +By default, [archived notes](Basic%20Concepts%20and%20Features/Notes/Archived%20Notes.md) will not be shown in collections. This behavior can be changed by going to _Collection Properties_ in the Ribbon and checking _Show archived notes_. Archived notes will be generally indicated by being greyed out as opposed to the normal ones. diff --git a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md index c96a1e1cd..c8eb58ee5 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md +++ b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md @@ -16,4 +16,4 @@ Trilium offers various startup scripts to customize your experience: ## Synchronization -For Trilium desktp users who wish to synchronize their data with a server instance, refer to the Synchronization guide for detailed instructions. \ No newline at end of file +For Trilium desktop users who wish to synchronize their data with a server instance, refer to the Synchronization guide for detailed instructions. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Building and deployment/Nix flake.md b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Building and deployment/Nix flake.md rename to docs/User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake.md diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation.md index eb0054c91..ceae67f84 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation.md @@ -32,7 +32,7 @@ export TRILIUM_DATA_DIR=/home/myuser/data/my-trilium-data ### Disabling / Modifying the Upload Limit -If you're running into the 250MB limit imposed on the server by default, and you'd like to increase the upload limit, you can set the `TRILIUM_NO_UPLOAD_LIMIT` environment variable to `true` disable it completely: +If you're running into the 250MB limit imposed on the server by default, and you'd like to increase the upload limit, you can set the `TRILIUM_NO_UPLOAD_LIMIT` environment variable to `true` to disable it completely: ``` export TRILIUM_NO_UPLOAD_LIMIT=true diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.md new file mode 100644 index 000000000..1ea9ad997 --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.md @@ -0,0 +1,2 @@ +# Nix flake +This is a clone of a note. Go to its [primary location](../Desktop%20Installation/Nix%20flake.md). \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types.md b/docs/User Guide/User Guide/Note Types.md index 2e0540dcf..27958b4ab 100644 --- a/docs/User Guide/User Guide/Note Types.md +++ b/docs/User Guide/User Guide/Note Types.md @@ -1,5 +1,5 @@ # Note Types -One core features of Trilium is that it supports multiple types of notes, depending on the need. +One of the core features of Trilium is that it supports multiple types of notes, depending on the need. ## Creating a new note with a different type via the note tree diff --git a/docs/User Guide/User Guide/Scripting.md b/docs/User Guide/User Guide/Scripting.md index f5724f8a3..b7fad64dc 100644 --- a/docs/User Guide/User Guide/Scripting.md +++ b/docs/User Guide/User Guide/Scripting.md @@ -1,18 +1,18 @@ # Scripting Trilium supports creating Code notes, i.e. notes which allow you to store some programming code and highlight it. Special case is JavaScript code notes which can also be executed inside Trilium which can in conjunction with Script API provide extra functionality. -## Scripting +## Architecture Overview To go further I must explain basic architecture of Trilium - in its essence it is a classic web application - it has these two main components: * frontend running in the browser (using HTML, CSS, JavaScript) - this is mainly used to interact with the user, display notes etc. * backend running JavaScript code in node.js runtime - this is responsible for e.g. storing notes, encrypting them etc. -So we have frontend and backend, each with their own set of responsibilities, but their common feature is that they both run JavaScript code. Add to this the fact, that we're able to create JavaScript \[\[code notes\]\] and we're onto something. +So we have frontend and backend, each with their own set of responsibilities, but their common feature is that they both run JavaScript code. Add to this the fact, that we're able to create JavaScript code notes and we're onto something. ## Use cases -* "New Task" launcher button +* "New Task" launcher button ## Action handler @@ -34,7 +34,7 @@ You can see more scripting with explanation in Events. +See Events. ## Script API diff --git a/docs/User Guide/User Guide/Scripting/Events.md b/docs/User Guide/User Guide/Scripting/Backend scripts/Events.md similarity index 78% rename from docs/User Guide/User Guide/Scripting/Events.md rename to docs/User Guide/User Guide/Scripting/Backend scripts/Events.md index 6dbeeeba6..227acd5f1 100644 --- a/docs/User Guide/User Guide/Scripting/Events.md +++ b/docs/User Guide/User Guide/Scripting/Backend scripts/Events.md @@ -1,15 +1,15 @@ # Events -[Script](../Scripting.md) notes can be triggered by events. Note that these are backend events and thus relation need to point to the "JS backend" code note. +[Script](../../Scripting.md) notes can be triggered by events. Note that these are backend events and thus relation need to point to the "JS backend" code note. ## Global events Global events are attached to the script note via label. Simply create e.g. "run" label with some of these values and script note will be executed once the event occurs. -
    LabelDescription
    run

    Defines on which events script should run. Possible values are:

    • frontendStartup - when Trilium frontend starts up (or is refreshed), but not on mobile.
    • mobileStartup - when Trilium frontend starts up (or is refreshed), on mobile.
    • backendStartup - when Trilium backend starts up
    • hourly - run once an hour. You can use additional label runAtHour to specify at which hour, on the back-end.
    • daily - run once a day, on the back-end
    runOnInstanceSpecifies that the script should only run on a particular Trilium instance.
    runAtHourOn which hour should this run. Should be used together with #run=hourly. Can be defined multiple times for more runs during the day.
    +
    LabelDescription
    run

    Defines on which events script should run. Possible values are:

    • frontendStartup - when Trilium frontend starts up (or is refreshed), but not on mobile.
    • mobileStartup - when Trilium frontend starts up (or is refreshed), on mobile.
    • backendStartup - when Trilium backend starts up
    • hourly - run once an hour. You can use additional label runAtHour to specify at which hour, on the back-end.
    • daily - run once a day, on the back-end
    runOnInstanceSpecifies that the script should only run on a particular Trilium instance.
    runAtHourOn which hour should this run. Should be used together with #run=hourly. Can be defined multiple times for more runs during the day.
    ## Entity events -Other events are bound to some entity, these are defined as [relations](../Advanced%20Usage/Attributes.md) - meaning that script is triggered only if note has this script attached to it through relations (or it can inherit it). +Other events are bound to some entity, these are defined as [relations](../../Advanced%20Usage/Attributes.md) - meaning that script is triggered only if note has this script attached to it through relations (or it can inherit it). | Relation | Description | | --- | --- | diff --git a/docs/User Guide/User Guide/Scripting/Backend scripts/Server-side imports.md b/docs/User Guide/User Guide/Scripting/Backend scripts/Server-side imports.md new file mode 100644 index 000000000..ddc795aa0 --- /dev/null +++ b/docs/User Guide/User Guide/Scripting/Backend scripts/Server-side imports.md @@ -0,0 +1,11 @@ +# Server-side imports +Older versions of Trilium Notes allowed the use of Common.js module imports inside backend scripts, such as: + +``` +const isBetween = require('dayjs/plugin/isBetween') +api.dayjs.extend(isBetween) +``` + +For newer versions, Node.js imports are **not officially supported anymore**, since we've added a bundler which makes it more difficult to reuse dependencies. + +Theoretically it's still possible to use imports by manually setting up a `node_modules` in the server directory via `npm` or `pnpm`. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Examples/New Task launcher button.md b/docs/User Guide/User Guide/Scripting/Examples/New Task launcher button.md deleted file mode 100644 index 85e834b8b..000000000 --- a/docs/User Guide/User Guide/Scripting/Examples/New Task launcher button.md +++ /dev/null @@ -1,47 +0,0 @@ -# "New Task" launcher button -In this example we are going to extend the functionality of Task Manager showcase (which comes by default with Trilium) by adding a button in the Launch Bar  (![](New%20Task%20launcher%20button_i.png)) to create a new task automatically and open it. - -## Creating the note - -1. First, create a new Code note type with the _JS frontend_ language. -2. Define the `#run=frontendStartup` label in Attributes. - -## Content of the script - -Copy-paste the following script: - -```javascript -api.addButtonToToolbar({ - title: "New task", - icon: "task", - shortcut: "alt+n", - action: async () => { - const taskNoteId = await api.runOnBackend(() => { - const todoRootNote = api.getNoteWithLabel("taskTodoRoot"); - const resp = api.createTextNote(todoRootNote.noteId, "New task", "") - return resp.note.noteId; - }); - - await api.waitUntilSynced(); - await api.activateNewNote(taskNoteId); - } -}); -``` - -## Testing the functionality - -Since we set the script to be run on start-up, all we need to do is to [refresh the application](../../Troubleshooting/Refreshing%20the%20application.md). - -## Understanding how the script works - -
    api.addButtonToToolbar({
    -	title: "New task",
    -    icon: "task",
    -    shortcut: "alt+n",
    -    action: async () => {
    -    	// [...]
    -    }
    -});

    This uses the Front-end API to create a icon in the Launch Bar, by specifying:

    • A title
    • A corresponding boxicons icon (without the bx- prefix).
    • Optionally, a keyboard shortcut to assign to it.
    • The action, which will be executed when the button is pressed.
    const taskNoteId = await api.runOnBackend(() => {
    -    // Shown below.           
    -    return resp.note.noteId;
    -});
    • This portion of code is actually executed on the server (backend) and not on the client (i.e. browser).
      • The reason is that the creating notes is the responsibility of the server.
    • Here we can also see that it is possible to return results from the server execution and read them in the client (taskNoteId).
    const todoRootNote = api.getNoteWithLabel("taskTodoRoot");
    • Here we identify a note with the label #taskTodoRoot. This is how the Task Manager showcase knows where to place all the different tasks.
    • Normally this might return a null value if no such note could be identified, but error handling is outside the scope of this example. 
    const resp = api.createTextNote(todoRootNote.noteId, "New task", "")
    • We create a new child note within the to-do root note (first argument) with the title “New task" (second argument) and no content by default (third argument).
    await api.waitUntilSynced();
    • Back on the client, since we created a new note on the server, we now need to wait for the change to be reflected in the client.
    await api.activateNewNote(taskNoteId);
    • Since we know the ID of the newly created note, all we have to do now is to show this note to the user.
    \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Frontend Basics.md b/docs/User Guide/User Guide/Scripting/Frontend Basics.md index 2557deed7..13c47823d 100644 --- a/docs/User Guide/User Guide/Scripting/Frontend Basics.md +++ b/docs/User Guide/User Guide/Scripting/Frontend Basics.md @@ -54,4 +54,4 @@ Conversely to scripts, widgets do have some specific requirements in order to wo ### Tutorial -For more information on building widgets, take a look at [Widget Basics](Custom%20Widgets/Widget%20Basics.md). \ No newline at end of file +For more information on building widgets, take a look at [Widget Basics](Frontend%20Basics/Custom%20Widgets/Widget%20Basics.md). \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Custom Widgets.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.md similarity index 100% rename from docs/User Guide/User Guide/Scripting/Custom Widgets.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets.md diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Widgets/CSS.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Old documentation/Scripting/Widgets/CSS.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS.md diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Scripting/Widgets/Right pane widget.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Old documentation/Scripting/Widgets/Right pane widget.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md diff --git a/docs/User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics.md similarity index 75% rename from docs/User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics.md index b6e2a95ca..474cba983 100644 --- a/docs/User Guide/User Guide/Scripting/Custom Widgets/Widget Basics.md +++ b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics.md @@ -22,10 +22,10 @@ module.exports = new MyWidget(); To implement this widget: 1. Create a new `JS Frontend` note in Trilium and paste in the code above. -2. Assign the `#widget` [attribute](../../Advanced%20Usage/Attributes.md) to the [note](../../Basic%20Concepts%20and%20Features/Notes.md). +2. Assign the `#widget` [attribute](../../../Advanced%20Usage/Attributes.md) to the [note](../../../Basic%20Concepts%20and%20Features/Notes.md). 3. Restart Trilium or reload the window. -To verify that the widget is working, open the developer tools (`Cmd` + `Shift` + `I`) and run `document.querySelector("#my-widget")`. If the element is found, the widget is functioning correctly. If `undefined` is returned, double-check that the [note](../../Basic%20Concepts%20and%20Features/Notes.md) has the `#widget` [attribute](../../Advanced%20Usage/Attributes.md). +To verify that the widget is working, open the developer tools (`Cmd` + `Shift` + `I`) and run `document.querySelector("#my-widget")`. If the element is found, the widget is functioning correctly. If `undefined` is returned, double-check that the [note](../../../Basic%20Concepts%20and%20Features/Notes.md) has the `#widget` [attribute](../../../Advanced%20Usage/Attributes.md). ### Step 2: Adding an UI Element @@ -85,7 +85,7 @@ After reloading Trilium, the button should now appear at the bottom left of the ### Step 4: Adding User Interaction -Let’s make the button interactive by showing a message when it’s clicked. We'll use the `api.showMessage` method from the [Script API](../Script%20API.md). +Let’s make the button interactive by showing a message when it’s clicked. We'll use the `api.showMessage` method from the [Script API](../../Script%20API.md). ``` class MyWidget extends api.BasicWidget { @@ -108,4 +108,11 @@ class MyWidget extends api.BasicWidget { module.exports = new MyWidget(); ``` -Reload the application one last time. When you click the button, a "Hello World!" message should appear, confirming that your widget is fully functional. \ No newline at end of file +`parentWidget()` can be given the following values: + +* `left-pane` - This renders the widget on the left side of the screen where the note tree lives. +* `center-pane` - This renders the widget in the center of the layout in the same location that notes and splits appear. +* `note-detail-pane` - This renders the widget _with_ the note in the center pane. This means it can appear multiple times with splits. +* `right-pane` - This renders the widget to the right of any opened notes. + +[Reload](../../../Troubleshooting/Refreshing%20the%20application.md) the application one last time. When you click the button, a "Hello World!" message should appear, confirming that your widget is fully functional. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Custom Widgets/Word count widget.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.md similarity index 88% rename from docs/User Guide/User Guide/Scripting/Custom Widgets/Word count widget.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.md index ad8c1c351..8b6be5684 100644 --- a/docs/User Guide/User Guide/Scripting/Custom Widgets/Word count widget.md +++ b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.md @@ -1,8 +1,8 @@ # Word count widget > [!TIP] -> This widget is also present in new installations in the Demo Notes. +> This widget is also present in new installations in the Demo Notes. -Create a Code note of type JS frontend and **give it a** `#widget` **label**. +Create a Code note of type JS frontend and **give it a** `#widget` **label**. ``` /* @@ -82,7 +82,7 @@ class WordCountWidget extends api.NoteContextAwareWidget { module.exports = new WordCountWidget(); ``` -After you make changes it is necessary to [restart Trilium](../../Troubleshooting/Refreshing%20the%20application.md) so that the layout can be rebuilt. +After you make changes it is necessary to [restart Trilium](../../../Troubleshooting/Refreshing%20the%20application.md) so that the layout can be rebuilt. At the bottom of the note you can see the resulting widget: diff --git a/docs/User Guide/User Guide/Scripting/Custom Widgets/Word count widget_image.png b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget_image.png similarity index 100% rename from docs/User Guide/User Guide/Scripting/Custom Widgets/Word count widget_image.png rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget_image.png diff --git a/docs/User Guide/User Guide/Scripting/Examples/Downloading responses from Goo.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Downloading responses from Goo.md similarity index 100% rename from docs/User Guide/User Guide/Scripting/Examples/Downloading responses from Goo.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Downloading responses from Goo.md diff --git a/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button.md new file mode 100644 index 000000000..6740c047f --- /dev/null +++ b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button.md @@ -0,0 +1,47 @@ +# "New Task" launcher button +In this example we are going to extend the functionality of Task Manager showcase (which comes by default with Trilium) by adding a button in the Launch Bar  (![](New%20Task%20launcher%20button_i.png)) to create a new task automatically and open it. + +## Creating the note + +1. First, create a new Code note type with the _JS frontend_ language. +2. Define the `#run=frontendStartup` label in Attributes. + +## Content of the script + +Copy-paste the following script: + +```javascript +api.addButtonToToolbar({ + title: "New task", + icon: "task", + shortcut: "alt+n", + action: async () => { + const taskNoteId = await api.runOnBackend(() => { + const todoRootNote = api.getNoteWithLabel("taskTodoRoot"); + const resp = api.createTextNote(todoRootNote.noteId, "New task", "") + return resp.note.noteId; + }); + + await api.waitUntilSynced(); + await api.activateNewNote(taskNoteId); + } +}); +``` + +## Testing the functionality + +Since we set the script to be run on start-up, all we need to do is to [refresh the application](../../../Troubleshooting/Refreshing%20the%20application.md). + +## Understanding how the script works + +
    api.addButtonToToolbar({
    +	title: "New task",
    +    icon: "task",
    +    shortcut: "alt+n",
    +    action: async () => {
    +    	// [...]
    +    }
    +});

    This uses the Front-end API to create a icon in the Launch Bar, by specifying:

    • A title
    • A corresponding boxicons icon (without the bx- prefix).
    • Optionally, a keyboard shortcut to assign to it.
    • The action, which will be executed when the button is pressed.
    const taskNoteId = await api.runOnBackend(() => {
    +    // Shown below.           
    +    return resp.note.noteId;
    +});
    • This portion of code is actually executed on the server (backend) and not on the client (i.e. browser).
      • The reason is that the creating notes is the responsibility of the server.
    • Here we can also see that it is possible to return results from the server execution and read them in the client (taskNoteId).
    const todoRootNote = api.getNoteWithLabel("taskTodoRoot");
    • Here we identify a note with the label #taskTodoRoot. This is how the Task Manager showcase knows where to place all the different tasks.
    • Normally this might return a null value if no such note could be identified, but error handling is outside the scope of this example. 
    const resp = api.createTextNote(todoRootNote.noteId, "New task", "")
    • We create a new child note within the to-do root note (first argument) with the title “New task" (second argument) and no content by default (third argument).
    await api.waitUntilSynced();
    • Back on the client, since we created a new note on the server, we now need to wait for the change to be reflected in the client.
    await api.activateNewNote(taskNoteId);
    • Since we know the ID of the newly created note, all we have to do now is to show this note to the user.
    \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Examples/New Task launcher button_i.png b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button_i.png similarity index 100% rename from docs/User Guide/User Guide/Scripting/Examples/New Task launcher button_i.png rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button_i.png diff --git a/docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes .png b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes .png similarity index 100% rename from docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes .png rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes .png diff --git a/docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c.md similarity index 100% rename from docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c.md diff --git a/docs/User Guide/User Guide/Troubleshooting.md b/docs/User Guide/User Guide/Troubleshooting.md index f439d1185..3be0af47f 100644 --- a/docs/User Guide/User Guide/Troubleshooting.md +++ b/docs/User Guide/User Guide/Troubleshooting.md @@ -1,5 +1,5 @@ # Troubleshooting -As Trilium is currently in beta, encountering bugs is to be expected. +While Trilium is actively maintained and stable, encountering bugs is possible. ## General Quick Fix @@ -21,7 +21,7 @@ TRILIUM_START_NOTE_ID=root ./trilium ## Broken Script Prevents Application Startup -If a custom script causes Triliumto crash, and it is set as a startup script or in an active [custom widget](Scripting/Custom%20Widgets.md), start Triliumin "safe mode" to prevent any custom scripts from executing: +If a custom script causes Trilium to crash, and it is set as a startup script or in an active [custom widget](Scripting/Frontend%20Basics/Custom%20Widgets.md), start Triliumin "safe mode" to prevent any custom scripts from executing: ``` TRILIUM_SAFE_MODE=true ./trilium diff --git a/docs/index.md b/docs/index.md index 5bf104216..33bbff30d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,27 +21,27 @@ Trilium Notes is a powerful, feature-rich note-taking application designed for b
    -- :material-rocket-launch-outline: **[Quick Start Guide](User%20Guide/quick-start.md)** +- :material-rocket-launch-outline: **[Quick Start Guide](User%20Guide/User%20Guide/Quick%20Start.md)** Get up and running with Trilium in minutes -- :material-download: **[Installation](User%20Guide/installation.md)** +- :material-download: **[Desktop Installation](User%20Guide/User%20Guide/Installation%20%26%20Setup/Desktop%20Installation.md)** - Download and install Trilium on your platform + Download and install Trilium on your desktop -- :material-docker: **[Docker Setup](User%20Guide/docker.md)** +- :material-server: **[Server Installation](User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation.md)** - Deploy Trilium using Docker containers + Deploy Trilium as a server -- :material-book-open-variant: **[User Guide](User%20Guide/index.md)** +- :material-book-open-variant: **[User Guide](User%20Guide/User%20Guide.md)** Comprehensive guide to all features -- :material-code-braces: **[Script API](Script%20API/index.md)** +- :material-code-braces: **[Script API](Script%20API/index.html)** Automate and extend Trilium with scripting -- :material-wrench: **[Developer Guide](Developer%20Guide/index.md)** +- :material-wrench: **[Developer Guide](Developer%20Guide/Developer%20Guide/Environment%20Setup.md)** Contributing and development documentation @@ -80,14 +80,14 @@ Trilium Notes is a powerful, feature-rich note-taking application designed for b ## Getting Help -- **[FAQ](support/faq.md)** - Frequently asked questions -- **[Troubleshooting](support/troubleshooting.md)** - Common issues and solutions +- **[FAQ](User%20Guide/User%20Guide/FAQ.md)** - Frequently asked questions +- **[Troubleshooting](User%20Guide/User%20Guide/Troubleshooting.md)** - Common issues and solutions - **[Community Forum](https://github.com/triliumnext/trilium/discussions)** - Ask questions and share tips - **[Issue Tracker](https://github.com/triliumnext/trilium/issues)** - Report bugs and request features ## Contributing -Trilium is open-source and welcomes contributions! Check out our [Contributing Guide](Developer%20Guide/contributing.md) to get started. +Trilium is open-source and welcomes contributions! Check out our [GitHub repository](https://github.com/triliumnext/trilium) to get started. ## License diff --git a/package.json b/package.json index 8aabab52b..402997ce5 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "chore:update-build-info": "tsx ./scripts/update-build-info.ts", "chore:update-version": "tsx ./scripts/update-version.ts", "docs:build": "pnpm run --filter build-docs start", + "docs:preview": "pnpm http-server site -p 9000", "edit-docs:edit-docs": "pnpm run --filter edit-docs edit-docs", "edit-docs:edit-demo": "pnpm run --filter edit-docs edit-demo", "test:all": "pnpm test:parallel && pnpm test:sequential", @@ -42,26 +43,27 @@ "@playwright/test": "1.56.1", "@triliumnext/server": "workspace:*", "@types/express": "5.0.5", - "@types/node": "24.9.2", + "@types/node": "24.10.0", "@vitest/coverage-v8": "3.2.4", "@vitest/ui": "3.2.4", "chalk": "5.6.2", "cross-env": "10.1.0", "dpdm": "3.14.0", "esbuild": "0.25.12", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-config-prettier": "10.1.8", "eslint-plugin-playwright": "2.3.0", "eslint-plugin-react-hooks": "7.0.1", "happy-dom": "~20.0.0", + "http-server": "14.1.1", "jiti": "2.6.1", "jsonc-eslint-parser": "2.4.1", "react-refresh": "0.18.0", - "rollup-plugin-webpack-stats": "2.1.6", + "rollup-plugin-webpack-stats": "2.1.7", "tslib": "2.8.1", "tsx": "4.20.6", "typescript": "~5.9.0", - "typescript-eslint": "8.46.2", + "typescript-eslint": "8.46.3", "upath": "2.0.1", "vite": "7.1.12", "vite-plugin-dts": "~4.5.0", diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index bc32ffc98..7b75a79ba 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -25,11 +25,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", "ckeditor5": "47.1.0", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", diff --git a/packages/ckeditor5-admonition/tsconfig.json b/packages/ckeditor5-admonition/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-admonition/tsconfig.json +++ b/packages/ckeditor5-admonition/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 2835113b1..d3fdac60a 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -26,11 +26,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", "ckeditor5": "47.1.0", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", diff --git a/packages/ckeditor5-footnotes/tsconfig.json b/packages/ckeditor5-footnotes/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-footnotes/tsconfig.json +++ b/packages/ckeditor5-footnotes/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index cfbef699b..69f9ee4cf 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -28,11 +28,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", "ckeditor5": "47.1.0", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", diff --git a/packages/ckeditor5-keyboard-marker/tsconfig.json b/packages/ckeditor5-keyboard-marker/tsconfig.json index 015853699..089f1440a 100644 --- a/packages/ckeditor5-keyboard-marker/tsconfig.json +++ b/packages/ckeditor5-keyboard-marker/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 97573e4aa..85d1358cc 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -29,11 +29,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", "ckeditor5": "47.1.0", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", diff --git a/packages/ckeditor5-math/tsconfig.json b/packages/ckeditor5-math/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-math/tsconfig.json +++ b/packages/ckeditor5-math/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index c924a95b6..f83566bc4 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -28,11 +28,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", "ckeditor5": "47.1.0", - "eslint": "9.39.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", diff --git a/packages/ckeditor5-mermaid/tsconfig.json b/packages/ckeditor5-mermaid/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-mermaid/tsconfig.json +++ b/packages/ckeditor5-mermaid/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index dfb44d686..7bdc83796 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -50,6 +50,6 @@ "codemirror-lang-elixir": "4.0.0", "codemirror-lang-hcl": "0.1.0", "codemirror-lang-mermaid": "0.5.0", - "eslint-linter-browserify": "9.39.0" + "eslint-linter-browserify": "9.39.1" } } diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index 1fd56501e..fbd289fbc 100644 --- a/packages/share-theme/package.json +++ b/packages/share-theme/package.json @@ -32,11 +32,11 @@ "devDependencies": { "@digitak/esrun": "3.2.26", "@triliumnext/ckeditor5": "workspace:*", - "@typescript-eslint/eslint-plugin": "8.46.2", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", "dotenv": "17.2.3", "esbuild": "0.25.12", - "eslint": "9.39.0", + "eslint": "9.39.1", "highlight.js": "11.11.1", "typescript": "5.9.3" } diff --git a/packages/share-theme/tsconfig.json b/packages/share-theme/tsconfig.json index b53a558ad..acd79d0c8 100644 --- a/packages/share-theme/tsconfig.json +++ b/packages/share-theme/tsconfig.json @@ -10,6 +10,7 @@ "moduleResolution": "Node16", "target": "ES2022", "rootDir": "src", + "outDir": "out-tsc", "module": "Node16" }, "include": ["src/**/*"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 354fea61b..1054a98c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,8 +53,8 @@ importers: specifier: 5.0.5 version: 5.0.5 '@types/node': - specifier: 24.9.2 - version: 24.9.2 + specifier: 24.10.0 + version: 24.10.0 '@vitest/coverage-v8': specifier: 3.2.4 version: 3.2.4(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -74,20 +74,23 @@ importers: specifier: 0.25.12 version: 0.25.12 eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.39.0(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-playwright: specifier: 2.3.0 - version: 2.3.0(eslint@9.39.0(jiti@2.6.1)) + version: 2.3.0(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: 7.0.1 - version: 7.0.1(eslint@9.39.0(jiti@2.6.1)) + version: 7.0.1(eslint@9.39.1(jiti@2.6.1)) happy-dom: specifier: ~20.0.0 version: 20.0.10 + http-server: + specifier: 14.1.1 + version: 14.1.1 jiti: specifier: 2.6.1 version: 2.6.1 @@ -98,8 +101,8 @@ importers: specifier: 0.18.0 version: 0.18.0 rollup-plugin-webpack-stats: - specifier: 2.1.6 - version: 2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + specifier: 2.1.7 + version: 2.1.7(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) tslib: specifier: 2.8.1 version: 2.8.1 @@ -110,20 +113,20 @@ importers: specifier: ~5.9.0 version: 5.9.3 typescript-eslint: - specifier: 8.46.2 - version: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) upath: specifier: 2.0.1 version: 2.0.1 vite: specifier: 7.1.12 - version: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-dts: specifier: ~4.5.0 - version: 4.5.4(@types/node@24.9.2)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.10.0)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -152,8 +155,8 @@ importers: apps/client: dependencies: '@eslint/js': - specifier: 9.39.0 - version: 9.39.0 + specifier: 9.39.1 + version: 9.39.1 '@excalidraw/excalidraw': specifier: 0.18.0 version: 0.18.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -224,8 +227,8 @@ importers: specifier: 0.1.2 version: 0.1.2 debounce: - specifier: 2.2.0 - version: 2.2.0 + specifier: 3.0.0 + version: 3.0.0 draggabilly: specifier: 3.0.0 version: 3.0.0 @@ -284,8 +287,8 @@ importers: specifier: 10.27.2 version: 10.27.2 react-i18next: - specifier: 16.2.3 - version: 16.2.3(i18next@25.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: 16.2.4 + version: 16.2.4(i18next@25.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) reveal.js: specifier: 5.2.1 version: 5.2.1 @@ -304,7 +307,7 @@ importers: version: 5.0.0 '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -337,7 +340,7 @@ importers: version: 0.7.2 vite-plugin-static-copy: specifier: 3.1.4 - version: 3.1.4(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.1.4(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) apps/db-compare: dependencies: @@ -500,7 +503,7 @@ importers: version: 2.1.3(electron@38.5.0) '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@triliumnext/commons': specifier: workspace:* version: link:../../packages/commons @@ -634,8 +637,8 @@ importers: specifier: 1.11.19 version: 1.11.19 debounce: - specifier: 2.2.0 - version: 2.2.0 + specifier: 3.0.0 + version: 3.0.0 debug: specifier: 4.4.3 version: 4.4.3(supports-color@6.0.0) @@ -730,8 +733,8 @@ importers: specifier: 0.6.2 version: 0.6.2 openai: - specifier: 6.7.0 - version: 6.7.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12) + specifier: 6.8.0 + version: 6.8.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12) rand-token: specifier: 1.0.1 version: 1.0.1 @@ -745,8 +748,8 @@ importers: specifier: 2.17.0 version: 2.17.0 sax: - specifier: 1.4.1 - version: 1.4.1 + specifier: 1.4.2 + version: 1.4.2 serve-favicon: specifier: 2.5.1 version: 2.5.1 @@ -779,7 +782,7 @@ importers: version: 1.0.1 vite: specifier: 7.1.12 - version: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: specifier: 8.18.3 version: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -814,18 +817,18 @@ importers: specifier: 6.6.3 version: 6.6.3(preact@10.27.2) react-i18next: - specifier: 16.2.3 - version: 16.2.3(i18next@25.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: 16.2.4 + version: 16.2.4(i18next@25.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) devDependencies: '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-preact: specifier: 2.0.0 - version: 2.0.0(eslint@9.39.0(jiti@2.6.1)) + version: 2.0.0(eslint@9.39.1(jiti@2.6.1)) typescript: specifier: 5.9.3 version: 5.9.3 @@ -834,7 +837,10 @@ importers: version: 0.4.2 vite: specifier: 7.1.12 - version: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: + specifier: 4.0.6 + version: 4.0.6(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -877,16 +883,16 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 4.1.1 - version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: ~8.46.0 - version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.2 - version: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) @@ -894,11 +900,11 @@ importers: specifier: 47.1.0 version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.2.0(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 12.2.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) http-server: specifier: 14.1.1 version: 14.1.1 @@ -913,16 +919,16 @@ importers: version: 12.2.0(stylelint@16.25.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.0 version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -937,16 +943,16 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 4.1.1 - version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: ~8.46.0 - version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.2 - version: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) @@ -954,11 +960,11 @@ importers: specifier: 47.1.0 version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.2.0(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 12.2.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) http-server: specifier: 14.1.1 version: 14.1.1 @@ -973,16 +979,16 @@ importers: version: 12.2.0(stylelint@16.25.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.0 version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -997,16 +1003,16 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 4.1.1 - version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: ~8.46.0 - version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.2 - version: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1014,11 +1020,11 @@ importers: specifier: 47.1.0 version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.2.0(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 12.2.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) http-server: specifier: 14.1.1 version: 14.1.1 @@ -1033,16 +1039,16 @@ importers: version: 12.2.0(stylelint@16.25.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.0 version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1064,16 +1070,16 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 4.1.1 - version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: ~8.46.0 - version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.2 - version: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1081,11 +1087,11 @@ importers: specifier: 47.1.0 version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.2.0(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 12.2.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) http-server: specifier: 14.1.1 version: 14.1.1 @@ -1100,16 +1106,16 @@ importers: version: 12.2.0(stylelint@16.25.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.0 version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1131,16 +1137,16 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 4.1.1 - version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) + version: 4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: ~8.46.0 - version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.2 - version: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 3.2.4 - version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-istanbul': specifier: 3.2.4 version: 3.2.4(vitest@3.2.4) @@ -1148,11 +1154,11 @@ importers: specifier: 47.1.0 version: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-ckeditor5: specifier: '>=9.1.0' - version: 12.2.0(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + version: 12.2.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) http-server: specifier: 14.1.1 version: 14.1.1 @@ -1167,16 +1173,16 @@ importers: version: 12.2.0(stylelint@16.25.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.0 version: 9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1319,8 +1325,8 @@ importers: specifier: 0.5.0 version: 0.5.0 eslint-linter-browserify: - specifier: 9.39.0 - version: 9.39.0 + specifier: 9.39.1 + version: 9.39.1 packages/commons: {} @@ -1370,11 +1376,11 @@ importers: specifier: workspace:* version: link:../ckeditor5 '@typescript-eslint/eslint-plugin': - specifier: 8.46.2 - version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: 8.46.2 - version: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + specifier: 8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) dotenv: specifier: 17.2.3 version: 17.2.3 @@ -1382,8 +1388,8 @@ importers: specifier: 0.25.12 version: 0.25.12 eslint: - specifier: 9.39.0 - version: 9.39.0(jiti@2.6.1) + specifier: 9.39.1 + version: 9.39.1(jiti@2.6.1) highlight.js: specifier: 11.11.1 version: 11.11.1 @@ -2304,11 +2310,11 @@ packages: engines: {node: '>=14.14'} hasBin: true - '@emnapi/core@1.6.0': - resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==} + '@emnapi/core@1.7.0': + resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==} - '@emnapi/runtime@1.6.0': - resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==} + '@emnapi/runtime@1.7.0': + resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -2807,6 +2813,10 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.21.1': resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2831,8 +2841,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.0': - resolution: {integrity: sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==} + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/markdown@6.6.0': @@ -4992,6 +5002,9 @@ packages: '@ssddanbrown/codemirror-lang-twig@1.0.0': resolution: {integrity: sha512-7WIMIh8Ssc54TooGCY57WU2rKEqZZrcV2tZSVRPtd0gKYsrDEKCSLWpQjUWEx7bdgh3NKHUjq1O4ugIzI/+dwQ==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@stylistic/eslint-plugin@4.4.1': resolution: {integrity: sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5480,8 +5493,8 @@ packages: '@types/node@22.18.8': resolution: {integrity: sha512-pAZSHMiagDR7cARo/cch1f3rXy0AEXwsVsVH09FcyeJVAzCnGgmYis7P3JidtTUjyadhTeSo8TgRPswstghDaw==} - '@types/node@24.9.2': - resolution: {integrity: sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==} + '@types/node@24.10.0': + resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -5628,6 +5641,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/eslint-plugin@8.46.3': + resolution: {integrity: sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.46.3 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.46.2': resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5635,22 +5656,45 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/parser@8.46.3': + resolution: {integrity: sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.46.2': resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.46.3': + resolution: {integrity: sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.46.2': resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.46.3': + resolution: {integrity: sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.46.2': resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.46.3': + resolution: {integrity: sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.46.2': resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5658,16 +5702,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.46.3': + resolution: {integrity: sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.46.2': resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.46.3': + resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.46.2': resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.46.3': + resolution: {integrity: sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.46.2': resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5675,10 +5736,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.46.3': + resolution: {integrity: sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.46.2': resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.46.3': + resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -5731,6 +5803,9 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.6': + resolution: {integrity: sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==} + '@vitest/mocker@3.2.4': resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: @@ -5742,18 +5817,41 @@ packages: vite: optional: true + '@vitest/mocker@4.0.6': + resolution: {integrity: sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.6': + resolution: {integrity: sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==} + '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.6': + resolution: {integrity: sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==} + '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.6': + resolution: {integrity: sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==} + '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.6': + resolution: {integrity: sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==} + '@vitest/ui@3.2.4': resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} peerDependencies: @@ -5762,6 +5860,9 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.6': + resolution: {integrity: sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==} + '@volar/language-core@2.4.13': resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} @@ -6543,6 +6644,10 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + chai@6.2.0: + resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + engines: {node: '>=18'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -7408,9 +7513,9 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debounce@2.2.0: - resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} - engines: {node: '>=18'} + debounce@3.0.0: + resolution: {integrity: sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==} + engines: {node: '>=20'} debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} @@ -8013,8 +8118,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-linter-browserify@9.39.0: - resolution: {integrity: sha512-SmFk1DwXcC+p2IjHAouYjjJcAKAiSMlMrJgc8w2s1W3D00FM2sC6SHeCd8Axy1T5sB8oMVMt23GuCun8/UFo1Q==} + eslint-linter-browserify@9.39.1: + resolution: {integrity: sha512-XdoocZkDVe9svpVe1V9q0cW3pufacQ0z7Unhu4E4AaeHHxF4AZa5+HRHYMKO30NUKEQfDv+ITibXUNi1C6QGbQ==} eslint-plugin-ckeditor5-rules@12.2.0: resolution: {integrity: sha512-WgQP9aZo1N7bIDwwf2Wsnd0RpL20MAVxEehhYoFWy7HAMAnV3IliKuU3dsFA35O8cK4q7eKz7FiObwSRAfttQA==} @@ -8074,8 +8179,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.0: - resolution: {integrity: sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==} + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -8170,6 +8275,10 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + exponential-backoff@3.1.2: resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} @@ -10078,6 +10187,9 @@ packages: magic-string@0.30.18: resolution: {integrity: sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -10928,8 +11040,8 @@ packages: resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} engines: {node: '>=18'} - openai@6.7.0: - resolution: {integrity: sha512-mgSQXa3O/UXTbA8qFzoa7aydbXBJR5dbLQXCRapAOtoNT+v69sLdKMZzgiakpqhclRnhPggPAXoniVGn2kMY2A==} + openai@6.8.0: + resolution: {integrity: sha512-GQUpzb9FoNkh1wqJuDIQ8e/Sq8dW+T3GakG6wJTXBE8Lufx1GaUcgZd087vhm8f/MiOzsTEkfRamYxzJ/jOoiw==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -12320,8 +12432,8 @@ packages: peerDependencies: react: ^19.2.0 - react-i18next@16.2.3: - resolution: {integrity: sha512-O0t2zvmIz7nHWKNfIL+O/NTIbpTaOPY0vZov779hegbep3IZ+xcqkeVPKWBSXwzdkiv77q8zmq9toKIUys1x3A==} + react-i18next@16.2.4: + resolution: {integrity: sha512-pvbcPQ+YuQQoRkKBA4VCU9aO8dOgP/vdKEizIYXcAk3+AmI8yQKSJaCzxQQu4Kgg2zWZm3ax9KqHv8ItUlRY0A==} peerDependencies: i18next: '>= 25.5.2' react: '>= 16.8.0' @@ -12648,8 +12760,8 @@ packages: resolution: {integrity: sha512-EsoOi8moHN6CAYyTZipxDDVTJn0j2nBCWor4wRU45RQ8ER2qREDykXLr3Ulz6hBh6oBKCFTQIjo21i0FXNo/IA==} hasBin: true - rollup-plugin-stats@1.5.1: - resolution: {integrity: sha512-WXx9F3i57DLKkB8mt6Zw3jN9sS8YOqTsfvuOG8RW0D95Wn5KHt2e9POh8sYWODgmTsiKK0Nm54ZjxLnp7yeCDw==} + rollup-plugin-stats@1.5.2: + resolution: {integrity: sha512-3PtTLkgJ9zDaBITh92sysBxpaIJHSokODV4eo6ivnxfzDZxFPpTPooWHPse/X/Qi9A186Opu+hPycZNPxSgtnA==} engines: {node: '>=18'} peerDependencies: rolldown: ^1.0.0-beta.0 @@ -12675,8 +12787,8 @@ packages: peerDependencies: rollup: ^3.0.0||^4.0.0 - rollup-plugin-webpack-stats@2.1.6: - resolution: {integrity: sha512-njKotmo0lWIbrTKJ5CrIPk9DuDsQziOo73rE3aQIAhecJj5o0ECBbE0vxgMor37o6TQ/IEAK8pDxzs4CqLdIJw==} + rollup-plugin-webpack-stats@2.1.7: + resolution: {integrity: sha512-hg+lhXu/lOp+k9SR7Xi47+s/YJyYnSSfE7h3iuqwDthaFwxYRw9cztd7HLXrwDgW18CC1L7n9ueZBr/Te2BWUw==} engines: {node: '>=18'} peerDependencies: rolldown: ^1.0.0-beta.0 @@ -12879,8 +12991,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.4.2: + resolution: {integrity: sha512-FySGAa0RGcFiN6zfrO9JvK1r7TB59xuzCcTHOBXBNoKgDejlOQCR2KL/FGk3/iDlsqyYg1ELZpOmlg09B01Czw==} saxes@5.0.1: resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} @@ -13769,6 +13881,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tinyspy@4.0.3: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} @@ -13993,6 +14109,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + typescript-eslint@8.46.3: + resolution: {integrity: sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} @@ -14376,6 +14499,40 @@ packages: jsdom: optional: true + vitest@4.0.6: + resolution: {integrity: sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.6 + '@vitest/browser-preview': 4.0.6 + '@vitest/browser-webdriverio': 4.0.6 + '@vitest/ui': 4.0.6 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + void-elements@2.0.1: resolution: {integrity: sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==} engines: {node: '>=0.10.0'} @@ -15328,11 +15485,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.28.4(@babel/core@7.28.0)(eslint@9.39.0(jiti@2.6.1))': + '@babel/eslint-parser@7.28.4(@babel/core@7.28.0)(eslint@9.39.1(jiti@2.6.1))': dependencies: '@babel/core': 7.28.0 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 2.1.0 semver: 6.3.1 @@ -15938,8 +16095,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.1.0': dependencies: @@ -15962,8 +16117,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.1.0': dependencies: @@ -16326,7 +16479,7 @@ snapshots: es-toolkit: 1.39.5 protobufjs: 7.5.0 - '@ckeditor/ckeditor5-package-tools@4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5)': + '@ckeditor/ckeditor5-package-tools@4.1.1(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(bufferutil@4.0.9)(esbuild@0.25.12)(utf-8-validate@6.0.5)': dependencies: '@ckeditor/ckeditor5-dev-translations': 53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12)) '@ckeditor/ckeditor5-dev-utils': 53.2.0(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12)) @@ -16345,7 +16498,7 @@ snapshots: stylelint-config-ckeditor5: 2.0.1(stylelint@16.25.0(typescript@5.9.3)) terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12)) ts-loader: 9.5.4(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12)) - ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.0.4) + ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.0.4) typescript: 5.0.4 upath: 2.0.1 webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12) @@ -17308,13 +17461,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@emnapi/core@1.6.0': + '@emnapi/core@1.7.0': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.6.0': + '@emnapi/runtime@1.7.0': dependencies: tslib: 2.8.1 optional: true @@ -17337,7 +17490,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/types': 8.46.3 comment-parser: 1.4.1 esquery: 1.6.0 jsdoc-type-pratt-parser: 4.1.0 @@ -17576,13 +17729,15 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': dependencies: - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 @@ -17621,7 +17776,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.39.0': {} + '@eslint/js@9.39.1': {} '@eslint/markdown@6.6.0': dependencies: @@ -17720,7 +17875,7 @@ snapshots: '@file-type/xml@0.4.3': dependencies: - sax: 1.4.1 + sax: 1.4.2 strtok3: 10.2.2 '@floating-ui/core@1.6.9': @@ -17994,26 +18149,26 @@ snapshots: '@inquirer/core': 9.2.1 '@inquirer/type': 2.0.0 - '@inquirer/confirm@5.1.19(@types/node@24.9.2)': + '@inquirer/confirm@5.1.19(@types/node@24.10.0)': dependencies: - '@inquirer/core': 10.3.0(@types/node@24.9.2) - '@inquirer/type': 3.0.9(@types/node@24.9.2) + '@inquirer/core': 10.3.0(@types/node@24.10.0) + '@inquirer/type': 3.0.9(@types/node@24.10.0) optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 optional: true - '@inquirer/core@10.3.0(@types/node@24.9.2)': + '@inquirer/core@10.3.0(@types/node@24.10.0)': dependencies: '@inquirer/ansi': 1.0.1 '@inquirer/figures': 1.0.14 - '@inquirer/type': 3.0.9(@types/node@24.9.2) + '@inquirer/type': 3.0.9(@types/node@24.10.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 optional: true '@inquirer/core@9.2.1': @@ -18106,9 +18261,9 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.9(@types/node@24.9.2)': + '@inquirer/type@3.0.9(@types/node@24.10.0)': optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 optional: true '@isaacs/balanced-match@4.0.1': {} @@ -18540,23 +18695,23 @@ snapshots: dependencies: langium: 3.3.1 - '@microsoft/api-extractor-model@7.30.6(@types/node@24.9.2)': + '@microsoft/api-extractor-model@7.30.6(@types/node@24.10.0)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@24.9.2) + '@rushstack/node-core-library': 5.13.1(@types/node@24.10.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.8(@types/node@24.9.2)': + '@microsoft/api-extractor@7.52.8(@types/node@24.10.0)': dependencies: - '@microsoft/api-extractor-model': 7.30.6(@types/node@24.9.2) + '@microsoft/api-extractor-model': 7.30.6(@types/node@24.10.0) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@24.9.2) + '@rushstack/node-core-library': 5.13.1(@types/node@24.10.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3(@types/node@24.9.2) - '@rushstack/ts-command-line': 5.0.1(@types/node@24.9.2) + '@rushstack/terminal': 0.15.3(@types/node@24.10.0) + '@rushstack/ts-command-line': 5.0.1(@types/node@24.10.0) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -18593,8 +18748,8 @@ snapshots: '@napi-rs/wasm-runtime@1.0.7': dependencies: - '@emnapi/core': 1.6.0 - '@emnapi/runtime': 1.6.0 + '@emnapi/core': 1.7.0 + '@emnapi/runtime': 1.7.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -18877,18 +19032,18 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@prefresh/vite': 2.4.8(preact@10.27.2)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@prefresh/vite': 2.4.8(preact@10.27.2)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) debug: 4.4.1 picocolors: 1.1.1 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-prerender-plugin: 0.5.11(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-prerender-plugin: 0.5.11(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - preact - supports-color @@ -18901,7 +19056,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.8(preact@10.27.2)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@prefresh/vite@2.4.8(preact@10.27.2)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 @@ -18909,7 +19064,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.27.2 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -19612,7 +19767,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.0': optional: true - '@rushstack/node-core-library@5.13.1(@types/node@24.9.2)': + '@rushstack/node-core-library@5.13.1(@types/node@24.10.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -19623,23 +19778,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.3(@types/node@24.9.2)': + '@rushstack/terminal@0.15.3(@types/node@24.10.0)': dependencies: - '@rushstack/node-core-library': 5.13.1(@types/node@24.9.2) + '@rushstack/node-core-library': 5.13.1(@types/node@24.10.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 - '@rushstack/ts-command-line@5.0.1(@types/node@24.9.2)': + '@rushstack/ts-command-line@5.0.1(@types/node@24.10.0)': dependencies: - '@rushstack/terminal': 0.15.3(@types/node@24.9.2) + '@rushstack/terminal': 0.15.3(@types/node@24.10.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -20170,10 +20325,12 @@ snapshots: '@lezer/highlight': 1.2.1 '@lezer/lr': 1.4.2 - '@stylistic/eslint-plugin@4.4.1(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': + '@standard-schema/spec@1.0.0': {} + + '@stylistic/eslint-plugin@4.4.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -20315,7 +20472,7 @@ snapshots: '@types/appdmg@0.5.5': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 optional: true '@types/archiver@7.0.0': @@ -20333,11 +20490,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/bootstrap@5.2.10': dependencies: @@ -20351,7 +20508,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/responselike': 1.0.3 '@types/chai@5.2.2': @@ -20376,11 +20533,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.0 - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/connect@3.4.38': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/cookie-parser@1.4.10(@types/express@5.0.5)': dependencies: @@ -20393,7 +20550,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/cssnano@5.1.3(postcss@8.5.6)': dependencies: @@ -20552,7 +20709,7 @@ snapshots: '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -20587,7 +20744,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 optional: true '@types/geojson-vt@3.2.5': @@ -20599,7 +20756,7 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/hast@3.0.4': dependencies: @@ -20613,7 +20770,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/ini@4.1.1': {} @@ -20627,11 +20784,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/keyv@3.1.4': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/leaflet-gpx@1.3.8': dependencies: @@ -20681,11 +20838,11 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/node@16.9.1': {} @@ -20717,7 +20874,7 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@24.9.2': + '@types/node@24.10.0': dependencies: undici-types: 7.16.0 @@ -20745,13 +20902,13 @@ snapshots: '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/resolve@1.20.2': {} '@types/responselike@1.0.3': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/retry@0.12.2': {} @@ -20770,7 +20927,7 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/serve-favicon@2.5.7': dependencies: @@ -20783,7 +20940,7 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/send': 0.17.5 '@types/serve-static@2.2.0': @@ -20797,7 +20954,7 @@ snapshots: '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/statuses@2.0.6': optional: true @@ -20812,7 +20969,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 24.9.2 + '@types/node': 24.10.0 form-data: 4.0.4 '@types/supercluster@7.1.3': @@ -20828,7 +20985,7 @@ snapshots: '@types/through2@2.0.41': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 '@types/tmp@0.2.6': {} @@ -20866,18 +21023,18 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 optional: true - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -20886,14 +21043,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.3 + eslint: 9.39.1(jiti@2.6.1) + graphemer: 1.4.0 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.46.2 debug: 4.4.3(supports-color@6.0.0) - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.3 + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -20907,22 +21093,52 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.46.3(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 + debug: 4.4.3(supports-color@6.0.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.46.2': dependencies: '@typescript-eslint/types': 8.46.2 '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager@8.46.3': + dependencies: + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3(supports-color@6.0.0) - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3(supports-color@6.0.0) + eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -20930,6 +21146,8 @@ snapshots: '@typescript-eslint/types@8.46.2': {} + '@typescript-eslint/types@8.46.3': {} + '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) @@ -20946,13 +21164,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) + '@typescript-eslint/project-service': 8.46.3(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 + debug: 4.4.3(supports-color@6.0.0) + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.46.2 '@typescript-eslint/types': 8.46.2 '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -20962,6 +21207,11 @@ snapshots: '@typescript-eslint/types': 8.46.2 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.46.3': + dependencies: + '@typescript-eslint/types': 8.46.3 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@uploadcare/cname-prefix@6.17.0': {} @@ -20995,16 +21245,16 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser@3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser@3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.18 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) optionalDependencies: playwright: 1.56.1 @@ -21027,7 +21277,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -21046,9 +21296,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) transitivePeerDependencies: - supports-color @@ -21060,35 +21310,70 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/expect@4.0.6': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.2 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 + chai: 6.2.0 + tinyrainbow: 3.0.3 + + '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.18 optionalDependencies: - msw: 2.7.5(@types/node@24.9.2)(typescript@5.9.3) - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + msw: 2.7.5(@types/node@24.10.0)(typescript@5.9.3) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + + '@vitest/mocker@4.0.6(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 4.0.6 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.7.5(@types/node@24.10.0)(typescript@5.9.3) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.0.6': + dependencies: + tinyrainbow: 3.0.3 + '@vitest/runner@3.2.4': dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 + '@vitest/runner@4.0.6': + dependencies: + '@vitest/utils': 4.0.6 + pathe: 2.0.3 + '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 magic-string: 0.30.18 pathe: 2.0.3 + '@vitest/snapshot@4.0.6': + dependencies: + '@vitest/pretty-format': 4.0.6 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 + '@vitest/spy@4.0.6': {} + '@vitest/ui@3.2.4(vitest@3.2.4)': dependencies: '@vitest/utils': 3.2.4 @@ -21098,7 +21383,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -21106,6 +21391,11 @@ snapshots: loupe: 3.1.4 tinyrainbow: 2.0.0 + '@vitest/utils@4.0.6': + dependencies: + '@vitest/pretty-format': 4.0.6 + tinyrainbow: 3.0.3 + '@volar/language-core@2.4.13': dependencies: '@volar/source-map': 2.4.13 @@ -22060,6 +22350,8 @@ snapshots: loupe: 3.1.4 pathval: 2.0.1 + chai@6.2.0: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -23206,7 +23498,7 @@ snapshots: de-indent@1.0.2: {} - debounce@2.2.0: {} + debounce@3.0.0: {} debug@2.6.9: dependencies: @@ -23693,7 +23985,7 @@ snapshots: engine.io@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/cors': 2.8.19 - '@types/node': 24.9.2 + '@types/node': 24.10.0 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -24032,40 +24324,40 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-ckeditor5@12.2.0(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3): + eslint-config-ckeditor5@12.2.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint/js': 9.39.0 + '@eslint/js': 9.39.1 '@eslint/markdown': 6.6.0 - '@stylistic/eslint-plugin': 4.4.1(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.0(jiti@2.6.1) + '@stylistic/eslint-plugin': 4.4.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) eslint-plugin-ckeditor5-rules: 12.2.0 - eslint-plugin-mocha: 11.2.0(eslint@9.39.0(jiti@2.6.1)) + eslint-plugin-mocha: 11.2.0(eslint@9.39.1(jiti@2.6.1)) globals: 16.5.0 typescript: 5.9.3 - typescript-eslint: 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + typescript-eslint: 8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - supports-color - eslint-config-preact@2.0.0(eslint@9.39.0(jiti@2.6.1)): + eslint-config-preact@2.0.0(eslint@9.39.1(jiti@2.6.1)): dependencies: '@babel/core': 7.28.0 - '@babel/eslint-parser': 7.28.4(@babel/core@7.28.0)(eslint@9.39.0(jiti@2.6.1)) + '@babel/eslint-parser': 7.28.4(@babel/core@7.28.0)(eslint@9.39.1(jiti@2.6.1)) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@eslint/js': 9.39.0 - eslint: 9.39.0(jiti@2.6.1) - eslint-plugin-compat: 6.0.2(eslint@9.39.0(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.39.0(jiti@2.6.1)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.39.0(jiti@2.6.1)) + '@eslint/js': 9.39.1 + eslint: 9.39.1(jiti@2.6.1) + eslint-plugin-compat: 6.0.2(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1)) globals: 16.5.0 transitivePeerDependencies: - supports-color - eslint-config-prettier@10.1.8(eslint@9.39.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) - eslint-linter-browserify@9.39.0: {} + eslint-linter-browserify@9.39.1: {} eslint-plugin-ckeditor5-rules@12.2.0: dependencies: @@ -24077,45 +24369,45 @@ snapshots: validate-npm-package-name: 6.0.2 yaml: 2.8.1 - eslint-plugin-compat@6.0.2(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-compat@6.0.2(eslint@9.39.1(jiti@2.6.1)): dependencies: '@mdn/browser-compat-data': 5.7.6 ast-metadata-inferer: 0.8.1 browserslist: 4.26.2 caniuse-lite: 1.0.30001743 - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) find-up: 5.0.0 globals: 15.15.0 lodash.memoize: 4.1.2 semver: 7.7.2 - eslint-plugin-mocha@11.2.0(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-mocha@11.2.0(eslint@9.39.1(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) - eslint: 9.39.0(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + eslint: 9.39.1(jiti@2.6.1) globals: 15.15.0 - eslint-plugin-playwright@2.3.0(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-playwright@2.3.0(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) globals: 16.5.0 - eslint-plugin-react-hooks@5.2.0(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-hooks@7.0.1(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)): dependencies: '@babel/core': 7.28.0 '@babel/parser': 7.28.4 - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.1.12 zod-validation-error: 3.5.3(zod@4.1.12) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -24123,7 +24415,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -24153,15 +24445,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.0(jiti@2.6.1): + eslint@9.39.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.0 + '@eslint/js': 9.39.1 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 @@ -24274,6 +24566,8 @@ snapshots: expect-type@1.2.1: {} + expect-type@1.2.2: {} + exponential-backoff@3.1.2: {} exponential-backoff@3.1.3: {} @@ -25870,13 +26164,13 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -26502,6 +26796,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: dependencies: '@babel/parser': 7.28.4 @@ -27298,12 +27596,12 @@ snapshots: ms@2.1.3: {} - msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3): + msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.19(@types/node@24.9.2) + '@inquirer/confirm': 5.1.19(@types/node@24.10.0) '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -27378,7 +27676,7 @@ snapshots: needle@3.3.1: dependencies: iconv-lite: 0.6.3 - sax: 1.4.1 + sax: 1.4.2 optional: true negotiator@0.6.3: {} @@ -27733,7 +28031,7 @@ snapshots: is-inside-container: 1.0.0 wsl-utils: 0.1.0 - openai@6.7.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12): + openai@6.8.0(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12): optionalDependencies: ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) zod: 4.1.12 @@ -28967,7 +29265,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.9.2 + '@types/node': 24.10.0 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -29110,7 +29408,7 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 - react-i18next@16.2.3(i18next@25.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + react-i18next@16.2.4(i18next@25.6.0(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 @@ -29537,11 +29835,11 @@ snapshots: '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29 optional: true - rollup-plugin-stats@1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + rollup-plugin-stats@1.5.2(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) rollup-plugin-styles@4.0.0(rollup@4.40.0): dependencies: @@ -29570,13 +29868,13 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.40.0) rollup: 4.40.0 - rollup-plugin-webpack-stats@2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + rollup-plugin-webpack-stats@2.1.7(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - rollup-plugin-stats: 1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + rollup-plugin-stats: 1.5.2(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) rollup@4.40.0: dependencies: @@ -29817,7 +30115,7 @@ snapshots: '@parcel/watcher': 2.5.1 optional: true - sax@1.4.1: {} + sax@1.4.2: {} saxes@5.0.1: dependencies: @@ -30813,7 +31111,7 @@ snapshots: css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 - sax: 1.4.1 + sax: 1.4.2 swagger-jsdoc@6.2.8(openapi-types@12.1.3): dependencies: @@ -31032,6 +31330,8 @@ snapshots: tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@4.0.3: {} tldts-core@6.1.86: @@ -31140,14 +31440,14 @@ snapshots: typescript: 5.0.4 webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.25.12) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.0.4): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.9.2 + '@types/node': 24.10.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -31160,14 +31460,14 @@ snapshots: optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.9.2)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.0)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.9.2 + '@types/node': 24.10.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -31299,13 +31599,24 @@ snapshots: typescript: 5.9.3 yaml: 2.8.1 - typescript-eslint@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.39.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.0(jiti@2.6.1) + '@typescript-eslint/utils': 8.46.2(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -31561,13 +31872,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.2.4(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3(supports-color@6.0.0) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -31582,9 +31893,9 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.9.2)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.10.0)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.52.8(@types/node@24.9.2) + '@microsoft/api-extractor': 7.52.8(@types/node@24.10.0) '@rollup/pluginutils': 5.1.4(rollup@4.52.0) '@volar/typescript': 2.4.13 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -31595,27 +31906,27 @@ snapshots: magic-string: 0.30.17 typescript: 5.9.3 optionalDependencies: - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@3.1.4(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-static-copy@3.1.4(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 p-map: 7.0.3 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: svgo: 3.3.2 typescript: 5.9.3 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-prerender-plugin@0.5.11(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-prerender-plugin@0.5.11(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.18 @@ -31623,9 +31934,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.11 fdir: 6.5.0(picomatch@4.0.3) @@ -31634,7 +31945,7 @@ snapshots: rollup: 4.52.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.9.2 + '@types/node': 24.10.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.1.3 @@ -31645,11 +31956,11 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.9.2)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -31667,13 +31978,55 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.9.2 - '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.9.2)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.9.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@types/node': 24.10.0 + '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/ui': 3.2.4(vitest@3.2.4) + happy-dom: 20.0.10 + jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@4.0.6(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/ui@3.2.4)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + '@vitest/expect': 4.0.6 + '@vitest/mocker': 4.0.6(msw@2.7.5(@types/node@24.10.0)(typescript@5.9.3))(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.6 + '@vitest/runner': 4.0.6 + '@vitest/snapshot': 4.0.6 + '@vitest/spy': 4.0.6 + '@vitest/utils': 4.0.6 + debug: 4.4.3(supports-color@6.0.0) + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.10.0 '@vitest/ui': 3.2.4(vitest@3.2.4) happy-dom: 20.0.10 jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -32147,12 +32500,12 @@ snapshots: xml2js@0.5.0: dependencies: - sax: 1.4.1 + sax: 1.4.2 xmlbuilder: 11.0.1 xml2js@0.6.2: dependencies: - sax: 1.4.1 + sax: 1.4.2 xmlbuilder: 11.0.1 xmlbuilder@11.0.1: {}