From e011f991616193a3d9ef55b14fac8c535c69e27f Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Mon, 17 Nov 2025 18:58:40 +0200 Subject: [PATCH 01/46] 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 9efdac65f..d4e9693d8 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 02/46] 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 000000000..882881063 --- /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 7384573d8..b85648a85 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 03/46] 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 000000000..205ac9a29 --- /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 882881063..d9b9a3d41 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 04/46] 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 205ac9a29..1f56926a9 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 d9b9a3d41..11ca42c48 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 05/46] 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 d4e9693d8..4e28d7768 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 06/46] 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 b15ba376d..31de26de5 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 07/46] 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 0c818a111..ba071cf64 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 08/46] 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 dd583e266..a0a6c8fc6 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 09/46] 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 eb0a303ae..11d4477ca 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 10/46] 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 11ca42c48..729c7c50b 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 11/46] 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 729c7c50b..b9e6d876a 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 12/46] 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 b9e6d876a..030a853e4 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 13/46] 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 b85648a85..b4b19cabd 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 14/46] 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 b4b19cabd..972f21c11 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 15/46] 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 030a853e4..3d0b5e7fd 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 972f21c11..b02eaf970 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 ba071cf64..551e96a49 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 31de26de5..5120fcc97 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 a0a6c8fc6..c4cf6ebf4 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 11d4477ca..1218dbf6c 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 16/46] 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 3d0b5e7fd..60757aa15 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 17/46] 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 60757aa15..14a908cc8 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 18/46] 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 14a908cc8..b87387a8f 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 000000000..b37c4118a --- /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 19/46] 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 1f56926a9..e94511138 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 b87387a8f..66b4010d9 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 20/46] 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 e94511138..35029699f 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 66b4010d9..3db626013 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 21/46] 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 b37c4118a..9057d039f 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 22/46] 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 35029699f..d062ea577 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 3db626013..96f7eba54 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 17:42:36 +0200 Subject: [PATCH 23/46] 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 96f7eba54..3e38c7809 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 24/46] 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 3e38c7809..3733b219b 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 25/46] 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 3733b219b..1917c587c 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 54025d690..aa8c5926c 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 b0e412b35..5750bb331 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 26/46] 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 d062ea577..09eb356b8 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 27/46] 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 09eb356b8..93a56ec0c 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 1917c587c..c74f83919 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 28/46] 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 c74f83919..0c0941adc 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 b02eaf970..35480cfc6 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 551e96a49..c834b4c8d 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 5120fcc97..0195d131c 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 c4cf6ebf4..f4161fad9 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 1218dbf6c..80b1c93c2 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 e4c928ae877b88e1e2d5e42e92402197130d04ff Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 19:11:51 +0200 Subject: [PATCH 29/46] 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 0c0941adc..16a17655f 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 926f0f85f3846f52fdb0646c5117fb1dbf3f35e9 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 20 Nov 2025 23:10:36 +0200 Subject: [PATCH 30/46] 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 cd1317e2b..8bdbb9485 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 16a17655f..05041d898 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 31/46] 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 4ce8b1cd7..e127db1aa 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 5976f1dfb..ba83af30a 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 32/46] 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 e127db1aa..60ad28237 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 33/46] 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 05041d898..06ae6dc96 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 34/46] 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 35480cfc6..19e6f4e16 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 35/46] 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 06ae6dc96..9a65073a7 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 36/46] 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 9a65073a7..775769261 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 37/46] 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 93a56ec0c..f4d6f642f 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 775769261..08bc7c84a 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 38/46] 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 0b22d041b..0ff9bafb2 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 d610abb2b..47a516bc9 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 37bf449f4..8713c5723 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 340a6c676..03df468fa 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 39/46] 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 5c90f4d56..415244dd6 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 0b22d041b..05a1063d9 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 340a6c676..9304a4219 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 40/46] 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 3df797a59..bcd66fb3c 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 37bf449f4..7029de250 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 340a6c676..ad90f6a0c 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 41/46] 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 4be4fac5a..f83206a69 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 c523c2f1d..aff87f349 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 5e8fb1301..25b44a899 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 f9174fb42..041a31ea4 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 e66e79eaf..e85239bcc 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 cd30b44d0..4ca30ba1a 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 68e102a65..49258d1be 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 37fbe8c5d..cce3629d5 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 7a87cc192..cb141375c 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 42/46] 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 c33a3f825..20b0d786c 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 43/46] 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 42c2d867d..b662d26e8 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 44/46] 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 77f455067..022262c9f 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 45/46] 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 23d03330c..b6a98a290 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 47a516bc9..6f5c81858 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 9ce4c153b..c69db6253 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 da24bcb3b..0d01ce409 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 5785e099f..974da5771 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 780438a45..c076f208f 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 b39eaf7f8..fbd21f7d1 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 0467c0406..76e0e9df9 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 4b1ca7da2..d66f9bfa2 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 46/46] 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 eae942344..857c0935b 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); }