From 60b74f5959b88b4c04082a9f5d53ceed720e920a Mon Sep 17 00:00:00 2001 From: BeatLink Date: Sun, 22 Feb 2026 18:13:08 -0500 Subject: [PATCH 01/51] Add Recurrence Support for Calendar --- apps/client/package.json | 1 + .../collections/calendar/event_builder.ts | 19 +++++- .../widgets/collections/calendar/index.tsx | 1 + pnpm-lock.yaml | 65 +++++++++++++------ 4 files changed, 63 insertions(+), 23 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 7acbff720f..9db5093b45 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -23,6 +23,7 @@ "@fullcalendar/list": "6.1.20", "@fullcalendar/multimonth": "6.1.20", "@fullcalendar/timegrid": "6.1.20", + "@fullcalendar/rrule": "6.1.20", "@maplibre/maplibre-gl-leaflet": "0.1.3", "@mermaid-js/layout-elk": "0.2.0", "@mind-elixir/node-menu": "5.0.1", diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index f4611ccd7e..19ff80bdc7 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -11,7 +11,8 @@ interface Event { endDate?: string | null, startTime?: string | null, endTime?: string | null, - isArchived?: boolean; + isArchived?: boolean, + recurrence?: string | null; } export async function buildEvents(noteIds: string[]) { @@ -28,8 +29,9 @@ export async function buildEvents(noteIds: string[]) { const endDate = getCustomisableLabel(note, "endDate", "calendar:endDate"); const startTime = getCustomisableLabel(note, "startTime", "calendar:startTime"); const endTime = getCustomisableLabel(note, "endTime", "calendar:endTime"); + const recurrence = getCustomisableLabel(note, "recurrence", "calendar:recurrence"); const isArchived = note.hasLabel("archived"); - events.push(await buildEvent(note, { startDate, endDate, startTime, endTime, isArchived })); + events.push(await buildEvent(note, { startDate, endDate, startTime, endTime, recurrence, isArchived })); } return events.flat(); @@ -79,7 +81,7 @@ export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg) return events.flat(); } -export async function buildEvent(note: FNote, { startDate, endDate, startTime, endTime, isArchived }: Event) { +export async function buildEvent(note: FNote, { startDate, endDate, startTime, endTime, recurrence, isArchived }: Event) { const customTitleAttributeName = note.getLabelValue("calendar:title"); const titles = await parseCustomTitle(customTitleAttributeName, note); const colorClass = note.getColorClass(); @@ -118,6 +120,17 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e if (endDate) { eventData.end = endDate; } + + if (recurrence) { + eventData.rrule = `DTSTART:${startDate.replace(/[-:]/g, "")}\n${recurrence}`; + if (endDate){ + const duration = (d => + String(d / 36e5 | 0).padStart(2, "0") + ":" + + String(d / 6e4 % 60 | 0).padStart(2, "0") + )((new Date(endDate)) - (new Date(startDate))); + eventData.duration = duration + } + } events.push(eventData); } return events; diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 23f8371125..349d666e6c 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -252,6 +252,7 @@ function usePlugins(isEditable: boolean, isCalendarRoot: boolean) { plugins.push((await import("@fullcalendar/timegrid")).default); plugins.push((await import("@fullcalendar/list")).default); plugins.push((await import("@fullcalendar/multimonth")).default); + plugins.push((await import("@fullcalendar/rrule")).default); if (isEditable || isCalendarRoot) { plugins.push((await import("@fullcalendar/interaction")).default); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55a6484280..6b1e2d6e85 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -200,6 +200,9 @@ importers: '@fullcalendar/multimonth': specifier: 6.1.20 version: 6.1.20(@fullcalendar/core@6.1.20) + '@fullcalendar/rrule': + specifier: 6.1.20 + version: 6.1.20(@fullcalendar/core@6.1.20)(rrule@2.8.1) '@fullcalendar/timegrid': specifier: 6.1.20 version: 6.1.20(@fullcalendar/core@6.1.20) @@ -3392,6 +3395,12 @@ packages: peerDependencies: '@fullcalendar/core': ~6.1.20 + '@fullcalendar/rrule@6.1.20': + resolution: {integrity: sha512-5Awk7bmaA97hSZRpIBehenXkYreVIvx8nnaMFZ/LDGRuK1mgbR4vSUrDTvVU+oEqqKnj/rqMBByWqN5NeehQxw==} + peerDependencies: + '@fullcalendar/core': ~6.1.20 + rrule: ^2.6.0 + '@fullcalendar/timegrid@6.1.20': resolution: {integrity: sha512-4H+/MWbz3ntA50lrPif+7TsvMeX3R1GSYjiLULz0+zEJ7/Yfd9pupZmAwUs/PBpA6aAcFmeRr0laWfcz1a9V1A==} peerDependencies: @@ -13031,6 +13040,9 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + rrule@2.8.1: + resolution: {integrity: sha512-hM3dHSBMeaJ0Ktp7W38BJZ7O1zOgaFEsn41PDk+yHoEtfLV+PoJt9E9xAlZiWgf/iqEqionN0ebHFZIDAp+iGw==} + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -15950,6 +15962,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-upload': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)': dependencies: @@ -16090,12 +16104,16 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-cloud-services@47.4.0': dependencies: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16107,6 +16125,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-collaboration-core@47.4.0': dependencies: @@ -16286,6 +16306,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16306,6 +16328,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-inline@47.4.0': dependencies: @@ -16375,6 +16399,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-undo': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-export-inline-styles@47.4.0': dependencies: @@ -16417,6 +16443,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-font@47.4.0': dependencies: @@ -16480,6 +16508,8 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-horizontal-line@47.4.0': dependencies: @@ -16489,6 +16519,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-embed@47.4.0': dependencies: @@ -16515,6 +16547,8 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-icons@47.4.0': {} @@ -16658,6 +16692,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-mention@47.4.0(patch_hash=5981fb59ba35829e4dff1d39cf771000f8a8fdfa7a34b51d8af9549541f2d62d)': dependencies: @@ -16667,8 +16703,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-merge-fields@47.4.0': dependencies: @@ -16689,8 +16723,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-operations-compressor@47.4.0': dependencies: @@ -16745,8 +16777,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-pagination@47.4.0': dependencies: @@ -16854,8 +16884,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-slash-command@47.4.0': dependencies: @@ -16868,8 +16896,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-source-editing-enhanced@47.4.0': dependencies: @@ -16917,8 +16943,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-table@47.4.0': dependencies: @@ -16931,8 +16955,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-template@47.4.0': dependencies: @@ -17007,8 +17029,6 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -17045,8 +17065,6 @@ snapshots: '@ckeditor/ckeditor5-engine': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-widget@47.4.0': dependencies: @@ -17066,8 +17084,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@codemirror/autocomplete@6.18.6': dependencies: @@ -18409,6 +18425,11 @@ snapshots: '@fullcalendar/core': 6.1.20 '@fullcalendar/daygrid': 6.1.20(@fullcalendar/core@6.1.20) + '@fullcalendar/rrule@6.1.20(@fullcalendar/core@6.1.20)(rrule@2.8.1)': + dependencies: + '@fullcalendar/core': 6.1.20 + rrule: 2.8.1 + '@fullcalendar/timegrid@6.1.20(@fullcalendar/core@6.1.20)': dependencies: '@fullcalendar/core': 6.1.20 @@ -30031,6 +30052,10 @@ snapshots: transitivePeerDependencies: - supports-color + rrule@2.8.1: + dependencies: + tslib: 2.8.1 + rrweb-cssom@0.8.0: optional: true From e53cd7443a37958dd9b78d1deeab1e92d5d484a1 Mon Sep 17 00:00:00 2001 From: BeatLink Date: Sun, 22 Feb 2026 18:22:21 -0500 Subject: [PATCH 02/51] Add Docs for Recurrence --- .../User Guide/User Guide/Collections/Calendar.html | 12 ++++++++++++ docs/User Guide/User Guide/Collections/Calendar.md | 5 +++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html index 472192219c..6675a93c86 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html @@ -185,6 +185,18 @@ at which the event ends (in relation with endDate if present, or startDate). + + #recurrence + + This is an optional CalDAV RRULE string + that if present, determines whether a task should repeat or not. Note that + it does not include the DTSTART attribute, + which is derived from the #startDate and + #startTimedirectly. For examples of valid RRULE strings + see https://icalendar.org/rrule-tool.html + + #color diff --git a/docs/User Guide/User Guide/Collections/Calendar.md b/docs/User Guide/User Guide/Collections/Calendar.md index f7309feacd..e0be591847 100644 --- a/docs/User Guide/User Guide/Collections/Calendar.md +++ b/docs/User Guide/User Guide/Collections/Calendar.md @@ -72,11 +72,12 @@ For each note of the calendar, the following attributes can be used: | `#endDate` | Similar to `startDate`, mentions the end date if the event spans across multiple days. The date is inclusive, so the end day is also considered. The attribute can be missing for single-day events. | | `#startTime` | The time the event starts at. If this value is missing, then the event is considered a full-day event. The format is `HH:MM` (hours in 24-hour format and minutes). | | `#endTime` | Similar to `startTime`, it mentions the time at which the event ends (in relation with `endDate` if present, or `startDate`). | +| `#recurrence` | This is an optional CalDAV `RRULE` string that if present, determines whether a task should repeat or not. Note that it does not include the `DTSTART` attribute, which is derived from the `#startDate` and `#startTime` directly. For examples of valid `RRULE` strings see [https://icalendar.org/rrule-tool.html](https://icalendar.org/rrule-tool.html) | | `#color` | Displays the event with a specified color (named such as `red`, `gray` or hex such as `#FF0000`). This will also change the color of the note in other places such as the note tree. | -| `#calendar:color` | **❌️ Removed since v0.100.0. Use** `**#color**` **instead.** 

Similar to `#color`, but applies the color only for the event in the calendar and not for other places such as the note tree. | +| `#calendar:color` | **❌️ Removed since v0.100.0. Use** `**#color**` **instead.**  

Similar to `#color`, but applies the color only for the event in the calendar and not for other places such as the note tree. | | `#iconClass` | If present, the icon of the note will be displayed to the left of the event title. | | `#calendar:title` | Changes the title of an event to point to an attribute of the note other than the title, can either a label or a relation (without the `#` or `~` symbol). See _Use-cases_ for more information. | -| `#calendar:displayedAttributes` | Allows displaying the value of one or more attributes in the calendar like this:      

![](7_Calendar_image.png)     

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

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

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

![](7_Calendar_image.png)      

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

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

`~assignee=@My assignee #calendar:displayedAttributes="assignee"` | | `#calendar:startDate` | Allows using a different label to represent the start date, other than `startDate` (e.g. `expiryDate`). The label name **must not be** prefixed with `#`. If the label is not defined for a note, the default will be used instead. | | `#calendar:endDate` | Similar to `#calendar:startDate`, allows changing the attribute which is being used to read the end date. | | `#calendar:startTime` | Similar to `#calendar:startDate`, allows changing the attribute which is being used to read the start time. | From 9b456391484a56e017123ea9f1171cfe1e39145e Mon Sep 17 00:00:00 2001 From: BeatLink Date: Sun, 22 Feb 2026 18:43:18 -0500 Subject: [PATCH 03/51] Update apps/client/src/widgets/collections/calendar/event_builder.ts Replace end with duration if recurrence set. Make duration calculation clearer Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .../src/widgets/collections/calendar/event_builder.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index 19ff80bdc7..4967a5ca1b 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -122,13 +122,13 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e } if (recurrence) { + delete eventData.end; eventData.rrule = `DTSTART:${startDate.replace(/[-:]/g, "")}\n${recurrence}`; if (endDate){ - const duration = (d => - String(d / 36e5 | 0).padStart(2, "0") + ":" + - String(d / 6e4 % 60 | 0).padStart(2, "0") - )((new Date(endDate)) - (new Date(startDate))); - eventData.duration = duration + const diffMs = new Date(endDate).getTime() - new Date(startDate).getTime(); + const hours = Math.floor(diffMs / 3600000); + const minutes = Math.floor((diffMs / 60000) % 60); + eventData.duration = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; } } events.push(eventData); From e03bd3d7162d0e06ab14bf22a48a3fb504f2a0d9 Mon Sep 17 00:00:00 2001 From: Christian Barcenas Date: Tue, 24 Feb 2026 00:22:49 +0100 Subject: [PATCH 04/51] fix(desktop): use exec in launcher scripts --- apps/desktop/electron-forge/trilium-no-cert-check.sh | 2 +- apps/desktop/electron-forge/trilium-portable.sh | 2 +- apps/desktop/electron-forge/trilium-safe-mode.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/desktop/electron-forge/trilium-no-cert-check.sh b/apps/desktop/electron-forge/trilium-no-cert-check.sh index 42ec8bb81d..42dfe1cc8c 100644 --- a/apps/desktop/electron-forge/trilium-no-cert-check.sh +++ b/apps/desktop/electron-forge/trilium-no-cert-check.sh @@ -3,5 +3,5 @@ DIR=`dirname "$0"` export NODE_TLS_REJECT_UNAUTHORIZED=0 -"$DIR/trilium" +exec "$DIR/trilium" diff --git a/apps/desktop/electron-forge/trilium-portable.sh b/apps/desktop/electron-forge/trilium-portable.sh index 04edfde476..1f69a09a18 100644 --- a/apps/desktop/electron-forge/trilium-portable.sh +++ b/apps/desktop/electron-forge/trilium-portable.sh @@ -3,5 +3,5 @@ DIR=`dirname "$0"` export TRILIUM_DATA_DIR="$DIR/trilium-data" -"$DIR/trilium" +exec "$DIR/trilium" diff --git a/apps/desktop/electron-forge/trilium-safe-mode.sh b/apps/desktop/electron-forge/trilium-safe-mode.sh index 5221d4d611..35851fd2c0 100644 --- a/apps/desktop/electron-forge/trilium-safe-mode.sh +++ b/apps/desktop/electron-forge/trilium-safe-mode.sh @@ -3,5 +3,5 @@ DIR=`dirname "$0"` export TRILIUM_SAFE_MODE=1 -"$DIR/trilium" --disable-gpu +exec "$DIR/trilium" --disable-gpu From 8efbb8819b8afbcc2374857f8b9c652eafab0d6c Mon Sep 17 00:00:00 2001 From: Christian Barcenas Date: Tue, 24 Feb 2026 00:22:49 +0100 Subject: [PATCH 05/51] fix(server): use exec in launcher script --- apps/server/scripts/build-server.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/server/scripts/build-server.sh b/apps/server/scripts/build-server.sh index 6396b314bd..d828f65e18 100644 --- a/apps/server/scripts/build-server.sh +++ b/apps/server/scripts/build-server.sh @@ -43,7 +43,7 @@ rm -rf $BUILD_DIR/node/lib/node_modules/{npm,corepack} \ $BUILD_DIR/node_modules/electron* \ $BUILD_DIR/electron*.{js,map} -printf "#!/bin/sh\n./node/bin/node main.cjs\n" > $BUILD_DIR/trilium.sh +printf "#!/bin/sh\nexec ./node/bin/node main.cjs\n" > $BUILD_DIR/trilium.sh chmod 755 $BUILD_DIR/trilium.sh VERSION=`jq -r ".version" package.json` From 4b4b427d2bae6c0619d3fb002133f8a3d01fb42c Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 25 Feb 2026 18:33:53 +0200 Subject: [PATCH 06/51] style: tweak layout --- apps/client/src/widgets/layout/NoteTitleActions.css | 4 ++-- apps/client/src/widgets/layout/NoteTypeSwitcher.css | 1 - apps/client/src/widgets/search_result.css | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/client/src/widgets/layout/NoteTitleActions.css b/apps/client/src/widgets/layout/NoteTitleActions.css index 4ae4c15816..92e9109549 100644 --- a/apps/client/src/widgets/layout/NoteTitleActions.css +++ b/apps/client/src/widgets/layout/NoteTitleActions.css @@ -4,8 +4,8 @@ body.experimental-feature-new-layout { } .title-actions { - --title-actions-padding-start: 12px; - --title-actions-padding-end: 8px; + --title-actions-padding-start: var(--content-margin-inline); + --title-actions-padding-end: var(--content-margin-inline); display: flex; max-width: var(--max-content-width); diff --git a/apps/client/src/widgets/layout/NoteTypeSwitcher.css b/apps/client/src/widgets/layout/NoteTypeSwitcher.css index 574924d037..495d055d32 100644 --- a/apps/client/src/widgets/layout/NoteTypeSwitcher.css +++ b/apps/client/src/widgets/layout/NoteTypeSwitcher.css @@ -11,7 +11,6 @@ position: relative; top: 5px; - padding: .25em 0; display: flex; align-items: center; overflow-x: auto; diff --git a/apps/client/src/widgets/search_result.css b/apps/client/src/widgets/search_result.css index 13acf04e9d..8888bd01ac 100644 --- a/apps/client/src/widgets/search_result.css +++ b/apps/client/src/widgets/search_result.css @@ -4,8 +4,8 @@ contain: none !important; } -.search-result-widget .note-list { - padding: 10px; +.search-result-widget .note-list-wrapper { + margin-inline: var(--content-margin-inline); } .note-split.type-search .scrolling-container { From 843e4d45e6f612dd53bab0793d59d6d73c5c8c1b Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 25 Feb 2026 18:55:57 +0200 Subject: [PATCH 07/51] style: tweak layout --- apps/client/src/widgets/layout/NoteTitleActions.css | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/client/src/widgets/layout/NoteTitleActions.css b/apps/client/src/widgets/layout/NoteTitleActions.css index 92e9109549..9301bf5012 100644 --- a/apps/client/src/widgets/layout/NoteTitleActions.css +++ b/apps/client/src/widgets/layout/NoteTitleActions.css @@ -8,6 +8,7 @@ body.experimental-feature-new-layout { --title-actions-padding-end: var(--content-margin-inline); display: flex; + width: 100%; max-width: var(--max-content-width); flex-direction: column; gap: 0.5em; From 7861bc41f98bb9ca034153d7351ae96c12b7cda2 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 25 Feb 2026 18:56:24 +0200 Subject: [PATCH 08/51] style/calendar: tweak layout --- apps/client/src/stylesheets/theme-next/shell.css | 6 ------ .../src/widgets/launch_bar/CalendarWidget.css | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index 1ac2f13e77..6fac6af980 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -372,10 +372,6 @@ body[dir=ltr] #launcher-container { .calendar-dropdown-widget .calendar-header [data-calendar-input="month"] { --input-background-color: transparent; --menu-background-color: transparent; - - text-align: center; - font-size: 1.4em; - font-weight: 300; } .calendar-dropdown-widget .calendar-header input:not(:focus) { @@ -425,8 +421,6 @@ body[dir=ltr] #launcher-container { } .calendar-dropdown-widget .calendar-week span { - font-size: 0.85em; - font-weight: 500; color: var(--calendar-weekday-labels-color); } diff --git a/apps/client/src/widgets/launch_bar/CalendarWidget.css b/apps/client/src/widgets/launch_bar/CalendarWidget.css index a47d026278..73ecaccf32 100644 --- a/apps/client/src/widgets/launch_bar/CalendarWidget.css +++ b/apps/client/src/widgets/launch_bar/CalendarWidget.css @@ -35,7 +35,7 @@ .calendar-dropdown-widget .calendar-header { align-items: center; display: flex; - padding: 0 0.5rem 0.5rem 0.5rem; + padding: 0 0.5rem 1rem 0.5rem; } .calendar-dropdown-widget .calendar-header>div { @@ -65,8 +65,14 @@ border: 0; border-inline-start: unset; background-color: var(--menu-background-color); - font-weight: bold; + font-weight: 400; outline: 0; + font-weight: 300; + font-size: 1.4em; +} + +.calendar-dropdown-widget .calendar-header .dropdown-toggle { + justify-content: center; } .calendar-dropdown-widget .calendar-header .dropdown-toggle::after { @@ -82,18 +88,20 @@ .calendar-dropdown-widget .calendar-week span { flex-direction: column; flex: 0 0 12.5%; - font-size: 1rem; - font-weight: bold; max-width: 12.5%; padding-top: 5px; padding-bottom: 5px; text-align: center; text-transform: uppercase; + font-size: .85em; + font-weight: 500; } .calendar-dropdown-widget .calendar-body { display: flex; flex-wrap: wrap; + min-height: 250px; + align-items: center; } .calendar-dropdown-widget .calendar-week-number { From 8c9ad575efa8301458a1bbc98004698a9ca62216 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 25 Feb 2026 19:26:06 +0200 Subject: [PATCH 09/51] style: tweak layout --- apps/client/src/widgets/collections/board/index.css | 2 +- apps/client/src/widgets/collections/calendar/index.css | 2 +- apps/client/src/widgets/collections/table/index.css | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/client/src/widgets/collections/board/index.css b/apps/client/src/widgets/collections/board/index.css index 4851410db8..73bd997a6e 100644 --- a/apps/client/src/widgets/collections/board/index.css +++ b/apps/client/src/widgets/collections/board/index.css @@ -14,7 +14,7 @@ height: 100%; display: flex; gap: 1em; - padding-inline: 12px; + margin-inline: var(--content-margin-inline); padding-block: 4px; align-items: flex-start; overflow-x: auto; diff --git a/apps/client/src/widgets/collections/calendar/index.css b/apps/client/src/widgets/collections/calendar/index.css index 34296dc174..df93910b50 100644 --- a/apps/client/src/widgets/collections/calendar/index.css +++ b/apps/client/src/widgets/collections/calendar/index.css @@ -52,7 +52,7 @@ --fc-border-color: var(--main-border-color); --fc-neutral-bg-color: var(--launcher-pane-background-color); --fc-list-event-hover-bg-color: var(--left-pane-item-hover-background); - padding: 0 12px; + padding: 0 var(--content-margin-inline); } .calendar-container .fc-list-sticky .fc-list-day > * { diff --git a/apps/client/src/widgets/collections/table/index.css b/apps/client/src/widgets/collections/table/index.css index 5d0725250c..604a384156 100644 --- a/apps/client/src/widgets/collections/table/index.css +++ b/apps/client/src/widgets/collections/table/index.css @@ -13,6 +13,7 @@ .table-view-container { height: 100%; + margin-inline-start: var(--content-margin-inline); } .search-result-widget-content .table-view { From aba7f35d9f9bc12c63b7afe68f4da68a5f063892 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 25 Feb 2026 19:34:31 +0200 Subject: [PATCH 10/51] style/text: tweak dividers --- apps/client/src/stylesheets/theme-next/notes/text.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/notes/text.css b/apps/client/src/stylesheets/theme-next/notes/text.css index e025b23fb2..252a3da6b2 100644 --- a/apps/client/src/stylesheets/theme-next/notes/text.css +++ b/apps/client/src/stylesheets/theme-next/notes/text.css @@ -647,10 +647,10 @@ html .note-detail-editable-text :not(figure, .include-note, hr):first-child { font-weight: 600; } -.ck-content hr { - margin: 5px 0; - height: 1px; - background-color: var(--main-border-color); +:root .ck-content hr { + margin-block: 5px; + height: 0; + border: thin solid var(--main-border-color); opacity: 1; } From b24d2c65a140a33d79de19a004075facaf79b6cd Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Wed, 25 Feb 2026 20:33:33 +0200 Subject: [PATCH 11/51] style: tweak layout --- apps/client/src/widgets/type_widgets/ProtectedSession.css | 4 ++++ .../client/src/widgets/type_widgets/helpers/SetupForm.css | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/apps/client/src/widgets/type_widgets/ProtectedSession.css b/apps/client/src/widgets/type_widgets/ProtectedSession.css index 6bfcb87737..41a24b8d65 100644 --- a/apps/client/src/widgets/type_widgets/ProtectedSession.css +++ b/apps/client/src/widgets/type_widgets/ProtectedSession.css @@ -3,4 +3,8 @@ margin-inline: 40px; flex-direction: column; justify-content: center; + + label { + margin-bottom: 8px; + } } \ No newline at end of file diff --git a/apps/client/src/widgets/type_widgets/helpers/SetupForm.css b/apps/client/src/widgets/type_widgets/helpers/SetupForm.css index 1bd04b30c7..c71ac73b03 100644 --- a/apps/client/src/widgets/type_widgets/helpers/SetupForm.css +++ b/apps/client/src/widgets/type_widgets/helpers/SetupForm.css @@ -19,4 +19,12 @@ .tn-link { margin-top: 1em; } + + label { + margin-bottom: 8px; + } + + .input-group { + margin: 0; + } } From 6b82943871864032c7a90fe47c83709014b0b0ca Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 26 Feb 2026 09:31:39 +0200 Subject: [PATCH 12/51] style/tree items: restyle selection --- .../src/stylesheets/theme-next/shell.css | 28 ++++++++++++++++++- apps/client/src/stylesheets/tree.css | 13 +++------ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index 6fac6af980..fcf7f442c3 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -685,7 +685,7 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu { #left-pane span.fancytree-node.fancytree-active { position: relative; - background: transparent !important; + background: transparent; color: var(--custom-color, var(--left-pane-item-selected-color)); } @@ -698,6 +698,14 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu { } } +/* + * .fancytree-node pseudo-elements: + * + * - ::before: the active tree item decorator. + * - ::after: the selected tree item background. A pseudo-element is used instead of the + * element's background color, to allow alpha compositing for the hover state. + */ + #left-pane span.fancytree-node.fancytree-active::before { position: absolute; content: ""; @@ -712,6 +720,24 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu { z-index: -1; } +#left-pane span.fancytree-node.fancytree-selected { + --left-pane-item-selected-shadow-size: 4px; + + position: relative; + background-color: transparent; + border-radius: 0; +} + +#left-pane span.fancytree-node.fancytree-selected::after { + display: block; + position: absolute; + z-index: -2; + content: ""; + inset: 0; + background: var(--selection-background-color); + animation: left-pane-item-select 100ms ease-out; +} + #left-pane span.fancytree-node.protected > span.fancytree-custom-icon { position: relative; filter: unset !important; diff --git a/apps/client/src/stylesheets/tree.css b/apps/client/src/stylesheets/tree.css index 8ed03215b1..a4869d674e 100644 --- a/apps/client/src/stylesheets/tree.css +++ b/apps/client/src/stylesheets/tree.css @@ -185,7 +185,7 @@ span.fancytree-node.fancytree-active-clone:not(.fancytree-active) .fancytree-tit span.fancytree-active { color: var(--active-item-text-color); - background-color: var(--active-item-background-color) !important; + background-color: var(--active-item-background-color); border-color: transparent; /* invisible border */ border-radius: 5px; } @@ -195,14 +195,9 @@ span.fancytree-active .fancytree-title { border: 0; } -span.fancytree-selected { - border-color: var(--main-border-color) !important; - border-radius: 5px; -} - -span.fancytree-selected .fancytree-title { - text-decoration: underline; - font-style: italic; +span.fancytree-node.fancytree-selected { + background-color: var(--selection-background-color); + border-radius: 0; } span.fancytree-selected .fancytree-custom-icon::before { From af0e4088a62be07283ab70cde5c70cc9ae5bb615 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 26 Feb 2026 09:35:29 +0200 Subject: [PATCH 13/51] style/tree items: fix hover color for the active item --- apps/client/src/stylesheets/theme-next/shell.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index fcf7f442c3..aa671d131a 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -683,7 +683,8 @@ body.layout-vertical.background-effects div.quick-search .dropdown-menu { padding-inline-start: 12px; } -#left-pane span.fancytree-node.fancytree-active { +#left-pane span.fancytree-node.fancytree-active, +#left-pane span.fancytree-node.fancytree-active:hover { position: relative; background: transparent; color: var(--custom-color, var(--left-pane-item-selected-color)); From abb5fe5b0f72c881f62fa217ce8aafd26868b0b7 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 26 Feb 2026 10:27:13 +0200 Subject: [PATCH 14/51] style/tree items: restyle the bulk actions button --- .../src/stylesheets/theme-next/shell.css | 45 +++++++++++++++++-- apps/client/src/stylesheets/tree.css | 4 +- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index aa671d131a..b7a08b4c97 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -801,7 +801,8 @@ body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-i opacity: 0.5; } -#left-pane .tree-item-button { +#left-pane .tree-item-button, +#left-pane span.fancytree-node.fancytree-selected .fancytree-custom-icon { margin-inline-end: 6px; border: unset; border-radius: 50%; @@ -812,7 +813,8 @@ body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-i box-shadow 200ms ease-out; } -#left-pane .tree-item-button:hover { +#left-pane .tree-item-button:hover, +#left-pane span.fancytree-node.fancytree-selected .fancytree-custom-icon:hover { background: var(--left-pane-item-action-button-hover-background); box-shadow: var(--left-pane-item-action-button-hover-shadow); transition: @@ -820,10 +822,47 @@ body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-i box-shadow 100ms ease-in; } -#left-pane span.fancytree-node.fancytree-active .tree-item-button:hover { +#left-pane span.fancytree-node.fancytree-active .tree-item-button:hover, +#left-pane span.fancytree-node.fancytree-active.fancy-tree-selected .fancytree-custom-icon:hover { box-shadow: var(--left-pane-item-selected-action-button-hover-shadow); } +/* Selected item bulk action button */ + +@keyframes bulk-action-button-blink { + from { + opacity: 1; + } + to { + opacity: .3; + } +} + +#left-pane span.fancytree-node.fancytree-selected .fancytree-custom-icon { + display: flex; + justify-content: center; + align-items: center; + width: 1em; + height: 1em; + margin: 0; + +} + +#left-pane span.fancytree-node.fancytree-selected .fancytree-custom-icon::before { + border: 0; + font-size: .65em; +} + +#left-pane span.fancytree-node.fancytree-selected:hover .fancytree-custom-icon:not(:hover)::before { + animation: bulk-action-button-blink 500ms linear infinite alternate; +} + +#left-pane span.fancytree-node.fancytree-selected.protected .fancytree-custom-icon::after { + /* Protected note indicator */ + display: none; +} + + #context-menu-container { /* The context menu of the tree */ --menu-item-icon-vert-offset: -1px; diff --git a/apps/client/src/stylesheets/tree.css b/apps/client/src/stylesheets/tree.css index a4869d674e..cb354d30df 100644 --- a/apps/client/src/stylesheets/tree.css +++ b/apps/client/src/stylesheets/tree.css @@ -202,8 +202,8 @@ span.fancytree-node.fancytree-selected { span.fancytree-selected .fancytree-custom-icon::before { font-family: "boxicons"; - content: "\eb43"; - border: 1px solid var(--main-border-color); + content: "\ef05"; + border: 1px solid var(--main-text-color); border-radius: 3px; } From 3b9f765c24a221eab92837b9e540bf7416187b47 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 26 Feb 2026 19:52:20 +0200 Subject: [PATCH 15/51] style/tree items: display a fallback icon when the specified icon pack is missing --- apps/client/src/stylesheets/tree.css | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/client/src/stylesheets/tree.css b/apps/client/src/stylesheets/tree.css index cb354d30df..a791f0578b 100644 --- a/apps/client/src/stylesheets/tree.css +++ b/apps/client/src/stylesheets/tree.css @@ -140,10 +140,22 @@ ul.fancytree-container { background-color: inherit; } + .fancytree-custom-icon { + display: flex; + justify-content: center; + align-items: center; + width: 1em; + height: 1em; font-size: 1.2em; } +/* Fallback icon */ +:where(.fancytree-custom-icon)::before { + content: "?"; +} + +/* Protected note icon badge */ span.fancytree-node.protected > span.fancytree-custom-icon { filter: drop-shadow(2px 2px 2px var(--main-text-color)); } From 7fac172ce2e83778ee179a2186cf93c3a4b5086a Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 26 Feb 2026 19:54:42 +0200 Subject: [PATCH 16/51] style: remove redundant style --- apps/client/src/stylesheets/theme-next/shell.css | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index b7a08b4c97..ba6f5d95b5 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -839,13 +839,7 @@ body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-i } #left-pane span.fancytree-node.fancytree-selected .fancytree-custom-icon { - display: flex; - justify-content: center; - align-items: center; - width: 1em; - height: 1em; margin: 0; - } #left-pane span.fancytree-node.fancytree-selected .fancytree-custom-icon::before { From f4d91e48ba2cc515dcba550d2bb48e5c51bf4cb4 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Thu, 26 Feb 2026 20:46:55 +0200 Subject: [PATCH 17/51] style/pdf viewer: fix color scheme --- apps/client/src/widgets/type_widgets/file/PdfViewer.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index 7e6870dd42..a406f84a02 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -7,7 +7,8 @@ const VARIABLE_WHITELIST = new Set([ "root-background", "main-background-color", "main-border-color", - "main-text-color" + "main-text-color", + "theme-style" ]); interface PdfViewerProps extends Pick, "tabIndex"> { From c7d74e8b00d28bb4a68db4b9b14295f67b662e92 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 01:08:42 +0000 Subject: [PATCH 18/51] chore(deps): update pnpm to v10.30.3 --- apps/build-docs/package.json | 2 +- apps/web-clipper/package.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/build-docs/package.json b/apps/build-docs/package.json index 47ed510b65..c1e1efa7eb 100644 --- a/apps/build-docs/package.json +++ b/apps/build-docs/package.json @@ -14,7 +14,7 @@ "keywords": [], "author": "Elian Doran ", "license": "AGPL-3.0-only", - "packageManager": "pnpm@10.30.2", + "packageManager": "pnpm@10.30.3", "devDependencies": { "@redocly/cli": "2.19.2", "archiver": "7.0.1", diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json index 00ab94cce3..88ec2dd632 100644 --- a/apps/web-clipper/package.json +++ b/apps/web-clipper/package.json @@ -13,7 +13,7 @@ "postinstall": "wxt prepare" }, "keywords": [], - "packageManager": "pnpm@10.30.2", + "packageManager": "pnpm@10.30.3", "devDependencies": { "@wxt-dev/auto-icons": "1.1.1", "wxt": "0.20.18" diff --git a/package.json b/package.json index 25fb12e4ef..25bc2a205b 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "url": "https://github.com/TriliumNext/Trilium/issues" }, "homepage": "https://triliumnotes.org", - "packageManager": "pnpm@10.30.2", + "packageManager": "pnpm@10.30.3", "pnpm": { "patchedDependencies": { "@ckeditor/ckeditor5-mention": "patches/@ckeditor__ckeditor5-mention.patch", From 59d8a98eeaca3cd4a43ec235ef3df4b5b52fe8a7 Mon Sep 17 00:00:00 2001 From: Zexin Yuan Date: Mon, 23 Feb 2026 23:16:31 +0800 Subject: [PATCH 19/51] feat(client/menus): add Copy as Markdown to electron context menu --- .../client/src/menus/electron_context_menu.ts | 29 +++++++++++++++++++ .../src/translations/ar/translation.json | 1 + .../src/translations/cn/translation.json | 1 + .../src/translations/de/translation.json | 1 + .../src/translations/en/translation.json | 1 + .../src/translations/es/translation.json | 1 + .../src/translations/fr/translation.json | 1 + .../src/translations/ga/translation.json | 1 + .../src/translations/hi/translation.json | 1 + .../src/translations/it/translation.json | 1 + .../src/translations/ja/translation.json | 1 + .../src/translations/pl/translation.json | 1 + .../src/translations/pt/translation.json | 1 + .../src/translations/pt_br/translation.json | 1 + .../src/translations/ro/translation.json | 1 + .../src/translations/ru/translation.json | 1 + .../src/translations/tw/translation.json | 1 + .../src/translations/uk/translation.json | 1 + 18 files changed, 46 insertions(+) diff --git a/apps/client/src/menus/electron_context_menu.ts b/apps/client/src/menus/electron_context_menu.ts index 219a009c7c..6baba6a951 100644 --- a/apps/client/src/menus/electron_context_menu.ts +++ b/apps/client/src/menus/electron_context_menu.ts @@ -3,6 +3,8 @@ import options from "../services/options.js"; import zoomService from "../components/zoom.js"; import contextMenu, { type MenuItem } from "./context_menu.js"; import { t } from "../services/i18n.js"; +import server from "../services/server.js"; +import * as clipboardExt from "../services/clipboard_ext.js"; import type { BrowserWindow } from "electron"; import type { CommandNames, AppContext } from "../components/app_context.js"; @@ -60,6 +62,33 @@ function setupContextMenu() { uiIcon: "bx bx-copy", handler: () => webContents.copy() }); + + items.push({ + enabled: hasText, + title: t("electron_context_menu.copy-as-markdown"), + uiIcon: "bx bx-copy-alt", + handler: async () => { + const selection = window.getSelection(); + if (!selection || !selection.rangeCount) return ''; + + const range = selection.getRangeAt(0); + const div = document.createElement('div'); + div.appendChild(range.cloneContents()); + + const htmlContent = div.innerHTML; + if (htmlContent) { + try { + const { markdownContent } = await server.post<{ markdownContent: string }>( + "other/to-markdown", + { htmlContent } + ); + await clipboardExt.copyTextWithToast(markdownContent); + } catch (error) { + console.error("Failed to copy as markdown:", error); + } + } + } + }); } if (!["", "javascript:", "about:blank#blocked"].includes(params.linkURL) && params.mediaType === "none") { diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json index 3eaf9a8432..18831c4a8a 100644 --- a/apps/client/src/translations/ar/translation.json +++ b/apps/client/src/translations/ar/translation.json @@ -882,6 +882,7 @@ "electron_context_menu": { "cut": "قص", "copy": "نسخ", + "copy-as-markdown": "نسخ كـ Markdown", "paste": "لصق", "copy-link": "نسخ الرابط", "add-term-to-dictionary": "اضافة \"{{term}}\" الى القاموس", diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json index 9b27037faf..a70fab24a3 100644 --- a/apps/client/src/translations/cn/translation.json +++ b/apps/client/src/translations/cn/translation.json @@ -1758,6 +1758,7 @@ "add-term-to-dictionary": "将 \"{{term}}\" 添加到字典", "cut": "剪切", "copy": "复制", + "copy-as-markdown": "复制为 Markdown", "copy-link": "复制链接", "paste": "粘贴", "paste-as-plain-text": "以纯文本粘贴", diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index b90f5f8ebf..9f8bf82b0b 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -1729,6 +1729,7 @@ "add-term-to-dictionary": "Begriff \"{{term}}\" zum Wörterbuch hinzufügen", "cut": "Ausschneiden", "copy": "Kopieren", + "copy-as-markdown": "Als Markdown kopieren", "copy-link": "Link kopieren", "paste": "Einfügen", "paste-as-plain-text": "Als unformatierten Text einfügen", diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 04a372ddae..1f4d42db9c 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -1810,6 +1810,7 @@ "add-term-to-dictionary": "Add \"{{term}}\" to dictionary", "cut": "Cut", "copy": "Copy", + "copy-as-markdown": "Copy as markdown", "copy-link": "Copy link", "paste": "Paste", "paste-as-plain-text": "Paste as plain text", diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index 7f4538c6d5..2c31f84f2f 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -1778,6 +1778,7 @@ "add-term-to-dictionary": "Agregar \"{{term}}\" al diccionario", "cut": "Cortar", "copy": "Copiar", + "copy-as-markdown": "Copiar como markdown", "copy-link": "Copiar enlace", "paste": "Pegar", "paste-as-plain-text": "Pegar como texto plano", diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index c1d844ae99..be1265054b 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -1689,6 +1689,7 @@ "add-term-to-dictionary": "Ajouter «{{term}}» au dictionnaire", "cut": "Couper", "copy": "Copier", + "copy-as-markdown": "Copier en markdown", "copy-link": "Copier le lien", "paste": "Coller", "paste-as-plain-text": "Coller comme texte brut", diff --git a/apps/client/src/translations/ga/translation.json b/apps/client/src/translations/ga/translation.json index c5020a4d0c..d8d94fb7af 100644 --- a/apps/client/src/translations/ga/translation.json +++ b/apps/client/src/translations/ga/translation.json @@ -1807,6 +1807,7 @@ "add-term-to-dictionary": "Cuir \"{{term}}\" leis an bhfoclóir", "cut": "Gearr", "copy": "Cóipeáil", + "copy-as-markdown": "Cóipeáil mar markdown", "copy-link": "Cóipeáil nasc", "paste": "Greamaigh", "paste-as-plain-text": "Greamaigh mar théacs simplí", diff --git a/apps/client/src/translations/hi/translation.json b/apps/client/src/translations/hi/translation.json index ac5ed8073d..a48c11c6de 100644 --- a/apps/client/src/translations/hi/translation.json +++ b/apps/client/src/translations/hi/translation.json @@ -1810,6 +1810,7 @@ "add-term-to-dictionary": "\"{{term}}\" को डिक्शनरी में जोड़ें", "cut": "कट (Cut)", "copy": "कॉपी (Copy)", + "copy-as-markdown": "Markdown के रूप में कॉपी करें", "copy-link": "लिंक कॉपी करें", "paste": "पेस्ट (Paste)", "paste-as-plain-text": "प्लेन टेक्स्ट की तरह पेस्ट करें", diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index 0ce70cbf62..8e26e7d191 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -334,6 +334,7 @@ "electron_context_menu": { "cut": "Taglia", "copy": "Copia", + "copy-as-markdown": "Copia come markdown", "paste": "Incolla", "copy-link": "Copia collegamento", "paste-as-plain-text": "Incolla come testo semplice", diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index e040e7e6e1..cd0eeb9a35 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -1352,6 +1352,7 @@ "add-term-to-dictionary": "辞書に \"{{term}}\" を追加", "cut": "切り取り", "copy": "コピー", + "copy-as-markdown": "Markdownとしてコピー", "copy-link": "リンクをコピー", "paste": "貼り付け", "paste-as-plain-text": "プレーンテキストで貼り付け", diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index 982cb71c43..48a62eec65 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -612,6 +612,7 @@ "electron_context_menu": { "cut": "Wytnij", "copy": "Kopiuj", + "copy-as-markdown": "Kopiuj jako markdown", "copy-link": "Kopiuj link", "paste": "Wklej", "paste-as-plain-text": "Wklej jako zwykły tekst", diff --git a/apps/client/src/translations/pt/translation.json b/apps/client/src/translations/pt/translation.json index 167d85e8c0..45570c6db4 100644 --- a/apps/client/src/translations/pt/translation.json +++ b/apps/client/src/translations/pt/translation.json @@ -1774,6 +1774,7 @@ "add-term-to-dictionary": "Adicionar \"{{term}}\" ao dicionário", "cut": "Cortar", "copy": "Copiar", + "copy-as-markdown": "Copiar como markdown", "copy-link": "Copiar ligação", "paste": "Colar", "paste-as-plain-text": "Colar como texto sem formatação", diff --git a/apps/client/src/translations/pt_br/translation.json b/apps/client/src/translations/pt_br/translation.json index 3db8d8c8e1..22fd6856d1 100644 --- a/apps/client/src/translations/pt_br/translation.json +++ b/apps/client/src/translations/pt_br/translation.json @@ -1637,6 +1637,7 @@ "add-term-to-dictionary": "Adicionar \"{{term}}\" ao dicionário", "cut": "Cortar", "copy": "Copiar", + "copy-as-markdown": "Copiar como markdown", "copy-link": "Copiar link", "paste": "Colar", "paste-as-plain-text": "Colar como texto sem formatação", diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index a7bfd1f00b..e1f5810cf0 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -1724,6 +1724,7 @@ "electron_context_menu": { "add-term-to-dictionary": "Adaugă „{{term}}” în dicționar", "copy": "Copiază", + "copy-as-markdown": "Copiază ca markdown", "copy-link": "Copiază legătura", "cut": "Decupează", "paste": "Lipește", diff --git a/apps/client/src/translations/ru/translation.json b/apps/client/src/translations/ru/translation.json index f023814bdc..c3e1344e2d 100644 --- a/apps/client/src/translations/ru/translation.json +++ b/apps/client/src/translations/ru/translation.json @@ -708,6 +708,7 @@ "paste": "Вставить", "copy-link": "Скопировать ссылку", "copy": "Скопировать", + "copy-as-markdown": "Копировать как Markdown", "cut": "Вырезать", "search_online": "Поиск \"{{term}}\" в {{searchEngine}}", "add-term-to-dictionary": "Добавить \"{{term}}\" в словарь", diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 71eaf097a5..9eecb868e1 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -1722,6 +1722,7 @@ "add-term-to-dictionary": "將 \"{{term}}\" 新增至字典", "cut": "剪下", "copy": "複製", + "copy-as-markdown": "複製為 Markdown", "copy-link": "複製連結", "paste": "貼上", "paste-as-plain-text": "以純文字貼上", diff --git a/apps/client/src/translations/uk/translation.json b/apps/client/src/translations/uk/translation.json index 8861fca0bc..6c1951a035 100644 --- a/apps/client/src/translations/uk/translation.json +++ b/apps/client/src/translations/uk/translation.json @@ -1533,6 +1533,7 @@ "add-term-to-dictionary": "Додати \"{{term}}\" до словника", "cut": "Вирізати", "copy": "Копіювати", + "copy-as-markdown": "Копіювати як Markdown", "copy-link": "Копіювати посилання", "paste": "Вставити", "paste-as-plain-text": "Вставити як звичайний текст", From bfcbfac5bbb2cf7f9183aa7a90ae3fcfe4ecfef9 Mon Sep 17 00:00:00 2001 From: BeatLink Date: Fri, 27 Feb 2026 10:47:56 -0500 Subject: [PATCH 20/51] Add recurrence error handling --- apps/client/package.json | 3 +- .../collections/calendar/event_builder.ts | 33 +++++++++++++++---- pnpm-lock.yaml | 3 ++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/apps/client/package.json b/apps/client/package.json index 9db5093b45..1fd8bea2c6 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -22,8 +22,8 @@ "@fullcalendar/interaction": "6.1.20", "@fullcalendar/list": "6.1.20", "@fullcalendar/multimonth": "6.1.20", - "@fullcalendar/timegrid": "6.1.20", "@fullcalendar/rrule": "6.1.20", + "@fullcalendar/timegrid": "6.1.20", "@maplibre/maplibre-gl-leaflet": "0.1.3", "@mermaid-js/layout-elk": "0.2.0", "@mind-elixir/node-menu": "5.0.1", @@ -64,6 +64,7 @@ "react-i18next": "16.5.4", "react-window": "2.2.7", "reveal.js": "5.2.1", + "rrule": "2.8.1", "svg-pan-zoom": "3.6.2", "tabulator-tables": "6.3.1", "vanilla-js-wheel-zoom": "9.0.4" diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index 4967a5ca1b..b60a203d89 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -1,9 +1,11 @@ import { EventInput, EventSourceFuncArg, EventSourceInput } from "@fullcalendar/core/index.js"; import clsx from "clsx"; +import * as rruleLib from 'rrule'; import FNote from "../../../entities/fnote"; import froca from "../../../services/froca"; import server from "../../../services/server"; +import toastService from "../../../services/toast"; import { formatDateToLocalISO, getCustomisableLabel, getMonthsInDateRange, offsetDate } from "./utils"; interface Event { @@ -122,13 +124,30 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e } if (recurrence) { - delete eventData.end; - eventData.rrule = `DTSTART:${startDate.replace(/[-:]/g, "")}\n${recurrence}`; - if (endDate){ - const diffMs = new Date(endDate).getTime() - new Date(startDate).getTime(); - const hours = Math.floor(diffMs / 3600000); - const minutes = Math.floor((diffMs / 60000) % 60); - eventData.duration = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; + // Generate rrule string + const rruleString = `DTSTART:${startDate.replace(/[-:]/g, "")}\n${recurrence}`; + + // Validate rrule string + let rruleValid = true; + try { + rruleLib.rrulestr(rruleString, { forceset: true }) as rruleLib.RRuleSet; + } catch { + rruleValid = false; + } + + if (rruleValid) { + delete eventData.end; + eventData.rrule = rruleString; + if (endDate){ + const diffMs = new Date(endDate).getTime() - new Date(startDate).getTime(); + const hours = Math.floor(diffMs / 3600000); + const minutes = Math.floor((diffMs / 60000) % 60); + eventData.duration = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; + } + } else { + const errorMessage = `Note "${note.noteId} ${note.title}" has an invalid #recurrence string. This note will not recur.`; + toastService.showError(errorMessage); + console.error(errorMessage); } } events.push(eventData); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6b1e2d6e85..0097f4aaf2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -326,6 +326,9 @@ importers: reveal.js: specifier: 5.2.1 version: 5.2.1 + rrule: + specifier: 2.8.1 + version: 2.8.1 svg-pan-zoom: specifier: 3.6.2 version: 3.6.2 From 8554dc249cac454cd585e6d5177afa1d2f252aa1 Mon Sep 17 00:00:00 2001 From: BeatLink Date: Fri, 27 Feb 2026 11:43:23 -0500 Subject: [PATCH 21/51] Fix recurrence error management --- .../collections/calendar/event_builder.ts | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index b60a203d89..cd27a89a5b 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -33,7 +33,15 @@ export async function buildEvents(noteIds: string[]) { const endTime = getCustomisableLabel(note, "endTime", "calendar:endTime"); const recurrence = getCustomisableLabel(note, "recurrence", "calendar:recurrence"); const isArchived = note.hasLabel("archived"); - events.push(await buildEvent(note, { startDate, endDate, startTime, endTime, recurrence, isArchived })); + try { + events.push(await buildEvent(note, { startDate, endDate, startTime, endTime, recurrence, isArchived })); + } catch (error) { + if (error instanceof Error) { + const errorMessage = error.message; + toastService.showError(errorMessage); + console.error(errorMessage); + } + } } return events.flat(); @@ -61,7 +69,16 @@ export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg) continue; } - events.push(await buildEvent(dateNote, { startDate })); + try { + events.push(await buildEvent(dateNote, { startDate })); + } catch (error) { + if (error instanceof Error) { + const errorMessage = error.message; + toastService.showError(errorMessage); + console.error(errorMessage); + } + } + if (dateNote.hasChildren()) { const childNoteIds = await dateNote.getSubtreeNoteIds(); @@ -76,8 +93,16 @@ export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg) const childNotes = await froca.getNotes(childNoteIds); for (const childNote of childNotes) { const startDate = childNoteToDateMapping[childNote.noteId]; - const event = await buildEvent(childNote, { startDate }); - events.push(event); + try { + const event = await buildEvent(childNote, { startDate }); + events.push(event); + } catch (error) { + if (error instanceof Error) { + const errorMessage = error.message; + toastService.showError(errorMessage); + console.error(errorMessage); + } + } } return events.flat(); @@ -145,9 +170,7 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e eventData.duration = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; } } else { - const errorMessage = `Note "${note.noteId} ${note.title}" has an invalid #recurrence string. This note will not recur.`; - toastService.showError(errorMessage); - console.error(errorMessage); + throw new Error(`Note "${note.noteId} ${note.title}" has an invalid #recurrence string. Excluding...`); } } events.push(eventData); From 7c89c6652687a6d3fc42a2d01c38662dfdb8f59b Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Fri, 27 Feb 2026 19:34:26 +0200 Subject: [PATCH 22/51] style/pdf viewer: restyle UI --- .../widgets/type_widgets/file/PdfViewer.tsx | 44 +++- packages/pdfjs-viewer/src/custom.css | 219 ++++++++++++++++-- 2 files changed, 242 insertions(+), 21 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index a406f84a02..6ba24ef812 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -1,14 +1,37 @@ import type { HTMLAttributes, RefObject } from "preact"; import { useCallback, useEffect, useRef } from "preact/hooks"; - +import Inter from "./../../../fonts/Inter/Inter-VariableFont_opsz,wght.ttf"; import { useSyncedRef, useTriliumOption, useTriliumOptionBool } from "../../react/hooks"; +interface FontDefinition { + name: string; + url: string; +} + +const FONTS: FontDefinition[] = [ + {name: "Inter", url: Inter}, +] + const VARIABLE_WHITELIST = new Set([ "root-background", "main-background-color", "main-border-color", "main-text-color", - "theme-style" + "theme-style", + "menu-background-color", + "dropdown-backdrop-filter", + "dropdown-border-radius", + "dropdown-border-color", + "dropdown-shadow-opacity", + "menu-padding-size", + "dropdown-backdrop-filter", + "menu-text-color", + "hover-item-background-color", + "hover-item-text-color", + "menu-item-icon-color", + "input-focus-outline-color", + "input-background-color", + "input-text-color" ]); interface PdfViewerProps extends Pick, "tabIndex"> { @@ -54,10 +77,14 @@ function useStyleInjection(iframeRef: RefObject) { const style = doc.createElement('style'); style.id = 'client-root-vars'; - style.textContent = cssVarsToString(getRootCssVariables()); + style.textContent = cssVarsToString(getRootCssVariables());; styleRef.current = style; - doc.head.appendChild(style); + + const fontStyles = doc.createElement("style"); + fontStyles.textContent = FONTS.map(injectFont).join("\n"); + doc.head.appendChild(fontStyles); + }, [ iframeRef ]); // React to changes. @@ -93,3 +120,12 @@ function cssVarsToString(vars: Record) { .map(([k, v]) => ` ${k}: ${v};`) .join('\n')}\n}`; } + +function injectFont(font: FontDefinition) { + return ` + @font-face { + font-family: '${font.name}'; + src: url('${font.url}'); + } + `; +}; \ No newline at end of file diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index bf291112dd..441fc049c0 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -1,31 +1,175 @@ -:root { - color-scheme: var(--tn-theme-style); +/* #region General */ - --body-bg-color: transparent; - --toolbar-bg-color: transparent; +:root { --main-color: var(--tn-main-text-color); + --body-bg-color: transparent; --toolbar-border-color: var(--tn-main-border-color); + --toolbar-bg-color: transparent; --toolbar-icon-opacity: 1; + --toggled-btn-bg-color: var(--tn-hover-item-background-color); + --doorhanger-bg-color: var(--tn-menu-background-color); + --doorhanger-separator-color: var(--tn-main-border-color); --page-margin: 12px auto; --spreadHorizontalWrapped-margin-LR: 4px; + + color-scheme: var(--tn-theme-style); } -.pdfViewer { - .page, - .page > .canvasWrapper, - .page > .canvasWrapper > canvas { - border-radius: 6px; - } +:root button, +:root dialog, +:root #toolbarContainer, +:root .toolbarButton, +:root #scaleSelect, +:root .toolbarButtonWithContainer .editorParamsToolbar .editorParamsLabel, +:root #toolbarContainer #toolbarViewer input, +:root #editorUndoBar, +:root .dialogButton { + font-family: "Inter"; + font-size: 11; +} - .page { - border: 1px solid var(--tn-main-border-color); - box-shadow: 7px 7px 15px #00000010; +#secondaryToolbar, +#documentPropertiesDialog, +#findbar.doorHanger, +.doorHangerRight, +#printServiceDialog { + border: 1px solid var(--tn-dropdown-border-color); + border-radius: var(--tn-dropdown-border-radius); + background-color: var(--tn-menu-background-color); + padding: var(--tn-menu-padding-size); + box-shadow: 0px 10px 20px rgba(0, 0, 0, var(--tn-dropdown-shadow-opacity)); + backdrop-filter: var(--tn-dropdown-backdrop-filter); +} + +.doorHangerRight, +.doorHangerLeft, +.doorHanger { + &::after, &::before { + display: none; } } +:root .toggle-button { + --toggle-border-color: transparent; + --toggle-background-color: var(--tn-input-background-color); + --toggle-background-color-hover: var(--toggle-background-color); + --toggle-dot-background-color: var(--tn-input-text-color); + --toggle-background-color-pressed: var(--tn-input-text-color); + --toggle-background-color-pressed-hover: var(--toggle-background-color-pressed); + cursor: pointer; +} + +:root .colorPicker { + --hover-outline-color: var(--tn-input-focus-outline-color); + --selected-outline-color: var(--tn-main-text-color); +} + +/* #endregion */ + /* #region Toolbar */ +.toolbarButton { + color: var(--menu-text-color); + + &:not(.labeled):active::before { + transform: scale(.85) !important; + } + + &:hover { + background: var(--tn-hover-item-background-color); + border-radius: 6px; + color: var(--tn-hover-item-text-color); + } +} + +#findbar { + padding: unset; +} + +#scaleSelectContainer { + --dropdown-btn-bg-color: transparent; + --button-hover-color: var(--tn-hover-item-background-color); + border-radius: 6px; + + select:focus { + background: var(--tn-main-background-color); + } +} + +/* Toolbar editor dropdowns */ +:root .editorParamsToolbar:not(.menu), +:root #highlightParamsToolbarContainer { + padding: 10px 16px; +} + +/* Toolbar dropdowns */ +:root .editorParamsToolbar { + .menu { + padding: 8px; + } + + .editorParamsToolbarContainer { + padding: 0; + } +} + +/* Overflow menu */ +#secondaryToolbar { + --toolbar-icon-bg-color: var(--tn-menu-item-icon-color); + --toolbar-icon-hover-bg-color: var(--tn-menu-item-icon-color); + --toggled-btn-bg-color: transparent; + --toggled-btn-color: currentColor; + --doorhanger-icon-opacity: 1; + padding: var(--tn-menu-padding-size); +} + +/* Horizontal menu dividers */ +:root #highlightParamsToolbarContainer #editorHighlightVisibility .divider, +:root .horizontalToolbarSeparator { + position: relative; + overflow: visible; + background: unset; + border: none; + + &:before { + content: ""; + position: absolute; + left: 0; + right: 0; + border-top: 1px solid var(--tn-main-border-color); + } +} + +/* Radio menu items */ +#cursorToolButtons .toolbarButton, +#scrollModeButtons .toolbarButton, +#spreadModeButtons .toolbarButton { + --toggled-hover-active-btn-color: var(--tn-hover-item-background-color); + --toggled-btn-color: var(--tn-menu-item-icon-color); + position: relative; + + &::after { + display: block; + content: ""; + position: absolute; + right: 0; + width: 2em; + height: 100%; + /* https://pictogrammers.com/library/mdi/icon/radiobox-blank/ */ + mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3e%3ctitle%3eradiobox-blank%3c/title%3e%3cpath d='M12%2c20A8%2c8 0 0%2c1 4%2c12A8%2c8 0 0%2c1 12%2c4A8%2c8 0 0%2c1 20%2c12A8%2c8 0 0%2c1 12%2c20M12%2c2A10%2c10 0 0%2c0 2%2c12A10%2c10 0 0%2c0 12%2c22A10%2c10 0 0%2c0 22%2c12A10%2c10 0 0%2c0 12%2c2Z' /%3e%3c/svg%3e"); + mask-size: 16px; + mask-repeat: no-repeat; + mask-position: center center; + background-color: var(--tn-main-text-color); + } + + &.toggled::after { + /* https://pictogrammers.com/library/mdi/icon/radiobox-marked/ */ + mask-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3e%3ctitle%3eradiobox-marked%3c/title%3e%3cpath d='M12%2c20A8%2c8 0 0%2c1 4%2c12A8%2c8 0 0%2c1 12%2c4A8%2c8 0 0%2c1 20%2c12A8%2c8 0 0%2c1 12%2c20M12%2c2A10%2c10 0 0%2c0 2%2c12A10%2c10 0 0%2c0 12%2c22A10%2c10 0 0%2c0 22%2c12A10%2c10 0 0%2c0 12%2c2M12%2c7A5%2c5 0 0%2c0 7%2c12A5%2c5 0 0%2c0 12%2c17A5%2c5 0 0%2c0 17%2c12A5%2c5 0 0%2c0 12%2c7Z' /%3e%3c/svg%3e"); + } +} + /* Permanently removed buttons */ #viewsManagerToggleButton, #downloadButton, @@ -43,10 +187,51 @@ /* #region Properties Dialog */ -/* Hide irrelevant properties */ -#documentPropertiesDialog > .row:has(#fileNameField), -#documentPropertiesDialog > .row:has(#linearizedField) { - display: none; +#documentPropertiesDialog { + --separator-color: transparent; + + user-select: none; + padding: 1em; + + .row { + line-height: 1.5; + + > span { + font-weight: bold; + opacity: .5; + } + + > p { + user-select: all; + } + } + + /* Hide irrelevant properties */ + > .row:has(#fileNameField), + > .row:has(#linearizedField) { + display: none; + } } /* #endregion */ + +/* #region Viewer Area */ + +.pdfViewer { + .page, + .page > .canvasWrapper, + .page > .canvasWrapper > canvas { + border-radius: 6px; + } + + .page { + border: 1px solid var(--tn-main-border-color); + box-shadow: 7px 7px 15px #00000010; + } +} + +#viewsManager { + display: none; +} + +/* #endregion */ \ No newline at end of file From 945b00030ba79ce8f8d953dadba82cbdfad221dd Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Fri, 27 Feb 2026 22:37:07 +0200 Subject: [PATCH 23/51] style/pdf viewer: restyle UI --- packages/pdfjs-viewer/src/custom.css | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 441fc049c0..606afa4ac7 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -4,6 +4,7 @@ --main-color: var(--tn-main-text-color); --body-bg-color: transparent; --toolbar-border-color: var(--tn-main-border-color); + --toolbar-icon-bg-color: var(--tn-main-text-color); --toolbar-bg-color: transparent; --toolbar-icon-opacity: 1; --toggled-btn-bg-color: var(--tn-hover-item-background-color); @@ -26,7 +27,6 @@ :root #editorUndoBar, :root .dialogButton { font-family: "Inter"; - font-size: 11; } #secondaryToolbar, @@ -70,8 +70,6 @@ /* #region Toolbar */ .toolbarButton { - color: var(--menu-text-color); - &:not(.labeled):active::before { transform: scale(.85) !important; } @@ -81,10 +79,13 @@ border-radius: 6px; color: var(--tn-hover-item-text-color); } + + &.toggled::before { + color: var(--tn-menu-item-icon-color); + } } #findbar { - padding: unset; } #scaleSelectContainer { @@ -115,13 +116,19 @@ } /* Overflow menu */ -#secondaryToolbar { +:root #secondaryToolbar { --toolbar-icon-bg-color: var(--tn-menu-item-icon-color); --toolbar-icon-hover-bg-color: var(--tn-menu-item-icon-color); --toggled-btn-bg-color: transparent; --toggled-btn-color: currentColor; --doorhanger-icon-opacity: 1; padding: var(--tn-menu-padding-size); + + .toolbarButton.labeled { + color: var(--tn-menu-text-color); + + font-size: 13px; + } } /* Horizontal menu dividers */ @@ -146,7 +153,6 @@ #scrollModeButtons .toolbarButton, #spreadModeButtons .toolbarButton { --toggled-hover-active-btn-color: var(--tn-hover-item-background-color); - --toggled-btn-color: var(--tn-menu-item-icon-color); position: relative; &::after { From 676dea33e1d14c11647fedc79790c1c807045766 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Fri, 27 Feb 2026 22:45:52 +0200 Subject: [PATCH 24/51] client: fix different issues --- apps/client/src/stylesheets/theme-next/shell.css | 2 +- apps/client/src/widgets/launch_bar/CalendarWidget.css | 1 - apps/client/src/widgets/type_widgets/file/PdfViewer.tsx | 5 ++--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index ba6f5d95b5..4ef72ddf57 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -823,7 +823,7 @@ body[dir=rtl] #left-pane span.fancytree-node.protected > span.fancytree-custom-i } #left-pane span.fancytree-node.fancytree-active .tree-item-button:hover, -#left-pane span.fancytree-node.fancytree-active.fancy-tree-selected .fancytree-custom-icon:hover { +#left-pane span.fancytree-node.fancytree-active.fancytree-selected .fancytree-custom-icon:hover { box-shadow: var(--left-pane-item-selected-action-button-hover-shadow); } diff --git a/apps/client/src/widgets/launch_bar/CalendarWidget.css b/apps/client/src/widgets/launch_bar/CalendarWidget.css index 73ecaccf32..d6b9d22645 100644 --- a/apps/client/src/widgets/launch_bar/CalendarWidget.css +++ b/apps/client/src/widgets/launch_bar/CalendarWidget.css @@ -65,7 +65,6 @@ border: 0; border-inline-start: unset; background-color: var(--menu-background-color); - font-weight: 400; outline: 0; font-weight: 300; font-size: 1.4em; diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index 6ba24ef812..3d39135c19 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -24,7 +24,6 @@ const VARIABLE_WHITELIST = new Set([ "dropdown-border-color", "dropdown-shadow-opacity", "menu-padding-size", - "dropdown-backdrop-filter", "menu-text-color", "hover-item-background-color", "hover-item-text-color", @@ -77,7 +76,7 @@ function useStyleInjection(iframeRef: RefObject) { const style = doc.createElement('style'); style.id = 'client-root-vars'; - style.textContent = cssVarsToString(getRootCssVariables());; + style.textContent = cssVarsToString(getRootCssVariables()); styleRef.current = style; doc.head.appendChild(style); @@ -128,4 +127,4 @@ function injectFont(font: FontDefinition) { src: url('${font.url}'); } `; -}; \ No newline at end of file +} \ No newline at end of file From e029379194c7f8220a3e782fd3275a9029ee9e34 Mon Sep 17 00:00:00 2001 From: BeatLink Date: Fri, 27 Feb 2026 17:39:12 -0500 Subject: [PATCH 25/51] Add recurrence testing, use dayjs for calendar --- .../calendar/event_builder.spec.ts | 84 ++++++++++++++++++- .../collections/calendar/event_builder.ts | 21 ++--- 2 files changed, 93 insertions(+), 12 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/event_builder.spec.ts b/apps/client/src/widgets/collections/calendar/event_builder.spec.ts index 2c872a14e5..88299e8b65 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.spec.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.spec.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it, vi } from "vitest"; import { buildNote, buildNotes } from "../../../test/easy-froca.js"; import { buildEvent, buildEvents } from "./event_builder.js"; import { LOCALE_MAPPINGS } from "./index.js"; @@ -148,7 +148,7 @@ describe("Promoted attributes", () => { expect(event).toHaveLength(1); expect(event[0]?.promotedAttributes).toMatchObject([ [ "assignee", "Target note" ] - ]) + ]); }); it("supports start time and end time", async () => { @@ -177,6 +177,86 @@ describe("Promoted attributes", () => { }); + +describe("Recurrence", () => { + it("supports valid recurrence without end date", async () => { + const noteIds = buildNotes([ + { + title: "Recurring Event", + "#startDate": "2025-05-05", + "#recurrence": "FREQ=DAILY;COUNT=5" + } + ]); + const events = await buildEvents(noteIds); + + expect(events).toHaveLength(1); + expect(events[0]).toMatchObject({ + title: "Recurring Event", + start: "2025-05-05", + }); + expect(events[0].rrule).toContain("DTSTART:20250505"); + expect(events[0].rrule).toContain("FREQ=DAILY;COUNT=5"); + expect(events[0].end).toBeUndefined(); + }); + + it("supports recurrence with start and end time (duration calculated)", async () => { + const noteIds = buildNotes([ + { + title: "Timed Recurring Event", + "#startDate": "2025-05-05", + "#startTime": "13:00", + "#endTime": "15:30", + "#recurrence": "FREQ=WEEKLY;COUNT=3" + } + ]); + const events = await buildEvents(noteIds); + + expect(events).toHaveLength(1); + expect(events[0]).toMatchObject({ + title: "Timed Recurring Event", + start: "2025-05-05T13:00:00", + duration: "02:30" + }); + expect(events[0].rrule).toContain("DTSTART:20250505T130000"); + expect(events[0].end).toBeUndefined(); + }); + + it("removes end date when recurrence is valid", async () => { + const noteIds = buildNotes([ + { + title: "Recurring With End", + "#startDate": "2025-05-05", + "#endDate": "2025-05-07", + "#recurrence": "FREQ=DAILY;COUNT=2" + } + ]); + const events = await buildEvents(noteIds); + + expect(events).toHaveLength(1); + expect(events[0].rrule).toBeDefined(); + expect(events[0].end).toBeUndefined(); + }); + + it("writes to console on invalid recurrence rule", async () => { + const noteIds = buildNotes([ + { + title: "Invalid Recurrence", + "#startDate": "2025-05-05", + "#recurrence": "RRULE:FREQ=INVALID" + } + ]); + + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + await buildEvents(noteIds); + const calledWithInvalid = consoleSpy.mock.calls.some(call => + call[0].includes("has an invalid #recurrence string") + ); + expect(calledWithInvalid).toBe(true); + consoleSpy.mockRestore(); + }); +}); + + describe("Building locales", () => { it("every language has a locale defined", async () => { for (const { id, contentOnly } of LOCALES) { diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index cd27a89a5b..92952ca68b 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -1,12 +1,14 @@ import { EventInput, EventSourceFuncArg, EventSourceInput } from "@fullcalendar/core/index.js"; +import { dayjs } from "@triliumnext/commons"; import clsx from "clsx"; +import { start } from "repl"; import * as rruleLib from 'rrule'; import FNote from "../../../entities/fnote"; import froca from "../../../services/froca"; import server from "../../../services/server"; import toastService from "../../../services/toast"; -import { formatDateToLocalISO, getCustomisableLabel, getMonthsInDateRange, offsetDate } from "./utils"; +import { getCustomisableLabel, getMonthsInDateRange } from "./utils"; interface Event { startDate: string, @@ -127,9 +129,10 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e startDate = (startTime ? `${startDate}T${startTime}:00` : startDate); if (!startTime) { - const endDateOffset = offsetDate(endDate ?? startDate, 1); - if (endDateOffset) { - endDate = formatDateToLocalISO(endDateOffset); + if (endDate) { + endDate = dayjs(endDate).add(1, "day").format("YYYY-MM-DD"); + } else if (startDate) { + endDate = dayjs(startDate).add(1, "day").format("YYYY-MM-DD"); } } @@ -150,7 +153,7 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e if (recurrence) { // Generate rrule string - const rruleString = `DTSTART:${startDate.replace(/[-:]/g, "")}\n${recurrence}`; + const rruleString = `DTSTART:${dayjs(startDate).format("YYYYMMDD[T]HHmmss")}\n${recurrence}`; // Validate rrule string let rruleValid = true; @@ -164,13 +167,11 @@ export async function buildEvent(note: FNote, { startDate, endDate, startTime, e delete eventData.end; eventData.rrule = rruleString; if (endDate){ - const diffMs = new Date(endDate).getTime() - new Date(startDate).getTime(); - const hours = Math.floor(diffMs / 3600000); - const minutes = Math.floor((diffMs / 60000) % 60); - eventData.duration = `${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`; + const duration = dayjs.duration(dayjs(endDate).diff(dayjs(startDate))); + eventData.duration = duration.format("HH:mm"); } } else { - throw new Error(`Note "${note.noteId} ${note.title}" has an invalid #recurrence string. Excluding...`); + throw new Error(`Note "${note.noteId} ${note.title}" has an invalid #recurrence string ${recurrence}. Excluding...`); } } events.push(eventData); From c938bcc657e4106effb909478d1fd6b1fe96b10c Mon Sep 17 00:00:00 2001 From: BeatLink Date: Fri, 27 Feb 2026 18:01:23 -0500 Subject: [PATCH 26/51] Remove unnecessary error checks --- .../collections/calendar/event_builder.ts | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index 92952ca68b..dec64feee8 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -71,15 +71,7 @@ export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg) continue; } - try { - events.push(await buildEvent(dateNote, { startDate })); - } catch (error) { - if (error instanceof Error) { - const errorMessage = error.message; - toastService.showError(errorMessage); - console.error(errorMessage); - } - } + events.push(await buildEvent(dateNote, { startDate })); if (dateNote.hasChildren()) { @@ -95,16 +87,8 @@ export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg) const childNotes = await froca.getNotes(childNoteIds); for (const childNote of childNotes) { const startDate = childNoteToDateMapping[childNote.noteId]; - try { - const event = await buildEvent(childNote, { startDate }); - events.push(event); - } catch (error) { - if (error instanceof Error) { - const errorMessage = error.message; - toastService.showError(errorMessage); - console.error(errorMessage); - } - } + const event = await buildEvent(childNote, { startDate }); + events.push(event); } return events.flat(); From 57198199474297f7b1af2925b1d657e032473110 Mon Sep 17 00:00:00 2001 From: BeatLink Date: Fri, 27 Feb 2026 18:08:13 -0500 Subject: [PATCH 27/51] Update Recurrence Docs --- .../User Guide/Collections/Calendar.html | 59 +++++++++++++++++++ .../User Guide/Collections/Calendar.md | 26 ++++++++ 2 files changed, 85 insertions(+) diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html index 6675a93c86..4149ac77f0 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Collections/Calendar.html @@ -294,6 +294,65 @@

When not used in a Journal, the calendar is recursive. That is, it will look for events not just in its child notes but also in the children of these child notes.

+

 

+

Recurrence

+

The built in calendar view also supports repeating tasks. If a child note + of the calendar has a #recurrence label with a valid recurrence, that event + will repeat on the calendar according to the recurrence string. 

+

For example, to make a note repeat on the calendar:

+
    +
  • +

    Every Day - #recurrence="FREQ=DAILY;INTERVAL=1" +

    +
  • +
  • +

    Every 3 days - #recurrence="FREQ=DAILY;INTERVAL=3" +

    +
  • +
  • +

    Every week - #recurrence="FREQ=WEEKLY;INTERVAL=1" +

    +
  • +
  • +

    Every 2 weeks on Monday, Wednesday and Friday - #recurrence="FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FR" +

    +
  • +
  • +

    Every 3 months - #recurrence="FREQ=MONTHLY;INTERVAL=3" +

    +
  • +
  • +

    Every 2 months on the First Sunday - #recurrence="FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU" +

    +
  • +
  • +

    Every month on the Last Friday - #recurrence="FREQ=MONTHLY;INTERVAL=1;BYDAY=-1FR" +

    +
  • +
  • +

    And so on.

    +
  • +
+

For other examples of valid RRULE strings + see https://icalendar.org/rrule-tool.html +

+

Note that the recurrence string does not include the DTSTART attribute + as defined in the iCAL specifications. This is derived directly from the + startDateand startTime attributes

+

If you want to override the label the calendar uses to fetch the recurrence + string, you can use the #calendar:recurrence attribute. + For example, you can set #calendar:recurrence=taskRepeats. + Then you can set your recurrence string like #taskRepeats="FREQ=DAILY;INTERVAL=1" +

+

Also note that the recurrence label can be made promoted as with the start + and end dates. 

+ +

 

Use-cases

Using with the Journal / calendar

It is possible to integrate the calendar view into the Journal with day diff --git a/docs/User Guide/User Guide/Collections/Calendar.md b/docs/User Guide/User Guide/Collections/Calendar.md index e0be591847..82bb59b5d8 100644 --- a/docs/User Guide/User Guide/Collections/Calendar.md +++ b/docs/User Guide/User Guide/Collections/Calendar.md @@ -103,6 +103,32 @@ This will result in: When not used in a Journal, the calendar is recursive. That is, it will look for events not just in its child notes but also in the children of these child notes. +## Recurrence + +The built in calendar view also supports repeating tasks. If a child note of the calendar has a #recurrence label with a valid recurrence, that event will repeat on the calendar according to the recurrence string.  + +For example, to make a note repeat on the calendar: + +* Every Day - `#recurrence="FREQ=DAILY;INTERVAL=1"` +* Every 3 days - `#recurrence="FREQ=DAILY;INTERVAL=3"` +* Every week - `#recurrence="FREQ=WEEKLY;INTERVAL=1"` +* Every 2 weeks on Monday, Wednesday and Friday - `#recurrence="FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE,FR"` +* Every 3 months - `#recurrence="FREQ=MONTHLY;INTERVAL=3"` +* Every 2 months on the First Sunday - `#recurrence="FREQ=MONTHLY;INTERVAL=2;BYDAY=1SU"` +* Every month on the Last Friday - `#recurrence="FREQ=MONTHLY;INTERVAL=1;BYDAY=-1FR"` +* And so on. + +For other examples of valid `RRULE` strings see [https://icalendar.org/rrule-tool.html](https://icalendar.org/rrule-tool.html) + +Note that the recurrence string does not include the `DTSTART` attribute as defined in the iCAL specifications. This is derived directly from the `startDate` and `startTime` attributes + +If you want to override the label the calendar uses to fetch the recurrence string, you can use the `#calendar:recurrence` attribute. For example, you can set `#calendar:recurrence=taskRepeats`. Then you can set your recurrence string like `#taskRepeats="FREQ=DAILY;INTERVAL=1"` + +Also note that the recurrence label can be made promoted as with the start and end dates.  + +> [!WARNING] +> If the recurrence string is not valid, a toast will be shown with the note ID and title of the note with the erroneous recurrence message. This note will not be added to the calendar + ## Use-cases ### Using with the Journal / calendar From f311db1cb45c5f9d632e0e948fab08d61e868a24 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 01:28:18 +0000 Subject: [PATCH 28/51] chore(deps): update dependency axios to v1.13.6 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 28 +++++++--------------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 7743735f50..8f3ce0718b 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -69,7 +69,7 @@ "@types/xml2js": "0.4.14", "archiver": "7.0.1", "async-mutex": "0.5.0", - "axios": "1.13.5", + "axios": "1.13.6", "bindings": "1.5.0", "bootstrap": "5.3.8", "chardet": "2.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7887f05a4..d46a70e62f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -641,8 +641,8 @@ importers: specifier: 0.5.0 version: 0.5.0 axios: - specifier: 1.13.5 - version: 1.13.5(debug@4.4.3) + specifier: 1.13.6 + version: 1.13.6(debug@4.4.3) bindings: specifier: 1.5.0 version: 1.5.0 @@ -6837,8 +6837,8 @@ packages: resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} - axios@1.13.5: - resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axios@1.13.6: + resolution: {integrity: sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==} b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -6926,6 +6926,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -9028,15 +9029,6 @@ packages: debug: optional: true - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -16391,8 +16383,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16420,8 +16410,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -22575,7 +22563,7 @@ snapshots: await-to-js@3.0.0: {} - axios@1.13.5(debug@4.4.3): + axios@1.13.6(debug@4.4.3): dependencies: follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.5 @@ -25501,8 +25489,6 @@ snapshots: optionalDependencies: debug: 4.4.3(supports-color@8.1.1) - follow-redirects@1.15.9: {} - for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -26299,7 +26285,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.9 + follow-redirects: 1.15.11(debug@4.4.3) requires-port: 1.0.0 transitivePeerDependencies: - debug From 4ae395ded5383a8bdd3b0f80b80ee42a24486bc8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 01:29:07 +0000 Subject: [PATCH 29/51] fix(deps): update dependency codemirror-lang-elixir to v4.0.1 --- packages/codemirror/package.json | 2 +- pnpm-lock.yaml | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index 25a4df63ad..a815f22c9d 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -47,7 +47,7 @@ "@ssddanbrown/codemirror-lang-smarty": "1.0.0", "@ssddanbrown/codemirror-lang-twig": "1.0.0", "@triliumnext/commons": "workspace:*", - "codemirror-lang-elixir": "4.0.0", + "codemirror-lang-elixir": "4.0.1", "codemirror-lang-hcl": "0.1.0", "codemirror-lang-mermaid": "0.5.0", "eslint-linter-browserify": "10.0.2" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7887f05a4..149cba5a5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1360,8 +1360,8 @@ importers: specifier: workspace:* version: link:../commons codemirror-lang-elixir: - specifier: 4.0.0 - version: 4.0.0 + specifier: 4.0.1 + version: 4.0.1 codemirror-lang-hcl: specifier: 0.1.0 version: 0.1.0 @@ -6926,6 +6926,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -7356,8 +7357,8 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - codemirror-lang-elixir@4.0.0: - resolution: {integrity: sha512-mzFesxo/t6KOxwnkqVd34R/q7yk+sMtHh6vUKGAvjwHmpL7bERHB+vQAsmU/nqrndkwVeJEHWGw/z/ybfdiudA==} + codemirror-lang-elixir@4.0.1: + resolution: {integrity: sha512-z6W/XB4b7TZrp9EZYBGVq93vQfvKbff+1iM8YZaVErL0dguBAeLmVRlEv1NuDZHOP1qjJ3NwyibkUkNWn7q9VQ==} codemirror-lang-hcl@0.1.0: resolution: {integrity: sha512-duwKEaQDhkJWad4YQ9pv4282BS6hCdR+gS/qTAj3f9bypXNNZ42bIN43h9WK3DjyZRENtVlUQdrQM1sA44wHmA==} @@ -16197,8 +16198,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16391,8 +16390,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16420,8 +16417,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.4.0': dependencies: @@ -23318,7 +23313,7 @@ snapshots: clsx@2.1.1: {} - codemirror-lang-elixir@4.0.0: + codemirror-lang-elixir@4.0.1: dependencies: '@codemirror/language': 6.11.0 lezer-elixir: 1.1.2 From d60c117c62b176006549df12b458ceff1d73ce9b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 01:30:58 +0000 Subject: [PATCH 30/51] chore(deps): update dependency eslint-plugin-playwright to v2.8.0 --- package.json | 2 +- pnpm-lock.yaml | 17 ++++++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 25fb12e4ef..3c2c75781f 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "eslint": "10.0.2", "eslint-config-preact": "2.0.0", "eslint-config-prettier": "10.1.8", - "eslint-plugin-playwright": "2.7.1", + "eslint-plugin-playwright": "2.8.0", "eslint-plugin-simple-import-sort": "12.1.1", "happy-dom": "20.7.0", "http-server": "14.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7887f05a4..8ee53f0c85 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,8 +102,8 @@ importers: specifier: 10.1.8 version: 10.1.8(eslint@10.0.2(jiti@2.6.1)) eslint-plugin-playwright: - specifier: 2.7.1 - version: 2.7.1(eslint@10.0.2(jiti@2.6.1)) + specifier: 2.8.0 + version: 2.8.0(eslint@10.0.2(jiti@2.6.1)) eslint-plugin-simple-import-sort: specifier: 12.1.1 version: 12.1.1(eslint@10.0.2(jiti@2.6.1)) @@ -6926,6 +6926,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -8645,8 +8646,8 @@ packages: peerDependencies: eslint: '>=9.0.0' - eslint-plugin-playwright@2.7.1: - resolution: {integrity: sha512-IGwSjYN6N5E0I+xbRpmLXXRKQfiRaEEGEasMWKmIoiLFe+izb81EKBMGSjD/NzlXrWGx/Ys7zDOkgYEHQT2g6Q==} + eslint-plugin-playwright@2.8.0: + resolution: {integrity: sha512-BRCXbnX20l/ZPOOi1jEqNvqU/UjXpkZRJaghQxSM2kjAvsDph8+osn9u1iMmvoa9Cegbp9d0Skh7vro7242t+Q==} engines: {node: '>=16.9.0'} peerDependencies: eslint: '>=8.40.0' @@ -16197,8 +16198,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16391,8 +16390,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16931,8 +16928,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -24978,7 +24973,7 @@ snapshots: eslint: 10.0.2(jiti@2.6.1) globals: 15.15.0 - eslint-plugin-playwright@2.7.1(eslint@10.0.2(jiti@2.6.1)): + eslint-plugin-playwright@2.8.0(eslint@10.0.2(jiti@2.6.1)): dependencies: eslint: 10.0.2(jiti@2.6.1) globals: 17.3.0 From 700edbe2c8a8291d0a015f8c53047b1fd0919a55 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 01:31:50 +0000 Subject: [PATCH 31/51] chore(deps): update dependency multer to v2.1.0 --- apps/server/package.json | 2 +- pnpm-lock.yaml | 25 ++++++++----------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/apps/server/package.json b/apps/server/package.json index 7743735f50..1358bc4a5e 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -108,7 +108,7 @@ "lorem-ipsum": "2.0.8", "marked": "17.0.3", "mime-types": "3.0.2", - "multer": "2.0.2", + "multer": "2.1.0", "normalize-strings": "1.1.1", "rand-token": "1.0.1", "safe-compare": "1.1.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7887f05a4..e7f1313afa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -758,8 +758,8 @@ importers: specifier: 3.0.2 version: 3.0.2 multer: - specifier: 2.0.2 - version: 2.0.2 + specifier: 2.1.0 + version: 2.1.0 normalize-strings: specifier: 1.1.1 version: 1.1.1 @@ -6926,6 +6926,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -11298,8 +11299,8 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - multer@2.0.2: - resolution: {integrity: sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==} + multer@2.1.0: + resolution: {integrity: sha512-TBm6j41rxNohqawsxlsWsNNh/VdV4QFXcBvRcPhXaA05EZ79z0qJ2bQFpync6JBoHTeNY5Q1JpG7AlTjdlfAEA==} engines: {node: '>= 10.16.0'} multicast-dns@7.2.5: @@ -16197,8 +16198,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16264,8 +16263,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 '@ckeditor/ckeditor5-watchdog': 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-dev-build-tools@54.3.3(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': dependencies: @@ -16391,8 +16388,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16931,8 +16926,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.4.0': dependencies: @@ -28249,15 +28242,12 @@ snapshots: muggle-string@0.4.1: {} - multer@2.0.2: + multer@2.1.0: dependencies: append-field: 1.0.0 busboy: 1.6.0 concat-stream: 2.0.0 - mkdirp: 0.5.6 - object-assign: 4.1.1 type-is: 1.6.18 - xtend: 4.0.2 multicast-dns@7.2.5: dependencies: @@ -32985,7 +32975,8 @@ snapshots: xmlhttprequest-ssl@2.0.0: {} - xtend@4.0.2: {} + xtend@4.0.2: + optional: true y18n@5.0.8: {} From 471f3807568ffabff91658a2069829cb7160c444 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 04:53:58 +0000 Subject: [PATCH 32/51] chore(deps): update dependency @types/node to v24.11.0 --- package.json | 2 +- pnpm-lock.yaml | 305 ++++++++++++++++++++++++------------------------- 2 files changed, 153 insertions(+), 154 deletions(-) diff --git a/package.json b/package.json index 25fb12e4ef..24bdf3a149 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@triliumnext/server": "workspace:*", "@types/express": "5.0.6", "@types/js-yaml": "4.0.9", - "@types/node": "24.10.14", + "@types/node": "24.11.0", "@vitest/browser-webdriverio": "4.0.18", "@vitest/coverage-v8": "4.0.18", "@vitest/ui": "4.0.18", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d7887f05a4..34ed3e57ff 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,14 +69,14 @@ importers: specifier: 4.0.9 version: 4.0.9 '@types/node': - specifier: 24.10.14 - version: 24.10.14 + specifier: 24.11.0 + version: 24.11.0 '@vitest/browser-webdriverio': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': specifier: 4.0.18 - version: 4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18) + version: 4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18) '@vitest/ui': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -127,7 +127,7 @@ importers: version: 0.18.0 rollup-plugin-webpack-stats: specifier: 2.1.11 - version: 2.1.11(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.1.11(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) tslib: specifier: 2.8.1 version: 2.8.1 @@ -145,13 +145,13 @@ importers: version: 2.0.1 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.10.14)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.5.4(@types/node@24.11.0)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/build-docs: devDependencies: @@ -338,7 +338,7 @@ importers: version: 5.0.0 '@prefresh/vite': specifier: 2.4.12 - version: 2.4.12(preact@10.28.4)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.4.12(preact@10.28.4)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -374,7 +374,7 @@ importers: version: 0.7.2 vite-plugin-static-copy: specifier: 3.2.0 - version: 3.2.0(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 3.2.0(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) apps/db-compare: dependencies: @@ -810,7 +810,7 @@ importers: version: 1.0.1 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: specifier: 8.19.0 version: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -835,10 +835,10 @@ importers: devDependencies: '@wxt-dev/auto-icons': specifier: 1.1.1 - version: 1.1.1(wxt@0.20.18(@types/node@24.10.14)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 1.1.1(wxt@0.20.18(@types/node@24.11.0)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) wxt: specifier: 0.20.18 - version: 0.20.18(@types/node@24.10.14)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 0.20.18(@types/node@24.11.0)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) apps/website: dependencies: @@ -863,7 +863,7 @@ importers: devDependencies: '@preact/preset-vite': specifier: 2.10.3 - version: 2.10.3(@babel/core@7.28.0)(preact@10.28.4)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.10.3(@babel/core@7.28.0)(preact@10.28.4)(rollup@4.52.0)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) eslint: specifier: 10.0.2 version: 10.0.2(jiti@2.6.1) @@ -878,10 +878,10 @@ importers: version: 0.4.2 vite: specifier: 7.3.1 - version: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) packages/ckeditor5: dependencies: @@ -927,7 +927,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.56.1 version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) @@ -936,7 +936,7 @@ importers: version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -963,16 +963,16 @@ importers: version: 13.0.0(stylelint@17.4.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.24.0 version: 9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -987,7 +987,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.56.1 version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) @@ -996,7 +996,7 @@ importers: version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1023,16 +1023,16 @@ importers: version: 13.0.0(stylelint@17.4.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.24.0 version: 9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1047,7 +1047,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.56.1 version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) @@ -1056,7 +1056,7 @@ importers: version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1083,16 +1083,16 @@ importers: version: 13.0.0(stylelint@17.4.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.24.0 version: 9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1114,7 +1114,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.56.1 version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) @@ -1123,7 +1123,7 @@ importers: version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1150,16 +1150,16 @@ importers: version: 13.0.0(stylelint@17.4.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.24.0 version: 9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1181,7 +1181,7 @@ importers: version: 5.0.0 '@ckeditor/ckeditor5-package-tools': specifier: 5.0.1 - version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) + version: 5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5) '@typescript-eslint/eslint-plugin': specifier: 8.56.1 version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) @@ -1190,7 +1190,7 @@ importers: version: 8.56.1(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3) '@vitest/browser': specifier: 4.0.18 - version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + version: 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/coverage-istanbul': specifier: 4.0.18 version: 4.0.18(vitest@4.0.18) @@ -1217,16 +1217,16 @@ importers: version: 13.0.0(stylelint@17.4.0(typescript@5.9.3)) ts-node: specifier: 10.9.2 - version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.9.3) + version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.9.3) typescript: specifier: 5.9.3 version: 5.9.3 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + version: 2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: specifier: 9.24.0 version: 9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -5966,8 +5966,8 @@ packages: '@types/node@24.10.13': resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==} - '@types/node@24.10.14': - resolution: {integrity: sha512-OowOUbD1lBCOFIPOZ8xnMIhgqA4sCutMiYOmPHL1PTLt5+y1XA+g2+yC9OOyz8p+deMZqPZLxfMjYIfrKsPeFg==} + '@types/node@24.11.0': + resolution: {integrity: sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -6926,6 +6926,7 @@ packages: basic-ftp@5.0.5: resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.0, please upgrade batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -16197,8 +16198,6 @@ snapshots: '@ckeditor/ckeditor5-core': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)': dependencies: @@ -16391,8 +16390,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.4.0 ckeditor5: 47.4.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-editor-classic@47.4.0': dependencies: @@ -16820,7 +16817,7 @@ snapshots: es-toolkit: 1.39.5 protobufjs: 7.5.0 - '@ckeditor/ckeditor5-package-tools@5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5)': + '@ckeditor/ckeditor5-package-tools@5.0.1(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(bufferutil@4.0.9)(esbuild@0.27.3)(utf-8-validate@6.0.5)': dependencies: '@ckeditor/ckeditor5-dev-translations': 54.0.0(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3)) '@ckeditor/ckeditor5-dev-utils': 54.0.0(@babel/core@7.28.0)(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3)(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3)) @@ -16839,7 +16836,7 @@ snapshots: stylelint-config-ckeditor5: 2.0.1(stylelint@16.26.1(typescript@5.0.4)) terser-webpack-plugin: 5.3.14(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3)) ts-loader: 9.5.4(typescript@5.0.4)(webpack@5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3)) - ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.0.4) + ts-node: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.0.4) typescript: 5.0.4 upath: 2.0.1 webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3) @@ -17130,6 +17127,8 @@ snapshots: '@ckeditor/ckeditor5-icons': 47.4.0 '@ckeditor/ckeditor5-ui': 47.4.0 '@ckeditor/ckeditor5-utils': 47.4.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-upload@47.4.0': dependencies: @@ -18691,26 +18690,26 @@ snapshots: '@inquirer/core': 9.2.1 '@inquirer/type': 2.0.0 - '@inquirer/confirm@5.1.21(@types/node@24.10.14)': + '@inquirer/confirm@5.1.21(@types/node@24.11.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@24.10.14) - '@inquirer/type': 3.0.10(@types/node@24.10.14) + '@inquirer/core': 10.3.2(@types/node@24.11.0) + '@inquirer/type': 3.0.10(@types/node@24.11.0) optionalDependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 optional: true - '@inquirer/core@10.3.2(@types/node@24.10.14)': + '@inquirer/core@10.3.2(@types/node@24.11.0)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@24.10.14) + '@inquirer/type': 3.0.10(@types/node@24.11.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 optional: true '@inquirer/core@9.2.1': @@ -18800,9 +18799,9 @@ snapshots: dependencies: mute-stream: 1.0.0 - '@inquirer/type@3.0.10(@types/node@24.10.14)': + '@inquirer/type@3.0.10(@types/node@24.11.0)': optionalDependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 optional: true '@isaacs/fs-minipass@4.0.1': @@ -19230,23 +19229,23 @@ snapshots: dependencies: langium: 4.2.1 - '@microsoft/api-extractor-model@7.30.6(@types/node@24.10.14)': + '@microsoft/api-extractor-model@7.30.6(@types/node@24.11.0)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@24.10.14) + '@rushstack/node-core-library': 5.13.1(@types/node@24.11.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.8(@types/node@24.10.14)': + '@microsoft/api-extractor@7.52.8(@types/node@24.11.0)': dependencies: - '@microsoft/api-extractor-model': 7.30.6(@types/node@24.10.14) + '@microsoft/api-extractor-model': 7.30.6(@types/node@24.11.0) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@24.10.14) + '@rushstack/node-core-library': 5.13.1(@types/node@24.11.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3(@types/node@24.10.14) - '@rushstack/ts-command-line': 5.0.1(@types/node@24.10.14) + '@rushstack/terminal': 0.15.3(@types/node@24.11.0) + '@rushstack/ts-command-line': 5.0.1(@types/node@24.11.0) lodash: 4.17.23 minimatch: 3.0.8 resolve: 1.22.10 @@ -19628,18 +19627,18 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.3(@babel/core@7.28.0)(preact@10.28.4)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@preact/preset-vite@2.10.3(@babel/core@7.28.0)(preact@10.28.4)(rollup@4.52.0)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) - '@prefresh/vite': 2.4.12(preact@10.28.4)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@prefresh/vite': 2.4.12(preact@10.28.4)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@rollup/pluginutils': 5.1.4(rollup@4.52.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) debug: 4.4.3(supports-color@8.1.1) picocolors: 1.1.1 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-prerender-plugin: 0.5.11(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-prerender-plugin: 0.5.11(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) transitivePeerDependencies: - preact - rollup @@ -19660,7 +19659,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.28.4)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@prefresh/vite@2.4.12(preact@10.28.4)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.0 '@prefresh/babel-plugin': 0.5.2 @@ -19668,7 +19667,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.28.4 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -20297,7 +20296,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.52.0': optional: true - '@rushstack/node-core-library@5.13.1(@types/node@24.10.14)': + '@rushstack/node-core-library@5.13.1(@types/node@24.11.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -20308,23 +20307,23 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@rushstack/rig-package@0.5.3': dependencies: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.3(@types/node@24.10.14)': + '@rushstack/terminal@0.15.3(@types/node@24.11.0)': dependencies: - '@rushstack/node-core-library': 5.13.1(@types/node@24.10.14) + '@rushstack/node-core-library': 5.13.1(@types/node@24.11.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 - '@rushstack/ts-command-line@5.0.1(@types/node@24.10.14)': + '@rushstack/ts-command-line@5.0.1(@types/node@24.11.0)': dependencies: - '@rushstack/terminal': 0.15.3(@types/node@24.10.14) + '@rushstack/terminal': 0.15.3(@types/node@24.11.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -21055,7 +21054,7 @@ snapshots: '@types/appdmg@0.5.5': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 optional: true '@types/archiver@7.0.0': @@ -21071,11 +21070,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/bootstrap@5.2.10': dependencies: @@ -21089,7 +21088,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/responselike': 1.0.3 '@types/chai@5.2.2': @@ -21114,11 +21113,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.1.0 - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/cookie-parser@1.4.10(@types/express@5.0.6)': dependencies: @@ -21131,7 +21130,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/cssnano@5.1.3(postcss@8.5.6)': dependencies: @@ -21290,7 +21289,7 @@ snapshots: '@types/express-serve-static-core@5.1.0': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -21331,7 +21330,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 optional: true '@types/geojson-vt@3.2.5': @@ -21354,7 +21353,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/ini@4.1.1': {} @@ -21366,11 +21365,11 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/keyv@3.1.4': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/leaflet-gpx@1.3.8': dependencies: @@ -21420,11 +21419,11 @@ snapshots: '@types/mute-stream@0.0.4': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/node@16.9.1': {} @@ -21456,7 +21455,7 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/node@24.10.14': + '@types/node@24.11.0': dependencies: undici-types: 7.16.0 @@ -21484,13 +21483,13 @@ snapshots: '@types/readdir-glob@1.1.5': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/resolve@1.20.2': {} '@types/responselike@1.0.3': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/retry@0.12.2': {} @@ -21509,7 +21508,7 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/serve-favicon@2.5.7': dependencies: @@ -21522,7 +21521,7 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/send': 0.17.5 '@types/serve-static@2.2.0': @@ -21534,7 +21533,7 @@ snapshots: '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/statuses@2.0.6': optional: true @@ -21549,7 +21548,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 24.10.14 + '@types/node': 24.11.0 form-data: 4.0.5 '@types/supercluster@7.1.3': @@ -21565,7 +21564,7 @@ snapshots: '@types/through2@2.0.41': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 '@types/tmp@0.2.6': {} @@ -21603,7 +21602,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 optional: true '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3))(eslint@10.0.2(jiti@2.6.1))(typescript@5.9.3)': @@ -21877,10 +21876,10 @@ snapshots: - bufferutil - utf-8-validate - '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) webdriverio: 9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21888,16 +21887,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)': + '@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)': dependencies: - '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/utils': 4.0.18 magic-string: 0.30.21 pixelmatch: 7.1.0 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21917,11 +21916,11 @@ snapshots: magicast: 0.5.1 obug: 2.1.1 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18)': + '@vitest/coverage-v8@4.0.18(@vitest/browser@4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18))(vitest@4.0.18)': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -21933,9 +21932,9 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) + '@vitest/browser': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18) '@vitest/expect@4.0.18': dependencies: @@ -21946,14 +21945,14 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.7.5(@types/node@24.10.14)(typescript@5.9.3) - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + msw: 2.7.5(@types/node@24.11.0)(typescript@5.9.3) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/pretty-format@4.0.18': dependencies: @@ -21981,7 +21980,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@4.0.18': dependencies: @@ -22174,12 +22173,12 @@ snapshots: '@webext-core/match-patterns@1.0.3': {} - '@wxt-dev/auto-icons@1.1.1(wxt@0.20.18(@types/node@24.10.14)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': + '@wxt-dev/auto-icons@1.1.1(wxt@0.20.18(@types/node@24.11.0)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))': dependencies: defu: 6.1.4 fs-extra: 11.3.3 sharp: 0.34.5 - wxt: 0.20.18(@types/node@24.10.14)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + wxt: 0.20.18(@types/node@24.11.0)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) '@wxt-dev/browser@0.1.37': dependencies: @@ -23120,7 +23119,7 @@ snapshots: chrome-launcher@1.2.0: dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.2 @@ -24551,7 +24550,7 @@ snapshots: engine.io@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): dependencies: '@types/cors': 2.8.19 - '@types/node': 24.10.14 + '@types/node': 24.11.0 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -26788,7 +26787,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -28221,12 +28220,12 @@ snapshots: ms@2.1.3: {} - msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3): + msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.21(@types/node@24.10.14) + '@inquirer/confirm': 5.1.21(@types/node@24.11.0) '@mswjs/interceptors': 0.37.6 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -29626,7 +29625,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.10.14 + '@types/node': 24.11.0 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -30221,11 +30220,11 @@ snapshots: '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29 optional: true - rollup-plugin-stats@1.5.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + rollup-plugin-stats@1.5.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) rollup-plugin-styles@4.0.0(rollup@4.52.0): dependencies: @@ -30254,13 +30253,13 @@ snapshots: '@rollup/pluginutils': 5.1.4(rollup@4.52.0) rollup: 4.52.0 - rollup-plugin-webpack-stats@2.1.11(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + rollup-plugin-webpack-stats@2.1.11(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - rollup-plugin-stats: 1.5.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + rollup-plugin-stats: 1.5.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) optionalDependencies: rolldown: 1.0.0-beta.29 rollup: 4.52.0 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) rollup@4.52.0: dependencies: @@ -31807,14 +31806,14 @@ snapshots: typescript: 5.0.4 webpack: 5.101.3(@swc/core@1.11.29(@swc/helpers@0.5.17))(esbuild@0.27.3) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.0.4): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.10.14 + '@types/node': 24.11.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -31827,14 +31826,14 @@ snapshots: optionalDependencies: '@swc/core': 1.11.29(@swc/helpers@0.5.17) - ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.14)(typescript@5.9.3): + ts-node@10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.11.0)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 24.10.14 + '@types/node': 24.11.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -32290,13 +32289,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@5.3.0(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite-node@5.3.0(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: cac: 6.7.14 es-module-lexer: 2.0.0 obug: 2.1.1 pathe: 2.0.3 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -32310,9 +32309,9 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.10.14)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-dts@4.5.4(@types/node@24.11.0)(rollup@4.52.0)(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: - '@microsoft/api-extractor': 7.52.8(@types/node@24.10.14) + '@microsoft/api-extractor': 7.52.8(@types/node@24.11.0) '@rollup/pluginutils': 5.1.4(rollup@4.52.0) '@volar/typescript': 2.4.13 '@vue/language-core': 2.2.0(typescript@5.9.3) @@ -32323,27 +32322,27 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-static-copy@3.2.0(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: svgo: 3.3.2 typescript: 5.9.3 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-prerender-plugin@0.5.11(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): + vite-prerender-plugin@0.5.11(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -32351,9 +32350,9 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) @@ -32362,7 +32361,7 @@ snapshots: rollup: 4.52.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.14 + '@types/node': 24.11.0 fsevents: 2.3.3 jiti: 2.6.1 less: 4.1.3 @@ -32373,10 +32372,10 @@ snapshots: tsx: 4.21.0 yaml: 2.8.1 - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.10.14)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@24.11.0)(@vitest/browser-webdriverio@4.0.18)(@vitest/ui@4.0.18)(happy-dom@20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.31.1)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) + '@vitest/mocker': 4.0.18(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -32393,12 +32392,12 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 - '@types/node': 24.10.14 - '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.10.14)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@types/node': 24.11.0 + '@vitest/browser-webdriverio': 4.0.18(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.11.0)(typescript@5.9.3))(utf-8-validate@6.0.5)(vite@7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.0.18)(webdriverio@9.24.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/ui': 4.0.18(vitest@4.0.18) happy-dom: 20.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -32893,7 +32892,7 @@ snapshots: is-wsl: 3.1.0 powershell-utils: 0.1.0 - wxt@0.20.18(@types/node@24.10.14)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): + wxt@0.20.18(@types/node@24.11.0)(eslint@10.0.2(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(rollup@4.52.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@1natsu/wait-element': 4.1.2 '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.52.0) @@ -32937,8 +32936,8 @@ snapshots: publish-browser-extension: 3.0.3 scule: 1.3.0 unimport: 5.6.0 - vite: 7.3.1(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) - vite-node: 5.3.0(@types/node@24.10.14)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite: 7.3.1(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) + vite-node: 5.3.0(@types/node@24.11.0)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.31.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.1) web-ext-run: 0.2.4 optionalDependencies: eslint: 10.0.2(jiti@2.6.1) From 08e69d405c4ab6d13de8853c35fdd476d5aac301 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 07:38:49 +0200 Subject: [PATCH 33/51] style/pdf viewer: tweak the find bar --- .../widgets/type_widgets/file/PdfViewer.tsx | 4 +++- packages/pdfjs-viewer/src/custom.css | 22 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index 3d39135c19..c56f00d03f 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -30,7 +30,9 @@ const VARIABLE_WHITELIST = new Set([ "menu-item-icon-color", "input-focus-outline-color", "input-background-color", - "input-text-color" + "input-text-color", + "ck-editor-toolbar-button-on-background", + "ck-editor-toolbar-button-on-color", ]); interface PdfViewerProps extends Pick, "tabIndex"> { diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 606afa4ac7..0f74f03716 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -33,7 +33,8 @@ #documentPropertiesDialog, #findbar.doorHanger, .doorHangerRight, -#printServiceDialog { +#printServiceDialog, +:root :is(.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor, .signatureEditor), .textLayer) .editToolbar { border: 1px solid var(--tn-dropdown-border-color); border-radius: var(--tn-dropdown-border-radius); background-color: var(--tn-menu-background-color); @@ -85,7 +86,24 @@ } } -#findbar { +:root #findbar { + --toolbar-height: 40px; + padding: 0 4px; + + .toggleButton.toolbarLabel, + .toolbarButton { + height: calc(var(--toolbar-height) - 12px); + padding-inline: 10px; + border-radius: 6px; + aspect-ratio: unset; + } + + .toggleButton.toolbarLabel { + --main-color: var(--tn-ck-color-text); + --button-hover-color: var(--tn-hover-item-background-color); + --toggled-btn-bg-color: var(--tn-ck-editor-toolbar-button-on-background); + --toggled-btn-color: var(--tn-ck-editor-toolbar-button-on-color); + } } #scaleSelectContainer { From 2a875f838601f70f555fcfc443e4098980a1780e Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 08:03:27 +0200 Subject: [PATCH 34/51] style/pdf viewer: restyle text boxes --- .../widgets/type_widgets/file/PdfViewer.tsx | 10 ++++++ packages/pdfjs-viewer/src/custom.css | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index c56f00d03f..bb9b97494d 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -33,6 +33,16 @@ const VARIABLE_WHITELIST = new Set([ "input-text-color", "ck-editor-toolbar-button-on-background", "ck-editor-toolbar-button-on-color", + "input-text-color", + "input-background-color", + "input-hover-background", + "input-hover-color", + "input-focus-background", + "input-focus-color", + "input-focus-outline-color", + "input-placeholder-color", + "input-selection-background", + "input-selection-text-color" ]); interface PdfViewerProps extends Pick, "tabIndex"> { diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 0f74f03716..42453d6eb9 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -66,6 +66,37 @@ --selected-outline-color: var(--tn-main-text-color); } +/* Text boxes */ +input { + --field-border-color: transparent; + --field-bg-color: var(--tn-input-background-color); + --field-color: var(--tn-input-text-color); + --input-horizontal-padding: 8px; + + border-radius: 4px !important; + + &:hover { + --field-bg-color: var(--tn-input-hover-background); + --field-color: var(--tn-input-hover-color); + } + + &:focus { + border-color: transparent !important; + outline: 2px solid var(--tn-input-focus-outline-color); + --field-bg-color: var(--tn-input-focus-background); + --field-color: var(--tn-input-focus-color); + } + + &::placeholder { + color: var(--tn-input-placeholder-color) + } + + &::selection { + background-color: var(--tn-input-selection-background); + color: var(--tn-input-selection-text-color); + } +} + /* #endregion */ /* #region Toolbar */ From 79439f6435baa7c2c732a9998aab4fdfe19b7f40 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 08:28:37 +0200 Subject: [PATCH 35/51] style/pdf viewer: tweak the find bar --- .../widgets/type_widgets/file/PdfViewer.tsx | 3 ++- packages/pdfjs-viewer/src/custom.css | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index bb9b97494d..8f3516c4cd 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -42,7 +42,8 @@ const VARIABLE_WHITELIST = new Set([ "input-focus-outline-color", "input-placeholder-color", "input-selection-background", - "input-selection-text-color" + "input-selection-text-color", + "dropdown-item-icon-destructive-color" ]); interface PdfViewerProps extends Pick, "tabIndex"> { diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 42453d6eb9..005c7c4c20 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -119,8 +119,21 @@ input { :root #findbar { --toolbar-height: 40px; + padding: 0 4px; + /* Search input */ + .loadingInput { + margin-inline-end: 8px; + } + + /* Search input - no results */ + #findInputContainer #findInput[data-status="notFound"] { + --tn-input-focus-outline-color: var(--tn-dropdown-item-icon-destructive-color); + background: inherit; + } + + /* Option buttons */ .toggleButton.toolbarLabel, .toolbarButton { height: calc(var(--toolbar-height) - 12px); @@ -129,12 +142,26 @@ input { aspect-ratio: unset; } + /* Toggable option buttons */ .toggleButton.toolbarLabel { --main-color: var(--tn-ck-color-text); --button-hover-color: var(--tn-hover-item-background-color); --toggled-btn-bg-color: var(--tn-ck-editor-toolbar-button-on-background); --toggled-btn-color: var(--tn-ck-editor-toolbar-button-on-color); } + + /* Search status text */ + #findbarMessageContainer #findResultsCount, + #findMsg { + background-color: transparent; + color: var(--tn-main-text-color); + opacity: .5; + }; + + /* Not found message */ + #findMsg[data-status="notFound"] { + color: var(--tn-dropdown-item-icon-destructive-color); + } } #scaleSelectContainer { From bf748cee242d0383c4dc63dcc7c320805c850555 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 08:44:50 +0200 Subject: [PATCH 36/51] style/pdf viewer: tweak toolbar --- packages/pdfjs-viewer/src/custom.css | 32 ++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 005c7c4c20..6243961fef 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -101,25 +101,49 @@ input { /* #region Toolbar */ +#toolbarContainer { + padding-inline: 12px; +} + .toolbarButton { + border-radius: 6px; + &:not(.labeled):active::before { transform: scale(.85) !important; } &:hover { background: var(--tn-hover-item-background-color); - border-radius: 6px; color: var(--tn-hover-item-text-color); } - &.toggled::before { - color: var(--tn-menu-item-icon-color); + &.toggled { + /* Icon-only button */ + &:not(.labeled) { + background: var(--tn-ck-editor-toolbar-button-on-background); + + &&::before { + background: var(--tn-ck-editor-toolbar-button-on-color); + } + } + + &::before { + color: var(--tn-menu-item-icon-color); + } } } +.verticalToolbarSeparator, +.splitToolbarButtonSeparator { + --separator-color: transparent; +} + +.verticalToolbarSeparator { + margin-inline: 4px; +} :root #findbar { --toolbar-height: 40px; - + padding: 0 4px; /* Search input */ From 5f7c26eed33d49285cdef8c20622cfb77a2a4400 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 08:56:42 +0200 Subject: [PATCH 37/51] style/pdf viewer: tweak document properties dialog button --- packages/pdfjs-viewer/src/custom.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 6243961fef..8741f9d878 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -317,6 +317,12 @@ input { > .row:has(#linearizedField) { display: none; } + + #documentPropertiesClose { + /* TODO: restyle */ + border-radius: 6px; + cursor: pointer; + } } /* #endregion */ From d1fac8f0e2841224249b95f53dae13c869cfaad8 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 10:18:25 +0200 Subject: [PATCH 38/51] client/pdf viewer: remove the CSS variable whitelist --- .../widgets/type_widgets/file/PdfViewer.tsx | 36 +------------------ 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index 8f3516c4cd..8561b2c468 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -12,40 +12,6 @@ const FONTS: FontDefinition[] = [ {name: "Inter", url: Inter}, ] -const VARIABLE_WHITELIST = new Set([ - "root-background", - "main-background-color", - "main-border-color", - "main-text-color", - "theme-style", - "menu-background-color", - "dropdown-backdrop-filter", - "dropdown-border-radius", - "dropdown-border-color", - "dropdown-shadow-opacity", - "menu-padding-size", - "menu-text-color", - "hover-item-background-color", - "hover-item-text-color", - "menu-item-icon-color", - "input-focus-outline-color", - "input-background-color", - "input-text-color", - "ck-editor-toolbar-button-on-background", - "ck-editor-toolbar-button-on-color", - "input-text-color", - "input-background-color", - "input-hover-background", - "input-hover-color", - "input-focus-background", - "input-focus-color", - "input-focus-outline-color", - "input-placeholder-color", - "input-selection-background", - "input-selection-text-color", - "dropdown-item-icon-destructive-color" -]); - interface PdfViewerProps extends Pick, "tabIndex"> { iframeRef?: RefObject; /** Note: URLs are relative to /pdfjs/web. */ @@ -119,7 +85,7 @@ function getRootCssVariables() { for (let i = 0; i < styles.length; i++) { const prop = styles[i]; - if (prop.startsWith('--') && VARIABLE_WHITELIST.has(prop.substring(2))) { + if (prop.startsWith('--')) { vars[`--tn-${prop.substring(2)}`] = styles.getPropertyValue(prop).trim(); } } From d70f5d3ed68dbc5f1aec0ff9c69414757ec69025 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 13:33:48 +0200 Subject: [PATCH 39/51] style/pdf viewer: several tweaks --- packages/pdfjs-viewer/src/custom.css | 62 ++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 8741f9d878..7e55ab50f7 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -3,6 +3,8 @@ :root { --main-color: var(--tn-main-text-color); --body-bg-color: transparent; + --outline-color: var(--tn-input-focus-outline-color); + --focus-ring-color: var(--tn-input-focus-outline-color); --toolbar-border-color: var(--tn-main-border-color); --toolbar-icon-bg-color: var(--tn-main-text-color); --toolbar-bg-color: transparent; @@ -34,7 +36,9 @@ #findbar.doorHanger, .doorHangerRight, #printServiceDialog, -:root :is(.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor, .signatureEditor), .textLayer) .editToolbar { +:root :is(.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor, .signatureEditor), .textLayer) .editToolbar, +#viewerContainer .editToolbar .colorPicker .dropdown, +#editorUndoBar { border: 1px solid var(--tn-dropdown-border-color); border-radius: var(--tn-dropdown-border-radius); background-color: var(--tn-menu-background-color); @@ -64,6 +68,8 @@ :root .colorPicker { --hover-outline-color: var(--tn-input-focus-outline-color); --selected-outline-color: var(--tn-main-text-color); + + outline-offset: 3px; } /* Text boxes */ @@ -74,6 +80,7 @@ input { --input-horizontal-padding: 8px; border-radius: 4px !important; + font-size: .8rem !important; &:hover { --field-bg-color: var(--tn-input-hover-background); @@ -168,7 +175,7 @@ input { /* Toggable option buttons */ .toggleButton.toolbarLabel { - --main-color: var(--tn-ck-color-text); + --main-color: var(--tn-main-text-color); --button-hover-color: var(--tn-hover-item-background-color); --toggled-btn-bg-color: var(--tn-ck-editor-toolbar-button-on-background); --toggled-btn-color: var(--tn-ck-editor-toolbar-button-on-color); @@ -223,10 +230,13 @@ input { --toggled-btn-color: currentColor; --doorhanger-icon-opacity: 1; padding: var(--tn-menu-padding-size); + width: auto; + min-width: 220px; + max-width: 400px; .toolbarButton.labeled { color: var(--tn-menu-text-color); - + padding-inline-end: 12px; font-size: 13px; } } @@ -346,4 +356,50 @@ input { display: none; } +:root :is(.annotationEditorLayer :is(.freeTextEditor, .inkEditor, .stampEditor, .highlightEditor, .signatureEditor), .textLayer) .editToolbar { + --editor-toolbar-hover-bg-color: var(--tn-hover-item-background-color); + --editor-toolbar-hover-fg-color: var(--tn-hover-item-text-color); + --editor-toolbar-hover-outline: transparent; + + padding: 4px; + + .divider { + display: none; + } + + .buttons { + gap: 2px; + + > * { + border-radius: 6px !important; + } + + .deleteButton::before { + background-color: var(--tn-dropdown-item-icon-destructive-color); + } + } +} + +#viewerContainer .editToolbar .colorPicker .dropdown { + padding: 12px 6px; + + &::before { + display: block; + position: absolute; + content: ""; + inset: 0; + border: 1px solid var(--tn-dropdown-border-color); + border-radius: var(--tn-dropdown-border-radius); + backdrop-filter: var(--tn-dropdown-backdrop-filter); + z-index: -1; + } +} + +#editorUndoBar { + --message-bar-fg-color: var(--tn-main-text-color); + --message-bar-icon-color: var(--tn-menu-item-icon-color); + --undo-button-border: transparent; + padding-inline: 20px; +} + /* #endregion */ \ No newline at end of file From b1b9a4461e520842ac9d74b94a776f70756b9753 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 14:45:35 +0200 Subject: [PATCH 40/51] style/pdf viewer: several tweaks --- packages/pdfjs-viewer/src/custom.css | 40 +++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 7e55ab50f7..425b9aa45c 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -3,7 +3,7 @@ :root { --main-color: var(--tn-main-text-color); --body-bg-color: transparent; - --outline-color: var(--tn-input-focus-outline-color); + --outline-color: gray; --focus-ring-color: var(--tn-input-focus-outline-color); --toolbar-border-color: var(--tn-main-border-color); --toolbar-icon-bg-color: var(--tn-main-text-color); @@ -28,7 +28,7 @@ :root #toolbarContainer #toolbarViewer input, :root #editorUndoBar, :root .dialogButton { - font-family: "Inter"; + font-family: Inter, sans-serif; } #secondaryToolbar, @@ -73,14 +73,15 @@ } /* Text boxes */ -input { +input:not([type]), +input[type="number"] { --field-border-color: transparent; --field-bg-color: var(--tn-input-background-color); --field-color: var(--tn-input-text-color); --input-horizontal-padding: 8px; border-radius: 4px !important; - font-size: .8rem !important; + font-size: .85rem !important; &:hover { --field-bg-color: var(--tn-input-hover-background); @@ -104,6 +105,22 @@ input { } } +input[type="color"] { + border: 0; + outline: 0; + background: transparent; + border-radius: 4px; + + &:hover { + opacity: .75; + } + + &:focus { + outline: 2px solid var(--tn-input-focus-outline-color); + outline-offset: 2px; + } +} + /* #endregion */ /* #region Toolbar */ @@ -192,17 +209,27 @@ input { /* Not found message */ #findMsg[data-status="notFound"] { color: var(--tn-dropdown-item-icon-destructive-color); + opacity: 1; } } +#toolbarContainer #toolbarViewer #pageNumber { + font-size: 12px; + font-weight: 600; +} + #scaleSelectContainer { --dropdown-btn-bg-color: transparent; - --button-hover-color: var(--tn-hover-item-background-color); + --button-hover-color: transparent; border-radius: 6px; select:focus { background: var(--tn-main-background-color); } + + &:hover { + background-color: var(--tn-hover-item-background-color); + } } /* Toolbar editor dropdowns */ @@ -237,7 +264,8 @@ input { .toolbarButton.labeled { color: var(--tn-menu-text-color); padding-inline-end: 12px; - font-size: 13px; + padding-block: 6px; + font-size: .9em; } } From 326adc019645c26c18b40f9e81cb510165d7de3e Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 16:35:51 +0200 Subject: [PATCH 41/51] style/pdf viewer: fixes --- packages/pdfjs-viewer/src/custom.css | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css index 425b9aa45c..3bfca86f0f 100644 --- a/packages/pdfjs-viewer/src/custom.css +++ b/packages/pdfjs-viewer/src/custom.css @@ -17,6 +17,7 @@ --spreadHorizontalWrapped-margin-LR: 4px; color-scheme: var(--tn-theme-style); + font-size: 16px; } :root button, @@ -125,6 +126,12 @@ input[type="color"] { /* #region Toolbar */ +#toolbarContainer select.scaleSelect, +#toolbarContainer input.pageNumber { + height: calc(var(--toolbar-height) - 8px); + padding-block: 0; +} + #toolbarContainer { padding-inline: 12px; } @@ -223,11 +230,8 @@ input[type="color"] { --button-hover-color: transparent; border-radius: 6px; - select:focus { - background: var(--tn-main-background-color); - } - - &:hover { + &:hover, + &:focus-within{ background-color: var(--tn-hover-item-background-color); } } @@ -265,7 +269,7 @@ input[type="color"] { color: var(--tn-menu-text-color); padding-inline-end: 12px; padding-block: 6px; - font-size: .9em; + font-size: .9rem; } } From 7efbb4d9456a4b968b1a77eda7630edf2c62d970 Mon Sep 17 00:00:00 2001 From: Giovi Date: Thu, 26 Feb 2026 15:04:40 +0100 Subject: [PATCH 42/51] Translated using Weblate (Italian) Currently translated at 100.0% (1674 of 1674 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/it/ --- apps/client/src/translations/it/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index b4f9792b1b..8237cc1b04 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -519,7 +519,7 @@ "custom_name_label": "Nome del motore di ricerca personalizzato", "custom_name_placeholder": "Personalizza il nome del motore di ricerca", "custom_url_label": "L'URL del motore di ricerca personalizzato deve includere {keyword} come segnaposto per il termine di ricerca.", - "custom_url_placeholder": "Personalizza l'URL del motore di ricerca" + "custom_url_placeholder": "Personalizza l'url del motore di ricerca" }, "sql_table_schemas": { "tables": "Tabelle" @@ -592,7 +592,7 @@ "collapseExpand": "collassa/espande il nodo", "notSet": "non impostato", "goBackForwards": "indietro/avanti nella cronologia", - "showJumpToNoteDialog": "mostra \"Vai a\"", + "showJumpToNoteDialog": "mostra finestra \"Vai a\"", "title": "Scheda riassuntiva", "noteNavigation": "Nota navigazione", "scrollToActiveNote": "scorri fino alla nota attiva", From 819432b4ab28ea9316975594774be5eaaf58f97e Mon Sep 17 00:00:00 2001 From: Luk On Date: Sat, 28 Feb 2026 12:23:46 +0100 Subject: [PATCH 43/51] Translated using Weblate (Polish) Currently translated at 100.0% (1674 of 1674 strings) Translation: Trilium Notes/Client Translate-URL: https://hosted.weblate.org/projects/trilium/client/pl/ --- .../src/translations/pl/translation.json | 63 +++++++++++++++++-- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index 982cb71c43..1202d45124 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -261,7 +261,9 @@ "percentage": "%" }, "pagination": { - "total_notes": "{{count}} notatek" + "total_notes": "{{count}} notatek", + "prev_page": "Poprzednia strona", + "next_page": "Następna strona" }, "collections": { "rendering_error": "Nie można wyświetlić zawartości z powodu błędu." @@ -737,7 +739,8 @@ "raster": "Raster", "vector_light": "Wektor (Jasny)", "vector_dark": "Wektor (Ciemny)", - "show-scale": "Pokaż skalę" + "show-scale": "Pokaż skalę", + "show-labels": "Pokaż nazwy znaczników" }, "table_context_menu": { "delete_row": "Usuń wiersz" @@ -1232,7 +1235,7 @@ "no_attachments": "Ta notatka nie ma załączników." }, "book": { - "no_children_help": "Ta kolekcja nie posiada żadnych notatek podrzędnych, więc nie ma nic do wyświetlenia. Zobacz wiki po szczegóły.", + "no_children_help": "Ta kolekcja nie zawiera notatek podrzędnych, więc nie ma nic do wyświetlenia.", "drag_locked_title": "Zablokowane do edycji", "drag_locked_message": "Przeciąganie niedozwolone, ponieważ kolekcja jest zablokowana do edycji." }, @@ -1653,7 +1656,8 @@ "description": "Opis", "reload_app": "Przeładuj aplikację, aby zastosować zmiany", "set_all_to_default": "Ustaw wszystkie skróty na domyślne", - "confirm_reset": "Czy na pewno chcesz zresetować wszystkie skróty klawiszowe do domyślnych?" + "confirm_reset": "Czy na pewno chcesz zresetować wszystkie skróty klawiszowe do domyślnych?", + "no_results": "Nie znaleziono skrótów pasujących do '{{filter}}'" }, "spellcheck": { "title": "Sprawdzanie pisowni", @@ -1860,7 +1864,9 @@ "print_report_collection_content_few": "Nie można wydrukować {{count}} notatek w kolekcji, ponieważ nie są one obsługiwane lub są chronione.", "print_report_collection_content_many": "Nie można wydrukować {{count}} notatek w kolekcji, ponieważ nie są one obsługiwane lub są chronione.", "print_report_collection_details_button": "Zobacz szczegóły", - "print_report_collection_details_ignored_notes": "Zignorowane notatki" + "print_report_collection_details_ignored_notes": "Zignorowane notatki", + "print_report_error_title": "Nie udało się wydrukować", + "print_report_stack_trace": "Ślad stosu" }, "note_title": { "placeholder": "wpisz tytuł notatki tutaj...", @@ -1875,7 +1881,8 @@ }, "search_result": { "no_notes_found": "Nie znaleziono notatek dla podanych parametrów wyszukiwania.", - "search_not_executed": "Wyszukiwanie nie zostało jeszcze wykonane. Kliknij przycisk \"Szukaj\" powyżej, aby zobaczyć wyniki." + "search_not_executed": "Nie przeprowadzono jeszcze wyszukiwania.", + "search_now": "Szukaj teraz" }, "spacer": { "configure_launchbar": "Konfiguruj pasek szybkiego dostępu" @@ -2145,5 +2152,49 @@ }, "bookmark_buttons": { "bookmarks": "Zakładki" + }, + "render": { + "setup_title": "Wyświetl własny kod HTML lub Preact JSX w tej notatce", + "setup_create_sample_preact": "Stwórz przykładową notatkę z użyciem Preact", + "setup_create_sample_html": "Stwórz przykładową notatkę z użyciem HTML", + "setup_sample_created": "Utworzono przykładową notatkę jako notatkę podrzędną.", + "disabled_description": "Ta notatka pochodzi z zewnętrznego źródła. Ze względów bezpieczeństwa funkcja ta nie jest domyślnie włączona. Upewnij się, że ufasz źródłu, zanim ją aktywujesz.", + "disabled_button_enable": "Włącz renderowanie notatki" + }, + "web_view_setup": { + "title": "Utwórz podgląd strony na żywo bezpośrednio w Trilium", + "url_placeholder": "Wpisz lub wklej adres strony internetowej, na przykład https://triliumnotes.org", + "create_button": "Utwórz widok strony", + "invalid_url_title": "Nieprawidłowy adres", + "invalid_url_message": "Wprowadź prawidłowy adres strony, na przykład https://triliumnotes.org.", + "disabled_description": "Ten widok strony został zaimportowany z zewnętrznego źródła. Aby chronić Cię przed phishingiem lub szkodliwą zawartością, nie jest on ładowany automatycznie. Możesz go włączyć, jeśli ufasz źródłu.", + "disabled_button_enable": "Włącz widok strony" + }, + "active_content_badges": { + "type_icon_pack": "Pakiet ikon", + "type_backend_script": "Skrypt po stronie serwera", + "type_frontend_script": "Skrypt po stronie klienta", + "type_widget": "Widżet", + "type_app_css": "Niestandardowy CSS", + "type_render_note": "Renderuj notatkę", + "type_web_view": "Widok strony", + "type_app_theme": "Własny motyw", + "toggle_tooltip_enable_tooltip": "Kliknij, aby włączyć {{type}}.", + "toggle_tooltip_disable_tooltip": "Kliknij, aby wyłączyć {{type}}.", + "menu_docs": "Otwórz dokumentację", + "menu_execute_now": "Uruchom skrypt teraz", + "menu_run": "Uruchamiaj automatycznie", + "menu_run_disabled": "Ręcznie", + "menu_run_backend_startup": "Podczas uruchamiania backendu", + "menu_run_hourly": "Co godzinę", + "menu_run_daily": "Codziennie", + "menu_run_frontend_startup": "Podczas uruchamiania desktopowego frontendu", + "menu_run_mobile_startup": "Podczas uruchamiania mobilnego frontendu", + "menu_change_to_widget": "Zmień na widżet", + "menu_change_to_frontend_script": "Zmień na skrypt frontendowy", + "menu_theme_base": "Baza motywu" + }, + "setup_form": { + "more_info": "Dowiedz się więcej" } } From deee50f2b4e70961fbdde67472a882b1f050d62c Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 28 Feb 2026 18:34:54 +0200 Subject: [PATCH 44/51] Apply suggestion from @gemini-code-assist[bot] Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- apps/client/src/translations/it/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index 8237cc1b04..6692b9e984 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -519,7 +519,7 @@ "custom_name_label": "Nome del motore di ricerca personalizzato", "custom_name_placeholder": "Personalizza il nome del motore di ricerca", "custom_url_label": "L'URL del motore di ricerca personalizzato deve includere {keyword} come segnaposto per il termine di ricerca.", - "custom_url_placeholder": "Personalizza l'url del motore di ricerca" +"custom_url_placeholder": "Personalizza l'URL del motore di ricerca" }, "sql_table_schemas": { "tables": "Tabelle" From 740974fbfd42c87b15ef6d060444f4c8c670536a Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 28 Feb 2026 18:33:51 +0200 Subject: [PATCH 45/51] fix(next): tab bar offset on horizontal layout --- apps/client/src/stylesheets/theme-next/shell.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/client/src/stylesheets/theme-next/shell.css b/apps/client/src/stylesheets/theme-next/shell.css index 4ef72ddf57..195accc289 100644 --- a/apps/client/src/stylesheets/theme-next/shell.css +++ b/apps/client/src/stylesheets/theme-next/shell.css @@ -1087,7 +1087,7 @@ body.layout-vertical.electron.platform-darwin .tab-row-container { height: var(--tab-height) !important; } -.tab-row-widget > * { +body.layout-vertical .tab-row-widget > * { margin-top: calc((var(--tab-bar-height) - var(--tab-height)) / 2); } From 50301be093339fa719638c9d4c80c45504c02320 Mon Sep 17 00:00:00 2001 From: Adorian Doran Date: Sat, 28 Feb 2026 18:43:51 +0200 Subject: [PATCH 46/51] client/pdf viewer: add a rudimentary support for a read-only view --- apps/client/src/services/content_renderer.ts | 11 ++++++++--- .../src/widgets/type_widgets/file/PdfViewer.tsx | 1 + packages/pdfjs-viewer/src/custom.css | 8 ++++++++ packages/pdfjs-viewer/src/custom.ts | 3 +++ 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/client/src/services/content_renderer.ts b/apps/client/src/services/content_renderer.ts index c8d8ffecac..ddf0996358 100644 --- a/apps/client/src/services/content_renderer.ts +++ b/apps/client/src/services/content_renderer.ts @@ -16,6 +16,8 @@ import protectedSessionHolder from "./protected_session_holder.js"; import renderService from "./render.js"; import { applySingleBlockSyntaxHighlight } from "./syntax_highlight.js"; import utils, { getErrorMessage } from "./utils.js"; +import PdfViewer from "../widgets/type_widgets/file/PdfViewer"; +import { h, render } from "preact"; let idCounter = 1; @@ -195,10 +197,13 @@ function renderFile(entity: FNote | FAttachment, type: string, $renderedContent: const $content = $('

'); if (type === "pdf") { - const $pdfPreview = $(''); - $pdfPreview.attr("src", openService.getUrlForDownload(`pdfjs/web/viewer.html?file=../../api/${entityType}/${entityId}/open`)); + const url = `../../api/${entityType}/${entityId}/open`; + const $viewer = $("
"); + render(h(PdfViewer, {pdfUrl: url, editable: false}), $viewer.get(0)!); + + $content.append($viewer); + - $content.append($pdfPreview); } else if (type === "audio") { const $audioPreview = $("") .attr("src", openService.getUrlForDownload(`api/${entityType}/${entityId}/open-partial`)) diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx index 8561b2c468..6415b89dd6 100644 --- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx +++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx @@ -36,6 +36,7 @@ export default function PdfViewer({ iframeRef: externalIframeRef, pdfUrl, onLoad