From 07f273fda40b138c0262d8c1aea172948af62855 Mon Sep 17 00:00:00 2001 From: Wael Nasreddine Date: Sat, 31 Jan 2026 01:00:57 -0800 Subject: [PATCH 001/560] feat: enhance build-docs utility with pnpm and Nix support This enhances the `build-docs` utility to allow running it via pnpm and packaging it as a Nix application. Changes include: - Added `build` and `cli` scripts to `apps/build-docs/package.json`. - Implemented a standalone CLI wrapper for documentation generation. - Added a `trilium-build-docs` package to the Nix flake for use in other projects. - Integrated `apps/build-docs` into the Nix workspace and build pipeline. These changes make the documentation build process more portable and easier to integrate into CI/CD pipelines outside of the main repository. --- apps/build-docs/package.json | 10 +- apps/build-docs/scripts/build.ts | 23 +++ .../src/backend_script_entrypoint.ts | 11 +- apps/build-docs/src/build-docs.ts | 189 +++++++++++++++--- apps/build-docs/src/cli.ts | 89 +++++++++ .../src/frontend_script_entrypoint.ts | 9 +- apps/build-docs/src/main.ts | 7 +- apps/build-docs/src/script-api.ts | 3 +- apps/build-docs/src/swagger.ts | 10 +- apps/build-docs/tsconfig.json | 4 +- apps/build-docs/typedoc.backend.json | 1 + apps/build-docs/typedoc.frontend.json | 1 + apps/server/src/services/export/zip.ts | 4 +- apps/server/src/services/utils.ts | 11 +- flake.nix | 42 +++- pnpm-lock.yaml | 6 +- 16 files changed, 365 insertions(+), 55 deletions(-) create mode 100644 apps/build-docs/scripts/build.ts create mode 100644 apps/build-docs/src/cli.ts diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index ac5be7e9be..e8934b71ec 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -1,10 +1,15 @@ { "name": "build-docs", "version": "1.0.0", - "description": "", + "description": "Build documentation from Trilium notes", "main": "src/main.ts", + "bin": { + "trilium-build-docs": "dist/cli.js" + }, "scripts": { - "start": "tsx ." + "start": "tsx .", + "cli": "tsx src/cli.ts", + "build": "tsx scripts/build.ts" }, "keywords": [], "author": "Elian Doran ", @@ -14,6 +19,7 @@ "@redocly/cli": "2.15.0", "archiver": "7.0.1", "fs-extra": "11.3.3", + "js-yaml": "4.1.1", "react": "19.2.4", "react-dom": "19.2.4", "typedoc": "0.28.16", diff --git a/apps/build-docs/scripts/build.ts b/apps/build-docs/scripts/build.ts new file mode 100644 index 0000000000..79fa01f3f6 --- /dev/null +++ b/apps/build-docs/scripts/build.ts @@ -0,0 +1,23 @@ +import BuildHelper from "../../../scripts/build-utils"; + +const build = new BuildHelper("apps/build-docs"); + +async function main() { + // Build the CLI and other TypeScript files + await build.buildBackend([ + "src/cli.ts", + "src/main.ts", + "src/build-docs.ts", + "src/swagger.ts", + "src/script-api.ts", + "src/context.ts" + ]); + + // Copy HTML template + build.copy("src/index.html", "index.html"); + + // Copy node modules dependencies if needed + build.copyNodeModules([ "better-sqlite3", "bindings", "file-uri-to-path" ]); +} + +main(); diff --git a/apps/build-docs/src/backend_script_entrypoint.ts b/apps/build-docs/src/backend_script_entrypoint.ts index bc9087c0c1..0447900b6b 100644 --- a/apps/build-docs/src/backend_script_entrypoint.ts +++ b/apps/build-docs/src/backend_script_entrypoint.ts @@ -13,8 +13,12 @@ * 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 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"; @@ -31,6 +35,7 @@ export type { Api }; const fakeNote = new BNote(); /** - * The `api` global variable allows access to the backend script API, which is documented in {@link Api}. + * 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 index 5d1a0cdd6f..357ecb1d41 100644 --- a/apps/build-docs/src/build-docs.ts +++ b/apps/build-docs/src/build-docs.ts @@ -1,19 +1,90 @@ process.env.TRILIUM_INTEGRATION_TEST = "memory-no-store"; -process.env.TRILIUM_RESOURCE_DIR = "../server/src"; +// Only set TRILIUM_RESOURCE_DIR if not already set (e.g., by Nix wrapper) +if (!process.env.TRILIUM_RESOURCE_DIR) { + 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 archiver from "archiver"; +import { execSync } from "child_process"; +import { WriteStream } from "fs"; 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 yaml from "js-yaml"; +import { dirname, join, resolve } from "path"; + import BuildContext from "./context.js"; +interface NoteMapping { + rootNoteId: string; + path: string; + format: "markdown" | "html" | "share"; + ignoredFiles?: string[]; + exportOnly?: boolean; +} + +interface Config { + baseUrl: string; + noteMappings: NoteMapping[]; +} + const DOCS_ROOT = "../../../docs"; const OUTPUT_DIR = "../../site"; +// Load configuration from edit-docs-config.yaml +async function loadConfig(configPath?: string): Promise { + const pathsToTry = configPath + ? [resolve(configPath)] + : [ + join(process.cwd(), "edit-docs-config.yaml"), + join(__dirname, "../../../edit-docs-config.yaml") + ]; + + for (const path of pathsToTry) { + try { + const configContent = await fs.readFile(path, "utf-8"); + const config = yaml.load(configContent) as Config; + + // Resolve all paths relative to the config file's directory + const CONFIG_DIR = dirname(path); + config.noteMappings = config.noteMappings.map((mapping) => ({ + ...mapping, + path: resolve(CONFIG_DIR, mapping.path) + })); + + return config; + } catch (error) { + if (error.code !== "ENOENT") { + throw error; // rethrow unexpected errors + } + } + } + + return null; // No config file found +} + +async function exportDocs( + noteId: string, + format: "markdown" | "html" | "share", + outputPath: string, + ignoredFiles?: string[] +) { + const zipFilePath = `output-${noteId}.zip`; + try { + const { exportToZipFile } = (await import("@triliumnext/server/src/services/export/zip.js")) + .default; + await exportToZipFile(noteId, format, zipFilePath, {}); + + const ignoredSet = ignoredFiles ? new Set(ignoredFiles) : undefined; + await extractZip(zipFilePath, outputPath, ignoredSet); + } finally { + if (await fsExtra.exists(zipFilePath)) { + await fsExtra.rm(zipFilePath); + } + } +} + async function importAndExportDocs(sourcePath: string, outputSubDir: string) { const note = await importData(sourcePath); @@ -21,15 +92,18 @@ async function importAndExportDocs(sourcePath: string, outputSubDir: string) { const zipName = outputSubDir || "user-guide"; const zipFilePath = `output-${zipName}.zip`; try { - const { exportToZip } = (await import("@triliumnext/server/src/services/export/zip.js")).default; + 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 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); + const { waitForStreamToFinish } = await import("@triliumnext/server/src/services/utils.js"); await waitForStreamToFinish(fileOutputStream); // Output to root directory if outputSubDir is empty, otherwise to subdirectory @@ -42,7 +116,7 @@ async function importAndExportDocs(sourcePath: string, outputSubDir: string) { } } -async function buildDocsInner() { +async function buildDocsInner(config?: Config) { const i18n = await import("@triliumnext/server/src/services/i18n.js"); await i18n.initializeTranslations(); @@ -53,18 +127,49 @@ async function buildDocsInner() { 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"); + if (config) { + // Config-based build (reads from edit-docs-config.yaml) + console.log("Building documentation from config file..."); - // Build Developer Guide - console.log("Building Developer Guide..."); - await importAndExportDocs(join(__dirname, DOCS_ROOT, "Developer Guide"), "developer-guide"); + // Import all non-export-only mappings + for (const mapping of config.noteMappings) { + if (!mapping.exportOnly) { + console.log(`Importing from ${mapping.path}...`); + await importData(mapping.path); + } + } - // 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")); + // Export all mappings + for (const mapping of config.noteMappings) { + if (mapping.exportOnly) { + console.log(`Exporting ${mapping.format} to ${mapping.path}...`); + await exportDocs( + mapping.rootNoteId, + mapping.format, + mapping.path, + mapping.ignoredFiles + ); + } + } + } else { + // Legacy hardcoded build (for backward compatibility) + console.log("Building User Guide..."); + await importAndExportDocs(join(__dirname, DOCS_ROOT, "User Guide"), "user-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!"); } @@ -91,12 +196,13 @@ async function createImportZip(path: string) { zlib: { level: 0 } }); - console.log("Archive path is ", resolve(path)) + console.log("Archive path is ", resolve(path)); archive.directory(path, "/"); const outputStream = fsExtra.createWriteStream(inputFile); archive.pipe(outputStream); archive.finalize(); + const { waitForStreamToFinish } = await import("@triliumnext/server/src/services/utils.js"); await waitForStreamToFinish(outputStream); try { @@ -106,15 +212,15 @@ async function createImportZip(path: string) { } } -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")); +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)) { @@ -129,6 +235,27 @@ export async function extractZip(zipFilePath: string, outputPath: string, ignore }); } +export async function buildDocsFromConfig(configPath?: string, gitRootDir?: string) { + const config = await loadConfig(configPath); + + if (gitRootDir) { + // Build the share theme if we have a gitRootDir (for Trilium project) + execSync(`pnpm run --filter share-theme build`, { + stdio: "inherit", + cwd: gitRootDir + }); + } + + // Trigger the actual build. + await new Promise((res, rej) => { + cls.init(() => { + buildDocsInner(config ?? undefined) + .catch(rej) + .then(res); + }); + }); +} + export default async function buildDocs({ gitRootDir }: BuildContext) { // Build the share theme. execSync(`pnpm run --filter share-theme build`, { diff --git a/apps/build-docs/src/cli.ts b/apps/build-docs/src/cli.ts new file mode 100644 index 0000000000..8aee089701 --- /dev/null +++ b/apps/build-docs/src/cli.ts @@ -0,0 +1,89 @@ +#!/usr/bin/env node + +import packageJson from "../package.json" with { type: "json" }; +import { buildDocsFromConfig } from "./build-docs.js"; + +// Parse command-line arguments +function parseArgs() { + const args = process.argv.slice(2); + let configPath: string | undefined; + let showHelp = false; + let showVersion = false; + + for (let i = 0; i < args.length; i++) { + if (args[i] === "--config" || args[i] === "-c") { + configPath = args[i + 1]; + if (!configPath) { + console.error("Error: --config/-c requires a path argument"); + process.exit(1); + } + i++; // Skip the next argument as it's the value + } else if (args[i] === "--help" || args[i] === "-h") { + showHelp = true; + } else if (args[i] === "--version" || args[i] === "-v") { + showVersion = true; + } + } + + return { configPath, showHelp, showVersion }; +} + +function getVersion(): string { + return packageJson.version; +} + +function printHelp() { + const version = getVersion(); + console.log(` +Usage: trilium-build-docs [options] + +Options: + -c, --config Path to the configuration file + (default: edit-docs-config.yaml in current directory) + -h, --help Display this help message + -v, --version Display version information + +Description: + Builds documentation from Trilium note structure and exports to various formats. + Configuration file should be in YAML format with the following structure: + + baseUrl: "https://example.com" + noteMappings: + - rootNoteId: "noteId123" + path: "docs" + format: "markdown" + - rootNoteId: "noteId456" + path: "public/docs" + format: "share" + exportOnly: true + +Version: ${version} +`); +} + +function printVersion() { + const version = getVersion(); + console.log(version); +} + +async function main() { + const { configPath, showHelp, showVersion } = parseArgs(); + + if (showHelp) { + printHelp(); + process.exit(0); + } else if (showVersion) { + printVersion(); + process.exit(0); + } + + try { + await buildDocsFromConfig(configPath); + process.exit(0); + } catch (error) { + console.error("Error building documentation:", error); + process.exit(1); + } +} + +main(); diff --git a/apps/build-docs/src/frontend_script_entrypoint.ts b/apps/build-docs/src/frontend_script_entrypoint.ts index 768774eca6..7aba11b2a4 100644 --- a/apps/build-docs/src/frontend_script_entrypoint.ts +++ b/apps/build-docs/src/frontend_script_entrypoint.ts @@ -13,16 +13,19 @@ * 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 BasicWidget } from "../../client/src/widgets/basic_widget.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 + +// @ts-expect-error - FrontendScriptApi is not directly exportable as Api without this simulation. export const api: Api = new FrontendScriptApi(); diff --git a/apps/build-docs/src/main.ts b/apps/build-docs/src/main.ts index d94ada167b..cca17125d8 100644 --- a/apps/build-docs/src/main.ts +++ b/apps/build-docs/src/main.ts @@ -1,9 +1,10 @@ -import { join } from "path"; -import BuildContext from "./context"; -import buildSwagger from "./swagger"; import { cpSync, existsSync, mkdirSync, rmSync } from "fs"; +import { join } from "path"; + import buildDocs from "./build-docs"; +import BuildContext from "./context"; import buildScriptApi from "./script-api"; +import buildSwagger from "./swagger"; const context: BuildContext = { gitRootDir: join(__dirname, "../../../"), diff --git a/apps/build-docs/src/script-api.ts b/apps/build-docs/src/script-api.ts index 8473ae3a02..2c62477474 100644 --- a/apps/build-docs/src/script-api.ts +++ b/apps/build-docs/src/script-api.ts @@ -1,7 +1,8 @@ import { execSync } from "child_process"; -import BuildContext from "./context"; import { join } from "path"; +import BuildContext from "./context"; + export default function buildScriptApi({ baseDir, gitRootDir }: BuildContext) { // Generate types execSync(`pnpm typecheck`, { stdio: "inherit", cwd: gitRootDir }); diff --git a/apps/build-docs/src/swagger.ts b/apps/build-docs/src/swagger.ts index b3677aeebe..2af458ec47 100644 --- a/apps/build-docs/src/swagger.ts +++ b/apps/build-docs/src/swagger.ts @@ -1,7 +1,8 @@ -import BuildContext from "./context"; -import { join } from "path"; import { execSync } from "child_process"; import { mkdirSync } from "fs"; +import { join } from "path"; + +import BuildContext from "./context"; interface BuildInfo { specPath: string; @@ -27,6 +28,9 @@ export default function buildSwagger({ baseDir, gitRootDir }: BuildContext) { 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" }); + execSync( + `pnpm redocly build-docs ${absSpecPath} -o ${targetDir}/index.html`, + { stdio: "inherit" } + ); } } diff --git a/apps/build-docs/tsconfig.json b/apps/build-docs/tsconfig.json index 858921cfb6..99c9b71b37 100644 --- a/apps/build-docs/tsconfig.json +++ b/apps/build-docs/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "../../tsconfig.base.json", - "include": [], + "include": [ + "scripts/**/*.ts" + ], "references": [ { "path": "../server" diff --git a/apps/build-docs/typedoc.backend.json b/apps/build-docs/typedoc.backend.json index 1781774c6f..a7f91c42e4 100644 --- a/apps/build-docs/typedoc.backend.json +++ b/apps/build-docs/typedoc.backend.json @@ -4,6 +4,7 @@ "entryPoints": [ "src/backend_script_entrypoint.ts" ], + "tsconfig": "tsconfig.app.json", "plugin": [ "typedoc-plugin-missing-exports" ] diff --git a/apps/build-docs/typedoc.frontend.json b/apps/build-docs/typedoc.frontend.json index f07d20dc71..c462004712 100644 --- a/apps/build-docs/typedoc.frontend.json +++ b/apps/build-docs/typedoc.frontend.json @@ -4,6 +4,7 @@ "entryPoints": [ "src/frontend_script_entrypoint.ts" ], + "tsconfig": "tsconfig.app.json", "plugin": [ "typedoc-plugin-missing-exports" ] diff --git a/apps/server/src/services/export/zip.ts b/apps/server/src/services/export/zip.ts index 4a9f140411..a6cd5b59c3 100644 --- a/apps/server/src/services/export/zip.ts +++ b/apps/server/src/services/export/zip.ts @@ -3,7 +3,7 @@ import dateUtils from "../date_utils.js"; import path from "path"; import packageInfo from "../../../package.json" with { type: "json" }; -import { getContentDisposition } from "../utils.js"; +import { getContentDisposition, waitForStreamToFinish } from "../utils.js"; import protectedSessionService from "../protected_session.js"; import sanitize from "sanitize-filename"; import fs from "fs"; @@ -468,6 +468,7 @@ async function exportToZip(taskContext: TaskContext<"export">, branch: BBranch, taskContext.taskSucceeded(null); } + async function exportToZipFile(noteId: string, format: ExportFormat, zipFilePath: string, zipExportOptions?: AdvancedExportOptions) { const fileOutputStream = fs.createWriteStream(zipFilePath); const taskContext = new TaskContext("no-progress-reporting", "export", null); @@ -479,6 +480,7 @@ async function exportToZipFile(noteId: string, format: ExportFormat, zipFilePath } await exportToZip(taskContext, note.getParentBranches()[0], format, fileOutputStream, false, zipExportOptions); + await waitForStreamToFinish(fileOutputStream); log.info(`Exported '${noteId}' with format '${format}' to '${zipFilePath}'`); } diff --git a/apps/server/src/services/utils.ts b/apps/server/src/services/utils.ts index a97b84a6c7..a2b707edf9 100644 --- a/apps/server/src/services/utils.ts +++ b/apps/server/src/services/utils.ts @@ -1,5 +1,4 @@ - import chardet from "chardet"; import crypto from "crypto"; import escape from "escape-html"; @@ -516,6 +515,13 @@ function slugify(text: string) { .replace(/(^-|-$)+/g, ""); // trim dashes } +export function waitForStreamToFinish(stream: any): Promise { + return new Promise((resolve, reject) => { + stream.on("finish", () => resolve()); + stream.on("error", (err) => reject(err)); + }); +} + export default { compareVersions, constantTimeCompare, @@ -556,5 +562,6 @@ export default { toBase64, toMap, toObject, - unescapeHtml + unescapeHtml, + waitForStreamToFinish }; diff --git a/flake.nix b/flake.nix index 23a7a38cf4..69a0482b8c 100644 --- a/flake.nix +++ b/flake.nix @@ -113,7 +113,7 @@ [ moreutils # sponge nodejs.python - removeReferencesTo + removeReferencesTo ] ++ lib.optionals (app == "desktop" || app == "edit-docs") [ copyDesktopItems @@ -126,7 +126,7 @@ which electron ] - ++ lib.optionals (app == "server") [ + ++ lib.optionals (app == "server" || app == "build-docs") [ makeBinaryWrapper ] ++ lib.optionals stdenv.hostPlatform.isDarwin [ @@ -153,7 +153,7 @@ # This file is a symlink into /build which is not allowed. postFixup = '' - rm $out/opt/trilium*/node_modules/better-sqlite3/node_modules/.bin/prebuild-install || true + find $out/opt -name prebuild-install -path "*/better-sqlite3/node_modules/.bin/*" -delete || true ''; components = [ @@ -169,6 +169,7 @@ "packages/highlightjs" "packages/turndown-plugin-gfm" + "apps/build-docs" "apps/client" "apps/db-compare" "apps/desktop" @@ -277,11 +278,46 @@ ''; }; + build-docs = makeApp { + app = "build-docs"; + preBuildCommands = '' + pushd apps/server + pnpm rebuild || true + popd + ''; + buildTask = "client:build && pnpm run server:build && pnpm run --filter build-docs build"; + mainProgram = "trilium-build-docs"; + installCommands = '' + mkdir -p $out/{bin,opt/trilium-build-docs} + + # Copy build-docs dist + cp --archive apps/build-docs/dist/* $out/opt/trilium-build-docs + + # Copy server dist (needed for runtime) + mkdir -p $out/opt/trilium-build-docs/server + cp --archive apps/server/dist/* $out/opt/trilium-build-docs/server/ + + # Copy client dist (needed for runtime) + mkdir -p $out/opt/trilium-build-docs/client + cp --archive apps/client/dist/* $out/opt/trilium-build-docs/client/ + + # Copy share-theme (needed for exports) + mkdir -p $out/opt/trilium-build-docs/packages/share-theme + cp --archive packages/share-theme/dist/* $out/opt/trilium-build-docs/packages/share-theme/ + + # Create wrapper script + makeWrapper ${lib.getExe nodejs} $out/bin/trilium-build-docs \ + --add-flags $out/opt/trilium-build-docs/cli.cjs \ + --set TRILIUM_RESOURCE_DIR $out/opt/trilium-build-docs/server + ''; + }; + in { packages.desktop = desktop; packages.server = server; packages.edit-docs = edit-docs; + packages.build-docs = build-docs; packages.default = desktop; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e48992b05..f584515033 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -164,6 +164,9 @@ importers: fs-extra: specifier: 11.3.3 version: 11.3.3 + js-yaml: + specifier: 4.1.1 + version: 4.1.1 react: specifier: 19.2.4 version: 19.2.4 @@ -16544,8 +16547,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-markdown-gfm@47.4.0': dependencies: @@ -16954,6 +16955,7 @@ snapshots: ckeditor5: 47.4.0 transitivePeerDependencies: - bufferutil + - supports-color - utf-8-validate '@ckeditor/ckeditor5-utils@47.4.0': From 808625e564b7fd890ee5d04d49f3ee4f2abbb526 Mon Sep 17 00:00:00 2001 From: perfectra1n Date: Sun, 1 Feb 2026 09:19:37 -0800 Subject: [PATCH 002/560] feat(etapi): add attachments etapi endpoint --- apps/server/etapi.openapi.yaml | 25 +++++++++++++++++++++++++ apps/server/src/etapi/attachments.ts | 6 ++++++ 2 files changed, 31 insertions(+) diff --git a/apps/server/etapi.openapi.yaml b/apps/server/etapi.openapi.yaml index af05bdbe57..8b8a65f2b3 100644 --- a/apps/server/etapi.openapi.yaml +++ b/apps/server/etapi.openapi.yaml @@ -362,6 +362,31 @@ paths: application/json; charset=utf-8: schema: $ref: "#/components/schemas/Error" + /notes/{noteId}/attachments: + parameters: + - name: noteId + in: path + required: true + schema: + $ref: "#/components/schemas/EntityId" + get: + description: Returns all attachments for a note identified by its ID + operationId: getNoteAttachments + responses: + "200": + description: list of attachments + content: + application/json; charset=utf-8: + schema: + type: array + items: + $ref: "#/components/schemas/Attachment" + default: + description: unexpected error + content: + application/json; charset=utf-8: + schema: + $ref: "#/components/schemas/Error" /notes/{noteId}/undelete: parameters: - name: noteId diff --git a/apps/server/src/etapi/attachments.ts b/apps/server/src/etapi/attachments.ts index f8fd9c16dc..48cccec29a 100644 --- a/apps/server/src/etapi/attachments.ts +++ b/apps/server/src/etapi/attachments.ts @@ -8,6 +8,12 @@ import type { AttachmentRow } from "@triliumnext/commons"; import type { ValidatorMap } from "./etapi-interface.js"; function register(router: Router) { + eu.route(router, "get", "/etapi/notes/:noteId/attachments", (req, res, next) => { + const note = eu.getAndCheckNote(req.params.noteId); + const attachments = note.getAttachments(); + res.json(attachments.map((attachment) => mappers.mapAttachmentToPojo(attachment))); + }); + const ALLOWED_PROPERTIES_FOR_CREATE_ATTACHMENT: ValidatorMap = { ownerId: [v.notNull, v.isNoteId], role: [v.notNull, v.isString], From cbf879bd32473f2f474cbd01e8c86b462364a8f7 Mon Sep 17 00:00:00 2001 From: ibs-allaow <255127489+ibs-allaow@users.noreply.github.com> Date: Sat, 31 Jan 2026 22:12:47 +0100 Subject: [PATCH 003/560] Translated using Weblate (Arabic) Currently translated at 59.2% (90 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/ar/ --- apps/website/src/translations/ar/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/ar/translation.json b/apps/website/src/translations/ar/translation.json index d367a27d8e..497ea0559d 100644 --- a/apps/website/src/translations/ar/translation.json +++ b/apps/website/src/translations/ar/translation.json @@ -41,7 +41,9 @@ "search_title": "البحث القوي", "web_clipper_title": "اداة قص الويب", "title": "الانتاجية والسلامة", - "jump_to_title": "الاوامر والبحث السريع" + "jump_to_title": "الاوامر والبحث السريع", + "revisions_content": "تُحفظ الملاحظات دوريًا في الخلفية، ويمكن استخدام التعديلات للمراجعة أو للتراجع عن التغييرات غير المقصودة. كما يمكن إنشاء التعديلات عند الطلب.", + "sync_content": "استخدم نسخة مستضافة ذاتيًا أو نسخة سحابية لمزامنة ملاحظاتك بسهولة عبر أجهزة متعددة، وللوصول إليها من هاتفك المحمول باستخدام تطبيق ويب تقدمي (PWA)." }, "note_types": { "canvas_title": "مساحة العمل", From e38a0361bf850e448cf28c3488c098ccc291286c Mon Sep 17 00:00:00 2001 From: green Date: Sun, 1 Feb 2026 04:24:58 +0100 Subject: [PATCH 004/560] Translated using Weblate (Japanese) Currently translated at 100.0% (389 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/ja/ --- apps/server/src/assets/translations/ja/server.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/ja/server.json b/apps/server/src/assets/translations/ja/server.json index c0bbadcf43..4b3e8397b4 100644 --- a/apps/server/src/assets/translations/ja/server.json +++ b/apps/server/src/assets/translations/ja/server.json @@ -344,7 +344,8 @@ "inbox-title": "Inbox", "base-abstract-launcher-title": "ベース アブストラクトランチャー", "command-palette": "コマンドパレットを開く", - "zen-mode": "禅モード" + "zen-mode": "禅モード", + "tab-switcher-title": "タブ切り替え" }, "notes": { "new-note": "新しいノート", From 2c2c68261a1509cc857917872a35ab8db53f3a34 Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 31 Jan 2026 23:36:37 +0100 Subject: [PATCH 005/560] Translated using Weblate (German) Currently translated at 100.0% (389 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/de/ --- apps/server/src/assets/translations/de/server.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/de/server.json b/apps/server/src/assets/translations/de/server.json index 96deee663e..70b8decc10 100644 --- a/apps/server/src/assets/translations/de/server.json +++ b/apps/server/src/assets/translations/de/server.json @@ -257,7 +257,8 @@ "localization": "Sprache & Region", "inbox-title": "Posteingang", "zen-mode": "Zen-Modus", - "command-palette": "Befehlspalette öffnen" + "command-palette": "Befehlspalette öffnen", + "tab-switcher-title": "Tabauswahl" }, "notes": { "new-note": "Neue Notiz", From 246849ce9476f0eb4bad9cec1020b3f29f989f7d Mon Sep 17 00:00:00 2001 From: Marcel Date: Sat, 31 Jan 2026 23:36:12 +0100 Subject: [PATCH 006/560] Translated using Weblate (German) Currently translated at 100.0% (1767 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/ --- apps/client/src/translations/de/translation.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index c250131841..42bd035e63 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1771,7 +1771,8 @@ "geo-map": { "create-child-note-title": "Neue Unternotiz anlegen und zur Karte hinzufügen", "create-child-note-instruction": "Auf die Karte klicken, um eine neue Notiz an der Stelle zu erstellen oder Escape drücken um abzubrechen.", - "unable-to-load-map": "Karte konnte nicht geladen werden." + "unable-to-load-map": "Karte konnte nicht geladen werden.", + "create-child-note-text": "Marker hinzufügen" }, "geo-map-context": { "open-location": "Ort öffnen", @@ -2270,5 +2271,10 @@ }, "platform_indicator": { "available_on": "Verfügbar auf {{platform}}" + }, + "mobile_tab_switcher": { + "title_one": "{{count}} Tab", + "title_other": "{{count}} Tabs", + "more_options": "Weitere Optionen" } } From b1573b1f3b955c308edc10d688efdbf807d727ce Mon Sep 17 00:00:00 2001 From: noobhjy Date: Sun, 1 Feb 2026 13:53:49 +0100 Subject: [PATCH 007/560] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (389 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/zh_Hans/ --- apps/server/src/assets/translations/cn/server.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/cn/server.json b/apps/server/src/assets/translations/cn/server.json index 194f7ce32c..cc03e97335 100644 --- a/apps/server/src/assets/translations/cn/server.json +++ b/apps/server/src/assets/translations/cn/server.json @@ -259,7 +259,8 @@ "ai-llm-title": "AI/LLM", "inbox-title": "收件箱", "command-palette": "打开命令面板", - "zen-mode": "禅模式" + "zen-mode": "禅模式", + "tab-switcher-title": "标签切换器" }, "notes": { "new-note": "新建笔记", From bd907ea008e6a50af61ea14b3196fd93d280cf5f Mon Sep 17 00:00:00 2001 From: Ulices Date: Sun, 1 Feb 2026 00:49:04 +0100 Subject: [PATCH 008/560] Translated using Weblate (Spanish) Currently translated at 100.0% (1767 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/es/ --- apps/client/src/translations/es/translation.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index 896a8f62be..aa0cbd188c 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -2285,5 +2285,11 @@ }, "platform_indicator": { "available_on": "Disponible en {{platform}}" + }, + "mobile_tab_switcher": { + "title_one": "{{count}} pestaña", + "title_many": "{{count}} pestañas", + "title_other": "{{count}} pestañas", + "more_options": "Más opciones" } } From 996607d096607c6d9a004ea0c946ed50525b68b8 Mon Sep 17 00:00:00 2001 From: ibs-allaow <255127489+ibs-allaow@users.noreply.github.com> Date: Sat, 31 Jan 2026 22:00:08 +0100 Subject: [PATCH 009/560] Translated using Weblate (Arabic) Currently translated at 59.5% (1053 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ar/ --- apps/client/src/translations/ar/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json index 296a0fdc86..39c9bb8415 100644 --- a/apps/client/src/translations/ar/translation.json +++ b/apps/client/src/translations/ar/translation.json @@ -29,7 +29,9 @@ "widget-render-error": { "title": "فشل عرض عنصر واجهة مستخدم React مخصص" }, - "widget-missing-parent": "لا تحتوي الأداة المخصصة على خاصية إلزامية '{{property}}'.\n\nإذا كان من المفترض تشغيل هذا البرنامج النصي بدون عنصر واجهة مستخدم، فاستخدم '#run=frontendStartup' بدلاً من ذلك." + "widget-missing-parent": "لا تحتوي الأداة المخصصة على خاصية إلزامية '{{property}}'.\n\nإذا كان من المفترض تشغيل هذا البرنامج النصي بدون عنصر واجهة مستخدم، فاستخدم '#run=frontendStartup' بدلاً من ذلك.", + "open-script-note": "فتح ملاحظة برمجية", + "scripting-error": "خطأ في النص البرمجي المخصص: {{title}}" }, "add_link": { "add_link": "أضافة رابط", From 0dc4692dfc970882512183429f7cc3cfbbefd2e2 Mon Sep 17 00:00:00 2001 From: noobhjy Date: Sun, 1 Feb 2026 13:57:02 +0100 Subject: [PATCH 010/560] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1767 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/ --- apps/client/src/translations/cn/translation.json | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index 9dd25e5984..83e8a25e75 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -1782,8 +1782,8 @@ "desktop-application": "桌面应用程序", "native-title-bar": "原生标题栏", "native-title-bar-description": "对于 Windows 和 macOS,关闭原生标题栏可使应用程序看起来更紧凑。在 Linux 上,保留原生标题栏可以更好地与系统集成。", - "background-effects": "启用背景效果(仅适用于 Windows 11)", - "background-effects-description": "Mica 效果为应用窗口添加模糊且时尚的背景,营造出深度感和现代外观。「原生标题栏」必須被禁用。", + "background-effects": "启用背景效果", + "background-effects-description": "为应用窗口添加模糊且时尚的背景,营造出深度感和现代外观。「原生标题栏」必須被禁用。", "restart-app-button": "重启应用程序以查看更改", "zoom-factor": "缩放系数" }, @@ -1802,7 +1802,8 @@ "geo-map": { "create-child-note-title": "创建一个新的子笔记并将其添加到地图中", "create-child-note-instruction": "单击地图以在该位置创建新笔记,或按 Escape 以取消。", - "unable-to-load-map": "无法加载地图。" + "unable-to-load-map": "无法加载地图。", + "create-child-note-text": "添加标记" }, "geo-map-context": { "open-location": "打开位置", @@ -2117,7 +2118,7 @@ }, "call_to_action": { "background_effects_title": "背景效果现已推出稳定版本", - "background_effects_message": "在 Windows 装置上,背景效果现在已完全稳定。背景效果通过模糊背后的背景,为使用者界面增添一抹色彩。此技术也用于其他应用程序,例如 Windows 资源管理器。", + "background_effects_message": "在 Windows 和 macOS 设备上,背景效果现在已稳定。背景效果通过模糊背后的背景,为使用者界面增添一抹色彩。", "background_effects_button": "启用背景效果", "next_theme_title": "试用新 Trilium 主题", "next_theme_message": "当前使用旧版主题,要试用新主题吗?", @@ -2253,5 +2254,12 @@ "pages_alt": "第{{pageNumber}}页", "pages_loading": "加载中...", "layers_other": "{{count}} 层" + }, + "platform_indicator": { + "available_on": "在 {{platform}} 上可用" + }, + "mobile_tab_switcher": { + "title_other": "{{count}} 选项卡", + "more_options": "更多选项" } } From a166f049d545c225727f5903d4d860a8314697ab Mon Sep 17 00:00:00 2001 From: Ulices Date: Sun, 1 Feb 2026 00:48:19 +0100 Subject: [PATCH 011/560] Translated using Weblate (Spanish) Currently translated at 100.0% (389 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/es/ --- apps/server/src/assets/translations/es/server.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/es/server.json b/apps/server/src/assets/translations/es/server.json index b95d54dd0e..4a930c63b8 100644 --- a/apps/server/src/assets/translations/es/server.json +++ b/apps/server/src/assets/translations/es/server.json @@ -259,7 +259,8 @@ "inbox-title": "Bandeja", "jump-to-note-title": "Saltar a...", "command-palette": "Abrir paleta de comandos", - "zen-mode": "Modo Zen" + "zen-mode": "Modo Zen", + "tab-switcher-title": "Conmutador de pestañas" }, "notes": { "new-note": "Nueva nota", From 5d0c91202f5777e258f95cb88b217cdc34a665e9 Mon Sep 17 00:00:00 2001 From: green Date: Sun, 1 Feb 2026 04:25:16 +0100 Subject: [PATCH 012/560] Translated using Weblate (Japanese) Currently translated at 100.0% (1767 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/ --- apps/client/src/translations/ja/translation.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index 4d6f72caab..6c8414dbf7 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -2008,7 +2008,8 @@ "geo-map": { "create-child-note-title": "新しい子ノートを作成し、マップに追加する", "create-child-note-instruction": "地図をクリックしてその場所に新しいノートを作成するか、Esc キーを押して閉じます。", - "unable-to-load-map": "マップを読み込めません。" + "unable-to-load-map": "マップを読み込めません。", + "create-child-note-text": "マーカーを追加" }, "geo-map-context": { "open-location": "現在位置を表示", @@ -2256,5 +2257,9 @@ }, "platform_indicator": { "available_on": "{{platform}} で利用可能" + }, + "mobile_tab_switcher": { + "title_other": "{{count}} タブ", + "more_options": "その他のオプション" } } From 676ca44cdf8fb909bb1713dc954493b0d4545747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Feb 2026 19:33:01 +0100 Subject: [PATCH 013/560] Added translation using Weblate (Irish) --- apps/client/src/translations/ga/translation.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/client/src/translations/ga/translation.json diff --git a/apps/client/src/translations/ga/translation.json b/apps/client/src/translations/ga/translation.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/apps/client/src/translations/ga/translation.json @@ -0,0 +1 @@ +{} From ca161bc88105a9f56579564021ad0913c920702a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Feb 2026 19:33:05 +0100 Subject: [PATCH 014/560] Added translation using Weblate (Irish) --- docs/README-ga.md | 337 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 docs/README-ga.md diff --git a/docs/README-ga.md b/docs/README-ga.md new file mode 100644 index 0000000000..0da3a37bf9 --- /dev/null +++ b/docs/README-ga.md @@ -0,0 +1,337 @@ +
+ 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/) + + + +[Chinese (Simplified Han script)](./README-ZH_CN.md) | [Chinese (Traditional Han +script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md) +| [German](./README-de.md) | [Greek](./README-el.md) | [Italian](./README-it.md) +| [Japanese](./README-ja.md) | [Romanian](./README-ro.md) | +[Spanish](./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 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](./User%20Guide/User%20Guide/) in + this repository + +### Quick Links +- [Getting Started Guide](https://docs.triliumnotes.org/) +- [Installation Instructions](https://docs.triliumnotes.org/user-guide/setup) +- [Docker + Setup](https://docs.triliumnotes.org/user-guide/setup/server/installation/docker) +- [Upgrading + TriliumNext](https://docs.triliumnotes.org/user-guide/setup/upgrading) +- [Basic Concepts and + Features](https://docs.triliumnotes.org/user-guide/concepts/notes) +- [Patterns of Personal Knowledge + Base](https://docs.triliumnotes.org/user-guide/misc/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://docs.triliumnotes.org/user-guide/concepts/notes/cloning)) +* Rich WYSIWYG note editor including e.g. tables, images and + [math](https://docs.triliumnotes.org/user-guide/note-types/text) with markdown + [autoformat](https://docs.triliumnotes.org/user-guide/note-types/text/markdown-formatting) +* Support for editing [notes with source + code](https://docs.triliumnotes.org/user-guide/note-types/code), including + syntax highlighting +* Fast and easy [navigation between + notes](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation), + full text search and [note + hoisting](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting) +* Seamless [note + versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions) +* Note + [attributes](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes) + can be used for note organization, querying and advanced + [scripting](https://docs.triliumnotes.org/user-guide/scripts) +* UI available in English, German, Spanish, French, Romanian, and Chinese + (simplified and traditional) +* Direct [OpenID and TOTP + integration](https://docs.triliumnotes.org/user-guide/setup/server/mfa) for + more secure login +* [Synchronization](https://docs.triliumnotes.org/user-guide/setup/synchronization) + with self-hosted sync server + * there are [3rd party services for hosting synchronisation + server](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) +* [Sharing](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) + (publishing) notes to public internet +* Strong [note + encryption](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) + with per-note granularity +* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type + "canvas") +* [Relation + maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and + [note/link maps](https://docs.triliumnotes.org/user-guide/note-types/note-map) + for visualizing notes and their relations +* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/) +* [Geo maps](https://docs.triliumnotes.org/user-guide/collections/geomap) with + location pins and GPX tracks +* [Scripting](https://docs.triliumnotes.org/user-guide/scripts) - see [Advanced + showcases](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) +* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) for + automation +* Scales well in both usability and performance upwards of 100 000 notes +* Touch optimized [mobile + frontend](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) for + smartphones and tablets +* Built-in [dark + theme](https://docs.triliumnotes.org/user-guide/concepts/themes), support for + user themes +* [Evernote](https://docs.triliumnotes.org/user-guide/concepts/import-export/evernote) + and [Markdown import & + export](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown) +* [Web Clipper](https://docs.triliumnotes.org/user-guide/setup/web-clipper) for + easy saving of web content +* Customizable UI (sidebar buttons, user-defined widgets, ...) +* [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), + along with a Grafana Dashboard. + +✨ 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://docs.triliumnotes.org/user-guide/setup/server). + + +## 💻 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://docs.triliumnotes.org/user-guide/note-types/relation-map) and + [link + maps](https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#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. From 88f509cbb62fb124ac2499fa5bfb599360c8315d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Feb 2026 19:33:08 +0100 Subject: [PATCH 015/560] Added translation using Weblate (Irish) --- apps/server/src/assets/translations/ga/server.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/server/src/assets/translations/ga/server.json diff --git a/apps/server/src/assets/translations/ga/server.json b/apps/server/src/assets/translations/ga/server.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/apps/server/src/assets/translations/ga/server.json @@ -0,0 +1 @@ +{} From 2ddd5d75fc61e07c2826cfcdb9458b14b7e1a373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Feb 2026 19:33:10 +0100 Subject: [PATCH 016/560] Added translation using Weblate (Irish) --- apps/website/src/translations/ga/translation.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/website/src/translations/ga/translation.json diff --git a/apps/website/src/translations/ga/translation.json b/apps/website/src/translations/ga/translation.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/apps/website/src/translations/ga/translation.json @@ -0,0 +1 @@ +{} From 5e981da4df25bf8dd9729e2d5a8b78f9b2a0fe77 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 20:48:55 +0200 Subject: [PATCH 017/560] feat(mobile): use the desktop version of note actions --- .../mobile_widgets/mobile_detail_menu.tsx | 84 ++----------------- .../client/src/widgets/ribbon/NoteActions.tsx | 2 +- 2 files changed, 7 insertions(+), 79 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 1566d08890..9fc3f9d3b1 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,84 +1,12 @@ -import { useContext } from "preact/hooks"; - -import appContext, { CommandMappings } from "../../components/app_context"; -import contextMenu, { MenuItem } from "../../menus/context_menu"; -import branches from "../../services/branches"; -import { t } from "../../services/i18n"; -import { getHelpUrlForNote } from "../../services/in_app_help"; -import note_create from "../../services/note_create"; -import tree from "../../services/tree"; -import { openInAppHelpFromUrl } from "../../services/utils"; -import BasicWidget from "../basic_widget"; -import ActionButton from "../react/ActionButton"; -import { ParentComponent } from "../react/react_utils"; +import { useNoteContext } from "../react/hooks"; +import { NoteContextMenu } from "../ribbon/NoteActions"; export default function MobileDetailMenu() { - const parentComponent = useContext(ParentComponent); + const { note, noteContext } = useNoteContext(); return ( - { - const ntxId = (parentComponent as BasicWidget | null)?.getClosestNtxId(); - if (!ntxId) return; - - const noteContext = appContext.tabManager.getNoteContextById(ntxId); - const subContexts = noteContext.getMainContext().getSubContexts(); - const isMainContext = noteContext?.isMainContext(); - const note = noteContext.note; - const helpUrl = getHelpUrlForNote(note); - - const items: (MenuItem)[] = [ - { title: t("mobile_detail_menu.insert_child_note"), command: "insertChildNote", uiIcon: "bx bx-plus", enabled: note?.type !== "search" }, - { title: t("mobile_detail_menu.delete_this_note"), command: "delete", uiIcon: "bx bx-trash", enabled: note?.noteId !== "root" }, - { kind: "separator" }, - { title: t("mobile_detail_menu.note_revisions"), command: "showRevisions", uiIcon: "bx bx-history" }, - { kind: "separator" }, - helpUrl && { - title: t("help-button.title"), - uiIcon: "bx bx-help-circle", - handler: () => openInAppHelpFromUrl(helpUrl) - }, - { kind: "separator" }, - subContexts.length < 2 && { title: t("create_pane_button.create_new_split"), command: "openNewNoteSplit", uiIcon: "bx bx-dock-right" }, - !isMainContext && { title: t("close_pane_button.close_this_pane"), command: "closeThisNoteSplit", uiIcon: "bx bx-x" } - ].filter(i => !!i) as MenuItem[]; - - const lastItem = items.at(-1); - if (lastItem && "kind" in lastItem && lastItem.kind === "separator") { - items.pop(); - } - - contextMenu.show({ - x: e.pageX, - y: e.pageY, - items, - selectMenuItemHandler: async ({ command }) => { - if (command === "insertChildNote") { - note_create.createNote(appContext.tabManager.getActiveContextNotePath() ?? undefined); - } else if (command === "delete") { - const notePath = appContext.tabManager.getActiveContextNotePath(); - if (!notePath) { - throw new Error("Cannot get note path to delete."); - } - - const branchId = await tree.getBranchIdFromUrl(notePath); - - if (!branchId) { - throw new Error(t("mobile_detail_menu.error_cannot_get_branch_id", { notePath })); - } - - if (await branches.deleteNotes([branchId]) && parentComponent) { - parentComponent.triggerCommand("setActiveScreen", { screen: "tree" }); - } - } else if (command && parentComponent) { - parentComponent.triggerCommand(command, { ntxId }); - } - }, - forcePositionOnMobile: true - }); - }} - /> +
+ {note && } +
); } diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index 6db1d384e5..266ca38f93 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -63,7 +63,7 @@ function RevisionsButton({ note }: { note: FNote }) { type ItemToFocus = "basic-properties"; -function NoteContextMenu({ note, noteContext }: { note: FNote, noteContext?: NoteContext }) { +export function NoteContextMenu({ note, noteContext }: { note: FNote, noteContext?: NoteContext }) { const dropdownRef = useRef(null); const parentComponent = useContext(ParentComponent); const noteType = useNoteProperty(note, "type") ?? ""; From 90e3f7508a712e78f6231681dea4a2ab168cccae Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 20:50:00 +0200 Subject: [PATCH 018/560] chore(mobile): enforce new layout --- apps/client/src/services/experimental_features.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/services/experimental_features.ts b/apps/client/src/services/experimental_features.ts index 62d4ebb053..b6211b4d10 100644 --- a/apps/client/src/services/experimental_features.ts +++ b/apps/client/src/services/experimental_features.ts @@ -1,5 +1,6 @@ import { t } from "./i18n"; import options from "./options"; +import { isMobile } from "./utils"; export interface ExperimentalFeature { id: string; @@ -21,7 +22,7 @@ let enabledFeatures: Set | null = null; export function isExperimentalFeatureEnabled(featureId: ExperimentalFeatureId): boolean { if (featureId === "new-layout") { - return options.is("newLayout"); + return (isMobile() || options.is("newLayout")); } return getEnabledFeatures().has(featureId); From f91add3cd4fdca503e40dd90119234da38ff05e0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 20:53:33 +0200 Subject: [PATCH 019/560] chore(mobile/note_actions): position like global menu --- apps/client/src/stylesheets/style.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 69632dd29e..3a24830077 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1530,7 +1530,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { @media (max-width: 991px) { body.mobile #launcher-pane .dropdown.global-menu > .dropdown-menu.show, - body.mobile #launcher-container .dropdown > .dropdown-menu.show { + body.mobile #launcher-container .dropdown > .dropdown-menu.show, + body.mobile .dropdown.note-actions .dropdown-menu.show { --dropdown-bottom: calc(var(--mobile-bottom-offset) + var(--launcher-pane-size)); position: fixed !important; bottom: var(--dropdown-bottom) !important; From d3c733c57f034c5f32f80076979d51a0cdd32e3b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 20:57:01 +0200 Subject: [PATCH 020/560] feat(mobile/note_actions): add backdrop --- apps/client/src/widgets/buttons/global_menu.tsx | 4 +--- apps/client/src/widgets/react/Dropdown.tsx | 14 +++++++++++--- apps/client/src/widgets/ribbon/NoteActions.tsx | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/buttons/global_menu.tsx b/apps/client/src/widgets/buttons/global_menu.tsx index 255cf89c9f..95a3b8b946 100644 --- a/apps/client/src/widgets/buttons/global_menu.tsx +++ b/apps/client/src/widgets/buttons/global_menu.tsx @@ -29,7 +29,6 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout: const isVerticalLayout = !isHorizontalLayout; const parentComponent = useContext(ParentComponent); const { isUpdateAvailable, latestVersion } = useTriliumUpdateStatus(); - const isMobileLocal = isMobile(); const logoRef = useRef(null); useStaticTooltip(logoRef); @@ -44,8 +43,7 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout: } } noDropdownListStyle - onShown={isMobileLocal ? () => document.getElementById("context-menu-cover")?.classList.add("show", "global-menu-cover") : undefined} - onHidden={isMobileLocal ? () => document.getElementById("context-menu-cover")?.classList.remove("show", "global-menu-cover") : undefined} + mobileBackdrop > diff --git a/apps/client/src/widgets/react/Dropdown.tsx b/apps/client/src/widgets/react/Dropdown.tsx index 5af2f62280..407b14a63a 100644 --- a/apps/client/src/widgets/react/Dropdown.tsx +++ b/apps/client/src/widgets/react/Dropdown.tsx @@ -3,6 +3,7 @@ import { ComponentChildren, HTMLAttributes } from "preact"; import { CSSProperties, HTMLProps } from "preact/compat"; import { MutableRef, useCallback, useEffect, useRef, useState } from "preact/hooks"; +import { isMobile } from "../../services/utils"; import { useTooltip, useUniqueName } from "./hooks"; type DataAttributes = { @@ -32,9 +33,10 @@ export interface DropdownProps extends Pick, "id" | "c dropdownRef?: MutableRef; titlePosition?: "top" | "right" | "bottom" | "left"; titleOptions?: Partial; + mobileBackdrop?: boolean; } -export default function Dropdown({ id, className, buttonClassName, isStatic, children, title, text, dropdownContainerStyle, dropdownContainerClassName, dropdownContainerRef: externalContainerRef, hideToggleArrow, iconAction, disabled, noSelectButtonStyle, noDropdownListStyle, forceShown, onShown: externalOnShown, onHidden: externalOnHidden, dropdownOptions, buttonProps, dropdownRef, titlePosition, titleOptions }: DropdownProps) { +export default function Dropdown({ id, className, buttonClassName, isStatic, children, title, text, dropdownContainerStyle, dropdownContainerClassName, dropdownContainerRef: externalContainerRef, hideToggleArrow, iconAction, disabled, noSelectButtonStyle, noDropdownListStyle, forceShown, onShown: externalOnShown, onHidden: externalOnHidden, dropdownOptions, buttonProps, dropdownRef, titlePosition, titleOptions, mobileBackdrop }: DropdownProps) { const containerRef = useRef(null); const triggerRef = useRef(null); const dropdownContainerRef = useRef(null); @@ -74,12 +76,18 @@ export default function Dropdown({ id, className, buttonClassName, isStatic, chi setShown(true); externalOnShown?.(); hideTooltip(); - }, [ hideTooltip ]); + if (mobileBackdrop && isMobile()) { + document.getElementById("context-menu-cover")?.classList.add("show", "global-menu-cover"); + } + }, [ hideTooltip, mobileBackdrop ]); const onHidden = useCallback(() => { setShown(false); externalOnHidden?.(); - }, []); + if (mobileBackdrop && isMobile()) { + document.getElementById("context-menu-cover")?.classList.remove("show", "global-menu-cover"); + } + }, [ mobileBackdrop ]); useEffect(() => { if (!containerRef.current) return; diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index 266ca38f93..607f55a0ad 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -104,6 +104,7 @@ export function NoteContextMenu({ note, noteContext }: { note: FNote, noteContex noDropdownListStyle iconAction onHidden={() => itemToFocusRef.current = null } + mobileBackdrop > {isReadOnly && <> From 2a4280b5bf12280febea83b41c75d8891bc94dc8 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 20:59:50 +0200 Subject: [PATCH 021/560] feat(mobile/note_actions): remove bottom rounded corners --- apps/client/src/widgets/ribbon/NoteActions.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index 607f55a0ad..6aa05234db 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -99,6 +99,7 @@ export function NoteContextMenu({ note, noteContext }: { note: FNote, noteContex dropdownRef={dropdownRef} buttonClassName={ isNewLayout ? "bx bx-dots-horizontal-rounded" : "bx bx-dots-vertical-rounded" } className="note-actions" + dropdownContainerClassName="mobile-bottom-menu" hideToggleArrow noSelectButtonStyle noDropdownListStyle From e88c0f732635bc34c159b8467bf9a15e854cf576 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 21:02:46 +0200 Subject: [PATCH 022/560] fix(mobile/note_actions): toggles on two rows --- apps/client/src/stylesheets/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 3a24830077..1bed8cbef0 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -454,7 +454,7 @@ body.desktop .tabulator-popup-container, visibility: hidden; } -body.desktop .dropdown-menu:not(#context-menu-container) .dropdown-item, +.dropdown-menu:not(#context-menu-container) .dropdown-item, body.desktop .dropdown-menu .dropdown-toggle, body #context-menu-container .dropdown-item > span, body.mobile .dropdown .dropdown-submenu > span { From c06a90913af5bc424ed2e05ade3acf7e2ffd32ad Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 21:12:50 +0200 Subject: [PATCH 023/560] fix(mobile/note_actions): submenus not working --- apps/client/src/stylesheets/style.css | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 1bed8cbef0..93163c06d4 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -462,6 +462,15 @@ body.mobile .dropdown .dropdown-submenu > span { align-items: center; } + +body.mobile .dropdown .dropdown-submenu { + flex-wrap: wrap; + + & > span { + flex-grow: 1; + } +} + .dropdown-item span.keyboard-shortcut, .dropdown-item *:not(.keyboard-shortcut) > kbd { flex-grow: 1; @@ -1531,7 +1540,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { @media (max-width: 991px) { body.mobile #launcher-pane .dropdown.global-menu > .dropdown-menu.show, body.mobile #launcher-container .dropdown > .dropdown-menu.show, - body.mobile .dropdown.note-actions .dropdown-menu.show { + body.mobile .dropdown.note-actions > .dropdown-menu.show { --dropdown-bottom: calc(var(--mobile-bottom-offset) + var(--launcher-pane-size)); position: fixed !important; bottom: var(--dropdown-bottom) !important; From e2363d860c58c9fa3cf6e94a6bc7aac547271aae Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 21:25:40 +0200 Subject: [PATCH 024/560] fix(mobile/note_actions): font too big --- apps/client/src/layouts/mobile_layout.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index dbe88ade84..37fcf2f684 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -27,7 +27,6 @@ import FilePropertiesTab from "../widgets/ribbon/FilePropertiesTab.jsx"; import SearchDefinitionTab from "../widgets/ribbon/SearchDefinitionTab.jsx"; import SearchResult from "../widgets/search_result.jsx"; import SharedInfoWidget from "../widgets/shared_info.js"; -import TabRowWidget from "../widgets/tab_row.js"; import MobileEditorToolbar from "../widgets/type_widgets/text/mobile_editor_toolbar.jsx"; import { applyModals } from "./layout_commons.js"; @@ -148,7 +147,6 @@ export default class MobileLayout { .child( new FlexContainer("row") .contentSized() - .css("font-size", "larger") .css("align-items", "center") .child() .child() From 76492475e3160143dfa9946e14a473ffdca86095 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 21:27:24 +0200 Subject: [PATCH 025/560] fix(mobile/note_actions): find not working --- apps/client/src/layouts/mobile_layout.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 37fcf2f684..7fb925533d 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -7,6 +7,7 @@ import FlexContainer from "../widgets/containers/flex_container.js"; import RootContainer from "../widgets/containers/root_container.js"; import ScrollingContainer from "../widgets/containers/scrolling_container.js"; import SplitNoteContainer from "../widgets/containers/split_note_container.js"; +import FindWidget from "../widgets/find.js"; import FloatingButtons from "../widgets/FloatingButtons.jsx"; import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx"; import LauncherContainer from "../widgets/launch_bar/LauncherContainer.jsx"; @@ -169,6 +170,7 @@ export default class MobileLayout { .child() ) .child() + .child(new FindWidget()) ) ) ) From 92991cc03c4c50b1145acea2f6041b7cd71c93ce Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 21:37:20 +0200 Subject: [PATCH 026/560] fix(promoted_attributes): displayed in non-default view modes --- apps/client/src/widgets/PromotedAttributes.tsx | 11 ++++++----- apps/client/src/widgets/layout/NoteTitleActions.tsx | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/PromotedAttributes.tsx b/apps/client/src/widgets/PromotedAttributes.tsx index a9618d3a63..cbe5737256 100644 --- a/apps/client/src/widgets/PromotedAttributes.tsx +++ b/apps/client/src/widgets/PromotedAttributes.tsx @@ -5,6 +5,7 @@ import clsx from "clsx"; import { ComponentChild, HTMLInputTypeAttribute, InputHTMLAttributes, MouseEventHandler, TargetedEvent, TargetedInputEvent } from "preact"; import { Dispatch, StateUpdater, useEffect, useRef, useState } from "preact/hooks"; +import NoteContext from "../components/note_context"; import FAttribute from "../entities/fattribute"; import FNote from "../entities/fnote"; import { Attribute } from "../services/attribute_parser"; @@ -40,8 +41,8 @@ type OnChangeEventData = TargetedEvent | InputEvent | J type OnChangeListener = (e: OnChangeEventData) => Promise; export default function PromotedAttributes() { - const { note, componentId } = useNoteContext(); - const [ cells, setCells ] = usePromotedAttributeData(note, componentId); + const { note, componentId, noteContext } = useNoteContext(); + const [ cells, setCells ] = usePromotedAttributeData(note, componentId, noteContext); return ; } @@ -74,12 +75,12 @@ export function PromotedAttributesContent({ note, componentId, cells, setCells } * * The cells are returned as a state since they can also be altered internally if needed, for example to add a new empty cell. */ -export function usePromotedAttributeData(note: FNote | null | undefined, componentId: string): [ Cell[] | undefined, Dispatch> ] { +export function usePromotedAttributeData(note: FNote | null | undefined, componentId: string, noteContext: NoteContext | undefined): [ Cell[] | undefined, Dispatch> ] { const [ viewType ] = useNoteLabel(note, "viewType"); const [ cells, setCells ] = useState(); function refresh() { - if (!note || viewType === "table") { + if (!note || viewType === "table" || noteContext?.viewScope?.viewMode !== "default") { setCells([]); return; } @@ -124,7 +125,7 @@ export function usePromotedAttributeData(note: FNote | null | undefined, compone setCells(cells); } - useEffect(refresh, [ note, viewType ]); + useEffect(refresh, [ note, viewType, noteContext ]); useTriliumEvent("entitiesReloaded", ({ loadResults }) => { if (loadResults.getAttributeRows(componentId).find((attr) => attributes.isAffecting(attr, note))) { refresh(); diff --git a/apps/client/src/widgets/layout/NoteTitleActions.tsx b/apps/client/src/widgets/layout/NoteTitleActions.tsx index 6886acc7e6..96a2e92963 100644 --- a/apps/client/src/widgets/layout/NoteTitleActions.tsx +++ b/apps/client/src/widgets/layout/NoteTitleActions.tsx @@ -48,7 +48,7 @@ function PromotedAttributes({ note, componentId, noteContext }: { componentId: string, noteContext: NoteContext | undefined }) { - const [ cells, setCells ] = usePromotedAttributeData(note, componentId); + const [ cells, setCells ] = usePromotedAttributeData(note, componentId, noteContext); const [ expanded, setExpanded ] = useState(false); useEffect(() => { From 35ac5fc51426f2ff10d4cbb9c9fe0baedb09fa55 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 21:42:48 +0200 Subject: [PATCH 027/560] fix(mobile/note_actions): reintroduce insert child note --- .../widgets/mobile_widgets/mobile_detail_menu.tsx | 14 ++++++++++++-- apps/client/src/widgets/ribbon/NoteActions.tsx | 9 +++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 9fc3f9d3b1..c096e1d64e 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,12 +1,22 @@ +import { t } from "../../services/i18n"; +import { FormDropdownDivider } from "../react/FormList"; import { useNoteContext } from "../react/hooks"; -import { NoteContextMenu } from "../ribbon/NoteActions"; +import { CommandItem, NoteContextMenu } from "../ribbon/NoteActions"; export default function MobileDetailMenu() { const { note, noteContext } = useNoteContext(); return (
- {note && } + {note && ( + + + + } + /> + )}
); } diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index 6aa05234db..39c3ebe354 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -1,6 +1,6 @@ import { ConvertToAttachmentResponse } from "@triliumnext/commons"; import { Dropdown as BootstrapDropdown } from "bootstrap"; -import { RefObject } from "preact"; +import { ComponentChildren, RefObject } from "preact"; import { useContext, useEffect, useRef } from "preact/hooks"; import appContext, { CommandNames } from "../../components/app_context"; @@ -14,7 +14,7 @@ import { t } from "../../services/i18n"; import protected_session from "../../services/protected_session"; import server from "../../services/server"; import toast from "../../services/toast"; -import { isElectron as getIsElectron, isMac as getIsMac } from "../../services/utils"; +import { isElectron as getIsElectron, isMac as getIsMac, isMobile } from "../../services/utils"; import ws from "../../services/ws"; import ClosePaneButton from "../buttons/close_pane_button"; import CreatePaneButton from "../buttons/create_pane_button"; @@ -63,7 +63,7 @@ function RevisionsButton({ note }: { note: FNote }) { type ItemToFocus = "basic-properties"; -export function NoteContextMenu({ note, noteContext }: { note: FNote, noteContext?: NoteContext }) { +export function NoteContextMenu({ note, noteContext, extraItems }: { note: FNote, noteContext?: NoteContext, extraItems?: ComponentChildren; }) { const dropdownRef = useRef(null); const parentComponent = useContext(ParentComponent); const noteType = useNoteProperty(note, "type") ?? ""; @@ -107,6 +107,7 @@ export function NoteContextMenu({ note, noteContext }: { note: FNote, noteContex onHidden={() => itemToFocusRef.current = null } mobileBackdrop > + {extraItems} {isReadOnly && <> void), disabled?: boolean, destructive?: boolean }) { +export function CommandItem({ icon, text, title, command, disabled }: { icon: string, text: string, title?: string, command: CommandNames | (() => void), disabled?: boolean, destructive?: boolean }) { return Date: Sun, 1 Feb 2026 21:45:43 +0200 Subject: [PATCH 028/560] fix(mobile/note_actions): reintroduce help button --- .../src/widgets/mobile_widgets/mobile_detail_menu.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index c096e1d64e..5bb1f434e5 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,10 +1,13 @@ import { t } from "../../services/i18n"; -import { FormDropdownDivider } from "../react/FormList"; +import { getHelpUrlForNote } from "../../services/in_app_help"; +import { openInAppHelpFromUrl } from "../../services/utils"; +import { FormDropdownDivider, FormListItem } from "../react/FormList"; import { useNoteContext } from "../react/hooks"; import { CommandItem, NoteContextMenu } from "../ribbon/NoteActions"; export default function MobileDetailMenu() { const { note, noteContext } = useNoteContext(); + const helpUrl = getHelpUrlForNote(note); return (
@@ -14,6 +17,11 @@ export default function MobileDetailMenu() { extraItems={<> + {helpUrl && openInAppHelpFromUrl(helpUrl)} + >{t("help-button.title")}} + } /> )} From c702fb273ce9cf1b6a7f48a1959909537df79dfa Mon Sep 17 00:00:00 2001 From: perfectra1n Date: Sun, 1 Feb 2026 11:46:03 -0800 Subject: [PATCH 029/560] feat(tests): add tests for new attachments endpoint --- .../spec/etapi/get-note-attachments.spec.ts | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 apps/server/spec/etapi/get-note-attachments.spec.ts diff --git a/apps/server/spec/etapi/get-note-attachments.spec.ts b/apps/server/spec/etapi/get-note-attachments.spec.ts new file mode 100644 index 0000000000..5e95463bba --- /dev/null +++ b/apps/server/spec/etapi/get-note-attachments.spec.ts @@ -0,0 +1,82 @@ +import { Application } from "express"; +import { beforeAll, describe, expect, it } from "vitest"; +import supertest from "supertest"; +import { createNote, login } from "./utils.js"; +import config from "../../src/services/config.js"; + +let app: Application; +let token: string; + +const USER = "etapi"; +let createdNoteId: string; +let createdAttachmentId: string; + +describe("etapi/get-note-attachments", () => { + beforeAll(async () => { + config.General.noAuthentication = false; + const buildApp = (await (import("../../src/app.js"))).default; + app = await buildApp(); + token = await login(app); + + createdNoteId = await createNote(app, token); + + // Create an attachment for the note + const response = await supertest(app) + .post(`/etapi/attachments`) + .auth(USER, token, { "type": "basic" }) + .send({ + "ownerId": createdNoteId, + "role": "file", + "mime": "text/plain", + "title": "test-attachment.txt", + "content": "test content", + "position": 10 + }); + createdAttachmentId = response.body.attachmentId; + expect(createdAttachmentId).toBeTruthy(); + }); + + it("gets attachments for a note", async () => { + const response = await supertest(app) + .get(`/etapi/notes/${createdNoteId}/attachments`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(Array.isArray(response.body)).toBe(true); + expect(response.body.length).toBeGreaterThan(0); + + const attachment = response.body[0]; + expect(attachment).toHaveProperty("attachmentId", createdAttachmentId); + expect(attachment).toHaveProperty("ownerId", createdNoteId); + expect(attachment).toHaveProperty("role", "file"); + expect(attachment).toHaveProperty("mime", "text/plain"); + expect(attachment).toHaveProperty("title", "test-attachment.txt"); + expect(attachment).toHaveProperty("position", 10); + expect(attachment).toHaveProperty("blobId"); + expect(attachment).toHaveProperty("dateModified"); + expect(attachment).toHaveProperty("utcDateModified"); + expect(attachment).toHaveProperty("contentLength"); + }); + + it("returns empty array for note with no attachments", async () => { + // Create a new note without any attachments + const newNoteId = await createNote(app, token, "Note without attachments"); + + const response = await supertest(app) + .get(`/etapi/notes/${newNoteId}/attachments`) + .auth(USER, token, { "type": "basic" }) + .expect(200); + + expect(Array.isArray(response.body)).toBe(true); + expect(response.body.length).toBe(0); + }); + + it("returns 404 for non-existent note", async () => { + const response = await supertest(app) + .get("/etapi/notes/nonexistentnote/attachments") + .auth(USER, token, { "type": "basic" }) + .expect(404); + + expect(response.body.code).toStrictEqual("NOTE_NOT_FOUND"); + }); +}); From ce9ca1917db01bb91e2703d5b80d007bdd8367a3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 21:59:19 +0200 Subject: [PATCH 030/560] fix(mobile/note_actions): reintroduce split buttons --- .../mobile_widgets/mobile_detail_menu.tsx | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 5bb1f434e5..3458dcb0cf 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -6,8 +6,10 @@ import { useNoteContext } from "../react/hooks"; import { CommandItem, NoteContextMenu } from "../ribbon/NoteActions"; export default function MobileDetailMenu() { - const { note, noteContext } = useNoteContext(); + const { note, noteContext, parentComponent, ntxId } = useNoteContext(); const helpUrl = getHelpUrlForNote(note); + const subContexts = noteContext?.getMainContext().getSubContexts() ?? []; + const isMainContext = noteContext?.isMainContext(); return (
@@ -16,11 +18,27 @@ export default function MobileDetailMenu() { note={note} noteContext={noteContext} extraItems={<> - - {helpUrl && openInAppHelpFromUrl(helpUrl)} - >{t("help-button.title")}} + {helpUrl && <> + + openInAppHelpFromUrl(helpUrl)} + >{t("help-button.title")} + } + {subContexts.length < 2 && <> + + parentComponent.triggerCommand("openNewNoteSplit", { ntxId })} + icon="bx bx-dock-right" + >{t("create_pane_button.create_new_split")} + } + {!isMainContext && <> + + parentComponent.triggerCommand("closeThisNoteSplit", { ntxId })} + >{t("close_pane_button.close_this_pane")} + } } /> From fd6f9108247dc08c0063746b5a065dcfd5c00884 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 22:02:54 +0200 Subject: [PATCH 031/560] fix(mobile/note_actions): backdrop remains when closing split --- .../src/widgets/mobile_widgets/mobile_detail_menu.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 3458dcb0cf..3db1738feb 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -36,7 +36,12 @@ export default function MobileDetailMenu() { parentComponent.triggerCommand("closeThisNoteSplit", { ntxId })} + onClick={() => { + // Wait first for the context menu to be dismissed, otherwise the backdrop stays on. + requestAnimationFrame(() => { + parentComponent.triggerCommand("closeThisNoteSplit", { ntxId }); + }); + }} >{t("close_pane_button.close_this_pane")} } From 841fab77a805b033b3d0feb1845500283b3d244a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 22:22:25 +0200 Subject: [PATCH 032/560] chore(client): address requested changes --- apps/client/src/services/experimental_features.ts | 2 +- apps/client/src/widgets/ribbon/NoteActions.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/services/experimental_features.ts b/apps/client/src/services/experimental_features.ts index b6211b4d10..8cfbe126e8 100644 --- a/apps/client/src/services/experimental_features.ts +++ b/apps/client/src/services/experimental_features.ts @@ -30,7 +30,7 @@ export function isExperimentalFeatureEnabled(featureId: ExperimentalFeatureId): export function getEnabledExperimentalFeatureIds() { const values = [ ...getEnabledFeatures().values() ]; - if (options.is("newLayout")) { + if (isMobile() || options.is("newLayout")) { values.push("new-layout"); } return values; diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index 39c3ebe354..51788085d2 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -14,7 +14,7 @@ import { t } from "../../services/i18n"; import protected_session from "../../services/protected_session"; import server from "../../services/server"; import toast from "../../services/toast"; -import { isElectron as getIsElectron, isMac as getIsMac, isMobile } from "../../services/utils"; +import { isElectron as getIsElectron, isMac as getIsMac } from "../../services/utils"; import ws from "../../services/ws"; import ClosePaneButton from "../buttons/close_pane_button"; import CreatePaneButton from "../buttons/create_pane_button"; From c36ce3ea143df67a17b4275846652777503d8d91 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 22:29:43 +0200 Subject: [PATCH 033/560] fix(mobile/note_actions): insert child note not working --- .../src/widgets/mobile_widgets/mobile_detail_menu.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 3db1738feb..7db00d0bcd 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,9 +1,10 @@ import { t } from "../../services/i18n"; import { getHelpUrlForNote } from "../../services/in_app_help"; +import note_create from "../../services/note_create"; import { openInAppHelpFromUrl } from "../../services/utils"; import { FormDropdownDivider, FormListItem } from "../react/FormList"; import { useNoteContext } from "../react/hooks"; -import { CommandItem, NoteContextMenu } from "../ribbon/NoteActions"; +import { NoteContextMenu } from "../ribbon/NoteActions"; export default function MobileDetailMenu() { const { note, noteContext, parentComponent, ntxId } = useNoteContext(); @@ -17,7 +18,10 @@ export default function MobileDetailMenu() { - + noteContext?.notePath && note_create.createNote(noteContext.notePath)} + icon="bx bx-plus" + >{t("mobile_detail_menu.insert_child_note")} {helpUrl && <> Date: Mon, 2 Feb 2026 01:51:29 +0000 Subject: [PATCH 034/560] chore(deps): update dependency webdriverio to v9.23.3 --- packages/ckeditor5-admonition/package.json | 2 +- packages/ckeditor5-footnotes/package.json | 2 +- .../ckeditor5-keyboard-marker/package.json | 2 +- packages/ckeditor5-math/package.json | 2 +- packages/ckeditor5-mermaid/package.json | 2 +- pnpm-lock.yaml | 95 ++++++++++--------- 6 files changed, 54 insertions(+), 51 deletions(-) diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 5b68539da2..2175a0c349 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -39,7 +39,7 @@ "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", "vitest": "4.0.18", - "webdriverio": "9.23.2" + "webdriverio": "9.23.3" }, "peerDependencies": { "ckeditor5": "47.4.0" diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index d49d404ea9..dddd60910e 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -40,7 +40,7 @@ "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", "vitest": "4.0.18", - "webdriverio": "9.23.2" + "webdriverio": "9.23.3" }, "peerDependencies": { "ckeditor5": "47.4.0" diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index 7a5acc2d85..b34179332b 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -42,7 +42,7 @@ "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", "vitest": "4.0.18", - "webdriverio": "9.23.2" + "webdriverio": "9.23.3" }, "peerDependencies": { "ckeditor5": "47.4.0" diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index a64a097a60..dce972d960 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -42,7 +42,7 @@ "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", "vitest": "4.0.18", - "webdriverio": "9.23.2" + "webdriverio": "9.23.3" }, "peerDependencies": { "ckeditor5": "47.4.0" diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 3949f4b312..4eae79a3ce 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -42,7 +42,7 @@ "typescript": "5.9.3", "vite-plugin-svgo": "2.0.0", "vitest": "4.0.18", - "webdriverio": "9.23.2" + "webdriverio": "9.23.3" }, "peerDependencies": { "ckeditor5": "47.4.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8118438a0..4024fdde29 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,7 +73,7 @@ importers: version: 24.10.9 '@vitest/browser-webdriverio': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': specifier: 4.0.18 version: 4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18) @@ -980,8 +980,8 @@ importers: specifier: 4.0.18 version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: - specifier: 9.23.2 - version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.23.3 + version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-footnotes: devDependencies: @@ -1040,8 +1040,8 @@ importers: specifier: 4.0.18 version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: - specifier: 9.23.2 - version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.23.3 + version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-keyboard-marker: devDependencies: @@ -1100,8 +1100,8 @@ importers: specifier: 4.0.18 version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: - specifier: 9.23.2 - version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.23.3 + version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-math: dependencies: @@ -1167,8 +1167,8 @@ importers: specifier: 4.0.18 version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: - specifier: 9.23.2 - version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.23.3 + version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/ckeditor5-mermaid: dependencies: @@ -1234,8 +1234,8 @@ importers: specifier: 4.0.18 version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: - specifier: 9.23.2 - version: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 9.23.3 + version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) packages/codemirror: dependencies: @@ -6151,27 +6151,27 @@ packages: '@vue/shared@3.5.14': resolution: {integrity: sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==} - '@wdio/config@9.23.2': - resolution: {integrity: sha512-19Z+AIQ1NUpr6ncTumjSthm6A7c3DbaGTp+VCdcyN+vHYOK4WsWIomSk+uSbFosYFQVGRjCaHaeGSnC8GNPGYQ==} + '@wdio/config@9.23.3': + resolution: {integrity: sha512-tQCT1R6R3hdib7Qb+82Dxgn/sB+CiR8+GS4zyJh5vU0dzLGeYsCo2B5W89VLItvRjveTmsmh8NOQGV2KH0FHTQ==} engines: {node: '>=18.20.0'} '@wdio/logger@9.18.0': resolution: {integrity: sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==} engines: {node: '>=18.20.0'} - '@wdio/protocols@9.23.2': - resolution: {integrity: sha512-pmCYOYI2N89QCC8IaiHwaWyP0mR8T1iKkEGpoTq2XVihp7VK/lfPvieyeZT5/e28MadYLJsDQ603pbu5J1NRDg==} + '@wdio/protocols@9.23.3': + resolution: {integrity: sha512-QfA3Gfl9/3QRX1FnH7x2+uZrgpkwYcksgk1bxGLzl/E0Qefp3BkhgHAfSB1+iKsiYIw9iFOLVx+x+zh0F4BSeg==} '@wdio/repl@9.16.2': resolution: {integrity: sha512-FLTF0VL6+o5BSTCO7yLSXocm3kUnu31zYwzdsz4n9s5YWt83sCtzGZlZpt7TaTzb3jVUfxuHNQDTb8UMkCu0lQ==} engines: {node: '>=18.20.0'} - '@wdio/types@9.23.2': - resolution: {integrity: sha512-ryfrERGsNp+aCcrTE1rFU6cbmDj8GHZ04R9k52KNt2u1a6bv3Eh5A/cUA0hXuMdEUfsc8ePLYdwQyOLFydZ0ig==} + '@wdio/types@9.23.3': + resolution: {integrity: sha512-Ufjh06DAD7cGTMORUkq5MTZLw1nAgBSr2y8OyiNNuAfPGCwHEU3EwEfhG/y0V7S7xT5pBxliqWi7AjRrCgGcIA==} engines: {node: '>=18.20.0'} - '@wdio/utils@9.23.2': - resolution: {integrity: sha512-+QfgXUWeA940AXT5l5UlrBKoHBk9GLSQE3BA+7ra1zWuFvv6SHG6M2mwplcPlOlymJMqXy8e7ZgLEoLkXuvC1Q==} + '@wdio/utils@9.23.3': + resolution: {integrity: sha512-LO/cTpOcb3r49psjmWTxjFduHUMHDOhVfSzL1gfBCS5cGv6h3hAWOYw/94OrxLn1SIOgZu/hyLwf3SWeZB529g==} engines: {node: '>=18.20.0'} '@webassemblyjs/ast@1.14.1': @@ -14746,12 +14746,12 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} - webdriver@9.23.2: - resolution: {integrity: sha512-HZy3eydZbmex0pbyLwHaDsAyZ+S+V4XQTdGK/nAOi4uPa74U6yT9vXqtb+3B+5/LDM7L8kTD6Z3b1y4gB4pmTw==} + webdriver@9.23.3: + resolution: {integrity: sha512-8FdXOhzkxqDI6F1dyIsQONhKLDZ9HPSEwNBnH3bD1cHnj/6nVvyYrUtDPo/+J324BuwOa1IVTH3m8mb3B2hTlA==} engines: {node: '>=18.20.0'} - webdriverio@9.23.2: - resolution: {integrity: sha512-VjfTw1bRJdBrzjoCu7BGThxn1JK2V7mAGvxibaBrCNIayPPQjLhVDNJPOVEiR7txM6zmOUWxhkCDxHjhMYirfQ==} + webdriverio@9.23.3: + resolution: {integrity: sha512-1dhMsBx/GLHJsDLhg/xuEQ48JZPrbldz7qdFT+MXQZADj9CJ4bJywWtVBME648MmVMfgDvLc5g2ThGIOupSLvQ==} engines: {node: '>=18.20.0'} peerDependencies: puppeteer-core: '>=22.x || <=24.x' @@ -16254,6 +16254,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16436,6 +16438,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16934,8 +16938,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -21484,11 +21486,11 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - webdriverio: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + webdriverio: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil - msw @@ -21642,14 +21644,15 @@ snapshots: '@vue/shared@3.5.14': {} - '@wdio/config@9.23.2': + '@wdio/config@9.23.3': dependencies: '@wdio/logger': 9.18.0 - '@wdio/types': 9.23.2 - '@wdio/utils': 9.23.2 + '@wdio/types': 9.23.3 + '@wdio/utils': 9.23.3 deepmerge-ts: 7.1.5 glob: 13.0.0 import-meta-resolve: 4.2.0 + jiti: 2.6.1 transitivePeerDependencies: - bare-buffer - supports-color @@ -21662,21 +21665,21 @@ snapshots: safe-regex2: 5.0.0 strip-ansi: 7.1.2 - '@wdio/protocols@9.23.2': {} + '@wdio/protocols@9.23.3': {} '@wdio/repl@9.16.2': dependencies: '@types/node': 20.19.25 - '@wdio/types@9.23.2': + '@wdio/types@9.23.3': dependencies: '@types/node': 20.19.25 - '@wdio/utils@9.23.2': + '@wdio/utils@9.23.3': dependencies: '@puppeteer/browsers': 2.10.10 '@wdio/logger': 9.18.0 - '@wdio/types': 9.23.2 + '@wdio/types': 9.23.3 decamelize: 6.0.1 deepmerge-ts: 7.1.5 edgedriver: 6.1.2 @@ -32040,7 +32043,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.10.9 - '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.18(vitest@4.0.18) happy-dom: 20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -32155,15 +32158,15 @@ snapshots: web-streams-polyfill@3.3.3: {} - webdriver@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5): + webdriver@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 20.19.25 '@types/ws': 8.18.1 - '@wdio/config': 9.23.2 + '@wdio/config': 9.23.3 '@wdio/logger': 9.18.0 - '@wdio/protocols': 9.23.2 - '@wdio/types': 9.23.2 - '@wdio/utils': 9.23.2 + '@wdio/protocols': 9.23.3 + '@wdio/types': 9.23.3 + '@wdio/utils': 9.23.3 deepmerge-ts: 7.1.5 https-proxy-agent: 7.0.6 undici: 6.23.0 @@ -32174,16 +32177,16 @@ snapshots: - supports-color - utf-8-validate - webdriverio@9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5): + webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 20.19.25 '@types/sinonjs__fake-timers': 8.1.5 - '@wdio/config': 9.23.2 + '@wdio/config': 9.23.3 '@wdio/logger': 9.18.0 - '@wdio/protocols': 9.23.2 + '@wdio/protocols': 9.23.3 '@wdio/repl': 9.16.2 - '@wdio/types': 9.23.2 - '@wdio/utils': 9.23.2 + '@wdio/types': 9.23.3 + '@wdio/utils': 9.23.3 archiver: 7.0.1 aria-query: 5.3.2 cheerio: 1.2.0 @@ -32200,7 +32203,7 @@ snapshots: rgb2hex: 0.2.5 serialize-error: 12.0.0 urlpattern-polyfill: 10.1.0 - webdriver: 9.23.2(bufferutil@4.0.9)(utf-8-validate@6.0.5) + webdriver: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bare-buffer - bufferutil From eb4bbd49fbf6c6d1edd57990dc3c5169a6146f38 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 01:52:08 +0000 Subject: [PATCH 035/560] fix(deps): update dependency globals to v17.3.0 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index e0840ccd04..41880160cb 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -43,7 +43,7 @@ "debounce": "3.0.0", "draggabilly": "3.0.0", "force-graph": "1.51.0", - "globals": "17.2.0", + "globals": "17.3.0", "i18next": "25.8.0", "i18next-http-backend": "3.0.2", "jquery": "4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8118438a0..3a96e4631f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -261,8 +261,8 @@ importers: specifier: 1.51.0 version: 1.51.0 globals: - specifier: 17.2.0 - version: 17.2.0 + specifier: 17.3.0 + version: 17.3.0 i18next: specifier: 25.8.0 version: 25.8.0(typescript@5.9.3) @@ -9107,8 +9107,8 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} - globals@17.2.0: - resolution: {integrity: sha512-tovnCz/fEq+Ripoq+p/gN1u7l6A7wwkoBT9pRCzTHzsD/LvADIzXZdjmRymh5Ztf0DYC3Rwg5cZRYjxzBmzbWg==} + globals@17.3.0: + resolution: {integrity: sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==} engines: {node: '>=18'} globalthis@1.0.4: @@ -16076,8 +16076,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -16254,6 +16252,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16436,6 +16436,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16934,8 +16936,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -25476,7 +25476,7 @@ snapshots: globals@16.5.0: {} - globals@17.2.0: {} + globals@17.3.0: {} globalthis@1.0.4: dependencies: From a54fe62643b06fbda5df5404a8c85a815131678b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 2 Feb 2026 04:31:50 +0000 Subject: [PATCH 036/560] fix(deps): update dependency mind-elixir to v5.7.1 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index e0840ccd04..de990d05bb 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -56,7 +56,7 @@ "mark.js": "8.11.1", "marked": "17.0.1", "mermaid": "11.12.2", - "mind-elixir": "5.6.1", + "mind-elixir": "5.7.1", "normalize.css": "8.0.1", "panzoom": "9.4.3", "preact": "10.28.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8118438a0..2af9c7a085 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -208,7 +208,7 @@ importers: version: 0.2.0(mermaid@11.12.2) '@mind-elixir/node-menu': specifier: 5.0.1 - version: 5.0.1(mind-elixir@5.6.1) + version: 5.0.1(mind-elixir@5.7.1) '@popperjs/core': specifier: 2.11.8 version: 2.11.8 @@ -300,8 +300,8 @@ importers: specifier: 11.12.2 version: 11.12.2 mind-elixir: - specifier: 5.6.1 - version: 5.6.1 + specifier: 5.7.1 + version: 5.7.1 normalize.css: specifier: 8.0.1 version: 8.0.1 @@ -10904,8 +10904,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - mind-elixir@5.6.1: - resolution: {integrity: sha512-FTpP5yfyjqXxtHbUAcJVrzBgbU9en0dQIbYx4lQc1C7aWOnjHGHr9iVccgMqU4gh9jVIBpunm4++2DpN753mGg==} + mind-elixir@5.7.1: + resolution: {integrity: sha512-T9RRECITVzT0A64ZpUJiM/y5PrsiwCDSoJKUGL8iylREn2I9d+5cjrW6dcRwpVOs1kSiLjsFBubVECmO+tBaTw==} mini-css-extract-plugin@2.9.4: resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} @@ -16011,6 +16011,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16279,6 +16281,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-essentials@47.4.0': dependencies: @@ -16737,6 +16741,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -16934,8 +16940,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -19030,9 +19034,9 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@mind-elixir/node-menu@5.0.1(mind-elixir@5.6.1)': + '@mind-elixir/node-menu@5.0.1(mind-elixir@5.7.1)': dependencies: - mind-elixir: 5.6.1 + mind-elixir: 5.7.1 '@mixmark-io/domino@2.2.0': {} @@ -27662,7 +27666,7 @@ snapshots: mimic-response@3.1.0: {} - mind-elixir@5.6.1: {} + mind-elixir@5.7.1: {} mini-css-extract-plugin@2.9.4(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)): dependencies: From 72d6b83ec5eef84f80c56d32e3c68df015c0223e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 27 Jan 2026 09:16:10 +0200 Subject: [PATCH 037/560] docs(user): add nightly release script for Windows --- .../Advanced Usage/Nightly release.html | 29 ++++++++++++++-- .../Installation & Setup/Web Clipper.html | 34 ++++++++----------- .../Developer Guide/Documentation.md | 2 +- .../Advanced Usage/Nightly release.md | 34 +++++++++++++++++-- 4 files changed, 74 insertions(+), 25 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Nightly release.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Nightly release.html index b2bf30c816..2ac344c9bb 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Nightly release.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Nightly release.html @@ -26,10 +26,35 @@

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
+

On Ubuntu (Bash)

#!/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 +rm $name
+

On Windows (PowerShell)

if ($env:PROCESSOR_ARCHITECTURE -eq "ARM64") {
+  $arch = "arm64";
+} else {
+  $arch = "x64";
+}
+
+$exeUrl = "https://github.com/TriliumNext/Trilium/releases/download/nightly/TriliumNotes-main-windows-$($arch).exe";
+Write-Host "Downloading $($exeUrl)"
+
+# Generate a unique path in the temp dir
+$guid = [guid]::NewGuid().ToString()
+$destination = Join-Path -Path $env:TEMP -ChildPath "$guid.exe"
+
+try {
+    $ProgressPreference = 'SilentlyContinue'
+    Invoke-WebRequest -Uri $exeUrl -OutFile $destination
+    $process = Start-Process -FilePath $destination
+} catch {
+    Write-Error "An error occurred: $_"
+} finally {
+    # Clean up
+    if (Test-Path $destination) {
+        Remove-Item -Path $destination -Force
+    }
+}
\ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html index 5aa0d98b96..daed786e9c 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Web Clipper.html @@ -24,8 +24,7 @@
  • click on an image or link and save it through context menu
  • save whole page from the popup or context menu
  • save screenshot (with crop tool) from either popup or context menu
  • -
  • create short text note from popup
  • +
  • create short text note from popup
  • Location of clippings

    Trilium will save these clippings as a new child note under a "clipper @@ -40,10 +39,8 @@

    Keyboard shortcuts are available for most functions:

    • Save selected text: Ctrl+Shift+S (Mac: ++S)
    • -
    • Save whole page: Alt+Shift+S (Mac: ++S)
    • -
    • Save screenshot: Ctrl+Shift+E (Mac: ++E)
    • +
    • Save whole page: Alt+Shift+S (Mac: ++S)
    • +
    • Save screenshot: Ctrl+Shift+E (Mac: ++E)

    To set custom shortcuts, follow the directions for your browser.

    For Chrome

    1. Download trilium-web-clipper-[x.y.z]-chrome.zip.
    2. -
    3. Extract the archive.
    4. -
    5. In Chrome, navigate to chrome://extensions/ -
    6. -
    7. Toggle Developer Mode in top-right of the page.
    8. -
    9. Press the Load unpacked button near the header.
    10. -
    11. Point to the extracted directory from step (2).
    12. +
    13. Extract the archive.
    14. +
    15. In Chrome, navigate to chrome://extensions/ +
    16. +
    17. Toggle Developer Mode in top-right of the page.
    18. +
    19. Press the Load unpacked button near the header.
    20. +
    21. Point to the extracted directory from step (2).

    For Firefox

    @@ -130,7 +166,7 @@ function NoteIconList({ note, dropdownRef }: { const attributeToSet = note.hasOwnedLabel("workspace") ? "workspaceIconClass" : "iconClass"; attributes.setLabel(note.noteId, attributeToSet, iconClass); } - dropdownRef?.current?.hide(); + onHide(); }} > {filteredIcons.length ? ( From c4d131dd23fb1470faa4e2462e1a7f8cbaf59339 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 13:13:13 +0200 Subject: [PATCH 042/560] feat(mobile): improve note icon selector fit --- apps/client/src/widgets/note_icon.css | 14 ++++++++++++++ apps/client/src/widgets/note_icon.tsx | 14 +++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/client/src/widgets/note_icon.css b/apps/client/src/widgets/note_icon.css index 4ed6df6482..237f14076c 100644 --- a/apps/client/src/widgets/note_icon.css +++ b/apps/client/src/widgets/note_icon.css @@ -117,3 +117,17 @@ body.experimental-feature-new-layout { } } } + +body.mobile .modal.icon-switcher { + .modal-body { + padding: 0; + + > .filter-row { + padding: 0 var(--bs-modal-padding) var(--bs-modal-padding) var(--bs-modal-padding); + } + } + + .icon-list { + margin: auto; + } +} diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 9c503c9fd5..019995a9f7 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -55,7 +55,7 @@ export default function NoteIcon() { hideToggleArrow disabled={viewScope?.viewMode !== "default"} > - { note && dropdownRef?.current?.hide()} /> } + { note && dropdownRef?.current?.hide()} columnCount={12} /> } ); } @@ -82,16 +82,17 @@ function MobileNoteIconSwitcher({ note, icon }: { show={modalShown} onHidden={() => setModalShown(false)} className="icon-switcher note-icon-widget" > - {note && setModalShown(false)} />} + {note && setModalShown(false)} columnCount={7} />} ), document.body)}
    ); } -function NoteIconList({ note, onHide }: { +function NoteIconList({ note, onHide, columnCount }: { note: FNote; onHide: () => void; + columnCount: number; }) { const searchBoxRef = useRef(null); const iconListRef = useRef(null); @@ -156,6 +157,9 @@ function NoteIconList({ note, onHide }: {
    { // Make sure we are not clicking on something else than a button. const clickedTarget = e.target as HTMLElement; @@ -171,9 +175,9 @@ function NoteIconList({ note, onHide }: { > {filteredIcons.length ? ( Date: Mon, 2 Feb 2026 13:14:42 +0200 Subject: [PATCH 043/560] fix(mobile/note_icon): small horizontal scroll --- apps/client/src/widgets/note_icon.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 019995a9f7..5ca80fa01d 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -158,7 +158,7 @@ function NoteIconList({ note, onHide, columnCount }: { class="icon-list" ref={iconListRef} style={{ - width: columnCount * 48, + width: (columnCount * 48 + 10), }} onClick={(e) => { // Make sure we are not clicking on something else than a button. From b090eb93599b7dcd40073a823e78e81c9c4b0376 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 13:22:37 +0200 Subject: [PATCH 044/560] feat(mobile/note_icon): calculate number of columns dynamically --- apps/client/src/widgets/note_icon.css | 8 ++++++++ apps/client/src/widgets/note_icon.tsx | 5 +++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/note_icon.css b/apps/client/src/widgets/note_icon.css index 237f14076c..70e2f018de 100644 --- a/apps/client/src/widgets/note_icon.css +++ b/apps/client/src/widgets/note_icon.css @@ -119,6 +119,14 @@ body.experimental-feature-new-layout { } body.mobile .modal.icon-switcher { + .modal-dialog { + left: 0; + right: 0; + margin: unset; + transform: unset; + max-width: 100%; + } + .modal-body { padding: 0; diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 5ca80fa01d..96c26a8c6a 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -18,7 +18,7 @@ import ActionButton from "./react/ActionButton"; import Dropdown from "./react/Dropdown"; import { FormDropdownDivider, FormListItem } from "./react/FormList"; import FormTextBox from "./react/FormTextBox"; -import { useNoteContext, useNoteLabel, useStaticTooltip } from "./react/hooks"; +import { useNoteContext, useNoteLabel, useStaticTooltip, useWindowSize } from "./react/hooks"; import Modal from "./react/Modal"; interface IconToCountCache { @@ -65,6 +65,7 @@ function MobileNoteIconSwitcher({ note, icon }: { icon: string | null | undefined; }) { const [ modalShown, setModalShown ] = useState(false); + const { windowWidth } = useWindowSize(); return (
    @@ -82,7 +83,7 @@ function MobileNoteIconSwitcher({ note, icon }: { show={modalShown} onHidden={() => setModalShown(false)} className="icon-switcher note-icon-widget" > - {note && setModalShown(false)} columnCount={7} />} + {note && setModalShown(false)} columnCount={Math.floor(windowWidth / 48)} />} ), document.body)}
    From 490d940cd1488f56219cbded36f108b4de9bfb23 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 13:23:55 +0200 Subject: [PATCH 045/560] feat(mobile/note_icon): improve height and fit --- apps/client/src/widgets/note_icon.css | 4 ++++ apps/client/src/widgets/note_icon.tsx | 1 + 2 files changed, 5 insertions(+) diff --git a/apps/client/src/widgets/note_icon.css b/apps/client/src/widgets/note_icon.css index 70e2f018de..2e2cf3dc0a 100644 --- a/apps/client/src/widgets/note_icon.css +++ b/apps/client/src/widgets/note_icon.css @@ -129,6 +129,8 @@ body.mobile .modal.icon-switcher { .modal-body { padding: 0; + display: flex; + flex-direction: column; > .filter-row { padding: 0 var(--bs-modal-padding) var(--bs-modal-padding) var(--bs-modal-padding); @@ -137,5 +139,7 @@ body.mobile .modal.icon-switcher { .icon-list { margin: auto; + flex-grow: 1; + height: 100%; } } diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 96c26a8c6a..2b78f052eb 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -82,6 +82,7 @@ function MobileNoteIconSwitcher({ note, icon }: { size="xl" show={modalShown} onHidden={() => setModalShown(false)} className="icon-switcher note-icon-widget" + scrollable > {note && setModalShown(false)} columnCount={Math.floor(windowWidth / 48)} />} From 0382a4b30e94617d29b89a1940424dfdf4b10d8e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 13:27:34 +0200 Subject: [PATCH 046/560] fix(mobile/note_icon): consistent height and proper margins --- apps/client/src/widgets/note_icon.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/note_icon.css b/apps/client/src/widgets/note_icon.css index 2e2cf3dc0a..db99ecd9e1 100644 --- a/apps/client/src/widgets/note_icon.css +++ b/apps/client/src/widgets/note_icon.css @@ -125,6 +125,7 @@ body.mobile .modal.icon-switcher { margin: unset; transform: unset; max-width: 100%; + height: 100%; } .modal-body { @@ -133,7 +134,8 @@ body.mobile .modal.icon-switcher { flex-direction: column; > .filter-row { - padding: 0 var(--bs-modal-padding) var(--bs-modal-padding) var(--bs-modal-padding); + padding: 0.25em var(--bs-modal-padding) 0.5em var(--bs-modal-padding); + border-bottom: 1px solid var(--main-border-color); } } From 90bb162a889941795fa231e51dd2d679dc0dd2d1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 13:31:29 +0200 Subject: [PATCH 047/560] feat(mobile/note_icon): bigger touch area --- apps/client/src/widgets/note_icon.css | 4 ++++ apps/client/src/widgets/note_icon.tsx | 12 +++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/client/src/widgets/note_icon.css b/apps/client/src/widgets/note_icon.css index db99ecd9e1..cea05cdcd9 100644 --- a/apps/client/src/widgets/note_icon.css +++ b/apps/client/src/widgets/note_icon.css @@ -143,5 +143,9 @@ body.mobile .modal.icon-switcher { margin: auto; flex-grow: 1; height: 100%; + + span { + padding: 12px; + } } } diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 2b78f052eb..cdf66b5735 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -4,7 +4,7 @@ import { IconRegistry } from "@triliumnext/commons"; import { Dropdown as BootstrapDropdown } from "bootstrap"; import clsx from "clsx"; import { t } from "i18next"; -import { CSSProperties, RefObject } from "preact"; +import { CSSProperties } from "preact"; import { createPortal } from "preact/compat"; import { useEffect, useMemo, useRef, useState } from "preact/hooks"; import type React from "react"; @@ -21,6 +21,8 @@ import FormTextBox from "./react/FormTextBox"; import { useNoteContext, useNoteLabel, useStaticTooltip, useWindowSize } from "./react/hooks"; import Modal from "./react/Modal"; +const ICON_SIZE = isMobile() ? 56 : 48; + interface IconToCountCache { iconClassToCountMap: Record; } @@ -84,7 +86,7 @@ function MobileNoteIconSwitcher({ note, icon }: { className="icon-switcher note-icon-widget" scrollable > - {note && setModalShown(false)} columnCount={Math.floor(windowWidth / 48)} />} + {note && setModalShown(false)} columnCount={Math.floor(windowWidth / ICON_SIZE)} />} ), document.body)}
    @@ -160,7 +162,7 @@ function NoteIconList({ note, onHide, columnCount }: { class="icon-list" ref={iconListRef} style={{ - width: (columnCount * 48 + 10), + width: (columnCount * ICON_SIZE + 10), }} onClick={(e) => { // Make sure we are not clicking on something else than a button. @@ -178,9 +180,9 @@ function NoteIconList({ note, onHide, columnCount }: { {filteredIcons.length ? ( Date: Mon, 2 Feb 2026 13:45:13 +0200 Subject: [PATCH 048/560] fix(mobile/note_icon): wrong icons displayed --- apps/client/src/widgets/note_icon.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index cdf66b5735..b5afb54717 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -185,7 +185,8 @@ function NoteIconList({ note, onHide, columnCount }: { rowHeight={ICON_SIZE} cellComponent={IconItemCell} cellProps={{ - filteredIcons + filteredIcons, + columnCount }} /> ) : ( @@ -196,10 +197,11 @@ function NoteIconList({ note, onHide, columnCount }: { ); } -function IconItemCell({ rowIndex, columnIndex, style, filteredIcons }: CellComponentProps<{ +function IconItemCell({ rowIndex, columnIndex, style, filteredIcons, columnCount }: CellComponentProps<{ filteredIcons: IconWithName[]; + columnCount: number; }>) { - const iconIndex = rowIndex * 12 + columnIndex; + const iconIndex = rowIndex * columnCount + columnIndex; const iconData = filteredIcons[iconIndex] as IconWithName | undefined; if (!iconData) return <> as React.ReactElement; From f89718d88a54313765836b0b054f2d3d6f56fadf Mon Sep 17 00:00:00 2001 From: hulmgulm Date: Mon, 2 Feb 2026 14:38:11 +0100 Subject: [PATCH 049/560] Add subtreeHidden and map:* attributes to Labels.html --- .../User Guide/Advanced Usage/Attributes/Labels.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html index 94a0ce7893..d2a6764802 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html @@ -354,6 +354,11 @@ Hides the Note List for that particular note. + + subtreeHidden + + Hides all child notes of this note from the tree of notes. + printLandscape @@ -372,6 +377,11 @@ Geo Map. + + map:* + + Defines specific options for the Geo Map View. + calendar:* @@ -384,4 +394,4 @@ href="#root/_help_0ESUbbAxVnoK">Note List for more information. - \ No newline at end of file + From 734efaf40c83f62ba2969bdf1c28cbfae2f4958b Mon Sep 17 00:00:00 2001 From: hulmgulm Date: Mon, 2 Feb 2026 14:41:38 +0100 Subject: [PATCH 050/560] Update apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../User Guide/User Guide/Advanced Usage/Attributes/Labels.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html index d2a6764802..d79004f8bc 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html @@ -357,7 +357,7 @@ subtreeHidden - Hides all child notes of this note from the tree of notes. + Hides all child notes of this note from the tree, displaying a badge with the count of hidden children. Children remain accessible via search or direct links. printLandscape From d48473ab878f6bfdb6c884f22e4070020e13d4a6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 16:38:12 +0200 Subject: [PATCH 051/560] feat(mobile/note_icon): single menu for filtering & resetting --- apps/client/src/stylesheets/style.css | 6 +- apps/client/src/widgets/note_icon.tsx | 140 +++++++++++++++++--------- 2 files changed, 100 insertions(+), 46 deletions(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 23a9869850..f05441db3a 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1540,7 +1540,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { @media (max-width: 991px) { body.mobile #launcher-pane .dropdown.global-menu > .dropdown-menu.show, body.mobile #launcher-container .dropdown > .dropdown-menu.show, - body.mobile .dropdown.note-actions > .dropdown-menu.show { + body.mobile .dropdown-menu.mobile-bottom-menu.show { --dropdown-bottom: calc(var(--mobile-bottom-offset) + var(--launcher-pane-size)); position: fixed !important; bottom: var(--dropdown-bottom) !important; @@ -1552,6 +1552,10 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { max-height: calc(var(--tn-modal-max-height) - var(--dropdown-bottom)); } + body.mobile .modal-dialog .dropdown-menu.mobile-bottom-menu.show { + --dropdown-bottom: 0; + } + #mobile-sidebar-container { position: fixed; top: 0; diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index b5afb54717..5cc97d5c1f 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -13,7 +13,7 @@ import { CellComponentProps, Grid } from "react-window"; import FNote from "../entities/fnote"; import attributes from "../services/attributes"; import server from "../services/server"; -import { isMobile } from "../services/utils"; +import { isDesktop, isMobile } from "../services/utils"; import ActionButton from "./react/ActionButton"; import Dropdown from "./react/Dropdown"; import { FormDropdownDivider, FormListItem } from "./react/FormList"; @@ -98,7 +98,6 @@ function NoteIconList({ note, onHide, columnCount }: { onHide: () => void; columnCount: number; }) { - const searchBoxRef = useRef(null); const iconListRef = useRef(null); const [ search, setSearch ] = useState(); const [ filterByPrefix, setFilterByPrefix ] = useState(null); @@ -114,49 +113,15 @@ function NoteIconList({ note, onHide, columnCount }: { return ( <> -
    - {t("note_icon.search")} - s.prefix === filterByPrefix)?.name ?? "" - }) - : t("note_icon.search_placeholder", { number: filteredIcons.length ?? 0, count: glob.iconRegistry.sources.length })} - currentValue={search} onChange={setSearch} - autoFocus - /> - - {getIconLabels(note).length > 0 && ( -
    - { - if (!note) return; - for (const label of getIconLabels(note)) { - attributes.removeAttributeById(note.noteId, label.attributeId); - } - onHide(); - }} - /> -
    - )} - - {glob.iconRegistry.sources.length > 0 && - - } -
    +
    void; + setFilterByPrefix: (value: string | null) => void; + filteredIcons: IconWithName[]; + onHide: () => void; +}) { + const searchBoxRef = useRef(null); + const hasIconPacks = glob.iconRegistry.sources.length > 0; + const hasCustomIcon = getIconLabels(note).length > 0; + + function resetToDefaultIcon() { + if (!note) return; + for (const label of getIconLabels(note)) { + attributes.removeAttributeById(note.noteId, label.attributeId); + } + onHide(); + } + + return ( +
    + {t("note_icon.search")} + s.prefix === filterByPrefix)?.name ?? "" + }) + : t("note_icon.search_placeholder", { number: filteredIcons.length ?? 0, count: glob.iconRegistry.sources.length })} + currentValue={search} onChange={setSearch} + autoFocus + /> + + {isDesktop() + ? <> + {hasCustomIcon && ( +
    + +
    + )} + + {hasIconPacks && + + } + : ( + + {hasIconPacks && <> + {t("note_icon.reset-default")} + + } + + + + )} +
    + ); +} + function IconItemCell({ rowIndex, columnIndex, style, filteredIcons, columnCount }: CellComponentProps<{ filteredIcons: IconWithName[]; columnCount: number; From 0e5aa401ef70b82ad89dd6c40e8ea00b9b996005 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 16:44:08 +0200 Subject: [PATCH 052/560] chore(mobile/note_icon): redundant separator --- apps/client/src/widgets/note_icon.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 5cc97d5c1f..bc4094439e 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -172,7 +172,6 @@ function FilterRow({ note, filterByPrefix, search, setSearch, setFilterByPrefix, onHide: () => void; }) { const searchBoxRef = useRef(null); - const hasIconPacks = glob.iconRegistry.sources.length > 0; const hasCustomIcon = getIconLabels(note).length > 0; function resetToDefaultIcon() { @@ -212,7 +211,7 @@ function FilterRow({ note, filterByPrefix, search, setSearch, setFilterByPrefix,
    )} - {hasIconPacks && - {hasIconPacks && <> + {hasCustomIcon && <> setFilterByPrefix("bx")} >{t("note_icon.filter-default")} - + {glob.iconRegistry.sources.length > 1 && } {glob.iconRegistry.sources.map(({ prefix, name, icon }) => ( prefix !== "bx" && Date: Mon, 2 Feb 2026 16:51:57 +0200 Subject: [PATCH 053/560] chore(mobile): slightly smaller note title icon --- apps/client/src/widgets/note_title.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/widgets/note_title.css b/apps/client/src/widgets/note_title.css index 50be6afc7c..e525910521 100644 --- a/apps/client/src/widgets/note_title.css +++ b/apps/client/src/widgets/note_title.css @@ -109,4 +109,8 @@ body.experimental-feature-new-layout { --input-focus-color: initial; } } + + &.mobile .title-row .note-icon-widget .note-icon { + --icon-button-size: 24px; + } } From 911f78867f36851ec4e2a2737470c214b34107ad Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 16:58:06 +0200 Subject: [PATCH 054/560] chore(mobile/header): make icons easier to press --- .../src/stylesheets/theme-next/shell.css | 2 +- apps/client/src/widgets/note_title.css | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index 7ff132e1af..5a45ddf436 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -1322,7 +1322,7 @@ body.mobile .note-title { margin-inline-start: 0; } -.title-row { +body.desktop .title-row { /* Aligns the "Create new split" button with the note menu button (the three dots button) */ padding-inline-end: 3px; } diff --git a/apps/client/src/widgets/note_title.css b/apps/client/src/widgets/note_title.css index e525910521..3e1a0d9686 100644 --- a/apps/client/src/widgets/note_title.css +++ b/apps/client/src/widgets/note_title.css @@ -110,7 +110,27 @@ body.experimental-feature-new-layout { } } - &.mobile .title-row .note-icon-widget .note-icon { - --icon-button-size: 24px; + &.mobile .title-row { + .icon-action:not(.note-icon) { + height: 45px; + width: 45px; + flex-shrink: 0; + } + + .note-actions { + width: auto; + } + + .note-badges { + margin-inline: 0.5em; + } + + .note-icon-widget { + margin-inline: 0.5em; + + .note-icon { + --icon-button-size: 24px; + } + } } } From e9c90fcde8ee0e413cb04b63f43019916acf6393 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 17:02:32 +0200 Subject: [PATCH 055/560] chore(mobile/header): prevent badges from shrinking --- apps/client/src/widgets/note_title.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/note_title.css b/apps/client/src/widgets/note_title.css index 3e1a0d9686..dc80a5ec3e 100644 --- a/apps/client/src/widgets/note_title.css +++ b/apps/client/src/widgets/note_title.css @@ -123,6 +123,7 @@ body.experimental-feature-new-layout { .note-badges { margin-inline: 0.5em; + flex-shrink: 0; } .note-icon-widget { From bbc5ebd76ba7df39b3369435601fe73f6fa1a3a6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 17:06:27 +0200 Subject: [PATCH 056/560] chore(mobile/header): improve button sizes --- apps/client/src/widgets/note_title.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/note_title.css b/apps/client/src/widgets/note_title.css index dc80a5ec3e..57f2619f2d 100644 --- a/apps/client/src/widgets/note_title.css +++ b/apps/client/src/widgets/note_title.css @@ -112,8 +112,8 @@ body.experimental-feature-new-layout { &.mobile .title-row { .icon-action:not(.note-icon) { - height: 45px; - width: 45px; + --icon-button-size: 45px; + --icon-button-icon-ratio: 0.5; flex-shrink: 0; } From 2d4022044d79b924d29f11d749da5a500d48c304 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 17:30:35 +0200 Subject: [PATCH 057/560] chore(mobile): get rid of floating buttons --- apps/client/src/layouts/mobile_layout.tsx | 3 --- apps/client/src/widgets/FloatingButtonsDefinitions.tsx | 8 -------- apps/client/src/widgets/dialogs/PopupEditor.tsx | 8 ++++---- 3 files changed, 4 insertions(+), 15 deletions(-) diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 487532e5ca..27b0779921 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -7,8 +7,6 @@ import RootContainer from "../widgets/containers/root_container.js"; import ScrollingContainer from "../widgets/containers/scrolling_container.js"; import SplitNoteContainer from "../widgets/containers/split_note_container.js"; import FindWidget from "../widgets/find.js"; -import FloatingButtons from "../widgets/FloatingButtons.jsx"; -import { MOBILE_FLOATING_BUTTONS } from "../widgets/FloatingButtonsDefinitions.jsx"; import LauncherContainer from "../widgets/launch_bar/LauncherContainer.jsx"; import InlineTitle from "../widgets/layout/InlineTitle.jsx"; import NoteBadges from "../widgets/layout/NoteBadges.jsx"; @@ -157,7 +155,6 @@ export default class MobileLayout { .child() .child() ) - .child() .child() .child( new ScrollingContainer() diff --git a/apps/client/src/widgets/FloatingButtonsDefinitions.tsx b/apps/client/src/widgets/FloatingButtonsDefinitions.tsx index be8a41c46c..0b337687a0 100644 --- a/apps/client/src/widgets/FloatingButtonsDefinitions.tsx +++ b/apps/client/src/widgets/FloatingButtonsDefinitions.tsx @@ -60,14 +60,6 @@ export const DESKTOP_FLOATING_BUTTONS: FloatingButtonsList = [ Backlinks ]; -export const MOBILE_FLOATING_BUTTONS: FloatingButtonsList = [ - RefreshBackendLogButton, - EditButton, - RelationMapButtons, - ExportImageButtons, - Backlinks -]; - /** * Floating buttons that should be hidden in popup editor (Quick edit). */ diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index e8e73ae785..a7f3fde393 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -5,13 +5,15 @@ import { useContext, useEffect, useMemo, useRef, useState } from "preact/hooks"; import appContext from "../../components/app_context"; import NoteContext from "../../components/note_context"; +import { isExperimentalFeatureEnabled } from "../../services/experimental_features"; import froca from "../../services/froca"; import { t } from "../../services/i18n"; import tree from "../../services/tree"; import utils from "../../services/utils"; import NoteList from "../collections/NoteList"; import FloatingButtons from "../FloatingButtons"; -import { DESKTOP_FLOATING_BUTTONS, MOBILE_FLOATING_BUTTONS, POPUP_HIDDEN_FLOATING_BUTTONS } from "../FloatingButtonsDefinitions"; +import { DESKTOP_FLOATING_BUTTONS, POPUP_HIDDEN_FLOATING_BUTTONS } from "../FloatingButtonsDefinitions"; +import NoteBadges from "../layout/NoteBadges"; import NoteIcon from "../note_icon"; import NoteTitleWidget from "../note_title"; import NoteDetail from "../NoteDetail"; @@ -23,8 +25,6 @@ import ReadOnlyNoteInfoBar from "../ReadOnlyNoteInfoBar"; import StandaloneRibbonAdapter from "../ribbon/components/StandaloneRibbonAdapter"; import FormattingToolbar from "../ribbon/FormattingToolbar"; import MobileEditorToolbar from "../type_widgets/text/mobile_editor_toolbar"; -import NoteBadges from "../layout/NoteBadges"; -import { isExperimentalFeatureEnabled } from "../../services/experimental_features"; const isNewLayout = isExperimentalFeatureEnabled("new-layout"); @@ -34,7 +34,7 @@ export default function PopupEditor() { const [ noteContext, setNoteContext ] = useState(new NoteContext("_popup-editor")); const isMobile = utils.isMobile(); const items = useMemo(() => { - const baseItems = isMobile ? MOBILE_FLOATING_BUTTONS : DESKTOP_FLOATING_BUTTONS; + const baseItems = isMobile ? [] : DESKTOP_FLOATING_BUTTONS; return baseItems.filter(item => !POPUP_HIDDEN_FLOATING_BUTTONS.includes(item)); }, [ isMobile ]); From 411a59ec5425f9215e7299b1b10efadd89f291ca Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 17:46:18 +0200 Subject: [PATCH 058/560] feat(mobile): display custom note actions in note actions --- .../mobile_widgets/mobile_detail_menu.tsx | 2 + .../src/widgets/ribbon/NoteActionsCustom.tsx | 45 ++++++++++++------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 7db00d0bcd..91e16d62ab 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -5,6 +5,7 @@ import { openInAppHelpFromUrl } from "../../services/utils"; import { FormDropdownDivider, FormListItem } from "../react/FormList"; import { useNoteContext } from "../react/hooks"; import { NoteContextMenu } from "../ribbon/NoteActions"; +import NoteActionsCustom from "../ribbon/NoteActionsCustom"; export default function MobileDetailMenu() { const { note, noteContext, parentComponent, ntxId } = useNoteContext(); @@ -18,6 +19,7 @@ export default function MobileDetailMenu() { + {noteContext && ntxId && } noteContext?.notePath && note_create.createNote(noteContext.notePath)} icon="bx bx-plus" diff --git a/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx b/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx index edaf043bf7..4438561ec2 100644 --- a/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx +++ b/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx @@ -7,11 +7,11 @@ import FNote from "../../entities/fnote"; import { t } from "../../services/i18n"; import { getHelpUrlForNote } from "../../services/in_app_help"; import { downloadFileNote, openNoteExternally } from "../../services/open"; -import { openInAppHelpFromUrl } from "../../services/utils"; +import { isMobile, openInAppHelpFromUrl } from "../../services/utils"; import { ViewTypeOptions } from "../collections/interface"; import { buildSaveSqlToNoteHandler } from "../FloatingButtonsDefinitions"; -import ActionButton from "../react/ActionButton"; -import { FormFileUploadActionButton } from "../react/FormFileUpload"; +import ActionButton, { ActionButtonProps } from "../react/ActionButton"; +import { FormListItem } from "../react/FormList"; import { useNoteLabel, useNoteLabelBoolean, useNoteProperty, useTriliumEvent, useTriliumEvents, useTriliumOption } from "../react/hooks"; import { ParentComponent } from "../react/react_utils"; import { buildUploadNewFileRevisionListener } from "./FilePropertiesTab"; @@ -115,7 +115,7 @@ function UploadNewRevisionButton({ note, onChange }: NoteActionsCustomInnerProps onChange: (files: FileList | null) => void; }) { return ( - parentComponent?.triggerEvent("copyImageReferenceToClipboard", { ntxId })} @@ -161,7 +161,7 @@ function RefreshButton({ note, noteType, isDefaultViewMode, parentComponent, not const isEnabled = (note.noteId === "_backendLog" || noteType === "render") && isDefaultViewMode; return (isEnabled && - parentComponent.triggerEvent("refreshData", { ntxId: noteContext.ntxId })} @@ -174,7 +174,7 @@ function SwitchSplitOrientationButton({ note, isReadOnly, isDefaultViewMode }: N const [ splitEditorOrientation, setSplitEditorOrientation ] = useTriliumOption("splitEditorOrientation"); const upcomingOrientation = splitEditorOrientation === "horizontal" ? "vertical" : "horizontal"; - return isShown && setSplitEditorOrientation(upcomingOrientation)} @@ -188,7 +188,7 @@ export function ToggleReadOnlyButton({ note, isDefaultViewMode }: NoteActionsCus const isEnabled = ([ "mermaid", "mindMap", "canvas" ].includes(note.type) || isSavedSqlite) && note.isContentAvailable() && isDefaultViewMode; - return isEnabled && setReadOnly(!isReadOnly)} @@ -197,7 +197,7 @@ export function ToggleReadOnlyButton({ note, isDefaultViewMode }: NoteActionsCus function RunActiveNoteButton({ noteMime }: NoteActionsCustomInnerProps) { const isEnabled = noteMime.startsWith("application/javascript") || noteMime === "text/x-sqlite;schema=trilium"; - return isEnabled && openInAppHelpFromUrl(noteMime.endsWith("frontend") ? "Q2z6av6JZVWm" : "MEtfsqa5VwNi")} @@ -239,7 +239,7 @@ function InAppHelpButton({ note }: NoteActionsCustomInnerProps) { const isEnabled = !!helpUrl; return isEnabled && ( - helpUrl && openInAppHelpFromUrl(helpUrl)} @@ -249,7 +249,7 @@ function InAppHelpButton({ note }: NoteActionsCustomInnerProps) { function AddChildButton({ parentComponent, noteType, ntxId, isReadOnly }: NoteActionsCustomInnerProps) { if (noteType === "relationMap") { - return parentComponent.triggerEvent("relationMapCreateChildNote", { ntxId })} @@ -258,3 +258,18 @@ function AddChildButton({ parentComponent, noteType, ntxId, isReadOnly }: NoteAc } } //#endregion +const cachedIsMobile = isMobile(); + +function NoteAction({ text, ...props }: Pick & { + onClick?: ((e: MouseEvent) => void) | undefined; +}) { + if (cachedIsMobile) { + return {text}; + } + return ; + +} + +function NoteActionWithFileUpload() { + return "Not implemented."; +} From 8a923700426f9b074333b96ebfd9fe4bf3a9b996 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 17:57:30 +0200 Subject: [PATCH 059/560] fix(mobile/custom_note_actions): missing separator --- apps/client/src/widgets/ribbon/NoteActionsCustom.css | 4 ++++ apps/client/src/widgets/ribbon/NoteActionsCustom.tsx | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 apps/client/src/widgets/ribbon/NoteActionsCustom.css diff --git a/apps/client/src/widgets/ribbon/NoteActionsCustom.css b/apps/client/src/widgets/ribbon/NoteActionsCustom.css new file mode 100644 index 0000000000..e0ad0eb8fb --- /dev/null +++ b/apps/client/src/widgets/ribbon/NoteActionsCustom.css @@ -0,0 +1,4 @@ +body.mobile .note-actions-custom:not(:empty) { + margin-bottom: calc(var(--bs-dropdown-divider-margin-y) * 2); + border-top: 1px solid var(--bs-dropdown-divider-bg); +} diff --git a/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx b/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx index 4438561ec2..3a64e8c9c5 100644 --- a/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx +++ b/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx @@ -1,3 +1,5 @@ +import "./NoteActionsCustom.css"; + import { NoteType } from "@triliumnext/commons"; import { useContext, useEffect, useRef, useState } from "preact/hooks"; From 6a313b99e41590b01cc7b8f71b3b87e70a8a69c5 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 18:02:47 +0200 Subject: [PATCH 060/560] fix(mobile/custom_note_actions): missing file upload --- .../src/widgets/react/FormFileUpload.tsx | 25 ++++++++++++++++++- apps/client/src/widgets/react/FormList.tsx | 2 +- .../src/widgets/ribbon/NoteActionsCustom.tsx | 17 +++++++------ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/apps/client/src/widgets/react/FormFileUpload.tsx b/apps/client/src/widgets/react/FormFileUpload.tsx index e97e73184b..42d9c908eb 100644 --- a/apps/client/src/widgets/react/FormFileUpload.tsx +++ b/apps/client/src/widgets/react/FormFileUpload.tsx @@ -3,8 +3,9 @@ import { useEffect, useRef } from "preact/hooks"; import ActionButton, { ActionButtonProps } from "./ActionButton"; import Button, { ButtonProps } from "./Button"; +import { FormListItem, FormListItemOpts } from "./FormList"; -interface FormFileUploadProps { +export interface FormFileUploadProps { name?: string; onChange: (files: FileList | null) => void; multiple?: boolean; @@ -75,3 +76,25 @@ export function FormFileUploadActionButton({ onChange, ...buttonProps }: Omit ); } + +/** + * Similar to {@link FormFileUploadButton}, but uses an {@link FormListItem} instead of a normal {@link Button}. + * @param param the change listener for the file upload and the properties for the button. + */ +export function FormFileUploadFormListItem({ onChange, children, ...buttonProps }: Omit & Pick) { + const inputRef = useRef(null); + + return ( + <> + inputRef.current?.click()} + >{children} + - {helpUrl && <> - - openInAppHelpFromUrl(helpUrl)} - >{t("help-button.title")} - } {subContexts.length < 2 && <> Date: Mon, 2 Feb 2026 18:23:54 +0200 Subject: [PATCH 063/560] chore(mobile/custom_note_actions): disable split orientation button --- apps/client/src/widgets/ribbon/NoteActionsCustom.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx b/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx index 7de9fdf08b..2864e50eaf 100644 --- a/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx +++ b/apps/client/src/widgets/ribbon/NoteActionsCustom.tsx @@ -175,7 +175,7 @@ function RefreshButton({ note, noteType, isDefaultViewMode, parentComponent, not } function SwitchSplitOrientationButton({ note, isReadOnly, isDefaultViewMode }: NoteActionsCustomInnerProps) { - const isShown = note.type === "mermaid" && note.isContentAvailable() && isDefaultViewMode; + const isShown = note.type === "mermaid" && !cachedIsMobile && note.isContentAvailable() && isDefaultViewMode; const [ splitEditorOrientation, setSplitEditorOrientation ] = useTriliumOption("splitEditorOrientation"); const upcomingOrientation = splitEditorOrientation === "horizontal" ? "vertical" : "horizontal"; From c8a0c9fd231c9cf2be0b857ddf517bc6f80ff0d5 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 18:26:40 +0200 Subject: [PATCH 064/560] chore(mobile/custom_note_actions): text not fitting --- apps/client/src/translations/en/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 6bd13a3346..7ae81be1ec 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -745,7 +745,7 @@ "button_title": "Export diagram as SVG" }, "relation_map_buttons": { - "create_child_note_title": "Create new child note and add it into this relation map", + "create_child_note_title": "Create child note and add it to map", "reset_pan_zoom_title": "Reset pan & zoom to initial coordinates and magnification", "zoom_in_title": "Zoom In", "zoom_out_title": "Zoom Out" From 0d444daaca592d6e46f6a62f590c81777543e897 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 18:29:21 +0200 Subject: [PATCH 065/560] fix(mobile/custom_note_actions): note icon shown in empty note --- apps/client/src/widgets/note_icon.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index bc4094439e..6c79bc8017 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -69,7 +69,7 @@ function MobileNoteIconSwitcher({ note, icon }: { const [ modalShown, setModalShown ] = useState(false); const { windowWidth } = useWindowSize(); - return ( + return (note &&
    Date: Mon, 2 Feb 2026 18:34:22 +0200 Subject: [PATCH 066/560] style/text editor: fix layout issues --- apps/client/src/widgets/containers/scrolling_container.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/containers/scrolling_container.css b/apps/client/src/widgets/containers/scrolling_container.css index 2a2adb1475..2cded53e6e 100644 --- a/apps/client/src/widgets/containers/scrolling_container.css +++ b/apps/client/src/widgets/containers/scrolling_container.css @@ -4,11 +4,14 @@ position: relative; > .inline-title, - > .note-detail > .note-detail-editable-text, + > .note-detail > .note-detail-editable-text > .note-detail-editable-text-editor, > .note-list-widget:not(.full-height) .note-list-wrapper { padding-inline: 24px; } + > .note-detail > .note-detail-editable-text > .note-detail-editable-text-editor { + overflow: unset; + } } .note-split.type-code:not(.mime-text-x-sqlite) { From 76f36e2fd32f3352d9267ac7320e361519e78d99 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 18:39:40 +0200 Subject: [PATCH 067/560] fix(mobile/custom_note_actions): unable to close empty pane --- .../mobile_widgets/mobile_detail_menu.tsx | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index ed69af6f25..417f69e89b 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,7 +1,6 @@ import { t } from "../../services/i18n"; -import { getHelpUrlForNote } from "../../services/in_app_help"; import note_create from "../../services/note_create"; -import { openInAppHelpFromUrl } from "../../services/utils"; +import ActionButton from "../react/ActionButton"; import { FormDropdownDivider, FormListItem } from "../react/FormList"; import { useNoteContext } from "../react/hooks"; import { NoteContextMenu } from "../ribbon/NoteActions"; @@ -12,9 +11,16 @@ export default function MobileDetailMenu() { const subContexts = noteContext?.getMainContext().getSubContexts() ?? []; const isMainContext = noteContext?.isMainContext(); + function closePane() { + // Wait first for the context menu to be dismissed, otherwise the backdrop stays on. + requestAnimationFrame(() => { + parentComponent.triggerCommand("closeThisNoteSplit", { ntxId }); + }); + } + return (
    - {note && ( + {note ? ( @@ -34,17 +40,18 @@ export default function MobileDetailMenu() { { - // Wait first for the context menu to be dismissed, otherwise the backdrop stays on. - requestAnimationFrame(() => { - parentComponent.triggerCommand("closeThisNoteSplit", { ntxId }); - }); - }} + onClick={closePane} >{t("close_pane_button.close_this_pane")} } } /> + ) : ( + )}
    ); From a9c5b99ae862979717e117d9bf40f673bc5297f6 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 2 Feb 2026 20:06:05 +0200 Subject: [PATCH 068/560] style/text editor/block toolbar button: fix position and z-index --- apps/client/src/stylesheets/theme-next/notes/text.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index dc025bb66d..a291360c82 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -47,9 +47,11 @@ } /* The toolbar show / hide button for the current text block */ -.ck.ck-block-toolbar-button { +:root .ck.ck-block-toolbar-button { --ck-color-button-on-background: transparent; --ck-color-button-on-color: currentColor; + translate: -30% 0; + z-index: 5000; } :root .ck.ck-toolbar .ck-button:not(.ck-disabled):active, From 12b641b5221f09b97c5ef139652611de43ee1dc7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 20:10:20 +0200 Subject: [PATCH 069/560] feat(mobile/note_actions): basic integration of backlinks --- .../mobile_widgets/mobile_detail_menu.tsx | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 417f69e89b..c01e6051e3 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,15 +1,22 @@ +import { createPortal, useState } from "preact/compat"; + +import FNote from "../../entities/fnote"; import { t } from "../../services/i18n"; +import { ViewScope } from "../../services/link"; import note_create from "../../services/note_create"; +import { BacklinksList, useBacklinkCount } from "../FloatingButtonsDefinitions"; import ActionButton from "../react/ActionButton"; import { FormDropdownDivider, FormListItem } from "../react/FormList"; import { useNoteContext } from "../react/hooks"; +import Modal from "../react/Modal"; import { NoteContextMenu } from "../ribbon/NoteActions"; import NoteActionsCustom from "../ribbon/NoteActionsCustom"; export default function MobileDetailMenu() { - const { note, noteContext, parentComponent, ntxId } = useNoteContext(); + const { note, noteContext, parentComponent, ntxId, viewScope } = useNoteContext(); const subContexts = noteContext?.getMainContext().getSubContexts() ?? []; const isMainContext = noteContext?.isMainContext(); + const [ modalShown, setModalShown ] = useState(false); function closePane() { // Wait first for the context menu to be dismissed, otherwise the backdrop stays on. @@ -24,6 +31,8 @@ export default function MobileDetailMenu() { + + {noteContext && ntxId && } noteContext?.notePath && note_create.createNote(noteContext.notePath)} @@ -53,6 +62,38 @@ export default function MobileDetailMenu() { text={t("close_pane_button.close_this_pane")} /> )} + + {createPortal(( + + ), document.body)}
    ); } + +function Backlinks({ note, viewScope, setModalShown }: { note: FNote, viewScope?: ViewScope, setModalShown: (shown: boolean) => void }) { + const count = useBacklinkCount(note, viewScope?.viewMode === "default"); + + return count > 0 && ( + <> + setModalShown(true)} + >{t("status_bar.backlinks", { count })} + + + ); +} + +function BacklinksModal({ note, modalShown, setModalShown }: { note: FNote | null | undefined, modalShown: boolean, setModalShown: (shown: boolean) => void }) { + return ( + setModalShown(false)} + > + {note && } + + ); +} From 348c00f86d98d55f6053596a0ede92dfc0cef74f Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 2 Feb 2026 20:13:00 +0200 Subject: [PATCH 070/560] style/text editor: fix layout issues --- apps/client/src/widgets/containers/scrolling_container.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/containers/scrolling_container.css b/apps/client/src/widgets/containers/scrolling_container.css index 2cded53e6e..a4be33cf29 100644 --- a/apps/client/src/widgets/containers/scrolling_container.css +++ b/apps/client/src/widgets/containers/scrolling_container.css @@ -6,7 +6,7 @@ > .inline-title, > .note-detail > .note-detail-editable-text > .note-detail-editable-text-editor, > .note-list-widget:not(.full-height) .note-list-wrapper { - padding-inline: 24px; + margin-inline: 24px; } > .note-detail > .note-detail-editable-text > .note-detail-editable-text-editor { From 220ca8a57087ad47c61072c64a03e5c7a54b054e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 20:28:40 +0200 Subject: [PATCH 071/560] chore(mobile/note_actions): use new layout styling for backlinks --- apps/client/src/widgets/Backlinks.css | 83 +++++++++++++++++++ .../widgets/FloatingButtonsDefinitions.tsx | 2 + apps/client/src/widgets/layout/StatusBar.css | 78 ----------------- apps/client/src/widgets/layout/StatusBar.tsx | 2 +- .../mobile_widgets/mobile_detail_menu.tsx | 6 +- 5 files changed, 90 insertions(+), 81 deletions(-) create mode 100644 apps/client/src/widgets/Backlinks.css diff --git a/apps/client/src/widgets/Backlinks.css b/apps/client/src/widgets/Backlinks.css new file mode 100644 index 0000000000..edcd9097de --- /dev/null +++ b/apps/client/src/widgets/Backlinks.css @@ -0,0 +1,83 @@ +.tn-backlinks-widget .backlinks-items { + list-style-type: none; + margin: 0; + padding: 0; + position: static; + width: unset; + + > li { + --border-radius: 8px; + + max-width: 600px; + padding: 10px 20px; + background: var(--card-background-color); + + & + li { + margin-top: 2px; + } + + &:first-child { + border-radius: var(--border-radius) var(--border-radius) 0 0; + } + + &:last-child { + border-radius: 0 0 var(--border-radius) var(--border-radius); + } + + /* Card header */ + & > span:first-child { + display: block; + + > span { + display: flex; + flex-wrap: wrap; + align-items: center; + + /* Note path */ + > small { + flex: 100%; + order: -1; + font-size: .65rem; + + .note-path { + padding: 0; + } + } + + /* Note icon */ + > .tn-icon { + color: var(--menu-item-icon-color); + } + + /* Note title */ + > a { + margin-inline-start: 4px; + color: currentColor; + font-weight: 500; + } + } + } + + /* Card content - excerpt */ + & > span:nth-child(2) > div { + all: unset; /* TODO: Remove after disposing the old style from FloatingButtons.css */ + display: block; + + margin: 8px 0; + border-radius: 4px; + background: var(--quick-search-result-content-background); + padding: 8px; + font-size: .75rem; + + a { + background: transparent; + color: var(--quick-search-result-highlight-color); + text-decoration: underline; + } + + p { + margin: 0; + } + } + } +} diff --git a/apps/client/src/widgets/FloatingButtonsDefinitions.tsx b/apps/client/src/widgets/FloatingButtonsDefinitions.tsx index 0b337687a0..5d19389cf1 100644 --- a/apps/client/src/widgets/FloatingButtonsDefinitions.tsx +++ b/apps/client/src/widgets/FloatingButtonsDefinitions.tsx @@ -1,3 +1,5 @@ +import "./Backlinks.css"; + import { BacklinkCountResponse, BacklinksResponse, SaveSqlConsoleResponse } from "@triliumnext/commons"; import { VNode } from "preact"; import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "preact/hooks"; diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index c421c3d65e..b3fe412d95 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -160,84 +160,6 @@ max-height: 60vh; overflow-y: scroll; - - /* Backlink card */ - li { - --border-radius: 8px; - - max-width: 600px; - padding: 10px 20px; - background: var(--card-background-color); - - & + li { - margin-top: 2px; - } - - &:first-child { - border-radius: var(--border-radius) var(--border-radius) 0 0; - } - - &:last-child { - border-radius: 0 0 var(--border-radius) var(--border-radius); - } - - /* Card header */ - & > span:first-child { - display: block; - - > span { - display: flex; - flex-wrap: wrap; - align-items: center; - - /* Note path */ - > small { - flex: 100%; - order: -1; - font-size: .65rem; - - .note-path { - padding: 0; - } - } - - /* Note icon */ - > .tn-icon { - color: var(--menu-item-icon-color); - } - - /* Note title */ - > a { - margin-inline-start: 4px; - color: currentColor; - font-weight: 500; - } - } - } - - /* Card content - excerpt */ - & > span:nth-child(2) > div { - all: unset; /* TODO: Remove after disposing the old style from FloatingButtons.css */ - display: block; - - margin: 8px 0; - border-radius: 4px; - background: var(--quick-search-result-content-background); - padding: 8px; - font-size: .75rem; - - a { - background: transparent; - color: var(--quick-search-result-highlight-color); - text-decoration: underline; - } - - p { - margin: 0; - } - } - - } } } diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index 903aeca3b2..d05fa113df 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -300,7 +300,7 @@ function BacklinksBadge({ note, viewScope }: StatusBarContext) { const count = useBacklinkCount(note, viewScope?.viewMode === "default"); return (note && count > 0 && setModalShown(true)} + onClick={() => setModalShown(true)} >{t("status_bar.backlinks", { count })} @@ -93,7 +93,9 @@ function BacklinksModal({ note, modalShown, setModalShown }: { note: FNote | nul show={modalShown} onHidden={() => setModalShown(false)} > - {note && } +
      + {note && } +
    ); } From 79649805b8e9c5818bec771769e8be793b74e9d5 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 20:34:52 +0200 Subject: [PATCH 072/560] chore(mobile/note_actions): missing translation for backlinks --- apps/client/src/translations/en/translation.json | 3 ++- apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 7ae81be1ec..3c2c5f6c0f 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -760,7 +760,8 @@ "delete_this_note": "Delete this note", "note_revisions": "Note revisions", "error_cannot_get_branch_id": "Cannot get branchId for notePath '{{notePath}}'", - "error_unrecognized_command": "Unrecognized command {{command}}" + "error_unrecognized_command": "Unrecognized command {{command}}", + "backlinks": "Backlinks" }, "note_icon": { "change_note_icon": "Change note icon", diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 1bac0abfc0..8d2d2a3f67 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -89,7 +89,7 @@ function BacklinksModal({ note, modalShown, setModalShown }: { note: FNote | nul setModalShown(false)} > From 6c163b547952dd109451234ca051264ad0782ec4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 20:39:37 +0200 Subject: [PATCH 073/560] chore(mobile/note_actions): flickerless backlinks item --- apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 8d2d2a3f67..af4a6cabc1 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -73,11 +73,12 @@ export default function MobileDetailMenu() { function Backlinks({ note, viewScope, setModalShown }: { note: FNote, viewScope?: ViewScope, setModalShown: (shown: boolean) => void }) { const count = useBacklinkCount(note, viewScope?.viewMode === "default"); - return count > 0 && ( + return ( <> setModalShown(true)} + disabled={count === 0} >{t("status_bar.backlinks", { count })} From ba17ec4be41540717fbb58b953b262ad85eeab3f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 20:44:48 +0200 Subject: [PATCH 074/560] chore(backlinks): show multiple excerpts properly --- apps/client/src/widgets/Backlinks.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/Backlinks.css b/apps/client/src/widgets/Backlinks.css index edcd9097de..9e8ced45ba 100644 --- a/apps/client/src/widgets/Backlinks.css +++ b/apps/client/src/widgets/Backlinks.css @@ -59,7 +59,7 @@ } /* Card content - excerpt */ - & > span:nth-child(2) > div { + .backlink-excerpt { all: unset; /* TODO: Remove after disposing the old style from FloatingButtons.css */ display: block; From facd56cdf4f4311f3bee3dcdd7eec049a3dfdef7 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 2 Feb 2026 20:57:38 +0200 Subject: [PATCH 075/560] style/text editor/block toolbar button: tweak --- apps/client/src/stylesheets/theme-next/notes/text.css | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index a291360c82..91fe7f9b1b 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -48,10 +48,13 @@ /* The toolbar show / hide button for the current text block */ :root .ck.ck-block-toolbar-button { + --ck-color-block-toolbar-button: var(--muted-text-color); --ck-color-button-on-background: transparent; - --ck-color-button-on-color: currentColor; - translate: -30% 0; - z-index: 5000; + --ck-color-button-on-color: var(--ck-editor-toolbar-button-on-color); + translate: -40% 0; + min-width: 0; + padding: 0; + z-index: 1600; } :root .ck.ck-toolbar .ck-button:not(.ck-disabled):active, From 171d948a0065484d979b93b7e5550d5105233794 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 21:00:05 +0200 Subject: [PATCH 076/560] feat(mobile/note_actions): basic integration of note paths --- apps/client/src/widgets/layout/StatusBar.tsx | 2 +- .../mobile_widgets/mobile_detail_menu.tsx | 57 ++++++++++++++----- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index d05fa113df..bfc9b02648 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -56,7 +56,7 @@ export default function StatusBar() { similarNotesShown: activePane === "similar-notes", setSimilarNotesShown: (shown) => setActivePane(shown && "similar-notes") }; - const isHiddenNote = note?.isInHiddenSubtree(); + const isHiddenNote = note?.isHiddenCompletely(); return (
    diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index af4a6cabc1..8116eceb6e 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,6 +1,6 @@ import { createPortal, useState } from "preact/compat"; -import FNote from "../../entities/fnote"; +import FNote, { NotePathRecord } from "../../entities/fnote"; import { t } from "../../services/i18n"; import { ViewScope } from "../../services/link"; import note_create from "../../services/note_create"; @@ -11,12 +11,15 @@ import { useNoteContext } from "../react/hooks"; import Modal from "../react/Modal"; import { NoteContextMenu } from "../ribbon/NoteActions"; import NoteActionsCustom from "../ribbon/NoteActionsCustom"; +import { NotePathsWidget, useSortedNotePaths } from "../ribbon/NotePathsTab"; export default function MobileDetailMenu() { - const { note, noteContext, parentComponent, ntxId, viewScope } = useNoteContext(); + const { note, noteContext, parentComponent, ntxId, viewScope, hoistedNoteId } = useNoteContext(); const subContexts = noteContext?.getMainContext().getSubContexts() ?? []; const isMainContext = noteContext?.isMainContext(); - const [ modalShown, setModalShown ] = useState(false); + const [ backlinksModalShown, setBacklinksModalShown ] = useState(false); + const [ notePathsModalShown, setNotePathsModalShown ] = useState(false); + const sortedNotePaths = useSortedNotePaths(note, hoistedNoteId); function closePane() { // Wait first for the context menu to be dismissed, otherwise the backdrop stays on. @@ -31,7 +34,14 @@ export default function MobileDetailMenu() { - + + + setNotePathsModalShown(true)} + disabled={(sortedNotePaths?.length ?? 0) <= 1} + >{t("status_bar.note_paths", { count: sortedNotePaths?.length })} + {noteContext && ntxId && } + <> + + + ), document.body)}
    ); @@ -74,14 +87,11 @@ function Backlinks({ note, viewScope, setModalShown }: { note: FNote, viewScope? const count = useBacklinkCount(note, viewScope?.viewMode === "default"); return ( - <> - setModalShown(true)} - disabled={count === 0} - >{t("status_bar.backlinks", { count })} - - + setModalShown(true)} + disabled={count === 0} + >{t("status_bar.backlinks", { count })} ); } @@ -100,3 +110,24 @@ function BacklinksModal({ note, modalShown, setModalShown }: { note: FNote | nul
    ); } + +function NotePathsModal({ note, modalShown, notePath, sortedNotePaths, setModalShown }: { note: FNote | null | undefined, modalShown: boolean, sortedNotePaths: NotePathRecord[] | undefined, notePath: string | null | undefined, setModalShown: (shown: boolean) => void }) { + return ( + setModalShown(false)} + > +
      + {note && ( + + )} +
    +
    + ); +} From 5db298f031638e1c48391cf54efffe1ac199e396 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 2 Feb 2026 21:03:02 +0200 Subject: [PATCH 077/560] style/quick edit: increase the horizontal padding of the text to make space for the block toolbar button --- apps/client/src/widgets/dialogs/PopupEditor.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.css b/apps/client/src/widgets/dialogs/PopupEditor.css index 197ed94065..262143ceaf 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.css +++ b/apps/client/src/widgets/dialogs/PopupEditor.css @@ -92,7 +92,7 @@ body.mobile .modal.popup-editor-dialog .modal-dialog { } .modal.popup-editor-dialog .note-detail-editable-text { - padding: 0 1em; + padding: 0 28px; } .modal.popup-editor-dialog .note-detail-file { From c7381d058a9502d7b4cb441f9ca410ca94dceb71 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 21:05:25 +0200 Subject: [PATCH 078/560] feat(mobile/note_actions): proper styling of note paths --- apps/client/src/widgets/layout/StatusBar.css | 62 ------------------ .../mobile_widgets/mobile_detail_menu.tsx | 14 ++--- .../src/widgets/ribbon/NotePathsTab.css | 63 +++++++++++++++++++ .../src/widgets/ribbon/NotePathsTab.tsx | 13 ++-- 4 files changed, 76 insertions(+), 76 deletions(-) create mode 100644 apps/client/src/widgets/ribbon/NotePathsTab.css diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index b3fe412d95..6418630dba 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -91,68 +91,6 @@ .note-paths-widget { padding: 0.5em; } - - .note-path-intro { - color: var(--muted-text-color); - } - - .note-path-list { - margin: 12px 0; - padding: 0; - list-style: none; - - /* Note path card */ - li { - --border-radius: 6px; - - position: relative; - background: var(--card-background-color); - padding: 8px 20px 8px 25px; - - &:first-child { - border-radius: var(--border-radius) var(--border-radius) 0 0; - } - - &:last-child { - border-radius: 0 0 var(--border-radius) var(--border-radius); - } - - & + li { - margin-top: 2px; - } - - /* Current path arrow */ - &.path-current::before { - position: absolute; - display: flex; - justify-content: flex-end; - align-items: center; - content: "\ee8f"; - top: 0; - left: 0; - width: 20px; - bottom: 0; - font-family: "boxicons"; - font-size: .75em; - color: var(--menu-item-icon-color); - } - } - - /* Note path segment */ - a { - margin-inline: 2px; - padding-inline: 2px; - color: currentColor; - font-weight: normal; - text-decoration: none; - - /* The last segment of the note path */ - &.basename { - color: var(--muted-text-color); - } - } - - } } .backlinks-widget > .dropdown-menu { diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 8116eceb6e..d1a1977404 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -120,14 +120,12 @@ function NotePathsModal({ note, modalShown, notePath, sortedNotePaths, setModalS show={modalShown} onHidden={() => setModalShown(false)} > -
      - {note && ( - - )} -
    + {note && ( + + )} ); } diff --git a/apps/client/src/widgets/ribbon/NotePathsTab.css b/apps/client/src/widgets/ribbon/NotePathsTab.css new file mode 100644 index 0000000000..64c7374480 --- /dev/null +++ b/apps/client/src/widgets/ribbon/NotePathsTab.css @@ -0,0 +1,63 @@ +body.experimental-feature-new-layout .note-paths-widget { + .note-path-intro { + color: var(--muted-text-color); + } + + .note-path-list { + margin: 12px 0; + padding: 0; + list-style: none; + + /* Note path card */ + li { + --border-radius: 6px; + + position: relative; + background: var(--card-background-color); + padding: 8px 20px 8px 25px; + + &:first-child { + border-radius: var(--border-radius) var(--border-radius) 0 0; + } + + &:last-child { + border-radius: 0 0 var(--border-radius) var(--border-radius); + } + + & + li { + margin-top: 2px; + } + + /* Current path arrow */ + &.path-current::before { + position: absolute; + display: flex; + justify-content: flex-end; + align-items: center; + content: "\ee8f"; + top: 0; + left: 0; + width: 20px; + bottom: 0; + font-family: "boxicons"; + font-size: .75em; + color: var(--menu-item-icon-color); + } + } + + /* Note path segment */ + a { + margin-inline: 2px; + padding-inline: 2px; + color: currentColor; + font-weight: normal; + text-decoration: none; + + /* The last segment of the note path */ + &.basename { + color: var(--muted-text-color); + } + } + + } +} diff --git a/apps/client/src/widgets/ribbon/NotePathsTab.tsx b/apps/client/src/widgets/ribbon/NotePathsTab.tsx index 19b361a5de..0b81ebe036 100644 --- a/apps/client/src/widgets/ribbon/NotePathsTab.tsx +++ b/apps/client/src/widgets/ribbon/NotePathsTab.tsx @@ -1,15 +1,16 @@ +import "./NotePathsTab.css"; + +import clsx from "clsx"; import { useEffect, useMemo, useState } from "preact/hooks"; import FNote, { NotePathRecord } from "../../entities/fnote"; import { t } from "../../services/i18n"; import { NOTE_PATH_TITLE_SEPARATOR } from "../../services/tree"; import { useTriliumEvent } from "../react/hooks"; +import LinkButton from "../react/LinkButton"; import NoteLink from "../react/NoteLink"; import { joinElements } from "../react/react_utils"; import { TabContext } from "./ribbon-interface"; -import LinkButton from "../react/LinkButton"; -import clsx from "clsx"; - export default function NotePathsTab({ note, hoistedNoteId, notePath }: TabContext) { const sortedNotePaths = useSortedNotePaths(note, hoistedNoteId); @@ -112,9 +113,9 @@ function NotePath({ currentNotePath, notePathRecord }: { currentNotePath?: strin
  • {joinElements(fullNotePaths.map((notePath, index, arr) => ( + className={clsx({"basename": (index === arr.length - 1)})} + notePath={notePath} + noPreview /> )), NOTE_PATH_TITLE_SEPARATOR)} {icons.map(({ icon, title }) => ( From 979fa0359a28c3df771c1579d86aecbfc74f22fd Mon Sep 17 00:00:00 2001 From: hulmgulm Date: Mon, 2 Feb 2026 20:08:55 +0100 Subject: [PATCH 079/560] updated texts --- .vscode/settings.json | 5 ++++- .../User Guide/Advanced Usage/Attributes/Labels.html | 8 +++++--- docs/Developer Guide/Developer Guide/Documentation.md | 2 +- docs/Developer Guide/Developer Guide/Environment Setup.md | 2 +- .../User Guide/Advanced Usage/Attributes/Labels.md | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 57d22dcb8e..974a4ff64e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -42,5 +42,8 @@ }, "eslint.rules.customizations": [ { "rule": "*", "severity": "warn" } + ], + "cSpell.words": [ + "Trilium" ] -} \ No newline at end of file +} diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html index d79004f8bc..8757e0085b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Advanced Usage/Attributes/Labels.html @@ -357,7 +357,9 @@ subtreeHidden - Hides all child notes of this note from the tree, displaying a badge with the count of hidden children. Children remain accessible via search or direct links. + Hides all child notes of this note from the tree, displaying a badge with + the count of hidden children. Children remain accessible via search or + direct links. printLandscape @@ -380,7 +382,7 @@ map:* - Defines specific options for the Geo Map View. + Defines specific options for the Geo Map. calendar:* @@ -394,4 +396,4 @@ href="#root/_help_0ESUbbAxVnoK">Note List for more information. - + \ No newline at end of file diff --git a/docs/Developer Guide/Developer Guide/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md index bf9ed0c44c..16d1494028 100644 --- a/docs/Developer Guide/Developer Guide/Documentation.md +++ b/docs/Developer Guide/Developer Guide/Documentation.md @@ -1,5 +1,5 @@ # Documentation -There are multiple types of documentation for Trilium: +There are multiple types of documentation for Trilium: * The _User Guide_ represents the user-facing documentation. This documentation can be browsed by users directly from within Trilium, by pressing F1. * The _Developer's Guide_ represents a set of Markdown documents that present the internals of Trilium, for developers. diff --git a/docs/Developer Guide/Developer Guide/Environment Setup.md b/docs/Developer Guide/Developer Guide/Environment Setup.md index bf7f44adb8..f958b4eec0 100644 --- a/docs/Developer Guide/Developer Guide/Environment Setup.md +++ b/docs/Developer Guide/Developer Guide/Environment Setup.md @@ -24,7 +24,7 @@ As a quick heads-up of some differences when compared to `npm`: ## Installing dependencies -Run `pnpm i` at the top of the `Notes` repository to install the dependencies. +Run `pnpm i` at the top of the `Trilium` repository to install the dependencies. > [!NOTE] > Dependencies are kept up to date periodically in the project. Generally it's a good rule to do `pnpm i` after each `git pull` on the main branch. 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 cb68dab93d..89f1445ecd 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.
    subtreeHiddenHides all child notes of this note from the tree, displaying a badge with the count of hidden children. Children remain accessible via search or direct links.
    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.
    map:*Defines specific options for the 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 From 49d33ea19ab72c1b9fb707e37ba406f799f6e6c7 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 2 Feb 2026 21:10:00 +0200 Subject: [PATCH 080/560] style/quick edit: allow object selection rectangle to go outside of the editor area --- apps/client/src/widgets/dialogs/PopupEditor.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.css b/apps/client/src/widgets/dialogs/PopupEditor.css index 262143ceaf..f20a12bf30 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.css +++ b/apps/client/src/widgets/dialogs/PopupEditor.css @@ -95,6 +95,10 @@ body.mobile .modal.popup-editor-dialog .modal-dialog { padding: 0 28px; } +.modal.popup-editor-dialog .note-detail-editable-text-editor { + overflow: visible; /* Allow selection rectangle to go outside of the editor area */ +} + .modal.popup-editor-dialog .note-detail-file { padding: 0; } From 7340709111abe4a2b1fa3ed86852164ce16b7d27 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 2 Feb 2026 21:13:16 +0200 Subject: [PATCH 081/560] style/quick edit: refactor --- apps/client/src/widgets/dialogs/PopupEditor.css | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.css b/apps/client/src/widgets/dialogs/PopupEditor.css index f20a12bf30..3357b00f3e 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.css +++ b/apps/client/src/widgets/dialogs/PopupEditor.css @@ -91,11 +91,8 @@ body.mobile .modal.popup-editor-dialog .modal-dialog { height: 100%; } -.modal.popup-editor-dialog .note-detail-editable-text { - padding: 0 28px; -} - .modal.popup-editor-dialog .note-detail-editable-text-editor { + margin: 0 28px; overflow: visible; /* Allow selection rectangle to go outside of the editor area */ } From c02642d0f9eae0933871fad521a8698d3dc38df5 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 21:16:02 +0200 Subject: [PATCH 082/560] feat(mobile/note_actions): display backlinks & note paths on same row --- .../mobile_widgets/mobile_detail_menu.tsx | 36 +++++++++---------- apps/client/src/widgets/react/FormList.css | 10 ++++++ 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index d1a1977404..dc8eb0415e 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -20,6 +20,7 @@ export default function MobileDetailMenu() { const [ backlinksModalShown, setBacklinksModalShown ] = useState(false); const [ notePathsModalShown, setNotePathsModalShown ] = useState(false); const sortedNotePaths = useSortedNotePaths(note, hoistedNoteId); + const backlinksCount = useBacklinkCount(note, viewScope?.viewMode === "default"); function closePane() { // Wait first for the context menu to be dismissed, otherwise the backdrop stays on. @@ -34,13 +35,22 @@ export default function MobileDetailMenu() { - - - setNotePathsModalShown(true)} - disabled={(sortedNotePaths?.length ?? 0) <= 1} - >{t("status_bar.note_paths", { count: sortedNotePaths?.length })} +
    +
    + setBacklinksModalShown(true)} + disabled={backlinksCount === 0} + >{t("status_bar.backlinks", { count: backlinksCount })} +
    +
    + setNotePathsModalShown(true)} + disabled={(sortedNotePaths?.length ?? 0) <= 1} + >{t("status_bar.note_paths", { count: sortedNotePaths?.length })} +
    +
    {noteContext && ntxId && } @@ -83,18 +93,6 @@ export default function MobileDetailMenu() { ); } -function Backlinks({ note, viewScope, setModalShown }: { note: FNote, viewScope?: ViewScope, setModalShown: (shown: boolean) => void }) { - const count = useBacklinkCount(note, viewScope?.viewMode === "default"); - - return ( - setModalShown(true)} - disabled={count === 0} - >{t("status_bar.backlinks", { count })} - ); -} - function BacklinksModal({ note, modalShown, setModalShown }: { note: FNote | null | undefined, modalShown: boolean, setModalShown: (shown: boolean) => void }) { return ( Date: Mon, 2 Feb 2026 21:19:35 +0200 Subject: [PATCH 083/560] chore(client): address requested changes --- apps/client/src/widgets/note_icon.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 6c79bc8017..5f9c1fb81d 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -86,7 +86,7 @@ function MobileNoteIconSwitcher({ note, icon }: { className="icon-switcher note-icon-widget" scrollable > - {note && setModalShown(false)} columnCount={Math.floor(windowWidth / ICON_SIZE)} />} + {note && setModalShown(false)} columnCount={Math.max(1, Math.floor(windowWidth / ICON_SIZE))} />} ), document.body)} From d83a824812e2e4c3ef156b2143708c39e7457195 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 2 Feb 2026 21:43:27 +0200 Subject: [PATCH 084/560] chore(client): address requested changes --- apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx | 1 - apps/client/src/widgets/note_icon.tsx | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index dc8eb0415e..dc0c5e89cd 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -2,7 +2,6 @@ import { createPortal, useState } from "preact/compat"; import FNote, { NotePathRecord } from "../../entities/fnote"; import { t } from "../../services/i18n"; -import { ViewScope } from "../../services/link"; import note_create from "../../services/note_create"; import { BacklinksList, useBacklinkCount } from "../FloatingButtonsDefinitions"; import ActionButton from "../react/ActionButton"; diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 5f9c1fb81d..9df9ad48f4 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -86,7 +86,7 @@ function MobileNoteIconSwitcher({ note, icon }: { className="icon-switcher note-icon-widget" scrollable > - {note && setModalShown(false)} columnCount={Math.max(1, Math.floor(windowWidth / ICON_SIZE))} />} + setModalShown(false)} columnCount={Math.max(1, Math.floor(windowWidth / ICON_SIZE))} /> ), document.body)} From 654fa18ab1a96062631c87a7fc04704fe01004cb Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 1 Feb 2026 21:34:51 +0100 Subject: [PATCH 085/560] Update translation files Updated by "Cleanup translation files" add-on in Weblate. Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ --- docs/README-ga.md | 468 ++++++++++++++++++++++++---------------------- 1 file changed, 243 insertions(+), 225 deletions(-) diff --git a/docs/README-ga.md b/docs/README-ga.md index 0da3a37bf9..42d3ee6e1b 100644 --- a/docs/README-ga.md +++ b/docs/README-ga.md @@ -11,14 +11,14 @@ # 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)\ +![Urraitheoirí GitHub](https://img.shields.io/github/sponsors/eliandoran) +![Pátrúin LiberaPay](https://img.shields.io/liberapay/patrons/ElianDoran)\ +![Tarraingtí Docker](https://img.shields.io/docker/pulls/triliumnext/trilium) +![Íoslódálacha GitHub (gach sócmhainn, gach +eisiúint)](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/) +[![Stádas +aistriúcháin](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) @@ -29,216 +29,232 @@ script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md) [Spanish](./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. +Is feidhmchlár saor in aisce agus foinse oscailte, tras-ardán, ordlathach é +Trilium Notes chun nótaí a thógáil le fócas ar bhunachair mhóra eolais +phearsanta a thógáil. 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. +## ⏬ Íoslódáil +- [An leagan is déanaí](https://github.com/TriliumNext/Trilium/releases/latest) + – leagan cobhsaí, molta do fhormhór na n-úsáideoirí. +- [Tógáil oíche](https://github.com/TriliumNext/Trilium/releases/tag/nightly) – + leagan forbartha éagobhsaí, a nuashonraítear go laethúil leis na gnéithe agus + na socruithe is déanaí. -## 📚 Documentation +## 📚 Doiciméadú -**Visit our comprehensive documentation at +**Tabhair cuairt ar ár ndoiciméadacht chuimsitheach ag [docs.triliumnotes.org](https://docs.triliumnotes.org/)** -Our documentation is available in multiple formats: -- **Online Documentation**: Browse the full documentation at +Tá ár ndoiciméadacht ar fáil i bhformáidí éagsúla: +- **Doiciméadacht Ar Líne**: Brabhsáil an doiciméadacht iomlán ag [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](./User%20Guide/User%20Guide/) in - this repository +- **Cabhair san Aip**: Brúigh `F1` laistigh de Trilium chun rochtain a fháil ar + an doiciméadacht chéanna go díreach san fheidhmchlár +- **GitHub**: Nascleanúint tríd an [Treoir + Úsáideora](./User%20Guide/User%20Guide/) sa stórlann seo -### Quick Links -- [Getting Started Guide](https://docs.triliumnotes.org/) -- [Installation Instructions](https://docs.triliumnotes.org/user-guide/setup) -- [Docker - Setup](https://docs.triliumnotes.org/user-guide/setup/server/installation/docker) -- [Upgrading +### Naisc Thapa +- [Treoir Tosaithe](https://docs.triliumnotes.org/) +- [Treoracha Suiteála](https://docs.triliumnotes.org/user-guide/setup) +- [Socrú + Docker](https://docs.triliumnotes.org/user-guide/setup/server/installation/docker) +- [Uasghrádú TriliumNext](https://docs.triliumnotes.org/user-guide/setup/upgrading) -- [Basic Concepts and - Features](https://docs.triliumnotes.org/user-guide/concepts/notes) -- [Patterns of Personal Knowledge - Base](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge) +- [Coincheapa agus Gnéithe + Bunúsacha](https://docs.triliumnotes.org/user-guide/concepts/notes) +- [Patrúin de Bhunachar Eolais + Phearsanta](https://docs.triliumnotes.org/user-guide/misc/patterns-of-personal-knowledge) -## 🎁 Features +## 🎁 Gnéithe -* Notes can be arranged into arbitrarily deep tree. Single note can be placed - into multiple places in the tree (see - [cloning](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning)) -* Rich WYSIWYG note editor including e.g. tables, images and - [math](https://docs.triliumnotes.org/user-guide/note-types/text) with markdown +* Is féidir nótaí a shocrú i gcrann domhain treallach. Is féidir nóta aonair a + chur in áiteanna éagsúla sa chrann (féach + [clónáil](https://docs.triliumnotes.org/user-guide/concepts/notes/cloning)) +* Eagarthóir nótaí WYSIWYG saibhir lena n-áirítear táblaí, íomhánna agus + [matamaitic](https://docs.triliumnotes.org/user-guide/note-types/text) le + marcáil síos [autoformat](https://docs.triliumnotes.org/user-guide/note-types/text/markdown-formatting) -* Support for editing [notes with source - code](https://docs.triliumnotes.org/user-guide/note-types/code), including - syntax highlighting -* Fast and easy [navigation between - notes](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation), - full text search and [note - hoisting](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting) -* Seamless [note - versioning](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions) -* Note - [attributes](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes) - can be used for note organization, querying and advanced - [scripting](https://docs.triliumnotes.org/user-guide/scripts) -* UI available in English, German, Spanish, French, Romanian, and Chinese - (simplified and traditional) -* Direct [OpenID and TOTP - integration](https://docs.triliumnotes.org/user-guide/setup/server/mfa) for - more secure login -* [Synchronization](https://docs.triliumnotes.org/user-guide/setup/synchronization) - with self-hosted sync server - * there are [3rd party services for hosting synchronisation - server](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) -* [Sharing](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) - (publishing) notes to public internet -* Strong [note - encryption](https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) - with per-note granularity -* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type - "canvas") -* [Relation - maps](https://docs.triliumnotes.org/user-guide/note-types/relation-map) and - [note/link maps](https://docs.triliumnotes.org/user-guide/note-types/note-map) - for visualizing notes and their relations -* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/) -* [Geo maps](https://docs.triliumnotes.org/user-guide/collections/geomap) with - location pins and GPX tracks -* [Scripting](https://docs.triliumnotes.org/user-guide/scripts) - see [Advanced - showcases](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) -* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) for - automation -* Scales well in both usability and performance upwards of 100 000 notes -* Touch optimized [mobile - frontend](https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) for - smartphones and tablets -* Built-in [dark - theme](https://docs.triliumnotes.org/user-guide/concepts/themes), support for - user themes +* Tacaíocht le haghaidh eagarthóireacht [nótaí le cód + foinse](https://docs.triliumnotes.org/user-guide/note-types/code), lena + n-áirítear aibhsiú comhréire +* Nascleanúint thapa agus éasca idir + nótaí(https://docs.triliumnotes.org/user-guide/concepts/navigation/note-navigation), + cuardach téacs iomlán agus [ardú + nótaí](https://docs.triliumnotes.org/user-guide/concepts/navigation/note-hoisting) +* Gan uaim [leaganú + nótaí](https://docs.triliumnotes.org/user-guide/concepts/notes/note-revisions) +* Is féidir nótaí + [tréithe](https://docs.triliumnotes.org/user-guide/advanced-usage/attributes) + a úsáid chun nótaí a eagrú, fiosrúcháin a dhéanamh agus [scriptiú] + ardleibhéil(https://docs.triliumnotes.org/user-guide/scripts) +* Tá an comhéadan úsáideora ar fáil i mBéarla, i nGearmáinis, i Spáinnis, i + bhFraincis, i Rómáinis, agus i Sínis (simplithe agus traidisiúnta) +* Díreach [Comhtháthú OpenID agus + TOTP](https://docs.triliumnotes.org/user-guide/setup/server/mfa) le haghaidh + logáil isteach níos sláine +* [Sioncrónú](https://docs.triliumnotes.org/user-guide/setup/synchronization) le + freastalaí sioncrónaithe féinóstáilte + * tá [seirbhísí tríú páirtí ann chun freastalaí sioncrónaithe a + óstáil](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) +* Nótaí [Ag + roinnt](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) (ag + foilsiú) ar an idirlíon poiblí +* [Criptiú nótaí] + láidir(https://docs.triliumnotes.org/user-guide/concepts/notes/protected-notes) + le mionsonraí in aghaidh an nóta +* Léaráidí sceitseála, bunaithe ar [Excalidraw](https://excalidraw.com/) + (tabhair faoi deara cineál "canbhás") +* [Léarscáileanna + caidrimh](https://docs.triliumnotes.org/user-guide/note-types/relation-map) + agus [léarscáileanna + nótaí/naisc](https://docs.triliumnotes.org/user-guide/note-types/note-map) + chun nótaí agus a gcaidrimh a léirshamhlú +* Léarscáileanna intinne, bunaithe ar [Mind + Elixir](https://docs.mind-elixir.com/) +* [Léarscáileanna + geo](https://docs.triliumnotes.org/user-guide/collections/geomap) le bioráin + suímh agus rianta GPX +* [Scriptiú](https://docs.triliumnotes.org/user-guide/scripts) - féach + [Taispeántais + Ardleibhéil](https://docs.triliumnotes.org/user-guide/advanced-usage/advanced-showcases) +* [REST API](https://docs.triliumnotes.org/user-guide/advanced-usage/etapi) le + haghaidh uathoibrithe +* Scálann go maith i dtéarmaí inúsáidteachta agus feidhmíochta araon os cionn + 100,000 nóta +* Tadhall-optamaithe [comhéadan soghluaiste] + (https://docs.triliumnotes.org/user-guide/setup/mobile-frontend) le haghaidh + fóin chliste agus táibléad +* Téama dorcha + ionsuite(https://docs.triliumnotes.org/user-guide/concepts/themes), tacaíocht + do théamaí úsáideora * [Evernote](https://docs.triliumnotes.org/user-guide/concepts/import-export/evernote) - and [Markdown import & - export](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown) -* [Web Clipper](https://docs.triliumnotes.org/user-guide/setup/web-clipper) for - easy saving of web content -* Customizable UI (sidebar buttons, user-defined widgets, ...) + agus [Iompórtáil & Easpórtáil + Markdown](https://docs.triliumnotes.org/user-guide/concepts/import-export/markdown) +* [Gearrthóir + Gréasáin](https://docs.triliumnotes.org/user-guide/setup/web-clipper) le + haghaidh sábháil éasca ar ábhar gréasáin +* Comhéadan úsáideora saincheaptha (cnaipí taobhbharra, giuirléidí sainithe ag + an úsáideoir, ...) * [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics), - along with a Grafana Dashboard. + mar aon le Painéal Grafana. -✨ Check out the following third-party resources/communities for more TriliumNext -related goodies: +✨ Féach ar na hacmhainní/pobail tríú páirtí seo a leanas le haghaidh tuilleadh +earraí gaolmhara le TriliumNext: -- [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) le haghaidh + téamaí, scripteanna, breiseáin agus tuilleadh ó thríú páirtithe. +- [TriliumRocks!](https://trilium.rocks/) le haghaidh ranganna teagaisc, + treoracha, agus i bhfad níos mó. -## ❓Why TriliumNext? +## ❓Cén fáth 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 +Bhronn forbróir bunaidh Trilium ([Zadam](https://github.com/zadam)) stórlann +Trilium go fial ar an tionscadal pobail atá le fáil ag +https://github.com/TriliumNext -### ⬆️Migrating from Zadam/Trilium? +### ⬆️Ag dul ar imirce ó 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. +Níl aon chéimeanna imirce speisialta ann chun imirce ó shampla zadam/Trilium go +sampla TriliumNext/Trilium. Níl le déanamh ach [TriliumNext/Trilium a +shuiteáil](#-installation) mar is gnách agus úsáidfidh sé do bhunachar sonraí +atá ann cheana féin. -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. +Tá leaganacha suas go dtí agus lena n-áirítear +[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) +comhoiriúnach leis an leagan is déanaí de zadam/trilium de +[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Méadaítear +leaganacha sioncrónaithe aon leaganacha níos déanaí de TriliumNext/Trilium rud a +chuireann cosc ar aistriú díreach. -## 💬 Discuss with us +## 💬 Pléigh linn -Feel free to join our official conversations. We would love to hear what -features, suggestions, or issues you may have! +Ná bíodh drogall ort páirt a ghlacadh inár gcomhráite oifigiúla. Ba bhreá linn +cloisteáil faoi na gnéithe, na moltaí nó na fadhbanna a d'fhéadfadh a bheith +agat! -- [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.) +- [Maitrís](https://matrix.to/#/#triliumnext:matrix.org) (Le haghaidh plé + sioncrónach.) + - Tá droichead idir seomra an Mhaitrís `Ginearálta` agus + [XMPP](xmpp:discuss@trilium.thisgreat.party?join) freisin +- [Plé Github](https://github.com/TriliumNext/Trilium/discussions) (Le haghaidh + plé neamhshioncrónach.) +- [Fadhbanna Github](https://github.com/TriliumNext/Trilium/issues) (Le haghaidh + tuairiscí fabhtanna agus iarratais ar ghnéithe.) -## 🏗 Installation +## 🏗 Suiteáil ### 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. +Íoslódáil an scaoileadh dénártha do d'ardán ón [leathanach scaoileadh is +déanaí](https://github.com/TriliumNext/Trilium/releases/latest), dízipeáil an +pacáiste agus rith an comhad inrite `trilium`. ### Linux -If your distribution is listed in the table below, use your distribution's -package. +Más liostaithe sa tábla thíos atá do dháileadh, bain úsáid as pacáiste do +dháilte. -[![Packaging -status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions) +[![Stádas +pacáistithe](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. +Féadfaidh tú an scaoileadh dénártha do d'ardán a íoslódáil ón [leathanach +scaoileadh is déanaí](https://github.com/TriliumNext/Trilium/releases/latest) +freisin, an pacáiste a dhízipeáil agus an comhad inrite `trilium` a rith. -TriliumNext is also provided as a Flatpak, but not yet published on FlatHub. +Cuirtear TriliumNext ar fáil mar Flatpak freisin, ach níl sé foilsithe ar +FlatHub go fóill. -### Browser (any OS) +### Brabhsálaí (aon chóras oibriúcháin) -If you use a server installation (see below), you can directly access the web -interface (which is almost identical to the desktop app). +Má úsáideann tú suiteáil freastalaí (féach thíos), is féidir leat rochtain +dhíreach a fháil ar an gcomhéadan gréasáin (atá beagnach mar an gcéanna leis an +aip deisce). -Currently only the latest versions of Chrome & Firefox are supported (and -tested). +Faoi láthair ní thacaítear (agus déantar tástáil ar) ach leis na leaganacha is +déanaí de Chrome agus Firefox. -### Mobile +### Soghluaiste -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). +Chun TriliumNext a úsáid ar ghléas soghluaiste, is féidir leat brabhsálaí +gréasáin soghluaiste a úsáid chun rochtain a fháil ar chomhéadan soghluaiste +suiteála freastalaí (féach thíos). -See issue https://github.com/TriliumNext/Trilium/issues/4962 for more -information on mobile app support. +Féach ar an eagrán https://github.com/TriliumNext/Trilium/issues/4962 le +haghaidh tuilleadh eolais faoi thacaíocht d’aipeanna soghluaiste. -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. +Más fearr leat aip dhúchasach Android, is féidir leat +[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid) +a úsáid. Tuairiscigh fabhtanna agus gnéithe atá ar iarraidh ag [a +stór](https://github.com/FliegendeWurst/TriliumDroid). Tabhair faoi deara: Is +fearr nuashonruithe uathoibríocha a dhíchumasú ar do shuiteáil freastalaí (féach +thíos) agus TriliumDroid in úsáid agat ós rud é go gcaithfidh an leagan +sioncrónaithe a bheith mar an gcéanna idir Trilium agus TriliumDroid. -### Server +### Freastalaí -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://docs.triliumnotes.org/user-guide/setup/server). +Chun TriliumNext a shuiteáil ar do fhreastalaí féin (lena n-áirítear trí Docker +ó [Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) lean [na doiciméid +suiteála freastalaí](https://docs.triliumnotes.org/user-guide/setup/server). -## 💻 Contribute +## 💻 Cuir leis -### Translations +### Aistriúcháin -If you are a native speaker, help us translate Trilium by heading over to our -[Weblate page](https://hosted.weblate.org/engage/trilium/). +Más cainteoir dúchais thú, cabhraigh linn Trilium a aistriú trí dhul chuig ár +[leathanach Weblate](https://hosted.weblate.org/engage/trilium/). -Here's the language coverage we have so far: +Seo an clúdach teanga atá againn go dtí seo: -[![Translation -status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) +[![Stádas +aistriúcháin](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/) -### Code +### Cód -Download the repository, install dependencies using `pnpm` and then run the -server (available at http://localhost:8080): +Íoslódáil an stórlann, suiteáil spleáchais ag baint úsáide as `pnpm` agus ansin +rith an freastalaí (ar fáil ag http://localhost:8080): ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -246,10 +262,10 @@ pnpm install pnpm run server:start ``` -### Documentation +### Doiciméadú -Download the repository, install dependencies using `pnpm` and then run the -environment required to edit the documentation: +Íoslódáil an stórlann, suiteáil spleáchais ag baint úsáide as `pnpm` agus ansin +rith an timpeallacht atá riachtanach chun an doiciméadú a chur in eagar: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -257,9 +273,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: +### Ag Tógáil an Inrite +Íoslódáil an stórlann, suiteáil spleáchais ag baint úsáide as `pnpm` agus ansin +tóg an aip deisce do Windows: ```shell git clone https://github.com/TriliumNext/Trilium.git cd Trilium @@ -267,71 +283,73 @@ 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). +Le haghaidh tuilleadh sonraí, féach ar na [doiciméid +forbartha](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide). -### Developer Documentation +### Doiciméadacht Forbróra -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. +Féach ar an [treoir +dhoiciméadúcháin](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md) +le haghaidh tuilleadh sonraí. Má tá tuilleadh ceisteanna agat, bíodh leisce ort +teagmháil a dhéanamh linn trí na naisc a bhfuil cur síos orthu sa chuid "Pléigh +Linn" thuas. -## 👏 Shoutouts +## 👏 Glaonna amach -* [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) as an gcoincheap bunaidh agus cur i bhfeidhm + an fheidhmchláir. +* [Sarah Hussein](https://github.com/Sarah-Hussein) as dearadh dheilbhín an + fheidhmchláir. +* [nriver](https://github.com/nriver) as a chuid oibre ar an idirnáisiúnú. +* [Thomas Frei](https://github.com/thfrei) as a shaothar bunaidh ar an Chanbhás. +* [antoniotejada](https://github.com/nriver) don ghiuirléid aibhsithe comhréire + bunaidh. +* [Dosu](https://dosu.dev/) as na freagraí uathoibrithe a sholáthar dúinn ar + shaincheisteanna agus ar phlé GitHub. +* [Deilbhíní Tábla](https://tabler.io/icons) do na deilbhíní sa tráidire córais. -Trilium would not be possible without the technologies behind it: +Ní bheadh Trilium indéanta gan na teicneolaíochtaí atá taobh thiar de: -* [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://docs.triliumnotes.org/user-guide/note-types/relation-map) and - [link - maps](https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#link-map) +* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - an t-eagarthóir amhairc + atá taobh thiar de nótaí téacs. Táimid buíoch as sraith de na gnéithe préimhe + a bheith curtha ar fáil dúinn. +* [CodeMirror](https://github.com/codemirror/CodeMirror) - eagarthóir cóid le + tacaíocht do líon ollmhór teangacha. +* [Excalidraw](https://github.com/excalidraw/excalidraw) - an clár bán gan + teorainn a úsáidtear i nótaí Canvas. +* [Intinn Elixir](https://github.com/SSShooter/mind-elixir-core) - ag soláthar + feidhmiúlacht léarscáil intinne. +* [Bileog](https://github.com/Leaflet/Leaflet) - le haghaidh léarscáileanna + geografacha a léiriú. +* [Tábla](https://github.com/olifolkerd/tabulator) - don tábla idirghníomhach a + úsáidtear i mbailiúcháin. +* [FancyTree](https://github.com/mar10/fancytree) - leabharlann crann lán + gnéithe gan iomaíocht cheart. +* [jsPlumb](https://github.com/jsplumb/jsplumb) - leabharlann nascachta amhairc. + Úsáidte i [léarscáileanna + caidrimh](https://docs.triliumnotes.org/user-guide/note-types/relation-map) + agus [léarscáileanna + nasc](https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#link-map) -## 🤝 Support +## 🤝 Tacaíocht -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. +Tógtar agus cothaítear Trilium le [na céadta uair an chloig +oibre](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Coinníonn +do thacaíocht é foinse oscailte, feabhsaíonn sé gnéithe, agus clúdaíonn sé +costais amhail óstáil. -Consider supporting the main developer -([eliandoran](https://github.com/eliandoran)) of the application via: +Smaoinigh ar thacaíocht a thabhairt don phríomhfhorbróir +([eliantoran](https://github.com/eliandoran)) den fheidhmchlár trí: -- [GitHub Sponsors](https://github.com/sponsors/eliandoran) +- [Urraitheoirí GitHub](https://github.com/sponsors/eliandoran) - [PayPal](https://paypal.me/eliandoran) -- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran) +- [Ceannaigh Caife Dom](https://buymeacoffee.com/eliandoran) -## 🔑 License +## 🔑 Ceadúnas -Copyright 2017-2025 zadam, Elian Doran, and other contributors +Cóipcheart 2017-2025 zadam, Elian Doran, agus rannpháirtithe eile -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. +Is bogearraí saor in aisce an clár seo: is féidir leat é a athdháileadh agus/nó +a mhodhnú faoi théarmaí Cheadúnas Poiblí Ginearálta GNU Affero mar atá foilsithe +ag an bhFondúireacht Bogearraí Saor in Aisce, cibé acu leagan 3 den Cheadúnas, +nó (de réir do rogha féin) aon leagan níos déanaí. From b453589077910d5a686e87ce6aad08711e9b5a57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Feb 2026 20:22:32 +0100 Subject: [PATCH 086/560] Translated using Weblate (Irish) Currently translated at 100.0% (152 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/ga/ --- .../src/translations/ga/translation.json | 201 +++++++++++++++++- 1 file changed, 200 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/ga/translation.json b/apps/website/src/translations/ga/translation.json index 0967ef424b..90e8808389 100644 --- a/apps/website/src/translations/ga/translation.json +++ b/apps/website/src/translations/ga/translation.json @@ -1 +1,200 @@ -{} +{ + "get-started": { + "title": "Tosaigh", + "desktop_title": "Íoslódáil an feidhmchlár deisce (v{{version}})", + "architecture": "Ailtireacht:", + "older_releases": "Féach ar eisiúintí níos sine", + "server_title": "Socraigh freastalaí le haghaidh rochtana ar ilghléasanna" + }, + "hero_section": { + "title": "Eagraigh do chuid smaointe. Tóg do bhunachar eolais pearsanta.", + "subtitle": "Is réiteach foinse oscailte é Trilium chun nótaí a thógáil agus bunachar eolais pearsanta a eagrú. Bain úsáid as go háitiúil ar do dheasc, nó sioncrónaigh é le do fhreastalaí féinóstáilte chun do nótaí a choinneáil cibé áit a théann tú.", + "get_started": "Tosaigh", + "github": "GitHub", + "dockerhub": "Docker Hub", + "screenshot_alt": "Scáileán den fheidhmchlár deisce Trilium Notes" + }, + "organization_benefits": { + "title": "Eagraíocht", + "note_structure_title": "Struchtúr nótaí", + "note_structure_description": "Is féidir nótaí a shocrú go hiarlathach. Níl aon ghá le fillteáin, ós rud é gur féidir fo-nótaí a bheith i ngach nóta. Is féidir nóta aonair a chur leis i roinnt áiteanna san ordlathas.", + "attributes_title": "Lipéid nótaí agus caidrimh", + "attributes_description": "Bain úsáid as caidrimh idir nótaí nó cuir lipéid leis le haghaidh catagóiriú éasca. Bain úsáid as tréithe ardaithe chun faisnéis struchtúrtha a iontráil ar féidir a úsáid i dtáblaí agus i gcláir.", + "hoisting_title": "Spásanna oibre agus ardaitheoir", + "hoisting_description": "Deighil do nótaí pearsanta agus oibre go héasca trí iad a ghrúpáil faoi spás oibre, rud a dhíríonn ar do chrann nótaí chun sraith nótaí ar leith amháin a thaispeáint." + }, + "productivity_benefits": { + "title": "Táirgiúlacht agus sábháilteacht", + "revisions_title": "Athbhreithnithe nóta", + "revisions_content": "Sábháiltear nótaí go tréimhsiúil sa chúlra agus is féidir athbhreithnithe a úsáid le haghaidh athbhreithnithe nó chun athruithe de thaisme a chealú. Is féidir athbhreithnithe a chruthú ar éileamh freisin.", + "sync_title": "Sioncrónú", + "sync_content": "Bain úsáid as cás féinóstáilte nó scamall chun do nótaí a shioncrónú go héasca ar fud ilghléasanna, agus chun rochtain a fháil orthu ó do ghuthán póca ag baint úsáide as PWA.", + "protected_notes_title": "Nótaí faoi chosaint", + "protected_notes_content": "Cosain faisnéis phearsanta íogair trí na nótaí a chriptiú agus iad a ghlasáil taobh thiar de sheisiún atá cosanta ag pasfhocal.", + "jump_to_title": "Cuardach tapa agus orduithe", + "jump_to_content": "Léim go tapa chuig nótaí nó orduithe UI ar fud an ordlathais trí chuardach a dhéanamh ar a dteideal, le meaitseáil doiléir chun clóscríobh nó difríochtaí beaga a chur san áireamh.", + "search_title": "Cuardach cumhachtach", + "search_content": "Nó déan cuardach ar théacs laistigh de nótaí agus caolaigh an cuardach trí scagadh a dhéanamh de réir an nóta tuismitheora, nó de réir doimhneachta.", + "web_clipper_title": "Gearrthóir gréasáin", + "web_clipper_content": "Gabh leathanaigh ghréasáin (nó scáileáin) agus cuir iad go díreach i Trilium ag baint úsáide as síneadh brabhsálaí an ghearrthóra gréasáin." + }, + "note_types": { + "title": "Ilbhealaí chun d’fhaisnéis a léiriú", + "text_title": "Nótaí téacs", + "text_description": "Déantar na nótaí a chur in eagar ag baint úsáide as eagarthóir amhairc (WYSIWYG), a thacaíonn le táblaí, íomhánna, nathanna matamaitice, bloic chóid le haibhsiú comhréire. Formáidigh an téacs go tapa ag baint úsáide as comhréir cosúil le Markdown nó ag baint úsáide as orduithe slaise.", + "code_title": "Nótaí cóid", + "code_description": "Úsáideann samplaí móra de chód foinse nó scripteanna eagarthóir tiomnaithe, le haibhsiú comhréire do go leor teangacha ríomhchlárúcháin agus le téamaí dathanna éagsúla.", + "file_title": "Nótaí comhaid", + "file_description": "Cuir comhaid ilmheán ar nós PDFanna, íomhánna, físeáin le chéile le réamhamharc san fheidhmchlár.", + "canvas_title": "Canbhás", + "canvas_description": "Socraigh cruthanna, íomhánna agus téacs ar chanbhás gan teorainn, ag baint úsáide as an teicneolaíocht chéanna atá taobh thiar de excalidraw.com. Oiriúnach do léaráidí, sceitsí agus pleanáil amhairc.", + "mermaid_title": "Léaráidí maighdeana mara", + "mermaid_description": "Cruthaigh léaráidí ar nós cairteacha sreafa, léaráidí ranga agus seicheamhacha, cairteacha Gantt agus go leor eile, ag baint úsáide as comhréir Mermaid.", + "mindmap_title": "Léarscáil intinne", + "mindmap_description": "Eagraigh do chuid smaointe go hamhairc nó déan seisiún smaointeoireachta.", + "others_list": "agus cinn eile: <0>léarscáil nótaí, <1>léarscáil gaoil, <2>cuardaigh shábháilte, <3>nóta rindreála, agus <4>radhairc ghréasáin." + }, + "extensibility_benefits": { + "title": "Comhroinnt & inleathnú", + "import_export_title": "Iompórtáil/onnmhairiú", + "import_export_description": "Idirghníomhaigh go héasca le feidhmchláir eile ag baint úsáide as formáidí Markdown, ENEX, OML.", + "share_title": "Comhroinn nótaí ar an ngréasán", + "share_description": "Má tá freastalaí agat, is féidir é a úsáid chun fo-thacar de do nótaí a roinnt le daoine eile.", + "scripting_title": "Scriptiú ardleibhéil", + "scripting_description": "Tóg do chomhtháthú féin laistigh de Trilium le giuirléidí saincheaptha, nó loighic taobh an fhreastalaí.", + "api_title": "REST API", + "api_description": "Idirghníomhaigh le Trilium go ríomhchláraitheach ag baint úsáide as a REST API ionsuite." + }, + "collections": { + "title": "Bailiúcháin", + "calendar_title": "Féilire", + "calendar_description": "Eagraigh d’imeachtaí pearsanta nó gairmiúla ag baint úsáide as féilire, le tacaíocht d’imeachtaí uile-lae agus il-lae. Féach ar d’imeachtaí go tapa leis na radhairc seachtaine, míosa agus bliana. Idirghníomhaíocht éasca chun imeachtaí a chur leis nó a tharraingt.", + "table_title": "Tábla", + "table_description": "Taispeáin agus cuir in eagar faisnéis faoi nótaí i struchtúr táblach, le cineálacha éagsúla colún amhail téacs, uimhir, boscaí seiceála, dáta & am, naisc agus dathanna agus tacaíocht do chaidrimh. De rogha air sin, taispeáin na nótaí laistigh de ordlathas crainn taobh istigh den tábla.", + "board_title": "Bord Kanban", + "board_description": "Eagraigh stádas do thascanna nó do thionscadail i mbord Kanban le bealach éasca chun míreanna agus colúin nua a chruthú agus a stádas a athrú go simplí trí tharraingt trasna an chláir.", + "geomap_title": "Geo-léarscáil", + "geomap_description": "Pleanáil do laethanta saoire nó marcáil do phointí spéise go díreach ar léarscáil gheografach ag baint úsáide as marcóirí saincheaptha. Taispeáin rianta GPX taifeadta chun bealaí taistil a rianú.", + "presentation_title": "Cur i Láthair", + "presentation_description": "Eagraigh faisnéis i sleamhnáin agus cuir i láthair iad i lánscáileán le haistrithe réidhe. Is féidir na sleamhnáin a onnmhairiú go PDF freisin le go mbeidh sé éasca iad a roinnt." + }, + "faq": { + "title": "Ceisteanna Coitianta", + "mobile_question": "An bhfuil feidhmchlár soghluaiste ann?", + "mobile_answer": "Faoi láthair níl aon aip shoghluaiste oifigiúil ann. Mar sin féin, má tá freastalaí agat is féidir leat rochtain a fháil air trí bhrabhsálaí gréasáin a úsáid agus fiú é a shuiteáil mar PWA. I gcás Android, tá aip neamhoifigiúil ann ar a dtugtar TriliumDroid a oibríonn as líne fiú (cosúil le cliant deisce).", + "database_question": "Cá bhfuil na sonraí stóráilte?", + "database_answer": "Stórálfar do nótaí go léir i mbunachar sonraí SQLite i bhfillteán feidhmchláir. Is é an chúis a n-úsáideann Trilium bunachar sonraí in ionad comhaid téacs simplí ná feidhmíocht agus go mbeadh roinnt gnéithe i bhfad níos deacra a chur i bhfeidhm amhail clóin (an nóta céanna in áiteanna éagsúla sa chrann). Chun an fillteán feidhmchláir a aimsiú, téigh go dtí an fhuinneog Maidir Linn.", + "server_question": "An bhfuil freastalaí ag teastáil uaim le Trilium a úsáid?", + "server_answer": "Ní hea, ceadaíonn an freastalaí rochtain trí bhrabhsálaí gréasáin agus bainistíonn sé an sioncrónú má tá ilghléasanna agat. Chun tús a chur leis, is leor an feidhmchlár deisce a íoslódáil agus tosú ag baint úsáide as.", + "scaling_question": "Cé chomh maith agus a scálaíonn an feidhmchlár le líon mór nótaí?", + "scaling_answer": "Ag brath ar úsáid, ba cheart go mbeadh an feidhmchlár in ann 100,000 nóta ar a laghad a láimhseáil gan fadhb. Tabhair faoi deara go bhféadfadh teip a bheith ar an bpróiseas sioncrónaithe uaireanta má tá go leor comhad mór á uaslódáil (1 GB in aghaidh an chomhaid) ós rud é go bhfuil Trilium beartaithe níos mó mar fheidhmchlár bonn eolais seachas stór comhad (cosúil le NextCloud, mar shampla).", + "network_share_question": "An féidir liom mo bhunachar sonraí a roinnt thar thiomántán líonra?", + "network_share_answer": "Ní hea, ní smaoineamh maith é bunachar sonraí SQLite a roinnt thar thiomántán líonra i gcoitinne. Cé go bhféadfadh sé oibriú uaireanta, tá seans ann go ndéanfar an bunachar sonraí a thruailliú mar gheall ar ghlasanna comhad neamhfhoirfe thar líonra.", + "security_question": "Conas a chosnaítear mo chuid sonraí?", + "security_answer": "De réir réamhshocraithe, ní chriptítear nótaí agus is féidir iad a léamh go díreach ón mbunachar sonraí. Nuair a mharcáiltear nóta mar chriptithe, déantar an nóta a chriptiú ag baint úsáide as AES-128-CBC." + }, + "final_cta": { + "title": "Réidh le tosú le Trilium Notes?", + "description": "Tóg do bhunachar eolais pearsanta le gnéithe cumhachtacha agus príobháideacht iomlán.", + "get_started": "Tosaigh" + }, + "components": { + "link_learn_more": "Foghlaim níos mó..." + }, + "download_now": { + "text": "Íoslódáil anois ", + "platform_big": "v{{version}} do {{platform}}", + "platform_small": "do {{platform}}", + "linux_big": "v{{version}} do Linux", + "linux_small": "do Linux", + "more_platforms": "Tuilleadh ardán & socrú freastalaí" + }, + "header": { + "get-started": "Tosaigh", + "documentation": "Doiciméadú", + "support-us": "Tacaigh linn" + }, + "footer": { + "copyright_and_the": " agus an ", + "copyright_community": "pobal" + }, + "social_buttons": { + "github": "GitHub", + "github_discussions": "Pléanna GitHub", + "matrix": "Maitrís", + "reddit": "Reddit" + }, + "support_us": { + "title": "Tacaigh linn", + "financial_donations_title": "Síntiúis airgeadais", + "financial_donations_description": "Tógtar agus cothaítear Trilium le na céadta uair an chloig oibre. Coinníonn do thacaíocht é foinse oscailte, feabhsaíonn sé gnéithe, agus clúdaíonn sé costais amhail óstáil.", + "financial_donations_cta": "Smaoinigh ar thacaíocht a thabhairt don phríomhfhorbróir (eliandoran) den fheidhmchlár trí:", + "github_sponsors": "Urraitheoirí GitHub", + "paypal": "PayPal", + "buy_me_a_coffee": "Ceannaigh Caife Dom" + }, + "contribute": { + "title": "Bealaí eile chun ranníocaíocht a dhéanamh", + "way_translate": "Aistrigh an feidhmchlár go do theanga dhúchais trí Weblate.", + "way_community": "Déan idirghníomhú leis an bpobal ar GitHub Discussions nó ar Matrix.", + "way_reports": "Tuairiscigh fabhtanna trí Fadhbanna GitHub.", + "way_document": "Feabhas a chur ar an doiciméadacht trí eolas a thabhairt dúinn faoi bhearnaí sa doiciméadacht nó trí threoracha, Ceisteanna Coitianta nó ranganna teagaisc a chur ar fáil.", + "way_market": "Scaip an scéal: Roinn Nótaí Trilium le cairde, nó ar bhlaganna agus ar na meáin shóisialta." + }, + "404": { + "title": "404: Níor aimsíodh", + "description": "Níorbh fhéidir an leathanach a bhí á lorg agat a aimsiú. B’fhéidir gur scriosadh é nó go bhfuil an URL mícheart." + }, + "download_helper_desktop_windows": { + "title_x64": "Windows 64-bit", + "title_arm64": "Windows ar ARM", + "description_x64": "Ag luí le gléasanna Intel nó AMD a bhfuil Windows 10 agus 11 á rith acu.", + "description_arm64": "Ag luí le gléasanna ARM (m.sh. le Qualcomm Snapdragon).", + "quick_start": "Chun a shuiteáil trí Winget:", + "download_exe": "Íoslódáil an Suiteálaí (.exe)", + "download_zip": "Iniompartha (.zip)", + "download_scoop": "Scúp" + }, + "download_helper_desktop_linux": { + "title_x64": "Linux 64-bit", + "title_arm64": "Linux ar ARM", + "description_x64": "Don chuid is mó de na dáiltí Linux, comhoiriúnach le hailtireacht x86_64.", + "description_arm64": "I gcás dáiltí Linux bunaithe ar ARM, comhoiriúnach le hailtireacht aarch64.", + "quick_start": "Roghnaigh formáid phacáiste chuí, ag brath ar do dháileadh:", + "download_deb": ".deb", + "download_rpm": ".rpm", + "download_flatpak": ".flatpak", + "download_zip": "Iniompartha (.zip)", + "download_nixpkgs": "nixpkgs", + "download_aur": "AUR" + }, + "download_helper_desktop_macos": { + "title_x64": "macOS do Intel", + "title_arm64": "macOS do Apple Silicon", + "description_x64": "Do Macs bunaithe ar Intel a bhfuil macOS Monterey nó níos déanaí á rith acu.", + "description_arm64": "Do ríomhairí Mac Apple Silicon ar nós iad siúd a bhfuil sceallóga M1 agus M2 acu.", + "quick_start": "Chun a shuiteáil trí Homebrew:", + "download_dmg": "Íoslódáil an Suiteálaí (.dmg)", + "download_homebrew_cask": "Homebrew Cask", + "download_zip": "Iniompartha (.zip)" + }, + "download_helper_server_docker": { + "title": "Féinóstáilte ag baint úsáide as Docker", + "description": "Imscaradh go héasca ar Windows, Linux nó macOS ag baint úsáide as coimeádán Docker.", + "download_dockerhub": "Docker Hub", + "download_ghcr": "ghcr.io" + }, + "download_helper_server_linux": { + "title": "Féinóstáilte ar Linux", + "description": "Imscar Trilium Notes ar do fhreastalaí nó VPS féin, atá comhoiriúnach leis an gcuid is mó de na dáileacháin.", + "download_tar_x64": "x64 (.tar.xz)", + "download_tar_arm64": "ARM (.tar.xz)", + "download_nixos": "Modúl NixOS" + }, + "download_helper_server_hosted": { + "title": "Óstáil íoctha", + "description": "Nótaí Trilium atá á n-óstáil ar PikaPods, seirbhís íoctha le haghaidh rochtana agus bainistíochta éasca. Níl baint dhíreach aige le foireann Trilium.", + "download_pikapod": "Socraigh ar PikaPods", + "download_triliumcc": "Nó féach ar trilium.cc" + } +} From 3e8376609964f2f449c2e2585557151d179ab858 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Feb 2026 20:53:16 +0100 Subject: [PATCH 087/560] Translated using Weblate (Irish) Currently translated at 0.1% (1 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ga/ --- apps/client/src/translations/ga/translation.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/ga/translation.json b/apps/client/src/translations/ga/translation.json index 0967ef424b..ca517b61ea 100644 --- a/apps/client/src/translations/ga/translation.json +++ b/apps/client/src/translations/ga/translation.json @@ -1 +1,5 @@ -{} +{ + "global_menu": { + "about": "Maidir le Trilium Notes" + } +} From 673cbc97e1fd1ffe044749c37c6f9d007fb0fb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aindri=C3=BA=20Mac=20Giolla=20Eoin?= Date: Sun, 1 Feb 2026 20:52:56 +0100 Subject: [PATCH 088/560] Translated using Weblate (Irish) Currently translated at 100.0% (389 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/ga/ --- .../src/assets/translations/ga/server.json | 444 +++++++++++++++++- 1 file changed, 443 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/ga/server.json b/apps/server/src/assets/translations/ga/server.json index 0967ef424b..d4cbaa006c 100644 --- a/apps/server/src/assets/translations/ga/server.json +++ b/apps/server/src/assets/translations/ga/server.json @@ -1 +1,443 @@ -{} +{ + "keyboard_actions": { + "back-in-note-history": "Téigh go dtí an nóta roimhe seo sa stair", + "forward-in-note-history": "Téigh go dtí an chéad nóta eile sa stair", + "open-jump-to-note-dialog": "Oscail an dialóg \"Léim go dtí an nóta\"", + "open-command-palette": "Oscail pailéad orduithe", + "scroll-to-active-note": "Scrollaigh crann na nótaí go dtí an nóta gníomhach", + "quick-search": "Gníomhachtaigh an barra cuardaigh thapa", + "search-in-subtree": "Cuardaigh nótaí i bhfo-chrann an nóta ghníomhaigh", + "expand-subtree": "Leathnaigh fo-chrann an nóta reatha", + "collapse-tree": "Laghdaíonn sé an crann nótaí iomlán", + "collapse-subtree": "Laghdaíonn sé fo-chrann an nóta reatha", + "sort-child-notes": "Sórtáil nótaí leanaí", + "creating-and-moving-notes": "Nótaí a chruthú agus a bhogadh", + "create-note-after": "Cruthaigh nóta i ndiaidh nóta gníomhach", + "create-note-into": "Cruthaigh nóta mar leanbh den nóta gníomhach", + "create-note-into-inbox": "Cruthaigh nóta sa bhosca isteach (más sainithe) nó nóta lae", + "delete-note": "Scrios nóta", + "move-note-up": "Bog nóta suas", + "move-note-down": "Bog nóta síos", + "move-note-up-in-hierarchy": "Bog nóta suas san ordlathas", + "move-note-down-in-hierarchy": "Bog nóta síos san ordlathas", + "edit-note-title": "Léim ón gcrann go dtí sonraí an nóta agus cuir an teideal in eagar", + "edit-branch-prefix": "Taispeáin an dialóg \"Cuir réimír na brainse in eagar\"", + "clone-notes-to": "Clónáil nótaí roghnaithe", + "move-notes-to": "Bog nótaí roghnaithe", + "note-clipboard": "Gearrthaisce nótaí", + "copy-notes-to-clipboard": "Cóipeáil na nótaí roghnaithe chuig an ghearrthaisce", + "paste-notes-from-clipboard": "Greamaigh nótaí ón ghearrthaisce isteach sa nóta gníomhach", + "cut-notes-to-clipboard": "Gearr nótaí roghnaithe chuig an ghearrthaisce", + "select-all-notes-in-parent": "Roghnaigh na nótaí go léir ón leibhéal nóta reatha", + "add-note-above-to-the-selection": "Cuir nóta thuas leis an rogha", + "add-note-below-to-selection": "Cuir nóta leis an rogha thíos", + "duplicate-subtree": "Fo-chrann dúblach", + "tabs-and-windows": "Cluaisíní agus Fuinneoga", + "open-new-tab": "Oscail cluaisín nua", + "close-active-tab": "Dún an cluaisín gníomhach", + "reopen-last-tab": "Athoscail an cluaisín deireanach a dúnadh", + "activate-next-tab": "Gníomhachtaigh an cluaisín ar dheis", + "activate-previous-tab": "Gníomhachtaigh an cluaisín ar chlé", + "open-new-window": "Oscail fuinneog nua folamh", + "toggle-tray": "Taispeáin/folaigh an feidhmchlár ón tráidire córais", + "first-tab": "Gníomhachtaigh an chéad chluaisín sa liosta", + "second-tab": "Gníomhachtaigh an dara cluaisín sa liosta", + "third-tab": "Gníomhachtaigh an tríú cluaisín sa liosta", + "fourth-tab": "Gníomhachtaigh an ceathrú cluaisín sa liosta", + "fifth-tab": "Gníomhachtaigh an cúigiú cluaisín sa liosta", + "sixth-tab": "Gníomhachtaigh an séú cluaisín sa liosta", + "seventh-tab": "Gníomhachtaigh an seachtú cluaisín sa liosta", + "eight-tab": "Gníomhachtaigh an t-ochtú cluaisín sa liosta", + "ninth-tab": "Gníomhachtaigh an naoú cluaisín sa liosta", + "last-tab": "Gníomhachtaigh an cluaisín deireanach sa liosta", + "dialogs": "Dialóga", + "show-note-source": "Taispeáin an dialóg \"Foinse an Nóta\"", + "show-options": "Oscail an leathanach \"Roghanna\"", + "show-revisions": "Taispeáin an dialóg \"Athbhreithnithe Nóta\"", + "show-recent-changes": "Taispeáin an dialóg \"Athruithe Le Déanaí\"", + "show-sql-console": "Oscail an leathanach \"Consól SQL\"", + "show-backend-log": "Oscail an leathanach \"Log Backend\"", + "show-help": "Oscail an Treoir Úsáideora ionsuite", + "show-cheatsheet": "Taispeáin modal le hoibríochtaí coitianta méarchláir", + "text-note-operations": "Oibríochtaí nótaí téacs", + "add-link-to-text": "Oscail an dialóg chun nasc a chur leis an téacs", + "follow-link-under-cursor": "Lean an nasc ina bhfuil an caret curtha", + "insert-date-and-time-to-text": "Cuir an dáta agus an t-am reatha isteach sa téacs", + "paste-markdown-into-text": "Greamaigh Markdown ón ghearrthaisce isteach i nóta téacs", + "cut-into-note": "Gearrann sé an rogha ón nóta reatha agus cruthaíonn sé fo-nóta leis an téacs roghnaithe", + "add-include-note-to-text": "Osclaíonn an dialóg chun nóta a chur san áireamh", + "edit-readonly-note": "Cuir nóta inléite amháin in eagar", + "attributes-labels-and-relations": "Tréithe (lipéid & caidrimh)", + "add-new-label": "Cruthaigh lipéad nua", + "create-new-relation": "Cruthaigh caidreamh nua", + "ribbon-tabs": "Cluaisíní ribín", + "toggle-basic-properties": "Airíonna Bunúsacha a Athrú", + "toggle-file-properties": "Airíonna Comhaid a Athrú", + "toggle-image-properties": "Airíonna Íomhá a Athrú", + "toggle-owned-attributes": "Tréithe faoi Úinéireacht a Athrú", + "toggle-inherited-attributes": "Tréithe Oidhreachta a Athrú", + "toggle-promoted-attributes": "Tréithe Curtha Chun Cinn a Athrú", + "toggle-link-map": "Léarscáil Nasc a Athsholáthar", + "toggle-note-info": "Eolas Nóta a Athrú", + "toggle-note-paths": "Cosáin Nótaí a Athrú", + "toggle-similar-notes": "Nótaí Cosúla a Athsholáthar", + "other": "Eile", + "toggle-right-pane": "Athraigh taispeáint an phainéil dheis, lena n-áirítear Clár Ábhair agus Buaicphointí", + "print-active-note": "Priontáil nóta gníomhach", + "open-note-externally": "Oscail nóta mar chomhad leis an bhfeidhmchlár réamhshocraithe", + "render-active-note": "Rindreáil (ath-rindreáil) nóta gníomhach", + "run-active-note": "Rith nóta cóid JavaScript gníomhach (frontend/backend)", + "toggle-note-hoisting": "Scoránaigh ardú nóta an nóta ghníomhaigh", + "unhoist": "Dí-ardaigh ó áit ar bith", + "reload-frontend-app": "Athlódáil an tosaigh", + "open-dev-tools": "Uirlisí forbróra oscailte", + "find-in-text": "Painéal cuardaigh a scoránaigh", + "toggle-left-note-tree-panel": "Scoránaigh an painéal ar chlé (crann nótaí)", + "toggle-full-screen": "Scoraigh an scáileán iomlán", + "zoom-out": "Zúmáil Amach", + "zoom-in": "Zúmáil Isteach", + "note-navigation": "Nascleanúint nótaí", + "reset-zoom-level": "Athshocraigh leibhéal súmála", + "copy-without-formatting": "Cóipeáil téacs roghnaithe gan fhormáidiú", + "force-save-revision": "Cruthú/sábháil nóta nua den nóta gníomhach i bhfeidhm", + "toggle-book-properties": "Airíonna an Bhailiúcháin a Athrú", + "toggle-classic-editor-toolbar": "Athraigh an cluaisín Formáidithe don eagarthóir leis an mbarra uirlisí socraithe", + "export-as-pdf": "Easpórtáil an nóta reatha mar PDF", + "toggle-zen-mode": "Cumasaíonn/díchumasaíonn sé an mód zen (comhad úsáideora íosta le haghaidh eagarthóireacht níos dírithe)" + }, + "keyboard_action_names": { + "back-in-note-history": "Ar ais i Stair na Nótaí", + "forward-in-note-history": "Ar Aghaidh i Stair na Nótaí", + "jump-to-note": "Léim go...", + "command-palette": "Pailéad Ordú", + "scroll-to-active-note": "Scrollaigh go dtí an Nóta Gníomhach", + "quick-search": "Cuardach Tapa", + "search-in-subtree": "Cuardaigh i bhFo-chrann", + "expand-subtree": "Leathnaigh an Fo-Chrann", + "collapse-tree": "Laghdaigh Crann", + "collapse-subtree": "Laghdaigh Fo-chrann", + "sort-child-notes": "Sórtáil Nótaí Leanaí", + "create-note-after": "Cruthaigh Nóta Tar éis", + "create-note-into": "Cruthaigh Nóta Isteach", + "create-note-into-inbox": "Cruthaigh Nóta sa Bhosca Isteach", + "delete-notes": "Scrios Nótaí", + "move-note-up": "Bog Nóta Suas", + "move-note-down": "Bog Nóta Síos", + "move-note-up-in-hierarchy": "Bog Nóta Suas san Ordlathas", + "move-note-down-in-hierarchy": "Bog Nóta Síos san Ordlathas", + "edit-note-title": "Cuir Teideal an Nóta in Eagar", + "edit-branch-prefix": "Cuir Réimír na Brainse in Eagar", + "clone-notes-to": "Nótaí Clónála Chuig", + "move-notes-to": "Bog Nótaí Chuig", + "copy-notes-to-clipboard": "Cóipeáil Nótaí chuig an nGearrthaisce", + "paste-notes-from-clipboard": "Greamaigh Nótaí ón nGearrthaisce", + "cut-notes-to-clipboard": "Gearr Nótaí chuig an nGearrthaisce", + "select-all-notes-in-parent": "Roghnaigh Gach Nóta sa Tuismitheoir", + "add-note-above-to-selection": "Cuir Nóta Thuas leis an Roghnú", + "add-note-below-to-selection": "Cuir Nóta Thíos leis an Roghnú", + "duplicate-subtree": "Fo-chrann Dúblach", + "open-new-tab": "Oscail Cluaisín Nua", + "close-active-tab": "Dún an Cluaisín Gníomhach", + "reopen-last-tab": "Athoscail an Cluaisín Deireanach", + "activate-next-tab": "Gníomhachtaigh an Chluaisín Eile", + "activate-previous-tab": "Gníomhachtaigh an Cluaisín Roimhe Seo", + "open-new-window": "Oscail Fuinneog Nua", + "toggle-system-tray-icon": "Deilbhín Tráidire an Chórais a Athrú", + "toggle-zen-mode": "Mód Zen a athrú", + "switch-to-first-tab": "Athraigh go dtí an Chéad Chluaisín", + "switch-to-second-tab": "Athraigh go dtí an Dara Cluaisín", + "switch-to-third-tab": "Athraigh go dtí an Tríú Cluaisín", + "switch-to-fourth-tab": "Athraigh go dtí an Ceathrú Cluaisín", + "switch-to-fifth-tab": "Athraigh go dtí an Cúigiú Cluaisín", + "switch-to-sixth-tab": "Athraigh go dtí an Séú Cluaisín", + "switch-to-seventh-tab": "Athraigh go dtí an Seachtú Cluaisín", + "switch-to-eighth-tab": "Athraigh go dtí an tOchtú Cluaisín", + "switch-to-ninth-tab": "Athraigh go dtí an Naoú Cluaisín", + "switch-to-last-tab": "Athraigh go dtí an Cluaisín Deireanach", + "show-note-source": "Taispeáin Foinse an Nóta", + "show-options": "Taispeáin Roghanna", + "show-revisions": "Taispeáin Athbhreithnithe", + "show-recent-changes": "Taispeáin Athruithe Le Déanaí", + "show-sql-console": "Taispeáin Consól SQL", + "show-backend-log": "Taispeáin Logáil an Chúil", + "show-help": "Taispeáin Cabhair", + "show-cheatsheet": "Taispeáin Bileog Leideanna", + "add-link-to-text": "Cuir Nasc leis an Téacs", + "follow-link-under-cursor": "Lean an Nasc Faoin gCúrsóir", + "insert-date-and-time-to-text": "Cuir Dáta agus Am isteach sa Téacs", + "paste-markdown-into-text": "Greamaigh Markdown isteach sa Téacs", + "cut-into-note": "Gearr isteach i Nóta", + "add-include-note-to-text": "Cuir Nóta le Téacs", + "edit-read-only-note": "Cuir Nóta Léite Amháin in Eagar", + "add-new-label": "Cuir Lipéad Nua leis", + "add-new-relation": "Cuir Gaol Nua leis", + "toggle-ribbon-tab-classic-editor": "Eagarthóir Clasaiceach Cluaisín Ribín a Athrú", + "toggle-ribbon-tab-basic-properties": "Airíonna Bunúsacha an Chluaisín Ribín a Athrú", + "toggle-ribbon-tab-book-properties": "Airíonna Leabhar an Chluaisín Ribín a Athrú", + "toggle-ribbon-tab-file-properties": "Airíonna Comhaid Tab Ribín a Athrú", + "toggle-ribbon-tab-image-properties": "Airíonna Íomhá an Chluaisín Ribín a Athrú", + "toggle-ribbon-tab-owned-attributes": "Tréithe atá faoi úinéireacht ag an gcluaisín ribín", + "toggle-ribbon-tab-inherited-attributes": "Tréithe Oidhreachta Cluaisín Ribín a Scor", + "toggle-ribbon-tab-promoted-attributes": "Tréithe Curtha Chun Cinn sa Chluaisín Ribín", + "toggle-ribbon-tab-note-map": "Léarscáil Nótaí Tab Ribín a Athrú", + "toggle-ribbon-tab-note-info": "Eolas Nóta Cluaisín Ribín a Athrú", + "toggle-ribbon-tab-note-paths": "Cosáin Nóta Cluaisín Ribín a Athrú", + "toggle-ribbon-tab-similar-notes": "Nótaí Cosúla a Athraigh an Cluaisín Ribín", + "toggle-right-pane": "Scoránaigh an Phána Ar Dheis", + "print-active-note": "Priontáil Nóta Gníomhach", + "export-active-note-as-pdf": "Easpórtáil Nóta Gníomhach mar PDF", + "open-note-externally": "Oscail Nóta go Seachtrach", + "render-active-note": "Rindreáil Nóta Gníomhach", + "run-active-note": "Rith Nóta Gníomhach", + "toggle-note-hoisting": "Ardú Nótaí a Athrú", + "unhoist-note": "Nóta Dí-Ardaithe", + "reload-frontend-app": "Athlódáil an Aip Tosaigh", + "open-developer-tools": "Oscail Uirlisí Forbróra", + "find-in-text": "Aimsigh sa Téacs", + "toggle-left-pane": "Scoránaigh an Phána Chlé", + "toggle-full-screen": "Athraigh an Scáileán Lán", + "zoom-out": "Zúmáil Amach", + "zoom-in": "Zúmáil Isteach", + "reset-zoom-level": "Athshocraigh Leibhéal Súmála", + "copy-without-formatting": "Cóipeáil Gan Formáidiú", + "force-save-revision": "Athbhreithniú Sábháilte Fórsála" + }, + "login": { + "title": "Logáil Isteach", + "heading": "Logáil Isteach Trilium", + "incorrect-totp": "Tá an TOTP mícheart. Déan iarracht arís.", + "incorrect-password": "Tá an focal faire mícheart. Déan iarracht arís.", + "password": "Pasfhocal", + "remember-me": "Cuimhnigh orm", + "button": "Logáil Isteach", + "sign_in_with_sso": "Sínigh isteach le {{ ssoIssuerName }}" + }, + "set_password": { + "title": "Socraigh Pasfhocal", + "heading": "Socraigh pasfhocal", + "description": "Sula dtosaíonn tú ag úsáid Trilium ón ngréasán, ní mór duit pasfhocal a shocrú ar dtús. Úsáidfidh tú an pasfhocal seo ansin chun logáil isteach.", + "password": "Pasfhocal", + "password-confirmation": "Deimhniú pasfhocail", + "button": "Socraigh pasfhocal" + }, + "setup": { + "heading": "Socrú Trilium Notes", + "new-document": "Is úsáideoir nua mé, agus ba mhaith liom doiciméad Trilium nua a chruthú do mo nótaí", + "sync-from-desktop": "Tá cás deisce agam cheana féin, agus ba mhaith liom sioncrónú a shocrú leis", + "sync-from-server": "Tá sampla freastalaí agam cheana féin, agus ba mhaith liom sioncrónú a shocrú leis", + "next": "Ar Aghaidh", + "init-in-progress": "Túsú doiciméad ar siúl", + "redirecting": "Atreorófar chuig an bhfeidhmchlár thú go luath.", + "title": "Socrú" + }, + "setup_sync-from-desktop": { + "heading": "Sioncrónaigh ón Deasc", + "description": "Ní mór an socrú seo a thionscnamh ón deasc:", + "step1": "Oscail sampla de Trilium Notes ar do dheasc.", + "step2": "Ón Roghchlár Trilium, cliceáil Roghanna.", + "step3": "Cliceáil ar an gcatagóir Sioncrónaigh.", + "step4": "Athraigh seoladh an fhreastalaí go: {{- host}} agus cliceáil Sábháil.", + "step5": "Cliceáil an cnaipe \"Tástáil sioncrónaithe\" chun a fhíorú go bhfuil an nasc rathúil.", + "step6": "Nuair a bheidh na céimeanna seo críochnaithe agat, cliceáil {{- link}}.", + "step6-here": "anseo" + }, + "setup_sync-from-server": { + "heading": "Sioncrónaigh ón bhFreastalaí", + "instructions": "Cuir isteach seoladh agus dintiúir freastalaí Trilium thíos le do thoil. Íoslódálfaidh sé seo an doiciméad Trilium iomlán ón bhfreastalaí agus socróidh sé sioncrónú leis. Ag brath ar mhéid an doiciméid agus luas do nasc, d'fhéadfadh sé seo tamall a thógáil.", + "server-host": "Seoladh freastalaí Trilium", + "server-host-placeholder": "https://:", + "proxy-server": "Freastalaí seachfhreastalaí (roghnach)", + "proxy-server-placeholder": "https://:", + "note": "Nóta:", + "proxy-instruction": "Má fhágann tú an socrú seachfhreastalaí bán, úsáidfear seachfhreastalaí an chórais (baineann sé leis an bhfeidhmchlár deisce amháin)", + "password": "Pasfhocal", + "password-placeholder": "Pasfhocal", + "back": "Ar ais", + "finish-setup": "Críochnaigh an socrú" + }, + "setup_sync-in-progress": { + "heading": "Sioncrónú ar siúl", + "successful": "Tá an sioncrónú socraithe i gceart. Tógfaidh sé tamall go mbeidh an sioncrónú tosaigh críochnaithe. Nuair a bheidh sé déanta, atreorófar chuig an leathanach logála isteach thú.", + "outstanding-items": "Míreanna sioncrónaithe gan réiteach:", + "outstanding-items-default": "N/B" + }, + "share_404": { + "title": "Níor aimsíodh", + "heading": "Níor aimsíodh" + }, + "share_page": { + "parent": "tuismitheoir:", + "clipped-from": "Gearradh an nóta seo ó {{- url}} ar dtús", + "child-notes": "Nótaí leanaí:", + "no-content": "Níl aon ábhar sa nóta seo." + }, + "weekdays": { + "monday": "Dé Luain", + "tuesday": "Dé Máirt", + "wednesday": "Dé Céadaoin", + "thursday": "Déardaoin", + "friday": "Dé hAoine", + "saturday": "Dé Sathairn", + "sunday": "Dé Domhnaigh" + }, + "weekdayNumber": "Seachtain {weekNumber}", + "months": { + "january": "Eanáir", + "february": "Feabhra", + "march": "Márta", + "april": "Aibreán", + "may": "Bealtaine", + "june": "Meitheamh", + "july": "Iúil", + "august": "Lúnasa", + "september": "Meán Fómhair", + "october": "Deireadh Fómhair", + "november": "Samhain", + "december": "Nollaig" + }, + "quarterNumber": "Ráithe {quarterNumber}", + "special_notes": { + "search_prefix": "Cuardaigh:" + }, + "test_sync": { + "not-configured": "Níl an freastalaí sioncrónaithe cumraithe. Cumraigh an sioncrónú ar dtús.", + "successful": "Tá croitheadh láimhe an fhreastalaí sioncrónaithe tar éis a bheith rathúil, tá tús curtha leis an sioncrónú." + }, + "hidden-subtree": { + "root-title": "Nótaí Folaithe", + "search-history-title": "Stair Chuardaigh", + "note-map-title": "Léarscáil Nótaí", + "sql-console-history-title": "Stair Chonsól SQL", + "shared-notes-title": "Nótaí Comhroinnte", + "bulk-action-title": "Gníomh Bulc", + "backend-log-title": "Logáil Cúil", + "user-hidden-title": "Úsáideoir i bhfolach", + "launch-bar-templates-title": "Teimpléid Barra Seolta", + "base-abstract-launcher-title": "Tosaitheoir Bunúsach Teibí", + "command-launcher-title": "Tosaitheoir Ordú", + "note-launcher-title": "Tosaitheoir Nótaí", + "script-launcher-title": "Tosaitheoir Scripte", + "built-in-widget-title": "Giuirléid Tógtha isteach", + "spacer-title": "Spásaire", + "custom-widget-title": "Giuirléid Saincheaptha", + "launch-bar-title": "Barra Lainseáil", + "available-launchers-title": "Lainseálaithe atá ar Fáil", + "go-to-previous-note-title": "Téigh go dtí an Nóta Roimhe Seo", + "go-to-next-note-title": "Téigh go dtí an chéad Nóta Eile", + "new-note-title": "Nóta Nua", + "search-notes-title": "Cuardaigh Nótaí", + "jump-to-note-title": "Léim go...", + "calendar-title": "Féilire", + "recent-changes-title": "Athruithe Le Déanaí", + "bookmarks-title": "Leabharmharcanna", + "command-palette": "Oscail an Pailéad Ordaithe", + "zen-mode": "Mód Zen", + "open-today-journal-note-title": "Oscail Nóta Dialainne an Lae Inniu", + "quick-search-title": "Cuardach Tapa", + "protected-session-title": "Seisiún faoi Chosaint", + "sync-status-title": "Stádas Sioncrónaithe", + "settings-title": "Socruithe", + "llm-chat-title": "Comhrá le Nótaí", + "options-title": "Roghanna", + "appearance-title": "Dealramh", + "shortcuts-title": "Aicearraí", + "text-notes": "Nótaí Téacs", + "code-notes-title": "Nótaí Cód", + "images-title": "Íomhánna", + "spellcheck-title": "Seiceáil litrithe", + "password-title": "Pasfhocal", + "multi-factor-authentication-title": "MFA", + "etapi-title": "ETAPI", + "backup-title": "Cúltaca", + "sync-title": "Sioncrónaigh", + "ai-llm-title": "AI/LLM", + "other": "Eile", + "advanced-title": "Ardleibhéil", + "visible-launchers-title": "Lainseálaithe Infheicthe", + "user-guide": "Treoir Úsáideora", + "localization": "Teanga & Réigiún", + "inbox-title": "Bosca isteach", + "tab-switcher-title": "Athraitheoir Cluaisíní" + }, + "notes": { + "new-note": "Nóta nua", + "duplicate-note-suffix": "(dúpáil)", + "duplicate-note-title": "{{- noteTitle }} {{ duplicateNoteSuffix }}" + }, + "backend_log": { + "log-does-not-exist": "Níl an comhad loga cúil '{{ fileName }}' ann (go fóill).", + "reading-log-failed": "Theip ar an gcomhad loga cúil '{{ fileName }}' a léamh." + }, + "content_renderer": { + "note-cannot-be-displayed": "Ní féidir an cineál nóta seo a thaispeáint." + }, + "pdf": { + "export_filter": "Doiciméad PDF (*.pdf)", + "unable-to-export-message": "Níorbh fhéidir an nóta reatha a easpórtáil mar PDF.", + "unable-to-export-title": "Ní féidir a onnmhairiú mar PDF", + "unable-to-save-message": "Níorbh fhéidir scríobh chuig an gcomhad roghnaithe. Déan iarracht eile nó roghnaigh ceann scríbe eile.", + "unable-to-print": "Ní féidir an nóta a phriontáil" + }, + "tray": { + "close": "Scoir de Trilium", + "recents": "Nótaí le déanaí", + "bookmarks": "Leabharmharcanna", + "today": "Oscail nóta dialainne an lae inniu", + "new-note": "Nóta nua", + "show-windows": "Taispeáin fuinneoga", + "open_new_window": "Oscail fuinneog nua", + "tooltip": "Trilium Notes" + }, + "migration": { + "old_version": "Ní thacaítear le haistriú díreach ó do leagan reatha. Uasghrádaigh go dtí an leagan is déanaí v0.60.4 ar dtús agus ansin go dtí an leagan seo amháin.", + "error_message": "Earráid le linn imirce go leagan {{version}}: {{stack}}", + "wrong_db_version": "Tá leagan an bhunachair shonraí ({{version}}) níos nuaí ná mar a bhfuil súil ag an bhfeidhmchlár leis ({{targetVersion}}), rud a chiallaíonn gur cruthaíodh é le leagan níos nuaí agus neamh-chomhoiriúnach de Trilium. Uasghrádaigh go dtí an leagan is déanaí de Trilium chun an fhadhb seo a réiteach." + }, + "modals": { + "error_title": "Earráid" + }, + "share_theme": { + "site-theme": "Téama an tSuímh", + "search_placeholder": "Cuardaigh...", + "image_alt": "Íomhá an Airteagail", + "last-updated": "Nuashonraithe go deireanach ar {{- date}}", + "subpages": "Fo-leathanaigh:", + "on-this-page": "Ar an Leathanach seo", + "expand": "Leathnaigh" + }, + "hidden_subtree_templates": { + "text-snippet": "Sleachta Téacs", + "description": "Cur síos", + "list-view": "Amharc Liosta", + "grid-view": "Radharc Eangaí", + "calendar": "Féilire", + "table": "Tábla", + "geo-map": "Léarscáil Gheografach", + "start-date": "Dáta Tosaigh", + "end-date": "Dáta Deiridh", + "start-time": "Am Tosaigh", + "end-time": "Am Deiridh", + "geolocation": "Geoshuíomh", + "built-in-templates": "Teimpléid ionsuite", + "board": "Bord Kanban", + "status": "Stádas", + "board_note_first": "An chéad nóta", + "board_note_second": "An dara nóta", + "board_note_third": "An tríú nóta", + "board_status_todo": "Le Déanamh", + "board_status_progress": "Ar Siúl", + "board_status_done": "Déanta", + "presentation": "Cur i Láthair", + "presentation_slide": "Sleamhnán cur i láthair", + "presentation_slide_first": "An chéad sleamhnán", + "presentation_slide_second": "An dara sleamhnán", + "background": "Cúlra" + }, + "sql_init": { + "db_not_initialized_desktop": "Níl an bunachar sonraí tosaithe, lean na treoracha ar an scáileán le do thoil.", + "db_not_initialized_server": "Níl an bunachar sonraí tosaithe, tabhair cuairt ar an leathanach socraithe - http://[your-server-host]:{{port}} le treoracha a fheiceáil maidir le conas Trilium a thosú." + }, + "desktop": { + "instance_already_running": "Tá sampla ag rith cheana féin, agus tá fócas á chur ar an sampla sin ina ionad." + } +} From 6c50664046e181845579db4ee76a1d2409b25df3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 22:41:33 +0100 Subject: [PATCH 089/560] Translated using Weblate (Romanian) Currently translated at 99.9% (1766 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ro/ --- .../src/translations/ro/translation.json | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 4823db67d3..843f90a03e 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -1761,8 +1761,8 @@ "show-recent-notes": "Afișează notițele recente" }, "electron_integration": { - "background-effects": "Activează efectele de fundal (doar pentru Windows 11)", - "background-effects-description": "Efectul Mica adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creând profunzime și un aspect modern. Opțiunea „Bară de titlu nativă” trebuie să fie dezactivată.", + "background-effects": "Activează efectele de fundal", + "background-effects-description": "Adaugă un fundal estompat și elegant ferestrelor aplicațiilor, creând profunzime și un aspect modern. Opțiunea „Bară de titlu nativă” trebuie să fie dezactivată.", "desktop-application": "Aplicația desktop", "native-title-bar": "Bară de titlu nativă", "native-title-bar-description": "Pentru Windows și macOS, dezactivarea bării de titlu native face aplicația să pară mai compactă. Pe Linux, păstrarea bării integrează mai bine aplicația cu restul sistemului de operare.", @@ -1781,7 +1781,8 @@ "geo-map": { "create-child-note-title": "Crează o notiță nouă și adaug-o pe hartă", "unable-to-load-map": "Nu s-a putut încărca harta.", - "create-child-note-instruction": "Click pe hartă pentru a crea o nouă notiță la acea poziție sau apăsați Escape pentru a anula." + "create-child-note-instruction": "Click pe hartă pentru a crea o nouă notiță la acea poziție sau apăsați Escape pentru a anula.", + "create-child-note-text": "Adaugă marcaj" }, "duration": { "days": "zile", @@ -2127,7 +2128,7 @@ }, "call_to_action": { "background_effects_title": "Efectele de fundal sunt acum stabile", - "background_effects_message": "Pe dispozitive cu Windows, efectele de fundal sunt complet stabile. Acestea adaugă un strop de culoare interfeței grafice prin estomparea fundalului din spatele ferestrei. Această tehnică este folosită și în alte aplicații precum Windows Explorer.", + "background_effects_message": "Pe dispozitive cu Windows și macOS, efectele de fundal sunt stabile. Acestea adaugă un strop de culoare interfeței grafice prin estomparea fundalului din spatele ferestrei.", "background_effects_button": "Activează efectele de fundal", "next_theme_title": "Încercați noua temă Trilium", "next_theme_message": "Utilizați tema clasică, doriți să încercați noua temă?", @@ -2281,5 +2282,14 @@ "pages_other": "{{count}} de pagini", "pages_alt": "Pagina {{pageNumber}}", "pages_loading": "Încărcare..." + }, + "platform_indicator": { + "available_on": "Disponibil pe {{platform}}" + }, + "mobile_tab_switcher": { + "title_one": "{{count}} tab", + "title_few": "{{count}} taburi", + "title_other": "{{count}} de taburi", + "more_options": "Mai multe opțiuni" } } From 703fe9a71b330608a9216901041a5777a1b53d55 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sun, 1 Feb 2026 22:39:07 +0100 Subject: [PATCH 090/560] Translated using Weblate (Romanian) Currently translated at 100.0% (389 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/ro/ --- apps/server/src/assets/translations/ro/server.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/ro/server.json b/apps/server/src/assets/translations/ro/server.json index e831c6f533..df2f73fc7c 100644 --- a/apps/server/src/assets/translations/ro/server.json +++ b/apps/server/src/assets/translations/ro/server.json @@ -257,7 +257,8 @@ "localization": "Limbă și regiune", "inbox-title": "Inbox", "command-palette": "Deschide paleta de comenzi", - "zen-mode": "Mod zen" + "zen-mode": "Mod zen", + "tab-switcher-title": "Schimbător de taburi" }, "notes": { "new-note": "Notiță nouă", From bc2915adb949eab9f7a076af8dede1adf9178577 Mon Sep 17 00:00:00 2001 From: ibs-allaow <255127489+ibs-allaow@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:27:22 +0100 Subject: [PATCH 091/560] Translated using Weblate (Arabic) Currently translated at 42.2% (49 of 116 strings) Translation: Trilium Notes/README Translate-URL: https://hosted.weblate.org/projects/trilium/readme/ar/ --- docs/README-ar.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/README-ar.md b/docs/README-ar.md index c92fc73ec2..7f850ba445 100644 --- a/docs/README-ar.md +++ b/docs/README-ar.md @@ -88,11 +88,11 @@ script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md) النصية](https://docs.triliumnotes.org/user-guide/scripts) المتقدمة * UI available in English, German, Spanish, French, Romanian, and Chinese (simplified and traditional) -* Direct [OpenID and TOTP - integration](https://docs.triliumnotes.org/user-guide/setup/server/mfa) for - more secure login -* [Synchronization](https://docs.triliumnotes.org/user-guide/setup/synchronization) - with self-hosted sync server +* تكامل مباشر مع [أنظمة الهوية المفتوحة OpenID وكلمات المرور المؤقتة + TOTP](https://docs.triliumnotes.org/user-guide/setup/server/mfa) لتسجيل دخول + أكثر أماناً +* [المزامنة](https://docs.triliumnotes.org/user-guide/setup/synchronization) مع + خادم مزامنة مُستضاف ذاتيًا * there are [3rd party services for hosting synchronisation server](https://docs.triliumnotes.org/user-guide/setup/server/cloud-hosting) * [Sharing](https://docs.triliumnotes.org/user-guide/advanced-usage/sharing) From 331a56277c91eee335d6093fc144d58f41e4aafb Mon Sep 17 00:00:00 2001 From: ibs-allaow <255127489+ibs-allaow@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:19:00 +0100 Subject: [PATCH 092/560] Translated using Weblate (Arabic) Currently translated at 59.7% (1055 of 1767 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ar/ --- apps/client/src/translations/ar/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json index 39c9bb8415..91fbba92ce 100644 --- a/apps/client/src/translations/ar/translation.json +++ b/apps/client/src/translations/ar/translation.json @@ -39,7 +39,9 @@ "search_note": "البحث عن الملاحظة بالاسم", "link_title": "عنوان الرابط", "button_add_link": "اضافة رابط", - "help_on_links": "مساعدة حول الارتباطات التشعبية" + "help_on_links": "مساعدة حول الارتباطات التشعبية", + "link_title_mirrors": "عنوان الرابط يعكس العنوان الحالي للملاحظة", + "link_title_arbitrary": "يمكن تغيير عنوان الرابط حسب الرغبة" }, "branch_prefix": { "edit_branch_prefix": "تعديل بادئة الفرع", From 84cc4194aa7b860f27280f4ddb94dfac9bc8a214 Mon Sep 17 00:00:00 2001 From: ibs-allaow <255127489+ibs-allaow@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:30:14 +0100 Subject: [PATCH 093/560] Translated using Weblate (Arabic) Currently translated at 61.1% (93 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/ar/ --- apps/website/src/translations/ar/translation.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/ar/translation.json b/apps/website/src/translations/ar/translation.json index 497ea0559d..ff246039ff 100644 --- a/apps/website/src/translations/ar/translation.json +++ b/apps/website/src/translations/ar/translation.json @@ -43,7 +43,10 @@ "title": "الانتاجية والسلامة", "jump_to_title": "الاوامر والبحث السريع", "revisions_content": "تُحفظ الملاحظات دوريًا في الخلفية، ويمكن استخدام التعديلات للمراجعة أو للتراجع عن التغييرات غير المقصودة. كما يمكن إنشاء التعديلات عند الطلب.", - "sync_content": "استخدم نسخة مستضافة ذاتيًا أو نسخة سحابية لمزامنة ملاحظاتك بسهولة عبر أجهزة متعددة، وللوصول إليها من هاتفك المحمول باستخدام تطبيق ويب تقدمي (PWA)." + "sync_content": "استخدم نسخة مستضافة ذاتيًا أو نسخة سحابية لمزامنة ملاحظاتك بسهولة عبر أجهزة متعددة، وللوصول إليها من هاتفك المحمول باستخدام تطبيق ويب تقدمي (PWA).", + "protected_notes_content": "احمِ معلوماتك الشخصية الحساسة عبر تشفير الملاحظات وقفلها خلف جلسة محمية بكلمة مرور.", + "jump_to_content": "انتقل بسرعة إلى الملاحظات أو أوامر واجهة المستخدم عبر التسلسل الهرمي من خلال البحث عن عناوينها، مع ميزة المطابقة التقريبية لتجاوز الأخطاء الإملائية أو الاختلافات البسيطة.", + "search_content": "أو ابحث عن نص داخل الملاحظات وضيّق نطاق البحث عبر التصفية حسب الملاحظة الرئيسية، أو حسب مستوى التفرع." }, "note_types": { "canvas_title": "مساحة العمل", From d25e7915d937fc2d8494d814434fd3611ef3a263 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 00:41:41 +0200 Subject: [PATCH 094/560] style/tree/context menu: use the proper color for menu item icons --- apps/client/src/menus/context_menu.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/menus/context_menu.ts b/apps/client/src/menus/context_menu.ts index 986ea94c48..415c0a2c6a 100644 --- a/apps/client/src/menus/context_menu.ts +++ b/apps/client/src/menus/context_menu.ts @@ -248,7 +248,7 @@ class ContextMenu { if ("uiIcon" in item || "checked" in item) { const icon = (item.checked ? "bx bx-check" : item.uiIcon); if (icon) { - $icon.addClass(icon); + $icon.addClass([icon, "tn-icon"]); } else { $icon.append(" "); } From a05691fd076e33e26840cadefecbd9dc4985a023 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 00:52:36 +0200 Subject: [PATCH 095/560] style/tree: add a CSS variable to customize the color of tree item icons --- apps/client/src/stylesheets/theme-next-dark.css | 1 + apps/client/src/stylesheets/theme-next-light.css | 1 + apps/client/src/stylesheets/theme-next/shell.css | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next-dark.css b/apps/client/src/stylesheets/theme-next-dark.css index 80acfe2e0a..e5c79afaf0 100644 --- a/apps/client/src/stylesheets/theme-next-dark.css +++ b/apps/client/src/stylesheets/theme-next-dark.css @@ -134,6 +134,7 @@ --left-pane-collapsed-border-color: #0009; --left-pane-background-color: #1f1f1f; --left-pane-text-color: #aaaaaa; + --left-pane-icon-color: currentColor; --left-pane-item-hover-background: #ffffff0d; --left-pane-item-selected-background: #ffffff25; --left-pane-item-selected-color: #dfdfdf; diff --git a/apps/client/src/stylesheets/theme-next-light.css b/apps/client/src/stylesheets/theme-next-light.css index 1e50200d9a..2d7862ae00 100644 --- a/apps/client/src/stylesheets/theme-next-light.css +++ b/apps/client/src/stylesheets/theme-next-light.css @@ -127,6 +127,7 @@ --left-pane-collapsed-border-color: #0000000d; --left-pane-background-color: #f2f2f2; --left-pane-text-color: #383838; + --left-pane-icon-color: currentColor; --left-pane-item-hover-background: rgba(0, 0, 0, 0.032); --left-pane-item-selected-background: white; --left-pane-item-selected-color: black; diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index 5a45ddf436..dd42c148be 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -769,9 +769,9 @@ body.mobile .fancytree-node > span { #left-pane .fancytree-custom-icon { margin-top: 0; /* Use this to align the icon with the tree view item's caption */ + color: var(--left-pane-icon-color); } - #left-pane span.fancytree-active .fancytree-title { font-weight: normal; } From 51d8b13a81524bbde547ef1e8b5dcaf4ac2b5eda Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 01:19:47 +0200 Subject: [PATCH 096/560] style/tree: tweak the color of tree item icons for the dark color scheme --- apps/client/src/stylesheets/theme-next-dark.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next-dark.css b/apps/client/src/stylesheets/theme-next-dark.css index e5c79afaf0..f8fb305726 100644 --- a/apps/client/src/stylesheets/theme-next-dark.css +++ b/apps/client/src/stylesheets/theme-next-dark.css @@ -134,7 +134,7 @@ --left-pane-collapsed-border-color: #0009; --left-pane-background-color: #1f1f1f; --left-pane-text-color: #aaaaaa; - --left-pane-icon-color: currentColor; + --left-pane-icon-color: #c5c5c5; --left-pane-item-hover-background: #ffffff0d; --left-pane-item-selected-background: #ffffff25; --left-pane-item-selected-color: #dfdfdf; From 6e792f9735425fb3e5795f0d5bac45d48cbcf709 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 01:25:28 +0200 Subject: [PATCH 097/560] style/tree/tree item icons: fix color for tinted tree items --- apps/client/src/stylesheets/theme-next/shell.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index dd42c148be..18ab495907 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -769,7 +769,7 @@ body.mobile .fancytree-node > span { #left-pane .fancytree-custom-icon { margin-top: 0; /* Use this to align the icon with the tree view item's caption */ - color: var(--left-pane-icon-color); + color: var(--custom-color, var(--left-pane-icon-color)); } #left-pane span.fancytree-active .fancytree-title { From 110e9200b952a4586ffee5c12996b9de5c56af23 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 02:11:57 +0200 Subject: [PATCH 098/560] style/scrolling container: improve alignment when content centering is turned on, refactor --- .../src/widgets/containers/scrolling_container.css | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/containers/scrolling_container.css b/apps/client/src/widgets/containers/scrolling_container.css index a4be33cf29..0e590801c4 100644 --- a/apps/client/src/widgets/containers/scrolling_container.css +++ b/apps/client/src/widgets/containers/scrolling_container.css @@ -1,12 +1,17 @@ .scrolling-container { + --content-margin-inline: 24px; + overflow: auto; scroll-behavior: smooth; position: relative; - > .inline-title, > .note-detail > .note-detail-editable-text > .note-detail-editable-text-editor, > .note-list-widget:not(.full-height) .note-list-wrapper { - margin-inline: 24px; + margin-inline: var(--content-margin-inline); + } + + > .inline-title { + padding-inline: var(--content-margin-inline); } > .note-detail > .note-detail-editable-text > .note-detail-editable-text-editor { From 2c74697fb11b2bcd59550be548a1ffb9dc36ac49 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 02:22:04 +0200 Subject: [PATCH 099/560] style/text editor: tweak the content placeholder --- apps/client/src/stylesheets/theme-next/notes/text.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index 91fe7f9b1b..e025b23fb2 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -522,6 +522,10 @@ button.ck.ck-button:is(.ck-button-action, .ck-button-save, .ck-button-cancel).ck * EDITOR'S CONTENT */ +.note-detail-editable-text-editor > .ck-placeholder { + opacity: .5; +} + /* * Code Blocks */ From ff2a3d6a28c2f8364238a974e52d0553996ae7fb Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 02:56:46 +0200 Subject: [PATCH 100/560] client/search: fix menu dropdowns getting clipped --- apps/client/src/widgets/react/Collapsible.css | 4 ++++ apps/client/src/widgets/react/Collapsible.tsx | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/react/Collapsible.css b/apps/client/src/widgets/react/Collapsible.css index 7dca2f5651..a3222d20a8 100644 --- a/apps/client/src/widgets/react/Collapsible.css +++ b/apps/client/src/widgets/react/Collapsible.css @@ -17,6 +17,10 @@ .collapsible-body { height: 0; overflow: hidden; + + &.fully-expanded { + overflow: visible; + } } .collapsible-inner-body { diff --git a/apps/client/src/widgets/react/Collapsible.tsx b/apps/client/src/widgets/react/Collapsible.tsx index a6e1957b34..212de203dc 100644 --- a/apps/client/src/widgets/react/Collapsible.tsx +++ b/apps/client/src/widgets/react/Collapsible.tsx @@ -27,6 +27,7 @@ export function ExternallyControlledCollapsible({ title, children, className, ex const { height } = useElementSize(innerRef) ?? {}; const contentId = useUniqueName(); const [ transitionEnabled, setTransitionEnabled ] = useState(false); + const [ fullyExpanded, setFullyExpanded ] = useState(false); useEffect(() => { const timeout = setTimeout(() => { @@ -35,6 +36,21 @@ export function ExternallyControlledCollapsible({ title, children, className, ex return () => clearTimeout(timeout); }, []); + useEffect(() => { + if (expanded) { + if (transitionEnabled) { + const timeout = setTimeout(() => { + setFullyExpanded(true); + }, 250); + return () => clearTimeout(timeout); + } else { + setFullyExpanded(true); + } + } else { + setFullyExpanded(false); + } + }, [expanded, transitionEnabled]) + return (
    From 38489dbfeb16fdec127f8aea0264772aad0164f4 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 03:03:50 +0200 Subject: [PATCH 101/560] style/collapsible widget: fade content when expanding or collapsing --- apps/client/src/widgets/react/Collapsible.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/client/src/widgets/react/Collapsible.css b/apps/client/src/widgets/react/Collapsible.css index a3222d20a8..7acf628f71 100644 --- a/apps/client/src/widgets/react/Collapsible.css +++ b/apps/client/src/widgets/react/Collapsible.css @@ -25,17 +25,26 @@ .collapsible-inner-body { padding-top: 0.5em; + opacity: 0; } &.expanded { .collapsible-title .arrow { transform: rotate(90deg); } + + .collapsible-inner-body { + opacity: 1; + } } &.with-transition { .collapsible-body { transition: height 250ms ease-in; } + + .collapsible-inner-body { + transition: opacity 250ms ease-in; + } } } From 3f6f3d2565bbeffdc8a8e835a3a4265c913679bb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 01:32:42 +0000 Subject: [PATCH 102/560] Update dependency @redocly/cli to v2.15.1 --- apps/build-docs/package.json | 2 +- pnpm-lock.yaml | 112 +++++++---------------------------- 2 files changed, 24 insertions(+), 90 deletions(-) diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index ac5be7e9be..56fff334a8 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -11,7 +11,7 @@ "license": "AGPL-3.0-only", "packageManager": "pnpm@10.28.2", "devDependencies": { - "@redocly/cli": "2.15.0", + "@redocly/cli": "2.15.1", "archiver": "7.0.1", "fs-extra": "11.3.3", "react": "19.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68404cf8df..c35cdf37f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -156,8 +156,8 @@ importers: apps/build-docs: devDependencies: '@redocly/cli': - specifier: 2.15.0 - version: 2.15.0(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5) + specifier: 2.15.1 + version: 2.15.1(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5) archiver: specifier: 7.0.1 version: 7.0.1 @@ -3562,10 +3562,6 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -4245,10 +4241,6 @@ packages: '@phosphor-icons/web@2.1.2': resolution: {integrity: sha512-rPAR9o/bEcp4Cw4DEeZHXf+nlGCMNGkNDRizYHM47NLxz9vvEHp/Tt6FMK1NcWadzw/pFDPnRBGi/ofRya958A==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@playwright/test@1.58.1': resolution: {integrity: sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==} engines: {node: '>=18'} @@ -4629,27 +4621,27 @@ packages: '@redocly/ajv@8.17.2': resolution: {integrity: sha512-rcbDZOfXAgGEJeJ30aWCVVJvxV9ooevb/m1/SFblO2qHs4cqTk178gx7T/vdslf57EA4lTofrwsq5K8rxK9g+g==} - '@redocly/cli@2.15.0': - resolution: {integrity: sha512-PjqCE1HDSHgHOrNxixeJSrumy8an2O4rcjXCIfdiHAjB1HOlMEtdgrz5OCx9f0lzcOXrgi61ThFNvO5jG56tUw==} + '@redocly/cli@2.15.1': + resolution: {integrity: sha512-wnzIxQxqhcg9HQUbjxD++cnRpCI8pUUFw2YV9XlFcvDp1EpPy6QokSnZZL3TbC1PLqzTE2XnUycawoTPv9hBuA==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} hasBin: true '@redocly/config@0.22.2': resolution: {integrity: sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==} - '@redocly/config@0.41.2': - resolution: {integrity: sha512-G6muhdTKcEV2TECBFzuT905p4a27OgUtwBqRVnMx1JebO6i8zlm6bPB2H3fD1Hl+MiUpk7Jx2kwGmLVgpz5nIg==} + '@redocly/config@0.41.4': + resolution: {integrity: sha512-LaRKXpHyK5GxmgG2n2e8xp2NyUa8qZls3WMAVg5hKO4b2d7X5uU5F2jvH6JUTVdRW/VfStQqan5DQ1uQz7MVzg==} '@redocly/openapi-core@1.34.5': resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==} engines: {node: '>=18.17.0', npm: '>=9.5.0'} - '@redocly/openapi-core@2.15.0': - resolution: {integrity: sha512-q/2UM5tA9mgk4zaIDUkKOG9KBUqIdSIhp5DugHmFOszOE+WMiL23BIV40K79jNF9aSU3zF1p1c/Zu0UoBmBsZg==} + '@redocly/openapi-core@2.15.1': + resolution: {integrity: sha512-6OKY+ZgAnU2B1OoPQHXXWCXwNQQUn+8N7WfGMrpRZxorQsB9EcQs0rYofO4mquFzvmIgU2owf8cLaD771pv3BQ==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} - '@redocly/respect-core@2.15.0': - resolution: {integrity: sha512-0LFtQXNUE+e9OdGDLS+yt4RBx0JTGhM7UAaBC4tzLqPvhtbdWo/WB/WdasGIt4vMM9K47KivxPHmX13sSLEO2Q==} + '@redocly/respect-core@2.15.1': + resolution: {integrity: sha512-Qrbhv/TE0TkxNaoDv1hPtNcpMORQiSrU9R95ZtI6KevgUcuEK2GgmoXHTrtVdWdxnpqm8bESTxffcz7+etMjOQ==} engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'} '@replit/codemirror-indentation-markers@6.5.3': @@ -8803,10 +8795,6 @@ packages: foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - form-data-encoder@4.1.0: resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} engines: {node: '>= 18'} @@ -9050,10 +9038,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - hasBin: true - glob@13.0.0: resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} engines: {node: 20 || >=22} @@ -9961,9 +9945,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.2: resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} engines: {node: '>=10'} @@ -11688,10 +11669,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} @@ -16011,8 +15988,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16078,6 +16053,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -16230,8 +16207,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -16254,8 +16229,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16281,8 +16254,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-essentials@47.4.0': dependencies: @@ -16440,8 +16411,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -18561,15 +18530,6 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 @@ -19379,9 +19339,6 @@ snapshots: '@phosphor-icons/web@2.1.2': {} - '@pkgjs/parseargs@0.11.0': - optional: true - '@playwright/test@1.58.1': dependencies: playwright: 1.58.1 @@ -19780,14 +19737,14 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - '@redocly/cli@2.15.0(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)': + '@redocly/cli@2.15.1(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)': dependencies: '@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.9.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.34.0 - '@redocly/openapi-core': 2.15.0 - '@redocly/respect-core': 2.15.0 + '@redocly/openapi-core': 2.15.1 + '@redocly/respect-core': 2.15.1 abort-controller: 3.0.0 ajv: '@redocly/ajv@8.17.1' ajv-formats: 3.0.1(@redocly/ajv@8.17.1) @@ -19798,6 +19755,7 @@ snapshots: handlebars: 4.7.8 https-proxy-agent: 7.0.6 mobx: 6.15.0 + picomatch: 4.0.3 pluralize: 8.0.0 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -19820,7 +19778,7 @@ snapshots: '@redocly/config@0.22.2': {} - '@redocly/config@0.41.2': + '@redocly/config@0.41.4': dependencies: json-schema-to-ts: 2.7.2 @@ -19838,10 +19796,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@redocly/openapi-core@2.15.0': + '@redocly/openapi-core@2.15.1': dependencies: '@redocly/ajv': 8.17.2 - '@redocly/config': 0.41.2 + '@redocly/config': 0.41.4 ajv: '@redocly/ajv@8.17.2' ajv-formats: 3.0.1(@redocly/ajv@8.17.2) colorette: 1.4.0 @@ -19851,12 +19809,12 @@ snapshots: pluralize: 8.0.0 yaml-ast-parser: 0.0.43 - '@redocly/respect-core@2.15.0': + '@redocly/respect-core@2.15.1': dependencies: '@faker-js/faker': 7.6.0 '@noble/hashes': 1.8.0 '@redocly/ajv': 8.17.1 - '@redocly/openapi-core': 2.15.0 + '@redocly/openapi-core': 2.15.1 ajv: '@redocly/ajv@8.17.1' better-ajv-errors: 1.2.0(@redocly/ajv@8.17.1) colorette: 2.0.20 @@ -19864,6 +19822,7 @@ snapshots: jsonpath-rfc9535: 1.3.0 openapi-sampler: 1.6.2 outdent: 0.8.0 + picomatch: 4.0.3 '@replit/codemirror-indentation-markers@6.5.3(@codemirror/language@6.11.0)(@codemirror/state@6.5.2)(@codemirror/view@6.39.12)': dependencies: @@ -22020,7 +21979,7 @@ snapshots: archiver-utils@5.0.2: dependencies: - glob: 10.5.0 + glob: 13.0.0 graceful-fs: 4.2.11 is-stream: 2.0.1 lazystream: 1.0.1 @@ -25124,11 +25083,6 @@ snapshots: foreach@2.0.6: {} - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - form-data-encoder@4.1.0: {} form-data@4.0.5: @@ -25402,15 +25356,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.5.0: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@13.0.0: dependencies: minimatch: 10.1.1 @@ -26390,12 +26335,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: dependencies: async: 3.2.6 @@ -28589,11 +28528,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - path-scurry@2.0.0: dependencies: lru-cache: 11.2.4 From 177aedeaaedf84acd3c54afdf4bdfbc650d45d91 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 01:33:28 +0000 Subject: [PATCH 103/560] Update dependency @smithy/middleware-retry to v4.4.30 --- packages/ckeditor5/package.json | 2 +- pnpm-lock.yaml | 153 ++++++++++++++++++-------------- 2 files changed, 88 insertions(+), 67 deletions(-) diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json index d31e3a5ff1..af4b31a38a 100644 --- a/packages/ckeditor5/package.json +++ b/packages/ckeditor5/package.json @@ -16,7 +16,7 @@ "ckeditor5-premium-features": "47.4.0" }, "devDependencies": { - "@smithy/middleware-retry": "4.4.29", + "@smithy/middleware-retry": "4.4.30", "@types/jquery": "3.5.33" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68404cf8df..1a69c50d4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -917,8 +917,8 @@ importers: version: 47.4.0(bufferutil@4.0.9)(ckeditor5@47.4.0)(utf-8-validate@6.0.5) devDependencies: '@smithy/middleware-retry': - specifier: 4.4.29 - version: 4.4.29 + specifier: 4.4.30 + version: 4.4.30 '@types/jquery': specifier: 3.5.33 version: 3.5.33 @@ -5047,14 +5047,14 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.21.1': - resolution: {integrity: sha512-NUH8R4O6FkN8HKMojzbGg/5pNjsfTjlMmeFclyPfPaXXUrbr5TzhWgbf7t92wfrpCHRgpjyz7ffASIS3wX28aA==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.22.0': resolution: {integrity: sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==} engines: {node: '>=18.0.0'} + '@smithy/core@3.22.1': + resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} engines: {node: '>=18.0.0'} @@ -5103,16 +5103,16 @@ packages: resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.11': - resolution: {integrity: sha512-/WqsrycweGGfb9sSzME4CrsuayjJF6BueBmkKlcbeU5q18OhxRrvvKlmfw3tpDsK5ilx2XUJvoukwxHB0nHs/Q==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.12': resolution: {integrity: sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.29': - resolution: {integrity: sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==} + '@smithy/middleware-endpoint@4.4.13': + resolution: {integrity: sha512-x6vn0PjYmGdNuKh/juUJJewZh7MoQ46jYaJ2mvekF4EesMuFfrl4LaW/k97Zjf8PTCPQmPgMvwewg7eNoH9n5w==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.30': + resolution: {integrity: sha512-CBGyFvN0f8hlnqKH/jckRDz78Snrp345+PVk8Ux7pnkUCW97Iinse59lY78hBt04h1GZ6hjBN94BRwZy1xC8Bg==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -5131,6 +5131,10 @@ packages: resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} engines: {node: '>=18.0.0'} + '@smithy/node-http-handler@4.4.9': + resolution: {integrity: sha512-KX5Wml5mF+luxm1szW4QDz32e3NObgJ4Fyw+irhph4I/2geXwUy4jkIMUs5ZPGflRBeR6BUkC2wqIab4Llgm3w==} + engines: {node: '>=18.0.0'} + '@smithy/property-provider@4.2.8': resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} engines: {node: '>=18.0.0'} @@ -5159,14 +5163,14 @@ packages: resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.12': - resolution: {integrity: sha512-VKO/HKoQ5OrSHW6AJUmEnUKeXI1/5LfCwO9cwyao7CmLvGnZeM1i36Lyful3LK1XU7HwTVieTqO1y2C/6t3qtA==} - engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.11.1': resolution: {integrity: sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.11.2': + resolution: {integrity: sha512-SCkGmFak/xC1n7hKRsUr6wOnBTJ3L22Qd4e8H1fQIuKTAjntwgU8lrdMe7uHdiT2mJAOWA/60qaW9tiMu69n1A==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.12.0': resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} engines: {node: '>=18.0.0'} @@ -5235,6 +5239,10 @@ packages: resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} engines: {node: '>=18.0.0'} + '@smithy/util-stream@4.5.11': + resolution: {integrity: sha512-lKmZ0S/3Qj2OF5H1+VzvDLb6kRxGzZHq6f3rAsoSu5cTLGsn3v3VQBA8czkNNXlLjoFEtVu3OQT2jEeOtOE2CA==} + engines: {node: '>=18.0.0'} + '@smithy/util-uri-escape@4.2.0': resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} @@ -15293,7 +15301,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.21.1 + '@smithy/core': 3.22.0 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 @@ -15301,14 +15309,14 @@ snapshots: '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.30 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -15342,19 +15350,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.21.1 + '@smithy/core': 3.22.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.30 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -15374,12 +15382,12 @@ snapshots: dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.21.1 + '@smithy/core': 3.22.0 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.10.12 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -15404,7 +15412,7 @@ snapshots: '@smithy/node-http-handler': 4.4.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 tslib: 2.8.1 @@ -15516,7 +15524,7 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 '@aws-sdk/util-endpoints': 3.821.0 - '@smithy/core': 3.21.1 + '@smithy/core': 3.22.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -15536,19 +15544,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.21.1 + '@smithy/core': 3.22.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.30 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.12 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 @@ -16011,8 +16019,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16281,8 +16287,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-essentials@47.4.0': dependencies: @@ -16743,8 +16747,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -20193,7 +20195,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.21.1': + '@smithy/core@3.22.0': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -20206,7 +20208,7 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/core@3.22.0': + '@smithy/core@3.22.1': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -20214,7 +20216,7 @@ snapshots: '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-middleware': 4.2.8 - '@smithy/util-stream': 4.5.10 + '@smithy/util-stream': 4.5.11 '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 tslib: 2.8.1 @@ -20291,17 +20293,6 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.11': - dependencies: - '@smithy/core': 3.21.1 - '@smithy/middleware-serde': 4.2.9 - '@smithy/node-config-provider': 4.3.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.12.0 - '@smithy/url-parser': 4.2.8 - '@smithy/util-middleware': 4.2.8 - tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.12': dependencies: '@smithy/core': 3.22.0 @@ -20313,12 +20304,23 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.29': + '@smithy/middleware-endpoint@4.4.13': + dependencies: + '@smithy/core': 3.22.1 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.30': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.11.1 + '@smithy/smithy-client': 4.11.2 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -20351,6 +20353,14 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 + '@smithy/node-http-handler@4.4.9': + dependencies: + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 + tslib: 2.8.1 + '@smithy/property-provider@4.2.8': dependencies: '@smithy/types': 4.12.0 @@ -20392,16 +20402,6 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.10.12': - dependencies: - '@smithy/core': 3.21.1 - '@smithy/middleware-endpoint': 4.4.11 - '@smithy/middleware-stack': 4.2.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/types': 4.12.0 - '@smithy/util-stream': 4.5.10 - tslib: 2.8.1 - '@smithy/smithy-client@4.11.1': dependencies: '@smithy/core': 3.22.0 @@ -20412,6 +20412,16 @@ snapshots: '@smithy/util-stream': 4.5.10 tslib: 2.8.1 + '@smithy/smithy-client@4.11.2': + dependencies: + '@smithy/core': 3.22.1 + '@smithy/middleware-endpoint': 4.4.13 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.11 + tslib: 2.8.1 + '@smithy/types@4.12.0': dependencies: tslib: 2.8.1 @@ -20457,7 +20467,7 @@ snapshots: '@smithy/util-defaults-mode-browser@4.0.22': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.12 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 bowser: 2.11.0 tslib: 2.8.1 @@ -20468,7 +20478,7 @@ snapshots: '@smithy/credential-provider-imds': 4.0.6 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.12 + '@smithy/smithy-client': 4.11.1 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -20510,6 +20520,17 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 + '@smithy/util-stream@4.5.11': + dependencies: + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.9 + '@smithy/types': 4.12.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + '@smithy/util-uri-escape@4.2.0': dependencies: tslib: 2.8.1 From 1c260f58902462e44fd2e2e84b5f28d643663692 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 3 Feb 2026 01:34:19 +0000 Subject: [PATCH 104/560] Update dependency happy-dom to v20.5.0 --- apps/client/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 50 ++++++++++++++++++---------------------- 3 files changed, 25 insertions(+), 29 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index ca31f70a70..dc210480a6 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -78,7 +78,7 @@ "@types/reveal.js": "5.2.2", "@types/tabulator-tables": "6.3.1", "copy-webpack-plugin": "13.0.1", - "happy-dom": "20.4.0", + "happy-dom": "20.5.0", "lightningcss": "1.31.1", "script-loader": "0.7.2", "vite-plugin-static-copy": "3.2.0" diff --git a/package.json b/package.json index 8015f90bf6..2d66b6b943 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "eslint-config-prettier": "10.1.8", "eslint-plugin-playwright": "2.5.1", "eslint-plugin-simple-import-sort": "12.1.1", - "happy-dom": "20.4.0", + "happy-dom": "20.5.0", "http-server": "14.1.1", "jiti": "2.6.1", "js-yaml": "4.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68404cf8df..94d0c15c59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,8 +108,8 @@ importers: specifier: 12.1.1 version: 12.1.1(eslint@9.39.2(jiti@2.6.1)) happy-dom: - specifier: 20.4.0 - version: 20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.5.0 + version: 20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) http-server: specifier: 14.1.1 version: 14.1.1 @@ -151,7 +151,7 @@ importers: version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -361,8 +361,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.2)) happy-dom: - specifier: 20.4.0 - version: 20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + specifier: 20.5.0 + version: 20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) lightningcss: specifier: 1.31.1 version: 1.31.1 @@ -887,7 +887,7 @@ importers: version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -978,7 +978,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1038,7 +1038,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1098,7 +1098,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1165,7 +1165,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1232,7 +1232,7 @@ importers: version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -9170,8 +9170,8 @@ packages: engines: {node: '>=0.4.7'} hasBin: true - happy-dom@20.4.0: - resolution: {integrity: sha512-RDeQm3dT9n0A5f/TszjUmNCLEuPnMGv3Tv4BmNINebz/h17PA6LMBcxJ5FrcqltNBMh9jA/8ufgDdBYUdBt+eg==} + happy-dom@20.5.0: + resolution: {integrity: sha512-VQe+Q5CYiGOgcCERXhcfNsbnrN92FDEKciMH/x6LppU9dd0j4aTjCTlqONFOIMcAm/5JxS3+utowbXV1OoFr+g==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -16011,8 +16011,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16078,6 +16076,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -16281,8 +16281,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-essentials@47.4.0': dependencies: @@ -16743,8 +16741,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -21493,7 +21489,7 @@ snapshots: '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21510,7 +21506,7 @@ snapshots: pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21530,7 +21526,7 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -21546,7 +21542,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) @@ -21594,7 +21590,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@4.0.18': dependencies: @@ -25556,7 +25552,7 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 - happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): + happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/node': 24.10.9 '@types/whatwg-mimetype': 3.0.2 @@ -32022,7 +32018,7 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) @@ -32049,7 +32045,7 @@ snapshots: '@types/node': 24.10.9 '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.18(vitest@4.0.18) - happy-dom: 20.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) + happy-dom: 20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - jiti From 634e0b6d3034d97fdd318c3f25e726fd8928a5f9 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 3 Feb 2026 18:04:08 +0200 Subject: [PATCH 105/560] feat(mobile/note_actions): integrate note info --- apps/client/src/widgets/layout/StatusBar.tsx | 16 +++++----- .../mobile_widgets/mobile_detail_menu.tsx | 31 +++++++++++++++++-- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index bfc9b02648..c2b8b5f697 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -212,8 +212,8 @@ export function getLocaleName(locale: Locale | null | undefined) { //#region Note info & Similar interface NoteInfoContext extends StatusBarContext { - similarNotesShown: boolean; - setSimilarNotesShown: (value: boolean) => void; + similarNotesShown?: boolean; + setSimilarNotesShown?: (value: boolean) => void; } export function NoteInfoBadge(context: NoteInfoContext) { @@ -225,7 +225,7 @@ export function NoteInfoBadge(context: NoteInfoContext) { // Keyboard shortcut. useTriliumEvent("toggleRibbonTabNoteInfo", () => enabled && dropdownRef.current?.show()); - useTriliumEvent("toggleRibbonTabSimilarNotes", () => setSimilarNotesShown(!similarNotesShown)); + useTriliumEvent("toggleRibbonTabSimilarNotes", () => setSimilarNotesShown && setSimilarNotesShown(!similarNotesShown)); return (enabled && ; +export function NoteInfoContent({ note, setSimilarNotesShown, noteType, dropdownRef }: Pick & { + dropdownRef?: RefObject; noteType: NoteType; }) { const { metadata, ...sizeProps } = useNoteMetadata(note); @@ -262,13 +262,13 @@ function NoteInfoContent({ note, setSimilarNotesShown, noteType, dropdownRef }: } /> - { - dropdownRef.current?.hide(); + dropdownRef?.current?.hide(); setSimilarNotesShown(true); }} - /> + />} ); } diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index dc0c5e89cd..769ac20ab4 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -4,6 +4,7 @@ import FNote, { NotePathRecord } from "../../entities/fnote"; import { t } from "../../services/i18n"; import note_create from "../../services/note_create"; import { BacklinksList, useBacklinkCount } from "../FloatingButtonsDefinitions"; +import { NoteInfoContent } from "../layout/StatusBar"; import ActionButton from "../react/ActionButton"; import { FormDropdownDivider, FormListItem } from "../react/FormList"; import { useNoteContext } from "../react/hooks"; @@ -18,6 +19,7 @@ export default function MobileDetailMenu() { const isMainContext = noteContext?.isMainContext(); const [ backlinksModalShown, setBacklinksModalShown ] = useState(false); const [ notePathsModalShown, setNotePathsModalShown ] = useState(false); + const [ noteInfoModalShown, setNoteInfoModalShown ] = useState(false); const sortedNotePaths = useSortedNotePaths(note, hoistedNoteId); const backlinksCount = useBacklinkCount(note, viewScope?.viewMode === "default"); @@ -72,6 +74,11 @@ export default function MobileDetailMenu() { >{t("close_pane_button.close_this_pane")} } + setNoteInfoModalShown(true)} + >{t("note_info_widget.title")} + } /> ) : ( @@ -86,13 +93,19 @@ export default function MobileDetailMenu() { <> + ), document.body)}
    ); } -function BacklinksModal({ note, modalShown, setModalShown }: { note: FNote | null | undefined, modalShown: boolean, setModalShown: (shown: boolean) => void }) { +interface WithModal { + modalShown: boolean; + setModalShown: (shown: boolean) => void; +} + +function BacklinksModal({ note, modalShown, setModalShown }: { note: FNote | null | undefined } & WithModal) { return ( void }) { +function NotePathsModal({ note, modalShown, notePath, sortedNotePaths, setModalShown }: { note: FNote | null | undefined, sortedNotePaths: NotePathRecord[] | undefined, notePath: string | null | undefined } & WithModal) { return ( ); } + +function NoteInfoModal({ note, modalShown, setModalShown }: { note: FNote | null | undefined } & WithModal) { + return ( + setModalShown(false)} + > + {note && } + + ); +} From c7265017b3314d534ff58fcea742f67e4d4dbcb1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 3 Feb 2026 18:09:02 +0200 Subject: [PATCH 106/560] feat(mobile/note_actions): integrate styling for note info --- apps/client/src/widgets/layout/StatusBar.css | 56 ++++++++++---------- apps/client/src/widgets/layout/StatusBar.tsx | 4 +- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index 6418630dba..c1dad02671 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -58,33 +58,6 @@ .dropdown-note-info { padding: 1em !important; - - ul { - --row-block-margin: .2em; - - list-style-type: none; - padding: 0; - margin: 0; - margin-top: calc(0px - var(--row-block-margin)); - margin-bottom: 12px; - display: table; - - li { - display: table-row; - - > strong { - display: table-cell; - padding: var(--row-block-margin) 0; - opacity: .5; - } - - > span { - display: table-cell; - user-select: text; - padding-left: 2em; - } - } - } } .dropdown-note-paths { @@ -154,6 +127,35 @@ } +body.experimental-feature-new-layout .note-info-content { + ul { + --row-block-margin: .2em; + + list-style-type: none; + padding: 0; + margin: 0; + margin-top: calc(0px - var(--row-block-margin)); + margin-bottom: 12px; + display: table; + + li { + display: table-row; + + > strong { + display: table-cell; + padding: var(--row-block-margin) 0; + opacity: .5; + } + + > span { + display: table-cell; + user-select: text; + padding-left: 2em; + } + } + } +} + .bottom-panel { margin: 0 !important; padding: 0; diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx index c2b8b5f697..c608c8f203 100644 --- a/apps/client/src/widgets/layout/StatusBar.tsx +++ b/apps/client/src/widgets/layout/StatusBar.tsx @@ -251,7 +251,7 @@ export function NoteInfoContent({ note, setSimilarNotesShown, noteType, dropdown const noteTypeMapping = useMemo(() => NOTE_TYPES.find(t => t.type === noteType), [ noteType ]); return ( - <> +
      {originalFileName && } @@ -269,7 +269,7 @@ export function NoteInfoContent({ note, setSimilarNotesShown, noteType, dropdown setSimilarNotesShown(true); }} />} - +
    ); } From 52b41b1bb0e74a2f2e65e05cee934dc630224c88 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 3 Feb 2026 18:18:57 +0200 Subject: [PATCH 107/560] feat(mobile/note_actions): integrate similar notes --- apps/client/src/widgets/layout/StatusBar.css | 13 +++++++---- .../mobile_widgets/mobile_detail_menu.tsx | 23 +++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css index c1dad02671..a0b22c8d26 100644 --- a/apps/client/src/widgets/layout/StatusBar.css +++ b/apps/client/src/widgets/layout/StatusBar.css @@ -117,10 +117,6 @@ } - div.similar-notes-widget div.similar-notes-wrapper { - max-height: unset; - } - button.select-button:not(:focus-visible) { outline: none; } @@ -156,6 +152,15 @@ body.experimental-feature-new-layout .note-info-content { } } +body.experimental-feature-new-layout div.similar-notes-widget div.similar-notes-wrapper { + max-height: unset; +} + +body.experimental-feature-new-layout.mobile div.similar-notes-widget div.similar-notes-wrapper { + max-height: unset; + padding: 0; +} + .bottom-panel { margin: 0 !important; padding: 0; diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 769ac20ab4..3a89bdec85 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -12,6 +12,7 @@ import Modal from "../react/Modal"; import { NoteContextMenu } from "../ribbon/NoteActions"; import NoteActionsCustom from "../ribbon/NoteActionsCustom"; import { NotePathsWidget, useSortedNotePaths } from "../ribbon/NotePathsTab"; +import SimilarNotesTab from "../ribbon/SimilarNotesTab"; export default function MobileDetailMenu() { const { note, noteContext, parentComponent, ntxId, viewScope, hoistedNoteId } = useNoteContext(); @@ -20,6 +21,7 @@ export default function MobileDetailMenu() { const [ backlinksModalShown, setBacklinksModalShown ] = useState(false); const [ notePathsModalShown, setNotePathsModalShown ] = useState(false); const [ noteInfoModalShown, setNoteInfoModalShown ] = useState(false); + const [ similarNotesModalShown, setSimilarNotesModalShown ] = useState(false); const sortedNotePaths = useSortedNotePaths(note, hoistedNoteId); const backlinksCount = useBacklinkCount(note, viewScope?.viewMode === "default"); @@ -74,10 +76,8 @@ export default function MobileDetailMenu() { >{t("close_pane_button.close_this_pane")} } - setNoteInfoModalShown(true)} - >{t("note_info_widget.title")} + setNoteInfoModalShown(true)} >{t("note_info_widget.title")} + setSimilarNotesModalShown(true)}>{t("similar_notes.title")} } /> @@ -94,6 +94,7 @@ export default function MobileDetailMenu() { + ), document.body)} @@ -153,3 +154,17 @@ function NoteInfoModal({ note, modalShown, setModalShown }: { note: FNote | null
    ); } + +function SimilarNotesModal({ note, modalShown, setModalShown }: { note: FNote | null | undefined } & WithModal) { + return ( + setModalShown(false)} + > + + + ); +} From 0d8453f6a76009251476df79d2e5d8f7744b1b5a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Tue, 3 Feb 2026 18:58:04 +0200 Subject: [PATCH 108/560] feat(mobile/note_actions): integrate code language switcher --- apps/client/src/stylesheets/style.css | 1 + .../mobile_widgets/mobile_detail_menu.css | 3 ++ .../mobile_widgets/mobile_detail_menu.tsx | 38 ++++++++++++++++- .../src/widgets/ribbon/BasicPropertiesTab.tsx | 42 +++++++++---------- 4 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 apps/client/src/widgets/mobile_widgets/mobile_detail_menu.css diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index e3d3f5279f..cac9bc2989 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -409,6 +409,7 @@ body.desktop .tabulator-popup-container, .dropdown-menu.static { box-shadow: unset; + backdrop-filter: unset !important; } .dropend .dropdown-toggle::after { diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.css b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.css new file mode 100644 index 0000000000..f3e1503471 --- /dev/null +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.css @@ -0,0 +1,3 @@ +.code-note-switcher-modal .dropdown-menu { + background: none !important; +} diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 3a89bdec85..53bb58c50e 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,14 +1,18 @@ +import "./mobile_detail_menu.css"; + import { createPortal, useState } from "preact/compat"; import FNote, { NotePathRecord } from "../../entities/fnote"; import { t } from "../../services/i18n"; import note_create from "../../services/note_create"; +import server from "../../services/server"; import { BacklinksList, useBacklinkCount } from "../FloatingButtonsDefinitions"; import { NoteInfoContent } from "../layout/StatusBar"; import ActionButton from "../react/ActionButton"; import { FormDropdownDivider, FormListItem } from "../react/FormList"; -import { useNoteContext } from "../react/hooks"; +import { useNoteContext, useNoteProperty } from "../react/hooks"; import Modal from "../react/Modal"; +import { NoteTypeCodeNoteList, useMimeTypes } from "../ribbon/BasicPropertiesTab"; import { NoteContextMenu } from "../ribbon/NoteActions"; import NoteActionsCustom from "../ribbon/NoteActionsCustom"; import { NotePathsWidget, useSortedNotePaths } from "../ribbon/NotePathsTab"; @@ -22,6 +26,7 @@ export default function MobileDetailMenu() { const [ notePathsModalShown, setNotePathsModalShown ] = useState(false); const [ noteInfoModalShown, setNoteInfoModalShown ] = useState(false); const [ similarNotesModalShown, setSimilarNotesModalShown ] = useState(false); + const [ codeNoteSwitcherModalShown, setCodeNoteSwitcherModalShown ] = useState(false); const sortedNotePaths = useSortedNotePaths(note, hoistedNoteId); const backlinksCount = useBacklinkCount(note, viewScope?.viewMode === "default"); @@ -76,7 +81,8 @@ export default function MobileDetailMenu() { >{t("close_pane_button.close_this_pane")} } - setNoteInfoModalShown(true)} >{t("note_info_widget.title")} + {note.type === "code" && setCodeNoteSwitcherModalShown(true)}>{t("status_bar.code_note_switcher")}} + setNoteInfoModalShown(true)}>{t("note_info_widget.title")} setSimilarNotesModalShown(true)}>{t("similar_notes.title")} } @@ -95,6 +101,7 @@ export default function MobileDetailMenu() { + ), document.body)} @@ -168,3 +175,30 @@ function SimilarNotesModal({ note, modalShown, setModalShown }: { note: FNote |
    ); } + +function CodeNoteSwitcherModal({ note, modalShown, setModalShown }: { note: FNote | null | undefined } & WithModal) { + const currentNoteMime = useNoteProperty(note, "mime"); + const mimeTypes = useMimeTypes(); + + return ( + setModalShown(false)} + > +
    + {note && { + server.put(`notes/${note.noteId}/type`, { type, mime }); + setModalShown(false); + }} + // setModalShown={() => setModalShown(true)} + />} +
    +
    + ); +} diff --git a/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx b/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx index 9b800bebb9..5dbd0d29cb 100644 --- a/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx +++ b/apps/client/src/widgets/ribbon/BasicPropertiesTab.tsx @@ -1,5 +1,4 @@ import { MimeType, NoteType, ToggleInParentResponse } from "@triliumnext/commons"; -import { ComponentChildren } from "preact"; import { createPortal } from "preact/compat"; import { Dispatch, StateUpdater, useCallback, useEffect, useMemo, useState } from "preact/hooks"; @@ -117,19 +116,18 @@ export function NoteTypeDropdownContent({ currentNoteType, currentNoteMime, note onClick={() => changeNoteType(type, mime)} >{title} ); - } else { - return ( - <> - - - {title} - - - ); } + return ( + <> + + + {title} + + + ); })} {!noCodeNotes && } @@ -141,7 +139,7 @@ export function NoteTypeCodeNoteList({ currentMimeType, mimeTypes, changeNoteTyp currentMimeType?: string; mimeTypes: MimeType[]; changeNoteType(type: NoteType, mime: string): void; - setModalShown(shown: boolean): void; + setModalShown?(shown: boolean): void; }) { return ( <> @@ -155,8 +153,10 @@ export function NoteTypeCodeNoteList({ currentMimeType, mimeTypes, changeNoteTyp ))} - - setModalShown(true)}>{t("basic_properties.configure_code_notes")} + {setModalShown && <> + + setModalShown(true)}>{t("basic_properties.configure_code_notes")} + } ); } @@ -195,7 +195,7 @@ function ProtectedNoteSwitch({ note }: { note?: FNote | null }) { onChange={(shouldProtect) => note && protected_session.protectNote(note.noteId, shouldProtect, false)} /> - ) + ); } function EditabilitySelect({ note }: { note?: FNote | null }) { @@ -417,9 +417,9 @@ function findTypeTitle(type?: NoteType, mime?: string | null) { const found = mimeTypes.find((mt) => mt.mime === mime); return found ? found.title : mime; - } else { - const noteType = NOTE_TYPES.find((nt) => nt.type === type); - - return noteType ? noteType.title : type; } + const noteType = NOTE_TYPES.find((nt) => nt.type === type); + + return noteType ? noteType.title : type; + } From e951d60800469298790ccb030e91f8570795edc7 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 20:54:56 +0200 Subject: [PATCH 109/560] style/options: hide collection properties --- apps/client/src/stylesheets/theme-next/pages.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/stylesheets/theme-next/pages.css b/apps/client/src/stylesheets/theme-next/pages.css index f323d00005..e6125e80e2 100644 --- a/apps/client/src/stylesheets/theme-next/pages.css +++ b/apps/client/src/stylesheets/theme-next/pages.css @@ -156,6 +156,10 @@ --preferred-max-content-width: var(--options-card-max-width); } +.note-split.options .collection-properties { + visibility: hidden; +} + /* Create a gap at the top of the option pages */ .note-detail-content-widget-content.options>*:first-child { margin-top: var(--options-first-item-top-margin, 1em); From c42c06d048e148534ba8a572252d8b09675a0aa7 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 3 Feb 2026 21:01:08 +0200 Subject: [PATCH 110/560] style/global menu: use proper heading for the development options section --- apps/client/src/widgets/buttons/global_menu.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/client/src/widgets/buttons/global_menu.tsx b/apps/client/src/widgets/buttons/global_menu.tsx index 95a3b8b946..0986c8ad29 100644 --- a/apps/client/src/widgets/buttons/global_menu.tsx +++ b/apps/client/src/widgets/buttons/global_menu.tsx @@ -105,8 +105,7 @@ function BrowserOnlyOptions() { function DevelopmentOptions({ dropStart }: { dropStart: boolean }) { return <> - - Development Options + {experimentalFeatures.map((feature) => ( From bb05aeeaf79a4504c0965f5bae56aecf66525753 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 4 Feb 2026 00:44:54 +0200 Subject: [PATCH 111/560] style/split: tweak transition for the current split indicator --- apps/client/src/stylesheets/theme-next/shell.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index 18ab495907..fae4001f08 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -1272,7 +1272,7 @@ body.layout-horizontal #rest-pane > .classic-toolbar-widget { #center-pane .note-split { padding-top: 2px; background-color: var(--note-split-background-color, var(--main-background-color)); - transition: border-color 250ms ease-in; + transition: border-color 150ms ease-out; border: 2px solid transparent; } From 563463782c2ee5efe92788b337a085232c8fde72 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 01:51:41 +0000 Subject: [PATCH 112/560] Update dependency @ckeditor/ckeditor5-dev-build-tools to v54.3.3 --- packages/ckeditor5-admonition/package.json | 2 +- packages/ckeditor5-footnotes/package.json | 2 +- .../ckeditor5-keyboard-marker/package.json | 2 +- packages/ckeditor5-math/package.json | 2 +- packages/ckeditor5-mermaid/package.json | 2 +- pnpm-lock.yaml | 44 ++++++++++++------- 6 files changed, 33 insertions(+), 21 deletions(-) diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 2175a0c349..862f2aeae1 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -21,7 +21,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.3", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.54.0", diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index dddd60910e..c11141537a 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -22,7 +22,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.3", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.54.0", diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index b34179332b..6134b0cd92 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -24,7 +24,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.3", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.54.0", diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index dce972d960..e544b058fa 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -24,7 +24,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.3", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.54.0", diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 4eae79a3ce..8658e48004 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -24,7 +24,7 @@ "ckeditor5-metadata.json" ], "devDependencies": { - "@ckeditor/ckeditor5-dev-build-tools": "54.3.2", + "@ckeditor/ckeditor5-dev-build-tools": "54.3.3", "@ckeditor/ckeditor5-inspector": ">=4.1.0", "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "8.54.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a62fc6eee1..fcaa38c691 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -926,8 +926,8 @@ importers: packages/ckeditor5-admonition: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.2 - version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.3 + version: 54.3.3(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -986,8 +986,8 @@ importers: packages/ckeditor5-footnotes: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.2 - version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.3 + version: 54.3.3(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1046,8 +1046,8 @@ importers: packages/ckeditor5-keyboard-marker: devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.2 - version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.3 + version: 54.3.3(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1113,8 +1113,8 @@ importers: version: 0.108.2 devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.2 - version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.3 + version: 54.3.3(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1180,8 +1180,8 @@ importers: version: 4.17.23 devDependencies: '@ckeditor/ckeditor5-dev-build-tools': - specifier: 54.3.2 - version: 54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) + specifier: 54.3.3 + version: 54.3.3(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3) '@ckeditor/ckeditor5-inspector': specifier: '>=4.1.0' version: 5.0.0 @@ -1899,8 +1899,8 @@ packages: '@ckeditor/ckeditor5-core@47.4.0': resolution: {integrity: sha512-upV/3x9fhgFWxVVtwR47zCOAvZKgP8a8N7UQOFwfs3Tr52+oE1gULWKTiS9079MBaXaIqtM/EbelNdvBh4gOGg==} - '@ckeditor/ckeditor5-dev-build-tools@54.3.2': - resolution: {integrity: sha512-xmK8/vbx5uVvkLwZ5kpW5A55LKYDRFQxYvh8rcybYG/B3yNgKrq7oJXvjVPTIqWiMT3JpjJ4J/NttIYDaXZhCw==} + '@ckeditor/ckeditor5-dev-build-tools@54.3.3': + resolution: {integrity: sha512-lP4I+mSwvMolUMhf9VzcHITjypJMIEgwQOsXcggpJIT9O9NCflTtOCtaY/gFJM3Jj2LUshH3sck+dbZUcx2Jgw==} engines: {node: '>=24.11.0', npm: '>=5.7.1'} hasBin: true @@ -9052,16 +9052,16 @@ packages: glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} @@ -15996,6 +15996,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16064,7 +16066,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@ckeditor/ckeditor5-dev-build-tools@54.3.2(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': + '@ckeditor/ckeditor5-dev-build-tools@54.3.3(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: '@rollup/plugin-commonjs': 28.0.9(rollup@4.52.0) '@rollup/plugin-json': 6.1.0(rollup@4.52.0) @@ -16197,6 +16199,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.4.0': dependencies: @@ -16215,6 +16219,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -16237,6 +16243,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16419,6 +16427,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16720,6 +16730,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: From 2e7ced8e6048c1a8f19344c5d0dc966aa8e4266a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Feb 2026 01:52:42 +0000 Subject: [PATCH 113/560] Update dependency @types/node to v24.10.10 --- package.json | 2 +- pnpm-lock.yaml | 311 ++++++++++++++++++++++++++----------------------- 2 files changed, 163 insertions(+), 150 deletions(-) diff --git a/package.json b/package.json index 2d66b6b943..b49a536ba0 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@triliumnext/server": "workspace:*", "@types/express": "5.0.6", "@types/js-yaml": "4.0.9", - "@types/node": "24.10.9", + "@types/node": "24.10.10", "@vitest/browser-webdriverio": "4.0.18", "@vitest/coverage-v8": "4.0.18", "@vitest/ui": "4.0.18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a62fc6eee1..84e2c0cad3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,14 +69,14 @@ importers: specifier: 4.0.9 version: 4.0.9 '@types/node': - specifier: 24.10.9 - version: 24.10.9 + specifier: 24.10.10 + version: 24.10.10 '@vitest/browser-webdriverio': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': specifier: 4.0.18 - version: 4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18) + version: 4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18) '@vitest/ui': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -127,7 +127,7 @@ importers: version: 0.18.0 rollup-plugin-webpack-stats: specifier: 2.1.10 - version: 2.1.10(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.1.10(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) tslib: specifier: 2.8.1 version: 2.8.1 @@ -145,13 +145,13 @@ importers: version: 2.0.1 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.10.10)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -335,7 +335,7 @@ importers: version: 5.0.0 '@prefresh/vite': specifier: 2.4.11 - version: 2.4.11(preact@10.28.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.4.11(preact@10.28.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -371,7 +371,7 @@ importers: version: 0.7.2 vite-plugin-static-copy: specifier: 3.2.0 - version: 3.2.0(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 3.2.0(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) apps/db-compare: dependencies: @@ -816,7 +816,7 @@ importers: version: 1.0.1 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: specifier: 8.19.0 version: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -841,10 +841,10 @@ importers: devDependencies: '@wxt-dev/auto-icons': specifier: 1.1.0 - version: 1.1.0(wxt@0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.1.0(wxt@0.20.13(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) wxt: specifier: 0.20.13 - version: 0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 0.20.13(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/website: dependencies: @@ -869,7 +869,7 @@ importers: devDependencies: '@preact/preset-vite': specifier: 2.10.3 - version: 2.10.3(@babel/core@7.28.0)(preact@10.28.3)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.10.3(@babel/core@7.28.0)(preact@10.28.3)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) eslint: specifier: 9.39.2 version: 9.39.2(jiti@2.6.1) @@ -884,10 +884,10 @@ importers: version: 0.4.2 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -933,7 +933,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.54.0 version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -942,7 +942,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -969,16 +969,16 @@ importers: version: 13.0.0(stylelint@17.1.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -993,7 +993,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.54.0 version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -1002,7 +1002,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1029,16 +1029,16 @@ importers: version: 13.0.0(stylelint@17.1.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1053,7 +1053,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.54.0 version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -1062,7 +1062,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1089,16 +1089,16 @@ importers: version: 13.0.0(stylelint@17.1.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1120,7 +1120,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.54.0 version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -1129,7 +1129,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1156,16 +1156,16 @@ importers: version: 13.0.0(stylelint@17.1.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1187,7 +1187,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.54.0 version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -1196,7 +1196,7 @@ importers: version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1223,16 +1223,16 @@ importers: version: 13.0.0(stylelint@17.1.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.23.3 version: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -5742,6 +5742,9 @@ packages: '@types/node@22.19.1': resolution: {integrity: sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==} + '@types/node@24.10.10': + resolution: {integrity: sha512-+0/4J266CBGPUq/ELg7QUHhN25WYjE0wYTPSQJn1xeu8DOlIOPxXxrNGiLmfAWl7HMMgWFWXpt9IDjMWrF5Iow==} + '@types/node@24.10.9': resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==} @@ -9052,16 +9055,16 @@ packages: glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} @@ -16215,6 +16218,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -16237,6 +16242,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.4.0': dependencies: @@ -16419,6 +16426,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16609,7 +16618,7 @@ snapshots: es-toolkit: 1.39.5 protobufjs: 7.5.0 - '@ckeditor/ckeditor5-package-tools@5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5)': + '@ckeditor/ckeditor5-package-tools@5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(bufferutil@4.0.9)(esbuild@0.27.2)(utf-8-validate@6.0.5)': dependencies: '@ckeditor/ckeditor5-dev-translations': 54.0.0(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)) '@ckeditor/ckeditor5-dev-utils': 54.0.0(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)) @@ -16628,7 +16637,7 @@ snapshots: stylelint-config-ckeditor5: 2.0.1(stylelint@16.26.1(typescript@5.0.4)) terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)) ts-loader: 9.5.4(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2)) - ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.0.4) + ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.0.4) typescript: 5.0.4 upath: 2.0.1 webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2) @@ -18416,26 +18425,26 @@ snapshots: '@inquirer/core': 9.2.1 '@inquirer/type': 2.0.0 - '@inquirer/confirm@5.1.21(@types/node@24.10.9)': + '@inquirer/confirm@5.1.21(@types/node@24.10.10)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.9) - '@inquirer/type': 3.0.10(@types/node@24.10.9) + '@inquirer/core': 10.3.2(@types/node@24.10.10) + '@inquirer/type': 3.0.10(@types/node@24.10.10) optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 optional: true - '@inquirer/core@10.3.2(@types/node@24.10.9)': + '@inquirer/core@10.3.2(@types/node@24.10.10)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.10.9) + '@inquirer/type': 3.0.10(@types/node@24.10.10) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 optional: true '@inquirer/core@9.2.1': @@ -18525,9 +18534,9 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.10(@types/node@24.10.9)': + '@inquirer/type@3.0.10(@types/node@24.10.10)': optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 optional: true '@isaacs/balanced-match@4.0.1': {} @@ -18967,23 +18976,23 @@ snapshots: dependencies: langium: 3.3.1 - '@microsoft/api-extractor-model@7.30.6(@types/node@24.10.9)': + '@microsoft/api-extractor-model@7.30.6(@types/node@24.10.10)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@24.10.9) + '@rushstack/node-core-library': 5.13.1(@types/node@24.10.10) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.8(@types/node@24.10.9)': + '@microsoft/api-extractor@7.52.8(@types/node@24.10.10)': dependencies: - '@microsoft/api-extractor-model': 7.30.6(@types/node@24.10.9) + '@microsoft/api-extractor-model': 7.30.6(@types/node@24.10.10) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@24.10.9) + '@rushstack/node-core-library': 5.13.1(@types/node@24.10.10) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3(@types/node@24.10.9) - '@rushstack/ts-command-line': 5.0.1(@types/node@24.10.9) + '@rushstack/terminal': 0.15.3(@types/node@24.10.10) + '@rushstack/ts-command-line': 5.0.1(@types/node@24.10.10) lodash: 4.17.23 minimatch: 3.0.8 resolve: 1.22.10 @@ -19365,18 +19374,18 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.3(@babel/core@7.28.0)(preact@10.28.3)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@preact/preset-vite@2.10.3(@babel/core@7.28.0)(preact@10.28.3)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@prefresh/vite': 2.4.11(preact@10.28.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@prefresh/vite': 2.4.11(preact@10.28.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@rollup/pluginutils': 5.1.4(rollup@4.52.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) debug: 4.4.3(supports-color@8.1.1) picocolors: 1.1.1 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-prerender-plugin: 0.5.11(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-prerender-plugin: 0.5.11(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - preact - rollup @@ -19397,7 +19406,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.11(preact@10.28.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@prefresh/vite@2.4.11(preact@10.28.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 @@ -19405,7 +19414,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.28.3 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20041,7 +20050,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.0': optional: true - '@rushstack/node-core-library@5.13.1(@types/node@24.10.9)': + '@rushstack/node-core-library@5.13.1(@types/node@24.10.10)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -20052,23 +20061,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.3(@types/node@24.10.9)': + '@rushstack/terminal@0.15.3(@types/node@24.10.10)': dependencies: - '@rushstack/node-core-library': 5.13.1(@types/node@24.10.9) + '@rushstack/node-core-library': 5.13.1(@types/node@24.10.10) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 - '@rushstack/ts-command-line@5.0.1(@types/node@24.10.9)': + '@rushstack/ts-command-line@5.0.1(@types/node@24.10.10)': dependencies: - '@rushstack/terminal': 0.15.3(@types/node@24.10.9) + '@rushstack/terminal': 0.15.3(@types/node@24.10.10) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -20654,7 +20663,7 @@ snapshots: '@types/appdmg@0.5.5': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 optional: true '@types/archiver@7.0.0': @@ -20670,11 +20679,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/bootstrap@5.2.10': dependencies: @@ -20688,7 +20697,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/responselike': 1.0.3 '@types/chai@5.2.2': @@ -20713,11 +20722,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.0 - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/cookie-parser@1.4.10(@types/express@5.0.6)': dependencies: @@ -20730,7 +20739,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/cssnano@5.1.3(postcss@8.5.6)': dependencies: @@ -20887,7 +20896,7 @@ snapshots: '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -20928,7 +20937,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 optional: true '@types/geojson-vt@3.2.5': @@ -20951,7 +20960,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/ini@4.1.1': {} @@ -20965,11 +20974,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/keyv@3.1.4': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/leaflet-gpx@1.3.8': dependencies: @@ -21019,11 +21028,11 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/node@16.9.1': {} @@ -21051,6 +21060,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@24.10.10': + dependencies: + undici-types: 7.16.0 + '@types/node@24.10.9': dependencies: undici-types: 7.16.0 @@ -21079,13 +21092,13 @@ snapshots: '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/resolve@1.20.2': {} '@types/responselike@1.0.3': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/retry@0.12.2': {} @@ -21104,7 +21117,7 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/serve-favicon@2.5.7': dependencies: @@ -21117,7 +21130,7 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/send': 0.17.5 '@types/serve-static@2.2.0': @@ -21131,7 +21144,7 @@ snapshots: '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/statuses@2.0.6': optional: true @@ -21146,7 +21159,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 24.10.9 + '@types/node': 24.10.10 form-data: 4.0.5 '@types/supercluster@7.1.3': @@ -21162,7 +21175,7 @@ snapshots: '@types/through2@2.0.41': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 '@types/tmp@0.2.6': {} @@ -21200,7 +21213,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 optional: true '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': @@ -21474,10 +21487,10 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21485,16 +21498,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)': + '@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)': dependencies: - '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/utils': 4.0.18 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21514,11 +21527,11 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18)': + '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -21530,9 +21543,9 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/expect@4.0.18': dependencies: @@ -21543,14 +21556,14 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.7.5(@types/node@24.10.9)(typescript@5.9.3) - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + msw: 2.7.5(@types/node@24.10.10)(typescript@5.9.3) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/pretty-format@4.0.18': dependencies: @@ -21578,7 +21591,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@4.0.18': dependencies: @@ -21771,12 +21784,12 @@ snapshots: '@webext-core/match-patterns@1.0.3': {} - '@wxt-dev/auto-icons@1.1.0(wxt@0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@wxt-dev/auto-icons@1.1.0(wxt@0.20.13(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: defu: 6.1.4 fs-extra: 11.3.3 sharp: 0.34.5 - wxt: 0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + wxt: 0.20.13(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@wxt-dev/browser@0.1.32': dependencies: @@ -22723,7 +22736,7 @@ snapshots: chrome-launcher@1.2.0: dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.2 @@ -24155,7 +24168,7 @@ snapshots: engine.io@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/cors': 2.8.19 - '@types/node': 24.10.9 + '@types/node': 24.10.10 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -26371,7 +26384,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -27817,12 +27830,12 @@ snapshots: ms@2.1.3: {} - msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3): + msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.21(@types/node@24.10.9) + '@inquirer/confirm': 5.1.21(@types/node@24.10.10) '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -29226,7 +29239,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.10.9 + '@types/node': 24.10.10 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -29825,11 +29838,11 @@ snapshots: '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29 optional: true - rollup-plugin-stats@1.5.5(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + rollup-plugin-stats@1.5.5(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) rollup-plugin-styles@4.0.0(rollup@4.52.0): dependencies: @@ -29858,13 +29871,13 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.52.0) rollup: 4.52.0 - rollup-plugin-webpack-stats@2.1.10(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + rollup-plugin-webpack-stats@2.1.10(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - rollup-plugin-stats: 1.5.5(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + rollup-plugin-stats: 1.5.5(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) rollup@4.52.0: dependencies: @@ -31413,14 +31426,14 @@ snapshots: typescript: 5.0.4 webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.2) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.0.4): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.10.9 + '@types/node': 24.10.10 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -31433,14 +31446,14 @@ snapshots: optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.9)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.10)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.10.9 + '@types/node': 24.10.10 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -31898,13 +31911,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@5.3.0(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite-node@5.3.0(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: cac: 6.7.14 es-module-lexer: 2.0.0 obug: 2.1.1 pathe: 2.0.3 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -31918,9 +31931,9 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.10.9)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.10.10)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.52.8(@types/node@24.10.9) + '@microsoft/api-extractor': 7.52.8(@types/node@24.10.10) '@rollup/pluginutils': 5.1.4(rollup@4.52.0) '@volar/typescript': 2.4.13 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -31931,27 +31944,27 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: svgo: 3.3.2 typescript: 5.9.3 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-prerender-plugin@0.5.11(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-prerender-plugin@0.5.11(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -31959,9 +31972,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -31970,7 +31983,7 @@ snapshots: rollup: 4.52.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.9 + '@types/node': 24.10.10 fsevents: 2.3.3 jiti: 2.6.1 less: 4.1.3 @@ -31981,10 +31994,10 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.9)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.10)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -32001,12 +32014,12 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 24.10.9 - '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.9)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@types/node': 24.10.10 + '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.10)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.23.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.18(vitest@4.0.18) happy-dom: 20.5.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -32500,7 +32513,7 @@ snapshots: dependencies: is-wsl: 3.1.0 - wxt@0.20.13(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + wxt@0.20.13(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@1natsu/wait-element': 4.1.2 '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.52.0) @@ -32544,8 +32557,8 @@ snapshots: publish-browser-extension: 3.0.3 scule: 1.3.0 unimport: 5.6.0 - vite: 7.3.1(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-node: 5.3.0(@types/node@24.10.9)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-node: 5.3.0(@types/node@24.10.10)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) web-ext-run: 0.2.4 transitivePeerDependencies: - '@types/node' From 416144265b540587bacfcc5e622df255f4ab497e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 12:06:29 +0200 Subject: [PATCH 114/560] fix(client): wrong positioning of modals due to mobile changes --- apps/client/src/stylesheets/style.css | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index e3d3f5279f..1d4bbf058d 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1681,13 +1681,15 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { background: var(--main-background-color); } - .modal-dialog { - margin: var(--bs-modal-margin); - max-width: 80%; - } + body.mobile { + .modal-dialog { + margin: var(--bs-modal-margin); + max-width: 80%; + } - .modal-content { - height: 100%; + .modal-content { + height: 100%; + } } } From 0f3f49915ea5560cbaf99a3534c24daf354ca55d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 12:22:54 +0200 Subject: [PATCH 115/560] fix(mobile): note actions should be at the bottom, not above launch bar --- apps/client/src/stylesheets/style.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 1d4bbf058d..4c520be7ec 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1552,8 +1552,8 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { max-height: calc(var(--tn-modal-max-height) - var(--dropdown-bottom)); } - body.mobile .modal-dialog .dropdown-menu.mobile-bottom-menu.show { - --dropdown-bottom: 0; + body.mobile .dropdown-menu.mobile-bottom-menu.show { + --dropdown-bottom: 0px; } #mobile-sidebar-container { From e38df0c731f5e3cb31ede0ff4823e02b35fcbbc6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 13:06:49 +0200 Subject: [PATCH 116/560] fix(mobile): note paths dialog doesn't trigger clone note to location --- apps/client/src/widgets/ribbon/NotePathsTab.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/client/src/widgets/ribbon/NotePathsTab.tsx b/apps/client/src/widgets/ribbon/NotePathsTab.tsx index 0b81ebe036..2ef9085331 100644 --- a/apps/client/src/widgets/ribbon/NotePathsTab.tsx +++ b/apps/client/src/widgets/ribbon/NotePathsTab.tsx @@ -1,7 +1,7 @@ import "./NotePathsTab.css"; import clsx from "clsx"; -import { useEffect, useMemo, useState } from "preact/hooks"; +import { useContext, useEffect, useMemo, useState } from "preact/hooks"; import FNote, { NotePathRecord } from "../../entities/fnote"; import { t } from "../../services/i18n"; @@ -9,7 +9,7 @@ import { NOTE_PATH_TITLE_SEPARATOR } from "../../services/tree"; import { useTriliumEvent } from "../react/hooks"; import LinkButton from "../react/LinkButton"; import NoteLink from "../react/NoteLink"; -import { joinElements } from "../react/react_utils"; +import { joinElements, ParentComponent } from "../react/react_utils"; import { TabContext } from "./ribbon-interface"; export default function NotePathsTab({ note, hoistedNoteId, notePath }: TabContext) { @@ -21,6 +21,7 @@ export function NotePathsWidget({ sortedNotePaths, currentNotePath }: { sortedNotePaths: NotePathRecord[] | undefined; currentNotePath?: string | null | undefined; }) { + const parentComponent = useContext(ParentComponent); return (
    <> @@ -40,7 +41,7 @@ export function NotePathsWidget({ sortedNotePaths, currentNotePath }: { parentComponent?.triggerCommand("cloneNoteIdsTo")} />
    From 48d06dcb06d92791c1b3d7d603ec86009998c371 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 13:17:28 +0200 Subject: [PATCH 117/560] fix(mobile): note context menu too tall in browser --- apps/client/src/stylesheets/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 4c520be7ec..90adc404f6 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -28,7 +28,7 @@ --bs-body-color: var(--main-text-color) !important; --bs-body-bg: var(--main-background-color) !important; --ck-mention-list-max-height: 500px; - --tn-modal-max-height: 90vh; + --tn-modal-max-height: 90svh; --tree-item-light-theme-max-color-lightness: 50; --tree-item-dark-theme-min-color-lightness: 75; From 99eec0c41e85b8f3d929d341a5a1da22c3783067 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 13:18:26 +0200 Subject: [PATCH 118/560] fix(mobile): duplicate promoted attributes --- apps/client/src/layouts/mobile_layout.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 27b0779921..9913949a52 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -20,7 +20,6 @@ import NoteTitleWidget from "../widgets/note_title.js"; import NoteTreeWidget from "../widgets/note_tree.js"; import NoteWrapperWidget from "../widgets/note_wrapper.js"; import NoteDetail from "../widgets/NoteDetail.jsx"; -import PromotedAttributes from "../widgets/PromotedAttributes.jsx"; import QuickSearchWidget from "../widgets/quick_search.js"; import { useNoteContext } from "../widgets/react/hooks.jsx"; import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx"; @@ -155,7 +154,6 @@ export default class MobileLayout { .child() .child() ) - .child() .child( new ScrollingContainer() .filling() From 671a05470e2c32af2ea1598f24cc5d84ae169fce Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 13:24:08 +0200 Subject: [PATCH 119/560] fix(mobile): missing badge style in tree --- apps/client/src/widgets/note_tree.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/note_tree.css b/apps/client/src/widgets/note_tree.css index 57e3460ac2..dbcb66cbc1 100644 --- a/apps/client/src/widgets/note_tree.css +++ b/apps/client/src/widgets/note_tree.css @@ -1,4 +1,4 @@ -#left-pane .tree-wrapper { +.tree-wrapper { .note-indicator-icon.subtree-hidden-badge { font-family: inherit !important; margin-inline: 0.5em; From 66e0f1ab19bdc5eaeaef930feb158bfd0b36c5b7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 13:29:45 +0200 Subject: [PATCH 120/560] chore(mobile/tree): slightly bigger expanders --- apps/client/src/layouts/mobile_layout.tsx | 9 --------- apps/client/src/stylesheets/theme-next/shell.css | 6 ------ 2 files changed, 15 deletions(-) diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 9913949a52..5b30fc2c90 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -67,12 +67,7 @@ const FANCYTREE_CSS = ` padding-inline-start: 10px; } -.fancytree-custom-icon { - font-size: 2em; -} - .fancytree-title { - font-size: 1.5em; margin-inline-start: 0.6em !important; } @@ -80,10 +75,6 @@ const FANCYTREE_CSS = ` padding: 5px; } -.fancytree-node .fancytree-expander:before { - font-size: 2em !important; -} - span.fancytree-expander { width: 24px !important; margin-inline-end: 5px; diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index fae4001f08..f665bcc843 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -739,12 +739,6 @@ body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-i transform: translateX(-25%); } -body.mobile .fancytree-expander::before, -body.mobile .fancytree-title, -body.mobile .fancytree-node > span { - font-size: 1rem !important; -} - @media (max-width: 991px) { body.mobile #mobile-sidebar-container { background-color: rgba(0, 0, 0, 0.5); From 70523574b0b6247a333d1a887f4f88155ed4ace1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 13:37:04 +0200 Subject: [PATCH 121/560] refactor(client): extract mobile layout CSS to dedicated file --- apps/client/src/layouts/mobile_layout.css | 72 ++++++++++++++++++++ apps/client/src/layouts/mobile_layout.tsx | 82 +---------------------- 2 files changed, 75 insertions(+), 79 deletions(-) create mode 100644 apps/client/src/layouts/mobile_layout.css diff --git a/apps/client/src/layouts/mobile_layout.css b/apps/client/src/layouts/mobile_layout.css new file mode 100644 index 0000000000..95b9dd8afb --- /dev/null +++ b/apps/client/src/layouts/mobile_layout.css @@ -0,0 +1,72 @@ +span.keyboard-shortcut, +kbd { + display: none; +} + +.dropdown-menu { + font-size: larger; +} + +.action-button { + background: none; + border: none; + cursor: pointer; + font-size: 1.25em; + padding-inline-start: 0.5em; + padding-inline-end: 0.5em; + color: var(--main-text-color); +} +.quick-search { + margin: 0; +} +.quick-search .dropdown-menu { + max-width: 350px; +} + +/* #region Tree */ +.tree-wrapper { + max-height: 100%; + margin-top: 0px; + overflow-y: auto; + contain: content; + padding-inline-start: 10px; +} + +.fancytree-title { + margin-inline-start: 0.6em !important; +} + +.fancytree-node { + padding: 5px; +} + +span.fancytree-expander { + width: 24px !important; + margin-inline-end: 5px; +} + +.fancytree-loading span.fancytree-expander { + width: 24px; + height: 32px; +} + +.fancytree-loading span.fancytree-expander:after { + width: 20px; + height: 20px; + margin-top: 4px; + border-width: 2px; + border-style: solid; +} + +.tree-wrapper .collapse-tree-button, +.tree-wrapper .scroll-to-active-note-button, +.tree-wrapper .tree-settings-button { + position: fixed; + margin-inline-end: 16px; + display: none; +} + +.tree-wrapper .unhoist-button { + font-size: 200%; +} +/* #endregion */ diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 5b30fc2c90..0f36f282c4 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -1,3 +1,5 @@ +import "./mobile_layout.css"; + import type AppContext from "../components/app_context.js"; import GlobalMenuWidget from "../widgets/buttons/global_menu.js"; import CloseZenModeButton from "../widgets/close_zen_button.js"; @@ -29,89 +31,11 @@ import SearchResult from "../widgets/search_result.jsx"; import MobileEditorToolbar from "../widgets/type_widgets/text/mobile_editor_toolbar.jsx"; import { applyModals } from "./layout_commons.js"; -const MOBILE_CSS = ` -`; - -const FANCYTREE_CSS = ` -`; - export default class MobileLayout { getRootWidget(appContext: typeof AppContext) { const rootContainer = new RootContainer(true) .setParent(appContext) .class("horizontal-layout") - .cssBlock(MOBILE_CSS) .child(new FlexContainer("column").id("mobile-sidebar-container")) .child( new FlexContainer("row") @@ -125,7 +49,7 @@ export default class MobileLayout { .css("padding-inline-start", "0") .css("padding-inline-end", "0") .css("contain", "content") - .child(new FlexContainer("column").filling().id("mobile-sidebar-wrapper").child(new QuickSearchWidget()).child(new NoteTreeWidget().cssBlock(FANCYTREE_CSS))) + .child(new FlexContainer("column").filling().id("mobile-sidebar-wrapper").child(new QuickSearchWidget()).child(new NoteTreeWidget())) ) .child( new ScreenContainer("detail", "row") From e021a54d2dfd3aad74ecf7cb0aacd09151df77bf Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 13:42:30 +0200 Subject: [PATCH 122/560] fix(mobile): formatting toolbar not appearing after read-only (closes #5368) --- .../text/mobile_editor_toolbar.tsx | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/text/mobile_editor_toolbar.tsx b/apps/client/src/widgets/type_widgets/text/mobile_editor_toolbar.tsx index 86e7129ef6..8b266b3612 100644 --- a/apps/client/src/widgets/type_widgets/text/mobile_editor_toolbar.tsx +++ b/apps/client/src/widgets/type_widgets/text/mobile_editor_toolbar.tsx @@ -1,8 +1,10 @@ -import { MutableRef, useCallback, useEffect, useRef, useState } from "preact/hooks"; -import { useNoteContext, useTriliumEvent } from "../../react/hooks"; import "./mobile_editor_toolbar.css"; -import { isIOS } from "../../../services/utils"; + import { CKTextEditor, ClassicEditor } from "@triliumnext/ckeditor5"; +import { MutableRef, useCallback, useEffect, useRef, useState } from "preact/hooks"; + +import { isIOS } from "../../../services/utils"; +import { useIsNoteReadOnly, useNoteContext, useNoteProperty, useTriliumEvent } from "../../react/hooks"; interface MobileEditorToolbarProps { inPopupEditor?: boolean; @@ -17,17 +19,13 @@ interface MobileEditorToolbarProps { export default function MobileEditorToolbar({ inPopupEditor }: MobileEditorToolbarProps) { const containerRef = useRef(null); const { note, noteContext, ntxId } = useNoteContext(); - const [ shouldDisplay, setShouldDisplay ] = useState(false); + const noteType = useNoteProperty(note, "type"); + const { isReadOnly } = useIsNoteReadOnly(note, noteContext); + const shouldDisplay = noteType === "text" && !isReadOnly; const [ dropdownActive, setDropdownActive ] = useState(false); usePositioningOniOS(!inPopupEditor, containerRef); - useEffect(() => { - noteContext?.isReadOnly().then(isReadOnly => { - setShouldDisplay(note?.type === "text" && !isReadOnly); - }); - }, [ note ]); - // Attach the toolbar from the CKEditor. useTriliumEvent("textEditorRefreshed", ({ ntxId: eventNtxId, editor }) => { if (eventNtxId !== ntxId || !containerRef.current) return; @@ -62,15 +60,15 @@ export default function MobileEditorToolbar({ inPopupEditor }: MobileEditorToolb return (
    -
    +
    - ) + ); } function usePositioningOniOS(enabled: boolean, wrapperRef: MutableRef) { const adjustPosition = useCallback(() => { if (!wrapperRef.current) return; - let bottom = window.innerHeight - (window.visualViewport?.height || 0); + const bottom = window.innerHeight - (window.visualViewport?.height || 0); wrapperRef.current.style.bottom = `${bottom}px`; }, []); From 8c848a4cb589bf6d0fcbb0741e819674a9a27a23 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 14:04:47 +0200 Subject: [PATCH 123/560] fix(mobile): wrong context activation logic when creating new split --- apps/client/src/stylesheets/style.css | 4 ++-- .../widgets/mobile_widgets/mobile_detail_menu.tsx | 12 ++++++++++-- apps/client/src/widgets/ribbon/NoteActions.tsx | 11 ++++++++--- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 90adc404f6..e94249741b 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2639,10 +2639,10 @@ iframe.print-iframe { } } - /* #root-widget.virtual-keyboard-opened .note-split:not(:focus-within) { + #root-widget.virtual-keyboard-opened .note-split:not(.active) { max-height: 80px; opacity: 0.4; - } */ + } } } diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index dc0c5e89cd..358a61ffc3 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -1,4 +1,5 @@ -import { createPortal, useState } from "preact/compat"; +import { Dropdown as BootstrapDropdown } from "bootstrap"; +import { createPortal, useRef, useState } from "preact/compat"; import FNote, { NotePathRecord } from "../../entities/fnote"; import { t } from "../../services/i18n"; @@ -13,6 +14,7 @@ import NoteActionsCustom from "../ribbon/NoteActionsCustom"; import { NotePathsWidget, useSortedNotePaths } from "../ribbon/NotePathsTab"; export default function MobileDetailMenu() { + const dropdownRef = useRef(null); const { note, noteContext, parentComponent, ntxId, viewScope, hoistedNoteId } = useNoteContext(); const subContexts = noteContext?.getMainContext().getSubContexts() ?? []; const isMainContext = noteContext?.isMainContext(); @@ -32,6 +34,7 @@ export default function MobileDetailMenu() {
    {note ? (
    @@ -60,7 +63,12 @@ export default function MobileDetailMenu() { {subContexts.length < 2 && <> parentComponent.triggerCommand("openNewNoteSplit", { ntxId })} + onClick={(e) => { + // We have to manually manage the hide because otherwise the old note context gets activated. + e.stopPropagation(); + dropdownRef.current?.hide(); + parentComponent.triggerCommand("openNewNoteSplit", { ntxId }); + }} icon="bx bx-dock-right" >{t("create_pane_button.create_new_split")} } diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index 51788085d2..daeab278cc 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -22,7 +22,7 @@ import MovePaneButton from "../buttons/move_pane_button"; import ActionButton from "../react/ActionButton"; import Dropdown from "../react/Dropdown"; import { FormDropdownDivider, FormDropdownSubmenu, FormListHeader, FormListItem, FormListToggleableItem } from "../react/FormList"; -import { useIsNoteReadOnly, useNoteContext, useNoteLabel, useNoteLabelBoolean, useNoteProperty, useTriliumEvent, useTriliumOption } from "../react/hooks"; +import { useIsNoteReadOnly, useNoteContext, useNoteLabel, useNoteLabelBoolean, useNoteProperty, useSyncedRef, useTriliumEvent, useTriliumOption } from "../react/hooks"; import { ParentComponent } from "../react/react_utils"; import { NoteTypeDropdownContent, useNoteBookmarkState, useShareState } from "./BasicPropertiesTab"; import NoteActionsCustom from "./NoteActionsCustom"; @@ -63,8 +63,13 @@ function RevisionsButton({ note }: { note: FNote }) { type ItemToFocus = "basic-properties"; -export function NoteContextMenu({ note, noteContext, extraItems }: { note: FNote, noteContext?: NoteContext, extraItems?: ComponentChildren; }) { - const dropdownRef = useRef(null); +export function NoteContextMenu({ note, noteContext, extraItems, dropdownRef: externalDropdownRef }: { + note: FNote, + noteContext?: NoteContext, + extraItems?: ComponentChildren; + dropdownRef?: RefObject; +}) { + const dropdownRef = useSyncedRef(externalDropdownRef, null); const parentComponent = useContext(ParentComponent); const noteType = useNoteProperty(note, "type") ?? ""; const [viewType] = useNoteLabel(note, "viewType"); From ab89f16e7c7ac4d56de3b9d99839753ef0fd41e1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 14:29:47 +0200 Subject: [PATCH 124/560] fix(mobile): unnecessary separator for custom note actions --- apps/client/src/widgets/ribbon/NoteActionsCustom.css | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/client/src/widgets/ribbon/NoteActionsCustom.css b/apps/client/src/widgets/ribbon/NoteActionsCustom.css index e0ad0eb8fb..3c2a2000ce 100644 --- a/apps/client/src/widgets/ribbon/NoteActionsCustom.css +++ b/apps/client/src/widgets/ribbon/NoteActionsCustom.css @@ -1,4 +1,3 @@ body.mobile .note-actions-custom:not(:empty) { margin-bottom: calc(var(--bs-dropdown-divider-margin-y) * 2); - border-top: 1px solid var(--bs-dropdown-divider-bg); } From 1e70d066bdbb7ec5a1eda217631f7571414cbab4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 14:39:58 +0200 Subject: [PATCH 125/560] fix(mobile/tab_switcher): wrong preview for relation map --- apps/client/src/widgets/mobile_widgets/TabSwitcher.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css index f401ee61b0..e46bb0a808 100644 --- a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css +++ b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css @@ -94,7 +94,8 @@ &.type-book, &.type-contentWidget, &.type-search, - &.type-empty { + &.type-empty, + &.type-relationMap { display: flex; align-items: center; justify-content: center; From c1ea94423b656cc6c1551ab1424efd7c17d526e4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 14:46:52 +0200 Subject: [PATCH 126/560] refactor(client): use CSS file for content renderer --- apps/client/src/services/content_renderer.css | 12 ++++++++++++ apps/client/src/services/content_renderer.ts | 15 ++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) create mode 100644 apps/client/src/services/content_renderer.css diff --git a/apps/client/src/services/content_renderer.css b/apps/client/src/services/content_renderer.css new file mode 100644 index 0000000000..a44fa54a29 --- /dev/null +++ b/apps/client/src/services/content_renderer.css @@ -0,0 +1,12 @@ +.rendered-content.no-preview { + display: flex; + flex-direction: column; + + & > div { + justify-content: space-around; + align-items: center; + height: 100%; + font-size: 500%; + flex-grow: 1; + } +} diff --git a/apps/client/src/services/content_renderer.ts b/apps/client/src/services/content_renderer.ts index 4fbf51024c..50fc94580d 100644 --- a/apps/client/src/services/content_renderer.ts +++ b/apps/client/src/services/content_renderer.ts @@ -1,3 +1,5 @@ +import "./content_renderer.css"; + import { normalizeMimeTypeForCKEditor } from "@triliumnext/commons"; import WheelZoom from 'vanilla-js-wheel-zoom'; @@ -71,18 +73,9 @@ export async function getRenderedContent(this: {} | { ctx: string }, entity: FNo $renderedContent.append($("
    ").append("
    This note is protected and to access it you need to enter password.
    ").append("
    ").append($button)); } else if (entity instanceof FNote) { - $renderedContent - .css("display", "flex") - .css("flex-direction", "column"); + $renderedContent.addClass("no-preview"); $renderedContent.append( - $("
    ") - .css("display", "flex") - .css("justify-content", "space-around") - .css("align-items", "center") - .css("height", "100%") - .css("font-size", "500%") - .css("flex-grow", "1") - .append($("").addClass(entity.getIcon())) + $("
    ").append($("").addClass(entity.getIcon())) ); if (entity.type === "webView" && entity.hasLabel("webViewSrc")) { From fa72eb2edbac25913655df9b0ee8b135cd75f9fc Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 14:53:00 +0200 Subject: [PATCH 127/560] fix(mobile/tab_switcher): view mode not displayed in title --- .../widgets/mobile_widgets/TabSwitcher.tsx | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx b/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx index 6ee84f0465..fc72a739a2 100644 --- a/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx +++ b/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx @@ -138,7 +138,6 @@ function Tab({ noteContext, containerRef, selectTab, activeNtxId }: { activeNtxId: string | null | undefined; }) { const { note } = noteContext; - const iconClass = useNoteIcon(note); const colorClass = note?.getColorClass() || ''; const workspaceTabBackgroundColorHue = getWorkspaceTabBackgroundColorHue(noteContext); const subContexts = noteContext.getSubContexts(); @@ -158,19 +157,7 @@ function Tab({ noteContext, containerRef, selectTab, activeNtxId }: { > {subContexts.map(subContext => ( -
    - {subContext.note && } - {subContext.note?.title ?? t("tab_row.new_tab")} - {subContext.isMainContext() && { - // We are closing a tab, so we need to prevent propagation for click (activate tab). - e.stopPropagation(); - appContext.tabManager.removeNoteContext(subContext.ntxId); - }} - />} -
    +
    @@ -180,6 +167,32 @@ function Tab({ noteContext, containerRef, selectTab, activeNtxId }: { ); } +function TabHeader({ noteContext, colorClass }: { noteContext: NoteContext, colorClass: string }) { + const iconClass = useNoteIcon(noteContext.note); + const [ navigationTitle, setNavigationTitle ] = useState(null); + + // Manage the title for read-only notes + useEffect(() => { + noteContext?.getNavigationTitle().then(setNavigationTitle); + }, [noteContext]); + + return ( +
    + {noteContext.note && } + {navigationTitle ?? noteContext.note?.title ?? t("tab_row.new_tab")} + {noteContext.isMainContext() && { + // We are closing a tab, so we need to prevent propagation for click (activate tab). + e.stopPropagation(); + appContext.tabManager.removeNoteContext(noteContext.ntxId); + }} + />} +
    + ); +} + function TabPreviewContent({ note }: { note: FNote | null }) { From af89a0a88370f055df86c37105fad514f7dd260e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 15:17:39 +0200 Subject: [PATCH 128/560] fix(new_layout): note title actions shown in non-standard view modes --- apps/client/src/widgets/layout/NoteTitleActions.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/layout/NoteTitleActions.tsx b/apps/client/src/widgets/layout/NoteTitleActions.tsx index 96a2e92963..7c4e68698a 100644 --- a/apps/client/src/widgets/layout/NoteTitleActions.tsx +++ b/apps/client/src/widgets/layout/NoteTitleActions.tsx @@ -1,25 +1,21 @@ import "./NoteTitleActions.css"; -import clsx from "clsx"; import { useEffect, useState } from "preact/hooks"; import NoteContext from "../../components/note_context"; import FNote from "../../entities/fnote"; import { t } from "../../services/i18n"; -import CollectionProperties from "../note_bars/CollectionProperties"; import { checkFullHeight, getExtendedWidgetType } from "../NoteDetail"; import { PromotedAttributesContent, usePromotedAttributeData } from "../PromotedAttributes"; -import SimpleBadge from "../react/Badge"; import Collapsible, { ExternallyControlledCollapsible } from "../react/Collapsible"; import { useNoteContext, useNoteLabel, useNoteProperty, useTriliumEvent, useTriliumOptionBool } from "../react/hooks"; -import NoteLink, { NewNoteLink } from "../react/NoteLink"; +import { NewNoteLink } from "../react/NoteLink"; import { useEditedNotes } from "../ribbon/EditedNotesTab"; import SearchDefinitionTab from "../ribbon/SearchDefinitionTab"; import NoteTypeSwitcher from "./NoteTypeSwitcher"; export default function NoteTitleActions() { - const { note, ntxId, componentId, noteContext } = useNoteContext(); - const isHiddenNote = note && note.noteId !== "_search" && note.noteId.startsWith("_"); + const { note, ntxId, componentId, noteContext, viewScope } = useNoteContext(); const noteType = useNoteProperty(note, "type"); return ( @@ -27,7 +23,7 @@ export default function NoteTitleActions() { {noteType === "search" && } - + {viewScope?.viewMode === "default" && }
    ); } From 06af5e15cd07160fcc7b0eeec1ba4c90cabe608d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 15:41:15 +0200 Subject: [PATCH 129/560] feat(mobile/tab_switcher): consider view scope for preview --- .../widgets/mobile_widgets/TabSwitcher.css | 3 +- .../widgets/mobile_widgets/TabSwitcher.tsx | 44 ++++++++++++------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css index e46bb0a808..895940be9f 100644 --- a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css +++ b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css @@ -95,7 +95,8 @@ &.type-contentWidget, &.type-search, &.type-empty, - &.type-relationMap { + &.type-relationMap, + &.tab-preview-placeholder { display: flex; align-items: center; justify-content: center; diff --git a/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx b/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx index fc72a739a2..ed3d735d1c 100644 --- a/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx +++ b/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx @@ -1,6 +1,7 @@ import "./TabSwitcher.css"; import clsx from "clsx"; +import { ComponentChild } from "preact"; import { createPortal, Fragment } from "preact/compat"; import { useCallback, useEffect, useRef, useState } from "preact/hooks"; @@ -11,6 +12,7 @@ import contextMenu from "../../menus/context_menu"; import { getHue, parseColor } from "../../services/css_class_manager"; import froca from "../../services/froca"; import { t } from "../../services/i18n"; +import type { ViewMode, ViewScope } from "../../services/link"; import { NoteContent } from "../collections/legacy/ListOrGridView"; import { LaunchBarActionButton } from "../launch_bar/launch_bar_widgets"; import { ICON_MAPPINGS } from "../note_bars/CollectionProperties"; @@ -20,6 +22,13 @@ import Icon from "../react/Icon"; import LinkButton from "../react/LinkButton"; import Modal from "../react/Modal"; +const VIEW_MODE_ICON_MAPPINGS: Record, string> = { + source: "bx bx-code", + "contextual-help": "bx bx-help-circle", + "note-map": "bx bxs-network-chart", + attachments: "bx bx-paperclip", +}; + export default function TabSwitcher() { const [ shown, setShown ] = useState(false); const mainNoteContexts = useMainNoteContexts(); @@ -158,9 +167,7 @@ function Tab({ noteContext, containerRef, selectTab, activeNtxId }: { {subContexts.map(subContext => ( -
    - -
    +
    ))}
    @@ -193,24 +200,31 @@ function TabHeader({ noteContext, colorClass }: { noteContext: NoteContext, colo ); } -function TabPreviewContent({ note }: { - note: FNote | null +function TabPreviewContent({ note, viewScope }: { + note: FNote | null, + viewScope: ViewScope | undefined }) { + let el: ComponentChild; + let isPlaceholder = true; + if (!note) { - return ; - } - - if (note.type === "book") { - return ; - } - - return ( - ; + } else if (note.type === "book") { + el = ; + } else if (viewScope?.viewMode !== "default") { + el = ; + } else { + el = + />; + isPlaceholder = false; + } + + return ( +
    {el}
    ); } From 7f891ef5237ed3963e06590b1a85b4e2be4f8b2f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 15:44:17 +0200 Subject: [PATCH 130/560] feat(mobile/tab_switcher): improve display for some text elements --- .../src/widgets/mobile_widgets/TabSwitcher.css | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css index 895940be9f..451fbefc6c 100644 --- a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css +++ b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css @@ -89,6 +89,16 @@ &.type-text { padding: 10px; + --ck-content-todo-list-checkmark-size: 8px; + + p { margin-bottom: 0.2em;} + hr { margin-block: 0.1em; height: 1px; } + h2 { font-size: 1.20em; } + h3 { font-size: 1.15em; } + h4 { font-size: 1.10em; } + h5 { font-size: 1.05em} + h6 { font-size: 1em; } + ul, ol { margin: 0 } } &.type-book, @@ -107,13 +117,6 @@ .preview-placeholder { font-size: 500%; } - - p { margin-bottom: 0.2em;} - h2 { font-size: 1.20em; } - h3 { font-size: 1.15em; } - h4 { font-size: 1.10em; } - h5 { font-size: 1.05em} - h6 { font-size: 1em; } } &.with-split { From 46f1cd38e0a1c5f63186ee6e7652abd6819c5e80 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 16:24:14 +0200 Subject: [PATCH 131/560] feat(mobile): enforce backdrop effects off --- .../src/widgets/containers/root_container.ts | 17 +++++++++-------- .../widgets/type_widgets/options/appearance.tsx | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/apps/client/src/widgets/containers/root_container.ts b/apps/client/src/widgets/containers/root_container.ts index 03df4a8ec6..e81d867ef4 100644 --- a/apps/client/src/widgets/containers/root_container.ts +++ b/apps/client/src/widgets/containers/root_container.ts @@ -1,11 +1,12 @@ -import { EventData } from "../../components/app_context.js"; import { LOCALES } from "@triliumnext/commons"; -import { readCssVar } from "../../utils/css-var.js"; -import FlexContainer from "./flex_container.js"; -import options from "../../services/options.js"; -import type BasicWidget from "../basic_widget.js"; -import utils from "../../services/utils.js"; + +import { EventData } from "../../components/app_context.js"; import { getEnabledExperimentalFeatureIds } from "../../services/experimental_features.js"; +import options from "../../services/options.js"; +import utils, { isMobile } from "../../services/utils.js"; +import { readCssVar } from "../../utils/css-var.js"; +import type BasicWidget from "../basic_widget.js"; +import FlexContainer from "./flex_container.js"; /** * The root container is the top-most widget/container, from which the entire layout derives. @@ -88,7 +89,7 @@ export default class RootContainer extends FlexContainer { } #setBackdropEffects() { - const enabled = options.is("backdropEffectsEnabled"); + const enabled = options.is("backdropEffectsEnabled") && !isMobile(); document.body.classList.toggle("backdrop-effects-disabled", !enabled); } @@ -96,7 +97,7 @@ export default class RootContainer extends FlexContainer { // Supports background effects const useBgfx = readCssVar(document.documentElement, "allow-background-effects") - .asBoolean(false); + .asBoolean(false); document.body.classList.toggle("theme-supports-background-effects", useBgfx); } diff --git a/apps/client/src/widgets/type_widgets/options/appearance.tsx b/apps/client/src/widgets/type_widgets/options/appearance.tsx index 3cff63ed66..94fc1f1fbd 100644 --- a/apps/client/src/widgets/type_widgets/options/appearance.tsx +++ b/apps/client/src/widgets/type_widgets/options/appearance.tsx @@ -388,10 +388,10 @@ function Performance() { currentValue={shadowsEnabled} onChange={setShadowsEnabled} /> - + />} {isElectron() && } From aee1a6e1f0641512b370dd8906b80a989a9749c1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 16:28:07 +0200 Subject: [PATCH 132/560] fix(note_list): regression in the display of no previews --- apps/client/src/services/content_renderer.css | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/apps/client/src/services/content_renderer.css b/apps/client/src/services/content_renderer.css index a44fa54a29..80764486d4 100644 --- a/apps/client/src/services/content_renderer.css +++ b/apps/client/src/services/content_renderer.css @@ -1,12 +1,9 @@ -.rendered-content.no-preview { +.rendered-content.no-preview > div { display: flex; flex-direction: column; - - & > div { - justify-content: space-around; - align-items: center; - height: 100%; - font-size: 500%; - flex-grow: 1; - } + justify-content: space-around; + align-items: center; + height: 100%; + font-size: 500%; + flex-grow: 1; } From b802c3174c1b10637798150a69b2b8647431833e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 16:29:51 +0200 Subject: [PATCH 133/560] style(mobile): add top border to bottom bar --- apps/client/src/stylesheets/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index e94249741b..5a09589e28 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -111,6 +111,7 @@ body.mobile #root-widget.virtual-keyboard-opened #mobile-bottom-bar { } #mobile-bottom-bar { + border-top: 1px solid var(--main-border-color); padding-bottom: var(--mobile-bottom-offset); } From 62534e0e93a8b2294454fc3d11f13f1fe7602906 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 16:43:46 +0200 Subject: [PATCH 134/560] chore(mobile/tab_switcher): launcher preview not looking good --- apps/client/src/widgets/mobile_widgets/TabSwitcher.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css index 451fbefc6c..8be65240b2 100644 --- a/apps/client/src/widgets/mobile_widgets/TabSwitcher.css +++ b/apps/client/src/widgets/mobile_widgets/TabSwitcher.css @@ -106,6 +106,7 @@ &.type-search, &.type-empty, &.type-relationMap, + &.type-launcher, &.tab-preview-placeholder { display: flex; align-items: center; From ac3b289c9eff4cc94dfe53018a0e05e817301eb0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 16:46:22 +0200 Subject: [PATCH 135/560] feat(mobile): more stable fixed tree for launch bar config --- apps/client/src/stylesheets/style.css | 34 ------------------- .../src/stylesheets/theme-next/shell.css | 2 +- apps/client/src/widgets/NoteDetail.css | 25 +++++++++++++- apps/client/src/widgets/NoteDetail.tsx | 26 +++++++++----- 4 files changed, 42 insertions(+), 45 deletions(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 5a09589e28..88f5e328bb 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1694,40 +1694,6 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { } } -@media (max-width: 991px) { - body.mobile.force-fixed-tree #mobile-sidebar-wrapper { - padding-top: 0; - position: static; - height: 40vh; - width: 100vw; - transform: none !important; - background-color: var(--left-pane-background-color) !important; - border-bottom: 0.5px solid var(--main-border-color); - } - - body.mobile.force-fixed-tree #mobile-sidebar-container { - display: none !important; - } - - body.mobile.force-fixed-tree #mobile-sidebar-wrapper .quick-search { - display: none; - } - - body.mobile.force-fixed-tree .component > button.bx-sidebar { - visibility: hidden; - padding: 0; - width: 6px; - } - - body.mobile.force-fixed-tree #mobile-rest-container { - flex-direction: column !important; - } - - body.mobile.force-fixed-tree #detail-container { - flex-grow: 1; - } -} - #launcher-pane { color: var(--launcher-pane-text-color); background-color: var(--launcher-pane-background-color); diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index f665bcc843..0df9d6686a 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -744,7 +744,7 @@ body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-i background-color: rgba(0, 0, 0, 0.5); } - body.mobile:not(.force-fixed-tree) #mobile-sidebar-wrapper { + body.mobile #mobile-sidebar-wrapper { border-top-right-radius: 12px; border-bottom-right-radius: 12px; border-inline-end: 1px solid var(--subtle-border-color); diff --git a/apps/client/src/widgets/NoteDetail.css b/apps/client/src/widgets/NoteDetail.css index 4382277805..0f6cdbfb03 100644 --- a/apps/client/src/widgets/NoteDetail.css +++ b/apps/client/src/widgets/NoteDetail.css @@ -3,6 +3,29 @@ font-family: var(--detail-font-family); font-size: var(--detail-font-size); contain: none; + + &.fixed-tree { + display: flex; + flex-direction: column; + height: 100%; + + .fixed-note-tree-container { + height: 60%; + border-bottom: 1px solid var(--main-border-color); + + .tree-wrapper { + padding: 0; + } + + .tree { + padding: 0; + } + + ul { + margin: 0; + } + } + } } body.prefers-centered-content .note-detail { @@ -12,4 +35,4 @@ body.prefers-centered-content .note-detail { .note-detail > * { contain: none; -} \ No newline at end of file +} diff --git a/apps/client/src/widgets/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 64a485188e..14b7fc3b53 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -1,5 +1,7 @@ import "./NoteDetail.css"; +import clsx from "clsx"; +import { use } from "i18next"; import { isValidElement, VNode } from "preact"; import { useEffect, useRef, useState } from "preact/hooks"; @@ -12,8 +14,9 @@ import { t } from "../services/i18n"; import protected_session_holder from "../services/protected_session_holder"; import toast from "../services/toast.js"; import { dynamicRequire, isElectron, isMobile } from "../services/utils"; +import NoteTreeWidget from "./note_tree"; import { ExtendedNoteType, TYPE_MAPPINGS, TypeWidget } from "./note_types"; -import { useNoteContext, useTriliumEvent } from "./react/hooks"; +import { useLegacyWidget, useNote, useNoteContext, useTriliumEvent } from "./react/hooks"; import { NoteListWithLinks } from "./react/NoteList"; import { TypeWidgetProps } from "./type_widgets/type_widget"; @@ -36,6 +39,7 @@ export default function NoteDetail() { const [ noteTypesToRender, setNoteTypesToRender ] = useState<{ [ key in ExtendedNoteType ]?: (props: TypeWidgetProps) => VNode }>({}); const [ activeNoteType, setActiveNoteType ] = useState(); const widgetRequestId = useRef(0); + const hasFixedTree = noteContext?.hoistedNoteId === "_lbMobileRoot" && isMobile(); const props: TypeWidgetProps = { note: note!, @@ -119,13 +123,6 @@ export default function NoteDetail() { } }); - // Fixed tree for launch bar config on mobile. - useEffect(() => { - if (!isMobile) return; - const hasFixedTree = noteContext?.hoistedNoteId === "_lbMobileRoot"; - document.body.classList.toggle("force-fixed-tree", hasFixedTree); - }, [ note ]); - // Handle toast notifications. useEffect(() => { if (!isElectron()) return; @@ -215,8 +212,13 @@ export default function NoteDetail() { return (
    + {hasFixedTree && } + {Object.entries(noteTypesToRender).map(([ itemType, Element ]) => { return new NoteTreeWidget(), { noteContext }); + return
    {treeEl}
    ; +} + /** * Wraps a single note type widget, in order to keep it in the DOM even after the user has switched away to another note type. This allows faster loading of the same note type again. The properties are cached, so that they are updated only * while the widget is visible, to avoid rendering in the background. When not visible, the DOM element is simply hidden. From 2cbe96d8158d8977b44a794e73bd6cee1012a184 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 18:03:17 +0200 Subject: [PATCH 136/560] feat(mobile/note_actions): integrate text content language switcher --- .../mobile_widgets/mobile_detail_menu.tsx | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 53bb58c50e..a60267001b 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -7,16 +7,17 @@ import { t } from "../../services/i18n"; import note_create from "../../services/note_create"; import server from "../../services/server"; import { BacklinksList, useBacklinkCount } from "../FloatingButtonsDefinitions"; -import { NoteInfoContent } from "../layout/StatusBar"; +import { getLocaleName, NoteInfoContent } from "../layout/StatusBar"; import ActionButton from "../react/ActionButton"; -import { FormDropdownDivider, FormListItem } from "../react/FormList"; +import { FormDropdownDivider, FormDropdownSubmenu, FormListItem } from "../react/FormList"; import { useNoteContext, useNoteProperty } from "../react/hooks"; import Modal from "../react/Modal"; -import { NoteTypeCodeNoteList, useMimeTypes } from "../ribbon/BasicPropertiesTab"; +import { NoteTypeCodeNoteList, useLanguageSwitcher, useMimeTypes } from "../ribbon/BasicPropertiesTab"; import { NoteContextMenu } from "../ribbon/NoteActions"; import NoteActionsCustom from "../ribbon/NoteActionsCustom"; import { NotePathsWidget, useSortedNotePaths } from "../ribbon/NotePathsTab"; import SimilarNotesTab from "../ribbon/SimilarNotesTab"; +import { useProcessedLocales } from "../type_widgets/options/components/LocaleSelector"; export default function MobileDetailMenu() { const { note, noteContext, parentComponent, ntxId, viewScope, hoistedNoteId } = useNoteContext(); @@ -81,6 +82,7 @@ export default function MobileDetailMenu() { >{t("close_pane_button.close_this_pane")} } + {note.type === "text" && } {note.type === "code" && setCodeNoteSwitcherModalShown(true)}>{t("status_bar.code_note_switcher")}} setNoteInfoModalShown(true)}>{t("note_info_widget.title")} setSimilarNotesModalShown(true)}>{t("similar_notes.title")} @@ -108,6 +110,31 @@ export default function MobileDetailMenu() { ); } +function ContentLanguageSelector({ note }: { note: FNote | null | undefined }) { + const { locales, DEFAULT_LOCALE, currentNoteLanguage, setCurrentNoteLanguage } = useLanguageSwitcher(note); + const { processedLocales } = useProcessedLocales(locales, DEFAULT_LOCALE, currentNoteLanguage ?? DEFAULT_LOCALE.id); + + return ( + + {processedLocales.map((locale, index) => + (typeof locale === "object") ? ( + setCurrentNoteLanguage(locale.id)} + >{locale.name} + ) : ( + + ) + )} + + ); +} + interface WithModal { modalShown: boolean; setModalShown: (shown: boolean) => void; From e00e3999c563f27fdc779787dbef6ecfd4c9fb24 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 18:05:37 +0200 Subject: [PATCH 137/560] feat(mobile/note_actions): indicate current content language --- apps/client/src/translations/en/translation.json | 3 ++- apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 3c2c5f6c0f..c5417f55e9 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -761,7 +761,8 @@ "note_revisions": "Note revisions", "error_cannot_get_branch_id": "Cannot get branchId for notePath '{{notePath}}'", "error_unrecognized_command": "Unrecognized command {{command}}", - "backlinks": "Backlinks" + "backlinks": "Backlinks", + "content_language_switcher": "Content language: {{language}}" }, "note_icon": { "change_note_icon": "Change note icon", diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index a60267001b..06c6f8e11c 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -112,12 +112,12 @@ export default function MobileDetailMenu() { function ContentLanguageSelector({ note }: { note: FNote | null | undefined }) { const { locales, DEFAULT_LOCALE, currentNoteLanguage, setCurrentNoteLanguage } = useLanguageSwitcher(note); - const { processedLocales } = useProcessedLocales(locales, DEFAULT_LOCALE, currentNoteLanguage ?? DEFAULT_LOCALE.id); + const { activeLocale, processedLocales } = useProcessedLocales(locales, DEFAULT_LOCALE, currentNoteLanguage ?? DEFAULT_LOCALE.id); return ( {processedLocales.map((locale, index) => (typeof locale === "object") ? ( From e0b4ebed9357de6a375ceab2e6c1fd9bd709b71e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 18:40:30 +0200 Subject: [PATCH 138/560] chore(mobile): address requested changes --- apps/client/src/widgets/NoteDetail.tsx | 3 +-- apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx | 2 +- .../src/widgets/type_widgets/text/mobile_editor_toolbar.tsx | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 14b7fc3b53..4c3e778f1b 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -1,7 +1,6 @@ import "./NoteDetail.css"; import clsx from "clsx"; -import { use } from "i18next"; import { isValidElement, VNode } from "preact"; import { useEffect, useRef, useState } from "preact/hooks"; @@ -16,7 +15,7 @@ import toast from "../services/toast.js"; import { dynamicRequire, isElectron, isMobile } from "../services/utils"; import NoteTreeWidget from "./note_tree"; import { ExtendedNoteType, TYPE_MAPPINGS, TypeWidget } from "./note_types"; -import { useLegacyWidget, useNote, useNoteContext, useTriliumEvent } from "./react/hooks"; +import { useLegacyWidget, useNoteContext, useTriliumEvent } from "./react/hooks"; import { NoteListWithLinks } from "./react/NoteList"; import { TypeWidgetProps } from "./type_widgets/type_widget"; diff --git a/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx b/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx index ed3d735d1c..ff92b6512e 100644 --- a/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx +++ b/apps/client/src/widgets/mobile_widgets/TabSwitcher.tsx @@ -211,7 +211,7 @@ function TabPreviewContent({ note, viewScope }: { el = ; } else if (note.type === "book") { el = ; - } else if (viewScope?.viewMode !== "default") { + } else if (viewScope?.viewMode && viewScope.viewMode !== "default") { el = ; } else { el = Date: Wed, 4 Feb 2026 18:48:37 +0200 Subject: [PATCH 139/560] chore(hidden_tree): add icon to mobile tab switcher launcher --- apps/server/src/services/hidden_subtree_launcherbar.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/server/src/services/hidden_subtree_launcherbar.ts b/apps/server/src/services/hidden_subtree_launcherbar.ts index 55a3b6f70f..d93a93ca97 100644 --- a/apps/server/src/services/hidden_subtree_launcherbar.ts +++ b/apps/server/src/services/hidden_subtree_launcherbar.ts @@ -210,7 +210,8 @@ export default function buildLaunchBarConfig() { id: "_lbMobileTabSwitcher", title: t("hidden-subtree.tab-switcher-title"), type: "launcher", - builtinWidget: "mobileTabSwitcher" + builtinWidget: "mobileTabSwitcher", + icon: "bx bx-rectangle" } ]; From 8aa4a974808b88caa6955c5bfcbb60738ed5c1c0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 18:52:46 +0200 Subject: [PATCH 140/560] fix(mobile): fixed tree for launcher duplicated in split --- apps/client/src/widgets/NoteDetail.tsx | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 4c3e778f1b..78450811da 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -38,7 +38,7 @@ export default function NoteDetail() { const [ noteTypesToRender, setNoteTypesToRender ] = useState<{ [ key in ExtendedNoteType ]?: (props: TypeWidgetProps) => VNode }>({}); const [ activeNoteType, setActiveNoteType ] = useState(); const widgetRequestId = useRef(0); - const hasFixedTree = noteContext?.hoistedNoteId === "_lbMobileRoot" && isMobile(); + const hasFixedTree = note && noteContext?.hoistedNoteId === "_lbMobileRoot" && isMobile() && note.noteId.startsWith("_lbMobile"); const props: TypeWidgetProps = { note: note!, @@ -216,7 +216,7 @@ export default function NoteDetail() { "fixed-tree": hasFixedTree })} > - {hasFixedTree && } + {hasFixedTree && } {Object.entries(noteTypesToRender).map(([ itemType, Element ]) => { return new NoteTreeWidget(), { noteContext }); return
    {treeEl}
    ; } From b097f9dc21c8ece1bcef912b6ac4ada2f71e052b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 18:53:32 +0200 Subject: [PATCH 141/560] fix(mobile): fixed tree overflowing container --- apps/client/src/widgets/NoteDetail.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/NoteDetail.css b/apps/client/src/widgets/NoteDetail.css index 0f6cdbfb03..b07c6aa061 100644 --- a/apps/client/src/widgets/NoteDetail.css +++ b/apps/client/src/widgets/NoteDetail.css @@ -12,6 +12,7 @@ .fixed-note-tree-container { height: 60%; border-bottom: 1px solid var(--main-border-color); + overflow: auto; .tree-wrapper { padding: 0; From 0dc2d07b5894d1c18b0c243f29abf261a6db65e6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 19:09:18 +0200 Subject: [PATCH 142/560] fix(mobile): virtual keyboard detection not working on iOS --- .../client/src/widgets/containers/root_container.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/containers/root_container.ts b/apps/client/src/widgets/containers/root_container.ts index e81d867ef4..e460078a98 100644 --- a/apps/client/src/widgets/containers/root_container.ts +++ b/apps/client/src/widgets/containers/root_container.ts @@ -18,14 +18,12 @@ import FlexContainer from "./flex_container.js"; * - `#root-container.vertical-layout`, if the current layout is horizontal. */ export default class RootContainer extends FlexContainer { - private originalViewportHeight: number; constructor(isHorizontalLayout: boolean) { super(isHorizontalLayout ? "column" : "row"); this.id("root-widget"); this.css("height", "100dvh"); - this.originalViewportHeight = getViewportHeight(); } render(): JQuery { @@ -65,8 +63,12 @@ export default class RootContainer extends FlexContainer { } #onMobileResize() { - const currentViewportHeight = getViewportHeight(); - const isKeyboardOpened = (currentViewportHeight < this.originalViewportHeight); + const viewportHeight = window.visualViewport?.height ?? window.innerHeight; + const windowHeight = window.innerHeight; + + // If viewport is significantly smaller, keyboard is likely open + const isKeyboardOpened = windowHeight - viewportHeight > 150; + this.$widget.toggleClass("virtual-keyboard-opened", isKeyboardOpened); } @@ -115,6 +117,3 @@ export default class RootContainer extends FlexContainer { } } -function getViewportHeight() { - return window.visualViewport?.height ?? window.innerHeight; -} From ac4be3f8a8835f31bc30bf6862360d513461c59d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 20:40:31 +0200 Subject: [PATCH 143/560] feat(mobile/global_menu): add option to search notes --- apps/client/src/translations/en/translation.json | 3 ++- apps/client/src/widgets/buttons/global_menu.tsx | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index c5417f55e9..32f86b3694 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -662,7 +662,8 @@ "show-cheatsheet": "Show Cheatsheet", "toggle-zen-mode": "Zen Mode", "new-version-available": "New Update Available", - "download-update": "Get Version {{latestVersion}}" + "download-update": "Get Version {{latestVersion}}", + "search_notes": "Search notes" }, "zen_mode": { "button_exit": "Exit Zen Mode" diff --git a/apps/client/src/widgets/buttons/global_menu.tsx b/apps/client/src/widgets/buttons/global_menu.tsx index 0986c8ad29..9db0393692 100644 --- a/apps/client/src/widgets/buttons/global_menu.tsx +++ b/apps/client/src/widgets/buttons/global_menu.tsx @@ -45,6 +45,10 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout: noDropdownListStyle mobileBackdrop > + {isMobile() && <> + + + } @@ -105,7 +109,7 @@ function BrowserOnlyOptions() { function DevelopmentOptions({ dropStart }: { dropStart: boolean }) { return <> - + {experimentalFeatures.map((feature) => ( From b539862eefcc778b3287a2c43452ff5d87e5bdc6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 20:41:36 +0200 Subject: [PATCH 144/560] fix(mobile/search): duplicate search parameters --- apps/client/src/layouts/mobile_layout.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index 0f36f282c4..8b162bced3 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -77,7 +77,6 @@ export default class MobileLayout { .child() .child() .child() - .child() .child() .child() ) From 07ce63de6965d4639fb4097337df91cebe22de94 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 20:44:15 +0200 Subject: [PATCH 145/560] chore(mobile/search): remove redundant margin --- apps/client/src/widgets/layout/NoteTitleActions.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/widgets/layout/NoteTitleActions.css b/apps/client/src/widgets/layout/NoteTitleActions.css index b1aa37d89c..4ae4c15816 100644 --- a/apps/client/src/widgets/layout/NoteTitleActions.css +++ b/apps/client/src/widgets/layout/NoteTitleActions.css @@ -50,6 +50,9 @@ body.experimental-feature-new-layout { } } + } + + body.desktop .title-actions { > .collapsible, > .note-type-switcher { padding-inline-start: calc(24px - var(--title-actions-padding-start)); @@ -57,3 +60,4 @@ body.experimental-feature-new-layout { } } } + From 2a4d5ec1ecfe3628e2077a5af95cee108a2de480 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 20:55:55 +0200 Subject: [PATCH 146/560] feat(mobile/search): group search options in dropdown --- .../src/translations/en/translation.json | 1 + .../src/widgets/react/ResponseContainer.tsx | 12 +++++++ .../widgets/ribbon/SearchDefinitionTab.tsx | 36 +++++++++++++------ 3 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 apps/client/src/widgets/react/ResponseContainer.tsx diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 32f86b3694..7ffe41d164 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -908,6 +908,7 @@ "debug": "debug", "debug_description": "Debug will print extra debugging information into the console to aid in debugging complex queries", "action": "action", + "option": "option", "search_button": "Search", "search_execute": "Search & Execute actions", "save_to_note": "Save to note", diff --git a/apps/client/src/widgets/react/ResponseContainer.tsx b/apps/client/src/widgets/react/ResponseContainer.tsx new file mode 100644 index 0000000000..6c077a5c06 --- /dev/null +++ b/apps/client/src/widgets/react/ResponseContainer.tsx @@ -0,0 +1,12 @@ +import { ComponentChildren } from "preact"; + +import { isMobile } from "../../services/utils"; + +interface ResponsiveContainerProps { + mobile?: ComponentChildren; + desktop?: ComponentChildren; +} + +export default function ResponsiveContainer({ mobile, desktop }: ResponsiveContainerProps) { + return (isMobile() ? mobile : desktop); +} diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx index 9d182a138d..c3a54566a7 100644 --- a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx +++ b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx @@ -12,7 +12,7 @@ import { t } from "../../services/i18n"; import server from "../../services/server"; import toast from "../../services/toast"; import tree from "../../services/tree"; -import { getErrorMessage } from "../../services/utils"; +import { getErrorMessage, isMobile } from "../../services/utils"; import ws from "../../services/ws"; import RenameNoteBulkAction from "../bulk_actions/note/rename_note"; import Button from "../react/Button"; @@ -21,6 +21,7 @@ import { FormListHeader, FormListItem } from "../react/FormList"; import { useTriliumEvent } from "../react/hooks"; import Icon from "../react/Icon"; import { ParentComponent } from "../react/react_utils"; +import ResponsiveContainer from "../react/ResponseContainer"; import { TabContext } from "./ribbon-interface"; import { SEARCH_OPTIONS, SearchOption } from "./SearchDefinitionOptions"; @@ -84,15 +85,30 @@ export default function SearchDefinitionTab({ note, ntxId, hidden }: Pick {t("search_definition.add_search_option")} - {searchOptions?.availableOptions.map(({ icon, label, tooltip, attributeName, attributeType, defaultValue }) => ( -
    - - - + )}
    @@ -178,6 +137,56 @@ export default function SearchDefinitionTab({ note, ntxId, hidden }: Pick("special-notes/save-search-note", { searchNoteId: note.noteId }); + if (!notePath) return; + + await ws.waitForMaxKnownEntityChangeId(); + await appContext.tabManager.getActiveContext()?.setNote(notePath); + + // Note the {{- notePathTitle}} in json file is not typo, it's unescaping + // See https://www.i18next.com/translation-function/interpolation#unescape + toast.showMessage(t("search_definition.search_note_saved", { notePathTitle: await tree.getNotePathTitle(notePath) })); + } + + return ( + + + + +
    + } + mobile={ + + {t("search_definition.search_execute")} + {note.isHiddenCompletely() && {t("search_definition.save_to_note")}} + + } + /> + + + + ); +} + function BulkActionsList({ note }: { note: FNote }) { const [ bulkActions, setBulkActions ] = useState(); From e66f13b471fd1ba5a5bfbcb68286ee4517aec428 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 21:11:43 +0200 Subject: [PATCH 148/560] feat(mobile/search): use bottom menus for large dropdowns --- .../client/src/widgets/ribbon/SearchDefinitionTab.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx index 78694ce57f..33d2c0322d 100644 --- a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx +++ b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx @@ -2,6 +2,7 @@ import "./SearchDefinitionTab.css"; import { SaveSearchNoteResponse } from "@triliumnext/commons"; import { useContext, useEffect, useState } from "preact/hooks"; +import { Fragment } from "preact/jsx-runtime"; import appContext from "../../components/app_context"; import FNote from "../../entities/fnote"; @@ -96,6 +97,7 @@ export default function SearchDefinitionTab({ note, ntxId, hidden }: Pick{" "}{t("search_definition.option")}} + dropdownContainerClassName="mobile-bottom-menu" mobileBackdrop noSelectButtonStyle > {searchOptions?.availableOptions.map(({ icon, label, tooltip, attributeName, attributeType, defaultValue }, index) => ( @@ -219,15 +221,16 @@ function AddBulkActionButton({ note }: { note: FNote }) { buttonClassName="action-add-toggle btn btn-sm" text={<>{" "}{t("search_definition.action")}} noSelectButtonStyle + dropdownContainerClassName="mobile-bottom-menu" mobileBackdrop > - {ACTION_GROUPS.map(({ actions, title }) => ( - <> + {ACTION_GROUPS.map(({ actions, title }, index) => ( + {actions.map(({ actionName, actionTitle }) => ( - bulk_action.addAction(note.noteId, actionName)}>{actionTitle} + bulk_action.addAction(note.noteId, actionName)}>{actionTitle} ))} - + ))} ); From 278d82645e1f775250b77315aaf1cea4afacc624 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 21:15:08 +0200 Subject: [PATCH 149/560] feat(mobile): use safe area for bottom-aligned menus --- apps/client/src/stylesheets/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 7b18f9356c..ba1bf6cee8 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1556,6 +1556,7 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { body.mobile .dropdown-menu.mobile-bottom-menu.show { --dropdown-bottom: 0px; + padding-bottom: calc(max(var(--menu-padding-size), env(safe-area-inset-bottom))) !important; } #mobile-sidebar-container { From 5adee3e217e05566515b26c515e0ac40882991f1 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 21:22:13 +0200 Subject: [PATCH 150/560] fix(mobile/search): missing rounded corners for bulk actions --- apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx index 33d2c0322d..bf7aaddd60 100644 --- a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx +++ b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx @@ -13,7 +13,7 @@ import { t } from "../../services/i18n"; import server from "../../services/server"; import toast from "../../services/toast"; import tree from "../../services/tree"; -import { getErrorMessage, isMobile } from "../../services/utils"; +import { getErrorMessage } from "../../services/utils"; import ws from "../../services/ws"; import RenameNoteBulkAction from "../bulk_actions/note/rename_note"; import Button, { SplitButton } from "../react/Button"; @@ -227,9 +227,11 @@ function AddBulkActionButton({ note }: { note: FNote }) { - {actions.map(({ actionName, actionTitle }) => ( - bulk_action.addAction(note.noteId, actionName)}>{actionTitle} - ))} +
    + {actions.map(({ actionName, actionTitle }) => ( + bulk_action.addAction(note.noteId, actionName)}>{actionTitle} + ))} +
    ))} From ec915177ad2b5d68519d01bb98f6c41d606a2289 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Wed, 4 Feb 2026 21:36:00 +0200 Subject: [PATCH 151/560] feat(mobile): add search to launch bar --- .../services/hidden_subtree_launcherbar.ts | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/apps/server/src/services/hidden_subtree_launcherbar.ts b/apps/server/src/services/hidden_subtree_launcherbar.ts index d93a93ca97..aa2d1daf63 100644 --- a/apps/server/src/services/hidden_subtree_launcherbar.ts +++ b/apps/server/src/services/hidden_subtree_launcherbar.ts @@ -40,18 +40,18 @@ export default function buildLaunchBarConfig() { type: "launcher", command: "showRecentChanges", icon: "bx bx-history" + }, + searchNotes: { + title: t("hidden-subtree.search-notes-title"), + type: "launcher", + command: "searchNotes", + icon: "bx bx-search", } }; const desktopAvailableLaunchers: HiddenSubtreeItem[] = [ - { - id: "_lbBackInHistory", - ...sharedLaunchers.backInHistory - }, - { - id: "_lbForwardInHistory", - ...sharedLaunchers.forwardInHistory - }, + { id: "_lbBackInHistory", ...sharedLaunchers.backInHistory }, + { id: "_lbForwardInHistory", ...sharedLaunchers.forwardInHistory }, { id: "_commandPalette", title: t("hidden-subtree.command-palette"), @@ -82,11 +82,7 @@ export default function buildLaunchBarConfig() { }, { id: "_lbSearch", - title: t("hidden-subtree.search-notes-title"), - type: "launcher", - command: "searchNotes", - icon: "bx bx-search", - attributes: [{ type: "label", name: "desktopOnly" }] + ...sharedLaunchers.searchNotes }, { id: "_lbJumpTo", @@ -179,22 +175,14 @@ export default function buildLaunchBarConfig() { const mobileAvailableLaunchers: HiddenSubtreeItem[] = [ { id: "_lbMobileNewNote", ...sharedLaunchers.newNote }, + { id: "_lbMobileSearchNotes", ...sharedLaunchers.searchNotes }, { id: "_lbMobileToday", ...sharedLaunchers.openToday }, - { - id: "_lbMobileRecentChanges", - ...sharedLaunchers.recentChanges - } + { id: "_lbMobileRecentChanges", ...sharedLaunchers.recentChanges } ]; const mobileVisibleLaunchers: HiddenSubtreeItem[] = [ - { - id: "_lbMobileBackInHistory", - ...sharedLaunchers.backInHistory - }, - { - id: "_lbMobileForwardInHistory", - ...sharedLaunchers.forwardInHistory - }, + { id: "_lbMobileBackInHistory", ...sharedLaunchers.backInHistory }, + { id: "_lbMobileForwardInHistory", ...sharedLaunchers.forwardInHistory }, { id: "_lbMobileJumpTo", title: t("hidden-subtree.jump-to-note-title"), From f90cc9aff7a23163dd55f237f31ff8499c2dcd28 Mon Sep 17 00:00:00 2001 From: hulmgulm Date: Wed, 4 Feb 2026 20:39:58 +0100 Subject: [PATCH 152/560] Adjust theme development docu --- .../Creating a custom theme.html | 67 ++++++++++--------- .../Creating an icon pack.html | 4 +- .../Customize the Next theme.html | 7 +- .../Creating an icon pack.md | 4 +- .../Customize the Next theme.md | 6 +- 5 files changed, 45 insertions(+), 43 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html index ea74ba4d44..3311ca3f82 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html @@ -7,38 +7,39 @@

    Step 2. Create the theme

    - - - - - - - - - - - - - - - - - - - - - -
    - - Themes are code notes with a special attribute. Start by creating a new - code note.
    - - Then change the note type to a CSS code.
    - - In the Owned Attributes section define the #appTheme attribute - to point to any desired name. This is the name that will show up in the - appearance section in settings.
    - +
    + + + + + + + + + + + + + + + + + + + + + +
      
    + + Themes are code notes with a special attribute. Start by creating a new + code note.
    + + Then change the note type to a CSS code.
    + + In the Owned Attributes section define the #appTheme attribute + to point to any desired name. This is the name that will show up in the + appearance section in settings.
    +

    Step 3. Define the theme's CSS

    As a very simple example we will change the background color of the launcher pane to a shade of blue.

    @@ -60,7 +61,7 @@

    Step 5. Making changes

    Simply go back to the note and change according to needs. To apply the - changes to the current window, press Ctrl+Shift+R to + changes to the current window, press Ctrl+Shift+R to refresh.

    It's a good idea to keep two windows, one for editing and the other one for previewing the changes.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html index 8aa3c00775..0256575f96 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html @@ -1,5 +1,5 @@ @@ -74,7 +74,7 @@ "bx-ball": { "glyph": "\ue9c2", "terms": [ "ball" ] - }, + }, "bxs-party": { "glyph": "\uec92" "terms": [ "party" ] diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Customize the Next theme.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Customize the Next theme.html index dd72effbfd..32083ee809 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Customize the Next theme.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Customize the Next theme.html @@ -18,7 +18,8 @@

    Overrides

    Do note that the TriliumNext theme has a few more overrides than the legacy - theme, so you might need to suffix !important if - the style changes are not applied.

    :root {
    -	--launcher-pane-background-color: #0d6efd !important;
    +  theme. Due to that, it is recommended to use #trilium-app with
    +  a next theme instead of the :root of a legacy
    +  theme.

    #trilium-app {
    +	--launcher-pane-background-color: #0d6efd;
     }
    \ No newline at end of file diff --git a/docs/User Guide/User Guide/Theme development/Creating an icon pack.md b/docs/User Guide/User Guide/Theme development/Creating an icon pack.md index 218c21b21b..06c5c97558 100644 --- a/docs/User Guide/User Guide/Theme development/Creating an icon pack.md +++ b/docs/User Guide/User Guide/Theme development/Creating an icon pack.md @@ -1,6 +1,6 @@ # Creating an icon pack > [!NOTE] -> e This page describes how to create custom icon packs. For a general description of how to use already existing icon packs, see Icon Packs. +> This page describes how to create custom icon packs. For a general description of how to use already existing icon packs, see Icon Packs. ## Supported formats @@ -49,7 +49,7 @@ The icon pack manifest is a JSON file with the following structure: "bx-ball": { "glyph": "\ue9c2", "terms": [ "ball" ] - }, + }, "bxs-party": { "glyph": "\uec92" "terms": [ "party" ] diff --git a/docs/User Guide/User Guide/Theme development/Customize the Next theme.md b/docs/User Guide/User Guide/Theme development/Customize the Next theme.md index 657199a67e..e5e1ad8860 100644 --- a/docs/User Guide/User Guide/Theme development/Customize the Next theme.md +++ b/docs/User Guide/User Guide/Theme development/Customize the Next theme.md @@ -12,10 +12,10 @@ The `appThemeBase` label can be set to one of the following values: ## Overrides -Do note that the TriliumNext theme has a few more overrides than the legacy theme, so you might need to suffix `!important` if the style changes are not applied. +Do note that the TriliumNext theme has a few more overrides than the legacy theme. Due to that, it is recommended to use `#trilium-app` with a next theme instead of the `:root` of a legacy theme. ```css -:root { - --launcher-pane-background-color: #0d6efd !important; +#trilium-app { + --launcher-pane-background-color: #0d6efd; } ``` \ No newline at end of file From e82ae762f0f4a454cfbef2b2fb80090493938e0d Mon Sep 17 00:00:00 2001 From: hulmgulm Date: Wed, 4 Feb 2026 20:48:36 +0100 Subject: [PATCH 153/560] More fixes --- .../Creating a custom theme.html | 67 +++++++++---------- .../Creating an icon pack.html | 2 +- .../Creating a custom theme.md | 2 +- .../Creating an icon pack.md | 2 +- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html index 3311ca3f82..0496700e82 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating a custom theme.html @@ -7,39 +7,38 @@

    Step 2. Create the theme

    -
    - - - - - - - - - - - - - - - - - - - - - -
      
    - - Themes are code notes with a special attribute. Start by creating a new - code note.
    - - Then change the note type to a CSS code.
    - - In the Owned Attributes section define the #appTheme attribute - to point to any desired name. This is the name that will show up in the - appearance section in settings.
    -
    + + + + + + + + + + + + + + + + + + + + + +
    + + Themes are code notes with a special attribute. Start by creating a new + code note.
    + + Then change the note type to a CSS code.
    + + In the Owned Attributes section define the #appTheme attribute + to point to any desired name. This is the name that will show up in the + appearance section in settings.
    +

    Step 3. Define the theme's CSS

    As a very simple example we will change the background color of the launcher pane to a shade of blue.

    @@ -61,7 +60,7 @@

    Step 5. Making changes

    Simply go back to the note and change according to needs. To apply the - changes to the current window, press Ctrl+Shift+R to + changes to the current window, press Ctrl+Shift+R to refresh.

    It's a good idea to keep two windows, one for editing and the other one for previewing the changes.

    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html index 0256575f96..d5649a2028 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Theme development/Creating an icon pack.html @@ -76,7 +76,7 @@ "terms": [ "ball" ] }, "bxs-party": { - "glyph": "\uec92" + "glyph": "\uec92", "terms": [ "party" ] } } diff --git a/docs/User Guide/User Guide/Theme development/Creating a custom theme.md b/docs/User Guide/User Guide/Theme development/Creating a custom theme.md index 12334c6cae..0a39e2f6e2 100644 --- a/docs/User Guide/User Guide/Theme development/Creating a custom theme.md +++ b/docs/User Guide/User Guide/Theme development/Creating a custom theme.md @@ -41,6 +41,6 @@ Do note that the theme will be based off of the legacy theme. To override that a ## Step 5. Making changes -Simply go back to the note and change according to needs. To apply the changes to the current window, press Ctrl+Shift+R to refresh. +Simply go back to the note and change according to needs. To apply the changes to the current window, press Ctrl+Shift+R to refresh. It's a good idea to keep two windows, one for editing and the other one for previewing the changes. \ No newline at end of file diff --git a/docs/User Guide/User Guide/Theme development/Creating an icon pack.md b/docs/User Guide/User Guide/Theme development/Creating an icon pack.md index 06c5c97558..20bc897899 100644 --- a/docs/User Guide/User Guide/Theme development/Creating an icon pack.md +++ b/docs/User Guide/User Guide/Theme development/Creating an icon pack.md @@ -51,7 +51,7 @@ The icon pack manifest is a JSON file with the following structure: "terms": [ "ball" ] }, "bxs-party": { - "glyph": "\uec92" + "glyph": "\uec92", "terms": [ "party" ] } } From 715f42b6c3f752c24b1be4b4b19d637f3656c422 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 01:13:22 +0000 Subject: [PATCH 154/560] fix(deps): update dependency force-graph to v1.51.1 --- apps/client/package.json | 2 +- pnpm-lock.yaml | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index dc210480a6..8aa38a2a52 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -42,7 +42,7 @@ "color": "5.0.3", "debounce": "3.0.0", "draggabilly": "3.0.0", - "force-graph": "1.51.0", + "force-graph": "1.51.1", "globals": "17.3.0", "i18next": "25.8.0", "i18next-http-backend": "3.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a62fc6eee1..fbc8d33898 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -258,8 +258,8 @@ importers: specifier: 3.0.0 version: 3.0.0 force-graph: - specifier: 1.51.0 - version: 1.51.0 + specifier: 1.51.1 + version: 1.51.1 globals: specifier: 17.3.0 version: 17.3.0 @@ -8796,8 +8796,8 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - force-graph@1.51.0: - resolution: {integrity: sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==} + force-graph@1.51.1: + resolution: {integrity: sha512-uEEX8iRzgq1IKRISOw6RrB2RLMhcI25xznQYrCTVvxZHZZ+A2jH6qIolYuwavVxAMi64pFp2yZm4KFVdD993cg==} engines: {node: '>=12'} foreach@2.0.6: @@ -9052,16 +9052,16 @@ packages: glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} @@ -15996,6 +15996,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16215,6 +16217,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -16720,6 +16724,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -25088,7 +25094,7 @@ snapshots: dependencies: is-callable: 1.2.7 - force-graph@1.51.0: + force-graph@1.51.1: dependencies: '@tweenjs/tween.js': 25.0.0 accessor-fn: 1.5.3 From d31135bf21857e098f15bec58000b281be408501 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 09:09:47 +0200 Subject: [PATCH 155/560] fix(mobile): status bar color for Samsung Internet --- apps/client/src/desktop.ts | 21 ------------------- apps/client/src/layouts/mobile_layout.css | 4 ++++ .../src/widgets/containers/root_container.ts | 19 +++++++++++++++++ 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/apps/client/src/desktop.ts b/apps/client/src/desktop.ts index bba3b6b90b..6f22d3fc7b 100644 --- a/apps/client/src/desktop.ts +++ b/apps/client/src/desktop.ts @@ -46,10 +46,6 @@ if (utils.isElectron()) { electronContextMenu.setupContextMenu(); } -if (utils.isPWA()) { - initPWATopbarColor(); -} - function initOnElectron() { const electron: typeof Electron = utils.dynamicRequire("electron"); electron.ipcRenderer.on("globalShortcut", async (event, actionName) => appContext.triggerCommand(actionName)); @@ -134,20 +130,3 @@ function initDarkOrLightMode(style: CSSStyleDeclaration) { const { nativeTheme } = utils.dynamicRequire("@electron/remote") as typeof ElectronRemote; nativeTheme.themeSource = themeSource; } - -function initPWATopbarColor() { - const tracker = $("#background-color-tracker"); - - if (tracker.length) { - const applyThemeColor = () => { - let meta = $("meta[name='theme-color']"); - if (!meta.length) { - meta = $(``).appendTo($("head")); - } - meta.attr("content", tracker.css("color")); - }; - - tracker.on("transitionend", applyThemeColor); - applyThemeColor(); - } -} diff --git a/apps/client/src/layouts/mobile_layout.css b/apps/client/src/layouts/mobile_layout.css index 95b9dd8afb..396fa4a467 100644 --- a/apps/client/src/layouts/mobile_layout.css +++ b/apps/client/src/layouts/mobile_layout.css @@ -1,3 +1,7 @@ +#background-color-tracker { + color: var(--main-background-color) !important; +} + span.keyboard-shortcut, kbd { display: none; diff --git a/apps/client/src/widgets/containers/root_container.ts b/apps/client/src/widgets/containers/root_container.ts index e460078a98..ea79893d19 100644 --- a/apps/client/src/widgets/containers/root_container.ts +++ b/apps/client/src/widgets/containers/root_container.ts @@ -38,6 +38,7 @@ export default class RootContainer extends FlexContainer { this.#setThemeCapabilities(); this.#setLocaleAndDirection(options.get("locale")); this.#setExperimentalFeatures(); + this.#initPWATopbarColor(); return super.render(); } @@ -115,5 +116,23 @@ export default class RootContainer extends FlexContainer { document.body.lang = locale; document.body.dir = correspondingLocale?.rtl ? "rtl" : "ltr"; } + + #initPWATopbarColor() { + if (!utils.isPWA()) return; + const tracker = $("#background-color-tracker"); + + if (tracker.length) { + const applyThemeColor = () => { + let meta = $("meta[name='theme-color']"); + if (!meta.length) { + meta = $(``).appendTo($("head")); + } + meta.attr("content", tracker.css("color")); + }; + + tracker.on("transitionend", applyThemeColor); + applyThemeColor(); + } + } } From f6b454cb9a81b629485a8a85ab2626cb360f2afe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 5 Feb 2026 13:44:21 +0000 Subject: [PATCH 156/560] fix(deps): update dependency i18next to v25.8.4 --- apps/client/package.json | 2 +- apps/server/package.json | 2 +- apps/website/package.json | 2 +- pnpm-lock.yaml | 26 +++++++++++++------------- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index dc210480a6..545b045813 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -44,7 +44,7 @@ "draggabilly": "3.0.0", "force-graph": "1.51.0", "globals": "17.3.0", - "i18next": "25.8.0", + "i18next": "25.8.4", "i18next-http-backend": "3.0.2", "jquery": "4.0.0", "jquery.fancytree": "2.38.5", diff --git a/apps/server/package.json b/apps/server/package.json index 76e6b76845..2e7c0f694b 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -99,7 +99,7 @@ "html2plaintext": "2.1.4", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", - "i18next": "25.8.0", + "i18next": "25.8.4", "i18next-fs-backend": "2.6.1", "image-type": "6.0.0", "ini": "6.0.0", diff --git a/apps/website/package.json b/apps/website/package.json index 8132f34abf..248755f5fe 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -9,7 +9,7 @@ "preview": "pnpm build && vite preview" }, "dependencies": { - "i18next": "25.8.0", + "i18next": "25.8.4", "i18next-http-backend": "3.0.2", "preact": "10.28.3", "preact-iso": "2.11.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84e2c0cad3..955d624a83 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -264,8 +264,8 @@ importers: specifier: 17.3.0 version: 17.3.0 i18next: - specifier: 25.8.0 - version: 25.8.0(typescript@5.9.3) + specifier: 25.8.4 + version: 25.8.4(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -313,7 +313,7 @@ importers: version: 10.28.3 react-i18next: specifier: 16.5.4 - version: 16.5.4(i18next@25.8.0(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + version: 16.5.4(i18next@25.8.4(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) react-window: specifier: 2.2.6 version: 2.2.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -728,8 +728,8 @@ importers: specifier: 7.0.6 version: 7.0.6 i18next: - specifier: 25.8.0 - version: 25.8.0(typescript@5.9.3) + specifier: 25.8.4 + version: 25.8.4(typescript@5.9.3) i18next-fs-backend: specifier: 2.6.1 version: 2.6.1 @@ -849,8 +849,8 @@ importers: apps/website: dependencies: i18next: - specifier: 25.8.0 - version: 25.8.0(typescript@5.9.3) + specifier: 25.8.4 + version: 25.8.4(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -865,7 +865,7 @@ importers: version: 6.6.5(preact@10.28.3) react-i18next: specifier: 16.5.4 - version: 16.5.4(i18next@25.8.0(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + version: 16.5.4(i18next@25.8.4(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) devDependencies: '@preact/preset-vite': specifier: 2.10.3 @@ -9459,8 +9459,8 @@ packages: i18next-http-backend@3.0.2: resolution: {integrity: sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==} - i18next@25.8.0: - resolution: {integrity: sha512-urrg4HMFFMQZ2bbKRK7IZ8/CTE7D8H4JRlAwqA2ZwDRFfdd0K/4cdbNNLgfn9mo+I/h9wJu61qJzH7jCFAhUZQ==} + i18next@25.8.4: + resolution: {integrity: sha512-a9A0MnUjKvzjEN/26ZY1okpra9kA8MEwzYEz1BNm+IyxUKPRH6ihf0p7vj8YvULwZHKHl3zkJ6KOt4hewxBecQ==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -25956,7 +25956,7 @@ snapshots: transitivePeerDependencies: - encoding - i18next@25.8.0(typescript@5.9.3): + i18next@25.8.4(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 optionalDependencies: @@ -29406,11 +29406,11 @@ snapshots: react: 19.2.4 scheduler: 0.27.0 - react-i18next@16.5.4(i18next@25.8.0(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): + react-i18next@16.5.4(i18next@25.8.4(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 - i18next: 25.8.0(typescript@5.9.3) + i18next: 25.8.4(typescript@5.9.3) react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) optionalDependencies: From f8b386e42d0adbb7c4f927216aa668c8c62b4535 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 16:43:06 +0200 Subject: [PATCH 157/560] feat(mobile): make the sidebar gesture easier to press --- .../mobile_widgets/sidebar_container.ts | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/sidebar_container.ts b/apps/client/src/widgets/mobile_widgets/sidebar_container.ts index ef719d36a9..e52c0dff49 100644 --- a/apps/client/src/widgets/mobile_widgets/sidebar_container.ts +++ b/apps/client/src/widgets/mobile_widgets/sidebar_container.ts @@ -22,6 +22,7 @@ export default class SidebarContainer extends FlexContainer { private currentTranslate: number; private dragState: number; private startX?: number; + private startY?: number; private translatePercentage: number; private sidebarEl!: HTMLElement; private backdropEl!: HTMLElement; @@ -51,11 +52,13 @@ export default class SidebarContainer extends FlexContainer { #onDragStart(e: TouchEvent | MouseEvent) { const x = "touches" in e ? e.touches[0].clientX : e.clientX; + const y = "touches" in e ? e.touches[0].clientY : e.clientY; this.startX = x; + this.startY = y; // Prevent dragging if too far from the edge of the screen and the menu is closed. - let dragRefX = glob.isRtl ? this.screenWidth - x : x; - if (dragRefX > 30 && this.currentTranslate === -100) { + const dragRefX = glob.isRtl ? this.screenWidth - x : x; + if (dragRefX > 300 && this.currentTranslate === -100) { return; } @@ -65,13 +68,26 @@ export default class SidebarContainer extends FlexContainer { } #onDragMove(e: TouchEvent | MouseEvent) { - if (this.dragState === DRAG_STATE_NONE || !this.startX) { + if (this.dragState === DRAG_STATE_NONE || !this.startX || !this.startY) { return; } const x = "touches" in e ? e.touches[0].clientX : e.clientX; + const y = "touches" in e ? e.touches[0].clientY : e.clientY; const deltaX = glob.isRtl ? this.startX - x : x - this.startX; + const deltaY = y - this.startY; + if (this.dragState === DRAG_STATE_INITIAL_DRAG) { + // Check if the gesture is more horizontal than vertical + const absDeltaX = Math.abs(deltaX); + const absDeltaY = Math.abs(deltaY); + + // If movement is more vertical than horizontal, cancel the drag to allow scrolling + if (absDeltaY > absDeltaX * 1.5) { + this.dragState = DRAG_STATE_NONE; + return; + } + if (this.currentTranslate === -100 ? deltaX > DRAG_CLOSED_START_THRESHOLD : deltaX < -DRAG_OPENED_START_THRESHOLD) { /* Disable the transitions since they affect performance, they are going to reenabled once drag ends. */ this.sidebarEl.style.transition = "none"; @@ -89,7 +105,7 @@ export default class SidebarContainer extends FlexContainer { } } else if (this.dragState === DRAG_STATE_DRAGGING) { const width = this.sidebarEl.offsetWidth; - let translatePercentage = Math.min(0, Math.max(this.currentTranslate + (deltaX / width) * 100, -100)); + const translatePercentage = Math.min(0, Math.max(this.currentTranslate + (deltaX / width) * 100, -100)); const backdropOpacity = Math.max(0, 1 + translatePercentage / 100); this.translatePercentage = translatePercentage; if (glob.isRtl) { @@ -160,12 +176,10 @@ export default class SidebarContainer extends FlexContainer { this.sidebarEl.classList.toggle("show", isOpen); if (isOpen) { this.sidebarEl.style.transform = "translateX(0)"; + } else if (glob.isRtl) { + this.sidebarEl.style.transform = "translateX(100%)"; } else { - if (glob.isRtl) { - this.sidebarEl.style.transform = "translateX(100%)" - } else { - this.sidebarEl.style.transform = "translateX(-100%)"; - } + this.sidebarEl.style.transform = "translateX(-100%)"; } this.sidebarEl.style.transition = this.originalSidebarTransition; From c709b5d34c3ec8b3dcaeebe7dd6157d846cb2e80 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 18:42:51 +0200 Subject: [PATCH 158/560] chore(mobile): relocate some note actions --- .../src/widgets/mobile_widgets/mobile_detail_menu.tsx | 4 +++- apps/client/src/widgets/ribbon/NoteActions.tsx | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index f35137b77a..2aa527feaa 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -46,7 +46,7 @@ export default function MobileDetailMenu() { + itemsAtStart={<>
    {t("close_pane_button.close_this_pane")} } + } + itemsNearNoteSettings={<> {note.type === "text" && } {note.type === "code" && setCodeNoteSwitcherModalShown(true)}>{t("status_bar.code_note_switcher")}} setNoteInfoModalShown(true)}>{t("note_info_widget.title")} diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index daeab278cc..b818672709 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -63,10 +63,11 @@ function RevisionsButton({ note }: { note: FNote }) { type ItemToFocus = "basic-properties"; -export function NoteContextMenu({ note, noteContext, extraItems, dropdownRef: externalDropdownRef }: { +export function NoteContextMenu({ note, noteContext, itemsAtStart, itemsNearNoteSettings, dropdownRef: externalDropdownRef }: { note: FNote, noteContext?: NoteContext, - extraItems?: ComponentChildren; + itemsAtStart?: ComponentChildren; + itemsNearNoteSettings?: ComponentChildren; dropdownRef?: RefObject; }) { const dropdownRef = useSyncedRef(externalDropdownRef, null); @@ -112,7 +113,7 @@ export function NoteContextMenu({ note, noteContext, extraItems, dropdownRef: ex onHidden={() => itemToFocusRef.current = null } mobileBackdrop > - {extraItems} + {itemsAtStart} {isReadOnly && <> } + {itemsNearNoteSettings} + parentComponent?.triggerCommand("showImportDialog", { noteId: note.noteId })} /> From dc01b787c1cd0d8208e40fe9ea9d275aa612db65 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:10:05 +0200 Subject: [PATCH 159/560] fix(launch_bar): cannot create new items in mobile launch bar (fixes #8054) --- apps/client/src/menus/launcher_context_menu.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/client/src/menus/launcher_context_menu.ts b/apps/client/src/menus/launcher_context_menu.ts index 717180690a..f4ae7a148f 100644 --- a/apps/client/src/menus/launcher_context_menu.ts +++ b/apps/client/src/menus/launcher_context_menu.ts @@ -1,12 +1,12 @@ -import treeService from "../services/tree.js"; -import froca from "../services/froca.js"; -import contextMenu, { type MenuCommandItem, type MenuItem } from "./context_menu.js"; -import dialogService from "../services/dialog.js"; -import server from "../services/server.js"; -import { t } from "../services/i18n.js"; +import type { ContextMenuCommandData,FilteredCommandNames } from "../components/app_context.js"; import type { SelectMenuItemEventListener } from "../components/events.js"; +import dialogService from "../services/dialog.js"; +import froca from "../services/froca.js"; +import { t } from "../services/i18n.js"; +import server from "../services/server.js"; +import treeService from "../services/tree.js"; import type NoteTreeWidget from "../widgets/note_tree.js"; -import type { FilteredCommandNames, ContextMenuCommandData } from "../components/app_context.js"; +import contextMenu, { type MenuCommandItem, type MenuItem } from "./context_menu.js"; type LauncherCommandNames = FilteredCommandNames; @@ -32,8 +32,8 @@ export default class LauncherContextMenu implements SelectMenuItemEventListener< const note = this.node.data.noteId ? await froca.getNote(this.node.data.noteId) : null; const parentNoteId = this.node.getParent().data.noteId; - const isVisibleRoot = note?.noteId === "_lbVisibleLaunchers"; - const isAvailableRoot = note?.noteId === "_lbAvailableLaunchers"; + const isVisibleRoot = note?.noteId === "_lbVisibleLaunchers" || note?.noteId === "_lbMobileVisibleLaunchers"; + const isAvailableRoot = note?.noteId === "_lbAvailableLaunchers" || note?.noteId === "_lbMobileAvailableLaunchers"; const isVisibleItem = parentNoteId === "_lbVisibleLaunchers" || parentNoteId === "_lbMobileVisibleLaunchers"; const isAvailableItem = parentNoteId === "_lbAvailableLaunchers" || parentNoteId === "_lbMobileAvailableLaunchers"; const isItem = isVisibleItem || isAvailableItem; From 442937f5405689dfb545147833e59246b4b96472 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:20:22 +0200 Subject: [PATCH 160/560] feat(bookmarks): add launcher on mobile --- .../services/hidden_subtree_launcherbar.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/server/src/services/hidden_subtree_launcherbar.ts b/apps/server/src/services/hidden_subtree_launcherbar.ts index aa2d1daf63..3a56d433f7 100644 --- a/apps/server/src/services/hidden_subtree_launcherbar.ts +++ b/apps/server/src/services/hidden_subtree_launcherbar.ts @@ -46,7 +46,13 @@ export default function buildLaunchBarConfig() { type: "launcher", command: "searchNotes", icon: "bx bx-search", - } + }, + bookmarks: { + title: t("hidden-subtree.bookmarks-title"), + type: "launcher", + builtinWidget: "bookmarks", + icon: "bx bx-bookmark" + }, }; const desktopAvailableLaunchers: HiddenSubtreeItem[] = [ @@ -124,13 +130,7 @@ export default function buildLaunchBarConfig() { baseSize: "50", growthFactor: "0" }, - { - id: "_lbBookmarks", - title: t("hidden-subtree.bookmarks-title"), - type: "launcher", - builtinWidget: "bookmarks", - icon: "bx bx-bookmark" - }, + { id: "_lbBookmarks", ...sharedLaunchers.bookmarks }, { id: "_lbToday", ...sharedLaunchers.openToday @@ -177,7 +177,8 @@ export default function buildLaunchBarConfig() { { id: "_lbMobileNewNote", ...sharedLaunchers.newNote }, { id: "_lbMobileSearchNotes", ...sharedLaunchers.searchNotes }, { id: "_lbMobileToday", ...sharedLaunchers.openToday }, - { id: "_lbMobileRecentChanges", ...sharedLaunchers.recentChanges } + { id: "_lbMobileRecentChanges", ...sharedLaunchers.recentChanges }, + { id: "_lbMobileBookmarks", ...sharedLaunchers.bookmarks } ]; const mobileVisibleLaunchers: HiddenSubtreeItem[] = [ From ff0c89e5a398c693fe8aa3798aa1eb9c577cf7da Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:28:50 +0200 Subject: [PATCH 161/560] feat(bookmarks): collapse on mobile into single icon (closes #5464) --- .../src/translations/en/translation.json | 3 + .../widgets/launch_bar/BookmarkButtons.tsx | 56 ++++++++++++++----- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 7ffe41d164..9f33fd8c35 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -2280,5 +2280,8 @@ "title_one": "{{count}} tab", "title_other": "{{count}} tabs", "more_options": "More options" + }, + "bookmark_buttons": { + "bookmarks": "Bookmarks" } } diff --git a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx index f3b88c7aa3..f7ead77bd7 100644 --- a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx +++ b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx @@ -1,11 +1,16 @@ -import { useContext, useMemo } from "preact/hooks"; -import { LaunchBarContext, LaunchBarDropdownButton, useLauncherIconAndTitle } from "./launch_bar_widgets"; -import { CSSProperties } from "preact"; -import type FNote from "../../entities/fnote"; -import { useChildNotes, useNoteLabelBoolean } from "../react/hooks"; import "./BookmarkButtons.css"; + +import { CSSProperties } from "preact"; +import { useContext, useMemo } from "preact/hooks"; + +import type FNote from "../../entities/fnote"; +import froca from "../../services/froca"; +import { t } from "../../services/i18n"; +import { useChildNotes, useNoteLabelBoolean } from "../react/hooks"; import NoteLink from "../react/NoteLink"; +import ResponsiveContainer from "../react/ResponseContainer"; import { CustomNoteLauncher } from "./GenericButtons"; +import { LaunchBarContext, LaunchBarDropdownButton, useLauncherIconAndTitle } from "./launch_bar_widgets"; const PARENT_NOTE_ID = "_lbBookmarks"; @@ -19,17 +24,42 @@ export default function BookmarkButtons() { const childNotes = useChildNotes(PARENT_NOTE_ID); return ( -
    - {childNotes?.map(childNote => )} -
    - ) + + {childNotes?.map(childNote => )} +
    + } + mobile={ + +
    +
      + {childNotes?.map(childNote => )} +
    +
    +
    + } + /> + ); } function SingleBookmark({ note }: { note: FNote }) { const [ bookmarkFolder ] = useNoteLabelBoolean(note, "bookmarkFolder"); - return bookmarkFolder - ? - : note.noteId} /> + return + : note.noteId} /> + } + mobile={ +
  • + +
  • + } + />; } function BookmarkFolder({ note }: { note: FNote }) { @@ -55,5 +85,5 @@ function BookmarkFolder({ note }: { note: FNote }) {
    - ) + ); } From 720281a8db0dc7ce5d5239ba6db24b9e2fe8027d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:41:55 +0200 Subject: [PATCH 162/560] feat(bookmarks): support bookmark folders on mobile --- .../widgets/launch_bar/BookmarkButtons.tsx | 48 ++++++++++++++----- .../src/widgets/launch_bar/GenericButtons.tsx | 43 ++++++++++------- 2 files changed, 60 insertions(+), 31 deletions(-) diff --git a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx index f7ead77bd7..c02d6cdf87 100644 --- a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx +++ b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx @@ -4,12 +4,12 @@ import { CSSProperties } from "preact"; import { useContext, useMemo } from "preact/hooks"; import type FNote from "../../entities/fnote"; -import froca from "../../services/froca"; import { t } from "../../services/i18n"; -import { useChildNotes, useNoteLabelBoolean } from "../react/hooks"; +import { FormDropdownSubmenu, FormListItem } from "../react/FormList"; +import { useChildNotes, useNote, useNoteIcon, useNoteLabelBoolean } from "../react/hooks"; import NoteLink from "../react/NoteLink"; import ResponsiveContainer from "../react/ResponseContainer"; -import { CustomNoteLauncher } from "./GenericButtons"; +import { CustomNoteLauncher, launchCustomNoteLauncher } from "./GenericButtons"; import { LaunchBarContext, LaunchBarDropdownButton, useLauncherIconAndTitle } from "./launch_bar_widgets"; const PARENT_NOTE_ID = "_lbBookmarks"; @@ -35,11 +35,7 @@ export default function BookmarkButtons() { icon="bx bx-bookmark" title={t("bookmark_buttons.bookmarks")} > -
    -
      - {childNotes?.map(childNote => )} -
    -
    + {childNotes?.map(childNote => )} } /> @@ -54,14 +50,40 @@ function SingleBookmark({ note }: { note: FNote }) { ? : note.noteId} /> } - mobile={ -
  • - -
  • - } + mobile={} />; } +function MobileBookmarkItem({ noteId, bookmarkFolder }: { noteId: string, bookmarkFolder: boolean }) { + const note = useNote(noteId); + const noteIcon = useNoteIcon(note); + if (!note) return; + + return ( + !bookmarkFolder + ? launchCustomNoteLauncher(e, { launcherNote: note, getTargetNoteId: () => note.noteId })}>{note.title} + : + ); +} + +function MobileBookmarkFolder({ note }: { note: FNote }) { + const childNotes = useChildNotes(note.noteId); + + return ( + + {childNotes.map(childNote => ( + launchCustomNoteLauncher(e, { launcherNote: childNote, getTargetNoteId: () => childNote.noteId })} + > + {childNote.title} + + ))} + + ); +} + function BookmarkFolder({ note }: { note: FNote }) { const { icon, title } = useLauncherIconAndTitle(note); const childNotes = useChildNotes(note.noteId); diff --git a/apps/client/src/widgets/launch_bar/GenericButtons.tsx b/apps/client/src/widgets/launch_bar/GenericButtons.tsx index 70fe0fccef..59c158dec1 100644 --- a/apps/client/src/widgets/launch_bar/GenericButtons.tsx +++ b/apps/client/src/widgets/launch_bar/GenericButtons.tsx @@ -7,32 +7,18 @@ import { isCtrlKey } from "../../services/utils"; import { useGlobalShortcut, useNoteLabel } from "../react/hooks"; import { LaunchBarActionButton, useLauncherIconAndTitle } from "./launch_bar_widgets"; -export function CustomNoteLauncher({ launcherNote, getTargetNoteId, getHoistedNoteId }: { +export function CustomNoteLauncher(props: { launcherNote: FNote; getTargetNoteId: (launcherNote: FNote) => string | null | Promise; getHoistedNoteId?: (launcherNote: FNote) => string | null; keyboardShortcut?: string; }) { + const { launcherNote, getTargetNoteId } = props; const { icon, title } = useLauncherIconAndTitle(launcherNote); const launch = useCallback(async (evt: MouseEvent | KeyboardEvent) => { - if (evt.which === 3) { - return; - } - - const targetNoteId = await getTargetNoteId(launcherNote); - if (!targetNoteId) return; - - const hoistedNoteIdWithDefault = getHoistedNoteId?.(launcherNote) || appContext.tabManager.getActiveContext()?.hoistedNoteId; - const ctrlKey = isCtrlKey(evt); - - if ((evt.which === 1 && ctrlKey) || evt.which === 2) { - const activate = !!evt.shiftKey; - await appContext.tabManager.openInNewTab(targetNoteId, hoistedNoteIdWithDefault, activate); - } else { - await appContext.tabManager.openInSameTab(targetNoteId, hoistedNoteIdWithDefault); - } - }, [ launcherNote, getTargetNoteId, getHoistedNoteId ]); + await launchCustomNoteLauncher(evt, props); + }, [ props ]); // Keyboard shortcut. const [ shortcut ] = useNoteLabel(launcherNote, "keyboardShortcut"); @@ -54,3 +40,24 @@ export function CustomNoteLauncher({ launcherNote, getTargetNoteId, getHoistedNo /> ); } + +export async function launchCustomNoteLauncher(evt: MouseEvent | KeyboardEvent, { launcherNote, getTargetNoteId, getHoistedNoteId }: { + launcherNote: FNote; + getTargetNoteId: (launcherNote: FNote) => string | null | Promise; + getHoistedNoteId?: (launcherNote: FNote) => string | null; +}) { + if (evt.which === 3) return; + + const targetNoteId = await getTargetNoteId(launcherNote); + if (!targetNoteId) return; + + const hoistedNoteIdWithDefault = getHoistedNoteId?.(launcherNote) || appContext.tabManager.getActiveContext()?.hoistedNoteId; + const ctrlKey = isCtrlKey(evt); + + if ((evt.which === 1 && ctrlKey) || evt.which === 2) { + const activate = !!evt.shiftKey; + await appContext.tabManager.openInNewTab(targetNoteId, hoistedNoteIdWithDefault, activate); + } else { + await appContext.tabManager.openInSameTab(targetNoteId, hoistedNoteIdWithDefault); + } +} From ee987dae994fcd1634e7a14da32caa855432ecf6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:44:48 +0200 Subject: [PATCH 163/560] refactor(client): fix typo in container --- apps/client/src/widgets/launch_bar/BookmarkButtons.tsx | 2 +- .../react/{ResponseContainer.tsx => ResponsiveContainer.tsx} | 0 apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename apps/client/src/widgets/react/{ResponseContainer.tsx => ResponsiveContainer.tsx} (100%) diff --git a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx index c02d6cdf87..48bcc867f4 100644 --- a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx +++ b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx @@ -8,7 +8,7 @@ import { t } from "../../services/i18n"; import { FormDropdownSubmenu, FormListItem } from "../react/FormList"; import { useChildNotes, useNote, useNoteIcon, useNoteLabelBoolean } from "../react/hooks"; import NoteLink from "../react/NoteLink"; -import ResponsiveContainer from "../react/ResponseContainer"; +import ResponsiveContainer from "../react/ResponsiveContainer"; import { CustomNoteLauncher, launchCustomNoteLauncher } from "./GenericButtons"; import { LaunchBarContext, LaunchBarDropdownButton, useLauncherIconAndTitle } from "./launch_bar_widgets"; diff --git a/apps/client/src/widgets/react/ResponseContainer.tsx b/apps/client/src/widgets/react/ResponsiveContainer.tsx similarity index 100% rename from apps/client/src/widgets/react/ResponseContainer.tsx rename to apps/client/src/widgets/react/ResponsiveContainer.tsx diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx index bf7aaddd60..d3f974ce9c 100644 --- a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx +++ b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx @@ -22,7 +22,7 @@ import { FormListHeader, FormListItem } from "../react/FormList"; import { useTriliumEvent } from "../react/hooks"; import Icon from "../react/Icon"; import { ParentComponent } from "../react/react_utils"; -import ResponsiveContainer from "../react/ResponseContainer"; +import ResponsiveContainer from "../react/ResponsiveContainer"; import { TabContext } from "./ribbon-interface"; import { SEARCH_OPTIONS, SearchOption } from "./SearchDefinitionOptions"; From fbb0bb749182354590aa8c424e9dba80075e6786 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:47:40 +0200 Subject: [PATCH 164/560] Revert "feat(mobile): make the sidebar gesture easier to press" This reverts commit f8b386e42d0adbb7c4f927216aa668c8c62b4535. --- .../mobile_widgets/sidebar_container.ts | 32 ++++++------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/apps/client/src/widgets/mobile_widgets/sidebar_container.ts b/apps/client/src/widgets/mobile_widgets/sidebar_container.ts index e52c0dff49..ef719d36a9 100644 --- a/apps/client/src/widgets/mobile_widgets/sidebar_container.ts +++ b/apps/client/src/widgets/mobile_widgets/sidebar_container.ts @@ -22,7 +22,6 @@ export default class SidebarContainer extends FlexContainer { private currentTranslate: number; private dragState: number; private startX?: number; - private startY?: number; private translatePercentage: number; private sidebarEl!: HTMLElement; private backdropEl!: HTMLElement; @@ -52,13 +51,11 @@ export default class SidebarContainer extends FlexContainer { #onDragStart(e: TouchEvent | MouseEvent) { const x = "touches" in e ? e.touches[0].clientX : e.clientX; - const y = "touches" in e ? e.touches[0].clientY : e.clientY; this.startX = x; - this.startY = y; // Prevent dragging if too far from the edge of the screen and the menu is closed. - const dragRefX = glob.isRtl ? this.screenWidth - x : x; - if (dragRefX > 300 && this.currentTranslate === -100) { + let dragRefX = glob.isRtl ? this.screenWidth - x : x; + if (dragRefX > 30 && this.currentTranslate === -100) { return; } @@ -68,26 +65,13 @@ export default class SidebarContainer extends FlexContainer { } #onDragMove(e: TouchEvent | MouseEvent) { - if (this.dragState === DRAG_STATE_NONE || !this.startX || !this.startY) { + if (this.dragState === DRAG_STATE_NONE || !this.startX) { return; } const x = "touches" in e ? e.touches[0].clientX : e.clientX; - const y = "touches" in e ? e.touches[0].clientY : e.clientY; const deltaX = glob.isRtl ? this.startX - x : x - this.startX; - const deltaY = y - this.startY; - if (this.dragState === DRAG_STATE_INITIAL_DRAG) { - // Check if the gesture is more horizontal than vertical - const absDeltaX = Math.abs(deltaX); - const absDeltaY = Math.abs(deltaY); - - // If movement is more vertical than horizontal, cancel the drag to allow scrolling - if (absDeltaY > absDeltaX * 1.5) { - this.dragState = DRAG_STATE_NONE; - return; - } - if (this.currentTranslate === -100 ? deltaX > DRAG_CLOSED_START_THRESHOLD : deltaX < -DRAG_OPENED_START_THRESHOLD) { /* Disable the transitions since they affect performance, they are going to reenabled once drag ends. */ this.sidebarEl.style.transition = "none"; @@ -105,7 +89,7 @@ export default class SidebarContainer extends FlexContainer { } } else if (this.dragState === DRAG_STATE_DRAGGING) { const width = this.sidebarEl.offsetWidth; - const translatePercentage = Math.min(0, Math.max(this.currentTranslate + (deltaX / width) * 100, -100)); + let translatePercentage = Math.min(0, Math.max(this.currentTranslate + (deltaX / width) * 100, -100)); const backdropOpacity = Math.max(0, 1 + translatePercentage / 100); this.translatePercentage = translatePercentage; if (glob.isRtl) { @@ -176,10 +160,12 @@ export default class SidebarContainer extends FlexContainer { this.sidebarEl.classList.toggle("show", isOpen); if (isOpen) { this.sidebarEl.style.transform = "translateX(0)"; - } else if (glob.isRtl) { - this.sidebarEl.style.transform = "translateX(100%)"; } else { - this.sidebarEl.style.transform = "translateX(-100%)"; + if (glob.isRtl) { + this.sidebarEl.style.transform = "translateX(100%)" + } else { + this.sidebarEl.style.transform = "translateX(-100%)"; + } } this.sidebarEl.style.transition = this.originalSidebarTransition; From 397d04dd8869a23cd7641522c68ead462088231f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:48:38 +0200 Subject: [PATCH 165/560] style(client): fix rounded corners in launcher bar dropdown --- apps/client/src/stylesheets/style.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index ba1bf6cee8..acfdf6da40 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1554,6 +1554,11 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { max-height: calc(var(--tn-modal-max-height) - var(--dropdown-bottom)); } + body.mobile #launcher-container .dropdown > .dropdown-menu.show { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + } + body.mobile .dropdown-menu.mobile-bottom-menu.show { --dropdown-bottom: 0px; padding-bottom: calc(max(var(--menu-padding-size), env(safe-area-inset-bottom))) !important; From 14a8bdb0c0e07fa19ade89c5ce03a3f843292021 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:53:54 +0200 Subject: [PATCH 166/560] chore(launch_bar): add backdrop on mobile for dropdown menus --- apps/client/src/widgets/launch_bar/launch_bar_widgets.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/launch_bar/launch_bar_widgets.tsx b/apps/client/src/widgets/launch_bar/launch_bar_widgets.tsx index bb4a053c89..639b5aede7 100644 --- a/apps/client/src/widgets/launch_bar/launch_bar_widgets.tsx +++ b/apps/client/src/widgets/launch_bar/launch_bar_widgets.tsx @@ -49,6 +49,7 @@ export function LaunchBarDropdownButton({ children, icon, dropdownOptions, ...pr placement: isHorizontalLayout ? "bottom" : "right" } }} + mobileBackdrop {...props} >{children} ); From ab0585609a40cf3e9f88423650cda70fd45f2dd8 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 21:57:49 +0200 Subject: [PATCH 167/560] chore(mobile/attachments): use bottom-style menu for actions --- apps/client/src/widgets/type_widgets/Attachment.css | 4 ---- apps/client/src/widgets/type_widgets/Attachment.tsx | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/Attachment.css b/apps/client/src/widgets/type_widgets/Attachment.css index 014a00b6e5..413d294599 100644 --- a/apps/client/src/widgets/type_widgets/Attachment.css +++ b/apps/client/src/widgets/type_widgets/Attachment.css @@ -127,10 +127,6 @@ /* #region Attachment actions */ -.attachment-actions .dropdown-menu { - width: 20em; -} - .attachment-actions .dropdown-item .tn-icon { position: relative; top: 3px; diff --git a/apps/client/src/widgets/type_widgets/Attachment.tsx b/apps/client/src/widgets/type_widgets/Attachment.tsx index 95bc3c340c..041814589c 100644 --- a/apps/client/src/widgets/type_widgets/Attachment.tsx +++ b/apps/client/src/widgets/type_widgets/Attachment.tsx @@ -239,6 +239,8 @@ function AttachmentActions({ attachment, copyAttachmentLinkToClipboard }: { atta text={} buttonClassName="icon-action-always-border" iconAction + dropdownContainerClassName="mobile-bottom-menu" + mobileBackdrop > Date: Thu, 5 Feb 2026 22:02:11 +0200 Subject: [PATCH 168/560] chore(mobile/attachments): improve layout --- apps/client/src/widgets/type_widgets/Attachment.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/client/src/widgets/type_widgets/Attachment.css b/apps/client/src/widgets/type_widgets/Attachment.css index 413d294599..c345b77d49 100644 --- a/apps/client/src/widgets/type_widgets/Attachment.css +++ b/apps/client/src/widgets/type_widgets/Attachment.css @@ -10,6 +10,12 @@ display: flex; justify-content: space-between; align-items: baseline; + + @media (max-width: 991px) { + margin-block: 1em; + flex-direction: column; + gap: 0.5em; + } } /* #endregion */ @@ -42,6 +48,12 @@ display: flex; align-items: center; gap: 1em; + + @media (max-width: 991px) { + gap: 0.5em; + flex-wrap: wrap; + .attachment-title { flex-grow: 1; } + } } .attachment-details { From 29ce004974cb0bf0ff2dad7717dc273af3025d07 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 22:13:09 +0200 Subject: [PATCH 169/560] chore(mobile): add possible work-around for note switcher sometimes disappearing --- apps/client/src/widgets/layout/NoteTitleActions.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/layout/NoteTitleActions.tsx b/apps/client/src/widgets/layout/NoteTitleActions.tsx index 7c4e68698a..c11b690b51 100644 --- a/apps/client/src/widgets/layout/NoteTitleActions.tsx +++ b/apps/client/src/widgets/layout/NoteTitleActions.tsx @@ -23,7 +23,7 @@ export default function NoteTitleActions() { {noteType === "search" && } - {viewScope?.viewMode === "default" && } + {!viewScope?.viewMode || viewScope.viewMode === "default" && }
    ); } From a2921cb98242eb19964afd066ce355c3162fcbcb Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 22:15:41 +0200 Subject: [PATCH 170/560] fix(mobile): missing snap in board view --- apps/client/src/widgets/collections/board/index.css | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/collections/board/index.css b/apps/client/src/widgets/collections/board/index.css index 9d2e44b0e3..4851410db8 100644 --- a/apps/client/src/widgets/collections/board/index.css +++ b/apps/client/src/widgets/collections/board/index.css @@ -10,12 +10,6 @@ --card-padding: 0.6em; } -body.mobile .board-view { - scroll-snap-type: x mandatory; - -webkit-overflow-scrolling: touch; - scroll-behavior: smooth; -} - .board-view-container { height: 100%; display: flex; @@ -26,6 +20,12 @@ body.mobile .board-view { overflow-x: auto; } +body.mobile .board-view-container { + scroll-snap-type: x mandatory; + -webkit-overflow-scrolling: touch; + scroll-behavior: smooth; +} + .board-view-container .board-column { width: 250px; flex-shrink: 0; From 8a7bcc316ea39dd854c654933ec5144ea809df78 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 5 Feb 2026 22:25:01 +0200 Subject: [PATCH 171/560] chore(mobile): address requested changes --- .../client/src/widgets/launch_bar/BookmarkButtons.tsx | 2 +- apps/client/src/widgets/layout/NoteTitleActions.tsx | 2 +- .../src/widgets/mobile_widgets/mobile_detail_menu.tsx | 2 +- .../client/src/widgets/ribbon/SearchDefinitionTab.tsx | 11 ++++++----- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx index 48bcc867f4..81f2c6e878 100644 --- a/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx +++ b/apps/client/src/widgets/launch_bar/BookmarkButtons.tsx @@ -57,7 +57,7 @@ function SingleBookmark({ note }: { note: FNote }) { function MobileBookmarkItem({ noteId, bookmarkFolder }: { noteId: string, bookmarkFolder: boolean }) { const note = useNote(noteId); const noteIcon = useNoteIcon(note); - if (!note) return; + if (!note) return null; return ( !bookmarkFolder diff --git a/apps/client/src/widgets/layout/NoteTitleActions.tsx b/apps/client/src/widgets/layout/NoteTitleActions.tsx index c11b690b51..73ad3e0e89 100644 --- a/apps/client/src/widgets/layout/NoteTitleActions.tsx +++ b/apps/client/src/widgets/layout/NoteTitleActions.tsx @@ -23,7 +23,7 @@ export default function NoteTitleActions() { {noteType === "search" && } - {!viewScope?.viewMode || viewScope.viewMode === "default" && } + {(!viewScope?.viewMode || viewScope.viewMode === "default") && }
    ); } diff --git a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx index 2aa527feaa..909d3b6288 100644 --- a/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx +++ b/apps/client/src/widgets/mobile_widgets/mobile_detail_menu.tsx @@ -194,7 +194,7 @@ function NoteInfoModal({ note, modalShown, setModalShown }: { note: FNote | null show={modalShown} onHidden={() => setModalShown(false)} > - {note && } + {note && } ); } diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx index d3f974ce9c..2d58fc1913 100644 --- a/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx +++ b/apps/client/src/widgets/ribbon/SearchDefinitionTab.tsx @@ -87,9 +87,10 @@ export default function SearchDefinitionTab({ note, ntxId, hidden }: Pick{t("search_definition.add_search_option")} ( + desktop={searchOptions?.availableOptions.map(({ icon, label, tooltip, attributeName, attributeType, defaultValue }) => (