diff --git a/.github/actions/build-server/action.yml b/.github/actions/build-server/action.yml index faa3c0752..b92b3875f 100644 --- a/.github/actions/build-server/action.yml +++ b/.github/actions/build-server/action.yml @@ -12,7 +12,7 @@ runs: - name: Set up node & dependencies uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies shell: bash diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 62e04d48d..5e8fb1301 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,9 @@ 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/**' + - 'apps/build-docs/**' + - 'packages/share-theme/**' # Allow manual triggering from Actions tab workflow_dispatch: @@ -27,15 +23,13 @@ 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/**' + - 'apps/build-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 +43,27 @@ 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: '22' + 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" + test -f site/developer-guide/index.html || (echo "ERROR: site/developer-guide/index.html not found" && exit 1) + echo "✓ User Guide and Developer Guide built successfully" - name: Deploy uses: ./.github/actions/deploy-to-cloudflare-pages diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index ec4aeda0e..f9174fb42 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -30,7 +30,7 @@ jobs: - name: Set up node & dependencies uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: "pnpm" - run: pnpm install --frozen-lockfile diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml index 827320146..fab20d242 100644 --- a/.github/workflows/main-docker.yml +++ b/.github/workflows/main-docker.yml @@ -46,7 +46,7 @@ jobs: - name: Set up node & dependencies uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install npm dependencies @@ -116,10 +116,10 @@ jobs: - dockerfile: Dockerfile platform: linux/arm64 image: ubuntu-24.04-arm - - dockerfile: Dockerfile + - dockerfile: Dockerfile.legacy platform: linux/arm/v7 image: ubuntu-24.04-arm - - dockerfile: Dockerfile + - dockerfile: Dockerfile.legacy platform: linux/arm/v8 image: ubuntu-24.04-arm runs-on: ${{ matrix.image }} @@ -146,7 +146,7 @@ jobs: - name: Set up node & dependencies uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: 'pnpm' - name: Install dependencies diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index ac15f9914..ddce68d42 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -52,7 +52,7 @@ jobs: - name: Set up node & dependencies uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index e2a2757f5..a33d24283 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -24,7 +24,7 @@ jobs: - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: 'pnpm' - name: Install dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1bd2d89ba..3d48cb80d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,7 +50,7 @@ jobs: - name: Set up node & dependencies uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: 'pnpm' - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index fe94c987a..7a87cc192 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -30,7 +30,7 @@ jobs: - name: Set up node & dependencies uses: actions/setup-node@v6 with: - node-version: 22 + node-version: 24 cache: "pnpm" - name: Install dependencies diff --git a/.nvmrc b/.nvmrc index f5b3ef39f..40115e966 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -22.21.0 \ No newline at end of file +24.11.0 \ No newline at end of file diff --git a/_regroup/package.json b/_regroup/package.json index 1937327e0..ce0e70d45 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -37,20 +37,18 @@ "devDependencies": { "@playwright/test": "1.56.1", "@stylistic/eslint-plugin": "5.5.0", - "@types/express": "5.0.4", - "@types/node": "22.18.12", + "@types/express": "5.0.5", + "@types/node": "24.10.0", "@types/yargs": "17.0.34", "@vitest/coverage-v8": "3.2.4", - "eslint": "9.38.0", + "eslint": "9.39.1", "eslint-plugin-simple-import-sort": "12.1.1", "esm": "3.2.25", "jsdoc": "4.0.5", "lorem-ipsum": "2.0.8", "rcedit": "4.0.1", - "rimraf": "6.0.1", - "tslib": "2.8.1", - "typedoc": "0.28.14", - "typedoc-plugin-missing-exports": "4.1.2" + "rimraf": "6.1.0", + "tslib": "2.8.1" }, "optionalDependencies": { "appdmg": "0.6.6" diff --git a/_regroup/typedoc.json b/_regroup/typedoc.json deleted file mode 100644 index 30771621c..000000000 --- a/_regroup/typedoc.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "entryPoints": [ - "src/services/backend_script_entrypoint.ts", - "src/public/app/services/frontend_script_entrypoint.ts" - ], - "plugin": [ - "typedoc-plugin-missing-exports" - ], - "outputs": [ - { - "name": "html", - "path": "./docs/Script API" - } - ] -} diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json new file mode 100644 index 000000000..00196de82 --- /dev/null +++ b/apps/build-docs/package.json @@ -0,0 +1,22 @@ +{ + "name": "build-docs", + "version": "1.0.0", + "description": "", + "main": "src/main.ts", + "scripts": { + "start": "tsx ." + }, + "keywords": [], + "author": "Elian Doran ", + "license": "AGPL-3.0-only", + "packageManager": "pnpm@10.20.0", + "devDependencies": { + "@redocly/cli": "2.11.0", + "archiver": "7.0.1", + "fs-extra": "11.3.2", + "react": "19.2.0", + "react-dom": "19.2.0", + "typedoc": "0.28.14", + "typedoc-plugin-missing-exports": "4.1.2" + } +} diff --git a/apps/build-docs/src/backend_script_entrypoint.ts b/apps/build-docs/src/backend_script_entrypoint.ts new file mode 100644 index 000000000..bc9087c0c --- /dev/null +++ b/apps/build-docs/src/backend_script_entrypoint.ts @@ -0,0 +1,36 @@ +/** + * The backend script API is accessible to code notes with the "JS (backend)" language. + * + * The entire API is exposed as a single global: {@link api} + * + * @module Backend Script API + */ + +/** + * This file creates the entrypoint for TypeDoc that simulates the context from within a + * script note on the server side. + * + * Make sure to keep in line with backend's `script_context.ts`. + */ + +export type { default as AbstractBeccaEntity } from "../../server/src/becca/entities/abstract_becca_entity.js"; +export type { default as BAttachment } from "../../server/src/becca/entities/battachment.js"; +export type { default as BAttribute } from "../../server/src/becca/entities/battribute.js"; +export type { default as BBranch } from "../../server/src/becca/entities/bbranch.js"; +export type { default as BEtapiToken } from "../../server/src/becca/entities/betapi_token.js"; +export type { BNote }; +export type { default as BOption } from "../../server/src/becca/entities/boption.js"; +export type { default as BRecentNote } from "../../server/src/becca/entities/brecent_note.js"; +export type { default as BRevision } from "../../server/src/becca/entities/brevision.js"; + +import BNote from "../../server/src/becca/entities/bnote.js"; +import BackendScriptApi, { type Api } from "../../server/src/services/backend_script_api.js"; + +export type { Api }; + +const fakeNote = new BNote(); + +/** + * The `api` global variable allows access to the backend script API, which is documented in {@link Api}. + */ +export const api: Api = new BackendScriptApi(fakeNote, {}); diff --git a/apps/build-docs/src/build-docs.ts b/apps/build-docs/src/build-docs.ts new file mode 100644 index 000000000..5d1a0cdd6 --- /dev/null +++ b/apps/build-docs/src/build-docs.ts @@ -0,0 +1,147 @@ +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 * as fs from "fs/promises"; +import * as fsExtra from "fs-extra"; +import archiver from "archiver"; +import { WriteStream } from "fs"; +import { execSync } from "child_process"; +import BuildContext from "./context.js"; + +const DOCS_ROOT = "../../../docs"; +const OUTPUT_DIR = "../../site"; + +async function importAndExportDocs(sourcePath: string, outputSubDir: string) { + const note = await importData(sourcePath); + + // Use a meaningful name for the temporary zip file + const zipName = outputSubDir || "user-guide"; + const zipFilePath = `output-${zipName}.zip`; + try { + const { exportToZip } = (await import("@triliumnext/server/src/services/export/zip.js")).default; + const branch = note.getParentBranches()[0]; + const taskContext = new (await import("@triliumnext/server/src/services/task_context.js")).default( + "no-progress-reporting", + "export", + null + ); + const fileOutputStream = fsExtra.createWriteStream(zipFilePath); + await exportToZip(taskContext, branch, "share", fileOutputStream); + await waitForStreamToFinish(fileOutputStream); + + // Output to root directory if outputSubDir is empty, otherwise to subdirectory + const outputPath = outputSubDir ? join(OUTPUT_DIR, outputSubDir) : OUTPUT_DIR; + await extractZip(zipFilePath, outputPath); + } finally { + if (await fsExtra.exists(zipFilePath)) { + await fsExtra.rm(zipFilePath); + } + } +} + +async function buildDocsInner() { + const i18n = await import("@triliumnext/server/src/services/i18n.js"); + await i18n.initializeTranslations(); + + const sqlInit = (await import("../../server/src/services/sql_init.js")).default; + await sqlInit.createInitialDatabase(true); + + // Wait for becca to be loaded before importing data + const beccaLoader = await import("../../server/src/becca/becca_loader.js"); + await beccaLoader.beccaLoaded; + + // Build User Guide + console.log("Building User Guide..."); + await importAndExportDocs(join(__dirname, DOCS_ROOT, "User Guide"), "user-guide"); + + // Build Developer Guide + console.log("Building Developer Guide..."); + await importAndExportDocs(join(__dirname, DOCS_ROOT, "Developer Guide"), "developer-guide"); + + // Copy favicon. + await fs.copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "favicon.ico")); + await fs.copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "user-guide", "favicon.ico")); + await fs.copyFile("../../apps/website/src/assets/favicon.ico", join(OUTPUT_DIR, "developer-guide", "favicon.ico")); + + console.log("Documentation built successfully!"); +} + +export async function importData(path: string) { + const buffer = await createImportZip(path); + const importService = (await import("../../server/src/services/import/zip.js")).default; + const TaskContext = (await import("../../server/src/services/task_context.js")).default; + const context = new TaskContext("no-progress-reporting", "importNotes", null); + const becca = (await import("../../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(); + }); +} + +export default async function buildDocs({ gitRootDir }: BuildContext) { + // Build the share theme. + execSync(`pnpm run --filter share-theme build`, { + stdio: "inherit", + cwd: gitRootDir + }); + + // Trigger the actual build. + await new Promise((res, rej) => { + cls.init(() => { + buildDocsInner() + .catch(rej) + .then(res); + }); + }); +} diff --git a/apps/build-docs/src/context.ts b/apps/build-docs/src/context.ts new file mode 100644 index 000000000..ab2289e50 --- /dev/null +++ b/apps/build-docs/src/context.ts @@ -0,0 +1,4 @@ +export default interface BuildContext { + gitRootDir: string; + baseDir: string; +} diff --git a/apps/build-docs/src/frontend_script_entrypoint.ts b/apps/build-docs/src/frontend_script_entrypoint.ts new file mode 100644 index 000000000..768774eca --- /dev/null +++ b/apps/build-docs/src/frontend_script_entrypoint.ts @@ -0,0 +1,28 @@ +/** + * The front script API is accessible to code notes with the "JS (frontend)" language. + * + * The entire API is exposed as a single global: {@link api} + * + * @module Frontend Script API + */ + +/** + * This file creates the entrypoint for TypeDoc that simulates the context from within a + * script note. + * + * Make sure to keep in line with frontend's `script_context.ts`. + */ + +export type { default as BasicWidget } from "../../client/src/widgets/basic_widget.js"; +export type { default as FAttachment } from "../../client/src/entities/fattachment.js"; +export type { default as FAttribute } from "../../client/src/entities/fattribute.js"; +export type { default as FBranch } from "../../client/src/entities/fbranch.js"; +export type { default as FNote } from "../../client/src/entities/fnote.js"; +export type { Api } from "../../client/src/services/frontend_script_api.js"; +export type { default as NoteContextAwareWidget } from "../../client/src/widgets/note_context_aware_widget.js"; +export type { default as RightPanelWidget } from "../../client/src/widgets/right_panel_widget.js"; + +import FrontendScriptApi, { type Api } from "../../client/src/services/frontend_script_api.js"; + +//@ts-expect-error +export const api: Api = new FrontendScriptApi(); diff --git a/apps/build-docs/src/index.html b/apps/build-docs/src/index.html new file mode 100644 index 000000000..47a0bfb34 --- /dev/null +++ b/apps/build-docs/src/index.html @@ -0,0 +1,10 @@ + + + + + Redirecting... + + +

If you are not redirected automatically, click here.

+ + \ No newline at end of file diff --git a/apps/build-docs/src/main.ts b/apps/build-docs/src/main.ts new file mode 100644 index 000000000..d94ada167 --- /dev/null +++ b/apps/build-docs/src/main.ts @@ -0,0 +1,30 @@ +import { join } from "path"; +import BuildContext from "./context"; +import buildSwagger from "./swagger"; +import { cpSync, existsSync, mkdirSync, rmSync } from "fs"; +import buildDocs from "./build-docs"; +import buildScriptApi from "./script-api"; + +const context: BuildContext = { + gitRootDir: join(__dirname, "../../../"), + baseDir: join(__dirname, "../../../site") +}; + +async function main() { + // Clean input dir. + if (existsSync(context.baseDir)) { + rmSync(context.baseDir, { recursive: true }); + } + mkdirSync(context.baseDir); + + // Start building. + await buildDocs(context); + buildSwagger(context); + buildScriptApi(context); + + // Copy index and 404 files. + cpSync(join(__dirname, "index.html"), join(context.baseDir, "index.html")); + cpSync(join(context.baseDir, "user-guide/404.html"), join(context.baseDir, "404.html")); +} + +main(); diff --git a/apps/build-docs/src/script-api.ts b/apps/build-docs/src/script-api.ts new file mode 100644 index 000000000..8473ae3a0 --- /dev/null +++ b/apps/build-docs/src/script-api.ts @@ -0,0 +1,15 @@ +import { execSync } from "child_process"; +import BuildContext from "./context"; +import { join } from "path"; + +export default function buildScriptApi({ baseDir, gitRootDir }: BuildContext) { + // Generate types + execSync(`pnpm typecheck`, { stdio: "inherit", cwd: gitRootDir }); + + for (const config of [ "backend", "frontend" ]) { + const outDir = join(baseDir, "script-api", config); + execSync(`pnpm typedoc --options typedoc.${config}.json --html "${outDir}"`, { + stdio: "inherit" + }); + } +} diff --git a/apps/build-docs/src/swagger.ts b/apps/build-docs/src/swagger.ts new file mode 100644 index 000000000..b3677aeeb --- /dev/null +++ b/apps/build-docs/src/swagger.ts @@ -0,0 +1,32 @@ +import BuildContext from "./context"; +import { join } from "path"; +import { execSync } from "child_process"; +import { mkdirSync } from "fs"; + +interface BuildInfo { + specPath: string; + outDir: string; +} + +const DIR_PREFIX = "rest-api"; + +const buildInfos: BuildInfo[] = [ + { + // Paths are relative to Git root. + specPath: "apps/server/internal.openapi.yaml", + outDir: `${DIR_PREFIX}/internal` + }, + { + specPath: "apps/server/etapi.openapi.yaml", + outDir: `${DIR_PREFIX}/etapi` + } +]; + +export default function buildSwagger({ baseDir, gitRootDir }: BuildContext) { + for (const { specPath, outDir } of buildInfos) { + const absSpecPath = join(gitRootDir, specPath); + const targetDir = join(baseDir, outDir); + mkdirSync(targetDir, { recursive: true }); + execSync(`pnpm redocly build-docs ${absSpecPath} -o ${targetDir}/index.html`, { stdio: "inherit" }); + } +} diff --git a/apps/build-docs/tsconfig.app.json b/apps/build-docs/tsconfig.app.json new file mode 100644 index 000000000..b9e17115a --- /dev/null +++ b/apps/build-docs/tsconfig.app.json @@ -0,0 +1,36 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ES2020", + "outDir": "dist", + "strict": false, + "types": [ + "node", + "express" + ], + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.app.tsbuildinfo" + }, + "include": [ + "src/**/*.ts", + "../server/src/*.d.ts" + ], + "exclude": [ + "eslint.config.js", + "eslint.config.cjs", + "eslint.config.mjs" + ], + "references": [ + { + "path": "../server/tsconfig.app.json" + }, + { + "path": "../desktop/tsconfig.app.json" + }, + { + "path": "../client/tsconfig.app.json" + } + ] +} diff --git a/apps/build-docs/tsconfig.json b/apps/build-docs/tsconfig.json new file mode 100644 index 000000000..858921cfb --- /dev/null +++ b/apps/build-docs/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.base.json", + "include": [], + "references": [ + { + "path": "../server" + }, + { + "path": "../client" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/apps/build-docs/typedoc.backend.json b/apps/build-docs/typedoc.backend.json new file mode 100644 index 000000000..1781774c6 --- /dev/null +++ b/apps/build-docs/typedoc.backend.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "name": "Trilium Backend API", + "entryPoints": [ + "src/backend_script_entrypoint.ts" + ], + "plugin": [ + "typedoc-plugin-missing-exports" + ] +} diff --git a/apps/build-docs/typedoc.frontend.json b/apps/build-docs/typedoc.frontend.json new file mode 100644 index 000000000..f07d20dc7 --- /dev/null +++ b/apps/build-docs/typedoc.frontend.json @@ -0,0 +1,10 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "name": "Trilium Frontend API", + "entryPoints": [ + "src/frontend_script_entrypoint.ts" + ], + "plugin": [ + "typedoc-plugin-missing-exports" + ] +} diff --git a/apps/client/package.json b/apps/client/package.json index 61738b8bb..d2ca22049 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -15,7 +15,7 @@ "circular-deps": "dpdm -T src/**/*.ts --tree=false --warning=false --skip-dynamic-imports=circular" }, "dependencies": { - "@eslint/js": "9.38.0", + "@eslint/js": "9.39.1", "@excalidraw/excalidraw": "0.18.0", "@fullcalendar/core": "6.1.19", "@fullcalendar/daygrid": "6.1.19", @@ -37,12 +37,12 @@ "bootstrap": "5.3.8", "boxicons": "2.1.4", "color": "5.0.2", - "dayjs": "1.11.18", + "dayjs": "1.11.19", "dayjs-plugin-utc": "0.1.2", - "debounce": "2.2.0", + "debounce": "3.0.0", "draggabilly": "3.0.0", "force-graph": "1.51.0", - "globals": "16.4.0", + "globals": "16.5.0", "i18next": "25.6.0", "i18next-http-backend": "3.0.2", "jquery": "3.7.1", @@ -54,12 +54,12 @@ "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", "marked": "16.4.1", - "mermaid": "11.12.0", - "mind-elixir": "5.3.4", + "mermaid": "11.12.1", + "mind-elixir": "5.3.5", "normalize.css": "8.0.1", "panzoom": "9.4.3", "preact": "10.27.2", - "react-i18next": "16.2.0", + "react-i18next": "16.2.4", "reveal.js": "5.2.1", "svg-pan-zoom": "3.6.2", "tabulator-tables": "6.3.1", @@ -76,7 +76,7 @@ "@types/reveal.js": "5.2.1", "@types/tabulator-tables": "6.3.0", "copy-webpack-plugin": "13.0.1", - "happy-dom": "20.0.8", + "happy-dom": "20.0.10", "script-loader": "0.7.2", "vite-plugin-static-copy": "3.1.4" } diff --git a/apps/client/src/components/app_context.ts b/apps/client/src/components/app_context.ts index 322e72704..ecdd589be 100644 --- a/apps/client/src/components/app_context.ts +++ b/apps/client/src/components/app_context.ts @@ -33,7 +33,7 @@ import { SqlExecuteResults } from "@triliumnext/commons"; import { AddLinkOpts } from "../widgets/dialogs/add_link.jsx"; import { IncludeNoteOpts } from "../widgets/dialogs/include_note.jsx"; import { ReactWrappedWidget } from "../widgets/basic_widget.js"; -import { TypeWidget } from "../widgets/note_types.jsx"; +import type { MarkdownImportOpts } from "../widgets/dialogs/markdown_import.jsx"; interface Layout { getRootWidget: (appContext: AppContext) => RootContainer; @@ -219,12 +219,12 @@ export type CommandMappings = { /** Works only in the electron context menu. */ replaceMisspelling: CommandData; - importMarkdownInline: CommandData; showPasswordNotSet: CommandData; showProtectedSessionPasswordDialog: CommandData; showUploadAttachmentsDialog: CommandData & { noteId: string }; showIncludeNoteDialog: CommandData & IncludeNoteOpts; showAddLinkDialog: CommandData & AddLinkOpts; + showPasteMarkdownDialog: CommandData & MarkdownImportOpts; closeProtectedSessionPasswordDialog: CommandData; copyImageReferenceToClipboard: CommandData; copyImageToClipboard: CommandData; @@ -271,6 +271,7 @@ export type CommandMappings = { closeThisNoteSplit: CommandData; moveThisNoteSplit: CommandData & { isMovingLeft: boolean }; jumpToNote: CommandData; + openTodayNote: CommandData; commandPalette: CommandData; // Keyboard shortcuts diff --git a/apps/client/src/components/entrypoints.ts b/apps/client/src/components/entrypoints.ts index 91895d77f..57d359abe 100644 --- a/apps/client/src/components/entrypoints.ts +++ b/apps/client/src/components/entrypoints.ts @@ -159,6 +159,16 @@ export default class Entrypoints extends Component { this.openInWindowCommand({ notePath: "", hoistedNoteId: "root" }); } + async openTodayNoteCommand() { + const todayNote = await dateNoteService.getTodayNote(); + if (!todayNote) { + console.warn("Missing today note."); + return; + } + + await appContext.tabManager.openInSameTab(todayNote.noteId); + } + async runActiveNoteCommand() { const noteContext = appContext.tabManager.getActiveContext(); if (!noteContext) { diff --git a/apps/client/src/entities/fnote.ts b/apps/client/src/entities/fnote.ts index bcb6c408e..6d0a15506 100644 --- a/apps/client/src/entities/fnote.ts +++ b/apps/client/src/entities/fnote.ts @@ -417,7 +417,7 @@ export default class FNote { return notePaths; } - getSortedNotePathRecords(hoistedNoteId = "root"): NotePathRecord[] { + getSortedNotePathRecords(hoistedNoteId = "root", activeNotePath: string | null = null): NotePathRecord[] { const isHoistedRoot = hoistedNoteId === "root"; const notePaths: NotePathRecord[] = this.getAllNotePaths().map((path) => ({ @@ -428,7 +428,23 @@ export default class FNote { isHidden: path.includes("_hidden") })); + // Calculate the length of the prefix match between two arrays + const prefixMatchLength = (path: string[], target: string[]) => { + const diffIndex = path.findIndex((seg, i) => seg !== target[i]); + return diffIndex === -1 ? Math.min(path.length, target.length) : diffIndex; + }; + notePaths.sort((a, b) => { + if (activeNotePath) { + const activeSegments = activeNotePath.split('/'); + const aOverlap = prefixMatchLength(a.notePath, activeSegments); + const bOverlap = prefixMatchLength(b.notePath, activeSegments); + // Paths with more matching prefix segments are prioritized + // when the match count is equal, other criteria are used for sorting + if (bOverlap !== aOverlap) { + return bOverlap - aOverlap; + } + } if (a.isInHoistedSubTree !== b.isInHoistedSubTree) { return a.isInHoistedSubTree ? -1 : 1; } else if (a.isArchived !== b.isArchived) { @@ -449,10 +465,11 @@ export default class FNote { * Returns the note path considered to be the "best" * * @param {string} [hoistedNoteId='root'] + * @param {string|null} [activeNotePath=null] * @return {string[]} array of noteIds constituting the particular note path */ - getBestNotePath(hoistedNoteId = "root") { - return this.getSortedNotePathRecords(hoistedNoteId)[0]?.notePath; + getBestNotePath(hoistedNoteId = "root", activeNotePath: string | null = null) { + return this.getSortedNotePathRecords(hoistedNoteId, activeNotePath)[0]?.notePath; } /** diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index 6504b49eb..7384573d8 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -137,7 +137,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener { + if (img.complete) return Promise.resolve(); + return new Promise(resolve => { + img.addEventListener("load", () => resolve(), { once: true }); + img.addEventListener("error", () => resolve(), { once: true }); + }); + }) + ); } load().then(() => requestAnimationFrame(onReady)) diff --git a/apps/client/src/services/frontend_script_entrypoint.ts b/apps/client/src/services/frontend_script_entrypoint.ts deleted file mode 100644 index 75a27d204..000000000 --- a/apps/client/src/services/frontend_script_entrypoint.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** - * The front script API is accessible to code notes with the "JS (frontend)" language. - * - * The entire API is exposed as a single global: {@link api} - * - * @module Frontend Script API - */ - -/** - * This file creates the entrypoint for TypeDoc that simulates the context from within a - * script note. - * - * Make sure to keep in line with frontend's `script_context.ts`. - */ - -export type { default as BasicWidget } from "../widgets/basic_widget.js"; -export type { default as FAttachment } from "../entities/fattachment.js"; -export type { default as FAttribute } from "../entities/fattribute.js"; -export type { default as FBranch } from "../entities/fbranch.js"; -export type { default as FNote } from "../entities/fnote.js"; -export type { Api } from "./frontend_script_api.js"; -export type { default as NoteContextAwareWidget } from "../widgets/note_context_aware_widget.js"; -export type { default as RightPanelWidget } from "../widgets/right_panel_widget.js"; - -import FrontendScriptApi, { type Api } from "./frontend_script_api.js"; - -//@ts-expect-error -export const api: Api = new FrontendScriptApi(); diff --git a/apps/client/src/services/glob.ts b/apps/client/src/services/glob.ts index 48d0d29a7..44ce64309 100644 --- a/apps/client/src/services/glob.ts +++ b/apps/client/src/services/glob.ts @@ -20,9 +20,6 @@ function setupGlobs() { window.glob.froca = froca; window.glob.treeCache = froca; // compatibility for CKEditor builds for a while - // for CKEditor integration (button on block toolbar) - window.glob.importMarkdownInline = async () => appContext.triggerCommand("importMarkdownInline"); - window.onerror = function (msg, url, lineNo, columnNo, error) { const string = String(msg).toLowerCase(); diff --git a/apps/client/src/services/in_app_help.ts b/apps/client/src/services/in_app_help.ts index a0b118e5c..2f805783a 100644 --- a/apps/client/src/services/in_app_help.ts +++ b/apps/client/src/services/in_app_help.ts @@ -10,7 +10,7 @@ export const byNoteType: Record, string | null> = { file: null, image: null, launcher: null, - mermaid: null, + mermaid: "s1aBHPd79XYj", mindMap: null, noteMap: null, relationMap: null, diff --git a/apps/client/src/services/shortcuts.spec.ts b/apps/client/src/services/shortcuts.spec.ts index 87f8ae489..b9576025f 100644 --- a/apps/client/src/services/shortcuts.spec.ts +++ b/apps/client/src/services/shortcuts.spec.ts @@ -159,7 +159,7 @@ describe("shortcuts", () => { expect(matchesShortcut(event, "Shift+F1")).toBeTruthy(); // Special keys - for (const keyCode of [ "Delete", "Enter" ]) { + for (const keyCode of [ "Delete", "Enter", "NumpadEnter" ]) { event = createKeyboardEvent({ key: keyCode, code: keyCode }); expect(matchesShortcut(event, keyCode), `Key ${keyCode}`).toBeTruthy(); } diff --git a/apps/client/src/services/shortcuts.ts b/apps/client/src/services/shortcuts.ts index 363767b71..2c6345fcb 100644 --- a/apps/client/src/services/shortcuts.ts +++ b/apps/client/src/services/shortcuts.ts @@ -46,6 +46,7 @@ for (let i = 1; i <= 19; i++) { const KEYCODES_WITH_NO_MODIFIER = new Set([ "Delete", "Enter", + "NumpadEnter", ...functionKeyCodes ]); diff --git a/apps/client/src/services/tree.ts b/apps/client/src/services/tree.ts index fc54c3c75..ec5bc0191 100644 --- a/apps/client/src/services/tree.ts +++ b/apps/client/src/services/tree.ts @@ -26,21 +26,12 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root } const path = notePath.split("/").reverse(); - - if (!path.includes("root")) { - path.push("root"); - } - const effectivePathSegments: string[] = []; let childNoteId: string | null = null; let i = 0; - while (true) { - if (i >= path.length) { - break; - } - - const parentNoteId = path[i++]; + for (let i = 0; i < path.length; i++) { + const parentNoteId = path[i]; if (childNoteId !== null) { const child = await froca.getNote(childNoteId, !logErrors); @@ -65,7 +56,7 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root return null; } - if (!parents.some((p) => p.noteId === parentNoteId)) { + if (!parents.some(p => p.noteId === parentNoteId) || (i === path.length - 1 && parentNoteId !== 'root')) { if (logErrors) { const parent = froca.getNoteFromCache(parentNoteId); @@ -77,7 +68,8 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root ); } - const bestNotePath = child.getBestNotePath(hoistedNoteId); + const activeNotePath = appContext.tabManager.getActiveContextNotePath(); + const bestNotePath = child.getBestNotePath(hoistedNoteId, activeNotePath); if (bestNotePath) { const pathToRoot = bestNotePath.reverse().slice(1); @@ -108,7 +100,9 @@ async function resolveNotePathToSegments(notePath: string, hoistedNoteId = "root if (!note) { throw new Error(`Unable to find note: ${notePath}.`); } - const bestNotePath = note.getBestNotePath(hoistedNoteId); + + const activeNotePath = appContext.tabManager.getActiveContextNotePath(); + const bestNotePath = note.getBestNotePath(hoistedNoteId, activeNotePath); if (!bestNotePath) { throw new Error(`Did not find any path segments for '${note.toString()}', hoisted note '${hoistedNoteId}'`); diff --git a/apps/client/src/services/utils.ts b/apps/client/src/services/utils.ts index 2f33a4011..be66f642d 100644 --- a/apps/client/src/services/utils.ts +++ b/apps/client/src/services/utils.ts @@ -11,7 +11,11 @@ export function reloadFrontendApp(reason?: string) { logInfo(`Frontend app reload: ${reason}`); } - window.location.reload(); + if (isElectron()) { + dynamicRequire("@electron/remote").BrowserWindow.getFocusedWindow()?.reload(); + } else { + window.location.reload(); + } } export function restartDesktopApp() { diff --git a/apps/client/src/share.ts b/apps/client/src/share.ts deleted file mode 100644 index b438f0c0c..000000000 --- a/apps/client/src/share.ts +++ /dev/null @@ -1,84 +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 applyMath() { - const anyMathBlock = document.querySelector("#content .math-tex"); - if (!anyMathBlock) { - return; - } - - const renderMathInElement = (await import("./services/math.js")).renderMathInElement; - renderMathInElement(document.getElementById("content")); -} - -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(); - applyMath(); - - const setupMermaid = (await import("./share/mermaid.js")).default; - setupMermaid(); -} - -/** - * Fetch note with given ID from backend - * - * @param noteId of the given note to be fetched. If false, fetches current note. - */ -async function fetchNote(noteId: string | null = null) { - if (!noteId) { - noteId = document.body.getAttribute("data-note-id"); - } - - const resp = await fetch(`api/notes/${noteId}`); - - return await resp.json(); -} - -document.addEventListener( - "DOMContentLoaded", - () => { - const noteType = determineNoteType(); - - if (noteType === "text") { - setupTextNote(); - } - - const toggleMenuButton = document.getElementById("toggleMenuButton"); - const layout = document.getElementById("layout"); - - if (toggleMenuButton && layout) { - toggleMenuButton.addEventListener("click", () => layout.classList.toggle("showMenu")); - } - }, - false -); - -function determineNoteType() { - const bodyClass = document.body.className; - const match = bodyClass.match(/type-([^\s]+)/); - return match ? match[1] : null; -} - -// workaround to prevent webpack from removing "fetchNote" as dead code: -// add fetchNote as property to the window object -Object.defineProperty(window, "fetchNote", { - value: fetchNote -}); diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 4916f18b9..6e6cea21a 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2034,9 +2034,9 @@ body.zen #right-pane, body.zen #mobile-sidebar-wrapper, body.zen .tab-row-container, body.zen .tab-row-widget, -body.zen .ribbon-container:not(:has(.classic-toolbar-widget.visible)), -body.zen .ribbon-container:has(.classic-toolbar-widget.visible) .ribbon-top-row, -body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget.visible)), +body.zen .ribbon-container:not(:has(.classic-toolbar-widget)), +body.zen .ribbon-container:has(.classic-toolbar-widget) .ribbon-top-row, +body.zen .ribbon-container .ribbon-body:not(:has(.classic-toolbar-widget)), body.zen .note-icon-widget, body.zen .title-row .icon-action, body.zen .floating-buttons-children > *:not(.bx-edit-alt), diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json index b04472d7c..dffb4f9d4 100644 --- a/apps/client/src/translations/ar/translation.json +++ b/apps/client/src/translations/ar/translation.json @@ -716,7 +716,6 @@ "backup_database_now": "نسخ اختياطي لقاعدة البيانات الان" }, "etapi": { - "wiki": "ويكي", "created": "تم الأنشاء", "actions": "أجراءات", "title": "ETAPI", diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index b635b557f..b36aba22b 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -51,7 +51,7 @@ "bulk_actions_executed": "批量操作已成功执行。", "none_yet": "暂无操作 ... 通过点击上方的可用操作添加一个操作。", "labels": "标签", - "relations": "关联关系", + "relations": "关系", "notes": "笔记", "other": "其它" }, @@ -104,7 +104,8 @@ "export_status": "导出状态", "export_in_progress": "导出进行中:{{progressCount}}", "export_finished_successfully": "导出成功完成。", - "format_pdf": "PDF - 用于打印或共享目的。" + "format_pdf": "PDF - 用于打印或共享目的。", + "share-format": "HTML 网页发布——采用与共享笔记相同的主题,但可发布为静态网站。" }, "help": { "noteNavigation": "笔记导航", @@ -184,7 +185,8 @@ }, "import-status": "导入状态", "in-progress": "导入进行中:{{progress}}", - "successful": "导入成功完成。" + "successful": "导入成功完成。", + "importZipRecommendation": "导入 ZIP 文件时,笔记层级将反映压缩文件内的子目录结构。" }, "include_note": { "dialog_title": "包含笔记", @@ -259,7 +261,6 @@ "delete_all_revisions": "删除此笔记的所有修订版本", "delete_all_button": "删除所有修订版本", "help_title": "关于笔记修订版本的帮助", - "revision_last_edited": "此修订版本上次编辑于 {{date}}", "confirm_delete_all": "您是否要删除此笔记的所有修订版本?", "no_revisions": "此笔记暂无修订版本...", "restore_button": "恢复", @@ -1288,10 +1289,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI 是一个 REST API,用于以编程方式访问 Trilium 实例,而无需 UI。", - "see_more": "有关更多详细信息,请参见 {{- link_to_wiki}} 和 {{- link_to_openapi_spec}} 或 {{- link_to_swagger_ui}}。", - "wiki": "维基", - "openapi_spec": "ETAPI OpenAPI 规范", - "swagger_ui": "ETAPI Swagger UI", "create_token": "创建新的 ETAPI 令牌", "existing_tokens": "现有令牌", "no_tokens_yet": "目前还没有令牌。点击上面的按钮创建一个。", @@ -1558,7 +1555,9 @@ "window-on-top": "保持此窗口置顶" }, "note_detail": { - "could_not_find_typewidget": "找不到类型为 '{{type}}' 的 typeWidget" + "could_not_find_typewidget": "找不到类型为 '{{type}}' 的 typeWidget", + "printing": "正在打印…", + "printing_pdf": "正在导出为PDF…" }, "note_title": { "placeholder": "请输入笔记标题..." diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index e34982c6a..4f7e9801f 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -4,7 +4,7 @@ "homepage": "Startseite:", "app_version": "App-Version:", "db_version": "DB-Version:", - "sync_version": "Synch-version:", + "sync_version": "Sync-Version:", "build_date": "Build-Datum:", "build_revision": "Build-Revision:", "data_directory": "Datenverzeichnis:" @@ -104,7 +104,8 @@ "export_status": "Exportstatus", "export_in_progress": "Export läuft: {{progressCount}}", "export_finished_successfully": "Der Export wurde erfolgreich abgeschlossen.", - "format_pdf": "PDF - für Ausdrucke oder Teilen." + "format_pdf": "PDF - für Ausdrucke oder Teilen.", + "share-format": "HTML für die Web-Veröffentlichung – verwendet dasselbe Theme wie bei freigegebenen Notizen, kann jedoch als statische Website veröffentlicht werden." }, "help": { "noteNavigation": "Notiz Navigation", @@ -260,7 +261,6 @@ "delete_all_revisions": "Lösche alle Revisionen dieser Notiz", "delete_all_button": "Alle Revisionen löschen", "help_title": "Hilfe zu Notizrevisionen", - "revision_last_edited": "Diese Revision wurde zuletzt am {{date}} bearbeitet", "confirm_delete_all": "Möchtest du alle Revisionen dieser Notiz löschen?", "no_revisions": "Für diese Notiz gibt es noch keine Revisionen...", "confirm_restore": "Möchtest du diese Revision wiederherstellen? Dadurch werden der aktuelle Titel und Inhalt der Notiz mit dieser Revision überschrieben.", @@ -991,7 +991,7 @@ "enter_password_instruction": "Um die geschützte Notiz anzuzeigen, musst du dein Passwort eingeben:", "start_session_button": "Starte eine geschützte Sitzung", "started": "Geschützte Sitzung gestartet.", - "wrong_password": "Passwort flasch.", + "wrong_password": "Passwort falsch.", "protecting-finished-successfully": "Geschützt erfolgreich beendet.", "unprotecting-finished-successfully": "Ungeschützt erfolgreich beendet.", "protecting-in-progress": "Schützen läuft: {{count}}", @@ -1286,10 +1286,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI ist eine REST-API, die für den programmgesteuerten Zugriff auf die Trilium-Instanz ohne Benutzeroberfläche verwendet wird.", - "see_more": "Weitere Details können im {{- link_to_wiki}} und in der {{- link_to_openapi_spec}} oder der {{- link_to_swagger_ui }} gefunden werden.", - "wiki": "Wiki", - "openapi_spec": "ETAPI OpenAPI-Spezifikation", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Erstelle ein neues ETAPI-Token", "existing_tokens": "Vorhandene Token", "no_tokens_yet": "Es sind noch keine Token vorhanden. Klicke auf die Schaltfläche oben, um eine zu erstellen.", @@ -1658,7 +1654,7 @@ "add-term-to-dictionary": "Begriff \"{{term}}\" zum Wörterbuch hinzufügen", "cut": "Ausschneiden", "copy": "Kopieren", - "copy-link": "Link opieren", + "copy-link": "Link kopieren", "paste": "Einfügen", "paste-as-plain-text": "Als unformatierten Text einfügen", "search_online": "Suche nach \"{{term}}\" mit {{searchEngine}} starten" diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index cff40010f..2150a8599 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -36,10 +36,13 @@ }, "branch_prefix": { "edit_branch_prefix": "Edit branch prefix", + "edit_branch_prefix_multiple": "Edit branch prefix for {{count}} branches", "help_on_tree_prefix": "Help on Tree prefix", "prefix": "Prefix: ", "save": "Save", - "branch_prefix_saved": "Branch prefix has been saved." + "branch_prefix_saved": "Branch prefix has been saved.", + "branch_prefix_saved_multiple": "Branch prefix has been saved for {{count}} branches.", + "affected_branches": "Affected branches ({{count}}):" }, "bulk_actions": { "bulk_actions": "Bulk actions", @@ -104,7 +107,8 @@ "export_status": "Export status", "export_in_progress": "Export in progress: {{progressCount}}", "export_finished_successfully": "Export finished successfully.", - "format_pdf": "PDF - for printing or sharing purposes." + "format_pdf": "PDF - for printing or sharing purposes.", + "share-format": "HTML for web publishing - uses the same theme that is used shared notes, but can be published as a static website." }, "help": { "title": "Cheatsheet", @@ -260,7 +264,6 @@ "delete_all_revisions": "Delete all revisions of this note", "delete_all_button": "Delete all revisions", "help_title": "Help on Note Revisions", - "revision_last_edited": "This revision was last edited on {{date}}", "confirm_delete_all": "Do you want to delete all revisions of this note?", "no_revisions": "No revisions for this note yet...", "restore_button": "Restore", @@ -1453,10 +1456,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI is a REST API used to access Trilium instance programmatically, without UI.", - "see_more": "See more details in the {{- link_to_wiki}} and the {{- link_to_openapi_spec}} or the {{- link_to_swagger_ui }}.", - "wiki": "wiki", - "openapi_spec": "ETAPI OpenAPI spec", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Create new ETAPI token", "existing_tokens": "Existing tokens", "no_tokens_yet": "There are no tokens yet. Click on the button above to create one.", @@ -2038,6 +2037,9 @@ "start-presentation": "Start presentation", "slide-overview": "Toggle an overview of the slides" }, + "calendar_view": { + "delete_note": "Delete note..." + }, "command_palette": { "tree-action-name": "Tree: {{name}}", "export_note_title": "Export Note", diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index ce70f474b..5a38d62ee 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -104,7 +104,8 @@ "export_status": "Estado de exportación", "export_in_progress": "Exportación en curso: {{progressCount}}", "export_finished_successfully": "La exportación finalizó exitosamente.", - "format_pdf": "PDF - para propósitos de impresión o compartición." + "format_pdf": "PDF - para propósitos de impresión o compartición.", + "share-format": "HTML para publicación web: utiliza el mismo tema que se utiliza en las notas compartidas, pero se puede publicar como un sitio web estático." }, "help": { "noteNavigation": "Navegación de notas", @@ -184,7 +185,8 @@ }, "import-status": "Estado de importación", "in-progress": "Importación en progreso: {{progress}}", - "successful": "Importación finalizada exitosamente." + "successful": "Importación finalizada exitosamente.", + "importZipRecommendation": "Al importar un archivo ZIP, la jerarquía de notas reflejará la estructura de subdirectorios dentro del archivo comprimido." }, "include_note": { "dialog_title": "Incluir nota", @@ -259,7 +261,6 @@ "delete_all_revisions": "Eliminar todas las revisiones de esta nota", "delete_all_button": "Eliminar todas las revisiones", "help_title": "Ayuda sobre revisiones de notas", - "revision_last_edited": "Esta revisión se editó por última vez en {{date}}", "confirm_delete_all": "¿Quiere eliminar todas las revisiones de esta nota?", "no_revisions": "Aún no hay revisiones para esta nota...", "restore_button": "Restaurar", @@ -1445,10 +1446,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI es una REST API que se utiliza para acceder a la instancia de Trilium mediante programación, sin interfaz de usuario.", - "see_more": "Véa más detalles en el {{- link_to_wiki}} y el {{- link_to_openapi_spec}} o el {{- link_to_swagger_ui }}.", - "wiki": "wiki", - "openapi_spec": "Especificación ETAPI OpenAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Crear nuevo token ETAPI", "existing_tokens": "Tokens existentes", "no_tokens_yet": "Aún no hay tokens. Dé clic en el botón de arriba para crear uno.", @@ -1715,7 +1712,9 @@ "window-on-top": "Mantener esta ventana en la parte superior" }, "note_detail": { - "could_not_find_typewidget": "No se pudo encontrar typeWidget para el tipo '{{type}}'" + "could_not_find_typewidget": "No se pudo encontrar typeWidget para el tipo '{{type}}'", + "printing": "Impresión en curso...", + "printing_pdf": "Exportando a PDF en curso.." }, "note_title": { "placeholder": "escriba el título de la nota aquí..." diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index 2c12c9bff..46d6575d6 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -260,7 +260,6 @@ "delete_all_revisions": "Supprimer toutes les versions de cette note", "delete_all_button": "Supprimer toutes les versions", "help_title": "Aide sur les versions de notes", - "revision_last_edited": "Cette version a été modifiée pour la dernière fois le {{date}}", "confirm_delete_all": "Voulez-vous supprimer toutes les versions de cette note ?", "no_revisions": "Aucune version pour cette note pour l'instant...", "confirm_restore": "Voulez-vous restaurer cette version ? Le titre et le contenu actuels de la note seront écrasés par cette version.", @@ -1289,8 +1288,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI est une API REST utilisée pour accéder à l'instance Trilium par programme, sans interface utilisateur.", - "wiki": "wiki", - "openapi_spec": "Spec ETAPI OpenAPI", "create_token": "Créer un nouveau jeton ETAPI", "existing_tokens": "Jetons existants", "no_tokens_yet": "Il n'y a pas encore de jetons. Cliquez sur le bouton ci-dessus pour en créer un.", @@ -1307,9 +1304,7 @@ "delete_token": "Supprimer/désactiver ce token", "rename_token_title": "Renommer le jeton", "rename_token_message": "Veuillez saisir le nom du nouveau jeton", - "delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?", - "see_more": "Voir plus de détails dans le {{- link_to_wiki}} et le {{- link_to_openapi_spec}} ou le {{- link_to_swagger_ui }}.", - "swagger_ui": "Interface utilisateur ETAPI Swagger" + "delete_token_confirmation": "Êtes-vous sûr de vouloir supprimer le jeton ETAPI « {{name}} » ?" }, "options_widget": { "options_status": "Statut des options", diff --git a/apps/client/src/translations/hi/translation.json b/apps/client/src/translations/hi/translation.json new file mode 100644 index 000000000..2d1c3b9f1 --- /dev/null +++ b/apps/client/src/translations/hi/translation.json @@ -0,0 +1,5 @@ +{ + "about": { + "title": "ट्रिलियम नोट्स के बारें में" + } +} diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index a49a9a5dc..52c029ffb 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -109,7 +109,8 @@ "export_type_single": "Solo questa nota, senza le sottostanti", "format_opml": "OPML - formato per scambio informazioni outline. Formattazione, immagini e files non sono inclusi.", "opml_version_1": "OPML v.1.0 - solo testo semplice", - "opml_version_2": "OPML v2.0 - supporta anche HTML" + "opml_version_2": "OPML v2.0 - supporta anche HTML", + "share-format": "HTML per la pubblicazione sul web - utilizza lo stesso tema utilizzato per le note condivise, ma può essere pubblicato come sito web statico." }, "password_not_set": { "body1": "Le note protette sono crittografate utilizzando una password utente, ma la password non è stata ancora impostata.", @@ -132,10 +133,6 @@ "new_token_message": "Inserisci il nome del nuovo token", "title": "ETAPI", "description": "ETAPI è un'API REST utilizzata per accedere alle istanze di Trilium in modo programmatico, senza interfaccia utente.", - "see_more": "Per maggiori dettagli consulta {{- link_to_wiki}} e {{- link_to_openapi_spec}} o {{- link_to_swagger_ui}}.", - "wiki": "wiki", - "openapi_spec": "Specifiche ETAPI OpenAPI", - "swagger_ui": "Interfaccia utente ETAPI Swagger", "create_token": "Crea un nuovo token ETAPI", "existing_tokens": "Token esistenti", "no_tokens_yet": "Non ci sono ancora token. Clicca sul pulsante qui sopra per crearne uno.", @@ -867,7 +864,6 @@ "delete_all_revisions": "Elimina tutte le revisioni di questa nota", "delete_all_button": "Elimina tutte le revisioni", "help_title": "Aiuto sulle revisioni delle note", - "revision_last_edited": "Questa revisione è stata modificata l'ultima volta il {{date}}", "confirm_delete_all": "Vuoi eliminare tutte le revisioni di questa nota?", "no_revisions": "Ancora nessuna revisione per questa nota...", "restore_button": "Ripristina", diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index 1f81a4a4f..6a9b4f75e 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -254,7 +254,8 @@ "export_status": "エクスポート状況", "export_in_progress": "エクスポート処理中: {{progressCount}}", "export_finished_successfully": "エクスポートが正常に完了しました。", - "format_pdf": "PDF - 印刷または共有目的に。" + "format_pdf": "PDF - 印刷または共有目的に。", + "share-format": "Web 公開用の HTML - 共有ノートで使用されるのと同じテーマを使用しますが、静的 Web サイトとして公開できます。" }, "help": { "title": "チートシート", @@ -610,7 +611,6 @@ "delete_all_revisions": "このノートの変更履歴をすべて削除", "delete_all_button": "変更履歴をすべて削除", "help_title": "変更履歴のヘルプ", - "revision_last_edited": "この変更は{{date}}に行われました", "confirm_delete_all": "このノートのすべての変更履歴を削除しますか?", "no_revisions": "このノートに変更履歴はまだありません...", "restore_button": "復元", @@ -657,10 +657,6 @@ "created": "作成日時", "title": "ETAPI", "description": "ETAPI は、Trilium インスタンスに UI なしでプログラム的にアクセスするための REST API です。", - "see_more": "詳細は{{- link_to_wiki}}と{{- link_to_openapi_spec}}または{{- link_to_swagger_ui }}を参照してください。", - "wiki": "wiki", - "openapi_spec": "ETAPI OpenAPIの仕様", - "swagger_ui": "ETAPI Swagger UI", "create_token": "新しくETAPIトークンを作成", "existing_tokens": "既存のトークン", "no_tokens_yet": "トークンはまだありません。上のボタンをクリックして作成してください。", diff --git a/apps/website/public/translations/ca/translation.json b/apps/client/src/translations/mr/translation.json similarity index 100% rename from apps/website/public/translations/ca/translation.json rename to apps/client/src/translations/mr/translation.json diff --git a/apps/client/src/translations/nl/translation.json b/apps/client/src/translations/nl/translation.json index d07df69e5..de5cfb6c7 100644 --- a/apps/client/src/translations/nl/translation.json +++ b/apps/client/src/translations/nl/translation.json @@ -13,6 +13,13 @@ "critical-error": { "title": "Kritische Error", "message": "Een kritieke fout heeft plaatsgevonden waardoor de cliënt zich aanmeldt vanaf het begin:\n\n84X\n\nDit is waarschijnlijk veroorzaakt door een script dat op een onverwachte manier faalt. Probeer de sollicitatie in veilige modus te starten en de kwestie aan te spreken." + }, + "widget-error": { + "title": "Starten widget mislukt", + "message-unknown": "Onbekende widget kan niet gestart worden omdat:\n\n{{message}}" + }, + "bundle-error": { + "title": "Custom script laden mislukt" } }, "add_link": { diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index 1d90a30e8..6ff4b26f4 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -912,7 +912,6 @@ "delete_all_revisions": "Usuń wszystkie wersje tej notatki", "delete_all_button": "Usuń wszystkie wersje", "help_title": "Pomoc dotycząca wersji notatki", - "revision_last_edited": "Ta wersja była ostatnio edytowana {{date}}", "confirm_delete_all": "Czy chcesz usunąć wszystkie wersje tej notatki?", "no_revisions": "Brak wersji dla tej notatki...", "restore_button": "Przywróć", @@ -1664,10 +1663,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI to interfejs API REST używany do programowego dostępu do instancji Trilium, bez interfejsu użytkownika.", - "see_more": "Zobacz więcej szczegółów w {{- link_to_wiki}} oraz w {{- link_to_openapi_spec}} lub {{- link_to_swagger_ui }}.", - "wiki": "wiki", - "openapi_spec": "specyfikacja ETAPI OpenAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Utwórz nowy token ETAPI", "existing_tokens": "Istniejące tokeny", "no_tokens_yet": "Nie ma jeszcze żadnych tokenów. Kliknij przycisk powyżej, aby utworzyć jeden.", diff --git a/apps/client/src/translations/pt/translation.json b/apps/client/src/translations/pt/translation.json index ce5e69f14..9b07163be 100644 --- a/apps/client/src/translations/pt/translation.json +++ b/apps/client/src/translations/pt/translation.json @@ -259,7 +259,6 @@ "delete_all_revisions": "Apagar todas as versões desta nota", "delete_all_button": "Apagar todas as versões", "help_title": "Ajuda sobre as versões da nota", - "revision_last_edited": "Esta versão foi editada pela última vez em {{date}}", "confirm_delete_all": "Quer apagar todas as versões desta nota?", "no_revisions": "Ainda não há versões para esta nota...", "restore_button": "Recuperar", @@ -1423,10 +1422,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI é uma API REST usada para aceder a instância do Trilium programaticamente, sem interface gráfica.", - "see_more": "Veja mais pormenores no {{- link_to_wiki}}, na {{- link_to_openapi_spec}} ou na {{- link_to_swagger_ui}}.", - "wiki": "wiki", - "openapi_spec": "Especificação OpenAPI do ETAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Criar token ETAPI", "existing_tokens": "Tokens existentes", "no_tokens_yet": "Ainda não existem tokens. Clique no botão acima para criar um.", diff --git a/apps/client/src/translations/pt_br/translation.json b/apps/client/src/translations/pt_br/translation.json index 5bdd1ae54..ae4503508 100644 --- a/apps/client/src/translations/pt_br/translation.json +++ b/apps/client/src/translations/pt_br/translation.json @@ -415,7 +415,6 @@ "delete_all_revisions": "Excluir todas as versões desta nota", "delete_all_button": "Excluir todas as versões", "help_title": "Ajuda sobre as versões da nota", - "revision_last_edited": "Esta versão foi editada pela última vez em {{date}}", "confirm_delete_all": "Você quer excluir todas as versões desta nota?", "no_revisions": "Ainda não há versões para esta nota...", "restore_button": "Recuperar", @@ -1933,10 +1932,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI é uma API REST usada para acessar a instância do Trilium programaticamente, sem interface gráfica.", - "see_more": "Veja mais detalhes no {{- link_to_wiki}}, na {{- link_to_openapi_spec}} ou na {{- link_to_swagger_ui}}.", - "wiki": "wiki", - "openapi_spec": "Especificação OpenAPI do ETAPI", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Criar novo token ETAPI", "existing_tokens": "Tokens existentes", "no_tokens_yet": "Ainda não existem tokens. Clique no botão acima para criar um.", diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 14350bc83..dbb9e0955 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -507,17 +507,13 @@ "new_token_message": "Introduceți denumirea noului token", "new_token_title": "Token ETAPI nou", "no_tokens_yet": "Nu există încă token-uri. Clic pe butonul de deasupra pentru a crea una.", - "openapi_spec": "Specificația OpenAPI pentru ETAPI", - "swagger_ui": "UI-ul Swagger pentru ETAPI", "rename_token": "Redenumește token-ul", "rename_token_message": "Introduceți denumirea noului token", "rename_token_title": "Redenumire token", - "see_more": "Vedeți mai multe detalii în {{- link_to_wiki}} și în {{- link_to_openapi_spec}} sau în {{- link_to_swagger_ui }}.", "title": "ETAPI", "token_created_message": "Copiați token-ul creat în clipboard. Trilium stochează token-ul ca hash așadar această valoare poate fi văzută doar acum.", "token_created_title": "Token ETAPI creat", - "token_name": "Denumire token", - "wiki": "wiki" + "token_name": "Denumire token" }, "execute_script": { "example_1": "De exemplu, pentru a adăuga un șir de caractere la titlul unei notițe, se poate folosi acest mic script:", @@ -1090,7 +1086,6 @@ "preview_not_available": "Nu este disponibilă o previzualizare pentru acest tip de notiță.", "restore_button": "Restaurează", "revision_deleted": "Revizia notiței a fost ștearsă.", - "revision_last_edited": "Revizia a fost ultima oară modificată pe {{date}}", "revision_restored": "Revizia notiței a fost restaurată.", "revisions_deleted": "Notița reviziei a fost ștearsă.", "maximum_revisions": "Numărul maxim de revizii pentru notița curentă: {{number}}.", diff --git a/apps/client/src/translations/ru/translation.json b/apps/client/src/translations/ru/translation.json index 07c323a89..463fc8961 100644 --- a/apps/client/src/translations/ru/translation.json +++ b/apps/client/src/translations/ru/translation.json @@ -366,7 +366,6 @@ "delete_all_button": "Удалить все версии", "help_title": "Помощь по версиям заметок", "confirm_delete_all": "Вы хотите удалить все версии этой заметки?", - "revision_last_edited": "Эта версия последний раз редактировалась {{date}}", "confirm_restore": "Хотите восстановить эту версию? Текущее название и содержание заметки будут перезаписаны этой версией.", "confirm_delete": "Вы хотите удалить эту версию?", "revisions_deleted": "Версии заметки были удалены.", @@ -1441,7 +1440,6 @@ }, "etapi": { "title": "ETAPI", - "wiki": "вики", "created": "Создано", "actions": "Действия", "existing_tokens": "Существующие токены", @@ -1449,10 +1447,7 @@ "default_token_name": "новый токен", "rename_token_title": "Переименовать токен", "description": "ETAPI — это REST API, используемый для программного доступа к экземпляру Trilium без пользовательского интерфейса.", - "see_more": "Более подробную информацию смотрите в {{- link_to_wiki}} и {{- link_to_openapi_spec}} или {{- link_to_swagger_ui }}.", "create_token": "Создать новый токен ETAPI", - "openapi_spec": "Спецификация ETAPI OpenAPI", - "swagger_ui": "Пользовательский интерфейс ETAPI Swagger", "new_token_title": "Новый токен ETAPI", "token_created_title": "Создан токен ETAPI", "rename_token": "Переименовать этот токен", diff --git a/apps/client/src/translations/sr/translation.json b/apps/client/src/translations/sr/translation.json index dd0ff6ff9..df88fdcda 100644 --- a/apps/client/src/translations/sr/translation.json +++ b/apps/client/src/translations/sr/translation.json @@ -256,7 +256,6 @@ "delete_all_revisions": "Obriši sve revizije ove beleške", "delete_all_button": "Obriši sve revizije", "help_title": "Pomoć za Revizije beleški", - "revision_last_edited": "Ova revizija je poslednji put izmenjena {{date}}", "confirm_delete_all": "Da li želite da obrišete sve revizije ove beleške?", "no_revisions": "Još uvek nema revizija za ovu belešku...", "restore_button": "Vrati", diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 12a3bd68d..3c3a45825 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -104,7 +104,8 @@ "export_in_progress": "正在匯出:{{progressCount}}", "export_finished_successfully": "成功匯出。", "format_html": "HTML - 推薦,因為它保留了所有格式", - "format_pdf": "PDF - 用於列印或與他人分享。" + "format_pdf": "PDF - 用於列印或與他人分享。", + "share-format": "HTML 網頁發佈——使用與共享筆記相同的佈景主題,但可發佈為靜態網站。" }, "help": { "noteNavigation": "筆記導航", @@ -260,7 +261,6 @@ "delete_all_revisions": "刪除此筆記的所有歷史版本", "delete_all_button": "刪除所有歷史版本", "help_title": "關於筆記歷史版本的說明", - "revision_last_edited": "此歷史版本上次於 {{date}} 編輯", "confirm_delete_all": "您是否要刪除此筆記的所有歷史版本?", "no_revisions": "此筆記暫無歷史版本…", "confirm_restore": "您是否要還原此歷史版本?這將使用此歷史版本覆寫筆記的目前標題和內容。", @@ -1281,8 +1281,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI 是一個 REST API,用於以編程方式訪問 Trilium 實例,而無需 UI。", - "wiki": "維基", - "openapi_spec": "ETAPI OpenAPI 規範", "create_token": "新增 ETAPI 令牌", "existing_tokens": "現有令牌", "no_tokens_yet": "目前還沒有令牌。點擊上面的按鈕新增一個。", @@ -1299,9 +1297,7 @@ "delete_token": "刪除 / 停用此令牌", "rename_token_title": "重新命名令牌", "rename_token_message": "請輸入新的令牌名稱", - "delete_token_confirmation": "您確定要刪除 ETAPI 令牌 \"{{name}}\" 嗎?", - "see_more": "有關更多詳細資訊,請參閱 {{- link_to_wiki}} 和 {{- link_to_openapi_spec}} 或 {{- link_to_swagger_ui}}。", - "swagger_ui": "ETAPI Swagger UI" + "delete_token_confirmation": "您確定要刪除 ETAPI 令牌 \"{{name}}\" 嗎?" }, "options_widget": { "options_status": "選項狀態", diff --git a/apps/client/src/translations/uk/translation.json b/apps/client/src/translations/uk/translation.json index 9166599e1..9e99e6d09 100644 --- a/apps/client/src/translations/uk/translation.json +++ b/apps/client/src/translations/uk/translation.json @@ -309,7 +309,6 @@ "delete_all_revisions": "Видалити всі версії цієї нотатки", "delete_all_button": "Видалити всі версії", "help_title": "Довідка щодо Версій нотаток", - "revision_last_edited": "Цю версію востаннє редагували {{date}}", "confirm_delete_all": "Ви хочете видалити всі версії цієї нотатки?", "no_revisions": "Поки що немає версій цієї нотатки...", "restore_button": "Відновити", @@ -1403,10 +1402,6 @@ "etapi": { "title": "ETAPI", "description": "ETAPI — це REST API, який використовується для програмного доступу до екземпляра Trilium без інтерфейсу користувача.", - "see_more": "Див. докладнішу інформацію у {{- link_to_wiki}} та {{- link_to_openapi_spec}} або {{- link_to_swagger_ui }}.", - "wiki": "вікі", - "openapi_spec": "ETAPI OpenAPI spec", - "swagger_ui": "ETAPI Swagger UI", "create_token": "Створити новий токен ETAPI", "existing_tokens": "Існуючі токени", "no_tokens_yet": "Токенів поки що немає. Натисніть кнопку вище, щоб створити його.", diff --git a/apps/client/src/types.d.ts b/apps/client/src/types.d.ts index f549680a7..c386a67f0 100644 --- a/apps/client/src/types.d.ts +++ b/apps/client/src/types.d.ts @@ -26,7 +26,6 @@ interface CustomGlobals { appContext: AppContext; froca: Froca; treeCache: Froca; - importMarkdownInline: () => Promise; SEARCH_HELP_TEXT: string; activeDialog: JQuery | null; componentId: string; diff --git a/apps/client/src/widgets/collections/calendar/context_menu.ts b/apps/client/src/widgets/collections/calendar/context_menu.ts new file mode 100644 index 000000000..7eddbed3c --- /dev/null +++ b/apps/client/src/widgets/collections/calendar/context_menu.ts @@ -0,0 +1,28 @@ +import FNote from "../../../entities/fnote"; +import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; +import link_context_menu from "../../../menus/link_context_menu"; +import branches from "../../../services/branches"; +import { t } from "../../../services/i18n"; + +export function openCalendarContextMenu(e: ContextMenuEvent, noteId: string, parentNote: FNote) { + e.preventDefault(); + e.stopPropagation(); + + contextMenu.show({ + x: e.pageX, + y: e.pageY, + items: [ + ...link_context_menu.getItems(), + { kind: "separator" }, + { + title: t("calendar_view.delete_note"), + uiIcon: "bx bx-trash", + handler: async () => { + const branchId = parentNote.childToBranch[noteId]; + await branches.deleteNotes([ branchId ], false, false); + } + } + ], + selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, noteId), + }) +} diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 518af914c..692b074a6 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -20,6 +20,7 @@ import Button, { ButtonGroup } from "../../react/Button"; import ActionButton from "../../react/ActionButton"; import { RefObject } from "preact"; import TouchBar, { TouchBarButton, TouchBarLabel, TouchBarSegmentedControl, TouchBarSpacer } from "../../react/TouchBar"; +import { openCalendarContextMenu } from "./context_menu"; interface CalendarViewData { @@ -106,7 +107,7 @@ export default function CalendarView({ note, noteIds }: ViewModeProps { const { iconClass, promotedAttributes } = e.event.extendedProps; @@ -302,6 +303,11 @@ function useEventDisplayCustomization() { } $(mainContainer ?? e.el).append($(promotedAttributesHtml)); } + + e.el.addEventListener("contextmenu", (contextMenuEvent) => { + const noteId = e.event.extendedProps.noteId; + openCalendarContextMenu(contextMenuEvent, noteId, parentNote); + }); }, []); return { eventDidMount }; } diff --git a/apps/client/src/widgets/dialogs/branch_prefix.css b/apps/client/src/widgets/dialogs/branch_prefix.css new file mode 100644 index 000000000..3470f1018 --- /dev/null +++ b/apps/client/src/widgets/dialogs/branch_prefix.css @@ -0,0 +1,13 @@ +.branch-prefix-dialog .branch-prefix-notes-list { + margin-top: 10px; +} + +.branch-prefix-dialog .branch-prefix-notes-list ul { + max-height: 200px; + overflow: auto; + margin-top: 5px; +} + +.branch-prefix-dialog .branch-prefix-current { + opacity: 0.6; +} diff --git a/apps/client/src/widgets/dialogs/branch_prefix.tsx b/apps/client/src/widgets/dialogs/branch_prefix.tsx index 46888f0ab..e715c894f 100644 --- a/apps/client/src/widgets/dialogs/branch_prefix.tsx +++ b/apps/client/src/widgets/dialogs/branch_prefix.tsx @@ -10,53 +10,86 @@ import Button from "../react/Button.jsx"; import FormGroup from "../react/FormGroup.js"; import { useTriliumEvent } from "../react/hooks.jsx"; import FBranch from "../../entities/fbranch.js"; +import type { ContextMenuCommandData } from "../../components/app_context.js"; +import "./branch_prefix.css"; + +// Virtual branches (e.g., from search results) start with this prefix +const VIRTUAL_BRANCH_PREFIX = "virt-"; export default function BranchPrefixDialog() { const [ shown, setShown ] = useState(false); - const [ branch, setBranch ] = useState(); + const [ branches, setBranches ] = useState([]); const [ prefix, setPrefix ] = useState(""); const branchInput = useRef(null); - useTriliumEvent("editBranchPrefix", async () => { - const notePath = appContext.tabManager.getActiveContextNotePath(); - if (!notePath) { + useTriliumEvent("editBranchPrefix", async (data?: ContextMenuCommandData) => { + let branchIds: string[] = []; + + if (data?.selectedOrActiveBranchIds && data.selectedOrActiveBranchIds.length > 0) { + // Multi-select mode from tree context menu + branchIds = data.selectedOrActiveBranchIds.filter((branchId) => !branchId.startsWith(VIRTUAL_BRANCH_PREFIX)); + } else { + // Single branch mode from keyboard shortcut or when no selection + const notePath = appContext.tabManager.getActiveContextNotePath(); + if (!notePath) { + return; + } + + const { noteId, parentNoteId } = tree.getNoteIdAndParentIdFromUrl(notePath); + + if (!noteId || !parentNoteId) { + return; + } + + const branchId = await froca.getBranchId(parentNoteId, noteId); + if (!branchId) { + return; + } + const parentNote = await froca.getNote(parentNoteId); + if (!parentNote || parentNote.type === "search") { + return; + } + + branchIds = [branchId]; + } + + if (branchIds.length === 0) { return; } - const { noteId, parentNoteId } = tree.getNoteIdAndParentIdFromUrl(notePath); + const newBranches = branchIds + .map(id => froca.getBranch(id)) + .filter((branch): branch is FBranch => branch !== null); - if (!noteId || !parentNoteId) { + if (newBranches.length === 0) { return; } - const newBranchId = await froca.getBranchId(parentNoteId, noteId); - if (!newBranchId) { - return; - } - const parentNote = await froca.getNote(parentNoteId); - if (!parentNote || parentNote.type === "search") { - return; - } - - const newBranch = froca.getBranch(newBranchId); - setBranch(newBranch); - setPrefix(newBranch?.prefix ?? ""); + setBranches(newBranches); + // Use the prefix of the first branch as the initial value + setPrefix(newBranches[0]?.prefix ?? ""); setShown(true); }); async function onSubmit() { - if (!branch) { + if (branches.length === 0) { return; } - savePrefix(branch.branchId, prefix); + if (branches.length === 1) { + await savePrefix(branches[0].branchId, prefix); + } else { + await savePrefixBatch(branches.map(b => b.branchId), prefix); + } setShown(false); } + const isSingleBranch = branches.length === 1; + return ( branchInput.current?.focus()} onHidden={() => setShown(false)} @@ -69,9 +102,27 @@ export default function BranchPrefixDialog() {
setPrefix((e.target as HTMLInputElement).value)} /> -
- {branch && branch.getNoteFromCache().title}
+ {isSingleBranch && branches[0] && ( +
- {branches[0].getNoteFromCache().title}
+ )}
+ {!isSingleBranch && ( +
+ {t("branch_prefix.affected_branches", { count: branches.length })} +
    + {branches.map((branch) => { + const note = branch.getNoteFromCache(); + return ( +
  • + {branch.prefix && {branch.prefix} - } + {note.title} +
  • + ); + })} +
+
+ )}
); } @@ -80,3 +131,8 @@ async function savePrefix(branchId: string, prefix: string) { await server.put(`branches/${branchId}/set-prefix`, { prefix: prefix }); toast.showMessage(t("branch_prefix.branch_prefix_saved")); } + +async function savePrefixBatch(branchIds: string[], prefix: string) { + await server.put("branches/set-prefix-batch", { branchIds, prefix }); + toast.showMessage(t("branch_prefix.branch_prefix_saved_multiple", { count: branchIds.length })); +} diff --git a/apps/client/src/widgets/dialogs/export.tsx b/apps/client/src/widgets/dialogs/export.tsx index dded32624..b694d9abe 100644 --- a/apps/client/src/widgets/dialogs/export.tsx +++ b/apps/client/src/widgets/dialogs/export.tsx @@ -79,6 +79,7 @@ export default function ExportDialog() { values={[ { value: "html", label: t("export.format_html_zip") }, { value: "markdown", label: t("export.format_markdown") }, + { value: "share", label: t("export.share-format") }, { value: "opml", label: t("export.format_opml") } ]} /> diff --git a/apps/client/src/widgets/dialogs/markdown_import.tsx b/apps/client/src/widgets/dialogs/markdown_import.tsx index d14d6fb11..8de49e330 100644 --- a/apps/client/src/widgets/dialogs/markdown_import.tsx +++ b/apps/client/src/widgets/dialogs/markdown_import.tsx @@ -1,5 +1,4 @@ -import { useCallback, useRef, useState } from "preact/hooks"; -import appContext from "../../components/app_context"; +import { useRef, useState } from "preact/hooks"; import { t } from "../../services/i18n"; import server from "../../services/server"; import toast from "../../services/toast"; @@ -7,6 +6,12 @@ import utils from "../../services/utils"; import Modal from "../react/Modal"; import Button from "../react/Button"; import { useTriliumEvent } from "../react/hooks"; +import EditableTextTypeWidget from "../type_widgets/editable_text"; +import { CKEditorApi } from "../type_widgets/text/CKEditorWithWatchdog"; + +export interface MarkdownImportOpts { + editorApi: CKEditorApi; +} interface RenderMarkdownResponse { htmlContent: string; @@ -14,39 +19,36 @@ interface RenderMarkdownResponse { export default function MarkdownImportDialog() { const markdownImportTextArea = useRef(null); + const editorApiRef = useRef(null); + const [ textTypeWidget, setTextTypeWidget ] = useState(); const [ text, setText ] = useState(""); const [ shown, setShown ] = useState(false); - const triggerImport = useCallback(() => { - if (appContext.tabManager.getActiveContextNoteType() !== "text") { - return; - } - + useTriliumEvent("showPasteMarkdownDialog", ({ editorApi }) => { + setTextTypeWidget(textTypeWidget); if (utils.isElectron()) { const { clipboard } = utils.dynamicRequire("electron"); const text = clipboard.readText(); - - convertMarkdownToHtml(text); + + convertMarkdownToHtml(text, editorApi); } else { + editorApiRef.current = editorApi; setShown(true); } - }, []); - - useTriliumEvent("importMarkdownInline", triggerImport); - useTriliumEvent("pasteMarkdownIntoText", triggerImport); - - async function sendForm() { - await convertMarkdownToHtml(text); - setText(""); - setShown(false); - } + }); return ( } + footer={`; - -class MyWidget extends api.BasicWidget { - get position() { return 1; } - get parentWidget() { return "left-pane" } - - doRender() { - this.$widget = $(template); - return this.$widget; - } -} - -module.exports = new MyWidget(); -``` - -`parentWidget()` can be given the following values: - -* `left-pane` - This renders the widget on the left side of the screen where the note tree lives. -* `center-pane` - This renders the widget in the center of the layout in the same location that notes and splits appear. -* `note-detail-pane` - This renders the widget _with_ the note in the center pane. This means it can appear multiple times with splits. -* `right-pane` - This renders the widget to the right of any opened notes. - -* * * - -Reference: - -* [https://trilium.rocks/X7pxYpiu0lgU](https://trilium.rocks/X7pxYpiu0lgU) -* [https://github.com/zadam/trilium/wiki/Widget-Basics](https://github.com/zadam/trilium/wiki/Widget-Basics) -* [https://github.com/zadam/trilium/wiki/Frontend-Basics](https://github.com/zadam/trilium/wiki/Frontend-Basics) \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Building the editor.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Building the editor.md deleted file mode 100644 index 940617026..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Building the editor.md +++ /dev/null @@ -1,21 +0,0 @@ -# Building the editor -First, make sure Environment setup is set up. - -## Trigger the build - -``` -cd packages/ckeditor5-build-trilium -yarn build -``` - -This will trigger a change in the `build` directory. - -## Copy the build artifact to the main repo - -Go to `packages/ckeditor5-build-balloon-trilium/build` and copy `ckeditor.js` and `ckeditor.js.map` to `libraries/ckeditor` in the `Notes` repository. - -An example shell command to copy it: - -``` -cp build/ckeditor.* ~/Projects/TriliumNext/Notes/libraries/ckeditor/ -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Environment setup.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Environment setup.md deleted file mode 100644 index 76819a12b..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Environment setup.md +++ /dev/null @@ -1,26 +0,0 @@ -# Environment setup -## Clone the repository - -To set up the repository: - -``` -git clone https://github.com/TriliumNext/trilium-ckeditor5.git -``` - -## Install dependencies - -First, install root dependencies: - -``` -cd trilium-ckeditor5 -yarn install -``` - -Secondly, install the Trilium build dependencies: - -``` -cd packages/ckeditor5-build-trilium -yarn install -``` - -To trigger the build, see Building the editor. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Updating to a newer version of.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Updating to a newer version of.md deleted file mode 100644 index 6e7808f67..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Updating to a newer version of.md +++ /dev/null @@ -1,65 +0,0 @@ -# Updating to a newer version of CKEditor -## Before updating - -Make sure that all the plugins are compatible with this version:  Versions and external plugins. If not, they will need to be updated to the same version as the one you are updating, by altering their `package.json`. - -If the plugin is external to the Trilium organisation, it needs to be forked first. - -## Environment setup - -The first step is to add the CKEditor source as a remote. This only needs to be done once. - -``` -git remote add upstream ssh://git@github.com/ckeditor/ckeditor5.git -git fetch upstream -``` - -## Update steps - -Due to how the repository is structured, updates to the CKEditor are a bit difficult. - -1. `git fetch upstream` -2. Pick a version and merge with it: `git merge -X theirs v99.2.0` -3. When there are complicated conflicts, sometimes it's easier to take everything from the target version instead, for a given path: `git checkout v99.2.0 -- "packages/ckeditor5-list/**"`. -4. Go in `packages/ckeditor5-build-trilium/package.json` and run `node sync-version.js` to update the `package.json` with the new versions. Review and commit the change. -5. Follow again the dependency setup in Environment setup, as they have changed. -6. [Run the build](Building%20the%20editor.md) and check that it works. - -## Final steps - -1. Start the TriliumNext server -2. If updated to a newer version of CKEditor, check type `CKEDITOR_VERSION` in the browser/Electron console to ensure that the correct version is used. -3. Do a basic sanity check as well. -4. Commit and push the change on both sides (in the `trilium-ckeditor5` repo and in the `Notes` repo). - -## Troubleshooting client side errors - -These errors might show up when testing the Trilium app: - -``` -ReferenceError: CKEditor is not defined -``` - -Usually this is a side effect of another error, check the logs carefully to see if there is any other related error (perhaps a `CKEditorError`). - -* * * - -``` -Uncaught error: Message: CKEditorError: ckeditor-duplicated-modules -``` - -Most likely cause is one of the external plugins is incompatible with this version. - -For example, to disable the Math plugin, go to `packages/ckeditor5-build-trilium/src/config.ts` and modify: - -```diff --import Math from '@triliumnext/ckeditor5-math/src/math'; --import AutoformatMath from '@triliumnext/ckeditor5-math/src/autoformatmath'; - -export const COMMON_PLUGINS = [ -- Math, -- AutoformatMath, -] -``` - -In this case, make sure to align the version of all the external plugins with the one you are updating to, usually by forking the external plugin and updating its versions. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Versions and external plugins.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Versions and external plugins.md deleted file mode 100644 index 2fe124c31..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/CKEditor/Versions and external plugins.md +++ /dev/null @@ -1,8 +0,0 @@ -# Versions and external plugins -## External plugins - -| | | | -| --- | --- | --- | -| trilium-ckeditor5 | 43.2.0 | | -| `ckeditor5-math` | | See ckeditor5-math. | -| | | | \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math.md deleted file mode 100644 index 91b6b265f..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math.md +++ /dev/null @@ -1,29 +0,0 @@ -# ckeditor5-math -
ckeditor5-math in action.
- -A fork of [isaul32/ckeditor5-math](https://github.com/isaul32/ckeditor5-math), which is the CKEditor5 plugin which adds the math functionality. The fork was created to handle #297: Insert Math appears to be broken. - -## Development environment - -* Tested on Node.js 20. -* The package manager is yarn 1 (v1.22.22 is known to be working fine for it at the time of writing). - -Important commands: - -* To check if the code has any formatting issues: `yarn lint` -* To start a live preview: `yarn start` -* To run the tests: `yarn test` - * Note that this requires Chromium, on NixOS this can be achieved by running a `nix-shell -p chromium`, and running `CHROME_BIN=$(which chromium) yarn test` inside it. - -## 📦 Packages - -The built artifact of the plugin is released by the CI and available on the [GitHub NPM registry](https://github.com/TriliumNext/ckeditor5-math/pkgs/npm/ckeditor5-math). - -Note that due to limitations on GitHub's registry, it is not possible to install this package without setting up a personal access token (even though the package itself is public). See [missing note] for more information. - -## ⬆️ Integrating with CKEditor - -1. Release a new version: Release management & continuous integration -2. In `trilium-ckeditor5`, go to `packages/ckeditor5-build-trilium/package.json` in the CKEditor repository and change the dependency of `@triliumnext/ckeditor5-math` to the newly released version. -3. Run `yarn install`. -4. Proceed with Building the editor to integrate everything into TriliumNext and then commit the change. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Release management & continuou.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Release management & continuou.md deleted file mode 100644 index 1511f4bfc..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Release management & continuou.md +++ /dev/null @@ -1,16 +0,0 @@ -# Release management & continuous integration -To automate the release process, a GitHub workflow has been added which builds the package and releases it over to GitHub NPM registry. - -The workflow publishes a release whenever a tag with the correct format is pushed. - -The steps are as follows: - -1. Ensure that the source code is clean and ready for a release. -2. Go to `package.json` and bump the `version` field. -3. Commit the changes. -4. Tag the commit with `v1.2.3`, with the correct version number. -5. Push the changes. - -Then follow the CI and it should indicate success. Afterwards, check the [package](https://github.com/TriliumNext/ckeditor5-math/pkgs/npm/ckeditor5-math)section to ensure that the package is in the “Recent Versions” section. - -If the changes could benefit upstream, consider opening a pull request with the changes there as well. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Updating with upstream.md b/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Updating with upstream.md deleted file mode 100644 index b69003358..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Sub-projects/ckeditor5-math/Updating with upstream.md +++ /dev/null @@ -1,21 +0,0 @@ -# Updating with upstream -If there was a change in the upstream repository ([isaul32/ckeditor5-math](https://github.com/isaul32/ckeditor5-math)), it can be integrated as follows: - -1. Add the upstream as remote (`git remote add upstream ssh://git@github.com/isaul32/ckeditor5-math.git`). -2. Fetch the changes: `git fetch upstream` -3. Merge with a tag: `git merge v43.1.2` -4. Solve the conflict in `package.json` by: - 1. Taking the same version as the upcoming one and appending `-hotfix1`. - 2. Keeping the `@triliumnext/ckeditor5-math` name. -5. Install dependencies: `yarn install` -6. Check that the build works via `yarn prepublishOnly`. -7. Commit the changes, push them. -8. Release a version with Release management & continuous integration. - -## CI job not triggered after pushing all the upstream tags - -If the CI job was not triggered, you might have accidentally pushed a lot of tags using `git push --tags`. Manually delete the tag and push it again: - -```diff -git push -d origin v43.1.2-hotfix1 && git push --tags -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/1_Setting up authentication_.png b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/1_Setting up authentication_.png deleted file mode 100644 index 020472c6d..000000000 Binary files a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/1_Setting up authentication_.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Running tests.md b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Running tests.md deleted file mode 100644 index 3ab98a39c..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Running tests.md +++ /dev/null @@ -1,38 +0,0 @@ -# Running tests -## First-time run - -Before starting Playwright, it has to be installed locally via: - -``` -npx playwright install -``` - -## Starting the integration test server - -There are two types of integration test servers: - -* `npm run integration-mem-db` will run a server with dev mode disabled. - * This is usually what the end user will see when accessing a server instance. - * It will not test the Electron/desktop side of the application. - * Changes to the public scripts will not take effect until running `npm run webpack`. -* `npm run integration-mem-db-dev` will run a server with dev mode enabled. - * This is usually what a dev sees when running `npm run start-server`. - * The difference with the production one is that the assets are loaded directly from files and as such it does not require `npm run webpack` to see changes. - -Either options will open up a server on [localhost:8082](http://localhost:8082) that can be accessed either manually via the browser or via Playwright. - -When asked for a password, the password is `demo1234`. - -## Starting the interactive test runner - -After starting the integration test server, to run the Playwright UI, run in the terminal: - -``` -npx playwright test --ui -``` - -It is also possible to run the interactive code generator instead: - -``` -npx playwright codegen -``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication.md b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication.md deleted file mode 100644 index 4df7880fe..000000000 --- a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication.md +++ /dev/null @@ -1,12 +0,0 @@ -# Setting up authentication -There is a setup test that stores the authentication token so that it can be reused throughout all the tests. - -If tests fail due to being stuck on login, then it must be run. - -To run it manually press “all” near the “Status:” text on top-left of the window - -
- -Then check “setup” and look for `auth.setup.ts` and press its corresponding Run button: - -
\ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication_.png b/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication_.png deleted file mode 100644 index 4b260dfbc..000000000 Binary files a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Setting up authentication_.png and /dev/null differ diff --git a/docs/Developer Guide/Developer Guide/Project Structure.md b/docs/Developer Guide/Developer Guide/Project Structure.md index ff0c954a2..82688cf2a 100644 --- a/docs/Developer Guide/Developer Guide/Project Structure.md +++ b/docs/Developer Guide/Developer Guide/Project Structure.md @@ -1,5 +1,5 @@ # Project Structure -As the application grew in complexity, our build system was growing even more difficult to maintain and was spread across multiple repositories. As such we have decided to use a mono-repo approach, and to do so we chose to have NX manage our mono-repo. +As the application grew in complexity, we decided to switch to a monorepo based on `pnpm`. Our initial monorepo implementation used NX, but we've switched to pure `pnpm` workspaces and our own build scripts. ## Project structure @@ -12,45 +12,18 @@ The mono-repo is mainly structured in: * `packages`, containing dependencies used by one or more `apps`. * `commons`, containing shared code for all the apps. -## Working with NX - -### Running tasks via the CLI +## Working with the project For example to run the server instance: ``` -pnpm exec nx run server:serve +pnpm server:start ``` -NX has built-in cache support which should make development much faster. Sometimes, it can get in the way; to skip the cache simply append `--skip-nx-cache` to the command you are running. +## Running and building -### Running tasks using Visual Studio Code - -If you are using Visual Studio Code as your development tool for Trilium, consider using the NX Console. It allows running tasks/targets much easier via the dedicated tab. Right-click a target in the list for more options, such as bypassing the cache. - -## Important tasks - -Each application has a number of tasks (called _targets_ by NX). Here's a non-exhaustive list of the tasks that are useful during development. - -To run any of the task use `pnpm exec nx run project:task`, or use the Visual Studio Code integration as described above. - -* `client`: - * The client is not meant to be run by itself, despite being described as an app. See the documentation on the server instead. -* `server`: - * To run the server in development mode, run `client:serve` (which will only serve the public assets), followed by `server:serve` (which will proxy the assets of the client as well). The dev port remains the same as always, `8080`. - * To run the server in production mode (with its own copy of the assets), run `server:start-prod`. - * To build the server for Docker, run `docker-build` which will automatically build and tag the image if Docker is installed locally. - * Similarly, run `docker-start` to build and run the Docker image. -* `desktop`: - * To run the desktop, run `desktop:serve`. - * Unlike the server, this one does not require the client since it will automatically get a production copy of it. The only downside is that modifications to the code will only take effect after restarting the task. - -## Building packages - -Generally, the building process of a project generates a `dist` folder containing everything needed for production. To trigger a build run `pnpm nx build project` where `project` is the name of a project from either `apps` or `packages`. +Each application has a number of tasks. Here's a non-exhaustive list of the tasks that are useful during development. See Building. ## Managing dependencies across the mono-repo -We are using [pnpm workspaces](https://pnpm.io/workspaces) to manage the project structure, further augmented by NX which is described in a different section. - -The workspace configuration is in `pnpm-workspace.yaml` at project level but it generally should not be modified. \ No newline at end of file +We are using [pnpm workspaces](https://pnpm.io/workspaces) to manage the project structure. The workspace configuration is in `pnpm-workspace.yaml` at project level but it generally should not be modified. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing.md b/docs/Developer Guide/Developer Guide/Testing.md similarity index 54% rename from docs/Developer Guide/Developer Guide/Old documentation/Testing.md rename to docs/Developer Guide/Developer Guide/Testing.md index 95efd9919..570f52ded 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Testing.md +++ b/docs/Developer Guide/Developer Guide/Testing.md @@ -1,4 +1,48 @@ # Testing +### Test Organization + +**Parallel Tests** (can run simultaneously): + +* Client tests +* Package tests +* E2E tests (isolated databases) + +**Sequential Tests** (shared resources): + +* Server tests (shared database) +* CKEditor plugin tests + +### Test Frameworks + +* **Vitest** - Unit and integration tests +* **Playwright** - E2E tests +* **Happy-DOM** - DOM testing environment + +## Test locations + +``` +apps/ +├── server/ +│ └── src/**/*.spec.ts # Server tests +├── client/ +│ └── src/**/*.spec.ts # Client tests +└── server-e2e/ +│ └── tests/**/*.spec.ts # E2E tests +└── desktop/ + └── e2e + └── tests/**/*.spec.ts # E2E tests +``` + +## Running tests + +At project root: + +``` +pnpm test:all # All tests +pnpm test:parallel # Fast parallel tests +pnpm test:sequential # Sequential tests only +``` + ## Unit testing and integration testing Using `vitest`, there are some unit and integration tests done for both the client and the server. @@ -17,17 +61,14 @@ Note that some integration tests rely on an in-memory database in order to funct ### REST API testing for the server -Some original work was done by Zadam in `/test-etapi`, using `.http` files. - -New effort using `vitest` and `supertest` to initialize the Express server and run assertions without having to make actual requests to the server. +API tests are handled via `vitest` and `supertest` to initialize the Express server and run assertions without having to make actual requests to the server. An important aspect is that we have access to the Express `app` which allows for interesting assertions such as checking the state of the server, registering debug middleware and so on. -One example is `src/share/routes.spec.ts`. +One example is `src/share/routes.spec.ts`, or for the ETAPI in `apps/server/spec/etapi`. These integration tests are run alongside unit tests. ## End-to-end testing -* This tests both the client and the server, by running the server and then using Playwright to query the state of the page. -* These can be found in `/e2e`. \ No newline at end of file +See End-to-end tests. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Testing/End-to-end tests.md b/docs/Developer Guide/Developer Guide/Testing/End-to-end tests.md new file mode 100644 index 000000000..60060adae --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Testing/End-to-end tests.md @@ -0,0 +1,40 @@ +# End-to-end tests +**Server E2E:** + +* Tests the entire ETAPI. +* Tests WebSocket functionality + +**Desktop E2E:** + +* Playwright with Electron +* Tests some basic functionality such as creating a new document. + +These can be found in `apps/server-e2e` and `apps/desktop/e2e`. + +## First-time run + +Before starting Playwright, it has to be installed locally via: + +``` +pnpm playwright install +``` + +## Starting the integration test server + +Simply run `pnpm e2e` in one of the e2e projects. + +The integration server doesn't have authentication enabled to avoid login issues. + +## Starting the interactive test runner + +After starting the integration test server, to run the Playwright UI, run in the terminal: + +``` +pnpm playwright test --ui +``` + +It is also possible to run the interactive code generator instead: + +``` +pnpm playwright codegen +``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Special notes.md b/docs/Developer Guide/Developer Guide/Testing/Integration testing.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Special notes.md rename to docs/Developer Guide/Developer Guide/Testing/Integration testing.md diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Test database.md b/docs/Developer Guide/Developer Guide/Testing/Test database.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Old documentation/Testing/Integration testing/Test database.md rename to docs/Developer Guide/Developer Guide/Testing/Test database.md diff --git a/docs/Developer Guide/Developer Guide/Testing/Unit tests.md b/docs/Developer Guide/Developer Guide/Testing/Unit tests.md new file mode 100644 index 000000000..a009b8d92 --- /dev/null +++ b/docs/Developer Guide/Developer Guide/Testing/Unit tests.md @@ -0,0 +1,7 @@ +# Unit tests +At project level: + +* `pnpm server:test` +* `pnpm client:test` + +Unit tests are stored in the same directory as the source code being tested, with the `.spec.ts` suffix. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Old documentation/Troubleshooting/Error [TransformError] The pac.md b/docs/Developer Guide/Developer Guide/Troubleshooting/Error [TransformError] The pac.md similarity index 99% rename from docs/Developer Guide/Developer Guide/Old documentation/Troubleshooting/Error [TransformError] The pac.md rename to docs/Developer Guide/Developer Guide/Troubleshooting/Error [TransformError] The pac.md index 8a93a52be..82a5d93a8 100644 --- a/docs/Developer Guide/Developer Guide/Old documentation/Troubleshooting/Error [TransformError] The pac.md +++ b/docs/Developer Guide/Developer Guide/Troubleshooting/Error [TransformError] The pac.md @@ -36,5 +36,5 @@ The solution is to remove `node_modules` and reinstall all dependencies: ``` rm -r node_modules -npm install +pnpm install ``` \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md b/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md index af8d7c70a..a048e3b4e 100644 --- a/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md +++ b/docs/Developer Guide/Developer Guide/Troubleshooting/better-sqlite3 was compiled ag.md @@ -1,6 +1,6 @@ # better-sqlite3 was compiled against a different Node.js version This generally can happen when running the development version of either the `desktop` or `server`, but it should not happen as often as it used to. The reason is that `better-sqlite3` is a native dependency and has different builds for either the system's Node.js (as used by the `server`), or Electron's one (as used by the `desktop`). -To solve this, go to `apps/server` and run `pnpm rebuild`. For Electron this step is not necessary as it's already handled by the `rebuild-deps` NX target. +To solve this, go to `apps/server` and run `pnpm rebuild`. For Electron (`desktop`) this step generally not necessary, however `pnpm postinstall` should solve it. If you can reproduce this issue consistently, please open a bug report. \ No newline at end of file diff --git a/docs/README-ZH_CN.md b/docs/README-ZH_CN.md index 5ce69c1a8..48c6a5269 100644 --- a/docs/README-ZH_CN.md +++ b/docs/README-ZH_CN.md @@ -30,12 +30,11 @@ Trilium Notes 是一款免费且开源、跨平台的阶层式笔记应用程序 Trilium Screenshot -## ⏬ Download -- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – - stable version, recommended for most users. -- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – - unstable development version, updated daily with the latest features and - fixes. +## ⏬ 下载 +- [最新版本](https://github.com/TriliumNext/Trilium/releases/latest) – + 稳定版本,推荐给大多数用户。 +- [每日构建](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + 不稳定开发版本,每日更新,包含最新功能与修复。 ## 📖 文件 @@ -43,23 +42,18 @@ Trilium Notes 是一款免费且开源、跨平台的阶层式笔记应用程序 我们的文档有多种格式可供使用: - **在线文档**:请访问我们完整的文档:[docs.triliumnotes.org](https://docs.triliumnotes.org/) -- **In-App Help**: Press `F1` within Trilium to access the same documentation - directly in the application -- **GitHub**: Navigate through the [User - Guide](./docs/User%20Guide/User%20Guide/) in this repository +- **应用内帮助**:在 Trilium 中按下`F1`即可直接在应用程序内访问相同文档 +- **GitHub**:浏览此存储库中的[用户指南](./docs/User%20Guide/User%20Guide/) -### Quick Links -- [Getting Started Guide](https://docs.triliumnotes.org/) -- [Installation - Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +### 快速链接 +- [用户说明](https://docs.triliumnotes.org/) +- [安装说明](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) - [Docker - Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) -- [Upgrading + 设置](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [升级 TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) -- [Basic Concepts and - Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) -- [Patterns of Personal Knowledge - Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) +- [基本概念与特性](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [个人知识库模式](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) ## 🎁 功能 @@ -106,9 +100,8 @@ Trilium Notes 是一款免费且开源、跨平台的阶层式笔记应用程序 ## ⚠️ 为什么是 TriliumNext? -The original Trilium developer ([Zadam](https://github.com/zadam)) has -graciously given the Trilium repository to the community project which resides -at https://github.com/TriliumNext +Trilium 的原始开发者([Zadam](https://github.com/zadam))已慷慨地将 Trilium +代码库移交至社区项目,该项目现托管于:https://github.com/TriliumNext ### ⬆️ 从 Trilium 迁移? @@ -141,8 +134,7 @@ TriliumNext 版本已提升同步版本号(与上述不再兼容)。 如果你的发行版如下表所列,请使用该发行版的套件。 -[![Packaging -status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) +[![打包状态](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) 你也可以从[最新释出页面](https://github.com/TriliumNext/Trilium/releases/latest)下载对应平台的二进制文件,解压缩后执行 `trilium` 可执行文件。 @@ -159,8 +151,7 @@ TriliumNext 也提供 Flatpak,惟尚未发布到 FlatHub。 若要在行动装置上使用 TriliumNext,你可以透过移动查看器存取服务器安装的移动版接口(见下)。 -See issue https://github.com/TriliumNext/Trilium/issues/4962 for more -information on mobile app support. +有关移动应用支持的更多信息,请参阅问题 https://github.com/TriliumNext/Trilium/issues/4962。 如果你偏好原生 Android 应用,可使用 [TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid)。回报问题或缺少的功能,请至[其储存库](https://github.com/FliegendeWurst/TriliumDroid)。 @@ -181,8 +172,7 @@ Trilium。 以下是目前的语言覆盖状态: -[![Translation -status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) +[![翻译状态](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) ### 程序代码 @@ -215,57 +205,39 @@ pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 更多细节请参见[开发文件](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide)。 -### Developer Documentation +### 开发者文档 -Please view the [documentation -guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) -for details. If you have more questions, feel free to reach out via the links -described in the "Discuss with us" section above. +详情请参阅[文档指南](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md)。如有更多疑问,欢迎通过上方“联系我们”部分提供的链接与我们沟通。 ## 👏 鸣谢 -* [zadam](https://github.com/zadam) for the original concept and implementation - of the application. -* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the - application icon. -* [nriver](https://github.com/nriver) for his work on internationalization. -* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. -* [antoniotejada](https://github.com/nriver) for the original syntax highlight - widget. -* [Dosu](https://dosu.dev/) for providing us with the automated responses to - GitHub issues and discussions. -* [Tabler Icons](https://tabler.io/icons) for the system tray icons. +* [zadam](https://github.com/zadam) 对于应用程序的原始概念设计与实现。 +* [Sarah Hussein](https://github.com/Sarah-Hussein) 为应用程序设计图标。 +* [nriver](https://github.com/nriver) 对其在国际化工作中的贡献。 +* [Thomas Frei](https://github.com/thfrei) 因其在 Canvas 方面的原创工作。 +* [antoniotejada](https://github.com/nriver) 原始语法高亮小部件的作者。 +* [Dosu](https://dosu.dev/) 为我们提供 GitHub 问题和讨论的自动化回复。 +* [Tabler Icons](https://tabler.io/icons) 用于系统托盘图标。 -Trilium would not be possible without the technologies behind it: +若没有支撑其背后的技术,Trilium 项目便无法实现: -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind - text notes. We are grateful for being offered a set of the premium features. -* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with - support for huge amount of languages. -* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite - whiteboard used in Canvas notes. -* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the - mind map functionality. -* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical - maps. -* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive - table used in collections. -* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library - without real competition. -* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. - Used in [relation - maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link - maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) —— + 文本笔记背后的可视化编辑器。我们非常感谢能获得这套高级功能的使用权限。 +* [CodeMirror](https://github.com/codemirror/CodeMirror) —— 支持海量编程语言的代码编辑器。 +* [Excalidraw](https://github.com/excalidraw/excalidraw) —— 画布笔记中使用的无限白板。 +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) —— 提供思维导图功能。 +* [Leaflet](https://github.com/Leaflet/Leaflet) —— 用于渲染地理地图。 +* [Tabulator](https://github.com/olifolkerd/tabulator) —— 用于集合中的交互式表格。 +* [FancyTree](https://github.com/mar10/fancytree) —— 功能丰富的树形控件库,无可匹敌。 +* [jsPlumb](https://github.com/jsplumb/jsplumb) —— + 可视化连接库。用于[关系图](https://triliumnext.github.io/Docs/Wiki/relation-map.html)和[链接图](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) ## 🤝 支持我们 -Trilium is built and maintained with [hundreds of hours of -work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your -support keeps it open-source, improves features, and covers costs such as -hosting. +Trilium +的开发与维护凝聚了[数百小时的工作](https://github.com/TriliumNext/Trilium/graphs/commit-activity)。你的支持将确保其开源性质,推动功能改进,并覆盖托管等相关成本。 -Consider supporting the main developer -([eliandoran](https://github.com/eliandoran)) of the application via: +请考虑通过以下方式支持该应用程序的主要开发者([eliandoran](https://github.com/eliandoran)): - [GitHub Sponsors](https://github.com/sponsors/eliandoran) - [PayPal](https://paypal.me/eliandoran) diff --git a/docs/README-ZH_TW.md b/docs/README-ZH_TW.md index 2a323c02d..5862766d6 100644 --- a/docs/README-ZH_TW.md +++ b/docs/README-ZH_TW.md @@ -206,7 +206,7 @@ pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 ### 開發者文件 -請參閱[環境設定指南](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md)。若有更多疑問,歡迎透過上方「與我們交流」章節所列連結與我們聯繫。 +請參閱[文件指南](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md)。若有更多疑問,歡迎透過上方「與我們交流」章節所列連結與我們聯繫。 ## 👏 鳴謝 @@ -220,14 +220,14 @@ pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 若無其背後的技術支撐,Trilium 便無法開發完成: -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) —— 文字筆記背後的視覺化編輯器。我們衷心感謝獲贈這套進階功能套件。 * [CodeMirror](https://github.com/codemirror/CodeMirror) —— 支援大量語言的程式碼編輯器。 -* [Excalidraw](https://github.com/excalidraw/excalidraw) - 畫布筆記中使用的無限白板。 -* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - 提供心智圖功能。 -* [Leaflet](https://github.com/Leaflet/Leaflet) - 用於渲染地理地圖。 -* [Tabulator](https://github.com/olifolkerd/tabulator) - 用於集合中的互動式表格。 -* [FancyTree](https://github.com/mar10/fancytree) —— 功能非常豐富的樹狀元件,幾乎沒有對手。 +* [Excalidraw](https://github.com/excalidraw/excalidraw) —— 畫布筆記中使用的無限白板。 +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) —— 提供心智圖功能。 +* [Leaflet](https://github.com/Leaflet/Leaflet) —— 用於渲染地理地圖。 +* [Tabulator](https://github.com/olifolkerd/tabulator) —— 用於集合中的互動式表格。 +* [FancyTree](https://github.com/mar10/fancytree) —— 功能非常豐富的樹狀元件,無可匹敵。 * [jsPlumb](https://github.com/jsplumb/jsplumb) —— 視覺連線函式庫。用於[關聯圖](https://triliumnext.github.io/Docs/Wiki/relation-map.html)與[連結圖](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) diff --git a/docs/README-de.md b/docs/README-de.md index 505f3adea..10052c851 100644 --- a/docs/README-de.md +++ b/docs/README-de.md @@ -49,8 +49,8 @@ einen schnellen Überblick: Unsere Dokumentation ist verfügbar in mehreren Formaten: - **Online-Dokumentation**: Die vollständige Dokumentation finden man unter [docs.triliumnotes.org](https://docs.triliumnotes.org/) -- **In-App Help**: Press `F1` within Trilium to access the same documentation - directly in the application +- **In-App-Hilfe**: drücke `F1` in Trilium, um dieselbe Dokumentation direkt in + der Anwendung aufzurufen - **GitHub**: Durchsuche das [Benutzerhandbuch](./docs/User%20Guide/User%20Guide/) in diesem Repository @@ -68,173 +68,186 @@ Unsere Dokumentation ist verfügbar in mehreren Formaten: ## 🎁 Funktionen -* Notes can be arranged into arbitrarily deep tree. Single note can be placed - into multiple places in the tree (see - [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) -* Rich WYSIWYG note editor including e.g. tables, images and - [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown - [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) -* Support for editing [notes with source - code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax - highlighting -* Fast and easy [navigation between - notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text - search and [note - hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting) -* Seamless [note - versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions) -* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be - used for note organization, querying and advanced - [scripting](https://triliumnext.github.io/Docs/Wiki/scripts) -* UI available in English, German, Spanish, French, Romanian, and Chinese - (simplified and traditional) -* Direct [OpenID and TOTP - integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) - for more secure login -* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) - with self-hosted sync server - * there's a [3rd party service for hosting synchronisation - server](https://trilium.cc/paid-hosting) -* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes - to public internet -* Strong [note - encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with - per-note granularity -* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type - "canvas") -* [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and - [link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing - notes and their relations -* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/) -* [Geo maps](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) with - location pins and GPX tracks -* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced - showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) -* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation -* Scales well in both usability and performance upwards of 100 000 notes -* Touch optimized [mobile - frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for - smartphones and tablets -* Built-in [dark theme](https://triliumnext.github.io/Docs/Wiki/themes), support - for user themes -* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and - [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown) -* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy - saving of web content -* Customizable UI (sidebar buttons, user-defined widgets, ...) -* [Metrics](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), along - with a [Grafana - Dashboard](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) +* Notizen lassen sich in beliebig tiefe Baumstrukturen einordnen. Eine einzelne + Notiz kann an mehreren Stellen im Baum existieren (siehe + [Klonen](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Umfangreicher WYSIWYG-Editor für Notizen, z. B. mit Tabellen, Bildern und + [Mathematik](https://triliumnext.github.io/Docs/Wiki/text-notes) mit + Markdown-Autoformatierung +* Unterstützung für das Bearbeiten von [Notizen mit + Quellcode](https://triliumnext.github.io/Docs/Wiki/code-notes), inkl. + Syntaxhervorhebung +* Schnelle und einfache [Navigation zwischen + Notizen](https://triliumnext.github.io/Docs/Wiki/note-navigation), + Volltextsuche sowie + [Notizhervorhebung](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Nahtlose [Versionierung von + Notizen](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Notiz [Attribute](https://triliumnext.github.io/Docs/Wiki/attributes) können + zur Organisation von Notizen, für Abfragen und erweiterte + [Skripterstellung](https://triliumnext.github.io/Docs/Wiki/scripts) verwendet + werden +* Benutzeroberfläche verfügbar in Englisch, Deutsch, Spanisch, Französisch, + Rumänisch sowie Chinesisch (vereinfacht und traditionell) +* Direkte [OpenID- und + TOTP-Integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + für eine sicherere Anmeldung +* [Synchronisierung](https://triliumnext.github.io/Docs/Wiki/synchronization) + mit einem selbst gehosteten Synchronisierungsserver + * Es gibt einen [Drittanbieter-Dienst für das Hosten von + Synchronisationsservern](https://trilium.cc/paid-hosting) +* [Freigabe](https://triliumnext.github.io/Docs/Wiki/sharing) (Veröffentlichung) + von Notizen im öffentlichen Internet +* Starke + [Notizverschlüsselung](https://triliumnext.github.io/Docs/Wiki/protected-notes) + mit Granularität pro Notiz +* Skizzieren von Diagrammen basierend auf [Excalidraw](https://excalidraw.com/) + (Notiztyp „Canvas“) +* [Beziehungskarten](https://triliumnext.github.io/Docs/Wiki/relation-map) and + [Verknüpfungskarten](https://triliumnext.github.io/Docs/Wiki/link-map) zur + Visualisierung von Notizen und deren Beziehungen +* Mindmaps, basierend auf [Mind Elixir](https://docs.mind-elixir.com/) +* [Geokarten](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) mit + Standortmarkierungen und GPX-Tracks +* [Skripting](https://triliumnext.github.io/Docs/Wiki/scripts) – siehe + [Erweiterte + Showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST-API](https://triliumnext.github.io/Docs/Wiki/etapi) für die + Automatisierung +* Skalierbar in Bedienbarkeit und Performance — geeignet für über 100.000 + Notizen +* Touch-optimiertes [mobiles + Frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) für + Smartphones und Tablets +* Integriertes [dunkles Design](https://triliumnext.github.io/Docs/Wiki/themes), + Unterstützung für benutzerdefinierte Designs +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) und + [Markdown importieren und + exportieren](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) zum + einfachen Speichern von Webinhalten +* Anpassbare Benutzeroberfläche (Seitenleisten-Schaltflächen, benutzerdefinierte + Widgets, ...) +* [Metriken](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), + zusammen mit einem + [Grafana-Dashboard](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) -✨ Check out the following third-party resources/communities for more TriliumNext -related goodies: +✨ Weitere Informationen zu TriliumNext findet man in den folgenden +Ressourcen/Communities von Drittanbietern: -- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party - themes, scripts, plugins and more. -- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more. +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) bietet von + Drittanbietern erstellte Themes, Skripte, Plugins und vieles mehr. +- [TriliumRocks!](https://trilium.rocks/) für Tutorials, Anleitungen und vieles + mehr. -## ❓Why TriliumNext? +## ❓ Warum TriliumNext? -The original Trilium developer ([Zadam](https://github.com/zadam)) has -graciously given the Trilium repository to the community project which resides -at https://github.com/TriliumNext +Der ursprüngliche Entwickler von Trilium ([Zadam](https://github.com/zadam)) hat +das Trilium-Repository der Gemeinschaft übergeben, die nun unter +https://github.com/TriliumNext agiert ### Migration von Zadam/Trilium? -There are no special migration steps to migrate from a zadam/Trilium instance to -a TriliumNext/Trilium instance. Simply [install -TriliumNext/Trilium](#-installation) as usual and it will use your existing -database. +Es sind keine speziellen Migrationsschritte erforderlich, um von einer +zadam/Trilium-Instanz auf eine TriliumNext/Trilium-Instanz umzustellen. +[Installiere TriliumNext/Trilium](#-installation) einfach wie gewohnt, und die +vorhandene Datenbank wird verwendet. -Versions up to and including -[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) are -compatible with the latest zadam/trilium version of -[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later -versions of TriliumNext/Trilium have their sync versions incremented which -prevents direct migration. +Versionen bis einschließlich +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) sind +kompatibel mit der letzten zadam/trilium-Version +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Alle späteren +Versionen von TriliumNext/Trilium haben ihre Sync-Versionen erhöht, was eine +direkte Migration verhindert. -## 💬 Discuss with us +## 💬 Diskussion mit uns -Feel free to join our official conversations. We would love to hear what -features, suggestions, or issues you may have! +Nehme gerne an den offiziellen Diskussionen teil. Feedback, Funktionsvorschläge +oder Problemberichte sind jederzeit willkommen! -- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous - discussions.) - - The `General` Matrix room is also bridged to - [XMPP](xmpp:discuss@trilium.thisgreat.party?join) -- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For - asynchronous discussions.) -- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug - reports and feature requests.) +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (für + Echtzeit-Diskussionen.) + - Der `allgemeine` Matrix-Raum ist zusätzlich mit + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) verbunden +- [Github Diskussionen](https://github.com/TriliumNext/Trilium/discussions) (für + asynchrone Diskussionen) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (für + Fehlerberichte und Funktionsanfragen) ## 🏗 Installation ### Windows / MacOS -Download the binary release for your platform from the [latest release -page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package -and run the `trilium` executable. +Lade die Binärversion für deine Plattform von der Seite mit der [neuesten +Version](https://github.com/TriliumNext/Trilium/releases/latest) herunter, +entpacke das Paket und führe die ausführbare Datei `trilium` aus. ### Linux -If your distribution is listed in the table below, use your distribution's -package. +Wenn deine Distribution in der folgenden Tabelle aufgeführt ist, verwende das +Paket deiner Distribution. -[![Packaging -status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) +[![Paketierungsstatus](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) -You may also download the binary release for your platform from the [latest -release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the -package and run the `trilium` executable. +Du kannst auch die Binärversion für deine Plattform von der Seite mit der +[neuesten Version](https://github.com/TriliumNext/Trilium/releases/latest) +herunterladen, das Paket entpacken und die ausführbare Datei `trilium` +ausführen. -TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. +TriliumNext ist auch als Flatpak verfügbar, jedoch noch nicht auf Flathub +veröffentlicht. -### Browser (any OS) +### Browser (beliebiges Betriebssystem) -If you use a server installation (see below), you can directly access the web -interface (which is almost identical to the desktop app). +Bei Verwendung einer Server-Installation (siehe unten) kann direkt auf die +Weboberfläche zugegriffen werden. (die nahezu identisch mit der +Desktop-Anwendung ist). -Currently only the latest versions of Chrome & Firefox are supported (and -tested). +Derzeit werden ausschließlich die neuesten Versionen von Chrome und Firefox +unterstützt (und getestet). -### Mobile +### Mobilgeräte -To use TriliumNext on a mobile device, you can use a mobile web browser to -access the mobile interface of a server installation (see below). +Um TriliumNext auf einem mobilen Gerät zu verwenden, kann ein mobiler Webbrowser +genutzt werden, um die mobile Oberfläche einer Server-Installation (siehe unten) +aufzurufen. -See issue https://github.com/TriliumNext/Trilium/issues/4962 for more -information on mobile app support. +Weitere Informationen zur Unterstützung mobiler Apps findest du unter +https://github.com/TriliumNext/Trilium/issues/4962. -If you prefer a native Android app, you can use -[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). -Report bugs and missing features at [their -repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to -disable automatic updates on your server installation (see below) when using -TriliumDroid since the sync version must match between Trilium and TriliumDroid. +Wenn du eine native Android-App bevorzugst, kannst du +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid) +verwenden. Melde Fehler und fehlende Funktionen unter [ihrem +Repository](https://github.com/FliegendeWurst/TriliumDroid). Hinweis: Bei +Verwendung von TriliumDroid solltest du die automatischen Updates auf deinem +Server deaktivieren (siehe unten), da die Synchronisierungsversion zwischen +Trilium und TriliumDroid übereinstimmen muss. ### Server -To install TriliumNext on your own server (including via Docker from -[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server -installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). +Um TriliumNext auf deinen eigenen Server zu installieren (einschließlich über +Docker von [Dockerhub](https://hub.docker.com/r/triliumnext/trilium)), befolge +[die +Server-Installationsanweisungen](https://triliumnext.github.io/Docs/Wiki/server-installation). -## 💻 Contribute +## 💻 Mitwirken -### Translations +### Übersetzungen -If you are a native speaker, help us translate Trilium by heading over to our -[Weblate page](https://hosted.weblate.org/engage/trilium/). +Wenn du Trilium in einer weiteren Sprache unterstützen möchtest, kannst du über +unsere [Weblate-Seite](https://hosted.weblate.org/engage/trilium/) an den +Übersetzungen mitwirken. -Here's the language coverage we have so far: +Hier ist die bisherige Sprachabdeckung: [![Status der Übersetzung](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) ### Code -Download the repository, install dependencies using `pnpm` and then run the -server (available at http://localhost:8080): +Lade das Repository herunter, die Abhängigkeiten mit `pnpm` installieren und +anschließend den Server starten (verfügbar unter http://localhost:8080): ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -242,10 +255,11 @@ pnpm install pnpm run server:start ``` -### Documentation +### Dokumentation -Download the repository, install dependencies using `pnpm` and then run the -environment required to edit the documentation: +Das Repository herunterladen, die Abhängigkeiten mit `pnpm` installieren und +anschließend die Umgebung starten, die zum Bearbeiten der Dokumentation benötigt +wird: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -253,9 +267,9 @@ pnpm install pnpm edit-docs:edit-docs ``` -### Building the Executable -Download the repository, install dependencies using `pnpm` and then build the -desktop app for Windows: +### Erstellung der ausführbaren Datei +Das Repository herunterladen, die Abhängigkeiten mit `pnpm` installieren und +anschließend die Desktop-Anwendung für Windows erstellen: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -263,70 +277,75 @@ pnpm install pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 ``` -For more details, see the [development -docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). +Weitere Informationen finden sich in der +[Entwicklerdokumentation](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). -### Developer Documentation +### Entwicklerdokumentation -Please view the [documentation -guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) -for details. If you have more questions, feel free to reach out via the links -described in the "Discuss with us" section above. +Die +[Dokumentationsanleitung](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +enthält weitere Details. Bei offenen Fragen kann über die im Abschnitt +„Diskussion mit uns“ genannten Kommunikationskanäle Kontakt aufgenommen werden. -## 👏 Shoutouts +## 👏 Dankeschön -* [zadam](https://github.com/zadam) for the original concept and implementation - of the application. -* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the - application icon. -* [nriver](https://github.com/nriver) for his work on internationalization. -* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. -* [antoniotejada](https://github.com/nriver) for the original syntax highlight - widget. -* [Dosu](https://dosu.dev/) for providing us with the automated responses to - GitHub issues and discussions. -* [Tabler Icons](https://tabler.io/icons) for the system tray icons. +* [zadam](https://github.com/zadam) für das ursprüngliche Konzept und die + Implementierung der Anwendung. +* [Sarah Hussein](https://github.com/Sarah-Hussein) für die Gestaltung des + Anwendungssymbols. +* [nriver](https://github.com/nriver) für seine Arbeit zur + Internationalisierung. +* [Thomas Frei](https://github.com/thfrei) für seine ursprüngliche Arbeit an + Canvas. +* [antoniotejada](https://github.com/nriver) für das ursprüngliche + Syntax-Highlighting-Widget. +* [Dosu](https://dosu.dev/) für die Bereitstellung automatisierter Antworten auf + GitHub-Issues und Diskussionen. +* [Tabler-Icons](https://tabler.io/icons) für die Symbole in der Taskleiste. -Trilium would not be possible without the technologies behind it: +Trilium wäre ohne die zugrundeliegenden Technologien nicht möglich: -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind - text notes. We are grateful for being offered a set of the premium features. -* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with - support for huge amount of languages. -* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite - whiteboard used in Canvas notes. -* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the - mind map functionality. -* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical - maps. -* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive - table used in collections. -* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library - without real competition. -* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. - Used in [relation - maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link - maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) – der visuelle Editor + hinter Textnotizen. Wir sind dankbar dafür, dass uns eine Reihe von + Premium-Funktionen zur Verfügung gestellt werden. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - Code-Editor mit + Unterstützung für eine Vielzahl von Sprachen. +* [Excalidraw](https://github.com/excalidraw/excalidraw) – das unendliche + Whiteboard, verwendet in Canvas-Notizen. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) – bietet die + Mindmap-Funktionalität. +* [Leaflet](https://github.com/Leaflet/Leaflet) – für die Darstellung + geografischen Karten. +* [Tabulator](https://github.com/olifolkerd/tabulator) - für die interaktive + Tabelle in Kollektionen. +* [FancyTree](https://github.com/mar10/fancytree) – funktionsreiche + Baum-Bibliothek ohne echte Konkurrenz. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visuelle + Verbindungsbibliothek. Verwendet in + [Beziehungskarten](https://triliumnext.github.io/Docs/Wiki/relation-map.html) + und + [Verbindungskarten](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) -## 🤝 Support +## 🤝 Unterstützung -Trilium is built and maintained with [hundreds of hours of -work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your -support keeps it open-source, improves features, and covers costs such as -hosting. +Trilium wurde mit [Hunderten von +Arbeitsstunden](https://github.com/TriliumNext/Trilium/graphs/commit-activity) +entwickelt und wird auch so weitergeführt. Deine Unterstützung sorgt dafür, dass +es Open Source bleibt, verbessert die Funktionen und deckt Kosten wie das +Hosting. -Consider supporting the main developer -([eliandoran](https://github.com/eliandoran)) of the application via: +Bitte unterstütze den Hauptentwickler +([eliandoran](https://github.com/eliandoran)) der Anwendung über: - [GitHub Unterstützer](https://github.com/sponsors/eliandoran) - [PayPal](https://paypal.me/eliandoran) -- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) +- [Kauf mir einen Kaffee](https://buymeacoffee.com/eliandoran) ## 🔑 Lizenz Copyright 2017-2025 zadam, Elian Doran, und andere Unterstützer -This program is free software: you can redistribute it and/or modify it under -the terms of the GNU Affero General Public License as published by the Free -Software Foundation, either version 3 of the License, or (at your option) any -later version. +Dieses Programm ist freie Software: Sie können es unter den Bedingungen der GNU +Affero General Public License, wie von der Free Software Foundation +veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 der +Lizenz oder (nach Ihrer Wahl) jeder späteren Version. diff --git a/docs/README-es.md b/docs/README-es.md index b345940a7..4b2492168 100644 --- a/docs/README-es.md +++ b/docs/README-es.md @@ -36,12 +36,12 @@ resumen rápido: Trilium Screenshot -## ⏬ Download +## ⏬ Descargar - [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – - stable version, recommended for most users. -- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – - unstable development version, updated daily with the latest features and - fixes. + versión estable, recomendada para la mayoría de los usuarios. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly): + versión de desarrollo inestable, actualizada diariamente con las últimas + funciones y correcciones. ## 📚 Documentación diff --git a/docs/README-hi.md b/docs/README-hi.md new file mode 100644 index 000000000..e3afddd5f --- /dev/null +++ b/docs/README-hi.md @@ -0,0 +1,332 @@ +
+ Special thanks to:
+ + Warp sponsorship
+ Warp, built for coding with multiple AI agents
+
+ Available for macOS, Linux and Windows +
+ +
+ +# ट्रिलियम नोट्स + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +Trilium Notes is a free and open-source, cross-platform hierarchical note taking +application with focus on building large personal knowledge bases. + +See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for +quick overview: + +Trilium Screenshot + +## ⏬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## 📚 Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Upgrading + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Basic Concepts and + Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Patterns of Personal Knowledge + Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## 🎁 Features + +* Notes can be arranged into arbitrarily deep tree. Single note can be placed + into multiple places in the tree (see + [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Rich WYSIWYG note editor including e.g. tables, images and + [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown + [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Support for editing [notes with source + code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax + highlighting +* Fast and easy [navigation between + notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text + search and [note + hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Seamless [note + versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be + used for note organization, querying and advanced + [scripting](https://triliumnext.github.io/Docs/Wiki/scripts) +* UI available in English, German, Spanish, French, Romanian, and Chinese + (simplified and traditional) +* Direct [OpenID and TOTP + integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + for more secure login +* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) + with self-hosted sync server + * there's a [3rd party service for hosting synchronisation + server](https://trilium.cc/paid-hosting) +* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes + to public internet +* Strong [note + encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with + per-note granularity +* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type + "canvas") +* [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and + [link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing + notes and their relations +* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/) +* [Geo maps](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) with + location pins and GPX tracks +* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced + showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation +* Scales well in both usability and performance upwards of 100 000 notes +* Touch optimized [mobile + frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for + smartphones and tablets +* Built-in [dark theme](https://triliumnext.github.io/Docs/Wiki/themes), support + for user themes +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and + [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy + saving of web content +* Customizable UI (sidebar buttons, user-defined widgets, ...) +* [Metrics](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), along + with a [Grafana + Dashboard](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ Check out the following third-party resources/communities for more TriliumNext +related goodies: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party + themes, scripts, plugins and more. +- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more. + +## ❓Why TriliumNext? + +The original Trilium developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ⬆️Migrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) are +compatible with the latest zadam/trilium version of +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later +versions of TriliumNext/Trilium have their sync versions incremented which +prevents direct migration. + +## 💬 Discuss with us + +Feel free to join our official conversations. We would love to hear what +features, suggestions, or issues you may have! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous + discussions.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## 🏗 Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +You may also download the binary release for your platform from the [latest +release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the +package and run the `trilium` executable. + +TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. + +### Browser (any OS) + +If you use a server installation (see below), you can directly access the web +interface (which is almost identical to the desktop app). + +Currently only the latest versions of Chrome & Firefox are supported (and +tested). + +### Mobile + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## 💻 Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### Code + +Download the repository, install dependencies using `pnpm` and then run the +server (available at http://localhost:8080): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Documentation + +Download the repository, install dependencies using `pnpm` and then run the +environment required to edit the documentation: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### Building the Executable +Download the repository, install dependencies using `pnpm` and then build the +desktop app for Windows: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +for details. If you have more questions, feel free to reach out via the links +described in the "Discuss with us" section above. + +## 👏 Shoutouts + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + Used in [relation + maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link + maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + +## 🤝 Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## 🔑 License + +Copyright 2017-2025 zadam, Elian Doran, and other contributors + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) any +later version. diff --git a/docs/README-mr.md b/docs/README-mr.md new file mode 100644 index 000000000..bba139cc9 --- /dev/null +++ b/docs/README-mr.md @@ -0,0 +1,332 @@ +
+ Special thanks to:
+ + Warp sponsorship
+ Warp, built for coding with multiple AI agents
+
+ Available for macOS, Linux and Windows +
+ +
+ +# Trilium Notes + +![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) +![GitHub Downloads (all assets, all +releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ +[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) +[![Translation +status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) + +[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | +[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) +| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | +[Spanish](./docs/README-es.md) + +Trilium Notes is a free and open-source, cross-platform hierarchical note taking +application with focus on building large personal knowledge bases. + +See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for +quick overview: + +Trilium Screenshot + +## ⏬ Download +- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – + stable version, recommended for most users. +- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + unstable development version, updated daily with the latest features and + fixes. + +## 📚 Documentation + +**Visit our comprehensive documentation at +[docs.triliumnotes.org](https://docs.triliumnotes.org/)** + +Our documentation is available in multiple formats: +- **Online Documentation**: Browse the full documentation at + [docs.triliumnotes.org](https://docs.triliumnotes.org/) +- **In-App Help**: Press `F1` within Trilium to access the same documentation + directly in the application +- **GitHub**: Navigate through the [User + Guide](./docs/User%20Guide/User%20Guide/) in this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation + Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Docker + Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Upgrading + TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [Basic Concepts and + Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Patterns of Personal Knowledge + Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) + +## 🎁 Features + +* Notes can be arranged into arbitrarily deep tree. Single note can be placed + into multiple places in the tree (see + [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* Rich WYSIWYG note editor including e.g. tables, images and + [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown + [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) +* Support for editing [notes with source + code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax + highlighting +* Fast and easy [navigation between + notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text + search and [note + hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting) +* Seamless [note + versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions) +* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be + used for note organization, querying and advanced + [scripting](https://triliumnext.github.io/Docs/Wiki/scripts) +* UI available in English, German, Spanish, French, Romanian, and Chinese + (simplified and traditional) +* Direct [OpenID and TOTP + integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) + for more secure login +* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization) + with self-hosted sync server + * there's a [3rd party service for hosting synchronisation + server](https://trilium.cc/paid-hosting) +* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes + to public internet +* Strong [note + encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with + per-note granularity +* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type + "canvas") +* [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and + [link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing + notes and their relations +* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/) +* [Geo maps](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) with + location pins and GPX tracks +* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced + showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases) +* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation +* Scales well in both usability and performance upwards of 100 000 notes +* Touch optimized [mobile + frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for + smartphones and tablets +* Built-in [dark theme](https://triliumnext.github.io/Docs/Wiki/themes), support + for user themes +* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and + [Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown) +* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy + saving of web content +* Customizable UI (sidebar buttons, user-defined widgets, ...) +* [Metrics](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), along + with a [Grafana + Dashboard](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json) + +✨ Check out the following third-party resources/communities for more TriliumNext +related goodies: + +- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party + themes, scripts, plugins and more. +- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more. + +## ❓Why TriliumNext? + +The original Trilium developer ([Zadam](https://github.com/zadam)) has +graciously given the Trilium repository to the community project which resides +at https://github.com/TriliumNext + +### ⬆️Migrating from Zadam/Trilium? + +There are no special migration steps to migrate from a zadam/Trilium instance to +a TriliumNext/Trilium instance. Simply [install +TriliumNext/Trilium](#-installation) as usual and it will use your existing +database. + +Versions up to and including +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) are +compatible with the latest zadam/trilium version of +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later +versions of TriliumNext/Trilium have their sync versions incremented which +prevents direct migration. + +## 💬 Discuss with us + +Feel free to join our official conversations. We would love to hear what +features, suggestions, or issues you may have! + +- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous + discussions.) + - The `General` Matrix room is also bridged to + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) +- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For + asynchronous discussions.) +- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug + reports and feature requests.) + +## 🏗 Installation + +### Windows / MacOS + +Download the binary release for your platform from the [latest release +page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package +and run the `trilium` executable. + +### Linux + +If your distribution is listed in the table below, use your distribution's +package. + +[![Packaging +status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) + +You may also download the binary release for your platform from the [latest +release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the +package and run the `trilium` executable. + +TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. + +### Browser (any OS) + +If you use a server installation (see below), you can directly access the web +interface (which is almost identical to the desktop app). + +Currently only the latest versions of Chrome & Firefox are supported (and +tested). + +### Mobile + +To use TriliumNext on a mobile device, you can use a mobile web browser to +access the mobile interface of a server installation (see below). + +See issue https://github.com/TriliumNext/Trilium/issues/4962 for more +information on mobile app support. + +If you prefer a native Android app, you can use +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid). +Report bugs and missing features at [their +repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to +disable automatic updates on your server installation (see below) when using +TriliumDroid since the sync version must match between Trilium and TriliumDroid. + +### Server + +To install TriliumNext on your own server (including via Docker from +[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server +installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). + + +## 💻 Contribute + +### Translations + +If you are a native speaker, help us translate Trilium by heading over to our +[Weblate page](https://hosted.weblate.org/engage/trilium/). + +Here's the language coverage we have so far: + +[![Translation +status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) + +### Code + +Download the repository, install dependencies using `pnpm` and then run the +server (available at http://localhost:8080): +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run server:start +``` + +### Documentation + +Download the repository, install dependencies using `pnpm` and then run the +environment required to edit the documentation: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm edit-docs:edit-docs +``` + +### Building the Executable +Download the repository, install dependencies using `pnpm` and then build the +desktop app for Windows: +```shell +git clone https://github.com/TriliumNext/Trilium.git +cd Trilium +pnpm install +pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 +``` + +For more details, see the [development +docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). + +### Developer Documentation + +Please view the [documentation +guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +for details. If you have more questions, feel free to reach out via the links +described in the "Discuss with us" section above. + +## 👏 Shoutouts + +* [zadam](https://github.com/zadam) for the original concept and implementation + of the application. +* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the + application icon. +* [nriver](https://github.com/nriver) for his work on internationalization. +* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. +* [antoniotejada](https://github.com/nriver) for the original syntax highlight + widget. +* [Dosu](https://dosu.dev/) for providing us with the automated responses to + GitHub issues and discussions. +* [Tabler Icons](https://tabler.io/icons) for the system tray icons. + +Trilium would not be possible without the technologies behind it: + +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind + text notes. We are grateful for being offered a set of the premium features. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with + support for huge amount of languages. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite + whiteboard used in Canvas notes. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the + mind map functionality. +* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical + maps. +* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive + table used in collections. +* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library + without real competition. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. + Used in [relation + maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link + maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) + +## 🤝 Support + +Trilium is built and maintained with [hundreds of hours of +work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your +support keeps it open-source, improves features, and covers costs such as +hosting. + +Consider supporting the main developer +([eliandoran](https://github.com/eliandoran)) of the application via: + +- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [PayPal](https://paypal.me/eliandoran) +- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) + +## 🔑 License + +Copyright 2017-2025 zadam, Elian Doran, and other contributors + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) any +later version. diff --git a/docs/README-pt.md b/docs/README-pt.md index bba139cc9..f1f35ec64 100644 --- a/docs/README-pt.md +++ b/docs/README-pt.md @@ -25,27 +25,28 @@ status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted | [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | [Spanish](./docs/README-es.md) -Trilium Notes is a free and open-source, cross-platform hierarchical note taking -application with focus on building large personal knowledge bases. +Trilium Notes é uma aplicação gratuita e de código aberto, multiplataforma, para +a criação hierárquica de notas, com foco na construção de grandes bases de +conhecimento pessoais. See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for quick overview: Trilium Screenshot -## ⏬ Download +## ⏬ Transferir - [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – stable version, recommended for most users. - [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – unstable development version, updated daily with the latest features and fixes. -## 📚 Documentation +## 📚 Documentação **Visit our comprehensive documentation at [docs.triliumnotes.org](https://docs.triliumnotes.org/)** -Our documentation is available in multiple formats: +A nossa documentação está disponível em múltiplos formatos: - **Online Documentation**: Browse the full documentation at [docs.triliumnotes.org](https://docs.triliumnotes.org/) - **In-App Help**: Press `F1` within Trilium to access the same documentation @@ -53,7 +54,7 @@ Our documentation is available in multiple formats: - **GitHub**: Navigate through the [User Guide](./docs/User%20Guide/User%20Guide/) in this repository -### Quick Links +### Links rápidos - [Getting Started Guide](https://docs.triliumnotes.org/) - [Installation Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) diff --git a/docs/README-ru.md b/docs/README-ru.md index d7d5af43f..cfe5bb9bf 100644 --- a/docs/README-ru.md +++ b/docs/README-ru.md @@ -11,19 +11,19 @@ # Trilium Notes -![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) -![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ -![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium) -![GitHub Downloads (all assets, all +![Спонсоры GitHub](https://img.shields.io/github/sponsors/eliandoran) ![Меценаты +LiberaPay ](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Загрузок Docker](https://img.shields.io/docker/pulls/triliumnext/trilium) +![Загрузок GitHub (all assets, all releases)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\ [![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp) -[![Translation -status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) +[![Процесс +перевода](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) -[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | -[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) -| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | -[Spanish](./docs/README-es.md) +[Английский](./README.md) | [Китайский (Упрощенный)](./docs/README-ZH_CN.md) | +[Китайский (Традиционный)](./docs/README-ZH_TW.md) | +[Русский](./docs/README-ru.md) | [Японский](./docs/README-ja.md) | +[Итальянский](./docs/README-it.md) | [Испанский](./docs/README-es.md) Trilium Notes – это приложение для заметок с иерархической структурой, ориентированное на создание больших персональных баз знаний. @@ -33,38 +33,38 @@ Trilium Notes – это приложение для заметок с иера Trilium Screenshot -## ⏬ Download -- [Latest release](https://github.com/TriliumNext/Trilium/releases/latest) – - stable version, recommended for most users. -- [Nightly build](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – - unstable development version, updated daily with the latest features and - fixes. +## ⏬ Загрузка +- [Последний релиз](https://github.com/TriliumNext/Trilium/releases/latest) – + стабильная версия, подойдёт для большинства пользователей. +- [Ночной билд](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + нестабильная разрабатываемая версия, ежедневно получает новые функции и + исправления. ## 📚 Документация -**Visit our comprehensive documentation at +**Полная документация по адресу [docs.triliumnotes.org](https://docs.triliumnotes.org/)** -Our documentation is available in multiple formats: -- **Online Documentation**: Browse the full documentation at +Документация доступна в нескольких форматах: +- **Онлайн Документация**: Полная документация доступна по адресу: [docs.triliumnotes.org](https://docs.triliumnotes.org/) -- **In-App Help**: Press `F1` within Trilium to access the same documentation - directly in the application +- **Справка в приложении**: Нажмите`F1` в Trilium для доступа к этой + документации прямо в приложении - **GitHub**: Navigate through the [User Guide](./docs/User%20Guide/User%20Guide/) in this repository -### Quick Links -- [Getting Started Guide](https://docs.triliumnotes.org/) -- [Installation - Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) -- [Docker - Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) -- [Upgrading +### Важные Ссылки +- [Руководство по началу работы](https://docs.triliumnotes.org/) +- [Инструкция по + установке](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [Установка + Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [Обновление TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) -- [Basic Concepts and - Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) -- [Patterns of Personal Knowledge - Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) +- [Основные идеи и + возможности](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [Шаблоны Персональный Базы + Знаний](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) ## 🎁 Возможности @@ -88,11 +88,11 @@ Our documentation is available in multiple formats: * Специальные [атрибуты](https://triliumnext.github.io/Docs/Wiki/attributes) позволяют гибко организовать структуру, используются для поиска и продвинутого [скриптинга](https://triliumnext.github.io/Docs/Wiki/scripts) -* UI available in English, German, Spanish, French, Romanian, and Chinese - (simplified and traditional) -* Direct [OpenID and TOTP +* Интерфейс доступен на Английском, Немецком, Испанском, Французском, Румынском + и Китайском (упрощённом и традиционном) +* Интеграция [OpenID and TOTP integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md) - for more secure login + для более безопасного входа * [Синхронизация](https://triliumnext.github.io/Docs/Wiki/synchronization) заметок со своим сервером * there's a [3rd party service for hosting synchronisation @@ -223,20 +223,20 @@ installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation). ## 💻 Участвуйте в разработке -### Translations +### Переводы -If you are a native speaker, help us translate Trilium by heading over to our -[Weblate page](https://hosted.weblate.org/engage/trilium/). +Если вы являетесь носителем языка, помогите нам перевести Trilium, перейдя на +нашу [страницу Weblate](https://hosted.weblate.org/engage/trilium/). -Here's the language coverage we have so far: +Что сделано на данный момент: -[![Translation -status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) +[![Статус +перевода](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) -### Code +### Код -Download the repository, install dependencies using `pnpm` and then run the -server (available at http://localhost:8080): +Скачайте репозиторий, установите зависимости с помощью `pnpm`, затем запустите +сервер (доступен по адресу http://localhost:8080): ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -244,10 +244,10 @@ pnpm install pnpm run server:start ``` -### Documentation +### Документация -Download the repository, install dependencies using `pnpm` and then run the -environment required to edit the documentation: +Скачайте репозиторий, установите зависимости с помощью `pnpm`, затем запустите +окружение, необходимое для редактирование документации: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -255,9 +255,9 @@ pnpm install pnpm edit-docs:edit-docs ``` -### Building the Executable -Download the repository, install dependencies using `pnpm` and then build the -desktop app for Windows: +### Сборка исполняемого файла +Скачайте репозиторий, установите зависимости с помощью `pnpm`, затем соберите +приложение для Windows: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -265,10 +265,10 @@ pnpm install pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32 ``` -For more details, see the [development -docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). +Для получения подробностей, смотрите [документы +разработки](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). -### Developer Documentation +### Документация для разработчиков Please view the [documentation guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) @@ -277,48 +277,49 @@ described in the "Discuss with us" section above. ## 👏 Благодарности -* [zadam](https://github.com/zadam) for the original concept and implementation - of the application. -* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the - application icon. -* [nriver](https://github.com/nriver) for his work on internationalization. +* [zadam](https://github.com/zadam) за оригинальный концепт и реализацию + приложения. +* [Sarah Hussein](https://github.com/Sarah-Hussein) за создание иконки + приложения. +* [nriver](https://github.com/nriver) за работу по интернационализации. * [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas. -* [antoniotejada](https://github.com/nriver) for the original syntax highlight - widget. -* [Dosu](https://dosu.dev/) for providing us with the automated responses to - GitHub issues and discussions. -* [Tabler Icons](https://tabler.io/icons) for the system tray icons. +* [antoniotejada](https://github.com/nriver) за оригинальный виджет подсветки + синтаксиса. +* [Dosu](https://dosu.dev/) за обеспечение автоматических ответов на вопросы и + обсуждения GitHub. +* [Tabler Icons](https://tabler.io/icons) за системные иконки. -Trilium would not be possible without the technologies behind it: +Trilium не существовал бы без технологий, лежащих в его основе: -* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind - text notes. We are grateful for being offered a set of the premium features. -* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with - support for huge amount of languages. -* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite - whiteboard used in Canvas notes. -* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the - mind map functionality. -* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical - maps. -* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive - table used in collections. -* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library - without real competition. -* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library. - Used in [relation - maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link - maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - визуальный редактор + текстовых заметок. Мы благодарны за предоставленный нам набор дополнительный + функций. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - редактор кода с + поддержкой огромного количества языков. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - бесконечная белая + доска, используемая в заметках Canvas. +* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - обеспечивает + функционирование ментальной карты. +* [Leaflet](https://github.com/Leaflet/Leaflet) - отображение географических + карт. +* [Tabulator](https://github.com/olifolkerd/tabulator) - интерактивные таблицы, + используемые в коллекциях. +* [FancyTree](https://github.com/mar10/fancytree) - многофункциональная + библиотека деревьев, не имеющая себе равных. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - библиотека визуальных связей. + Используется в [картах + связей](https://triliumnext.github.io/Docs/Wiki/relation-map.html) и [картах + ссылок](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map) -## 🤝 Support +## 🤝 Поддержка -Trilium is built and maintained with [hundreds of hours of -work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your -support keeps it open-source, improves features, and covers costs such as -hosting. +На создание и поддержку Trilium затрачены [сотни часов +работы](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Ваша +поддержка помогает ему оставаться open-source, улучшает функции и покрывает +расходы, такие как хостинг. -Consider supporting the main developer -([eliandoran](https://github.com/eliandoran)) of the application via: +Вы также можете поддержать главного разработчика приложения +([eliandoran](https://github.com/eliandoran)) с помощью: - [GitHub Sponsors](https://github.com/sponsors/eliandoran) - [PayPal](https://paypal.me/eliandoran) diff --git a/docs/README.md b/docs/README.md index be65024ee..ea2fdd378 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,17 @@ -# Trilium Notes +# Trilium Notes Documentation + +## 📚 Technical Documentation + +**NEW:** Comprehensive technical and architectural documentation is now available! + +- **[Technical Documentation Index](TECHNICAL_DOCUMENTATION.md)** - Complete index to all technical docs +- **[Architecture Overview](ARCHITECTURE.md)** - System design and core patterns +- **[Database Architecture](DATABASE.md)** - Complete database documentation +- **[Synchronization](SYNCHRONIZATION.md)** - Sync protocol and implementation +- **[Scripting System](SCRIPTING.md)** - User scripting guide and API +- **[Security Architecture](SECURITY_ARCHITECTURE.md)** - Security implementation details + +## 📖 User Documentation Please see the [main documentation](index.md) or visit one of our translated versions: @@ -9,4 +22,11 @@ Please see the [main documentation](index.md) or visit one of our translated ver - [简体中文](README-ZH_CN.md) - [繁體中文](README-ZH_TW.md) +## 🔧 Developer Documentation + +- [Developer Guide](Developer%20Guide/Developer%20Guide/) - Development environment and contribution guide +- [Script API](Script%20API/) - Complete scripting API reference + +## 🔗 Additional Resources + For the full application README, please visit our [GitHub repository](https://github.com/triliumnext/trilium). \ No newline at end of file diff --git a/docs/Release Notes/!!!meta.json b/docs/Release Notes/!!!meta.json index 57e84dc42..2a508e594 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, @@ -935,6 +935,73 @@ "dataFileName": "v0.90.0-beta.md", "attachments": [] }, + { + "isClone": false, + "noteId": "kzjHexDTTeVB", + "notePath": [ + "hD3V4hiu2VW4", + "kzjHexDTTeVB" + ], + "title": "v0.48", + "notePosition": 420, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "template", + "value": "wyurrlcDl416", + "isInheritable": false, + "position": 60 + } + ], + "format": "markdown", + "dataFileName": "v0.48.md", + "attachments": [ + { + "attachmentId": "645H74UA4xwf", + "title": "note-map.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "v0.48_note-map.png" + }, + { + "attachmentId": "c74WFpjTo0p4", + "title": "screenshot.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "v0.48_screenshot.png" + }, + { + "attachmentId": "szlnTmTJL4HL", + "title": "split.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "v0.48_split.png" + }, + { + "attachmentId": "VQxrtpQTYmI6", + "title": "bookmarks.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "v0.48_bookmarks.png" + }, + { + "attachmentId": "ZRyEqxAv1MTd", + "title": "mermaid.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "v0.48_mermaid.png" + } + ] + }, { "isClone": false, "noteId": "wyurrlcDl416", @@ -943,7 +1010,7 @@ "wyurrlcDl416" ], "title": "Release Template", - "notePosition": 420, + "notePosition": 430, "prefix": null, "isExpanded": false, "type": "text", diff --git a/docs/Release Notes/Release Notes/v0.48.md b/docs/Release Notes/Release Notes/v0.48.md new file mode 100644 index 000000000..f1b5e5c3b --- /dev/null +++ b/docs/Release Notes/Release Notes/v0.48.md @@ -0,0 +1,121 @@ +# v0.48 +0.48 is a big release and contains many changes, some of them breaking: + +## Major frontend redesign + + + +* right panel is no more, most of these widgets have been moved to the new ribbon-style widget under note title + * right panel is still possible to activate for scripts +* Trilium has a new icon (there might be further color changes) + +## Vertical split window + +
+ +## Link map re-implemented + +Now supports also hierarchical view of the notes: + +
+ +## Mermaid diagrams + +Thanks to [@abitofevrything](https://github.com/abitofevrything) for this contribution! + +
+ +## Basic bookmark support + +
+ +## Other changes + +* persistence/entity layer in backend was largely refactored - "repository" and unified with note cache which should bring performance improvements for many operations +* search and SQL query notes now don't create “saved” notes by default +* added underline heading style and make it a default +* updated CKEditor to 30.0.0 + +## Migration + +### Backup restore + +Trilium v0.48 is currently in beta and may contain serious bugs. + +Before migration to 0.48 Trilium will make automatically backup into `~/trilium-data/backup/backup-before-migration.db`. In case of problems you can restore this backup with this guide: [https://github.com/zadam/trilium/wiki/Backup#restoring-backup](https://github.com/zadam/trilium/wiki/Backup#restoring-backup) + +### Direct upgrade only from 0.47.X + +Direct upgrade to 0.48 is possible only from 0.47.X. If you want to upgrade from an older version, you need to upgrade to 0.47.X first and only then to 0.48. This is caused by extensive backend refactoring which broke older migration scripts. + +### All backend script notes should avoid being async + +Backend operations were in older versions used async/await because of the SQLite driver. But Trilium recently migrated to the synchronous (and much faster) `better-sqlite3`. As a consequence backend script notes which are wrapped in a transaction should to be converted to the sync variant. + +e.g. old script looked like this: + +``` +const todayDateStr = api.formatDateISO(new Date()); + +const todayNote = await api.runOnBackend(async todayDateStr => { + const dateNote = await api.getDayNote(todayDateStr); + + ({note: logNote} = await api.createNote(dateNote.noteId, 'log')); +}, [todayDateStr]); + +api.activateNote(todayNote.noteId); +``` + +all the `await` (and `async`) should disappear from the backend code, but should remain when calling backend from frontend (that's still async): + +``` +const todayDateStr = api.formatDateISO(new Date()); + +const todayNote = await api.runOnBackend(todayDateStr => { + const dateNote = api.getDayNote(todayDateStr); + + ({note: logNote} = api.createNote(dateNote.noteId, 'log')); +}, [todayDateStr]); + +api.activateNote(todayNote.noteId); +``` + +### Migrate custom themes + +With the redesign you might need to adjust your custom themes - check the modified list of available CSS variables in the [default theme](https://github.com/zadam/trilium/blob/master/src/public/stylesheets/theme-light.css). If your theme also uses CSS selectors then that will probably have to be rewritten as well. + +Themes are annotated with `#appTheme` label, previously this label could but did not have to contain value - with this release the value is required so define the label as e.g. `#appTheme=my-theme-name`. + +Additionally, CSS themes are now loaded differently than before - previously all themes were loaded at the startup and which one was active was decided by the active CSS class. Themes were then prefixed like this: + +``` +body.theme-steel-blue { + --main-font-family: 'Raleway' !important; + --main-font-size: normal; + + --tree-font-family: inherit; + --tree-font-size: normal; + ... +} + +body.theme-steel-blue .note-detail-editable-text, body.theme-steel-blue .note-detail-readonly-text { + font-size: 120%; +} +``` + +This prefixing is not needed anymore (and also doesn't work anymore). Remove the prefixes like this: + +``` +:root { + --main-font-family: 'Raleway'; + --main-font-size: normal; + + --tree-font-family: 'Raleway'; + --tree-font-size: normal; + ... +} + +body .note-detail-editable-text, body .note-detail-readonly-text { + font-size: 120%; +} +``` \ No newline at end of file diff --git a/docs/Release Notes/Release Notes/v0.48_bookmarks.png b/docs/Release Notes/Release Notes/v0.48_bookmarks.png new file mode 100644 index 000000000..2d78ee1a1 Binary files /dev/null and b/docs/Release Notes/Release Notes/v0.48_bookmarks.png differ diff --git a/docs/Release Notes/Release Notes/v0.48_mermaid.png b/docs/Release Notes/Release Notes/v0.48_mermaid.png new file mode 100644 index 000000000..1c48d2aa6 Binary files /dev/null and b/docs/Release Notes/Release Notes/v0.48_mermaid.png differ diff --git a/docs/Release Notes/Release Notes/v0.48_note-map.png b/docs/Release Notes/Release Notes/v0.48_note-map.png new file mode 100644 index 000000000..ee7ef932a Binary files /dev/null and b/docs/Release Notes/Release Notes/v0.48_note-map.png differ diff --git a/docs/Release Notes/Release Notes/v0.48_screenshot.png b/docs/Release Notes/Release Notes/v0.48_screenshot.png new file mode 100644 index 000000000..78f589fd9 Binary files /dev/null and b/docs/Release Notes/Release Notes/v0.48_screenshot.png differ diff --git a/docs/Release Notes/Release Notes/v0.48_split.png b/docs/Release Notes/Release Notes/v0.48_split.png new file mode 100644 index 000000000..bb58e1834 Binary files /dev/null and b/docs/Release Notes/Release Notes/v0.48_split.png differ diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index b73efe6a6..057df9c87 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,92 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "s3YCWHBfmYuM", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "gh7bpGYxajRS", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GTwFsgaA0lCt", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "poXkQfguuA0U", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "WOcw2SLH6tbX", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Q2z6av6JZVWm", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "MEtfsqa5VwNi", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "9qPsTWBorUhQ", + "isInheritable": false, + "position": 90 + }, + { + "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": "label", + "name": "iconClass", + "value": "bx bx-help-circle", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "User Guide.md", "attachments": [], @@ -37,91 +122,91 @@ { "type": "relation", "name": "internalLink", - "value": "ZjLYv08Rp3qC", + "value": "GTwFsgaA0lCt", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "R9pX4DGra2Vt", + "value": "2FvYrpmOXm29", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "LMAv4Uy3Wk6J", + "value": "ZjLYv08Rp3qC", "isInheritable": false, "position": 30 }, { "type": "relation", "name": "internalLink", - "value": "NRnIZmSMc5sj", + "value": "R9pX4DGra2Vt", "isInheritable": false, "position": 40 }, { "type": "relation", "name": "internalLink", - "value": "rC3pL2aptaRE", + "value": "NRnIZmSMc5sj", "isInheritable": false, "position": 50 }, { "type": "relation", "name": "internalLink", - "value": "GTwFsgaA0lCt", + "value": "rC3pL2aptaRE", "isInheritable": false, "position": 60 }, { "type": "relation", "name": "internalLink", - "value": "2FvYrpmOXm29", + "value": "xWbu3jpNWapp", "isInheritable": false, "position": 70 }, { "type": "relation", "name": "internalLink", - "value": "iPIMuisry3hd", + "value": "81SGnPGMk7Xc", "isInheritable": false, "position": 80 }, { "type": "relation", "name": "internalLink", - "value": "ZlN4nump6EbW", + "value": "iPIMuisry3hd", "isInheritable": false, "position": 90 }, { "type": "relation", "name": "internalLink", - "value": "pwc194wlRzcH", + "value": "ZlN4nump6EbW", "isInheritable": false, "position": 100 }, { "type": "relation", "name": "internalLink", - "value": "7DAiwaf8Z7Rz", + "value": "pwc194wlRzcH", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "veGu4faJErEM", + "value": "7DAiwaf8Z7Rz", "isInheritable": false, "position": 120 }, { "type": "relation", "name": "internalLink", - "value": "xWbu3jpNWapp", + "value": "veGu4faJErEM", "isInheritable": false, "position": 130 }, @@ -132,19 +217,12 @@ "isInheritable": false, "position": 140 }, - { - "type": "relation", - "name": "internalLink", - "value": "81SGnPGMk7Xc", - "isInheritable": false, - "position": 150 - }, { "type": "relation", "name": "internalLink", "value": "gBbsAeiuUxI5", "isInheritable": false, - "position": 160 + "position": 150 }, { "type": "label", @@ -152,6 +230,13 @@ "value": "bx bx-star", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "feature-highlights", + "isInheritable": false, + "position": 170 } ], "format": "markdown", @@ -178,6 +263,13 @@ "value": "bx bx-cog", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "setup", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -223,9 +315,16 @@ { "type": "label", "name": "shareAlias", - "value": "desktop-installation", + "value": "desktop", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-desktop", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -262,11 +361,88 @@ "value": "WOcw2SLH6tbX", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "desktop-as-server", + "isInheritable": false, + "position": 30 } ], "format": "markdown", "dataFileName": "Using the desktop application .md", "attachments": [] + }, + { + "isClone": false, + "noteId": "Rp0q8bSP6Ayl", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "poXkQfguuA0U", + "Rp0q8bSP6Ayl" + ], + "title": "System Requirements", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "system-requirements", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-chip", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "System Requirements.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "Un4wj2Mak2Ky", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "poXkQfguuA0U", + "Un4wj2Mak2Ky" + ], + "title": "Nix flake", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "nix-flake", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxl-tux", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Nix flake.md", + "attachments": [] } ] }, @@ -379,9 +555,16 @@ { "type": "label", "name": "shareAlias", - "value": "server-installation", + "value": "server", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-server", + "isInheritable": false, + "position": 140 } ], "format": "markdown", @@ -404,7 +587,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 +634,7 @@ { "type": "label", "name": "shareAlias", - "value": "packaged-server-installation", + "value": "packaged-server", "isInheritable": false, "position": 10 }, @@ -493,7 +684,7 @@ { "type": "label", "name": "shareAlias", - "value": "docker-server-installation", + "value": "docker", "isInheritable": false, "position": 30 }, @@ -529,7 +720,7 @@ { "type": "label", "name": "shareAlias", - "value": "nixos-server-installation", + "value": "nixos", "isInheritable": false, "position": 10 }, @@ -586,7 +777,7 @@ { "type": "label", "name": "shareAlias", - "value": "manual-server-installation", + "value": "manual", "isInheritable": false, "position": 20 }, @@ -622,7 +813,7 @@ { "type": "label", "name": "shareAlias", - "value": "kubernetes-server-installation", + "value": "kubernetes", "isInheritable": false, "position": 10 }, @@ -696,6 +887,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 +917,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 +957,7 @@ { "type": "label", "name": "shareAlias", - "value": "nginx-proxy-setup", + "value": "nginx", "isInheritable": false, "position": 10 } @@ -787,7 +993,7 @@ { "type": "label", "name": "shareAlias", - "value": "apache-proxy-setup", + "value": "apache", "isInheritable": false, "position": 10 } @@ -826,6 +1032,13 @@ "value": "Gzjqa934BdH4", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "trusted-proxy", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -881,7 +1094,7 @@ { "type": "label", "name": "shareAlias", - "value": "tls-configuration", + "value": "https", "isInheritable": false, "position": 20 }, @@ -940,6 +1153,13 @@ "value": "bx bx-user", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "auth", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -972,7 +1192,7 @@ { "type": "label", "name": "shareAlias", - "value": "multi-factor-authentication", + "value": "mfa", "isInheritable": false, "position": 10 }, @@ -987,6 +1207,113 @@ "format": "markdown", "dataFileName": "Multi-Factor Authentication.md", "attachments": [] + }, + { + "isClone": true, + "noteId": "Un4wj2Mak2Ky", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "Un4wj2Mak2Ky" + ], + "title": "Nix flake", + "prefix": null, + "dataFileName": "Nix flake.clone.md", + "type": "text", + "format": "markdown", + "isExpanded": false + }, + { + "isClone": false, + "noteId": "yeEaYqosGLSh", + "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": [] + }, + { + "isClone": false, + "noteId": "iGTnKjubbXkA", + "notePath": [ + "pOsGYCXsbNQG", + "Otzi9La2YAUX", + "WOcw2SLH6tbX", + "iGTnKjubbXkA" + ], + "title": "System Requirements", + "notePosition": 140, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "system-requirements", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-chip", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "System Requirements.md", + "attachments": [] } ] }, @@ -1182,6 +1509,13 @@ "value": "web-clipper", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-paperclip", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -1243,9 +1577,16 @@ { "type": "label", "name": "shareAlias", - "value": "upgrading-trilium", + "value": "upgrading", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-up-arrow-alt", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -1301,6 +1642,13 @@ "value": "backup", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-hdd", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -1336,6 +1684,27 @@ "isInheritable": false, "position": 20 }, + { + "type": "relation", + "name": "internalLink", + "value": "Gzjqa934BdH4", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bnyigUA2UK7s", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "x59R8J8KV5Bp", + "isInheritable": false, + "position": 50 + }, { "type": "label", "name": "shareAlias", @@ -1386,6 +1755,13 @@ "value": "bx bx-help-circle", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "concepts", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -1413,6 +1789,13 @@ "value": "bx bx-window-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ui", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -1476,6 +1859,13 @@ "value": "bx bxs-layout", "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "layouts", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -1560,6 +1950,13 @@ "value": "bx bx-menu", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "global-menu", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -1622,7 +2019,7 @@ { "type": "label", "name": "shareAlias", - "value": "tree-manipulation", + "value": "note-tree", "isInheritable": false, "position": 20 }, @@ -1827,6 +2224,13 @@ "value": "bx bx-menu", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "context-menu", + "isInheritable": false, + "position": 210 } ], "format": "markdown", @@ -1880,6 +2284,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 +2350,13 @@ "value": "bx bxs-keyboard", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "keyboard-shortcuts", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -2123,6 +2541,13 @@ "value": "bx bx-dots-horizontal", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ribbon", + "isInheritable": false, + "position": 230 } ], "format": "markdown", @@ -2181,6 +2606,13 @@ "value": "bx bx-dock-top", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "tabs", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -2290,6 +2722,13 @@ "value": "bx bx-sidebar", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "launch-bar", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -2355,6 +2794,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 +2880,13 @@ "value": "bx bx-cog", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "options", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -2500,6 +2953,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 +3064,13 @@ "value": "bx bx-rectangle", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "floating-buttons", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -2669,6 +3136,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 +3208,13 @@ "value": "bx bx-history", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "recent-changes", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -2773,12 +3254,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 +3394,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 +3506,7 @@ { "type": "label", "name": "shareAlias", - "value": "note", + "value": "notes", "isInheritable": false, "position": 30 }, @@ -3169,7 +3678,7 @@ { "type": "label", "name": "shareAlias", - "value": "cloning-notes", + "value": "cloning", "isInheritable": false, "position": 20 }, @@ -3232,6 +3741,13 @@ "value": "bx bx-rename", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "branch-prefix", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -3555,6 +4071,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 +4190,7 @@ { "type": "label", "name": "shareAlias", - "value": "read-only-note", + "value": "read-only-notes", "isInheritable": false, "position": 30 }, @@ -3735,6 +4258,13 @@ "value": "bx bxs-grid", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-list", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -3773,6 +4303,13 @@ "value": "bx bx-navigation", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "navigation", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -3936,6 +4473,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 +4531,13 @@ "value": "bx bx-send", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "jump-to", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -4374,6 +4925,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 +4997,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", @@ -4672,15 +5237,58 @@ "type": "text", "mime": "text/html", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "hrZ1D00cLbal", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Oau6X9rCuegd", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "rJ9grSgoExl9", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "syuSEKf2rUGr", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GnhlmrATVqcH", + "isInheritable": false, + "position": 50 + }, { "type": "label", "name": "iconClass", "value": "bx bx-import", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "import-export", + "isInheritable": false, + "position": 20 } ], "format": "markdown", + "dataFileName": "Import & Export.md", "attachments": [], "dirFileName": "Import & Export", "children": [ @@ -4783,6 +5391,13 @@ "value": "bx bx-code-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "supported-syntax", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -4810,9 +5425,16 @@ { "type": "label", "name": "shareAlias", - "value": "evernote-import", + "value": "evernote", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-window-open", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -4841,6 +5463,13 @@ "value": "onenote", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-window-open", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -4870,6 +5499,13 @@ "value": "bx bxs-yin-yang", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "zen-mode", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -4949,10 +5585,17 @@ { "type": "relation", "name": "internalLink", - "value": "cbkrhQjrkKrh", + "value": "yeEaYqosGLSh", "isInheritable": false, "position": 40 }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 50 + }, { "type": "label", "name": "shareAlias", @@ -5214,6 +5857,13 @@ "value": "bx bx-edit", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-types", + "isInheritable": false, + "position": 190 } ], "format": "markdown", @@ -5395,7 +6045,7 @@ { "type": "label", "name": "shareAlias", - "value": "text-notes", + "value": "text", "isInheritable": false, "position": 10 }, @@ -5487,6 +6137,13 @@ "value": "bx bx-info-circle", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "blockquotes", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -5554,6 +6211,13 @@ "value": "bx bx-bookmark", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "bookmarks", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -5599,6 +6263,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 +6307,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 +6372,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 +6501,13 @@ "value": "bx bx-code", "isInheritable": false, "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "code-blocks", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -5871,6 +6563,13 @@ "value": "bx bx-bracket", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "footnotes", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -5937,6 +6636,13 @@ "value": "bx bx-text", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "formatting-toolbar", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -6026,6 +6732,13 @@ "value": "bx bx-bold", "isInheritable": false, "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "general-formatting", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -6130,6 +6843,13 @@ "value": "bx bx-highlight", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "highlights-list", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -6370,6 +7090,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 +7151,13 @@ "value": "R9pX4DGra2Vt", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "include-note", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -6503,6 +7237,13 @@ "value": "bx bx-plus", "isInheritable": false, "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "insert-buttons", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -6648,6 +7389,13 @@ "value": "bx bxs-keyboard", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "keyboard-shortcuts", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -6748,6 +7496,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 +7564,13 @@ "value": "bx bx-link", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "reference-links", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -6855,6 +7617,13 @@ "value": "bx bx-list-ul", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "lists", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -7028,6 +7797,13 @@ "value": "bx bxl-markdown", "isInheritable": false, "position": 70 + }, + { + "type": "label", + "name": "shareAlias", + "value": "markdown-formatting", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -7077,6 +7853,13 @@ "value": "bx bx-math", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "math-equations", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -7150,6 +7933,13 @@ "value": "bx bxs-grid", "isInheritable": false, "position": 50 + }, + { + "type": "label", + "name": "shareAlias", + "value": "other-features", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -7249,6 +8039,13 @@ "value": "bx bx-star", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "premium-features", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -7314,6 +8111,13 @@ "value": "bx bx-menu", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "slash-commands", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -7415,6 +8219,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 +8301,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 +8359,13 @@ "value": "bx bx-table", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "tables", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -7619,7 +8444,7 @@ "dataFileName": "8_Tables_image.png" }, { - "attachmentId": "UdhsypjV4pzZ", + "attachmentId": "rrLM5BQCZ5ci", "title": "image.png", "role": "image", "mime": "image/png", @@ -7627,7 +8452,7 @@ "dataFileName": "9_Tables_image.png" }, { - "attachmentId": "VerzwlO9y6Na", + "attachmentId": "UdhsypjV4pzZ", "title": "image.png", "role": "image", "mime": "image/png", @@ -7635,7 +8460,7 @@ "dataFileName": "10_Tables_image.png" }, { - "attachmentId": "wYkQvargZlNF", + "attachmentId": "VerzwlO9y6Na", "title": "image.png", "role": "image", "mime": "image/png", @@ -7643,12 +8468,28 @@ "dataFileName": "11_Tables_image.png" }, { - "attachmentId": "YFGeAN41kvZY", + "attachmentId": "wYkQvargZlNF", "title": "image.png", "role": "image", "mime": "image/png", "position": 10, "dataFileName": "12_Tables_image.png" + }, + { + "attachmentId": "YFGeAN41kvZY", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "13_Tables_image.png" + }, + { + "attachmentId": "zRLxHrKJiK8N", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "14_Tables_image.png" } ] } @@ -7714,7 +8555,7 @@ { "type": "label", "name": "shareAlias", - "value": "code-notes", + "value": "code", "isInheritable": false, "position": 20 }, @@ -7941,6 +8782,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 +8867,13 @@ "value": "bx bx-extension", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "render-note", + "isInheritable": false, + "position": 70 } ], "format": "markdown", @@ -8034,872 +8889,6 @@ } ] }, - { - "isClone": false, - "noteId": "GTwFsgaA0lCt", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt" - ], - "title": "Collections", - "notePosition": 130, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/markdown", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "8QqnMzx393bx", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "0ESUbbAxVnoK", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "mULW0Q3VojwY", - "isInheritable": false, - "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "xWbu3jpNWapp", - "isInheritable": false, - "position": 40 - }, - { - "type": "relation", - "name": "internalLink", - "value": "81SGnPGMk7Xc", - "isInheritable": false, - "position": 50 - }, - { - "type": "relation", - "name": "internalLink", - "value": "2FvYrpmOXm29", - "isInheritable": false, - "position": 60 - }, - { - "type": "relation", - "name": "internalLink", - "value": "OFXdgB2nNk1F", - "isInheritable": false, - "position": 70 - }, - { - "type": "relation", - "name": "internalLink", - "value": "CtBQqbwXDx1w", - "isInheritable": false, - "position": 80 - }, - { - "type": "relation", - "name": "internalLink", - "value": "BlN9DFI679QC", - "isInheritable": false, - "position": 90 - }, - { - "type": "relation", - "name": "internalLink", - "value": "oPVyFC7WL2Lp", - "isInheritable": false, - "position": 100 - }, - { - "type": "relation", - "name": "internalLink", - "value": "eIg8jdvaoNNd", - "isInheritable": false, - "position": 110 - }, - { - "type": "relation", - "name": "internalLink", - "value": "m523cpzocqaD", - "isInheritable": false, - "position": 120 - }, - { - "type": "relation", - "name": "internalLink", - "value": "KC1HB96bqqHX", - "isInheritable": false, - "position": 130 - }, - { - "type": "relation", - "name": "internalLink", - "value": "2mUhVmZK8RF3", - "isInheritable": false, - "position": 140 - }, - { - "type": "label", - "name": "shareAlias", - "value": "book-note", - "isInheritable": false, - "position": 10 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-book", - "isInheritable": false, - "position": 20 - } - ], - "format": "markdown", - "dataFileName": "Collections.md", - "attachments": [], - "dirFileName": "Collections", - "children": [ - { - "isClone": false, - "noteId": "xWbu3jpNWapp", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt", - "xWbu3jpNWapp" - ], - "title": "Calendar View", - "notePosition": 10, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "ZjLYv08Rp3qC", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "BlN9DFI679QC", - "isInheritable": false, - "position": 20 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-calendar", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Calendar View.md", - "attachments": [ - { - "attachmentId": "37CfbqKYcOtd", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Calendar View_image.png" - }, - { - "attachmentId": "akAHcIEcGnWR", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Calendar View_image.png" - }, - { - "attachmentId": "AU7dnIevWPrz", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "2_Calendar View_image.png" - }, - { - "attachmentId": "COiR1tnE86i1", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "3_Calendar View_image.png" - }, - { - "attachmentId": "fOdCNTs2BuI0", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "4_Calendar View_image.png" - }, - { - "attachmentId": "HfBu0m3WXtn2", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "5_Calendar View_image.png" - }, - { - "attachmentId": "ho00OJTNrxVI", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "6_Calendar View_image.png" - }, - { - "attachmentId": "irfNX8n4159U", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "7_Calendar View_image.png" - }, - { - "attachmentId": "KF56rdNuOwWd", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "8_Calendar View_image.png" - }, - { - "attachmentId": "oBWr5GL6cUAZ", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "9_Calendar View_image.png" - }, - { - "attachmentId": "oS6yUoQtfhpg", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "10_Calendar View_image.png" - }, - { - "attachmentId": "u2c09UpZghff", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "11_Calendar View_image.png" - } - ] - }, - { - "isClone": false, - "noteId": "81SGnPGMk7Xc", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt", - "81SGnPGMk7Xc" - ], - "title": "Geo Map View", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "KSZ04uQ2D1St", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "0ESUbbAxVnoK", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "XpOYSgsLkTJy", - "isInheritable": false, - "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "oPVyFC7WL2Lp", - "isInheritable": false, - "position": 40 - }, - { - "type": "relation", - "name": "internalLink", - "value": "IakOLONlIfGI", - "isInheritable": false, - "position": 50 - }, - { - "type": "relation", - "name": "internalLink", - "value": "lgKX7r3aL30x", - "isInheritable": false, - "position": 60 - }, - { - "type": "relation", - "name": "internalLink", - "value": "ZjLYv08Rp3qC", - "isInheritable": false, - "position": 70 - }, - { - "type": "relation", - "name": "internalLink", - "value": "BlN9DFI679QC", - "isInheritable": false, - "position": 80 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-map-alt", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Geo Map View.md", - "attachments": [ - { - "attachmentId": "1f07O0Z25ZRr", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Geo Map View_image.png" - }, - { - "attachmentId": "3oh61qhNLu7D", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Geo Map View_image.png" - }, - { - "attachmentId": "aCSNn9QlgHFi", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "2_Geo Map View_image.png" - }, - { - "attachmentId": "aCuXZY7WV4li", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "3_Geo Map View_image.png" - }, - { - "attachmentId": "agH6yREFgsoU", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "4_Geo Map View_image.png" - }, - { - "attachmentId": "AHyDUM6R5HeG", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "5_Geo Map View_image.png" - }, - { - "attachmentId": "CcjWLhE3KKfv", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "6_Geo Map View_image.png" - }, - { - "attachmentId": "fQy8R1vxKhwN", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "7_Geo Map View_image.png" - }, - { - "attachmentId": "gJ4Yz80jxcbn", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "8_Geo Map View_image.png" - }, - { - "attachmentId": "I39BinT2gsN9", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "9_Geo Map View_image.png" - }, - { - "attachmentId": "IeXU8SLZU7Oz", - "title": "image.jpg", - "role": "image", - "mime": "image/jpg", - "position": 10, - "dataFileName": "Geo Map View_image.jpg" - }, - { - "attachmentId": "Mb9kRm63MxjE", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "10_Geo Map View_image.png" - }, - { - "attachmentId": "Mx2xwNIk76ZS", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "11_Geo Map View_image.png" - }, - { - "attachmentId": "oaahbsMRbqd2", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "12_Geo Map View_image.png" - }, - { - "attachmentId": "pGf1p74KKGU4", - "title": "image.png", - "role": "image", - "mime": "image/jpg", - "position": 10, - "dataFileName": "13_Geo Map View_image.png" - }, - { - "attachmentId": "tfa1TRUatWEh", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "14_Geo Map View_image.png" - }, - { - "attachmentId": "tuNZ7Uk9WfX1", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "15_Geo Map View_image.png" - }, - { - "attachmentId": "x6yBLIsY2LSv", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "16_Geo Map View_image.png" - }, - { - "attachmentId": "yJMyBRYA3Kwi", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "17_Geo Map View_image.png" - }, - { - "attachmentId": "ZvTlu9WMd37z", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "18_Geo Map View_image.png" - } - ] - }, - { - "isClone": false, - "noteId": "8QqnMzx393bx", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt", - "8QqnMzx393bx" - ], - "title": "Grid View", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "6f9hih2hXXZk", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "0ESUbbAxVnoK", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "iPIMuisry3hd", - "isInheritable": false, - "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "W8vYD3Q1zjCR", - "isInheritable": false, - "position": 40 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bxs-grid", - "isInheritable": false, - "position": 20 - } - ], - "format": "markdown", - "dataFileName": "Grid View.md", - "attachments": [ - { - "attachmentId": "al3KatZRq5TB", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Grid View_image.png" - } - ] - }, - { - "isClone": false, - "noteId": "mULW0Q3VojwY", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt", - "mULW0Q3VojwY" - ], - "title": "List View", - "notePosition": 40, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "8QqnMzx393bx", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "BlN9DFI679QC", - "isInheritable": false, - "position": 20 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-list-ul", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "List View.md", - "attachments": [ - { - "attachmentId": "igeOEpKp4ygW", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "List View_image.png" - } - ] - }, - { - "isClone": false, - "noteId": "2FvYrpmOXm29", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt", - "2FvYrpmOXm29" - ], - "title": "Table View", - "notePosition": 50, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "OFXdgB2nNk1F", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "m1lbrzyKDaRB", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "oPVyFC7WL2Lp", - "isInheritable": false, - "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "BlN9DFI679QC", - "isInheritable": false, - "position": 40 - }, - { - "type": "relation", - "name": "internalLink", - "value": "eIg8jdvaoNNd", - "isInheritable": false, - "position": 50 - }, - { - "type": "relation", - "name": "internalLink", - "value": "CdNpE2pqjmI6", - "isInheritable": false, - "position": 60 - }, - { - "type": "relation", - "name": "internalLink", - "value": "m523cpzocqaD", - "isInheritable": false, - "position": 70 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-table", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Table View.md", - "attachments": [ - { - "attachmentId": "vJYUG9fLQ2Pd", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Table View_image.png" - } - ] - }, - { - "isClone": false, - "noteId": "CtBQqbwXDx1w", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt", - "CtBQqbwXDx1w" - ], - "title": "Board View", - "notePosition": 60, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "2FvYrpmOXm29", - "isInheritable": false, - "position": 10 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-columns", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Board View.md", - "attachments": [ - { - "attachmentId": "usSSa0WI6dDK", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Board View_image.png" - } - ] - }, - { - "isClone": false, - "noteId": "zP3PMqaG71Ct", - "notePath": [ - "pOsGYCXsbNQG", - "KSZ04uQ2D1St", - "GTwFsgaA0lCt", - "zP3PMqaG71Ct" - ], - "title": "Presentation View", - "notePosition": 70, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [ - { - "type": "relation", - "name": "internalLink", - "value": "BlN9DFI679QC", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "OFXdgB2nNk1F", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "R9pX4DGra2Vt", - "isInheritable": false, - "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "0ESUbbAxVnoK", - "isInheritable": false, - "position": 40 - }, - { - "type": "relation", - "name": "internalLink", - "value": "grjYqerjn243", - "isInheritable": false, - "position": 50 - }, - { - "type": "relation", - "name": "internalLink", - "value": "AlhDUqhENtH7", - "isInheritable": false, - "position": 60 - }, - { - "type": "relation", - "name": "internalLink", - "value": "s1aBHPd79XYj", - "isInheritable": false, - "position": 70 - }, - { - "type": "relation", - "name": "internalLink", - "value": "gBbsAeiuUxI5", - "isInheritable": false, - "position": 80 - }, - { - "type": "label", - "name": "iconClass", - "value": "bx bx-slideshow", - "isInheritable": false, - "position": 10 - } - ], - "format": "markdown", - "dataFileName": "Presentation View.md", - "attachments": [ - { - "attachmentId": "aJa7vIrYknDw", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Presentation View_image.png" - }, - { - "attachmentId": "aPooMxP74PeA", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Presentation View_image.png" - } - ] - } - ] - }, { "isClone": false, "noteId": "s1aBHPd79XYj", @@ -8918,17 +8907,24 @@ { "type": "relation", "name": "internalLink", - "value": "XpOYSgsLkTJy", + "value": "WWgeUaBb7UfC", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "0Ofbk1aSuVRu", + "value": "XpOYSgsLkTJy", "isInheritable": false, "position": 20 }, + { + "type": "relation", + "name": "internalLink", + "value": "0Ofbk1aSuVRu", + "isInheritable": false, + "position": 30 + }, { "type": "label", "name": "shareAlias", @@ -8996,6 +8992,13 @@ "value": "bx bxs-network-chart", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "elk", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9018,6 +9021,33 @@ "dataFileName": "ELK layout_ELK on.svg" } ] + }, + { + "isClone": false, + "noteId": "WWgeUaBb7UfC", + "notePath": [ + "pOsGYCXsbNQG", + "KSZ04uQ2D1St", + "s1aBHPd79XYj", + "WWgeUaBb7UfC" + ], + "title": "Syntax reference", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "webView", + "mime": "", + "attributes": [ + { + "type": "label", + "name": "webViewSrc", + "value": "https://mermaid.js.org/intro/syntax-reference.html", + "isInheritable": false, + "position": 10 + } + ], + "dataFileName": "Syntax reference.dat", + "attachments": [] } ] }, @@ -9042,6 +9072,13 @@ "value": "bx bx-pen", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "canvas", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9085,6 +9122,13 @@ "value": "bx bx-globe-alt", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "webview", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9126,6 +9170,13 @@ "value": "bx bx-sitemap", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "mindmap", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -9239,6 +9290,20 @@ "value": "nBAXQFj20hS1", "isInheritable": false, "position": 120 + }, + { + "type": "label", + "name": "shareAlias", + "value": "file", + "isInheritable": false, + "position": 130 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-file-blank", + "isInheritable": false, + "position": 140 } ], "format": "markdown", @@ -9304,6 +9369,968 @@ } ] }, + { + "isClone": false, + "noteId": "GTwFsgaA0lCt", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt" + ], + "title": "Collections", + "notePosition": 250, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "xWbu3jpNWapp", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "2FvYrpmOXm29", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CtBQqbwXDx1w", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "81SGnPGMk7Xc", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zP3PMqaG71Ct", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "8QqnMzx393bx", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "0ESUbbAxVnoK", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "mULW0Q3VojwY", + "isInheritable": false, + "position": 90 + }, + { + "type": "relation", + "name": "internalLink", + "value": "oPVyFC7WL2Lp", + "isInheritable": false, + "position": 100 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 110 + }, + { + "type": "relation", + "name": "internalLink", + "value": "MKmLg5x6xkor", + "isInheritable": false, + "position": 120 + }, + { + "type": "relation", + "name": "internalLink", + "value": "eIg8jdvaoNNd", + "isInheritable": false, + "position": 130 + }, + { + "type": "relation", + "name": "internalLink", + "value": "m523cpzocqaD", + "isInheritable": false, + "position": 140 + }, + { + "type": "relation", + "name": "internalLink", + "value": "KC1HB96bqqHX", + "isInheritable": false, + "position": 150 + }, + { + "type": "relation", + "name": "internalLink", + "value": "2mUhVmZK8RF3", + "isInheritable": false, + "position": 160 + }, + { + "type": "label", + "name": "shareAlias", + "value": "collections", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-book", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Collections.md", + "attachments": [ + { + "attachmentId": "5NH7myDKSICZ", + "title": "collection_geomap.webp", + "role": "image", + "mime": "image/webp", + "position": 10, + "dataFileName": "Collections_collection_ge.webp" + }, + { + "attachmentId": "7gL9zNsbyY4Z", + "title": "collection_presentation.webp", + "role": "image", + "mime": "image/webp", + "position": 10, + "dataFileName": "Collections_collection_pr.webp" + }, + { + "attachmentId": "BA2BoJ7NuNrx", + "title": "collection_table.webp", + "role": "image", + "mime": "image/webp", + "position": 10, + "dataFileName": "Collections_collection_ta.webp" + }, + { + "attachmentId": "tgdna1b1s44A", + "title": "collection_calendar.webp", + "role": "image", + "mime": "image/webp", + "position": 10, + "dataFileName": "Collections_collection_ca.webp" + }, + { + "attachmentId": "vozq8xSO2HO7", + "title": "collection_board.webp", + "role": "image", + "mime": "image/webp", + "position": 10, + "dataFileName": "Collections_collection_bo.webp" + } + ], + "dirFileName": "Collections", + "children": [ + { + "isClone": false, + "noteId": "xWbu3jpNWapp", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt", + "xWbu3jpNWapp" + ], + "title": "Calendar", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "ZjLYv08Rp3qC", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-calendar", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "calendar", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Calendar.md", + "attachments": [ + { + "attachmentId": "37CfbqKYcOtd", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Calendar_image.png" + }, + { + "attachmentId": "akAHcIEcGnWR", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Calendar_image.png" + }, + { + "attachmentId": "AU7dnIevWPrz", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Calendar_image.png" + }, + { + "attachmentId": "COiR1tnE86i1", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Calendar_image.png" + }, + { + "attachmentId": "fOdCNTs2BuI0", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_Calendar_image.png" + }, + { + "attachmentId": "HfBu0m3WXtn2", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "5_Calendar_image.png" + }, + { + "attachmentId": "ho00OJTNrxVI", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "6_Calendar_image.png" + }, + { + "attachmentId": "irfNX8n4159U", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "7_Calendar_image.png" + }, + { + "attachmentId": "KF56rdNuOwWd", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "8_Calendar_image.png" + }, + { + "attachmentId": "oBWr5GL6cUAZ", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "9_Calendar_image.png" + }, + { + "attachmentId": "oS6yUoQtfhpg", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "10_Calendar_image.png" + }, + { + "attachmentId": "u2c09UpZghff", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "11_Calendar_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "2FvYrpmOXm29", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt", + "2FvYrpmOXm29" + ], + "title": "Table", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "m1lbrzyKDaRB", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "oPVyFC7WL2Lp", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "eIg8jdvaoNNd", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "m523cpzocqaD", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-table", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "table", + "isInheritable": false, + "position": 80 + } + ], + "format": "markdown", + "dataFileName": "Table.md", + "attachments": [ + { + "attachmentId": "vJYUG9fLQ2Pd", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Table_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "CtBQqbwXDx1w", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt", + "CtBQqbwXDx1w" + ], + "title": "Kanban Board", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "2FvYrpmOXm29", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-columns", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "kanban-board", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Kanban Board.md", + "attachments": [ + { + "attachmentId": "usSSa0WI6dDK", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Kanban Board_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "81SGnPGMk7Xc", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt", + "81SGnPGMk7Xc" + ], + "title": "Geo Map", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "0ESUbbAxVnoK", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "XpOYSgsLkTJy", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "oPVyFC7WL2Lp", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "lgKX7r3aL30x", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "ZjLYv08Rp3qC", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "KSZ04uQ2D1St", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-map-alt", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "geomap", + "isInheritable": false, + "position": 90 + } + ], + "format": "markdown", + "dataFileName": "Geo Map.md", + "attachments": [ + { + "attachmentId": "1f07O0Z25ZRr", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Geo Map_image.png" + }, + { + "attachmentId": "3oh61qhNLu7D", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Geo Map_image.png" + }, + { + "attachmentId": "aCSNn9QlgHFi", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_Geo Map_image.png" + }, + { + "attachmentId": "aCuXZY7WV4li", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_Geo Map_image.png" + }, + { + "attachmentId": "agH6yREFgsoU", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_Geo Map_image.png" + }, + { + "attachmentId": "AHyDUM6R5HeG", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "5_Geo Map_image.png" + }, + { + "attachmentId": "CcjWLhE3KKfv", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "6_Geo Map_image.png" + }, + { + "attachmentId": "fQy8R1vxKhwN", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "7_Geo Map_image.png" + }, + { + "attachmentId": "gJ4Yz80jxcbn", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "8_Geo Map_image.png" + }, + { + "attachmentId": "I39BinT2gsN9", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "9_Geo Map_image.png" + }, + { + "attachmentId": "IeXU8SLZU7Oz", + "title": "image.jpg", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "Geo Map_image.jpg" + }, + { + "attachmentId": "Mb9kRm63MxjE", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "10_Geo Map_image.png" + }, + { + "attachmentId": "Mx2xwNIk76ZS", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "11_Geo Map_image.png" + }, + { + "attachmentId": "oaahbsMRbqd2", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "12_Geo Map_image.png" + }, + { + "attachmentId": "pGf1p74KKGU4", + "title": "image.png", + "role": "image", + "mime": "image/jpg", + "position": 10, + "dataFileName": "13_Geo Map_image.png" + }, + { + "attachmentId": "tfa1TRUatWEh", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "14_Geo Map_image.png" + }, + { + "attachmentId": "tuNZ7Uk9WfX1", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "15_Geo Map_image.png" + }, + { + "attachmentId": "x6yBLIsY2LSv", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "16_Geo Map_image.png" + }, + { + "attachmentId": "yJMyBRYA3Kwi", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "17_Geo Map_image.png" + }, + { + "attachmentId": "ZvTlu9WMd37z", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "18_Geo Map_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "zP3PMqaG71Ct", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt", + "zP3PMqaG71Ct" + ], + "title": "Presentation", + "notePosition": 90, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R9pX4DGra2Vt", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "0ESUbbAxVnoK", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "AlhDUqhENtH7", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s1aBHPd79XYj", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "grjYqerjn243", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "gBbsAeiuUxI5", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-slideshow", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "presentation", + "isInheritable": false, + "position": 90 + } + ], + "format": "markdown", + "dataFileName": "Presentation.md", + "attachments": [ + { + "attachmentId": "aJa7vIrYknDw", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Presentation_image.png" + }, + { + "attachmentId": "aPooMxP74PeA", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_Presentation_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "8QqnMzx393bx", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt", + "8QqnMzx393bx" + ], + "title": "Grid View", + "notePosition": 100, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "0ESUbbAxVnoK", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iPIMuisry3hd", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "W8vYD3Q1zjCR", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-grid", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "grid", + "isInheritable": false, + "position": 50 + } + ], + "format": "markdown", + "dataFileName": "Grid View.md", + "attachments": [ + { + "attachmentId": "al3KatZRq5TB", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Grid View_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "mULW0Q3VojwY", + "notePath": [ + "pOsGYCXsbNQG", + "GTwFsgaA0lCt", + "mULW0Q3VojwY" + ], + "title": "List View", + "notePosition": 110, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "8QqnMzx393bx", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BlN9DFI679QC", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-list-ul", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "list", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "List View.md", + "attachments": [ + { + "attachmentId": "igeOEpKp4ygW", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "List View_image.png" + } + ] + } + ] + }, { "isClone": false, "noteId": "BgmBlOIl72jZ", @@ -9312,7 +10339,7 @@ "BgmBlOIl72jZ" ], "title": "Troubleshooting", - "notePosition": 250, + "notePosition": 260, "prefix": null, "isExpanded": false, "type": "text", @@ -9394,7 +10421,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "reporting-issues", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-bug-alt", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Reporting issues.md", "attachments": [] @@ -9434,6 +10476,13 @@ "value": "anonymized-database", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-low-vision", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -9557,6 +10606,13 @@ "value": "bx bx-server", "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "backend-logs", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -9585,6 +10641,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 +10694,20 @@ "value": "ud6MShXL4WpO", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "sync-timeout", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-error", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -9651,7 +10728,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "refreshing-app", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-refresh", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Refreshing the application.md", "attachments": [] @@ -9666,7 +10758,7 @@ "pKK96zzmvBGf" ], "title": "Theme development", - "notePosition": 260, + "notePosition": 270, "prefix": null, "isExpanded": false, "type": "text", @@ -9678,6 +10770,13 @@ "value": "bx bx-palette", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "theme-development", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -9705,6 +10804,20 @@ "value": "WFGzWeUK6arS", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "creating-custom-theme", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-color", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -9774,7 +10887,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "customize-next-theme", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-news", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Customize the Next theme.md", "attachments": [ @@ -9809,6 +10937,20 @@ "value": "d3fAXQ2diepH", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "reference", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-book-open", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -9850,6 +10992,20 @@ "value": "zP3PMqaG71Ct", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "custom-appcss", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-file-css", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -9899,7 +11055,7 @@ "tC7s2alapj8V" ], "title": "Advanced Usage", - "notePosition": 320, + "notePosition": 330, "prefix": null, "isExpanded": false, "type": "text", @@ -9911,6 +11067,13 @@ "value": "bx bx-rocket", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "advanced-usage", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -10235,6 +11398,13 @@ "value": "bx bx-hash", "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "labels", + "isInheritable": false, + "position": 320 } ], "format": "markdown", @@ -10326,6 +11496,13 @@ "value": "bx bx-transfer", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "relations", + "isInheritable": false, + "position": 100 } ], "format": "markdown", @@ -10581,24 +11758,31 @@ { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "Cq5X6iKQop6R", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "bdUJEHsAPYQR", + "value": "hrZ1D00cLbal", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "iRwzGnHPzonm", + "value": "bdUJEHsAPYQR", "isInheritable": false, "position": 30 }, + { + "type": "relation", + "name": "internalLink", + "value": "iRwzGnHPzonm", + "isInheritable": false, + "position": 40 + }, { "type": "label", "name": "shareAlias", @@ -10765,24 +11949,52 @@ { "type": "relation", "name": "internalLink", - "value": "bwZpz2ajCEwO", + "value": "wX4HbRucYSDD", "isInheritable": false, "position": 170 }, { "type": "relation", "name": "internalLink", - "value": "Wy267RK4M69c", + "value": "ycBFjKrrwE9p", "isInheritable": false, "position": 180 }, { "type": "relation", "name": "internalLink", - "value": "Qjt68inQ2bRj", + "value": "bwZpz2ajCEwO", "isInheritable": false, "position": 190 }, + { + "type": "relation", + "name": "internalLink", + "value": "Wy267RK4M69c", + "isInheritable": false, + "position": 200 + }, + { + "type": "relation", + "name": "internalLink", + "value": "eIg8jdvaoNNd", + "isInheritable": false, + "position": 210 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 220 + }, + { + "type": "relation", + "name": "internalLink", + "value": "Qjt68inQ2bRj", + "isInheritable": false, + "position": 230 + }, { "type": "label", "name": "shareAlias", @@ -10835,7 +12047,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "serving-raw", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-code", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Serving directly the content o.md", "attachments": [ @@ -10856,6 +12083,90 @@ "dataFileName": "1_Serving directly the conte.png" } ] + }, + { + "isClone": false, + "noteId": "ycBFjKrrwE9p", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "R9pX4DGra2Vt", + "ycBFjKrrwE9p" + ], + "title": "Exporting static 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": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "pgxEVkzLl1OP", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-file-html", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "static-html", + "isInheritable": false, + "position": 50 + } + ], + "format": "markdown", + "dataFileName": "Exporting static HTML for web .md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "sLIJ6f1dkJYW", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "R9pX4DGra2Vt", + "sLIJ6f1dkJYW" + ], + "title": "Reverse proxy configuration", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "reverse-proxy", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-world", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "Reverse proxy configuration.md", + "attachments": [] } ] }, @@ -10929,6 +12240,13 @@ "value": "advanced-showcases", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-component", + "isInheritable": false, + "position": 80 } ], "format": "markdown", @@ -11108,6 +12426,13 @@ "value": "weight-tracker", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-line-chart", + "isInheritable": false, + "position": 90 } ], "format": "markdown", @@ -11295,6 +12620,13 @@ "value": "custom-request-handler", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-globe", + "isInheritable": false, + "position": 60 } ], "format": "markdown", @@ -11315,7 +12647,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "custom-resource-providers", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-file-plus", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Custom Resource Providers.md", "attachments": [] @@ -11335,12 +12682,26 @@ "type": "text", "mime": "text/markdown", "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "9qPsTWBorUhQ", + "isInheritable": false, + "position": 10 + }, { "type": "label", "name": "shareAlias", "value": "etapi", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-extension", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -11367,9 +12728,16 @@ { "type": "label", "name": "webViewSrc", - "value": "/etapi/docs", + "value": "/rest-api/etapi/", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "api-reference", + "isInheritable": false, + "position": 20 } ], "dataFileName": "API Reference.dat", @@ -11419,6 +12787,13 @@ "value": "default-note-title", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-edit-alt", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -11517,6 +12892,20 @@ "value": "tAassRL4RSQL", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "manual-editing", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-edit", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -11570,6 +12959,13 @@ "value": "bx bx-data", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "sql-console", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -11668,6 +13064,13 @@ "value": "bx bx-package", "isInheritable": false, "position": 110 + }, + { + "type": "label", + "name": "shareAlias", + "value": "demo-notes", + "isInheritable": false, + "position": 120 } ], "format": "markdown", @@ -11704,6 +13107,13 @@ "value": "configuration", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-cog", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -11733,6 +13143,20 @@ "value": "cbkrhQjrkKrh", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "trilium-instance", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-windows", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -11754,7 +13178,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "cors", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-lock", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Cross-Origin Resource Sharing .md", "attachments": [] @@ -11824,6 +13263,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 +13383,13 @@ "value": "bx bx-code", "isInheritable": false, "position": 120 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-source", + "isInheritable": false, + "position": 130 } ], "format": "markdown", @@ -11977,9 +13430,16 @@ { "type": "label", "name": "iconClass", - "value": "bx bxs-component", + "value": "bx bx-pyramid", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "technologies", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -12044,6 +13504,20 @@ "value": "NwBbFdNZ9h7O", "isInheritable": false, "position": 60 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ckeditor", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-file", + "isInheritable": false, + "position": 80 } ], "format": "markdown", @@ -12072,6 +13546,20 @@ "value": "gBbsAeiuUxI5", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "mindelixir", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-sitemap", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -12100,6 +13588,20 @@ "value": "grjYqerjn243", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "excalidraw", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-pen", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -12128,6 +13630,20 @@ "value": "81SGnPGMk7Xc", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "leaflet", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-map-alt", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -12164,6 +13680,13 @@ "value": "bx bx-hash", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "note-id", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12184,7 +13707,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "internal-api", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-component", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "attachments": [], "dirFileName": "Internal API", @@ -12208,9 +13746,16 @@ { "type": "label", "name": "webViewSrc", - "value": "/api/docs", + "value": "/rest-api/internal/", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "api-reference", + "isInheritable": false, + "position": 20 } ], "dataFileName": "API Reference.dat", @@ -12435,6 +13980,13 @@ "value": "bx bx-hide", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "hidden-notes", + "isInheritable": false, + "position": 290 } ], "format": "markdown", @@ -12478,6 +14030,13 @@ "value": "bx bxs-data", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "metrics", + "isInheritable": false, + "position": 20 } ], "format": "markdown", @@ -12530,58 +14089,78 @@ "attachments": [] } ] - } - ] - }, - { - "isClone": false, - "noteId": "LMAv4Uy3Wk6J", - "notePath": [ - "pOsGYCXsbNQG", - "LMAv4Uy3Wk6J" - ], - "title": "AI", - "notePosition": 330, - "prefix": null, - "isExpanded": false, - "type": "book", - "mime": "", - "attributes": [ - { - "type": "label", - "name": "iconClass", - "value": "bx bx-bot", - "isInheritable": false, - "position": 10 }, - { - "type": "label", - "name": "viewType", - "value": "list", - "isInheritable": false, - "position": 20 - }, - { - "type": "label", - "name": "expanded", - "value": "", - "isInheritable": false, - "position": 30 - } - ], - "attachments": [], - "dirFileName": "AI", - "children": [ { "isClone": false, - "noteId": "GBBMSlVSOIGP", + "noteId": "64ZTlUPgEPtW", "notePath": [ "pOsGYCXsbNQG", - "LMAv4Uy3Wk6J", - "GBBMSlVSOIGP" + "tC7s2alapj8V", + "64ZTlUPgEPtW" ], - "title": "Introduction", - "notePosition": 10, + "title": "Safe mode", + "notePosition": 250, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "safe-mode", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-virus-block", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Safe mode.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "HAIOFBoYIIdO", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "HAIOFBoYIIdO" + ], + "title": "Nightly release", + "notePosition": 260, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "iconClass", + "value": "bx bx-moon", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Nightly release.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "ZmT9ln8XJX2o", + "notePath": [ + "pOsGYCXsbNQG", + "tC7s2alapj8V", + "ZmT9ln8XJX2o" + ], + "title": "Read-only database", + "notePosition": 270, "prefix": null, "isExpanded": false, "type": "text", @@ -12590,106 +14169,205 @@ { "type": "relation", "name": "internalLink", - "value": "vvUCN7FDkq7G", + "value": "Gzjqa934BdH4", "isInheritable": false, "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "wy8So3yZZlH9", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R9pX4DGra2Vt", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "eIg8jdvaoNNd", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GTwFsgaA0lCt", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "KSZ04uQ2D1St", + "isInheritable": false, + "position": 60 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-book-reader", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "read-only-db", + "isInheritable": false, + "position": 40 } ], "format": "markdown", - "dataFileName": "Introduction.md", - "attachments": [ - { - "attachmentId": "4UpXwA3WvbmA", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Introduction_image.png" - }, - { - "attachmentId": "8Bn5IsE3Bv1k", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "1_Introduction_image.png" - }, - { - "attachmentId": "ABN1rFIIJ8no", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "2_Introduction_image.png" - }, - { - "attachmentId": "CK3z7sYw63XT", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "3_Introduction_image.png" - }, - { - "attachmentId": "E6Y09N2t7vyA", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "4_Introduction_image.png" - }, - { - "attachmentId": "JlIPeTtl5wlV", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "5_Introduction_image.png" - }, - { - "attachmentId": "ur4TDJeRqpUC", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "6_Introduction_image.png" - }, - { - "attachmentId": "UTH83LkQEA8u", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "7_Introduction_image.png" - }, - { - "attachmentId": "V68TCCTUdyl7", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "8_Introduction_image.png" - }, - { - "attachmentId": "YbWoNq58T9kB", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "9_Introduction_image.png" - } - ] + "dataFileName": "Read-only database.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "GBBMSlVSOIGP", + "notePath": [ + "pOsGYCXsbNQG", + "GBBMSlVSOIGP" + ], + "title": "AI", + "notePosition": 340, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "vvUCN7FDkq7G", + "isInheritable": false, + "position": 10 }, + { + "type": "relation", + "name": "internalLink", + "value": "xYmIYSP6wE3F", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "llm", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-bot", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "AI.md", + "attachments": [ + { + "attachmentId": "4UpXwA3WvbmA", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "AI_image.png" + }, + { + "attachmentId": "8Bn5IsE3Bv1k", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "1_AI_image.png" + }, + { + "attachmentId": "ABN1rFIIJ8no", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "2_AI_image.png" + }, + { + "attachmentId": "CK3z7sYw63XT", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "3_AI_image.png" + }, + { + "attachmentId": "E6Y09N2t7vyA", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "4_AI_image.png" + }, + { + "attachmentId": "JlIPeTtl5wlV", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "5_AI_image.png" + }, + { + "attachmentId": "ur4TDJeRqpUC", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "6_AI_image.png" + }, + { + "attachmentId": "UTH83LkQEA8u", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "7_AI_image.png" + }, + { + "attachmentId": "V68TCCTUdyl7", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "8_AI_image.png" + }, + { + "attachmentId": "YbWoNq58T9kB", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "9_AI_image.png" + } + ], + "dirFileName": "AI", + "children": [ { "isClone": false, "noteId": "WkM7gsEUyCXs", "notePath": [ "pOsGYCXsbNQG", - "LMAv4Uy3Wk6J", + "GBBMSlVSOIGP", "WkM7gsEUyCXs" ], - "title": "AI Provider Information", - "notePosition": 20, + "title": "Providers", + "notePosition": 10, "prefix": null, "isExpanded": false, "type": "text", @@ -12722,10 +14400,24 @@ "value": "list", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "providers", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-select-multiple", + "isInheritable": false, + "position": 50 } ], "format": "markdown", - "dataFileName": "AI Provider Information.md", + "dataFileName": "Providers.md", "attachments": [ { "attachmentId": "BNN9Vv3JEf2X", @@ -12733,7 +14425,7 @@ "role": "image", "mime": "image/png", "position": 10, - "dataFileName": "AI Provider Information_im.png" + "dataFileName": "Providers_image.png" }, { "attachmentId": "diIollN3KEbn", @@ -12741,17 +14433,17 @@ "role": "image", "mime": "image/png", "position": 10, - "dataFileName": "1_AI Provider Information_im.png" + "dataFileName": "1_Providers_image.png" } ], - "dirFileName": "AI Provider Information", + "dirFileName": "Providers", "children": [ { "isClone": false, "noteId": "7EdTxPADv95W", "notePath": [ "pOsGYCXsbNQG", - "LMAv4Uy3Wk6J", + "GBBMSlVSOIGP", "WkM7gsEUyCXs", "7EdTxPADv95W" ], @@ -12775,6 +14467,20 @@ "value": "", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "ollama", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-message-dots", + "isInheritable": false, + "position": 40 } ], "attachments": [], @@ -12785,7 +14491,7 @@ "noteId": "vvUCN7FDkq7G", "notePath": [ "pOsGYCXsbNQG", - "LMAv4Uy3Wk6J", + "GBBMSlVSOIGP", "WkM7gsEUyCXs", "7EdTxPADv95W", "vvUCN7FDkq7G" @@ -12796,7 +14502,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": [ @@ -12857,7 +14571,7 @@ "noteId": "ZavFigBX9AwP", "notePath": [ "pOsGYCXsbNQG", - "LMAv4Uy3Wk6J", + "GBBMSlVSOIGP", "WkM7gsEUyCXs", "ZavFigBX9AwP" ], @@ -12867,7 +14581,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "openai", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-message-dots", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "OpenAI.md", "attachments": [] @@ -12877,7 +14606,7 @@ "noteId": "e0lkirXEiSNc", "notePath": [ "pOsGYCXsbNQG", - "LMAv4Uy3Wk6J", + "GBBMSlVSOIGP", "WkM7gsEUyCXs", "e0lkirXEiSNc" ], @@ -12887,7 +14616,22 @@ "isExpanded": false, "type": "text", "mime": "text/html", - "attributes": [], + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "anthropic", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-message-dots", + "isInheritable": false, + "position": 30 + } + ], "format": "markdown", "dataFileName": "Anthropic.md", "attachments": [] @@ -12904,7 +14648,7 @@ "CdNpE2pqjmI6" ], "title": "Scripting", - "notePosition": 340, + "notePosition": 360, "prefix": null, "isExpanded": false, "type": "text", @@ -12997,21 +14741,21 @@ { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "GLks18SNjxmC", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "SynTBQiBsdYJ", + "value": "zEY4DaJG4YT5", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "GLks18SNjxmC", + "value": "SynTBQiBsdYJ", "isInheritable": false, "position": 30 }, @@ -13021,163 +14765,427 @@ "value": "frontend-basics", "isInheritable": false, "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-window", + "isInheritable": false, + "position": 40 } ], "format": "markdown", "dataFileName": "Frontend Basics.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "es8OU2GuguFU", - "notePath": [ - "pOsGYCXsbNQG", - "CdNpE2pqjmI6", - "es8OU2GuguFU" - ], - "title": "Examples", - "notePosition": 50, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", "attachments": [], - "dirFileName": "Examples", + "dirFileName": "Frontend Basics", "children": [ { "isClone": false, - "noteId": "TjLYAo3JMO8X", + "noteId": "MgibgPcfeuGz", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "es8OU2GuguFU", - "TjLYAo3JMO8X" + "yIhgI5H7A2Sm", + "MgibgPcfeuGz" ], - "title": "\"New Task\" launcher button", + "title": "Custom Widgets", "notePosition": 10, "prefix": null, "isExpanded": false, "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "custom-widget", + "isInheritable": false, + "position": 20 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bxs-widget", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Custom Widgets.md", + "attachments": [], + "dirFileName": "Custom Widgets", + "children": [ + { + "isClone": false, + "noteId": "YNxAqkI5Kg1M", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "YNxAqkI5Kg1M" + ], + "title": "Word count widget", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "6tZeKvSHEUiB", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s8alTXmpFR61", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "shareAlias", + "value": "word-count", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "dataFileName": "Word count widget.md", + "attachments": [ + { + "attachmentId": "JhM9NWfebzPi", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Word count widget_image.png" + } + ] + }, + { + "isClone": false, + "noteId": "SynTBQiBsdYJ", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "SynTBQiBsdYJ" + ], + "title": "Widget Basics", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/markdown", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "BFs8mudNFgCS", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "GLks18SNjxmC", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s8alTXmpFR61", + "isInheritable": false, + "position": 40 + }, + { + "type": "label", + "name": "shareAlias", + "value": "widget-basics", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Widget Basics.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "M8IppdwVHSjG", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "M8IppdwVHSjG" + ], + "title": "Right pane widget", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "right-pane-widget", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Right pane widget.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "VqGQnnPGnqAU", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "MgibgPcfeuGz", + "VqGQnnPGnqAU" + ], + "title": "CSS", + "notePosition": 40, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "css", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "CSS.md", + "attachments": [] + } + ] + }, + { + "isClone": false, + "noteId": "es8OU2GuguFU", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "es8OU2GuguFU" + ], + "title": "Examples", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", "mime": "text/html", "attributes": [ { - "type": "relation", - "name": "internalLink", - "value": "xYjQUYhpbUEW", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "xYmIYSP6wE3F", + "type": "label", + "name": "shareAlias", + "value": "examples", "isInheritable": false, "position": 20 }, - { - "type": "relation", - "name": "internalLink", - "value": "6f9hih2hXXZk", - "isInheritable": false, - "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "zEY4DaJG4YT5", - "isInheritable": false, - "position": 40 - }, - { - "type": "relation", - "name": "internalLink", - "value": "m1lbrzyKDaRB", - "isInheritable": false, - "position": 50 - }, - { - "type": "relation", - "name": "internalLink", - "value": "s8alTXmpFR61", - "isInheritable": false, - "position": 60 - }, - { - "type": "relation", - "name": "internalLink", - "value": "yIhgI5H7A2Sm", - "isInheritable": false, - "position": 70 - }, { "type": "label", "name": "iconClass", - "value": "bx bx-task", + "value": "bx bx-code-alt", "isInheritable": false, - "position": 80 + "position": 30 } ], "format": "markdown", - "dataFileName": "New Task launcher button.md", - "attachments": [ + "attachments": [], + "dirFileName": "Examples", + "children": [ { - "attachmentId": "9C2JA6tdtRpN", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "New Task launcher button_i.png" - } - ] - }, - { - "isClone": false, - "noteId": "7kZPMD0uFwkH", - "notePath": [ - "pOsGYCXsbNQG", - "CdNpE2pqjmI6", - "es8OU2GuguFU", - "7kZPMD0uFwkH" - ], - "title": "Downloading responses from Google Forms", - "notePosition": 20, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Downloading responses from Goo.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "DL92EjAaXT26", - "notePath": [ - "pOsGYCXsbNQG", - "CdNpE2pqjmI6", - "es8OU2GuguFU", - "DL92EjAaXT26" - ], - "title": "Using promoted attributes to configure scripts", - "notePosition": 30, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/html", - "attributes": [], - "format": "markdown", - "dataFileName": "Using promoted attributes to c.md", - "attachments": [ + "isClone": false, + "noteId": "TjLYAo3JMO8X", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "es8OU2GuguFU", + "TjLYAo3JMO8X" + ], + "title": "\"New Task\" launcher button", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "xYjQUYhpbUEW", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "xYmIYSP6wE3F", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "zEY4DaJG4YT5", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "yIhgI5H7A2Sm", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "m1lbrzyKDaRB", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "s8alTXmpFR61", + "isInheritable": false, + "position": 70 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-task", + "isInheritable": false, + "position": 80 + }, + { + "type": "label", + "name": "shareAlias", + "value": "new-task-button", + "isInheritable": false, + "position": 90 + } + ], + "format": "markdown", + "dataFileName": "New Task launcher button.md", + "attachments": [ + { + "attachmentId": "9C2JA6tdtRpN", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "New Task launcher button_i.png" + } + ] + }, { - "attachmentId": "7P3jzVEa1mk7", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Using promoted attributes .png" + "isClone": false, + "noteId": "7kZPMD0uFwkH", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "es8OU2GuguFU", + "7kZPMD0uFwkH" + ], + "title": "Downloading responses from Google Forms", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "responses-from-google-forms", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Downloading responses from Goo.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "DL92EjAaXT26", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "yIhgI5H7A2Sm", + "es8OU2GuguFU", + "DL92EjAaXT26" + ], + "title": "Using promoted attributes to configure scripts", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "promoted-attributes-config", + "isInheritable": false, + "position": 20 + } + ], + "format": "markdown", + "dataFileName": "Using promoted attributes to c.md", + "attachments": [ + { + "attachmentId": "7P3jzVEa1mk7", + "title": "image.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Using promoted attributes .png" + } + ] } ] } @@ -13185,97 +15193,48 @@ }, { "isClone": false, - "noteId": "GPERMystNGTB", + "noteId": "SPirpZypehBG", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "GPERMystNGTB" + "SPirpZypehBG" ], - "title": "Events", - "notePosition": 70, + "title": "Backend scripts", + "notePosition": 30, "prefix": null, "isExpanded": false, "type": "text", - "mime": "text/markdown", + "mime": "text/html", "attributes": [ { - "type": "relation", - "name": "internalLink", - "value": "CdNpE2pqjmI6", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "c5xB8m4g2IY6", - "isInheritable": false, - "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "zEY4DaJG4YT5", + "type": "label", + "name": "shareAlias", + "value": "backend-basics", "isInheritable": false, "position": 30 }, - { - "type": "label", - "name": "shareAlias", - "value": "events", - "isInheritable": false, - "position": 10 - }, { "type": "label", "name": "iconClass", - "value": "bx bx-rss", + "value": "bx bx-server", "isInheritable": false, - "position": 20 + "position": 40 } ], "format": "markdown", - "dataFileName": "Events.md", - "attachments": [] - }, - { - "isClone": false, - "noteId": "MgibgPcfeuGz", - "notePath": [ - "pOsGYCXsbNQG", - "CdNpE2pqjmI6", - "MgibgPcfeuGz" - ], - "title": "Custom Widgets", - "notePosition": 80, - "prefix": null, - "isExpanded": false, - "type": "text", - "mime": "text/markdown", - "attributes": [ - { - "type": "label", - "name": "shareAlias", - "value": "custom-widget", - "isInheritable": false, - "position": 20 - } - ], - "format": "markdown", - "dataFileName": "Custom Widgets.md", "attachments": [], - "dirFileName": "Custom Widgets", + "dirFileName": "Backend scripts", "children": [ { "isClone": false, - "noteId": "YNxAqkI5Kg1M", + "noteId": "fZ2IGYFXjkEy", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "MgibgPcfeuGz", - "YNxAqkI5Kg1M" + "SPirpZypehBG", + "fZ2IGYFXjkEy" ], - "title": "Word count widget", + "title": "Server-side imports", "notePosition": 10, "prefix": null, "isExpanded": false, @@ -13283,50 +15242,27 @@ "mime": "text/html", "attributes": [ { - "type": "relation", - "name": "internalLink", - "value": "6tZeKvSHEUiB", - "isInheritable": false, - "position": 10 - }, - { - "type": "relation", - "name": "internalLink", - "value": "6f9hih2hXXZk", + "type": "label", + "name": "shareAlias", + "value": "server-imports", "isInheritable": false, "position": 20 - }, - { - "type": "relation", - "name": "internalLink", - "value": "s8alTXmpFR61", - "isInheritable": false, - "position": 30 } ], "format": "markdown", - "dataFileName": "Word count widget.md", - "attachments": [ - { - "attachmentId": "JhM9NWfebzPi", - "title": "image.png", - "role": "image", - "mime": "image/png", - "position": 10, - "dataFileName": "Word count widget_image.png" - } - ] + "dataFileName": "Server-side imports.md", + "attachments": [] }, { "isClone": false, - "noteId": "SynTBQiBsdYJ", + "noteId": "GPERMystNGTB", "notePath": [ "pOsGYCXsbNQG", "CdNpE2pqjmI6", - "MgibgPcfeuGz", - "SynTBQiBsdYJ" + "SPirpZypehBG", + "GPERMystNGTB" ], - "title": "Widget Basics", + "title": "Events", "notePosition": 20, "prefix": null, "isExpanded": false, @@ -13336,34 +15272,41 @@ { "type": "relation", "name": "internalLink", - "value": "zEY4DaJG4YT5", + "value": "CdNpE2pqjmI6", "isInheritable": false, "position": 10 }, { "type": "relation", "name": "internalLink", - "value": "BFs8mudNFgCS", + "value": "c5xB8m4g2IY6", "isInheritable": false, "position": 20 }, { "type": "relation", "name": "internalLink", - "value": "GLks18SNjxmC", + "value": "zEY4DaJG4YT5", "isInheritable": false, "position": 30 }, { "type": "label", "name": "shareAlias", - "value": "widget-basics", + "value": "events", + "isInheritable": false, + "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-rss", "isInheritable": false, "position": 20 } ], "format": "markdown", - "dataFileName": "Widget Basics.md", + "dataFileName": "Events.md", "attachments": [] } ] @@ -13377,7 +15320,7 @@ "GLks18SNjxmC" ], "title": "Script API", - "notePosition": 90, + "notePosition": 100, "prefix": null, "isExpanded": false, "type": "text", @@ -13410,6 +15353,13 @@ "value": "script-api", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-code-curly", + "isInheritable": false, + "position": 40 } ], "format": "markdown", @@ -13436,9 +15386,16 @@ { "type": "label", "name": "webViewSrc", - "value": "https://triliumnext.github.io/Notes/Script%20API/interfaces/Frontend_Script_API.Api.html", + "value": "/script-api/frontend", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "frontend-api", + "isInheritable": false, + "position": 20 } ], "attachments": [], @@ -13464,9 +15421,16 @@ { "type": "label", "name": "webViewSrc", - "value": "https://triliumnext.github.io/Notes/Script%20API/classes/Frontend_Script_API.FNote.html", + "value": "/script-api/frontend/interfaces/FNote.html", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "fnote", + "isInheritable": false, + "position": 20 } ], "dataFileName": "FNote.dat", @@ -13493,9 +15457,16 @@ { "type": "label", "name": "webViewSrc", - "value": "https://triliumnext.github.io/Notes/Script%20API/interfaces/Backend_Script_API.Api.html", + "value": "/script-api/backend", "isInheritable": false, "position": 10 + }, + { + "type": "label", + "name": "shareAlias", + "value": "backend-api", + "isInheritable": false, + "position": 20 } ], "dataFileName": "Backend API.dat", @@ -13512,7 +15483,7 @@ "vElnKeDNPSVl" ], "title": "Logging", - "notePosition": 100, + "notePosition": 110, "prefix": null, "isExpanded": false, "type": "text", @@ -13531,6 +15502,13 @@ "value": "bx bx-terminal", "isInheritable": false, "position": 20 + }, + { + "type": "label", + "name": "shareAlias", + "value": "logging", + "isInheritable": false, + "position": 30 } ], "format": "markdown", @@ -13547,6 +15525,167 @@ ] } ] + }, + { + "isClone": false, + "noteId": "Fm0j45KqyHpU", + "notePath": [ + "pOsGYCXsbNQG", + "Fm0j45KqyHpU" + ], + "title": "Miscellaneous", + "notePosition": 370, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "misc", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "iconClass", + "value": "bx bx-info-circle", + "isInheritable": false, + "position": 40 + } + ], + "format": "markdown", + "attachments": [], + "dirFileName": "Miscellaneous", + "children": [ + { + "isClone": false, + "noteId": "WFbFXrgnDyyU", + "notePath": [ + "pOsGYCXsbNQG", + "Fm0j45KqyHpU", + "WFbFXrgnDyyU" + ], + "title": "Privacy Policy", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "privacy-policy", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "Privacy Policy.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "NcsmUYZRWEW4", + "notePath": [ + "pOsGYCXsbNQG", + "Fm0j45KqyHpU", + "NcsmUYZRWEW4" + ], + "title": "Patterns of personal knowledge", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "relation", + "name": "internalLink", + "value": "xYjQUYhpbUEW", + "isInheritable": false, + "position": 10 + }, + { + "type": "relation", + "name": "internalLink", + "value": "IakOLONlIfGI", + "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "internalLink", + "value": "R7abl2fc6Mxi", + "isInheritable": false, + "position": 30 + }, + { + "type": "relation", + "name": "internalLink", + "value": "bwg0e8ewQMak", + "isInheritable": false, + "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "OFXdgB2nNk1F", + "isInheritable": false, + "position": 50 + }, + { + "type": "relation", + "name": "internalLink", + "value": "cbkrhQjrkKrh", + "isInheritable": false, + "position": 60 + }, + { + "type": "relation", + "name": "internalLink", + "value": "CdNpE2pqjmI6", + "isInheritable": false, + "position": 70 + }, + { + "type": "relation", + "name": "internalLink", + "value": "6f9hih2hXXZk", + "isInheritable": false, + "position": 80 + }, + { + "type": "relation", + "name": "internalLink", + "value": "iRwzGnHPzonm", + "isInheritable": false, + "position": 90 + }, + { + "type": "label", + "name": "shareAlias", + "value": "patterns-of-personal-knowledge", + "isInheritable": false, + "position": 120 + } + ], + "format": "markdown", + "dataFileName": "Patterns of personal knowledge.md", + "attachments": [ + { + "attachmentId": "amErpd38VEdQ", + "title": "relation-map-family.png", + "role": "image", + "mime": "image/png", + "position": 10, + "dataFileName": "Patterns of personal knowl.png" + } + ] + } + ] } ] } diff --git a/docs/User Guide/User Guide.md b/docs/User Guide/User Guide.md index 509f4b7b5..3e5537135 100644 --- a/docs/User Guide/User Guide.md +++ b/docs/User Guide/User Guide.md @@ -1,2 +1,25 @@ # 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. + +> [!TIP] +> The same documentation can be accessed locally from within the Trilium Notes application by pressing F1. + +## Getting started + +1. See Quick Start. +2. Go through Basic Concepts and Features. +3. Understand Notes. +4. Browse through Collections. + +## Quick links + +* Desktop Installation +* Server Installation +* Frontend API or Backend API +* [ETAPI reference](User%20Guide/Advanced%20Usage/ETAPI%20\(REST%20API\)/API%20Reference.dat) + +## External links + +* The [Trilium Notes website](https://triliumnotes.org/), for a quick presentation of the application. +* [Developer Guide](https://docs.triliumnotes.org/developer-guide/), to understand the architecture and processes behind the development of Trilium Notes. +* [GitHub Repository (TriliumNext/Trilium)](https://github.com/TriliumNext/Trilium/) \ No newline at end of file diff --git a/docs/User Guide/User Guide/AI/1_Introduction_image.png b/docs/User Guide/User Guide/1_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/1_Introduction_image.png rename to docs/User Guide/User Guide/1_AI_image.png diff --git a/docs/User Guide/User Guide/AI/2_Introduction_image.png b/docs/User Guide/User Guide/2_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/2_Introduction_image.png rename to docs/User Guide/User Guide/2_AI_image.png diff --git a/docs/User Guide/User Guide/AI/3_Introduction_image.png b/docs/User Guide/User Guide/3_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/3_Introduction_image.png rename to docs/User Guide/User Guide/3_AI_image.png diff --git a/docs/User Guide/User Guide/AI/4_Introduction_image.png b/docs/User Guide/User Guide/4_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/4_Introduction_image.png rename to docs/User Guide/User Guide/4_AI_image.png diff --git a/docs/User Guide/User Guide/AI/5_Introduction_image.png b/docs/User Guide/User Guide/5_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/5_Introduction_image.png rename to docs/User Guide/User Guide/5_AI_image.png diff --git a/docs/User Guide/User Guide/AI/6_Introduction_image.png b/docs/User Guide/User Guide/6_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/6_Introduction_image.png rename to docs/User Guide/User Guide/6_AI_image.png diff --git a/docs/User Guide/User Guide/AI/7_Introduction_image.png b/docs/User Guide/User Guide/7_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/7_Introduction_image.png rename to docs/User Guide/User Guide/7_AI_image.png diff --git a/docs/User Guide/User Guide/AI/8_Introduction_image.png b/docs/User Guide/User Guide/8_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/8_Introduction_image.png rename to docs/User Guide/User Guide/8_AI_image.png diff --git a/docs/User Guide/User Guide/AI/9_Introduction_image.png b/docs/User Guide/User Guide/9_AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/9_Introduction_image.png rename to docs/User Guide/User Guide/9_AI_image.png diff --git a/docs/User Guide/User Guide/AI/Introduction.md b/docs/User Guide/User Guide/AI.md similarity index 71% rename from docs/User Guide/User Guide/AI/Introduction.md rename to docs/User Guide/User Guide/AI.md index 5591e0834..f5818d915 100644 --- a/docs/User Guide/User Guide/AI/Introduction.md +++ b/docs/User Guide/User Guide/AI.md @@ -1,5 +1,5 @@ -# Introduction -
An example chat with an LLM
+# AI +
An example chat with an LLM
The AI / LLM features within Trilium Notes are designed to allow you to interact with your Notes in a variety of ways, using as many of the major providers as we can support.  @@ -7,11 +7,11 @@ In addition to being able to send chats to LLM providers such as OpenAI, Anthrop The quickest way to get started is to navigate to the “AI/LLM” settings: -
+
Enable the feature: -
+
## Embeddings @@ -19,25 +19,25 @@ Enable the feature: You will then need to set up the AI “provider” that you wish to use to create the embeddings for your Notes. Currently OpenAI, Voyage AI, and Ollama are supported providers for embedding generation. -In the following example, we're going to use our self-hosted Ollama instance to create the embeddings for our Notes. You can see additional documentation about installing your own Ollama locally in Installing Ollama. +In the following example, we're going to use our self-hosted Ollama instance to create the embeddings for our Notes. You can see additional documentation about installing your own Ollama locally in Installing Ollama. -To see what embedding models Ollama has available, you can check out [this search](https://ollama.com/search?c=embedding)on their website, and then `pull` whichever one you want to try out. As of 4/15/25, my personal favorite is `mxbai-embed-large`. +To see what embedding models Ollama has available, you can check out [this search](https://ollama.com/search?c=embedding) on their website, and then `pull` whichever one you want to try out. A popular choice is `mxbai-embed-large`. First, we'll need to select the Ollama provider from the tabs of providers, then we will enter in the Base URL for our Ollama. Since our Ollama is running on our local machine, our Base URL is `http://localhost:11434`. We will then hit the “refresh” button to have it fetch our models: -
+
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). @@ -74,16 +74,16 @@ These are the tools that currently exist, and will certainly be updated to be mo 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. ## Overview -Now that you know about embeddings and tools, you can just go ahead and use the “Chat with Notes” button, where you can go ahead and start chatting!: +To start, simply press the _Chat with Notes_ button in the Launch Bar. -
+
-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: +If you don't see the button in the Launch Bar, you might need to move it from the _Available Launchers_ section to the _Visible Launchers_ section: -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/User Guide/User Guide/AI/1_AI Provider Information_im.png b/docs/User Guide/User Guide/AI/1_Providers_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/1_AI Provider Information_im.png rename to docs/User Guide/User Guide/AI/1_Providers_image.png diff --git a/docs/User Guide/User Guide/AI/AI Provider Information.md b/docs/User Guide/User Guide/AI/AI Provider Information.md deleted file mode 100644 index 333dcd184..000000000 --- a/docs/User Guide/User Guide/AI/AI Provider Information.md +++ /dev/null @@ -1,15 +0,0 @@ -# AI Provider Information -Currently, we support the following providers: - -* Ollama -* OpenAI -* Anthropic -* Voyage AI - -To set your preferred chat model, you'll want to enter the provider's name here: - -
- -And to set your preferred embedding provider: - -
\ No newline at end of file diff --git a/docs/User Guide/User Guide/AI/Providers.md b/docs/User Guide/User Guide/AI/Providers.md new file mode 100644 index 000000000..4b2fe103b --- /dev/null +++ b/docs/User Guide/User Guide/AI/Providers.md @@ -0,0 +1,15 @@ +# Providers +Currently, we support the following providers: + +* Ollama +* OpenAI +* Anthropic +* Voyage AI + +To set your preferred chat model, you'll want to enter the provider's name here: + +
+ +And to set your preferred embedding provider: + +
\ No newline at end of file diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Anthropic.md b/docs/User Guide/User Guide/AI/Providers/Anthropic.md similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Anthropic.md rename to docs/User Guide/User Guide/AI/Providers/Anthropic.md diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Ollama/1_Installing Ollama_image.png b/docs/User Guide/User Guide/AI/Providers/Ollama/1_Installing Ollama_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Ollama/1_Installing Ollama_image.png rename to docs/User Guide/User Guide/AI/Providers/Ollama/1_Installing Ollama_image.png diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Ollama/2_Installing Ollama_image.png b/docs/User Guide/User Guide/AI/Providers/Ollama/2_Installing Ollama_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Ollama/2_Installing Ollama_image.png rename to docs/User Guide/User Guide/AI/Providers/Ollama/2_Installing Ollama_image.png diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Ollama/3_Installing Ollama_image.png b/docs/User Guide/User Guide/AI/Providers/Ollama/3_Installing Ollama_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Ollama/3_Installing Ollama_image.png rename to docs/User Guide/User Guide/AI/Providers/Ollama/3_Installing Ollama_image.png diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Ollama/4_Installing Ollama_image.png b/docs/User Guide/User Guide/AI/Providers/Ollama/4_Installing Ollama_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Ollama/4_Installing Ollama_image.png rename to docs/User Guide/User Guide/AI/Providers/Ollama/4_Installing Ollama_image.png diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Ollama/5_Installing Ollama_image.png b/docs/User Guide/User Guide/AI/Providers/Ollama/5_Installing Ollama_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Ollama/5_Installing Ollama_image.png rename to docs/User Guide/User Guide/AI/Providers/Ollama/5_Installing Ollama_image.png diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.md b/docs/User Guide/User Guide/AI/Providers/Ollama/Installing Ollama.md similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama.md rename to docs/User Guide/User Guide/AI/Providers/Ollama/Installing Ollama.md diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama_image.png b/docs/User Guide/User Guide/AI/Providers/Ollama/Installing Ollama_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/Ollama/Installing Ollama_image.png rename to docs/User Guide/User Guide/AI/Providers/Ollama/Installing Ollama_image.png diff --git a/docs/User Guide/User Guide/AI/AI Provider Information/OpenAI.md b/docs/User Guide/User Guide/AI/Providers/OpenAI.md similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information/OpenAI.md rename to docs/User Guide/User Guide/AI/Providers/OpenAI.md diff --git a/docs/User Guide/User Guide/AI/AI Provider Information_im.png b/docs/User Guide/User Guide/AI/Providers_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/AI Provider Information_im.png rename to docs/User Guide/User Guide/AI/Providers_image.png diff --git a/docs/User Guide/User Guide/AI/Introduction_image.png b/docs/User Guide/User Guide/AI_image.png similarity index 100% rename from docs/User Guide/User Guide/AI/Introduction_image.png rename to docs/User Guide/User Guide/AI_image.png diff --git a/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md b/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md index 20cf37c5e..13a4a5d94 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md +++ b/docs/User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager.md @@ -15,7 +15,7 @@ New tasks are created in the TODO note which has `~child:template` [relation](.. ### Attributes -Task template defines several [promoted attributes](../Attributes/Promoted%20Attributes.md) - todoDate, doneDate, tags, location. Importantly it also defines `~runOnAttributeChange` relation - [event](../../Scripting/Events.md) handler which is run on attribute change. This [script](../../Scripting.md) handles when e.g. we fill out the doneDate attribute - meaning the task is done and should be moved to "Done" note and removed from TODO, locations and tags. +Task template defines several [promoted attributes](../Attributes/Promoted%20Attributes.md) - todoDate, doneDate, tags, location. Importantly it also defines `~runOnAttributeChange` relation - [event](../../Scripting/Backend%20scripts/Events.md) handler which is run on attribute change. This [script](../../Scripting.md) handles when e.g. we fill out the doneDate attribute - meaning the task is done and should be moved to "Done" note and removed from TODO, locations and tags. ### New task button diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes.md b/docs/User Guide/User Guide/Advanced Usage/Attributes.md index 1cfe040d8..89d397e33 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes.md @@ -3,14 +3,14 @@ In Trilium, attributes are key-value pairs assigned to notes, providing additional metadata or functionality. There are two primary types of attributes: -1. Labels can be used for a variety of purposes, such as storing metadata or configuring the behaviour of notes. Labels are also searchable, enhancing note retrieval. +1. Labels can be used for a variety of purposes, such as storing metadata or configuring the behavior of notes. Labels are also searchable, enhancing note retrieval. For more information, including predefined labels, see Labels. 2. Relations define connections between notes, similar to links. These can be used for metadata and scripting purposes. For more information, including a list of predefined relations, see Relations. -These attributes play a crucial role in organizing, categorising, and enhancing the functionality of notes. +These attributes play a crucial role in organizing, categorizing, and enhancing the functionality of notes. ## Viewing the list of attributes diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md b/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md index 071bbb7cf..cb68dab93 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes/Labels.md @@ -39,4 +39,4 @@ This is a list of labels that Trilium natively supports. > [!TIP] > Some labels presented here end with a `*`. That means that there are multiple labels with the same prefix, consult the specific page linked in the description of that label for more information. -
LabelDescription
disableVersioningDisables automatic creation of Note Revisions for a particular note. Useful for e.g. large, but unimportant notes - e.g. large JS libraries used for scripting.
versioningLimitLimits the maximum number of Note Revisions for a particular note, overriding the global settings.
calendarRootMarks the note which should be used as root for Day Notes. Only one should be marked as such.
archivedHides notes from default search results and dialogs. Archived notes can optionally be hidden in the Note Tree.
excludeFromExportExcludes this note and its children when exporting.
run, runOnInstance, runAtHourSee Events.
disableInclusionScripts with this label won't be included into parent script execution.
sorted

Keeps child notes sorted by title alphabetically.

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

sortDirection

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

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

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

Examples:

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

See Default Note Title for more info.

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

Keeps child notes sorted by title alphabetically.

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

sortDirection

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

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

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

Examples:

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

See Default Note Title for more info.

templateThis note will appear in the selection of available template when creating new note. See Templates for more information.
tocControls the display of the Table of contents for a given note. #toc or #toc=show to always display the table of contents, #toc=false to always hide it.
colordefines color of the note in note tree, links etc. Use any valid CSS color value like 'red' or #a13d5f
Note: this color may be automatically adjusted when displayed to ensure sufficient contrast with the background.
keyboardShortcutDefines a keyboard shortcut which will immediately jump to this note. Example: 'ctrl+alt+e'. Requires frontend reload for the change to take effect.
keepCurrentHoistingOpening this link won't change hoisting even if the note is not displayable in the current hoisted subtree.
executeButtonTitle of the button which will execute the current code note
executeDescriptionLonger description of the current code note displayed together with the execute button
excludeFromNoteMapNotes with this label will be hidden from the Note Map.
newNotesOnTopNew notes will be created at the top of the parent note, not on the bottom.
hideHighlightWidgetHides the Highlights list widget
hideChildrenOverviewHides the Note List for that particular note.
printLandscapeWhen exporting to PDF, changes the orientation of the page to landscape instead of portrait.
printPageSizeWhen exporting to PDF, changes the size of the page. Supported values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
geolocationIndicates the latitude and longitude of a note, to be displayed in a Geo Map.
calendar:*Defines specific options for the Calendar View.
viewTypeSets the view of child notes (e.g. grid or list). See Note List for more information.
\ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md b/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md index 454e7d007..6e1e9aa1f 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md +++ b/docs/User Guide/User Guide/Advanced Usage/Attributes/Relations.md @@ -43,7 +43,7 @@ These relations are supported and used internally by Trilium. | Label | Description | | --- | --- | -| `runOn*` | See Events | +| `runOn*` | See Events | | `template` | note's attributes will be inherited even without a parent-child relationship, note's content and subtree will be added to instance notes if empty. See documentation for details. | | `inherit` | note's attributes will be inherited even without a parent-child relationship. See Templates for a similar concept. See Attribute Inheritance in the documentation. | | `renderNote` | notes of type Render Note will be rendered using a code note (HTML or script) and it is necessary to point using this relation to which note should be rendered | diff --git a/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md b/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md index 52991f136..6d2c1e734 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md +++ b/docs/User Guide/User Guide/Advanced Usage/Custom Request Handler.md @@ -14,7 +14,7 @@ const {secret, title, content} = req.body; if (req.method == 'POST' && secret === 'secret-password') { // notes must be saved somewhere in the tree hierarchy specified by a parent note. // This is defined by a relation from this code note to the "target" parent note - // alternetively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note) + // alternatively you can just use constant noteId for simplicity (get that from "Note Info" dialog of the desired parent note) const targetParentNoteId = api.currentNote.getRelationValue('targetNote'); const {note} = api.createTextNote(targetParentNoteId, title, content); @@ -37,7 +37,7 @@ This script note has also following two attributes: Let's test this by using an HTTP client to send a request: ``` -POST http://my.trilium.org/custom/create-note +POST http://your-trilium-server/custom/create-note Content-Type: application/json { @@ -70,7 +70,7 @@ For more information, see [Custom Resource Providers](Custom%20Resource%20Provi REST request paths often contain parameters in the URL, e.g.: ``` -http://my.trilium.org/custom/notes/123 +http://your-trilium-server/custom/notes/123 ``` The last part is dynamic so the matching of the URL must also be dynamic - for this reason the matching is done with regular expressions. Following `customRequestHandler` value would match it: @@ -85,4 +85,4 @@ Additionally, this also defines a matching group with the use of parenthesis whi const noteId = api.pathParams[0]; ``` -Often you also need query params (as in e.g. `http://my.trilium.org/custom/notes?noteId=123`), you can get those with standard express `req.query.noteId`. \ No newline at end of file +Often you also need query params (as in e.g. `http://your-trilium-server/custom/notes?noteId=123`), you can get those with standard express `req.query.noteId`. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md b/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md index 12c284055..c50694b73 100644 --- a/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md +++ b/docs/User Guide/User Guide/Advanced Usage/ETAPI (REST API).md @@ -1,7 +1,8 @@ # ETAPI (REST API) -ETAPI is Trilium's public/external REST API. It is available since Trilium v0.50. +> [!TIP] +> For a quick start, consult the API Reference. -The documentation is in OpenAPI format, available [here](https://github.com/TriliumNext/Trilium/blob/master/src/etapi/etapi.openapi.yaml). +ETAPI is Trilium's public/external REST API. It is available since Trilium v0.50. ## API clients diff --git a/docs/User Guide/User Guide/Advanced Usage/Nightly release.md b/docs/User Guide/User Guide/Advanced Usage/Nightly release.md new file mode 100644 index 000000000..c9c2aac09 --- /dev/null +++ b/docs/User Guide/User Guide/Advanced Usage/Nightly release.md @@ -0,0 +1,34 @@ +# Nightly release +Nightly releases are versions built every day, containing the latest improvements and bugfixes, directly from the main development branch. These versions are generally useful in preparation for a release, to ensure that there are no significant bugs that need to be addressed first, or they can be used to confirm whether a particular bug is fixed or feature is well implemented. + +## Regarding the stability + +Despite being on a development branch, generally the main branch is pretty stable since PRs are tested before they are merged. If you notice any issues, feel free to report them either via a ticket or via the Matrix. + +## Downloading the nightly release manually + +Go to [github.com/TriliumNext/Trilium/releases/tag/nightly](https://github.com/TriliumNext/Trilium/releases/tag/nightly) and look for the artifacts starting with `TriliumNotes-main`. Choose the appropriate one for your platform (e.g. `windows-x64.zip`). + +Depending on your use case, you can either test the portable version or even use the installer. + +> [!NOTE] +> If you choose the installable version (e.g. the .exe on Windows), it will replace your stable installation. + +> [!IMPORTANT] +> By default, the nightly uses the same database as the production version. Generally you could easily downgrade if needed. However, if there are changes to the database or sync version, it will not be possible to downgrade without having to restore from a backup. + +## Automatically download and install the latest nightly + +This is pretty useful if you are a beta tester that wants to periodically update their version: + +On Ubuntu: + +``` +#!/usr/bin/env bash + +name=TriliumNotes-linux-x64-nightly.deb +rm -f $name* +wget https://github.com/TriliumNext/Trilium/releases/download/nightly/$name +sudo apt-get install ./$name +rm $name +``` \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).md b/docs/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).md index 67ad6dcf2..9b55f504e 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).md +++ b/docs/User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map).md @@ -10,7 +10,12 @@ There are two types of note map: ## Link Map -Shows [relations](Attributes.md) between notes: +The Link map is a visualization of links and Relations incoming to and outgoing from a particular note. + +The map indicates the following types of relations: + +* Internal (reference) links between notes. +* Relations ![](1_Note%20Map%20\(Link%20map,%20Tree%20m.png) diff --git a/docs/User Guide/User Guide/Advanced Usage/Note source.md b/docs/User Guide/User Guide/Advanced Usage/Note source.md index 927f63ce1..3466e6a0f 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Note source.md +++ b/docs/User Guide/User Guide/Advanced Usage/Note source.md @@ -7,7 +7,7 @@ For example: * 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. * Code notes are plain text and are represented internally as-is. -* Geo Map notes contain only minimal information (viewport, zoom) as a JSON. +* Geo Map notes contain only minimal information (viewport, zoom) as a JSON. * Canvas notes are represented as JSON, with Trilium's own information alongside with Excalidraw's internal JSON representation format. * Mind Map notes are represented as JSON, with the internal format of MindElixir. diff --git a/docs/User Guide/User Guide/Advanced Usage/Read-only database.md b/docs/User Guide/User Guide/Advanced Usage/Read-only database.md new file mode 100644 index 000000000..cacdc9675 --- /dev/null +++ b/docs/User Guide/User Guide/Advanced Usage/Read-only database.md @@ -0,0 +1,32 @@ +# Read-only database +> [!WARNING] +> This functionality is still in preview, expect possible issues or even the feature disappearing completely. +> Feel free to [report](../Troubleshooting/Reporting%20issues.md) any issues you might have. + +The read-only database is an alternative to Sharing notes. Although the share functionality works pretty well to publish pages to the Internet in a wiki, blog-like format it does not offer the full functionality behind Trilium (such as the advanced Search or the interactivity behind Collections or the various Note Types). + +When the database is in read-only mode, the Trilium application can be used as normal, but editing is disabled and changes are made in-memory only. + +## What it does + +* All notes are read-only, without the possibility of editing them. +* Features that would normally alter the database such as the list of recent notes are disabled. + +## Limitations + +* Some features might “slip through” and still end up creating a note, for example. + * However, the database is still read-only, so all modifications will be reset if the server is restarted. + * Whenever this occurs, `ERROR: read-only DB ignored` will be shown in the logs. + +## Setting a database as read-only + +First, make sure the database is initialized (e.g. the first set up is complete). Then modify the [config.ini](Configuration%20\(config.ini%20or%20e.md) by looking for the `[General]` section and adding a new `readOnly` field: + +``` +[General] +readOnly=true +``` + +If your server is already running, restart it to apply the changes. + +Similarly, to disable read-only remove the line or set it to `false`. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Development and architecture/Safe mode.md b/docs/User Guide/User Guide/Advanced Usage/Safe mode.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Development and architecture/Safe mode.md rename to docs/User Guide/User Guide/Advanced Usage/Safe mode.md diff --git a/docs/User Guide/User Guide/Advanced Usage/Sharing.md b/docs/User Guide/User Guide/Advanced Usage/Sharing.md index 5395f959c..5f87ce125 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Sharing.md +++ b/docs/User Guide/User Guide/Advanced Usage/Sharing.md @@ -16,7 +16,7 @@ Trilium allows you to share selected notes as **publicly accessible** read-only ### By note type -
 Supported featuresLimitations
Text
  • Table of contents.
  • Syntax highlight of code blocks, provided a language is selected (does not work if “Auto-detected” is enabled).
  • Rendering for math equations.
  • Including notes (only if the included notes are also shared).
  • Inline Mermaid diagrams are not rendered.
Code
  • Basic support (displaying the contents of the note in a monospace font).
  • No syntax highlight.
Saved SearchNot supported. 
Relation MapNot supported. 
Note MapNot supported. 
Render NoteNot supported. 
Collections
  • The child notes are displayed in a fixed format. 
  • More advanced view types such as the calendar view are not supported.
Mermaid Diagrams
  • The diagram is displayed as a vector image.
  • No further interaction supported.
Canvas
  • The diagram is displayed as a vector image.
  • No further interaction supported.
Web ViewNot supported. 
Mind MapThe diagram is displayed as a vector image.
  • No further interaction supported.
Geo Map ViewNot supported. 
FileBasic interaction (downloading the file).
  • No further interaction supported.
+
 Supported featuresLimitations
Text
  • Table of contents.
  • Syntax highlight of code blocks, provided a language is selected (does not work if “Auto-detected” is enabled).
  • Rendering for math equations.
  • Including notes (only if the included notes are also shared).
  • Inline Mermaid diagrams are not rendered.
Code
  • Basic support (displaying the contents of the note in a monospace font).
  • No syntax highlight.
Saved SearchNot supported. 
Relation MapNot supported. 
Note MapNot supported. 
Render NoteNot supported. 
Collections
  • The child notes are displayed in a fixed format. 
  • More advanced view types such as the calendar view are not supported.
Mermaid Diagrams
  • The diagram is displayed as a vector image.
  • No further interaction supported.
Canvas
  • The diagram is displayed as a vector image.
  • No further interaction supported.
Web ViewNot supported. 
Mind MapThe diagram is displayed as a vector image.
  • No further interaction supported.
Geo MapNot supported. 
FileBasic interaction (downloading the file).
  • No further interaction supported.
While the sharing feature is powerful, it has some limitations: @@ -48,7 +48,9 @@ You can view a list of all shared notes by clicking on "Show Shared Notes Subtre ## Security considerations -Shared notes are published on the open internet and can be accessed by anyone with the URL. The URL's randomness does not provide security, so it is crucial not to share sensitive information through this feature. +* Shared notes are published on the open internet and can be accessed by anyone with the URL unless the notes are password-protected. +* The URL's randomness does not provide security, so it is crucial not to share sensitive information through this feature. +* Trilium takes precautions to protect your publicly shared instance from leaking information for non-shared notes, including opening a separate read-only connection to the Database. Depending on your threat model, it might make more sense to use Exporting HTML for web publishing and use battle-tested web servers such as Nginx or Apache to serve static content. ### Password protection @@ -106,6 +108,10 @@ Shared notes typically have URLs like `http://domain.tld/share/knvU8aJy4dJ7`, wh 1. Ensure that aliases are unique. 2. Using slashes (`/`) within aliases to create subpaths is not supported. +> [!TIP] +> * To easily identify pages that don't have a share alias, run a Search with `#!shareAlias`. +> * To be able to enter the share alias faster, consider using Promoted Attributes (for example `#label:shareAlias(inheritable)="promoted,alias=Slug,single,text"`). + ### Setting a custom favicon To customize the favicon for your shared pages, create a relation `~shareFavicon` pointing to a file note containing the favicon (e.g., in `.ico` format). @@ -125,7 +131,27 @@ To do so, create a shared text note and apply the `shareIndex` label. When viewe ## Attribute reference -
AttributeDescription
shareHiddenFromTreethis note is hidden from left navigation tree, but still accessible with its URL
shareExternalLinknote will act as a link to an external website in the share tree
shareAliasdefine an alias using which the note will be available under https://your_trilium_host/share/[your_alias]
shareOmitDefaultCssdefault share page CSS will be omitted. Use when you make extensive styling changes.
shareRootmarks note which is served on /share root.
shareDescriptiondefine text to be added to the HTML meta tag for description
shareRawNote will be served in its raw format, without HTML wrapper. See also Serving directly the content of a note for an alternative method without setting an attribute.
shareDisallowRobotIndexing

Indicates to web crawlers that the page should not be indexed of this note by:

  • Setting the X-Robots-Tag: noindex HTTP header.
  • Setting the noindex, follow meta tag.
shareCredentialsrequire credentials to access this shared note. Value is expected to be in format username:password. Don't forget to make this inheritable to apply to child-notes/images.
shareIndexNote with this label will list all roots of shared notes.
shareHtmlLocationdefines where custom HTML injected via ~shareHtml relation should be placed. Applied to the HTML snippet note itself. Format: location:position where location is head, body, or content and position is start or end. Defaults to content:end.
+
AttributeDescription
#shareHiddenFromTreethis note is hidden from left navigation tree, but still accessible with its URL
#shareExternalLinknote will act as a link to an external website in the share tree
#shareAliasdefine an alias using which the note will be available under https://your_trilium_host/share/[your_alias]
#shareOmitDefaultCssdefault share page CSS will be omitted. Use when you make extensive styling changes.
#shareRootmarks note which is served on /share root.
#shareDescriptiondefine text to be added to the HTML meta tag for description
#shareRawNote will be served in its raw format, without HTML wrapper. See also Serving directly the content of a note for an alternative method without setting an attribute.
#shareDisallowRobotIndexing

Indicates to web crawlers that the page should not be indexed of this note by:

  • Setting the X-Robots-Tag: noindex HTTP header.
  • Setting the noindex, follow meta tag.
#shareCredentialsrequire credentials to access this shared note. Value is expected to be in format username:password. Don't forget to make this inheritable to apply to child-notes/images.
#shareIndexNote with this label will list all roots of shared notes.
#shareHtmlLocationdefines where custom HTML injected via ~shareHtml relation should be placed. Applied to the HTML snippet note itself. Format: location:position where location is head, body, or content and position is start or end. Defaults to content:end.
+ +### Customizing logo + +It's possible to adjust the logo which is displayed on the top-left of the left pane. + +| Attribute | Description | +| --- | --- | +| `~shareLogo` | Relation set to an image to use as logo. The image must be part of the share tree (it can be hidden if needed). | +| `#shareLogoWidth` | The width (in pixels, without unit) to set for the logo. Default is `53`. | +| `#shareLogoHeight` | The height (in pixels, without unit) to set for the logo. Default is `40`. | +| `#shareRootLink` | URL to navigate to when the logo is pressed. | + +### Customizing OpenGraph + +| Attribute | Description | +| --- | --- | +| `#shareOpenGraphColor` | This adjusts the `theme-color` meta-property. | +| `#shareOpenGraphURL` | This adjusts the `og:url` and `twitter:url` meta-properties. | +| `#shareOpenGraphDomain` | Adjusts the `twitter:domain` meta-property. | +| `#shareOpenGraphImage`
`~shareOpenGraphImage` | Can be either a label, case in which the value is passed on as-is, or it can be a relation to an image File. This controls the `og:image` meta-property. | ## Credits diff --git a/docs/User Guide/User Guide/Advanced Usage/Sharing/Exporting static HTML for web .md b/docs/User Guide/User Guide/Advanced Usage/Sharing/Exporting static HTML for web .md new file mode 100644 index 000000000..cc2e30825 --- /dev/null +++ b/docs/User Guide/User Guide/Advanced Usage/Sharing/Exporting static HTML for web .md @@ -0,0 +1,49 @@ +# Exporting static 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 + +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. +* The directory structure is also slightly different: + * A normal HTML export results in an index file and a single directory. + * Instead, for static exporting the top-root level becomes the index file and the child directories are on the root instead. + * This makes it possible to easily publish to a website, without forcing everything but the root note to be in a sub-directory. + +## 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](http://localhost:8080)). + +## Automation + +ETAPI (REST API) could potentially be used to automate an export on a scheduled task. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration.md b/docs/User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration.md new file mode 100644 index 000000000..d485b6cb1 --- /dev/null +++ b/docs/User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration.md @@ -0,0 +1,18 @@ +# Reverse proxy configuration +It might be desirable to only expose the share functionality of Trilium to the Internet, and keep the application accessible only within a local network or via VPN. + +To do so, a reverse proxy is required. + +## Caddy + +``` +http://domain.com { + reverse_proxy /share http://localhost:8080/share +} +``` + +This is for newer versions where the share functionality is isolated, for older versions it's required to also include `/assets`.[1] + +1. ^ + + [https://github.com/orgs/TriliumNext/discussions/7341#discussioncomment-14679897](https://github.com/orgs/TriliumNext/discussions/7341#discussioncomment-14679897) \ No newline at end of file diff --git a/docs/User Guide/User Guide/Advanced Usage/Technologies used/Leaflet.md b/docs/User Guide/User Guide/Advanced Usage/Technologies used/Leaflet.md index 85f4dc9bb..db1827e4c 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Technologies used/Leaflet.md +++ b/docs/User Guide/User Guide/Advanced Usage/Technologies used/Leaflet.md @@ -1,5 +1,5 @@ # Leaflet -Leaflet is the library behind [Geo map](../../Note%20Types/Collections/Geo%20Map%20View.md) notes. +Leaflet is the library behind [Geo map](../../Collections/Geo%20Map.md) notes. ## Plugins diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Import & Export.md b/docs/User Guide/User Guide/Basic Concepts and Features/Import & Export.md new file mode 100644 index 000000000..095a9739d --- /dev/null +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Import & Export.md @@ -0,0 +1,15 @@ +# Import & Export +Trilium natively supports the following formats for both import and export. + +* HTML: + * This is the main format used by Trilium, where standard tags are used to represent basic formatting and layout (e.g. ``, ``, `
`).
+    *   Note that HTML is not a standardized format so some more specific features such as admonitions or Internal (reference) links might not be supported by other applications.
+*   Markdown
+    *   Most of the formatting is preserved, see Supported syntax.
+*   OPML (Outliner Interchange Format)
+    *   Supports both OPML v1.0 for plain text and v2.0 with HTML support.
+
+To import from other applications, see the dedicated pages:
+
+*   Evernote
+*   OneNote
\ No newline at end of file
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md b/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md
index 70dd3632a..36aebff51 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/Navigation/Search.md	
@@ -13,7 +13,7 @@ Note search enables you to find notes by searching for text in the title, conten
 To search for notes, click on the magnifying glass icon on the toolbar or press the keyboard [shortcut](../Keyboard%20Shortcuts.md).
 
 1.  Set the text to search for in the _Search string_ field.
-    1.  Apart from searching for words ad-literam, there is also the possibility to search for attributes or properties of notes.
+    1.  Apart from searching for words literally, there is also the possibility to search for attributes or properties of notes.
     2.  See the examples below for more information.
 2.  To limit the search to a note and its sub-children, set a note in _Ancestor_.
     1.  This value is also pre-filled if the search is triggered from a [hoisted note](Note%20Hoisting.md) or a [workspace](Workspaces.md).
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md
index 8cb069e53..d461a3506 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes.md	
@@ -25,7 +25,7 @@ When you delete a note in Trilium, it is actually only marked for deletion (soft
 
 Within (by default) 7 days, it is possible to undelete these soft-deleted notes - open the Recent Changes dialog, and you will see a list of all modified notes including the deleted ones. Notes available for undeletion have a link to do so. This is kind of "trash can" functionality known from e.g. Windows.
 
-Clicking an undelete will recover the note, it's content and attributes - note should be just as before being deleted. This action will also undelete note's children which have been deleted in the same action.
+Clicking an undelete will recover the note, its content and attributes - note should be just as before being deleted. This action will also undelete note's children which have been deleted in the same action.
 
 To be able to undelete a note, it is necessary that deleted note's parent must be undeleted (otherwise there's no place where we can undelete it to). This might become a problem when you delete more notes in succession - the solution is then undelete in the reverse order of your deletion.
 
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.md
index 1caff1801..16b3caf28 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Note List.md	
@@ -12,4 +12,4 @@ When a note has one or more child notes, they will be listed at the end of the n
 
 The view types dictate how the child notes are represented. By default, 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
+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
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md
index 6873fd8a5..27d5326d6 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md	
@@ -63,8 +63,8 @@ Not all Note Types 
 *   For Code notes:
     *   Line numbers are not printed.
     *   Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced.
-*   For Collections:
-    *   Only Presentation View is currently supported.
+*   For Collections:
+    *   Only Presentation View is currently supported.
     *   We plan to add support for all the collection types at some point.
 *   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.
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.md
index 0163c1b78..36e265df9 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes.md	
@@ -40,4 +40,4 @@ When pressed, the note will become editable but will become read-only again afte
 Some note types have a special behavior based on whether the read-only mode is enabled:
 
 *   Mermaid Diagrams will hide the Mermaid source code and display the diagram preview in full-size. In this case, the read-only mode can be easily toggled on or off via a dedicated button in the Floating buttons area.
-*   Geo Map View will disallow all interaction that would otherwise change the map (dragging notes, adding new items).
\ No newline at end of file
+*   Geo Map View will disallow all interaction that would otherwise change the map (dragging notes, adding new items).
\ No newline at end of file
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md
index 795e02602..d0ba7aecf 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar.md	
@@ -56,7 +56,7 @@ Right click either the _Available launchers_ or _Visible launchers_ sections and
     2.  Optionally, set a `keyboardShortcut` to trigger the launcher.
 3.  **Custom Widget**
     
-    Allows defining a custom widget to be rendered inside the launcher. See [Widget Basics](../../Scripting/Custom%20Widgets/Widget%20Basics.md) for more information.
+    Allows defining a custom widget to be rendered inside the launcher. See [Widget Basics](../../Scripting/Frontend%20Basics/Custom%20Widgets/Widget%20Basics.md) for more information.
 4.  **Spacers**  
     Launchers that create some distance between other launchers for better visual distinction.
 
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.md
index dbdf139e8..d572a444f 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip.md	
@@ -15,7 +15,7 @@ The following information is displayed:
 The tooltip can be found in multiple places, including:
 
 *   In Text notes, when hovering over Internal (reference) links .
-*   Collections: 
-    *   Geo Map View, when hovering over a marker.
-    *   Calendar View, when hovering over an event.
-    *   Table View, when hovering over a note title, or over a [relation](../../Advanced%20Usage/Attributes/Relations.md).
\ No newline at end of file
+*   Collections: 
+    *   Geo Map View, when hovering over a marker.
+    *   Calendar View, when hovering over an event.
+    *   Table View, when hovering over a note title, or over a [relation](../../Advanced%20Usage/Attributes/Relations.md).
\ No newline at end of file
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md
index 5ecb4bbd3..a5f3af5ad 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu.md	
@@ -62,9 +62,9 @@ The contextual menu can operate:
         *   _Delete also all clones_ to ensure that the note will be deleted everywhere if it has been placed into multiple locations (see Cloning Notes).
         *   _Erase notes permanently_ will ensure that the note cannot be recovered from Recent Changes.
 *   **Import into note**
-    *   Opens the [import](../../Import%20%26%20Export) dialog and places the imported notes as child notes of the selected one.
+    *   Opens the [import](../../Import%20%26%20Export.md) dialog and places the imported notes as child notes of the selected one.
 *   **Export**
-    *   Opens the [export](../../Import%20%26%20Export) dialog for the selected notes.
+    *   Opens the [export](../../Import%20%26%20Export.md) dialog for the selected notes.
 *   **Search in subtree**
     *   Opens a full Search with it preconfigured to only look into this note and its descendants (the _Ancestor_ field).
 
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.md
index d844f74a1..b4401290b 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Quick edit.md	
@@ -5,16 +5,16 @@ _Quick edit_ provides an alternative to the standard tab-based navigation and ed
 
 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.
 
-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.
+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.
 
 ## Feature highlights
 
-*   All note types are supported, including Collections.
-*   Note that the Note List will not be displayed, except for notes of type Collections.
+*   All note types are supported, including Collections.
+*   Note that the Note List will not be displayed, except for notes of type Collections.
 *   For Text notes, depending on user preference, both the floating and classic editors are supported. See Formatting toolbar.
 *   The title and the note and the icon are editable, just like a normal tab.
 *   The Promoted Attributes are also displayed.
-    *   This integrates well with Collections where there are predefined attributes such as the _Start date_ and _End date_, allowing for easy editing.
+    *   This integrates well with Collections where there are predefined attributes such as the _Start date_ and _End date_, allowing for easy editing.
 
 ## Accessing the quick edit
 
@@ -25,9 +25,9 @@ This feature is also well integrated with Note Tooltip, press the quick edit icon.
-*   In Collections:
-    *   For Calendar View:
+*   In Collections:
+    *   For Calendar View:
         *   Clicking on an event will open that event for quick editing.
         *   If the calendar is for the Day Notes root, clicking on the day number will open the popup for that day note.
-    *   For Geo Map View:
+    *   For Geo Map View:
         *   Clicking on a marker will open that marker, but only if the map is in read-only mode.
\ No newline at end of file
diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md
index 8fd7e37d2..5cbfc0ff3 100644
--- a/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md	
+++ b/docs/User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon.md	
@@ -20,7 +20,7 @@ If you are using the _Fixed_ formatting toolbar, all the formatting buttons for
     *   As a more advanced use, it's possible to change the note type in order to modify the [source code](../../Advanced%20Usage/Note%20source.md) of a note.
 *   _**Protect the note**_ toggles whether the current note is encrypted and accessible only by entering the protected session. See [Protected Notes](../Notes/Protected%20Notes.md) for more information.
 *   _**Editable**_ changes whether the current note:
-    *   Enters [read-only mode](../Notes/Read-Only%20Notes.md) automatically if the note is too big (default behaviour).
+    *   Enters [read-only mode](../Notes/Read-Only%20Notes.md) automatically if the note is too big (default behavior).
     *   Is always in read-only mode (however it can still be edited temporarily).
     *   Is always editable, regardless of its size.
 *   _**Bookmark**_ toggles the display of the current note into the [Launch Bar](Launch%20Bar.md) for easy access. See [Bookmarks](../Navigation/Bookmarks.md) for more information.
diff --git a/docs/User Guide/User Guide/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/Collections.md b/docs/User Guide/User Guide/Collections.md
new file mode 100644
index 000000000..3a9fc9728
--- /dev/null
+++ b/docs/User Guide/User Guide/Collections.md	
@@ -0,0 +1,70 @@
+# Collections
+Collections are a unique type of note that don't have content, but instead display their child notes in various presentation methods.
+
+## Main collections
+
+|     |     |
+| --- | --- |
+| 
| Calendar
which displays a week, month or year calendar with the notes being shown as events. New events can be added easily by dragging across the calendar. | +|
| Table
displays each note as a row in a table, with Promoted Attributes being shown as well. This makes it easy to visualize attributes of notes, as well as making them easily editable. | +|
| Kanban Board
displays notes in columns, grouped by the value of a label. Items and columns can easily be created or dragged around to change their status. | +|
| Geo Map
which displays a geographical map in which the notes are represented as markers/pins on the map. New events can be easily added by pointing on the map. | +|
| Presentation
which shows each note as a slide and can be presented full-screen with smooth transitions or exported to PDF for sharing. | + +## Classic collections + +Classic collections are read-only mode and compiles the contents of all child notes into one continuous view. This makes it ideal for reading extensive information broken into smaller, manageable segments. + +* Grid View which is the default presentation method for child notes (see Note List), where the notes are displayed as tiles with their title and content being visible. +* List View is similar to Grid View, but it displays the notes one under the other with the content being expandable/collapsible, but also works recursively. + +## Creating a new collection + +To create a new collections, right click in the Note Tree and look for the _Collections_ entry and select the desired type. + +## Configuration + +To change the configuration of a collection or even switch to a different collection (e.g. from Kanban Board to a Calendar), see the dedicated _Collections_ tab in the Ribbon. + +## Archived notes + +By default, [archived notes](Basic%20Concepts%20and%20Features/Notes/Archived%20Notes.md) will not be shown in collections. This behavior can be changed by going to _Collection Properties_ in the Ribbon and checking _Show archived notes_. + +Archived notes will be generally indicated by being greyed out as opposed to the normal ones. + +## Advanced use cases + +### Adding a description to a collection + +To add a text before the collection, for example to describe it: + +1. Create a new collection. +2. In the Ribbon, go to _Basic Properties_ and change the note type from _Collection_ to _Text_. + +Now the text will be displayed above while still maintaining the collection view. + +### Using saved search + +Collections, by default, only display the child notes. However, it is possible to use the Search functionality 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 Saved Search. + +> [!IMPORTANT] +> While in search, none of the collections will not display the child notes of the search results. The reason is that the search might hit a note multiple times, causing an exponential rise in the number of results. + +### Creating a collection from scratch + +By default, collections come with a default configuration and sometimes even sample notes. To create a collection completely from scratch: + +1. Create a new note of type _Text_ (or any type). +2. In the Ribbon, go to _Basic Properties_ and select _Collection_ as the note type. +3. Still in the ribbon, go to _Collection Properties_ and select the desired view type. +4. Consult the help page of the corresponding view type in order to understand how to configure them. + +## Under the hood + +Collections by themselves are simply notes with no content that rely on the Note List mechanism (the one that lists the children notes at the bottom of a note) to display information. + +By default, new collections use predefined Templates that are stored safely in the Hidden Notes to define some basic configuration such as the type of view, but also some Promoted Attributes to make editing easier. + +Collections don't store their configuration (e.g. the position on the map, the hidden columns in a table) in the content of the note itself, but as attachments. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Collections/10_Calendar View_image.png b/docs/User Guide/User Guide/Collections/10_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/10_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/10_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/10_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/10_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/10_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/10_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/11_Calendar View_image.png b/docs/User Guide/User Guide/Collections/11_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/11_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/11_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/11_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/11_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/11_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/11_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/12_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/12_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/12_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/12_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/13_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/13_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/13_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/13_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/14_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/14_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/14_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/14_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/15_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/15_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/15_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/15_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/16_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/16_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/16_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/16_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/17_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/17_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/17_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/17_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/18_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/18_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/18_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/18_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/1_Calendar View_image.png b/docs/User Guide/User Guide/Collections/1_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/1_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/1_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/1_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/1_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/1_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/1_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png b/docs/User Guide/User Guide/Collections/1_Presentation_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/1_Presentation View_image.png rename to docs/User Guide/User Guide/Collections/1_Presentation_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/2_Calendar View_image.png b/docs/User Guide/User Guide/Collections/2_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/2_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/2_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/2_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/2_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/2_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/2_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/3_Calendar View_image.png b/docs/User Guide/User Guide/Collections/3_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/3_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/3_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/3_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/3_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/3_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/3_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/4_Calendar View_image.png b/docs/User Guide/User Guide/Collections/4_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/4_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/4_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/4_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/4_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/4_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/4_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/5_Calendar View_image.png b/docs/User Guide/User Guide/Collections/5_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/5_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/5_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/5_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/5_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/5_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/5_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/6_Calendar View_image.png b/docs/User Guide/User Guide/Collections/6_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/6_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/6_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/6_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/6_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/6_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/6_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/7_Calendar View_image.png b/docs/User Guide/User Guide/Collections/7_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/7_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/7_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/7_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/7_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/7_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/7_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/8_Calendar View_image.png b/docs/User Guide/User Guide/Collections/8_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/8_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/8_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/8_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/8_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/8_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/8_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/9_Calendar View_image.png b/docs/User Guide/User Guide/Collections/9_Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/9_Calendar View_image.png rename to docs/User Guide/User Guide/Collections/9_Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/9_Geo Map View_image.png b/docs/User Guide/User Guide/Collections/9_Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/9_Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/9_Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/Calendar View.md b/docs/User Guide/User Guide/Collections/Calendar.md similarity index 84% rename from docs/User Guide/User Guide/Note Types/Collections/Calendar View.md rename to docs/User Guide/User Guide/Collections/Calendar.md index cd0f86010..1499de851 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Calendar View.md +++ b/docs/User Guide/User Guide/Collections/Calendar.md @@ -1,5 +1,5 @@ -# Calendar View -
+# Calendar +
The Calendar view will display each child note in a calendar that has a start date and optionally an end date, as an event. @@ -16,22 +16,22 @@ Unlike other Collection view types, the Calendar view also allows some kind of i | | | | | --- | --- | --- | -| 1 | ![](2_Calendar%20View_image.png) | The Calendar View works only for Collection note types. To create a new note, right click on the note tree on the left and select Insert note after, or Insert child note and then select _Collection_. | -| 2 | ![](3_Calendar%20View_image.png) | Once created, the “View type” of the Collection needs changed to “Calendar”, by selecting the “Collection Properties” tab in the ribbon. | +| 1 | ![](2_Calendar_image.png) | The Calendar View works only for Collection note types. To create a new note, right click on the note tree on the left and select Insert note after, or Insert child note and then select _Collection_. | +| 2 | ![](3_Calendar_image.png) | Once created, the “View type” of the Collection needs changed to “Calendar”, by selecting the “Collection Properties” tab in the ribbon. | ## Creating a new event/note * Clicking on a day will create a new child note and assign it to that particular day. * You will be asked for the name of the new note. If the popup is dismissed by pressing the close button or escape, then the note will not be created. * It's possible to drag across multiple days to set both the start and end date of a particular note. - ![](Calendar%20View_image.png) + ![](Calendar_image.png) * Creating new notes from the calendar will respect the `~child:template` relation if set on the Collection note. ## Interacting with events * Hovering the mouse over an event will display information about the note. - ![](7_Calendar%20View_image.png) -* Left clicking the event will open a Quick edit to edit the note in a popup while allowing easy return to the calendar by just dismissing the popup. + ![](7_Calendar_image.png) +* Left clicking the event will open a Quick edit to edit the note in a popup while allowing easy return to the calendar by just dismissing the popup. * Middle clicking will open the note in a new tab. * Right click will offer more options including opening the note in a new split or window. * Drag and drop an event on the calendar to move it to another day. @@ -39,7 +39,7 @@ Unlike other Collection view types, the Calendar view also allows some kind of i ## Configuring the calendar view -In the _Collections_ tab in the Ribbon, it's possible to adjust the following: +In the _Collections_ tab in the Ribbon, it's possible to adjust the following: * Hide weekends from the week view. * Display week numbers on the calendar. @@ -66,7 +66,7 @@ For each note of the calendar, the following attributes can be used: | `#calendar:color` | Similar to `#color`, but applies the color only for the event in the calendar and not for other places such as the note tree. | | `#iconClass` | If present, the icon of the note will be displayed to the left of the event title. | | `#calendar:title` | Changes the title of an event to point to an attribute of the note other than the title, can either a label or a relation (without the `#` or `~` symbol). See _Use-cases_ for more information. | -| `#calendar:displayedAttributes` | Allows displaying the value of one or more attributes in the calendar like this:    

![](9_Calendar%20View_image.png)   

`#weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood"`  

It can also be used with relations, case in which it will display the title of the target note:   

`~assignee=@My assignee #calendar:displayedAttributes="assignee"` | +| `#calendar:displayedAttributes` | Allows displaying the value of one or more attributes in the calendar like this:    

![](9_Calendar_image.png)   

`#weight="70" #Mood="Good" #calendar:displayedAttributes="weight,Mood"`  

It can also be used with relations, case in which it will display the title of the target note:   

`~assignee=@My assignee #calendar:displayedAttributes="assignee"` | | `#calendar:startDate` | Allows using a different label to represent the start date, other than `startDate` (e.g. `expiryDate`). The label name **must not be** prefixed with `#`. If the label is not defined for a note, the default will be used instead. | | `#calendar:endDate` | Similar to `#calendar:startDate`, allows changing the attribute which is being used to read the end date. | | `#calendar:startTime` | Similar to `#calendar:startDate`, allows changing the attribute which is being used to read the start time. | @@ -74,7 +74,7 @@ For each note of the calendar, the following attributes can be used: ## How the calendar works -![](11_Calendar%20View_image.png) +![](11_Calendar_image.png) The calendar displays all the child notes of the Collection that have a `#startDate`. An `#endDate` can optionally be added. @@ -88,7 +88,7 @@ If editing the start date and end date from the note itself is desirable, the fo This will result in: -![](10_Calendar%20View_image.png) +![](10_Calendar_image.png) When not used in a Journal, the calendar is recursive. That is, it will look for events not just in its child notes but also in the children of these child notes. @@ -105,7 +105,7 @@ Based on the `#calendarRoot` (or `#workspaceCalendarRoot`) attribute, the calend * Clicking on the empty space on a date will automatically open that day's note or create it if it does not exist. * Direct children of a day note will be displayed on the calendar despite not having a `dateNote` attribute. Children of the child notes will not be displayed. - + ### Using a different attribute as event title @@ -113,7 +113,7 @@ By default, events are displayed on the calendar by their note title. However, i To do so, assign `#calendar:title` to the child note (not the calendar/Collection note), with the value being `name` where `name` can be any label (make not to add the `#` prefix). The attribute can also come through inheritance such as a template attribute. If the note does not have the requested label, the title of the note will be used instead. -
  
#startDate=2025-02-11 #endDate=2025-02-13 #name="My vacation" #calendar:title="name"

 

+
  
#startDate=2025-02-11 #endDate=2025-02-13 #name="My vacation" #calendar:title="name"

 

### Using a relation attribute as event title @@ -121,8 +121,8 @@ Similarly to using an attribute, use `#calendar:title` and set it to `name` wher Moreover, if there are more relations of the same name, they will be displayed as multiple events coming from the same note. -
  
#startDate=2025-02-14 #endDate=2025-02-15 ~for=@John Smith ~for=@Jane Doe #calendar:title="for"
+
  
#startDate=2025-02-14 #endDate=2025-02-15 ~for=@John Smith ~for=@Jane Doe #calendar:title="for"
Note that it's even possible to have a `#calendar:title` on the target note (e.g. “John Smith”) which will try to render an attribute of it. Note that it's not possible to use a relation here as well for safety reasons (an accidental recursion  of attributes could cause the application to loop infinitely). -
  
#calendar:title="shortName" #shortName="John S."
\ No newline at end of file +
  
#calendar:title="shortName" #shortName="John S."
\ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Collections/Calendar View_image.png b/docs/User Guide/User Guide/Collections/Calendar_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/Calendar View_image.png rename to docs/User Guide/User Guide/Collections/Calendar_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/Geo Map View.md b/docs/User Guide/User Guide/Collections/Geo Map.md similarity index 60% rename from docs/User Guide/User Guide/Note Types/Collections/Geo Map View.md rename to docs/User Guide/User Guide/Collections/Geo Map.md index a060d385e..7cd6cc34a 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Geo Map View.md +++ b/docs/User Guide/User Guide/Collections/Geo Map.md @@ -1,8 +1,8 @@ -# Geo Map View +# Geo Map > [!IMPORTANT] -> Starting with Trilium v0.97.0, the geo map has been converted from a standalone [note type](../../Note%20Types.md) to a type of view for the Note List.  +> Starting with Trilium v0.97.0, the geo map has been converted from a standalone [note type](../Note%20Types.md) to a type of view for the 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 using the built-in interface. @@ -10,8 +10,8 @@ This note type displays the children notes on a geographical map, based on an at | | | | | --- | --- | --- | -| 1 |
| Right click on any note on the note tree and select _Insert child note_ → _Geo Map (beta)_. | -| 2 |
| By default the map will be empty and will show the entire world. | +| 1 |
| Right click on any note on the note tree and select _Insert child note_ → _Geo Map (beta)_. | +| 2 |
| By default the map will be empty and will show the entire world. | ## Repositioning the map @@ -26,10 +26,10 @@ The position on the map and the zoom are saved inside the map note and restored | | | | | --- | --- | --- | -| 1 | To create a marker, first navigate to the desired point on the map. Then press the ![](10_Geo%20Map%20View_image.png) button in the [Floating buttons](../../Basic%20Concepts%20and%20Features/UI%20Elements/Floating%20buttons.md) (top-right) area.   

If the button is not visible, make sure the button section is visible by pressing the chevron button (![](17_Geo%20Map%20View_image.png)) in the top-right of the map. | | -| 2 | | Once pressed, the map will enter in the insert mode, as illustrated by the notification.      

Simply click the point on the map where to place the marker, or the Escape key to cancel. | -| 3 | | Enter the name of the marker/note to be created. | -| 4 | | Once confirmed, the marker will show up on the map and it will also be displayed as a child note of the map. | +| 1 | To create a marker, first navigate to the desired point on the map. Then press the ![](10_Geo%20Map_image.png) button in the [Floating buttons](../Basic%20Concepts%20and%20Features/UI%20Elements/Floating%20buttons.md) (top-right) area.   

If the button is not visible, make sure the button section is visible by pressing the chevron button (![](17_Geo%20Map_image.png)) in the top-right of the map. | | +| 2 | | Once pressed, the map will enter in the insert mode, as illustrated by the notification.      

Simply click the point on the map where to place the marker, or the Escape key to cancel. | +| 3 | | Enter the name of the marker/note to be created. | +| 4 | | Once confirmed, the marker will show up on the map and it will also be displayed as a child note of the map. | ### Adding a new note using the contextual menu @@ -40,13 +40,13 @@ The position on the map and the zoom are saved inside the map note and restored ### Adding an existing note on note from the note tree -1. Select the desired note in the Note Tree. +1. Select the desired note in the Note Tree. 2. Hold the mouse on the note and drag it to the map to the desired location. 3. The map should be updated with the new marker. This works for: -* Notes that are not part of the geo map, case in which a [clone](../../Basic%20Concepts%20and%20Features/Notes/Cloning%20Notes.md) will be created. +* Notes that are not part of the geo map, case in which a [clone](../Basic%20Concepts%20and%20Features/Notes/Cloning%20Notes.md) will be created. * Notes that are a child of the geo map but not yet positioned on the map. * Notes that are a child of the geo map and also positioned, case in which the marker will be relocated to the new position. @@ -57,7 +57,7 @@ This works for: 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. @@ -71,11 +71,11 @@ If moved by mistake, there is currently no way to undo the change. If the mouse ## Interaction with the markers -* Hovering over a marker will display a Note Tooltip with the content of the note it belongs to. +* Hovering over a marker will display a Note Tooltip with the content of the note it belongs to. * Clicking on the note title in the tooltip will navigate to the note in the current view. * Middle-clicking the marker will open the note in a new tab. * Right-clicking the marker will open a contextual menu (as described below). -* If the map is in read-only mode, clicking on a marker will open a Quick edit popup for the corresponding note. +* If the map is in read-only mode, clicking on a marker will open a Quick edit popup for the corresponding note. ## Contextual menu @@ -93,7 +93,7 @@ It's possible to press the right mouse button to display a contextual menu. ## Icon and color of the markers -
image
+
image
The markers will have the same icon as the note. @@ -109,9 +109,9 @@ The value of the attribute is made up of the latitude and longitude separated by | | | | | --- | --- | --- | -| 1 |
| Go to Google Maps on the web and look for a desired location, right click on it and a context menu will show up.      

Simply click on the first item displaying the coordinates and they will be copied to clipboard.      

Then paste the value inside the text box into the `#geolocation` attribute of a child note of the map (don't forget to surround the value with a `"` character). | -| 2 |
| In Trilium, create a child note under the map. | -| 3 |
| And then go to Owned Attributes and type `#geolocation="`, then paste from the clipboard as-is and then add the ending `"` character. Press Enter to confirm and the map should now be updated to contain the new note. | +| 1 |
| Go to Google Maps on the web and look for a desired location, right click on it and a context menu will show up.      

Simply click on the first item displaying the coordinates and they will be copied to clipboard.      

Then paste the value inside the text box into the `#geolocation` attribute of a child note of the map (don't forget to surround the value with a `"` character). | +| 2 |
| In Trilium, create a child note under the map. | +| 3 |
| And then go to Owned Attributes and type `#geolocation="`, then paste from the clipboard as-is and then add the ending `"` character. Press Enter to confirm and the map should now be updated to contain the new note. | ### Adding from OpenStreetMap @@ -119,9 +119,9 @@ Similarly to the Google Maps approach: | | | | | --- | --- | --- | -| 1 | | Go to any location on openstreetmap.org and right click to bring up the context menu. Select the “Show address” item. | -| 2 | | The address will be visible in the top-left of the screen, in the place of the search bar.      

Select the coordinates and copy them into the clipboard. | -| 3 | | Simply paste the value inside the text box into the `#geolocation` attribute of a child note of the map and then it should be displayed on the map. | +| 1 | | Go to any location on openstreetmap.org and right click to bring up the context menu. Select the “Show address” item. | +| 2 | | The address will be visible in the top-left of the screen, in the place of the search bar.      

Select the coordinates and copy them into the clipboard. | +| 3 | | Simply paste the value inside the text box into the `#geolocation` attribute of a child note of the map and then it should be displayed on the map. | ## Adding GPS tracks (.gpx) @@ -129,9 +129,9 @@ Trilium has basic support for displaying GPS tracks on the geo map. | | | | | --- | --- | --- | -| 1 |
| To add a track, simply drag & drop a .gpx file inside the geo map in the note tree. | -| 2 |
| In order for the file to be recognized as a GPS track, it needs to show up as `application/gpx+xml` in the _File type_ field. | -| 3 |
| When going back to the map, the track should now be visible.      

The start and end points of the track are indicated by the two blue markers. | +| 1 |
| To add a track, simply drag & drop a .gpx file inside the geo map in the note tree. | +| 2 |
| In order for the file to be recognized as a GPS track, it needs to show up as `application/gpx+xml` in the _File type_ field. | +| 3 |
| When going back to the map, the track should now be visible.      

The start and end points of the track are indicated by the two blue markers. | > [!NOTE] > The starting point of the track will be displayed as a marker, with the name of the note underneath. The start marker will also respect the icon and the `color` of the note. The end marker is displayed with a distinct icon. @@ -142,17 +142,17 @@ Trilium has basic support for displaying GPS tracks on the geo map. When a map is in read-only all editing features will be disabled such as: -* The add button in the Floating buttons. +* The add button in the Floating buttons. * Dragging markers. * Editing from the contextual menu (removing locations or adding new items). -To enable read-only mode simply press the _Lock_ icon from the Floating buttons. To disable it, press the button again. +To enable read-only mode simply press the _Lock_ icon from the Floating buttons. To disable it, press the button again. ## Configuration ### Map Style -The styling of the map can be adjusted in the _Collection Properties_ tab in the Ribbon or manually via the `#map:style` attribute. +The styling of the map can be adjusted in the _Collection Properties_ tab in the Ribbon or manually via the `#map:style` attribute. The geo map comes with two different types of styles: @@ -171,11 +171,11 @@ The geo map comes with two different types of styles: ### Scale -Activating this option via the Ribbon or manually via `#map:scale` will display an indicator in the bottom-left of the scale of the map. +Activating this option via the Ribbon or manually via `#map:scale` will display an indicator in the bottom-left of the scale of the map. ## Troubleshooting -
+
### Grid-like artifacts on the map diff --git a/docs/User Guide/User Guide/Note Types/Collections/Geo Map View_image.jpg b/docs/User Guide/User Guide/Collections/Geo Map_image.jpg similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/Geo Map View_image.jpg rename to docs/User Guide/User Guide/Collections/Geo Map_image.jpg diff --git a/docs/User Guide/User Guide/Note Types/Collections/Geo Map View_image.png b/docs/User Guide/User Guide/Collections/Geo Map_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/Geo Map View_image.png rename to docs/User Guide/User Guide/Collections/Geo Map_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/Grid View.md b/docs/User Guide/User Guide/Collections/Grid View.md similarity index 54% rename from docs/User Guide/User Guide/Note Types/Collections/Grid View.md rename to docs/User Guide/User Guide/Collections/Grid View.md index 33f887010..94c091555 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Grid View.md +++ b/docs/User Guide/User Guide/Collections/Grid View.md @@ -11,12 +11,12 @@ Each tile contains: Depending on the type of note: -* For Text notes, the text can be slightly scrollable via the mouse wheel to reveal more context. -* For Code notes, syntax highlighting is applied. -* For File notes, a preview is made available for audio, video and PDF notes. +* For Text notes, the text can be slightly scrollable via the mouse wheel to reveal more context. +* For Code notes, syntax highlighting is applied. +* For File notes, a preview is made available for audio, video and PDF notes. * If the note does not have a content, a list of its child notes will be 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. +The grid view is also used by default in the Note List of every note, making it easy to navigate to children notes. ## Configuration diff --git a/docs/User Guide/User Guide/Note Types/Collections/Grid View_image.png b/docs/User Guide/User Guide/Collections/Grid View_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/Grid View_image.png rename to docs/User Guide/User Guide/Collections/Grid View_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/Board View.md b/docs/User Guide/User Guide/Collections/Kanban Board.md similarity index 92% rename from docs/User Guide/User Guide/Note Types/Collections/Board View.md rename to docs/User Guide/User Guide/Collections/Kanban Board.md index c2630e67d..e4efcdc26 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Board View.md +++ b/docs/User Guide/User Guide/Collections/Kanban Board.md @@ -1,5 +1,5 @@ -# Board View -
+# Kanban Board +
The Board view presents sub-notes in columns for a Kanban-like experience. Each column represents a possible value for a status label, which can be adjusted. @@ -7,9 +7,11 @@ The Board view presents sub-notes in columns for a Kanban-like experience. Each When first creating a collection of _Board_ type, a few subnotes will be created, each having a `#status` label set. The board then groups each note by the value of the status attribute. -Notes are displayed recursively, so even the child notes of the child notes will be displayed. However, unlike the Table View, the notes are not displayed in a hierarchy. +Notes are displayed recursively, so even the child notes of the child notes will be displayed. However, unlike the Table, the notes are not displayed in a hierarchy. -## Interaction with columns +## Interaction + +### Working with columns * Create a new column by pressing _Add Column_ near the last column. * Once pressed, a text box will be displayed to set the name of the column. Press Enter to confirm, or Escape to dismiss. @@ -20,7 +22,7 @@ Notes are displayed recursively, so even the child notes of the child notes will * Upon renaming a column, the corresponding status attribute of all its notes will be changed in bulk. * If there are many columns, use the mouse wheel to scroll. -## Interaction with notes +### Working with notes * Create a new note in any column by pressing _New item_ * Enter the name of the note and press Enter or click away. To dismiss the creation of a new note, simply press Escape or leave the name empty. @@ -57,8 +59,6 @@ By default, the label used to group the notes is `#status`. It is possible to us > [!NOTE] > It's currently not possible to set a relation as the grouping criteria. There are plans to add support for it. -## Interaction - ## Limitations * It is not possible yet to use group by a relation, only by label. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Collections/Board View_image.png b/docs/User Guide/User Guide/Collections/Kanban Board_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/Board View_image.png rename to docs/User Guide/User Guide/Collections/Kanban Board_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/List View.md b/docs/User Guide/User Guide/Collections/List View.md similarity index 79% rename from docs/User Guide/User Guide/Note Types/Collections/List View.md rename to docs/User Guide/User Guide/Collections/List View.md index e6f07aa89..76fd15820 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/List View.md +++ b/docs/User Guide/User Guide/Collections/List View.md @@ -8,4 +8,4 @@ In the example above, the "Node.js" note on the left panel contains several chil ## Interaction * Each note can be expanded or collapsed by clicking on the arrow to the left of the title. -* In the Ribbon, in the _Collection_ tab there are options to expand and to collapse all notes easily. \ No newline at end of file +* In the Ribbon, in the _Collection_ tab there are options to expand and to collapse all notes easily. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Collections/List View_image.png b/docs/User Guide/User Guide/Collections/List View_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/List View_image.png rename to docs/User Guide/User Guide/Collections/List View_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/Presentation View.md b/docs/User Guide/User Guide/Collections/Presentation.md similarity index 73% rename from docs/User Guide/User Guide/Note Types/Collections/Presentation View.md rename to docs/User Guide/User Guide/Collections/Presentation.md index 55ec5960c..2f7b44944 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Presentation View.md +++ b/docs/User Guide/User Guide/Collections/Presentation.md @@ -1,5 +1,5 @@ -# Presentation View -
+# Presentation +
The Presentation view allows the creation of slideshows directly from within Trilium. @@ -36,7 +36,7 @@ This horizontal/vertical organization affects transitions (especially on the “ * Pressing Space and Shift + Space will go to the next/previous slide in order, regardless of the direction. This is generally the key combination to use when presenting. * The arrows on the bottom-right of the slide will also reflect this navigation scheme. -
+
All direct children of the collection will be laid out horizontally. If a direct child also has children, those children will be placed as vertical slides. @@ -55,21 +55,21 @@ In the following example, the note structure is as follows: At collection level, it's possible to adjust: -* The theme of the entire presentation to one of the predefined themes by going to the Ribbon and looking for the _Collection Properties_ tab. +* The theme of the entire presentation to one of the predefined themes by going to the Ribbon and 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). +* 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). At slide level: -* It's possible to adjust the background color of a slide by using the [predefined promoted attribute](../../Advanced%20Usage/Attributes/Promoted%20Attributes.md) for the color or manually setting `#slide:background` to a hex color. +* It's possible to adjust the background color of a slide by using the [predefined promoted attribute](../Advanced%20Usage/Attributes/Promoted%20Attributes.md) for the color or manually setting `#slide:background` to a hex color. * More complex backgrounds can be achieved via gradients. There's no UI for it; it has to be set via `#slide:background` to a CSS gradient definition such as: `linear-gradient(to bottom, #283b95, #17b2c3)`. ## Tips and tricks * Text notes generally respect the formatting (bold, italic, foreground 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](../../Advanced%20Usage/Sharing.md) and Note List so it should be able to display Mermaid DiagramsCanvas 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: +* Try using more than just text notes, the presentation uses the same mechanism as [shared notes](../Advanced%20Usage/Sharing.md) and Note List so it should be able to display Mermaid DiagramsCanvas 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: ``` --- diff --git a/docs/User Guide/User Guide/Note Types/Collections/Presentation View_image.png b/docs/User Guide/User Guide/Collections/Presentation_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/Presentation View_image.png rename to docs/User Guide/User Guide/Collections/Presentation_image.png diff --git a/docs/User Guide/User Guide/Note Types/Collections/Table View.md b/docs/User Guide/User Guide/Collections/Table.md similarity index 76% rename from docs/User Guide/User Guide/Note Types/Collections/Table View.md rename to docs/User Guide/User Guide/Collections/Table.md index 78774734a..576c28b29 100644 --- a/docs/User Guide/User Guide/Note Types/Collections/Table View.md +++ b/docs/User Guide/User Guide/Collections/Table.md @@ -1,7 +1,7 @@ -# Table View -
+# Table +
-The table view displays information in a grid, where the rows are individual notes and the columns are Promoted Attributes. In addition, values are editable. +The table view displays information in a grid, where the rows are individual notes and the columns are Promoted Attributes. In addition, values are editable. ## How it works @@ -9,7 +9,7 @@ The tabular structure is represented as such: * Each child note is a row in the table. * If child rows also have children, they will be displayed under an expander (nested notes). -* Each column is a [promoted attribute](../../Advanced%20Usage/Attributes/Promoted%20Attributes.md) that is defined on the Collection note. +* Each column is a [promoted attribute](../Advanced%20Usage/Attributes/Promoted%20Attributes.md) that is defined on the Collection note. * Actually, both promoted and unpromoted attributes are supported, but it's a requirement to use a label/relation definition. * The promoted attributes are usually defined as inheritable in order to show up in the child notes, but it's not a requirement. * If there are multiple attribute definitions with the same `name`, only one will be displayed. @@ -18,18 +18,18 @@ There are also a few predefined columns: * The current item number, identified by the `#` symbol. * 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 ### Creating a new table -Right click the Note Tree and select _Insert child note_ and look for the _Table item_. +Right click the Note Tree and select _Insert child note_ and look for the _Table item_. ### Adding columns -Each column is a [promoted or unpromoted attribute](../../Advanced%20Usage/Attributes/Promoted%20Attributes.md) that is defined on the Collection note. +Each column is a [promoted or unpromoted attribute](../Advanced%20Usage/Attributes/Promoted%20Attributes.md) that is defined on the Collection note. To create a new column, either: @@ -48,7 +48,7 @@ To create a new note, either: By default it will try to edit the title of the newly created note. -Alternatively, the note can be created from the Note Tree or [scripting](../../Scripting.md). +Alternatively, the note can be created from the Note Tree or [scripting](../Scripting.md). ### Context menu @@ -89,7 +89,7 @@ If the _Name_ field of a column is changed, this will trigger a batch operation ### 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: +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: * To do so, simply click on a column. * To switch between ascending or descending sort, simply click again on the same column. The arrow next to the column will indicate the direction of the sort. @@ -104,7 +104,7 @@ By default, the order of the notes matches the order in the Note Tree. +This will also change the order of the note in the Note Tree. Reordering does have some limitations: @@ -120,7 +120,7 @@ Next to the title of each element there will be a button to expand or collapse. Since nesting is not always desirable, it is possible to limit the nesting to a certain number of levels or even disable it completely. To do so, either: -* Go to _Collection Properties_ in the Ribbon and look for the _Max nesting depth_ section. +* Go to _Collection Properties_ in the Ribbon and look for the _Max nesting depth_ section. * To disable nesting, type 0 and press Enter. * To limit to a certain depth, type in the desired number (e.g. 2 to only display children and sub-children). * To re-enable unlimited nesting, remove the number and press Enter. @@ -132,20 +132,20 @@ Limitations: ## Limitations -* Multi-value labels and relations are not supported. If a Promoted Attributes is defined with a _Multi value_ specificity, they will be ignored. +* Multi-value labels and relations are not supported. If a 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. ## Use in search -The table view can be used in a Saved Search by adding the `#viewType=table` attribute. +The table view can be used in a Saved Search by adding the `#viewType=table` attribute. -Unlike when used in a Collection, saved searches are not limited to the sub-hierarchy of a note and allows for advanced queries thanks to the power of the Search. +Unlike when used in a Collection, saved searches are not limited to the sub-hierarchy of a note and allows for advanced queries thanks to the power of the Search. However, there are also some limitations: * It's not possible to reorder notes. * It's not possible to add a new row. -Columns are supported, by being defined as Promoted Attributes to the Saved Search note. +Columns are supported, by being defined as Promoted Attributes to the Saved Search note. Editing is also supported. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Collections/Table View_image.png b/docs/User Guide/User Guide/Collections/Table_image.png similarity index 100% rename from docs/User Guide/User Guide/Note Types/Collections/Table View_image.png rename to docs/User Guide/User Guide/Collections/Table_image.png diff --git a/docs/User Guide/User Guide/Collections_collection_bo.webp b/docs/User Guide/User Guide/Collections_collection_bo.webp new file mode 100644 index 000000000..6ed49dd44 Binary files /dev/null and b/docs/User Guide/User Guide/Collections_collection_bo.webp differ diff --git a/docs/User Guide/User Guide/Collections_collection_ca.webp b/docs/User Guide/User Guide/Collections_collection_ca.webp new file mode 100644 index 000000000..34b7961e0 Binary files /dev/null and b/docs/User Guide/User Guide/Collections_collection_ca.webp differ diff --git a/docs/User Guide/User Guide/Collections_collection_ge.webp b/docs/User Guide/User Guide/Collections_collection_ge.webp new file mode 100644 index 000000000..e564fbfc6 Binary files /dev/null and b/docs/User Guide/User Guide/Collections_collection_ge.webp differ diff --git a/docs/User Guide/User Guide/Collections_collection_pr.webp b/docs/User Guide/User Guide/Collections_collection_pr.webp new file mode 100644 index 000000000..f7ae75cc3 Binary files /dev/null and b/docs/User Guide/User Guide/Collections_collection_pr.webp differ diff --git a/docs/User Guide/User Guide/Collections_collection_ta.webp b/docs/User Guide/User Guide/Collections_collection_ta.webp new file mode 100644 index 000000000..2113caf65 Binary files /dev/null and b/docs/User Guide/User Guide/Collections_collection_ta.webp differ 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/Feature Highlights.md b/docs/User Guide/User Guide/Feature Highlights.md index 77f30d590..818ccabd3 100644 --- a/docs/User Guide/User Guide/Feature Highlights.md +++ b/docs/User Guide/User Guide/Feature Highlights.md @@ -2,9 +2,9 @@ This section presents the most important changes by version. For a full set of changes, please consult the change log of each release. For purposes of brevity, beta versions are skipped and the features gathered to the nearest stable version. * v0.97.0: - * Books are now Collections. - * Table View is a new collection type displaying notes and attributes in an editable grid. - * Quick edit is introduced, adding a new way to edit notes in a popup instead of opening a new tab. It also integrates well with Collections. + * Books are now Collections. + * Table View is a new collection type displaying notes and attributes in an editable grid. + * Quick edit is introduced, adding a new way to edit notes in a popup instead of opening a new tab. It also integrates well with Collections. * v0.96.0: * Text gain premium features thanks to a collaboration with the CKEditor team: * Slash Commands @@ -12,7 +12,7 @@ This section presents the most important changes by version. For a full set of c * v0.95.0: * A more friendly theme was introduced for Sharing, with search, expandable tree, night mode and more. * v0.94.0: - * Added integration with AI (using self-hosted LLMs such as Ollama or industry standards such as ChatGPT). + * Added integration with AI (using self-hosted LLMs such as Ollama or industry standards such as ChatGPT). * v0.92.5: * Windows binaries are now signed. * Multi-Factor Authentication was introduced. @@ -21,12 +21,12 @@ This section presents the most important changes by version. For a full set of c * Text notes can now have adjustable Content language & Right-to-left support. * Export as PDF * Zen mode - * Calendar View, allowing notes to be displayed in a monthly grid based on start and end dates. + * Calendar View, allowing notes to be displayed in a monthly grid based on start and end dates. * v0.91.5: * Significant improvements for mobile. * Footnotes are now supported in Text notes. * Mermaid diagrams can now be inserted inline within Text notes. * The TriliumNext theme is introduced, bringing a more modern design to the application. - * Geo Map View, displaying notes as markers on a geographical map for easy trip planning. + * Geo Map View, displaying notes as markers on a geographical map for easy trip planning. * v0.90.8: * A new note type was introduced: Mind Map \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Data directory.md b/docs/User Guide/User Guide/Installation & Setup/Data directory.md index b4677c1c5..3d66bafe9 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Data directory.md +++ b/docs/User Guide/User Guide/Installation & Setup/Data directory.md @@ -6,7 +6,7 @@ Data directory contains: * `backup` - contains automatically [backup](Backup.md) of documents * `log` - contains application log files -## Location +## Location of the data directory Easy way how to find out which data directory Trilium uses is to look at the "About Trilium Notes" dialog (from "Menu" in upper left corner): @@ -26,7 +26,17 @@ If you want to back up your Trilium data, just backup this single directory - it ### Changing the location of data directory -If you want to use some other location for the data directory than the default one, you may change it via TRILIUM\_DATA\_DIR environment variable to some other location: +If you want to use some other location for the data directory than the default one, you may change it via `TRILIUM_DATA_DIR` environment variable to some other location: + +### Windows + +1. Press the Windows key on your keyboard. +2. Search and select “Edit the system variables”. +3. Press the “Environment Variables…” button in the bottom-right of the newly opened screen. +4. On the top section ("User variables for \[user\]"), press the “New…” button. +5. In the _Variable name_ field insert `TRILIUM_DATA_DIR`. +6. Press the _Browse Directory…_ button and select the new directory where to store the database. +7. Close all the windows by pressing the _OK_ button for each of them. #### Linux @@ -43,11 +53,6 @@ To load it manually, you need to use `launchctl setenv TRILIUM_DATA_DIR Database (storing all notes and metadata). | +| `TRILIUM_BACKUP_DIR` | `${TRILIUM_DATA_DIR}/backup` | Directory where automated Backup databases are stored. | +| `TRILIUM_LOG_DIR` | `${TRILIUM_DATA_DIR}/log` | Directory where daily Backend (server) logs are stored. | +| `TRILIUM_TMP_DIR` | `${TRILIUM_DATA_DIR}/tmp` | Directory where temporary files are stored (for example when opening in an external app). | +| `TRILIUM_ANONYMIZED_DB_DIR` | `${TRILIUM_DATA_DIR}/anonymized-db` | Directory where a Anonymized Database is stored. | +| `TRILIUM_CONFIG_INI_PATH` | `${TRILIUM_DATA_DIR}/config.ini` | Path to Configuration (config.ini or environment variables) file. | \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md index c96a1e1cd..c8eb58ee5 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md +++ b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation.md @@ -16,4 +16,4 @@ Trilium offers various startup scripts to customize your experience: ## Synchronization -For Trilium desktp users who wish to synchronize their data with a server instance, refer to the Synchronization guide for detailed instructions. \ No newline at end of file +For Trilium desktop users who wish to synchronize their data with a server instance, refer to the Synchronization guide for detailed instructions. \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Building and deployment/Nix flake.md b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake.md similarity index 100% rename from docs/Developer Guide/Developer Guide/Building and deployment/Nix flake.md rename to docs/User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake.md diff --git a/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/System Requirements.md b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/System Requirements.md new file mode 100644 index 000000000..af28d059f --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Desktop Installation/System Requirements.md @@ -0,0 +1,12 @@ +# System Requirements +The desktop version of Trilium supports all three main operating systems: + +* Windows + * Windows 11 is officially supported. + * Windows on ARM is also supported +* Linux: + * Most modern distributions are supported, including NixOS. + * ARM is supported in `aarch64` (no ARM v7 support). +* macOS + * Minimum supported operating system: macOS Monterey + * Both Intel and Apple Silicon devices are supported. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation.md index eb0054c91..ceae67f84 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Server Installation.md +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation.md @@ -32,7 +32,7 @@ export TRILIUM_DATA_DIR=/home/myuser/data/my-trilium-data ### Disabling / Modifying the Upload Limit -If you're running into the 250MB limit imposed on the server by default, and you'd like to increase the upload limit, you can set the `TRILIUM_NO_UPLOAD_LIMIT` environment variable to `true` disable it completely: +If you're running into the 250MB limit imposed on the server by default, and you'd like to increase the upload limit, you can set the `TRILIUM_NO_UPLOAD_LIMIT` environment variable to `true` to disable it completely: ``` export TRILIUM_NO_UPLOAD_LIMIT=true diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.md new file mode 100644 index 000000000..1ea9ad997 --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone.md @@ -0,0 +1,2 @@ +# Nix flake +This is a clone of a note. Go to its [primary location](../Desktop%20Installation/Nix%20flake.md). \ No newline at end of file diff --git a/docs/User Guide/User Guide/Installation & Setup/Server Installation/System Requirements.md b/docs/User Guide/User Guide/Installation & Setup/Server Installation/System Requirements.md new file mode 100644 index 000000000..4b0221ee0 --- /dev/null +++ b/docs/User Guide/User Guide/Installation & Setup/Server Installation/System Requirements.md @@ -0,0 +1,11 @@ +# System Requirements +* Using Docker, the server can be run on Windows, Linux and macOS devices. +* Native binaries are provided for Linux x64 and ARM (`aarch64`). + +## Legacy ARM support + +The Docker builds also provide `linux/arm/v7` and `linux/arm/v8` platforms. These platforms are considered legacy since Trilium uses Node.js version 24 which have [officially downgraded support](https://github.com/nodejs/node/commit/6682861d6f) for these platforms to “experimental”. + +As a result, Trilium needs to use Node.js 22 for these versions. As soon as soon Node.js 22 will no longer be compatible, support for `armv7` and `armv8` will be dropped entirely. + +Regardless of upstream support, these platforms are supported on a best-effort basis and are not officially supported by the Trilium development team. Bug reports are accepted but they will not be treated with priority; contributions are welcome. \ No newline at end of file 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/Miscellaneous/Patterns of personal knowl.png b/docs/User Guide/User Guide/Miscellaneous/Patterns of personal knowl.png new file mode 100644 index 000000000..39788216a Binary files /dev/null and b/docs/User Guide/User Guide/Miscellaneous/Patterns of personal knowl.png differ diff --git a/docs/User Guide/User Guide/Miscellaneous/Patterns of personal knowledge.md b/docs/User Guide/User Guide/Miscellaneous/Patterns of personal knowledge.md new file mode 100644 index 000000000..977c201a3 --- /dev/null +++ b/docs/User Guide/User Guide/Miscellaneous/Patterns of personal knowledge.md @@ -0,0 +1,157 @@ +# Patterns of personal knowledge +> [!NOTE] +> This article is a description of the original author of Trilium (zadam) in regards with his own knowledge base. + +This page contains description of some of the patterns I use to organize information in my knowledge base. This is meant to give some inspiration of how one might create and structure their knowledge base in general and also specifically in Trilium Notes. It also gives some background and justification for some of the design decisions. + +## Meta patterns + +Just to be clear, meta patterns are "patterns of patterns", i.e. patterns appearing in other patterns. + +### Hierarchical organization of information + +Basic meta pattern is that I sort notes (units of information) into a hierarchy - I have some "top level" notes which represent coarse grained organization, these then split into sub-notes defining finer grained organization and so on. I consider this hierarchical (tree) organization very efficient for organization of large amounts of information. A lot of note taking software (such as Evernote) are frustratingly limited in this regard which limits scalability of the software to large amounts of notes. + +#### Scalability + +It's important to frame the following (meta) patterns with some idea of how large amount of data are we talking about. + +My rule of thumb for estimation of size of personal knowledge base is that you can reasonably produce around 10 notes a day, which is 3650 in a year. I plan to use my knowledge base long term (with or without Trilium Notes), probably decades so you can easily get to number 100 000 or even more. Right now, my personal knowledge base has around 10 000 notes. + +100 000 is a number to which most note taking software doesn't scale well (in both performance and UI). Yet I don't think it's really very much considering a lifetime of knowledge. + +#### Lazy hierarchy + +My approach to creating the hierarchy is being lazy - I don't create the structure first and then fill it with notes, instead I create single note for some specific topic and start using this one note. Once the content starts to grow, and I see how _some_ parts could be split out, I move them out into separate sub notes. As an example I have a book review for _The Fellowship of the Ring_: + +* Book reviews + * The Fellowship of the Ring + +The note contains basic book info (author, publisher etc.), book highlights with the comments and then overall review. Now it turns out there's far too many book highlights and overall review is also rather long, so I want to change the structure to the following: + +* Book reviews + * The Fellowship of the Ring       _(still contains basic info)_ + * Highlights + * Review + +If I used standard text file stored in a filesystem I would soon run into an annoying problem that in order to split out the Highlights and Review into sub-notes I would also have to convert _The Fellowship of the Ring_ from text file into directory and split out all sections of the note into sub-notes. Instead, Trilium treats all notes as equal - both leaf notes and inner notes can have both text content which allows me to sub-structure only content which needs it. + +### Sorting notes into multiple places in the hierarchy + +While organizing the notes into the hierarchy, you very quickly run into a dilemma - your note seem to belong to two places in the hierarchy equally. As an example - you want to make a note about [bash](https://en.wikipedia.org/wiki/Bash_\(Unix_shell\)) - does it belong to "OS / Linux" or "Programming / Scripting languages"? This is actually a false dichotomy forced down by the limits of the basic tree hierarchy - the answer is _of course it belongs to both_. This is the reason why Trilium doesn't use standard tree structure (which requires every note to have exactly one parent), but an extension which allows every note to have several parents, thus effectively allowing it to appear in multiple places in the hierarchy. For lack of better term I call this "cloning". The main problem with this term is that it suggests that each clone must have an original, but here all clones are completely equal - effectively there's no original. + +In tech lingo, it might be better to describe it as a [hard link](https://en.wikipedia.org/wiki/Hard_link) with an important difference that it is possible to hard link (clone) a directory (inner note). + +### Protected notes + +I have Trilium Notes opened non-stop. Sometimes I forget to lock my computer when going to the bathroom. Sometimes I let a friend or family member to use my computer for a minute without supervision. They might click on (running) Trilium and inadvertently see a note I really don't want anybody to see (personal diary, credentials). To cover this, Trilium has a concept of "[protected notes](https://github.com/zadam/trilium/wiki/Protected-notes)" - protected note is encrypted and on top of that requires the user to enter the password every 5 minutes which guarantees that such note can be in a readable state only for small amount of time. Working with ordinary (not protected) notes don't require password so you're not bothered by extra security when it's not needed. + +### Archiving notes + +Notes can lose relevancy with time - let's say I switch jobs - all the notes specific to the former employer immediately lose most of its import. This doesn't mean I want to delete these notes though - typically I just want them to somehow deprioritize - in Trilium I would do that by assigning an [inherited](https://github.com/zadam/trilium/wiki/Attribute-inheritance) [label](https://github.com/zadam/trilium/wiki/Attributes) `archived` to the company root note. The main effect of this label is that all the notes from this sub-tree are filtered out from search results (fast search via note autocomplete is my main [navigation approach](https://github.com/zadam/trilium/wiki/Note-navigation)). Apart from this, I also typically move such outdated notes to some less prominent place in the hierarchy. + +I use archivation also for notes which are not very relevant from their creation - an example might be automatically imported reddit comments. + +Sometimes there's no clear _category_ split between relevant and non-relevant notes, in that case I just create "_OLD_" note with `archived` label and move all irrelevant notes there. So my credentials note might look something like this: + +* Credentials + * Personal + * OLD       _(contains a bunch of notes with credentials for services I don't use anymore)_ + * Gmail + * Github + * ... + +## Patterns + +### Day note + +Every day has its note which contains or references everything related to the given day. Structure looks like this: + +* 2018 + * 11 - November + * 26 - Monday + * 27 - Tuesday + * subnote 1 + +Day note serves as a workspace and note inbox at the same time - it's the default location to create a note when I don't have time to think about proper placement. At the end of the day I typically review my day note and clone the notes into suitable locations in the hierarchy. + +Trilium has this pattern partly built-in - Trilium understands and can create this Year / Month / Day structure semi-automatically (on API call). There's also global keyboard shortcut `CTRL-ALT-P` which will create new note in the day note. + +What notes do I keep under this day note? + +* TODO list for given day (this can be automated - see Task Manager) +* Personal diary +* [clones](../Basic%20Concepts%20and%20Features/Notes/Cloning%20Notes.md) of notes I created during this day (which kind of represents what I've been working on). +* I often clone notes (or sub-trees) of e.g. projects I'm working on at given day so they are at hand +* I have some [scripts](../Scripting.md) which allow me to track certain daily metrics (like weight). These are saved into one daily "data note" (actually JSON [code note](../Note%20Types/Code.md)). + * I have other scripts which then help me to visualize these data (see a Weight Tracker example) + * I have a script which automatically imports all my comments from reddit into the day note. + * People are sometimes wondering why. The answer is that I usually put some effort and thought into a comment and that's why I feel it's worth preserving, especially if it can be done automatically. + +For most notes, this day note placement is _secondary_ and their primary location is somewhere else (e.g. for a book review I've been working on it's _Book / Reviews_, not the day note). So for this pattern to work, ability to [clone](../Basic%20Concepts%20and%20Features/Notes/Cloning%20Notes.md) notes into multiple places is pretty fundamental. + +### Projects + +_Project_ is pretty self-explanatory, for me specifically it also means being long term (years) - an example of a project might be Trilium Notes or university studies. Given their longevity, projects can be large and deep, but their structure is very domain specific, and I don't see any common patterns. What's pretty clear is they are often widely interconnected with other parts of the knowledge base - e.g. university credentials are cloned from "Credentials / University" top level notes and Trilium related blog posts are in "Blog / \[Name of the blog\] / Trilium". + +_Epics_ are the same thing as projects, but differ in scope - they are typically several months long and as such are usually placed into a year note (e.g. _2018 / Epics_). Epics are often of work nature (also cloned into work note) and personal (e.g. currently I have large epic for moving to a different city). + +I don't have a term for short term projects (typically several days long), but continuing the scrum analogy I might call them _story_. These are often placed directly into day notes and manually moved from one day to another (or place into a month note, e.g. _2018 / 11 - November_). + +### Credentials + +I keep all my credentials in the knowledge base, they are sorted into categories - work related, project related, personal per country etc. These notes are of course [protected](../Basic%20Concepts%20and%20Features/Notes/Protected%20Notes.md) and are often cloned into other places (e.g. project credentials are cloned into the project itself). This is a pretty important advantage compared to traditional tools like KeePass - all the relevant information is centralized into one place without compromising security. + +### People profiles + +This might seem creepy to some, but I keep a profile on most people. It contains pretty standard things like date of birth, contacts, address, but also current and previous employments, their hobbies and worldviews and sometimes even important (IM/mail/meatspace) conversations. Just about everything I find notable. It helps to refresh some basic info before meeting people, especially if you haven't been in touch in a while. It gets pretty awkward to ask for the tenth time where do they work for example, because you keep forgetting it. + +Naturally I have a lot of (extended) family members, friends, acquaintances etc. so I need some way to sort them. My main method is to sort them by social circle (work, high school, sports club etc.), sometimes also by their town of residence. Family _circle_ is still too large so the further organization is by _clan_ (as in "Smiths"). Some people are members of several such circles, so they are just cloned into multiple places. + +For family specifically it's pretty useful to create [relation map](../Note%20Types/Relation%20Map.md) to visualize relationships: + +
+ +[missing note] + +### Books + +Of course, I keep standard "To read" list. I also keep a record on the books I've read - typically one book has one subtree where the root has some basic info like author, page count, publication date, date started, date finished (in the form of Promoted Attributes). I also write a (private) review and keep list of highlights from Kindle, optionally with some commentary, these are usually stored in sub notes (unless they are pretty short). + +To keep the list of books manageable, I sort them per year (of reading them), this also gives me some basic overview of "reading performance" for given year. I plan to create a [script](../Scripting.md) which would show some timeline chart visualizing book attributes `dateStarted` - `dateFinished` to have nicer view of my reading sprints and trends. + +Some specific authors also have their own note which contains cloned book reviews, links to interviews and other related resources. + +I have similar system for movies and TV shows, but not as sophisticated. + +### Personal diary + +This is a place to reflect on events, experiences, new findings etc. This can help you get deeper understanding of your inner self, clarify your thinking and make better decisions as a result. + +I sort personal diary notes directly under _day note_ (explained above), but it can be cloned also to e.g. "trip note" (if the diary note is about given trip) or to person's profile (if the person plays a role in the diary note). All my diary notes are [protected](../Basic%20Concepts%20and%20Features/Notes/Protected%20Notes.md) since they are usually pretty sensitive. + +### Documents + +I keep all my personal documents (ID, passport, education certificates ...) scanned in the knowledge base. They are [synchronized](../Installation%20%26%20Setup/Synchronization.md) across every PC which provides decent backup and makes them available everywhere. + +Advantage compared to e.g. keeping them in Dropbox or Google Drive is that they are not stored on some 3rd party server and they can be encrypted ([protected](../Basic%20Concepts%20and%20Features/Notes/Protected%20Notes.md)). + +### Inventory + +Inventory contains documents and other relevant importation for my important belongings - e.g. for car you can keep the registration card, maintenance record, related costs etc. I also keep inventory for some items personally important to me - mainly computers, phones, cameras and similar electronics. This can be practical at times but also provides sentimental value. + +### Topic knowledge base + +This where I store hard "knowledge" - summarized topics and findings from different domains. Topics can range from traditional sciences - physics, history, economy to philosophy, mental models, apps (notes about specific apps I use) etc. Of course this is very subjective - given what I do, my Physics sub-tree is pretty sparse compared to my Programming subtree. + +### Work knowledge base + +I usually keep top level note for the company I currently work at (past jobs are moved elsewhere). I track basic organization of the company (divisions, business units), who is who ([relation maps](../Note%20Types/Relation%20Map.md)) are again useful for visualization), projects I work at etc. + +There's a number of credentials to various company services I need to use. Companies usually have a bunch of complex processes and tools. I record meeting minutes, link to the company wiki (which is usually difficult to find relevant info). In general there's a lot of company specific information I need to know or need have them at hand in a nice structure I can understand. Often it's just copy pasting and reshuffling of existing information into something more understandable for me. + +From my experience, keeping this makes me more productive and even more importantly dramatically reduces frustration and stress. + +## Conclusion + +I could probably go on with more patterns (e.g. study notes, travelling), but I think you get the idea. Whatever is important in your life, it probably makes sense to document and track it. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Miscellaneous/Privacy Policy.md b/docs/User Guide/User Guide/Miscellaneous/Privacy Policy.md new file mode 100644 index 000000000..fab3346c0 --- /dev/null +++ b/docs/User Guide/User Guide/Miscellaneous/Privacy Policy.md @@ -0,0 +1,17 @@ +# Privacy Policy +### Trilium Notes + +Trilium Notes does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary. + +Automatic network activity consists of: + +* Trilium periodically queries URL [https://github.com/TriliumNext/Trilium/releases](https://github.com/TriliumNext/Trilium/releases) to see if there's a new stable version released. (check only, there's no automatic download and/or installation). +* Trilium will download spelling dictionaries automatically as needed based on language settings + +### Trilium Web Clipper + +Trilium Web Clipper does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary. + +### Trilium Sender for Android + +Trilium Sender for Android does not collect/send any data from the user's installation, i.e. no analytics, no telemetry etc. The data flows only between user controlled / installed applications, without any intermediary. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types.md b/docs/User Guide/User Guide/Note Types.md index 9912d9fc7..27958b4ab 100644 --- a/docs/User Guide/User Guide/Note Types.md +++ b/docs/User Guide/User Guide/Note Types.md @@ -1,5 +1,5 @@ # Note Types -One core features of Trilium is that it supports multiple types of notes, depending on the need. +One of the core features of Trilium is that it supports multiple types of notes, depending on the need. ## Creating a new note with a different type via the note tree @@ -33,10 +33,10 @@ The following note types are supported by Trilium: | Relation Map | Allows easy creation of notes and relations between them. Can be used for mainly relational data such as a family tree. | | Note Map | Displays the relationships between the notes, whether via relations or their hierarchical structure. | | Render Note | Used in Scripting, it displays the HTML content of another note. This allows displaying any kind of content, provided there is a script behind it to generate it. | -| Collections | Displays the children of the note either as a grid, a list, or for a more specialized case: a calendar.

Generally useful for easy reading of short notes. | +| Collections | Displays the children of the note either as a grid, a list, or for a more specialized case: a calendar.

Generally useful for easy reading of short notes. | | Mermaid Diagrams | Displays diagrams such as bar charts, flow charts, state diagrams, etc. Requires a bit of technical knowledge since the diagrams are written in a specialized format. | | Canvas | Allows easy drawing of sketches, diagrams, handwritten content. Uses the same technology behind [excalidraw.com](https://excalidraw.com). | | Web View | Displays the content of an external web page, similar to a browser. | | Mind Map | Easy for brainstorming ideas, by placing them in a hierarchical layout. | -| Geo Map View | Displays the children of the note as a geographical map, one use-case would be to plan vacations. It even has basic support for tracks. Notes can also be created from it. | +| Geo Map View | Displays the children of the note as a geographical map, one use-case would be to plan vacations. It even has basic support for tracks. Notes can also be created from it. | | File | Represents an uploaded file such as PDFs, images, video or audio files. | \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/Collections.md b/docs/User Guide/User Guide/Note Types/Collections.md deleted file mode 100644 index 90287709d..000000000 --- a/docs/User Guide/User Guide/Note Types/Collections.md +++ /dev/null @@ -1,67 +0,0 @@ -# Collections -Collections are a unique type of notes that don't have a content, but instead display its child notes in various presentation methods. - -Classic collections are read-only mode and compiles the contents of all child notes into one continuous view. This makes it ideal for reading extensive information broken into smaller, manageable segments. - -* Grid View which is the default presentation method for child notes (see Note List), where the notes are displayed as tiles with their title and content being visible. -* List View is similar to Grid View, but it displays the notes one under the other with the content being expandable/collapsible, but also works recursively. - -More specialized collections were introduced, such as the: - -* Calendar View which displays a week, month or year calendar with the notes being shown as events. New events can be added easily by dragging across the calendar. -* Geo Map View which displays a geographical map in which the notes are represented as markers/pins on the map. New events can be easily added by pointing on the map. -* Table View displays each note as a row in a table, with Promoted Attributes being shown as well. This makes it easy to visualize attributes of notes, as well as making them easily editable. -* Board View (Kanban) displays notes in columns, grouped by the value of a label. - -For a quick presentation of all the supported view types, see the child notes of this help page, including screenshots. - -## Configuration - -To adjust the view type, see the dedicated _Collections_ tab in the Ribbon. - -## Use cases - -### Creating a new collection - -To create a new collections, right click in the Note Tree and look for the _Collections_ entry and select the desired type. - -### Adding a description to a collection - -To add a text before the collection, for example to describe it: - -1. Create a new collection. -2. In the Ribbon, go to _Basic Properties_ and change the note type from _Collection_ to _Text_. - -Now the text will be displayed above while still maintaining the collection view. - -### Using saved search - -Collections, by default, only display the child notes. However, it is possible to use the Search functionality 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 Saved Search. - -> [!IMPORTANT] -> While in search, none of the collections will not display the child notes of the search results. The reason is that the search might hit a note multiple times, causing an exponential rise in the number of results. - -### Creating a collection from scratch - -By default, collections come with a default configuration and sometimes even sample notes. To create a collection completely from scratch: - -1. Create a new note of type _Text_ (or any type). -2. In the Ribbon, go to _Basic Properties_ and select _Collection_ as the note type. -3. Still in the ribbon, go to _Collection Properties_ and select the desired view type. -4. Consult the help page of the corresponding view type in order to understand how to configure them. - -## Archived notes - -By default, archived notes will not be shown in collections. This behaviour can be changed by going to _Collection Properties_ in the Ribbon and checking _Show archived notes_. - -Archived notes will be generally indicated by being greyed out as opposed to the normal ones. - -## Under the hood - -Collections by themselves are simply notes with no content that rely on the Note List mechanism (the one that lists the children notes at the bottom of a note) to display information. - -By default, new collections use predefined Templates that are stored safely in the Hidden Notes to define some basic configuration such as the type of view, but also some Promoted Attributes to make editing easier. - -Collections don't store their configuration (e.g. the position on the map, the hidden columns in a table) in the content of the note itself, but as attachments. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Note Types/File.md b/docs/User Guide/User Guide/Note Types/File.md index e73fe5565..96733128a 100644 --- a/docs/User Guide/User Guide/Note Types/File.md +++ b/docs/User Guide/User Guide/Note Types/File.md @@ -63,7 +63,7 @@ Interactions: 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 whose content is not necessarily of interest to the user, such as third-party libraries or generated content, that can then be downloaded if needed. -Note that generally text files will be [imported](../Basic%20Concepts%20and%20Features/Import%20%26%20Export) as either Text or Code notes. To bypass this behavior and create a _File_ note type, use the _Import into note_ feature and uncheck _Import HTML, Markdown and TXT as text notes_, as well as _Import recognized code files as code notes_.  +Note that generally text files will be [imported](../Basic%20Concepts%20and%20Features/Import%20%26%20Export.md) as either Text or Code notes. To bypass this behavior and create a _File_ note type, use the _Import into note_ feature and uncheck _Import HTML, Markdown and TXT as text notes_, as well as _Import recognized code files as code notes_.  Since one of the use cases for having files instead of notes is to display large files, the content preview is limited to a relatively small amount of characters. To view the full file, consider opening it in an external application. diff --git a/docs/User Guide/User Guide/Note Types/Mermaid Diagrams.md b/docs/User Guide/User Guide/Note Types/Mermaid Diagrams.md index 61cf0d515..ff2954f42 100644 --- a/docs/User Guide/User Guide/Note Types/Mermaid Diagrams.md +++ b/docs/User Guide/User Guide/Note Types/Mermaid Diagrams.md @@ -1,10 +1,11 @@ # Mermaid Diagrams +> [!TIP] +> For a quick understanding of the Mermaid syntax, see Syntax reference (official documentation). +
Trilium supports Mermaid, which adds support for various diagrams such as flowchart, sequence diagram, class diagram, state diagram, pie charts, etc., all using a text description of the chart instead of manually drawing the diagram. -For the official documentation of Mermaid.js see [mermaid.js.org/intro/](https://mermaid.js.org/intro/). - ## Layouts Depending on the chart being edited and user preference, there are two layouts supported by the Mermaid note type: diff --git a/docs/User Guide/User Guide/Note Types/Mermaid Diagrams/Syntax reference.dat b/docs/User Guide/User Guide/Note Types/Mermaid Diagrams/Syntax reference.dat new file mode 100644 index 000000000..e69de29bb diff --git a/docs/User Guide/User Guide/Note Types/Text/10_Tables_image.png b/docs/User Guide/User Guide/Note Types/Text/10_Tables_image.png index 5cf2cc519..099b25357 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/10_Tables_image.png and b/docs/User Guide/User Guide/Note Types/Text/10_Tables_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/11_Tables_image.png b/docs/User Guide/User Guide/Note Types/Text/11_Tables_image.png index cde63c9ac..5cf2cc519 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/11_Tables_image.png and b/docs/User Guide/User Guide/Note Types/Text/11_Tables_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/12_Tables_image.png b/docs/User Guide/User Guide/Note Types/Text/12_Tables_image.png index 9c512ee53..cde63c9ac 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/12_Tables_image.png and b/docs/User Guide/User Guide/Note Types/Text/12_Tables_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/13_Tables_image.png b/docs/User Guide/User Guide/Note Types/Text/13_Tables_image.png new file mode 100644 index 000000000..9c512ee53 Binary files /dev/null and b/docs/User Guide/User Guide/Note Types/Text/13_Tables_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/14_Tables_image.png b/docs/User Guide/User Guide/Note Types/Text/14_Tables_image.png new file mode 100644 index 000000000..dd4becc16 Binary files /dev/null and b/docs/User Guide/User Guide/Note Types/Text/14_Tables_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/9_Tables_image.png b/docs/User Guide/User Guide/Note Types/Text/9_Tables_image.png index 099b25357..e80215476 100644 Binary files a/docs/User Guide/User Guide/Note Types/Text/9_Tables_image.png and b/docs/User Guide/User Guide/Note Types/Text/9_Tables_image.png differ diff --git a/docs/User Guide/User Guide/Note Types/Text/Tables.md b/docs/User Guide/User Guide/Note Types/Text/Tables.md index 88003853e..9944f4277 100644 --- a/docs/User Guide/User Guide/Note Types/Text/Tables.md +++ b/docs/User Guide/User Guide/Note Types/Text/Tables.md @@ -9,13 +9,13 @@ To create a table, simply press the table button and select with the mouse the d When a table is selected, a special formatting toolbar will appear: - + ## Navigating a table * Using the mouse: * Click on a cell to focus it. - * Click the button at the top or the bottom of a table to insert an empty paragraph near it. + * Click the button at the top or the bottom of a table to insert an empty paragraph near it. * Click the button at the top-left of the table to select it entirely (for easy copy-pasting or cutting) or drag and drop it to relocate the table. * Using the keyboard: * Use the arrow keys on the keyboard to easily navigate between cells. @@ -48,7 +48,7 @@ More options are available by pressing the arrow next to it:
-The table properties can be accessed via the button and allows for the following adjustments: +The table properties can be accessed via the button and allows for the following adjustments: * Border (not the border of the cells, but the outer rim of the table), which includes the style (single, double), color and width. * The background color, with none set by default. @@ -63,7 +63,7 @@ The table will immediately update to reflect the changes, but the _Save_ button
-Similarly to table properties, the button opens a popup which adjusts the styling of one or more cells (based on the user's selection). +Similarly to table properties, the button opens a popup which adjusts the styling of one or more cells (based on the user's selection). The following options can be adjusted: @@ -79,7 +79,25 @@ The cell will immediately update to reflect the changes, but the _Save_ button m Press the button to insert a caption or a text description of the table, which is going to be displayed above the table. -## Tables with invisible borders +## Table borders + +By default, tables will come with a predefined gray border. + +To adjust the borders, follow these steps: + +1. Select the table. +2. In the floating panel, select the _Table properties_ option (). + 1. Look for the _Border_ section at the top of the newly opened panel. + 2. This will control the outer borders of the table. + 3. Select a style for the border. Generally _Single_ is the desirable option. + 4. Select a color for the border. + 5. Select a width for the border, expressed in pixels. +3. Select all the cells of the table and then press the _Cell properties_ option (). + 1. This will control the inner borders of the table, at cell level. + 2. Note that it's possible to change the borders individually by selecting one or more cells, case in which it will only change the borders that intersect these cells. + 3. Repeat the same steps as from step (2). + +### Tables with invisible borders Tables can be set to have invisible borders in order to allow for basic layouts (columns, grids) of text or [images](Images.md) without the distraction of their border: 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/docs/User Guide/User Guide/Scripting.md b/docs/User Guide/User Guide/Scripting.md index f5724f8a3..b7fad64dc 100644 --- a/docs/User Guide/User Guide/Scripting.md +++ b/docs/User Guide/User Guide/Scripting.md @@ -1,18 +1,18 @@ # Scripting Trilium supports creating Code notes, i.e. notes which allow you to store some programming code and highlight it. Special case is JavaScript code notes which can also be executed inside Trilium which can in conjunction with Script API provide extra functionality. -## Scripting +## Architecture Overview To go further I must explain basic architecture of Trilium - in its essence it is a classic web application - it has these two main components: * frontend running in the browser (using HTML, CSS, JavaScript) - this is mainly used to interact with the user, display notes etc. * backend running JavaScript code in node.js runtime - this is responsible for e.g. storing notes, encrypting them etc. -So we have frontend and backend, each with their own set of responsibilities, but their common feature is that they both run JavaScript code. Add to this the fact, that we're able to create JavaScript \[\[code notes\]\] and we're onto something. +So we have frontend and backend, each with their own set of responsibilities, but their common feature is that they both run JavaScript code. Add to this the fact, that we're able to create JavaScript code notes and we're onto something. ## Use cases -* "New Task" launcher button +* "New Task" launcher button ## Action handler @@ -34,7 +34,7 @@ You can see more scripting with explanation in Events. +See Events. ## Script API diff --git a/docs/User Guide/User Guide/Scripting/Events.md b/docs/User Guide/User Guide/Scripting/Backend scripts/Events.md similarity index 78% rename from docs/User Guide/User Guide/Scripting/Events.md rename to docs/User Guide/User Guide/Scripting/Backend scripts/Events.md index 6dbeeeba6..227acd5f1 100644 --- a/docs/User Guide/User Guide/Scripting/Events.md +++ b/docs/User Guide/User Guide/Scripting/Backend scripts/Events.md @@ -1,15 +1,15 @@ # Events -[Script](../Scripting.md) notes can be triggered by events. Note that these are backend events and thus relation need to point to the "JS backend" code note. +[Script](../../Scripting.md) notes can be triggered by events. Note that these are backend events and thus relation need to point to the "JS backend" code note. ## Global events Global events are attached to the script note via label. Simply create e.g. "run" label with some of these values and script note will be executed once the event occurs. -
LabelDescription
run

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

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

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

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

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

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

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

  • A title
  • A corresponding boxicons icon (without the bx- prefix).
  • Optionally, a keyboard shortcut to assign to it.
  • The action, which will be executed when the button is pressed.
const taskNoteId = await api.runOnBackend(() => {
+    // Shown below.           
+    return resp.note.noteId;
+});
  • This portion of code is actually executed on the server (backend) and not on the client (i.e. browser).
    • The reason is that the creating notes is the responsibility of the server.
  • Here we can also see that it is possible to return results from the server execution and read them in the client (taskNoteId).
const todoRootNote = api.getNoteWithLabel("taskTodoRoot");
  • Here we identify a note with the label #taskTodoRoot. This is how the Task Manager showcase knows where to place all the different tasks.
  • Normally this might return a null value if no such note could be identified, but error handling is outside the scope of this example. 
const resp = api.createTextNote(todoRootNote.noteId, "New task", "")
  • We create a new child note within the to-do root note (first argument) with the title “New task" (second argument) and no content by default (third argument).
await api.waitUntilSynced();
  • Back on the client, since we created a new note on the server, we now need to wait for the change to be reflected in the client.
await api.activateNewNote(taskNoteId);
  • Since we know the ID of the newly created note, all we have to do now is to show this note to the user.
\ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Examples/New Task launcher button_i.png b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button_i.png similarity index 100% rename from docs/User Guide/User Guide/Scripting/Examples/New Task launcher button_i.png rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button_i.png diff --git a/docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes .png b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes .png similarity index 100% rename from docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes .png rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes .png diff --git a/docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c.md similarity index 100% rename from docs/User Guide/User Guide/Scripting/Examples/Using promoted attributes to c.md rename to docs/User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c.md diff --git a/docs/User Guide/User Guide/Scripting/Script API.md b/docs/User Guide/User Guide/Scripting/Script API.md index cb470e28e..3739cd532 100644 --- a/docs/User Guide/User Guide/Scripting/Script API.md +++ b/docs/User Guide/User Guide/Scripting/Script API.md @@ -1,5 +1,5 @@ # Script API -For [script code notes](../Scripting.md), Trilium offers an API that gives them access to various features of the application. +tFor [script code notes](../Scripting.md), Trilium offers an API that gives them access to various features of the application. There are two APIs: diff --git a/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md b/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md index f601885a9..5f63a4579 100644 --- a/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md +++ b/docs/User Guide/User Guide/Theme development/Custom app-wide CSS.md @@ -84,4 +84,4 @@ To change the color of the note title and the icon (above the content): Some parts of the application can't be styled directly via custom CSS because they are rendered in an isolated mode (shadow DOM), more specifically: -* The slides in a Presentation View. \ No newline at end of file +* The slides in a Presentation View. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Troubleshooting.md b/docs/User Guide/User Guide/Troubleshooting.md index f439d1185..3be0af47f 100644 --- a/docs/User Guide/User Guide/Troubleshooting.md +++ b/docs/User Guide/User Guide/Troubleshooting.md @@ -1,5 +1,5 @@ # Troubleshooting -As Trilium is currently in beta, encountering bugs is to be expected. +While Trilium is actively maintained and stable, encountering bugs is possible. ## General Quick Fix @@ -21,7 +21,7 @@ TRILIUM_START_NOTE_ID=root ./trilium ## Broken Script Prevents Application Startup -If a custom script causes Triliumto crash, and it is set as a startup script or in an active [custom widget](Scripting/Custom%20Widgets.md), start Triliumin "safe mode" to prevent any custom scripts from executing: +If a custom script causes Trilium to crash, and it is set as a startup script or in an active [custom widget](Scripting/Frontend%20Basics/Custom%20Widgets.md), start Triliumin "safe mode" to prevent any custom scripts from executing: ``` TRILIUM_SAFE_MODE=true ./trilium diff --git a/docs/index.md b/docs/index.md index 5bf104216..33bbff30d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,27 +21,27 @@ Trilium Notes is a powerful, feature-rich note-taking application designed for b
-- :material-rocket-launch-outline: **[Quick Start Guide](User%20Guide/quick-start.md)** +- :material-rocket-launch-outline: **[Quick Start Guide](User%20Guide/User%20Guide/Quick%20Start.md)** Get up and running with Trilium in minutes -- :material-download: **[Installation](User%20Guide/installation.md)** +- :material-download: **[Desktop Installation](User%20Guide/User%20Guide/Installation%20%26%20Setup/Desktop%20Installation.md)** - Download and install Trilium on your platform + Download and install Trilium on your desktop -- :material-docker: **[Docker Setup](User%20Guide/docker.md)** +- :material-server: **[Server Installation](User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation.md)** - Deploy Trilium using Docker containers + Deploy Trilium as a server -- :material-book-open-variant: **[User Guide](User%20Guide/index.md)** +- :material-book-open-variant: **[User Guide](User%20Guide/User%20Guide.md)** Comprehensive guide to all features -- :material-code-braces: **[Script API](Script%20API/index.md)** +- :material-code-braces: **[Script API](Script%20API/index.html)** Automate and extend Trilium with scripting -- :material-wrench: **[Developer Guide](Developer%20Guide/index.md)** +- :material-wrench: **[Developer Guide](Developer%20Guide/Developer%20Guide/Environment%20Setup.md)** Contributing and development documentation @@ -80,14 +80,14 @@ Trilium Notes is a powerful, feature-rich note-taking application designed for b ## Getting Help -- **[FAQ](support/faq.md)** - Frequently asked questions -- **[Troubleshooting](support/troubleshooting.md)** - Common issues and solutions +- **[FAQ](User%20Guide/User%20Guide/FAQ.md)** - Frequently asked questions +- **[Troubleshooting](User%20Guide/User%20Guide/Troubleshooting.md)** - Common issues and solutions - **[Community Forum](https://github.com/triliumnext/trilium/discussions)** - Ask questions and share tips - **[Issue Tracker](https://github.com/triliumnext/trilium/issues)** - Report bugs and request features ## Contributing -Trilium is open-source and welcomes contributions! Check out our [Contributing Guide](Developer%20Guide/contributing.md) to get started. +Trilium is open-source and welcomes contributions! Check out our [GitHub repository](https://github.com/triliumnext/trilium) to get started. ## License diff --git a/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 aa44a8bf0..10fe5fbf0 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,8 @@ "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 build-docs start", + "docs:preview": "pnpm http-server site -p 9000", "edit-docs:edit-docs": "pnpm run --filter edit-docs edit-docs", "edit-docs:edit-demo": "pnpm run --filter edit-docs edit-demo", "test:all": "pnpm test:parallel && pnpm test:sequential", @@ -41,29 +42,30 @@ "@fast-csv/parse": "5.0.5", "@playwright/test": "1.56.1", "@triliumnext/server": "workspace:*", - "@types/express": "5.0.4", - "@types/node": "22.18.12", + "@types/express": "5.0.5", + "@types/node": "24.10.0", "@vitest/coverage-v8": "3.2.4", "@vitest/ui": "3.2.4", "chalk": "5.6.2", "cross-env": "10.1.0", "dpdm": "3.14.0", - "esbuild": "0.25.11", - "eslint": "9.38.0", + "esbuild": "0.25.12", + "eslint": "9.39.1", "eslint-config-prettier": "10.1.8", - "eslint-plugin-playwright": "2.2.2", + "eslint-plugin-playwright": "2.3.0", "eslint-plugin-react-hooks": "7.0.1", "happy-dom": "~20.0.0", + "http-server": "14.1.1", "jiti": "2.6.1", "jsonc-eslint-parser": "2.4.1", "react-refresh": "0.18.0", - "rollup-plugin-webpack-stats": "2.1.6", + "rollup-plugin-webpack-stats": "2.1.7", "tslib": "2.8.1", "tsx": "4.20.6", "typescript": "~5.9.0", - "typescript-eslint": "8.46.2", + "typescript-eslint": "8.46.3", "upath": "2.0.1", - "vite": "7.1.12", + "vite": "7.2.1", "vite-plugin-dts": "~4.5.0", "vitest": "3.2.4" }, @@ -81,7 +83,7 @@ "url": "https://github.com/TriliumNext/Trilium/issues" }, "homepage": "https://triliumnotes.org", - "packageManager": "pnpm@10.19.0", + "packageManager": "pnpm@10.20.0", "pnpm": { "patchedDependencies": { "@ckeditor/ckeditor5-mention": "patches/@ckeditor__ckeditor5-mention.patch", @@ -89,7 +91,7 @@ "ckeditor5": "patches/ckeditor5.patch" }, "overrides": { - "mermaid": "11.12.0", + "mermaid": "11.12.1", "preact": "10.27.2", "roughjs": "4.6.6", "@types/express-serve-static-core": "5.1.0", @@ -104,7 +106,7 @@ "on-headers@<1.1.0": ">=1.1.0", "form-data@>=4.0.0 <4.0.4": ">=4.0.4", "form-data@>=3.0.0 <3.0.4": ">=3.0.4", - "node-abi": "4.15.0" + "node-abi": "4.17.0" }, "ignoredBuiltDependencies": [ "sqlite3" diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 1413fec20..19c8bf358 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -25,11 +25,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", - "ckeditor5": "47.1.0", - "eslint": "9.38.0", + "ckeditor5": "47.2.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", @@ -42,7 +42,7 @@ "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "47.1.0" + "ckeditor5": "47.2.0" }, "author": "Elian Doran ", "license": "GPL-2.0-or-later", diff --git a/packages/ckeditor5-admonition/tsconfig.json b/packages/ckeditor5-admonition/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-admonition/tsconfig.json +++ b/packages/ckeditor5-admonition/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 786cb2e77..c4083c41e 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -26,11 +26,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", - "ckeditor5": "47.1.0", - "eslint": "9.38.0", + "ckeditor5": "47.2.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", @@ -43,7 +43,7 @@ "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "47.1.0" + "ckeditor5": "47.2.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", diff --git a/packages/ckeditor5-footnotes/tsconfig.json b/packages/ckeditor5-footnotes/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-footnotes/tsconfig.json +++ b/packages/ckeditor5-footnotes/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index 8fc80dd33..e78e6ff0c 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -28,11 +28,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", - "ckeditor5": "47.1.0", - "eslint": "9.38.0", + "ckeditor5": "47.2.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", @@ -45,7 +45,7 @@ "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "47.1.0" + "ckeditor5": "47.2.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", diff --git a/packages/ckeditor5-keyboard-marker/tsconfig.json b/packages/ckeditor5-keyboard-marker/tsconfig.json index 015853699..089f1440a 100644 --- a/packages/ckeditor5-keyboard-marker/tsconfig.json +++ b/packages/ckeditor5-keyboard-marker/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index fca16801d..b133005e8 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -29,11 +29,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", - "ckeditor5": "47.1.0", - "eslint": "9.38.0", + "ckeditor5": "47.2.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", @@ -46,7 +46,7 @@ "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "47.1.0" + "ckeditor5": "47.2.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", @@ -71,6 +71,6 @@ ] }, "dependencies": { - "@ckeditor/ckeditor5-icons": "47.1.0" + "@ckeditor/ckeditor5-icons": "47.2.0" } } diff --git a/packages/ckeditor5-math/tsconfig.json b/packages/ckeditor5-math/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-math/tsconfig.json +++ b/packages/ckeditor5-math/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 246cc41c5..a41657ec2 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -28,11 +28,11 @@ "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "4.1.1", "@typescript-eslint/eslint-plugin": "~8.46.0", - "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/parser": "8.46.3", "@vitest/browser": "3.2.4", "@vitest/coverage-istanbul": "3.2.4", - "ckeditor5": "47.1.0", - "eslint": "9.38.0", + "ckeditor5": "47.2.0", + "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.6", @@ -45,7 +45,7 @@ "webdriverio": "9.20.0" }, "peerDependencies": { - "ckeditor5": "47.1.0" + "ckeditor5": "47.2.0" }, "scripts": { "build": "node ./scripts/build-dist.mjs", diff --git a/packages/ckeditor5-mermaid/tsconfig.json b/packages/ckeditor5-mermaid/tsconfig.json index f53643f74..c239ab5c9 100644 --- a/packages/ckeditor5-mermaid/tsconfig.json +++ b/packages/ckeditor5-mermaid/tsconfig.json @@ -26,6 +26,7 @@ "moduleResolution": "NodeNext", "module": "NodeNext", "skipLibCheck": true, + "outDir": "out-tsc", "typeRoots": [ "typings", "node_modules/@types" diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json index d73384443..ecd792d04 100644 --- a/packages/ckeditor5/package.json +++ b/packages/ckeditor5/package.json @@ -11,11 +11,11 @@ "@triliumnext/ckeditor5-keyboard-marker": "workspace:*", "@triliumnext/ckeditor5-math": "workspace:*", "@triliumnext/ckeditor5-mermaid": "workspace:*", - "ckeditor5": "47.1.0", - "ckeditor5-premium-features": "47.1.0" + "ckeditor5": "47.2.0", + "ckeditor5-premium-features": "47.2.0" }, "devDependencies": { - "@smithy/middleware-retry": "4.4.5", + "@smithy/middleware-retry": "4.4.6", "@types/jquery": "3.5.33" } } diff --git a/packages/ckeditor5/src/augmentation.ts b/packages/ckeditor5/src/augmentation.ts index c1018db37..6f05b9f2a 100644 --- a/packages/ckeditor5/src/augmentation.ts +++ b/packages/ckeditor5/src/augmentation.ts @@ -19,6 +19,5 @@ declare global { getHeaders(): Promise>; getReferenceLinkTitle(href: string): Promise; getReferenceLinkTitleSync(href: string): string; - importMarkdownInline(): void; } } diff --git a/packages/ckeditor5/src/plugins/markdownimport.ts b/packages/ckeditor5/src/plugins/markdownimport.ts index c00b9f7f6..02f208e1d 100644 --- a/packages/ckeditor5/src/plugins/markdownimport.ts +++ b/packages/ckeditor5/src/plugins/markdownimport.ts @@ -31,7 +31,10 @@ export default class MarkdownImportPlugin extends Plugin { class ImportMarkdownCommand extends Command { execute() { - glob.importMarkdownInline(); + const editorEl = this.editor.editing.view.getDomRoot(); + const component = glob.getComponentByEl(editorEl); + + component.triggerCommand('pasteMarkdownIntoText'); } } 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/codemirror/package.json b/packages/codemirror/package.json index 48485c005..7bdc83796 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -50,6 +50,6 @@ "codemirror-lang-elixir": "4.0.0", "codemirror-lang-hcl": "0.1.0", "codemirror-lang-mermaid": "0.5.0", - "eslint-linter-browserify": "9.38.0" + "eslint-linter-browserify": "9.39.1" } } diff --git a/packages/commons/src/lib/keyboard_actions_interface.ts b/packages/commons/src/lib/keyboard_actions_interface.ts index c3de7e0db..ce2defcd6 100644 --- a/packages/commons/src/lib/keyboard_actions_interface.ts +++ b/packages/commons/src/lib/keyboard_actions_interface.ts @@ -35,6 +35,7 @@ const enum KeyboardActionNamesEnum { activateNextTab, activatePreviousTab, openNewWindow, + openTodayNote, toggleTray, toggleZenMode, firstTab, diff --git a/packages/commons/src/lib/server_api.ts b/packages/commons/src/lib/server_api.ts index b3ec032ee..dc6dc4d41 100644 --- a/packages/commons/src/lib/server_api.ts +++ b/packages/commons/src/lib/server_api.ts @@ -29,7 +29,7 @@ export interface DeleteNotesPreview { export interface RevisionItem { noteId: string; revisionId?: string; - dateLastEdited?: string; + dateCreated?: string; contentLength?: number; type: NoteType; title: string; diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index a521b66aa..fbd289fbc 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", @@ -21,14 +23,20 @@ "Zerebos " ], "license": "Apache-2.0", + "dependencies": { + "boxicons": "2.1.4", + "fuse.js": "7.1.0", + "katex": "0.16.25", + "mermaid": "11.12.0" + }, "devDependencies": { "@digitak/esrun": "3.2.26", - "@types/swagger-ui": "5.21.1", - "@typescript-eslint/eslint-plugin": "8.46.2", - "@typescript-eslint/parser": "8.46.2", + "@triliumnext/ckeditor5": "workspace:*", + "@typescript-eslint/eslint-plugin": "8.46.3", + "@typescript-eslint/parser": "8.46.3", "dotenv": "17.2.3", - "esbuild": "0.25.11", - "eslint": "9.38.0", + "esbuild": "0.25.12", + "eslint": "9.39.1", "highlight.js": "11.11.1", "typescript": "5.9.3" } diff --git a/packages/share-theme/scripts/build.ts b/packages/share-theme/scripts/build.ts index 586005ea5..8f90d0828 100644 --- a/packages/share-theme/scripts/build.ts +++ b/packages/share-theme/scripts/build.ts @@ -1,4 +1,3 @@ -import fs from "node:fs"; import path from "node:path"; // import {fileURLToPath} from "node:url"; @@ -46,29 +45,39 @@ 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, outdir: path.join(rootDir, "dist"), - format: "cjs", + format: "esm", target: ["chrome96"], loader: { ".png": "dataurl", ".gif": "dataurl", - ".woff": "dataurl", - ".woff2": "dataurl", - ".ttf": "dataurl", + ".woff": "file", + ".woff2": "file", + ".ttf": "file", + ".eot": "empty", + ".svg": "empty", ".html": "text", ".css": "css" }, 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 7b71fcb8f..4769ea76e 100644 --- a/packages/share-theme/src/scripts/index.ts +++ b/packages/share-theme/src/scripts/index.ts @@ -1,8 +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 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 { @@ -13,8 +18,39 @@ function $try unknown>(func: T, ...args: Paramete } } +Object.assign(window, api); $try(setupThemeSelector); $try(setupToC); $try(setupExpanders); $try(setupMobileMenu); $try(setupSearch); + +function setupTextNote() { + $try(setupMermaid); + $try(setupMath); +} + +document.addEventListener( + "DOMContentLoaded", + () => { + const noteType = determineNoteType(); + + if (noteType === "text") { + setupTextNote(); + } + + const toggleMenuButton = document.getElementById("toggleMenuButton"); + const layout = document.getElementById("layout"); + + if (toggleMenuButton && layout) { + toggleMenuButton.addEventListener("click", () => layout.classList.toggle("showMenu")); + } + }, + false +); + +function determineNoteType() { + const bodyClass = document.body.className; + const match = bodyClass.match(/type-([^\s]+)/); + return match ? match[1] : null; +} diff --git a/packages/share-theme/src/scripts/modules/api.ts b/packages/share-theme/src/scripts/modules/api.ts new file mode 100644 index 000000000..adaca77d1 --- /dev/null +++ b/packages/share-theme/src/scripts/modules/api.ts @@ -0,0 +1,18 @@ +/** + * Fetch note with given ID from backend + * + * @param noteId of the given note to be fetched. If false, fetches current note. + */ +async function fetchNote(noteId: string | null = null) { + if (!noteId) { + noteId = document.body.getAttribute("data-note-id"); + } + + const resp = await fetch(`api/notes/${noteId}`); + + return await resp.json(); +} + +export default { + fetchNote +}; diff --git a/packages/share-theme/src/scripts/modules/math.ts b/packages/share-theme/src/scripts/modules/math.ts new file mode 100644 index 000000000..3893dbeed --- /dev/null +++ b/packages/share-theme/src/scripts/modules/math.ts @@ -0,0 +1,16 @@ +import "katex/dist/katex.min.css"; + +export default async function setupMath() { + const anyMathBlock = document.querySelector("#content .math-tex"); + if (!anyMathBlock) { + return; + } + + const renderMathInElement = (await import("katex/contrib/auto-render")).default; + await import("katex/contrib/mhchem"); + + const contentEl = document.getElementById("content"); + if (!contentEl) return; + renderMathInElement(contentEl); + document.body.classList.add("math-loaded"); +} diff --git a/apps/client/src/share/mermaid.ts b/packages/share-theme/src/scripts/modules/mermaid.ts similarity index 53% rename from apps/client/src/share/mermaid.ts rename to packages/share-theme/src/scripts/modules/mermaid.ts index 123f3816c..78ae5a573 100644 --- a/apps/client/src/share/mermaid.ts +++ b/packages/share-theme/src/scripts/modules/mermaid.ts @@ -1,7 +1,12 @@ -import mermaid from "mermaid"; +export default async function setupMermaid() { + const mermaidEls = document.querySelectorAll("#content pre code.language-mermaid"); + if (mermaidEls.length === 0) { + return; + } -export default function setupMermaid() { - for (const codeBlock of document.querySelectorAll("#content pre code.language-mermaid")) { + const mermaid = (await import("mermaid")).default; + + for (const codeBlock of mermaidEls) { const parentPre = codeBlock.parentElement; if (!parentPre) { continue; 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/scripts/modules/toc.ts b/packages/share-theme/src/scripts/modules/toc.ts index f38b1de1d..6d7ca2cfd 100644 --- a/packages/share-theme/src/scripts/modules/toc.ts +++ b/packages/share-theme/src/scripts/modules/toc.ts @@ -3,14 +3,15 @@ * it even exists for users without client-side js * and that means it loads with the page so it avoids * all potential reshuffling or layout recalculations. - * + * * So, all this function needs to do is make the links * perform smooth animation, and adjust the "active" * entry as the user scrolls. */ export default function setupToC() { + const container = document.getElementById("right-pane"); const toc = document.getElementById("toc"); - if (!toc) return; + if (!toc || !container) return; // Get all relevant elements const sections = document.getElementById("content")!.querySelectorAll("h2, h3, h4, h5, h6"); @@ -23,7 +24,7 @@ export default function setupToC() { if (!target) return; e.preventDefault(); e.stopPropagation(); - + target.scrollIntoView({behavior: "smooth"}); }); } @@ -32,15 +33,15 @@ export default function setupToC() { function changeLinkState() { let index = sections.length; - // Work backkwards to find the first matching section - while (--index && window.scrollY + 50 < (sections[index] as HTMLElement).offsetTop) {} // eslint-disable-line no-empty + // Work backwards to find the first matching section + while (--index && container!.scrollTop + 50 < (sections[index] as HTMLElement).offsetTop) {} // eslint-disable-line no-empty // Update the "active" item in ToC links.forEach((link) => link.classList.remove("active")); links[index].classList.add("active"); } - + // Initial render changeLinkState(); - window.addEventListener("scroll", changeLinkState); -} \ No newline at end of file + container.addEventListener("scroll", changeLinkState); +} 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 d500888a6..0749e7d09 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,4 +47,32 @@ #content img { max-width: 100%; + height: auto; +} + +body:not(.math-loaded) .math-tex { + visibility: hidden; +} + +body.type-webView { + #main { + max-width: unset; + padding: 0; + } + + #content { + display: flex; + flex-direction: column; + height: 100%; + + h1 { + display: none; + } + + iframe.webview { + width: 100%; + flex-grow: 1; + border: 0; + } + } } \ No newline at end of file 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 2fd07c8a7..0a7db95b4 100644 --- a/packages/share-theme/src/templates/page.ejs +++ b/packages/share-theme/src/templates/page.ejs @@ -29,18 +29,12 @@ - api/notes/<%= note.getRelation("shareFavicon").value %>/download<% } else { %>../favicon.ico<% } %>"> - - <% if (!isDev && !note.isLabelTruthy("shareOmitDefaultCss")) { %> - - + + <% for (const url of cssToLoad) { %> + <% } %> - - <% for (const cssRelation of note.getRelations("shareCss")) { %> - - <% } %> - <% for (const jsRelation of note.getRelations("shareJs")) { %> - + <% for (const url of jsToLoad) { %> + <% } %> <% if (note.hasLabel("shareDisallowRobotIndexing")) { %> @@ -60,6 +54,19 @@ } %> <%= pageTitle %> + "> @@ -80,14 +87,10 @@ <%- renderSnippets("head:end") %> <% -const customLogoId = subRoot.note.getRelation("shareLogo")?.value; -const logoUrl = customLogoId ? `api/images/${customLogoId}/image.png` : `../${assetUrlFragment}/images/icon-color.svg`; 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) => { @@ -96,7 +99,7 @@ content = content.replaceAll(headingRe, (...match) => { return match[0]; }); %> - + <%- renderSnippets("body:start") %> @@ -184,7 +182,7 @@ content = content.replaceAll(headingRe, (...match) => { <% } %>