diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 503e13909..40423c776 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -1,6 +1,4 @@ -# GitHub Actions workflow for deploying MkDocs documentation to Cloudflare Pages -# This workflow builds and deploys your MkDocs site when changes are pushed to main -name: Deploy MkDocs Documentation +name: Deploy Documentation on: # Trigger on push to main branch @@ -11,11 +9,8 @@ on: # Only run when docs files change paths: - 'docs/**' - - 'README.md' # README is synced to docs/index.md - - 'mkdocs.yml' - - 'requirements-docs.txt' - - '.github/workflows/deploy-docs.yml' - - 'scripts/fix-mkdocs-structure.ts' + - 'apps/edit-docs/**' + - 'packages/share-theme/**' # Allow manual triggering from Actions tab workflow_dispatch: @@ -27,15 +22,12 @@ on: - master paths: - 'docs/**' - - 'README.md' # README is synced to docs/index.md - - 'mkdocs.yml' - - 'requirements-docs.txt' - - '.github/workflows/deploy-docs.yml' - - 'scripts/fix-mkdocs-structure.ts' + - 'apps/edit-docs/**' + - 'packages/share-theme/**' jobs: build-and-deploy: - name: Build and Deploy MkDocs + name: Build and Deploy Documentation runs-on: ubuntu-latest timeout-minutes: 10 @@ -49,72 +41,25 @@ jobs: steps: - name: Checkout Repository uses: actions/checkout@v5 - with: - fetch-depth: 0 # Fetch all history for git info and mkdocs-git-revision-date plugin - - name: Setup Python - uses: actions/setup-python@v6 - with: - python-version: '3.14' - cache: 'pip' - cache-dependency-path: 'requirements-docs.txt' - - - name: Install MkDocs and Dependencies - run: | - pip install --upgrade pip - pip install -r requirements-docs.txt - env: - PIP_DISABLE_PIP_VERSION_CHECK: 1 - - # Setup pnpm before fixing docs structure - name: Setup pnpm uses: pnpm/action-setup@v4 - # Setup Node.js with pnpm - name: Setup Node.js uses: actions/setup-node@v6 with: node-version: '24' cache: 'pnpm' - # Install Node.js dependencies for the TypeScript script - name: Install Dependencies - run: | - pnpm install --frozen-lockfile + run: pnpm install --frozen-lockfile - - name: Fix Documentation Structure - run: | - # Fix duplicate navigation entries by moving overview pages to index.md - pnpm run chore:fix-mkdocs-structure - - - name: Build MkDocs Site - run: | - # Build with strict mode but allow expected warnings - mkdocs build --verbose || { - EXIT_CODE=$? - # Check if the only issue is expected warnings - if mkdocs build 2>&1 | grep -E "WARNING.*(README|not found)" && \ - [ $(mkdocs build 2>&1 | grep -c "ERROR") -eq 0 ]; then - echo "✅ Build succeeded with expected warnings" - mkdocs build --verbose - else - echo "❌ Build failed with unexpected errors" - exit $EXIT_CODE - fi - } - - - name: Fix HTML Links - run: | - # Remove .md extensions from links in generated HTML - pnpm tsx ./scripts/fix-html-links.ts site + - name: Trigger build of documentation + run: pnpm docs:build - name: Validate Built Site run: | - # Basic validation that important files exist test -f site/index.html || (echo "ERROR: site/index.html not found" && exit 1) - test -f site/sitemap.xml || (echo "ERROR: site/sitemap.xml not found" && exit 1) - test -d site/assets || (echo "ERROR: site/assets directory not found" && exit 1) - echo "✅ Site validation passed" - name: Deploy uses: ./.github/actions/deploy-to-cloudflare-pages diff --git a/apps/client/src/share.ts b/apps/client/src/share.ts deleted file mode 100644 index 579b9e422..000000000 --- a/apps/client/src/share.ts +++ /dev/null @@ -1,24 +0,0 @@ -import "normalize.css"; -import "boxicons/css/boxicons.min.css"; -import "@triliumnext/ckeditor5/src/theme/ck-content.css"; -import "@triliumnext/share-theme/styles/index.css"; -import "@triliumnext/share-theme/scripts/index.js"; - -async function ensureJQuery() { - const $ = (await import("jquery")).default; - (window as any).$ = $; -} - -async function formatCodeBlocks() { - const anyCodeBlock = document.querySelector("#content pre"); - if (!anyCodeBlock) { - return; - } - await ensureJQuery(); - const { formatCodeBlocks } = await import("./services/syntax_highlight.js"); - await formatCodeBlocks($("#content")); -} - -async function setupTextNote() { - formatCodeBlocks(); -} diff --git a/apps/client/vite.config.mts b/apps/client/vite.config.mts index 5a3053915..8d3b0c583 100644 --- a/apps/client/vite.config.mts +++ b/apps/client/vite.config.mts @@ -74,7 +74,6 @@ export default defineConfig(() => ({ mobile: join(__dirname, "src", "mobile.ts"), login: join(__dirname, "src", "login.ts"), setup: join(__dirname, "src", "setup.ts"), - share: join(__dirname, "src", "share.ts"), set_password: join(__dirname, "src", "set_password.ts"), runtime: join(__dirname, "src", "runtime.ts"), print: join(__dirname, "src", "print.tsx") @@ -84,7 +83,8 @@ export default defineConfig(() => ({ chunkFileNames: "src/[name].js", assetFileNames: "src/[name].[ext]", manualChunks: { - "ckeditor5": [ "@triliumnext/ckeditor5" ] + "ckeditor5": [ "@triliumnext/ckeditor5" ], + "boxicons": [ "../../node_modules/boxicons/css/boxicons.min.css" ] }, }, onwarn(warning, rollupWarn) { diff --git a/apps/edit-docs/src/build-docs.ts b/apps/edit-docs/src/build-docs.ts new file mode 100644 index 000000000..aca569772 --- /dev/null +++ b/apps/edit-docs/src/build-docs.ts @@ -0,0 +1,109 @@ +process.env.TRILIUM_INTEGRATION_TEST = "memory-no-store"; +process.env.TRILIUM_RESOURCE_DIR = "../server/src"; +process.env.NODE_ENV = "development"; + +import cls from "@triliumnext/server/src/services/cls.js"; +import { dirname, join, resolve } from "path"; +import fs, { copyFile } from "fs/promises"; +import fsExtra, { createWriteStream, type WriteStream } from "fs-extra"; +import archiver from "archiver"; + +const DOCS_ROOT = "../../../docs"; +const OUTPUT_DIR = "../../site"; + +async function main() { + 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); + + const note = await importData(join(__dirname, DOCS_ROOT, "User Guide")); + + // Export + const zipFilePath = "output.zip"; + try { + const { exportToZip } = (await import("@triliumnext/server/src/services/export/zip.js")).default; + const branch = note.getParentBranches()[0]; + const taskContext = new (await import("@triliumnext/server/src/services/task_context.js")).default( + "no-progress-reporting", + "export", + null + ); + const fileOutputStream = createWriteStream(zipFilePath); + await exportToZip(taskContext, branch, "share", fileOutputStream); + await waitForStreamToFinish(fileOutputStream); + await extractZip(zipFilePath, OUTPUT_DIR); + } finally { + if (await fsExtra.exists(zipFilePath)) { + await fsExtra.rm(zipFilePath); + } + } + + // Copy favicon. + await copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "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 context = new TaskContext("no-progress-reporting", "importNotes", null); + const becca = (await import("@triliumnext/server/src/becca/becca.js")).default; + + const rootNote = becca.getRoot(); + if (!rootNote) { + throw new Error("Missing root note for import."); + } + return await importService.importZip(context, buffer, rootNote, { + preserveIds: true + }); +} + +async function createImportZip(path: string) { + const inputFile = "input.zip"; + const archive = archiver("zip", { + zlib: { level: 0 } + }); + + console.log("Archive path is ", resolve(path)) + archive.directory(path, "/"); + + const outputStream = fsExtra.createWriteStream(inputFile); + archive.pipe(outputStream); + archive.finalize(); + await waitForStreamToFinish(outputStream); + + try { + return await fsExtra.readFile(inputFile); + } finally { + await fsExtra.rm(inputFile); + } +} + +function waitForStreamToFinish(stream: WriteStream) { + return new Promise((res, rej) => { + stream.on("finish", () => res()); + stream.on("error", (err) => rej(err)); + }); +} + +export async function extractZip(zipFilePath: string, outputPath: string, ignoredFiles?: Set) { + const { readZipFile, readContent } = (await import("@triliumnext/server/src/services/import/zip.js")); + await readZipFile(await fs.readFile(zipFilePath), async (zip, entry) => { + // We ignore directories since they can appear out of order anyway. + if (!entry.fileName.endsWith("/") && !ignoredFiles?.has(entry.fileName)) { + const destPath = join(outputPath, entry.fileName); + const fileContent = await readContent(zip, entry); + + await fsExtra.mkdirs(dirname(destPath)); + await fs.writeFile(destPath, fileContent); + } + + zip.readEntry(); + }); +} + +cls.init(main); diff --git a/apps/server/package.json b/apps/server/package.json index e2f0ef82e..ed536368d 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -26,6 +26,7 @@ }, "dependencies": { "better-sqlite3": "12.4.1", + "html-to-text": "9.0.5", "node-html-parser": "7.0.1" }, "devDependencies": { @@ -35,8 +36,8 @@ "@preact/preset-vite": "2.10.2", "@triliumnext/commons": "workspace:*", "@triliumnext/express-partial-content": "workspace:*", - "@triliumnext/turndown-plugin-gfm": "workspace:*", "@triliumnext/highlightjs": "workspace:*", + "@triliumnext/turndown-plugin-gfm": "workspace:*", "@types/archiver": "7.0.0", "@types/better-sqlite3": "7.6.13", "@types/cls-hooked": "4.3.9", 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 14e062249..35e03714e 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-file","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_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-file","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_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-file","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-file","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-file","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":"book","attributes":[{"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-file","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-file","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_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Calendar View"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Geo Map View"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/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/Note Types/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Table View"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Board View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Board View"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]},{"id":"_help_zP3PMqaG71Ct","title":"Presentation View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Presentation View"},{"name":"iconClass","value":"bx bx-slideshow","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_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","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-file","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-file","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-file","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-file","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 bx-file","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-file","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-file","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 bx-file","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-file","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 bx-file","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-file","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-file","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 bx-file","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-file","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/etapi/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"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-file","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 bx-file","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-file","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-file","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-file","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 bxs-component","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-file","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-file","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-file","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 bx-folder","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/api/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"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_LMAv4Uy3Wk6J","title":"AI","type":"book","attributes":[{"name":"iconClass","value":"bx bx-bot","type":"label"}],"children":[{"id":"_help_GBBMSlVSOIGP","title":"Introduction","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Introduction"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WkM7gsEUyCXs","title":"AI Provider Information","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_7EdTxPADv95W","title":"Ollama","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_vvUCN7FDkq7G","title":"Installing Ollama","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/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/AI Provider Information/OpenAI"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_e0lkirXEiSNc","title":"Anthropic","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/Anthropic"},{"name":"iconClass","value":"bx bx-file","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-file","type":"label"}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","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 bx-file","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-file","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"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"}]}]}] \ 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-file","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_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-file","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_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-file","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-file","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-file","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":"book","attributes":[{"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-file","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-file","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_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Calendar View"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Geo Map View"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/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/Note Types/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Table View"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Board View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Board View"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]},{"id":"_help_zP3PMqaG71Ct","title":"Presentation View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Collections/Presentation View"},{"name":"iconClass","value":"bx bx-slideshow","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_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","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-file","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-file","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-file","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-file","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 bx-file","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-file","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-file","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 bx-file","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-file","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_5668rwcirq1t","title":"Advanced Showcases","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases"},{"name":"iconClass","value":"bx bx-file","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-file","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-file","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 bx-file","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-file","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/etapi/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"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-file","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 bx-file","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-file","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-file","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-file","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 bxs-component","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-file","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-file","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-file","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 bx-folder","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"/api/docs"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"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_LMAv4Uy3Wk6J","title":"AI","type":"book","attributes":[{"name":"iconClass","value":"bx bx-bot","type":"label"}],"children":[{"id":"_help_GBBMSlVSOIGP","title":"Introduction","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/Introduction"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_WkM7gsEUyCXs","title":"AI Provider Information","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"children":[{"id":"_help_7EdTxPADv95W","title":"Ollama","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_vvUCN7FDkq7G","title":"Installing Ollama","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/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/AI Provider Information/OpenAI"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_e0lkirXEiSNc","title":"Anthropic","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI/AI Provider Information/Anthropic"},{"name":"iconClass","value":"bx bx-file","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-file","type":"label"}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","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 bx-file","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-file","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"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"}]}]}] \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.html index 39d9ee00d..fd417a2a7 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.html @@ -9,8 +9,8 @@ class="image image_resized" style="width:50.49%;"> width="785" height="498">
- +
- +
An example chat with an LLM

The AI / LLM features within Trilium Notes are designed to allow you to @@ -11,13 +11,13 @@

The quickest way to get started is to navigate to the “AI/LLM” settings:

- +

Enable the feature:

- +

Embeddings

@@ -43,30 +43,30 @@ class="image image_resized" style="width:74.04%;"> We will then hit the “refresh” button to have it fetch our models:

- +

When selecting the dropdown for the “Embedding Model”, embedding models should be at the top of the list, separated by regular chat models with a horizontal line, as seen below:

- +

After selecting an embedding model, embeddings should automatically begin to be generated by checking the embedding statistics at the top of the “AI/LLM” settings panel:

- +

If you don't see any embeddings being created, you will want to scroll to the bottom of the settings, and hit “Recreate All Embeddings”:

- +

Creating the embeddings will take some time, and will be regenerated when a Note is created, updated, or deleted (removed).

@@ -139,8 +139,8 @@ class="image image_resized" style="width:74.04%;">

When Tools are executed within your Chat, you'll see output like the following:

- +

You don't need to tell the LLM to execute a certain tool, it should “smartly” call tools and automatically execute them as needed.

@@ -149,13 +149,13 @@ class="image image_resized" style="width:74.04%;"> use the “Chat with Notes” button, where you can go ahead and start chatting!:

- +

If you don't see the “Chat with Notes” button on your side launchbar, you might need to move it from the “Available Launchers” section to the “Visible Launchers” section:

- +
\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html index 26dbc620f..6d72fea15 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.html @@ -10,9 +10,9 @@ and arbitrary tags - whenever you change tag attribute in the task note, this task is then automatically moved to appropriate location.

Task Manager also integrates with day notes - - notes are cloned into day note to - both todoDate note and doneDate note (with prefix of - either "TODO" or "DONE").

+ notes are cloned into day note to both todoDate + note and doneDate note (with prefix of either + "TODO" or "DONE").

Implementation

New tasks are created in the TODO note which has ~child:template Task template defines several promoted attributes - todoDate, doneDate, tags, location. Importantly it also defines ~runOnAttributeChange relation - event handler which is run on attribute - change. This script 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.

+ change. This script 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

There's also "button" note which contains simple script which adds a button to create new note (task) in the TODO note.

api.addButtonToToolbar({
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html
index 8474ade5f..8f28f72f4 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html	
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes.html	
@@ -1,6 +1,6 @@
 
- +

In Trilium, attributes are key-value pairs assigned to notes, providing additional metadata or functionality. There are two primary types of attributes:

diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance.html index cb6de109d..9d7076d6a 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance.html @@ -1,6 +1,6 @@

Inheritance refers to the process of having a label or - a relation shared across multiple - notes, generally in parent-child relations (or anywhere if using templates).

+ a relation shared across multiple notes, + generally in parent-child relations (or anywhere if using templates).

Standard Inheritance

In Trilium, attributes can be automatically inherited by child notes if they have the isInheritable flag set to true. This diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html index 0edc5714b..26fa692dc 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html @@ -1,5 +1,5 @@ -

A label is an attribute of a note - which has a name and optionally a value.

+

A label is an attribute of a note which + has a name and optionally a value.

Common use cases

  • Metadata for personal use: Assign labels with optional @@ -81,8 +81,7 @@ calendarRoot Marks the note which should be used as root for Day Notes. Only one should be marked - as such. + href="#root/_help_l0tKav7yLHGF">Day Notes. Only one should be marked as such. archived @@ -154,8 +153,8 @@ autoReadOnlyDisabled - Disables automatic read-only mode for - the given note. + Disables automatic read-only mode for the + given note. appCss @@ -177,8 +176,7 @@ Set 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. + href="#root/_help_WFGzWeUK6arS">Customize the Next theme for more information. cssClass diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Relations.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Relations.html index 6d85137f6..8dd0803c7 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Relations.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Relations.html @@ -1,5 +1,5 @@ -

    A relation is similar to a label, - but instead of having a text value it refers to another note.

    +

    A relation is similar to a label, but + instead of having a text value it refers to another note.

    Common use cases

    • Metadata Relationships for personal use: For example, diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Bulk Actions.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Bulk Actions.html index f505b9714..77fbbf031 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Bulk Actions.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Bulk Actions.html @@ -1,6 +1,6 @@
      - +

      The Bulk Actions dialog makes it easy to apply changes to multiple notes at once, ranging from simple actions such as adding or removing a @@ -8,8 +8,8 @@

      Interaction

      • The first step is to select the notes in the Note Tree. It's possible to apply bulk - actions to: + href="#root/_help_oPVyFC7WL2Lp">Note Tree. It's possible to apply bulk actions + to:
        • A single note (and potentially its child notes) simply by clicking on it (with a left click or a right click).
        • @@ -53,17 +53,17 @@
        • Update label value
            -
          • For each note, if it has a label of - the given name, it will change its value to the specified one. Leave New value field +
          • For each note, if it has a label of the + given name, it will change its value to the specified one. Leave New value field empty to create a label without a value.
          • Notes without the label will not be affected.
        • Rename label
            -
          • For each note, if it has a label of - the given name, it will be renamed/replaced with a label of the new name. - The value of the label (if present) will be kept intact.
          • +
          • For each note, if it has a label of the + given name, it will be renamed/replaced with a label of the new name. The + value of the label (if present) will be kept intact.
          • Notes without the label will not be affected.
        • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance.html index 35fc1d2b8..3b22c5f3a 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance.html @@ -1,8 +1,8 @@

          A Trilium instance represents a server. If Synchronization is set up, since - multiple servers are involved (the one from the desktop client and the - one the synchronisation is set up with), sometimes it can be useful to - distinguish the instance you are running on.

          + href="#root/_help_cbkrhQjrkKrh">Synchronization is set up, since multiple + servers are involved (the one from the desktop client and the one the synchronisation + is set up with), sometimes it can be useful to distinguish the instance + you are running on.

          Setting the instance name

          To set up a name for the instance, modify the config.ini:

          [General]
           instanceName=Hello
          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Database.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Database.html index 3165b3940..6bd423195 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Database.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Database.html @@ -23,5 +23,5 @@

          If you do not need to preserve any configurations that might be stored in the config.ini file, you can just delete all of the data directory's contents to fully restore the application to its original state. You can also review - the configuration file to provide - all config.ini values as environment variables instead.

          \ No newline at end of file + the configuration file to provide all config.ini values + as environment variables instead.

          \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Hidden Notes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Hidden Notes.html index 09568a2e5..c3e6b3cd9 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Hidden Notes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Hidden Notes.html @@ -1,6 +1,6 @@
          - +

          For easy extensibility, a lot of features in Trilium make use of actual notes to store information as opposed to having them stored in a separate @@ -8,14 +8,13 @@ href="#root/_help_zEY4DaJG4YT5">Attributes, Relations or even Search and Links to be able to operate on - them.

          + href="#root/_help_QEAPj01N5f7w">Links to be able to operate on them.

          As the name suggests, these notes are hidden to the user by default to prevent cluttering the note tree and to prevent them from being accidentally deleted.

          The hidden notes are stored in the user's Database just like normal notes, - but they have a unique Note ID which + href="#root/_help_wX4HbRucYSDD">Database just like normal notes, but + they have a unique Note ID which allows them to be distinguished from the normal ones.

          Accessing the hidden note tree

          From the Global menu, @@ -51,8 +50,8 @@ class="ck-table-resized">

          When SQL queries or commands are executed in the SQL Console, they are stored here, - grouped by month. Only the query is stored and not the results.

          + href="#root/_help_YKWqdJhzi2VY">SQL Console, they are stored here, grouped + by month. Only the query is stored and not the results.

          This section can be accessed without going to the hidden tree by simply going to the Global menu and selecting Advanced → Open SQL Console History.

          @@ -65,9 +64,8 @@ class="ck-table-resized">

          Whenever a search is executed from the full Search, the query will be stored here, - grouped by month. Only the search parameters are stored and not the results - themselves.

          + href="#root/_help_eIg8jdvaoNNd">Search, the query will be stored here, grouped + by month. Only the search parameters are stored and not the results themselves.

          This section can be accessed without going to the hidden tree by simply going to the Global menu and selecting Advanced → Open Search History.

          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Metrics.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Metrics.html index 47a84af0d..1530da264 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Metrics.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Metrics.html @@ -82,18 +82,18 @@ trilium_notes_total 1234 1701432000

        Grafana Dashboard

        - +

        You can also use the Grafana Dashboard that has been created for TriliumNext - just take the JSON from grafana-dashboard.json and then import the dashboard, following these screenshots:

        - +

        Then paste the JSON, and hit load:

        - +
        \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).html index 828cb8c65..5840e104b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).html @@ -21,8 +21,8 @@ in full screen. See Note Map for more information.

        See also

        -

        Relation map is a similar concept, - with some differences:

        +

        Relation map is a similar concept, with + some differences:

        • note map is automatically generated while relation map must be created manually
        • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note source.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note source.html index 39512ce81..ffd2e11de 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note source.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Note source.html @@ -5,9 +5,9 @@
          • Text notes are represented internally as HTML, using the CKEditor representation. Note - that due to the custom plugins, some HTML elements are specific to Trilium - only, for example the admonitions.
          • + href="#root/_help_MI26XDLSAlCD">CKEditor representation. Note that due + to the custom plugins, some HTML elements are specific to Trilium only, + for example the admonitions.
          • Code notes are plain text and are represented internally as-is.
          • Geo Map notes @@ -22,10 +22,10 @@

          Note that some information is also stored as Attachments. For example Canvas notes use the attachments - feature to store the custom libraries, and alongside with Mind Map and other similar note - types it stores an SVG representation of the content for use in other features + href="#root/_help_grjYqerjn243">Canvas notes use the attachments feature + to store the custom libraries, and alongside with Mind Map and other similar note types + it stores an SVG representation of the content for use in other features such as including in other notes, shared notes, etc.

          Here's part of the HTML representation of this note, as it's stored in the database (but prettified).

          <h2>
          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html
          index 95cae2d8d..000dd8356 100644
          --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html	
          +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Sharing.html	
          @@ -3,8 +3,8 @@
             from your Trilium notes, making it accessible to others online.

          - +

          Features, interaction and limitations

          @@ -177,8 +177,8 @@ class="image">

          Some of these limitations may be addressed in future updates.

          Prerequisites

          To use the sharing feature, you must have a Server Installation of Trilium. - This is necessary because the notes will be hosted from the server.

          + href="#root/_help_WOcw2SLH6tbX">Server Installation of Trilium. This + is necessary because the notes will be hosted from the server.

          Sharing a note

          1. @@ -186,7 +186,8 @@ class="image"> within the note's interface. Once sharing is enabled, an URL will appear, which you can click to access the shared note.

            - Share Note + Share Note

          2. @@ -220,10 +221,10 @@ class="image"> it using your own CSS:

            • Custom CSS: Link a CSS Code note to the shared page by - adding a ~shareCss relation to the note. If you want this style - to apply to the entire subtree, make the label inheritable. You can hide - the CSS code note from the tree navigation by adding the #shareHiddenFromTree label.
            • + href="#root/_help_6f9hih2hXXZk">Code note to the shared page by adding + a ~shareCss relation to the note. If you want this style to + apply to the entire subtree, make the label inheritable. You can hide the + CSS code note from the tree navigation by adding the #shareHiddenFromTree label.
            • Omitting Default CSS: For extensive styling changes, use the #shareOmitDefaultCss label to avoid conflicts with Trilium's As described in Sharing, + Trilium can act as a public server in which the shared notes are displayed + in read-only mode. While this can work in most cases, it's generally not + meant for high-traffic websites and since it's running on a Node.js server + it can be potentially exploited.

              +

              Another alternative is to generate static HTML files (just like other + static site generators such as MkDocs). + Since the normal HTML ZIP export does not contain any styling or additional + functionality, Trilium provides a way to export the same layout and style + as the Sharing function + into static HTML files.

              +

              Apart from the enhanced security, these HTML files are also easy to deploy + on “serverless” deployments such as GitHub Pages or CloudFlare Pages and + cache very easily.

              + +

              Differences from normal sharing and export

              +

              Apart from normal Sharing, + exporting to static HTML files comes with a few subtle differences:

              +
                +
              • The URL structure is different. Where in normal sharing it's something + along the way of example.com/share/noteid, the notes follow + an hierarchical structure, such as docs.triliumnotes.org/user-guide/concepts/navigation/tree-concepts.
              • +
              • The favicon.ico is not handled automatically, it needs to be + manually added on the server after the export is generated.
              • +
              • The “Last updated” for notes is not available.
              • +
              • The search functionality works slightly different since the normal one + requires an active API to work. In the static export, search still works + but uses a different mechanism so results might be different.
              • +
              +

              Differences from normal .zip export

              +
                +
              • The name of the files/URLs will prefer shareAlias to allow + for clean URLs.
              • +
              • The export requires a functional web server as the pages will not render + properly if accessed locally via a web browser due to the use of module + scripts.
              • +
              +

              Testing locally

              +

              As mentioned previously, the exported static pages require a website to + function. In order to test locally, a web server needs to be used.

              +

              One example is to use the Node.js-based http-server which + can be installed via:

              npm i -g http-server
              +

              Once installed simply:

              +
                +
              1. Extract the exported .zip file.
              2. +
              3. Inside the extracted directory, run http-server.
              4. +
              5. Access the indicated address (e.g. http://localhost:8080).
              6. +
              \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/CKEditor.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/CKEditor.html index c6da6762b..b61a8e052 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/CKEditor.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/CKEditor.html @@ -39,7 +39,7 @@
            • Reference links
            • -
            • Admonitions, we ended up creating - our own plugin but aarkue/ckeditor5-admonition was +
            • Admonitions, we ended up creating our + own plugin but aarkue/ckeditor5-admonition was a good inspiration (including the toolbar icon).
            \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw.html index 78948ebf3..f324de4c8 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw.html @@ -1,5 +1,5 @@

            Excalidraw is the technology behind - the Canvas notes. The - source code of the library is available on GitHub.

            + the Canvas notes. The source + code of the library is available on GitHub.

            We are using an unmodified version of it, so it shares the same issues as the original.

            \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Templates.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Templates.html index 4c91ffc9c..1eb044617 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Templates.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Templates.html @@ -3,10 +3,10 @@ main effects:

            1. Attribute Inheritance: All attributes from the template - note are inherited by the instance - notes. Even attributes with #isInheritable=false are inherited - by the instance notes, although only inheritable attributes are further - inherited by the children of the instance notes.
            2. + note are inherited by the instance notes. + Even attributes with #isInheritable=false are inherited by the + instance notes, although only inheritable attributes are further inherited + by the children of the instance notes.
            3. Content Duplication: The content of the template note is copied to the instance note, provided the instance note is empty at the time of template assignment.
            4. @@ -32,7 +32,8 @@ all attributes from the template are inherited.

              To create an instance note through the UI:

              - show child note templates + show child note templates

              For the template to appear in the menu, the template note must have the #template label. Do not confuse this with the ~template relation, which links diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to.html index 2cc679ed8..6cb1b8ed8 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to.html @@ -1,6 +1,6 @@

              - +

              Jump to Note

              @@ -34,8 +34,8 @@

              Alternatively you can click on the "time" icon on the right.

              Command Palette

              - +

              The command palette is a feature which allows easy execution of various commands that can be found throughout the application, such as from menus diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting.html index 201295288..25755eb69 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting.html @@ -5,7 +5,6 @@

              In addition to showing only this subtree, this also narrows both full - text search and “jump to note” to - just notes present in hoisted subtree.

              -

              See also Workspace which extends - this feature.

              \ No newline at end of file + text search and “jump to note” to just notes + present in hoisted subtree.

              +

              See also Workspace which extends this feature.

              \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search.html index 956b0e154..7f70624d7 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search.html @@ -1,16 +1,16 @@
              - +

              The Quick search function does a full-text search (that is, it searches through the content of notes and not just the title of a note) and displays the result in an easy-to-access manner.

              The alternative to the quick search is the Search function, which opens in - a dedicated tab and has support for advanced queries.

              + href="#root/_help_eIg8jdvaoNNd">Search function, which opens in a dedicated + tab and has support for advanced queries.

              For even faster navigation, it's possible to use Jump to... which will only search - through the note titles instead of the content.

              + href="#root/_help_F1r9QtzQLZqm">Jump to... which will only search through + the note titles instead of the content.

              Layout

              Based on the Vertical and horizontal layout, the quick search is placed:

              @@ -18,8 +18,8 @@
            5. On the vertical layout, it is displayed right above the Note Tree.
            6. On the horizontal layout, it is displayed in the Launch Bar, where it can be positioned - just like any other icon.
            7. + href="#root/_help_xYmIYSP6wE3F">Launch Bar, where it can be positioned just + like any other icon.

        Search Features

        Quick search includes the following features:

        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note.html index 01091351f..06eb1130f 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note.html @@ -1,6 +1,6 @@
        - +

        Local search allows you to search within the currently displayed note. 

        Alternatives

        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.html index cddfc457e..5a93064e8 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.html @@ -1,10 +1,10 @@
        - +

        Note search enables you to find notes by searching for text in the title, - content, or attributes of the notes. - You also have the option to save your searches, which will create a special + content, or attributes of the notes. You + also have the option to save your searches, which will create a special search note which is visible on your navigation tree and contains the search results as sub-items.

        Accessing the search

        @@ -107,8 +107,8 @@ action multiple times (i.e. in order to be able to apply multiple labels to notes).
      • The actions given are the same as the ones in Bulk Actions, which is an alternative - for operating directly with notes within the Bulk Actions, which is an alternative for + operating directly with notes within the Note Tree.
      • After defining the actions, first press Search to check the matched notes and then press Search & Execute actions to trigger the diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes.html index bce15f8d6..c15d61543 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes.html @@ -1,6 +1,6 @@
        - +

        The Similar Notes feature tries to identify notes that relate to the current note by looking at the content of the notes, their relationships, as well diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces.html index a137bef13..6c17068e5 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces.html @@ -6,8 +6,8 @@

        So far workspace consists of these features:

        • -

          note hoisting - you can "zoom" into - a workspace subtree to focus only on the relevant notes

          +

          note hoisting - you can "zoom" into a + workspace subtree to focus only on the relevant notes

        • easy entering of workspace: 

          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes.html index 1ec3fef9d..26efd0947 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes.html @@ -2,10 +2,9 @@ and content.

          Note types

          The main note type is a rich-text note type called Text. For diagrams and drawing there - is Canvas and  + href="#root/_help_iPIMuisry3hd">Text. For diagrams and drawing there is  Mermaid Diagrams.

          + class="reference-link" href="#root/_help_grjYqerjn243">Canvas and Mermaid Diagrams.

          There are also more complex note types such as Saved SearchRender Note that usually go hand-in-hand diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Attachments.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Attachments.html index c07b654d0..537a7c70c 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Attachments.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Attachments.html @@ -1,5 +1,5 @@ -

          A note in Trilium can own one - or more attachments, which can be either images or files. These attachments +

          A note in Trilium can own one or + more attachments, which can be either images or files. These attachments can be displayed or linked within the note that owns them.

          This can be especially useful to include dependencies for your scripts. The Weight Tracker shows @@ -21,8 +21,8 @@

        • For a single note, press the context menu from the Note buttons and select Convert into attachment.
        • For multiple notes, select the given notes in the Note Tree, right click → Advanced → - Convert to attachment.
        • + href="#root/_help_oPVyFC7WL2Lp">Note Tree, right click → Advanced → Convert + to attachment.

        Attachment previews

        Attachments share the same content preview for images, videos, PDFs, etc. diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons.html index 54c380162..1b39f824b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons.html @@ -5,8 +5,10 @@ the css class names is not necessary. While editing a note, click on the icon next to the title to bring up a chooser gallery:

        - change note icon + change note icon

        - note icon gallery + note icon gallery

        \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.html index a20e3f16c..8c190e1d9 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.html @@ -1,6 +1,6 @@
        - +

        When a note has one or more child notes, they will be listed at the end of the note for easy navigation.

        @@ -19,7 +19,6 @@ the notes will be displayed in a grid, however there are also some other view types available.

        Generally the view type can only be changed in a Collections note from the  - Ribbon, but it can also be changed manually on any type of note using - the #viewType attribute.

        \ No newline at end of file + href="#root/_help_GTwFsgaA0lCt">Collections note from the Ribbon, but it can also be changed manually + on any type of note using the #viewType attribute.

        \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html index 3104cac57..bf04b3afc 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html @@ -4,6 +4,7 @@
        Screenshot of the note contextual menu indicating the “Export as PDF” option.
        +

        Printing

        This feature allows printing of notes. It works on both the desktop client, but also on the web.

        @@ -26,7 +27,8 @@ class="admonition note"> report the issue. In this case, it's best to offer a sample note (click on the - button, select Export note → This note and all of its descendants → HTML + button, select Export note → This note and all of its descendants → HTML in ZIP archive). Make sure not to accidentally leak any personal information.

        Consider adjusting font sizes and using page breaks to work around the layout.

        @@ -40,7 +42,7 @@ class="admonition note"> @@ -56,12 +58,11 @@ class="admonition note">

        Customizing exporting as PDF

        When exporting to PDF, there are no customizable settings such as page orientation, size. However, there are a few Attributes to adjust some of the - settings:

        + href="#root/_help_zEY4DaJG4YT5">Attributes to adjust some of the settings:

          -
        • To print in landscape mode instead of portrait (useful for big diagrams +
        • To print in landscape mode instead of portrait (useful for big diagrams or slides), add #printLandscape.
        • -
        • By default, the resulting PDF will be in Letter format. It is possible +
        • By default, the resulting PDF will be in Letter format. It is possible to adjust it to another page size via the #printPageSize attribute, with one of the following values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
        @@ -75,9 +76,9 @@ class="admonition note"> href="#root/_help_4TIF1oA4VQRO">Options and assigning a key combination for:

          -
        • Print Active Note +
        • Print Active Note
        • -
        • Export Active Note as PDF +
        • Export Active Note as PDF

        Constraints & limitations

        @@ -85,24 +86,24 @@ class="admonition note"> supported when printing, in which case the Print and Export as PDF options will be disabled.

          -
        • For Code notes: +
        • For Code notes:
            -
          • Line numbers are not printed.
          • -
          • Syntax highlighting is enabled, however a default theme (Visual Studio) +
          • Line numbers are not printed.
          • +
          • Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced.
        • -
        • For Collections: +
        • For Collections:
            -
          • Only Presentation View is +
          • Only Presentation View is currently supported.
          • -
          • We plan to add support for all the collection types at some point.
          • +
          • We plan to add support for all the collection types at some point.
        • -
        • Using Custom app-wide CSS for +
        • Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism.
            -
          • We plan to introduce a new mechanism specifically for a print CSS.
          • +
          • We plan to introduce a new mechanism specifically for a print CSS.
        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes.html index f5d5c0cf4..3855e2b97 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes.html @@ -6,8 +6,8 @@
      • Encryption: Protected notes are encrypted using a key derived from your password. This ensures that without the correct password, protected notes remain indecipherable. Even if someone gains access to - your Trilium database, they won't - be able to read your encrypted notes.
      • + your Trilium database, they won't be able + to read your encrypted notes.
      • Time-limited access: To access protected notes, you must first enter your password, which decrypts the note for reading and writing. However, after a specified period of inactivity (10 minutes by default), @@ -30,7 +30,8 @@

        By default, notes are unprotected. To protect a note, simply click on the shield icon next to the note's title, as shown here:

        - example animation of unlocking protected notes + example animation of unlocking protected notes

        What is Encrypted?

        Trilium encrypts the data within protected notes but not their metadata. diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.html index b56e502b8..5216611cb 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.html @@ -11,10 +11,9 @@ of the next section.

        In addition, it's possible to change the number of characters at which the automatic read-only mode will trigger in Options by going to the options - for Text Notes and  + href="#root/_help_4TIF1oA4VQRO">Options by going to the options for  Code Notes.

        + class="reference-link" href="#root/_hidden/_options/_help__optionsTextNotes">Text Notes and Code Notes.

        Changing a note's read-only behavior

        Via the Ribbon, by going to the Basic Properties tab and looking for the Editable selection. diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes.html index f1348efcb..0ba164a49 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes.html @@ -1,7 +1,7 @@

        Manual sorting

        You can sort notes by right-clicking the parent note in the Note Tree and selecting Advanced - -> Sort notes by ... This will sort existing notes, but will not automatically + href="#root/_help_oPVyFC7WL2Lp">Note Tree and selecting Advanced -> + Sort notes by ... This will sort existing notes, but will not automatically sort future notes added to this parent note.

        The sorting dialog allows:

          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons.html index c432d5ae5..736708d22 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons.html @@ -1,6 +1,6 @@
          - +

          Depending on the current note, a panel will appear near the top-right of the note, right underneath the Ribbon. @@ -13,8 +13,8 @@ class="reference-link" href="#root/_help_grjYqerjn243">Canvas, there are buttons to download the SVG representation of the note, or to copy a reference to the note for pasting it a Text note. -

        • For read-only notes, there is a - button to temporarily edit the note for quick modifications.
        • +
        • For read-only notes, there is a button + to temporarily edit the note for quick modifications.

        Interaction

        The floating button area can be collapsed by pressing the two right arrows diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.html index 6908b39bd..89ff2ac4e 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.html @@ -36,8 +36,8 @@

        Similarly, to remove it from the launch bar, simply look for it in Visible Launchers then right click it and select Move to available launchers or use drag-and-drop.

        Drag-and-drop the items in the tree in order to change their - order. See Note Tree for - more interaction options, including using keyboard shortcuts.

        + order. See Note Tree for more + interaction options, including using keyboard shortcuts.

        Customizing the launcher

        • The icon of a launcher can be changed just like a normal note. See  diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.html index 3500d6134..387a6de34 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.html @@ -1,10 +1,10 @@
          - +

          The note tooltip is a convenience feature which displays a popup when - hovering over an internal link to - another note.

          + hovering over an internal link to another + note.

          The following information is displayed:

          • The note path, at the top of the popup.
          • @@ -16,8 +16,8 @@
        • A snippet of the content will be displayed as well.
        • -
        • A button to quickly edit the note - in a popup.
        • +
        • A button to quickly edit the note in a + popup.

        The tooltip can be found in multiple places, including:

      \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree.html index 32b54240f..058459da7 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree.html @@ -5,13 +5,15 @@

      Drag and Drop

      - Drag and drop example + Drag and drop example

      You can easily rearrange the note tree by dragging and dropping notes, as demonstrated in the example above.

      Keyboard Manipulation

      - Example of using keyboard keys to move a noteTrilium offers efficient keyboard-based manipulation using the following + Example of using keyboard keys to move a noteTrilium offers efficient keyboard-based manipulation using the following shortcuts:

        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.html index a00568d7a..250fb7e14 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.html @@ -10,8 +10,7 @@
        • On a single note, by right clicking it in the note tree.
        • On multiple notes, by selecting them first. See Multiple selection on how to do - so. + href="#root/_help_yTjUdsOi4CIE">Multiple selection on how to do so.
          • When right clicking, do note that usually the note being right clicked is also included in the affected notes, regardless of whether it was selected @@ -81,9 +80,9 @@
          • Use one of the two paste functions (or the keyboard shortcuts) to copy them to the desired location.
          • Note that the copy function here works according to the Cloning Notes functionality (i.e. - the note itself will be present in two locations at once, and editing it - in one place will edit it everywhere).
          • + href="#root/_help_IakOLONlIfGI">Cloning Notes functionality (i.e. the + note itself will be present in two locations at once, and editing it in + one place will edit it everywhere).
          • To simply create a duplicate note that can be modified independently, look for Duplicate subtree.
          @@ -145,8 +144,8 @@
        • Import into note
            -
          • Opens the import dialog and places - the imported notes as child notes of the selected one.
          • +
          • Opens the import dialog and places the + imported notes as child notes of the selected one.
        • Export @@ -191,8 +190,8 @@
        • Converts the selected notes to Attachments of their parent notes.
        • This functional is most useful when dealing with image File notes that were imported - from an external source or an older version of Trilium.
        • + href="#root/_help_W8vYD3Q1zjCR">File notes that were imported from an + external source or an older version of Trilium.
      • Expand subtree diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Options.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Options.html index a45f1009c..8c49439ec 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Options.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Options.html @@ -1,14 +1,13 @@
        - +

        The Options section allows the configuration of the TriliumNext client and server.

        Entering options

        The Options can be accessed via:

          -
        • The Global menu, by selecting - the Options item.
        • +
        • The Global menu, by selecting the Options item.
        • The button in the Launch Bar which can optionally be hidden if not desirable.
        • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.html index 4e5dd7b77..e251b45fa 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.html @@ -1,18 +1,18 @@
          - +

          Quick edit provides an alternative to the standard tab-based navigation and editing.

          Instead of clicking on a note which switches the Note Tree to the newly selected - note, or navigating between two different Tabs, the Quick edit feature - opens as a popup window that can be easily dismissed.

          + href="#root/_help_oPVyFC7WL2Lp">Note Tree to the newly selected note, + or navigating between two different Tabs, + the Quick edit feature opens as a popup window that can be easily + dismissed.

          This feature is also well integrated with Collections such as the calendar - view, which makes it easy to edit entries without having to go back and - forth between the child note and the calendar.

          + href="#root/_help_GTwFsgaA0lCt">Collections such as the calendar view, + which makes it easy to edit entries without having to go back and forth + between the child note and the calendar.

          Feature highlights

          • All note types are supported, including  - +

            Accessing the recent changes

            @@ -9,10 +9,9 @@ button in the 
            Launch Bar.
              -
            • If there is a hoisted note or a - workspace, the list of recent changes will be limited to the descendents - of the hoisted note, or the workspace.
            • +
            • If there is a hoisted note or a workspace, + the list of recent changes will be limited to the descendents of the hoisted + note, or the workspace.
          • To limit the list of recent changes to a note and its descendants, look diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.html index 31b5908d9..96db62c4b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.html @@ -24,28 +24,27 @@
          • Protect the note toggles whether the current note is encrypted and accessible only by entering the protected session. - See Protected Notes for - more information.
          • + See Protected Notes for more + information.
          • Editable changes whether the current note:
              -
            • Enters read-only mode automatically - if the note is too big (default behaviour).
            • +
            • Enters read-only mode automatically if + the note is too big (default behaviour).
            • 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 for - easy access. See Bookmarks for - more information.
          • + into the Launch Bar for easy + access. See Bookmarks for more + information.
          • Shared toggles whether the current note is publicly accessible if you have a server instance set - up. See Sharing for more - information.
          • + up. See Sharing for more information.
          • Template toggles whether the current note is considered a template and can be used to easily create notes with the same - content. See Template for - more information.
          • + content. See Template for more + information.
          • Language changes the main language of the current note, mostly useful for spell checking or right-to-left support. See  Note Paths

            This section displays all the places where the current note has been cloned to. Here the current note can also be cloned to a new location (similar - to the Note Tree) See  - Cloning Notes for more information.

            + to the Note Tree) See Cloning Notes for + more information.

            Note Map

            The note map displays all the relations of the current note to other notes, as well as the subtree structure. See Note Tree for more information.

            Similar Notes

            This section lists all the notes that are similar to the current one. - See Similar Notes for - more information.

            + See Similar Notes for more information.

            Note Info

            This section displays information about the current note:

            • The internal ID of the note.
            • -
            • The type of the note, as well as - its MIME type (used mostly for exporting notes).
            • +
            • The type of the note, as well as its MIME + type (used mostly for exporting notes).
            • The created and modification dates.
            • The estimated size of the note in the Database, as well as its children count and size.
            • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar.html index f3e1b9aee..88f2b3be8 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar.html @@ -1,6 +1,6 @@
              - +

              The right sidebar displays specific content for the current note. Currently it includes:

              diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs.html index 45eac8857..8d9b0ad58 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs.html @@ -1,6 +1,6 @@
              - +

              In Trilium, tabs allow easy switching between notes.

              Layout

              @@ -9,8 +9,8 @@
            • For the vertical layout, the tabs will be placed at the top but to the right of the Note Tree.
            • For the horizontal layout, the tabs will be placed at the top in full-width, - above the note tree, allowing - for more tabs to be comfortably displayed.
            • + above the note tree, allowing for + more tabs to be comfortably displayed.

            Interaction

              @@ -19,8 +19,8 @@
            • To close a tab, press the corresponding button.
            • For multitasking, tabs can be used alongside Split View. Each tab can have one or - more notes, displayed horizontally.
            • + href="#root/_help_luNhaphA37EO">Split View. Each tab can have one or more + notes, displayed horizontally.
            • Tabs can be reordered by drag-and-dropping it into a new position.
            • An existing tab can be displayed in a new window by dragging the tab upwards or downwards. It is not possible to combine tabs back into another window.
            • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.html index e69de29bb..b056e6fda 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.html @@ -0,0 +1,8 @@ +

              Zoom applies to the entire UI, including text.

              +

              On the desktop application, use the Global menu to + zoom in/out.

              +

              On both web browser and the desktop, the keyboard shortcuts Ctrl+Shift++ and Ctrl+Shift+- can + be used.

              +

              Adjusting the text size instead

              +

              As an alternative to the zoom, the text size can be individually adjusted + by going to Options → Appearance.

              \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/FAQ.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/FAQ.html index 96a987809..ad3ee3976 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/FAQ.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/FAQ.html @@ -1,3 +1,17 @@ +

              Inspiration for the name “Trilium”

              +
              +

              Naming software is hard. I lived in Ontario when I first started the project + and Trillium (the flower) is sort of a provincial logo, many institutions + in Ontario are named "Trillium [something]". So I kept hearing/reading + it almost everyday, I liked the sound of it and its nature motif, so I + just reused it.

              +

              – Zadam (original Trilium maintainer) +

              +
              +

              macOS support

              Originally, Trilium Notes considered the macOS build unsupported. TriliumNext commits to make the experience on macOS as good as possible.

              @@ -26,13 +40,14 @@

            How to open multiple documents in one Trilium instance

            This is normally not supported - one Trilium process can open only a single - instance of a database. However, - you can run two Trilium processes (from one installation), each connected - to a separate document. To achieve this, you need to set a location for - the data directory in the TRILIUM_DATA_DIR environment - variable and separate port on TRILIUM_PORT environment variable. - How to do that depends on the platform, in Unix-based systems you can achieve - that by running command such as this:

            TRILIUM_DATA_DIR=/home/me/path/to/data/dir TRILIUM_PORT=12345 trilium 
            + instance of a database. However, you can + run two Trilium processes (from one installation), each connected to a + separate document. To achieve this, you need to set a location for the + data directoryin the TRILIUM_DATA_DIR environment variable + and separate port on TRILIUM_PORT environment variable. How + to do that depends on the platform, in Unix-based systems you can achieve + that by running command such as this:

            TRILIUM_DATA_DIR=/home/me/path/to/data/dir TRILIUM_PORT=12345 trilium 

            You can save this command into a .sh script file or make an alias. Do this similarly for a second instance with different data directory and port.

            @@ -54,9 +69,8 @@ with probably more problems.

            More detailed answer:

              -
            • clones are what you might call "hard - directory link" in filesystem lingo, but this concept is not implemented - in any filesystem
            • +
            • clones are what you might call "hard directory + link" in filesystem lingo, but this concept is not implemented in any filesystem
            • filesystems make a distinction between directory and file while there's intentionally no such difference in Trilium
            • files are stored in no particular order and user can't change this
            • @@ -76,8 +90,9 @@

              Trilium uses a progressive search strategy that includes fuzzy matching when exact matches return fewer than 5 results. This finds notes despite minor typos in your search query. You can use fuzzy search operators (~= for - fuzzy exact match and ~* for fuzzy contains). See the Search documentation for details.

              + fuzzy exact match and ~* for fuzzy contains). See the  + Search documentation for details.

              How can I search for notes when I'm not sure of the exact spelling?

              Use the fuzzy search operators:

                diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Feature Highlights.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Feature Highlights.html index 826c8b9e0..523a2e819 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Feature Highlights.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Feature Highlights.html @@ -30,8 +30,8 @@
              • v0.95.0:
                • A more friendly theme was introduced for Sharing, with search, expandable tree, - night mode and more.
                • + href="#root/_help_R9pX4DGra2Vt">Sharing, with search, expandable tree, night + mode and more.
              • v0.94.0: diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html index 457914ff2..de085dcc8 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html @@ -12,17 +12,17 @@ by default in backup directory placed in the data directory.

                This is only very basic backup solution, and you're encouraged to add some better backup solution - e.g. backing up the Database to cloud / different - computer etc.

                + href="#root/_help_wX4HbRucYSDD">Database to cloud / different computer + etc.

                Note that Synchronization provides also some backup capabilities by its nature of distributing the data to other computers.

                Restoring backup

                Let's assume you want to restore the weekly backup, here's how to do it:

                  -
                • find data directory Trilium uses - - easy way is to open "About Trilium Notes" from "Menu" in upper left corner - and looking at "data directory" +
                • find data directory Trilium uses - easy + way is to open "About Trilium Notes" from "Menu" in upper left corner and + looking at "data directory"
                  • I'll refer to ~/trilium-data as data directory from now on
                  diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation.html index 5ce56d645..b213daf6e 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation.html @@ -21,8 +21,8 @@
              • trilium-portable: Launches Trilium in portable mode, where - the data directory is created within - the application's directory, making it easy to move the entire setup.
              • + the data directory is created within the + application's directory, making it easy to move the entire setup.
              • trilium-safe-mode: Boots Trilium in "safe mode," disabling any startup scripts that might cause the application to crash.
              diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .html index 133c93d13..225d1183a 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application .html @@ -12,8 +12,8 @@ class="admonition note">

              Mobile interface

              By default, this will display the desktop user interface, even on mobile. To switch to the mobile version, simply go to the Global menu and select “Switch - to the mobile version”.

              + href="#root/_help_x3i7MxGccDuM">Global menu and select “Switch to the + mobile version”.

              Allowing the port externally on Windows with Windows Defender Firewall

              First, find out the IP of your desktop server by running ipconfig in your local terminal. Then try accessing http://<ip>:37840/login on diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html index afecd5fb1..5d994dac2 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Mobile Frontend.html @@ -1,7 +1,7 @@ -

              Trilium (server edition) has a - mobile web frontend which is optimized for touch based devices - smartphones - and tablets. It is activated automatically during login process based on - browser detection.

              +

              Trilium (server edition) has a mobile + web frontend which is optimized for touch based devices - smartphones and + tablets. It is activated automatically during login process based on browser + detection.

              Mobile frontend is limited in features compared to full desktop frontend. See below for more details on this.

              Note that this is not an Android/iOS app, this is just mobile friendly diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation.html index c1fcde150..0c34a40ae 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation.html @@ -27,8 +27,8 @@

              After setting up your server installation, you may want to configure settings such as the port or enable TLS. Configuration is managed via the Trilium config.ini file, which is located - in the data directory by default. - To begin customizing your setup, copy the provided config-sample.ini file + in the data directory by default. To begin + customizing your setup, copy the provided config-sample.ini file with default values to config.ini.

              You can also review the configuration file to provide all config.ini values as environment variables instead.

              diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.html index 53a0a5cd6..fbc6913c2 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually.html @@ -39,5 +39,5 @@ nohup TRILIUM_ENV=dev node src/www &
browser and navigate to http://localhost:8080 to access Trilium (replace "localhost" with your hostname).

TLS

-

Don't forget to configure TLS which - is required for secure usage!

\ No newline at end of file +

Don't forget to configure TLS which is + required for secure usage!

\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.html index 52566a4a0..726c89f2c 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux.html @@ -163,5 +163,5 @@ echo "Cleanup complete. Trilium updated to $LATEST_VERSION."

If you get an error like this, you need to either upgrade your glibc (typically by upgrading to up-to-date distribution version) or use some other server installation method.

TLS

-

Don't forget to configure TLS, which - is required for secure usage!

\ No newline at end of file +

Don't forget to configure TLS, which is + required for secure usage!

\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Authentication.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Authentication.html index 55a085b4b..b8d074e7d 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Authentication.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Authentication.html @@ -4,8 +4,7 @@ by adding the following to config.ini:

[General]
 noAuthentication=true

Disabling authentication will bypass even the Multi-Factor Authentication since - v0.94.1.

+ href="#root/_help_7DAiwaf8Z7Rz">Multi-Factor Authentication since v0.94.1.

Understanding how the session works

Once logged into Trilium, the application will store this information about the login into a cookie on the browser, but also as a session on @@ -22,10 +21,9 @@ cookieMaxAge=86400 the last interaction with the application.

Viewing active sessions

The login sessions are now stored in the same Database as the user data. In - order to view which sessions are active, open the SQL Console and run the following - query:

SELECT * FROM sessions
+ href="#root/_help_wX4HbRucYSDD">Database as the user data. In order + to view which sessions are active, open the SQL Console and run the following query:

SELECT * FROM sessions

Expired sessions are periodically cleaned by the server, generally an hourly interval.

See also

diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).html index c63e72e26..895aab2c7 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS).html @@ -3,8 +3,8 @@

Obtaining a TLS Certificate

@@ -20,8 +20,8 @@ class="admonition tip">

Modifying config.ini

Once you have your certificate, modify the config.ini file - in the data directory to configure - Trilium to use it:

[Network]
+    in the data directory to configure Trilium
+    to use it:

[Network]
 port=8080
 # Set to true for TLS/SSL/HTTPS (secure), false for HTTP (insecure).
 https=true
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.html
new file mode 100644
index 000000000..63c7458f1
--- /dev/null
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.html	
@@ -0,0 +1,37 @@
+

As an alternative to hosting your own Trilium instance, + there are two services out there that provide out of the box support for + Trilium.

+ +

Cloud instance providers

+

PikaPods

+
    +
  1. Go to pikapods.com  and sign + up.
  2. +
  3. In the “Available Apps” section, look for "TriliumNext +
     and select “Run your own”.
  4. +
  5. Follow the on-screen instructions to set up your own cloud hosted instance.
  6. +
+

PikaPods generally updates their Trilium instances to the latest version + within a two-week interval after a new version is released.

+

trilium.cc

+

Trilium.cc is a cloud service dedicated + to hosting a Trilium instance.

+ +

Matching your version with the cloud instance

+

Please note that once you set up Synchronization between + a cloud instance and desktop clients, it's + important that the version of the desktop application and the server match + up.

+

When setting up a cloud instance, it's best to check the version of the + server by accessing it via a web browser and going to the About section. + It's best that both the desktop and the server have the same App version; + however it's generally OK to update the desktop to a newer version than + the server if it has the same Sync version.

+

If the Sync version between the server and the desktop application + doesn't match, synchronization will not work.

\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html index d277c52e8..068a2b4d1 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Synchronization.html @@ -12,9 +12,9 @@

Setting Up Synchronization

Security Considerations

Setting up the server securely is critical and can be complex. It is crucial - to use a valid TLS certificate (HTTPS) - rather than an unencrypted HTTP connection to ensure security and avoid - potential vulnerabilities.

+ to use a valid TLS certificate (HTTPS) rather + than an unencrypted HTTP connection to ensure security and avoid potential + vulnerabilities.

Synchronizing a Desktop Instance with a Sync Server

This method is used when you already have a desktop instance of Trilium and want to set up a sync server on your web host.

@@ -26,7 +26,8 @@ instance address" to your sync server's address. Click Save.

- screenshot of the sync settings options modal + screenshot of the sync settings options modal

  1. Testing Sync: Click the "Test sync" button to verify @@ -45,7 +46,8 @@ to set up sync with a sync server.

- screenshot of the sync from server setup page + screenshot of the sync from server setup page

  1. Server Details: Configure the Trilium server address @@ -54,7 +56,8 @@ you will see the following screen:

- screenshot of the sync page + screenshot of the sync page

Once synchronization is complete, you will be automatically redirected to the Trilium application.

diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Upgrading TriliumNext.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Upgrading TriliumNext.html index 36d1cb7e4..f8836997f 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Upgrading TriliumNext.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Upgrading TriliumNext.html @@ -18,8 +18,8 @@ of Trilium and its database, you can restore the backup that is created prior to migration.

Sync Compatibility

-

The synchronization protocol used - by Trilium is versioned, requiring all members of the sync cluster to use - the same protocol version. Therefore, when upgrading to a new version, - you may need to upgrade all instances in the sync cluster. Changes to the - sync protocol version are typically indicated on the release page.

\ No newline at end of file +

The synchronization protocol used by Trilium + is versioned, requiring all members of the sync cluster to use the same + protocol version. Therefore, when upgrading to a new version, you may need + to upgrade all instances in the sync cluster. Changes to the sync protocol + version are typically indicated on the release page.

\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html index 64c7b080a..9d16f0ed7 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html @@ -17,8 +17,8 @@

Trilium will save these clippings as a new child note under a "clipper inbox" note.

-

By default, that's the day note but - you can override that by setting the label clipperInbox, +

By default, that's the day note but you + can override that by setting the label clipperInbox, on any other note.

If there's multiple clippings from the same page (and on the same day), then they will be added to the same note.

diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types.html index 0d1b2c0fd..9c69cade3 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types.html @@ -18,17 +18,16 @@

Creating a new note of a different type via add link or new tab

  • When adding a link in a Text note, type the desired title - of the new note and press Enter. Afterwards the type of the note will be - asked.
  • + href="#root/_help_iPIMuisry3hd">Text note, type the desired title of + the new note and press Enter. Afterwards the type of the note will be asked.
  • Similarly, when creating a new tab, type the desired title and press Enter.

Changing the type of a note

It is possible to change the type of a note after it has been created via the Basic Properties tab in the Ribbon. Note that it's generally a - good idea to change the note type only if the note is empty. Can also be - used to edit the source of a note.

+ href="#root/_help_BlN9DFI679QC">Ribbon. Note that it's generally a good idea + to change the note type only if the note is empty. Can also be used to + edit the source of a note.

Supported note types

The following note types are supported by Trilium:

diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html index 0c06f1279..642901b07 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections.html @@ -54,8 +54,8 @@ to display notes all across the tree, with advanced querying functionality.

To do so, simply start a Search and go to the Collection Properties tab in the Ribbon and select a desired type - of collection. To keep the search-based collection, use a Ribbon and select a desired type of + collection. To keep the search-based collection, use a Saved Search.

@@ -334,7 +335,8 @@ @@ -357,8 +359,8 @@ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Geo Map View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Geo Map View.html index b03e11835..8bda54c0e 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Geo Map View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Geo Map View.html @@ -5,8 +5,8 @@ href="#root/_help_0ESUbbAxVnoK">Note List. 

- +

This note type displays the children notes on a geographical map, based on an attribute. It is also possible to add new notes at a specific location @@ -25,8 +25,8 @@

@@ -35,8 +35,8 @@ @@ -136,8 +136,8 @@

How the location of the markers is stored

The location of a marker is stored in the #geolocation attribute of the child notes:

- +

This value can be added manually if needed. The value of the attribute is made up of the latitude and longitude separated by a comma.

Repositioning markers

@@ -191,8 +191,8 @@ height="278">

Icon and color of the markers

- image + image

The markers will have the same icon as the note.

It's possible to add a custom color to a marker by assigning them a #color attribute @@ -216,8 +216,8 @@ height="278">

@@ -243,8 +243,8 @@ height="278">

 

- +
#startDate=2025-02-14 #endDate=2025-02-15 ~for=@John Smith ~for=@Jane Doe #calendar:title="for"
- +
- +
1
- +
Right click on any note on the note tree and select Insert child noteGeo Map (beta).2
- +
By default the map will be empty and will show the entire world. 1
- +
Go to Google Maps on the web and look for a desired location, right click @@ -233,8 +233,8 @@ height="278"> 2
- +
In Trilium, create a child note under the map.3
- +
And then go to Owned Attributes and type #geolocation=", then @@ -313,8 +313,8 @@ height="278"> 1
- +
To add a track, simply drag & drop a .gpx file inside the geo map @@ -324,8 +324,8 @@ height="278"> 2
- +
In order for the file to be recognized as a GPS track, it needs to show @@ -335,8 +335,8 @@ height="278"> 3
- +
When going back to the map, the track should now be visible.       @@ -400,8 +400,8 @@ height="278"> of the scale of the map.

Troubleshooting

- +

Grid-like artifacts on the map

diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Grid View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Grid View.html index 1633c01e7..86c5f8e63 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Grid View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Grid View.html @@ -1,6 +1,6 @@
- +

This view presents the child notes in a grid format, allowing for a more visual navigation experience.

@@ -24,7 +24,7 @@ displayed instead.

The grid view is also used by default in the Note List of every note, making - it easy to navigate to children notes.

+ href="#root/_help_0ESUbbAxVnoK">Note List of every note, making it easy + to navigate to children notes.

Configuration

Unlike most other view types, the grid view is not actually configurable.

\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/List View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/List View.html index 68bac777e..f3e4926b4 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/List View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/List View.html @@ -1,6 +1,6 @@
- +

List view is similar to Grid View, but in the list view mode, each note is displayed in a single row with diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View.html index ca888c9cf..bf4f0192e 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Presentation View.html @@ -86,8 +86,8 @@ looking for the Collection Properties tab.

  • It's currently not possible to create custom themes, although it is planned.
  • Note that it is note possible to alter the CSS via Custom app-wide CSS because the - slides are rendered isolated (in a shadow DOM).
  • + href="#root/_help_AlhDUqhENtH7">Custom app-wide CSS because the slides + are rendered isolated (in a shadow DOM).

    At slide level:

      @@ -105,29 +105,29 @@ and background colors) and font size. Code blocks and tables also work.
    • Try using more than just text notes, the presentation uses the same mechanism as shared notes and Note List so it should be able - to display Mermaid Diagrams,  + href="#root/_help_0ESUbbAxVnoK">Note List so it should be able to display  Canvas and Mind Map in - full-screen (without the interactivity). -
        -
      • -

        Consider using a transparent background for Canvas, if the slides have a custom - background (go to the hamburger menu in the Canvas, press the button select - a custom color and write transparent).

        -
      • -
      • -

        For Mermaid Diagrams, - some of them have a predefined background which can be changed via the - frontmatter. For example, for XY-charts:

        ---
        +    class="reference-link" href="#root/_help_s1aBHPd79XYj">Mermaid Diagrams, Canvas and 
        +      Mind Map in full-screen (without the interactivity).
        +        
          +
        • +

          Consider using a transparent background for Canvas, if the slides have a custom background + (go to the hamburger menu in the Canvas, press the button select a custom + color and write transparent).

          +
        • +
        • +

          For Mermaid Diagrams, + some of them have a predefined background which can be changed via the + frontmatter. For example, for XY-charts:

          ---
           config:
               themeVariables:
                   xyChart:
                       backgroundColor: transparent
           ---
          -
        • -
        +
      • +

    Under the hood

    diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Table View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Table View.html index 2a8a23ef5..80e0a6990 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Table View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Collections/Table View.html @@ -1,6 +1,6 @@
    - +

    The table view displays information in a grid, where the rows are individual notes and the columns are Promoted Attributes. @@ -30,8 +30,8 @@

  • This simply counts the note and is affected by sorting.
  • -
  • Note ID, - representing the unique ID used internally by Trilium
  • +
  • Note ID, representing + the unique ID used internally by Trilium
  • The title of the note.
  • Interaction

    @@ -113,8 +113,8 @@

    Working with the data

    Sorting by column

    By default, the order of the notes matches the order in the Note Tree. However, it is possible - to sort the data by the values of a column:

    + href="#root/_help_oPVyFC7WL2Lp">Note Tree. However, it is possible to sort + the data by the values of a column:

    • To do so, simply click on a column.
    • To switch between ascending or descending sort, simply click again on @@ -170,8 +170,8 @@

      Limitations

      • Multi-value labels and relations are not supported. If a Promoted Attributes is defined - with a Multi value specificity, they will be ignored.
      • + href="#root/_help_OFXdgB2nNk1F">Promoted Attributes is defined with + a Multi value specificity, they will be ignored.
      • There is no support to filter the rows by a certain criteria. Consider using the table view in search for that use case.
      @@ -187,7 +187,6 @@
    • It's not possible to add a new row.

    Columns are supported, by being defined as Promoted Attributes to the  - Saved Search note.

    + href="#root/_help_OFXdgB2nNk1F">Promoted Attributes to the Saved Search note.

    Editing is also supported.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File.html index 104d8dd6a..dd82b050c 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File.html @@ -11,7 +11,8 @@

    Supported file types

    PDFs

    - +

    PDFs can be browsed directly from Trilium.

    Interaction:

    @@ -31,8 +32,8 @@

    Images

    - +

    Interaction:

      @@ -43,8 +44,8 @@

    Videos

    - +

    Video files can be added in as well. The file is streamed directly, so when accessing the note from a server it doesn't have to download the entire @@ -54,14 +55,14 @@ to be used with very large files. Uploading large videos will cause the  Database to balloon as well as the any Backup of it. In addition to that, - there might be slowdowns when first uploading the files. Otherwise, a large - database should not impact the general performance of Trilium significantly.

    + href="#root/_help_ODY7qQn5m2FT">Backup of it. In addition to that, there + might be slowdowns when first uploading the files. Otherwise, a large database + should not impact the general performance of Trilium significantly.

    Audio

    - +

    Adding a supported audio file will reveal a basic audio player that can be used to play it.

    @@ -76,8 +77,8 @@

    Text files

    - +

    Files that are identified as containing text will show a preview of their content. One common use case for this type of file is to embed text files @@ -95,8 +96,8 @@ application.

    Unknown file types

    - +

    If the file could not be identified as any of the supported file types from above, it will be treated as an unknown file. In this case, all the @@ -114,9 +115,7 @@

  • It is not possible to change the note type of a File note.
  • -
  • Convert into an attachment from the - note menu.
  • +
  • Convert into an attachment from the note menu.
  • Relation with other notes

      diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mind Map.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mind Map.html index 48766db0c..c47a4a034 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mind Map.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Mind Map.html @@ -1,6 +1,6 @@
      - +

      The mindmap allows for easy jotting down of ideas and storing them in a hierarchical fashion.

      @@ -31,8 +31,8 @@ relative to the root node (to the left, to the right, or to both sides).
    • In the Floating buttons area:
        -
      • An image reference can be copied, - to paste the mind map in a text note.
      • +
      • An image reference can be copied, to paste + the mind map in a text note.
      • The diagram can be exported either as SVG (vectorial) or PNG (raster).
    • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Note Map.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Note Map.html index 9c567f670..8e4a69e13 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Note Map.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Note Map.html @@ -1,6 +1,6 @@
      - +

      A Note map is a note type which displays a standalone version of the feature of the same name: Note Map (Link map, Tree map).

      diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html index 64ee6ff60..8176b4a4d 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Relation Map.html @@ -11,12 +11,12 @@
  • An existing note can also be dragged from the Note Tree. It will be placed at the - position it's dragged on. + href="#root/_help_oPVyFC7WL2Lp">Note Tree. It will be placed at the position + it's dragged on.
    • Multiple notes can also be dragged via Multiple selection. The notes will - be positioned near the dragged position without overlapping.
    • + href="#root/_help_yTjUdsOi4CIE">Multiple selection. The notes will be positioned + near the dragged position without overlapping.
    • The dragged note can be a sub-child of the map, or it can be at any arbitrary position.
    @@ -42,7 +42,8 @@

    Development process demo

    This is a basic example how you can create simple diagram using relation maps:

    - +

    And this is how you can create it:

    @@ -58,8 +59,8 @@ width="812" height="585">

    Family demo

    This is more complicated demo using some advanced concepts. Resulting diagram is here:

    - +

    This is how you get to it:

    diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Render Note.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Render Note.html index 0d8f4200a..010fcc823 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Render Note.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Render Note.html @@ -1,6 +1,6 @@
    - +

    Render Note is used in Scripting. It works by displaying the HTML of a Code note, diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Saved Search.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Saved Search.html index 6d6794743..2251e04ed 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Saved Search.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Saved Search.html @@ -10,6 +10,6 @@ style="width:50%;">

    Location

    By default, saved searches are stored in the day note. However, you can designate a different note to store saved searches by marking it with the #searchHome label. - Additionally, for workspaces, you - can use the #workspaceSearchHome label to specify a storage - location for saved searches within that workspace.

    \ No newline at end of file + Additionally, for workspaces, you can use + the #workspaceSearchHome label to specify a storage location + for saved searches within that workspace.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text.html index e6bfdc696..2c55d232c 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text.html @@ -7,8 +7,10 @@
  • The Floating toolbar is hidden by default and only appears when needed. In this mode there are actually two different toolbars:
    - - + +
  • A toolbar that appears when text is selected. This provides text-level formatting such as bold, italic, text colors, inline code, etc. @@ -175,8 +177,8 @@ to use the mouse. For a reference of all the key combinations, see  Keyboard Shortcuts. In addition, see Markdown-like formatting as an - alternative to the keyboard shortcuts.

    + href="#root/_help_QrtTYPmdd1qq">Markdown-like formatting as an alternative + to the keyboard shortcuts.

    Technical details

    For the text editing functionality, Trilium uses a commercial product (with an open-source base) called CKEditor. diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Bookmarks.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Bookmarks.html index 8e1e9979f..bc7b346e3 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Bookmarks.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Bookmarks.html @@ -1,5 +1,5 @@ -

    Bookmarks allows creating links to - a certain part of a note, such as referencing a particular heading.

    +

    Bookmarks allows creating links to a certain + part of a note, such as referencing a particular heading.

    Technically, bookmarks are HTML anchors.

    This feature was introduced in TriliumNext 0.94.0.

    Interaction

    @@ -8,9 +8,11 @@
    • Place the cursor at the desired position where to place the bookmark.
    • Look for the - button in the Formatting toolbar, + button in the Formatting toolbar, and then press the - button.
    • + button.
  • To place a link to a bookmark: diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting.html index be60556c4..dcd74f7f2 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting.html @@ -8,8 +8,8 @@ as shell commands (git in this case).

    To insert an inline code:

      -
    • Via the Formatting toolbar, - look for the +
    • Via the Formatting toolbar, look + for the button.
    • Type `code` where code is the desired text to be automatically formatted as inline code.
    • @@ -21,8 +21,7 @@

      A code block with JavaScript syntax highlight enabled.

      Note that these are not meant for very large portions of code. Use the - dedicated Code note type - instead.

      + dedicated Code note type instead.

      See the dedicated documentation for more information: Code blocks

      Keyboard shortcuts

      diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html index 1995e0191..866d29ccd 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html @@ -55,8 +55,7 @@

      Note that when editing a text note, syntax highlighting is automatically disabled if the code block is too big (somewhere around 500 lines). This value is currently not configurable. For Read-Only Notes, this limitation is - not applied.

      + href="#root/_help_CoFPLs3dRlXc">Read-Only Notes, this limitation is not applied.

      In order to configure this new feature, a section has been added in Options → Appearance to control the syntax highlighting. There the color scheme can be chosen, from a builtin selection of themes from Highlight.js.

      @@ -97,9 +96,9 @@ Code note type.

      The supported languages can be adjusted by going to Options, then Code Notes and - looking for the Available MIME types in the dropdown section. Simply - check any of the items to add them to the list, or uncheck them to remove - them from the list.

      + href="#root/_help_4TIF1oA4VQRO">Options, then Code Notes and looking + for the Available MIME types in the dropdown section. Simply check + any of the items to add them to the list, or uncheck them to remove them + from the list.

      Note that the list of languages is not immediately refreshed, you'd have to manually refresh the application.

      \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Footnotes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Footnotes.html index dc63ed511..4f15b318f 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Footnotes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Footnotes.html @@ -1,14 +1,14 @@
      - +

      Footnotes are a good place to insert references to a paragraph or details that are displayed at the bottom of the note.

      Interaction

      • To insert a new footnote, press - (or press the right arrow and select New footnote).
      • + (or press the right arrow and select New footnote).
      • To insert a reference to an existing footnote, press the right arrow and select Insert footnote, followed by the number of the footnote to insert.
      • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/General formatting.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/General formatting.html index 8ee8f6989..687950459 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/General formatting.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/General formatting.html @@ -79,7 +79,8 @@ the Remove formatting toolbar item.

        Remove formatting

        The - Remove formatting button is a quick way to eliminate the general + Remove formatting button is a quick way to eliminate the general formatting styling of a particular text.

        Simply select the text and press the button to remove the formatting (bold, italic, colors, sizes, etc.). If the text does not have any removable formatting, diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Highlights list.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Highlights list.html index b492c7cc0..8ee85d2c9 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Highlights list.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Highlights list.html @@ -1,6 +1,6 @@

        - +

        Similar to the Table of contents, but instead of headings this feature will list highlighted text from a diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images.html index d5badf0f9..c38380185 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images.html @@ -1,10 +1,9 @@

        Trilium supports storing and displaying images. Supported formats are JPEG, PNG and GIF.

        An image can be uploaded in the form of note's attachment or - as a standalone note placed into the - note tree. Its reference can be copied into a text note, in order - to display it in the text itself.

        + as a standalone note placed into the note tree. + Its reference can be copied into a text note, in order to display it in + the text itself.

        Uploading images

        To add an image to the note, simply drag it from file explorer onto the note editor inside Trilium and the image will be uploaded.

        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images/Image references.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images/Image references.html index c9b26fc84..3d5430ecc 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images/Image references.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Images/Image references.html @@ -1,6 +1,6 @@
        - +

        Image references are an easy way to embed the preview of another note type into a Text note.

        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Include Note.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Include Note.html index 6197d3e5d..d828b8fae 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Include Note.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Include Note.html @@ -7,9 +7,9 @@ button. There is also a keyboard shortcut defined for it but it is not allocated by default.

        Included notes in the share functionality

        -

        If a shared note contains one or - more included notes, they will be displayed in the content of the note - as if they were part of the note itself.

        +

        If a shared note contains one or more included + notes, they will be displayed in the content of the note as if they were + part of the note itself.

        For this to work, the included notes must also be shared, otherwise they will not be shown. However, the included notes can still be hidden from the note tree via #shareHiddenFromTree.

        \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Insert buttons.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Insert buttons.html index d74b7f43b..74dde6679 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Insert buttons.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Insert buttons.html @@ -1,13 +1,14 @@

        Press the - button in the Formatting toolbar to + button in the Formatting toolbar to reveal special inserable items and blocks such as symbols, Math expressions and separators.

        Bookmarks

        See the dedicated Bookmarks section.

        Emoji

        - +

        This feature allows inserting Unicode emoji characters. Simply select a category and a desired emoji to insert it.

        @@ -17,15 +18,17 @@ by a name of an emoji, triggering the display of a list of emojis. Simply use the arrow keys to select one and press Enter to insert it.

        +src="1_Insert buttons_plus.png" width="272" +height="187">

        Symbols

        - +

        Pressing the - button will reveal a popup window displaying a list of characters that + button will reveal a popup window displaying a list of characters that are generally more difficult to insert directly from the keyboard, such as a subset of emojis, quotation characters, etc.

        Interaction:

        @@ -39,14 +42,15 @@ src="1_Insert buttons_plus.png" width="272" height="187">

        See the dedicated Math Equations page.

        Mermaid diagram

        Press the - button to create an inline Mermaid diagram.

        + button to create an inline Mermaid diagram.

        This feature is quite similar to the Mermaid Diagrams note types and is meant as an alternative to it for simple diagrams. For more complex diagrams, use the Include Note feature for a dedicated Mermaid note.

        - +

        Horizontal ruler

        @@ -55,12 +59,13 @@ src="1_Insert buttons_plus.png" width="272" height="187"> button in the Formatting toolbar.

        + src="3_Insert buttons_image.png" width="502" + height="95">

        Alternatively, it's possible to insert a horizontal ruler by typing ---.

        Page break

        - +

        Page breaks provide a way to force the next paragraph or block (table, image, etc.) to be displayed onto the next page when printing (either to @@ -69,8 +74,8 @@ src="1_Insert buttons_plus.png" width="272" height="187"> but they will not actually be shown when printed.

        • To insert a page break, press the - in the formatting toolbar.
        • + in the formatting toolbar.
        • To insert many page breaks at once, insert a page break first, click on it and press Ctrl+C. Then use Ctrl+V, to paste as many times as needed.
        • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Keyboard shortcuts.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Keyboard shortcuts.html index b21042ae6..2ba326c91 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Keyboard shortcuts.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Keyboard shortcuts.html @@ -111,10 +111,10 @@

          Content editing

          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links.html index fa5d3dcef..52ab39530 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links.html @@ -31,5 +31,4 @@ press enter and you have a link.

          Note map

          Trilium provides a visualisation of incoming and outgoing links for a - particular note. See note map for - details.

          \ No newline at end of file + particular note. See note map for details.

          \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links/External links.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links/External links.html index e296eef5a..4bb65ae95 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links/External links.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Links/External links.html @@ -4,7 +4,8 @@

          To create a link without a custom text:

          • Press - in the Formatting toolbar: + in the Formatting toolbar:
            • A popup will appear, type or paste the URL in the box.
            • Press Enter or the check mark icon to confirm.
            • @@ -29,7 +30,8 @@ will remain.
            • To modify the link, click on the link to display the popup and press the Edit link button.
            • + src="External links_image.png" width="18" + height="18"> Edit link button.
            • To remove a link, click on it and press the Unlink button.
            • diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Lists.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Lists.html index ab94a50a7..6f2c332c6 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Lists.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Lists.html @@ -1,11 +1,14 @@

              There are three types of lists supported by text notes:

              • - Bulleted lists (also known as unordered lists).
              • + Bulleted lists (also known as unordered lists).
              • - Numbered lists (or ordered lists).
              • + Numbered lists (or ordered lists).
              • - To-do lists
              • + To-do lists

              For bulleted and numbered lists, it's possible to configure an alternative marker such as squares or Roman numbering by pressing the @@ -29,8 +32,8 @@

            • To exit out of the list, press Enter twice.
            • To merge two lists, simply delete the gap between them.
            • To create nested lists, simply use the - button (see Indentation in Other features) + button (see Indentation in Other features) or the Tab key. To decrease the nesting level for the current element, press Shift+Tab.
            @@ -71,7 +74,8 @@
          @@ -79,7 +83,8 @@ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Markdown-like formatting.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Markdown-like formatting.html index 165093de0..db63a583f 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Markdown-like formatting.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Markdown-like formatting.html @@ -1,7 +1,7 @@

          Markdown-like formatting allows inserting some basic formatting by typing the Markdown equivalent. Note that this does not mean that Text notes supports Markdown, - these are just some convenience shortcuts.

          + href="#root/_help_iPIMuisry3hd">Text notes supports Markdown, these + are just some convenience shortcuts.

          To import more complex formatting into text notes, consider using the Import from Markdown diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Math Equations.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Math Equations.html index 598f08cc7..405056011 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Math Equations.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Math Equations.html @@ -1,10 +1,11 @@

          - +

          Within text notes, it's possible to enter mathematical equations using the - button from the Formatting toolbar (generally + button from the Formatting toolbar (generally found under the Insert buttons).

          The mathematical expression must be written in the TeX format. There is no visual editor for the math equations, only a preview. 

          @@ -30,8 +31,8 @@ surrounded by $ characters for inline math expressions, and $$ for display mode.

          If you notice any issue with the Markdown import/export for equations, - feel free to report it while providing - the equation that causes issues.

          + feel free to report it while providing the + equation that causes issues.

          Formatting the equation

          It is possible to customize the font size and foreground color for both inline and display-mode equations, just like any other text. For inline diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Other features.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Other features.html index fe16dc603..ca8e824be 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Other features.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Other features.html @@ -1,25 +1,27 @@

          Indentation

          - +

          Paragraphs can be indented to the right using the  button from the  Formatting toolbar.

          • Press - to increase the indentation of the current paragraph by one. Can be pressed + to increase the indentation of the current paragraph by one. Can be pressed multiple times if needed.
          • Press - to decrease the indentation of a current paragraph. The button will be + to decrease the indentation of a current paragraph. The button will be disabled if it is already at the minimum indentation level.
          • For convenience, keyboard shortcuts are also available. Press Tab to indent or Shift+Tab to decrease the indentation. These shortcuts work even if the cursor is not at the beginning of a paragraph or a list.
          • Apart from paragraphs, the indent button is also enabled in Lists, where it can be used to create - nested lists.
          • + href="#root/_help_S6Xx8QIWTV66">Lists, where it can be used to create nested + lists.

          Markdown import

          If the clipboard contains Markdown text, it can be easily imported into @@ -38,14 +40,16 @@ not have access to the clipboard.

          Cut to subnote

          The - button will create a child note with the selected text. For more information, + button will create a child note with the selected text. For more information, see Cut to subnote.

          Find and replace

          - +

          The - button will open the editor's dedicated search and replace functionality.

          + button will open the editor's dedicated search and replace functionality.

          Alternatively, the Ctrl+F combination can be pressed to show the dialog.

          \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Premium features/Slash Commands.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Premium features/Slash Commands.html index ca453511a..bcd8f9556 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Premium features/Slash Commands.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Premium features/Slash Commands.html @@ -1,6 +1,6 @@
          - +
          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics.html index 1113d7587..42a8810fb 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics.html @@ -7,8 +7,8 @@

          Scripts

          Scripts don't have any special requirements. They can be run at will using the execute button in the UI or they can be configured to run at certain - times using Attributes on the note - containing the script.

          + times using Attributes on the note containing + the script.

          Global Events

          This attribute is called #run and it can have any of the following values:

          diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Logging.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Logging.html index c7db77f63..735117636 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Logging.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Logging.html @@ -1,8 +1,8 @@

          Both front-end and back-end notes can log messages for debugging.

          UI logging via api.log

          - +

          The API log feature integrates with the script editor and it displays all the messages logged via api.log. This works for both back-end diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting.html index 951ae6578..cc53090a9 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting.html @@ -16,8 +16,8 @@ In Linux, you can set it as follows:

          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, - start Triliumin "safe mode" to prevent any custom scripts from executing:

          TRILIUM_SAFE_MODE=true ./trilium
          + script or in an active custom widget, start + Triliumin "safe mode" to prevent any custom scripts from executing:

          TRILIUM_SAFE_MODE=true ./trilium

          Depending on your Trilium distribution, you may have pre-made scripts available: trilium-safe-mode.bat and trilium-safe-mode.sh.

          Once Trilium starts, locate and fix or delete the problematic note.

          @@ -36,11 +36,9 @@
        • Protected notes are irretrievable without the password.
        • Unprotected notes can be recovered. Follow these steps:
        • -

          Access the database file in the - data directory. Open the document.db file with an SQLite - client (e.g., DB Browser) and execute - the following queries:

          UPDATE options SET value = '77/twC5O00cuQgNC63VK32qOKKYwj21ev3jZDXoytVU=' WHERE name = 'passwordVerificationSalt';
          +

          Access the database file in the data directory. + Open the document.db file with an SQLite client (e.g., DB Browser) + and execute the following queries:

          UPDATE options SET value = '77/twC5O00cuQgNC63VK32qOKKYwj21ev3jZDXoytVU=' WHERE name = 'passwordVerificationSalt';
           UPDATE options SET value = '710BMasZCAgibzIc07X4P9Q4TeBd4ONnqJOho+pWcBM=' WHERE name = 'passwordDerivedKeySalt';
           UPDATE options SET value = 'Eb8af1/T57b89lCRuS97tPEl4CwxsAWAU7YNJ77oY+s=' WHERE name = 'passwordVerificationHash';
           UPDATE options SET value = 'QpC8XoiYYeqHPtHKRtbNxfTHsk+pEBqVBODYp0FkPBa22tlBBKBMigdLu5GNX8Uu' WHERE name = 'encryptedDataKey';
          @@ -56,6 +54,6 @@ UPDATE options SET value = 'QpC8XoiYYeqHPtHKRtbNxfTHsk+pEBqVBODYp0FkPBa22tlBBKBM \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Anonymized Database.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Anonymized Database.html index 1ae7334bf..41884e6c8 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Anonymized Database.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Anonymized Database.html @@ -22,8 +22,8 @@ file is stored in anonymized directory (placed in the data directory). You can safely attach it to a bug report.

          Command Line Anonymization

          -

          If your database is corrupted to - the point where Trilium cannot start, the anonymization process can still - be executed via the command line:

          node src/anonymize.js
          +

          If your database is corrupted to the point + where Trilium cannot start, the anonymization process can still be executed + via the command line:

          node src/anonymize.js

          Run this command from the directory containing Trilium's source files, typically found in the resources/app directory for desktop builds.

          \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Synchronization fails with 504.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Synchronization fails with 504.html index 0799b33f1..381bdcadd 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Synchronization fails with 504.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Troubleshooting/Synchronization fails with 504.html @@ -8,6 +8,6 @@ proxy_send_timeout 300; proxy_read_timeout 300; send_timeout 300;

          And restart the server.

          -

          See Nginx Proxy Setup for - more information about the Nginx setup.

          +

          See Nginx Proxy Setup for more + information about the Nginx setup.

          If it still doesn't work, try increasing the timeout.

          \ No newline at end of file diff --git a/apps/server/src/services/export/zip.ts b/apps/server/src/services/export/zip.ts index f7ef70bc8..3043e1636 100644 --- a/apps/server/src/services/export/zip.ts +++ b/apps/server/src/services/export/zip.ts @@ -43,8 +43,10 @@ async function exportToZip(taskContext: TaskContext<"export">, branch: BBranch, getNoteTargetUrl, archive, branch, - rewriteFn + rewriteFn, + zipExportOptions }; + switch (format) { case "html": return new HtmlExportProvider(providerData); @@ -117,6 +119,9 @@ async function exportToZip(taskContext: TaskContext<"export">, branch: BBranch, const title = note.getTitleOrProtected(); const completeTitle = branch.prefix ? `${branch.prefix} - ${title}` : title; let baseFileName = sanitize(completeTitle); + if (format === "share") { + baseFileName = sanitize(note.getOwnedLabelValue("shareAlias") || baseFileName); + } if (baseFileName.length > 200) { // the actual limit is 256 bytes(!) but let's be conservative diff --git a/apps/server/src/services/export/zip/abstract_provider.ts b/apps/server/src/services/export/zip/abstract_provider.ts index c9645a843..9d135de20 100644 --- a/apps/server/src/services/export/zip/abstract_provider.ts +++ b/apps/server/src/services/export/zip/abstract_provider.ts @@ -29,7 +29,7 @@ export interface ZipExportProviderData { branch: BBranch; getNoteTargetUrl: (targetNoteId: string, sourceMeta: NoteMeta) => string | null; archive: Archiver; - zipExportOptions?: AdvancedExportOptions; + zipExportOptions: AdvancedExportOptions | undefined; rewriteFn: RewriteLinksFn; } diff --git a/apps/server/src/services/export/zip/markdown.ts b/apps/server/src/services/export/zip/markdown.ts index 827f059d6..c876a5c16 100644 --- a/apps/server/src/services/export/zip/markdown.ts +++ b/apps/server/src/services/export/zip/markdown.ts @@ -8,18 +8,16 @@ export default class MarkdownExportProvider extends ZipExportProvider { prepareContent(title: string, content: string | Buffer, noteMeta: NoteMeta): string | Buffer { if (noteMeta.format === "markdown" && typeof content === "string") { - let markdownContent = mdService.toMarkdown(content); + content = this.rewriteFn(content, noteMeta); + content = mdService.toMarkdown(content); - if (markdownContent.trim().length > 0 && !markdownContent.startsWith("# ")) { - markdownContent = `# ${title}\r -${markdownContent}`; + if (content.trim().length > 0 && !content.startsWith("# ")) { + content = `\ +# ${title}\r +${content}`; } - - markdownContent = this.rewriteFn(markdownContent, noteMeta); - return markdownContent; - } else { - return content; } + return content; } afterDone() { } diff --git a/apps/server/src/services/export/zip/share_theme.ts b/apps/server/src/services/export/zip/share_theme.ts index bf989b06c..f06871857 100644 --- a/apps/server/src/services/export/zip/share_theme.ts +++ b/apps/server/src/services/export/zip/share_theme.ts @@ -4,20 +4,31 @@ import { ExportFormat, ZipExportProvider } from "./abstract_provider.js"; import { RESOURCE_DIR } from "../../resource_dir"; import { getResourceDir, isDev } from "../../utils"; import fs, { readdirSync } from "fs"; -import { renderNoteForExport } from "../../../share/content_renderer"; +import { getDefaultTemplatePath, readTemplate, renderNoteForExport } from "../../../share/content_renderer"; import type BNote from "../../../becca/entities/bnote.js"; import type BBranch from "../../../becca/entities/bbranch.js"; import { getShareThemeAssetDir } from "../../../routes/assets"; +import { convert as convertToText } from "html-to-text"; +import becca from "../../../becca/becca"; +import ejs from "ejs"; +import { t } from "i18next"; const shareThemeAssetDir = getShareThemeAssetDir(); +interface SearchIndexEntry { + id: string | null; + title: string; + content: string; + path: string; +} + export default class ShareThemeExportProvider extends ZipExportProvider { private assetsMeta: NoteMeta[] = []; private indexMeta: NoteMeta | null = null; + private searchIndex: Map = new Map(); prepareMeta(metaFile: NoteMetaFile): void { - const assets = [ "icon-color.svg" ]; @@ -48,8 +59,14 @@ export default class ShareThemeExportProvider extends ZipExportProvider { throw new Error("Missing note path."); } const basePath = "../".repeat(noteMeta.notePath.length - 1); + let searchContent = ""; if (note) { + // Prepare search index. + searchContent = typeof content === "string" ? convertToText(content, { + whitespaceCharacters: "\t\r\n\f\u200b\u00a0\u2002" + }) : ""; + content = renderNoteForExport(note, branch, basePath, noteMeta.notePath.slice(0, -1)); if (typeof content === "string") { content = content.replace(/href="[^"]*\.\/([a-zA-Z0-9_\/]{12})[^"]*"/g, (match, id) => { @@ -58,6 +75,17 @@ export default class ShareThemeExportProvider extends ZipExportProvider { }); content = this.rewriteFn(content, noteMeta); } + + // Prepare search index. + this.searchIndex.set(note.noteId, { + id: note.noteId, + title, + content: searchContent, + path: note.getBestNotePath() + .map(noteId => noteId !== "root" && becca.getNote(noteId)?.title) + .filter(noteId => noteId) + .join(" / ") + }); } return content; @@ -66,6 +94,15 @@ export default class ShareThemeExportProvider extends ZipExportProvider { afterDone(rootMeta: NoteMeta): void { this.#saveAssets(rootMeta, this.assetsMeta); this.#saveIndex(rootMeta); + this.#save404(); + + // Search index + for (const item of this.searchIndex.values()) { + if (!item.id) continue; + item.id = this.getNoteTargetUrl(item.id, rootMeta); + } + + this.archive.append(JSON.stringify(Array.from(this.searchIndex.values()), null, 4), { name: "search-index.json" }); } mapExtension(type: string | null, mime: string, existingExtension: string, format: ExportFormat): string | null { @@ -97,6 +134,12 @@ export default class ShareThemeExportProvider extends ZipExportProvider { } } + #save404() { + const templatePath = getDefaultTemplatePath("404"); + const content = ejs.render(readTemplate(templatePath), { t }); + this.archive.append(content, { name: "404.html" }); + } + } function getShareThemeAssets(nameWithExtension: string) { diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 3ab219f26..c830a92a2 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -15,6 +15,9 @@ import log from "../services/log.js"; import { join } from "path"; import { readFileSync } from "fs"; import { highlightAuto } from "@triliumnext/highlightjs"; +import becca from "../becca/becca.js"; +import { BAttachment } from "../services/backend_script_entrypoint.js"; +import SAttachment from "./shaca/entities/sattachment.js"; const shareAdjustedAssetPath = isDev ? assetPath : `../${assetPath}`; const templateCache: Map = new Map(); @@ -78,7 +81,9 @@ export function renderNoteForExport(note: BNote, parentBranch: BBranch, basePath `${basePath}assets/scripts.js` ], logoUrl: `${basePath}icon-color.svg`, - ancestors + faviconUrl: `${basePath}favicon.ico`, + ancestors, + isStatic: true }); } @@ -123,7 +128,9 @@ export function renderNoteContent(note: SNote) { cssToLoad, jsToLoad, logoUrl, - ancestors + ancestors, + isStatic: false, + faviconUrl: note.hasRelation("shareFavicon") ? `api/notes/${note.getRelationValue("shareFavicon")}/download` : `../favicon.ico` }); } @@ -134,6 +141,8 @@ interface RenderArgs { jsToLoad: string[]; logoUrl: string; ancestors: string[]; + isStatic: boolean; + faviconUrl: string; } function renderNoteContentInternal(note: SNote | BNote, renderArgs: RenderArgs) { @@ -150,7 +159,7 @@ function renderNoteContentInternal(note: SNote | BNote, renderArgs: RenderArgs) t, isDev, utils, - ...renderArgs + ...renderArgs, }; // Check if the user has their own template. @@ -196,14 +205,14 @@ function renderNoteContentInternal(note: SNote | BNote, renderArgs: RenderArgs) }); } -function getDefaultTemplatePath(template: string) { +export function getDefaultTemplatePath(template: string) { // Path is relative to apps/server/dist/assets/views return process.env.NODE_ENV === "development" ? join(__dirname, `../../../../packages/share-theme/src/templates/${template}.ejs`) : join(getResourceDir(), `share-theme/templates/${template}.ejs`); } -function readTemplate(path: string) { +export function readTemplate(path: string) { const cachedTemplate = templateCache.get(path); if (cachedTemplate) { return cachedTemplate; @@ -289,6 +298,13 @@ function renderText(result: Result, note: SNote | BNote) { result.isEmpty = document.textContent?.trim().length === 0 && document.querySelectorAll("img").length === 0; + const getNote = note instanceof BNote + ? (noteId: string) => becca.getNote(noteId) + : (noteId: string) => shaca.getNote(noteId); + const getAttachment = note instanceof BNote + ? (attachmentId: string) => becca.getAttachment(attachmentId) + : (attachmentId: string) => shaca.getAttachment(attachmentId); + if (!result.isEmpty) { // Process attachment links. for (const linkEl of document.querySelectorAll("a")) { @@ -300,7 +316,7 @@ function renderText(result: Result, note: SNote | BNote) { } if (href?.startsWith("#")) { - handleAttachmentLink(linkEl, href); + handleAttachmentLink(linkEl, href, getNote, getAttachment); } } @@ -319,12 +335,12 @@ function renderText(result: Result, note: SNote | BNote) { } } -function handleAttachmentLink(linkEl: HTMLElement, href: string) { +function handleAttachmentLink(linkEl: HTMLElement, href: string, getNote: (id: string) => SNote | BNote | null, getAttachment: (id: string) => BAttachment | SAttachment | null) { const linkRegExp = /attachmentId=([a-zA-Z0-9_]+)/g; let attachmentMatch; if ((attachmentMatch = linkRegExp.exec(href))) { const attachmentId = attachmentMatch[1]; - const attachment = shaca.getAttachment(attachmentId); + const attachment = getAttachment(attachmentId); if (attachment) { linkEl.setAttribute("href", `api/attachments/${attachmentId}/download`); @@ -334,12 +350,13 @@ function handleAttachmentLink(linkEl: HTMLElement, href: string) { linkEl.appendChild(new TextNode(attachment.title)); } else { linkEl.removeAttribute("href"); + log.error(`Broken attachment link detected in shared note: unable to find attachment with ID ${attachmentId}`); } } else { const [notePath] = href.split("?"); const notePathSegments = notePath.split("/"); const noteId = notePathSegments[notePathSegments.length - 1]; - const linkedNote = shaca.getNote(noteId); + const linkedNote = getNote(noteId); if (linkedNote) { const isExternalLink = linkedNote.hasLabel("shareExternalLink"); const href = isExternalLink ? linkedNote.getLabelValue("shareExternalLink") : `./${linkedNote.shareId}`; @@ -352,6 +369,7 @@ function handleAttachmentLink(linkEl: HTMLElement, href: string) { } linkEl.classList.add(`type-${linkedNote.type}`); } else { + log.error(`Broken link detected in shared note: unable to find note with ID ${noteId}`); linkEl.removeAttribute("href"); } } diff --git a/apps/server/src/share/routes.ts b/apps/server/src/share/routes.ts index 275474c2d..80544fd99 100644 --- a/apps/server/src/share/routes.ts +++ b/apps/server/src/share/routes.ts @@ -8,7 +8,7 @@ import searchService from "../services/search/services/search.js"; import SearchContext from "../services/search/search_context.js"; import type SNote from "./shaca/entities/snote.js"; import type SAttachment from "./shaca/entities/sattachment.js"; -import { renderNoteContent } from "./content_renderer.js"; +import { getDefaultTemplatePath, renderNoteContent } from "./content_renderer.js"; import utils from "../services/utils.js"; function addNoIndexHeader(note: SNote, res: Response) { @@ -110,7 +110,7 @@ function renderImageAttachment(image: SNote, res: Response, attachmentName: stri function render404(res: Response) { res.status(404); - const shareThemePath = `../../share-theme/templates/404.ejs`; + const shareThemePath = getDefaultTemplatePath("404"); res.render(shareThemePath); } diff --git a/docs/Developer Guide/!!!meta.json b/docs/Developer Guide/!!!meta.json index c039b67ef..93338db97 100644 --- a/docs/Developer Guide/!!!meta.json +++ b/docs/Developer Guide/!!!meta.json @@ -1,6 +1,6 @@ { "formatVersion": 2, - "appVersion": "0.99.1", + "appVersion": "0.99.3", "files": [ { "isClone": false, @@ -1717,6 +1717,33 @@ "format": "markdown", "dataFileName": "Hidden notes.md", "attachments": [] + }, + { + "isClone": false, + "noteId": "vphziLmQeQHY", + "notePath": [ + "jdjRLhLV3TtI", + "wbVIolLKDhe2", + "vphziLmQeQHY" + ], + "title": "Share", + "notePosition": 260, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-share-alt", + "isInheritable": false, + "position": 10 + } + ], + "format": "markdown", + "dataFileName": "Share.md", + "attachments": [] } ] }, diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Share.md b/docs/Developer Guide/Developer Guide/Development and architecture/Share.md new file mode 100644 index 000000000..22dc512f5 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Development and architecture/Share.md @@ -0,0 +1,30 @@ +# Share +## Share theme + +The share theme represents the layout, styles and scripts behind the Share notes functionality. The current implementation is a heavy adaptation of [trilium.rocks](https://trilium.rocks/) which is a third-party share theme. + +* The theme resides in `packages/share-theme`. +* The HTML is defined in `src/templates` using EJS templating. +* The `src/scripts` and `src/styles` subdirectories house the rest of the theme. + +## Building the share theme + +* In `packages/share-theme`, run `pnpm build` to trigger a build. This will generate `dist` which will then be used by the server. +* Alternatively, use `pnpm dev` to watch for changes. + +## Integration with the server for the share functionality + +The server renders the templates using EJS templating from the share theme and hosts the assets. + +* In dev mode, the templates and assets are served directly from `packages/share-theme/dist`. + * Modifications to the assets (scripts or styles) will reflect without having to restart the server. However the share theme needs to be built first (see previous section). + * Changes to the template will require a restart of the server, since they are cached. Simply press Enter in the console with `pnpm server:start` to quickly trigger a restart. +* In production mode, the share theme is automatically built by the server build script and copied to `dist/share-theme`. + +The server route handling this functionality is in `src/share/routes.ts`. + +## Exporting to static HTML files + +This functionality is also handled by the server, but in `src/services/export/zip/share_theme` instead. It works quite similar to the normal sharing functionality, but it uses `BNote` instead of `SNote` (and so on for other entity types), in order to work regardless of whether a note is shared or not. + +The same templates are used and rendered by the server, except that they are stored in a file instead of served to web clients. \ No newline at end of file diff --git a/docs/Release Notes/!!!meta.json b/docs/Release Notes/!!!meta.json index 57e84dc42..356c59d4a 100644 --- a/docs/Release Notes/!!!meta.json +++ b/docs/Release Notes/!!!meta.json @@ -1,6 +1,6 @@ { "formatVersion": 2, - "appVersion": "0.99.2", + "appVersion": "0.99.3", "files": [ { "isClone": false, diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index b73efe6a6..4d7a9b274 100644 --- a/docs/User Guide/!!!meta.json +++ b/docs/User Guide/!!!meta.json @@ -1,6 +1,6 @@ { "formatVersion": 2, - "appVersion": "0.99.1", + "appVersion": "0.99.3", "files": [ { "isClone": false, @@ -14,7 +14,43 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GTwFsgaA0lCt", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "shareAlias", + "value": "user-guide", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "label:shareAlias", + "value": "promoted,alias=Slug,single,text", + "isInheritable": true, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s3YCWHBfmYuM", + "isInheritable": false, + "position": 80 + } + ], "format": "markdown", "dataFileName": "User Guide.md", "attachments": [], @@ -152,6 +188,13 @@ "value": "bx bx-star", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "feature-highlights", + "isInheritable": false, + "position": 170 } ], "format": "markdown", @@ -178,6 +221,13 @@ "value": "bx bx-cog", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "setup", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -223,7 +273,7 @@ { "type": "label", "name": "shareAlias", - "value": "desktop-installation", + "value": "desktop", "isInheritable": false, "position": 30 } @@ -262,6 +312,13 @@ "value": "WOcw2SLH6tbX", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "desktop-as-server", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -404,7 +461,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "installation", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "attachments": [], "dirFileName": "1. Installing the server", @@ -443,7 +508,7 @@ { "type": "label", "name": "shareAlias", - "value": "packaged-server-installation", + "value": "packaged-server", "isInheritable": false, "position": 10 }, @@ -493,7 +558,7 @@ { "type": "label", "name": "shareAlias", - "value": "docker-server-installation", + "value": "docker", "isInheritable": false, "position": 30 }, @@ -529,7 +594,7 @@ { "type": "label", "name": "shareAlias", - "value": "nixos-server-installation", + "value": "nixos", "isInheritable": false, "position": 10 }, @@ -586,7 +651,7 @@ { "type": "label", "name": "shareAlias", - "value": "manual-server-installation", + "value": "manual", "isInheritable": false, "position": 20 }, @@ -622,7 +687,7 @@ { "type": "label", "name": "shareAlias", - "value": "kubernetes-server-installation", + "value": "kubernetes", "isInheritable": false, "position": 10 }, @@ -696,6 +761,13 @@ "value": "bx bxs-user-account", "isInheritable": false, "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "multiple-instances", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -719,7 +791,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "reverse-proxy", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "attachments": [], "dirFileName": "2. Reverse proxy", @@ -751,7 +831,7 @@ { "type": "label", "name": "shareAlias", - "value": "nginx-proxy-setup", + "value": "nginx", "isInheritable": false, "position": 10 } @@ -787,7 +867,7 @@ { "type": "label", "name": "shareAlias", - "value": "apache-proxy-setup", + "value": "apache", "isInheritable": false, "position": 10 } @@ -826,6 +906,13 @@ "value": "Gzjqa934BdH4", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "trusted-proxy", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -881,7 +968,7 @@ { "type": "label", "name": "shareAlias", - "value": "tls-configuration", + "value": "https", "isInheritable": false, "position": 20 }, @@ -940,6 +1027,13 @@ "value": "bx bx-user", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "auth", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -972,7 +1066,7 @@ { "type": "label", "name": "shareAlias", - "value": "multi-factor-authentication", + "value": "mfa", "isInheritable": false, "position": 10 }, @@ -987,6 +1081,62 @@ "format": "markdown", "dataFileName": "Multi-Factor Authentication.md", "attachments": [] + }, + { + "isClone": false, + "noteId": "yeEaYqosGLSh", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "yeEaYqosGLSh" + ], + "title": "Third-party cloud hosting", + "notePosition": 130, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "Dgg7bR3b6K9j", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "poXkQfguuA0U", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-cloud", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "cloud-hosting", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Third-party cloud hosting.md", + "attachments": [] } ] }, @@ -1243,7 +1393,7 @@ { "type": "label", "name": "shareAlias", - "value": "upgrading-trilium", + "value": "upgrading", "isInheritable": false, "position": 20 } @@ -1386,6 +1536,13 @@ "value": "bx bx-help-circle", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "concepts", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -1413,6 +1570,13 @@ "value": "bx bx-window-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ui", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -1476,6 +1640,13 @@ "value": "bx bxs-layout", "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "layouts", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -1560,6 +1731,13 @@ "value": "bx bx-menu", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "global-menu", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -1622,7 +1800,7 @@ { "type": "label", "name": "shareAlias", - "value": "tree-manipulation", + "value": "note-tree", "isInheritable": false, "position": 20 }, @@ -1827,6 +2005,13 @@ "value": "bx bx-menu", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "context-menu", + "isInheritable": false, + "position": 210 } ], "format": "markdown", @@ -1880,6 +2065,13 @@ "value": "bx bx-list-plus", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "multiple-selection", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -1939,6 +2131,13 @@ "value": "bx bxs-keyboard", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "keyboard-shortcuts", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -2123,6 +2322,13 @@ "value": "bx bx-dots-horizontal", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ribbon", + "isInheritable": false, + "position": 230 } ], "format": "markdown", @@ -2181,6 +2387,13 @@ "value": "bx bx-dock-top", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "tabs", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -2290,6 +2503,13 @@ "value": "bx bx-sidebar", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "launch-bar", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -2355,6 +2575,13 @@ "value": "bx bx-dots-vertical-rounded", "isInheritable": false, "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-buttons", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -2434,6 +2661,13 @@ "value": "bx bx-cog", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "options", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -2500,6 +2734,13 @@ "value": "bx bx-dock-right", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "split-view", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -2604,6 +2845,13 @@ "value": "bx bx-rectangle", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "floating-buttons", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -2669,6 +2917,13 @@ "value": "bx bxs-dock-right", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "right-sidebar", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -2734,6 +2989,13 @@ "value": "bx bx-history", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "recent-changes", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -2773,12 +3035,33 @@ "type": "text", "mime": "text/html", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "x3i7MxGccDuM", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "4TIF1oA4VQRO", + "isInheritable": false, + "position": 20 + }, { "type": "label", "name": "iconClass", "value": "bx bx-zoom-in", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "zoom", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -2892,6 +3175,13 @@ "value": "bx bx-message-detail", "isInheritable": false, "position": 100 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-tooltip", + "isInheritable": false, + "position": 110 } ], "format": "markdown", @@ -2997,7 +3287,7 @@ { "type": "label", "name": "shareAlias", - "value": "note", + "value": "notes", "isInheritable": false, "position": 30 }, @@ -3169,7 +3459,7 @@ { "type": "label", "name": "shareAlias", - "value": "cloning-notes", + "value": "cloning", "isInheritable": false, "position": 20 }, @@ -3232,6 +3522,13 @@ "value": "bx bx-rename", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "branch-prefix", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -3555,6 +3852,13 @@ "value": "bx bx-printer", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "printing-and-pdf-export", + "isInheritable": false, + "position": 110 } ], "format": "markdown", @@ -3667,7 +3971,7 @@ { "type": "label", "name": "shareAlias", - "value": "read-only-note", + "value": "read-only-notes", "isInheritable": false, "position": 30 }, @@ -3735,6 +4039,13 @@ "value": "bx bxs-grid", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-list", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -3773,6 +4084,13 @@ "value": "bx bx-navigation", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "navigation", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -3936,6 +4254,13 @@ "value": "bx bx-search-alt-2", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "quick-search", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -3987,6 +4312,13 @@ "value": "bx bx-send", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "jump-to", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -4374,6 +4706,13 @@ "value": "bx bx-bar-chart", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "similar-notes", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -4439,6 +4778,13 @@ "value": "bx bx-search-alt-2", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "search-in-note", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -4678,6 +5024,13 @@ "value": "bx bx-import", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "import-export", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -4783,6 +5136,13 @@ "value": "bx bx-code-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "supported-syntax", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -4810,7 +5170,7 @@ { "type": "label", "name": "shareAlias", - "value": "evernote-import", + "value": "evernote", "isInheritable": false, "position": 10 } @@ -4870,6 +5230,13 @@ "value": "bx bxs-yin-yang", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "zen-mode", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -4946,13 +5313,6 @@ "isInheritable": false, "position": 30 }, - { - "type": "relation", - "name": "internalLink", - "value": "cbkrhQjrkKrh", - "isInheritable": false, - "position": 40 - }, { "type": "label", "name": "shareAlias", @@ -4966,6 +5326,20 @@ "value": "bx bx-run", "isInheritable": false, "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "yeEaYqosGLSh", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -5214,6 +5588,13 @@ "value": "bx bx-edit", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-types", + "isInheritable": false, + "position": 190 } ], "format": "markdown", @@ -5395,7 +5776,7 @@ { "type": "label", "name": "shareAlias", - "value": "text-notes", + "value": "text", "isInheritable": false, "position": 10 }, @@ -5487,6 +5868,13 @@ "value": "bx bx-info-circle", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "blockquotes", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -5554,6 +5942,13 @@ "value": "bx bx-bookmark", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "bookmarks", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -5599,6 +5994,13 @@ "value": "bx bx-align-right", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "content-language", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -5636,6 +6038,13 @@ "value": "bx bx-cut", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "cut-to-subnote", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -5694,6 +6103,13 @@ "value": "bx bx-code-alt", "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "developer-formatting", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -5816,6 +6232,13 @@ "value": "bx bx-code", "isInheritable": false, "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "code-blocks", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -5871,6 +6294,13 @@ "value": "bx bx-bracket", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "footnotes", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -5937,6 +6367,13 @@ "value": "bx bx-text", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "formatting-toolbar", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -6026,6 +6463,13 @@ "value": "bx bx-bold", "isInheritable": false, "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "general-formatting", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -6130,6 +6574,13 @@ "value": "bx bx-highlight", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "highlights-list", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -6370,6 +6821,13 @@ "value": "bx bxs-file-image", "isInheritable": false, "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "image-references", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -6424,6 +6882,13 @@ "value": "R9pX4DGra2Vt", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "include-note", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -6503,6 +6968,13 @@ "value": "bx bx-plus", "isInheritable": false, "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "insert-buttons", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -6648,6 +7120,13 @@ "value": "bx bxs-keyboard", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "keyboard-shortcuts", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -6748,6 +7227,13 @@ "value": "bx bx-link-external", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "external-links", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -6809,6 +7295,13 @@ "value": "bx bx-link", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "reference-links", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -6855,6 +7348,13 @@ "value": "bx bx-list-ul", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "lists", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -7028,6 +7528,13 @@ "value": "bx bxl-markdown", "isInheritable": false, "position": 70 + }, + { + "type": "label", + "name": "shareAlias", + "value": "markdown-formatting", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -7077,6 +7584,13 @@ "value": "bx bx-math", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "math-equations", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -7150,6 +7664,13 @@ "value": "bx bxs-grid", "isInheritable": false, "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "other-features", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -7249,6 +7770,13 @@ "value": "bx bx-star", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "premium-features", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -7314,6 +7842,13 @@ "value": "bx bx-menu", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "slash-commands", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -7415,6 +7950,13 @@ "value": "bx bx-align-left", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "text-snippets", + "isInheritable": false, + "position": 100 } ], "format": "markdown", @@ -7490,6 +8032,13 @@ "value": "bx bx-heading", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "table-of-contents", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -7541,6 +8090,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "tables", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -7714,7 +8270,7 @@ { "type": "label", "name": "shareAlias", - "value": "code-notes", + "value": "code", "isInheritable": false, "position": 20 }, @@ -7941,6 +8497,13 @@ "value": "bx bxs-network-chart", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-map", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -8019,6 +8582,13 @@ "value": "bx bx-extension", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "render-note", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -8150,7 +8720,7 @@ { "type": "label", "name": "shareAlias", - "value": "book-note", + "value": "collections", "isInheritable": false, "position": 10 }, @@ -8203,6 +8773,13 @@ "value": "bx bx-calendar", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "calendar", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -8384,6 +8961,13 @@ "value": "bx bx-map-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "geomap", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -8601,6 +9185,13 @@ "value": "bx bxs-grid", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "grid", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -8652,6 +9243,13 @@ "value": "bx bx-list-ul", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "list", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -8738,6 +9336,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "table", + "isInheritable": false, + "position": 80 } ], "format": "markdown", @@ -8782,6 +9387,13 @@ "value": "bx bx-columns", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "board", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -8875,6 +9487,13 @@ "value": "bx bx-slideshow", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "presentation", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -8996,6 +9615,13 @@ "value": "bx bxs-network-chart", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "elk", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9042,6 +9668,13 @@ "value": "bx bx-pen", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "canvas", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9085,6 +9718,13 @@ "value": "bx bx-globe-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "webview", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9126,6 +9766,13 @@ "value": "bx bx-sitemap", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "mindmap", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -9239,6 +9886,13 @@ "value": "nBAXQFj20hS1", "isInheritable": false, "position": 120 + }, + { + "type": "label", + "name": "shareAlias", + "value": "file", + "isInheritable": false, + "position": 130 } ], "format": "markdown", @@ -9394,7 +10048,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "reporting-issues", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Reporting issues.md", "attachments": [] @@ -9557,6 +10219,13 @@ "value": "bx bx-server", "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "backend-logs", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -9585,6 +10254,13 @@ "value": "bx bx-window-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "frontend-logs", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9631,6 +10307,13 @@ "value": "ud6MShXL4WpO", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "sync-timeout", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9651,7 +10334,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "refreshing-app", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Refreshing the application.md", "attachments": [] @@ -9678,6 +10369,13 @@ "value": "bx bx-palette", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "theme-development", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9705,6 +10403,13 @@ "value": "WFGzWeUK6arS", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "creating-custom-theme", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9774,7 +10479,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "customize-next-theme", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Customize the Next theme.md", "attachments": [ @@ -9809,6 +10522,13 @@ "value": "d3fAXQ2diepH", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "reference", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9850,6 +10570,13 @@ "value": "zP3PMqaG71Ct", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "custom-appcss", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -9911,6 +10638,13 @@ "value": "bx bx-rocket", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "advanced-usage", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -10235,6 +10969,13 @@ "value": "bx bx-hash", "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "labels", + "isInheritable": false, + "position": 320 } ], "format": "markdown", @@ -10326,6 +11067,13 @@ "value": "bx bx-transfer", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "relations", + "isInheritable": false, + "position": 100 } ], "format": "markdown", @@ -10835,7 +11583,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "serving-raw", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Serving directly the content o.md", "attachments": [ @@ -10856,6 +11612,41 @@ "dataFileName": "1_Serving directly the conte.png" } ] + }, + { + "isClone": false, + "noteId": "ycBFjKrrwE9p", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "R9pX4DGra2Vt", + "ycBFjKrrwE9p" + ], + "title": "Exporting HTML for web publishing", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "R9pX4DGra2Vt", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-file-html", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "Exporting HTML for web publish.md", + "attachments": [] } ] }, @@ -11315,7 +12106,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "custom-resource-providers", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Custom Resource Providers.md", "attachments": [] @@ -11370,6 +12169,13 @@ "value": "/etapi/docs", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "api-reference", + "isInheritable": false, + "position": 20 } ], "dataFileName": "API Reference.dat", @@ -11517,6 +12323,13 @@ "value": "tAassRL4RSQL", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "manual-editing", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -11570,6 +12383,13 @@ "value": "bx bx-data", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "sql-console", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -11668,6 +12488,13 @@ "value": "bx bx-package", "isInheritable": false, "position": 110 + }, + { + "type": "label", + "name": "shareAlias", + "value": "demo-notes", + "isInheritable": false, + "position": 120 } ], "format": "markdown", @@ -11733,6 +12560,13 @@ "value": "cbkrhQjrkKrh", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "trilium-instance", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -11754,7 +12588,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "cors", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Cross-Origin Resource Sharing .md", "attachments": [] @@ -11824,6 +12666,13 @@ "value": "bx bx-list-plus", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "bulk-actions", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -11937,6 +12786,13 @@ "value": "bx bx-code", "isInheritable": false, "position": 120 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-source", + "isInheritable": false, + "position": 130 } ], "format": "markdown", @@ -11980,6 +12836,13 @@ "value": "bx bxs-component", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "technologies", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -12044,6 +12907,13 @@ "value": "NwBbFdNZ9h7O", "isInheritable": false, "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ckeditor", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -12072,6 +12942,13 @@ "value": "gBbsAeiuUxI5", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "mindelixir", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12100,6 +12977,13 @@ "value": "grjYqerjn243", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "excalidraw", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12128,6 +13012,13 @@ "value": "81SGnPGMk7Xc", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "leaflet", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12164,6 +13055,13 @@ "value": "bx bx-hash", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-id", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12184,7 +13082,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "internal-api", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "attachments": [], "dirFileName": "Internal API", @@ -12211,6 +13117,13 @@ "value": "/api/docs", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "api-reference", + "isInheritable": false, + "position": 20 } ], "dataFileName": "API Reference.dat", @@ -12435,6 +13348,13 @@ "value": "bx bx-hide", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "hidden-notes", + "isInheritable": false, + "position": 290 } ], "format": "markdown", @@ -12478,6 +13398,13 @@ "value": "bx bxs-data", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "metrics", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12567,6 +13494,13 @@ "value": "", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "llm", + "isInheritable": false, + "position": 40 } ], "attachments": [], @@ -12593,6 +13527,13 @@ "value": "vvUCN7FDkq7G", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "intro", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12722,6 +13663,13 @@ "value": "list", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "providers", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -12775,6 +13723,13 @@ "value": "", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ollama", + "isInheritable": false, + "position": 30 } ], "attachments": [], @@ -12796,7 +13751,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "installation", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Installing Ollama.md", "attachments": [ @@ -12867,7 +13830,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "openai", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "OpenAI.md", "attachments": [] @@ -12887,7 +13858,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "anthropic", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Anthropic.md", "attachments": [] @@ -13041,7 +14020,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "examples", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "attachments": [], "dirFileName": "Examples", @@ -13117,6 +14104,13 @@ "value": "bx bx-task", "isInheritable": false, "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "new-task-button", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -13147,7 +14141,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "responses-from-google-forms", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Downloading responses from Goo.md", "attachments": [] @@ -13167,7 +14169,15 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "promoted-attributes-config", + "isInheritable": false, + "position": 20 + } + ], "format": "markdown", "dataFileName": "Using promoted attributes to c.md", "attachments": [ @@ -13302,6 +14312,13 @@ "value": "s8alTXmpFR61", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "word-count", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -13439,6 +14456,13 @@ "value": "https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "frontend-api", + "isInheritable": false, + "position": 20 } ], "attachments": [], @@ -13467,6 +14491,13 @@ "value": "https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "fnote", + "isInheritable": false, + "position": 20 } ], "dataFileName": "FNote.dat", @@ -13496,6 +14527,13 @@ "value": "https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "backend-api", + "isInheritable": false, + "position": 20 } ], "dataFileName": "Backend API.dat", @@ -13531,6 +14569,13 @@ "value": "bx bx-terminal", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "logging", + "isInheritable": false, + "position": 30 } ], "format": "markdown", diff --git a/docs/User Guide/User Guide.md b/docs/User Guide/User Guide.md index 509f4b7b5..2c982cb38 100644 --- a/docs/User Guide/User Guide.md +++ b/docs/User Guide/User Guide.md @@ -1,2 +1,13 @@ # User Guide -The sub-children of this note are automatically synced. \ No newline at end of file +Trilium is an open-source solution for note-taking and organizing a personal knowledge base. Use it locally on your desktop, or sync it with your self-hosted server to keep your notes everywhere you go. + +For a quick overview of the application, visit our website at [triliumnotes.org](https://triliumnotes.org/). + +> [!TIP] +> The same documentation can be accessed locally from within the Trilium Notes application by pressing F1. + +## Getting started + +1. See Quick Start. +2. Understand Notes. +3. Browse through Collections. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish.md b/docs/User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish.md new file mode 100644 index 000000000..38453563f --- /dev/null +++ b/docs/User Guide/User Guide/Advanced Usage/Sharing/Exporting HTML for web publish.md @@ -0,0 +1,41 @@ +# Exporting HTML for web publishing +As described in Sharing, Trilium can act as a public server in which the shared notes are displayed in read-only mode. While this can work in most cases, it's generally not meant for high-traffic websites and since it's running on a Node.js server it can be potentially exploited. + +Another alternative is to generate static HTML files (just like other static site generators such as [MkDocs](https://www.mkdocs.org/)). Since the normal HTML ZIP export does not contain any styling or additional functionality, Trilium provides a way to export the same layout and style as the Sharing function into static HTML files. + +Apart from the enhanced security, these HTML files are also easy to deploy on “serverless” deployments such as GitHub Pages or CloudFlare Pages and cache very easily. + +> [!TIP] +> Trilium's documentation, available at [docs.triliumnotes.org](https://docs.triliumnotes.org/) is built using this function of exporting to static HTML files which are then deployed automatically to CloudFlare Pages. +> +> The process is [automated](https://github.com/TriliumNext/Trilium/blob/main/apps/edit-docs/src/build-docs.ts) by importing the Markdown documentation and exporting it via a script to the static web format. + +## Differences from normal sharing and export + +Apart from normal Sharing, exporting to static HTML files comes with a few subtle differences: + +* The URL structure is different. Where in normal sharing it's something along the way of `example.com/share/noteid`, the notes follow an hierarchical structure, such as `docs.triliumnotes.org/user-guide/concepts/navigation/tree-concepts`. +* The `favicon.ico` is not handled automatically, it needs to be manually added on the server after the export is generated. +* The “Last updated” for notes is not available. +* The search functionality works slightly different since the normal one requires an active API to work. In the static export, search still works but uses a different mechanism so results might be different. + +## Differences from normal .zip export + +* The name of the files/URLs will prefer `shareAlias` to allow for clean URLs. +* The export requires a functional web server as the pages will not render properly if accessed locally via a web browser due to the use of module scripts. + +## Testing locally + +As mentioned previously, the exported static pages require a website to function. In order to test locally, a web server needs to be used. + +One example is to use the Node.js-based [`http-server`](https://www.npmjs.com/package/http-server) which can be installed via: + +``` +npm i -g http-server +``` + +Once installed simply: + +1. Extract the exported .zip file. +2. Inside the extracted directory, run `http-server`. +3. Access the indicated address (e.g. http://localhost:8080). \ No newline at end of file diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.md index e69de29bb..88404cac3 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom.md @@ -0,0 +1,10 @@ +# Zoom +Zoom applies to the entire UI, including text. + +On the desktop application, use the Global menu to zoom in/out. + +On both web browser and the desktop, the keyboard shortcuts Ctrl+Shift++ and Ctrl+Shift+- can be used. + +## Adjusting the text size instead + +As an alternative to the zoom, the text size can be individually adjusted by going to Options → _Appearance_. \ No newline at end of file diff --git a/docs/User Guide/User Guide/FAQ.md b/docs/User Guide/User Guide/FAQ.md index 574512cbb..f98ba3815 100644 --- a/docs/User Guide/User Guide/FAQ.md +++ b/docs/User Guide/User Guide/FAQ.md @@ -1,4 +1,13 @@ # FAQ +## Inspiration for the name “Trilium” + +> Naming software is hard. I lived in Ontario when I first started the project and Trillium (the flower) is sort of a provincial logo, many institutions in Ontario are named "Trillium \[something\]". So I kept hearing/reading it almost everyday, I liked the sound of it and its nature motif, so I just reused it. +> +> _– Zadam (original Trilium maintainer)_ + +> [!NOTE] +> Despite the fact that the Trillium flower has two “l"s, the Trilium application only has one. + ## macOS support Originally, Trilium Notes considered the macOS build unsupported. TriliumNext commits to make the experience on macOS as good as possible. @@ -60,7 +69,7 @@ More detailed answer: ### Why does search sometimes find results with typos? -Trilium uses a progressive search strategy that includes fuzzy matching when exact matches return fewer than 5 results. This finds notes despite minor typos in your search query. You can use fuzzy search operators (`~=` for fuzzy exact match and `~*` for fuzzy contains). See the Search documentation for details. +Trilium uses a progressive search strategy that includes fuzzy matching when exact matches return fewer than 5 results. This finds notes despite minor typos in your search query. You can use fuzzy search operators (`~=` for fuzzy exact match and `~*` for fuzzy contains). See the Search documentation for details. ### How can I search for notes when I'm not sure of the exact spelling? diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.md new file mode 100644 index 000000000..ae7c7ef6c --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting.md @@ -0,0 +1,33 @@ +# Third-party cloud hosting +As an alternative to [hosting your own Trilium instance](1.%20Installing%20the%20server), there are two services out there that provide out of the box support for Trilium. + +> [!IMPORTANT] +> **Disclaimer**: The Trilium Notes project and maintainers are not directly affiliated with either of the projects. +> +> PikaPods have gracefully offered us free credits for testing purposes. + +## Cloud instance providers + +### PikaPods + +1. Go to [pikapods.com](https://www.pikapods.com)  and sign up. +2. In the “Available Apps” section, look for "TriliumNext +  and select “Run your own”. +3. Follow the on-screen instructions to set up your own cloud hosted instance. + +PikaPods generally updates their Trilium instances to the latest version within a two-week interval after a new version is released. + +### trilium.cc + +[Trilium.cc](https://trilium.cc/) is a cloud service dedicated to hosting a Trilium instance. + +> [!WARNING] +> Trilium.cc usually runs several versions behind Trilium releases. + +## Matching your version with the cloud instance + +Please note that once you set up Synchronization between a cloud instance and [desktop](../Desktop%20Installation.md) clients, it's important that the version of the desktop application and the server match up. + +When setting up a cloud instance, it's best to check the version of the server by accessing it via a web browser and going to the _About_ section. It's best that both the desktop and the server have the same _App version_; however it's generally OK to update the desktop to a newer version than the server if it has the same _Sync version_. + +If the _Sync version_ between the server and the desktop application doesn't match, synchronization will not work. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Quick Start.md b/docs/User Guide/User Guide/Quick Start.md index 61ec6cd6b..b94b0372e 100644 --- a/docs/User Guide/User Guide/Quick Start.md +++ b/docs/User Guide/User Guide/Quick Start.md @@ -3,17 +3,17 @@ **Local only desktop/laptop** - Allows a single instance on a desktop and will save the notes locally on that desktop. -1. [Desktop installation](Installation%20%26%20Setup/Desktop%20Installation.md) +* Desktop Installation **Server with web only access** - Installs the application on the server and allows access from any web browser on any device, including mobile. -1. [Server installation](Installation%20%26%20Setup/Server%20Installation.md) -2. [Mobile frontend](Installation%20%26%20Setup/Mobile%20Frontend.md) (optional) -3. [PikaPods managed hosting](https://www.pikapods.com/pods?run=trilium-next) +1. Server Installation +2. Mobile Frontend (optional) +3. Third-party cloud hosting **Combination of server and desktop/laptop** - Install the application on both a server, for web access and data synchronisation, and desktop instance(s). This allows all the data to be stored on the server and either accessed from the web browser, or the desktop application. The desktop application will sync and store the data locally so that it can be used when offline. -1. [Server installation](Installation%20%26%20Setup/Server%20Installation.md) -2. [Mobile frontend](Installation%20%26%20Setup/Mobile%20Frontend.md) (optional) -3. [Desktop installation](Installation%20%26%20Setup/Desktop%20Installation.md) -4. [Synchronization](Installation%20%26%20Setup/Synchronization.md) \ No newline at end of file +1. Server Installation +2. Mobile Frontend (optional) +3. Desktop Installation +4. Synchronization \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index 3d787e9ed..000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,191 +0,0 @@ -# MkDocs configuration for Trilium Notes documentation -site_name: Trilium Notes Documentation -site_url: https://docs.triliumnext.com -site_description: Trilium Notes is a hierarchical note taking application with focus on building large personal knowledge bases -site_author: Trilium Notes Team - -# Repository information -repo_name: triliumnext/trilium -repo_url: https://github.com/triliumnext/trilium -edit_uri: edit/main/docs/ - -# Copyright -copyright: Copyright © 2025 Trilium Notes - -# Use document-style URLs to fix image paths -use_directory_urls: false - -# Theme configuration -theme: - name: material - - # Color scheme - palette: - # Light mode - - media: "(prefers-color-scheme: light)" - scheme: default - primary: indigo - accent: deep-purple - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - # Dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - primary: blue-grey - accent: deep-purple - toggle: - icon: material/brightness-4 - name: Switch to light mode - - # Font configuration - font: - text: Inter - code: JetBrains Mono - - # Features - features: - - announce.dismiss - - content.action.edit - - content.action.view - - content.code.annotate - - content.code.copy - - content.tooltips - - navigation.footer - - navigation.indexes - - navigation.instant - - navigation.instant.prefetch - - navigation.instant.progress - - navigation.path - - navigation.prune - - navigation.sections - - navigation.tabs - - navigation.tabs.sticky - - navigation.top - - navigation.tracking - - search.highlight - - search.share - - search.suggest - - toc.follow - - toc.integrate - - # Icons - icon: - logo: material/note-multiple - repo: fontawesome/brands/github - -# Plugins -plugins: - - search: - separator: '[\s\-,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' - lang: - - en - - awesome-pages: - collapse_single_pages: false - strict: false - order: asc - sort_type: natural - order_by: title - - minify: - minify_html: true - minify_js: true - minify_css: true - htmlmin_opts: - remove_comments: true - - git-revision-date-localized: - enable_creation_date: true - type: iso_datetime - fallback_to_build_date: true - -# Extensions -markdown_extensions: - # Python Markdown - - abbr - - admonition - - attr_list - - def_list - - footnotes - - md_in_html - - toc: - permalink: true - permalink_title: Anchor link to this section for reference - - # Python Markdown Extensions - - pymdownx.arithmatex: - generic: true - - pymdownx.betterem: - smart_enable: all - - pymdownx.caret - - pymdownx.details - - pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg - - pymdownx.highlight: - anchor_linenums: true - line_spans: __span - pygments_lang_class: true - - pymdownx.inlinehilite - - pymdownx.keys - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.snippets - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format - - pymdownx.tabbed: - alternate_style: true - combine_header_slug: true - - pymdownx.tasklist: - custom_checkbox: true - - pymdownx.tilde - -# Extra CSS and JavaScript (if needed) -extra_css: - - stylesheets/extra.css - -extra_javascript: - - javascripts/extra.js - # MathJax for mathematical notation - - javascripts/mathjax.js - - https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js - -# Extra configuration -extra: - # Social links - social: - - icon: fontawesome/brands/github - link: https://github.com/triliumnext/trilium - - icon: fontawesome/brands/docker - link: https://hub.docker.com/r/triliumnext/trilium - - icon: fontawesome/solid/globe - link: https://trilium.cc - - # Analytics (optional - add your own if needed) - analytics: - provider: google - property: G-XXXXXXXXXX # Replace with your Google Analytics ID - feedback: - title: Was this page helpful? - ratings: - - icon: material/emoticon-happy-outline - name: This page was helpful - data: 1 - note: >- - Thanks for your feedback! - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: >- - Thanks for your feedback! Help us improve this page by - opening an issue. - - # Version - version: - provider: mike - default: stable - -# Navigation is automatically generated from folder structure by awesome-pages plugin -# To customize order or titles, create .pages files in directories diff --git a/package.json b/package.json index 73c717334..bc9283a4b 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "chore:generate-openapi": "tsx ./scripts/generate-openapi.ts", "chore:update-build-info": "tsx ./scripts/update-build-info.ts", "chore:update-version": "tsx ./scripts/update-version.ts", - "chore:fix-mkdocs-structure": "tsx ./scripts/fix-mkdocs-structure.ts", + "docs:build": "pnpm run --filter share-theme build && cd ./apps/edit-docs && tsx ./src/build-docs.ts", "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", diff --git a/packages/ckeditor5/src/theme/ck-content.css b/packages/ckeditor5/src/theme/ck-content.css index e9db06ec5..67dfe992e 100644 --- a/packages/ckeditor5/src/theme/ck-content.css +++ b/packages/ckeditor5/src/theme/ck-content.css @@ -26,6 +26,7 @@ padding: 1em; margin: 1.25em 0; position: relative; + padding-inline-start: 2.5em; overflow: hidden; } @@ -41,4 +42,18 @@ .admonition.tip { --accent-color: #40c025; } .admonition.important { --accent-color: #9839f7; } .admonition.caution { --accent-color: #ff2e2e; } -.admonition.warning { --accent-color: #e2aa03; } \ No newline at end of file +.admonition.warning { --accent-color: #e2aa03; } + +.admonition::before { + color: var(--accent-color); + font-family: boxicons !important; + position: absolute; + top: 1em; + inset-inline-start: 1em; +} + +.admonition.note::before { content: "\eb21"; } +.admonition.tip::before { content: "\ea0d"; } +.admonition.important::before { content: "\ea7c"; } +.admonition.caution::before { content: "\eac7"; } +.admonition.warning::before { content: "\eac5"; } \ No newline at end of file diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index 68916cc3e..c03ebc044 100644 --- a/packages/share-theme/package.json +++ b/packages/share-theme/package.json @@ -2,8 +2,10 @@ "name": "@triliumnext/share-theme", "version": "1.0.3", "description": "Adaptation of the trilium.rocks share theme", + "type": "module", "main": "index.js", "scripts": { + "dev": "esrun scripts/build.ts -- --watch", "build": "esrun scripts/build.ts", "build-scripts": "esrun scripts/build.ts -- --module=scripts", "build-styles": "esrun scripts/build.ts -- --module=styles", @@ -22,12 +24,14 @@ ], "license": "Apache-2.0", "dependencies": { + "boxicons": "2.1.4", + "fuse.js": "7.1.0", "katex": "0.16.25", - "mermaid": "11.12.0", - "boxicons": "2.1.4" + "mermaid": "11.12.0" }, "devDependencies": { "@digitak/esrun": "3.2.26", + "@triliumnext/ckeditor5": "workspace:*", "@types/swagger-ui": "5.21.1", "@typescript-eslint/eslint-plugin": "8.46.2", "@typescript-eslint/parser": "8.46.2", diff --git a/packages/share-theme/scripts/build.ts b/packages/share-theme/scripts/build.ts index 13b2ac493..8f90d0828 100644 --- a/packages/share-theme/scripts/build.ts +++ b/packages/share-theme/scripts/build.ts @@ -45,9 +45,9 @@ for (const mod of modulesRequested) { if (!entryPoints.length) for (const mod of modules) entryPoints.push(makeEntry(mod)); -async function runBuild() { +async function runBuild(watch: boolean) { const before = performance.now(); - await esbuild.build({ + const opts: esbuild.BuildOptions = { entryPoints: entryPoints, bundle: true, splitting: true, @@ -68,9 +68,16 @@ async function runBuild() { logLevel: "info", metafile: true, minify: process.argv.includes("--minify") - }); - const after = performance.now(); - console.log(`Build actually took ${(after - before).toFixed(2)}ms`); + }; + if (watch) { + const ctx = esbuild.context(opts); + (await ctx).watch(); + } else { + await esbuild.build(opts); + const after = performance.now(); + console.log(`Build actually took ${(after - before).toFixed(2)}ms`); + } } -runBuild().catch(console.error); +const watch = process.argv.includes("--watch"); +runBuild(watch).catch(console.error); diff --git a/packages/share-theme/src/scripts/index.ts b/packages/share-theme/src/scripts/index.ts index a809962aa..4769ea76e 100644 --- a/packages/share-theme/src/scripts/index.ts +++ b/packages/share-theme/src/scripts/index.ts @@ -1,13 +1,13 @@ -import setupToC from "./modules/toc"; -import setupExpanders from "./modules/expanders"; -import setupMobileMenu from "./modules/mobile"; -import setupSearch from "./modules/search"; -import setupThemeSelector from "./modules/theme"; -import setupMermaid from "./modules/mermaid"; -import setupMath from "./modules/math"; -import api from "./modules/api"; -import "boxicons/css/boxicons.min.css"; +import setupToC from "./modules/toc.js"; +import setupExpanders from "./modules/expanders.js"; +import setupMobileMenu from "./modules/mobile.js"; +import setupSearch from "./modules/search.js"; +import setupThemeSelector from "./modules/theme.js"; +import setupMermaid from "./modules/mermaid.js"; +import setupMath from "./modules/math.js"; +import api from "./modules/api.js"; import "highlight.js/styles/default.css"; +import "@triliumnext/ckeditor5/src/theme/ck-content.css"; function $try unknown>(func: T, ...args: Parameters) { try { diff --git a/packages/share-theme/src/scripts/modules/mobile.ts b/packages/share-theme/src/scripts/modules/mobile.ts index a5c211106..f311f5618 100644 --- a/packages/share-theme/src/scripts/modules/mobile.ts +++ b/packages/share-theme/src/scripts/modules/mobile.ts @@ -1,25 +1,25 @@ -import parents from "../common/parents"; +import parents from "../common/parents.js"; export default function setupMobileMenu() { function toggleMobileMenu(event: MouseEvent) { event.stopPropagation(); // Don't prevent default for links - + const isOpen = document.body.classList.contains("menu-open"); if (isOpen) return document.body.classList.remove("menu-open"); return document.body.classList.add("menu-open"); } - + const showMenuButton = document.getElementById("show-menu-button"); showMenuButton?.addEventListener("click", toggleMobileMenu); - + window.addEventListener("click", e => { const isOpen = document.body.classList.contains("menu-open"); if (!isOpen) return; // This listener is only to close - + // If the click was anywhere in the mobile nav, don't close if (parents(e.target as HTMLElement, "#left-pane").length) return; return toggleMobileMenu(e); }); - -} \ No newline at end of file + +} diff --git a/packages/share-theme/src/scripts/modules/search.ts b/packages/share-theme/src/scripts/modules/search.ts index 768b9421f..4abf90ee5 100644 --- a/packages/share-theme/src/scripts/modules/search.ts +++ b/packages/share-theme/src/scripts/modules/search.ts @@ -1,7 +1,9 @@ -import debounce from "../common/debounce"; -import parents from "../common/parents"; -import parseHTML from "../common/parsehtml"; +import debounce from "../common/debounce.js"; +import parents from "../common/parents.js"; +import parseHTML from "../common/parsehtml.js"; +import type { default as Fuse } from "fuse.js"; +let fuseInstance: Fuse | null = null; interface SearchResults { results: SearchResult[]; @@ -10,7 +12,7 @@ interface SearchResults { interface SearchResult { id: string; title: string; - score: number; + score?: number; path: string; } @@ -30,12 +32,10 @@ export default function setupSearch() { searchInput.addEventListener("keyup", debounce(async () => { // console.log("CHANGE EVENT"); - const ancestor = document.body.dataset.ancestorNoteId; const query = searchInput.value; if (query.length < 3) return; - const resp = await fetch(`api/notes?search=${query}&ancestorNoteId=${ancestor}`); - const json = await resp.json() as SearchResults; - const results = json.results.slice(0, 5); + const resp = await fetchResults(query); + const results = resp.results.slice(0, 5); const lines = [`
          `]; for (const result of results) { lines.push(buildResultItem(result)); @@ -62,3 +62,42 @@ export default function setupSearch() { if (existing) existing.remove(); }); } + +async function fetchResults(query: string): Promise { + const linkHref = document.head.querySelector("link[rel=stylesheet]")?.getAttribute("href"); + const rootUrl = linkHref?.split("/").slice(0, -2).join("/") || "."; + + if ((window as any).glob.isStatic) { + // Load the search index. + if (!fuseInstance) { + const searchIndex = await (await fetch(`${rootUrl}/search-index.json`)).json(); + const Fuse = (await import("fuse.js")).default; + fuseInstance = new Fuse(searchIndex, { + keys: [ + "title", + "content" + ], + includeScore: true, + threshold: 0.65, + ignoreDiacritics: true, + ignoreLocation: true, + ignoreFieldNorm: true, + useExtendedSearch: true + }); + } + + // Do the search. + const results = fuseInstance.search(query, { limit: 5 }); + console.debug("Search results:", results); + const processedResults = results.map(({ item, score }) => ({ + ...item, + id: rootUrl + "/" + item.id, + score + })); + return { results: processedResults }; + } else { + const ancestor = document.body.dataset.ancestorNoteId; + const resp = await fetch(`api/notes?search=${query}&ancestorNoteId=${ancestor}`); + return await resp.json() as SearchResults; + } +} diff --git a/packages/share-theme/src/scripts/modules/theme.ts b/packages/share-theme/src/scripts/modules/theme.ts index 39f34341f..466a042a7 100644 --- a/packages/share-theme/src/scripts/modules/theme.ts +++ b/packages/share-theme/src/scripts/modules/theme.ts @@ -1,29 +1,27 @@ -const prefersDark = localStorage.getItem("theme") === "dark" || (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); -if (prefersDark) { - document.body.classList.add("theme-dark"); - document.body.classList.remove("theme-light"); -} else { - document.body.classList.remove("theme-dark"); - document.body.classList.add("theme-light"); -} +const themeRootEl = document.documentElement; + +/** + * Note: + * + * - Setting of the .theme-dark or .theme-light is done in the share template's to avoid a flash. + * - Setting of the value of the checkbox is also done in the template, near the definition of the input box. + */ export default function setupThemeSelector() { const themeSwitch: HTMLInputElement = document.querySelector(".theme-selection input")!; - - const themeSelection: HTMLDivElement = document.querySelector(".theme-selection")!; - themeSelection.classList.add("no-transition"); - themeSwitch.checked = prefersDark; - setTimeout(() => themeSelection.classList.remove("no-transition"), 400); - themeSwitch?.addEventListener("change", () => { - if (themeSwitch.checked) { - document.body.classList.add("theme-dark"); - document.body.classList.remove("theme-light"); - localStorage.setItem("theme", "dark"); - } else { - document.body.classList.remove("theme-dark"); - document.body.classList.add("theme-light"); - localStorage.setItem("theme", "light"); - } + const theme = themeSwitch.checked ? "dark" : "light"; + setTheme(theme); + localStorage.setItem("theme", theme); }); } + +function setTheme(theme: string) { + if (theme === "dark") { + themeRootEl.classList.add("theme-dark"); + themeRootEl.classList.remove("theme-light"); + } else { + themeRootEl.classList.remove("theme-dark"); + themeRootEl.classList.add("theme-light"); + } +} diff --git a/packages/share-theme/src/styles/base.css b/packages/share-theme/src/styles/base.css index a6ad1e4f1..6229efa60 100644 --- a/packages/share-theme/src/styles/base.css +++ b/packages/share-theme/src/styles/base.css @@ -68,37 +68,6 @@ iframe.pdf-view { left: 1px; } -@media (max-width: 48em) { - #layout.showMenu #menu { - display: block; - margin-top: 40px; - } - - #toggleMenuButton { - display: block; - } - - #layout.showMenu #main { - display: none; - } - - #title { - padding-left: 60px; - } - - #layout.showMenu #toggleMenuButton::after { - content: "«"; - } - - #toggleMenuButton::after { - content: "»"; - } - - #menu { - display: none; - } -} - .ck-content .footnote-section { border-top: 1px solid #c4c4c4; border-radius: 2px; diff --git a/packages/share-theme/src/styles/content.css b/packages/share-theme/src/styles/content.css index e67be725a..47111f978 100644 --- a/packages/share-theme/src/styles/content.css +++ b/packages/share-theme/src/styles/content.css @@ -25,6 +25,7 @@ .ck-content pre { overflow: auto; position: relative; + min-width: unset !important; } .ck-content pre .copy-button { @@ -46,6 +47,7 @@ #content img { max-width: 100%; + height: auto; } body:not(.math-loaded) .math-tex { diff --git a/packages/share-theme/src/styles/index.css b/packages/share-theme/src/styles/index.css index 095f80835..530db1b7b 100644 --- a/packages/share-theme/src/styles/index.css +++ b/packages/share-theme/src/styles/index.css @@ -1,3 +1,5 @@ +@import "boxicons/css/boxicons.min.css"; + @import "./base.css"; @import "./childlinks.css"; @import "./externallinks.css"; @@ -30,7 +32,19 @@ Accent Color Ideas --text-link: #FFB628; */ -:root { +html.theme-light { + --background-primary: #FFFFFF; + --background-secondary: #F3F3F3; + --background-highlight: #DDDDDD; + --background-active: #777777; + --text-primary: #000000; + --text-heading: #000000; + --text-menu: #333333; + --text-link: #0000ff; + color-scheme: light; +} + +html.theme-dark { --background-primary: #333333; --background-secondary: #1F1F1F; --background-highlight: #484848; @@ -43,18 +57,6 @@ Accent Color Ideas color-scheme: dark; } -body.theme-light { - --background-primary: #FFFFFF; - --background-secondary: #F3F3F3; - --background-highlight: #DDDDDD; - --background-active: #777777; - --text-primary: #000000; - --text-heading: #000000; - --text-menu: #333333; - --text-link: #0000ff; - color-scheme: light; -} - body { background: var(--background-primary); font-family: 'Montserrat', 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif; diff --git a/packages/share-theme/src/styles/layout.css b/packages/share-theme/src/styles/layout.css index 947c411b7..46cabca6e 100644 --- a/packages/share-theme/src/styles/layout.css +++ b/packages/share-theme/src/styles/layout.css @@ -1,13 +1,21 @@ +html, +body { + width: 100vw; + height: 100vh; +} + #split-pane { display: flex; flex-direction: row; - gap: 50px; + width: 100vw; + height: 100vh; + overflow: hidden; } #left-pane { display: flex; - width: calc((100vw - 900px) / 2); min-width: fit-content; + max-width: 20vw; height: calc(100vh); background: var(--background-secondary); border-right: 5px solid var(--background-highlight); @@ -15,18 +23,27 @@ position: sticky; top: 0; overflow-y: auto; + flex-shrink: 0; } #right-pane { display: flex; margin: 0 auto; - gap: 40px; flex: 1; - padding-right: 50px; + overflow: auto; } #main { order: 2; max-width: 900px; flex: 1; + padding: 0 20px; + box-sizing: border-box; + width: 100%; +} + +@media (min-width: 1200px) { + #main { + padding: 0 50px; + } } \ No newline at end of file diff --git a/packages/share-theme/src/styles/mobile.css b/packages/share-theme/src/styles/mobile.css index d0959b351..3b8d95051 100644 --- a/packages/share-theme/src/styles/mobile.css +++ b/packages/share-theme/src/styles/mobile.css @@ -35,9 +35,18 @@ @media (max-width: 48em) { + html, + body { + width: unset; + height: unset; + } + + #split-pane { + overflow: auto; + } + #right-pane, #main { width: 100%; - overflow: hidden; padding: 0; } @@ -45,7 +54,6 @@ padding: 1rem; } - #mobile-header { display: flex; } diff --git a/packages/share-theme/src/styles/navbar/header.css b/packages/share-theme/src/styles/navbar/header.css index 21eecb6e9..0cb93c2c2 100644 --- a/packages/share-theme/src/styles/navbar/header.css +++ b/packages/share-theme/src/styles/navbar/header.css @@ -72,14 +72,6 @@ input:checked + .slider:before { justify-content: space-between; } -.theme-selection.no-transition .slider, -.theme-selection.no-transition .slider::before, -.theme-selection.no-transition .dark-icon, -.theme-selection.no-transition .light-icon { - transition: none!important; -} - - .theme-selection label { position: relative; } diff --git a/packages/share-theme/src/templates/page.ejs b/packages/share-theme/src/templates/page.ejs index 0196bfddc..0a7db95b4 100644 --- a/packages/share-theme/src/templates/page.ejs +++ b/packages/share-theme/src/templates/page.ejs @@ -29,7 +29,7 @@ - api/notes/<%= note.getRelation("shareFavicon").value %>/download<% } else { %>../favicon.ico<% } %>"> + <% for (const url of cssToLoad) { %> <% } %> @@ -54,6 +54,19 @@ } %> <%= pageTitle %> + "> @@ -78,8 +91,6 @@ const logoWidth = subRoot.note.getLabelValue("shareLogoWidth") ?? 53; const logoHeight = subRoot.note.getLabelValue("shareLogoHeight") ?? 40; const mobileLogoHeight = logoHeight && logoWidth ? 32 / (logoWidth / logoHeight) : ""; const shareRootLink = subRoot.note.hasLabel("shareRootLink") ? subRoot.note.getLabelValue("shareRootLink") : `./${subRoot.note.noteId}`; -const currentTheme = note.getLabel("shareTheme") === "light" ? "light" : "dark"; -const themeClass = currentTheme === "light" ? " theme-light" : " theme-dark"; const headingRe = /()(.+?)(<\/h[1-6]>)/g; const headingMatches = [...content.matchAll(headingRe)]; content = content.replaceAll(headingRe, (...match) => { @@ -88,7 +99,7 @@ content = content.replaceAll(headingRe, (...match) => { return match[0]; }); %> - + <%- renderSnippets("body:start") %>
          @@ -108,11 +119,15 @@ content = content.replaceAll(headingRe, (...match) => {
          <%= t("share_theme.site-theme") %> +
          <% if (hasTree) { %>
          @@ -167,7 +182,7 @@ content = content.replaceAll(headingRe, (...match) => { <% } %>
          - <% if (!isEmpty) { %> + <% if (!isEmpty && !isStatic) { %>
          <% const lastUpdated = new Date(note.utcDateModified); %> <%- t("share_theme.last-updated", { date: ``}) %> diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d2016b20..df172fbba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -458,6 +458,9 @@ importers: better-sqlite3: specifier: 12.4.1 version: 12.4.1 + html-to-text: + specifier: 9.0.5 + version: 9.0.5 node-html-parser: specifier: 7.0.1 version: 7.0.1 @@ -1332,6 +1335,9 @@ importers: boxicons: specifier: 2.1.4 version: 2.1.4 + fuse.js: + specifier: 7.1.0 + version: 7.1.0 katex: specifier: 0.16.25 version: 0.16.25 @@ -1342,6 +1348,9 @@ importers: '@digitak/esrun': specifier: 3.2.26 version: 3.2.26 + '@triliumnext/ckeditor5': + specifier: workspace:* + version: link:../ckeditor5 '@types/swagger-ui': specifier: 5.21.1 version: 5.21.1 @@ -1394,18 +1403,6 @@ importers: specifier: 0.0.3 version: 0.0.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) - packages/uikit: - dependencies: - '@triliumnext/commons': - specifier: workspace:* - version: link:../commons - '@triliumnext/highlightjs': - specifier: workspace:* - version: link:../highlightjs - jquery: - specifier: 3.7.1 - version: 3.7.1 - packages: '@ampproject/remapping@2.3.0': @@ -4363,6 +4360,9 @@ packages: '@scarf/scarf@1.4.0': resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + '@selderee/plugin-htmlparser2@0.11.0': + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@sideway/address@4.1.5': resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==} @@ -8100,6 +8100,10 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + fuse.js@7.1.0: + resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} + engines: {node: '>=10'} + futoin-hkdf@1.5.3: resolution: {integrity: sha512-SewY5KdMpaoCeh7jachEWFsh1nNlaDjNHZXWqL5IGwtpEYHTgkr2+AMCgNwKWkcc0wpSYrZfR7he4WdmHFtDxQ==} engines: {node: '>=8'} @@ -8500,6 +8504,10 @@ packages: resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} engines: {node: '>=8'} + html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} @@ -9333,6 +9341,9 @@ packages: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} + leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + leaflet-gpx@2.2.0: resolution: {integrity: sha512-iVUx6o0ydLn2ikYSVLuWnr0k/CDAOIUtmvQ91AI24/PXuIFIb+iEIJMHTQfvGhMCKcFrwd9ZaFYH7P/46tgGhw==} @@ -10601,6 +10612,9 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -10682,6 +10696,9 @@ packages: resolution: {integrity: sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==} engines: {node: '>=14', npm: '>=7'} + peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + peek-readable@4.1.0: resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} engines: {node: '>=8'} @@ -12330,6 +12347,9 @@ packages: secure-compare@3.0.1: resolution: {integrity: sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==} + selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -15027,8 +15047,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.1.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15281,8 +15299,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: @@ -18714,6 +18730,11 @@ snapshots: '@scarf/scarf@1.4.0': {} + '@selderee/plugin-htmlparser2@0.11.0': + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + '@sideway/address@4.1.5': dependencies: '@hapi/hoek': 9.3.0 @@ -23647,6 +23668,8 @@ snapshots: functions-have-names@1.2.3: {} + fuse.js@7.1.0: {} + futoin-hkdf@1.5.3: {} fuzzy@0.1.3: {} @@ -24165,6 +24188,14 @@ snapshots: html-tags@3.3.1: {} + html-to-text@9.0.5: + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + html-void-elements@3.0.0: {} html2plaintext@2.1.4: @@ -25072,6 +25103,8 @@ snapshots: dependencies: readable-stream: 2.3.8 + leac@0.6.0: {} + leaflet-gpx@2.2.0: {} leaflet@1.9.4: {} @@ -26742,6 +26775,11 @@ snapshots: dependencies: entities: 6.0.0 + parseley@0.12.1: + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + parseurl@1.3.3: {} path-browserify@1.0.1: {} @@ -26800,6 +26838,8 @@ snapshots: pe-library@1.0.1: {} + peberminta@0.9.0: {} + peek-readable@4.1.0: {} peek-readable@7.0.0: {} @@ -28560,6 +28600,10 @@ snapshots: secure-compare@3.0.1: {} + selderee@0.11.0: + dependencies: + parseley: 0.12.1 + select-hose@2.0.0: {} selfsigned@2.4.1: diff --git a/requirements-docs.txt b/requirements-docs.txt deleted file mode 100644 index a7fa25aec..000000000 --- a/requirements-docs.txt +++ /dev/null @@ -1,21 +0,0 @@ -# MkDocs and Material theme requirements for Trilium documentation -mkdocs>=1.6.0 -mkdocs-material>=9.5.0 -mkdocs-material-extensions>=1.3.0 - -# Essential plugins -mkdocs-awesome-pages-plugin>=2.9.0 # Auto-generate navigation from folder structure -mkdocs-minify-plugin>=0.8.0 -mkdocs-git-revision-date-localized-plugin>=1.2.0 - -# Optional but recommended plugins -mkdocs-redirects>=1.2.0 -mkdocs-rss-plugin>=1.12.0 -mkdocs-glightbox>=0.3.0 - -# For advanced features -pillow>=10.0.0 # For social cards generation -cairosvg>=2.7.0 # For social cards with SVG support - -# Search enhancements -mkdocs-material[imaging]>=9.5.0 \ No newline at end of file diff --git a/scripts/fix-html-links.ts b/scripts/fix-html-links.ts deleted file mode 100644 index 68f325b44..000000000 --- a/scripts/fix-html-links.ts +++ /dev/null @@ -1,79 +0,0 @@ -#!/usr/bin/env node -/** - * Post-process HTML files generated by MkDocs to remove .md extensions from links - */ - -import * as fs from 'fs'; -import * as path from 'path'; - -/** - * Process HTML content to remove .md extensions from links - */ -function fixHtmlLinks(content: string): string { - // Replace .md extensions in href attributes - // Handle both quoted and unquoted href attributes - - // First, handle quoted hrefs: href="...something.md" or href="...something.md#anchor" - content = content.replace(/href="([^"]*?)\.md(#[^"]*)?"/g, 'href="$1$2"'); - - // Then, handle unquoted hrefs: href=...something.md or href=...something.md#anchor - // This matches href= followed by a non-whitespace URL ending in .md - content = content.replace(/href=([^\s>]*?)\.md(#[^\s>]*)?(?=[\s>])/g, 'href=$1$2'); - - return content; -} - -/** - * Recursively process all HTML files in a directory - */ -function processDirectory(dir: string): number { - let filesProcessed = 0; - - const entries = fs.readdirSync(dir, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - - if (entry.isDirectory()) { - // Recursively process subdirectories - filesProcessed += processDirectory(fullPath); - } else if (entry.isFile() && entry.name.endsWith('.html')) { - // Process HTML files - const content = fs.readFileSync(fullPath, 'utf-8'); - const fixedContent = fixHtmlLinks(content); - - if (content !== fixedContent) { - fs.writeFileSync(fullPath, fixedContent, 'utf-8'); - console.log(`Fixed: ${path.relative(process.cwd(), fullPath)}`); - filesProcessed++; - } - } - } - - return filesProcessed; -} - -function main(): number { - const args = process.argv.slice(2); - const siteDir = args[0] || 'site'; - - const fullPath = path.resolve(siteDir); - - if (!fs.existsSync(fullPath)) { - console.error(`Error: Directory '${fullPath}' does not exist`); - return 1; - } - - console.log(`Processing HTML files in: ${fullPath}`); - console.log('-'.repeat(50)); - - const filesProcessed = processDirectory(fullPath); - - console.log('-'.repeat(50)); - console.log(`Processed ${filesProcessed} HTML files`); - - return 0; -} - -// Run the main function -process.exit(main()); \ No newline at end of file diff --git a/scripts/fix-mkdocs-structure.ts b/scripts/fix-mkdocs-structure.ts deleted file mode 100644 index 2807801cc..000000000 --- a/scripts/fix-mkdocs-structure.ts +++ /dev/null @@ -1,342 +0,0 @@ -#!/usr/bin/env node -/** - * Fix MkDocs structure by: - * 1. Syncing README.md to docs/index.md with necessary path adjustments - * 2. Moving overview pages to index.md inside their directories to prevent duplicate navigation entries - */ - -import * as fs from 'fs'; -import * as path from 'path'; - -interface FixResult { - message: string; -} - -/** - * Find markdown files that have a corresponding directory with the same name, - * and move them to index.md inside that directory. - */ -function fixDuplicateEntries(docsDir: string): FixResult[] { - const fixesMade: FixResult[] = []; - - function walkDir(dir: string): void { - let files: string[]; - try { - files = fs.readdirSync(dir); - } catch (err) { - console.warn(`Warning: Unable to read directory ${dir}: ${err.message}`); - return; - } - - for (const file of files) { - const filePath = path.join(dir, file); - let stat: fs.Stats; - - try { - stat = fs.statSync(filePath); - } catch (err) { - // File might have been moved already, skip it - continue; - } - - if (stat.isDirectory()) { - walkDir(filePath); - } else if (file.endsWith('.md')) { - const basename = file.slice(0, -3); // Remove .md extension - const dirPath = path.join(dir, basename); - - // Check if there's a directory with the same name - if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) { - const indexPath = path.join(dirPath, 'index.md'); - - // Check if index.md already exists in that directory - if (!fs.existsSync(indexPath)) { - // Move the file to index.md in the directory - fs.renameSync(filePath, indexPath); - fixesMade.push({ - message: `Moved ${path.relative(docsDir, filePath)} -> ${path.relative(docsDir, indexPath)}` - }); - - // Move associated images with pattern basename_* - try { - const dirFiles = fs.readdirSync(dir); - for (const imgFile of dirFiles) { - if (imgFile.startsWith(`${basename}_`)) { - const imgSrc = path.join(dir, imgFile); - try { - if (!fs.statSync(imgSrc).isDirectory()) { - const imgDest = path.join(dirPath, imgFile); - fs.renameSync(imgSrc, imgDest); - fixesMade.push({ - message: `Moved ${path.relative(docsDir, imgSrc)} -> ${path.relative(docsDir, imgDest)}` - }); - } - } catch (err) { - // File might have been moved already, skip it - } - } - } - } catch (err) { - // Directory might not exist anymore, skip it - } - - // Move exact match images - const imgExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.svg']; - for (const ext of imgExtensions) { - const imgFile = path.join(dir, `${basename}${ext}`); - if (fs.existsSync(imgFile)) { - const imgDest = path.join(dirPath, `${basename}${ext}`); - fs.renameSync(imgFile, imgDest); - fixesMade.push({ - message: `Moved ${path.relative(docsDir, imgFile)} -> ${path.relative(docsDir, imgDest)}` - }); - } - } - } - } - } - } - } - - walkDir(docsDir); - return fixesMade; -} - -/** - * Update references in markdown files to point to the new locations. - */ -function updateReferences(docsDir: string): FixResult[] { - const updatesMade: FixResult[] = []; - - function fixLink(match: string, text: string, link: string, currentDir: string, isIndex: boolean): string { - // Skip external links - if (link.startsWith('http')) { - return match; - } - - // Decode URL-encoded paths for processing - let decodedLink: string; - try { - decodedLink = decodeURIComponent(link); - } catch (err) { - // If decoding fails, use the original link - decodedLink = link; - } - - // Special case: if we're in index.md and the link starts with the parent directory name - // This happens when a file was converted to index.md and had links to siblings - if (isIndex && decodedLink.includes('/')) { - const pathParts = decodedLink.split('/'); - const parentDirName = path.basename(currentDir); - - // Check if first part matches the parent directory name - if (pathParts[0] === parentDirName) { - // This is a self-referential path, strip the first part - const fixedLink = pathParts.slice(1).join('/'); - // Re-encode spaces for URL compatibility before recursing - const fixedLinkEncoded = fixedLink.replace(/ /g, '%20'); - // Recursively process the fixed link - return fixLink(`[${text}](${fixedLinkEncoded})`, text, fixedLinkEncoded, currentDir, isIndex); - } - } - - // For any .md link, check if there's a directory with index.md - // that should be used instead - if (!decodedLink.startsWith('/')) { - // Resolve relative to current directory - const resolvedPath = path.resolve(currentDir, decodedLink); - - // Check if this points to a file that should be a directory - // Remove .md extension to get the potential directory name - if (resolvedPath.endsWith('.md')) { - const potentialDir = resolvedPath.slice(0, -3); - const potentialIndex = path.join(potentialDir, 'index.md'); - - // If a directory with index.md exists, update the link - if (fs.existsSync(potentialIndex)) { - // If we're in an index.md file and linking to a file that's now - // in a sibling directory, adjust the path - if (isIndex) { - // Check if they share the same parent directory - if (path.dirname(potentialDir) === path.dirname(currentDir)) { - // It's a sibling - just use directory name - const dirName = path.basename(potentialDir).replace(/ /g, '%20'); - return `[${text}](${dirName}/)`; - } - } - - // Calculate relative path from current file to the directory - const newPath = path.relative(currentDir, potentialDir).replace(/\\/g, '/').replace(/ /g, '%20'); - return `[${text}](${newPath}/)`; - } - } - } - - // Also handle local references (same directory) - if (!decodedLink.includes('/')) { - const basename = decodedLink.slice(0, -3); // Remove .md extension - const possibleDir = path.join(currentDir, basename); - - if (fs.existsSync(possibleDir) && fs.statSync(possibleDir).isDirectory()) { - // Re-encode spaces for URL compatibility - const encodedBasename = basename.replace(/ /g, '%20'); - return `[${text}](${encodedBasename}/)`; - } - } - - return match; - } - - function walkDir(dir: string): void { - let files: string[]; - try { - files = fs.readdirSync(dir); - } catch (err) { - console.warn(`Warning: Unable to read directory ${dir}: ${err.message}`); - return; - } - - for (const file of files) { - const filePath = path.join(dir, file); - let stat: fs.Stats; - - try { - stat = fs.statSync(filePath); - } catch (err) { - // File might have been moved already, skip it - continue; - } - - if (stat.isDirectory()) { - walkDir(filePath); - } else if (file.endsWith('.md')) { - let content = fs.readFileSync(filePath, 'utf-8'); - const originalContent = content; - - const isIndex = file === 'index.md'; - const currentDir = path.dirname(filePath); - - // Update markdown links: [text](path.md) - const pattern = /\[([^\]]*)\]\(([^)]+\.md)\)/g; - content = content.replace(pattern, (match, text, link) => { - return fixLink(match, text, link, currentDir, isIndex); - }); - - if (content !== originalContent) { - fs.writeFileSync(filePath, content, 'utf-8'); - updatesMade.push({ - message: `Updated references in ${path.relative(docsDir, filePath)}` - }); - } - } - } - } - - walkDir(docsDir); - return updatesMade; -} - -/** - * Sync README.md to docs/index.md with necessary path adjustments - */ -function syncReadmeToIndex(projectRoot: string, docsDir: string): FixResult[] { - const results: FixResult[] = []; - const readmePath = path.join(projectRoot, 'README.md'); - const indexPath = path.join(docsDir, 'index.md'); - - if (!fs.existsSync(readmePath)) { - console.warn('README.md not found in project root'); - return results; - } - - // Read README content - let content = fs.readFileSync(readmePath, 'utf-8'); - - // Fix image path (./docs/app.png -> app.png) - content = content.replace(/src="\.\/docs\/app\.png"/g, 'src="app.png"'); - - // Fix language links in header - content = content.replace(/\[English\]\(\.\/README\.md\)/g, '[English](./index.md)'); - content = content.replace(/\.\/docs\/README-ZH_CN\.md/g, './README-ZH_CN.md'); - content = content.replace(/\.\/docs\/README-ZH_TW\.md/g, './README-ZH_TW.md'); - content = content.replace(/\.\/docs\/README\.ru\.md/g, './README.ru.md'); - content = content.replace(/\.\/docs\/README\.ja\.md/g, './README.ja.md'); - content = content.replace(/\.\/docs\/README\.it\.md/g, './README.it.md'); - content = content.replace(/\.\/docs\/README\.es\.md/g, './README.es.md'); - - // Fix internal documentation links (./docs/User%20Guide -> ./User%20Guide) - content = content.replace(/\.\/docs\/User%20Guide/g, './User%20Guide'); - - // Write the adjusted content to docs/index.md - fs.writeFileSync(indexPath, content, 'utf-8'); - results.push({ - message: `Synced README.md to docs/index.md with path adjustments` - }); - - return results; -} - -function main(): number { - // Get the docs directory - const scriptDir = path.dirname(new URL(import.meta.url).pathname); - const projectRoot = path.dirname(scriptDir); - const docsDir = path.join(projectRoot, 'docs'); - - // Handle Windows paths (remove leading slash if on Windows) - const normalizedProjectRoot = process.platform === 'win32' && projectRoot.startsWith('/') - ? projectRoot.substring(1) - : projectRoot; - const normalizedDocsDir = process.platform === 'win32' && docsDir.startsWith('/') - ? docsDir.substring(1) - : docsDir; - - if (!fs.existsSync(normalizedDocsDir)) { - console.error(`Error: docs directory not found at ${normalizedDocsDir}`); - return 1; - } - - console.log(`Fixing MkDocs structure in ${normalizedDocsDir}`); - console.log('-'.repeat(50)); - - // Sync README.md to docs/index.md - const syncResults = syncReadmeToIndex(normalizedProjectRoot, normalizedDocsDir); - if (syncResults.length > 0) { - console.log('README sync:'); - for (const result of syncResults) { - console.log(` - ${result.message}`); - } - console.log(); - } - - // Fix duplicate entries - const fixes = fixDuplicateEntries(normalizedDocsDir); - if (fixes.length > 0) { - console.log('Files reorganized:'); - for (const fix of fixes) { - console.log(` - ${fix.message}`); - } - } else { - console.log('No duplicate entries found that need fixing'); - } - - console.log(); - - // Update references - const updates = updateReferences(normalizedDocsDir); - if (updates.length > 0) { - console.log('References updated:'); - for (const update of updates) { - console.log(` - ${update.message}`); - } - } else { - console.log('No references needed updating'); - } - - console.log('-'.repeat(50)); - console.log(`Structure fix complete: ${syncResults.length} README syncs, ${fixes.length} files moved, ${updates.length} files updated`); - - return 0; -} - -// Run the main function -process.exit(main()); \ No newline at end of file
          4 + src="10_Lists_image.png" width="676" + height="112"> At this point, insert any desired block-level item such as a code block.
          5 + src="8_Lists_image.png" width="675" + height="129"> To continue with a new bullet point, press Enter until the cursor moves to a new blank position. -

          This uses the Front-end API to create - a icon in the Launch Bar, +

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

          • A title
          • @@ -117,8 +117,8 @@
            -
          • Since we know the ID of the newly - created note, all we have to do now is to show this note to the user.
          • +
          • Since we know the ID of the newly created + note, all we have to do now is to show this note to the user.