From e011f991616193a3d9ef55b14fac8c535c69e27f Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 17 Nov 2025 18:58:40 +0200 Subject: [PATCH 001/697] client: add support for custom menu items --- apps/client/src/menus/context_menu.ts | 245 ++++++++++++++------------ 1 file changed, 133 insertions(+), 112 deletions(-) diff --git a/apps/client/src/menus/context_menu.ts b/apps/client/src/menus/context_menu.ts index 9efdac65f8..d4e9693d83 100644 --- a/apps/client/src/menus/context_menu.ts +++ b/apps/client/src/menus/context_menu.ts @@ -2,7 +2,7 @@ import { KeyboardActionNames } from "@triliumnext/commons"; import keyboardActionService, { getActionSync } from "../services/keyboard_actions.js"; import note_tooltip from "../services/note_tooltip.js"; import utils from "../services/utils.js"; -import { should } from "vitest"; +import { h, JSX, render } from "preact"; export interface ContextMenuOptions { x: number; @@ -15,6 +15,11 @@ export interface ContextMenuOptions { onHide?: () => void; } +export interface CustomMenuItem { + kind: "custom", + componentFn: () => JSX.Element; +} + export interface MenuSeparatorItem { kind: "separator"; } @@ -51,7 +56,7 @@ export interface MenuCommandItem { columns?: number; } -export type MenuItem = MenuCommandItem | MenuSeparatorItem | MenuHeader; +export type MenuItem = MenuCommandItem | CustomMenuItem | MenuSeparatorItem | MenuHeader; export type MenuHandler = (item: MenuCommandItem, e: JQuery.MouseDownEvent) => void; export type ContextMenuEvent = PointerEvent | MouseEvent | JQuery.ContextMenuEvent; @@ -202,118 +207,14 @@ class ContextMenu { $group.append($("
").addClass("dropdown-header").text(item.title)); shouldResetGroup = true; } else { - const $icon = $(""); - - if ("uiIcon" in item || "checked" in item) { - const icon = (item.checked ? "bx bx-check" : item.uiIcon); - if (icon) { - $icon.addClass(icon); - } else { - $icon.append(" "); - } + if ("kind" in item && item.kind === "custom") { + // Custom menu item + $group.append(this.createCustomMenuItem(item)); + } else { + // Standard menu item + $group.append(this.createMenuItem(item)); } - const $link = $("") - .append($icon) - .append("   ") // some space between icon and text - .append(item.title); - - if ("badges" in item && item.badges) { - for (let badge of item.badges) { - const badgeElement = $(``).text(badge.title); - - if (badge.className) { - badgeElement.addClass(badge.className); - } - - $link.append(badgeElement); - } - } - - if ("keyboardShortcut" in item && item.keyboardShortcut) { - const shortcuts = getActionSync(item.keyboardShortcut).effectiveShortcuts; - if (shortcuts) { - const allShortcuts: string[] = []; - for (const effectiveShortcut of shortcuts) { - allShortcuts.push(effectiveShortcut.split("+") - .map(key => `${key}`) - .join("+")); - } - - if (allShortcuts.length) { - const container = $("").addClass("keyboard-shortcut"); - container.append($(allShortcuts.join(","))); - $link.append(container); - } - } - } else if ("shortcut" in item && item.shortcut) { - $link.append($("").text(item.shortcut)); - } - - const $item = $("
  • ") - .addClass("dropdown-item") - .append($link) - .on("contextmenu", (e) => false) - // important to use mousedown instead of click since the former does not change focus - // (especially important for focused text for spell check) - .on("mousedown", (e) => { - e.stopPropagation(); - - if (e.which !== 1) { - // only left click triggers menu items - return false; - } - - if (this.isMobile && "items" in item && item.items) { - const $item = $(e.target).closest(".dropdown-item"); - - $item.toggleClass("submenu-open"); - $item.find("ul.dropdown-menu").toggleClass("show"); - return false; - } - - if ("handler" in item && item.handler) { - item.handler(item, e); - } - - this.options?.selectMenuItemHandler(item, e); - - // it's important to stop the propagation especially for sub-menus, otherwise the event - // might be handled again by top-level menu - return false; - }); - - $item.on("mouseup", (e) => { - // Prevent submenu from failing to expand on mobile - if (!this.isMobile || !("items" in item && item.items)) { - e.stopPropagation(); - // Hide the content menu on mouse up to prevent the mouse event from propagating to the elements below. - this.hide(); - return false; - } - }); - - if ("enabled" in item && item.enabled !== undefined && !item.enabled) { - $item.addClass("disabled"); - } - - if ("items" in item && item.items) { - $item.addClass("dropdown-submenu"); - $link.addClass("dropdown-toggle"); - - const $subMenu = $("
      ").addClass("dropdown-menu"); - const hasColumns = !!item.columns && item.columns > 1; - if (!this.isMobile && hasColumns) { - $subMenu.css("column-count", item.columns!); - } - - this.addItems($subMenu, item.items, hasColumns); - - $item.append($subMenu); - } - - $group.append($item); - // After adding a menu item, if the previous item was a separator or header, // reset the group so that the next item will be appended directly to the parent. if (shouldResetGroup) { @@ -324,6 +225,126 @@ class ContextMenu { } } + private createCustomMenuItem(item: CustomMenuItem) { + const element = document.createElement("li"); + element.classList.add("dropdown-custom-item"); + render(h(item.componentFn, {}), element); + return element; + } + + private createMenuItem(item: MenuCommandItem) { + const $icon = $(""); + + if ("uiIcon" in item || "checked" in item) { + const icon = (item.checked ? "bx bx-check" : item.uiIcon); + if (icon) { + $icon.addClass(icon); + } else { + $icon.append(" "); + } + } + + const $link = $("") + .append($icon) + .append("   ") // some space between icon and text + .append(item.title); + + if ("badges" in item && item.badges) { + for (let badge of item.badges) { + const badgeElement = $(``).text(badge.title); + + if (badge.className) { + badgeElement.addClass(badge.className); + } + + $link.append(badgeElement); + } + } + + if ("keyboardShortcut" in item && item.keyboardShortcut) { + const shortcuts = getActionSync(item.keyboardShortcut).effectiveShortcuts; + if (shortcuts) { + const allShortcuts: string[] = []; + for (const effectiveShortcut of shortcuts) { + allShortcuts.push(effectiveShortcut.split("+") + .map(key => `${key}`) + .join("+")); + } + + if (allShortcuts.length) { + const container = $("").addClass("keyboard-shortcut"); + container.append($(allShortcuts.join(","))); + $link.append(container); + } + } + } else if ("shortcut" in item && item.shortcut) { + $link.append($("").text(item.shortcut)); + } + + const $item = $("
    • ") + .addClass("dropdown-item") + .append($link) + .on("contextmenu", (e) => false) + // important to use mousedown instead of click since the former does not change focus + // (especially important for focused text for spell check) + .on("mousedown", (e) => { + e.stopPropagation(); + + if (e.which !== 1) { + // only left click triggers menu items + return false; + } + + if (this.isMobile && "items" in item && item.items) { + const $item = $(e.target).closest(".dropdown-item"); + + $item.toggleClass("submenu-open"); + $item.find("ul.dropdown-menu").toggleClass("show"); + return false; + } + + if ("handler" in item && item.handler) { + item.handler(item, e); + } + + this.options?.selectMenuItemHandler(item, e); + + // it's important to stop the propagation especially for sub-menus, otherwise the event + // might be handled again by top-level menu + return false; + }); + + $item.on("mouseup", (e) => { + // Prevent submenu from failing to expand on mobile + if (!this.isMobile || !("items" in item && item.items)) { + e.stopPropagation(); + // Hide the content menu on mouse up to prevent the mouse event from propagating to the elements below. + this.hide(); + return false; + } + }); + + if ("enabled" in item && item.enabled !== undefined && !item.enabled) { + $item.addClass("disabled"); + } + + if ("items" in item && item.items) { + $item.addClass("dropdown-submenu"); + $link.addClass("dropdown-toggle"); + + const $subMenu = $("
        ").addClass("dropdown-menu"); + const hasColumns = !!item.columns && item.columns > 1; + if (!this.isMobile && hasColumns) { + $subMenu.css("column-count", item.columns!); + } + + this.addItems($subMenu, item.items, hasColumns); + + $item.append($subMenu); + } + return $item; + } + async hide() { this.options?.onHide?.(); this.$widget.removeClass("show"); From 5291a6856eb932226710a75f1c769e189f49155a Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 17 Nov 2025 19:14:34 +0200 Subject: [PATCH 002/697] client: create a placeholder for a color picker menu item --- .../src/menus/custom-items/ColorPickerMenuItem.tsx | 9 +++++++++ apps/client/src/menus/tree_context_menu.ts | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx new file mode 100644 index 0000000000..8828810630 --- /dev/null +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx @@ -0,0 +1,9 @@ +import FNote from "../../entities/fnote" + +export interface ColorPickerMenuItemProps { + note: FNote | null; +} + +export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { + return Color Picker +} \ No newline at end of file diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index 7384573d85..b85648a852 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -1,3 +1,4 @@ +import ColorPickerMenuItem from "./custom-items/ColorPickerMenuItem.jsx"; import treeService from "../services/tree.js"; import froca from "../services/froca.js"; import clipboard from "../services/clipboard.js"; @@ -255,7 +256,12 @@ export default class TreeContextMenu implements SelectMenuItemEventListener ColorPickerMenuItem({note}) + }, ]; return items.filter((row) => row !== null) as MenuItem[]; } From 441c55eb313581e8c251f50dd1e23f6395c22a10 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 00:09:12 +0200 Subject: [PATCH 003/697] client/note color picker menu item: add initial implementation --- .../custom-items/ColorPickerMenuItem.css | 15 +++++++++ .../custom-items/ColorPickerMenuItem.tsx | 33 +++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 apps/client/src/menus/custom-items/ColorPickerMenuItem.css diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.css b/apps/client/src/menus/custom-items/ColorPickerMenuItem.css new file mode 100644 index 0000000000..205ac9a29b --- /dev/null +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.css @@ -0,0 +1,15 @@ +.color-picker-menu-item { + display: flex; + gap: 10px; +} + +.color-picker-menu-item > .color-cell { + width: 16px; + height: 16px; + border-radius: 4px; + background: transparent; +} + +.color-picker-menu-item > .color-cell.selected { + outline: 2px solid royalblue; +} \ No newline at end of file diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx index 8828810630..d9b9a3d419 100644 --- a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx @@ -1,9 +1,38 @@ -import FNote from "../../entities/fnote" +import "./ColorPickerMenuItem.css"; +import { useState } from "preact/hooks"; +import attributes from "../../services/attributes"; +import FNote from "../../entities/fnote"; + +const COLORS = ["blue", "green", "cyan", "red", "magenta", "brown", "yellow", ""]; export interface ColorPickerMenuItemProps { note: FNote | null; } export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { - return Color Picker + const {note} = props; + if (!note) return null; + + const [currentColor, setCurrentColor] = useState(note.getLabel("color")?.value ?? ""); + + const onColorCellClicked = (color: string) => { + attributes.setLabel(note.noteId, "color", color); + setCurrentColor(color); + } + + return
        + {COLORS.map((color) => ( + onColorCellClicked(color)} /> + ))} +
        +} + +function ColorCell(props: {color: string, isSelected: boolean, onClick?: () => void}) { + return
        +
        ; } \ No newline at end of file From 8729fe48c382f77ec9b2f88523ff1752c3e07b02 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:09:22 +0200 Subject: [PATCH 004/697] client/note color picker menu item: add support to operate with note IDs as well --- .../custom-items/ColorPickerMenuItem.css | 4 ++ .../custom-items/ColorPickerMenuItem.tsx | 40 ++++++++++++++----- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.css b/apps/client/src/menus/custom-items/ColorPickerMenuItem.css index 205ac9a29b..1f56926a9d 100644 --- a/apps/client/src/menus/custom-items/ColorPickerMenuItem.css +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.css @@ -10,6 +10,10 @@ background: transparent; } +.color-picker-menu-item > .color-cell.disabled-color-cell { + cursor: not-allowed; +} + .color-picker-menu-item > .color-cell.selected { outline: 2px solid royalblue; } \ No newline at end of file diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx index d9b9a3d419..11ca42c48c 100644 --- a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx @@ -1,23 +1,44 @@ import "./ColorPickerMenuItem.css"; -import { useState } from "preact/hooks"; +import { useEffect, useState } from "preact/hooks"; import attributes from "../../services/attributes"; import FNote from "../../entities/fnote"; +import froca from "../../services/froca"; const COLORS = ["blue", "green", "cyan", "red", "magenta", "brown", "yellow", ""]; export interface ColorPickerMenuItemProps { - note: FNote | null; + /** The target Note instance or its ID string. */ + note: FNote | string | null; } export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { - const {note} = props; - if (!note) return null; + if (!props.note) return null; - const [currentColor, setCurrentColor] = useState(note.getLabel("color")?.value ?? ""); + const [note, setNote] = useState(null); + const [currentColor, setCurrentColor] = useState(null); + + + useEffect(() => { + const retrieveNote = async (noteId: string) => { + const result = await froca.getNote(noteId, true); + if (result) { + setNote(result); + setCurrentColor(result.getLabel("color")?.value ?? ""); + } + } + + if (typeof props.note === "string") { + retrieveNote(props.note); // Get the note from the given ID string + } else { + setNote(props.note); + } + }, []); const onColorCellClicked = (color: string) => { - attributes.setLabel(note.noteId, "color", color); - setCurrentColor(color); + if (note) { + attributes.setLabel(note.noteId, "color", color); + setCurrentColor(color); + } } return
        @@ -25,13 +46,14 @@ export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { onColorCellClicked(color)} /> ))}
        } -function ColorCell(props: {color: string, isSelected: boolean, onClick?: () => void}) { - return
        void}) { + return
        ; From e239bca0f2feec792a8028d4e1251e1ed5d88d14 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:10:10 +0200 Subject: [PATCH 005/697] client/note color picker menu item: fix data type --- 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 d4e9693d83..4e28d77680 100644 --- a/apps/client/src/menus/context_menu.ts +++ b/apps/client/src/menus/context_menu.ts @@ -17,7 +17,7 @@ export interface ContextMenuOptions { export interface CustomMenuItem { kind: "custom", - componentFn: () => JSX.Element; + componentFn: () => JSX.Element | null; } export interface MenuSeparatorItem { From 1ac7ce00fb11da89dfa3d2b38b506c8c73f93b5a Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:11:55 +0200 Subject: [PATCH 006/697] client/note color picker menu item: add to the calendar item context menu --- .../src/widgets/collections/calendar/context_menu.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/client/src/widgets/collections/calendar/context_menu.ts b/apps/client/src/widgets/collections/calendar/context_menu.ts index b15ba376d1..31de26de57 100644 --- a/apps/client/src/widgets/collections/calendar/context_menu.ts +++ b/apps/client/src/widgets/collections/calendar/context_menu.ts @@ -1,8 +1,10 @@ +import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem"; import FNote from "../../../entities/fnote"; import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; import link_context_menu from "../../../menus/link_context_menu"; import branches from "../../../services/branches"; import froca from "../../../services/froca"; +import { note } from "mermaid/dist/rendering-util/rendering-elements/shapes/note.js"; import { t } from "../../../services/i18n"; export function openCalendarContextMenu(e: ContextMenuEvent, noteId: string, parentNote: FNote) { @@ -34,6 +36,11 @@ export function openCalendarContextMenu(e: ContextMenuEvent, noteId: string, par await branches.deleteNotes([ branchIdToDelete ], false, false); } } + }, + { kind: "separator" }, + { + kind: "custom", + componentFn: () => ColorPickerMenuItem({note: noteId}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, noteId), From 69ad40c27f6457ba0b5a7a9f6f7f6ecacf870fce Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:12:28 +0200 Subject: [PATCH 007/697] client/note color picker menu item: add to the board item context menu --- apps/client/src/widgets/collections/board/context_menu.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/client/src/widgets/collections/board/context_menu.ts b/apps/client/src/widgets/collections/board/context_menu.ts index 0c818a1112..ba071cf647 100644 --- a/apps/client/src/widgets/collections/board/context_menu.ts +++ b/apps/client/src/widgets/collections/board/context_menu.ts @@ -1,3 +1,4 @@ +import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem"; import FNote from "../../../entities/fnote"; import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; import link_context_menu from "../../../menus/link_context_menu"; @@ -74,6 +75,11 @@ export function openNoteContextMenu(api: Api, event: ContextMenuEvent, note: FNo uiIcon: "bx bx-trash", handler: () => branches.deleteNotes([ branchId ], false, false) }, + { kind: "separator" }, + { + kind: "custom", + componentFn: () => ColorPickerMenuItem({note}) + } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, note.noteId), }); From 79830870ddf3713fca666c4ecc7bc9a41fce87d3 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:13:21 +0200 Subject: [PATCH 008/697] client/note color picker menu item: add to the geo map item context menu --- .../client/src/widgets/collections/geomap/context_menu.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/collections/geomap/context_menu.ts b/apps/client/src/widgets/collections/geomap/context_menu.ts index dd583e266a..a0a6c8fc6a 100644 --- a/apps/client/src/widgets/collections/geomap/context_menu.ts +++ b/apps/client/src/widgets/collections/geomap/context_menu.ts @@ -2,6 +2,7 @@ import type { LatLng, LeafletMouseEvent } from "leaflet"; import appContext, { type CommandMappings } from "../../../components/app_context.js"; import contextMenu, { type MenuItem } from "../../../menus/context_menu.js"; import linkContextMenu from "../../../menus/link_context_menu.js"; +import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem.jsx"; import { t } from "../../../services/i18n.js"; import { createNewNote } from "./api.js"; import { copyTextWithToast } from "../../../services/clipboard_ext.js"; @@ -18,7 +19,12 @@ export default function openContextMenu(noteId: string, e: LeafletMouseEvent, is items = [ ...items, { kind: "separator" }, - { title: t("geo-map-context.remove-from-map"), command: "deleteFromMap", uiIcon: "bx bx-trash" } + { title: t("geo-map-context.remove-from-map"), command: "deleteFromMap", uiIcon: "bx bx-trash" }, + { kind: "separator"}, + { + kind: "custom", + componentFn: () => ColorPickerMenuItem({note: noteId}) + } ]; } From 87fcc0afe616a22f61b0dfef5bbd33e17044620b Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:14:05 +0200 Subject: [PATCH 009/697] client/note color picker menu item: add to the table row context menu --- apps/client/src/widgets/collections/table/context_menu.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/client/src/widgets/collections/table/context_menu.ts b/apps/client/src/widgets/collections/table/context_menu.ts index eb0a303ae6..11d4477caa 100644 --- a/apps/client/src/widgets/collections/table/context_menu.ts +++ b/apps/client/src/widgets/collections/table/context_menu.ts @@ -6,6 +6,7 @@ import { TableData } from "./rows.js"; import link_context_menu from "../../../menus/link_context_menu.js"; import froca from "../../../services/froca.js"; import branches from "../../../services/branches.js"; +import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem.jsx"; import Component from "../../../components/component.js"; import { RefObject } from "preact"; @@ -219,6 +220,11 @@ export function showRowContextMenu(parentComponent: Component, e: MouseEvent, ro title: t("table_context_menu.delete_row"), uiIcon: "bx bx-trash", handler: () => branches.deleteNotes([ rowData.branchId ], false, false) + }, + { kind: "separator"}, + { + kind: "custom", + componentFn: () => ColorPickerMenuItem({note: rowData.noteId}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, rowData.noteId), From e5ac8a0a67a63fd887627bdd5a834a518c03d1a3 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:16:32 +0200 Subject: [PATCH 010/697] client/note color picker menu item: refactor --- .../src/menus/custom-items/ColorPickerMenuItem.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx index 11ca42c48c..729c7c50b8 100644 --- a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx @@ -52,7 +52,14 @@ export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) {
        } -function ColorCell(props: {color: string, isSelected: boolean, isDisabled?: boolean, onClick?: () => void}) { +interface ColorCellProps { + color: string, + isSelected: boolean, + isDisabled?: boolean, + onClick?: () => void +} + +function ColorCell(props: ColorCellProps) { return
        From 870fef3ea63e081d05de20000522514827c508f0 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:17:13 +0200 Subject: [PATCH 011/697] client/note color picker menu item: fix a typo --- apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx index 729c7c50b8..b9e6d876ad 100644 --- a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx @@ -46,7 +46,7 @@ export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { onColorCellClicked(color)} /> ))}
        From 87afc64f16c82bd4690c1e825c5911c81d266f2e Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:21:26 +0200 Subject: [PATCH 012/697] client/note color picker menu item: fix current selection --- apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx index b9e6d876ad..030a853e4c 100644 --- a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx @@ -17,13 +17,11 @@ export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { const [note, setNote] = useState(null); const [currentColor, setCurrentColor] = useState(null); - useEffect(() => { const retrieveNote = async (noteId: string) => { const result = await froca.getNote(noteId, true); if (result) { setNote(result); - setCurrentColor(result.getLabel("color")?.value ?? ""); } } @@ -34,6 +32,10 @@ export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { } }, []); + useEffect(() => { + setCurrentColor(note?.getLabel("color")?.value ?? ""); + }, [note]); + const onColorCellClicked = (color: string) => { if (note) { attributes.setLabel(note.noteId, "color", color); From 72051c86605989400df6351f350dcbd833e7c038 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 01:24:05 +0200 Subject: [PATCH 013/697] client/note color picker menu item: add a separator to the tree context menu --- apps/client/src/menus/tree_context_menu.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index b85648a852..b4b19cabdf 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -258,6 +258,8 @@ export default class TreeContextMenu implements SelectMenuItemEventListener ColorPickerMenuItem({note}) From e6847355e73679d192625357c637a47bb2544dbc Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 02:12:41 +0200 Subject: [PATCH 014/697] client/note color picker menu item: improve the integration with the tree context menu --- apps/client/src/menus/tree_context_menu.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index b4b19cabdf..972f21c117 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -262,7 +262,13 @@ export default class TreeContextMenu implements SelectMenuItemEventListener ColorPickerMenuItem({note}) + componentFn: () => { + if (notOptionsOrHelp && selectedNotes.length === 1) { + return ColorPickerMenuItem({note}); + } else { + return null; + } + } }, ]; return items.filter((row) => row !== null) as MenuItem[]; From d441bccf8b9954130d8a452ef612cb5ac31ac392 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 02:18:14 +0200 Subject: [PATCH 015/697] client/note color picker menu item: refactor --- ...{ColorPickerMenuItem.css => NoteColorPickerMenuItem.css} | 0 ...{ColorPickerMenuItem.tsx => NoteColorPickerMenuItem.tsx} | 6 +++--- apps/client/src/menus/tree_context_menu.ts | 4 ++-- apps/client/src/widgets/collections/board/context_menu.ts | 4 ++-- .../client/src/widgets/collections/calendar/context_menu.ts | 4 ++-- apps/client/src/widgets/collections/geomap/context_menu.ts | 4 ++-- apps/client/src/widgets/collections/table/context_menu.ts | 4 ++-- 7 files changed, 13 insertions(+), 13 deletions(-) rename apps/client/src/menus/custom-items/{ColorPickerMenuItem.css => NoteColorPickerMenuItem.css} (100%) rename apps/client/src/menus/custom-items/{ColorPickerMenuItem.tsx => NoteColorPickerMenuItem.tsx} (92%) diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.css b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css similarity index 100% rename from apps/client/src/menus/custom-items/ColorPickerMenuItem.css rename to apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css diff --git a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx similarity index 92% rename from apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx rename to apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 030a853e4c..3d0b5e7fde 100644 --- a/apps/client/src/menus/custom-items/ColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -1,4 +1,4 @@ -import "./ColorPickerMenuItem.css"; +import "./NoteColorPickerMenuItem.css"; import { useEffect, useState } from "preact/hooks"; import attributes from "../../services/attributes"; import FNote from "../../entities/fnote"; @@ -6,12 +6,12 @@ import froca from "../../services/froca"; const COLORS = ["blue", "green", "cyan", "red", "magenta", "brown", "yellow", ""]; -export interface ColorPickerMenuItemProps { +export interface NoteColorPickerMenuItemProps { /** The target Note instance or its ID string. */ note: FNote | string | null; } -export default function ColorPickerMenuItem(props: ColorPickerMenuItemProps) { +export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemProps) { if (!props.note) return null; const [note, setNote] = useState(null); diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index 972f21c117..b02eaf970a 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -1,4 +1,4 @@ -import ColorPickerMenuItem from "./custom-items/ColorPickerMenuItem.jsx"; +import NoteColorPickerMenuItem from "./custom-items/NoteColorPickerMenuItem.jsx"; import treeService from "../services/tree.js"; import froca from "../services/froca.js"; import clipboard from "../services/clipboard.js"; @@ -264,7 +264,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener { if (notOptionsOrHelp && selectedNotes.length === 1) { - return ColorPickerMenuItem({note}); + return NoteColorPickerMenuItem({note}); } else { return null; } diff --git a/apps/client/src/widgets/collections/board/context_menu.ts b/apps/client/src/widgets/collections/board/context_menu.ts index ba071cf647..551e96a495 100644 --- a/apps/client/src/widgets/collections/board/context_menu.ts +++ b/apps/client/src/widgets/collections/board/context_menu.ts @@ -1,5 +1,5 @@ -import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem"; import FNote from "../../../entities/fnote"; +import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem"; import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; import link_context_menu from "../../../menus/link_context_menu"; import attributes from "../../../services/attributes"; @@ -78,7 +78,7 @@ export function openNoteContextMenu(api: Api, event: ContextMenuEvent, note: FNo { kind: "separator" }, { kind: "custom", - componentFn: () => ColorPickerMenuItem({note}) + componentFn: () => NoteColorPickerMenuItem({note}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, note.noteId), diff --git a/apps/client/src/widgets/collections/calendar/context_menu.ts b/apps/client/src/widgets/collections/calendar/context_menu.ts index 31de26de57..5120fcc973 100644 --- a/apps/client/src/widgets/collections/calendar/context_menu.ts +++ b/apps/client/src/widgets/collections/calendar/context_menu.ts @@ -1,4 +1,4 @@ -import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem"; +import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem"; import FNote from "../../../entities/fnote"; import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; import link_context_menu from "../../../menus/link_context_menu"; @@ -40,7 +40,7 @@ export function openCalendarContextMenu(e: ContextMenuEvent, noteId: string, par { kind: "separator" }, { kind: "custom", - componentFn: () => ColorPickerMenuItem({note: noteId}) + componentFn: () => NoteColorPickerMenuItem({note: noteId}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, noteId), diff --git a/apps/client/src/widgets/collections/geomap/context_menu.ts b/apps/client/src/widgets/collections/geomap/context_menu.ts index a0a6c8fc6a..c4cf6ebf4d 100644 --- a/apps/client/src/widgets/collections/geomap/context_menu.ts +++ b/apps/client/src/widgets/collections/geomap/context_menu.ts @@ -2,7 +2,7 @@ import type { LatLng, LeafletMouseEvent } from "leaflet"; import appContext, { type CommandMappings } from "../../../components/app_context.js"; import contextMenu, { type MenuItem } from "../../../menus/context_menu.js"; import linkContextMenu from "../../../menus/link_context_menu.js"; -import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem.jsx"; +import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem.jsx"; import { t } from "../../../services/i18n.js"; import { createNewNote } from "./api.js"; import { copyTextWithToast } from "../../../services/clipboard_ext.js"; @@ -23,7 +23,7 @@ export default function openContextMenu(noteId: string, e: LeafletMouseEvent, is { kind: "separator"}, { kind: "custom", - componentFn: () => ColorPickerMenuItem({note: noteId}) + componentFn: () => NoteColorPickerMenuItem({note: noteId}) } ]; } diff --git a/apps/client/src/widgets/collections/table/context_menu.ts b/apps/client/src/widgets/collections/table/context_menu.ts index 11d4477caa..1218dbf6cc 100644 --- a/apps/client/src/widgets/collections/table/context_menu.ts +++ b/apps/client/src/widgets/collections/table/context_menu.ts @@ -6,8 +6,8 @@ import { TableData } from "./rows.js"; import link_context_menu from "../../../menus/link_context_menu.js"; import froca from "../../../services/froca.js"; import branches from "../../../services/branches.js"; -import ColorPickerMenuItem from "../../../menus/custom-items/ColorPickerMenuItem.jsx"; import Component from "../../../components/component.js"; +import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem.jsx"; import { RefObject } from "preact"; export function useContextMenu(parentNote: FNote, parentComponent: Component | null | undefined, tabulator: RefObject): Partial { @@ -224,7 +224,7 @@ export function showRowContextMenu(parentComponent: Component, e: MouseEvent, ro { kind: "separator"}, { kind: "custom", - componentFn: () => ColorPickerMenuItem({note: rowData.noteId}) + componentFn: () => NoteColorPickerMenuItem({note: rowData.noteId}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, rowData.noteId), From 01d6dee9fcca4eb017c6fcc20373c03ac5784f1b Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 17:23:57 +0200 Subject: [PATCH 016/697] client/note color picker menu item: improve label handling --- .../custom-items/NoteColorPickerMenuItem.tsx | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 3d0b5e7fde..60757aa155 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -4,7 +4,7 @@ import attributes from "../../services/attributes"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; -const COLORS = ["blue", "green", "cyan", "red", "magenta", "brown", "yellow", ""]; +const COLORS = ["blue", "green", "cyan", "red", "magenta", "brown", "yellow", null]; export interface NoteColorPickerMenuItemProps { /** The target Note instance or its ID string. */ @@ -33,17 +33,23 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr }, []); useEffect(() => { - setCurrentColor(note?.getLabel("color")?.value ?? ""); + setCurrentColor(note?.getLabel("color")?.value ?? null); }, [note]); - const onColorCellClicked = (color: string) => { + const onColorCellClicked = (color: string | null) => { if (note) { - attributes.setLabel(note.noteId, "color", color); + if (color !== null) { + attributes.setLabel(note.noteId, "color", color); + } else { + attributes.removeOwnedLabelByName(note, "color"); + } + setCurrentColor(color); } } - return
        + return
        {e.stopPropagation()}}> {COLORS.map((color) => ( void @@ -63,7 +69,7 @@ interface ColorCellProps { function ColorCell(props: ColorCellProps) { return
        ; } \ No newline at end of file From 5ecd8b41e50804195720729f26d120f9c2e97b32 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 19:05:20 +0200 Subject: [PATCH 017/697] client/note color picker menu item: add support to select a custom color --- .../custom-items/NoteColorPickerMenuItem.tsx | 77 +++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 60757aa155..14a908cc85 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -1,5 +1,6 @@ import "./NoteColorPickerMenuItem.css"; -import { useEffect, useState } from "preact/hooks"; +import { useEffect, useRef, useState} from "preact/hooks"; +import {ComponentChildren} from "preact"; import attributes from "../../services/attributes"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; @@ -55,21 +56,87 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr color={color} isSelected={(color === currentColor)} isDisabled={(note === null)} - onClick={() => onColorCellClicked(color)} /> + onSelect={() => onColorCellClicked(color)} /> ))} + +
        } interface ColorCellProps { + children?: ComponentChildren, + className?: string; color: string | null, isSelected: boolean, isDisabled?: boolean, - onClick?: () => void + onSelect?: (color: string | null) => void } function ColorCell(props: ColorCellProps) { - return
        + onClick={() => props.onSelect?.(props.color)}> + {props.children}
        ; +} + +function CustomColorCell(props: ColorCellProps) { + const colorInput = useRef(null); + let colorInputDebouncer: Debouncer; + + useEffect(() => { + colorInputDebouncer = new Debouncer(500, (color) => { + props.onSelect?.(color); + }); + + return () => { + colorInputDebouncer.destroy(); + } + }); + + return <> + {colorInput.current?.click()}}> + + {colorInputDebouncer.updateValue(colorInput.current?.value ?? null)}} + style="width: 0; height: 0; opacity: 0" /> + + +} + +type DebouncerCallback = (value: T) => void; + +class Debouncer { + + private debounceInterval: number; + private callback: DebouncerCallback; + private lastValue: T | undefined; + private timeoutId: any | null = null; + + constructor(debounceInterval: number, onUpdate: DebouncerCallback) { + this.debounceInterval = debounceInterval; + this.callback = onUpdate; + } + + updateValue(value: T) { + this.lastValue = value; + this.destroy(); + this.timeoutId = setTimeout(this.reportUpdate.bind(this), this.debounceInterval); + } + + destroy() { + if (this.timeoutId !== null) { + clearTimeout(this.timeoutId); + } + } + + private reportUpdate() { + if (this.lastValue !== undefined) { + this.callback(this.lastValue); + } + } } \ No newline at end of file From 45747183e7e329eae42a05131e2a5a4f7b33685a Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 19:20:17 +0200 Subject: [PATCH 018/697] client/refactor: extract the debouncer to a separate module --- .../custom-items/NoteColorPickerMenuItem.tsx | 34 +------------------ apps/client/src/utils/debouncer.ts | 32 +++++++++++++++++ 2 files changed, 33 insertions(+), 33 deletions(-) create mode 100644 apps/client/src/utils/debouncer.ts diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 14a908cc85..b87387a8ff 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -2,6 +2,7 @@ import "./NoteColorPickerMenuItem.css"; import { useEffect, useRef, useState} from "preact/hooks"; import {ComponentChildren} from "preact"; import attributes from "../../services/attributes"; +import Debouncer from "../../utils/debouncer"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; @@ -106,37 +107,4 @@ function CustomColorCell(props: ColorCellProps) { style="width: 0; height: 0; opacity: 0" /> -} - -type DebouncerCallback = (value: T) => void; - -class Debouncer { - - private debounceInterval: number; - private callback: DebouncerCallback; - private lastValue: T | undefined; - private timeoutId: any | null = null; - - constructor(debounceInterval: number, onUpdate: DebouncerCallback) { - this.debounceInterval = debounceInterval; - this.callback = onUpdate; - } - - updateValue(value: T) { - this.lastValue = value; - this.destroy(); - this.timeoutId = setTimeout(this.reportUpdate.bind(this), this.debounceInterval); - } - - destroy() { - if (this.timeoutId !== null) { - clearTimeout(this.timeoutId); - } - } - - private reportUpdate() { - if (this.lastValue !== undefined) { - this.callback(this.lastValue); - } - } } \ No newline at end of file diff --git a/apps/client/src/utils/debouncer.ts b/apps/client/src/utils/debouncer.ts new file mode 100644 index 0000000000..b37c4118a7 --- /dev/null +++ b/apps/client/src/utils/debouncer.ts @@ -0,0 +1,32 @@ +export type DebouncerCallback = (value: T) => void; + +export default class Debouncer { + + private debounceInterval: number; + private callback: DebouncerCallback; + private lastValue: T | undefined; + private timeoutId: any | null = null; + + constructor(debounceInterval: number, onUpdate: DebouncerCallback) { + this.debounceInterval = debounceInterval; + this.callback = onUpdate; + } + + updateValue(value: T) { + this.lastValue = value; + this.destroy(); + this.timeoutId = setTimeout(this.reportUpdate.bind(this), this.debounceInterval); + } + + destroy() { + if (this.timeoutId !== null) { + clearTimeout(this.timeoutId); + } + } + + private reportUpdate() { + if (this.lastValue !== undefined) { + this.callback(this.lastValue); + } + } +} \ No newline at end of file From c81aef6d0596f1f065a3f2b934b3bb50ff84ea4f Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Tue, 18 Nov 2025 22:18:15 +0200 Subject: [PATCH 019/697] client/note color picker menu item: update the color palette --- .../src/menus/custom-items/NoteColorPickerMenuItem.css | 4 ++-- .../src/menus/custom-items/NoteColorPickerMenuItem.tsx | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css index 1f56926a9d..e94511138e 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css @@ -4,8 +4,8 @@ } .color-picker-menu-item > .color-cell { - width: 16px; - height: 16px; + width: 13px; + height: 13px; border-radius: 4px; background: transparent; } diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index b87387a8ff..66b4010d93 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -6,7 +6,10 @@ import Debouncer from "../../utils/debouncer"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; -const COLORS = ["blue", "green", "cyan", "red", "magenta", "brown", "yellow", null]; +const COLORS = [ + "#e64d4d", "#e6994d", "#e5e64d", "#99e64d", "#4de64d", "#4de699", + "#4de5e6", "#4d99e6", "#4d4de6", "#994de6", null +]; export interface NoteColorPickerMenuItemProps { /** The target Note instance or its ID string. */ From 79dc5e4344de27f2785c7ac54a86519480a230e6 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 19 Nov 2025 00:53:18 +0200 Subject: [PATCH 020/697] client/note color picker menu item: tweak style --- .../custom-items/NoteColorPickerMenuItem.css | 57 ++++++++++++++++--- .../custom-items/NoteColorPickerMenuItem.tsx | 27 +++++++-- 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css index e94511138e..35029699f9 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css @@ -1,19 +1,60 @@ .color-picker-menu-item { display: flex; - gap: 10px; + gap: 8px; + justify-content: space-between; } -.color-picker-menu-item > .color-cell { - width: 13px; - height: 13px; +.color-picker-menu-item .color-cell { + width: 14px; + height: 14px; border-radius: 4px; - background: transparent; + background: var(--color); } -.color-picker-menu-item > .color-cell.disabled-color-cell { +.color-picker-menu-item .color-cell.disabled-color-cell { cursor: not-allowed; } -.color-picker-menu-item > .color-cell.selected { - outline: 2px solid royalblue; +.color-picker-menu-item .color-cell.selected { + outline: 2px solid var(--color); + outline-offset: 2px; +} + +.color-cell-reset::before, +.custom-color-cell::before { + position: absolute; + display: flex; + top: 0; + left: 0; + right: 0; + bottom: 0; + font-size: 14px; + justify-content: center; + align-items: center; + font-family: boxicons; + color: black; +} + +.color-cell-reset { + position: relative; + --color: rgba(255, 255, 255, .4); +} + +.color-cell-reset::before { + content: "\ec8d"; + mix-blend-mode: normal; + color: black; +} + +.custom-color-cell { + position: relative; + display: flex; + justify-content: center; + background: var(--color); +} + +.custom-color-cell::before { + content: "\ed35"; + color: var(--foreground); + font-size: 16px; } \ No newline at end of file diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 66b4010d93..3db6260130 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -2,13 +2,14 @@ import "./NoteColorPickerMenuItem.css"; import { useEffect, useRef, useState} from "preact/hooks"; import {ComponentChildren} from "preact"; import attributes from "../../services/attributes"; +import Color, { ColorInstance } from "color"; import Debouncer from "../../utils/debouncer"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; const COLORS = [ - "#e64d4d", "#e6994d", "#e5e64d", "#99e64d", "#4de64d", "#4de699", - "#4de5e6", "#4d99e6", "#4d4de6", "#994de6", null + null, "#e64d4d", "#e6994d", "#e5e64d", "#99e64d", "#4de64d", "#4de699", + "#4de5e6", "#4d99e6", "#4d4de6", "#994de6" ]; export interface NoteColorPickerMenuItemProps { @@ -57,6 +58,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr onClick={(e) => {e.stopPropagation()}}> {COLORS.map((color) => ( props.onSelect?.(props.color)}> {props.children}
        ; @@ -98,7 +100,7 @@ function CustomColorCell(props: ColorCellProps) { } }); - return <> + return
        {colorInput.current?.click()}}> @@ -109,5 +111,20 @@ function CustomColorCell(props: ColorCellProps) { onChange={() => {colorInputDebouncer.updateValue(colorInput.current?.value ?? null)}} style="width: 0; height: 0; opacity: 0" /> - +
        +} + +function ensureContrast(color: string | null) { + if (color === null) return "inherit"; + + const colorHsl = Color(color).hsl(); + let l = colorHsl.lightness(); + + if (l >= 40) { + l = 0; + } else { + l = 100 + } + + return colorHsl.saturationl(0).lightness(l).hex(); } \ No newline at end of file From c25859cee9d260528a0db1aca32b5f128d85b148 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 19 Nov 2025 00:57:45 +0200 Subject: [PATCH 021/697] client/debouncer: report pending updates before destroying --- apps/client/src/utils/debouncer.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/client/src/utils/debouncer.ts b/apps/client/src/utils/debouncer.ts index b37c4118a7..9057d039fe 100644 --- a/apps/client/src/utils/debouncer.ts +++ b/apps/client/src/utils/debouncer.ts @@ -14,12 +14,15 @@ export default class Debouncer { updateValue(value: T) { this.lastValue = value; - this.destroy(); + if (this.timeoutId !== null) { + clearTimeout(this.timeoutId); + } this.timeoutId = setTimeout(this.reportUpdate.bind(this), this.debounceInterval); } destroy() { if (this.timeoutId !== null) { + this.reportUpdate(); clearTimeout(this.timeoutId); } } From 828a786414b4d5b744d1d68dfe7e286b6944ae56 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 01:35:44 +0200 Subject: [PATCH 022/697] client/note color picker menu item: improve --- .../custom-items/NoteColorPickerMenuItem.css | 23 ++++-- .../custom-items/NoteColorPickerMenuItem.tsx | 78 ++++++++++++++---- .../src/menus/custom-items/custom-culor.png | Bin 0 -> 1259 bytes 3 files changed, 77 insertions(+), 24 deletions(-) create mode 100644 apps/client/src/menus/custom-items/custom-culor.png diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css index 35029699f9..d062ea5774 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css @@ -4,18 +4,22 @@ justify-content: space-between; } -.color-picker-menu-item .color-cell { +.color-picker-menu-item .color-cell { width: 14px; height: 14px; border-radius: 4px; - background: var(--color); + background-color: var(--color); } -.color-picker-menu-item .color-cell.disabled-color-cell { +.color-picker-menu-item .color-cell:not(.selected):hover { + transform: scale(1.2); +} + +.color-picker-menu-item .color-cell.disabled-color-cell { cursor: not-allowed; } -.color-picker-menu-item .color-cell.selected { +.color-picker-menu-item .color-cell.selected { outline: 2px solid var(--color); outline-offset: 2px; } @@ -28,7 +32,7 @@ left: 0; right: 0; bottom: 0; - font-size: 14px; + font-size: 18px; justify-content: center; align-items: center; font-family: boxicons; @@ -50,9 +54,16 @@ position: relative; display: flex; justify-content: center; - background: var(--color); + } +.custom-color-cell.custom-color-cell-empty { + background-image: url(./custom-culor.png); + background-size: cover; + --foreground: transparent; +} + + .custom-color-cell::before { content: "\ed35"; color: var(--foreground); diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 3db6260130..96f7eba548 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -1,5 +1,5 @@ import "./NoteColorPickerMenuItem.css"; -import { useEffect, useRef, useState} from "preact/hooks"; +import { useCallback, useEffect, useRef, useState} from "preact/hooks"; import {ComponentChildren} from "preact"; import attributes from "../../services/attributes"; import Color, { ColorInstance } from "color"; @@ -22,12 +22,13 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr const [note, setNote] = useState(null); const [currentColor, setCurrentColor] = useState(null); + const [isCustomColor, setIsCustomColor] = useState(false); useEffect(() => { const retrieveNote = async (noteId: string) => { - const result = await froca.getNote(noteId, true); - if (result) { - setNote(result); + const noteInstance = await froca.getNote(noteId, true); + if (noteInstance) { + setNote(noteInstance); } } @@ -39,10 +40,27 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr }, []); useEffect(() => { - setCurrentColor(note?.getLabel("color")?.value ?? null); + const colorLabel = note?.getLabel("color")?.value ?? null; + if (colorLabel) { + let color: ColorInstance | null = null; + + try { + color = new Color(colorLabel); + } catch(ex) { + console.error(ex); + } + + if (color) { + setCurrentColor(color.hex().toLowerCase()); + } + } }, [note]); - const onColorCellClicked = (color: string | null) => { + useEffect(() => { + setIsCustomColor(COLORS.indexOf(currentColor) === -1); + }, [currentColor]) + + const onColorCellClicked = useCallback((color: string | null) => { if (note) { if (color !== null) { attributes.setLabel(note.noteId, "color", color); @@ -52,7 +70,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr setCurrentColor(color); } - } + }, [note, currentColor]); return
        {e.stopPropagation()}}> @@ -65,7 +83,9 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr onSelect={() => onColorCellClicked(color)} /> ))} - +
        } @@ -87,28 +107,50 @@ function ColorCell(props: ColorCellProps) { } function CustomColorCell(props: ColorCellProps) { + const [pickedColor, setPickedColor] = useState(null); const colorInput = useRef(null); - let colorInputDebouncer: Debouncer; + const colorInputDebouncer = useRef | null>(null); + const callbackRef = useRef(props.onSelect); useEffect(() => { - colorInputDebouncer = new Debouncer(500, (color) => { - props.onSelect?.(color); + colorInputDebouncer.current = new Debouncer(500, (color) => { + callbackRef.current?.(color); + setPickedColor(color); }); return () => { - colorInputDebouncer.destroy(); + colorInputDebouncer.current?.destroy(); } - }); + }, []); + + useEffect(() => { + if (props.isSelected && pickedColor === null) { + setPickedColor(props.color); + } + }, [props.isSelected]) + + useEffect(() => { + callbackRef.current = props.onSelect; + }, [props.onSelect]); + + const onSelect = useCallback(() => { + if (pickedColor !== null) { + callbackRef.current?.(pickedColor); + } + + colorInput.current?.click(); + }, [pickedColor]); return
        - {colorInput.current?.click()}}> + {colorInputDebouncer.updateValue(colorInput.current?.value ?? null)}} + value={pickedColor ?? props.color ?? "#40bfbf"} + onChange={() => {colorInputDebouncer.current?.updateValue(colorInput.current?.value ?? null)}} style="width: 0; height: 0; opacity: 0" />
        diff --git a/apps/client/src/menus/custom-items/custom-culor.png b/apps/client/src/menus/custom-items/custom-culor.png new file mode 100644 index 0000000000000000000000000000000000000000..4275c56d2e804b1ad6d1057a9b4ef28534491031 GIT binary patch literal 1259 zcmeAS@N?(olHy`uVBq!ia0vp^G9b*s1SJ3FdmIK*jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBufiR<}hF1enP_o1|q9iy!t)x7$D3u`~F*C13&(AeP!Bo#s z&(N@oL+l(-(T>yz&ooa@Ed~xChm}E!k(GfF$npYWX($`y91TWhusFy;hKx)Mf?v*lQd?d7fo&prj{uQbo{ikU4Ww!nAkig0G5O#-Ip`Skl- z^cqVpHf+DByGdYezTdS=nHPe!lBW1MXZ4<1p8hTC^3vTq_G~hd+jBC@?#NuDTL*or zg0!x$shB(WRhIP@FYnot&ptKX?knaq)2rz1qbZl7rvQ~N^UGw#+h^ z`fRCN$f~8~T(#9|Mb=x+IzM3%?vpmUI5T?D`6AWYT^DkB_+NzIS+^&2wY8XEVe+v( ziEB&^6Ha)kdT+QQAz_rDaNg_a$CZ%}r+jT&tYynD`O-Xrdi}aH zF)0D6kzQx+Ww>wYN%<1Hf5{vZhu}WRk1@YKT>d%#`_D%c*UDEGSpR){?#^$X)lK2y zb6?fG{Pwr3@@pyU-N&r`t@pQg&9~Q&yZ4xHdhy+sgQt^z@*jU(V4!(wullKk`BT}J z-k!hpbhOmQ^Yu1U|J?Pi+ZnxQ&uQIt1)asgH$}ckyc4^5IHi8xlgiRfnj3FDzx1~M zHn-}(jZfCkK6<%d#QaA?cPNkU`7LTsRJObj4=byjxM!aB``oai%Wr4r{{C~?I5B;7 zMbYsmR?}}ju*qI?Y|AXK#iqrRR_*$tK5hPK_lFsACtN+ZZ@*Qh>d#h|C+dFvW=eDM znoUt(7uoHNnGsqpd01t_#ngg`E%Rrdne=kb&M&hsc$cjcT`ZmRQSSAcuuh4>zcU`} zRI&Q7q-&Ri$Hu}hFWz(iS8-SO{Pp#R@X@EI3ezJ>HD6sgsT!QcK2M|mqUgrvFWlbM zOtYuHSIP_6nDnwYP;ODt)Ku=&(gkbmUe8INd_YQ@Hzrm-Idk3Y%%JjpyY%<>#wGS1 z*zj=2uG%ZPwnEM}nJw4;uFne!G!ANOX?r~D?Yei{mmf)+Te*C1X*kFGLs#Q@F0R=X jHO0U1%b9Xt7x!QPAGsO_tNzdJ1!Y%HS3j3^P6 Date: Thu, 20 Nov 2025 01:59:14 +0000 Subject: [PATCH 023/697] chore(deps): update dependency @stylistic/eslint-plugin to v5.6.1 --- _regroup/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_regroup/package.json b/_regroup/package.json index 4f35064484..5999d57b62 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -36,7 +36,7 @@ }, "devDependencies": { "@playwright/test": "1.56.1", - "@stylistic/eslint-plugin": "5.6.0", + "@stylistic/eslint-plugin": "5.6.1", "@types/express": "5.0.5", "@types/node": "24.10.1", "@types/yargs": "17.0.35", From 1386d1ae32df318006689102353b2fe89584a9f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:00:10 +0000 Subject: [PATCH 024/697] chore(deps): update dependency electron to v38.7.1 --- apps/desktop/package.json | 2 +- apps/edit-docs/package.json | 2 +- apps/server/package.json | 2 +- pnpm-lock.yaml | 34 +++++++++++++++++++--------------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 076a6b2e3d..284551e29b 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -35,7 +35,7 @@ "@triliumnext/commons": "workspace:*", "@triliumnext/server": "workspace:*", "copy-webpack-plugin": "13.0.1", - "electron": "38.7.0", + "electron": "38.7.1", "@electron-forge/cli": "7.10.2", "@electron-forge/maker-deb": "7.10.2", "@electron-forge/maker-dmg": "7.10.2", diff --git a/apps/edit-docs/package.json b/apps/edit-docs/package.json index f7f7578263..af66c36230 100644 --- a/apps/edit-docs/package.json +++ b/apps/edit-docs/package.json @@ -12,7 +12,7 @@ "@triliumnext/desktop": "workspace:*", "@types/fs-extra": "11.0.4", "copy-webpack-plugin": "13.0.1", - "electron": "38.7.0", + "electron": "38.7.1", "fs-extra": "11.3.2" }, "scripts": { diff --git a/apps/server/package.json b/apps/server/package.json index 49932a29df..95a6add391 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -80,7 +80,7 @@ "debounce": "3.0.0", "debug": "4.4.3", "ejs": "3.1.10", - "electron": "38.7.0", + "electron": "38.7.1", "electron-debug": "4.1.0", "electron-window-state": "5.0.3", "escape-html": "1.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ddfb79f8e..3f1dcb7883 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -364,7 +364,7 @@ importers: dependencies: '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@38.7.0) + version: 2.1.3(electron@38.7.1) better-sqlite3: specifier: 12.4.1 version: 12.4.1 @@ -421,8 +421,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.0)) electron: - specifier: 38.7.0 - version: 38.7.0 + specifier: 38.7.1 + version: 38.7.1 prebuild-install: specifier: 7.1.3 version: 7.1.3 @@ -477,8 +477,8 @@ importers: specifier: 13.0.1 version: 13.0.1(webpack@5.101.3(esbuild@0.27.0)) electron: - specifier: 38.7.0 - version: 38.7.0 + specifier: 38.7.1 + version: 38.7.1 fs-extra: specifier: 11.3.2 version: 11.3.2 @@ -503,7 +503,7 @@ importers: version: 7.1.1 '@electron/remote': specifier: 2.1.3 - version: 2.1.3(electron@38.7.0) + version: 2.1.3(electron@38.7.1) '@preact/preset-vite': specifier: 2.10.2 version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) @@ -646,8 +646,8 @@ importers: specifier: 3.1.10 version: 3.1.10 electron: - specifier: 38.7.0 - version: 38.7.0 + specifier: 38.7.1 + version: 38.7.1 electron-debug: specifier: 4.1.0 version: 4.1.0 @@ -4752,10 +4752,12 @@ packages: '@smithy/core@3.18.3': resolution: {integrity: sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==} engines: {node: '>=18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} @@ -7804,8 +7806,8 @@ packages: resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} engines: {node: '>=8.0.0'} - electron@38.7.0: - resolution: {integrity: sha512-ZHrhfzceUgZwdi6Cd8VS/A10ljIjiHOY5KwZ4iJ5D+JuUYMeS/Uvxbrr1WqjnZUwGe9aUjQHFsxeS3gBWGalOw==} + electron@38.7.1: + resolution: {integrity: sha512-mdFVpL80nZvIvajtl1Xz+2Q/a9tFGVnPO0YW/N+MqQUyZG8D9r3wrWoaEVBXTc1jI+Vkg77Eqqwh5FLiaYRI+A==} engines: {node: '>= 12.20.55'} hasBin: true @@ -15716,6 +15718,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15976,6 +15980,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16484,8 +16490,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.2.0': dependencies: @@ -17330,9 +17334,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/remote@2.1.3(electron@38.7.0)': + '@electron/remote@2.1.3(electron@38.7.1)': dependencies: - electron: 38.7.0 + electron: 38.7.1 '@electron/universal@2.0.2': dependencies: @@ -23691,7 +23695,7 @@ snapshots: - supports-color optional: true - electron@38.7.0: + electron@38.7.1: dependencies: '@electron/get': 2.0.3 '@types/node': 22.18.13 From e72ee606fd06500044efa964ee036d4262ba07dc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:01:27 +0000 Subject: [PATCH 025/697] chore(deps): update dependency lint-staged to v16.2.7 --- 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 | 40 ++++++++++--------- 6 files changed, 26 insertions(+), 24 deletions(-) diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 1452d33886..da24bcb3b6 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -32,7 +32,7 @@ "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 0462fc6885..5785e099fd 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -33,7 +33,7 @@ "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index da7bff274f..780438a451 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -35,7 +35,7 @@ "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 785f02d564..b39eaf7f86 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -36,7 +36,7 @@ "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 421affff85..0467c04067 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -35,7 +35,7 @@ "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", - "lint-staged": "16.2.6", + "lint-staged": "16.2.7", "stylelint": "16.25.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ddfb79f8e..7f64fbd661 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -909,8 +909,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -969,8 +969,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -1029,8 +1029,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -1096,8 +1096,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -1163,8 +1163,8 @@ importers: specifier: 14.1.1 version: 14.1.1 lint-staged: - specifier: 16.2.6 - version: 16.2.6 + specifier: 16.2.7 + version: 16.2.7 stylelint: specifier: 16.25.0 version: 16.25.0(typescript@5.9.3) @@ -4752,10 +4752,12 @@ packages: '@smithy/core@3.18.3': resolution: {integrity: sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==} engines: {node: '>=18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} @@ -6815,8 +6817,8 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} - commander@14.0.1: - resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} commander@2.20.3: @@ -9904,8 +9906,8 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - lint-staged@16.2.6: - resolution: {integrity: sha512-s1gphtDbV4bmW1eylXpVMk2u7is7YsrLl8hzrtvC70h4ByhcMLZFY01Fx05ZUDNuv1H8HO4E+e2zgejV1jVwNw==} + lint-staged@16.2.7: + resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} engines: {node: '>=20.17'} hasBin: true @@ -15976,6 +15978,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16484,8 +16488,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.2.0': dependencies: @@ -22499,7 +22501,7 @@ snapshots: commander@12.1.0: {} - commander@14.0.1: {} + commander@14.0.2: {} commander@2.20.3: {} @@ -26364,9 +26366,9 @@ snapshots: dependencies: uc.micro: 2.1.0 - lint-staged@16.2.6: + lint-staged@16.2.7: dependencies: - commander: 14.0.1 + commander: 14.0.2 listr2: 9.0.5 micromatch: 4.0.8 nano-spawn: 2.0.0 From b20f7aca53c92b70494e090d97f2449bc8c6cc80 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:01:35 +0000 Subject: [PATCH 026/697] chore(deps): update dependency rimraf to v6.1.2 --- _regroup/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_regroup/package.json b/_regroup/package.json index 4f35064484..828411753a 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -47,7 +47,7 @@ "jsdoc": "4.0.5", "lorem-ipsum": "2.0.8", "rcedit": "5.0.1", - "rimraf": "6.1.0", + "rimraf": "6.1.2", "tslib": "2.8.1" }, "optionalDependencies": { From 32e4e6993021a8f36f237e870a07b62a4eabf87f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 02:04:09 +0000 Subject: [PATCH 027/697] fix(deps): update dependency react-i18next to v16.3.5 --- apps/client/package.json | 2 +- apps/website/package.json | 2 +- pnpm-lock.yaml | 22 +++++++++++++--------- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index ba0fbb97b9..f8f0832c8a 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -59,7 +59,7 @@ "normalize.css": "8.0.1", "panzoom": "9.4.3", "preact": "10.27.2", - "react-i18next": "16.3.3", + "react-i18next": "16.3.5", "reveal.js": "5.2.1", "svg-pan-zoom": "3.6.2", "tabulator-tables": "6.3.1", diff --git a/apps/website/package.json b/apps/website/package.json index 7ed190b7ea..b1e564fb43 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -14,7 +14,7 @@ "preact": "10.27.2", "preact-iso": "2.11.0", "preact-render-to-string": "6.6.3", - "react-i18next": "16.3.3" + "react-i18next": "16.3.5" }, "devDependencies": { "@preact/preset-vite": "2.10.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ddfb79f8e..c1560300fb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -290,8 +290,8 @@ importers: specifier: 10.27.2 version: 10.27.2 react-i18next: - specifier: 16.3.3 - version: 16.3.3(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: 16.3.5 + version: 16.3.5(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) reveal.js: specifier: 5.2.1 version: 5.2.1 @@ -814,8 +814,8 @@ importers: specifier: 6.6.3 version: 6.6.3(preact@10.27.2) react-i18next: - specifier: 16.3.3 - version: 16.3.3(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: 16.3.5 + version: 16.3.5(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) devDependencies: '@preact/preset-vite': specifier: 2.10.2 @@ -4752,10 +4752,12 @@ packages: '@smithy/core@3.18.3': resolution: {integrity: sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==} engines: {node: '>=18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} @@ -12345,8 +12347,8 @@ packages: peerDependencies: react: ^19.2.0 - react-i18next@16.3.3: - resolution: {integrity: sha512-IaY2W+ueVd/fe7H6Wj2S4bTuLNChnajFUlZFfCTrTHWzGcOrUHlVzW55oXRSl+J51U8Onn6EvIhQ+Bar9FUcjw==} + react-i18next@16.3.5: + resolution: {integrity: sha512-F7Kglc+T0aE6W2rO5eCAFBEuWRpNb5IFmXOYEgztjZEuiuSLTe/xBIEG6Q3S0fbl8GXMNo+Q7gF8bpokFNWJww==} peerDependencies: i18next: '>= 25.6.2' react: '>= 16.8.0' @@ -15716,6 +15718,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15976,6 +15980,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16484,8 +16490,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.2.0': dependencies: @@ -29181,7 +29185,7 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 - react-i18next@16.3.3(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + react-i18next@16.3.5(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 From 96b059f6575e485b505a66cbbdbd5df663bd3c0f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 06:51:48 +0000 Subject: [PATCH 028/697] chore(deps): update dependency @smithy/middleware-retry to v4.4.12 --- packages/ckeditor5/package.json | 2 +- pnpm-lock.yaml | 129 ++++++++++++++------------------ 2 files changed, 59 insertions(+), 72 deletions(-) diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json index cf2dc5fdea..8bc44e04aa 100644 --- a/packages/ckeditor5/package.json +++ b/packages/ckeditor5/package.json @@ -16,7 +16,7 @@ "ckeditor5-premium-features": "47.2.0" }, "devDependencies": { - "@smithy/middleware-retry": "4.4.11", + "@smithy/middleware-retry": "4.4.12", "@types/jquery": "3.5.33" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1560300fb..cdfe536a59 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -867,8 +867,8 @@ importers: version: 47.2.0(bufferutil@4.0.9)(ckeditor5@47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41))(utf-8-validate@6.0.5) devDependencies: '@smithy/middleware-retry': - specifier: 4.4.11 - version: 4.4.11 + specifier: 4.4.12 + version: 4.4.12 '@types/jquery': specifier: 3.5.33 version: 3.5.33 @@ -4749,16 +4749,15 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.18.3': - resolution: {integrity: sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==} - engines: {node: '>=18.0.0'} - deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md - '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md + '@smithy/core@3.18.5': + resolution: {integrity: sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==} + engines: {node: '>=18.0.0'} + '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} engines: {node: '>=18.0.0'} @@ -4811,26 +4810,22 @@ packages: resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.3.10': - resolution: {integrity: sha512-SoAag3QnWBFoXjwa1jenEThkzJYClidZUyqsLKwWZ8kOlZBwehrLBp4ygVDjNEM2a2AamCQ2FBA/HuzKJ/LiTA==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.3.11': resolution: {integrity: sha512-eJXq9VJzEer1W7EQh3HY2PDJdEcEUnv6sKuNt4eVjyeNWcQFS4KmnY+CKkYOIR6tSqarn6bjjCqg1UB+8UJiPQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.11': - resolution: {integrity: sha512-EL5OQHvFOKneJVRgzRW4lU7yidSwp/vRJOe542bHgExN3KNThr1rlg0iE4k4SnA+ohC+qlUxoK+smKeAYPzfAQ==} + '@smithy/middleware-endpoint@4.3.12': + resolution: {integrity: sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.12': + resolution: {integrity: sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.4': resolution: {integrity: sha512-jUr3x2CDhV15TOX2/Uoz4gfgeqLrRoTQbYAuhLS7lcVKNev7FeYSJ1ebEfjk+l9kbb7k7LfzIR/irgxys5ZTOg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.5': - resolution: {integrity: sha512-La1ldWTJTZ5NqQyPqnCNeH9B+zjFhrNoQIL1jTh4zuqXRlmXhxYHhMtI1/92OlnoAtp6JoN7kzuwhWoXrBwPqg==} - engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.6': resolution: {integrity: sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==} engines: {node: '>=18.0.0'} @@ -4887,14 +4882,14 @@ packages: resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.9.6': - resolution: {integrity: sha512-hGz42hggqReicRRZUvrKDQiAmoJnx1Q+XfAJnYAGu544gOfxQCAC3hGGD7+Px2gEUUxB/kKtQV7LOtBRNyxteQ==} - engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.9.7': resolution: {integrity: sha512-pskaE4kg0P9xNQWihfqlTMyxyFR3CH6Sr6keHYghgyqqDXzjl2QJg5lAzuVe/LzZiOzcbcVtxKYi1/fZPt/3DA==} engines: {node: '>=18.0.0'} + '@smithy/smithy-client@4.9.8': + resolution: {integrity: sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==} + engines: {node: '>=18.0.0'} + '@smithy/types@4.9.0': resolution: {integrity: sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==} engines: {node: '>=18.0.0'} @@ -14995,7 +14990,7 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/eventstream-serde-browser': 4.0.4 '@smithy/eventstream-serde-config-resolver': 4.1.2 '@smithy/eventstream-serde-node': 4.0.4 @@ -15003,14 +14998,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.3.10 - '@smithy/middleware-retry': 4.4.11 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.12 '@smithy/middleware-serde': 4.2.4 '@smithy/middleware-stack': 4.2.5 '@smithy/node-config-provider': 4.3.5 '@smithy/node-http-handler': 4.4.4 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/url-parser': 4.2.4 '@smithy/util-base64': 4.3.0 @@ -15044,19 +15039,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/fetch-http-handler': 5.3.6 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.3.10 - '@smithy/middleware-retry': 4.4.11 - '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 '@smithy/middleware-stack': 4.2.5 '@smithy/node-config-provider': 4.3.5 '@smithy/node-http-handler': 4.4.5 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/url-parser': 4.2.5 '@smithy/util-base64': 4.3.0 @@ -15076,12 +15071,12 @@ snapshots: dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/node-config-provider': 4.3.5 '@smithy/property-provider': 4.2.5 '@smithy/protocol-http': 5.3.5 '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 @@ -15106,7 +15101,7 @@ snapshots: '@smithy/node-http-handler': 4.4.5 '@smithy/property-provider': 4.2.5 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/util-stream': 4.5.6 tslib: 2.8.1 @@ -15218,7 +15213,7 @@ snapshots: '@aws-sdk/core': 3.823.0 '@aws-sdk/types': 3.821.0 '@aws-sdk/util-endpoints': 3.821.0 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 tslib: 2.8.1 @@ -15238,19 +15233,19 @@ snapshots: '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.823.0 '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.18.3 + '@smithy/core': 3.18.4 '@smithy/fetch-http-handler': 5.3.6 '@smithy/hash-node': 4.0.4 '@smithy/invalid-dependency': 4.0.4 '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.3.10 - '@smithy/middleware-retry': 4.4.11 - '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-endpoint': 4.3.11 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 '@smithy/middleware-stack': 4.2.5 '@smithy/node-config-provider': 4.3.5 '@smithy/node-http-handler': 4.4.5 '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 '@smithy/url-parser': 4.2.5 '@smithy/util-base64': 4.3.0 @@ -15980,8 +15975,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -19792,9 +19785,9 @@ snapshots: '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 - '@smithy/core@3.18.3': + '@smithy/core@3.18.4': dependencies: - '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-serde': 4.2.6 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 '@smithy/util-base64': 4.3.0 @@ -19805,7 +19798,7 @@ snapshots: '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/core@3.18.4': + '@smithy/core@3.18.5': dependencies: '@smithy/middleware-serde': 4.2.6 '@smithy/protocol-http': 5.3.5 @@ -19898,17 +19891,6 @@ snapshots: '@smithy/types': 4.9.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.3.10': - dependencies: - '@smithy/core': 3.18.3 - '@smithy/middleware-serde': 4.2.5 - '@smithy/node-config-provider': 4.3.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 - '@smithy/util-middleware': 4.2.5 - tslib: 2.8.1 - '@smithy/middleware-endpoint@4.3.11': dependencies: '@smithy/core': 3.18.4 @@ -19920,12 +19902,23 @@ snapshots: '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.11': + '@smithy/middleware-endpoint@4.3.12': + dependencies: + '@smithy/core': 3.18.5 + '@smithy/middleware-serde': 4.2.6 + '@smithy/node-config-provider': 4.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.12': dependencies: '@smithy/node-config-provider': 4.3.5 '@smithy/protocol-http': 5.3.5 '@smithy/service-error-classification': 4.2.5 - '@smithy/smithy-client': 4.9.7 + '@smithy/smithy-client': 4.9.8 '@smithy/types': 4.9.0 '@smithy/util-middleware': 4.2.5 '@smithy/util-retry': 4.2.5 @@ -19938,12 +19931,6 @@ snapshots: '@smithy/types': 4.9.0 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.5': - dependencies: - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 - tslib: 2.8.1 - '@smithy/middleware-serde@4.2.6': dependencies: '@smithy/protocol-http': 5.3.5 @@ -20030,20 +20017,20 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.9.6': + '@smithy/smithy-client@4.9.7': dependencies: - '@smithy/core': 3.18.3 - '@smithy/middleware-endpoint': 4.3.10 + '@smithy/core': 3.18.4 + '@smithy/middleware-endpoint': 4.3.11 '@smithy/middleware-stack': 4.2.5 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 '@smithy/util-stream': 4.5.6 tslib: 2.8.1 - '@smithy/smithy-client@4.9.7': + '@smithy/smithy-client@4.9.8': dependencies: - '@smithy/core': 3.18.4 - '@smithy/middleware-endpoint': 4.3.11 + '@smithy/core': 3.18.5 + '@smithy/middleware-endpoint': 4.3.12 '@smithy/middleware-stack': 4.2.5 '@smithy/protocol-http': 5.3.5 '@smithy/types': 4.9.0 @@ -20097,7 +20084,7 @@ snapshots: '@smithy/util-defaults-mode-browser@4.0.22': dependencies: '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 bowser: 2.11.0 tslib: 2.8.1 @@ -20108,7 +20095,7 @@ snapshots: '@smithy/credential-provider-imds': 4.0.6 '@smithy/node-config-provider': 4.3.5 '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.6 + '@smithy/smithy-client': 4.9.7 '@smithy/types': 4.9.0 tslib: 2.8.1 From 8c68ff541904e6e32b028a54f58e03b16f4a2913 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 20 Nov 2025 07:50:00 +0100 Subject: [PATCH 029/697] 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-tr.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/docs/README-tr.md b/docs/README-tr.md index bba139cc9c..b8f58866af 100644 --- a/docs/README-tr.md +++ b/docs/README-tr.md @@ -9,27 +9,28 @@
        -# Trilium Notes +# Trilium Notlar -![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)\ +![GitHub Sponsorları](https://img.shields.io/github/sponsors/eliandoran) +![LiberaPay Destekçileri](https://img.shields.io/liberapay/patrons/ElianDoran) \ +![Docker İndirme +Sayısı](https://img.shields.io/docker/pulls/triliumnext/trilium) ![GitHub +İndirmeleri (tüm varlıklar, tüm +sürümler)](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/) +[![Çeviri +Durumu](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/) -[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) | -[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md) -| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) | -[Spanish](./docs/README-es.md) +[İngilizce](./README.md) | [Çince (Basitleştirilmiş)](./docs/README-ZH_CN.md) | +[Çince (Geleneksel)](./docs/README-ZH_TW.md) | [Rusça](./docs/README-ru.md) | +[Japonca](./docs/README-ja.md) | [İtalyanca](./docs/README-it.md) | +[İspanyolca](./docs/README-es.md) -Trilium Notes is a free and open-source, cross-platform hierarchical note taking -application with focus on building large personal knowledge bases. +Trilium Notes, büyük kişisel bilgi tabanları oluşturmaya odaklanmış, ücretsiz ve +açık kaynaklı, çapraz platform hiyerarşik bir not alma uygulamasıdır. -See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for -quick overview: +Hızlı bir genel bakış için [ekran +görüntülerine](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) bakın: Trilium Screenshot From dc5e0737158b169a8ebe79e1fee467ec2fac5c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?yunus=20u=C3=A7an?= Date: Wed, 19 Nov 2025 21:44:17 +0100 Subject: [PATCH 030/697] Translated using Weblate (Turkish) Currently translated at 3.2% (5 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/tr/ --- apps/website/src/translations/tr/translation.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/tr/translation.json b/apps/website/src/translations/tr/translation.json index 0967ef424b..75fb50534d 100644 --- a/apps/website/src/translations/tr/translation.json +++ b/apps/website/src/translations/tr/translation.json @@ -1 +1,9 @@ -{} +{ + "get-started": { + "title": "Başlangıç", + "desktop_title": "Masaüstü uygulamasını indirin (v{{version}})", + "architecture": "Mimari:", + "older_releases": "Eski sürümleri görüntüle", + "server_title": "Birden fazla cihazdan erişim için bir sunucu kurun" + } +} From ae8aa0374fd3a2965e6918c27ef23043e1809018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?yunus=20u=C3=A7an?= Date: Wed, 19 Nov 2025 21:47:43 +0100 Subject: [PATCH 031/697] Translated using Weblate (Turkish) Currently translated at 3.0% (12 of 389 strings) Translation: Trilium Notes/Server Translate-URL: https://hosted.weblate.org/projects/trilium/server/tr/ --- apps/server/src/assets/translations/tr/server.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/server/src/assets/translations/tr/server.json b/apps/server/src/assets/translations/tr/server.json index 2ee2a77217..3212670bf5 100644 --- a/apps/server/src/assets/translations/tr/server.json +++ b/apps/server/src/assets/translations/tr/server.json @@ -1,6 +1,16 @@ { "keyboard_actions": { "back-in-note-history": "Geçmişteki önceki nota git", - "forward-in-note-history": "Geçmişteki sonraki nota git" + "forward-in-note-history": "Geçmişteki sonraki nota git", + "open-jump-to-note-dialog": "\"Nota geçiş yap\" iletişim kutusunu aç", + "open-command-palette": "Komut setini göster", + "scroll-to-active-note": "Not ağacını etkin olan nota kaydır", + "quick-search": "Hızlı arama çubuğunu etkinleştir", + "search-in-subtree": "Etkin notun alt ağacındaki notları ara", + "expand-subtree": "Geçerli notun alt ağacını genişlet", + "move-note-up": "Notu bir üste taşı", + "collapse-tree": "Tüm not ağacını daraltır", + "collapse-subtree": "Geçerli notun alt ağacını daraltır", + "sort-child-notes": "Alt notları sırala" } } From a6ba87c2f8687386e5fcc88c5d6dc30fb0aa4797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?yunus=20u=C3=A7an?= Date: Wed, 19 Nov 2025 21:59:27 +0100 Subject: [PATCH 032/697] Translated using Weblate (Turkish) Currently translated at 4.3% (70 of 1625 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/tr/ --- .../src/translations/tr/translation.json | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/apps/client/src/translations/tr/translation.json b/apps/client/src/translations/tr/translation.json index d03e85496c..17fb7dff4e 100644 --- a/apps/client/src/translations/tr/translation.json +++ b/apps/client/src/translations/tr/translation.json @@ -5,25 +5,32 @@ "db_version": "Veritabanı versiyonu:", "title": "Trilium Notes Hakkında", "sync_version": "Eşleştirme versiyonu:", - "data_directory": "Veri dizini:" + "data_directory": "Veri dizini:", + "build_date": "Derleme tarihi:", + "build_revision": "Derleme revizyonu:" }, "branch_prefix": { "save": "Kaydet", "edit_branch_prefix": "Dalın önekini düzenle", "prefix": "Önek: ", - "branch_prefix_saved": "Dal öneki kaydedildi." + "branch_prefix_saved": "Dal öneki kaydedildi.", + "edit_branch_prefix_multiple": "{{count}} dal için dal ön ekini düzenle", + "help_on_tree_prefix": "Ağaç ön eki hakkında yardım", + "branch_prefix_saved_multiple": "Dal ön eki, {{count}} dal için kaydedildi.", + "affected_branches": "Etkilenen dal sayısı ({{count}}):" }, "delete_notes": { "close": "Kapat", "delete_notes_preview": "Not önizlemesini sil", - "delete_all_clones_description": "Tüm klonları da sil (son değişikliklerden geri alınabilir)" + "delete_all_clones_description": "Tüm klonları da sil (son değişikliklerden geri alınabilir)", + "erase_notes_description": "Normal (yazılımsal) silme işlemi, notları yalnızca silinmiş olarak işaretler ve belirli bir süre içinde (son değişiklikler iletişim kutusunda) geri alınabilir. Bu seçeneği işaretlemek, notları hemen siler ve notların geri alınması mümkün olmaz." }, "export": { "close": "Kapat" }, "import": { "chooseImportFile": "İçe aktarım dosyası", - "importDescription": "Seçilen dosya(lar) alt not olarak içe aktarılacaktır" + "importDescription": "Seçilen dosya(lar)ın içeriği, alt not(lar) olarak şuraya içe aktarılacaktır" }, "info": { "closeButton": "Kapat" @@ -34,21 +41,23 @@ "toast": { "critical-error": { "title": "Kritik hata", - "message": "İstemci uygulamasının başlatılmasını engelleyen kritik bir hata meydana geldi\n\n{{message}}\n\nBu muhtemelen bir betiğin beklenmedik şekilde başarısız olmasından kaynaklanıyor. Uygulamayı güvenli modda başlatarak sorunu ele almayı deneyin." + "message": "İstemci uygulamasının başlamasını engelleyen kritik bir hata oluştu:\n\n{{message}}\n\nBunun nedeni büyük olasılıkla bir komut dosyasının beklenmedik bir şekilde başarısız olmasıdır. Uygulamayı güvenli modda başlatmayı ve sorunu gidermeyi deneyin." }, "widget-error": { "title": "Bir widget başlatılamadı", - "message-unknown": "Bilinmeyen widget aşağıdaki sebeple başlatılamadı\n\n{{message}}" + "message-unknown": "Bilinmeyen bir widget aşağıdaki sebeple başlatılamadı\n\n{{message}}", + "message-custom": "ID'si \"{{id}}\" ve başlığı \"{{title}}\" olan nottan alınan özel bileşen şu sebepten başlatılamadı:\n\n{{message}}" }, "bundle-error": { - "title": "Özel bir betik yüklenemedi" + "title": "Özel bir betik yüklenemedi", + "message": "ID'si \"{{id}}\" ve başlığı \"{{title}}\" olan nottan alınan komut dosyası şunun nedeniyle yürütülemedi:\n\n{{message}}" } }, "add_link": { "add_link": "Bağlantı ekle", "help_on_links": "Bağlantılar konusunda yardım", "note": "Not", - "search_note": "isimle not ara", + "search_note": "notu adına göre ara", "link_title_mirrors": "bağlantı adı notun şu anki adıyla aynı", "link_title_arbitrary": "bağlantı adı isteğe bağlı olarak değiştirilebilir", "link_title": "Bağlantı adı", @@ -85,12 +94,13 @@ "cancel": "İptal", "ok": "OK", "are_you_sure_remove_note": "\"{{title}}\" notunu ilişki haritasından kaldırmak istediğinize emin misiniz?. ", - "also_delete_note": "Notu da sil" + "also_delete_note": "Notu da sil", + "if_you_dont_check": "Bunu işaretlemezseniz, not yalnızca ilişki haritasından kaldırılacaktır." }, "ai_llm": { "n_notes_queued": "{{ count }} not dizinleme için sıraya alındı", - "n_notes_queued_plural": "{{ count }} not dizinleme için sıraya alındı", + "n_notes_queued_plural": "{{ count }} adet not dizinleme için sıraya alındı", "notes_indexed": "{{ count }} not dizinlendi", - "notes_indexed_plural": "{{ count }} not dizinlendi" + "notes_indexed_plural": "{{ count }} adet not dizinlendi" } } From 9f4fd924529fd686316b2259448b06db2d0cf2cd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 20 Nov 2025 06:54:46 +0000 Subject: [PATCH 033/697] fix(deps): update dependency i18next to v25.6.3 --- apps/client/package.json | 2 +- apps/server/package.json | 2 +- apps/website/package.json | 2 +- pnpm-lock.yaml | 30 +++++++++++++----------------- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index f8f0832c8a..6861392d06 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -43,7 +43,7 @@ "draggabilly": "3.0.0", "force-graph": "1.51.0", "globals": "16.5.0", - "i18next": "25.6.2", + "i18next": "25.6.3", "i18next-http-backend": "3.0.2", "jquery": "3.7.1", "jquery.fancytree": "2.38.5", diff --git a/apps/server/package.json b/apps/server/package.json index 95a6add391..0b22d041b1 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -96,7 +96,7 @@ "html2plaintext": "2.1.4", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", - "i18next": "25.6.2", + "i18next": "25.6.3", "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 b1e564fb43..d610abb2b7 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -9,7 +9,7 @@ "preview": "pnpm build && vite preview" }, "dependencies": { - "i18next": "25.6.2", + "i18next": "25.6.3", "i18next-http-backend": "3.0.2", "preact": "10.27.2", "preact-iso": "2.11.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8df32020c0..8bed3fd14e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,8 +242,8 @@ importers: specifier: 16.5.0 version: 16.5.0 i18next: - specifier: 25.6.2 - version: 25.6.2(typescript@5.9.3) + specifier: 25.6.3 + version: 25.6.3(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -291,7 +291,7 @@ importers: version: 10.27.2 react-i18next: specifier: 16.3.5 - version: 16.3.5(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + version: 16.3.5(i18next@25.6.3(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) reveal.js: specifier: 5.2.1 version: 5.2.1 @@ -694,8 +694,8 @@ importers: specifier: 7.0.6 version: 7.0.6 i18next: - specifier: 25.6.2 - version: 25.6.2(typescript@5.9.3) + specifier: 25.6.3 + version: 25.6.3(typescript@5.9.3) i18next-fs-backend: specifier: 2.6.1 version: 2.6.1 @@ -799,8 +799,8 @@ importers: apps/website: dependencies: i18next: - specifier: 25.6.2 - version: 25.6.2(typescript@5.9.3) + specifier: 25.6.3 + version: 25.6.3(typescript@5.9.3) i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) @@ -815,7 +815,7 @@ importers: version: 6.6.3(preact@10.27.2) react-i18next: specifier: 16.3.5 - version: 16.3.5(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + version: 16.3.5(i18next@25.6.3(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3) devDependencies: '@preact/preset-vite': specifier: 2.10.2 @@ -9054,8 +9054,8 @@ packages: i18next-http-backend@3.0.2: resolution: {integrity: sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==} - i18next@25.6.2: - resolution: {integrity: sha512-0GawNyVUw0yvJoOEBq1VHMAsqdM23XrHkMtl2gKEjviJQSLVXsrPqsoYAxBEugW5AB96I2pZkwRxyl8WZVoWdw==} + i18next@25.6.3: + resolution: {integrity: sha512-AEQvoPDljhp67a1+NsnG/Wb1Nh6YoSvtrmeEd24sfGn3uujCtXCF3cXpr7ulhMywKNFF7p3TX1u2j7y+caLOJg==} peerDependencies: typescript: ^5 peerDependenciesMeta: @@ -15718,8 +15718,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16004,8 +16002,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.2.0': dependencies: @@ -25516,7 +25512,7 @@ snapshots: transitivePeerDependencies: - encoding - i18next@25.6.2(typescript@5.9.3): + i18next@25.6.3(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 optionalDependencies: @@ -29185,11 +29181,11 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 - react-i18next@16.3.5(i18next@25.6.2(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + react-i18next@16.3.5(i18next@25.6.3(typescript@5.9.3))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 - i18next: 25.6.2(typescript@5.9.3) + i18next: 25.6.3(typescript@5.9.3) react: 19.2.0 use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: From 991d61600da62b31579874688ae99a6719794068 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 14:25:30 +0200 Subject: [PATCH 034/697] fix(server): redundant CSS import (closes #7772) --- apps/server/src/assets/views/desktop.ejs | 1 - apps/server/src/assets/views/mobile.ejs | 1 - 2 files changed, 2 deletions(-) diff --git a/apps/server/src/assets/views/desktop.ejs b/apps/server/src/assets/views/desktop.ejs index 8d4e301762..0a25c06250 100644 --- a/apps/server/src/assets/views/desktop.ejs +++ b/apps/server/src/assets/views/desktop.ejs @@ -53,7 +53,6 @@ - diff --git a/apps/server/src/assets/views/mobile.ejs b/apps/server/src/assets/views/mobile.ejs index b5ea77a164..0eaa117366 100644 --- a/apps/server/src/assets/views/mobile.ejs +++ b/apps/server/src/assets/views/mobile.ejs @@ -132,7 +132,6 @@ - From abfc2fea3e02aa4fa68d8bdc7085f0dedeec3b8a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 14:26:04 +0200 Subject: [PATCH 035/697] feat(print): render inline mermaid --- apps/client/src/print.tsx | 7 ++++- apps/client/src/services/content_renderer.ts | 31 ++++++++++++++++++- .../type_widgets/text/ReadOnlyText.tsx | 23 ++------------ 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/apps/client/src/print.tsx b/apps/client/src/print.tsx index 5db1ebe758..a9dec12c46 100644 --- a/apps/client/src/print.tsx +++ b/apps/client/src/print.tsx @@ -2,7 +2,7 @@ import FNote from "./entities/fnote"; import { render } from "preact"; import { CustomNoteList, useNoteViewType } from "./widgets/collections/NoteList"; import { useCallback, useLayoutEffect, useRef } from "preact/hooks"; -import content_renderer from "./services/content_renderer"; +import content_renderer, { applyInlineMermaid } from "./services/content_renderer"; interface RendererProps { note: FNote; @@ -71,6 +71,11 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) { }) ); + // Initialize mermaid. + if (note.type === "text") { + await applyInlineMermaid(container); + } + // Check custom CSS. await loadCustomCss(note); } diff --git a/apps/client/src/services/content_renderer.ts b/apps/client/src/services/content_renderer.ts index e891b96d7c..f7658d6693 100644 --- a/apps/client/src/services/content_renderer.ts +++ b/apps/client/src/services/content_renderer.ts @@ -10,7 +10,7 @@ import FNote from "../entities/fnote.js"; import FAttachment from "../entities/fattachment.js"; import imageContextMenuService from "../menus/image_context_menu.js"; import { applySingleBlockSyntaxHighlight, formatCodeBlocks } from "./syntax_highlight.js"; -import { loadElkIfNeeded, postprocessMermaidSvg } from "./mermaid.js"; +import { getMermaidConfig, loadElkIfNeeded, postprocessMermaidSvg } from "./mermaid.js"; import renderDoc from "./doc_renderer.js"; import { t } from "../services/i18n.js"; import WheelZoom from 'vanilla-js-wheel-zoom'; @@ -136,6 +136,7 @@ async function renderText(note: FNote | FAttachment, $renderedContent: JQuery to
        in order not to apply a codeblock style to it. */ +export async function rewriteMermaidDiagramsInContainer(container: HTMLDivElement) { + const mermaidBlocks = container.querySelectorAll('pre:has(code[class="language-mermaid"])'); + if (!mermaidBlocks.length) return; + const nodes: HTMLElement[] = []; + + for (const mermaidBlock of mermaidBlocks) { + const div = document.createElement("div"); + div.classList.add("mermaid-diagram"); + div.innerHTML = mermaidBlock.querySelector("code")?.innerHTML ?? ""; + mermaidBlock.replaceWith(div); + nodes.push(div); + } +} + +export async function applyInlineMermaid(container: HTMLDivElement) { + // Initialize mermaid + const mermaid = (await import("mermaid")).default; + mermaid.initialize(getMermaidConfig()); + const nodes = Array.from(container.querySelectorAll("div.mermaid-diagram")); + console.log("Got nodes", nodes); + try { + await mermaid.run({ nodes }); + } catch (e) { + console.log(e); + } +} + export default { getRenderedContent }; diff --git a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx index caa0302b8c..0a17868c56 100644 --- a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx +++ b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.tsx @@ -10,13 +10,13 @@ import RawHtml from "../../react/RawHtml"; import "@triliumnext/ckeditor5"; import FNote from "../../../entities/fnote"; import { getLocaleById } from "../../../services/i18n"; -import { getMermaidConfig } from "../../../services/mermaid"; import { loadIncludedNote, refreshIncludedNote, setupImageOpening } from "./utils"; import { renderMathInElement } from "../../../services/math"; import { formatCodeBlocks } from "../../../services/syntax_highlight"; import TouchBar, { TouchBarButton, TouchBarSpacer } from "../../react/TouchBar"; import appContext from "../../../components/app_context"; import { applyReferenceLinks } from "./read_only_helper"; +import { applyInlineMermaid, rewriteMermaidDiagramsInContainer } from "../../../services/content_renderer"; export default function ReadOnlyText({ note, noteContext, ntxId }: TypeWidgetProps) { const blob = useNoteBlob(note); @@ -29,6 +29,7 @@ export default function ReadOnlyText({ note, noteContext, ntxId }: TypeWidgetPro const container = contentRef.current; if (!container) return; + rewriteMermaidDiagramsInContainer(container); applyInlineMermaid(container); applyIncludedNotes(container); applyMath(container); @@ -87,26 +88,6 @@ function useNoteLanguage(note: FNote) { return { isRtl }; } -async function applyInlineMermaid(container: HTMLDivElement) { - const mermaidBlocks = container.querySelectorAll('pre:has(code[class="language-mermaid"])'); - if (!mermaidBlocks.length) return; - const nodes: HTMLElement[] = []; - - // Rewrite the code block from
         to 
        in order not to apply a codeblock style to it. - for (const mermaidBlock of mermaidBlocks) { - const div = document.createElement("div"); - div.classList.add("mermaid-diagram"); - div.innerHTML = mermaidBlock.querySelector("code")?.innerHTML ?? ""; - mermaidBlock.replaceWith(div); - nodes.push(div); - } - - // Initialize mermaid - const mermaid = (await import("mermaid")).default; - mermaid.initialize(getMermaidConfig()); - mermaid.run({ nodes }); -} - function applyIncludedNotes(container: HTMLDivElement) { const includedNotes = container.querySelectorAll("section.include-note"); for (const includedNote of includedNotes) { From 1e86d8503516573fa9c60bc3921346956f103897 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 14:39:36 +0200 Subject: [PATCH 036/697] fix(share): some reference links appear with [missing note] --- apps/server/src/share/content_renderer.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index ec3893ee5b..86ee0abc81 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -318,13 +318,13 @@ function renderText(result: Result, note: SNote | BNote) { continue; } - if (href?.startsWith("#")) { - handleAttachmentLink(linkEl, href, getNote, getAttachment); - } - if (linkEl.classList.contains("reference-link")) { cleanUpReferenceLinks(linkEl); } + + if (href?.startsWith("#")) { + handleAttachmentLink(linkEl, href, getNote, getAttachment); + } } // Apply syntax highlight. @@ -400,6 +400,7 @@ function cleanUpReferenceLinks(linkEl: HTMLElement) { const noteId = href.split("/").at(-1); const note = noteId ? shaca.getNote(noteId) : undefined; if (!note) { + console.warn("Unable to find note ", noteId); linkEl.innerHTML = "[missing note]"; } else if (note.isProtected) { linkEl.innerHTML = "[protected]"; From c16eee79d4448c044a0b96c3edb1fc23d3ae0be0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 14:50:52 +0200 Subject: [PATCH 037/697] fix(share): broken reference links in static HTML export --- apps/server/src/share/content_renderer.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts index 86ee0abc81..96e228cc04 100644 --- a/apps/server/src/share/content_renderer.ts +++ b/apps/server/src/share/content_renderer.ts @@ -38,6 +38,8 @@ interface Subroot { branch?: SBranch | BBranch } +type GetNoteFunction = (id: string) => SNote | BNote | null; + function getSharedSubTreeRoot(note: SNote | BNote | undefined): Subroot { if (!note || note.noteId === shareRoot.SHARE_ROOT_NOTE_ID) { // share root itself is not shared @@ -301,7 +303,7 @@ function renderText(result: Result, note: SNote | BNote) { result.isEmpty = document.textContent?.trim().length === 0 && document.querySelectorAll("img").length === 0; - const getNote = note instanceof BNote + const getNote: GetNoteFunction = note instanceof BNote ? (noteId: string) => becca.getNote(noteId) : (noteId: string) => shaca.getNote(noteId); const getAttachment = note instanceof BNote @@ -319,7 +321,7 @@ function renderText(result: Result, note: SNote | BNote) { } if (linkEl.classList.contains("reference-link")) { - cleanUpReferenceLinks(linkEl); + cleanUpReferenceLinks(linkEl, getNote); } if (href?.startsWith("#")) { @@ -347,7 +349,7 @@ function renderText(result: Result, note: SNote | BNote) { } } -function handleAttachmentLink(linkEl: HTMLElement, href: string, getNote: (id: string) => SNote | BNote | null, getAttachment: (id: string) => BAttachment | SAttachment | null) { +function handleAttachmentLink(linkEl: HTMLElement, href: string, getNote: GetNoteFunction, getAttachment: (id: string) => BAttachment | SAttachment | null) { const linkRegExp = /attachmentId=([a-zA-Z0-9_]+)/g; let attachmentMatch; if ((attachmentMatch = linkRegExp.exec(href))) { @@ -392,13 +394,13 @@ function handleAttachmentLink(linkEl: HTMLElement, href: string, getNote: (id: s * * @param linkEl the element to process. */ -function cleanUpReferenceLinks(linkEl: HTMLElement) { +function cleanUpReferenceLinks(linkEl: HTMLElement, getNote: GetNoteFunction) { // Note: this method is basically a reimplementation of getReferenceLinkTitleSync from the link service of the client. const href = linkEl.getAttribute("href") ?? ""; if (linkEl.classList.contains("attachment-link")) return; const noteId = href.split("/").at(-1); - const note = noteId ? shaca.getNote(noteId) : undefined; + const note = noteId ? getNote(noteId) : undefined; if (!note) { console.warn("Unable to find note ", noteId); linkEl.innerHTML = "[missing note]"; From c91eec8b3e8d579811bcd87be4749f8b18add352 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 17:42:36 +0200 Subject: [PATCH 038/697] client/note color picker menu item: add a new color to the palette --- apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 96f7eba548..3e38c78091 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -9,7 +9,7 @@ import froca from "../../services/froca"; const COLORS = [ null, "#e64d4d", "#e6994d", "#e5e64d", "#99e64d", "#4de64d", "#4de699", - "#4de5e6", "#4d99e6", "#4d4de6", "#994de6" + "#4de5e6", "#4d99e6", "#4d4de6", "#994de6", "#e64db3" ]; export interface NoteColorPickerMenuItemProps { From fb163367d4105305d2cad468f99e9ce35c40700b Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 17:50:32 +0200 Subject: [PATCH 039/697] client/note color picker menu item: refactor --- .../custom-items/NoteColorPickerMenuItem.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 3e38c78091..3733b219bc 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -8,7 +8,7 @@ import FNote from "../../entities/fnote"; import froca from "../../services/froca"; const COLORS = [ - null, "#e64d4d", "#e6994d", "#e5e64d", "#99e64d", "#4de64d", "#4de699", + "#e64d4d", "#e6994d", "#e5e64d", "#99e64d", "#4de64d", "#4de699", "#4de5e6", "#4d99e6", "#4d4de6", "#994de6", "#e64db3" ]; @@ -57,7 +57,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr }, [note]); useEffect(() => { - setIsCustomColor(COLORS.indexOf(currentColor) === -1); + setIsCustomColor(currentColor !== null && COLORS.indexOf(currentColor) === -1); }, [currentColor]) const onColorCellClicked = useCallback((color: string | null) => { @@ -74,17 +74,25 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr return
        {e.stopPropagation()}}> + + + + {COLORS.map((color) => ( onColorCellClicked(color)} /> + onSelect={onColorCellClicked} /> ))}
        } From 422b324f7c2c6149d25328ea10d879f22cc600a8 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 18:15:56 +0200 Subject: [PATCH 040/697] client/note color picker menu item: add tooltips --- .../src/menus/custom-items/NoteColorPickerMenuItem.tsx | 10 ++++++++-- apps/client/src/translations/en/translation.json | 5 +++++ apps/client/src/translations/ro/translation.json | 5 +++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 3733b219bc..1917c587c1 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -1,4 +1,5 @@ import "./NoteColorPickerMenuItem.css"; +import { t } from "../../services/i18n"; import { useCallback, useEffect, useRef, useState} from "preact/hooks"; import {ComponentChildren} from "preact"; import attributes from "../../services/attributes"; @@ -76,6 +77,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr onClick={(e) => {e.stopPropagation()}}> ( ))} - @@ -99,7 +103,8 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr interface ColorCellProps { children?: ComponentChildren, - className?: string; + className?: string, + tooltip?: string, color: string | null, isSelected: boolean, isDisabled?: boolean, @@ -109,6 +114,7 @@ interface ColorCellProps { function ColorCell(props: ColorCellProps) { return
        props.onSelect?.(props.color)}> {props.children}
        ; diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 54025d6909..aa8c5926c9 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -2093,5 +2093,10 @@ }, "collections": { "rendering_error": "Unable to show content due to an error." + }, + "note-color": { + "clear-color": "Clear note color", + "set-color": "Set note color", + "set-custom-color": "Set custom note color" } } diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index b0e412b35c..5750bb3317 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -2095,5 +2095,10 @@ }, "calendar_view": { "delete_note": "Șterge notița..." + }, + "note-color": { + "clear-color": "Înlăturați culoarea notiței", + "set-color": "Setați culoarea notiței", + "set-custom-color": "Setați culoare personalizată pentru notiță" } } From f15e048763fa40dbc64af14b4d5a537650799b59 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 18:43:16 +0200 Subject: [PATCH 041/697] client/note color picker menu item: refactor stylesheet --- .../custom-items/NoteColorPickerMenuItem.css | 48 ++++++++++++------ .../{custom-culor.png => custom-color.png} | Bin 2 files changed, 32 insertions(+), 16 deletions(-) rename apps/client/src/menus/custom-items/{custom-culor.png => custom-color.png} (100%) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css index d062ea5774..09eb356b8c 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css @@ -1,3 +1,9 @@ +:root { + --note-color-picker-clear-color-cell-background: var(--primary-button-background-color); + --note-color-picker-clear-color-cell-color: var(--main-background-color); + --note-color-picker-clear-color-cell-selection-outline-color: var(--primary-button-border-color); +} + .color-picker-menu-item { display: flex; gap: 8px; @@ -5,8 +11,10 @@ } .color-picker-menu-item .color-cell { - width: 14px; - height: 14px; + --color-picker-cell-size: 14px; + + width: var(--color-picker-cell-size); + height: var(--color-picker-cell-size); border-radius: 4px; background-color: var(--color); } @@ -20,51 +28,59 @@ } .color-picker-menu-item .color-cell.selected { - outline: 2px solid var(--color); + outline: 2px solid var(--outline-color, var(--color)); outline-offset: 2px; } -.color-cell-reset::before, -.custom-color-cell::before { +.color-picker-menu-item .color-cell-reset::before, +.color-picker-menu-item .custom-color-cell::before { position: absolute; display: flex; top: 0; left: 0; right: 0; bottom: 0; - font-size: 18px; + font-size: calc(var(--color-picker-cell-size) * 1.3); justify-content: center; align-items: center; font-family: boxicons; - color: black; } -.color-cell-reset { +/* + * RESET COLOR CELL + */ + +.color-picker-menu-item .color-cell-reset { + --color: var(--note-color-picker-clear-color-cell-background); + --outline-color: var(--note-color-picker-clear-color-cell-selection-outline-color); + position: relative; - --color: rgba(255, 255, 255, .4); } -.color-cell-reset::before { +.color-picker-menu-item .color-cell-reset::before { content: "\ec8d"; mix-blend-mode: normal; - color: black; + color: var(--note-color-picker-clear-color-cell-color); } -.custom-color-cell { +/* + * CUSTOM COLOR CELL + */ + +.color-picker-menu-item .custom-color-cell { position: relative; display: flex; justify-content: center; } -.custom-color-cell.custom-color-cell-empty { - background-image: url(./custom-culor.png); +.color-picker-menu-item .custom-color-cell.custom-color-cell-empty { + background-image: url(./custom-color.png); background-size: cover; --foreground: transparent; } - -.custom-color-cell::before { +.color-picker-menu-item .custom-color-cell::before { content: "\ed35"; color: var(--foreground); font-size: 16px; diff --git a/apps/client/src/menus/custom-items/custom-culor.png b/apps/client/src/menus/custom-items/custom-color.png similarity index 100% rename from apps/client/src/menus/custom-items/custom-culor.png rename to apps/client/src/menus/custom-items/custom-color.png From 1de9f715fa95bc751e6aedf1a3d4f146ead268ca Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 18:46:27 +0200 Subject: [PATCH 042/697] client/note color picker: refactor --- .../custom-items/NoteColorPickerMenuItem.css | 24 +++++++++---------- .../custom-items/NoteColorPickerMenuItem.tsx | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css index 09eb356b8c..93a56ec0cd 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css @@ -4,13 +4,13 @@ --note-color-picker-clear-color-cell-selection-outline-color: var(--primary-button-border-color); } -.color-picker-menu-item { +.note-color-picker { display: flex; gap: 8px; justify-content: space-between; } -.color-picker-menu-item .color-cell { +.note-color-picker .color-cell { --color-picker-cell-size: 14px; width: var(--color-picker-cell-size); @@ -19,21 +19,21 @@ background-color: var(--color); } -.color-picker-menu-item .color-cell:not(.selected):hover { +.note-color-picker .color-cell:not(.selected):hover { transform: scale(1.2); } -.color-picker-menu-item .color-cell.disabled-color-cell { +.note-color-picker .color-cell.disabled-color-cell { cursor: not-allowed; } -.color-picker-menu-item .color-cell.selected { +.note-color-picker .color-cell.selected { outline: 2px solid var(--outline-color, var(--color)); outline-offset: 2px; } -.color-picker-menu-item .color-cell-reset::before, -.color-picker-menu-item .custom-color-cell::before { +.note-color-picker .color-cell-reset::before, +.note-color-picker .custom-color-cell::before { position: absolute; display: flex; top: 0; @@ -50,14 +50,14 @@ * RESET COLOR CELL */ -.color-picker-menu-item .color-cell-reset { +.note-color-picker .color-cell-reset { --color: var(--note-color-picker-clear-color-cell-background); --outline-color: var(--note-color-picker-clear-color-cell-selection-outline-color); position: relative; } -.color-picker-menu-item .color-cell-reset::before { +.note-color-picker .color-cell-reset::before { content: "\ec8d"; mix-blend-mode: normal; color: var(--note-color-picker-clear-color-cell-color); @@ -67,20 +67,20 @@ * CUSTOM COLOR CELL */ -.color-picker-menu-item .custom-color-cell { +.note-color-picker .custom-color-cell { position: relative; display: flex; justify-content: center; } -.color-picker-menu-item .custom-color-cell.custom-color-cell-empty { +.note-color-picker .custom-color-cell.custom-color-cell-empty { background-image: url(./custom-color.png); background-size: cover; --foreground: transparent; } -.color-picker-menu-item .custom-color-cell::before { +.note-color-picker .custom-color-cell::before { content: "\ed35"; color: var(--foreground); font-size: 16px; diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx index 1917c587c1..c74f839199 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx @@ -73,7 +73,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr } }, [note, currentColor]); - return
        {e.stopPropagation()}}> Date: Thu, 20 Nov 2025 18:49:47 +0200 Subject: [PATCH 043/697] client/note color picker: refactor --- .../{NoteColorPickerMenuItem.css => NoteColorPicker.css} | 0 .../{NoteColorPickerMenuItem.tsx => NoteColorPicker.tsx} | 2 +- apps/client/src/menus/tree_context_menu.ts | 4 ++-- apps/client/src/widgets/collections/board/context_menu.ts | 4 ++-- apps/client/src/widgets/collections/calendar/context_menu.ts | 4 ++-- apps/client/src/widgets/collections/geomap/context_menu.ts | 4 ++-- apps/client/src/widgets/collections/table/context_menu.ts | 4 ++-- 7 files changed, 11 insertions(+), 11 deletions(-) rename apps/client/src/menus/custom-items/{NoteColorPickerMenuItem.css => NoteColorPicker.css} (100%) rename apps/client/src/menus/custom-items/{NoteColorPickerMenuItem.tsx => NoteColorPicker.tsx} (99%) diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css b/apps/client/src/menus/custom-items/NoteColorPicker.css similarity index 100% rename from apps/client/src/menus/custom-items/NoteColorPickerMenuItem.css rename to apps/client/src/menus/custom-items/NoteColorPicker.css diff --git a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx b/apps/client/src/menus/custom-items/NoteColorPicker.tsx similarity index 99% rename from apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx rename to apps/client/src/menus/custom-items/NoteColorPicker.tsx index c74f839199..0c0941adc6 100644 --- a/apps/client/src/menus/custom-items/NoteColorPickerMenuItem.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPicker.tsx @@ -1,4 +1,4 @@ -import "./NoteColorPickerMenuItem.css"; +import "./NoteColorPicker.css"; import { t } from "../../services/i18n"; import { useCallback, useEffect, useRef, useState} from "preact/hooks"; import {ComponentChildren} from "preact"; diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index b02eaf970a..35480cfc60 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -1,4 +1,4 @@ -import NoteColorPickerMenuItem from "./custom-items/NoteColorPickerMenuItem.jsx"; +import NoteColorPicker from "./custom-items/NoteColorPicker.jsx"; import treeService from "../services/tree.js"; import froca from "../services/froca.js"; import clipboard from "../services/clipboard.js"; @@ -264,7 +264,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener { if (notOptionsOrHelp && selectedNotes.length === 1) { - return NoteColorPickerMenuItem({note}); + return NoteColorPicker({note}); } else { return null; } diff --git a/apps/client/src/widgets/collections/board/context_menu.ts b/apps/client/src/widgets/collections/board/context_menu.ts index 551e96a495..c834b4c8d4 100644 --- a/apps/client/src/widgets/collections/board/context_menu.ts +++ b/apps/client/src/widgets/collections/board/context_menu.ts @@ -1,5 +1,5 @@ import FNote from "../../../entities/fnote"; -import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem"; +import NoteColorPicker from "../../../menus/custom-items/NoteColorPicker"; import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; import link_context_menu from "../../../menus/link_context_menu"; import attributes from "../../../services/attributes"; @@ -78,7 +78,7 @@ export function openNoteContextMenu(api: Api, event: ContextMenuEvent, note: FNo { kind: "separator" }, { kind: "custom", - componentFn: () => NoteColorPickerMenuItem({note}) + componentFn: () => NoteColorPicker({note}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, note.noteId), diff --git a/apps/client/src/widgets/collections/calendar/context_menu.ts b/apps/client/src/widgets/collections/calendar/context_menu.ts index 5120fcc973..0195d131c9 100644 --- a/apps/client/src/widgets/collections/calendar/context_menu.ts +++ b/apps/client/src/widgets/collections/calendar/context_menu.ts @@ -1,4 +1,4 @@ -import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem"; +import NoteColorPicker from "../../../menus/custom-items/NoteColorPicker"; import FNote from "../../../entities/fnote"; import contextMenu, { ContextMenuEvent } from "../../../menus/context_menu"; import link_context_menu from "../../../menus/link_context_menu"; @@ -40,7 +40,7 @@ export function openCalendarContextMenu(e: ContextMenuEvent, noteId: string, par { kind: "separator" }, { kind: "custom", - componentFn: () => NoteColorPickerMenuItem({note: noteId}) + componentFn: () => NoteColorPicker({note: noteId}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, noteId), diff --git a/apps/client/src/widgets/collections/geomap/context_menu.ts b/apps/client/src/widgets/collections/geomap/context_menu.ts index c4cf6ebf4d..f4161fad9b 100644 --- a/apps/client/src/widgets/collections/geomap/context_menu.ts +++ b/apps/client/src/widgets/collections/geomap/context_menu.ts @@ -2,7 +2,7 @@ import type { LatLng, LeafletMouseEvent } from "leaflet"; import appContext, { type CommandMappings } from "../../../components/app_context.js"; import contextMenu, { type MenuItem } from "../../../menus/context_menu.js"; import linkContextMenu from "../../../menus/link_context_menu.js"; -import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem.jsx"; +import NoteColorPicker from "../../../menus/custom-items/NoteColorPicker.jsx"; import { t } from "../../../services/i18n.js"; import { createNewNote } from "./api.js"; import { copyTextWithToast } from "../../../services/clipboard_ext.js"; @@ -23,7 +23,7 @@ export default function openContextMenu(noteId: string, e: LeafletMouseEvent, is { kind: "separator"}, { kind: "custom", - componentFn: () => NoteColorPickerMenuItem({note: noteId}) + componentFn: () => NoteColorPicker({note: noteId}) } ]; } diff --git a/apps/client/src/widgets/collections/table/context_menu.ts b/apps/client/src/widgets/collections/table/context_menu.ts index 1218dbf6cc..80b1c93c2f 100644 --- a/apps/client/src/widgets/collections/table/context_menu.ts +++ b/apps/client/src/widgets/collections/table/context_menu.ts @@ -7,7 +7,7 @@ import link_context_menu from "../../../menus/link_context_menu.js"; import froca from "../../../services/froca.js"; import branches from "../../../services/branches.js"; import Component from "../../../components/component.js"; -import NoteColorPickerMenuItem from "../../../menus/custom-items/NoteColorPickerMenuItem.jsx"; +import NoteColorPicker from "../../../menus/custom-items/NoteColorPicker.jsx"; import { RefObject } from "preact"; export function useContextMenu(parentNote: FNote, parentComponent: Component | null | undefined, tabulator: RefObject): Partial { @@ -224,7 +224,7 @@ export function showRowContextMenu(parentComponent: Component, e: MouseEvent, ro { kind: "separator"}, { kind: "custom", - componentFn: () => NoteColorPickerMenuItem({note: rowData.noteId}) + componentFn: () => NoteColorPicker({note: rowData.noteId}) } ], selectMenuItemHandler: ({ command }) => link_context_menu.handleLinkContextMenuItem(command, rowData.noteId), From d51e3de67474d11507ee433e4d373c89f5133a99 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 19:10:54 +0200 Subject: [PATCH 044/697] feat(text): strike-through todo items (closes #4269) --- apps/client/src/stylesheets/style.css | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 4ce8b1cd77..7b95d13dfe 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2434,6 +2434,15 @@ footer.webview-footer button { .admonition.caution::before { content: "\eac7"; } .admonition.warning::before { content: "\eac5"; } +.ck-content ul.todo-list li span.todo-list__label__description { + transition: opacity 200ms ease; +} + +.ck-content ul.todo-list li:has(input[type="checkbox"]:checked) span.todo-list__label__description { + text-decoration: line-through; + opacity: 0.6; +} + .chat-options-container { display: flex; margin: 5px 0; From e4c928ae877b88e1e2d5e42e92402197130d04ff Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 19:11:51 +0200 Subject: [PATCH 045/697] client/note color picker: refactor --- .../menus/custom-items/NoteColorPicker.tsx | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPicker.tsx b/apps/client/src/menus/custom-items/NoteColorPicker.tsx index 0c0941adc6..16a17655ff 100644 --- a/apps/client/src/menus/custom-items/NoteColorPicker.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPicker.tsx @@ -8,17 +8,17 @@ import Debouncer from "../../utils/debouncer"; import FNote from "../../entities/fnote"; import froca from "../../services/froca"; -const COLORS = [ +const COLOR_PALETTE = [ "#e64d4d", "#e6994d", "#e5e64d", "#99e64d", "#4de64d", "#4de699", "#4de5e6", "#4d99e6", "#4d4de6", "#994de6", "#e64db3" ]; -export interface NoteColorPickerMenuItemProps { +export interface NoteColorPickerProps { /** The target Note instance or its ID string. */ note: FNote | string | null; } -export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemProps) { +export default function NoteColorPicker(props: NoteColorPickerProps) { if (!props.note) return null; const [note, setNote] = useState(null); @@ -43,14 +43,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr useEffect(() => { const colorLabel = note?.getLabel("color")?.value ?? null; if (colorLabel) { - let color: ColorInstance | null = null; - - try { - color = new Color(colorLabel); - } catch(ex) { - console.error(ex); - } - + let color = tryParseColor(colorLabel); if (color) { setCurrentColor(color.hex().toLowerCase()); } @@ -58,7 +51,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr }, [note]); useEffect(() => { - setIsCustomColor(currentColor !== null && COLORS.indexOf(currentColor) === -1); + setIsCustomColor(currentColor !== null && COLOR_PALETTE.indexOf(currentColor) === -1); }, [currentColor]) const onColorCellClicked = useCallback((color: string | null) => { @@ -84,7 +77,7 @@ export default function NoteColorPickerMenuItem(props: NoteColorPickerMenuItemPr onSelect={onColorCellClicked} /> - {COLORS.map((color) => ( + {COLOR_PALETTE.map((color) => ( + return
        } -function ensureContrast(color: string | null) { - if (color === null) return "inherit"; +function getForegroundColor(backgroundColor: string | null) { + if (backgroundColor === null) return "inherit"; - const colorHsl = Color(color).hsl(); - let l = colorHsl.lightness(); - - if (l >= 40) { - l = 0; + const colorHsl = tryParseColor(backgroundColor)?.hsl(); + if (colorHsl) { + let l = colorHsl.lightness(); + return colorHsl.saturationl(0).lightness(l >= 50 ? 0 : 100).hex(); } else { - l = 100 + return "inherit"; + } +} + +function tryParseColor(colorStr: string): ColorInstance | null { + try { + return new Color(colorStr); + } catch(ex) { + console.error(ex); } - return colorHsl.saturationl(0).lightness(l).hex(); + return null; } \ No newline at end of file From 165357f44459d5d1c80add10d2bade637ee4079e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 19:52:13 +0200 Subject: [PATCH 046/697] fix(global_menu): uncaught exception if update request fails (closes #5700) --- .../client/src/widgets/buttons/global_menu.tsx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/apps/client/src/widgets/buttons/global_menu.tsx b/apps/client/src/widgets/buttons/global_menu.tsx index 9b36d83a54..c8c353b9cf 100644 --- a/apps/client/src/widgets/buttons/global_menu.tsx +++ b/apps/client/src/widgets/buttons/global_menu.tsx @@ -26,7 +26,7 @@ export default function GlobalMenu({ isHorizontalLayout }: { isHorizontalLayout: const isVerticalLayout = !isHorizontalLayout; const parentComponent = useContext(ParentComponent); const { isUpdateAvailable, latestVersion } = useTriliumUpdateStatus(); - + return ( - + {isUpdateAvailable && <> window.open("https://github.com/TriliumNext/Trilium/releases/latest")} icon="bx bx-download" text={t("global_menu.download-update", {latestVersion})} /> } - + {!isElectron() && } ) @@ -221,9 +221,15 @@ function useTriliumUpdateStatus() { async function updateVersionStatus() { const RELEASES_API_URL = "https://api.github.com/repos/TriliumNext/Trilium/releases/latest"; - const resp = await fetch(RELEASES_API_URL); - const data = await resp.json(); - const latestVersion = data?.tag_name?.substring(1); + let latestVersion: string | undefined = undefined; + try { + const resp = await fetch(RELEASES_API_URL); + const data = await resp.json(); + latestVersion = data?.tag_name?.substring(1); + } catch (e) { + console.warn("Unable to fetch latest version info from GitHub releases API", e); + } + setLatestVersion(latestVersion); } From a42ae62042b3139a88a1aba9908426934c2ca555 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 20 Nov 2025 19:03:44 +0100 Subject: [PATCH 047/697] 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-ko.md | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/docs/README-ko.md b/docs/README-ko.md index c43e0479d5..729b879b72 100644 --- a/docs/README-ko.md +++ b/docs/README-ko.md @@ -27,8 +27,7 @@ status](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted Trilium Notes는 대규모 개인 지식 기반 구축에 중점을 둔 무료 오픈 소스 크로스 플랫폼 계층적 메모 작성 애플리케이션입니다. -See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for -quick overview: +[스크린샷](https://triliumnext.github.io/Docs/Wiki/screenshot-tour)에서 간략한 개요를 확인하세요: Trilium Screenshot @@ -40,33 +39,31 @@ quick overview: ## 📚 문서 -**[docs.triliumnotes.org](https://docs.triliumnotes.org/)에서 포괄적인 문서를 방문하세요** +**[docs.triliumnotes.org](https://docs.triliumnotes.org/)에서 전체 문서를 확인하세요** -저희 문서는 다양한 형식으로 제공됩니다. +저희 문서는 다양한 형식으로 제공됩니다: - **온라인 문서**: [docs.triliumnotes.org](https://docs.triliumnotes.org/)에서 모든 문서를 보여줍니다 - **도움말**: 트릴리움 어플리케이션에서 `F1` 버튼을 눌러 같은 문서를 직접 볼 수 있습니다 -- **GitHub**: Navigate through the [User - Guide](./docs/User%20Guide/User%20Guide/) in this repository +- **GitHub**: 이 레포지토리의 [사용자 가이드](./docs/User%20Guide/User%20Guide/)에서 확인할 수 있습니다 -### Quick Links -- [Getting Started Guide](https://docs.triliumnotes.org/) -- [Installation - Instructions](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) -- [Docker - Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) -- [Upgrading - TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) -- [Basic Concepts and - Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) -- [Patterns of Personal Knowledge - Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) +### 바로가기 +- [시작하기 가이드](https://docs.triliumnotes.org/) +- [설치 + 방법](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) +- [도커 + 설치](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) +- [TriliumNext로 + 업그레이드](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) +- [기본 개념 및 + 기능](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md) +- [개인 지식 베이스의 + 패턴들](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge) -## 🎁 Features +## 🎁 기능들 -* Notes can be arranged into arbitrarily deep tree. Single note can be placed - into multiple places in the tree (see - [cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes)) +* 노트는 다양한 깊이의 트리로 배열될 수 있습니다. 하나의 노트는 트리의 여러 위치에 둘 수 있습니다 + ([cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes) 참고) * Rich WYSIWYG note editor including e.g. tables, images and [math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown [autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat) From 7f81b839550d822d48e23fae3574acc19afd8776 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 20:13:20 +0200 Subject: [PATCH 048/697] chore(print/list): get note titles to render --- .../src/widgets/collections/NoteList.tsx | 8 ++++++-- .../collections/legacy/ListOrGridView.tsx | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index 1d5a968106..860886a0f0 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -2,7 +2,7 @@ import { allViewTypes, ViewModeMedia, ViewModeProps, ViewTypeOptions } from "./i import { useNoteContext, useNoteLabel, useNoteLabelBoolean, useTriliumEvent } from "../react/hooks"; import FNote from "../../entities/fnote"; import "./NoteList.css"; -import { ListView, GridView } from "./legacy/ListOrGridView"; +import { ListView, GridView, ListPrintView } from "./legacy/ListOrGridView"; import { useEffect, useRef, useState } from "preact/hooks"; import GeoView from "./geomap"; import ViewModeStorage from "./view_mode_storage"; @@ -103,7 +103,11 @@ export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePa function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps) { switch (viewType) { case "list": - return ; + if (props.media !== "print") { + return ; + } else { + return ; + } case "grid": return ; case "geoMap": diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx index ef37b6685e..db5a885936 100644 --- a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx @@ -11,6 +11,7 @@ import tree from "../../../services/tree"; import link from "../../../services/link"; import { t } from "../../../services/i18n"; import attribute_renderer from "../../../services/attribute_renderer"; +import froca from "../../../services/froca"; export function ListView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { const [ isExpanded ] = useNoteLabelBoolean(note, "expanded"); @@ -34,6 +35,25 @@ export function ListView({ note, noteIds: unfilteredNoteIds, highlightedTokens } ); } +export function ListPrintView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { + const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); + const [ notes, setNotes ] = useState(); + + useEffect(() => { + froca.getNotes(noteIds).then(setNotes); + }, [noteIds]); + + return ( +
        + +
        + ); +} + export function GridView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); const { pageNotes, ...pagination } = usePagination(note, noteIds); From 73e7fa0f85ede19c2ec8626f7c4bb7a6194b4793 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 20:15:44 +0200 Subject: [PATCH 049/697] chore(print/list): get note content to render --- .../src/widgets/collections/legacy/ListOrGridView.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx index db5a885936..55415e7c16 100644 --- a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx @@ -47,7 +47,13 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, highlightedTok
        From c95cb79672e7c1a49c51013bd50bf39aa2738b6d Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 20:17:20 +0200 Subject: [PATCH 050/697] chore(print/list): enable print dialog --- .../src/widgets/collections/legacy/ListOrGridView.tsx | 8 +++++++- apps/client/src/widgets/ribbon/NoteActions.tsx | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx index 55415e7c16..80087f584f 100644 --- a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx @@ -35,7 +35,7 @@ export function ListView({ note, noteIds: unfilteredNoteIds, highlightedTokens } ); } -export function ListPrintView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { +export function ListPrintView({ note, noteIds: unfilteredNoteIds, highlightedTokens, onReady }: ViewModeProps<{}>) { const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); const [ notes, setNotes ] = useState(); @@ -43,6 +43,12 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, highlightedTok froca.getNotes(noteIds).then(setNotes); }, [noteIds]); + useEffect(() => { + if (notes && onReady) { + onReady(); + } + }, [ notes, onReady ]); + return (
        From f4d6e98d61127038662bf6941b83900e788ef656 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 21:06:25 +0200 Subject: [PATCH 059/697] feat(print/list): rewrite links --- apps/client/src/services/link.ts | 44 ++++++++++--------- .../collections/legacy/ListPrintView.tsx | 12 +++++ 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/apps/client/src/services/link.ts b/apps/client/src/services/link.ts index 9af93b3135..a596e71366 100644 --- a/apps/client/src/services/link.ts +++ b/apps/client/src/services/link.ts @@ -467,28 +467,30 @@ function getReferenceLinkTitleSync(href: string) { } } -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("click", "a", goToLink); -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("auxclick", "a", goToLink); // to handle the middle button -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("contextmenu", "a", linkContextMenu); -// TODO: Check why the event is not supported. -//@ts-ignore -$(document).on("dblclick", "a", goToLink); +if (glob.device !== "print") { + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("click", "a", goToLink); + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("auxclick", "a", goToLink); // to handle the middle button + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("contextmenu", "a", linkContextMenu); + // TODO: Check why the event is not supported. + //@ts-ignore + $(document).on("dblclick", "a", goToLink); -$(document).on("mousedown", "a", (e) => { - if (e.which === 2) { - // prevent paste on middle click - // https://github.com/zadam/trilium/issues/2995 - // https://developer.mozilla.org/en-US/docs/Web/API/Element/auxclick_event#preventing_default_actions - e.preventDefault(); - return false; - } -}); + $(document).on("mousedown", "a", (e) => { + if (e.which === 2) { + // prevent paste on middle click + // https://github.com/zadam/trilium/issues/2995 + // https://developer.mozilla.org/en-US/docs/Web/API/Element/auxclick_event#preventing_default_actions + e.preventDefault(); + return false; + } + }); +} export default { getNotePathFromUrl, diff --git a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx index 07750a87bb..d4fa361337 100644 --- a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx @@ -29,6 +29,7 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: Vie insertPageTitle(contentEl, note.title); rewriteHeadings(contentEl, depth); + rewriteLinks(contentEl); notesWithContent.push({ note, content: { __html: contentEl.innerHTML } }); @@ -84,3 +85,14 @@ function rewriteHeadings(contentEl: HTMLElement, depth: number) { headingEl.replaceWith(newHeadingEl); } } + +function rewriteLinks(contentEl: HTMLElement) { + const linkEls = contentEl.querySelectorAll("a"); + for (const linkEl of linkEls) { + const href = linkEl.getAttribute("href"); + if (href && href.startsWith("#root/")) { + const noteId = href.split("/").at(-1); + linkEl.setAttribute("href", `#note-${noteId}`); + } + } +} From 25a51a71a0df0ca9666576c0a12709630ae0cb10 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 21:20:24 +0200 Subject: [PATCH 060/697] feat(print/list): unlink references to notes that are not printed --- .../collections/legacy/ListPrintView.tsx | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx index d4fa361337..a2b9d53194 100644 --- a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx @@ -8,11 +8,12 @@ import { useFilteredNoteIds } from "./utils"; interface NotesWithContent { note: FNote; - content: { __html: string }; + contentEl: HTMLElement; } export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: ViewModeProps<{}>) { const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); + const noteIdsSet = new Set(); const [ notesWithContent, setNotesWithContent ] = useState(); useLayoutEffect(() => { @@ -29,9 +30,8 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: Vie insertPageTitle(contentEl, note.title); rewriteHeadings(contentEl, depth); - rewriteLinks(contentEl); - - notesWithContent.push({ note, content: { __html: contentEl.innerHTML } }); + noteIdsSet.add(note.noteId); + notesWithContent.push({ note, contentEl }); if (note.hasChildren()) { const imageLinks = note.getRelations("imageLink"); @@ -46,6 +46,12 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: Vie for (const note of notes) { await processNote(note, 1); } + + // After all notes are processed, rewrite links + for (const { contentEl } of notesWithContent) { + rewriteLinks(contentEl, noteIdsSet); + } + setNotesWithContent(notesWithContent); }); }, [noteIds]); @@ -61,8 +67,8 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: Vie
        @@ -86,13 +92,21 @@ function rewriteHeadings(contentEl: HTMLElement, depth: number) { } } -function rewriteLinks(contentEl: HTMLElement) { +function rewriteLinks(contentEl: HTMLElement, noteIdsSet: Set) { const linkEls = contentEl.querySelectorAll("a"); for (const linkEl of linkEls) { const href = linkEl.getAttribute("href"); if (href && href.startsWith("#root/")) { const noteId = href.split("/").at(-1); - linkEl.setAttribute("href", `#note-${noteId}`); + + if (noteId && noteIdsSet.has(noteId)) { + linkEl.setAttribute("href", `#note-${noteId}`); + } else { + // Link to note not in the print view, remove link but keep text + const spanEl = document.createElement("span"); + spanEl.innerHTML = linkEl.innerHTML; + linkEl.replaceWith(spanEl); + } } } } From 8b4e76832f3bb33ee705b0e409f899c0e5a32e3f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 21:28:55 +0200 Subject: [PATCH 061/697] docs(user): update documentation regarding printing multiple notes --- .../Notes/Printing & Exporting as PDF.html | 53 +++++++++++-------- .../User Guide/Collections/List View.html | 17 +++++- .../Custom Widgets/Right pane widget.html | 9 ++-- .../Developer Guide/Documentation.md | 2 +- docs/User Guide/!!!meta.json | 14 +++++ .../Notes/Printing & Exporting as PDF.md | 10 ++++ .../User Guide/Collections/List View.md | 13 ++++- 7 files changed, 88 insertions(+), 30 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html index c0cf16ba9d..f0c704785d 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html @@ -4,7 +4,6 @@
        Screenshot of the note contextual menu indicating the “Export as PDF” option.
        -

        Printing

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

        @@ -60,9 +59,9 @@ class="admonition note"> orientation, size. However, there are a few Attributes to adjust some of the settings:

          -
        • To print in landscape mode instead of portrait (useful for big diagrams +
        • To print in landscape mode instead of portrait (useful for big diagrams or slides), add #printLandscape.
        • -
        • By default, the resulting PDF will be in Letter format. It is possible +
        • By default, the resulting PDF will be in Letter format. It is possible to adjust it to another page size via the #printPageSize attribute, with one of the following values: A0, A1, A2, A3, A4, A5, A6, Legal, Letter, Tabloid, Ledger.
        @@ -70,15 +69,26 @@ class="admonition note">

        These options have no effect when used with the printing feature, since the user-defined settings are used instead.

        +

        Printing multiple notes

        +

        Since v0.100.0, it is possible to print more than one note at the time + by using Collections:

        +
          +
        1. First create a collection.
        2. +
        3. Configure it to use List View.
        4. +
        5. Print the collection note normally.
        6. +
        +

        The resulting collection will contain all the children of the collection, + while maintaining the hierarchy.

        Keyboard shortcut

        It's possible to trigger both printing and export as PDF from the keyboard by going to Keyboard shortcuts in Options and assigning a key combination for:

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

        Constraints & limitations

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

          -
        • For Code notes: +
        • For Code notes:
            -
          • Line numbers are not printed.
          • -
          • Syntax highlighting is enabled, however a default theme (Visual Studio) +
          • Line numbers are not printed.
          • +
          • Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced.
        • -
        • For Collections: +
        • For Collections:
            -
          • Only Presentation is +
          • Only Presentation is currently supported.
          • -
          • We plan to add support for all the collection types at some point.
          • +
          • We plan to add support for all the collection types at some point.
        • -
        • Using Custom app-wide CSS for +
        • Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism.
            -
          • We plan to introduce a new mechanism specifically for a print CSS.
          • +
          • We plan to introduce a new mechanism specifically for a print CSS.
        @@ -114,10 +124,10 @@ class="admonition note"> printing.

        To do so:

          -
        • Create a CSS code note.
        • -
        • On the note being printed, apply the ~printCss relation to +
        • Create a CSS code note.
        • +
        • On the note being printed, apply the ~printCss relation to point to the newly created CSS code note.
        • -
        • To apply the CSS to multiple notes, consider using inheritable attributes or  +
        • To apply the CSS to multiple notes, consider using inheritable attributes or  Templates.
        @@ -128,12 +138,13 @@ class="admonition note"> }

        To remark:

          -
        • Multiple CSS notes can be add by using multiple ~printCss relations.
        • -
        • If the note pointing to the printCss doesn't have the right +
        • Multiple CSS notes can be add by using multiple ~printCss relations.
        • +
        • If the note pointing to the printCss doesn't have the right note type or mime type, it will be ignored.
        • -
        • If migrating from a previous version where Custom app-wide CSS, there's no need for @media print {  since - the style-sheet is used only for printing.
        • +
        • If migrating from a previous version where Custom app-wide CSS, there's no need for @media print {  since + the style-sheet is used only for printing.

        Under the hood

        Both printing and exporting as PDF use the same mechanism: a note is rendered diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html index f3e4926b46..64c09e0241 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html @@ -12,9 +12,22 @@ as a single continuous document.

        Interaction

          -
        • Each note can be expanded or collapsed by clicking on the arrow to the +
        • Each note can be expanded or collapsed by clicking on the arrow to the left of the title.
        • -
        • In the Ribbon, +
        • In the Ribbon, in the Collection tab there are options to expand and to collapse all notes easily.
        • +
        +

        Printing and exporting to PDF

        +

        Since v0.100.0, list collections can be printed or exported to PDF.

        +

        A printed list collection will print all the notes in the collection, + in the right order and preserving the full hierarchy.

        +

        If exported to PDF within the desktop application, there is additional + functionality:

        +
          +
        • The table of contents of the PDF will reflect the structure of the notes.
        • +
        • Reference and inline links to other notes within the same hierarchy will + be functional (will jump to the corresponding page). If a link refers to + a note that is not in the printed hierarchy, it will be unlinked.
        \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html index 393a9a60a0..27437786ff 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html @@ -1,13 +1,12 @@
          -
        • doRender must not be overridden, instead doRenderBody() has +
        • doRender must not be overridden, instead doRenderBody() has to be overridden.
            -
          • doRenderBody can optionally be async.
          • +
          • doRenderBody can optionally be async.
        • -
        • parentWidget() must be set to “rightPane”.
        • -
        • widgetTitle() getter can optionally be overriden, otherwise +
        • parentWidget() must be set to “rightPane”.
        • +
        • widgetTitle() getter can optionally be overriden, otherwise the widget will be displayed as “Untitled widget”.
        const template = `<div>Hi</div>`;
         
        diff --git a/docs/Developer Guide/Developer Guide/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md
        index 93ee33d7a9..b8eca125b2 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/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json
        index 91af437e1d..7b77cb46aa 100644
        --- a/docs/User Guide/!!!meta.json	
        +++ b/docs/User Guide/!!!meta.json	
        @@ -4135,6 +4135,13 @@
                                                     "value": "printing-and-pdf-export",
                                                     "isInheritable": false,
                                                     "position": 110
        +                                        },
        +                                        {
        +                                            "type": "relation",
        +                                            "name": "internalLink",
        +                                            "value": "mULW0Q3VojwY",
        +                                            "isInheritable": false,
        +                                            "position": 130
                                                 }
                                             ],
                                             "format": "markdown",
        @@ -10478,6 +10485,13 @@
                                             "value": "list",
                                             "isInheritable": false,
                                             "position": 30
        +                                },
        +                                {
        +                                    "type": "relation",
        +                                    "name": "internalLink",
        +                                    "value": "NRnIZmSMc5sj",
        +                                    "isInheritable": false,
        +                                    "position": 40
                                         }
                                     ],
                                     "format": "markdown",
        diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md
        index 21fbe12e68..d8cbe4bfa0 100644
        --- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md	
        +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md	
        @@ -49,6 +49,16 @@ When exporting to PDF, there are no customizable settings such as page orientati
         > [!NOTE]
         > These options have no effect when used with the printing feature, since the user-defined settings are used instead.
         
        +## Printing multiple notes
        +
        +Since v0.100.0, it is possible to print more than one note at the time by using Collections:
        +
        +1.  First create a collection.
        +2.  Configure it to use List View.
        +3.  Print the collection note normally.
        +
        +The resulting collection will contain all the children of the collection, while maintaining the hierarchy.
        +
         ## Keyboard shortcut
         
         It's possible to trigger both printing and export as PDF from the keyboard by going to _Keyboard shortcuts_ in Options and assigning a key combination for:
        diff --git a/docs/User Guide/User Guide/Collections/List View.md b/docs/User Guide/User Guide/Collections/List View.md
        index 76fd158205..86cb59806e 100644
        --- a/docs/User Guide/User Guide/Collections/List View.md	
        +++ b/docs/User Guide/User Guide/Collections/List View.md	
        @@ -8,4 +8,15 @@ In the example above, the "Node.js" note on the left panel contains several chil
         ## Interaction
         
         *   Each note can be expanded or collapsed by clicking on the arrow to the left of the title.
        -*   In the Ribbon, in the _Collection_ tab there are options to expand and to collapse all notes easily.
        \ No newline at end of file
        +*   In the Ribbon, in the _Collection_ tab there are options to expand and to collapse all notes easily.
        +
        +## Printing and exporting to PDF
        +
        +Since v0.100.0, list collections can be [printed or exported to PDF](../Basic%20Concepts%20and%20Features/Notes/Printing%20%26%20Exporting%20as%20PDF.md).
        +
        +A printed list collection will print all the notes in the collection, in the right order and preserving the full hierarchy.
        +
        +If exported to PDF within the desktop application, there is additional functionality:
        +
        +*   The table of contents of the PDF will reflect the structure of the notes.
        +*   Reference and inline links to other notes within the same hierarchy will be functional (will jump to the corresponding page). If a link refers to a note that is not in the printed hierarchy, it will be unlinked.
        \ No newline at end of file
        
        From 049721bbfe5c877f4082acc58218529272e8dfeb Mon Sep 17 00:00:00 2001
        From: Elian Doran 
        Date: Thu, 20 Nov 2025 21:32:06 +0200
        Subject: [PATCH 062/697] docs(user): update limitations for printing/exporting
        
        ---
         .../Notes/Printing & Exporting as PDF.html             | 10 +++++++---
         .../Notes/Printing & Exporting as PDF.md               |  5 +++--
         2 files changed, 10 insertions(+), 5 deletions(-)
        
        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html
        index f0c704785d..35ae5862b6 100644
        --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html	
        +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html	
        @@ -105,9 +105,13 @@ class="admonition note">
             
             
      • For Collections:
          -
        • Only Presentation is - currently supported.
        • -
        • We plan to add support for all the collection types at some point.
        • +
        • List View is + supported, allowing to print multiple notes at once while preserving hierarchy + (similar to a book).
        • +
        • Presentation is + also supported, where each slide/subnote is displayed.
        • +
        • The rest of the collections are not supported, but we plan to add support + for all the collection types at some point.
      • Using Custom app-wide CSS for diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md index d8cbe4bfa0..083ad6ec78 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md @@ -74,8 +74,9 @@ Not all Note Types  * Line numbers are not printed. * Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced. * For Collections: - * Only Presentation is currently supported. - * We plan to add support for all the collection types at some point. + * List View is supported, allowing to print multiple notes at once while preserving hierarchy (similar to a book). + * Presentation is also supported, where each slide/subnote is displayed. + * The rest of the collections are not supported, but we plan to add support for all the collection types at some point. * Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism. * We plan to introduce a new mechanism specifically for a print CSS. From be115c74c3626fd4d47d56fbb84166813d98ad4c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Thu, 20 Nov 2025 21:42:50 +0200 Subject: [PATCH 063/697] chore(print/list): address review --- .../widgets/collections/legacy/ListOrGridView.tsx | 8 ++------ .../src/widgets/collections/legacy/ListPrintView.tsx | 12 +++++------- apps/client/src/widgets/collections/legacy/utils.ts | 9 ++++++++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx index 9017c99ba5..749036598c 100644 --- a/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListOrGridView.tsx @@ -11,7 +11,7 @@ import tree from "../../../services/tree"; import link from "../../../services/link"; import { t } from "../../../services/i18n"; import attribute_renderer from "../../../services/attribute_renderer"; -import { useFilteredNoteIds } from "./utils"; +import { filterChildNotes, useFilteredNoteIds } from "./utils"; export function ListView({ note, noteIds: unfilteredNoteIds, highlightedTokens }: ViewModeProps<{}>) { const [ isExpanded ] = useNoteLabelBoolean(note, "expanded"); @@ -161,14 +161,10 @@ function NoteContent({ note, trim, noChildrenList, highlightedTokens }: { note: } function NoteChildren({ note, parentNote, highlightedTokens }: { note: FNote, parentNote: FNote, highlightedTokens: string[] | null | undefined }) { - const imageLinks = note.getRelations("imageLink"); const [ childNotes, setChildNotes ] = useState(); useEffect(() => { - note.getChildNotes().then(childNotes => { - const filteredChildNotes = childNotes.filter((childNote) => !imageLinks.find((rel) => rel.value === childNote.noteId)); - setChildNotes(filteredChildNotes); - }); + filterChildNotes(note).then(setChildNotes); }, [ note ]); return childNotes?.map(childNote => ) diff --git a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx index a2b9d53194..77a354d0db 100644 --- a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx @@ -1,10 +1,9 @@ import { useEffect, useLayoutEffect, useState } from "preact/hooks"; -import { RawHtmlBlock } from "../../react/RawHtml"; import froca from "../../../services/froca"; import type FNote from "../../../entities/fnote"; import content_renderer from "../../../services/content_renderer"; import type { ViewModeProps } from "../interface"; -import { useFilteredNoteIds } from "./utils"; +import { filterChildNotes, useFilteredNoteIds } from "./utils"; interface NotesWithContent { note: FNote; @@ -13,10 +12,11 @@ interface NotesWithContent { export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: ViewModeProps<{}>) { const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); - const noteIdsSet = new Set(); const [ notesWithContent, setNotesWithContent ] = useState(); useLayoutEffect(() => { + const noteIdsSet = new Set(); + froca.getNotes(noteIds).then(async (notes) => { const notesWithContent: NotesWithContent[] = []; @@ -34,9 +34,7 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: Vie notesWithContent.push({ note, contentEl }); if (note.hasChildren()) { - const imageLinks = note.getRelations("imageLink"); - const childNotes = await note.getChildNotes(); - const filteredChildNotes = childNotes.filter((childNote) => !imageLinks.find((rel) => rel.value === childNote.noteId)); + const filteredChildNotes = await filterChildNotes(note); for (const childNote of filteredChildNotes) { await processNote(childNote, depth + 1); } @@ -82,7 +80,7 @@ function insertPageTitle(contentEl: HTMLElement, title: string) { } function rewriteHeadings(contentEl: HTMLElement, depth: number) { - const headings = contentEl.querySelectorAll("h1, h2, h3, h4, h5, h6") + const headings = contentEl.querySelectorAll("h1, h2, h3, h4, h5, h6"); for (const headingEl of headings) { const currentLevel = parseInt(headingEl.tagName.substring(1), 10); const newLevel = Math.min(currentLevel + depth, 6); diff --git a/apps/client/src/widgets/collections/legacy/utils.ts b/apps/client/src/widgets/collections/legacy/utils.ts index 6592c9cd9e..6432ce1d2f 100644 --- a/apps/client/src/widgets/collections/legacy/utils.ts +++ b/apps/client/src/widgets/collections/legacy/utils.ts @@ -9,5 +9,12 @@ export function useFilteredNoteIds(note: FNote, noteIds: string[]) { const includedLinks = note ? note.getRelations().filter((rel) => rel.name === "imageLink" || rel.name === "includeNoteLink") : []; const includedNoteIds = new Set(includedLinks.map((rel) => rel.value)); return noteIds.filter((noteId) => !includedNoteIds.has(noteId) && noteId !== "_hidden"); - }, noteIds); + }, [ note, noteIds ]); +} + +export async function filterChildNotes(note: FNote) { + const imageLinks = note.getRelations("imageLink"); + const imageLinkNoteIds = new Set(imageLinks.map(rel => rel.value)); + const childNotes = await note.getChildNotes(); + return childNotes.filter((childNote) => !imageLinkNoteIds.has(childNote.noteId)); } From 926f0f85f3846f52fdb0646c5117fb1dbf3f35e9 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 23:10:36 +0200 Subject: [PATCH 064/697] client/note color picker: refactor --- apps/client/package.json | 1 + .../client/src/menus/custom-items/NoteColorPicker.tsx | 11 +++++++++-- pnpm-lock.yaml | 11 +++++++---- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index cd1317e2ba..8bdbb94850 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -36,6 +36,7 @@ "autocomplete.js": "0.38.1", "bootstrap": "5.3.8", "boxicons": "2.1.4", + "clsx": "2.1.1", "color": "5.0.3", "dayjs": "1.11.19", "dayjs-plugin-utc": "0.1.2", diff --git a/apps/client/src/menus/custom-items/NoteColorPicker.tsx b/apps/client/src/menus/custom-items/NoteColorPicker.tsx index 16a17655ff..05041d898c 100644 --- a/apps/client/src/menus/custom-items/NoteColorPicker.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPicker.tsx @@ -3,6 +3,7 @@ import { t } from "../../services/i18n"; import { useCallback, useEffect, useRef, useState} from "preact/hooks"; import {ComponentChildren} from "preact"; import attributes from "../../services/attributes"; +import clsx from "clsx"; import Color, { ColorInstance } from "color"; import Debouncer from "../../utils/debouncer"; import FNote from "../../entities/fnote"; @@ -105,7 +106,11 @@ interface ColorCellProps { } function ColorCell(props: ColorCellProps) { - return
        props.onSelect?.(props.color)}> @@ -151,7 +156,9 @@ function CustomColorCell(props: ColorCellProps) { return
        =18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} + deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md '@smithy/credential-provider-imds@4.0.6': resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} @@ -15692,6 +15697,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15756,8 +15763,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-watchdog': 47.2.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -15952,8 +15957,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: From a5c5486474e093608debf6dfb804e99bcc2998b9 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 23:34:37 +0200 Subject: [PATCH 065/697] client/note color picker: tweak style --- apps/client/src/stylesheets/style.css | 4 ++++ apps/client/src/stylesheets/theme-next/base.css | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 4ce8b1cd77..e127db1aad 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -494,6 +494,10 @@ body #context-menu-container .dropdown-item > span { width: 100%; } +.dropdown-menu .note-color-picker { + padding: 10px 12px 8px 12px; +} + .cm-editor { height: 100%; outline: none !important; diff --git a/apps/client/src/stylesheets/theme-next/base.css b/apps/client/src/stylesheets/theme-next/base.css index 5976f1dfbe..ba83af30a1 100644 --- a/apps/client/src/stylesheets/theme-next/base.css +++ b/apps/client/src/stylesheets/theme-next/base.css @@ -347,6 +347,12 @@ li.dropdown-item a.dropdown-item-button:focus-visible { outline: 2px solid var(--input-focus-outline-color) !important; } +:root .dropdown-menu .note-color-picker { + padding: 4px 10px; + --note-color-picker-clear-color-cell-background: var(--main-text-color); + --note-color-picker-clear-color-cell-selection-outline-color: var(--main-text-color); +} + /* * TOASTS */ From 1b2d922c3f7483a621d2170854344a06e251e9eb Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 23:37:03 +0200 Subject: [PATCH 066/697] client/note color picker: tweak style --- 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 e127db1aad..60ad28237c 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -495,7 +495,7 @@ body #context-menu-container .dropdown-item > span { } .dropdown-menu .note-color-picker { - padding: 10px 12px 8px 12px; + padding: 4px 12px 8px 12px; } .cm-editor { From d42f911df9c740e99ace6231a6f204e671b59090 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 23:43:08 +0200 Subject: [PATCH 067/697] client/note color picker: dismiss the menu when a color is clicked --- apps/client/src/menus/custom-items/NoteColorPicker.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPicker.tsx b/apps/client/src/menus/custom-items/NoteColorPicker.tsx index 05041d898c..06ae6dc96b 100644 --- a/apps/client/src/menus/custom-items/NoteColorPicker.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPicker.tsx @@ -67,8 +67,7 @@ export default function NoteColorPicker(props: NoteColorPickerProps) { } }, [note, currentColor]); - return
        {e.stopPropagation()}}> + return
        Date: Thu, 20 Nov 2025 23:55:26 +0200 Subject: [PATCH 068/697] client/tree context menu: relocate the note color picker --- apps/client/src/menus/tree_context_menu.ts | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index 35480cfc60..19e6f4e169 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -242,6 +242,19 @@ export default class TreeContextMenu implements SelectMenuItemEventListener { + if (notOptionsOrHelp && selectedNotes.length === 1) { + return NoteColorPicker({note}); + } else { + return null; + } + } + }, + { kind: "separator" }, { title: t("tree-context-menu.import-into-note"), command: "importIntoNote", uiIcon: "bx bx-import", enabled: notSearch && noSelectedNotes && notOptionsOrHelp }, @@ -256,20 +269,7 @@ export default class TreeContextMenu implements SelectMenuItemEventListener { - if (notOptionsOrHelp && selectedNotes.length === 1) { - return NoteColorPicker({note}); - } else { - return null; - } - } - }, + } ]; return items.filter((row) => row !== null) as MenuItem[]; } From e9796c9a35c41f302bbbcc860ece2550f67c10b9 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Fri, 21 Nov 2025 01:29:54 +0200 Subject: [PATCH 069/697] client/note color picker: fix the custom color picker on Safari --- apps/client/src/menus/custom-items/NoteColorPicker.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPicker.tsx b/apps/client/src/menus/custom-items/NoteColorPicker.tsx index 06ae6dc96b..9a65073a73 100644 --- a/apps/client/src/menus/custom-items/NoteColorPicker.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPicker.tsx @@ -122,6 +122,7 @@ function CustomColorCell(props: ColorCellProps) { const colorInput = useRef(null); const colorInputDebouncer = useRef | null>(null); const callbackRef = useRef(props.onSelect); + const isSafari = useRef(/^((?!chrome|android).)*safari/i.test(navigator.userAgent)); useEffect(() => { colorInputDebouncer.current = new Debouncer(500, (color) => { @@ -152,7 +153,12 @@ function CustomColorCell(props: ColorCellProps) { colorInput.current?.click(); }, [pickedColor]); - return
        + return
        { + // The color picker dropdown will close on Safari if the parent context menu is + // dismissed, so stop the click propagation to prevent dismissing the menu. + isSafari.current && e.stopPropagation(); + }}> Date: Fri, 21 Nov 2025 01:30:45 +0200 Subject: [PATCH 070/697] client/note color picker: decrease the debouncer interval --- apps/client/src/menus/custom-items/NoteColorPicker.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPicker.tsx b/apps/client/src/menus/custom-items/NoteColorPicker.tsx index 9a65073a73..775769261b 100644 --- a/apps/client/src/menus/custom-items/NoteColorPicker.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPicker.tsx @@ -125,7 +125,7 @@ function CustomColorCell(props: ColorCellProps) { const isSafari = useRef(/^((?!chrome|android).)*safari/i.test(navigator.userAgent)); useEffect(() => { - colorInputDebouncer.current = new Debouncer(500, (color) => { + colorInputDebouncer.current = new Debouncer(250, (color) => { callbackRef.current?.(color); setPickedColor(color); }); From d87e8b729f4c276ee403189d3b002db8c59a76e4 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Fri, 21 Nov 2025 02:12:52 +0200 Subject: [PATCH 071/697] client/note color picker/clear color cell: fix icon alignment --- .../menus/custom-items/NoteColorPicker.css | 47 +++++++++---------- .../menus/custom-items/NoteColorPicker.tsx | 8 +++- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/apps/client/src/menus/custom-items/NoteColorPicker.css b/apps/client/src/menus/custom-items/NoteColorPicker.css index 93a56ec0cd..f4d6f642fc 100644 --- a/apps/client/src/menus/custom-items/NoteColorPicker.css +++ b/apps/client/src/menus/custom-items/NoteColorPicker.css @@ -32,20 +32,6 @@ outline-offset: 2px; } -.note-color-picker .color-cell-reset::before, -.note-color-picker .custom-color-cell::before { - position: absolute; - display: flex; - top: 0; - left: 0; - right: 0; - bottom: 0; - font-size: calc(var(--color-picker-cell-size) * 1.3); - justify-content: center; - align-items: center; - font-family: boxicons; -} - /* * RESET COLOR CELL */ @@ -55,18 +41,37 @@ --outline-color: var(--note-color-picker-clear-color-cell-selection-outline-color); position: relative; + display: flex; + justify-content: center; + align-items: center; } -.note-color-picker .color-cell-reset::before { - content: "\ec8d"; - mix-blend-mode: normal; - color: var(--note-color-picker-clear-color-cell-color); +.note-color-picker .color-cell-reset svg { + width: var(--color-picker-cell-size); + height: var(--color-picker-cell-size); + fill: var(--note-color-picker-clear-color-cell-color); } /* * CUSTOM COLOR CELL */ + .note-color-picker .custom-color-cell::before { + position: absolute; + content: "\ed35"; + display: flex; + top: 0; + left: 0; + right: 0; + bottom: 0; + font-size: calc(var(--color-picker-cell-size) * 1.3); + justify-content: center; + align-items: center; + font-family: boxicons; + font-size: 16px; + color: var(--foreground); +} + .note-color-picker .custom-color-cell { position: relative; display: flex; @@ -78,10 +83,4 @@ background-image: url(./custom-color.png); background-size: cover; --foreground: transparent; -} - -.note-color-picker .custom-color-cell::before { - content: "\ed35"; - color: var(--foreground); - font-size: 16px; } \ No newline at end of file diff --git a/apps/client/src/menus/custom-items/NoteColorPicker.tsx b/apps/client/src/menus/custom-items/NoteColorPicker.tsx index 775769261b..08bc7c84ae 100644 --- a/apps/client/src/menus/custom-items/NoteColorPicker.tsx +++ b/apps/client/src/menus/custom-items/NoteColorPicker.tsx @@ -74,7 +74,13 @@ export default function NoteColorPicker(props: NoteColorPickerProps) { color={null} isSelected={(currentColor === null)} isDisabled={(note === null)} - onSelect={onColorCellClicked} /> + onSelect={onColorCellClicked}> + + {/* https://pictogrammers.com/library/mdi/icon/close/ */} + + + + {COLOR_PALETTE.map((color) => ( From c7793beb0f5314c01a9856b670cf00374fba9e96 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 00:18:58 +0000 Subject: [PATCH 072/697] chore(deps): update dependency vite to v7.2.4 --- apps/server/package.json | 2 +- apps/website/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 129 +++++++++++++++++++------------------- 4 files changed, 67 insertions(+), 68 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 0b22d041b1..0ff9bafb29 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -124,7 +124,7 @@ "tmp": "0.2.5", "turndown": "7.2.2", "unescape": "1.0.1", - "vite": "7.2.2", + "vite": "7.2.4", "ws": "8.18.3", "xml2js": "0.6.2", "yauzl": "3.2.0" diff --git a/apps/website/package.json b/apps/website/package.json index d610abb2b7..47a516bc99 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -22,7 +22,7 @@ "eslint-config-preact": "2.0.0", "typescript": "5.9.3", "user-agent-data-types": "0.4.2", - "vite": "7.2.2", + "vite": "7.2.4", "vitest": "4.0.10" }, "eslintConfig": { diff --git a/package.json b/package.json index 37bf449f43..8713c5723d 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "typescript": "~5.9.0", "typescript-eslint": "8.47.0", "upath": "2.0.1", - "vite": "7.2.2", + "vite": "7.2.4", "vite-plugin-dts": "~4.5.0", "vitest": "4.0.10" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 340a6c6768..03df468fa8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,10 +57,10 @@ importers: version: 24.10.1 '@vitest/browser-webdriverio': specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': specifier: 4.0.10 - version: 4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10) + version: 4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10) '@vitest/ui': specifier: 4.0.10 version: 4.0.10(vitest@4.0.10) @@ -105,7 +105,7 @@ importers: version: 0.18.0 rollup-plugin-webpack-stats: specifier: 2.1.7 - version: 2.1.7(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.1.7(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) tslib: specifier: 2.8.1 version: 2.8.1 @@ -122,11 +122,11 @@ importers: specifier: 2.0.1 version: 2.0.1 vite: - specifier: 7.2.2 - version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-plugin-dts: specifier: ~4.5.0 - version: 4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 4.0.10 version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -313,7 +313,7 @@ importers: version: 5.0.0 '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -346,7 +346,7 @@ importers: version: 0.7.2 vite-plugin-static-copy: specifier: 3.1.4 - version: 3.1.4(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 3.1.4(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) apps/db-compare: dependencies: @@ -509,7 +509,7 @@ importers: version: 2.1.3(electron@38.7.1) '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@triliumnext/commons': specifier: workspace:* version: link:../../packages/commons @@ -781,8 +781,8 @@ importers: specifier: 1.0.1 version: 1.0.1 vite: - specifier: 7.2.2 - version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: specifier: 8.18.3 version: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -822,7 +822,7 @@ importers: devDependencies: '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) eslint: specifier: 9.39.1 version: 9.39.1(jiti@2.6.1) @@ -836,8 +836,8 @@ importers: specifier: 0.4.2 version: 0.4.2 vite: - specifier: 7.2.2 - version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 7.2.4 + version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: 4.0.10 version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -895,7 +895,7 @@ importers: version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': specifier: 4.0.10 version: 4.0.10(vitest@4.0.10) @@ -928,7 +928,7 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 4.0.10 version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -955,7 +955,7 @@ importers: version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': specifier: 4.0.10 version: 4.0.10(vitest@4.0.10) @@ -988,7 +988,7 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 4.0.10 version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -1015,7 +1015,7 @@ importers: version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': specifier: 4.0.10 version: 4.0.10(vitest@4.0.10) @@ -1048,7 +1048,7 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 4.0.10 version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -1082,7 +1082,7 @@ importers: version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': specifier: 4.0.10 version: 4.0.10(vitest@4.0.10) @@ -1115,7 +1115,7 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 4.0.10 version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -1149,7 +1149,7 @@ importers: version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) '@vitest/coverage-istanbul': specifier: 4.0.10 version: 4.0.10(vitest@4.0.10) @@ -1182,7 +1182,7 @@ importers: version: 5.9.3 vite-plugin-svgo: specifier: ~2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: specifier: 4.0.10 version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) @@ -4752,16 +4752,11 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.18.3': - resolution: {integrity: sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==} - engines: {node: '>=18.0.0'} - deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md - '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md - + '@smithy/core@3.18.5': resolution: {integrity: sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==} engines: {node: '>=18.0.0'} @@ -14328,8 +14323,8 @@ packages: peerDependencies: vite: 5.x || 6.x || 7.x - vite@7.2.2: - resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} + vite@7.2.4: + resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -15721,8 +15716,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15787,6 +15780,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-watchdog': 47.2.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -15981,6 +15976,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16003,6 +16000,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.2.0': dependencies: @@ -18928,18 +18927,18 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@prefresh/vite': 2.4.8(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@prefresh/vite': 2.4.8(preact@10.27.2)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) debug: 4.4.1 picocolors: 1.1.1 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-prerender-plugin: 0.5.11(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite-prerender-plugin: 0.5.11(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) transitivePeerDependencies: - preact - supports-color @@ -18952,7 +18951,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.8(preact@10.27.2)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@prefresh/vite@2.4.8(preact@10.27.2)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 @@ -18960,7 +18959,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.27.2 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -21060,9 +21059,9 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: @@ -21071,9 +21070,9 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)': + '@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)': dependencies: - '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 4.0.10 magic-string: 0.30.21 pixelmatch: 7.1.0 @@ -21103,7 +21102,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10)': + '@vitest/coverage-v8@4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.10 @@ -21118,7 +21117,7 @@ snapshots: tinyrainbow: 3.0.3 vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) transitivePeerDependencies: - supports-color @@ -21131,14 +21130,14 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.5(@types/node@24.10.1)(typescript@5.9.3) - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@4.0.10': dependencies: @@ -29601,11 +29600,11 @@ snapshots: '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29 optional: true - rollup-plugin-stats@1.5.2(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + rollup-plugin-stats@1.5.2(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) rollup-plugin-styles@4.0.0(rollup@4.40.0): dependencies: @@ -29634,13 +29633,13 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.40.0) rollup: 4.40.0 - rollup-plugin-webpack-stats@2.1.7(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + rollup-plugin-webpack-stats@2.1.7(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: - rollup-plugin-stats: 1.5.2(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + rollup-plugin-stats: 1.5.2(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) rollup@4.40.0: dependencies: @@ -31626,7 +31625,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-plugin-dts@4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@microsoft/api-extractor': 7.52.8(@types/node@24.10.1) '@rollup/pluginutils': 5.1.4(rollup@4.52.0) @@ -31639,27 +31638,27 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@3.1.4(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-static-copy@3.1.4(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 p-map: 7.0.3 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: svgo: 3.3.2 typescript: 5.9.3 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite-prerender-plugin@0.5.11(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): + vite-prerender-plugin@0.5.11(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.18 @@ -31667,9 +31666,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -31692,7 +31691,7 @@ snapshots: vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.10 - '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.10 '@vitest/runner': 4.0.10 '@vitest/snapshot': 4.0.10 @@ -31709,12 +31708,12 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 '@types/node': 24.10.1 - '@vitest/browser-webdriverio': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/browser-webdriverio': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.10(vitest@4.0.10) happy-dom: 20.0.10 jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) From 5e116846652196e42a6fd288767b74eb2f5b060e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 00:20:02 +0000 Subject: [PATCH 073/697] fix(deps): update dependency marked to v17.0.1 --- apps/client/package.json | 2 +- apps/server/package.json | 2 +- pnpm-lock.yaml | 29 ++++++++++++++--------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 5c90f4d565..415244dd69 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -54,7 +54,7 @@ "leaflet": "1.9.4", "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", - "marked": "17.0.0", + "marked": "17.0.1", "mermaid": "11.12.1", "mind-elixir": "5.3.6", "normalize.css": "8.0.1", diff --git a/apps/server/package.json b/apps/server/package.json index 0b22d041b1..05a1063d91 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -103,7 +103,7 @@ "is-animated": "2.0.2", "is-svg": "6.1.0", "jimp": "1.6.0", - "marked": "17.0.0", + "marked": "17.0.1", "mime-types": "3.0.1", "multer": "2.0.2", "normalize-strings": "1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 340a6c6768..9304a42192 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -275,8 +275,8 @@ importers: specifier: 8.11.1 version: 8.11.1 marked: - specifier: 17.0.0 - version: 17.0.0 + specifier: 17.0.1 + version: 17.0.1 mermaid: specifier: 11.12.1 version: 11.12.1 @@ -718,8 +718,8 @@ importers: specifier: 1.6.0 version: 1.6.0 marked: - specifier: 17.0.0 - version: 17.0.0 + specifier: 17.0.1 + version: 17.0.1 mime-types: specifier: 3.0.1 version: 3.0.1 @@ -4752,16 +4752,11 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.18.3': - resolution: {integrity: sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==} - engines: {node: '>=18.0.0'} - deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md - '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md - + '@smithy/core@3.18.5': resolution: {integrity: sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==} engines: {node: '>=18.0.0'} @@ -10152,8 +10147,8 @@ packages: engines: {node: '>= 20'} hasBin: true - marked@17.0.0: - resolution: {integrity: sha512-KkDYEWEEiYJw/KC+DVm1zzlpMQSMIu6YRltkcCvwheCp8HWPXCk9JwOmHJKBlGfzcpzcIt6x3sMnTsRm/51oDg==} + marked@17.0.1: + resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} engines: {node: '>= 20'} hasBin: true @@ -15721,8 +15716,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15787,6 +15780,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-watchdog': 47.2.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -15981,6 +15976,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16003,6 +16000,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.2.0': dependencies: @@ -26703,7 +26702,7 @@ snapshots: marked@16.4.2: {} - marked@17.0.0: {} + marked@17.0.1: {} marked@4.3.0: {} From 5037027030367617fbe1ec8da06b52f09ab2c117 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 00:20:40 +0000 Subject: [PATCH 074/697] chore(deps): update pnpm to v10.23.0 --- apps/build-docs/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 7 +------ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index 3df797a597..bcd66fb3c2 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -9,7 +9,7 @@ "keywords": [], "author": "Elian Doran ", "license": "AGPL-3.0-only", - "packageManager": "pnpm@10.22.0", + "packageManager": "pnpm@10.23.0", "devDependencies": { "@redocly/cli": "2.11.1", "archiver": "7.0.1", diff --git a/package.json b/package.json index 37bf449f43..7029de250c 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "url": "https://github.com/TriliumNext/Trilium/issues" }, "homepage": "https://triliumnotes.org", - "packageManager": "pnpm@10.22.0", + "packageManager": "pnpm@10.23.0", "pnpm": { "patchedDependencies": { "@ckeditor/ckeditor5-mention": "patches/@ckeditor__ckeditor5-mention.patch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 340a6c6768..ad90f6a0c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4752,16 +4752,11 @@ packages: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} - '@smithy/core@3.18.3': - resolution: {integrity: sha512-qqpNskkbHOSfrbFbjhYj5o8VMXO26fvN1K/+HbCzUNlTuxgNcPRouUDNm+7D6CkN244WG7aK533Ne18UtJEgAA==} - engines: {node: '>=18.0.0'} - deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md - '@smithy/core@3.18.4': resolution: {integrity: sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==} engines: {node: '>=18.0.0'} deprecated: Please upgrade your lockfile to use the latest 3.x version of @smithy/core for various fixes, see https://github.com/smithy-lang/smithy-typescript/blob/main/packages/core/CHANGELOG.md - + '@smithy/core@3.18.5': resolution: {integrity: sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==} engines: {node: '>=18.0.0'} From 43df4ae0e73a0fde3aba1715038d517de0c911ac Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 00:20:47 +0000 Subject: [PATCH 075/697] chore(deps): update actions/checkout action to v6 --- .github/actions/report-size/action.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/deploy-docs.yml | 2 +- .github/workflows/dev.yml | 6 +++--- .github/workflows/main-docker.yml | 4 ++-- .github/workflows/nightly.yml | 4 ++-- .github/workflows/playwright.yml | 2 +- .github/workflows/release.yml | 6 +++--- .github/workflows/website.yml | 2 +- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/actions/report-size/action.yml b/.github/actions/report-size/action.yml index 4be4fac5a0..f83206a696 100644 --- a/.github/actions/report-size/action.yml +++ b/.github/actions/report-size/action.yml @@ -44,7 +44,7 @@ runs: steps: # Checkout branch to compare to [required] - name: Checkout base branch - uses: actions/checkout@v5 + uses: actions/checkout@v6 with: ref: ${{ inputs.branch }} path: br-base diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index c523c2f1da..aff87f3494 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -57,7 +57,7 @@ jobs: # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 # Add any setup steps before running the `github/codeql-action/init` action. # This includes steps like installing compilers or runtimes (`actions/setup-node` diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml index 5e8fb13015..25b44a8992 100644 --- a/.github/workflows/deploy-docs.yml +++ b/.github/workflows/deploy-docs.yml @@ -42,7 +42,7 @@ jobs: steps: - name: Checkout Repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Setup pnpm uses: pnpm/action-setup@v4 diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index f9174fb428..041a31ea4a 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies @@ -46,7 +46,7 @@ jobs: needs: - test_dev steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - name: Install dependencies run: pnpm install --frozen-lockfile @@ -80,7 +80,7 @@ jobs: - dockerfile: Dockerfile steps: - name: Checkout the repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - name: Install dependencies diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml index e66e79eaf6..e85239bccd 100644 --- a/.github/workflows/main-docker.yml +++ b/.github/workflows/main-docker.yml @@ -32,7 +32,7 @@ jobs: - dockerfile: Dockerfile steps: - name: Checkout the repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - name: Set IMAGE_NAME to lowercase run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV @@ -141,7 +141,7 @@ jobs: run: echo "TEST_TAG=${TEST_TAG,,}" >> $GITHUB_ENV - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies uses: actions/setup-node@v6 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index cd30b44d0c..4ca30ba1a4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -47,7 +47,7 @@ jobs: forge_platform: win32 runs-on: ${{ matrix.os.image }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies uses: actions/setup-node@v6 @@ -109,7 +109,7 @@ jobs: runs-on: ubuntu-24.04-arm runs-on: ${{ matrix.runs-on }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Run the build uses: ./.github/actions/build-server diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 68e102a659..49258d1bef 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -33,7 +33,7 @@ jobs: TRILIUM_DATA_DIR: "${{ github.workspace }}/apps/server/spec/db" TRILIUM_INTEGRATION_TEST: memory steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: filter: tree:0 fetch-depth: 0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 37fbe8c5df..cce3629d52 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -45,7 +45,7 @@ jobs: forge_platform: linux runs-on: ${{ matrix.os.image }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies uses: actions/setup-node@v6 @@ -91,7 +91,7 @@ jobs: runs-on: ubuntu-24.04-arm runs-on: ${{ matrix.runs-on }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Run the build uses: ./.github/actions/build-server @@ -114,7 +114,7 @@ jobs: steps: - run: mkdir upload - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: sparse-checkout: | docs/Release Notes diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index 7a87cc1920..cb141375c0 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -25,7 +25,7 @@ jobs: pull-requests: write # For PR preview comments steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: pnpm/action-setup@v4 - name: Set up node & dependencies uses: actions/setup-node@v6 From 69af2ff7e8693606f0c0316cace805271ac40b07 Mon Sep 17 00:00:00 2001 From: green Date: Thu, 20 Nov 2025 15:02:12 +0100 Subject: [PATCH 076/697] Translated using Weblate (Japanese) Currently translated at 100.0% (1625 of 1625 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/ja/ --- apps/client/src/translations/ja/translation.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index c33a3f8258..20b0d786c8 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -496,7 +496,8 @@ "new-item-placeholder": "ノートのタイトルを入力...", "add-column-placeholder": "列名を入力...", "edit-note-title": "クリックしてノートのタイトルを編集", - "edit-column-title": "クリックして列のタイトルを編集" + "edit-column-title": "クリックして列のタイトルを編集", + "column-already-exists": "この列は既にボード上に存在します。" }, "code_buttons": { "execute_button_title": "スクリプトを実行", From 6ab31c67fc012597c58280beb422b498568ad902 Mon Sep 17 00:00:00 2001 From: pythaac Date: Thu, 20 Nov 2025 14:49:38 +0100 Subject: [PATCH 077/697] Translated using Weblate (Korean) Currently translated at 38.8% (59 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/ko/ --- apps/website/src/translations/ko/translation.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/website/src/translations/ko/translation.json b/apps/website/src/translations/ko/translation.json index 42c2d867d3..b662d26e86 100644 --- a/apps/website/src/translations/ko/translation.json +++ b/apps/website/src/translations/ko/translation.json @@ -28,7 +28,8 @@ "attributes_title": "노트 라벨과 관계", "attributes_description": "쉬운 분류를 위해 노트 사이의 관계를 이용하거나 라벨을 추가할 수 있습니다. 테이블이나 보드에서 사용될 수 있는 구조화된 정보를 입력하려면 승격된 속성을 사용하세요.", "hoisting_title": "작업 공간과 끌어올리기", - "hoisting_description": "작업 공간에 개인 노트와 업무 노트를 그룹화하여 쉽게 분리할 수 있으며 메모 트리가 특정 메모 세트만 표시하도록 할 수 있습니다." + "hoisting_description": "작업 공간에 개인 노트와 업무 노트를 그룹화하여 쉽게 분리할 수 있으며 메모 트리가 특정 메모 세트만 표시하도록 할 수 있습니다.", + "note_structure_title": "노트 구조" }, "productivity_benefits": { "title": "생산성과 안전성", From 54813b8b93f1150ca2b067b9058dc031b85e6809 Mon Sep 17 00:00:00 2001 From: Flowerlywind Date: Thu, 20 Nov 2025 12:20:35 +0100 Subject: [PATCH 078/697] Translated using Weblate (Vietnamese) Currently translated at 3.3% (55 of 1625 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/vi/ --- apps/client/src/translations/vi/translation.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/vi/translation.json b/apps/client/src/translations/vi/translation.json index 77f4550678..022262c9f1 100644 --- a/apps/client/src/translations/vi/translation.json +++ b/apps/client/src/translations/vi/translation.json @@ -12,7 +12,8 @@ "add_link": { "add_link": "Thêm liên kết", "button_add_link": "Thêm liên kết", - "help_on_links": "Trợ giúp về các liên kết" + "help_on_links": "Trợ giúp về các liên kết", + "link_title": "Đề mục liên kết" }, "bulk_actions": { "other": "Khác" @@ -30,7 +31,9 @@ "cancel": "Huỷ" }, "export": { - "close": "Đóng" + "close": "Đóng", + "export": "Xuất", + "choose_export_type": "Xin hãy chọn cách xuất trước" }, "help": { "other": "Khác", @@ -98,5 +101,11 @@ }, "abstract_search_option": { "remove_this_search_option": "Xoá lựa chọn tìm kiếm này" + }, + "add_relation": { + "to": "tới" + }, + "abstract_bulk_action": { + "remove_this_search_action": "Xoá hành động tìm kiếm này" } } From 11c0c93fe2a6503f7ce119987142eec07f74e1a1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 06:41:27 +0000 Subject: [PATCH 079/697] chore(deps): update vitest monorepo to v4.0.12 --- _regroup/package.json | 2 +- apps/website/package.json | 2 +- package.json | 8 +- packages/ckeditor5-admonition/package.json | 6 +- packages/ckeditor5-footnotes/package.json | 6 +- .../ckeditor5-keyboard-marker/package.json | 6 +- packages/ckeditor5-math/package.json | 6 +- packages/ckeditor5-mermaid/package.json | 6 +- pnpm-lock.yaml | 262 ++++++++++-------- 9 files changed, 161 insertions(+), 143 deletions(-) diff --git a/_regroup/package.json b/_regroup/package.json index 23d03330c7..b6a98a2902 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -40,7 +40,7 @@ "@types/express": "5.0.5", "@types/node": "24.10.1", "@types/yargs": "17.0.35", - "@vitest/coverage-v8": "4.0.10", + "@vitest/coverage-v8": "4.0.12", "eslint": "9.39.1", "eslint-plugin-simple-import-sort": "12.1.1", "esm": "3.2.25", diff --git a/apps/website/package.json b/apps/website/package.json index 47a516bc99..6f5c81858e 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -23,7 +23,7 @@ "typescript": "5.9.3", "user-agent-data-types": "0.4.2", "vite": "7.2.4", - "vitest": "4.0.10" + "vitest": "4.0.12" }, "eslintConfig": { "extends": "preact" diff --git a/package.json b/package.json index 9ce4c153b4..c69db6253f 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,9 @@ "@triliumnext/server": "workspace:*", "@types/express": "5.0.5", "@types/node": "24.10.1", - "@vitest/browser-webdriverio": "4.0.10", - "@vitest/coverage-v8": "4.0.10", - "@vitest/ui": "4.0.10", + "@vitest/browser-webdriverio": "4.0.12", + "@vitest/coverage-v8": "4.0.12", + "@vitest/ui": "4.0.12", "chalk": "5.6.2", "cross-env": "10.1.0", "dpdm": "3.14.0", @@ -68,7 +68,7 @@ "upath": "2.0.1", "vite": "7.2.4", "vite-plugin-dts": "~4.5.0", - "vitest": "4.0.10" + "vitest": "4.0.12" }, "license": "AGPL-3.0-only", "author": { diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index da24bcb3b6..0d01ce4097 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -26,8 +26,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.10", - "@vitest/coverage-istanbul": "4.0.10", + "@vitest/browser": "4.0.12", + "@vitest/coverage-istanbul": "4.0.12", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -38,7 +38,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.10", + "vitest": "4.0.12", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 5785e099fd..974da57711 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -27,8 +27,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.10", - "@vitest/coverage-istanbul": "4.0.10", + "@vitest/browser": "4.0.12", + "@vitest/coverage-istanbul": "4.0.12", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -39,7 +39,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.10", + "vitest": "4.0.12", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index 780438a451..c076f208fa 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -29,8 +29,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.10", - "@vitest/coverage-istanbul": "4.0.10", + "@vitest/browser": "4.0.12", + "@vitest/coverage-istanbul": "4.0.12", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -41,7 +41,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.10", + "vitest": "4.0.12", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index b39eaf7f86..fbd21f7d18 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -30,8 +30,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.10", - "@vitest/coverage-istanbul": "4.0.10", + "@vitest/browser": "4.0.12", + "@vitest/coverage-istanbul": "4.0.12", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -42,7 +42,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.10", + "vitest": "4.0.12", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 0467c04067..76e0e9df92 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -29,8 +29,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.10", - "@vitest/coverage-istanbul": "4.0.10", + "@vitest/browser": "4.0.12", + "@vitest/coverage-istanbul": "4.0.12", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -41,7 +41,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.10", + "vitest": "4.0.12", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b1ca7da21..d66f9bfa28 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,14 +56,14 @@ importers: specifier: 24.10.1 version: 24.10.1 '@vitest/browser-webdriverio': - specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.12 + version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': - specifier: 4.0.10 - version: 4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(@vitest/browser@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12))(vitest@4.0.12) '@vitest/ui': - specifier: 4.0.10 - version: 4.0.10(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(vitest@4.0.12) chalk: specifier: 5.6.2 version: 5.6.2 @@ -128,8 +128,8 @@ importers: specifier: ~4.5.0 version: 4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.12 + version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -839,8 +839,8 @@ importers: specifier: 7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: - specifier: 4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.12 + version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -894,11 +894,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) '@vitest/coverage-istanbul': - specifier: 4.0.10 - version: 4.0.10(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(vitest@4.0.12) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -930,8 +930,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.12 + version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -954,11 +954,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) '@vitest/coverage-istanbul': - specifier: 4.0.10 - version: 4.0.10(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(vitest@4.0.12) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -990,8 +990,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.12 + version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1014,11 +1014,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) '@vitest/coverage-istanbul': - specifier: 4.0.10 - version: 4.0.10(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(vitest@4.0.12) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1050,8 +1050,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.12 + version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1081,11 +1081,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) '@vitest/coverage-istanbul': - specifier: 4.0.10 - version: 4.0.10(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(vitest@4.0.12) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1117,8 +1117,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.12 + version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1148,11 +1148,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.10 - version: 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) '@vitest/coverage-istanbul': - specifier: 4.0.10 - version: 4.0.10(vitest@4.0.10) + specifier: 4.0.12 + version: 4.0.12(vitest@4.0.12) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1184,8 +1184,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.10 - version: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.12 + version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -5732,36 +5732,36 @@ packages: resolution: {integrity: sha512-ir6xo6HLy3TVn4lVJ+9fOOcq8vvgMmcXoSP/mM+l1CTKKJmd0hzXqNkZ1CYyz7PiRhLPUC6fprmUuA7rnVC87g==} engines: {node: '>=16'} - '@vitest/browser-webdriverio@4.0.10': - resolution: {integrity: sha512-DRaeYGu2hMwJyIaQX8TrYi71HnHWAj8glKhxct7KlZNoR/c+1v9K70Lnm2Y09ChnMFNyiHh9Xlo3DMUNhVMRTw==} + '@vitest/browser-webdriverio@4.0.12': + resolution: {integrity: sha512-Z9aiTXwI9wqocxE6pnZRoC+lypbFVfOGUYGhUnlRDQx4DGYRUgWhHwQvBGiLLAOrJdWERkrcRdp+Keu9G2VdDA==} peerDependencies: - vitest: 4.0.10 + vitest: 4.0.12 webdriverio: '*' - '@vitest/browser@4.0.10': - resolution: {integrity: sha512-irO+aGxYx/rAhjEBLsGPO4JQ8dA+A43enIST0j4xQ2kYHatHi9tUcxkRRGpClGuUVU42mi+iQsFFzd4xxpoV3g==} + '@vitest/browser@4.0.12': + resolution: {integrity: sha512-8zE2ksJ7V4B7Mc++L6rBRZOZHnE/f9URvj7oLYKIS5wcDaSi6EhfalN0EG6+R/OlTYZarbK6RqmhKDLYNC9KfQ==} peerDependencies: - vitest: 4.0.10 + vitest: 4.0.12 - '@vitest/coverage-istanbul@4.0.10': - resolution: {integrity: sha512-cLcfuLUK1dpDhpiqe/uMnk3zZDa9/6ujsn4wr29mY1PQ4uKR0eTOtOMH3gdWaMsXZFnLL4HmgA37osB/XOTBKA==} + '@vitest/coverage-istanbul@4.0.12': + resolution: {integrity: sha512-2cdoONLhTCxAxbQmjeiguupFSSyVSMKWXmPOAffUGzAnH3uPMigX5Mf2F8fUuciKo0WxM6vdSucA9K7qxRTFwA==} peerDependencies: - vitest: 4.0.10 + vitest: 4.0.12 - '@vitest/coverage-v8@4.0.10': - resolution: {integrity: sha512-g+brmtoKa/sAeIohNJnnWhnHtU6GuqqVOSQ4SxDIPcgZWZyhJs5RmF5LpqXs8Kq64lANP+vnbn5JLzhLj/G56g==} + '@vitest/coverage-v8@4.0.12': + resolution: {integrity: sha512-d+w9xAFJJz6jyJRU4BUU7MH409Ush7FWKNkxJU+jASKg6WX33YT0zc+YawMR1JesMWt9QRFQY/uAD3BTn23FaA==} peerDependencies: - '@vitest/browser': 4.0.10 - vitest: 4.0.10 + '@vitest/browser': 4.0.12 + vitest: 4.0.12 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.10': - resolution: {integrity: sha512-3QkTX/lK39FBNwARCQRSQr0TP9+ywSdxSX+LgbJ2M1WmveXP72anTbnp2yl5fH+dU6SUmBzNMrDHs80G8G2DZg==} + '@vitest/expect@4.0.12': + resolution: {integrity: sha512-is+g0w8V3/ZhRNrRizrJNr8PFQKwYmctWlU4qg8zy5r9aIV5w8IxXLlfbbxJCwSpsVl2PXPTm2/zruqTqz3QSg==} - '@vitest/mocker@4.0.10': - resolution: {integrity: sha512-e2OfdexYkjkg8Hh3L9NVEfbwGXq5IZbDovkf30qW2tOh7Rh9sVtmSr2ztEXOFbymNxS4qjzLXUQIvATvN4B+lg==} + '@vitest/mocker@4.0.12': + resolution: {integrity: sha512-GsmA/tD5Ht3RUFoz41mZsMU1AXch3lhmgbTnoSPTdH231g7S3ytNN1aU0bZDSyxWs8WA7KDyMPD5L4q6V6vj9w==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -5771,25 +5771,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.10': - resolution: {integrity: sha512-99EQbpa/zuDnvVjthwz5bH9o8iPefoQZ63WV8+bsRJZNw3qQSvSltfut8yu1Jc9mqOYi7pEbsKxYTi/rjaq6PA==} + '@vitest/pretty-format@4.0.12': + resolution: {integrity: sha512-R7nMAcnienG17MvRN8TPMJiCG8rrZJblV9mhT7oMFdBXvS0x+QD6S1G4DxFusR2E0QIS73f7DqSR1n87rrmE+g==} - '@vitest/runner@4.0.10': - resolution: {integrity: sha512-EXU2iSkKvNwtlL8L8doCpkyclw0mc/t4t9SeOnfOFPyqLmQwuceMPA4zJBa6jw0MKsZYbw7kAn+gl7HxrlB8UQ==} + '@vitest/runner@4.0.12': + resolution: {integrity: sha512-hDlCIJWuwlcLumfukPsNfPDOJokTv79hnOlf11V+n7E14rHNPz0Sp/BO6h8sh9qw4/UjZiKyYpVxK2ZNi+3ceQ==} - '@vitest/snapshot@4.0.10': - resolution: {integrity: sha512-2N4X2ZZl7kZw0qeGdQ41H0KND96L3qX1RgwuCfy6oUsF2ISGD/HpSbmms+CkIOsQmg2kulwfhJ4CI0asnZlvkg==} + '@vitest/snapshot@4.0.12': + resolution: {integrity: sha512-2jz9zAuBDUSbnfyixnyOd1S2YDBrZO23rt1bicAb6MA/ya5rHdKFRikPIDpBj/Dwvh6cbImDmudegnDAkHvmRQ==} - '@vitest/spy@4.0.10': - resolution: {integrity: sha512-AsY6sVS8OLb96GV5RoG8B6I35GAbNrC49AO+jNRF9YVGb/g9t+hzNm1H6kD0NDp8tt7VJLs6hb7YMkDXqu03iw==} + '@vitest/spy@4.0.12': + resolution: {integrity: sha512-GZjI9PPhiOYNX8Nsyqdw7JQB+u0BptL5fSnXiottAUBHlcMzgADV58A7SLTXXQwcN1yZ6gfd1DH+2bqjuUlCzw==} - '@vitest/ui@4.0.10': - resolution: {integrity: sha512-oWtNM89Np+YsQO3ttT5i1Aer/0xbzQzp66NzuJn/U16bB7MnvSzdLKXgk1kkMLYyKSSzA2ajzqMkYheaE9opuQ==} + '@vitest/ui@4.0.12': + resolution: {integrity: sha512-RCqeApCnbwd5IFvxk6OeKMXTvzHU/cVqY8HAW0gWk0yAO6wXwQJMKhDfDtk2ss7JCy9u7RNC3kyazwiaDhBA/g==} peerDependencies: - vitest: 4.0.10 + vitest: 4.0.12 - '@vitest/utils@4.0.10': - resolution: {integrity: sha512-kOuqWnEwZNtQxMKg3WmPK1vmhZu9WcoX69iwWjVz+jvKTsF1emzsv3eoPcDr6ykA3qP2bsCQE7CwqfNtAVzsmg==} + '@vitest/utils@4.0.12': + resolution: {integrity: sha512-DVS/TLkLdvGvj1avRy0LSmKfrcI9MNFvNGN6ECjTUHWJdlcgPDOXhjMis5Dh7rBH62nAmSXnkPbE+DZ5YD75Rw==} '@volar/language-core@2.4.13': resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} @@ -14363,23 +14363,26 @@ packages: yaml: optional: true - vitest@4.0.10: - resolution: {integrity: sha512-2Fqty3MM9CDwOVet/jaQalYlbcjATZwPYGcqpiYQqgQ/dLC7GuHdISKgTYIVF/kaishKxLzleKWWfbSDklyIKg==} + vitest@4.0.12: + resolution: {integrity: sha512-pmW4GCKQ8t5Ko1jYjC3SqOr7TUKN7uHOHB/XGsAIb69eYu6d1ionGSsb5H9chmPf+WeXt0VE7jTXsB1IvWoNbw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.10 - '@vitest/browser-preview': 4.0.10 - '@vitest/browser-webdriverio': 4.0.10 - '@vitest/ui': 4.0.10 + '@vitest/browser-playwright': 4.0.12 + '@vitest/browser-preview': 4.0.12 + '@vitest/browser-webdriverio': 4.0.12 + '@vitest/ui': 4.0.12 happy-dom: '*' jsdom: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@opentelemetry/api': + optional: true '@types/debug': optional: true '@types/node': @@ -15412,7 +15415,7 @@ snapshots: '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/parser@7.28.4': dependencies: @@ -15462,9 +15465,9 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.3(supports-color@6.0.0) globals: 11.12.0 transitivePeerDependencies: @@ -15475,9 +15478,9 @@ snapshots: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.3(supports-color@6.0.0) transitivePeerDependencies: - supports-color @@ -15716,6 +15719,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15949,6 +15954,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.2.0': dependencies: @@ -15958,6 +15965,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.2.0': dependencies: @@ -16027,6 +16036,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-engine': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-essentials@47.2.0': dependencies: @@ -16158,6 +16169,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-widget': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-embed@47.2.0': dependencies: @@ -16486,6 +16499,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.2.0': dependencies: @@ -16572,6 +16587,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-special-characters@47.2.0': dependencies: @@ -21059,10 +21076,10 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/browser': 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) + vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21070,16 +21087,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)': + '@vitest/browser@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)': dependencies: - '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/utils': 4.0.10 + '@vitest/mocker': 4.0.12(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/utils': 4.0.12 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21087,7 +21104,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-istanbul@4.0.10(vitest@4.0.10)': + '@vitest/coverage-istanbul@4.0.12(vitest@4.0.12)': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.3(supports-color@6.0.0) @@ -21098,14 +21115,14 @@ snapshots: istanbul-reports: 3.2.0 magicast: 0.5.1 tinyrainbow: 3.0.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.10(@vitest/browser@4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10))(vitest@4.0.10)': + '@vitest/coverage-v8@4.0.12(@vitest/browser@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12))(vitest@4.0.12)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.10 + '@vitest/utils': 4.0.12 ast-v8-to-istanbul: 0.3.8 debug: 4.4.3(supports-color@6.0.0) istanbul-lib-coverage: 3.2.2 @@ -21115,61 +21132,61 @@ snapshots: magicast: 0.5.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10) + '@vitest/browser': 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.10': + '@vitest/expect@4.0.12': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 4.0.10 - '@vitest/utils': 4.0.10 + '@vitest/spy': 4.0.12 + '@vitest/utils': 4.0.12 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.12(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.10 + '@vitest/spy': 4.0.12 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.5(@types/node@24.10.1)(typescript@5.9.3) vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/pretty-format@4.0.10': + '@vitest/pretty-format@4.0.12': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.10': + '@vitest/runner@4.0.12': dependencies: - '@vitest/utils': 4.0.10 + '@vitest/utils': 4.0.12 pathe: 2.0.3 - '@vitest/snapshot@4.0.10': + '@vitest/snapshot@4.0.12': dependencies: - '@vitest/pretty-format': 4.0.10 + '@vitest/pretty-format': 4.0.12 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.10': {} + '@vitest/spy@4.0.12': {} - '@vitest/ui@4.0.10(vitest@4.0.10)': + '@vitest/ui@4.0.12(vitest@4.0.12)': dependencies: - '@vitest/utils': 4.0.10 + '@vitest/utils': 4.0.12 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/utils@4.0.10': + '@vitest/utils@4.0.12': dependencies: - '@vitest/pretty-format': 4.0.10 + '@vitest/pretty-format': 4.0.12 tinyrainbow: 3.0.3 '@volar/language-core@2.4.13': @@ -21188,7 +21205,7 @@ snapshots: '@vue/compiler-core@3.5.14': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@vue/shared': 3.5.14 entities: 4.5.0 estree-walker: 2.0.2 @@ -25865,7 +25882,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.3 @@ -31688,15 +31705,15 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@4.0.10(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.10)(@vitest/ui@4.0.10)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.10 - '@vitest/mocker': 4.0.10(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.10 - '@vitest/runner': 4.0.10 - '@vitest/snapshot': 4.0.10 - '@vitest/spy': 4.0.10 - '@vitest/utils': 4.0.10 + '@vitest/expect': 4.0.12 + '@vitest/mocker': 4.0.12(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.12 + '@vitest/runner': 4.0.12 + '@vitest/snapshot': 4.0.12 + '@vitest/spy': 4.0.12 + '@vitest/utils': 4.0.12 debug: 4.4.3(supports-color@6.0.0) es-module-lexer: 1.7.0 expect-type: 1.2.2 @@ -31711,10 +31728,11 @@ snapshots: vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: + '@opentelemetry/api': 1.9.0 '@types/debug': 4.1.12 '@types/node': 24.10.1 - '@vitest/browser-webdriverio': 4.0.10(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.10)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) - '@vitest/ui': 4.0.10(vitest@4.0.10) + '@vitest/browser-webdriverio': 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/ui': 4.0.12(vitest@4.0.12) happy-dom: 20.0.10 jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: From d98a644b75a93f285f46e2da7034e7cddd4ff734 Mon Sep 17 00:00:00 2001 From: SiriusXT <1160925501@qq.com> Date: Fri, 21 Nov 2025 14:44:09 +0800 Subject: [PATCH 080/697] chore(css): fix overly narrow empty tab layout on mobile --- apps/client/src/stylesheets/style.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index eae9423441..857c0935b0 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1582,6 +1582,14 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { width: 100%; } + .note-split.empty-note { + --max-content-width: var(--preferred-max-content-width); + } + + .note-detail-empty { + margin: 15px; + } + #mobile-sidebar-container.show #mobile-sidebar-wrapper { transform: translateX(0); } From 6ca941e8e96d3a8f48312d3710ce3523e4288f7e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 12:06:32 +0200 Subject: [PATCH 081/697] chore(print): basic infrastructure to support reporting progress --- apps/client/src/print.tsx | 9 +++++++-- apps/client/src/widgets/NoteDetail.tsx | 4 ++++ apps/client/src/widgets/collections/NoteList.tsx | 7 +++++-- apps/client/src/widgets/collections/interface.ts | 1 + .../src/widgets/collections/legacy/ListPrintView.tsx | 6 +++++- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/apps/client/src/print.tsx b/apps/client/src/print.tsx index a9dec12c46..075b566e6e 100644 --- a/apps/client/src/print.tsx +++ b/apps/client/src/print.tsx @@ -7,6 +7,7 @@ import content_renderer, { applyInlineMermaid } from "./services/content_rendere interface RendererProps { note: FNote; onReady: () => void; + onProgressChanged?: (progress: number) => void; } async function main() { @@ -23,13 +24,16 @@ async function main() { function App({ note, noteId }: { note: FNote | null | undefined, noteId: string }) { const sentReadyEvent = useRef(false); + const onProgressChanged = useCallback((progress: number) => { + window.dispatchEvent(new CustomEvent("note-load-progress", { detail: { progress } })); + }, []); const onReady = useCallback(() => { if (sentReadyEvent.current) return; window.dispatchEvent(new Event("note-ready")); window._noteReady = true; sentReadyEvent.current = true; }, []); - const props: RendererProps | undefined | null = note && { note, onReady }; + const props: RendererProps | undefined | null = note && { note, onReady, onProgressChanged }; if (!note || !props) return @@ -89,7 +93,7 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) { ; } -function CollectionRenderer({ note, onReady }: RendererProps) { +function CollectionRenderer({ note, onReady, onProgressChanged }: RendererProps) { const viewType = useNoteViewType(note); return ; } diff --git a/apps/client/src/widgets/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 0482d0ddb3..5d5e5b02a7 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -162,6 +162,10 @@ export default function NoteDetail() { return; } + iframe.contentWindow.addEventListener("note-load-progress", (e) => { + console.log("Got ", e); + }); + iframe.contentWindow.addEventListener("note-ready", () => { toast.closePersistent("printing"); iframe.contentWindow?.print(); diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index 04c03b0e8a..c613f8d394 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -26,9 +26,10 @@ interface NoteListProps { media: ViewModeMedia; viewType: ViewTypeOptions | undefined; onReady?: () => void; + onProgressChanged?(progress: number): void; } -export default function NoteList(props: Pick) { +export default function NoteList(props: Pick) { const { note, noteContext, notePath, ntxId } = useNoteContext(); const viewType = useNoteViewType(note); const [ enabled, setEnabled ] = useState(noteContext?.hasNoteList()); @@ -43,7 +44,7 @@ export function SearchNoteList(props: Omit } -export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId, onReady, ...restProps }: NoteListProps) { +export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePath, highlightedTokens, displayOnlyCollections, ntxId, onReady, onProgressChanged, ...restProps }: NoteListProps) { const widgetRef = useRef(null); const noteIds = useNoteIds(shouldEnable ? note : null, viewType, ntxId); const isFullHeight = (viewType && viewType !== "list" && viewType !== "grid"); @@ -86,6 +87,8 @@ export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePa viewConfig: viewModeConfig.config, saveConfig: viewModeConfig.storeFn, onReady: onReady ?? (() => {}), + onProgressChanged: onProgressChanged ?? (() => {}), + ...restProps } } diff --git a/apps/client/src/widgets/collections/interface.ts b/apps/client/src/widgets/collections/interface.ts index 7bec23a64d..bd80b4afd6 100644 --- a/apps/client/src/widgets/collections/interface.ts +++ b/apps/client/src/widgets/collections/interface.ts @@ -17,4 +17,5 @@ export interface ViewModeProps { saveConfig(newConfig: T): void; media: ViewModeMedia; onReady(): void; + onProgressChanged?(progress: number): void; } diff --git a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx index 77a354d0db..3fc1be0b45 100644 --- a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx @@ -10,7 +10,7 @@ interface NotesWithContent { contentEl: HTMLElement; } -export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: ViewModeProps<{}>) { +export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady, onProgressChanged }: ViewModeProps<{}>) { const noteIds = useFilteredNoteIds(note, unfilteredNoteIds); const [ notesWithContent, setNotesWithContent ] = useState(); @@ -33,6 +33,10 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady }: Vie noteIdsSet.add(note.noteId); notesWithContent.push({ note, contentEl }); + if (onProgressChanged) { + onProgressChanged((notesWithContent.length / noteIds.length) * 100); + } + if (note.hasChildren()) { const filteredChildNotes = await filterChildNotes(note); for (const childNote of filteredChildNotes) { From 586c707e5171ba4edca92674b28eec9f159ac456 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 12:24:01 +0200 Subject: [PATCH 082/697] feat(print): display progress in toast --- apps/client/src/services/toast.ts | 27 +++++++++++-------- apps/client/src/stylesheets/style.css | 11 ++++++++ apps/client/src/widgets/NoteDetail.tsx | 17 +++++++----- .../collections/legacy/ListPrintView.tsx | 3 ++- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/apps/client/src/services/toast.ts b/apps/client/src/services/toast.ts index 5325a06bca..5b834de203 100644 --- a/apps/client/src/services/toast.ts +++ b/apps/client/src/services/toast.ts @@ -8,46 +8,50 @@ export interface ToastOptions { delay?: number; autohide?: boolean; closeAfter?: number; + progress?: number; } -function toast(options: ToastOptions) { - const $toast = $(options.title +function toast({ title, icon, message, id, delay, autohide, progress }: ToastOptions) { + const $toast = $(title ? `\ ` : ` ` ); - $toast.toggleClass("no-title", !options.title); - $toast.find(".toast-title").text(options.title ?? ""); - $toast.find(".toast-body").html(options.message); + $toast.toggleClass("no-title", !title); + $toast.find(".toast-title").text(title ?? ""); + $toast.find(".toast-body").html(message); + $toast.find(".toast-progress").css("width", `${(progress ?? 0) * 100}%`); - if (options.id) { - $toast.attr("id", `toast-${options.id}`); + if (id) { + $toast.attr("id", `toast-${id}`); } $("#toast-container").append($toast); $toast.toast({ - delay: options.delay || 3000, - autohide: !!options.autohide + delay: delay || 3000, + autohide: !!autohide }); $toast.on("hidden.bs.toast", (e) => e.target.remove()); @@ -62,6 +66,7 @@ function showPersistent(options: ToastOptions) { if ($toast.length > 0) { $toast.find(".toast-body").html(options.message); + $toast.find(".toast-progress").css("width", `${(options.progress ?? 0) * 100}%`); } else { options.autohide = false; diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 7b95d13dfe..b222892734 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -1137,6 +1137,7 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href --bs-toast-color: var(--main-text-color); z-index: 9999999999 !important; pointer-events: all; + overflow: hidden; } .toast-header { @@ -1169,6 +1170,16 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href background-color: unset !important; } +.toast .toast-progress { + position: absolute; + bottom: 0; + inset-inline-start: 0; + inset-inline-end: 0; + background-color: var(--toast-text-color) !important; + height: 4px; + transition: width 0.1s linear; +} + .ck-mentions .ck-button { font-size: var(--detail-font-size) !important; padding: 5px; diff --git a/apps/client/src/widgets/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 5d5e5b02a7..943322f9e5 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -139,11 +139,7 @@ export default function NoteDetail() { useTriliumEvent("printActiveNote", () => { if (!noteContext?.isActive() || !note) return; - toast.showPersistent({ - icon: "bx bx-loader-circle bx-spin", - message: t("note_detail.printing"), - id: "printing" - }); + showToast("printing"); if (isElectron()) { const { ipcRenderer } = dynamicRequire("electron"); @@ -163,7 +159,7 @@ export default function NoteDetail() { } iframe.contentWindow.addEventListener("note-load-progress", (e) => { - console.log("Got ", e); + showToast("printing", e.detail.progress); }); iframe.contentWindow.addEventListener("note-ready", () => { @@ -326,3 +322,12 @@ function checkFullHeight(noteContext: NoteContext | undefined, type: ExtendedNot || noteContext?.viewScope?.viewMode === "attachments" || isBackendNote; } + +function showToast(type: "printing" | "exporting_pdf", progress: number = 0) { + toast.showPersistent({ + icon: "bx bx-loader-circle bx-spin", + message: t("note_detail.printing"), + id: "printing", + progress + }); +} diff --git a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx index 3fc1be0b45..07e140b175 100644 --- a/apps/client/src/widgets/collections/legacy/ListPrintView.tsx +++ b/apps/client/src/widgets/collections/legacy/ListPrintView.tsx @@ -18,6 +18,7 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady, onPro const noteIdsSet = new Set(); froca.getNotes(noteIds).then(async (notes) => { + const noteIdsWithChildren = await note.getSubtreeNoteIds(true); const notesWithContent: NotesWithContent[] = []; async function processNote(note: FNote, depth: number) { @@ -34,7 +35,7 @@ export function ListPrintView({ note, noteIds: unfilteredNoteIds, onReady, onPro notesWithContent.push({ note, contentEl }); if (onProgressChanged) { - onProgressChanged((notesWithContent.length / noteIds.length) * 100); + onProgressChanged(notesWithContent.length / noteIdsWithChildren.length); } if (note.hasChildren()) { From 1a6e653600551a442c411a026d9b1b8a1ff67ee3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 19:57:13 +0200 Subject: [PATCH 083/697] feat(print): support progress report on electron --- apps/client/src/print.tsx | 8 +++++++- apps/client/src/widgets/NoteDetail.tsx | 14 ++++++++++---- apps/server/src/services/window.ts | 9 ++++++--- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/client/src/print.tsx b/apps/client/src/print.tsx index 075b566e6e..ffef86044b 100644 --- a/apps/client/src/print.tsx +++ b/apps/client/src/print.tsx @@ -3,6 +3,7 @@ import { render } from "preact"; import { CustomNoteList, useNoteViewType } from "./widgets/collections/NoteList"; import { useCallback, useLayoutEffect, useRef } from "preact/hooks"; import content_renderer, { applyInlineMermaid } from "./services/content_renderer"; +import { dynamicRequire, isElectron } from "./services/utils"; interface RendererProps { note: FNote; @@ -25,7 +26,12 @@ async function main() { function App({ note, noteId }: { note: FNote | null | undefined, noteId: string }) { const sentReadyEvent = useRef(false); const onProgressChanged = useCallback((progress: number) => { - window.dispatchEvent(new CustomEvent("note-load-progress", { detail: { progress } })); + if (isElectron()) { + const { ipcRenderer } = dynamicRequire('electron'); + ipcRenderer.send("print-progress", progress); + } else { + window.dispatchEvent(new CustomEvent("note-load-progress", { detail: { progress } })); + } }, []); const onReady = useCallback(() => { if (sentReadyEvent.current) return; diff --git a/apps/client/src/widgets/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 943322f9e5..406354eeed 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -113,11 +113,17 @@ export default function NoteDetail() { useEffect(() => { if (!isElectron()) return; const { ipcRenderer } = dynamicRequire("electron"); - const listener = () => { - toast.closePersistent("printing"); + const onPrintProgress = (_e: any, progress: number) => { + console.log("Got print progress:", progress); + showToast("printing", progress); + }; + const onPrintDone = () => toast.closePersistent("printing"); + ipcRenderer.on("print-progress", onPrintProgress); + ipcRenderer.on("print-done", onPrintDone); + return () => { + ipcRenderer.off("print-progress", onPrintProgress); + ipcRenderer.off("print-done", onPrintDone); }; - ipcRenderer.on("print-done", listener); - return () => ipcRenderer.off("print-done", listener); }, []); useTriliumEvent("executeInActiveNoteDetailWidget", ({ callback }) => { diff --git a/apps/server/src/services/window.ts b/apps/server/src/services/window.ts index c2fab2ac3d..8f2d26f470 100644 --- a/apps/server/src/services/window.ts +++ b/apps/server/src/services/window.ts @@ -7,13 +7,11 @@ import log from "./log.js"; import sqlInit from "./sql_init.js"; import cls from "./cls.js"; import keyboardActionsService from "./keyboard_actions.js"; -import electron from "electron"; +import electron, { ipcMain } from "electron"; import type { App, BrowserWindowConstructorOptions, BrowserWindow, WebContents, IpcMainEvent } from "electron"; import { formatDownloadTitle, isDev, isMac, isWindows } from "./utils.js"; import { t } from "i18next"; import { RESOURCE_DIR } from "./resource_dir.js"; -import { PerformanceObserverEntryList } from "perf_hooks"; -import options from "./options.js"; // Prevent the window being garbage collected let mainWindow: BrowserWindow | null; @@ -155,6 +153,10 @@ async function getBrowserWindowForPrinting(e: IpcMainEvent, notePath: string) { session: e.sender.session }, }); + + const progressCallback = (_e, progress: number) => e.sender.send("print-progress", progress); + ipcMain.on("print-progress", progressCallback); + await browserWindow.loadURL(`http://127.0.0.1:${port}/?print#${notePath}`); await browserWindow.webContents.executeJavaScript(` new Promise(resolve => { @@ -162,6 +164,7 @@ async function getBrowserWindowForPrinting(e: IpcMainEvent, notePath: string) { window.addEventListener("note-ready", () => resolve()); }); `); + ipcMain.off("print-progress", progressCallback); return browserWindow; } From 6023d535069fb0bdc25fcd809f72212f88ec2d4a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 20:05:43 +0200 Subject: [PATCH 084/697] feat(print): report progress on export to PDF as well --- apps/client/src/widgets/NoteDetail.tsx | 13 +++---------- apps/server/src/services/window.ts | 8 ++++---- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/apps/client/src/widgets/NoteDetail.tsx b/apps/client/src/widgets/NoteDetail.tsx index 406354eeed..5b5838584c 100644 --- a/apps/client/src/widgets/NoteDetail.tsx +++ b/apps/client/src/widgets/NoteDetail.tsx @@ -113,10 +113,7 @@ export default function NoteDetail() { useEffect(() => { if (!isElectron()) return; const { ipcRenderer } = dynamicRequire("electron"); - const onPrintProgress = (_e: any, progress: number) => { - console.log("Got print progress:", progress); - showToast("printing", progress); - }; + const onPrintProgress = (_e: any, { progress, action }: { progress: number, action: "printing" | "exporting_pdf" }) => showToast(action, progress); const onPrintDone = () => toast.closePersistent("printing"); ipcRenderer.on("print-progress", onPrintProgress); ipcRenderer.on("print-done", onPrintDone); @@ -179,11 +176,7 @@ export default function NoteDetail() { useTriliumEvent("exportAsPdf", () => { if (!noteContext?.isActive() || !note) return; - toast.showPersistent({ - icon: "bx bx-loader-circle bx-spin", - message: t("note_detail.printing_pdf"), - id: "printing" - }); + showToast("exporting_pdf"); const { ipcRenderer } = dynamicRequire("electron"); ipcRenderer.send("export-as-pdf", { @@ -332,7 +325,7 @@ function checkFullHeight(noteContext: NoteContext | undefined, type: ExtendedNot function showToast(type: "printing" | "exporting_pdf", progress: number = 0) { toast.showPersistent({ icon: "bx bx-loader-circle bx-spin", - message: t("note_detail.printing"), + message: type === "printing" ? t("note_detail.printing") : t("note_detail.printing_pdf"), id: "printing", progress }); diff --git a/apps/server/src/services/window.ts b/apps/server/src/services/window.ts index 8f2d26f470..626ab851f0 100644 --- a/apps/server/src/services/window.ts +++ b/apps/server/src/services/window.ts @@ -80,7 +80,7 @@ interface ExportAsPdfOpts { } electron.ipcMain.on("print-note", async (e, { notePath }: PrintOpts) => { - const browserWindow = await getBrowserWindowForPrinting(e, notePath); + const browserWindow = await getBrowserWindowForPrinting(e, notePath, "printing"); browserWindow.webContents.print({}, (success, failureReason) => { if (!success) { electron.dialog.showErrorBox(t("pdf.unable-to-print"), failureReason); @@ -91,7 +91,7 @@ electron.ipcMain.on("print-note", async (e, { notePath }: PrintOpts) => { }); electron.ipcMain.on("export-as-pdf", async (e, { title, notePath, landscape, pageSize }: ExportAsPdfOpts) => { - const browserWindow = await getBrowserWindowForPrinting(e, notePath); + const browserWindow = await getBrowserWindowForPrinting(e, notePath, "exporting_pdf"); async function print() { const filePath = electron.dialog.showSaveDialogSync(browserWindow, { @@ -143,7 +143,7 @@ electron.ipcMain.on("export-as-pdf", async (e, { title, notePath, landscape, pag } }); -async function getBrowserWindowForPrinting(e: IpcMainEvent, notePath: string) { +async function getBrowserWindowForPrinting(e: IpcMainEvent, notePath: string, action: "printing" | "exporting_pdf") { const browserWindow = new electron.BrowserWindow({ show: false, webPreferences: { @@ -154,7 +154,7 @@ async function getBrowserWindowForPrinting(e: IpcMainEvent, notePath: string) { }, }); - const progressCallback = (_e, progress: number) => e.sender.send("print-progress", progress); + const progressCallback = (_e, progress: number) => e.sender.send("print-progress", { progress, action }); ipcMain.on("print-progress", progressCallback); await browserWindow.loadURL(`http://127.0.0.1:${port}/?print#${notePath}`); From 39be26896982e25f695b0985558def2e989fb8f4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 20:14:44 +0200 Subject: [PATCH 085/697] chore(client/print): fix types --- apps/client/src/types.d.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/client/src/types.d.ts b/apps/client/src/types.d.ts index c386a67f0b..7128ea5d80 100644 --- a/apps/client/src/types.d.ts +++ b/apps/client/src/types.d.ts @@ -64,6 +64,11 @@ declare global { EXCALIDRAW_ASSET_PATH?: string; } + interface WindowEventMap { + "note-ready": Event; + "note-load-progress": CustomEvent<{ progress: number }>; + } + interface AutoCompleteConfig { appendTo?: HTMLElement | null; hint?: boolean; From 097808752d78c2bde1bb27d5b0fc91e619f4301c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 20:15:27 +0200 Subject: [PATCH 086/697] feat(client/print): report progress for presentation printing --- .../src/widgets/collections/interface.ts | 4 +++- .../collections/presentation/index.tsx | 4 ++-- .../widgets/collections/presentation/model.ts | 23 +++++++++++++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/apps/client/src/widgets/collections/interface.ts b/apps/client/src/widgets/collections/interface.ts index bd80b4afd6..1185992604 100644 --- a/apps/client/src/widgets/collections/interface.ts +++ b/apps/client/src/widgets/collections/interface.ts @@ -5,6 +5,8 @@ export type ViewTypeOptions = typeof allViewTypes[number]; export type ViewModeMedia = "screen" | "print"; +export type ProgressChangedFn = (progress: number) => void; + export interface ViewModeProps { note: FNote; notePath: string; @@ -17,5 +19,5 @@ export interface ViewModeProps { saveConfig(newConfig: T): void; media: ViewModeMedia; onReady(): void; - onProgressChanged?(progress: number): void; + onProgressChanged?: ProgressChangedFn; } diff --git a/apps/client/src/widgets/collections/presentation/index.tsx b/apps/client/src/widgets/collections/presentation/index.tsx index ca236a46ce..0a3d36f65d 100644 --- a/apps/client/src/widgets/collections/presentation/index.tsx +++ b/apps/client/src/widgets/collections/presentation/index.tsx @@ -14,14 +14,14 @@ import { t } from "../../../services/i18n"; import { DEFAULT_THEME, loadPresentationTheme } from "./themes"; import FNote from "../../../entities/fnote"; -export default function PresentationView({ note, noteIds, media, onReady }: ViewModeProps<{}>) { +export default function PresentationView({ note, noteIds, media, onReady, onProgressChanged }: ViewModeProps<{}>) { const [ presentation, setPresentation ] = useState(); const containerRef = useRef(null); const [ api, setApi ] = useState(); const stylesheets = usePresentationStylesheets(note, media); function refresh() { - buildPresentationModel(note).then(setPresentation); + buildPresentationModel(note, onProgressChanged).then(setPresentation); } useTriliumEvent("entitiesReloaded", ({ loadResults }) => { diff --git a/apps/client/src/widgets/collections/presentation/model.ts b/apps/client/src/widgets/collections/presentation/model.ts index 92b7ffe763..f1c6cef779 100644 --- a/apps/client/src/widgets/collections/presentation/model.ts +++ b/apps/client/src/widgets/collections/presentation/model.ts @@ -1,6 +1,7 @@ import { NoteType } from "@triliumnext/commons"; import FNote from "../../../entities/fnote"; import contentRenderer from "../../../services/content_renderer"; +import { ProgressChangedFn } from "../interface"; type DangerouslySetInnerHTML = { __html: string; }; @@ -22,14 +23,26 @@ export interface PresentationModel { slides: PresentationSlideModel[]; } -export async function buildPresentationModel(note: FNote): Promise { +export async function buildPresentationModel(note: FNote, onProgressChanged?: ProgressChangedFn): Promise { const slideNotes = await note.getChildNotes(); - const slides: PresentationSlideModel[] = await Promise.all(slideNotes.map(async slideNote => ({ - ...(await buildSlideModel(slideNote)), - verticalSlides: note.type !== "search" ? await buildVerticalSlides(slideNote) : undefined - }))); + onProgressChanged?.(0.3); + const total = slideNotes.length; + let completed = 0; + const slidePromises = slideNotes.map(slideNote => (async () => { + const base = await buildSlideModel(slideNote); + const verticalSlides = note.type !== "search" ? await buildVerticalSlides(slideNote) : undefined; + const slide: PresentationSlideModel = { ...base, verticalSlides }; + completed++; + onProgressChanged?.(Math.min(0.3 + (completed / total) * 0.4, 0.7)); + return slide; + })()); + + const slides: PresentationSlideModel[] = await Promise.all(slidePromises); + + onProgressChanged?.(0.7); postProcessSlides(slides); + onProgressChanged?.(1); return { slides }; } From 5b708e77aa4e0c4809b59e61b7ac6ca68d2f9858 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 20:20:52 +0200 Subject: [PATCH 087/697] fix(client/text): wrong strike-through of nested TODOs --- 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 71c681ac12..9ef1c5e2da 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2461,7 +2461,7 @@ footer.webview-footer button { transition: opacity 200ms ease; } -.ck-content ul.todo-list li:has(input[type="checkbox"]:checked) span.todo-list__label__description { +.ck-content ul.todo-list li:has(> span.todo-list__label input[type="checkbox"]:checked) > span.todo-list__label span.todo-list__label__description { text-decoration: line-through; opacity: 0.6; } From 4552b2b1587bfc62a618bf3cd961a51c8b56fc33 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 20:50:06 +0200 Subject: [PATCH 088/697] fix(geomap): marker color not respected --- apps/client/src/widgets/collections/geomap/index.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/collections/geomap/index.css b/apps/client/src/widgets/collections/geomap/index.css index 9fc5dee636..81039ba484 100644 --- a/apps/client/src/widgets/collections/geomap/index.css +++ b/apps/client/src/widgets/collections/geomap/index.css @@ -45,7 +45,7 @@ top: 3px; inset-inline-start: 2px; background-color: white; - color: black; + color: var(--light-theme-custom-color, black); padding: 2px; border-radius: 50%; font-size: 17px; @@ -79,4 +79,4 @@ body[dir=rtl] .geo-map-container .leaflet-div-icon .title-label { .geo-map-container.dark .leaflet-div-icon .title-label { color: white; text-shadow: -1px -1px 0 black, 1px -1px 0 black, -1px 1px 0 black, 1px 1px 0 black; -} \ No newline at end of file +} From 6f83b932b0d0890d44d008416d9ef6fe0768f7cd Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 21:28:31 +0200 Subject: [PATCH 089/697] feat(print/table): basic implementation using export module --- .../src/widgets/collections/NoteList.tsx | 9 ++- .../collections/table/TablePrintView.tsx | 38 +++++++++ .../src/widgets/collections/table/data.tsx | 77 ++++++++++++++++++ .../src/widgets/collections/table/index.tsx | 79 ++----------------- .../widgets/collections/table/tabulator.tsx | 4 +- 5 files changed, 130 insertions(+), 77 deletions(-) create mode 100644 apps/client/src/widgets/collections/table/TablePrintView.tsx create mode 100644 apps/client/src/widgets/collections/table/data.tsx diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index c613f8d394..bd007a40fd 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -14,6 +14,7 @@ import { WebSocketMessage } from "@triliumnext/commons"; import froca from "../../services/froca"; import PresentationView from "./presentation"; import { ListPrintView } from "./legacy/ListPrintView"; +import TablePrintView from "./table/TablePrintView"; interface NoteListProps { note: FNote | null | undefined; @@ -117,9 +118,13 @@ function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps< case "geoMap": return ; case "calendar": - return + return ; case "table": - return + if (props.media !== "print") { + return ; + } else { + return ; + } case "board": return case "presentation": diff --git a/apps/client/src/widgets/collections/table/TablePrintView.tsx b/apps/client/src/widgets/collections/table/TablePrintView.tsx new file mode 100644 index 0000000000..a7e36dfb31 --- /dev/null +++ b/apps/client/src/widgets/collections/table/TablePrintView.tsx @@ -0,0 +1,38 @@ +import { useRef, useState } from "preact/hooks"; +import { ViewModeProps } from "../interface"; +import useData, { TableConfig } from "./data"; +import { ExportModule, PrintModule, Tabulator as VanillaTabulator} from 'tabulator-tables'; +import Tabulator from "./tabulator"; +import { RawHtmlBlock } from "../../react/RawHtml"; + +export default function TablePrintView({ note, noteIds, viewConfig }: ViewModeProps) { + const tabulatorRef = useRef(null); + const { columnDefs, rowData, movableRows, hasChildren } = useData(note, noteIds, viewConfig, undefined, () => {}); + const [ html, setHtml ] = useState(); + + return rowData && ( +
        + {!html ? ( + { + const tabulator = tabulatorRef.current; + if (!tabulator) return; + setHtml(tabulator.getHtml()); + }} + /> + ) : ( + + )} +
        + + ) +} diff --git a/apps/client/src/widgets/collections/table/data.tsx b/apps/client/src/widgets/collections/table/data.tsx new file mode 100644 index 0000000000..b77a1545ed --- /dev/null +++ b/apps/client/src/widgets/collections/table/data.tsx @@ -0,0 +1,77 @@ +import type { ColumnDefinition } from "tabulator-tables"; +import FNote from "../../../entities/fnote"; +import { useNoteLabelBoolean, useNoteLabelInt, useTriliumEvent } from "../../react/hooks"; +import { useEffect, useState } from "preact/hooks"; +import getAttributeDefinitionInformation, { buildRowDefinitions, TableData } from "./rows"; +import froca from "../../../services/froca"; +import { buildColumnDefinitions } from "./columns"; +import attributes from "../../../services/attributes"; +import { RefObject } from "preact"; + +export interface TableConfig { + tableData: { + columns?: ColumnDefinition[]; + }; +} + +export default function useData(note: FNote, noteIds: string[], viewConfig: TableConfig | undefined, newAttributePosition: RefObject | undefined, resetNewAttributePosition: () => void) { + const [ maxDepth ] = useNoteLabelInt(note, "maxNestingDepth") ?? -1; + const [ includeArchived ] = useNoteLabelBoolean(note, "includeArchived"); + + const [ columnDefs, setColumnDefs ] = useState(); + const [ rowData, setRowData ] = useState(); + const [ hasChildren, setHasChildren ] = useState(); + const [ isSorted ] = useNoteLabelBoolean(note, "sorted"); + const [ movableRows, setMovableRows ] = useState(false); + + async function refresh() { + const info = getAttributeDefinitionInformation(note); + + // Ensure all note IDs are loaded. + await froca.getNotes(noteIds); + + const { definitions: rowData, hasSubtree: hasChildren, rowNumber } = await buildRowDefinitions(note, info, includeArchived, maxDepth); + const columnDefs = buildColumnDefinitions({ + info, + movableRows, + existingColumnData: viewConfig?.tableData?.columns, + rowNumberHint: rowNumber, + position: newAttributePosition?.current ?? undefined + }); + setColumnDefs(columnDefs); + setRowData(rowData); + setHasChildren(hasChildren); + resetNewAttributePosition(); + } + + useEffect(() => { refresh() }, [ note, noteIds, maxDepth, movableRows ]); + + useTriliumEvent("entitiesReloaded", ({ loadResults}) => { + if (glob.device === "print") return; + + // React to column changes. + if (loadResults.getAttributeRows().find(attr => + attr.type === "label" && + (attr.name?.startsWith("label:") || attr.name?.startsWith("relation:")) && + attributes.isAffecting(attr, note))) { + refresh(); + return; + } + + // React to external row updates. + if (loadResults.getBranchRows().some(branch => branch.parentNoteId === note.noteId || noteIds.includes(branch.parentNoteId ?? "")) + || loadResults.getNoteIds().some(noteId => noteIds.includes(noteId)) + || loadResults.getAttributeRows().some(attr => noteIds.includes(attr.noteId!)) + || loadResults.getAttributeRows().some(attr => attr.name === "archived" && attr.noteId && noteIds.includes(attr.noteId))) { + refresh(); + return; + } + }); + + // Identify if movable rows. + useEffect(() => { + setMovableRows(!isSorted && note.type !== "search" && !hasChildren); + }, [ isSorted, note, hasChildren ]); + + return { columnDefs, rowData, movableRows, hasChildren }; +} diff --git a/apps/client/src/widgets/collections/table/index.tsx b/apps/client/src/widgets/collections/table/index.tsx index f6ae820095..d557f12d33 100644 --- a/apps/client/src/widgets/collections/table/index.tsx +++ b/apps/client/src/widgets/collections/table/index.tsx @@ -1,10 +1,9 @@ import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "preact/hooks"; import { ViewModeProps } from "../interface"; -import { buildColumnDefinitions } from "./columns"; -import getAttributeDefinitionInformation, { buildRowDefinitions, TableData } from "./rows"; -import { useLegacyWidget, useNoteLabelBoolean, useNoteLabelInt, useTriliumEvent } from "../../react/hooks"; +import { TableData } from "./rows"; +import { useLegacyWidget } from "../../react/hooks"; import Tabulator from "./tabulator"; -import { Tabulator as VanillaTabulator, SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule, ColumnDefinition, DataTreeModule, Options, RowComponent} from 'tabulator-tables'; +import { Tabulator as VanillaTabulator, SortModule, FormatModule, InteractionModule, EditModule, ResizeColumnsModule, FrozenColumnsModule, PersistenceModule, MoveColumnsModule, MoveRowsModule, DataTreeModule, Options, RowComponent} from 'tabulator-tables'; import { useContextMenu } from "./context_menu"; import { ParentComponent } from "../../react/react_utils"; import FNote from "../../../entities/fnote"; @@ -14,16 +13,8 @@ import "./index.css"; import useRowTableEditing from "./row_editing"; import useColTableEditing from "./col_editing"; import AttributeDetailWidget from "../../attribute_widgets/attribute_detail"; -import attributes from "../../../services/attributes"; -import { RefObject } from "preact"; import SpacedUpdate from "../../../services/spaced_update"; -import froca from "../../../services/froca"; - -interface TableConfig { - tableData: { - columns?: ColumnDefinition[]; - }; -} +import useData, { TableConfig } from "./data"; export default function TableView({ note, noteIds, notePath, viewConfig, saveConfig }: ViewModeProps) { const tabulatorRef = useRef(null); @@ -118,67 +109,7 @@ function usePersistence(viewConfig: TableConfig | null | undefined, saveConfig: return () => { spacedUpdate.updateNowIfNecessary(); }; - }, [ viewConfig, saveConfig ]) + }, [ viewConfig, saveConfig ]); return persistenceProps; } - -function useData(note: FNote, noteIds: string[], viewConfig: TableConfig | undefined, newAttributePosition: RefObject, resetNewAttributePosition: () => void) { - const [ maxDepth ] = useNoteLabelInt(note, "maxNestingDepth") ?? -1; - const [ includeArchived ] = useNoteLabelBoolean(note, "includeArchived"); - - const [ columnDefs, setColumnDefs ] = useState(); - const [ rowData, setRowData ] = useState(); - const [ hasChildren, setHasChildren ] = useState(); - const [ isSorted ] = useNoteLabelBoolean(note, "sorted"); - const [ movableRows, setMovableRows ] = useState(false); - - async function refresh() { - const info = getAttributeDefinitionInformation(note); - - // Ensure all note IDs are loaded. - await froca.getNotes(noteIds); - - const { definitions: rowData, hasSubtree: hasChildren, rowNumber } = await buildRowDefinitions(note, info, includeArchived, maxDepth); - const columnDefs = buildColumnDefinitions({ - info, - movableRows, - existingColumnData: viewConfig?.tableData?.columns, - rowNumberHint: rowNumber, - position: newAttributePosition.current ?? undefined - }); - setColumnDefs(columnDefs); - setRowData(rowData); - setHasChildren(hasChildren); - resetNewAttributePosition(); - } - - useEffect(() => { refresh() }, [ note, noteIds, maxDepth, movableRows ]); - - useTriliumEvent("entitiesReloaded", ({ loadResults}) => { - // React to column changes. - if (loadResults.getAttributeRows().find(attr => - attr.type === "label" && - (attr.name?.startsWith("label:") || attr.name?.startsWith("relation:")) && - attributes.isAffecting(attr, note))) { - refresh(); - return; - } - - // React to external row updates. - if (loadResults.getBranchRows().some(branch => branch.parentNoteId === note.noteId || noteIds.includes(branch.parentNoteId ?? "")) - || loadResults.getNoteIds().some(noteId => noteIds.includes(noteId)) - || loadResults.getAttributeRows().some(attr => noteIds.includes(attr.noteId!)) - || loadResults.getAttributeRows().some(attr => attr.name === "archived" && attr.noteId && noteIds.includes(attr.noteId))) { - refresh(); - return; - } - }); - - // Identify if movable rows. - useEffect(() => { - setMovableRows(!isSorted && note.type !== "search" && !hasChildren); - }, [ isSorted, note, hasChildren ]); - - return { columnDefs, rowData, movableRows, hasChildren }; -} diff --git a/apps/client/src/widgets/collections/table/tabulator.tsx b/apps/client/src/widgets/collections/table/tabulator.tsx index 6301d5b386..31fb8d4f85 100644 --- a/apps/client/src/widgets/collections/table/tabulator.tsx +++ b/apps/client/src/widgets/collections/table/tabulator.tsx @@ -14,9 +14,10 @@ interface TableProps extends Omit; index: keyof T; footerElement?: string | HTMLElement | JSX.Element; + onReady?: () => void; } -export default function Tabulator({ className, columns, data, modules, tabulatorRef: externalTabulatorRef, footerElement, events, index, dataTree, ...restProps }: TableProps) { +export default function Tabulator({ className, columns, data, modules, tabulatorRef: externalTabulatorRef, footerElement, events, index, dataTree, onReady, ...restProps }: TableProps) { const parentComponent = useContext(ParentComponent); const containerRef = useRef(null); const tabulatorRef = useRef(null); @@ -43,6 +44,7 @@ export default function Tabulator({ className, columns, data, modules, tabula tabulator.on("tableBuilt", () => { tabulatorRef.current = tabulator; externalTabulatorRef.current = tabulator; + onReady?.(); }); return () => tabulator.destroy(); From e7dbaf78b58df53d70809e0211bc54ad19f679e4 Mon Sep 17 00:00:00 2001 From: lzinga Date: Fri, 21 Nov 2025 11:30:29 -0800 Subject: [PATCH 090/697] feat(config): add CORS Resource Policy configuration --- apps/server/src/app.ts | 3 +++ apps/server/src/services/config.ts | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts index f75a4405d8..0e2334ebb4 100644 --- a/apps/server/src/app.ts +++ b/apps/server/src/app.ts @@ -60,6 +60,9 @@ export default async function buildApp() { helmet({ hidePoweredBy: false, // errors out in electron contentSecurityPolicy: false, + crossOriginResourcePolicy: { + policy: config["Network"]["corsResourcePolicy"] || 'same-origin' + }, crossOriginEmbedderPolicy: false }) ); diff --git a/apps/server/src/services/config.ts b/apps/server/src/services/config.ts index e08b7264e6..ea63b77cdb 100644 --- a/apps/server/src/services/config.ts +++ b/apps/server/src/services/config.ts @@ -97,6 +97,8 @@ export interface TriliumConfig { corsAllowMethods: string; /** CORS allowed headers (comma-separated header names) */ corsAllowHeaders: string; + /** CORS Resource Policy ('same-origin', 'same-site' 'cross-origin') */ + corsResourcePolicy: 'same-origin' | 'same-site' | 'cross-origin' | undefined; }; /** Session management configuration */ Session: { @@ -362,6 +364,12 @@ const configMapping = { aliasEnvVars: ['TRILIUM_NETWORK_CORS_ALLOW_HEADERS'], iniGetter: () => getIniSection("Network")?.corsAllowHeaders, defaultValue: '' + }, + corsResourcePolicy: { + standardEnvVar: 'TRILIUM_NETWORK_CORSRESOURCEPOLICY', + aliasEnvVars: ['TRILIUM_NETWORK_CORS_RESOURCE_POLICY'], + iniGetter: () => getIniSection("Network")?.corsResourcePolicy, + defaultValue: '' } }, Session: { @@ -482,7 +490,8 @@ const config: TriliumConfig = { trustedReverseProxy: getConfigValue(configMapping.Network.trustedReverseProxy), corsAllowOrigin: getConfigValue(configMapping.Network.corsAllowOrigin), corsAllowMethods: getConfigValue(configMapping.Network.corsAllowMethods), - corsAllowHeaders: getConfigValue(configMapping.Network.corsAllowHeaders) + corsAllowHeaders: getConfigValue(configMapping.Network.corsAllowHeaders), + corsResourcePolicy: getConfigValue(configMapping.Network.corsResourcePolicy) }, Session: { cookieMaxAge: getConfigValue(configMapping.Session.cookieMaxAge) @@ -539,6 +548,7 @@ const config: TriliumConfig = { * - TRILIUM_NETWORK_CORSALLOWORIGIN : CORS allowed origins * - TRILIUM_NETWORK_CORSALLOWMETHODS : CORS allowed HTTP methods * - TRILIUM_NETWORK_CORSALLOWHEADERS : CORS allowed headers + * - TRILIUM_NETWORK_CORSRESOURCEPOLICY : CORS Resource Policy * * Session Section: * - TRILIUM_SESSION_COOKIEMAXAGE : Cookie lifetime in seconds @@ -566,6 +576,7 @@ const config: TriliumConfig = { * - TRILIUM_NETWORK_CORS_ALLOW_ORIGIN : Same as TRILIUM_NETWORK_CORSALLOWORIGIN * - TRILIUM_NETWORK_CORS_ALLOW_METHODS : Same as TRILIUM_NETWORK_CORSALLOWMETHODS * - TRILIUM_NETWORK_CORS_ALLOW_HEADERS : Same as TRILIUM_NETWORK_CORSALLOWHEADERS + * - TRILIUM_NETWORK_CORS_RESOURCE_POLICY : Same as TRILIUM_NETWORK_CORSRESOURCEPOLICY * * Sync (with SERVER prefix): * - TRILIUM_SYNC_SERVER_HOST : Same as TRILIUM_SYNC_SYNCSERVERHOST From 4b574cecf7a5d8f0ae048f21eb37238e5bf9d25e Mon Sep 17 00:00:00 2001 From: lzinga Date: Fri, 21 Nov 2025 11:39:08 -0800 Subject: [PATCH 091/697] feat(config): add CORS Resource Policy environment variable documentation --- .../Advanced Usage/Configuration (config.ini or e.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md b/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md index 936cc3c4e4..9c27eef146 100644 --- a/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md +++ b/docs/User Guide/User Guide/Advanced Usage/Configuration (config.ini or e.md @@ -49,6 +49,7 @@ Additionally, shorter aliases are available for common configurations (see Alter | `TRILIUM_NETWORK_CORSALLOWORIGIN` | string | "" | CORS allowed origins | | `TRILIUM_NETWORK_CORSALLOWMETHODS` | string | "" | CORS allowed methods | | `TRILIUM_NETWORK_CORSALLOWHEADERS` | string | "" | CORS allowed headers | +| `TRILIUM_NETWORK_CORSRESOURCEPOLICY` | string | same-origin | CORS Resource Policy allows same-origin/same-site/cross-origin as values, will error if not ### Session Section @@ -90,7 +91,7 @@ The following alternative environment variable names are also supported and work * `TRILIUM_NETWORK_CORS_ALLOW_ORIGIN` (alternative to `TRILIUM_NETWORK_CORSALLOWORIGIN`) * `TRILIUM_NETWORK_CORS_ALLOW_METHODS` (alternative to `TRILIUM_NETWORK_CORSALLOWMETHODS`) * `TRILIUM_NETWORK_CORS_ALLOW_HEADERS` (alternative to `TRILIUM_NETWORK_CORSALLOWHEADERS`) - +* `TRILIUM_NETWORK_CORS_RESOURCE_POLICY` (alternative to `TRILIUM_NETWORK_CORSRESOURCEPOLICY`) ### Sync Variables * `TRILIUM_SYNC_SERVER_HOST` (alternative to `TRILIUM_SYNC_SYNCSERVERHOST`) From d1d652495d7b51363b59629cc300ed4a2ce18b8d Mon Sep 17 00:00:00 2001 From: Lucas Date: Fri, 21 Nov 2025 11:55:48 -0800 Subject: [PATCH 092/697] Add default value for CORSRESOURCEPOLICY Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- apps/server/src/services/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/services/config.ts b/apps/server/src/services/config.ts index ea63b77cdb..9d8086d15c 100644 --- a/apps/server/src/services/config.ts +++ b/apps/server/src/services/config.ts @@ -369,7 +369,7 @@ const configMapping = { standardEnvVar: 'TRILIUM_NETWORK_CORSRESOURCEPOLICY', aliasEnvVars: ['TRILIUM_NETWORK_CORS_RESOURCE_POLICY'], iniGetter: () => getIniSection("Network")?.corsResourcePolicy, - defaultValue: '' + defaultValue: 'same-origin' } }, Session: { From cb0c6a344f0f15586d73dde04af192e06ff69716 Mon Sep 17 00:00:00 2001 From: lzinga Date: Fri, 21 Nov 2025 11:59:57 -0800 Subject: [PATCH 093/697] Fixed missing comma --- apps/server/src/services/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/services/config.ts b/apps/server/src/services/config.ts index ea63b77cdb..3414462a69 100644 --- a/apps/server/src/services/config.ts +++ b/apps/server/src/services/config.ts @@ -97,7 +97,7 @@ export interface TriliumConfig { corsAllowMethods: string; /** CORS allowed headers (comma-separated header names) */ corsAllowHeaders: string; - /** CORS Resource Policy ('same-origin', 'same-site' 'cross-origin') */ + /** CORS Resource Policy ('same-origin', 'same-site', 'cross-origin') */ corsResourcePolicy: 'same-origin' | 'same-site' | 'cross-origin' | undefined; }; /** Session management configuration */ From f864746b5493220c1dfaa3602b1e71db4a94b8c2 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:05:22 +0200 Subject: [PATCH 094/697] feat(print/table): render using internal mechanism --- .../src/widgets/collections/table/TablePrintView.css | 7 +++++++ .../src/widgets/collections/table/TablePrintView.tsx | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 apps/client/src/widgets/collections/table/TablePrintView.css diff --git a/apps/client/src/widgets/collections/table/TablePrintView.css b/apps/client/src/widgets/collections/table/TablePrintView.css new file mode 100644 index 0000000000..09c6cae071 --- /dev/null +++ b/apps/client/src/widgets/collections/table/TablePrintView.css @@ -0,0 +1,7 @@ +.tabulator-print-table table, +.tabulator-print-table th, +.tabulator-print-table tr, +.tabulator-print-table td { + border: 1px solid black !important; + border-collapse: collapse; +} \ No newline at end of file diff --git a/apps/client/src/widgets/collections/table/TablePrintView.tsx b/apps/client/src/widgets/collections/table/TablePrintView.tsx index a7e36dfb31..cc73d7cd20 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.tsx +++ b/apps/client/src/widgets/collections/table/TablePrintView.tsx @@ -4,6 +4,7 @@ import useData, { TableConfig } from "./data"; import { ExportModule, PrintModule, Tabulator as VanillaTabulator} from 'tabulator-tables'; import Tabulator from "./tabulator"; import { RawHtmlBlock } from "../../react/RawHtml"; +import "./TablePrintView.css"; export default function TablePrintView({ note, noteIds, viewConfig }: ViewModeProps) { const tabulatorRef = useRef(null); @@ -21,16 +22,19 @@ export default function TablePrintView({ note, noteIds, viewConfig }: ViewModePr data={rowData} index="branchId" dataTree={hasChildren} - printAsHtml={true} printStyled={true} onReady={() => { const tabulator = tabulatorRef.current; if (!tabulator) return; - setHtml(tabulator.getHtml()); + const generatedTable = tabulator.modules.export.generateTable(tabulator.options.printConfig, tabulator.options.printStyled, tabulator.options.printRowRange, "print"); + if(tabulator.options.printFormatter){ + tabulator.options.printFormatter(tabulator.element, generatedTable); + } + setHtml(generatedTable.outerHTML); }} /> ) : ( - + )}
        From 749740242efcb19c3454a796e719f7f5a3154727 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:09:07 +0200 Subject: [PATCH 095/697] fix(print/table) formatters not rendering --- .../client/src/widgets/collections/table/TablePrintView.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.tsx b/apps/client/src/widgets/collections/table/TablePrintView.tsx index cc73d7cd20..09f5519694 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.tsx +++ b/apps/client/src/widgets/collections/table/TablePrintView.tsx @@ -1,14 +1,14 @@ import { useRef, useState } from "preact/hooks"; import { ViewModeProps } from "../interface"; import useData, { TableConfig } from "./data"; -import { ExportModule, PrintModule, Tabulator as VanillaTabulator} from 'tabulator-tables'; +import { ExportModule, FormatModule, PrintModule, Tabulator as VanillaTabulator} from 'tabulator-tables'; import Tabulator from "./tabulator"; import { RawHtmlBlock } from "../../react/RawHtml"; import "./TablePrintView.css"; export default function TablePrintView({ note, noteIds, viewConfig }: ViewModeProps) { const tabulatorRef = useRef(null); - const { columnDefs, rowData, movableRows, hasChildren } = useData(note, noteIds, viewConfig, undefined, () => {}); + const { columnDefs, rowData, hasChildren } = useData(note, noteIds, viewConfig, undefined, () => {}); const [ html, setHtml ] = useState(); return rowData && ( @@ -17,7 +17,7 @@ export default function TablePrintView({ note, noteIds, viewConfig }: ViewModePr Date: Fri, 21 Nov 2025 22:12:05 +0200 Subject: [PATCH 096/697] fix(print/table): missing title --- .../collections/table/TablePrintView.tsx | 55 ++++++++++--------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.tsx b/apps/client/src/widgets/collections/table/TablePrintView.tsx index 09f5519694..278df64138 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.tsx +++ b/apps/client/src/widgets/collections/table/TablePrintView.tsx @@ -12,31 +12,36 @@ export default function TablePrintView({ note, noteIds, viewConfig }: ViewModePr const [ html, setHtml ] = useState(); return rowData && ( -
        - {!html ? ( - { - const tabulator = tabulatorRef.current; - if (!tabulator) return; - const generatedTable = tabulator.modules.export.generateTable(tabulator.options.printConfig, tabulator.options.printStyled, tabulator.options.printRowRange, "print"); - if(tabulator.options.printFormatter){ - tabulator.options.printFormatter(tabulator.element, generatedTable); - } - setHtml(generatedTable.outerHTML); - }} - /> - ) : ( - - )} -
        + <> +

        {note.title}

        + +
        + + {!html ? ( + { + const tabulator = tabulatorRef.current; + if (!tabulator) return; + const generatedTable = tabulator.modules.export.generateTable(tabulator.options.printConfig, tabulator.options.printStyled, tabulator.options.printRowRange, "print"); + if(tabulator.options.printFormatter){ + tabulator.options.printFormatter(tabulator.element, generatedTable); + } + setHtml(generatedTable.outerHTML); + }} + /> + ) : ( + + )} +
        + ) } From 670cc474a47316ceba3afbc4db1bd914fe564564 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:13:55 +0200 Subject: [PATCH 097/697] chore(print/table): grayed out table headers --- apps/client/src/widgets/collections/table/TablePrintView.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.css b/apps/client/src/widgets/collections/table/TablePrintView.css index 09c6cae071..ce7eec9ec3 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.css +++ b/apps/client/src/widgets/collections/table/TablePrintView.css @@ -4,4 +4,8 @@ .tabulator-print-table td { border: 1px solid black !important; border-collapse: collapse; +} + +.tabulator-print-table th { + background-color: #f0f0f0 !important; } \ No newline at end of file From 644e3e200da10f09d38b609ddb3e204284ff277f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:15:01 +0200 Subject: [PATCH 098/697] chore(print/table): stop copying styles and apply own --- apps/client/src/widgets/collections/table/TablePrintView.css | 5 +++++ apps/client/src/widgets/collections/table/TablePrintView.tsx | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.css b/apps/client/src/widgets/collections/table/TablePrintView.css index ce7eec9ec3..14c1e6dc40 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.css +++ b/apps/client/src/widgets/collections/table/TablePrintView.css @@ -8,4 +8,9 @@ .tabulator-print-table th { background-color: #f0f0f0 !important; +} + +.tabulator-print-table th, +.tabulator-print-table td { + padding: 0.25rem 0.5rem !important; } \ No newline at end of file diff --git a/apps/client/src/widgets/collections/table/TablePrintView.tsx b/apps/client/src/widgets/collections/table/TablePrintView.tsx index 278df64138..abf73f1eee 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.tsx +++ b/apps/client/src/widgets/collections/table/TablePrintView.tsx @@ -26,7 +26,8 @@ export default function TablePrintView({ note, noteIds, viewConfig }: ViewModePr data={rowData} index="branchId" dataTree={hasChildren} - printStyled={true} + printAsHtml={true} + printStyled={false} onReady={() => { const tabulator = tabulatorRef.current; if (!tabulator) return; From 779e2f4633751e5e60f66c05bde0cae4cc2ad922 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:15:56 +0200 Subject: [PATCH 099/697] chore(print/table): monochrome checkboxes --- apps/client/src/widgets/collections/table/TablePrintView.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.css b/apps/client/src/widgets/collections/table/TablePrintView.css index 14c1e6dc40..74e282aafe 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.css +++ b/apps/client/src/widgets/collections/table/TablePrintView.css @@ -13,4 +13,8 @@ .tabulator-print-table th, .tabulator-print-table td { padding: 0.25rem 0.5rem !important; +} + +.tabulator-print-table td[aria-checked] svg path { + fill: currentColor !important; } \ No newline at end of file From 0c5a6a75481bc816768d593f664c92240cb8e764 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:17:54 +0200 Subject: [PATCH 100/697] feat(print/table): integrate with the printing mechanism --- .../src/widgets/collections/table/TablePrintView.tsx | 9 +++++++-- apps/client/src/widgets/ribbon/NoteActions.tsx | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.tsx b/apps/client/src/widgets/collections/table/TablePrintView.tsx index abf73f1eee..9582b43600 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.tsx +++ b/apps/client/src/widgets/collections/table/TablePrintView.tsx @@ -1,4 +1,4 @@ -import { useRef, useState } from "preact/hooks"; +import { useEffect, useRef, useState } from "preact/hooks"; import { ViewModeProps } from "../interface"; import useData, { TableConfig } from "./data"; import { ExportModule, FormatModule, PrintModule, Tabulator as VanillaTabulator} from 'tabulator-tables'; @@ -6,11 +6,16 @@ import Tabulator from "./tabulator"; import { RawHtmlBlock } from "../../react/RawHtml"; import "./TablePrintView.css"; -export default function TablePrintView({ note, noteIds, viewConfig }: ViewModeProps) { +export default function TablePrintView({ note, noteIds, viewConfig, onReady }: ViewModeProps) { const tabulatorRef = useRef(null); const { columnDefs, rowData, hasChildren } = useData(note, noteIds, viewConfig, undefined, () => {}); const [ html, setHtml ] = useState(); + useEffect(() => { + if (!html) return; + onReady?.(); + }, [ html ]); + return rowData && ( <>

        {note.title}

        diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx index d7e344dd84..33017221be 100644 --- a/apps/client/src/widgets/ribbon/NoteActions.tsx +++ b/apps/client/src/widgets/ribbon/NoteActions.tsx @@ -49,7 +49,7 @@ function NoteContextMenu({ note, noteContext }: { note: FNote, noteContext?: Not const canBeConvertedToAttachment = note?.isEligibleForConversionToAttachment(); const isSearchable = ["text", "code", "book", "mindMap", "doc"].includes(note.type); const isInOptionsOrHelp = note?.noteId.startsWith("_options") || note?.noteId.startsWith("_help"); - const isPrintable = ["text", "code"].includes(note.type) || (note.type === "book" && ["presentation", "list"].includes(note.getLabelValue("viewType") ?? "")); + const isPrintable = ["text", "code"].includes(note.type) || (note.type === "book" && ["presentation", "list", "table"].includes(note.getLabelValue("viewType") ?? "")); const isElectron = getIsElectron(); const isMac = getIsMac(); const hasSource = ["text", "code", "relationMap", "mermaid", "canvas", "mindMap", "aiChat"].includes(note.type); From 8dc43dab59203dffcbdfff87fee35fe05b645f64 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:28:43 +0200 Subject: [PATCH 101/697] docs(user): update printing documentation --- .../Notes/Printing & Exporting as PDF.html | 63 +++++++++++-------- .../User Guide/Collections/List View.html | 11 ++-- .../Developer Guide/Documentation.md | 2 +- docs/User Guide/!!!meta.json | 43 +++++++------ .../Notes/Printing & Exporting as PDF.md | 9 ++- 5 files changed, 74 insertions(+), 54 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html index 35ae5862b6..2e3b2c92cf 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html @@ -59,9 +59,9 @@ class="admonition note"> orientation, size. However, there are a few Attributes to adjust some of the settings:

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

        Printing multiple notes

        Since v0.100.0, it is possible to print more than one note at the time - by using Collections:

        + by using Collections:

          -
        1. First create a collection.
        2. -
        3. Configure it to use List View.
        4. +
        5. First create a collection.
        6. +
        7. Configure it to use List View.
        8. Print the collection note normally.
        9. + data-list-item-id="ecaad5f90dcbfd65da21689c54b063ff9">Print the collection note normally.

        The resulting collection will contain all the children of the collection, while maintaining the hierarchy.

        @@ -86,9 +86,9 @@ class="admonition note"> href="#root/_help_4TIF1oA4VQRO">Options and assigning a key combination for:

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

        Constraints & limitations

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

          -
        • For Code notes: +
        • For Code notes:
            -
          • Line numbers are not printed.
          • -
          • Syntax highlighting is enabled, however a default theme (Visual Studio) +
          • Line numbers are not printed.
          • +
          • Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced.
        • -
        • For Collections: +
        • For Collections, + the following are supported:
            -
          • List View is - supported, allowing to print multiple notes at once while preserving hierarchy - (similar to a book).
          • -
          • Presentation is - also supported, where each slide/subnote is displayed.
          • -
          • The rest of the collections are not supported, but we plan to add support +
          • List View, allowing + to print multiple notes at once while preserving hierarchy (similar to + a book).
          • +
          • Presentation, + where each slide/sub-note is displayed.
          • +
          • Table, + where the table is rendered in a print-friendly way. +
              +
            • Tables that are too complex (especially if they have multiple columns) + might not fit properly, however tables with a large number of rows are + supported thanks to pagination. 
            • +
            • Consider printing in landscape mode, or using #printLandscape if + exporting to PDF.
            • +
            +
          • +
          • The rest of the collections are not supported, but we plan to add support for all the collection types at some point.
        • -
        • Using Custom app-wide CSS for +
        • Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism.
            -
          • We plan to introduce a new mechanism specifically for a print CSS.
          • +
          • We plan to introduce a new mechanism specifically for a print CSS.
        @@ -128,10 +139,10 @@ class="admonition note"> printing.

        To do so:

          -
        • Create a CSS code note.
        • -
        • On the note being printed, apply the ~printCss relation to +
        • Create a CSS code note.
        • +
        • On the note being printed, apply the ~printCss relation to point to the newly created CSS code note.
        • -
        • To apply the CSS to multiple notes, consider using inheritable attributes or  +
        • To apply the CSS to multiple notes, consider using inheritable attributes or  Templates.
        @@ -142,11 +153,11 @@ class="admonition note"> }
      • To remark:

          -
        • Multiple CSS notes can be add by using multiple ~printCss relations.
        • +
        • Multiple CSS notes can be add by using multiple ~printCss relations.
        • If the note pointing to the printCss doesn't have the right + data-list-item-id="e5989879c4432018bf90fecc5e31e090b">If the note pointing to the printCss doesn't have the right note type or mime type, it will be ignored.
        • -
        • If migrating from a previous version where If migrating from a previous version where Custom app-wide CSS, there's no need for @media print {  since the style-sheet is used only for printing.
        diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html index 64c09e0241..4c8a972573 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/List View.html @@ -12,22 +12,21 @@ as a single continuous document.

        Interaction

          -
        • Each note can be expanded or collapsed by clicking on the arrow to the +
        • Each note can be expanded or collapsed by clicking on the arrow to the left of the title.
        • -
        • In the Ribbon, +
        • In the Ribbon, in the Collection tab there are options to expand and to collapse all notes easily.

        Printing and exporting to PDF

        -

        Since v0.100.0, list collections can be printed or exported to PDF.

        +

        Since v0.100.0, list collections can be printed or exported to PDF.

        A printed list collection will print all the notes in the collection, in the right order and preserving the full hierarchy.

        If exported to PDF within the desktop application, there is additional functionality:

          -
        • The table of contents of the PDF will reflect the structure of the notes.
        • -
        • Reference and inline links to other notes within the same hierarchy will +
        • The table of contents of the PDF will reflect the structure of the notes.
        • +
        • Reference and inline links to other notes within the same hierarchy will be functional (will jump to the corresponding page). If a link refers to a note that is not in the printed hierarchy, it will be unlinked.
        \ 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 b8eca125b2..6e7ea215f1 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/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index 7b77cb46aa..014f86614f 100644 --- a/docs/User Guide/!!!meta.json +++ b/docs/User Guide/!!!meta.json @@ -4062,66 +4062,73 @@ { "type": "relation", "name": "internalLink", - "value": "4TIF1oA4VQRO", + "value": "GTwFsgaA0lCt", "isInheritable": false, "position": 40 }, { "type": "relation", "name": "internalLink", - "value": "KSZ04uQ2D1St", + "value": "mULW0Q3VojwY", "isInheritable": false, "position": 50 }, { "type": "relation", "name": "internalLink", - "value": "6f9hih2hXXZk", + "value": "4TIF1oA4VQRO", "isInheritable": false, "position": 60 }, { "type": "relation", "name": "internalLink", - "value": "GTwFsgaA0lCt", + "value": "KSZ04uQ2D1St", "isInheritable": false, "position": 70 }, { "type": "relation", "name": "internalLink", - "value": "zP3PMqaG71Ct", + "value": "6f9hih2hXXZk", "isInheritable": false, "position": 80 }, { "type": "relation", "name": "internalLink", - "value": "AlhDUqhENtH7", + "value": "zP3PMqaG71Ct", "isInheritable": false, "position": 90 }, { "type": "relation", "name": "internalLink", - "value": "bwZpz2ajCEwO", + "value": "AlhDUqhENtH7", "isInheritable": false, "position": 100 }, { "type": "relation", "name": "internalLink", - "value": "KC1HB96bqqHX", + "value": "bwZpz2ajCEwO", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "0ESUbbAxVnoK", + "value": "KC1HB96bqqHX", "isInheritable": false, "position": 120 }, + { + "type": "relation", + "name": "internalLink", + "value": "0ESUbbAxVnoK", + "isInheritable": false, + "position": 130 + }, { "type": "label", "name": "iconClass", @@ -4139,9 +4146,9 @@ { "type": "relation", "name": "internalLink", - "value": "mULW0Q3VojwY", + "value": "2FvYrpmOXm29", "isInheritable": false, - "position": 130 + "position": 140 } ], "format": "markdown", @@ -10472,6 +10479,13 @@ "isInheritable": false, "position": 20 }, + { + "type": "relation", + "name": "internalLink", + "value": "NRnIZmSMc5sj", + "isInheritable": false, + "position": 30 + }, { "type": "label", "name": "iconClass", @@ -10485,13 +10499,6 @@ "value": "list", "isInheritable": false, "position": 30 - }, - { - "type": "relation", - "name": "internalLink", - "value": "NRnIZmSMc5sj", - "isInheritable": false, - "position": 40 } ], "format": "markdown", diff --git a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md index 083ad6ec78..56b0adb74e 100644 --- a/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md +++ b/docs/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.md @@ -73,9 +73,12 @@ Not all Note Types  * For Code notes: * Line numbers are not printed. * Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced. -* For Collections: - * List View is supported, allowing to print multiple notes at once while preserving hierarchy (similar to a book). - * Presentation is also supported, where each slide/subnote is displayed. +* For Collections, the following are supported: + * List View, allowing to print multiple notes at once while preserving hierarchy (similar to a book). + * Presentation, where each slide/sub-note is displayed. + * Table, where the table is rendered in a print-friendly way. + * Tables that are too complex (especially if they have multiple columns) might not fit properly, however tables with a large number of rows are supported thanks to pagination. + * Consider printing in landscape mode, or using `#printLandscape` if exporting to PDF. * The rest of the collections are not supported, but we plan to add support for all the collection types at some point. * Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism. * We plan to introduce a new mechanism specifically for a print CSS. From ab14bdbb18f1a2a8243bbf3fa8a8f2a3c91571b3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:33:48 +0200 Subject: [PATCH 102/697] chore(print/table): address review --- .../collections/table/TablePrintView.css | 24 +++++++++---------- .../src/widgets/collections/table/data.tsx | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.css b/apps/client/src/widgets/collections/table/TablePrintView.css index 74e282aafe..fef53c299f 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.css +++ b/apps/client/src/widgets/collections/table/TablePrintView.css @@ -1,20 +1,20 @@ -.tabulator-print-table table, -.tabulator-print-table th, -.tabulator-print-table tr, -.tabulator-print-table td { - border: 1px solid black !important; +.table-print-view .tabulator-print-table table, +.table-print-view .tabulator-print-table th, +.table-print-view .tabulator-print-table tr, +.table-print-view .tabulator-print-table td { + border: 1px solid black; border-collapse: collapse; } -.tabulator-print-table th { - background-color: #f0f0f0 !important; +.table-print-view .tabulator-print-table th { + background-color: #f0f0f0; } -.tabulator-print-table th, -.tabulator-print-table td { - padding: 0.25rem 0.5rem !important; +.table-print-view .tabulator-print-table th, +.table-print-view .tabulator-print-table td { + padding: 0.25rem 0.5rem; } -.tabulator-print-table td[aria-checked] svg path { - fill: currentColor !important; +.table-print-view .tabulator-print-table td[aria-checked] svg path { + fill: currentColor; } \ No newline at end of file diff --git a/apps/client/src/widgets/collections/table/data.tsx b/apps/client/src/widgets/collections/table/data.tsx index b77a1545ed..94909939db 100644 --- a/apps/client/src/widgets/collections/table/data.tsx +++ b/apps/client/src/widgets/collections/table/data.tsx @@ -15,7 +15,7 @@ export interface TableConfig { } export default function useData(note: FNote, noteIds: string[], viewConfig: TableConfig | undefined, newAttributePosition: RefObject | undefined, resetNewAttributePosition: () => void) { - const [ maxDepth ] = useNoteLabelInt(note, "maxNestingDepth") ?? -1; + const [ maxDepth ] = useNoteLabelInt(note, "maxNestingDepth"); const [ includeArchived ] = useNoteLabelBoolean(note, "includeArchived"); const [ columnDefs, setColumnDefs ] = useState(); From 5c0cf09c425b742389e1cc1878e8e56ef4deeb5e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 21 Nov 2025 22:35:29 +0200 Subject: [PATCH 103/697] chore(print/table): revert back to using the export module only --- .../src/widgets/collections/table/TablePrintView.tsx | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/collections/table/TablePrintView.tsx b/apps/client/src/widgets/collections/table/TablePrintView.tsx index 9582b43600..534ba5764a 100644 --- a/apps/client/src/widgets/collections/table/TablePrintView.tsx +++ b/apps/client/src/widgets/collections/table/TablePrintView.tsx @@ -1,7 +1,7 @@ import { useEffect, useRef, useState } from "preact/hooks"; import { ViewModeProps } from "../interface"; import useData, { TableConfig } from "./data"; -import { ExportModule, FormatModule, PrintModule, Tabulator as VanillaTabulator} from 'tabulator-tables'; +import { ExportModule, FormatModule, Tabulator as VanillaTabulator} from 'tabulator-tables'; import Tabulator from "./tabulator"; import { RawHtmlBlock } from "../../react/RawHtml"; import "./TablePrintView.css"; @@ -26,7 +26,7 @@ export default function TablePrintView({ note, noteIds, viewConfig, onReady }: V { const tabulator = tabulatorRef.current; if (!tabulator) return; - const generatedTable = tabulator.modules.export.generateTable(tabulator.options.printConfig, tabulator.options.printStyled, tabulator.options.printRowRange, "print"); - if(tabulator.options.printFormatter){ - tabulator.options.printFormatter(tabulator.element, generatedTable); - } - setHtml(generatedTable.outerHTML); + setHtml(tabulator.getHtml()); }} /> ) : ( From 7e6e10e3ef48a325ed42c599c6db2afd836cbeb2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 01:40:32 +0000 Subject: [PATCH 104/697] chore(deps): update dependency express-openid-connect to v2.19.3 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 34 +++++++++++++--------------------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 97038b99d3..d719f625d2 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -86,7 +86,7 @@ "escape-html": "1.0.3", "express": "5.1.0", "express-http-proxy": "2.1.2", - "express-openid-connect": "2.19.2", + "express-openid-connect": "2.19.3", "express-rate-limit": "8.2.1", "express-session": "1.18.2", "file-uri-to-path": "2.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d66f9bfa28..46af00d3d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -667,8 +667,8 @@ importers: specifier: 2.1.2 version: 2.1.2 express-openid-connect: - specifier: 2.19.2 - version: 2.19.2(express@5.1.0) + specifier: 2.19.3 + version: 2.19.3(express@5.1.0) express-rate-limit: specifier: 8.2.1 version: 8.2.1(express@5.1.0) @@ -8196,8 +8196,8 @@ packages: resolution: {integrity: sha512-FXcAcs7Nf/hF73Mzh0WDWPwaOlsEUL/fCHW3L4wU6DH79dypsaxmbnAildCLniFs7HQuuvoiR6bjNVUvGuTb5g==} engines: {node: '>=6.0.0'} - express-openid-connect@2.19.2: - resolution: {integrity: sha512-hRRRBS+mH9hrhVcbg7+APe+dIsYB4BDLILv7QfTmM1jSDyaU9NYpTxqWourAnlud/E4Gf4Q0qCVmSJguh4BTaA==} + express-openid-connect@2.19.3: + resolution: {integrity: sha512-3XTQBa6Bzuw1GozlIQcruJ7vaWkjHaSDHTTJFuAvQwq/B42Brzn/MiVQUsxPXHnLCs/tN9Scg+G12dS2RGgT4Q==} engines: {node: ^10.19.0 || >=12.0.0 < 13 || >=13.7.0 < 14 || >= 14.2.0} peerDependencies: express: '>= 4.17.0' @@ -14245,6 +14245,9 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-promisify@3.0.0: + resolution: {integrity: sha512-uWRZJMjSWt/A1J1exfqz7xiKx2kVpAHR5qIDr6WwwBMQHDoKbo2I1kQN62iA2uXHxOSVpZRDvbm8do+4ijfkNA==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -15719,8 +15722,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15954,8 +15955,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.2.0': dependencies: @@ -15965,8 +15964,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.2.0': dependencies: @@ -15985,8 +15982,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16009,8 +16004,6 @@ snapshots: '@ckeditor/ckeditor5-table': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-emoji@47.2.0': dependencies: @@ -16036,8 +16029,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-engine': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-essentials@47.2.0': dependencies: @@ -16169,8 +16160,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-widget': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-embed@47.2.0': dependencies: @@ -16587,8 +16576,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-special-characters@47.2.0': dependencies: @@ -24356,7 +24343,7 @@ snapshots: transitivePeerDependencies: - supports-color - express-openid-connect@2.19.2(express@5.1.0): + express-openid-connect@2.19.3(express@5.1.0): dependencies: base64url: 3.0.1 clone: 2.1.2 @@ -24370,6 +24357,7 @@ snapshots: on-headers: 1.1.0 openid-client: 4.9.1 url-join: 4.0.1 + util-promisify: 3.0.0 transitivePeerDependencies: - supports-color @@ -31602,6 +31590,10 @@ snapshots: util-deprecate@1.0.2: {} + util-promisify@3.0.0: + dependencies: + object.getownpropertydescriptors: 2.1.8 + utils-merge@1.0.1: {} uuid@11.1.0: {} From 097e36677ae4e88b066f7f384d65d6711a9ae87d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 01:42:35 +0000 Subject: [PATCH 105/697] chore(deps): update dependency stylelint to v16.26.0 --- 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 | 189 +++++++++++------- 6 files changed, 117 insertions(+), 82 deletions(-) diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 0d01ce4097..ba46d61f47 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -33,7 +33,7 @@ "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.7", - "stylelint": "16.25.0", + "stylelint": "16.26.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 974da57711..4a14f5f7ae 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -34,7 +34,7 @@ "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.7", - "stylelint": "16.25.0", + "stylelint": "16.26.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index c076f208fa..82069dc9e4 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -36,7 +36,7 @@ "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.7", - "stylelint": "16.25.0", + "stylelint": "16.26.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index fbd21f7d18..537260c27e 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -37,7 +37,7 @@ "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.7", - "stylelint": "16.25.0", + "stylelint": "16.26.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 76e0e9df92..2d637efc5a 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -36,7 +36,7 @@ "eslint-config-ckeditor5": ">=9.1.0", "http-server": "14.1.1", "lint-staged": "16.2.7", - "stylelint": "16.25.0", + "stylelint": "16.26.0", "stylelint-config-ckeditor5": ">=9.1.0", "ts-node": "10.9.2", "typescript": "5.9.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d66f9bfa28..626849a304 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -915,11 +915,11 @@ importers: specifier: 16.2.7 version: 16.2.7 stylelint: - specifier: 16.25.0 - version: 16.25.0(typescript@5.9.3) + specifier: 16.26.0 + version: 16.26.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 13.0.0(stylelint@16.25.0(typescript@5.9.3)) + version: 13.0.0(stylelint@16.26.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.1)(typescript@5.9.3) @@ -975,11 +975,11 @@ importers: specifier: 16.2.7 version: 16.2.7 stylelint: - specifier: 16.25.0 - version: 16.25.0(typescript@5.9.3) + specifier: 16.26.0 + version: 16.26.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 13.0.0(stylelint@16.25.0(typescript@5.9.3)) + version: 13.0.0(stylelint@16.26.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.1)(typescript@5.9.3) @@ -1035,11 +1035,11 @@ importers: specifier: 16.2.7 version: 16.2.7 stylelint: - specifier: 16.25.0 - version: 16.25.0(typescript@5.9.3) + specifier: 16.26.0 + version: 16.26.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 13.0.0(stylelint@16.25.0(typescript@5.9.3)) + version: 13.0.0(stylelint@16.26.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.1)(typescript@5.9.3) @@ -1102,11 +1102,11 @@ importers: specifier: 16.2.7 version: 16.2.7 stylelint: - specifier: 16.25.0 - version: 16.25.0(typescript@5.9.3) + specifier: 16.26.0 + version: 16.26.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 13.0.0(stylelint@16.25.0(typescript@5.9.3)) + version: 13.0.0(stylelint@16.26.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.1)(typescript@5.9.3) @@ -1169,11 +1169,11 @@ importers: specifier: 16.2.7 version: 16.2.7 stylelint: - specifier: 16.25.0 - version: 16.25.0(typescript@5.9.3) + specifier: 16.26.0 + version: 16.26.0(typescript@5.9.3) stylelint-config-ckeditor5: specifier: '>=9.1.0' - version: 13.0.0(stylelint@16.25.0(typescript@5.9.3)) + version: 13.0.0(stylelint@16.26.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.1)(typescript@5.9.3) @@ -1748,6 +1748,12 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@cacheable/memory@2.0.5': + resolution: {integrity: sha512-fkiAxCvssEyJZ5fxX4tcdZFRmW9JehSTGvvqmXn6rTzG5cH6V/3C4ad8yb01vOjp2xBydHkHrgpW0qeGtzt6VQ==} + + '@cacheable/utils@2.3.1': + resolution: {integrity: sha512-38NJXjIr4W1Sghun8ju+uYWD8h2c61B4dKwfnQHVDFpAJ9oS28RpfqZQJ6Dgd3RceGkILDY9YT+72HJR3LoeSQ==} + '@chevrotain/cst-dts-gen@11.0.3': resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} @@ -3477,8 +3483,14 @@ packages: peerDependencies: tslib: '2' - '@keyv/serialize@1.1.0': - resolution: {integrity: sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==} + '@keyv/bigmap@1.3.0': + resolution: {integrity: sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.5.4 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} '@kwsites/file-exists@1.1.1': resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==} @@ -6507,8 +6519,8 @@ packages: resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} engines: {node: '>=8'} - cacheable@1.10.4: - resolution: {integrity: sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==} + cacheable@2.2.0: + resolution: {integrity: sha512-LEJxRqfeomiiRd2t0uON6hxAtgOoWDfY3fugebbz+J3vDLO+SkdfFChQcOHTZhj9SYa9iwE9MGYNX72dKiOE4w==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -8317,8 +8329,8 @@ packages: fflate@0.8.2: resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} - file-entry-cache@10.1.4: - resolution: {integrity: sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==} + file-entry-cache@11.1.1: + resolution: {integrity: sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -8394,8 +8406,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.13: - resolution: {integrity: sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==} + flat-cache@6.1.19: + resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -8822,6 +8834,10 @@ packages: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} + hashery@1.2.0: + resolution: {integrity: sha512-43XJKpwle72Ik5Zpam7MuzRWyNdwwdf6XHlh8wCj2PggvWf+v/Dm5B0dxGZOmddidgeO6Ofu9As/o231Ti/9PA==} + engines: {node: '>=20'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -8901,8 +8917,8 @@ packages: hoist-non-react-statics@2.5.5: resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} - hookified@1.12.0: - resolution: {integrity: sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==} + hookified@1.13.0: + resolution: {integrity: sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -9755,8 +9771,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.0: - resolution: {integrity: sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==} + keyv@5.5.4: + resolution: {integrity: sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==} khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} @@ -12261,6 +12277,10 @@ packages: pwacompat@2.0.17: resolution: {integrity: sha512-6Du7IZdIy7cHiv7AhtDy4X2QRM8IAD5DII69mt5qWibC2d15ZU8DmBG1WdZKekG11cChSu4zkSUGPF9sweOl6w==} + qified@0.5.2: + resolution: {integrity: sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==} + engines: {node: '>=20'} + qjobs@1.2.0: resolution: {integrity: sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==} engines: {node: '>=0.9'} @@ -13568,8 +13588,8 @@ packages: peerDependencies: stylelint: '>=16.0.0' - stylelint@16.25.0: - resolution: {integrity: sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==} + stylelint@16.26.0: + resolution: {integrity: sha512-Y/3AVBefrkqqapVYH3LBF5TSDZ1kw+0XpdKN2KchfuhMK6lQ85S4XOG4lIZLcrcS4PWBmvcY6eS2kCQFz0jukQ==} engines: {node: '>=18.12.0'} hasBin: true @@ -15537,6 +15557,18 @@ snapshots: tough-cookie: 4.1.4 optional: true + '@cacheable/memory@2.0.5': + dependencies: + '@cacheable/utils': 2.3.1 + '@keyv/bigmap': 1.3.0(keyv@5.5.4) + hookified: 1.13.0 + keyv: 5.5.4 + + '@cacheable/utils@2.3.1': + dependencies: + hashery: 1.2.0 + keyv: 5.5.4 + '@chevrotain/cst-dts-gen@11.0.3': dependencies: '@chevrotain/gast': 11.0.3 @@ -15719,8 +15751,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15954,8 +15984,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.2.0': dependencies: @@ -15965,8 +15993,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.2.0': dependencies: @@ -16036,8 +16062,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-engine': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-essentials@47.2.0': dependencies: @@ -16169,8 +16193,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-widget': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-embed@47.2.0': dependencies: @@ -16403,8 +16425,8 @@ snapshots: process: 0.11.10 raw-loader: 4.0.2(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.0)) style-loader: 2.0.0(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.0)) - stylelint: 16.25.0(typescript@5.0.4) - stylelint-config-ckeditor5: 2.0.1(stylelint@16.25.0(typescript@5.9.3)) + stylelint: 16.26.0(typescript@5.0.4) + stylelint-config-ckeditor5: 2.0.1(stylelint@16.26.0(typescript@5.9.3)) terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.0)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.0)) 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.0)) ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.1)(typescript@5.0.4) @@ -16499,8 +16521,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.2.0': dependencies: @@ -16587,8 +16607,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-special-characters@47.2.0': dependencies: @@ -18451,7 +18469,13 @@ snapshots: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 - '@keyv/serialize@1.1.0': {} + '@keyv/bigmap@1.3.0(keyv@5.5.4)': + dependencies: + hashery: 1.2.0 + hookified: 1.13.0 + keyv: 5.5.4 + + '@keyv/serialize@1.1.1': {} '@kwsites/file-exists@1.1.1': dependencies: @@ -20193,7 +20217,7 @@ snapshots: - supports-color - typescript - '@stylistic/stylelint-plugin@3.1.3(stylelint@16.25.0(typescript@5.9.3))': + '@stylistic/stylelint-plugin@3.1.3(stylelint@16.26.0(typescript@5.9.3))': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -20203,7 +20227,7 @@ snapshots: postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 style-search: 0.1.0 - stylelint: 16.25.0(typescript@5.9.3) + stylelint: 16.26.0(typescript@5.9.3) '@swc/core-darwin-arm64@1.11.29': optional: true @@ -22079,10 +22103,13 @@ snapshots: normalize-url: 6.1.0 responselike: 2.0.1 - cacheable@1.10.4: + cacheable@2.2.0: dependencies: - hookified: 1.12.0 - keyv: 5.5.0 + '@cacheable/memory': 2.0.5 + '@cacheable/utils': 2.3.1 + hookified: 1.13.0 + keyv: 5.5.4 + qified: 0.5.2 call-bind-apply-helpers@1.0.2: dependencies: @@ -24555,9 +24582,9 @@ snapshots: fflate@0.8.2: {} - file-entry-cache@10.1.4: + file-entry-cache@11.1.1: dependencies: - flat-cache: 6.1.13 + flat-cache: 6.1.19 file-entry-cache@8.0.0: dependencies: @@ -24664,11 +24691,11 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.13: + flat-cache@6.1.19: dependencies: - cacheable: 1.10.4 + cacheable: 2.2.0 flatted: 3.3.3 - hookified: 1.12.0 + hookified: 1.13.0 flat@5.0.2: {} @@ -25171,6 +25198,10 @@ snapshots: has@1.0.4: {} + hashery@1.2.0: + dependencies: + hookified: 1.13.0 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -25310,7 +25341,7 @@ snapshots: hoist-non-react-statics@2.5.5: {} - hookified@1.12.0: {} + hookified@1.13.0: {} hosted-git-info@2.8.9: {} @@ -26243,9 +26274,9 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.5.0: + keyv@5.5.4: dependencies: - '@keyv/serialize': 1.1.0 + '@keyv/serialize': 1.1.1 khroma@2.1.0: {} @@ -29105,6 +29136,10 @@ snapshots: pwacompat@2.0.17: {} + qified@0.5.2: + dependencies: + hookified: 1.13.0 + qjobs@1.2.0: {} qs@6.13.0: @@ -30683,31 +30718,31 @@ snapshots: postcss: 8.5.6 postcss-selector-parser: 7.1.0 - stylelint-config-ckeditor5@13.0.0(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-ckeditor5@13.0.0(stylelint@16.26.0(typescript@5.9.3)): dependencies: - '@stylistic/stylelint-plugin': 3.1.3(stylelint@16.25.0(typescript@5.9.3)) - stylelint: 16.25.0(typescript@5.9.3) - stylelint-config-recommended: 16.0.0(stylelint@16.25.0(typescript@5.9.3)) - stylelint-plugin-ckeditor5-rules: 13.0.0(stylelint@16.25.0(typescript@5.9.3)) + '@stylistic/stylelint-plugin': 3.1.3(stylelint@16.26.0(typescript@5.9.3)) + stylelint: 16.26.0(typescript@5.9.3) + stylelint-config-recommended: 16.0.0(stylelint@16.26.0(typescript@5.9.3)) + stylelint-plugin-ckeditor5-rules: 13.0.0(stylelint@16.26.0(typescript@5.9.3)) - stylelint-config-ckeditor5@2.0.1(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-ckeditor5@2.0.1(stylelint@16.26.0(typescript@5.9.3)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) - stylelint-config-recommended: 3.0.0(stylelint@16.25.0(typescript@5.9.3)) + stylelint: 16.26.0(typescript@5.9.3) + stylelint-config-recommended: 3.0.0(stylelint@16.26.0(typescript@5.9.3)) - stylelint-config-recommended@16.0.0(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-recommended@16.0.0(stylelint@16.26.0(typescript@5.9.3)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) + stylelint: 16.26.0(typescript@5.9.3) - stylelint-config-recommended@3.0.0(stylelint@16.25.0(typescript@5.9.3)): + stylelint-config-recommended@3.0.0(stylelint@16.26.0(typescript@5.9.3)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) + stylelint: 16.26.0(typescript@5.9.3) - stylelint-plugin-ckeditor5-rules@13.0.0(stylelint@16.25.0(typescript@5.9.3)): + stylelint-plugin-ckeditor5-rules@13.0.0(stylelint@16.26.0(typescript@5.9.3)): dependencies: - stylelint: 16.25.0(typescript@5.9.3) + stylelint: 16.26.0(typescript@5.9.3) - stylelint@16.25.0(typescript@5.0.4): + stylelint@16.26.0(typescript@5.0.4): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -30722,7 +30757,7 @@ snapshots: debug: 4.4.3(supports-color@6.0.0) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.4 + file-entry-cache: 11.1.1 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -30751,7 +30786,7 @@ snapshots: - supports-color - typescript - stylelint@16.25.0(typescript@5.9.3): + stylelint@16.26.0(typescript@5.9.3): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -30766,7 +30801,7 @@ snapshots: debug: 4.4.3(supports-color@6.0.0) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.1.4 + file-entry-cache: 11.1.1 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 From 1e5b95f64a0afde80afd458d2e9d6fe50e4c7a3f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 06:05:44 +0000 Subject: [PATCH 106/697] fix(deps): update dependency better-sqlite3 to v12.4.6 --- apps/desktop/package.json | 2 +- apps/dump-db/package.json | 2 +- apps/edit-docs/package.json | 2 +- apps/server/docker/package.json | 2 +- apps/server/package.json | 2 +- pnpm-lock.yaml | 32 ++++++++++++-------------------- 6 files changed, 17 insertions(+), 25 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 284551e29b..0753e7bb37 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -23,7 +23,7 @@ }, "dependencies": { "@electron/remote": "2.1.3", - "better-sqlite3": "12.4.1", + "better-sqlite3": "12.4.6", "electron-debug": "4.1.0", "electron-dl": "4.0.0", "electron-squirrel-startup": "1.0.1", diff --git a/apps/dump-db/package.json b/apps/dump-db/package.json index 029eca4641..0495eb0388 100644 --- a/apps/dump-db/package.json +++ b/apps/dump-db/package.json @@ -4,7 +4,7 @@ "description": "Standalone tool to dump contents of Trilium document.db file into a directory tree of notes", "private": true, "dependencies": { - "better-sqlite3": "12.4.1", + "better-sqlite3": "12.4.6", "mime-types": "3.0.1", "sanitize-filename": "1.6.3", "tsx": "4.20.6", diff --git a/apps/edit-docs/package.json b/apps/edit-docs/package.json index af66c36230..9aa8ebe824 100644 --- a/apps/edit-docs/package.json +++ b/apps/edit-docs/package.json @@ -5,7 +5,7 @@ "description": "Desktop version of Trilium which imports the demo database (presented to new users at start-up) or the user guide and other documentation and saves the modifications for committing.", "dependencies": { "archiver": "7.0.1", - "better-sqlite3": "12.4.1" + "better-sqlite3": "12.4.6" }, "devDependencies": { "@triliumnext/client": "workspace:*", diff --git a/apps/server/docker/package.json b/apps/server/docker/package.json index 73a44e8313..6ed152f94e 100644 --- a/apps/server/docker/package.json +++ b/apps/server/docker/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "better-sqlite3": "12.4.1" + "better-sqlite3": "12.4.6" } } \ No newline at end of file diff --git a/apps/server/package.json b/apps/server/package.json index 97038b99d3..71223bc006 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -25,7 +25,7 @@ "docker-start-rootless-alpine": "pnpm docker-build-rootless-alpine && docker run -p 8081:8080 triliumnext-rootless-alpine" }, "dependencies": { - "better-sqlite3": "12.4.1", + "better-sqlite3": "12.4.6", "html-to-text": "9.0.5", "node-html-parser": "7.0.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d66f9bfa28..b4f904a415 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -369,8 +369,8 @@ importers: specifier: 2.1.3 version: 2.1.3(electron@38.7.1) better-sqlite3: - specifier: 12.4.1 - version: 12.4.1 + specifier: 12.4.6 + version: 12.4.6 electron-debug: specifier: 4.1.0 version: 4.1.0 @@ -433,8 +433,8 @@ importers: apps/dump-db: dependencies: better-sqlite3: - specifier: 12.4.1 - version: 12.4.1 + specifier: 12.4.6 + version: 12.4.6 mime-types: specifier: 3.0.1 version: 3.0.1 @@ -464,8 +464,8 @@ importers: specifier: 7.0.1 version: 7.0.1 better-sqlite3: - specifier: 12.4.1 - version: 12.4.1 + specifier: 12.4.6 + version: 12.4.6 devDependencies: '@triliumnext/client': specifier: workspace:* @@ -489,8 +489,8 @@ importers: apps/server: dependencies: better-sqlite3: - specifier: 12.4.1 - version: 12.4.1 + specifier: 12.4.6 + version: 12.4.6 html-to-text: specifier: 9.0.5 version: 9.0.5 @@ -6342,9 +6342,9 @@ packages: peerDependencies: ajv: 4.11.8 - 8 - better-sqlite3@12.4.1: - resolution: {integrity: sha512-3yVdyZhklTiNrtg+4WqHpJpFDd+WHTg2oM7UcR80GqL05AOV0xEJzc6qNvFYoEtE+hRp1n9MpN6/+4yhlGkDXQ==} - engines: {node: 20.x || 22.x || 23.x || 24.x} + better-sqlite3@12.4.6: + resolution: {integrity: sha512-gaYt9yqTbQ1iOxLpJA8FPR5PiaHP+jlg8I5EX0Rs2KFwNzhBsF40KzMZS5FwelY7RG0wzaucWdqSAJM3uNCPCg==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} bezier-easing@2.1.0: resolution: {integrity: sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==} @@ -15954,8 +15954,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.2.0': dependencies: @@ -16036,8 +16034,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-engine': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-essentials@47.2.0': dependencies: @@ -16169,8 +16165,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 '@ckeditor/ckeditor5-widget': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-html-embed@47.2.0': dependencies: @@ -16587,8 +16581,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-special-characters@47.2.0': dependencies: @@ -21813,7 +21805,7 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 - better-sqlite3@12.4.1: + better-sqlite3@12.4.6: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 From a8e9f7b44522fe26e362c0c7f19be413e001c6f5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 07:08:13 +0000 Subject: [PATCH 107/697] fix(deps): update dependency mime-types to v3.0.2 --- apps/dump-db/package.json | 2 +- apps/server/package.json | 2 +- pnpm-lock.yaml | 32 +++++++++++++------------------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/apps/dump-db/package.json b/apps/dump-db/package.json index 0495eb0388..ccbd400977 100644 --- a/apps/dump-db/package.json +++ b/apps/dump-db/package.json @@ -5,7 +5,7 @@ "private": true, "dependencies": { "better-sqlite3": "12.4.6", - "mime-types": "3.0.1", + "mime-types": "3.0.2", "sanitize-filename": "1.6.3", "tsx": "4.20.6", "yargs": "18.0.0" diff --git a/apps/server/package.json b/apps/server/package.json index 71223bc006..6dcf2820ed 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -104,7 +104,7 @@ "is-svg": "6.1.0", "jimp": "1.6.0", "marked": "17.0.1", - "mime-types": "3.0.1", + "mime-types": "3.0.2", "multer": "2.0.2", "normalize-strings": "1.1.1", "ollama": "0.6.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4f904a415..99da4b5885 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -436,8 +436,8 @@ importers: specifier: 12.4.6 version: 12.4.6 mime-types: - specifier: 3.0.1 - version: 3.0.1 + specifier: 3.0.2 + version: 3.0.2 sanitize-filename: specifier: 1.6.3 version: 1.6.3 @@ -721,8 +721,8 @@ importers: specifier: 17.0.1 version: 17.0.1 mime-types: - specifier: 3.0.1 - version: 3.0.1 + specifier: 3.0.2 + version: 3.0.2 multer: specifier: 2.0.2 version: 2.0.2 @@ -10369,9 +10369,9 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime-types@3.0.1: - resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} - engines: {node: '>= 0.6'} + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} @@ -15719,8 +15719,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15963,8 +15961,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.2.0': dependencies: @@ -15983,8 +15979,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -21381,7 +21375,7 @@ snapshots: accepts@2.0.0: dependencies: - mime-types: 3.0.1 + mime-types: 3.0.2 negotiator: 1.0.0 accessor-fn@1.5.3: {} @@ -24435,7 +24429,7 @@ snapshots: fresh: 2.0.0 http-errors: 2.0.0 merge-descriptors: 2.0.0 - mime-types: 3.0.1 + mime-types: 3.0.2 on-finished: 2.4.1 once: 1.4.0 parseurl: 1.3.3 @@ -27131,7 +27125,7 @@ snapshots: dependencies: mime-db: 1.52.0 - mime-types@3.0.1: + mime-types@3.0.2: dependencies: mime-db: 1.54.0 @@ -29980,7 +29974,7 @@ snapshots: etag: 1.8.1 fresh: 2.0.0 http-errors: 2.0.0 - mime-types: 3.0.1 + mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 @@ -31311,7 +31305,7 @@ snapshots: dependencies: content-type: 1.0.5 media-typer: 1.1.0 - mime-types: 3.0.1 + mime-types: 3.0.2 typed-array-buffer@1.0.3: dependencies: @@ -31879,7 +31873,7 @@ snapshots: dependencies: colorette: 2.0.20 memfs: 4.42.0 - mime-types: 3.0.1 + mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.2 From d7519660786d56226424cb0ed50239371a8e5ccf Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 09:10:41 +0200 Subject: [PATCH 108/697] chore(server/mime): remove mp4 workaround --- apps/server/src/services/import/mime.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/server/src/services/import/mime.ts b/apps/server/src/services/import/mime.ts index 0a129ae1e0..b25e98926d 100644 --- a/apps/server/src/services/import/mime.ts +++ b/apps/server/src/services/import/mime.ts @@ -73,8 +73,7 @@ const EXTENSION_TO_MIME = new Map([ [".ts", "text/x-typescript"], [".excalidraw", "application/json"], [".mermaid", "text/vnd.mermaid"], - [".mmd", "text/vnd.mermaid"], - [".mp4", "video/mp4"] // https://github.com/jshttp/mime-types/issues/138 + [".mmd", "text/vnd.mermaid"] ]); /** @returns false if MIME is not detected */ From 790454f194c8d5ac7b987f280e6103884de4bccb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 07:10:46 +0000 Subject: [PATCH 109/697] chore(deps): update vitest monorepo to v4.0.13 --- _regroup/package.json | 2 +- apps/website/package.json | 2 +- package.json | 8 +- packages/ckeditor5-admonition/package.json | 6 +- packages/ckeditor5-footnotes/package.json | 6 +- .../ckeditor5-keyboard-marker/package.json | 6 +- packages/ckeditor5-math/package.json | 6 +- packages/ckeditor5-mermaid/package.json | 6 +- pnpm-lock.yaml | 240 +++++++++--------- 9 files changed, 146 insertions(+), 136 deletions(-) diff --git a/_regroup/package.json b/_regroup/package.json index b6a98a2902..2875c903c5 100644 --- a/_regroup/package.json +++ b/_regroup/package.json @@ -40,7 +40,7 @@ "@types/express": "5.0.5", "@types/node": "24.10.1", "@types/yargs": "17.0.35", - "@vitest/coverage-v8": "4.0.12", + "@vitest/coverage-v8": "4.0.13", "eslint": "9.39.1", "eslint-plugin-simple-import-sort": "12.1.1", "esm": "3.2.25", diff --git a/apps/website/package.json b/apps/website/package.json index 6f5c81858e..aea8a520f1 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -23,7 +23,7 @@ "typescript": "5.9.3", "user-agent-data-types": "0.4.2", "vite": "7.2.4", - "vitest": "4.0.12" + "vitest": "4.0.13" }, "eslintConfig": { "extends": "preact" diff --git a/package.json b/package.json index c69db6253f..0b68b16f1b 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,9 @@ "@triliumnext/server": "workspace:*", "@types/express": "5.0.5", "@types/node": "24.10.1", - "@vitest/browser-webdriverio": "4.0.12", - "@vitest/coverage-v8": "4.0.12", - "@vitest/ui": "4.0.12", + "@vitest/browser-webdriverio": "4.0.13", + "@vitest/coverage-v8": "4.0.13", + "@vitest/ui": "4.0.13", "chalk": "5.6.2", "cross-env": "10.1.0", "dpdm": "3.14.0", @@ -68,7 +68,7 @@ "upath": "2.0.1", "vite": "7.2.4", "vite-plugin-dts": "~4.5.0", - "vitest": "4.0.12" + "vitest": "4.0.13" }, "license": "AGPL-3.0-only", "author": { diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index ba46d61f47..a0babdad96 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -26,8 +26,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.12", - "@vitest/coverage-istanbul": "4.0.12", + "@vitest/browser": "4.0.13", + "@vitest/coverage-istanbul": "4.0.13", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -38,7 +38,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.12", + "vitest": "4.0.13", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 4a14f5f7ae..a61a8cf197 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -27,8 +27,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.12", - "@vitest/coverage-istanbul": "4.0.12", + "@vitest/browser": "4.0.13", + "@vitest/coverage-istanbul": "4.0.13", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -39,7 +39,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.12", + "vitest": "4.0.13", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index 82069dc9e4..1385ba6050 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -29,8 +29,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.12", - "@vitest/coverage-istanbul": "4.0.12", + "@vitest/browser": "4.0.13", + "@vitest/coverage-istanbul": "4.0.13", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -41,7 +41,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.12", + "vitest": "4.0.13", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 537260c27e..fad4a8ae7f 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -30,8 +30,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.12", - "@vitest/coverage-istanbul": "4.0.12", + "@vitest/browser": "4.0.13", + "@vitest/coverage-istanbul": "4.0.13", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -42,7 +42,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.12", + "vitest": "4.0.13", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index 2d637efc5a..0b3b856499 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -29,8 +29,8 @@ "@ckeditor/ckeditor5-package-tools": "5.0.1", "@typescript-eslint/eslint-plugin": "~8.47.0", "@typescript-eslint/parser": "8.47.0", - "@vitest/browser": "4.0.12", - "@vitest/coverage-istanbul": "4.0.12", + "@vitest/browser": "4.0.13", + "@vitest/coverage-istanbul": "4.0.13", "ckeditor5": "47.2.0", "eslint": "9.39.1", "eslint-config-ckeditor5": ">=9.1.0", @@ -41,7 +41,7 @@ "ts-node": "10.9.2", "typescript": "5.9.3", "vite-plugin-svgo": "~2.0.0", - "vitest": "4.0.12", + "vitest": "4.0.13", "webdriverio": "9.20.1" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4dbec78546..d27bf175c0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,14 +56,14 @@ importers: specifier: 24.10.1 version: 24.10.1 '@vitest/browser-webdriverio': - specifier: 4.0.12 - version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.0.13 + version: 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': - specifier: 4.0.12 - version: 4.0.12(@vitest/browser@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12))(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(@vitest/browser@4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13))(vitest@4.0.13) '@vitest/ui': - specifier: 4.0.12 - version: 4.0.12(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(vitest@4.0.13) chalk: specifier: 5.6.2 version: 5.6.2 @@ -128,8 +128,8 @@ importers: specifier: ~4.5.0 version: 4.5.4(@types/node@24.10.1)(rollup@4.52.0)(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.12 - version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.13 + version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -839,8 +839,8 @@ importers: specifier: 7.2.4 version: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: - specifier: 4.0.12 - version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.13 + version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -894,11 +894,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.12 - version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13) '@vitest/coverage-istanbul': - specifier: 4.0.12 - version: 4.0.12(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(vitest@4.0.13) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -930,8 +930,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.12 - version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.13 + version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -954,11 +954,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.12 - version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13) '@vitest/coverage-istanbul': - specifier: 4.0.12 - version: 4.0.12(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(vitest@4.0.13) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -990,8 +990,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.12 - version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.13 + version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1014,11 +1014,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.12 - version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13) '@vitest/coverage-istanbul': - specifier: 4.0.12 - version: 4.0.12(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(vitest@4.0.13) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1050,8 +1050,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.12 - version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.13 + version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1081,11 +1081,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.12 - version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13) '@vitest/coverage-istanbul': - specifier: 4.0.12 - version: 4.0.12(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(vitest@4.0.13) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1117,8 +1117,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.12 - version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.13 + version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1148,11 +1148,11 @@ importers: specifier: 8.47.0 version: 8.47.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': - specifier: 4.0.12 - version: 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13) '@vitest/coverage-istanbul': - specifier: 4.0.12 - version: 4.0.12(vitest@4.0.12) + specifier: 4.0.13 + version: 4.0.13(vitest@4.0.13) ckeditor5: specifier: 47.2.0 version: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) @@ -1184,8 +1184,8 @@ importers: specifier: ~2.0.0 version: 2.0.0(typescript@5.9.3)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vitest: - specifier: 4.0.12 - version: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + specifier: 4.0.13 + version: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: specifier: 9.20.1 version: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -5744,36 +5744,36 @@ packages: resolution: {integrity: sha512-ir6xo6HLy3TVn4lVJ+9fOOcq8vvgMmcXoSP/mM+l1CTKKJmd0hzXqNkZ1CYyz7PiRhLPUC6fprmUuA7rnVC87g==} engines: {node: '>=16'} - '@vitest/browser-webdriverio@4.0.12': - resolution: {integrity: sha512-Z9aiTXwI9wqocxE6pnZRoC+lypbFVfOGUYGhUnlRDQx4DGYRUgWhHwQvBGiLLAOrJdWERkrcRdp+Keu9G2VdDA==} + '@vitest/browser-webdriverio@4.0.13': + resolution: {integrity: sha512-eDKpZx3Y6ciiOrO+ZVdAd2p7vwfG/amN1Sp6lkQPoGpD2kxNcgP0MpfoV0gE9p6WAauyuwEH6lO64cmivRu6Pw==} peerDependencies: - vitest: 4.0.12 + vitest: 4.0.13 webdriverio: '*' - '@vitest/browser@4.0.12': - resolution: {integrity: sha512-8zE2ksJ7V4B7Mc++L6rBRZOZHnE/f9URvj7oLYKIS5wcDaSi6EhfalN0EG6+R/OlTYZarbK6RqmhKDLYNC9KfQ==} + '@vitest/browser@4.0.13': + resolution: {integrity: sha512-lruSgrYPVAJzKmX6EJYCg9nY+0A4VkeTLpTzf1jRD/XMjNbzD9yy7D499xmVKglwJczANYJXBvZSPGcRlon+0w==} peerDependencies: - vitest: 4.0.12 + vitest: 4.0.13 - '@vitest/coverage-istanbul@4.0.12': - resolution: {integrity: sha512-2cdoONLhTCxAxbQmjeiguupFSSyVSMKWXmPOAffUGzAnH3uPMigX5Mf2F8fUuciKo0WxM6vdSucA9K7qxRTFwA==} + '@vitest/coverage-istanbul@4.0.13': + resolution: {integrity: sha512-bkoHarZBdrLDMLEQV3AJ+wcD3cETOLCjZrKO+nA4IbIY74uPPJ2pT7CEvdp8OF5AR5NNSYyafn6kAXTJBbDAaA==} peerDependencies: - vitest: 4.0.12 + vitest: 4.0.13 - '@vitest/coverage-v8@4.0.12': - resolution: {integrity: sha512-d+w9xAFJJz6jyJRU4BUU7MH409Ush7FWKNkxJU+jASKg6WX33YT0zc+YawMR1JesMWt9QRFQY/uAD3BTn23FaA==} + '@vitest/coverage-v8@4.0.13': + resolution: {integrity: sha512-w77N6bmtJ3CFnL/YHiYotwW/JI3oDlR3K38WEIqegRfdMSScaYxwYKB/0jSNpOTZzUjQkG8HHEz4sdWQMWpQ5g==} peerDependencies: - '@vitest/browser': 4.0.12 - vitest: 4.0.12 + '@vitest/browser': 4.0.13 + vitest: 4.0.13 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.0.12': - resolution: {integrity: sha512-is+g0w8V3/ZhRNrRizrJNr8PFQKwYmctWlU4qg8zy5r9aIV5w8IxXLlfbbxJCwSpsVl2PXPTm2/zruqTqz3QSg==} + '@vitest/expect@4.0.13': + resolution: {integrity: sha512-zYtcnNIBm6yS7Gpr7nFTmq8ncowlMdOJkWLqYvhr/zweY6tFbDkDi8BPPOeHxEtK1rSI69H7Fd4+1sqvEGli6w==} - '@vitest/mocker@4.0.12': - resolution: {integrity: sha512-GsmA/tD5Ht3RUFoz41mZsMU1AXch3lhmgbTnoSPTdH231g7S3ytNN1aU0bZDSyxWs8WA7KDyMPD5L4q6V6vj9w==} + '@vitest/mocker@4.0.13': + resolution: {integrity: sha512-eNCwzrI5djoauklwP1fuslHBjrbR8rqIVbvNlAnkq1OTa6XT+lX68mrtPirNM9TnR69XUPt4puBCx2Wexseylg==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -5783,25 +5783,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.0.12': - resolution: {integrity: sha512-R7nMAcnienG17MvRN8TPMJiCG8rrZJblV9mhT7oMFdBXvS0x+QD6S1G4DxFusR2E0QIS73f7DqSR1n87rrmE+g==} + '@vitest/pretty-format@4.0.13': + resolution: {integrity: sha512-ooqfze8URWbI2ozOeLDMh8YZxWDpGXoeY3VOgcDnsUxN0jPyPWSUvjPQWqDGCBks+opWlN1E4oP1UYl3C/2EQA==} - '@vitest/runner@4.0.12': - resolution: {integrity: sha512-hDlCIJWuwlcLumfukPsNfPDOJokTv79hnOlf11V+n7E14rHNPz0Sp/BO6h8sh9qw4/UjZiKyYpVxK2ZNi+3ceQ==} + '@vitest/runner@4.0.13': + resolution: {integrity: sha512-9IKlAru58wcVaWy7hz6qWPb2QzJTKt+IOVKjAx5vb5rzEFPTL6H4/R9BMvjZ2ppkxKgTrFONEJFtzvnyEpiT+A==} - '@vitest/snapshot@4.0.12': - resolution: {integrity: sha512-2jz9zAuBDUSbnfyixnyOd1S2YDBrZO23rt1bicAb6MA/ya5rHdKFRikPIDpBj/Dwvh6cbImDmudegnDAkHvmRQ==} + '@vitest/snapshot@4.0.13': + resolution: {integrity: sha512-hb7Usvyika1huG6G6l191qu1urNPsq1iFc2hmdzQY3F5/rTgqQnwwplyf8zoYHkpt7H6rw5UfIw6i/3qf9oSxQ==} - '@vitest/spy@4.0.12': - resolution: {integrity: sha512-GZjI9PPhiOYNX8Nsyqdw7JQB+u0BptL5fSnXiottAUBHlcMzgADV58A7SLTXXQwcN1yZ6gfd1DH+2bqjuUlCzw==} + '@vitest/spy@4.0.13': + resolution: {integrity: sha512-hSu+m4se0lDV5yVIcNWqjuncrmBgwaXa2utFLIrBkQCQkt+pSwyZTPFQAZiiF/63j8jYa8uAeUZ3RSfcdWaYWw==} - '@vitest/ui@4.0.12': - resolution: {integrity: sha512-RCqeApCnbwd5IFvxk6OeKMXTvzHU/cVqY8HAW0gWk0yAO6wXwQJMKhDfDtk2ss7JCy9u7RNC3kyazwiaDhBA/g==} + '@vitest/ui@4.0.13': + resolution: {integrity: sha512-MFV6GhTflgBj194+vowTB2iLI5niMZhqiW7/NV7U4AfWbX/IAtsq4zA+gzCLyGzpsQUdJlX26hrQ1vuWShq2BQ==} peerDependencies: - vitest: 4.0.12 + vitest: 4.0.13 - '@vitest/utils@4.0.12': - resolution: {integrity: sha512-DVS/TLkLdvGvj1avRy0LSmKfrcI9MNFvNGN6ECjTUHWJdlcgPDOXhjMis5Dh7rBH62nAmSXnkPbE+DZ5YD75Rw==} + '@vitest/utils@4.0.13': + resolution: {integrity: sha512-ydozWyQ4LZuu8rLp47xFUWis5VOKMdHjXCWhs1LuJsTNKww+pTHQNK4e0assIB9K80TxFyskENL6vCu3j34EYA==} '@volar/language-core@2.4.13': resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} @@ -14386,8 +14386,8 @@ packages: yaml: optional: true - vitest@4.0.12: - resolution: {integrity: sha512-pmW4GCKQ8t5Ko1jYjC3SqOr7TUKN7uHOHB/XGsAIb69eYu6d1ionGSsb5H9chmPf+WeXt0VE7jTXsB1IvWoNbw==} + vitest@4.0.13: + resolution: {integrity: sha512-QSD4I0fN6uZQfftryIXuqvqgBxTvJ3ZNkF6RWECd82YGAYAfhcppBLFXzXJHQAAhVFyYEuFTrq6h0hQqjB7jIQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: @@ -14395,10 +14395,10 @@ packages: '@opentelemetry/api': ^1.9.0 '@types/debug': ^4.1.12 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.12 - '@vitest/browser-preview': 4.0.12 - '@vitest/browser-webdriverio': 4.0.12 - '@vitest/ui': 4.0.12 + '@vitest/browser-playwright': 4.0.13 + '@vitest/browser-preview': 4.0.13 + '@vitest/browser-webdriverio': 4.0.13 + '@vitest/ui': 4.0.13 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -15754,6 +15754,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15987,6 +15989,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.2.0': dependencies: @@ -16014,6 +16018,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16036,6 +16042,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.2.0': dependencies: @@ -16061,6 +16069,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-engine': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-essentials@47.2.0': dependencies: @@ -21099,10 +21109,10 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) - vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/browser': 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13) + vitest: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) webdriverio: 9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21110,16 +21120,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)': + '@vitest/browser@4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13)': dependencies: - '@vitest/mocker': 4.0.12(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/utils': 4.0.12 + '@vitest/mocker': 4.0.13(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/utils': 4.0.13 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21127,7 +21137,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-istanbul@4.0.12(vitest@4.0.12)': + '@vitest/coverage-istanbul@4.0.13(vitest@4.0.13)': dependencies: '@istanbuljs/schema': 0.1.3 debug: 4.4.3(supports-color@6.0.0) @@ -21138,14 +21148,14 @@ snapshots: istanbul-reports: 3.2.0 magicast: 0.5.1 tinyrainbow: 3.0.3 - vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.12(@vitest/browser@4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12))(vitest@4.0.12)': + '@vitest/coverage-v8@4.0.13(@vitest/browser@4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13))(vitest@4.0.13)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.0.12 + '@vitest/utils': 4.0.13 ast-v8-to-istanbul: 0.3.8 debug: 4.4.3(supports-color@6.0.0) istanbul-lib-coverage: 3.2.2 @@ -21155,61 +21165,61 @@ snapshots: magicast: 0.5.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12) + '@vitest/browser': 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13) transitivePeerDependencies: - supports-color - '@vitest/expect@4.0.12': + '@vitest/expect@4.0.13': dependencies: '@standard-schema/spec': 1.0.0 '@types/chai': 5.2.2 - '@vitest/spy': 4.0.12 - '@vitest/utils': 4.0.12 + '@vitest/spy': 4.0.13 + '@vitest/utils': 4.0.13 chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.12(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.13(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.12 + '@vitest/spy': 4.0.13 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.5(@types/node@24.10.1)(typescript@5.9.3) vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/pretty-format@4.0.12': + '@vitest/pretty-format@4.0.13': dependencies: tinyrainbow: 3.0.3 - '@vitest/runner@4.0.12': + '@vitest/runner@4.0.13': dependencies: - '@vitest/utils': 4.0.12 + '@vitest/utils': 4.0.13 pathe: 2.0.3 - '@vitest/snapshot@4.0.12': + '@vitest/snapshot@4.0.13': dependencies: - '@vitest/pretty-format': 4.0.12 + '@vitest/pretty-format': 4.0.13 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.0.12': {} + '@vitest/spy@4.0.13': {} - '@vitest/ui@4.0.12(vitest@4.0.12)': + '@vitest/ui@4.0.13(vitest@4.0.13)': dependencies: - '@vitest/utils': 4.0.12 + '@vitest/utils': 4.0.13 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) + vitest: 4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/utils@4.0.12': + '@vitest/utils@4.0.13': dependencies: - '@vitest/pretty-format': 4.0.12 + '@vitest/pretty-format': 4.0.13 tinyrainbow: 3.0.3 '@volar/language-core@2.4.13': @@ -31744,15 +31754,15 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vitest@4.0.12(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.12)(@vitest/ui@4.0.12)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.13(@opentelemetry/api@1.9.0)(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser-webdriverio@4.0.13)(@vitest/ui@4.0.13)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.12 - '@vitest/mocker': 4.0.12(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.12 - '@vitest/runner': 4.0.12 - '@vitest/snapshot': 4.0.12 - '@vitest/spy': 4.0.12 - '@vitest/utils': 4.0.12 + '@vitest/expect': 4.0.13 + '@vitest/mocker': 4.0.13(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.13 + '@vitest/runner': 4.0.13 + '@vitest/snapshot': 4.0.13 + '@vitest/spy': 4.0.13 + '@vitest/utils': 4.0.13 debug: 4.4.3(supports-color@6.0.0) es-module-lexer: 1.7.0 expect-type: 1.2.2 @@ -31770,8 +31780,8 @@ snapshots: '@opentelemetry/api': 1.9.0 '@types/debug': 4.1.12 '@types/node': 24.10.1 - '@vitest/browser-webdriverio': 4.0.12(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.12)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) - '@vitest/ui': 4.0.12(vitest@4.0.12) + '@vitest/browser-webdriverio': 4.0.13(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.1)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@4.0.13)(webdriverio@9.20.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/ui': 4.0.13(vitest@4.0.13) happy-dom: 20.0.10 jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: From 66cc739bb2adb16fa1c6ba0e7152b48ef76e5284 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 22 Nov 2025 07:12:56 +0000 Subject: [PATCH 110/697] chore(deps): update dependency @anthropic-ai/sdk to v0.70.1 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 1da6d1ab7e..b7178714ed 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -30,7 +30,7 @@ "node-html-parser": "7.0.1" }, "devDependencies": { - "@anthropic-ai/sdk": "0.70.0", + "@anthropic-ai/sdk": "0.70.1", "@braintree/sanitize-url": "7.1.1", "@electron/remote": "2.1.3", "@preact/preset-vite": "2.10.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4dbec78546..5f54138a36 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -499,8 +499,8 @@ importers: version: 7.0.1 devDependencies: '@anthropic-ai/sdk': - specifier: 0.70.0 - version: 0.70.0(zod@4.1.12) + specifier: 0.70.1 + version: 0.70.1(zod@4.1.12) '@braintree/sanitize-url': specifier: 7.1.1 version: 7.1.1 @@ -1439,8 +1439,8 @@ packages: '@antfu/utils@9.2.0': resolution: {integrity: sha512-Oq1d9BGZakE/FyoEtcNeSwM7MpDO2vUBi11RWBZXf75zPsbUVWmUs03EqkRFrcgbXyKTas0BdZWC1wcuSoqSAw==} - '@anthropic-ai/sdk@0.70.0': - resolution: {integrity: sha512-FYIuhF/lSCa+pgtaMGgsTF14aOIiWtBnu3azXITDOELv6yxsDNJwcjjt+Zr7vwyuTUjZJE/YL7s9m5r1jXkoeQ==} + '@anthropic-ai/sdk@0.70.1': + resolution: {integrity: sha512-AGEhifuvE22VxfQ5ROxViTgM8NuVQzEvqcN8bttR4AP24ythmNE/cL/SrOz79xiv7/osrsmCyErjsistJi7Z8A==} hasBin: true peerDependencies: zod: ^3.25.0 || ^4.0.0 @@ -14933,7 +14933,7 @@ snapshots: '@antfu/utils@9.2.0': {} - '@anthropic-ai/sdk@0.70.0(zod@4.1.12)': + '@anthropic-ai/sdk@0.70.1(zod@4.1.12)': dependencies: json-schema-to-ts: 3.1.1 optionalDependencies: @@ -15754,6 +15754,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.2.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -15996,6 +15998,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.2.0': dependencies: @@ -16014,6 +16018,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.2.0': dependencies: @@ -16036,6 +16042,8 @@ snapshots: '@ckeditor/ckeditor5-table': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-emoji@47.2.0': dependencies: @@ -16520,6 +16528,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.2.0 '@ckeditor/ckeditor5-utils': 47.2.0 ckeditor5: 47.2.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-restricted-editing@47.2.0': dependencies: From 135ce2285d74a3aa4df7f9bca71c096a0479c53f Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 09:45:08 +0200 Subject: [PATCH 111/697] feat(collections): don't load all collection types at once --- .../src/widgets/collections/NoteList.tsx | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index bd007a40fd..1f64279785 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -2,20 +2,12 @@ import { allViewTypes, ViewModeMedia, ViewModeProps, ViewTypeOptions } from "./i import { useNoteContext, useNoteLabel, useNoteLabelBoolean, useTriliumEvent } from "../react/hooks"; import FNote from "../../entities/fnote"; import "./NoteList.css"; -import { ListView, GridView } from "./legacy/ListOrGridView"; import { useEffect, useRef, useState } from "preact/hooks"; -import GeoView from "./geomap"; import ViewModeStorage from "./view_mode_storage"; -import CalendarView from "./calendar"; -import TableView from "./table"; -import BoardView from "./board"; import { subscribeToMessages, unsubscribeToMessage as unsubscribeFromMessage } from "../../services/ws"; import { WebSocketMessage } from "@triliumnext/commons"; import froca from "../../services/froca"; -import PresentationView from "./presentation"; -import { ListPrintView } from "./legacy/ListPrintView"; -import TablePrintView from "./table/TablePrintView"; - +import { lazy, Suspense } from "preact/compat"; interface NoteListProps { note: FNote | null | undefined; notePath: string | null | undefined; @@ -94,11 +86,15 @@ export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePa } } + const ComponentToRender = viewType && props && isEnabled && getComponentByViewType(viewType, props); + return (
        - {props && isEnabled && ( + {ComponentToRender && props && (
        - {getComponentByViewType(viewType, props)} + + +
        )}
        @@ -109,26 +105,26 @@ function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps< switch (viewType) { case "list": if (props.media !== "print") { - return ; + return lazy(() => import("./legacy/ListOrGridView.js").then(i => i.ListView)); } else { - return ; + return lazy(() => import("./legacy/ListPrintView.js").then(i => i.ListPrintView)); } case "grid": - return ; + return lazy(() => import("./legacy/ListOrGridView.js").then(i => i.GridView)); case "geoMap": - return ; + return lazy(() => import("./geomap/index.js")); case "calendar": - return ; + return lazy(() => import("./calendar/index.js")); case "table": if (props.media !== "print") { - return ; + return lazy(() => import("./table/index.js")); } else { - return ; + return lazy(() => import("./table/TablePrintView.js")); } case "board": - return + return lazy(() => import("./board/index.js")); case "presentation": - return + return lazy(() => import("./presentation/index.js")); } } From 494bd425afd4e12bcdb019177896df3126a374cb Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 10:13:46 +0200 Subject: [PATCH 112/697] feat(print): avoid error message for print job cancelled --- apps/server/src/services/window.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/src/services/window.ts b/apps/server/src/services/window.ts index 626ab851f0..4431226ab3 100644 --- a/apps/server/src/services/window.ts +++ b/apps/server/src/services/window.ts @@ -82,7 +82,7 @@ interface ExportAsPdfOpts { electron.ipcMain.on("print-note", async (e, { notePath }: PrintOpts) => { const browserWindow = await getBrowserWindowForPrinting(e, notePath, "printing"); browserWindow.webContents.print({}, (success, failureReason) => { - if (!success) { + if (!success && failureReason !== "Print job canceled") { electron.dialog.showErrorBox(t("pdf.unable-to-print"), failureReason); } e.sender.send("print-done"); From 6692de33b1ecc70622ad90f77346f366af0ec1ba Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 10:49:46 +0200 Subject: [PATCH 113/697] fix(sidebar): not displayed if items are enabled from the start --- apps/client/src/widgets/containers/right_pane_container.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/containers/right_pane_container.ts b/apps/client/src/widgets/containers/right_pane_container.ts index 84875bec18..1c88f36959 100644 --- a/apps/client/src/widgets/containers/right_pane_container.ts +++ b/apps/client/src/widgets/containers/right_pane_container.ts @@ -5,6 +5,7 @@ import type { EventData, EventNames } from "../../components/app_context.js"; export default class RightPaneContainer extends FlexContainer { private rightPaneHidden: boolean; + private firstRender: boolean; constructor() { super("column"); @@ -14,6 +15,7 @@ export default class RightPaneContainer extends FlexContainer this.collapsible(); this.rightPaneHidden = false; + this.firstRender = true; } isEnabled() { @@ -41,10 +43,11 @@ export default class RightPaneContainer extends FlexContainer const oldToggle = !this.isHiddenInt(); const newToggle = this.isEnabled(); - if (oldToggle !== newToggle) { + if (oldToggle !== newToggle || this.firstRender) { this.toggleInt(newToggle); splitService.setupRightPaneResizer(); + this.firstRender = false; } } From 5fc10fe0414738dfce22b9f3ab3cb18f740c1c48 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 10:51:48 +0200 Subject: [PATCH 114/697] chore(react/sidebar): basic right panel widget implementation --- apps/client/src/layouts/desktop_layout.tsx | 1 + .../src/widgets/sidebar/RightPanelWidget.tsx | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 apps/client/src/widgets/sidebar/RightPanelWidget.tsx diff --git a/apps/client/src/layouts/desktop_layout.tsx b/apps/client/src/layouts/desktop_layout.tsx index 17c77f8d8c..cbce8fb18a 100644 --- a/apps/client/src/layouts/desktop_layout.tsx +++ b/apps/client/src/layouts/desktop_layout.tsx @@ -44,6 +44,7 @@ import UploadAttachmentsDialog from "../widgets/dialogs/upload_attachments.js"; import utils from "../services/utils.js"; import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js"; import NoteDetail from "../widgets/NoteDetail.jsx"; +import RightPanelWidget from "../widgets/sidebar/RightPanelWidget.jsx"; export default class DesktopLayout { diff --git a/apps/client/src/widgets/sidebar/RightPanelWidget.tsx b/apps/client/src/widgets/sidebar/RightPanelWidget.tsx new file mode 100644 index 0000000000..94a5cf04c4 --- /dev/null +++ b/apps/client/src/widgets/sidebar/RightPanelWidget.tsx @@ -0,0 +1,33 @@ +import { useContext, useRef } from "preact/hooks"; +import { ParentComponent } from "../react/react_utils"; +import { ComponentChildren } from "preact"; + +interface RightPanelWidgetProps { + title: string; + children: ComponentChildren; + buttons?: ComponentChildren; +} + +export default function RightPanelWidget({ title, buttons, children }: RightPanelWidgetProps) { + const containerRef = useRef(null); + const parentComponent = useContext(ParentComponent); + + if (parentComponent) { + parentComponent.initialized = Promise.resolve(); + } + + return ( +
        +
        +
        {title}
        +
        {buttons}
        +
        + +
        +
        + {children} +
        +
        +
        + ); +} From 7daee36d3ed684d0a93cad08b00ee3c786925a65 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 10:59:50 +0200 Subject: [PATCH 115/697] fix(toc): table of contents not rendering for doc notes --- apps/client/src/widgets/toc.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/toc.ts b/apps/client/src/widgets/toc.ts index a58ea2fa73..49e311149a 100644 --- a/apps/client/src/widgets/toc.ts +++ b/apps/client/src/widgets/toc.ts @@ -199,6 +199,7 @@ export default class TocWidget extends RightPanelWidget { * For document note types, we obtain the content directly from the DOM since it allows us to obtain processed data without * requesting data twice. However, when immediately navigating to a new note the new document is not yet attached to the hierarchy, * resulting in an empty TOC. The fix is to simply wait for it to pop up. + * TODO: Use a better method that is not prone to unnecessary delays and race conditions. */ setTimeout(async () => { const $contentEl = await this.noteContext?.getContentElement(); @@ -209,7 +210,7 @@ export default class TocWidget extends RightPanelWidget { } else { console.warn("Unable to get content element for doctype"); } - }, 10); + }, 250); } } From 664d28f1054b4e598aa7cd71b16f852ab63076a7 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 11:03:00 +0200 Subject: [PATCH 116/697] docs(scripting): remove workaround for sidebar visibility --- .../Notes/Printing & Exporting as PDF.html | 61 +++++++++---------- .../Custom Widgets/Right pane widget.html | 20 +++--- .../Developer Guide/Documentation.md | 2 +- docs/User Guide/!!!meta.json | 22 +++---- .../Custom Widgets/Right pane widget.md | 17 ++++-- 5 files changed, 65 insertions(+), 57 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html index 2e3b2c92cf..744d1d5e5d 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html @@ -4,6 +4,7 @@
        Screenshot of the note contextual menu indicating the “Export as PDF” option.
        +

        Printing

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

        @@ -59,9 +60,9 @@ class="admonition note"> orientation, size. However, there are a few Attributes to adjust some of the settings:

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

        Since v0.100.0, it is possible to print more than one note at the time by using Collections:

          -
        1. First create a collection.
        2. -
        3. Configure it to use List View.
        4. -
        5. Print the collection note normally.
        6. +
        7. First create a collection.
        8. +
        9. Configure it to use List View.
        10. +
        11. Print the collection note normally.

        The resulting collection will contain all the children of the collection, while maintaining the hierarchy.

        @@ -86,9 +86,9 @@ class="admonition note"> href="#root/_help_4TIF1oA4VQRO">Options and assigning a key combination for:

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

        Constraints & limitations

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

          -
        • For Code notes: +
        • For Code notes:
            -
          • Line numbers are not printed.
          • -
          • Syntax highlighting is enabled, however a default theme (Visual Studio) +
          • Line numbers are not printed.
          • +
          • Syntax highlighting is enabled, however a default theme (Visual Studio) is enforced.
        • -
        • For Collections, +
        • For Collections, the following are supported:
            -
          • List View, allowing +
          • List View, allowing to print multiple notes at once while preserving hierarchy (similar to a book).
          • -
          • Presentation, +
          • Presentation, where each slide/sub-note is displayed.
          • -
          • Table, - where the table is rendered in a print-friendly way. +
          • Table, where the + table is rendered in a print-friendly way.
              -
            • Tables that are too complex (especially if they have multiple columns) +
            • Tables that are too complex (especially if they have multiple columns) might not fit properly, however tables with a large number of rows are - supported thanks to pagination. 
            • -
            • Consider printing in landscape mode, or using #printLandscape if + supported thanks to pagination.
            • +
            • Consider printing in landscape mode, or using #printLandscape if exporting to PDF.
          • -
          • The rest of the collections are not supported, but we plan to add support +
          • The rest of the collections are not supported, but we plan to add support for all the collection types at some point.
        • -
        • Using Custom app-wide CSS for +
        • Using Custom app-wide CSS for printing is not longer supported, due to a more stable but isolated mechanism.
            -
          • We plan to introduce a new mechanism specifically for a print CSS.
          • +
          • We plan to introduce a new mechanism specifically for a print CSS.
        @@ -139,10 +139,10 @@ class="admonition note"> printing.

        To do so:

          -
        • Create a CSS code note.
        • -
        • On the note being printed, apply the ~printCss relation to +
        • Create a CSS code note.
        • +
        • On the note being printed, apply the ~printCss relation to point to the newly created CSS code note.
        • -
        • To apply the CSS to multiple notes, consider using inheritable attributes or  +
        • To apply the CSS to multiple notes, consider using inheritable attributes or  Templates.
        @@ -153,13 +153,12 @@ class="admonition note"> }

        To remark:

          -
        • Multiple CSS notes can be add by using multiple ~printCss relations.
        • -
        • If the note pointing to the printCss doesn't have the right +
        • Multiple CSS notes can be add by using multiple ~printCss relations.
        • +
        • If the note pointing to the printCss doesn't have the right note type or mime type, it will be ignored.
        • -
        • If migrating from a previous version where Custom app-wide CSS, there's no need for @media print {  since - the style-sheet is used only for printing.
        • +
        • If migrating from a previous version where Custom app-wide CSS, there's no need for @media print {  since + the style-sheet is used only for printing.

        Under the hood

        Both printing and exporting as PDF use the same mechanism: a note is rendered diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html index 27437786ff..e4706e317a 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.html @@ -1,12 +1,13 @@

          -
        • doRender must not be overridden, instead doRenderBody() has +
        • doRender must not be overridden, instead doRenderBody() has to be overridden.
            -
          • doRenderBody can optionally be async.
          • +
          • doRenderBody can optionally be async.
        • -
        • parentWidget() must be set to “rightPane”.
        • -
        • widgetTitle() getter can optionally be overriden, otherwise +
        • parentWidget() must be set to “rightPane”.
        • +
        • widgetTitle() getter can optionally be overriden, otherwise the widget will be displayed as “Untitled widget”.
        const template = `<div>Hi</div>`;
         
        @@ -23,12 +24,13 @@ class ToDoListWidget extends api.RightPanelWidget {
             }   
             
             async refreshWithNote(note) {
        -        this.toggleInt(false);                
        -        this.triggerCommand("reEvaluateRightPaneVisibility");
        -        this.toggleInt(true);
        -        this.triggerCommand("reEvaluateRightPaneVisibility");
        +    	// Do something when the note changes.
             }
         }
         
         module.exports = new ToDoListWidget();
        -

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

        \ No newline at end of file +

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

        +

        Conditionally changing visibility

        +

        In refreshWithNote:

        const visible = true;	// replace with your own visibility logic
        +this.toggleInt(visible);
        +this.triggerCommand("reEvaluateRightPaneVisibility");
        \ 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 6e7ea215f1..f891e39c93 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/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index 014f86614f..9932db6beb 100644 --- a/docs/User Guide/!!!meta.json +++ b/docs/User Guide/!!!meta.json @@ -4104,31 +4104,38 @@ { "type": "relation", "name": "internalLink", - "value": "AlhDUqhENtH7", + "value": "2FvYrpmOXm29", "isInheritable": false, "position": 100 }, { "type": "relation", "name": "internalLink", - "value": "bwZpz2ajCEwO", + "value": "AlhDUqhENtH7", "isInheritable": false, "position": 110 }, { "type": "relation", "name": "internalLink", - "value": "KC1HB96bqqHX", + "value": "bwZpz2ajCEwO", "isInheritable": false, "position": 120 }, { "type": "relation", "name": "internalLink", - "value": "0ESUbbAxVnoK", + "value": "KC1HB96bqqHX", "isInheritable": false, "position": 130 }, + { + "type": "relation", + "name": "internalLink", + "value": "0ESUbbAxVnoK", + "isInheritable": false, + "position": 140 + }, { "type": "label", "name": "iconClass", @@ -4142,13 +4149,6 @@ "value": "printing-and-pdf-export", "isInheritable": false, "position": 110 - }, - { - "type": "relation", - "name": "internalLink", - "value": "2FvYrpmOXm29", - "isInheritable": false, - "position": 140 } ], "format": "markdown", diff --git a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md index 7a8cf8cd49..e64364fc8d 100644 --- a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md +++ b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget.md @@ -20,14 +20,21 @@ class ToDoListWidget extends api.RightPanelWidget { } async refreshWithNote(note) { - this.toggleInt(false); - this.triggerCommand("reEvaluateRightPaneVisibility"); - this.toggleInt(true); - this.triggerCommand("reEvaluateRightPaneVisibility"); + // Do something when the note changes. } } module.exports = new ToDoListWidget(); ``` -The implementation is in `src/public/app/widgets/right_panel_widget.js`. \ No newline at end of file +The implementation is in `src/public/app/widgets/right_panel_widget.js`. + +## Conditionally changing visibility + +In `refreshWithNote`: + +``` +const visible = true; // replace with your own visibility logic +this.toggleInt(visible); +this.triggerCommand("reEvaluateRightPaneVisibility"); +``` \ No newline at end of file From c76f368fa0ea4af5c7a6dacbb32bf8ad75b89728 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 11:21:51 +0200 Subject: [PATCH 117/697] fix(text): classic toolbar sometimes not showing --- apps/client/src/components/app_context.ts | 1 + .../src/widgets/ribbon/FormattingToolbar.tsx | 19 ++++++++++-- .../type_widgets/text/EditableText.tsx | 30 +------------------ 3 files changed, 18 insertions(+), 32 deletions(-) diff --git a/apps/client/src/components/app_context.ts b/apps/client/src/components/app_context.ts index c73fe5a425..bda3536da8 100644 --- a/apps/client/src/components/app_context.ts +++ b/apps/client/src/components/app_context.ts @@ -445,6 +445,7 @@ type EventMappings = { error: string; }; searchRefreshed: { ntxId?: string | null }; + textEditorRefreshed: { ntxId?: string | null, editor: CKTextEditor }; hoistedNoteChanged: { noteId: string; ntxId: string | null; diff --git a/apps/client/src/widgets/ribbon/FormattingToolbar.tsx b/apps/client/src/widgets/ribbon/FormattingToolbar.tsx index 8828b15eea..f25234ead8 100644 --- a/apps/client/src/widgets/ribbon/FormattingToolbar.tsx +++ b/apps/client/src/widgets/ribbon/FormattingToolbar.tsx @@ -1,4 +1,5 @@ -import { useTriliumOption } from "../react/hooks"; +import { useRef } from "preact/hooks"; +import { useTriliumEvent, useTriliumOption } from "../react/hooks"; import { TabContext } from "./ribbon-interface"; /** @@ -10,10 +11,22 @@ import { TabContext } from "./ribbon-interface"; * * ! The toolbar is not only used in the ribbon, but also in the quick edit feature. */ -export default function FormattingToolbar({ hidden }: TabContext) { +export default function FormattingToolbar({ hidden, ntxId }: TabContext) { + const containerRef = useRef(null); const [ textNoteEditorType ] = useTriliumOption("textNoteEditorType"); + useTriliumEvent("textEditorRefreshed", ({ ntxId: eventNtxId, editor }) => { + if (eventNtxId !== ntxId) return; + const toolbar = editor.ui.view.toolbar?.element; + if (toolbar && containerRef.current) { + containerRef.current.replaceChildren(toolbar); + } + }); + return (textNoteEditorType === "ckeditor-classic" && -
        +
        ) }; diff --git a/apps/client/src/widgets/type_widgets/text/EditableText.tsx b/apps/client/src/widgets/type_widgets/text/EditableText.tsx index 15c235f3f9..490eba95d6 100644 --- a/apps/client/src/widgets/type_widgets/text/EditableText.tsx +++ b/apps/client/src/widgets/type_widgets/text/EditableText.tsx @@ -251,6 +251,7 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext } initialized.current.resolve(); + parentComponent?.triggerEvent("textEditorRefreshed", { ntxId, editor }); }} />} @@ -304,19 +305,8 @@ function onNotificationWarning(data, evt) { function setupClassicEditor(editor: CKTextEditor, parentComponent: Component | undefined) { if (!parentComponent) return; - const $classicToolbarWidget = findClassicToolbar(parentComponent); - - $classicToolbarWidget.empty(); - if ($classicToolbarWidget.length) { - const toolbarView = (editor as ClassicEditor).ui.view.toolbar; - if (toolbarView.element) { - $classicToolbarWidget[0].appendChild(toolbarView.element); - } - } if (utils.isMobile()) { - $classicToolbarWidget.addClass("visible"); - // Reposition all dropdowns to point upwards instead of downwards. // See https://ckeditor.com/docs/ckeditor5/latest/examples/framework/bottom-toolbar-editor.html for more info. const toolbarView = (editor as ClassicEditor).ui.view.toolbar; @@ -333,24 +323,6 @@ function setupClassicEditor(editor: CKTextEditor, parentComponent: Component | u } } -function findClassicToolbar(parentComponent: Component): JQuery { - const $widget = $(parentComponent.$widget); - - if (!utils.isMobile()) { - const $parentSplit = $widget.parents(".note-split.type-text"); - - if ($parentSplit.length) { - // The editor is in a normal tab. - return $parentSplit.find("> .ribbon-container .classic-toolbar-widget"); - } else { - // The editor is in a popup. - return $widget.closest(".modal-body").find(".classic-toolbar-widget"); - } - } else { - return $("body").find(".classic-toolbar-widget"); - } -} - function EditableTextTouchBar({ watchdogRef, refreshTouchBarRef }: { watchdogRef: RefObject, refreshTouchBarRef: RefObject<() => void> }) { const [ headingSelectedIndex, setHeadingSelectedIndex ] = useState(); From 9b3ca654922e86986cc880e7e35bc5b5a945c140 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 11:37:34 +0200 Subject: [PATCH 118/697] fix(text): classic toolbar broken on mobile due to prior change --- .../src/widgets/ribbon/FormattingToolbar.tsx | 9 +++- .../type_widgets/text/EditableText.tsx | 26 ---------- .../text/mobile_editor_toolbar.tsx | 49 ++++++++++++++++--- 3 files changed, 48 insertions(+), 36 deletions(-) diff --git a/apps/client/src/widgets/ribbon/FormattingToolbar.tsx b/apps/client/src/widgets/ribbon/FormattingToolbar.tsx index f25234ead8..47963b2bf7 100644 --- a/apps/client/src/widgets/ribbon/FormattingToolbar.tsx +++ b/apps/client/src/widgets/ribbon/FormattingToolbar.tsx @@ -10,16 +10,21 @@ import { TabContext } from "./ribbon-interface"; * The ribbon item is active by default for text notes, as long as they are not in read-only mode. * * ! The toolbar is not only used in the ribbon, but also in the quick edit feature. + * * The mobile toolbar is handled separately (see `MobileEditorToolbar`). */ export default function FormattingToolbar({ hidden, ntxId }: TabContext) { const containerRef = useRef(null); const [ textNoteEditorType ] = useTriliumOption("textNoteEditorType"); + // Attach the toolbar from the CKEditor. useTriliumEvent("textEditorRefreshed", ({ ntxId: eventNtxId, editor }) => { - if (eventNtxId !== ntxId) return; + if (eventNtxId !== ntxId || !containerRef.current) return; const toolbar = editor.ui.view.toolbar?.element; - if (toolbar && containerRef.current) { + + if (toolbar) { containerRef.current.replaceChildren(toolbar); + } else { + containerRef.current.replaceChildren(); } }); diff --git a/apps/client/src/widgets/type_widgets/text/EditableText.tsx b/apps/client/src/widgets/type_widgets/text/EditableText.tsx index 490eba95d6..9b3915abd1 100644 --- a/apps/client/src/widgets/type_widgets/text/EditableText.tsx +++ b/apps/client/src/widgets/type_widgets/text/EditableText.tsx @@ -233,12 +233,6 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext onWatchdogStateChange={onWatchdogStateChange} onChange={() => spacedUpdate.scheduleUpdate()} onEditorInitialized={(editor) => { - console.log("Editor has been initialized!", parentComponent, editor); - - if (isClassicEditor) { - setupClassicEditor(editor, parentComponent); - } - if (hasTouchBar) { const handler = () => refreshTouchBarRef.current?.(); for (const event of [ "bold", "italic", "underline", "paragraph", "heading" ]) { @@ -303,26 +297,6 @@ function onNotificationWarning(data, evt) { evt.stop(); } -function setupClassicEditor(editor: CKTextEditor, parentComponent: Component | undefined) { - if (!parentComponent) return; - - if (utils.isMobile()) { - // Reposition all dropdowns to point upwards instead of downwards. - // See https://ckeditor.com/docs/ckeditor5/latest/examples/framework/bottom-toolbar-editor.html for more info. - const toolbarView = (editor as ClassicEditor).ui.view.toolbar; - for (const item of toolbarView.items) { - if (!("panelView" in item)) continue; - - item.on("change:isOpen", () => { - if (!("isOpen" in item) || !item.isOpen) return; - - // @ts-ignore - item.panelView.position = item.panelView.position.replace("s", "n"); - }); - } - } -} - function EditableTextTouchBar({ watchdogRef, refreshTouchBarRef }: { watchdogRef: RefObject, refreshTouchBarRef: RefObject<() => void> }) { const [ headingSelectedIndex, setHeadingSelectedIndex ] = useState(); 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 71965761ba..4b2ac7e1cd 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,7 +1,8 @@ import { MutableRef, useCallback, useEffect, useRef, useState } from "preact/hooks"; -import { useNoteContext } from "../../react/hooks"; +import { useNoteContext, useTriliumEvent } from "../../react/hooks"; import "./mobile_editor_toolbar.css"; import { isIOS } from "../../../services/utils"; +import { CKTextEditor, ClassicEditor } from "@triliumnext/ckeditor5"; /** * Handles the editing toolbar for CKEditor in mobile mode. The toolbar acts as a floating bar, with two different mechanism: @@ -10,12 +11,12 @@ import { isIOS } from "../../../services/utils"; * - On Android, the viewport change makes the keyboard resize the content area, all we have to do is to hide the tab bar and global menu (handled in the global style). */ export default function MobileEditorToolbar() { - const wrapperRef = useRef(null); - const { note, noteContext } = useNoteContext(); + const containerRef = useRef(null); + const { note, noteContext, ntxId } = useNoteContext(); const [ shouldDisplay, setShouldDisplay ] = useState(false); const [ dropdownActive, setDropdownActive ] = useState(false); - usePositioningOniOS(wrapperRef); + usePositioningOniOS(containerRef); useEffect(() => { noteContext?.isReadOnly().then(isReadOnly => { @@ -23,15 +24,28 @@ export default function MobileEditorToolbar() { }); }, [ note ]); + // Attach the toolbar from the CKEditor. + useTriliumEvent("textEditorRefreshed", ({ ntxId: eventNtxId, editor }) => { + if (eventNtxId !== ntxId || !containerRef.current) return; + const toolbar = editor.ui.view.toolbar?.element; + + repositionDropdowns(editor); + if (toolbar) { + containerRef.current.replaceChildren(toolbar); + } else { + containerRef.current.replaceChildren(); + } + }); + // Observe when a dropdown is expanded to apply a style that allows the dropdown to be visible, since we can't have the element both visible and the toolbar scrollable. useEffect(() => { - if (!wrapperRef.current) return; + if (!containerRef.current) return; const observer = new MutationObserver(e => { setDropdownActive(e.map((e) => (e.target as any).ariaExpanded === "true").reduce((acc, e) => acc && e)); }); - observer.observe(wrapperRef.current, { + observer.observe(containerRef.current, { attributeFilter: ["aria-expanded"], subtree: true }); @@ -41,7 +55,7 @@ export default function MobileEditorToolbar() { return (
        -
        +
        ) } @@ -50,7 +64,7 @@ function usePositioningOniOS(wrapperRef: MutableRef) { const adjustPosition = useCallback(() => { if (!wrapperRef.current) return; let bottom = window.innerHeight - (window.visualViewport?.height || 0); - wrapperRef.current.style.bottom = `${bottom}px`; + wrapperRef.current.style.bottom = `${bottom}px`; }, []); useEffect(() => { @@ -65,3 +79,22 @@ function usePositioningOniOS(wrapperRef: MutableRef) { }; }, []); } + +/** + * Reposition all dropdowns to point upwards instead of downwards. + * See https://ckeditor.com/docs/ckeditor5/latest/examples/framework/bottom-toolbar-editor.html for more info. + * @param editor + */ +function repositionDropdowns(editor: CKTextEditor) { + const toolbarView = (editor as ClassicEditor).ui.view.toolbar; + for (const item of toolbarView.items) { + if (!("panelView" in item)) continue; + + item.on("change:isOpen", () => { + if (!("isOpen" in item) || !item.isOpen) return; + + // @ts-ignore + item.panelView.position = item.panelView.position.replace("s", "n"); + }); + } +} From 6040eea3bd9686ff67b084551bce5f7cd1940fd0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 11:52:16 +0200 Subject: [PATCH 119/697] fix(text): note with empty table carries over to new notes --- .../src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx | 6 +----- apps/client/src/widgets/type_widgets/text/EditableText.tsx | 7 ++++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx index fd68145289..1c3a85e235 100644 --- a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx +++ b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx @@ -20,7 +20,6 @@ export interface CKEditorApi { } interface CKEditorWithWatchdogProps extends Pick, "className" | "tabIndex"> { - content: string | undefined; contentLanguage: string | null | undefined; isClassicEditor?: boolean; watchdogRef: RefObject; @@ -35,7 +34,7 @@ interface CKEditorWithWatchdogProps extends Pick, "cla containerRef?: RefObject; } -export default function CKEditorWithWatchdog({ containerRef: externalContainerRef, content, contentLanguage, className, tabIndex, isClassicEditor, watchdogRef: externalWatchdogRef, watchdogConfig, onNotificationWarning, onWatchdogStateChange, onChange, onEditorInitialized, editorApi, templates }: CKEditorWithWatchdogProps) { +export default function CKEditorWithWatchdog({ containerRef: externalContainerRef, contentLanguage, className, tabIndex, isClassicEditor, watchdogRef: externalWatchdogRef, watchdogConfig, onNotificationWarning, onWatchdogStateChange, onChange, onEditorInitialized, editorApi, templates }: CKEditorWithWatchdogProps) { const containerRef = useSyncedRef(externalContainerRef, null); const watchdogRef = useRef(null); const [ uiLanguage ] = useTriliumOption("locale"); @@ -185,9 +184,6 @@ export default function CKEditorWithWatchdog({ containerRef: externalContainerRe return () => watchdog.destroy(); }, [ contentLanguage, templates, uiLanguage ]); - // React to content changes. - useEffect(() => editor?.setData(content ?? ""), [ editor, content ]); - // React to notification warning callback. useEffect(() => { if (!onNotificationWarning || !editor) return; diff --git a/apps/client/src/widgets/type_widgets/text/EditableText.tsx b/apps/client/src/widgets/type_widgets/text/EditableText.tsx index 9b3915abd1..e3fa1eceee 100644 --- a/apps/client/src/widgets/type_widgets/text/EditableText.tsx +++ b/apps/client/src/widgets/type_widgets/text/EditableText.tsx @@ -27,7 +27,7 @@ import { deferred } from "@triliumnext/commons"; */ export default function EditableText({ note, parentComponent, ntxId, noteContext }: TypeWidgetProps) { const containerRef = useRef(null); - const [ content, setContent ] = useState(); + const contentRef = useRef(""); const watchdogRef = useRef(null); const editorApiRef = useRef(null); const refreshTouchBarRef = useRef<() => void>(null); @@ -55,7 +55,8 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext }; }, onContentChange(newContent) { - setContent(newContent); + contentRef.current = newContent; + watchdogRef.current?.editor?.setData(newContent); } }); const templates = useTemplates(); @@ -215,7 +216,6 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext containerRef={containerRef} className={`note-detail-editable-text-editor use-tn-links ${codeBlockWordWrap ? "word-wrap" : ""}`} tabIndex={300} - content={content} contentLanguage={language} isClassicEditor={isClassicEditor} editorApi={editorApiRef} @@ -245,6 +245,7 @@ export default function EditableText({ note, parentComponent, ntxId, noteContext } initialized.current.resolve(); + editor.setData(contentRef.current ?? ""); parentComponent?.triggerEvent("textEditorRefreshed", { ntxId, editor }); }} />} From 33aece6f96a6b58fe08bdea05bd5de9339e39e1a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 12:16:48 +0200 Subject: [PATCH 120/697] fix(collections): flicker when adding new entries --- .../src/widgets/collections/NoteList.tsx | 59 ++++++++++--------- 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index 1f64279785..1081cd6dfd 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -8,6 +8,7 @@ import { subscribeToMessages, unsubscribeToMessage as unsubscribeFromMessage } f import { WebSocketMessage } from "@triliumnext/commons"; import froca from "../../services/froca"; import { lazy, Suspense } from "preact/compat"; +import { VNode } from "preact"; interface NoteListProps { note: FNote | null | undefined; notePath: string | null | undefined; @@ -22,6 +23,33 @@ interface NoteListProps { onProgressChanged?(progress: number): void; } +type LazyLoadedComponent = ((props: ViewModeProps) => VNode | undefined); +const ViewComponents: Record = { + list: { + normal: lazy(() => import("./legacy/ListOrGridView.js").then(i => i.ListView)), + print: lazy(() => import("./legacy/ListPrintView.js").then(i => i.ListPrintView)) + }, + grid: { + normal: lazy(() => import("./legacy/ListOrGridView.js").then(i => i.GridView)), + }, + geoMap: { + normal: lazy(() => import("./geomap/index.js")), + }, + calendar: { + normal: lazy(() => import("./calendar/index.js")) + }, + table: { + normal: lazy(() => import("./table/index.js")), + print: lazy(() => import("./table/TablePrintView.js")) + }, + board: { + normal: lazy(() => import("./board/index.js")) + }, + presentation: { + normal: lazy(() => import("./presentation/index.js")) + } +} + export default function NoteList(props: Pick) { const { note, noteContext, notePath, ntxId } = useNoteContext(); const viewType = useNoteViewType(note); @@ -86,7 +114,9 @@ export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePa } } - const ComponentToRender = viewType && props && isEnabled && getComponentByViewType(viewType, props); + const ComponentToRender = viewType && props && isEnabled && ( + props.media === "print" ? ViewComponents[viewType].print : ViewComponents[viewType].normal + ); return (
        @@ -101,33 +131,6 @@ export function CustomNoteList({ note, viewType, isEnabled: shouldEnable, notePa ); } -function getComponentByViewType(viewType: ViewTypeOptions, props: ViewModeProps) { - switch (viewType) { - case "list": - if (props.media !== "print") { - return lazy(() => import("./legacy/ListOrGridView.js").then(i => i.ListView)); - } else { - return lazy(() => import("./legacy/ListPrintView.js").then(i => i.ListPrintView)); - } - case "grid": - return lazy(() => import("./legacy/ListOrGridView.js").then(i => i.GridView)); - case "geoMap": - return lazy(() => import("./geomap/index.js")); - case "calendar": - return lazy(() => import("./calendar/index.js")); - case "table": - if (props.media !== "print") { - return lazy(() => import("./table/index.js")); - } else { - return lazy(() => import("./table/TablePrintView.js")); - } - case "board": - return lazy(() => import("./board/index.js")); - case "presentation": - return lazy(() => import("./presentation/index.js")); - } -} - export function useNoteViewType(note?: FNote | null): ViewTypeOptions | undefined { const [ viewType ] = useNoteLabel(note, "viewType"); From 8b997cffdd2435dff4286d39d0b6ede529f031d6 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 12:37:08 +0200 Subject: [PATCH 121/697] fix(collections/board): mouse horizontal scroll no longer working --- apps/client/src/widgets/collections/board/index.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/collections/board/index.css b/apps/client/src/widgets/collections/board/index.css index 8b6ab9180d..28cc98a2c8 100644 --- a/apps/client/src/widgets/collections/board/index.css +++ b/apps/client/src/widgets/collections/board/index.css @@ -2,6 +2,7 @@ position: relative; height: 100%; user-select: none; + overflow-x: auto; --card-font-size: 0.9em; --card-line-height: 1.2; From 08e542dfb3331eebbfee619ac8e253469fdf70d3 Mon Sep 17 00:00:00 2001 From: "Francis C." Date: Fri, 21 Nov 2025 13:40:45 +0100 Subject: [PATCH 122/697] Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (1628 of 1628 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hans/ --- apps/client/src/translations/cn/translation.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index 8a6d195547..95e2c73a3f 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -2091,5 +2091,10 @@ "auto-read-only-note": "这条笔记以只读模式显示便于快速加载。", "auto-read-only-learn-more": "了解更多", "edit-note": "编辑笔记" + }, + "note-color": { + "clear-color": "清除笔记颜色", + "set-color": "设置笔记颜色", + "set-custom-color": "设置自定义笔记颜色" } } From 6b64d85db0f25d7f6fb6e25384246b807c8929c6 Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 21 Nov 2025 13:51:08 +0100 Subject: [PATCH 123/697] Translated using Weblate (French) Currently translated at 97.3% (148 of 152 strings) Translation: Trilium Notes/Website Translate-URL: https://hosted.weblate.org/projects/trilium/website/fr/ --- apps/website/src/translations/fr/translation.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/website/src/translations/fr/translation.json b/apps/website/src/translations/fr/translation.json index b464b2d71b..4724c2ac5d 100644 --- a/apps/website/src/translations/fr/translation.json +++ b/apps/website/src/translations/fr/translation.json @@ -51,7 +51,8 @@ "mermaid_description": "Créez des diagrammes tels que des organigrammes, des diagrammes de classes et de séquences, des diagrammes de Gantt et bien d'autres, en utilisant la syntaxe Mermaid.", "mindmap_title": "Carte mentale", "mindmap_description": "Organisez vos pensées visuellement ou faites une séance de brainstorming.", - "others_list": "et autres : <0>carte de notes, <1>carte de relations, <2>recherches enregistrées, <3>note de rendu et <4>vues Web." + "others_list": "et autres : <0>carte de notes, <1>carte de relations, <2>recherches enregistrées, <3>note de rendu et <4>vues Web.", + "title": "Plusieurs façons de représenter vos informations" }, "faq": { "database_question": "Où sont les données stockées?", @@ -168,7 +169,9 @@ "board_title": "Tableau de bord", "board_description": "Organisez vos tâches ou l'état de vos projets dans un tableau Kanban avec un moyen simple de créer de nouveaux éléments et colonnes et de modifier simplement leur état en les faisant glisser sur le tableau.", "geomap_title": "Géocarte", - "geomap_description": "Planifiez vos vacances ou marquez vos points d'intérêt directement sur une carte géographique grâce à des marqueurs personnalisables. Affichez les traces GPX enregistrées pour suivre vos itinéraires." + "geomap_description": "Planifiez vos vacances ou marquez vos points d'intérêt directement sur une carte géographique grâce à des marqueurs personnalisables. Affichez les traces GPX enregistrées pour suivre vos itinéraires.", + "title": "Collections", + "presentation_title": "Présentation" }, "download_now": { "text": "Télécharger maintenant. ", From 24cdeb06e88f276580a680c01f2d65660dee551f Mon Sep 17 00:00:00 2001 From: Marc Date: Fri, 21 Nov 2025 13:48:09 +0100 Subject: [PATCH 124/697] Translated using Weblate (French) Currently translated at 99.2% (1616 of 1628 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/fr/ --- apps/client/src/translations/fr/translation.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index fe9e28ba99..71222b6e96 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -39,7 +39,10 @@ "help_on_tree_prefix": "Aide sur le préfixe de l'arbre", "prefix": "Préfixe : ", "save": "Sauvegarder", - "branch_prefix_saved": "Le préfixe de la branche a été enregistré." + "branch_prefix_saved": "Le préfixe de la branche a été enregistré.", + "edit_branch_prefix_multiple": "Modifier le préfixe de branche pour {{count}} branches", + "branch_prefix_saved_multiple": "Le préfixe de la branche a été sauvegardé pour {{count}} branches.", + "affected_branches": "Branches impactées ({{count}}):" }, "bulk_actions": { "bulk_actions": "Actions groupées", From 268bbf3b9e256f81b205a07cb356a571a01d99ff Mon Sep 17 00:00:00 2001 From: green Date: Fri, 21 Nov 2025 10:11:26 +0100 Subject: [PATCH 125/697] Translated using Weblate (Japanese) Currently translated at 100.0% (1628 of 1628 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 20b0d786c8..6c9f9b924f 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -1930,7 +1930,7 @@ "search-for": "「{{term}}」を検索", "create-note": "子ノート「{{term}}」を作成してリンクする", "insert-external-link": "「{{term}}」への外部リンクを挿入", - "clear-text-field": "テキストフィールドを消去", + "clear-text-field": "テキストフィールドをクリア", "show-recent-notes": "最近のノートを表示", "full-text-search": "全文検索" }, @@ -2091,5 +2091,10 @@ "auto-read-only-note": "このノートは読み込みを高速化するために読み取り専用モードで表示されています。", "auto-read-only-learn-more": "さらに詳しく", "edit-note": "ノートを編集" + }, + "note-color": { + "clear-color": "ノートの色をクリア", + "set-color": "ノートの色を設定", + "set-custom-color": "ノートの色をカスタム設定" } } From 4a71b00b710808a336635ebf6e308a78937ba08d Mon Sep 17 00:00:00 2001 From: "Francis C." Date: Fri, 21 Nov 2025 13:39:09 +0100 Subject: [PATCH 126/697] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (1628 of 1628 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/zh_Hant/ --- apps/client/src/translations/tw/translation.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 767bb8ffc2..6efe59822f 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -2091,5 +2091,10 @@ "auto-read-only-note": "此筆記以唯讀模式顯示以加快載入速度。", "auto-read-only-learn-more": "了解更多", "edit-note": "編輯筆記" + }, + "note-color": { + "clear-color": "清除筆記顏色", + "set-color": "設定筆記顏色", + "set-custom-color": "設定自訂筆記顏色" } } From b4b1b7a3fabbf7bb2417904652e2d0fac57a3bd1 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 22 Nov 2025 13:33:48 +0200 Subject: [PATCH 127/697] client/context menus: skip consecutive separators --- apps/client/src/menus/context_menu.ts | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/apps/client/src/menus/context_menu.ts b/apps/client/src/menus/context_menu.ts index 4e28d77680..32d55085f0 100644 --- a/apps/client/src/menus/context_menu.ts +++ b/apps/client/src/menus/context_menu.ts @@ -165,16 +165,19 @@ class ContextMenu { let $group = $parent; // The current group or parent element to which items are being appended let shouldStartNewGroup = false; // If true, the next item will start a new group let shouldResetGroup = false; // If true, the next item will be the last one from the group + let prevItemKind: string = ""; for (let index = 0; index < items.length; index++) { const item = items[index]; + const itemKind = ("kind" in item) ? item.kind : ""; + if (!item) { continue; } // If the current item is a header, start a new group. This group will contain the // header and the next item that follows the header. - if ("kind" in item && item.kind === "header") { + if (itemKind === "header") { if (multicolumn && !shouldResetGroup) { shouldStartNewGroup = true; } @@ -200,14 +203,18 @@ class ContextMenu { shouldStartNewGroup = false; } - if ("kind" in item && item.kind === "separator") { + if (itemKind === "separator") { + if (prevItemKind === "separator") { + // Skip consecutive separators + continue; + } $group.append($("
        ").addClass("dropdown-divider")); shouldResetGroup = true; // End the group after the next item - } else if ("kind" in item && item.kind === "header") { + } else if (itemKind === "header") { $group.append($("
        ").addClass("dropdown-header").text(item.title)); shouldResetGroup = true; } else { - if ("kind" in item && item.kind === "custom") { + if (itemKind === "custom") { // Custom menu item $group.append(this.createCustomMenuItem(item)); } else { @@ -222,6 +229,9 @@ class ContextMenu { shouldResetGroup = false; }; } + + prevItemKind = itemKind; + } } From beb7d09aeeadb0f78502fba66792f065abada2e8 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 22 Nov 2025 13:35:36 +0200 Subject: [PATCH 128/697] client/tree context menu: improve handling the case when the note color picker is not available --- apps/client/src/menus/tree_context_menu.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/client/src/menus/tree_context_menu.ts b/apps/client/src/menus/tree_context_menu.ts index 19e6f4e169..901a165591 100644 --- a/apps/client/src/menus/tree_context_menu.ts +++ b/apps/client/src/menus/tree_context_menu.ts @@ -244,16 +244,12 @@ export default class TreeContextMenu implements SelectMenuItemEventListener { - if (notOptionsOrHelp && selectedNotes.length === 1) { - return NoteColorPicker({note}); - } else { - return null; - } + return NoteColorPicker({note}); } - }, + } : null, { kind: "separator" }, From af62526b92bdb9f07fd51284474215e8e8bd99fd Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 22 Nov 2025 13:43:40 +0200 Subject: [PATCH 129/697] client/context menu: fix data type errors --- apps/client/src/menus/context_menu.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/client/src/menus/context_menu.ts b/apps/client/src/menus/context_menu.ts index 32d55085f0..7096953e22 100644 --- a/apps/client/src/menus/context_menu.ts +++ b/apps/client/src/menus/context_menu.ts @@ -211,15 +211,15 @@ class ContextMenu { $group.append($("
        ").addClass("dropdown-divider")); shouldResetGroup = true; // End the group after the next item } else if (itemKind === "header") { - $group.append($("
        ").addClass("dropdown-header").text(item.title)); + $group.append($("
        ").addClass("dropdown-header").text((item as MenuHeader).title)); shouldResetGroup = true; } else { if (itemKind === "custom") { // Custom menu item - $group.append(this.createCustomMenuItem(item)); + $group.append(this.createCustomMenuItem(item as CustomMenuItem)); } else { // Standard menu item - $group.append(this.createMenuItem(item)); + $group.append(this.createMenuItem(item as MenuCommandItem)); } // After adding a menu item, if the previous item was a separator or header, From 435b856b72ae0539ab923b974069fb592319b259 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 18:35:07 +0200 Subject: [PATCH 130/697] fix(quick_edit): keyboard shortcuts triggering on wrong editor --- apps/client/src/services/keyboard_actions.ts | 6 ++++-- apps/client/src/widgets/react/hooks.tsx | 6 +++--- apps/client/src/widgets/type_widgets/code/Code.tsx | 2 +- .../src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx | 4 ++-- apps/client/src/widgets/type_widgets/text/EditableText.tsx | 5 ++--- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/apps/client/src/services/keyboard_actions.ts b/apps/client/src/services/keyboard_actions.ts index 5678d61962..d447a90019 100644 --- a/apps/client/src/services/keyboard_actions.ts +++ b/apps/client/src/services/keyboard_actions.ts @@ -28,7 +28,7 @@ async function getActionsForScope(scope: string) { return actions.filter((action) => action.scope === scope); } -async function setupActionsForElement(scope: string, $el: JQuery, component: Component) { +async function setupActionsForElement(scope: string, $el: JQuery, component: Component, ntxId: string | null | undefined) { if (!$el[0]) return []; const actions = await getActionsForScope(scope); @@ -36,7 +36,9 @@ async function setupActionsForElement(scope: string, $el: JQuery, c for (const action of actions) { for (const shortcut of action.effectiveShortcuts ?? []) { - const binding = shortcutService.bindElShortcut($el, shortcut, () => component.triggerCommand(action.actionName, { ntxId: appContext.tabManager.activeNtxId })); + const binding = shortcutService.bindElShortcut($el, shortcut, () => { + component.triggerCommand(action.actionName, { ntxId }); + }); if (binding) { bindings.push(binding); } diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index 0ee92f8af0..856896f2cb 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -760,18 +760,18 @@ export function useResizeObserver(ref: RefObject, callback: () => v }, [ callback, ref ]); } -export function useKeyboardShortcuts(scope: "code-detail" | "text-detail", containerRef: RefObject, parentComponent: Component | undefined) { +export function useKeyboardShortcuts(scope: "code-detail" | "text-detail", containerRef: RefObject, parentComponent: Component | undefined, ntxId: string | null | undefined) { useEffect(() => { if (!parentComponent) return; const $container = refToJQuerySelector(containerRef); - const bindingPromise = keyboard_actions.setupActionsForElement(scope, $container, parentComponent); + const bindingPromise = keyboard_actions.setupActionsForElement(scope, $container, parentComponent, ntxId); return async () => { const bindings = await bindingPromise; for (const binding of bindings) { removeIndividualBinding(binding); } } - }, []); + }, [ scope, containerRef, parentComponent, ntxId ]); } /** diff --git a/apps/client/src/widgets/type_widgets/code/Code.tsx b/apps/client/src/widgets/type_widgets/code/Code.tsx index 0c089b9a8f..02117f19f7 100644 --- a/apps/client/src/widgets/type_widgets/code/Code.tsx +++ b/apps/client/src/widgets/type_widgets/code/Code.tsx @@ -100,7 +100,7 @@ export function EditableCode({ note, ntxId, noteContext, debounceUpdate, parentC } }); - useKeyboardShortcuts("code-detail", containerRef, parentComponent); + useKeyboardShortcuts("code-detail", containerRef, parentComponent, ntxId); return ( <> diff --git a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx index 1c3a85e235..e19032d460 100644 --- a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx +++ b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx @@ -39,9 +39,9 @@ export default function CKEditorWithWatchdog({ containerRef: externalContainerRe const watchdogRef = useRef(null); const [ uiLanguage ] = useTriliumOption("locale"); const [ editor, setEditor ] = useState(); - const { parentComponent } = useNoteContext(); + const { parentComponent, ntxId } = useNoteContext(); - useKeyboardShortcuts("text-detail", containerRef, parentComponent); + useKeyboardShortcuts("text-detail", containerRef, parentComponent, ntxId); useImperativeHandle(editorApi, () => ({ hasSelection() { diff --git a/apps/client/src/widgets/type_widgets/text/EditableText.tsx b/apps/client/src/widgets/type_widgets/text/EditableText.tsx index e3fa1eceee..8289896715 100644 --- a/apps/client/src/widgets/type_widgets/text/EditableText.tsx +++ b/apps/client/src/widgets/type_widgets/text/EditableText.tsx @@ -2,12 +2,11 @@ import { useEffect, useRef, useState } from "preact/hooks"; import dialog from "../../../services/dialog"; import toast from "../../../services/toast"; import utils, { hasTouchBar, isMobile } from "../../../services/utils"; -import { useEditorSpacedUpdate, useKeyboardShortcuts, useLegacyImperativeHandlers, useNoteLabel, useTriliumEvent, useTriliumOption, useTriliumOptionBool } from "../../react/hooks"; +import { useEditorSpacedUpdate, useLegacyImperativeHandlers, useNoteLabel, useTriliumEvent, useTriliumOption, useTriliumOptionBool } from "../../react/hooks"; import { TypeWidgetProps } from "../type_widget"; import CKEditorWithWatchdog, { CKEditorApi } from "./CKEditorWithWatchdog"; import "./EditableText.css"; -import { CKTextEditor, ClassicEditor, EditorWatchdog, TemplateDefinition } from "@triliumnext/ckeditor5"; -import Component from "../../../components/component"; +import { CKTextEditor, EditorWatchdog, TemplateDefinition } from "@triliumnext/ckeditor5"; import options from "../../../services/options"; import { loadIncludedNote, refreshIncludedNote, setupImageOpening } from "./utils"; import getTemplates, { updateTemplateCache } from "./snippets.js"; From 31180afbd1199580f57786b9d0592a0bdf7fcbeb Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 19:07:50 +0200 Subject: [PATCH 131/697] react(quick_edit): set up empty dialog --- apps/client/src/layouts/layout_commons.tsx | 22 +---- .../src/widgets/dialogs/PopupEditor.css | 62 ++++++++++++++ .../src/widgets/dialogs/PopupEditor.tsx | 31 +++++++ .../src/widgets/dialogs/popup_editor.ts | 80 ------------------- .../text/CKEditorWithWatchdog.tsx | 1 + 5 files changed, 96 insertions(+), 100 deletions(-) create mode 100644 apps/client/src/widgets/dialogs/PopupEditor.css create mode 100644 apps/client/src/widgets/dialogs/PopupEditor.tsx diff --git a/apps/client/src/layouts/layout_commons.tsx b/apps/client/src/layouts/layout_commons.tsx index 031ef03de6..62f810430d 100644 --- a/apps/client/src/layouts/layout_commons.tsx +++ b/apps/client/src/layouts/layout_commons.tsx @@ -22,16 +22,8 @@ import RevisionsDialog from "../widgets/dialogs/revisions.js"; import DeleteNotesDialog from "../widgets/dialogs/delete_notes.js"; import InfoDialog from "../widgets/dialogs/info.js"; import IncorrectCpuArchDialog from "../widgets/dialogs/incorrect_cpu_arch.js"; -import PopupEditorDialog from "../widgets/dialogs/popup_editor.js"; -import FlexContainer from "../widgets/containers/flex_container.js"; -import NoteIconWidget from "../widgets/note_icon"; -import PromotedAttributesWidget from "../widgets/promoted_attributes.js"; import CallToActionDialog from "../widgets/dialogs/call_to_action.jsx"; -import NoteTitleWidget from "../widgets/note_title.jsx"; -import FormattingToolbar from "../widgets/ribbon/FormattingToolbar.js"; -import NoteList from "../widgets/collections/NoteList.jsx"; -import NoteDetail from "../widgets/NoteDetail.jsx"; -import StandaloneRibbonAdapter from "../widgets/ribbon/components/StandaloneRibbonAdapter.jsx"; +import PopupEditorDialog from "../widgets/dialogs/PopupEditor.jsx"; export function applyModals(rootContainer: RootContainer) { rootContainer @@ -57,16 +49,6 @@ export function applyModals(rootContainer: RootContainer) { .child() .child() .child() - .child(new PopupEditorDialog() - .child(new FlexContainer("row") - .class("title-row") - .css("align-items", "center") - .cssBlock(".title-row > * { margin: 5px; }") - .child() - .child()) - .child() - .child(new PromotedAttributesWidget()) - .child() - .child()) + .child() .child(); } diff --git a/apps/client/src/widgets/dialogs/PopupEditor.css b/apps/client/src/widgets/dialogs/PopupEditor.css new file mode 100644 index 0000000000..ce6494f339 --- /dev/null +++ b/apps/client/src/widgets/dialogs/PopupEditor.css @@ -0,0 +1,62 @@ +/** Reduce the z-index of modals so that ckeditor popups are properly shown on top of it. */ +body.popup-editor-open > .modal-backdrop { z-index: 998; } +body.popup-editor-open .popup-editor-dialog { z-index: 999; } +body.popup-editor-open .ck-clipboard-drop-target-line { z-index: 1000; } + +body.desktop .modal.popup-editor-dialog .modal-dialog { + max-width: 75vw; +} + +.modal.popup-editor-dialog .modal-header .modal-title { + font-size: 1.1em; +} + +.modal.popup-editor-dialog .modal-header .title-row { + flex-grow: 1; + display: flex; + align-items: center; +} + +.modal.popup-editor-dialog .modal-header .title-row > * { + margin: 5px; +} + +.modal.popup-editor-dialog .modal-body { + padding: 0; + height: 75vh; + overflow: auto; +} + +.modal.popup-editor-dialog .note-detail-editable-text { + padding: 0 1em; +} + +.modal.popup-editor-dialog .title-row, +.modal.popup-editor-dialog .modal-title, +.modal.popup-editor-dialog .note-icon-widget { + height: 32px; +} + +.modal.popup-editor-dialog .note-icon-widget { + width: 32px; + margin: 0; + padding: 0; +} + +.modal.popup-editor-dialog .note-icon-widget button.note-icon, +.modal.popup-editor-dialog .note-title-widget input.note-title { + font-size: 1em; +} + +.modal.popup-editor-dialog .classic-toolbar-widget { + position: sticky; + top: 0; + inset-inline-start: 0; + inset-inline-end: 0; + background: var(--modal-background-color); + z-index: 998; +} + +.modal.popup-editor-dialog .note-detail-file { + padding: 0; +} \ No newline at end of file diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx new file mode 100644 index 0000000000..7969e3ac02 --- /dev/null +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -0,0 +1,31 @@ +import { useState } from "preact/hooks"; +import Modal from "../react/Modal"; +import "./PopupEditor.css"; +import { useTriliumEvent } from "../react/hooks"; +import NoteTitleWidget from "../note_title"; +import NoteIcon from "../note_icon"; + +export default function PopupEditor() { + const [ shown, setShown ] = useState(false); + + useTriliumEvent("openInPopup", () => { + setShown(true); + }); + + return ( + + + +
        + )} + className="popup-editor-dialog" + size="lg" + show={shown} + onHidden={() => setShown(false)} + > + Body goes here + + ) +} diff --git a/apps/client/src/widgets/dialogs/popup_editor.ts b/apps/client/src/widgets/dialogs/popup_editor.ts index 80f8f59150..bc862822e3 100644 --- a/apps/client/src/widgets/dialogs/popup_editor.ts +++ b/apps/client/src/widgets/dialogs/popup_editor.ts @@ -4,82 +4,6 @@ import { openDialog } from "../../services/dialog.js"; import BasicWidget, { ReactWrappedWidget } from "../basic_widget.js"; import Container from "../containers/container.js"; -const TPL = /*html*/`\ - -`; - export default class PopupEditorDialog extends Container { private noteContext: NoteContext; @@ -110,10 +34,6 @@ export default class PopupEditorDialog extends Container { } async openInPopupEvent({ noteIdOrPath }: EventData<"openInPopup">) { - const $dialog = await openDialog(this.$widget, false, { - focus: false - }); - await this.noteContext.setNote(noteIdOrPath, { viewScope: { readOnlyTemporarilyDisabled: true diff --git a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx index e19032d460..789e0d0062 100644 --- a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx +++ b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx @@ -41,6 +41,7 @@ export default function CKEditorWithWatchdog({ containerRef: externalContainerRe const [ editor, setEditor ] = useState(); const { parentComponent, ntxId } = useNoteContext(); + console.log("Register with ntxId", ntxId); useKeyboardShortcuts("text-detail", containerRef, parentComponent, ntxId); useImperativeHandle(editorApi, () => ({ From 29f049c4118d098fd297327c50b3b7c1855e7ca3 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 19:11:20 +0200 Subject: [PATCH 132/697] chore(quick_edit): inject note context --- .../src/widgets/dialogs/PopupEditor.tsx | 21 +++++++++++++++++-- .../src/widgets/dialogs/popup_editor.ts | 9 ++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index 7969e3ac02..6b305fbb21 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -1,17 +1,34 @@ -import { useState } from "preact/hooks"; +import { useContext, useEffect, useState } from "preact/hooks"; import Modal from "../react/Modal"; import "./PopupEditor.css"; import { useTriliumEvent } from "../react/hooks"; import NoteTitleWidget from "../note_title"; import NoteIcon from "../note_icon"; +import NoteContext from "../../components/note_context"; +import { ParentComponent } from "../react/react_utils"; + +const noteContext = new NoteContext("_popup-editor"); export default function PopupEditor() { const [ shown, setShown ] = useState(false); + const parentComponent = useContext(ParentComponent); + + useTriliumEvent("openInPopup", async ({ noteIdOrPath }) => { + await noteContext.setNote(noteIdOrPath, { + viewScope: { + readOnlyTemporarilyDisabled: true + } + }); - useTriliumEvent("openInPopup", () => { setShown(true); }); + // Inject the note context + useEffect(() => { + if (!shown || !parentComponent) return; + parentComponent.handleEventInChildren("activeContextChanged", { noteContext }); + }, [ shown ]); + return ( { constructor() { super(); - this.noteContext = new NoteContext("_popup-editor"); + this.noteContext = } doRender() { @@ -34,11 +34,7 @@ export default class PopupEditorDialog extends Container { } async openInPopupEvent({ noteIdOrPath }: EventData<"openInPopup">) { - await this.noteContext.setNote(noteIdOrPath, { - viewScope: { - readOnlyTemporarilyDisabled: true - } - }); + const colorClass = this.noteContext.note?.getColorClass(); const wrapperElement = this.$wrapper.get(0)!; @@ -61,7 +57,6 @@ export default class PopupEditorDialog extends Container { } $dialog.on("shown.bs.modal", async () => { - await this.handleEventInChildren("activeContextChanged", { noteContext: this.noteContext }); this.setVisibility(true); await this.handleEventInChildren("focusOnDetail", { ntxId: this.noteContext.ntxId }); }); From 5531c15126b18857eae3f78233f07307c9fd71ee Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 19:17:50 +0200 Subject: [PATCH 133/697] chore(quick_edit): get note content to render --- apps/client/src/stylesheets/style.css | 2 +- .../src/widgets/dialogs/PopupEditor.css | 2 ++ .../src/widgets/dialogs/PopupEditor.tsx | 19 ++++++++++++------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css index 9ef1c5e2da..36805a3d4e 100644 --- a/apps/client/src/stylesheets/style.css +++ b/apps/client/src/stylesheets/style.css @@ -2591,7 +2591,7 @@ iframe.print-iframe { flex-direction: column; } -.scrolling-container > .note-detail.full-height, +.note-detail.full-height, .scrolling-container > .note-list-widget.full-height { position: relative; flex-grow: 1; diff --git a/apps/client/src/widgets/dialogs/PopupEditor.css b/apps/client/src/widgets/dialogs/PopupEditor.css index ce6494f339..325d9ea472 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.css +++ b/apps/client/src/widgets/dialogs/PopupEditor.css @@ -25,6 +25,8 @@ body.desktop .modal.popup-editor-dialog .modal-dialog { padding: 0; height: 75vh; overflow: auto; + display: flex; + flex-direction: column; } .modal.popup-editor-dialog .note-detail-editable-text { diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index 6b305fbb21..d28e7d6d80 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -6,6 +6,7 @@ import NoteTitleWidget from "../note_title"; import NoteIcon from "../note_icon"; import NoteContext from "../../components/note_context"; import { ParentComponent } from "../react/react_utils"; +import NoteDetail from "../NoteDetail"; const noteContext = new NoteContext("_popup-editor"); @@ -31,18 +32,22 @@ export default function PopupEditor() { return ( - - -
        - )} + title={} className="popup-editor-dialog" size="lg" show={shown} onHidden={() => setShown(false)} > - Body goes here + ) } + +export function TitleRow() { + return ( +
        + + +
        + ) +} From bb9cb2fb75e3fbde1835c82881804ead43c33e8a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 19:25:27 +0200 Subject: [PATCH 134/697] fix(quick_edit): note context not injected on first render --- .../src/widgets/dialogs/PopupEditor.tsx | 29 ++++++++----------- apps/client/src/widgets/react/hooks.tsx | 5 ++-- apps/client/src/widgets/react/react_utils.tsx | 3 ++ 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index d28e7d6d80..b19851bb9b 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -5,14 +5,13 @@ import { useTriliumEvent } from "../react/hooks"; import NoteTitleWidget from "../note_title"; import NoteIcon from "../note_icon"; import NoteContext from "../../components/note_context"; -import { ParentComponent } from "../react/react_utils"; +import { NoteContextContext, ParentComponent } from "../react/react_utils"; import NoteDetail from "../NoteDetail"; const noteContext = new NoteContext("_popup-editor"); export default function PopupEditor() { const [ shown, setShown ] = useState(false); - const parentComponent = useContext(ParentComponent); useTriliumEvent("openInPopup", async ({ noteIdOrPath }) => { await noteContext.setNote(noteIdOrPath, { @@ -24,22 +23,18 @@ export default function PopupEditor() { setShown(true); }); - // Inject the note context - useEffect(() => { - if (!shown || !parentComponent) return; - parentComponent.handleEventInChildren("activeContextChanged", { noteContext }); - }, [ shown ]); - return ( - } - className="popup-editor-dialog" - size="lg" - show={shown} - onHidden={() => setShown(false)} - > - - + + } + className="popup-editor-dialog" + size="lg" + show={shown} + onHidden={() => setShown(false)} + > + + + ) } diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index 856896f2cb..63fa4fff1f 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -2,7 +2,7 @@ import { CSSProperties } from "preact/compat"; import { DragData } from "../note_tree"; import { FilterLabelsByType, KeyboardActionNames, OptionNames, RelationNames } from "@triliumnext/commons"; import { MutableRef, useCallback, useContext, useDebugValue, useEffect, useLayoutEffect, useMemo, useRef, useState } from "preact/hooks"; -import { ParentComponent, refToJQuerySelector } from "./react_utils"; +import { NoteContextContext, ParentComponent, refToJQuerySelector } from "./react_utils"; import { RefObject, VNode } from "preact"; import { Tooltip } from "bootstrap"; import { ViewMode, ViewScope } from "../../services/link"; @@ -257,7 +257,8 @@ export function useUniqueName(prefix?: string) { } export function useNoteContext() { - const [ noteContext, setNoteContext ] = useState(); + const noteContextContext = useContext(NoteContextContext); + const [ noteContext, setNoteContext ] = useState(noteContextContext); const [ notePath, setNotePath ] = useState(); const [ note, setNote ] = useState(); const [ , setViewScope ] = useState(); diff --git a/apps/client/src/widgets/react/react_utils.tsx b/apps/client/src/widgets/react/react_utils.tsx index d752662f55..468a0e73ef 100644 --- a/apps/client/src/widgets/react/react_utils.tsx +++ b/apps/client/src/widgets/react/react_utils.tsx @@ -1,8 +1,11 @@ import { ComponentChild, createContext, render, type JSX, type RefObject } from "preact"; import Component from "../../components/component"; +import NoteContext from "../../components/note_context"; export const ParentComponent = createContext(null); +export const NoteContextContext = createContext(null); + /** * Takes in a React ref and returns a corresponding JQuery selector. * From 2f440eba37f62b1ca098a57b882ef50f6c7e19a0 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 19:34:14 +0200 Subject: [PATCH 135/697] chore(quick_edit): bring back focus --- apps/client/src/widgets/dialogs/PopupEditor.tsx | 4 ++++ apps/client/src/widgets/dialogs/popup_editor.ts | 1 - .../src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx | 1 - 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index b19851bb9b..070244b561 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -12,6 +12,7 @@ const noteContext = new NoteContext("_popup-editor"); export default function PopupEditor() { const [ shown, setShown ] = useState(false); + const parentComponent = useContext(ParentComponent); useTriliumEvent("openInPopup", async ({ noteIdOrPath }) => { await noteContext.setNote(noteIdOrPath, { @@ -30,6 +31,9 @@ export default function PopupEditor() { className="popup-editor-dialog" size="lg" show={shown} + onShown={() => { + parentComponent?.handleEvent("focusOnDetail", { ntxId: noteContext.ntxId }); + }} onHidden={() => setShown(false)} > diff --git a/apps/client/src/widgets/dialogs/popup_editor.ts b/apps/client/src/widgets/dialogs/popup_editor.ts index 9899ad163a..1cadb3ab66 100644 --- a/apps/client/src/widgets/dialogs/popup_editor.ts +++ b/apps/client/src/widgets/dialogs/popup_editor.ts @@ -58,7 +58,6 @@ export default class PopupEditorDialog extends Container { $dialog.on("shown.bs.modal", async () => { this.setVisibility(true); - await this.handleEventInChildren("focusOnDetail", { ntxId: this.noteContext.ntxId }); }); $dialog.on("hidden.bs.modal", () => { const $typeWidgetEl = $dialog.find(".note-detail-printable"); diff --git a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx index 789e0d0062..e19032d460 100644 --- a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx +++ b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx @@ -41,7 +41,6 @@ export default function CKEditorWithWatchdog({ containerRef: externalContainerRe const [ editor, setEditor ] = useState(); const { parentComponent, ntxId } = useNoteContext(); - console.log("Register with ntxId", ntxId); useKeyboardShortcuts("text-detail", containerRef, parentComponent, ntxId); useImperativeHandle(editorApi, () => ({ From 8001d940eb5cd39be6d8a77eafd797da419883b8 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 20:08:37 +0200 Subject: [PATCH 136/697] chore(quick_edit): bring back coloring --- .../src/widgets/dialogs/PopupEditor.tsx | 56 +++++++--- .../src/widgets/dialogs/popup_editor.ts | 101 ------------------ apps/client/src/widgets/react/hooks.tsx | 9 ++ 3 files changed, 49 insertions(+), 117 deletions(-) delete mode 100644 apps/client/src/widgets/dialogs/popup_editor.ts diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index 070244b561..583b13abd2 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -1,47 +1,71 @@ -import { useContext, useEffect, useState } from "preact/hooks"; +import { useContext, useEffect, useRef, useState } from "preact/hooks"; import Modal from "../react/Modal"; import "./PopupEditor.css"; -import { useTriliumEvent } from "../react/hooks"; +import { useNoteContext, useNoteLabel, useTriliumEvent } from "../react/hooks"; import NoteTitleWidget from "../note_title"; import NoteIcon from "../note_icon"; import NoteContext from "../../components/note_context"; import { NoteContextContext, ParentComponent } from "../react/react_utils"; import NoteDetail from "../NoteDetail"; - -const noteContext = new NoteContext("_popup-editor"); +import { ComponentChildren } from "preact"; export default function PopupEditor() { const [ shown, setShown ] = useState(false); const parentComponent = useContext(ParentComponent); + const [ noteContext, setNoteContext ] = useState(new NoteContext("_popup-editor")); useTriliumEvent("openInPopup", async ({ noteIdOrPath }) => { + const noteContext = new NoteContext("_popup-editor"); await noteContext.setNote(noteIdOrPath, { viewScope: { readOnlyTemporarilyDisabled: true } }); + setNoteContext(noteContext); setShown(true); }); return ( - } - className="popup-editor-dialog" - size="lg" - show={shown} - onShown={() => { - parentComponent?.handleEvent("focusOnDetail", { ntxId: noteContext.ntxId }); - }} - onHidden={() => setShown(false)} - > - - + + } + className="popup-editor-dialog" + size="lg" + show={shown} + onShown={() => { + parentComponent?.handleEvent("focusOnDetail", { ntxId: noteContext.ntxId }); + }} + onHidden={() => setShown(false)} + > + + + ) } +export function DialogWrapper({ children }: { children: ComponentChildren }) { + const { note, ntxId } = useNoteContext(); + const wrapperRef = useRef(null); + const colorClass = note?.getColorClass(); + const [ hasTint, setHasTint ] = useState(false); + + // Apply the tinted-dialog class only if the custom color CSS class specifies a hue + useEffect(() => { + if (!wrapperRef.current) return; + const customHue = getComputedStyle(wrapperRef.current).getPropertyValue("--custom-color-hue"); + setHasTint(!!customHue); + }, [ note, colorClass ]); + + return ( +
        + {children} +
        + ) +} + export function TitleRow() { return (
        diff --git a/apps/client/src/widgets/dialogs/popup_editor.ts b/apps/client/src/widgets/dialogs/popup_editor.ts deleted file mode 100644 index 1cadb3ab66..0000000000 --- a/apps/client/src/widgets/dialogs/popup_editor.ts +++ /dev/null @@ -1,101 +0,0 @@ -import type { EventNames, EventData } from "../../components/app_context.js"; -import NoteContext from "../../components/note_context.js"; -import { openDialog } from "../../services/dialog.js"; -import BasicWidget, { ReactWrappedWidget } from "../basic_widget.js"; -import Container from "../containers/container.js"; - -export default class PopupEditorDialog extends Container { - - private noteContext: NoteContext; - private $modalHeader!: JQuery; - private $modalBody!: JQuery; - private $wrapper!: JQuery; - - constructor() { - super(); - this.noteContext = - } - - doRender() { - // This will populate this.$widget with the content of the children. - super.doRender(); - - // Now we wrap it in the modal. - const $newWidget = $(TPL); - this.$modalHeader = $newWidget.find(".modal-title"); - this.$modalBody = $newWidget.find(".modal-body"); - this.$wrapper = $newWidget.find(".quick-edit-dialog-wrapper"); - - const children = this.$widget.children(); - this.$modalHeader.append(children[0]); - this.$modalBody.append(children.slice(1)); - this.$widget = $newWidget; - this.setVisibility(false); - } - - async openInPopupEvent({ noteIdOrPath }: EventData<"openInPopup">) { - - - const colorClass = this.noteContext.note?.getColorClass(); - const wrapperElement = this.$wrapper.get(0)!; - - if (colorClass) { - wrapperElement.className = "quick-edit-dialog-wrapper " + colorClass; - } else { - wrapperElement.className = "quick-edit-dialog-wrapper"; - } - - const customHue = getComputedStyle(wrapperElement).getPropertyValue("--custom-color-hue"); - if (customHue) { - /* Apply the tinted-dialog class only if the custom color CSS class specifies a hue */ - wrapperElement.classList.add("tinted-quick-edit-dialog"); - } - - const activeEl = document.activeElement; - if (activeEl && "blur" in activeEl) { - (activeEl as HTMLElement).blur(); - } - - $dialog.on("shown.bs.modal", async () => { - this.setVisibility(true); - }); - $dialog.on("hidden.bs.modal", () => { - const $typeWidgetEl = $dialog.find(".note-detail-printable"); - if ($typeWidgetEl.length) { - const typeWidget = glob.getComponentByEl($typeWidgetEl[0]) as ReactWrappedWidget; - typeWidget.cleanup(); - } - - this.setVisibility(false); - }); - } - - setVisibility(visible: boolean) { - const $bodyItems = this.$modalBody.find("> div"); - if (visible) { - $bodyItems.fadeIn(); - this.$modalHeader.children().show(); - document.body.classList.add("popup-editor-open"); - - } else { - $bodyItems.hide(); - this.$modalHeader.children().hide(); - document.body.classList.remove("popup-editor-open"); - } - } - - handleEventInChildren(name: T, data: EventData): Promise | null { - // Avoid events related to the current tab interfere with our popup. - if (["noteSwitched", "noteSwitchedAndActivated", "exportAsPdf", "printActiveNote"].includes(name)) { - return Promise.resolve(); - } - - // Avoid not showing recent notes when creating a new empty tab. - if ("noteContext" in data && data.noteContext.ntxId !== "_popup-editor") { - return Promise.resolve(); - } - - return super.handleEventInChildren(name, data); - } - -} diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index 63fa4fff1f..82d01750cb 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -265,11 +265,20 @@ export function useNoteContext() { const [ isReadOnlyTemporarilyDisabled, setIsReadOnlyTemporarilyDisabled ] = useState(noteContext?.viewScope?.isReadOnly); const [ refreshCounter, setRefreshCounter ] = useState(0); + useEffect(() => { + if (!noteContextContext) return; + setNoteContext(noteContextContext); + setNote(noteContextContext.note); + setNotePath(noteContextContext.notePath); + setViewScope(noteContextContext.viewScope); + }, [ noteContextContext ]); + useEffect(() => { setNote(noteContext?.note); }, [ notePath ]); useTriliumEvents([ "setNoteContext", "activeContextChanged", "noteSwitchedAndActivated", "noteSwitched" ], ({ noteContext }) => { + if (noteContextContext) return; setNoteContext(noteContext); setNotePath(noteContext.notePath); setViewScope(noteContext.viewScope); From 2985c762e62afe7eb088ea06e318d3e2c4b87c15 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 21:00:55 +0200 Subject: [PATCH 137/697] chore(quick_edit): add back most of the components --- apps/client/src/widgets/dialogs/PopupEditor.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index 583b13abd2..0d84e5ba52 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -1,13 +1,16 @@ import { useContext, useEffect, useRef, useState } from "preact/hooks"; import Modal from "../react/Modal"; import "./PopupEditor.css"; -import { useNoteContext, useNoteLabel, useTriliumEvent } from "../react/hooks"; +import { useNoteContext, useTriliumEvent } from "../react/hooks"; import NoteTitleWidget from "../note_title"; import NoteIcon from "../note_icon"; import NoteContext from "../../components/note_context"; import { NoteContextContext, ParentComponent } from "../react/react_utils"; import NoteDetail from "../NoteDetail"; import { ComponentChildren } from "preact"; +import NoteList from "../collections/NoteList"; +import StandaloneRibbonAdapter from "../ribbon/components/StandaloneRibbonAdapter"; +import FormattingToolbar from "../ribbon/FormattingToolbar"; export default function PopupEditor() { const [ shown, setShown ] = useState(false); @@ -39,7 +42,9 @@ export default function PopupEditor() { }} onHidden={() => setShown(false)} > + + From 6946da357185064c34896e6776a4c24774f9ec09 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 21:07:17 +0200 Subject: [PATCH 138/697] chore(mermaid): avoid crash if "Matrix is not invertible" --- .../src/widgets/type_widgets/helpers/SvgSplitEditor.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/type_widgets/helpers/SvgSplitEditor.tsx b/apps/client/src/widgets/type_widgets/helpers/SvgSplitEditor.tsx index 8a9e64a24a..7f95bfb1b6 100644 --- a/apps/client/src/widgets/type_widgets/helpers/SvgSplitEditor.tsx +++ b/apps/client/src/widgets/type_widgets/helpers/SvgSplitEditor.tsx @@ -163,7 +163,12 @@ function useResizer(containerRef: RefObject, noteId: string, svg pan: zoomInstance.getPan(), zoom: zoomInstance.getZoom() } - zoomInstance.destroy(); + try { + zoomInstance.destroy(); + } catch (e) { + // Sometimes crashes with "Matrix is not invertible" which can cause havoc such as breaking the popup editor from ever showing up again. + console.warn(e); + } }; }, [ svg ]); From 56c82d7f0fc255cc3015b39183ff90de6fcab48e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 21:20:24 +0200 Subject: [PATCH 139/697] chore(quick_edit): address requested changes --- apps/client/src/widgets/dialogs/PopupEditor.tsx | 4 ++-- apps/client/src/widgets/react/hooks.tsx | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index 0d84e5ba52..4950a41039 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -62,10 +62,10 @@ export function DialogWrapper({ children }: { children: ComponentChildren }) { if (!wrapperRef.current) return; const customHue = getComputedStyle(wrapperRef.current).getPropertyValue("--custom-color-hue"); setHasTint(!!customHue); - }, [ note, colorClass ]); + }, [ note ]); return ( -
        +
        {children}
        ) diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index 82d01750cb..f30957befd 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -271,6 +271,7 @@ export function useNoteContext() { setNote(noteContextContext.note); setNotePath(noteContextContext.notePath); setViewScope(noteContextContext.viewScope); + setIsReadOnlyTemporarilyDisabled(noteContextContext?.viewScope?.readOnlyTemporarilyDisabled); }, [ noteContextContext ]); useEffect(() => { @@ -292,6 +293,7 @@ export function useNoteContext() { } }); useTriliumEvent("readOnlyTemporarilyDisabled", ({ noteContext: eventNoteContext }) => { + if (noteContextContext) return; if (eventNoteContext.ntxId === noteContext?.ntxId) { setIsReadOnlyTemporarilyDisabled(eventNoteContext?.viewScope?.readOnlyTemporarilyDisabled); } From 26f7264f3cb93f658f41bb67c30a259b0e1d163b Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 21:37:37 +0200 Subject: [PATCH 140/697] chore(client): fix typecheck --- apps/client/src/widgets/react/hooks.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index f30957befd..34a7c9ed8a 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -258,7 +258,7 @@ export function useUniqueName(prefix?: string) { export function useNoteContext() { const noteContextContext = useContext(NoteContextContext); - const [ noteContext, setNoteContext ] = useState(noteContextContext); + const [ noteContext, setNoteContext ] = useState(noteContextContext ?? undefined); const [ notePath, setNotePath ] = useState(); const [ note, setNote ] = useState(); const [ , setViewScope ] = useState(); From 5edc4abfb42d8fe1ef71bb2fbca5d882832bfc3a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 21:37:41 +0200 Subject: [PATCH 141/697] chore(quick_edit): address requested changes --- apps/client/src/widgets/dialogs/PopupEditor.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx index 4950a41039..c2d98b5441 100644 --- a/apps/client/src/widgets/dialogs/PopupEditor.tsx +++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx @@ -29,6 +29,11 @@ export default function PopupEditor() { setShown(true); }); + // Add a global class to be able to handle issues with z-index due to rendering in a popup. + useEffect(() => { + document.body.classList.toggle("popup-editor-open", shown); + }, [shown]); + return ( @@ -52,9 +57,8 @@ export default function PopupEditor() { } export function DialogWrapper({ children }: { children: ComponentChildren }) { - const { note, ntxId } = useNoteContext(); + const { note } = useNoteContext(); const wrapperRef = useRef(null); - const colorClass = note?.getColorClass(); const [ hasTint, setHasTint ] = useState(false); // Apply the tinted-dialog class only if the custom color CSS class specifies a hue From 98bf63e94b043c752cc43c42db69056591c06b6e Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 21:58:52 +0200 Subject: [PATCH 142/697] chore(promoted_attributes): start with empty widget --- apps/client/src/layouts/desktop_layout.tsx | 4 ++-- apps/client/src/layouts/mobile_layout.tsx | 4 ++-- apps/client/src/widgets/PromotedAttributes.tsx | 3 +++ 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 apps/client/src/widgets/PromotedAttributes.tsx diff --git a/apps/client/src/layouts/desktop_layout.tsx b/apps/client/src/layouts/desktop_layout.tsx index cbce8fb18a..3128581a9f 100644 --- a/apps/client/src/layouts/desktop_layout.tsx +++ b/apps/client/src/layouts/desktop_layout.tsx @@ -21,7 +21,6 @@ import NoteTreeWidget from "../widgets/note_tree.js"; import NoteWrapperWidget from "../widgets/note_wrapper.js"; import options from "../services/options.js"; import PasswordNoteSetDialog from "../widgets/dialogs/password_not_set.js"; -import PromotedAttributesWidget from "../widgets/promoted_attributes.js"; import QuickSearchWidget from "../widgets/quick_search.js"; import ReadOnlyNoteInfoBar from "../widgets/ReadOnlyNoteInfoBar.jsx"; import Ribbon from "../widgets/ribbon/Ribbon.jsx"; @@ -45,6 +44,7 @@ import utils from "../services/utils.js"; import WatchedFileUpdateStatusWidget from "../widgets/watched_file_update_status.js"; import NoteDetail from "../widgets/NoteDetail.jsx"; import RightPanelWidget from "../widgets/sidebar/RightPanelWidget.jsx"; +import PromotedAttributes from "../widgets/PromotedAttributes.jsx"; export default class DesktopLayout { @@ -141,7 +141,7 @@ export default class DesktopLayout { .child() .child() ) - .child(new PromotedAttributesWidget()) + .child() .child() .child() .child() diff --git a/apps/client/src/layouts/mobile_layout.tsx b/apps/client/src/layouts/mobile_layout.tsx index c51ef9e92a..e08d48b616 100644 --- a/apps/client/src/layouts/mobile_layout.tsx +++ b/apps/client/src/layouts/mobile_layout.tsx @@ -13,7 +13,6 @@ import NoteTitleWidget from "../widgets/note_title.js"; import ContentHeader from "../widgets/containers/content_header.js"; import NoteTreeWidget from "../widgets/note_tree.js"; import NoteWrapperWidget from "../widgets/note_wrapper.js"; -import PromotedAttributesWidget from "../widgets/promoted_attributes.js"; import QuickSearchWidget from "../widgets/quick_search.js"; import ReadOnlyNoteInfoBar from "../widgets/ReadOnlyNoteInfoBar.jsx"; import RootContainer from "../widgets/containers/root_container.js"; @@ -29,6 +28,7 @@ import ToggleSidebarButton from "../widgets/mobile_widgets/toggle_sidebar_button import type AppContext from "../components/app_context.js"; import NoteDetail from "../widgets/NoteDetail.jsx"; import MobileEditorToolbar from "../widgets/type_widgets/text/mobile_editor_toolbar.jsx"; +import PromotedAttributes from "../widgets/PromotedAttributes.jsx"; const MOBILE_CSS = ` - - -
        `; - // TODO: Deduplicate interface AttributeResult { attributeId: string; @@ -126,36 +30,12 @@ export default class PromotedAttributesWidget extends NoteContextAwareWidget { } doRender() { - this.$widget = $(TPL); this.contentSized(); - this.$container = this.$widget.find(".promoted-attributes-container"); - } - - getTitle(note: FNote) { - const promotedDefAttrs = note.getPromotedDefinitionAttributes(); - - if (promotedDefAttrs.length === 0) { - return { show: false }; - } - - return { - show: true, - activate: options.is("promotedAttributesOpenInRibbon"), - title: t("promoted_attributes.promoted_attributes"), - icon: "bx bx-table" - }; } async refreshWithNote(note: FNote) { this.$container.empty(); - const promotedDefAttrs = note.getPromotedDefinitionAttributes(); - const ownedAttributes = note.getOwnedAttributes(); - // attrs are not resorted if position changes after the initial load - // promoted attrs are sorted primarily by order of definitions, but with multi-valued promoted attrs - // the order of attributes is important as well - ownedAttributes.sort((a, b) => a.position - b.position); - if (promotedDefAttrs.length === 0 || note.getLabelValue("viewType") === "table") { this.toggleInt(false); return; @@ -163,33 +43,13 @@ export default class PromotedAttributesWidget extends NoteContextAwareWidget { const $cells: JQuery[] = []; - for (const definitionAttr of promotedDefAttrs) { - const valueType = definitionAttr.name.startsWith("label:") ? "label" : "relation"; - const valueName = definitionAttr.name.substr(valueType.length + 1); - - let valueAttrs = ownedAttributes.filter((el) => el.name === valueName && el.type === valueType) as Attribute[]; - - if (valueAttrs.length === 0) { - valueAttrs.push({ - attributeId: "", - type: valueType, - name: valueName, - value: "" - }); - } - - if (definitionAttr.getDefinition().multiplicity === "single") { - valueAttrs = valueAttrs.slice(0, 1); - } - - for (const valueAttr of valueAttrs) { + for (const valueAttr of valueAttrs) { const $cell = await this.createPromotedAttributeCell(definitionAttr, valueAttr, valueName); if ($cell) { $cells.push($cell); } } - } // we replace the whole content in one step, so there can't be any race conditions // (previously we saw promoted attributes doubling) From 33c3fb7de012d5cd614aff8b901750e2570403bc Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 22 Nov 2025 22:25:32 +0200 Subject: [PATCH 144/697] chore(react/promoted_attributes): reintroduce labels --- .../client/src/widgets/PromotedAttributes.css | 4 +++ .../client/src/widgets/PromotedAttributes.tsx | 33 ++++++++++++++++--- .../client/src/widgets/promoted_attributes.ts | 12 ------- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/apps/client/src/widgets/PromotedAttributes.css b/apps/client/src/widgets/PromotedAttributes.css index ea95fd4559..45ebad5b28 100644 --- a/apps/client/src/widgets/PromotedAttributes.css +++ b/apps/client/src/widgets/PromotedAttributes.css @@ -4,6 +4,10 @@ body.mobile .promoted-attributes-widget { overflow: auto; } +.component.promoted-attributes-widget { + contain: none; +} + .promoted-attributes-container { margin: 0 1.5em; overflow: auto; diff --git a/apps/client/src/widgets/PromotedAttributes.tsx b/apps/client/src/widgets/PromotedAttributes.tsx index 58ed873368..49b4c33efb 100644 --- a/apps/client/src/widgets/PromotedAttributes.tsx +++ b/apps/client/src/widgets/PromotedAttributes.tsx @@ -2,10 +2,17 @@ import { useEffect, useState } from "preact/hooks"; import "./PromotedAttributes.css"; import { useNoteContext } from "./react/hooks"; import { Attribute } from "../services/attribute_parser"; +import FAttribute from "../entities/fattribute"; + +interface Cell { + definitionAttr: FAttribute; + valueAttr: Attribute; + valueName: string; +} export default function PromotedAttributes() { const { note } = useNoteContext(); - const [ cells, setCells ] = useState(); + const [ cells, setCells ] = useState(); useEffect(() => { if (!note) return; @@ -16,7 +23,7 @@ export default function PromotedAttributes() { // the order of attributes is important as well ownedAttributes.sort((a, b) => a.position - b.position); - const cells: Attribute[] = []; + const cells: Cell[] = []; for (const definitionAttr of promotedDefAttrs) { const valueType = definitionAttr.name.startsWith("label:") ? "label" : "relation"; const valueName = definitionAttr.name.substr(valueType.length + 1); @@ -36,7 +43,9 @@ export default function PromotedAttributes() { valueAttrs = valueAttrs.slice(0, 1); } - cells.push(...valueAttrs); + for (const valueAttr of valueAttrs) { + cells.push({ definitionAttr, valueAttr, valueName }); + } } setCells(cells); }, [ note ]); @@ -44,8 +53,24 @@ export default function PromotedAttributes() { return (
        - + {cells?.map(cell => )}
        ); } + +function PromotedAttributeCell({ cell }: { cell: Cell }) { + const { valueName, valueAttr, definitionAttr } = cell; + const inputId = `value-${valueAttr.attributeId}`; + const definition = definitionAttr.getDefinition(); + + return ( +
        + + +
        + ) +} diff --git a/apps/client/src/widgets/promoted_attributes.ts b/apps/client/src/widgets/promoted_attributes.ts index 7620bfa4be..4ddcb7d7ed 100644 --- a/apps/client/src/widgets/promoted_attributes.ts +++ b/apps/client/src/widgets/promoted_attributes.ts @@ -21,14 +21,6 @@ export default class PromotedAttributesWidget extends NoteContextAwareWidget { private $container!: JQuery; - get name() { - return "promotedAttributes"; - } - - get toggleCommand() { - return "toggleRibbonTabPromotedAttributes"; - } - doRender() { this.contentSized(); } @@ -59,11 +51,8 @@ export default class PromotedAttributesWidget extends NoteContextAwareWidget { async createPromotedAttributeCell(definitionAttr: FAttribute, valueAttr: Attribute, valueName: string) { const definition = definitionAttr.getDefinition(); - const id = `value-${valueAttr.attributeId}`; const $input = $("") - .prop("tabindex", 200 + definitionAttr.position) - .prop("id", id) .attr("data-attribute-id", valueAttr.noteId === this.noteId ? valueAttr.attributeId ?? "" : "") // if not owned, we'll force creation of a new attribute instead of updating the inherited one .attr("data-attribute-type", valueAttr.type) .attr("data-attribute-name", valueAttr.name) @@ -79,7 +68,6 @@ export default class PromotedAttributesWidget extends NoteContextAwareWidget { const $wrapper = $('