diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 017e5b6205..fad12709d3 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,5 +1,7 @@ # Trilium Notes - AI Coding Agent Instructions +> **Note**: When updating this file, also update `CLAUDE.md` in the repository root to keep both AI coding assistants in sync. + ## Project Overview Trilium Notes is a hierarchical note-taking application with advanced features like synchronization, scripting, and rich text editing. Built as a TypeScript monorepo using pnpm, it implements a three-layer caching architecture (Becca/Froca/Shaca) with a widget-based UI system and supports extensive user scripting capabilities. @@ -115,6 +117,15 @@ class MyNoteWidget extends NoteContextAwareWidget { **Important**: Widgets use jQuery (`this.$widget`) for DOM manipulation. Don't mix React patterns here. +### Reusable Preact Components +Common UI components are available in `apps/client/src/widgets/react/` — prefer reusing these over creating custom implementations: +- `NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states) +- `ActionButton` - Consistent button styling with icon support +- `FormTextBox` - Text input with validation and controlled input handling +- `Slider` - Range slider with label +- `Checkbox`, `RadioButton` - Form controls +- `CollapsibleSection` - Expandable content sections + ## Development Workflow ### Running & Testing @@ -322,8 +333,26 @@ Trilium provides powerful user scripting capabilities: - When a translated string contains **interpolated components** (e.g. links, note references) whose order may vary across languages, use `` from `react-i18next` instead of `t()`. This lets translators reorder components freely (e.g. `" in "` vs `"in , "`) - When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md` +#### Client vs Server Translation Usage +- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json` +- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json` +- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped + +### Storing User Preferences +- **Do not use `localStorage`** for user preferences — Trilium has a synced options system that persists across devices +- To add a new user preference: + 1. Add the option type to `OptionDefinitions` in `packages/commons/src/lib/options_interface.ts` + 2. Add a default value in `apps/server/src/services/options_init.ts` in the `defaultOptions` array + 3. **Whitelist the option** in `apps/server/src/routes/api/options.ts` by adding it to `ALLOWED_OPTIONS` (required for client updates) + 4. Use `useTriliumOption("optionName")` hook in React components to read/write the option +- Available hooks: `useTriliumOption` (string), `useTriliumOptionBool`, `useTriliumOptionInt`, `useTriliumOptionJson` +- See `docs/Developer Guide/Developer Guide/Concepts/Options/Creating a new option.md` for detailed documentation + ## Testing Conventions +- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests +- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it + ```typescript // ETAPI test pattern describe("etapi/feature", () => { diff --git a/CLAUDE.md b/CLAUDE.md index 4fb8a3fe1d..ebed3e69a6 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,6 +2,8 @@ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. +> **Note**: When updating this file, also update `.github/copilot-instructions.md` to keep both AI coding assistants in sync. + ## Overview Trilium Notes is a hierarchical note-taking application with synchronization, scripting, and rich text editing. TypeScript monorepo using pnpm with multiple apps and shared packages. @@ -120,6 +122,15 @@ Frontend widgets in `apps/client/src/widgets/`: **Widget lifecycle**: `doRenderBody()` for initial render, `refreshWithNote()` for note changes, `entitiesReloadedEvent({loadResults})` for entity updates. Uses jQuery — don't mix React patterns. +#### Reusable Preact Components +Common UI components are available in `apps/client/src/widgets/react/` — prefer reusing these over creating custom implementations: +- `NoItems` - Empty state placeholder with icon and message (use for "no results", "too many items", error states) +- `ActionButton` - Consistent button styling with icon support +- `FormTextBox` - Text input with validation and controlled input handling +- `Slider` - Range slider with label +- `Checkbox`, `RadioButton` - Form controls +- `CollapsibleSection` - Expandable content sections + Fluent builder pattern: `.child()`, `.class()`, `.css()` chaining with position-based ordering. ### API Architecture @@ -152,6 +163,14 @@ SQLite via `better-sqlite3`. SQL abstraction in `packages/trilium-core/src/servi - Schema: `apps/server/src/assets/db/schema.sql` - Migrations: `apps/server/src/migrations/YYMMDD_HHMM__description.sql` +### Testing Strategy +- Server tests run sequentially due to shared database +- Client tests can run in parallel +- E2E tests use Playwright for both server and desktop apps +- Build validation tests check artifact integrity +- **Write concise tests**: Group related assertions together in a single test case rather than creating many one-shot tests +- **Extract and test business logic**: When adding pure business logic (e.g., data transformations, migrations, validations), extract it as a separate function and always write unit tests for it + ### Internationalization - Translation files in `apps/client/src/translations/` - Supported languages: English, German, Spanish, French, Romanian, Chinese @@ -161,6 +180,11 @@ SQLite via `better-sqlite3`. SQL abstraction in `packages/trilium-core/src/servi - When adding a new locale, follow the step-by-step guide in `docs/Developer Guide/Developer Guide/Concepts/Internationalisation Translations/Adding a new locale.md` - **Server-side translations** (e.g. hidden subtree titles) go in `apps/server/src/assets/translations/en/server.json`, not in the client `translation.json` +#### Client vs Server Translation Usage +- **Client-side**: `import { t } from "../services/i18n"` with keys in `apps/client/src/translations/en/translation.json` +- **Server-side**: `import { t } from "i18next"` with keys in `apps/server/src/assets/translations/en/server.json` +- **Interpolation**: Use `{{variable}}` for normal interpolation; use `{{- variable}}` (with hyphen) for **unescaped** interpolation when the value contains special characters like quotes that shouldn't be HTML-escaped + ### Electron Desktop App - Desktop entry point: `apps/desktop/src/main.ts`, window management: `apps/server/src/services/window.ts` - IPC communication: use `electron.ipcMain.on(channel, handler)` on server side, `electron.ipcRenderer.send(channel, data)` on client side @@ -178,6 +202,16 @@ Use `note.getOwnedAttribute()` for direct, `note.getAttribute()` for inherited. - **Do not use `crypto.randomUUID()`** or other Web Crypto APIs that require secure contexts - Trilium can run over HTTP, not just HTTPS - Use `randomString()` from `apps/client/src/services/utils.ts` for generating IDs instead +### Storing User Preferences +- **Do not use `localStorage`** for user preferences — Trilium has a synced options system that persists across devices +- To add a new user preference: + 1. Add the option type to `OptionDefinitions` in `packages/commons/src/lib/options_interface.ts` + 2. Add a default value in `apps/server/src/services/options_init.ts` in the `defaultOptions` array + 3. **Whitelist the option** in `apps/server/src/routes/api/options.ts` by adding it to `ALLOWED_OPTIONS` (required for client updates) + 4. Use `useTriliumOption("optionName")` hook in React components to read/write the option +- Available hooks: `useTriliumOption` (string), `useTriliumOptionBool`, `useTriliumOptionInt`, `useTriliumOptionJson` +- See `docs/Developer Guide/Developer Guide/Concepts/Options/Creating a new option.md` for detailed documentation + ### Shared Types Policy - Types shared between client and server belong in `@triliumnext/commons` (`packages/commons/src/lib/`) - Import shared types directly from `@triliumnext/commons` - do not re-export them from app-specific modules diff --git a/apps/client-standalone/package.json b/apps/client-standalone/package.json index 09ab08f9e1..216bb524fd 100644 --- a/apps/client-standalone/package.json +++ b/apps/client-standalone/package.json @@ -57,7 +57,7 @@ "leaflet": "1.9.4", "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", - "marked": "17.0.5", + "marked": "18.0.0", "mermaid": "11.14.0", "mind-elixir": "5.10.0", "normalize.css": "8.0.1", diff --git a/apps/client/package.json b/apps/client/package.json index 9626b4ccbf..3aea46be67 100644 --- a/apps/client/package.json +++ b/apps/client/package.json @@ -61,7 +61,7 @@ "leaflet": "1.9.4", "leaflet-gpx": "2.2.0", "mark.js": "8.11.1", - "marked": "17.0.5", + "marked": "18.0.0", "mermaid": "11.14.0", "mind-elixir": "5.10.0", "panzoom": "9.4.4", @@ -76,7 +76,7 @@ }, "devDependencies": { "@ckeditor/ckeditor5-inspector": "5.0.0", - "@prefresh/vite": "2.4.12", + "@prefresh/vite": "3.0.0", "@types/bootstrap": "5.2.10", "@types/jquery": "4.0.0", "@types/leaflet": "1.9.21", diff --git a/apps/client/src/entities/fnote.ts b/apps/client/src/entities/fnote.ts index 5fe7caf33c..a30a83975a 100644 --- a/apps/client/src/entities/fnote.ts +++ b/apps/client/src/entities/fnote.ts @@ -236,6 +236,16 @@ export default class FNote { return this.hasAttribute("label", "archived"); } + /** + * Returns true if the note's metadata (title, icon) should not be editable. + * This applies to system notes like options, help, and launch bar configuration. + */ + get isMetadataReadOnly() { + return utils.isLaunchBarConfig(this.noteId) + || this.noteId.startsWith("_help_") + || this.noteId.startsWith("_options"); + } + getChildNoteIds() { return this.children; } diff --git a/apps/client/src/services/attributes.spec.ts b/apps/client/src/services/attributes.spec.ts index 7a949eebc6..f9caa6906d 100644 --- a/apps/client/src/services/attributes.spec.ts +++ b/apps/client/src/services/attributes.spec.ts @@ -6,10 +6,8 @@ import froca from "./froca"; import server from "./server.js"; // Spy on server methods to track calls -// @ts-expect-error the generic typing is causing issues here -server.put = vi.fn(async (url: string, data?: T) => ({} as T)); -// @ts-expect-error the generic typing is causing issues here -server.remove = vi.fn(async (url: string) => ({} as T)); +server.put = vi.fn(async () => ({})) as typeof server.put; +server.remove = vi.fn(async () => ({})) as typeof server.remove; describe("Set boolean with inheritance", () => { beforeEach(() => { diff --git a/apps/client/src/services/branches.ts b/apps/client/src/services/branches.ts index 8f31060242..15d24a10d7 100644 --- a/apps/client/src/services/branches.ts +++ b/apps/client/src/services/branches.ts @@ -120,7 +120,7 @@ async function deleteNotes(branchIdsToDelete: string[], forceDeleteAllClones = f if (moveToParent) { try { - await activateParentNotePath(); + await activateParentNotePath(branchIdsToDelete); } catch (e) { console.error(e); } @@ -152,13 +152,28 @@ async function deleteNotes(branchIdsToDelete: string[], forceDeleteAllClones = f return true; } -async function activateParentNotePath() { - // this is not perfect, maybe we should find the next/previous sibling, but that's more complex +async function activateParentNotePath(branchIdsToDelete: string[]) { const activeContext = appContext.tabManager.getActiveContext(); - const parentNotePathArr = activeContext?.notePathArray.slice(0, -1); + const activeNotePath = activeContext?.notePathArray ?? []; - if (parentNotePathArr && parentNotePathArr.length > 0) { - activeContext?.setNote(parentNotePathArr.join("/")); + // Find the deleted branch that appears earliest in the active note's path + let earliestIndex = activeNotePath.length; + for (const branchId of branchIdsToDelete) { + const branch = froca.getBranch(branchId); + if (branch) { + const index = activeNotePath.indexOf(branch.noteId); + if (index !== -1 && index < earliestIndex) { + earliestIndex = index; + } + } + } + + // Navigate to the parent of the highest deleted ancestor + if (earliestIndex < activeNotePath.length) { + const parentPath = activeNotePath.slice(0, earliestIndex); + if (parentPath.length > 0) { + await activeContext?.setNote(parentPath.join("/")); + } } } diff --git a/apps/client/src/services/llm_chat.ts b/apps/client/src/services/llm_chat.ts index fa0a0279d3..cd6ab3e63f 100644 --- a/apps/client/src/services/llm_chat.ts +++ b/apps/client/src/services/llm_chat.ts @@ -27,7 +27,8 @@ export interface StreamCallbacks { export async function streamChatCompletion( messages: LlmMessage[], config: LlmChatConfig, - callbacks: StreamCallbacks + callbacks: StreamCallbacks, + abortSignal?: AbortSignal ): Promise { const headers = await server.getHeaders(); @@ -37,7 +38,8 @@ export async function streamChatCompletion( ...headers, "Content-Type": "application/json" } as HeadersInit, - body: JSON.stringify({ messages, config }) + body: JSON.stringify({ messages, config }), + signal: abortSignal }); if (!response.ok) { diff --git a/apps/client/src/services/note_autocomplete.ts b/apps/client/src/services/note_autocomplete.ts index 9ca4fa86fb..18982307ac 100644 --- a/apps/client/src/services/note_autocomplete.ts +++ b/apps/client/src/services/note_autocomplete.ts @@ -68,7 +68,8 @@ async function autocompleteSourceForCKEditor(queryText: string) { name: row.notePathTitle || "", link: `#${row.notePath}`, notePath: row.notePath, - highlightedNotePathTitle: row.highlightedNotePathTitle + highlightedNotePathTitle: row.highlightedNotePathTitle, + icon: row.icon }; }) ); diff --git a/apps/client/src/services/render.tsx b/apps/client/src/services/render.tsx index 682efa8871..31450b3a82 100644 --- a/apps/client/src/services/render.tsx +++ b/apps/client/src/services/render.tsx @@ -18,6 +18,10 @@ async function render(note: FNote, $el: JQuery, onError?: ErrorHand for (const renderNoteId of renderNoteIds) { const bundle = await server.postWithSilentInternalServerError(`script/bundle/${renderNoteId}`); + if (!bundle) { + throw new Error(`Script note '${renderNoteId}' could not be loaded. It may be protected and require an active protected session.`); + } + const $scriptContainer = $("
"); $el.append($scriptContainer); diff --git a/apps/client/src/services/spaced_update.spec.ts b/apps/client/src/services/spaced_update.spec.ts new file mode 100644 index 0000000000..ab649f3435 --- /dev/null +++ b/apps/client/src/services/spaced_update.spec.ts @@ -0,0 +1,87 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +import SpacedUpdate from "./spaced_update"; + +// Mock logError which is a global in Trilium +vi.stubGlobal("logError", vi.fn()); + +describe("SpacedUpdate", () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it("should only call updater once per interval even with multiple pending callbacks", async () => { + const updater = vi.fn(async () => { + // Simulate a slow network request - this is where the race condition occurs + await new Promise((resolve) => setTimeout(resolve, 100)); + }); + + const spacedUpdate = new SpacedUpdate(updater, 50); + + // Simulate rapid typing - each keystroke calls scheduleUpdate() + // This queues multiple setTimeout callbacks due to recursive scheduleUpdate() calls + for (let i = 0; i < 10; i++) { + spacedUpdate.scheduleUpdate(); + // Small delay between keystrokes + await vi.advanceTimersByTimeAsync(5); + } + + // Advance time past the update interval to trigger the update + await vi.advanceTimersByTimeAsync(100); + + // Let the "network request" complete and any pending callbacks run + await vi.advanceTimersByTimeAsync(200); + + // The updater should have been called only ONCE, not multiple times + // With the bug, multiple pending setTimeout callbacks would all pass the time check + // during the async updater call and trigger multiple concurrent requests + expect(updater).toHaveBeenCalledTimes(1); + }); + + it("should call updater again if changes occur during the update", async () => { + const updater = vi.fn(async () => { + await new Promise((resolve) => setTimeout(resolve, 50)); + }); + + const spacedUpdate = new SpacedUpdate(updater, 30); + + // First update + spacedUpdate.scheduleUpdate(); + await vi.advanceTimersByTimeAsync(40); + + // Schedule another update while the first one is in progress + spacedUpdate.scheduleUpdate(); + + // Let first update complete + await vi.advanceTimersByTimeAsync(60); + + // Advance past the interval again for the second update + await vi.advanceTimersByTimeAsync(100); + + // Should have been called twice - once for each distinct change period + expect(updater).toHaveBeenCalledTimes(2); + }); + + it("should restore changed flag on error so retry can happen", async () => { + const updater = vi.fn() + .mockRejectedValueOnce(new Error("Network error")) + .mockResolvedValue(undefined); + + const spacedUpdate = new SpacedUpdate(updater, 50); + + spacedUpdate.scheduleUpdate(); + + // Advance to trigger first update (which will fail) + await vi.advanceTimersByTimeAsync(60); + + // The error should have restored the changed flag, so scheduling again should work + spacedUpdate.scheduleUpdate(); + await vi.advanceTimersByTimeAsync(60); + + expect(updater).toHaveBeenCalledTimes(2); + }); +}); diff --git a/apps/client/src/services/spaced_update.ts b/apps/client/src/services/spaced_update.ts index 3804c4949b..13cdbd7b5e 100644 --- a/apps/client/src/services/spaced_update.ts +++ b/apps/client/src/services/spaced_update.ts @@ -77,16 +77,22 @@ export default class SpacedUpdate { } if (Date.now() - this.lastUpdated > this.updateInterval) { + // Update these BEFORE the async call to prevent race conditions. + // Multiple setTimeout callbacks may be pending from recursive scheduleUpdate() calls. + // Without this, they would all pass the time check during the await and trigger multiple requests. + this.lastUpdated = Date.now(); + this.changed = false; + this.onStateChanged("saving"); try { await this.updater(); this.onStateChanged("saved"); - this.changed = false; } catch (e) { + // Restore changed flag on error so a retry can happen + this.changed = true; this.onStateChanged("error"); logError(getErrorMessage(e)); } - this.lastUpdated = Date.now(); } else { // update isn't triggered but changes are still pending, so we need to schedule another check this.scheduleUpdate(); diff --git a/apps/client/src/services/syntax_highlight.ts b/apps/client/src/services/syntax_highlight.ts index 3b2c35f682..1aa9084ce4 100644 --- a/apps/client/src/services/syntax_highlight.ts +++ b/apps/client/src/services/syntax_highlight.ts @@ -33,6 +33,14 @@ export async function formatCodeBlocks($container: JQuery) { applySingleBlockSyntaxHighlight($(codeBlock), normalizedMimeType); } } + + // Add click-to-copy for inline code (code elements not inside pre) + if (glob.device !== "print") { + const inlineCodeElements = $container.find("code:not(pre code)"); + for (const inlineCode of inlineCodeElements) { + applyInlineCodeCopy($(inlineCode)); + } + } } export function applyCopyToClipboardButton($codeBlock: JQuery) { @@ -51,6 +59,23 @@ export function applyCopyToClipboardButton($codeBlock: JQuery) { $codeBlock.parent().append($copyButton); } +export function applyInlineCodeCopy($inlineCode: JQuery) { + $inlineCode + .addClass("copyable-inline-code") + .attr("title", t("code_block.click_to_copy")) + .off("click") + .on("click", (e) => { + e.stopPropagation(); + + const text = $inlineCode.text(); + if (!isShare) { + copyTextWithToast(text); + } else { + copyText(text); + } + }); +} + /** * Applies syntax highlight to the given code block (assumed to be
), using highlight.js.
  */
diff --git a/apps/client/src/services/ws.ts b/apps/client/src/services/ws.ts
index 0b3b7eb464..23a24f5fc4 100644
--- a/apps/client/src/services/ws.ts
+++ b/apps/client/src/services/ws.ts
@@ -88,7 +88,7 @@ export async function dispatchMessage(message: WebSocketMessage) {
     } else if (messageType === "api-log-messages") {
         appContext.triggerEvent("apiLogMessages", { noteId: msg.noteId, messages: msg.messages });
     } else if (messageType === "toast") {
-        toastService.showMessage(msg.message);
+        toastService.showMessage(msg.message, msg.timeout);
     } else if (messageType === "execute-script") {
         const originEntity = msg.originEntityId ? await froca.getNote(msg.originEntityId) : null;
 
diff --git a/apps/client/src/setup.tsx b/apps/client/src/setup.tsx
index 4d85277433..6606baf4d2 100644
--- a/apps/client/src/setup.tsx
+++ b/apps/client/src/setup.tsx
@@ -282,7 +282,7 @@ function SyncFromServer({ setState }: { setState: (state: State) => void }) {
     async function handleFinishSetup() {
         try {
             const resp = await server.post("setup/sync-from-server", {
-                syncServerHost: syncServerHost.trim(),
+                syncServerHost: syncServerHost.trim().replace(/\/+$/, ""),
                 syncProxy: syncProxy.trim(),
                 password
             });
diff --git a/apps/client/src/stylesheets/style.css b/apps/client/src/stylesheets/style.css
index 536db2d9b5..baff2d14dc 100644
--- a/apps/client/src/stylesheets/style.css
+++ b/apps/client/src/stylesheets/style.css
@@ -1230,6 +1230,43 @@ a.external:not(.no-arrow):after, a[href^="http://"]:not(.no-arrow):after, a[href
     width: 100%;
 }
 
+/* Expandable include note styles */
+.include-note-title-row {
+    display: flex;
+    align-items: center;
+    gap: 5px;
+    cursor: pointer;
+}
+
+.include-note-title-row .include-note-title {
+    margin: 0;
+}
+
+.include-note-toggle {
+    background: none;
+    border: none;
+    padding: 2px;
+    cursor: pointer;
+    font-size: 1.2em;
+    color: var(--main-text-color);
+    transition: transform 0.2s ease;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+.include-note-toggle:hover {
+    color: var(--main-link-color);
+}
+
+.include-note-toggle.expanded {
+    transform: rotate(90deg);
+}
+
+.include-note[data-box-size="expandable"] .include-note-content {
+    margin-top: 10px;
+}
+
 .alert {
     padding: 8px 14px;
     width: auto;
diff --git a/apps/client/src/translations/ar/translation.json b/apps/client/src/translations/ar/translation.json
index 965ada6c42..d2c9d7a44d 100644
--- a/apps/client/src/translations/ar/translation.json
+++ b/apps/client/src/translations/ar/translation.json
@@ -393,9 +393,7 @@
   },
   "delete_notes": {
     "close": "غلق",
-    "cancel": "الغاء",
-    "ok": "نعم",
-    "delete_notes_preview": "حذف معاينة الملاحظات"
+    "cancel": "الغاء"
   },
   "export": {
     "close": "غلق",
@@ -626,7 +624,8 @@
     "date-and-time": "التاريخ والوقت",
     "no_backup_yet": "لايوجد نسخة احتياطية لحد الان",
     "enable_daily_backup": "تمكين النسخ الاحتياطي اليومي",
-    "backup_database_now": "نسخ اختياطي لقاعدة البيانات الان"
+    "backup_database_now": "نسخ اختياطي لقاعدة البيانات الان",
+    "download": "تنزيل"
   },
   "etapi": {
     "created": "تم الأنشاء",
@@ -663,7 +662,6 @@
     "default_shortcuts": "اختصارات افتراضية"
   },
   "sync_2": {
-    "timeout_unit": "ميلي ثانية",
     "note": "ملاحظة",
     "save": "حفظ",
     "help": "المساعدة",
diff --git a/apps/client/src/translations/ca/translation.json b/apps/client/src/translations/ca/translation.json
index 32de8b1615..d4cbd59d2d 100644
--- a/apps/client/src/translations/ca/translation.json
+++ b/apps/client/src/translations/ca/translation.json
@@ -25,8 +25,7 @@
   },
   "delete_notes": {
     "close": "Tanca",
-    "cancel": "Cancel·la",
-    "ok": "OK"
+    "cancel": "Cancel·la"
   },
   "export": {
     "close": "Tanca",
diff --git a/apps/client/src/translations/cn/translation.json b/apps/client/src/translations/cn/translation.json
index 8abc10324e..6d2b66ebd3 100644
--- a/apps/client/src/translations/cn/translation.json
+++ b/apps/client/src/translations/cn/translation.json
@@ -88,7 +88,6 @@
     "also_delete_note": "同时删除笔记"
   },
   "delete_notes": {
-    "delete_notes_preview": "删除笔记预览",
     "close": "关闭",
     "delete_all_clones_description": "同时删除所有克隆(可以在最近修改中撤消)",
     "erase_notes_description": "通常(软)删除仅标记笔记为已删除,可以在一段时间内通过最近修改对话框撤消。选中此选项将立即擦除笔记,不可撤销。",
@@ -96,9 +95,7 @@
     "notes_to_be_deleted": "将删除以下笔记 ({{notesCount}})",
     "no_note_to_delete": "没有笔记将被删除(仅克隆)。",
     "broken_relations_to_be_deleted": "将删除以下关系并断开连接 ({{ relationCount}})",
-    "cancel": "取消",
-    "ok": "确定",
-    "deleted_relation_text": "笔记 {{- note}} (将被删除的笔记) 被以下关系 {{- relation}} 引用, 来自 {{- source}}。"
+    "cancel": "取消"
   },
   "export": {
     "export_note_title": "导出笔记",
@@ -368,7 +365,7 @@
     "calendar_root": "标记应用作为每日笔记的根。只应标记一个笔记。",
     "archived": "含有此标签的笔记默认在搜索结果中不可见(也适用于跳转到、添加链接对话框等)。",
     "exclude_from_export": "笔记(及其子树)不会包含在任何笔记导出中",
-    "run": "定义脚本应运行的事件。可能的值包括:\n
    \n
  • frontendStartup - Trilium前端启动时(或刷新时),但不会在移动端执行。
  • \n
  • mobileStartup - Trilium前端启动时(或刷新时), 在移动端会执行。
  • \n
  • backendStartup - Trilium后端启动时
  • \n
  • hourly - 每小时运行一次。您可以使用附加标签runAtHour指定小时。
  • \n
  • daily - 每天运行一次
  • \n
", + "run": "定义脚本应运行的事件。可能的值包括:\n
    \n
  • frontendStartup - Trilium前端启动时(或刷新时),但不会在移动端执行。
  • \n
  • mobileStartup - Trilium前端启动时(或刷新时), 在移动端会执行。
  • \n
  • backendStartup - Trilium后端启动时。
  • \n
  • hourly - 每小时运行一次。您可以使用附加标签runAtHour指定小时。
  • \n
  • daily - 每天运行一次。
  • \n
", "run_on_instance": "定义应在哪个Trilium实例上运行。默认为所有实例。", "run_at_hour": "应在哪个小时运行。应与#run=hourly一起使用。可以多次定义,以便一天内运行多次。", "disable_inclusion": "含有此标签的脚本不会包含在父脚本执行中。", @@ -804,7 +801,10 @@ "expand_first_level": "展开直接子代", "expand_nth_level": "展开 {{depth}} 层", "expand_all_levels": "展开所有层级", - "hide_child_notes": "隐藏树中的子笔记" + "hide_child_notes": "隐藏树中的子笔记", + "open_all_in_tabs": "全部打开", + "open_all_in_tabs_tooltip": "在新标签页中打开所有结果", + "open_all_confirm": "这将在新标签页中打开 {{count}} 个笔记。继续吗?" }, "edited_notes": { "no_edited_notes_found": "今天还没有编辑过的笔记...", @@ -858,7 +858,8 @@ "collapse": "折叠到正常大小", "title": "笔记地图", "fix-nodes": "固定节点", - "link-distance": "链接距离" + "link-distance": "链接距离", + "too-many-notes": "此子树包含 {{count}} 个笔记,超过了笔记地图中可显示的 {{max}} 个笔记的限制。" }, "note_paths": { "title": "笔记路径", @@ -1063,7 +1064,8 @@ "note_already_in_diagram": "笔记 \"{{title}}\" 已经在图中。", "enter_title_of_new_note": "输入新笔记的标题", "default_new_note_title": "新笔记", - "click_on_canvas_to_place_new_note": "点击画布以放置新笔记" + "click_on_canvas_to_place_new_note": "点击画布以放置新笔记", + "rename_relation": "重命名关系" }, "backend_log": { "refresh": "刷新" @@ -1337,7 +1339,8 @@ "date-and-time": "日期和时间", "path": "路径", "database_backed_up_to": "数据库已备份到 {{backupFilePath}}", - "no_backup_yet": "尚无备份" + "no_backup_yet": "尚无备份", + "download": "下载" }, "etapi": { "title": "ETAPI", @@ -1435,9 +1438,15 @@ "spellcheck": { "title": "拼写检查", "description": "这些选项仅适用于桌面版本,浏览器将使用其原生的拼写检查功能。", - "enable": "启用拼写检查", - "language_code_label": "语言代码", - "restart-required": "拼写检查选项的更改将在应用重启后生效。" + "enable": "拼写检查", + "language_code_label": "拼写检查语言", + "restart-required": "拼写检查选项的更改将在应用重启后生效。", + "custom_dictionary_title": "自定义词典", + "custom_dictionary_description": "添加到词典中的单词会在您的所有设备上同步。", + "custom_dictionary_edit": "自定义词", + "custom_dictionary_edit_description": "编辑拼写检查器不应标记的单词列表。更改将在重启后生效。", + "custom_dictionary_open": "编辑词典", + "related_description": "配置拼写检查语言和自定义词典。" }, "sync_2": { "config_title": "同步配置", @@ -1453,7 +1462,7 @@ "test_description": "测试和同步服务器之间的连接。如果同步服务器没有初始化,会将本地文档同步到同步服务器上。", "test_button": "测试同步", "handshake_failed": "同步服务器握手失败,错误:{{message}}", - "timeout_unit": "毫秒" + "timeout_description": "同步连接速度慢时,应该等待多久才放弃?如果网络不稳定,请增加等待时间。" }, "api_log": { "close": "关闭" @@ -1876,7 +1885,7 @@ }, "content_language": { "title": "内容语言", - "description": "选择一种或多种语言出现在只读或可编辑文本注释的基本属性,这将支持拼写检查或从右向左之类的功能。" + "description": "在只读或可编辑文本笔记的“基本属性”部分,选择一种或多种语言,这些语言将显示在语言选择列表中。这将启用拼写检查、从右到左的阅读支持和文本提取(OCR)等功能。" }, "switch_layout_button": { "title_vertical": "将编辑面板移至底部", @@ -2231,7 +2240,9 @@ "sample_xy": "散点图", "sample_venn": "韦恩图", "sample_ishikawa": "鱼骨图", - "placeholder": "输入你的美人鱼图的内容,或者使用下面的示例图之一。" + "placeholder": "输入你的美人鱼图的内容,或者使用下面的示例图之一。", + "sample_treeview": "树形视图", + "sample_wardley": "沃德利地图" }, "llm_chat": { "placeholder": "输入消息…", @@ -2262,7 +2273,8 @@ "note_context_disabled": "点击即可将当前注释添加到上下文中", "no_provider_message": "未配置人工智能提供商。添加一个即可开始对话。", "add_provider": "添加人工智能提供商", - "note_tools": "笔记访问" + "note_tools": "笔记访问", + "sources_summary": "来自 {{sites}} 个网站的 {{count}} 个来源" }, "sidebar_chat": { "title": "AI对话", @@ -2285,7 +2297,10 @@ "processing": "正在处理...", "processing_started": "OCR识别已开始。请稍候片刻并刷新页面。", "processing_failed": "OCR处理启动失败", - "view_extracted_text": "查看提取的文本(OCR)" + "view_extracted_text": "查看提取的文本(OCR)", + "processing_complete": "OCR识别处理完成。", + "text_filtered_low_confidence": "OCR 检测到文本,置信度为 {{confidence}}% ,但由于您的最小阈值为 {{threshold}}% ,因此该文本已被丢弃。", + "open_media_settings": "打开设置" }, "mind-map": { "addChild": "添加子节点", @@ -2303,6 +2318,13 @@ }, "llm": { "settings_description": "配置人工智能和大语言模型集成。", - "add_provider": "添加提供商" + "add_provider": "添加提供商", + "settings_title": "AI / LLM", + "feature_not_enabled": "在“设置”→“高级”→“实验性功能”中启用 LLM 实验性功能,即可使用 AI 集成。", + "add_provider_title": "添加AI供应商", + "configured_providers": "已配置的供应商", + "no_providers_configured": "尚未配置任何供应商。", + "provider_name": "名称", + "provider_type": "供应商" } } diff --git a/apps/client/src/translations/cs/translation.json b/apps/client/src/translations/cs/translation.json index 5298bc48af..459a097d57 100644 --- a/apps/client/src/translations/cs/translation.json +++ b/apps/client/src/translations/cs/translation.json @@ -77,16 +77,13 @@ }, "delete_notes": { "cancel": "Zrušit", - "ok": "OK", "close": "Zavřít", - "delete_notes_preview": "Odstranit náhled poznámek", "delete_all_clones_description": "Odstraňte také všechny klony (lze vrátit zpět v nedávných změnách)", "erase_notes_description": "Normální (měkké) smazání pouze označí poznámky jako smazané a lze je během určité doby obnovit (v dialogovém okně posledních změn). Zaškrtnutím této možnosti se poznámky okamžitě vymažou a nebude možné je obnovit.", "erase_notes_warning": "Trvale smažte poznámky (nelze vrátit zpět), včetně všech klonů. Tím se vynutí opětovné načtení aplikace.", "notes_to_be_deleted": "Následující poznámky budou smazány ({{notesCount}})", "no_note_to_delete": "Žádná poznámka nebude smazána (pouze klony).", - "broken_relations_to_be_deleted": "Následující vazby budou přerušeny a smazány ({{relationCount}})", - "deleted_relation_text": "Poznámka {{- note}} (bude smazána) je odkazována vazbou {{- relation}} pocházející z {{- source}}." + "broken_relations_to_be_deleted": "Následující vazby budou přerušeny a smazány ({{relationCount}})" }, "export": { "close": "Zavřít", @@ -1508,7 +1505,6 @@ "config_title": "Konfigurace Synchronizace", "server_address": "Adresa instance serveru", "timeout": "Časový limit synchronizace", - "timeout_unit": "milisekund", "proxy_label": "Proxy server pro synchronizaci (volitelné)", "note": "Poznámka", "note_description": "Pokud ponecháte nastavení proxy prázdné, bude použit systémový proxy (platí pouze pro desktop/electron build).", diff --git a/apps/client/src/translations/de/translation.json b/apps/client/src/translations/de/translation.json index 358c92cf38..644b77a63e 100644 --- a/apps/client/src/translations/de/translation.json +++ b/apps/client/src/translations/de/translation.json @@ -88,7 +88,6 @@ "also_delete_note": "Auch die Notiz löschen" }, "delete_notes": { - "delete_notes_preview": "Vorschau der Notizen löschen", "close": "Schließen", "delete_all_clones_description": "auch alle Klone löschen (kann bei letzte Änderungen rückgängig gemacht werden)", "erase_notes_description": "Beim normalen (vorläufigen) Löschen werden die Notizen nur als gelöscht markiert und sie können innerhalb eines bestimmten Zeitraums (im Dialogfeld „Letzte Änderungen“) wiederhergestellt werden. Wenn du diese Option aktivierst, werden die Notizen sofort gelöscht und es ist nicht möglich, die Notizen wiederherzustellen.", @@ -96,9 +95,7 @@ "notes_to_be_deleted": "Folgende Notizen werden gelöscht ({{notesCount}})", "no_note_to_delete": "Es werden keine Notizen gelöscht (nur Klone).", "broken_relations_to_be_deleted": "Folgende Beziehungen werden gelöst und gelöscht ({{ relationCount}})", - "cancel": "Abbrechen", - "ok": "OK", - "deleted_relation_text": "Notiz {{- note}} (soll gelöscht werden) wird von Beziehung {{- relation}} ausgehend von {{- source}} referenziert." + "cancel": "Abbrechen" }, "export": { "export_note_title": "Notiz exportieren", @@ -1401,8 +1398,7 @@ "test_title": "Synchronisierungstest", "test_description": "Dadurch werden die Verbindung und der Handshake zum Synchronisierungsserver getestet. Wenn der Synchronisierungsserver nicht initialisiert ist, wird er dadurch für die Synchronisierung mit dem lokalen Dokument eingerichtet.", "test_button": "Teste die Synchronisierung", - "handshake_failed": "Handshake des Synchronisierungsservers fehlgeschlagen, Fehler: {{message}}", - "timeout_unit": "Millisekunden" + "handshake_failed": "Handshake des Synchronisierungsservers fehlgeschlagen, Fehler: {{message}}" }, "api_log": { "close": "Schließen" diff --git a/apps/client/src/translations/el/translation.json b/apps/client/src/translations/el/translation.json index 7cb1f9b72d..d502d68fa0 100644 --- a/apps/client/src/translations/el/translation.json +++ b/apps/client/src/translations/el/translation.json @@ -4,7 +4,7 @@ "homepage": "Αρχική Σελίδα:", "app_version": "Έκδοση εφαρμογής:", "db_version": "Έκδοση βάσης δεδομένων:", - "sync_version": "Έκδοση πρωτοκόλου συγχρονισμού:", + "sync_version": "Έκδοση συγχρονισμού:", "build_date": "Ημερομηνία χτισίματος εφαρμογής:", "build_revision": "Αριθμός αναθεώρησης χτισίματος:", "data_directory": "Φάκελος δεδομένων:" diff --git a/apps/client/src/translations/en/translation.json b/apps/client/src/translations/en/translation.json index 26fefe47ec..70a2fad94b 100644 --- a/apps/client/src/translations/en/translation.json +++ b/apps/client/src/translations/en/translation.json @@ -88,17 +88,23 @@ "also_delete_note": "Also delete the note" }, "delete_notes": { - "delete_notes_preview": "Delete notes preview", + "title": "Delete notes", "close": "Close", + "clones_label": "Clones", + "delete_clones_description_one": "Also delete {{count}} other clone. Can be undone in recent changes.", + "delete_clones_description_other": "Also delete {{count}} other clones. Can be undone in recent changes.", "delete_all_clones_description": "Delete also all clones (can be undone in recent changes)", - "erase_notes_description": "Normal (soft) deletion only marks the notes as deleted and they can be undeleted (in recent changes dialog) within a period of time. Checking this option will erase the notes immediately and it won't be possible to undelete the notes.", + "erase_notes_label": "Erase permanently", + "erase_notes_description": "Erase notes immediately instead of soft deletion. This cannot be undone and will force application reload.", "erase_notes_warning": "Erase notes permanently (can't be undone), including all clones. This will force application reload.", - "notes_to_be_deleted": "Following notes will be deleted ({{notesCount}})", + "notes_to_be_deleted": "Notes to be deleted ({{notesCount}})", "no_note_to_delete": "No note will be deleted (only clones).", - "broken_relations_to_be_deleted": "Following relations will be broken and deleted ({{ relationCount}})", + "broken_relations_to_be_deleted": "Broken relations ({{relationCount}})", + "table_note_with_relation": "Note with relation", + "table_relation": "Relation", + "table_points_to": "Points to (deleted)", "cancel": "Cancel", - "ok": "OK", - "deleted_relation_text": "Note {{- note}} (to be deleted) is referenced by relation {{- relation}} originating from {{- source}}." + "delete": "Delete" }, "export": { "export_note_title": "Export note", @@ -209,6 +215,7 @@ "box_size_small": "small (~ 10 lines)", "box_size_medium": "medium (~ 30 lines)", "box_size_full": "full (box shows complete text)", + "box_size_expandable": "expandable (collapsed by default)", "button_include": "Include note" }, "info": { @@ -806,7 +813,11 @@ "board": "Board", "presentation": "Presentation", "include_archived_notes": "Show archived notes", - "hide_child_notes": "Hide child notes in tree" + "hide_child_notes": "Hide child notes in tree", + "open_all_in_tabs": "Open all", + "open_all_in_tabs_tooltip": "Open all results in new tabs", + "open_all_confirm": "This will open {{count}} notes in new tabs. Continue?", + "open_all_too_many": "Too many results ({{count}}). Maximum is {{max}}." }, "edited_notes": { "no_edited_notes_found": "No edited notes on this day yet...", @@ -860,7 +871,8 @@ "collapse": "Collapse to normal size", "title": "Note Map", "fix-nodes": "Fix nodes", - "link-distance": "Link distance" + "link-distance": "Link distance", + "too-many-notes": "This subtree contains {{count}} notes, which exceeds the limit of {{max}} that can be displayed in the note map." }, "note_paths": { "title": "Note Paths", @@ -1401,7 +1413,8 @@ "date-and-time": "Date & time", "path": "Path", "database_backed_up_to": "Database has been backed up to {{backupFilePath}}", - "no_backup_yet": "no backup yet" + "no_backup_yet": "no backup yet", + "download": "Download" }, "etapi": { "title": "ETAPI", @@ -1513,7 +1526,7 @@ "config_title": "Sync Configuration", "server_address": "Server instance address", "timeout": "Sync timeout", - "timeout_unit": "milliseconds", + "timeout_description": "How long to wait before giving up on a slow sync connection. Increase if you have an unstable network.", "proxy_label": "Sync proxy server (optional)", "note": "Note", "note_description": "If you leave the proxy setting blank, the system proxy will be used (applies to desktop/electron build only).", @@ -1664,7 +1677,8 @@ "note_context_enabled": "Click to disable note context: {{title}}", "note_context_disabled": "Click to include current note in context", "no_provider_message": "No AI provider configured. Add one to start chatting.", - "add_provider": "Add AI Provider" + "add_provider": "Add AI Provider", + "stop": "Stop" }, "sidebar_chat": { "title": "AI Chat", @@ -1870,7 +1884,8 @@ "theme_none": "No syntax highlighting", "theme_group_light": "Light themes", "theme_group_dark": "Dark themes", - "copy_title": "Copy to clipboard" + "copy_title": "Copy to clipboard", + "click_to_copy": "Click to copy" }, "classic_editor_toolbar": { "title": "Formatting" @@ -2418,7 +2433,11 @@ "web_search": "Web search", "note_in_parent": " in ", "get_attachment": "Get attachment", - "get_attachment_content": "Read attachment content" + "get_attachment_content": "Read attachment content", + "rename_note": "Rename note", + "delete_note": "Delete note", + "move_note": "Move note", + "clone_note": "Clone note" } } } diff --git a/apps/client/src/translations/es/translation.json b/apps/client/src/translations/es/translation.json index 2b6a667856..c2ea5b0a0c 100644 --- a/apps/client/src/translations/es/translation.json +++ b/apps/client/src/translations/es/translation.json @@ -88,7 +88,6 @@ "also_delete_note": "También eliminar la nota" }, "delete_notes": { - "delete_notes_preview": "Eliminar vista previa de notas", "close": "Cerrar", "delete_all_clones_description": "Eliminar también todos los clones (se puede deshacer en cambios recientes)", "erase_notes_description": "La eliminación normal (suave) solo marca las notas como eliminadas y se pueden recuperar (en el cuadro de diálogo de cambios recientes) dentro de un periodo de tiempo. Al marcar esta opción se borrarán las notas inmediatamente y no será posible recuperarlas.", @@ -96,9 +95,7 @@ "notes_to_be_deleted": "Las siguientes notas serán eliminadas ({{notesCount}})", "no_note_to_delete": "No se eliminará ninguna nota (solo clones).", "broken_relations_to_be_deleted": "Las siguientes relaciones se romperán y serán eliminadas ({{ relationCount}})", - "cancel": "Cancelar", - "ok": "Aceptar", - "deleted_relation_text": "Nota {{- note}} (para ser eliminada) está referenciado por la relación {{- relation}} que se origina en {{- source}}." + "cancel": "Cancelar" }, "export": { "export_note_title": "Exportar nota", @@ -1332,7 +1329,8 @@ "date-and-time": "Fecha y hora", "path": "Ruta", "database_backed_up_to": "Se ha realizado una copia de seguridad de la base de datos en {{backupFilePath}}", - "no_backup_yet": "no hay copia de seguridad todavía" + "no_backup_yet": "no hay copia de seguridad todavía", + "download": "Descargar" }, "etapi": { "title": "ETAPI", @@ -1438,7 +1436,6 @@ "config_title": "Configuración de sincronización", "server_address": "Dirección de la instancia del servidor", "timeout": "Tiempo de espera de sincronización (milisegundos)", - "timeout_unit": "milisegundos", "proxy_label": "Sincronizar servidor proxy (opcional)", "note": "Nota", "note_description": "Si deja la configuración del proxy en blanco, se utilizará el proxy del sistema (se aplica únicamente a la compilación de escritorio/electron).", diff --git a/apps/client/src/translations/fi/translation.json b/apps/client/src/translations/fi/translation.json index fe6d636f6e..6791899ea4 100644 --- a/apps/client/src/translations/fi/translation.json +++ b/apps/client/src/translations/fi/translation.json @@ -62,12 +62,10 @@ "also_delete_note": "Poista myös muistio" }, "delete_notes": { - "delete_notes_preview": "Poista muistion esikatselu", "close": "Sulje", "notes_to_be_deleted": "Seuraavat muistiot tullaan poistamaan ({{notesCount}})", "no_note_to_delete": "Muistioita ei poisteta (vain kopiot).", - "cancel": "Peruuta", - "ok": "OK" + "cancel": "Peruuta" }, "export": { "export_note_title": "Vie muistio", diff --git a/apps/client/src/translations/fr/translation.json b/apps/client/src/translations/fr/translation.json index 590c4e184d..082f172a47 100644 --- a/apps/client/src/translations/fr/translation.json +++ b/apps/client/src/translations/fr/translation.json @@ -88,7 +88,6 @@ "also_delete_note": "Supprimer également la note" }, "delete_notes": { - "delete_notes_preview": "Supprimer la note", "close": "Fermer", "delete_all_clones_description": "Supprimer aussi les clones (peut être annulé dans des modifications récentes)", "erase_notes_description": "La suppression normale (douce) marque uniquement les notes comme supprimées et elles peuvent être restaurées (dans la boîte de dialogue des Modifications récentes) dans un délai donné. Cocher cette option effacera les notes immédiatement et il ne sera pas possible de les restaurer.", @@ -96,9 +95,7 @@ "notes_to_be_deleted": "Les notes suivantes seront supprimées ({{notesCount}})", "no_note_to_delete": "Aucune note ne sera supprimée (uniquement les clones).", "broken_relations_to_be_deleted": "Les relations suivantes seront rompues et supprimées ({{ relationCount}})", - "cancel": "Annuler", - "ok": "OK", - "deleted_relation_text": "Note {{- note}} (à supprimer) est référencée dans la relation {{- relation}} provenant de {{- source}}." + "cancel": "Annuler" }, "export": { "export_note_title": "Exporter la note", @@ -1406,8 +1403,7 @@ "test_title": "Test de synchronisation", "test_description": "Testera la connexion et la prise de contact avec le serveur de synchronisation. Si le serveur de synchronisation n'est pas initialisé, cela le configurera pour qu'il se synchronise avec le document local.", "test_button": "Tester la synchronisation", - "handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}", - "timeout_unit": "millisecondes" + "handshake_failed": "Échec de la négociation avec le serveur de synchronisation, erreur : {{message}}" }, "api_log": { "close": "Fermer" diff --git a/apps/client/src/translations/ga/translation.json b/apps/client/src/translations/ga/translation.json index 6322e27329..6854c3ff77 100644 --- a/apps/client/src/translations/ga/translation.json +++ b/apps/client/src/translations/ga/translation.json @@ -119,7 +119,6 @@ "also_delete_note": "Scrios an nóta freisin" }, "delete_notes": { - "delete_notes_preview": "Réamhamharc ar scriosadh nótaí", "close": "Dún", "delete_all_clones_description": "Scrios gach clón freisin (is féidir é seo a chealú in athruithe le déanaí)", "erase_notes_description": "Ní mharcálann scriosadh gnáth (bog) ach na nótaí mar scriosta agus is féidir iad a dhíscriosadh (sa dialóg athruithe le déanaí) laistigh de thréimhse ama. Scriosfar na nótaí láithreach má sheiceálann tú an rogha seo agus ní bheidh sé indéanta na nótaí a dhíscriosadh.", @@ -127,9 +126,7 @@ "notes_to_be_deleted": "Scriosfar na nótaí seo a leanas ({{notesCount}})", "no_note_to_delete": "Ní scriosfar aon nóta (clóin amháin).", "broken_relations_to_be_deleted": "Brisfear agus scriosfar na caidrimh seo a leanas ({{ relationCount}})", - "cancel": "Cealaigh", - "ok": "Ceart go leor", - "deleted_relation_text": "Tá tagairt don nóta {{- note}} (le scriosadh) le gaol {{- relation}} a thagann ó {{- source}}." + "cancel": "Cealaigh" }, "export": { "export_note_title": "Nóta easpórtála", @@ -1483,7 +1480,6 @@ "config_title": "Cumraíocht Sioncrónaithe", "server_address": "Seoladh sampla an fhreastalaí", "timeout": "Am scoir sioncrónaithe", - "timeout_unit": "milleasoicindí", "proxy_label": "Sioncrónaigh freastalaí seachfhreastalaí (roghnach)", "note": "Nóta", "note_description": "Má fhágann tú an socrú seachfhreastalaí bán, úsáidfear seachfhreastalaí an chórais (baineann sé le tógáil deisce/leictreon amháin).", diff --git a/apps/client/src/translations/hi/translation.json b/apps/client/src/translations/hi/translation.json index deb3456638..a233ce587f 100644 --- a/apps/client/src/translations/hi/translation.json +++ b/apps/client/src/translations/hi/translation.json @@ -94,7 +94,6 @@ "if_you_dont_check": "अगर आप इसे चेक नहीं करते हैं, तो नोट केवल रिलेशन मैप से हटाया जाएगा।" }, "delete_notes": { - "delete_notes_preview": "नोट्स प्रिव्यू डिलीट करें", "close": "बंद करें", "delete_all_clones_description": "सभी क्लोन भी डिलीट करें (हाल के बदलावों में वापस ला सकते हैं)", "erase_notes_description": "सामान्य (सॉफ्ट) डिलीट करने पर नोट केवल 'डिलीटेड' मार्क होते हैं और उन्हें एक निश्चित समय के भीतर (हाल के बदलावों वाले डायलॉग में) वापस लाया जा सकता है। इस विकल्प को चुनने पर नोट तुरंत पूरी तरह मिटा दिए जाएंगे और उन्हें वापस लाना संभव नहीं होगा।", @@ -102,9 +101,7 @@ "notes_to_be_deleted": "निम्नलिखित नोट डिलीट कर दिए जाएंगे ({{notesCount}})", "no_note_to_delete": "कोई भी नोट डिलीट नहीं होगा (केवल क्लोन हटाए जाएंगे)।", "broken_relations_to_be_deleted": "निम्नलिखित रिलेशन टूट जाएंगे और डिलीट हो जाएंगे ({{relationCount}})", - "cancel": "रद्द करें", - "ok": "ठीक है", - "deleted_relation_text": "नोट {{- note}} (जिसे डिलीट किया जाना है) का संदर्भ {{- source}} से शुरू होने वाले रिलेशन {{- relation}} में दिया गया है।" + "cancel": "रद्द करें" }, "branch_prefix": { "edit_branch_prefix": "ब्रांच प्रीफ़िक्स एडिट करें", @@ -1467,7 +1464,6 @@ "config_title": "सिंक कॉन्फ़िगरेशन", "server_address": "सर्वर एड्रेस (Address)", "timeout": "सिंक समय-सीमा (Timeout)", - "timeout_unit": "मिलीसेकंड (milliseconds)", "proxy_label": "सिंक प्रॉक्सी सर्वर (वैकल्पिक)", "note": "नोट", "note_description": "अगर आप प्रॉक्सी खाली छोड़ते हैं, तो सिस्टम प्रॉक्सी का इस्तेमाल होगा।", diff --git a/apps/client/src/translations/id/translation.json b/apps/client/src/translations/id/translation.json index 68c60e7259..ad5cf53609 100644 --- a/apps/client/src/translations/id/translation.json +++ b/apps/client/src/translations/id/translation.json @@ -76,7 +76,6 @@ "confirmation": "Konfirmasi" }, "delete_notes": { - "delete_notes_preview": "Hapus pratinjau catatan", "close": "Tutup", "delete_all_clones_description": "Hapus seluruh duplikat (bisa dikembalikan di menu revisi)", "erase_notes_description": "Penghapusan normal hanya menandai catatan sebagai dihapus dan dapat dipulihkan (melalui dialog versi revisi) dalam jangka waktu tertentu. Mencentang opsi ini akan menghapus catatan secara permanen seketika dan catatan tidak akan bisa dipulihkan kembali.", @@ -84,9 +83,7 @@ "notes_to_be_deleted": "Catatan-catatan berikut akan dihapuskan ({{notesCount}})", "no_note_to_delete": "Tidak ada Catatan yang akan dihapus (hanya duplikat).", "broken_relations_to_be_deleted": "Hubungan berikut akan diputus dan dihapus ({{ relationCount}})", - "cancel": "Batalkan", - "ok": "Setuju", - "deleted_relation_text": "Catatan {{- note}} (yang akan dihapus) dirujuk oleh relasi {{- relation}} yang berasal dari {{- source}}." + "cancel": "Batalkan" }, "clone_to": { "clone_notes_to": "Duplikat catatan ke…", diff --git a/apps/client/src/translations/it/translation.json b/apps/client/src/translations/it/translation.json index ac3b423556..10a73ac589 100644 --- a/apps/client/src/translations/it/translation.json +++ b/apps/client/src/translations/it/translation.json @@ -88,17 +88,14 @@ "also_delete_note": "Rimuove anche la nota" }, "delete_notes": { - "ok": "OK", "close": "Chiudi", - "delete_notes_preview": "Anteprima di eliminazione delle note", "delete_all_clones_description": "Elimina anche tutti i cloni (può essere ripristinato nella sezione cambiamenti recenti)", "erase_notes_description": "L'eliminazione normale (soft) marca le note come eliminate e potranno essere recuperate entro un certo lasso di tempo (dalla finestra dei cambiamenti recenti). Selezionando questa opzione le note si elimineranno immediatamente e non sarà possibile recuperarle.", "erase_notes_warning": "Elimina le note in modo permanente (non potrà essere disfatto), compresi tutti i cloni. Ciò forzerà un nuovo caricamento dell'applicazione.", "cancel": "Annulla", "notes_to_be_deleted": "Le seguenti note saranno eliminate ({{notesCount}})", "no_note_to_delete": "Nessuna nota sarà eliminata (solo i cloni).", - "broken_relations_to_be_deleted": "Le seguenti relazioni saranno interrotte ed eliminate ({{relationCount}})", - "deleted_relation_text": "La nota {{- note}} (da eliminare) è referenziata dalla relazione {{- relation}} originata da {{- source}}." + "broken_relations_to_be_deleted": "Le seguenti relazioni saranno interrotte ed eliminate ({{relationCount}})" }, "info": { "okButton": "OK", @@ -497,7 +494,6 @@ "proxy_label": "Server Proxy per la sincronizzazione (opzionale)", "test_title": "Test di sincronizzazione", "timeout": "Timeout per la sincronizzazione", - "timeout_unit": "millisecondi", "save": "Salva", "help": "Aiuto", "server_address": "Indirizzo dell'istanza del server", diff --git a/apps/client/src/translations/ja/translation.json b/apps/client/src/translations/ja/translation.json index 33d3643f20..e808ec0118 100644 --- a/apps/client/src/translations/ja/translation.json +++ b/apps/client/src/translations/ja/translation.json @@ -111,11 +111,8 @@ "notes_to_be_deleted": "以下のノートが削除されます ({{notesCount}})", "no_note_to_delete": "ノートは削除されません(クローンのみ)。", "cancel": "キャンセル", - "ok": "OK", "close": "閉じる", - "delete_notes_preview": "ノートのプレビューを削除", - "broken_relations_to_be_deleted": "次のリレーション ({{relationCount}})は壊れているので消去されます", - "deleted_relation_text": "削除予定のノート{{- note}}は{{- source}}からリレーション{{- relation}}によって参照されています." + "broken_relations_to_be_deleted": "次のリレーション ({{relationCount}})は壊れているので消去されます" }, "calendar": { "mon": "月", @@ -576,7 +573,10 @@ "expand_first_level": "直下の子を展開", "expand_nth_level": "{{depth}} 階層下まで展開", "expand_all_levels": "すべての階層を展開", - "hide_child_notes": "ツリー内の子ノートを非表示" + "hide_child_notes": "ツリー内の子ノートを非表示", + "open_all_in_tabs": "すべて開く", + "open_all_in_tabs_tooltip": "すべての結果を新しいタブで開く", + "open_all_confirm": "{{count}} 件のノートが新しいタブで開かれます。続行しますか?" }, "note_types": { "geo-map": "ジオマップ", @@ -1001,7 +1001,8 @@ "date-and-time": "日時", "path": "パス", "database_backed_up_to": "データベースは{{backupFilePath}}にバックアップされました", - "no_backup_yet": "バックアップがありません" + "no_backup_yet": "バックアップがありません", + "download": "ダウンロード" }, "password": { "wiki": "wiki", @@ -1041,7 +1042,6 @@ "config_title": "同期設定", "server_address": "サーバーインスタンスのアドレス", "timeout": "同期タイムアウト", - "timeout_unit": "ミリ秒", "proxy_label": "同期プロキシサーバー(任意)", "note": "注", "note_description": "プロキシ設定を空白のままにすると、システムプロキシが使用されます(デスクトップ/electronビルドにのみ適用されます)。", @@ -1051,7 +1051,8 @@ "test_title": "同期のテスト", "test_description": "これは同期サーバとの接続とハンドシェイクをテストします。同期サーバーが初期化されていない場合、ローカルドキュメントと同期するように設定します。", "test_button": "同期試行", - "handshake_failed": "同期サーバーのハンドシェイクに失敗しました。エラー: {{message}}" + "handshake_failed": "同期サーバーのハンドシェイクに失敗しました。エラー: {{message}}", + "timeout_description": "同期接続が遅い場合に、接続を諦めるまでの待機時間。ネットワークが不安定な場合は、この時間を長く設定してください。" }, "api_log": { "close": "閉じる" @@ -1542,7 +1543,8 @@ "collapse": "通常サイズに折りたたむ", "title": "ノートマップ", "link-distance": "リンク距離", - "fix-nodes": "ノードを修正" + "fix-nodes": "ノードを修正", + "too-many-notes": "このサブツリーには {{count}} 件のノートが含まれており、ノートマップに表示できる {{max}} の上限を超えています。" }, "owned_attribute_list": { "owned_attributes": "所有属性" diff --git a/apps/client/src/translations/ko/translation.json b/apps/client/src/translations/ko/translation.json index b0991a87a7..dab39aeb85 100644 --- a/apps/client/src/translations/ko/translation.json +++ b/apps/client/src/translations/ko/translation.json @@ -100,9 +100,6 @@ "no_note_to_delete": "삭제되는 노트가 없습니다 (클론만 삭제됩니다).", "broken_relations_to_be_deleted": "다음 관계가 끊어지고 삭제됩니다({{ relationCount}})", "cancel": "취소", - "ok": "OK", - "deleted_relation_text": "삭제 예정인 노트 {{- note}} (은)는 {{- source}}에서 시작된 관계 {{- relation}}에 의해 참조되고 있습니다.", - "delete_notes_preview": "노트 미리보기 삭제", "close": "닫기", "delete_all_clones_description": "모든 복제본 삭제(최근 변경 사항에서 되돌릴 수 있습니다)" }, diff --git a/apps/client/src/translations/nb-NO/translation.json b/apps/client/src/translations/nb-NO/translation.json index ee36c293fb..9db2e0a1c0 100644 --- a/apps/client/src/translations/nb-NO/translation.json +++ b/apps/client/src/translations/nb-NO/translation.json @@ -39,8 +39,7 @@ }, "delete_notes": { "close": "Lukk", - "cancel": "Avbryt", - "ok": "OK" + "cancel": "Avbryt" }, "export": { "close": "Lukk", diff --git a/apps/client/src/translations/pl/translation.json b/apps/client/src/translations/pl/translation.json index 2cf8aa62f4..a83b7ae69b 100644 --- a/apps/client/src/translations/pl/translation.json +++ b/apps/client/src/translations/pl/translation.json @@ -78,15 +78,12 @@ "delete_notes": { "cancel": "Anuluj", "close": "Zamknij", - "delete_notes_preview": "Podgląd usuwania notatek", "delete_all_clones_description": "Usuń również wszystkie klony (można cofnąć w oknie Ostatnie zmiany)", "erase_notes_description": "Normalne (miękkie) usuwanie jedynie oznacza notatki jako usunięte i można je przywrócić (w oknie Ostatnie zmiany) przez pewien czas. Zaznaczenie tej opcji spowoduje natychmiastowe wymazanie notatek i nie będzie możliwe ich przywrócenie.", "erase_notes_warning": "Wymaż notatki trwale (nie można cofnąć), w tym wszystkie klony. Wymusi to przeładowanie aplikacji.", "notes_to_be_deleted": "Następujące notatki zostaną usunięte ({{notesCount}})", "no_note_to_delete": "Żadna notatka nie zostanie usunięta (tylko klony).", - "broken_relations_to_be_deleted": "Następujące relacje zostaną zerwane i usunięte ({{ relationCount}})", - "ok": "OK", - "deleted_relation_text": "Notatka {{- note}} (do usunięcia) jest powiązana relacją {{- relation}} pochodzącą z {{- source}}." + "broken_relations_to_be_deleted": "Następujące relacje zostaną zerwane i usunięte ({{ relationCount}})" }, "export": { "close": "Zamknij", @@ -1671,7 +1668,6 @@ "config_title": "Konfiguracja synchronizacji", "server_address": "Adres instancji serwera", "timeout": "Limit czasu synchronizacji", - "timeout_unit": "milisekund", "proxy_label": "Serwer proxy synchronizacji (opcjonalnie)", "note": "Uwaga", "note_description": "Jeśli pozostawisz ustawienie proxy puste, zostanie użyte proxy systemowe (dotyczy tylko wersji desktop/electron).", diff --git a/apps/client/src/translations/pt/translation.json b/apps/client/src/translations/pt/translation.json index 095e38c257..1219523ce8 100644 --- a/apps/client/src/translations/pt/translation.json +++ b/apps/client/src/translations/pt/translation.json @@ -88,7 +88,6 @@ "also_delete_note": "Também apagar a nota" }, "delete_notes": { - "delete_notes_preview": "Apagar pré-visualização de notas", "close": "Fechar", "delete_all_clones_description": "Apagar também todos os clones (pode ser desfeito em alterações recentes)", "erase_notes_description": "Apagar normal (suave) apenas marca as notas como apagadas, permitindo que sejam recuperadas (no diálogo de alterações recentes) num período. Se esta opção for marcada, as notas serão apagadas imediatamente e não será possível restaurá-las.", @@ -96,9 +95,7 @@ "notes_to_be_deleted": "As seguintes notas serão apagadas ({{notesCount}})", "no_note_to_delete": "Nenhuma nota será apagada (apenas os clones).", "broken_relations_to_be_deleted": "As seguintes relações serão quebradas e apagadas ({{ relationCount}})", - "cancel": "Cancelar", - "ok": "OK", - "deleted_relation_text": "A nota {{- note}} (a ser apagada) está referenciada pela relação {{- relation}} originada de {{- source}}." + "cancel": "Cancelar" }, "export": { "export_note_title": "Exportar nota", @@ -1441,7 +1438,6 @@ "config_title": "Configuração da Sincronização", "server_address": "Endereço da instância do Servidor", "timeout": "Tempo limite da sincronização", - "timeout_unit": "milisegundos", "proxy_label": "Servidor proxy para sincronização (opcional)", "note": "Nota", "note_description": "Se deixar a configuração de proxy em branco, o proxy do sistema será usado (aplica-se apenas à versão desktop/Electron).", diff --git a/apps/client/src/translations/pt_br/translation.json b/apps/client/src/translations/pt_br/translation.json index bd7183f2f7..fbb7f29d81 100644 --- a/apps/client/src/translations/pt_br/translation.json +++ b/apps/client/src/translations/pt_br/translation.json @@ -94,7 +94,6 @@ "also_delete_note": "Também excluir a nota" }, "delete_notes": { - "delete_notes_preview": "Excluir pré-visualização de notas", "close": "Fechar", "delete_all_clones_description": "Excluir também todos os clones (pode ser desfeito em alterações recentes)", "erase_notes_description": "A exclusão normal (suave) apenas marca as notas como excluídas, permitindo que sejam recuperadas (no diálogo de alterações recentes) dentro de um período de tempo. Se esta opção for marcada, as notas serão apagadas imediatamente e não será possível restaurá-las.", @@ -102,9 +101,7 @@ "notes_to_be_deleted": "As seguintes notas serão excluídas ({{notesCount}})", "no_note_to_delete": "Nenhuma nota será excluída (apenas os clones).", "broken_relations_to_be_deleted": "As seguintes relações serão quebradas e excluídas ({{ relationCount}})", - "cancel": "Cancelar", - "ok": "OK", - "deleted_relation_text": "A nota {{- note}} (a ser excluída) está referenciada pela relação {{- relation}} originada de {{- source}}." + "cancel": "Cancelar" }, "export": { "export_note_title": "Exportar nota", @@ -1950,7 +1947,6 @@ "config_title": "Configuração da Sincronização", "server_address": "Endereço da instância do Servidor", "timeout": "Tempo limite da sincronização", - "timeout_unit": "milisegundos", "proxy_label": "Servidor proxy para sincronização (opcional)", "note": "Nota", "note_description": "Se você deixar a configuração de proxy em branco, o proxy do sistema será usado (aplica-se apenas à versão desktop/Electron).", diff --git a/apps/client/src/translations/ro/translation.json b/apps/client/src/translations/ro/translation.json index 77d5606c9f..5a2a13f63f 100644 --- a/apps/client/src/translations/ro/translation.json +++ b/apps/client/src/translations/ro/translation.json @@ -459,13 +459,10 @@ "broken_relations_to_be_deleted": "Următoarele relații vor fi întrerupte și șterse ({{ relationCount}})", "cancel": "Anulează", "delete_all_clones_description": "Șterge și toate clonele (se pot recupera în ecranul Schimbări recente)", - "delete_notes_preview": "Previzualizare ștergerea notițelor", "erase_notes_description": "Ștergerea obișnuită doar marchează notițele ca fiind șterse și pot fi recuperate (în ecranul Schimbări recente) pentru o perioadă de timp. Dacă se bifează această opțiune, notițele vor fi șterse imediat fără posibilitatea de a le recupera.", "erase_notes_warning": "Șterge notițele permanent (nu se mai pot recupera), incluzând toate clonele. Va forța reîncărcarea aplicației.", "no_note_to_delete": "Nicio notiță nu va fi ștearsă (doar clonele).", "notes_to_be_deleted": "Următoarele notițe vor fi șterse ({{notesCount}})", - "ok": "OK", - "deleted_relation_text": "Notița {{- note}} ce va fi ștearsă este referențiată de relația {{- relation}}, originând din {{- source}}.", "close": "Închide" }, "delete_relation": { @@ -1266,8 +1263,7 @@ "test_button": "Probează sincronizarea", "test_description": "Această opțiune va testa conexiunea și comunicarea cu serverul de sincronizare. Dacă serverul de sincronizare nu este inițializat, acest lucru va rula și o sincronizare cu documentul local.", "test_title": "Probează sincronizarea", - "timeout": "Timp limită de sincronizare", - "timeout_unit": "milisecunde" + "timeout": "Timp limită de sincronizare" }, "table_of_contents": { "description": "Cuprinsul va apărea în notițele de tip text atunci când notița are un număr de titluri mai mare decât cel definit. Acest număr se poate personaliza:", diff --git a/apps/client/src/translations/ru/translation.json b/apps/client/src/translations/ru/translation.json index 780e5cfcef..093b5b718b 100644 --- a/apps/client/src/translations/ru/translation.json +++ b/apps/client/src/translations/ru/translation.json @@ -83,10 +83,7 @@ "notes_to_be_deleted": "Следующие заметки будут удалены ({{notesCount}})", "no_note_to_delete": "Заметка не будет удалена (только клоны).", "broken_relations_to_be_deleted": "Следующие отношения будут разорваны и удалены ({{relationCount}})", - "cancel": "Отмена", - "ok": "ОК", - "deleted_relation_text": "Примечание {{- note}} (подлежит удалению) ссылается на отношение {{- relation}}, происходящее из {{- source}}.", - "delete_notes_preview": "Предпросмотр удаляемых заметок" + "cancel": "Отмена" }, "database_anonymization": { "light_anonymization_description": "Это действие создаст новую копию базы данных и выполнит её лёгкую анонимизацию — в частности, будет удалён только контент всех заметок, но заголовки и атрибуты останутся. Кроме того, будут сохранены пользовательские заметки, содержащие JavaScript-скрипты frontend/backend и пользовательские виджеты. Это даёт больше контекста для отладки проблем.", @@ -1419,7 +1416,6 @@ "no_results": "Не найдено ярлыков, соответствующих '{{filter}}'" }, "sync_2": { - "timeout_unit": "миллисекунд", "note": "Заметка", "save": "Сохранить", "help": "Помощь", diff --git a/apps/client/src/translations/sr/translation.json b/apps/client/src/translations/sr/translation.json index d585852e2f..cf3f0d8681 100644 --- a/apps/client/src/translations/sr/translation.json +++ b/apps/client/src/translations/sr/translation.json @@ -76,7 +76,6 @@ "also_delete_note": "Takođe obriši belešku" }, "delete_notes": { - "delete_notes_preview": "Obriši pregled beleške", "close": "Zatvori", "delete_all_clones_description": "Obriši i sve klonove (može biti poništeno u skorašnjim izmenama)", "erase_notes_description": "Normalno (blago) brisanje samo označava beleške kao obrisane i one mogu biti vraćene (u dijalogu skorašnjih izmena) u određenom vremenskom periodu. Biranje ove opcije će momentalno obrisati beleške i ove beleške neće biti moguće vratiti.", @@ -84,9 +83,7 @@ "notes_to_be_deleted": "Sledeće beleške će biti obrisane ({{- noteCount}})", "no_note_to_delete": "Nijedna beleška neće biti obrisana (samo klonovi).", "broken_relations_to_be_deleted": "Sledeći odnosi će biti prekinuti i obrisani ({{- relationCount}})", - "cancel": "Otkaži", - "ok": "U redu", - "deleted_relation_text": "Beleška {{- note}} (za brisanje) je referencirana sa odnosom {{- relation}} koji potiče iz {{- source}}." + "cancel": "Otkaži" }, "export": { "export_note_title": "Izvezi belešku", diff --git a/apps/client/src/translations/tr/translation.json b/apps/client/src/translations/tr/translation.json index 4e658efe10..1c0198d3c0 100644 --- a/apps/client/src/translations/tr/translation.json +++ b/apps/client/src/translations/tr/translation.json @@ -21,16 +21,13 @@ }, "delete_notes": { "close": "Kapat", - "delete_notes_preview": "Not önizlemesini sil", "delete_all_clones_description": "Tüm klonları da sil (son değişikliklerden geri alınabilir)", "erase_notes_description": "Normal (yazılımsal) silme işlemi, notları yalnızca silinmiş olarak işaretler ve belirli bir süre içinde (son değişiklikler iletişim kutusunda) geri alınabilir. Bu seçeneği işaretlemek, notları hemen siler ve notların geri alınması mümkün olmaz.", "erase_notes_warning": "Notları, tüm kopyaları da dahil olmak üzere kalıcı olarak silin (geri alınamaz). Bu işlem, uygulamanın yeniden yüklenmesine neden olacaktır.", "notes_to_be_deleted": "Aşağıdaki notlar silinecektir. ({{notesCount}})", "no_note_to_delete": "Hiçbir not silinmeyecek (sadece kopyaları silinecek).", "broken_relations_to_be_deleted": "Aşağıdaki ilişkiler koparılacak ve silinecektir ({{ relationCount}})", - "cancel": "İptal", - "ok": "Tamam", - "deleted_relation_text": "{{- note}} (silinecek) notu, {{- source}} kaynağından kaynaklanan {{- relation}} ilişkisi tarafından referans alınmaktadır." + "cancel": "İptal" }, "export": { "close": "Kapat", diff --git a/apps/client/src/translations/tw/translation.json b/apps/client/src/translations/tw/translation.json index 33076b3332..a8af023d71 100644 --- a/apps/client/src/translations/tw/translation.json +++ b/apps/client/src/translations/tw/translation.json @@ -88,7 +88,6 @@ "also_delete_note": "同時刪除筆記" }, "delete_notes": { - "delete_notes_preview": "刪除筆記預覽", "delete_all_clones_description": "同時刪除所有克隆(可以在最近修改中撤消)", "erase_notes_description": "通常(軟)刪除僅標記筆記為已刪除,可以在一段時間內透過最近修改對話方塊撤消。勾選此選項將立即擦除筆記,無法撤銷。", "erase_notes_warning": "永久擦除筆記(無法撤銷),包括所有克隆。這將強制應用程式重新載入。", @@ -96,8 +95,6 @@ "no_note_to_delete": "沒有筆記將被刪除(僅克隆)。", "broken_relations_to_be_deleted": "將刪除以下關聯並斷開連接 ({{ relationCount}})", "cancel": "取消", - "ok": "確定", - "deleted_relation_text": "筆記 {{- note}}(將被刪除的筆記)被以下關聯 {{- relation}} 引用,來自 {{- source}}。", "close": "關閉" }, "export": { @@ -803,7 +800,10 @@ "expand_first_level": "展開直接子級", "expand_nth_level": "展開 {{depth}} 層", "expand_all_levels": "展開所有層級", - "hide_child_notes": "隱藏樹中的子筆記" + "hide_child_notes": "隱藏樹中的子筆記", + "open_all_in_tabs": "全部打開", + "open_all_in_tabs_tooltip": "在新分頁中開啟所有結果", + "open_all_confirm": "這將在新分頁中開啟 {{count}} 則筆記。要繼續嗎?" }, "edited_notes": { "no_edited_notes_found": "今天還沒有編輯過的筆記...", @@ -857,7 +857,8 @@ "collapse": "收摺到正常大小", "title": "筆記地圖", "fix-nodes": "固定節點", - "link-distance": "連結距離" + "link-distance": "連結距離", + "too-many-notes": "此子樹包含 {{count}} 則筆記,已超過筆記地圖中可顯示的 {{max}} 則上限。" }, "note_paths": { "title": "筆記路徑", @@ -1062,7 +1063,8 @@ "note_already_in_diagram": "筆記 \"{{title}}\" 已經在圖中。", "enter_title_of_new_note": "輸入新筆記的標題", "default_new_note_title": "新筆記", - "click_on_canvas_to_place_new_note": "點擊畫布以放置新筆記" + "click_on_canvas_to_place_new_note": "點擊畫布以放置新筆記", + "rename_relation": "重新命名關聯" }, "backend_log": { "refresh": "重新整理" @@ -1331,7 +1333,8 @@ "date-and-time": "日期和時間", "path": "路徑", "database_backed_up_to": "資料庫已備份至 {{backupFilePath}}", - "no_backup_yet": "尚無備份" + "no_backup_yet": "尚無備份", + "download": "下載" }, "etapi": { "title": "ETAPI", @@ -1396,9 +1399,15 @@ "spellcheck": { "title": "拼寫檢查", "description": "這些選項僅適用於桌面版,瀏覽器將使用其原生的拼寫檢查功能。", - "enable": "啟用拼寫檢查", - "language_code_label": "語言代碼", - "restart-required": "拼寫檢查選項的更改將在應用重啟後生效。" + "enable": "拼寫檢查", + "language_code_label": "拼寫檢查語言", + "restart-required": "拼寫檢查選項的更改將在應用重啟後生效。", + "custom_dictionary_title": "自訂字典", + "custom_dictionary_description": "新增至字典的詞彙會同步至您所有的裝置。", + "custom_dictionary_edit": "自訂詞彙", + "custom_dictionary_edit_description": "編輯拼寫檢查器不應標記的詞彙清單。變更將於重新啟動後生效。", + "custom_dictionary_open": "編輯字典", + "related_description": "設定拼寫檢查語言及自訂字典。" }, "sync_2": { "config_title": "同步設定", @@ -1414,7 +1423,7 @@ "test_description": "測試和同步伺服器之間的連接。如果同步伺服器沒有初始化,這會將本地文件同步至同步伺服器上。", "test_button": "測試同步", "handshake_failed": "同步伺服器握手失敗,錯誤:{{message}}", - "timeout_unit": "毫秒" + "timeout_description": "在放棄慢速同步連線前應等待多久。若網路不穩定,請延長等待時間。" }, "api_log": { "close": "關閉" @@ -2285,7 +2294,7 @@ "ocr": { "processing_complete": "OCR 處理已完成。", "processing_failed": "無法啟動 OCR 處理", - "text_filtered_low_confidence": "OCR 偵測到的信賴度為 {{confidence}}%,但因您的最低閾值設定為 {{threshold}}%,故該結果已被捨棄。", + "text_filtered_low_confidence": "OCR 偵測到的文字信賴度為 {{confidence}}%,但因您的最低閾值設定為 {{threshold}}%,故該結果已被捨棄。", "open_media_settings": "開啟設定", "view_extracted_text": "檢視擷取的文字 (OCR)", "extracted_text": "已擷取的文字 (OCR)", diff --git a/apps/client/src/translations/uk/translation.json b/apps/client/src/translations/uk/translation.json index 252100847a..d1d851e2fd 100644 --- a/apps/client/src/translations/uk/translation.json +++ b/apps/client/src/translations/uk/translation.json @@ -186,7 +186,6 @@ "also_delete_note": "Також видалити нотатку" }, "delete_notes": { - "delete_notes_preview": "Видалити попередній перегляд нотаток", "close": "Закрити", "delete_all_clones_description": "Видалити також усі клони (можна скасувати в останніх змінах)", "erase_notes_description": "Звичайне (м’яке) видалення лише позначає нотатки як видалені і їх можна відновити (у діалоговому вікні останніх змін) протягом певного періоду часу. Якщо позначити цю опцію, нотатки будуть видалені негайно і їх неможливо буде відновити.", @@ -194,9 +193,7 @@ "notes_to_be_deleted": "Наступні нотатки будуть видалені ({{notesCount}})", "no_note_to_delete": "Жодну нотатку не буде видалено (лише клони).", "broken_relations_to_be_deleted": "Наступні зв'язки будуть розірвані та видалені ({{ relationCount}})", - "cancel": "Скасувати", - "ok": "ОК", - "deleted_relation_text": "Нотатка {{- note}} (буде видалена) посилається на зв'язок {{- relation}}, що походить з {{- source}}." + "cancel": "Скасувати" }, "export": { "export_note_title": "Експорт нотатки", @@ -1750,7 +1747,6 @@ "config_title": "Конфігурація синхронізації", "server_address": "Адреса екземпляра сервера", "timeout": "Тайм-аут синхронізації", - "timeout_unit": "мілісекунди", "proxy_label": "Синхронізація проксі-сервера (необов'язково)", "note": "Нотатка", "note_description": "Якщо залишити налаштування проксі-сервера порожнім, буде використано системний проксі-сервер (стосується лише збірки для ПК/електронної версії).", diff --git a/apps/client/src/translations/vi/translation.json b/apps/client/src/translations/vi/translation.json index 022262c9f1..76b4418204 100644 --- a/apps/client/src/translations/vi/translation.json +++ b/apps/client/src/translations/vi/translation.json @@ -27,7 +27,6 @@ }, "delete_notes": { "close": "Đóng", - "ok": "OK", "cancel": "Huỷ" }, "export": { diff --git a/apps/client/src/widgets/attribute_widgets/UserAttributesList.tsx b/apps/client/src/widgets/attribute_widgets/UserAttributesList.tsx index a95887b7af..82f5380aad 100644 --- a/apps/client/src/widgets/attribute_widgets/UserAttributesList.tsx +++ b/apps/client/src/widgets/attribute_widgets/UserAttributesList.tsx @@ -89,7 +89,7 @@ function buildUserAttribute(attr: AttributeWithDefinitions): ComponentChildren { content = <>{" "}{attr.friendlyName}; break; case "url": - content = {attr.friendlyName}; + content = e.stopPropagation()}>{attr.friendlyName}; break; case "color": style = { backgroundColor: value, color: getReadableTextColor(value) }; diff --git a/apps/client/src/widgets/collections/NoteList.tsx b/apps/client/src/widgets/collections/NoteList.tsx index 0c37c4a08a..038d90a052 100644 --- a/apps/client/src/widgets/collections/NoteList.tsx +++ b/apps/client/src/widgets/collections/NoteList.tsx @@ -180,11 +180,13 @@ export function useNoteIds(note: FNote | null | undefined, viewType: ViewTypeOpt // Refresh on alterations to the note subtree. useTriliumEvent("entitiesReloaded", ({ loadResults }) => { - if (note && loadResults.getBranchRows().some(branch => - branch.parentNoteId === note.noteId - || noteIds.includes(branch.parentNoteId ?? "")) + if (note && ( + loadResults.getNoteReorderings().includes(note.noteId) + || loadResults.getBranchRows().some(branch => + branch.parentNoteId === note.noteId + || noteIds.includes(branch.parentNoteId ?? "")) || loadResults.getAttributeRows().some(attr => attr.name === "archived" && attr.noteId && noteIds.includes(attr.noteId)) - ) { + )) { refreshNoteIds(); } }); diff --git a/apps/client/src/widgets/collections/board/data.spec.ts b/apps/client/src/widgets/collections/board/data.spec.ts index 9f7bb01ed3..d5f05ce2d7 100644 --- a/apps/client/src/widgets/collections/board/data.spec.ts +++ b/apps/client/src/widgets/collections/board/data.spec.ts @@ -27,7 +27,7 @@ describe("Board data", () => { froca.branches["note1_note2"] = branch; froca.getNoteFromCache("note1")!.addChild("note2", "note1_note2", false); const data = await getBoardData(parentNote, "status", {}, false); - const noteIds = Array.from(data.byColumn.values()).flat().map(item => item.note.noteId); + const noteIds = [...data.byColumn.values()].flat().map(item => item.note.noteId); expect(noteIds.length).toBe(3); }); }); diff --git a/apps/client/src/widgets/collections/calendar/event_builder.ts b/apps/client/src/widgets/collections/calendar/event_builder.ts index dec64feee8..fd0ce3bbb2 100644 --- a/apps/client/src/widgets/collections/calendar/event_builder.ts +++ b/apps/client/src/widgets/collections/calendar/event_builder.ts @@ -75,7 +75,7 @@ export async function buildEventsForCalendar(note: FNote, e: EventSourceFuncArg) if (dateNote.hasChildren()) { - const childNoteIds = await dateNote.getSubtreeNoteIds(); + const childNoteIds = dateNote.getChildNoteIds(); for (const childNoteId of childNoteIds) { childNoteToDateMapping[childNoteId] = startDate; } diff --git a/apps/client/src/widgets/collections/calendar/index.tsx b/apps/client/src/widgets/collections/calendar/index.tsx index 4bde4b6350..4594d64564 100644 --- a/apps/client/src/widgets/collections/calendar/index.tsx +++ b/apps/client/src/widgets/collections/calendar/index.tsx @@ -144,7 +144,12 @@ export default function CalendarView({ note, noteIds }: ViewModeProps { + // Only process actual date/time changes, not other property changes (e.g., title via setProp). + const datesChanged = e.oldEvent.start?.getTime() !== e.event.start?.getTime() + || e.oldEvent.end?.getTime() !== e.event.end?.getTime() + || e.oldEvent.allDay !== e.event.allDay; + if (!datesChanged) return; + const { startDate, endDate } = parseStartEndDateFromEvent(e.event); if (!startDate) return; diff --git a/apps/client/src/widgets/collections/table/row_editing.ts b/apps/client/src/widgets/collections/table/row_editing.ts index c4df69e7ae..03f6b8ff49 100644 --- a/apps/client/src/widgets/collections/table/row_editing.ts +++ b/apps/client/src/widgets/collections/table/row_editing.ts @@ -51,6 +51,8 @@ export default function useRowTableEditing(api: RefObject, attributeD if (type === "labels") { if (typeof newValue === "boolean") { newValue = newValue ? "true" : "false"; + } else if (typeof newValue === "number") { + newValue = String(newValue); } setLabel(noteId, name, newValue); } else if (type === "relations") { diff --git a/apps/client/src/widgets/dialogs/delete_notes.css b/apps/client/src/widgets/dialogs/delete_notes.css new file mode 100644 index 0000000000..864fcc2e0c --- /dev/null +++ b/apps/client/src/widgets/dialogs/delete_notes.css @@ -0,0 +1,30 @@ +.delete-notes-dialog .tn-card { + margin-bottom: 16px; +} + +.delete-notes-dialog .tn-card:last-child { + margin-bottom: 0; +} + +.delete-notes-dialog .preview-list { + margin: 0; + padding: 0; + list-style: none; + max-height: 200px; + overflow: auto; +} + +.delete-notes-dialog .preview-list li { + padding: 6px 16px; + border-bottom: 1px solid var(--main-border-color); +} + +.delete-notes-dialog .preview-list li:last-child { + border-bottom: none; +} + +.delete-notes-dialog .preview-list small { + margin-inline-start: 8px; + font-size: 0.8em; + color: var(--muted-text-color); +} diff --git a/apps/client/src/widgets/dialogs/delete_notes.tsx b/apps/client/src/widgets/dialogs/delete_notes.tsx index c58d440b72..2a5cb0c0b5 100644 --- a/apps/client/src/widgets/dialogs/delete_notes.tsx +++ b/apps/client/src/widgets/dialogs/delete_notes.tsx @@ -1,15 +1,22 @@ -import { useRef, useState, useEffect } from "preact/hooks"; -import { t } from "../../services/i18n.js"; -import FormCheckbox from "../react/FormCheckbox.js"; -import Modal from "../react/Modal.js"; +import "./delete_notes.css"; + import type { DeleteNotesPreview } from "@triliumnext/commons"; -import server from "../../services/server.js"; +import { useEffect, useRef, useState } from "preact/hooks"; + import froca from "../../services/froca.js"; -import FNote from "../../entities/fnote.js"; -import link from "../../services/link.js"; +import { t } from "../../services/i18n.js"; +import server from "../../services/server.js"; import Button from "../react/Button.jsx"; -import Alert from "../react/Alert.jsx"; +import { Card, CardSection } from "../react/Card.js"; +import FormToggle from "../react/FormToggle.js"; import { useTriliumEvent } from "../react/hooks.jsx"; +import Modal from "../react/Modal.js"; +import NoteLink from "../react/NoteLink.js"; +import OptionsRow from "../type_widgets/options/components/OptionsRow.js"; + +interface CloneInfo { + totalCloneCount: number; +} export interface ResolveOptions { proceed: boolean; @@ -24,9 +31,9 @@ interface ShowDeleteNotesDialogOpts { } interface BrokenRelationData { - note: string; - relation: string; - source: string; + noteId: string; + relationName: string; + sourceNoteId: string; } export default function DeleteNotesDialog() { @@ -34,20 +41,51 @@ export default function DeleteNotesDialog() { const [ deleteAllClones, setDeleteAllClones ] = useState(false); const [ eraseNotes, setEraseNotes ] = useState(!!opts.forceDeleteAllClones); const [ brokenRelations, setBrokenRelations ] = useState([]); - const [ noteIdsToBeDeleted, setNoteIdsToBeDeleted ] = useState([]); + const [ noteIdsToBeDeleted, setNoteIdsToBeDeleted ] = useState([]); const [ shown, setShown ] = useState(false); + const [ cloneInfo, setCloneInfo ] = useState({ totalCloneCount: 0 }); const okButtonRef = useRef(null); useTriliumEvent("showDeleteNotesDialog", (opts) => { setOpts(opts); + setDeleteAllClones(false); + setEraseNotes(!!opts.forceDeleteAllClones); setShown(true); - }) + }); + + // Calculate clone information when branches change + useEffect(() => { + const { branchIdsToDelete } = opts; + if (!branchIdsToDelete || branchIdsToDelete.length === 0) { + setCloneInfo({ totalCloneCount: 0 }); + return; + } + + async function calculateCloneInfo() { + const branches = froca.getBranches(branchIdsToDelete!, true); + const uniqueNoteIds = [...new Set(branches.map(b => b.noteId))]; + const notes = await froca.getNotes(uniqueNoteIds); + + let totalCloneCount = 0; + + for (const note of notes) { + const parentBranches = note.getParentBranches(); + // Clones are additional parent branches beyond the one being deleted + const otherBranches = parentBranches.filter(b => !branchIdsToDelete!.includes(b.branchId)); + totalCloneCount += otherBranches.length; + } + + setCloneInfo({ totalCloneCount }); + } + + calculateCloneInfo(); + }, [opts.branchIdsToDelete]); useEffect(() => { const { branchIdsToDelete, forceDeleteAllClones } = opts; if (!branchIdsToDelete || branchIdsToDelete.length === 0) { return; - } + } server.post("delete-notes-preview", { branchIdsToDelete, @@ -63,16 +101,16 @@ export default function DeleteNotesDialog() { className="delete-notes-dialog" size="xl" scrollable - title={t("delete_notes.delete_notes_preview")} + title={t("delete_notes.title")} onShown={() => okButtonRef.current?.focus()} onHidden={() => { - opts.callback?.({ proceed: false }) + opts.callback?.({ proceed: false }); setShown(false); }} footer={<>
); } +function OpenAllButton({ note, isOpening, setIsOpening }: { + note: FNote; + isOpening: boolean; + setIsOpening: (value: boolean) => void; +}) { + const noteIds = note.getChildNoteIds(); + const count = noteIds.length; + + const handleOpenAll = async () => { + if (count === 0) return; + + if (count > MAX_OPEN_TABS) { + await dialogService.info(t("book_properties.open_all_too_many", { count, max: MAX_OPEN_TABS })); + return; + } + + if (count > 10) { + const confirmed = await dialogService.confirm(t("book_properties.open_all_confirm", { count })); + if (!confirmed) return; + } + + setIsOpening(true); + try { + for (let i = 0; i < noteIds.length; i++) { + const noteId = noteIds[i]; + const isLast = i === noteIds.length - 1; + await appContext.tabManager.openTabWithNoteWithHoisting(noteId, { + activate: isLast + }); + } + } finally { + setIsOpening(false); + } + }; + + return ( + + ); +} + function ViewTypeSwitcher({ viewType, setViewType }: { viewType: ViewTypeOptions, setViewType: (newValue: ViewTypeOptions) => void }) { // Keyboard shortcut const dropdownContainerRef = useRef(null); diff --git a/apps/client/src/widgets/note_icon.tsx b/apps/client/src/widgets/note_icon.tsx index 31ca7e65b4..c6ed7e618b 100644 --- a/apps/client/src/widgets/note_icon.tsx +++ b/apps/client/src/widgets/note_icon.tsx @@ -42,8 +42,11 @@ export default function NoteIcon() { setIcon(note?.getIcon()); }, [ note, iconClass, workspaceIconClass ]); + const isDisabled = viewScope?.viewMode !== "default" + || note?.isMetadataReadOnly; + if (isMobile()) { - return ; + return ; } return ( @@ -55,16 +58,17 @@ export default function NoteIcon() { dropdownOptions={{ autoClose: "outside" }} buttonClassName={`note-icon tn-focusable-button ${icon ?? "bx bx-empty"}`} hideToggleArrow - disabled={viewScope?.viewMode !== "default"} + disabled={isDisabled} > { note && dropdownRef?.current?.hide()} columnCount={12} /> } ); } -function MobileNoteIconSwitcher({ note, icon }: { +function MobileNoteIconSwitcher({ note, icon, disabled }: { note: FNote | null | undefined; icon: string | null | undefined; + disabled?: boolean; }) { const [ modalShown, setModalShown ] = useState(false); const { windowWidth } = useWindowSize(); @@ -76,6 +80,7 @@ function MobileNoteIconSwitcher({ note, icon }: { icon={icon ?? "bx bx-empty"} text={t("note_icon.change_note_icon")} onClick={() => setModalShown(true)} + disabled={disabled} /> {createPortal(( diff --git a/apps/client/src/widgets/note_map/NoteMap.css b/apps/client/src/widgets/note_map/NoteMap.css index fa49bb39c6..3188f09439 100644 --- a/apps/client/src/widgets/note_map/NoteMap.css +++ b/apps/client/src/widgets/note_map/NoteMap.css @@ -1,5 +1,5 @@ .note-detail-note-map { - height: 100%; + height: 100%; overflow: hidden; } @@ -54,4 +54,4 @@ width: 10px; } -/* End of styling the slider */ \ No newline at end of file +/* End of styling the slider */ diff --git a/apps/client/src/widgets/note_map/NoteMap.tsx b/apps/client/src/widgets/note_map/NoteMap.tsx index 2677e4aa59..a165d467bb 100644 --- a/apps/client/src/widgets/note_map/NoteMap.tsx +++ b/apps/client/src/widgets/note_map/NoteMap.tsx @@ -12,11 +12,15 @@ import { t } from "../../services/i18n"; import { getEffectiveThemeStyle } from "../../services/theme"; import ActionButton from "../react/ActionButton"; import { useElementSize, useNoteLabel } from "../react/hooks"; +import NoItems from "../react/NoItems"; import Slider from "../react/Slider"; import { loadNotesAndRelations, NoteMapLinkObject, NoteMapNodeObject, NotesAndRelationsData } from "./data"; import { CssData, setupRendering } from "./rendering"; import { MapType, NoteMapWidgetMode, rgb2hex } from "./utils"; +/** Maximum number of notes to render in the note map before showing a warning. */ +const MAX_NOTES_THRESHOLD = 1_000; + interface NoteMapProps { note: FNote; widgetMode: NoteMapWidgetMode; @@ -34,6 +38,7 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) { const containerSize = useElementSize(parentRef); const [ fixNodes, setFixNodes ] = useState(false); const [ linkDistance, setLinkDistance ] = useState(40); + const [ tooManyNotes, setTooManyNotes ] = useState(null); const notesAndRelationsRef = useRef(); const mapRootId = useMemo(() => { @@ -61,6 +66,14 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) { const includeRelations = labelValues("mapIncludeRelation"); loadNotesAndRelations(mapRootId, excludeRelations, includeRelations, mapType).then((notesAndRelations) => { if (!containerRef.current || !styleResolverRef.current) return; + + // Guard against rendering too many notes which would freeze the browser. + if (notesAndRelations.nodes.length > MAX_NOTES_THRESHOLD) { + setTooManyNotes(notesAndRelations.nodes.length); + return; + } + setTooManyNotes(null); + const cssData = getCssData(containerRef.current, styleResolverRef.current); // Configure rendering properties. @@ -119,6 +132,12 @@ export default function NoteMap({ note, widgetMode, parentRef }: NoteMapProps) { }); }, [ fixNodes, mapType ]); + if (tooManyNotes) { + return ( + + ); + } + return (
diff --git a/apps/client/src/widgets/note_title.tsx b/apps/client/src/widgets/note_title.tsx index f886d9f7db..34b27c9298 100644 --- a/apps/client/src/widgets/note_title.tsx +++ b/apps/client/src/widgets/note_title.tsx @@ -1,15 +1,16 @@ -import { useEffect, useRef, useState } from "preact/hooks"; -import { t } from "../services/i18n"; -import FormTextBox from "./react/FormTextBox"; -import { useNoteContext, useNoteProperty, useSpacedUpdate, useTriliumEvent, useTriliumEvents } from "./react/hooks"; -import protected_session_holder from "../services/protected_session_holder"; -import server from "../services/server"; import "./note_title.css"; -import { isLaunchBarConfig } from "../services/utils"; + +import clsx from "clsx"; +import { useEffect, useRef, useState } from "preact/hooks"; + import appContext from "../components/app_context"; import branches from "../services/branches"; +import { t } from "../services/i18n"; +import protected_session_holder from "../services/protected_session_holder"; +import server from "../services/server"; import { isIMEComposing } from "../services/shortcuts"; -import clsx from "clsx"; +import FormTextBox from "./react/FormTextBox"; +import { useNoteContext, useNoteProperty, useSpacedUpdate, useTriliumEvent, useTriliumEvents } from "./react/hooks"; export default function NoteTitleWidget(props: {className?: string}) { const { note, noteId, componentId, viewScope, noteContext, parentComponent } = useNoteContext(); @@ -25,8 +26,7 @@ export default function NoteTitleWidget(props: {className?: string}) { const isReadOnly = note === null || note === undefined || (note.isProtected && !protected_session_holder.isProtectedSessionAvailable()) - || isLaunchBarConfig(note.noteId) - || note.noteId.startsWith("_help_") + || note.isMetadataReadOnly || viewScope?.viewMode !== "default"; setReadOnly(isReadOnly); }, [ note, note?.noteId, note?.isProtected, viewScope?.viewMode ]); @@ -58,11 +58,29 @@ export default function NoteTitleWidget(props: {className?: string}) { // Manage focus. const textBoxRef = useRef(null); const isNewNote = useRef(); + const pendingSelect = useRef(false); + + // Re-apply selection when title changes if we have a pending select. + // This handles the case where the server sends back entity changes after we've + // already called select(), which causes the controlled input to re-render and lose selection. + useEffect(() => { + if (pendingSelect.current && textBoxRef.current && document.activeElement === textBoxRef.current) { + textBoxRef.current.select(); + pendingSelect.current = false; + } + }, [title]); + useTriliumEvents([ "focusOnTitle", "focusAndSelectTitle" ], (e, eventName) => { if (noteContext?.isActive() && textBoxRef.current) { + // In the new layout, there are two NoteTitleWidget instances. Only handle if visible. + if (!textBoxRef.current.checkVisibility({ checkOpacity: true })) { + return; + } + textBoxRef.current.focus(); if (eventName === "focusAndSelectTitle") { textBoxRef.current.select(); + pendingSelect.current = true; } isNewNote.current = ("isNewNote" in e ? e.isNewNote : false); } @@ -83,6 +101,9 @@ export default function NoteTitleWidget(props: {className?: string}) { spacedUpdate.scheduleUpdate(); }} onKeyDown={(e) => { + // User started typing, stop re-applying selection + pendingSelect.current = false; + // Skip processing if IME is composing to prevent interference // with text input in CJK languages if (isIMEComposing(e)) { @@ -101,6 +122,7 @@ export default function NoteTitleWidget(props: {className?: string}) { } }} onBlur={() => { + pendingSelect.current = false; spacedUpdate.updateNowIfNecessary(); isNewNote.current = false; }} diff --git a/apps/client/src/widgets/react/Card.css b/apps/client/src/widgets/react/Card.css index 0aecb56dbd..1e4075a7af 100644 --- a/apps/client/src/widgets/react/Card.css +++ b/apps/client/src/widgets/react/Card.css @@ -35,6 +35,14 @@ flex-direction: column; gap: var(--card-section-gap); + .tn-card-section.tn-no-padding { + padding: 0; + + & .table { + margin-bottom: 0; + } + } + .tn-card-section { &:first-of-type { border-top-left-radius: var(--card-border-radius); diff --git a/apps/client/src/widgets/react/Card.tsx b/apps/client/src/widgets/react/Card.tsx index 1abd259f0c..d16e1f83e4 100644 --- a/apps/client/src/widgets/react/Card.tsx +++ b/apps/client/src/widgets/react/Card.tsx @@ -50,6 +50,7 @@ export interface CardSectionProps { subSectionsVisible?: boolean; highlightOnHover?: boolean; onAction?: () => void; + noPadding?: boolean; } interface CardSectionContextType { @@ -65,7 +66,8 @@ export function CardSection(props: {children: ComponentChildren} & CardSectionPr return <>
0, - "tn-card-highlight-on-hover": props.highlightOnHover || props.onAction + "tn-card-highlight-on-hover": props.highlightOnHover || props.onAction, + "tn-no-padding": props.noPadding })} style={{"--tn-card-section-nesting-level": (nestingLevel) ? nestingLevel : null}} onClick={props.onAction}> diff --git a/apps/client/src/widgets/react/FormToggle.tsx b/apps/client/src/widgets/react/FormToggle.tsx index e08c1e3c2e..ac29f1fb7a 100644 --- a/apps/client/src/widgets/react/FormToggle.tsx +++ b/apps/client/src/widgets/react/FormToggle.tsx @@ -7,17 +7,22 @@ import { ComponentChildren } from "preact"; interface FormToggleProps { currentValue: boolean | null; onChange(newValue: boolean): void; - switchOnName: string; + /** Label shown when toggle is off. If omitted along with switchOffName, no label is shown. */ + switchOnName?: string; switchOnTooltip?: string; - switchOffName: string; + /** Label shown when toggle is on. If omitted along with switchOnName, no label is shown. */ + switchOffName?: string; switchOffTooltip?: string; helpPage?: string; disabled?: boolean; afterName?: ComponentChildren; + /** ID for the input element, useful for accessibility with external labels */ + id?: string; } -export default function FormToggle({ currentValue, helpPage, switchOnName, switchOnTooltip, switchOffName, switchOffTooltip, onChange, disabled, afterName }: FormToggleProps) { +export default function FormToggle({ currentValue, helpPage, switchOnName, switchOnTooltip, switchOffName, switchOffTooltip, onChange, disabled, afterName, id }: FormToggleProps) { const [ disableTransition, setDisableTransition ] = useState(true); + const hasLabel = switchOnName || switchOffName; useEffect(() => { const timeout = setTimeout(() => { @@ -28,7 +33,7 @@ export default function FormToggle({ currentValue, helpPage, switchOnName, switc return (
- { currentValue ? switchOffName : switchOnName } + {hasLabel && { currentValue ? switchOffName : switchOnName }} { afterName }
diff --git a/apps/client/src/widgets/type_widgets/llm_chat/useLlmChat.ts b/apps/client/src/widgets/type_widgets/llm_chat/useLlmChat.ts index 63cbf4bbf4..f52fb6cc61 100644 --- a/apps/client/src/widgets/type_widgets/llm_chat/useLlmChat.ts +++ b/apps/client/src/widgets/type_widgets/llm_chat/useLlmChat.ts @@ -62,6 +62,8 @@ export interface UseLlmChatReturn { clearMessages: () => void; /** Refresh the provider/models list */ refreshModels: () => void; + /** Stop the current generation */ + stopStreaming: () => void; } export function useLlmChat( @@ -89,6 +91,7 @@ export function useLlmChat( const [isCheckingProvider, setIsCheckingProvider] = useState(true); const messagesEndRef = useRef(null); const textareaRef = useRef(null); + const abortControllerRef = useRef(null); // Refs to get fresh values in getContent (avoids stale closures) const messagesRef = useRef(messages); @@ -251,6 +254,56 @@ export function useLlmChat( streamOptions.enableExtendedThinking = enableExtendedThinking; } + const abortController = new AbortController(); + abortControllerRef.current = abortController; + + /** Shared cleanup: finalize collected content and reset streaming state. */ + function finalizeStream() { + // Mark any in-progress tool calls as stopped so they don't show infinite spinners + for (const [i, block] of contentBlocks.entries()) { + if (block.type === "tool_call" && !block.toolCall.result) { + contentBlocks[i] = { + type: "tool_call", + toolCall: { ...block.toolCall, result: "[Stopped]", isError: true } + }; + } + } + + const finalNewMessages: StoredMessage[] = []; + + if (thinkingContent) { + finalNewMessages.push({ + id: randomString(), + role: "assistant", + content: thinkingContent, + createdAt: new Date().toISOString(), + type: "thinking" + }); + } + + if (contentBlocks.length > 0) { + finalNewMessages.push({ + id: randomString(), + role: "assistant", + content: contentBlocks, + createdAt: new Date().toISOString(), + citations: citations.length > 0 ? citations : undefined, + usage + }); + } + + if (finalNewMessages.length > 0) { + setMessages([...newMessages, ...finalNewMessages]); + } + + setStreamingContent(""); + setStreamingBlocks([]); + setStreamingThinking(""); + setPendingCitations([]); + setIsStreaming(false); + abortControllerRef.current = null; + } + await streamChatCompletion( apiMessages, streamOptions, @@ -320,42 +373,19 @@ export function useLlmChat( setIsStreaming(false); }, onDone: () => { - const finalNewMessages: StoredMessage[] = []; - - if (thinkingContent) { - finalNewMessages.push({ - id: randomString(), - role: "assistant", - content: thinkingContent, - createdAt: new Date().toISOString(), - type: "thinking" - }); - } - - if (contentBlocks.length > 0) { - finalNewMessages.push({ - id: randomString(), - role: "assistant", - content: contentBlocks, - createdAt: new Date().toISOString(), - citations: citations.length > 0 ? citations : undefined, - usage - }); - } - - if (finalNewMessages.length > 0) { - const allMessages = [...newMessages, ...finalNewMessages]; - setMessages(allMessages); - } - - setStreamingContent(""); - setStreamingBlocks([]); - setStreamingThinking(""); - setPendingCitations([]); - setIsStreaming(false); + finalizeStream(); } + }, + abortController.signal + ).catch((e) => { + // AbortError is expected when user stops generation + if (e instanceof DOMException && e.name === "AbortError") { + finalizeStream(); + } else { + // Re-throw other errors so they are not swallowed + throw e; } - ); + }); }, [input, isStreaming, messages, selectedModel, enableWebSearch, enableNoteTools, enableExtendedThinking, contextNoteId, supportsExtendedThinking, setMessages]); const handleKeyDown = useCallback((e: KeyboardEvent) => { @@ -365,6 +395,13 @@ export function useLlmChat( } }, [handleSubmit]); + /** Stop the current generation by aborting the SSE connection. */ + const stopStreaming = useCallback(() => { + if (abortControllerRef.current) { + abortControllerRef.current.abort(); + } + }, []); + return { // State messages, @@ -402,6 +439,7 @@ export function useLlmChat( loadFromContent, getContent, clearMessages, - refreshModels + refreshModels, + stopStreaming }; } diff --git a/apps/client/src/widgets/type_widgets/options/appearance.tsx b/apps/client/src/widgets/type_widgets/options/appearance.tsx index 94fc1f1fbd..dc4a3bdc26 100644 --- a/apps/client/src/widgets/type_widgets/options/appearance.tsx +++ b/apps/client/src/widgets/type_widgets/options/appearance.tsx @@ -3,6 +3,7 @@ import "./appearance.css"; import { FontFamily, OptionNames } from "@triliumnext/commons"; import { useEffect, useState } from "preact/hooks"; +import zoomService from "../../../components/zoom"; import { t } from "../../../services/i18n"; import server from "../../../services/server"; import { isElectron, isMobile, reloadFrontendApp, restartDesktopApp } from "../../../services/utils"; @@ -14,9 +15,10 @@ import FormGroup from "../../react/FormGroup"; import FormRadioGroup from "../../react/FormRadioGroup"; import FormSelect, { FormSelectWithGroups } from "../../react/FormSelect"; import FormText from "../../react/FormText"; -import FormTextBox, { FormTextBoxWithUnit } from "../../react/FormTextBox"; +import { FormTextBoxWithUnit } from "../../react/FormTextBox"; import { useTriliumOption, useTriliumOptionBool } from "../../react/hooks"; import Icon from "../../react/Icon"; +import OptionsRow from "./components/OptionsRow"; import OptionsSection from "./components/OptionsSection"; import PlatformIndicator from "./components/PlatformIndicator"; import RadioWithIllustration from "./components/RadioWithIllustration"; @@ -333,20 +335,23 @@ function Font({ title, fontFamilyOption, fontSizeOption }: { title: string, font } function ElectronIntegration() { - const [ zoomFactor, setZoomFactor ] = useTriliumOption("zoomFactor"); + const [ zoomFactor ] = useTriliumOption("zoomFactor"); const [ nativeTitleBarVisible, setNativeTitleBarVisible ] = useTriliumOptionBool("nativeTitleBarVisible"); const [ backgroundEffects, setBackgroundEffects ] = useTriliumOptionBool("backgroundEffects"); + const zoomPercentage = Math.round(parseFloat(zoomFactor || "1") * 100); + return ( - - + zoomService.setZoomFactorAndSave(parseInt(v, 10) / 100)} + unit={t("units.percentage")} /> - -
+ ([]); @@ -35,7 +36,7 @@ export default function BackupSettings() { - ) + ); } export function AutomaticBackup() { @@ -67,7 +68,7 @@ export function AutomaticBackup() { {t("backup.backup_recommendation")}
- ) + ); } export function BackupNow({ refreshCallback }: { refreshCallback: () => void }) { @@ -82,7 +83,7 @@ export function BackupNow({ refreshCallback }: { refreshCallback: () => void }) }} /> - ) + ); } export function BackupList({ backups }: { backups: DatabaseBackup[] }) { @@ -92,11 +93,13 @@ export function BackupList({ backups }: { backups: DatabaseBackup[] }) { + {t("backup.date-and-time")} {t("backup.path")} + @@ -105,15 +108,20 @@ export function BackupList({ backups }: { backups: DatabaseBackup[] }) { {mtime ? formatDateTime(mtime) : "-"} {filePath} + + +
+ +
+ + + + - ) + ); } export function SyncTest() { @@ -90,5 +94,5 @@ export function SyncTest() { }} /> - ) -} \ No newline at end of file + ); +} diff --git a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx index 56b4d57060..dd4d9d02c9 100644 --- a/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx +++ b/apps/client/src/widgets/type_widgets/text/CKEditorWithWatchdog.tsx @@ -7,7 +7,7 @@ import link from "../../../services/link"; import { useKeyboardShortcuts, useLegacyImperativeHandlers, useNoteContext, useSyncedRef, useTriliumOption } from "../../react/hooks"; import { buildConfig, BuildEditorOptions } from "./config"; -export type BoxSize = "small" | "medium" | "full"; +export type BoxSize = "small" | "medium" | "full" | "expandable"; export interface CKEditorApi { /** returns true if user selected some text, false if there's no selection */ diff --git a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css index 96ef05295d..36293d800e 100644 --- a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css +++ b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css @@ -55,4 +55,14 @@ body.mobile .note-detail-readonly-text { .edit-text-note-button:hover { border-color: var(--button-border-color); +} + +/* Inline code click-to-copy */ +.note-detail-readonly-text-content code.copyable-inline-code { + cursor: pointer; + transition: background-color 0.15s ease; +} + +.note-detail-readonly-text-content code.copyable-inline-code:hover { + background-color: var(--accented-background-color); } \ No newline at end of file diff --git a/apps/client/src/widgets/type_widgets/text/config.ts b/apps/client/src/widgets/type_widgets/text/config.ts index 29b1a02699..e4812156e4 100644 --- a/apps/client/src/widgets/type_widgets/text/config.ts +++ b/apps/client/src/widgets/type_widgets/text/config.ts @@ -182,9 +182,21 @@ export async function buildConfig(opts: BuildEditorOptions): Promise noteAutocompleteService.autocompleteSourceForCKEditor(queryText), itemRenderer: (item) => { + const suggestion = item as Suggestion; const itemElement = document.createElement("button"); - itemElement.innerHTML = `${(item as Suggestion).highlightedNotePathTitle} `; + const iconElement = document.createElement("span"); + // Choose appropriate icon based on action + let iconClass = suggestion.icon ?? "bx bx-note"; + if (suggestion.action === "create-note") { + iconClass = "bx bx-plus"; + } + iconElement.className = iconClass; + + itemElement.append(iconElement, document.createTextNode(" ")); + const titleContainer = document.createElement("span"); + titleContainer.innerHTML = suggestion.highlightedNotePathTitle ?? ""; + itemElement.append(...titleContainer.childNodes, document.createTextNode(" ")); return itemElement; }, diff --git a/apps/client/src/widgets/type_widgets/text/utils.ts b/apps/client/src/widgets/type_widgets/text/utils.ts index ad8a6df23d..a3e0f382ba 100644 --- a/apps/client/src/widgets/type_widgets/text/utils.ts +++ b/apps/client/src/widgets/type_widgets/text/utils.ts @@ -8,17 +8,77 @@ export async function loadIncludedNote(noteId: string, $el: JQuery) const note = await froca.getNote(noteId); if (!note) return; + // Get the box size from the parent section element + const $section = $el.closest('section.include-note'); + const boxSize = $section.attr('data-box-size'); + const isExpandable = boxSize === 'expandable'; + const $wrapper = $('
'); const $link = await link.createLink(note.noteId, { showTooltip: false }); - $wrapper.empty().append($('

').append($link)); + if (isExpandable) { + // Create expandable structure with toggle + const $titleRow = $('
'); + const $toggle = $('
diff --git a/apps/edit-docs/demo/root/Trilium Demo/Scripting examples/Statistics/Attribute count/template/js/renderPieChart/chart.js.clone.html b/apps/edit-docs/demo/root/Trilium Demo/Scripting examples/Statistics/Attribute count/template/js/renderPieChart/chart.js.clone.html new file mode 100644 index 0000000000..64e4de7c49 --- /dev/null +++ b/apps/edit-docs/demo/root/Trilium Demo/Scripting examples/Statistics/Attribute count/template/js/renderPieChart/chart.js.clone.html @@ -0,0 +1,21 @@ + + + + + + + + chart.js + + + +
+

chart.js

+ +
+

This is a clone of a note. Go to its primary location.

+
+
+ + + \ No newline at end of file diff --git a/apps/edit-docs/demo/style.css b/apps/edit-docs/demo/style.css index d1209630ab..2e961cdb7a 100644 --- a/apps/edit-docs/demo/style.css +++ b/apps/edit-docs/demo/style.css @@ -1,633 +1,658 @@ /** - * @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved. + * @license Copyright (c) 2003-2026, CKSource Holding sp. z o.o. All rights reserved. * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options */ -:root{ - --ck-content-color-mention-background:hsla(341, 100%, 30%, 0.1); - --ck-content-color-mention-text:hsl(341, 100%, 30%); -} -.ck-content .mention{ - background:var(--ck-content-color-mention-background); - color:var(--ck-content-color-mention-text); -} - .ck-content code{ - background-color:hsla(0, 0%, 78%, 0.3); - padding:.15em; - border-radius:2px; + background-color:#c7c7c74d; + border-radius:2px; + padding:.15em; } .ck-content blockquote{ - overflow:hidden; - padding-right:1.5em; - padding-left:1.5em; - - margin-left:0; - margin-right:0; - font-style:italic; - border-left:solid 5px hsl(0, 0%, 80%); + border-left:5px solid #ccc; + margin-left:0; + margin-right:0; + padding-left:1.5em; + padding-right:1.5em; + font-style:italic; + overflow:hidden; } .ck-content[dir="rtl"] blockquote{ - border-left:0; - border-right:solid 5px hsl(0, 0%, 80%); + border-left:0; + border-right:5px solid #ccc; } .ck-content pre{ - padding:1em; - color:hsl(0, 0%, 20.8%); - background:hsla(0, 0%, 78%, 0.3); - border:1px solid hsl(0, 0%, 77%); - border-radius:2px; - text-align:left; - direction:ltr; - - tab-size:4; - white-space:pre-wrap; - font-style:normal; - min-width:200px; + color:#353535; + text-align:left; + tab-size:4; + white-space:pre-wrap; + direction:ltr; + background:#c7c7c74d; + border:1px solid #c4c4c4; + border-radius:2px; + min-width:200px; + margin:.9em 0; + padding:1em; + font-style:normal; } .ck-content pre code{ - background:unset; - padding:0; - border-radius:0; - } + background:unset; + border-radius:0; + padding:0; +} :root{ - --ck-content-font-family:Helvetica, Arial, Tahoma, Verdana, Sans-Serif; - --ck-content-font-size:medium; - --ck-content-font-color:#000; - --ck-content-line-height:1.5; - --ck-content-word-break:break-word; + --ck-content-font-family:Helvetica, Arial, Tahoma, Verdana, Sans-Serif; + --ck-content-font-size:medium; + --ck-content-font-color:#000; + --ck-content-line-height:1.5; + --ck-content-word-break:normal; + --ck-content-overflow-wrap:break-word; } .ck-content{ - font-family:var(--ck-content-font-family); - font-size:var(--ck-content-font-size); - color:var(--ck-content-font-color); - line-height:var(--ck-content-line-height); - word-break:var(--ck-content-word-break); + font-family:var(--ck-content-font-family); + font-size:var(--ck-content-font-size); + color:var(--ck-content-font-color); + line-height:var(--ck-content-line-height); + word-break:var(--ck-content-word-break); + overflow-wrap:var(--ck-content-overflow-wrap); } :root{ - --ck-content-font-size-tiny:0.7em; - --ck-content-font-size-small:0.85em; - --ck-content-font-size-big:1.4em; - --ck-content-font-size-huge:1.8em; + --ck-content-font-size-tiny:.7em; + --ck-content-font-size-small:.85em; + --ck-content-font-size-big:1.4em; + --ck-content-font-size-huge:1.8em; } + .ck-content .text-tiny{ - font-size:var(--ck-content-font-size-tiny); - } + font-size:var(--ck-content-font-size-tiny); +} + .ck-content .text-small{ - font-size:var(--ck-content-font-size-small); - } + font-size:var(--ck-content-font-size-small); +} + .ck-content .text-big{ - font-size:var(--ck-content-font-size-big); - } + font-size:var(--ck-content-font-size-big); +} + .ck-content .text-huge{ - font-size:var(--ck-content-font-size-huge); - } + font-size:var(--ck-content-font-size-huge); +} :root{ - --ck-content-highlight-marker-yellow:hsl(60, 97%, 73%); - --ck-content-highlight-marker-green:hsl(120, 93%, 68%); - --ck-content-highlight-marker-pink:hsl(345, 96%, 73%); - --ck-content-highlight-marker-blue:hsl(201, 97%, 72%); - --ck-content-highlight-pen-red:hsl(0, 85%, 49%); - --ck-content-highlight-pen-green:hsl(112, 100%, 27%); + --ck-content-highlight-marker-yellow:#fdfd77; + --ck-content-highlight-marker-green:#62f962; + --ck-content-highlight-marker-pink:#fc7899; + --ck-content-highlight-marker-blue:#72ccfd; + --ck-content-highlight-pen-red:#e71313; + --ck-content-highlight-pen-green:#128a00; } .ck-content .marker-yellow{ - background-color:var(--ck-content-highlight-marker-yellow); - } + background-color:var(--ck-content-highlight-marker-yellow); +} + .ck-content .marker-green{ - background-color:var(--ck-content-highlight-marker-green); - } + background-color:var(--ck-content-highlight-marker-green); +} + .ck-content .marker-pink{ - background-color:var(--ck-content-highlight-marker-pink); - } + background-color:var(--ck-content-highlight-marker-pink); +} + .ck-content .marker-blue{ - background-color:var(--ck-content-highlight-marker-blue); - } + background-color:var(--ck-content-highlight-marker-blue); +} .ck-content .pen-red{ - color:var(--ck-content-highlight-pen-red); - background-color:transparent; - } + color:var(--ck-content-highlight-pen-red); + background-color:#0000; +} + .ck-content .pen-green{ - color:var(--ck-content-highlight-pen-green); - background-color:transparent; - } + color:var(--ck-content-highlight-pen-green); + background-color:#0000; +} .ck-content hr{ - margin:15px 0; - height:4px; - background:hsl(0, 0%, 87%); - border:0; + background:#dedede; + border:0; + height:4px; + margin:15px 0; } :root{ - --ck-content-color-image-caption-background:hsl(0, 0%, 97%); - --ck-content-color-image-caption-text:hsl(0, 0%, 20%); + --ck-content-color-image-caption-background:#f7f7f7; + --ck-content-color-image-caption-text:#333; } + .ck-content .image > figcaption{ - display:table-caption; - caption-side:bottom; - word-break:normal; - overflow-wrap:anywhere; - break-before:avoid; - color:var(--ck-content-color-image-caption-text); - background-color:var(--ck-content-color-image-caption-background); - padding:.6em; - font-size:.75em; - outline-offset:-1px; + caption-side:bottom; + word-break:normal; + overflow-wrap:anywhere; + break-before:avoid; + color:var(--ck-content-color-image-caption-text); + background-color:var(--ck-content-color-image-caption-background); + outline-offset:-1px; + padding:.6em; + font-size:.75em; + display:table-caption; } + @media (forced-colors: active){ -.ck-content .image > figcaption{ - background-color:unset; - color:unset; + .ck-content .image > figcaption{ + background-color:unset; + color:unset; + } } - } + .ck-content img.image_resized{ - height:auto; + height:auto; } .ck-content .image.image_resized{ - max-width:100%; - display:block; - box-sizing:border-box; + box-sizing:border-box; + max-width:100%; + display:block; } .ck-content .image.image_resized img{ - width:100%; - } - -.ck-content .image.image_resized > figcaption{ - display:block; - } - -:root{ - --ck-content-image-style-spacing:1.5em; - --ck-content-inline-image-style-spacing:calc(var(--ck-content-image-style-spacing) / 2); + width:100%; } -.ck-content .image.image-style-block-align-left, - .ck-content .image.image-style-block-align-right{ - max-width:calc(100% - var(--ck-content-image-style-spacing)); - } - -.ck-content .image.image-style-align-left, - .ck-content .image.image-style-align-right{ - clear:none; - } - -.ck-content .image.image-style-side{ - float:right; - margin-left:var(--ck-content-image-style-spacing); - max-width:50%; - } - -.ck-content .image.image-style-align-left{ - float:left; - margin-right:var(--ck-content-image-style-spacing); - } - -.ck-content .image.image-style-align-right{ - float:right; - margin-left:var(--ck-content-image-style-spacing); - } - -.ck-content .image.image-style-block-align-right{ - margin-right:0; - margin-left:auto; - } - -.ck-content .image.image-style-block-align-left{ - margin-left:0; - margin-right:auto; - } - -.ck-content .image-style-align-center{ - margin-left:auto; - margin-right:auto; - } - -.ck-content .image-style-align-left{ - float:left; - margin-right:var(--ck-content-image-style-spacing); - } - -.ck-content .image-style-align-right{ - float:right; - margin-left:var(--ck-content-image-style-spacing); - } - -.ck-content p + .image.image-style-align-left, - .ck-content p + .image.image-style-align-right, - .ck-content p + .image.image-style-side{ - margin-top:0; - } - -.ck-content .image-inline.image-style-align-left, - .ck-content .image-inline.image-style-align-right{ - margin-top:var(--ck-content-inline-image-style-spacing); - margin-bottom:var(--ck-content-inline-image-style-spacing); - } - -.ck-content .image-inline.image-style-align-left{ - margin-right:var(--ck-content-inline-image-style-spacing); - } - -.ck-content .image-inline.image-style-align-right{ - margin-left:var(--ck-content-inline-image-style-spacing); - } - -.ck-content .image{ - display:table; - clear:both; - text-align:center; - margin:0.9em auto; - min-width:50px; - } - -.ck-content .image img{ - display:block; - margin:0 auto; - max-width:100%; - min-width:100%; - height:auto; - } - -.ck-content .image-inline{ - display:inline-flex; - max-width:100%; - align-items:flex-start; - } - -.ck-content .image-inline picture{ - display:flex; - } - -.ck-content .image-inline picture, - .ck-content .image-inline img{ - flex-grow:1; - flex-shrink:1; - max-width:100%; - } +.ck-content .image.image_resized > figcaption{ + display:block; +} :root{ - --ck-content-list-marker-color:var(--ck-content-font-color); - --ck-content-list-marker-font-family:var(--ck-content-font-family); - --ck-content-list-marker-font-size:var(--ck-content-font-size); + --ck-content-image-style-spacing:1.5em; + --ck-content-inline-image-style-spacing:calc(var(--ck-content-image-style-spacing) / 2); +} + +.ck-content .image.image-style-block-align-left, .ck-content .image.image-style-block-align-right{ + max-width:calc(100% - var(--ck-content-image-style-spacing)); +} + +.ck-content .image.image-style-align-left, .ck-content .image.image-style-align-right{ + clear:none; +} + +.ck-content .image.image-style-side{ + float:right; + margin-left:var(--ck-content-image-style-spacing); + max-width:50%; +} + +.ck-content .image.image-style-align-left{ + float:left; + margin-right:var(--ck-content-image-style-spacing); +} + +.ck-content .image.image-style-align-right{ + float:right; + margin-left:var(--ck-content-image-style-spacing); +} + +.ck-content .image.image-style-block-align-right{ + margin-left:auto; + margin-right:0; +} + +.ck-content .image.image-style-block-align-left{ + margin-left:0; + margin-right:auto; +} + +.ck-content .image-style-align-center{ + margin-left:auto; + margin-right:auto; +} + +.ck-content .image-style-align-left{ + float:left; + margin-right:var(--ck-content-image-style-spacing); +} + +.ck-content .image-style-align-right{ + float:right; + margin-left:var(--ck-content-image-style-spacing); +} + +.ck-content p + .image.image-style-align-left, .ck-content p + .image.image-style-align-right, .ck-content p + .image.image-style-side{ + margin-top:0; +} + +.ck-content .image-inline.image-style-align-left, .ck-content .image-inline.image-style-align-right{ + margin-top:var(--ck-content-inline-image-style-spacing); + margin-bottom:var(--ck-content-inline-image-style-spacing); +} + +.ck-content .image-inline.image-style-align-left{ + margin-right:var(--ck-content-inline-image-style-spacing); +} + +.ck-content .image-inline.image-style-align-right{ + margin-left:var(--ck-content-inline-image-style-spacing); +} + +.ck-content .image{ + clear:both; + text-align:center; + min-width:50px; + margin:.9em auto; + display:table; +} + +.ck-content .image img{ + min-width:100%; + max-width:100%; + height:auto; + margin:0 auto; + display:block; +} + +.ck-content .image-inline{ + align-items:flex-start; + max-width:100%; + display:inline-flex; +} + +.ck-content .image-inline picture{ + display:flex; +} + +.ck-content .image-inline picture, .ck-content .image-inline img{ + flex-grow:1; + flex-shrink:1; + max-width:100%; +} + +:root{ + --ck-content-list-marker-color:var(--ck-content-font-color); + --ck-content-list-marker-font-family:var(--ck-content-font-family); + --ck-content-list-marker-font-size:var(--ck-content-font-size); } .ck-content li > p:first-of-type{ - margin-top:0; - } + margin-top:0; +} .ck-content li > p:only-of-type{ - margin-top:0; - margin-bottom:0; - } + margin-top:0; + margin-bottom:0; +} .ck-content li.ck-list-marker-bold::marker{ - font-weight:bold; - } + font-weight:bold; +} .ck-content li.ck-list-marker-italic::marker{ - font-style:italic; - } + font-style:italic; +} .ck-content li.ck-list-marker-color::marker{ - color:var(--ck-content-list-marker-color); - } + color:var(--ck-content-list-marker-color); +} .ck-content li.ck-list-marker-font-family::marker{ - font-family:var(--ck-content-list-marker-font-family); - } + font-family:var(--ck-content-list-marker-font-family); +} .ck-content li.ck-list-marker-font-size::marker{ - font-size:var(--ck-content-list-marker-font-size); - } + font-size:var(--ck-content-list-marker-font-size); +} .ck-content li.ck-list-marker-font-size-tiny::marker{ - font-size:var(--ck-content-font-size-tiny); - } + font-size:var(--ck-content-font-size-tiny); +} .ck-content li.ck-list-marker-font-size-small::marker{ - font-size:var(--ck-content-font-size-small); - } + font-size:var(--ck-content-font-size-small); +} .ck-content li.ck-list-marker-font-size-big::marker{ - font-size:var(--ck-content-font-size-big); - } + font-size:var(--ck-content-font-size-big); +} .ck-content li.ck-list-marker-font-size-huge::marker{ - font-size:var(--ck-content-font-size-huge); - } + font-size:var(--ck-content-font-size-huge); +} .ck-content ol{ - list-style-type:decimal; + list-style-type:decimal; } .ck-content ol ol{ - list-style-type:lower-latin; - } + list-style-type:lower-latin; +} .ck-content ol ol ol{ - list-style-type:lower-roman; - } + list-style-type:lower-roman; +} .ck-content ol ol ol ol{ - list-style-type:upper-latin; - } + list-style-type:upper-latin; +} .ck-content ol ol ol ol ol{ - list-style-type:upper-roman; - } + list-style-type:upper-roman; +} .ck-content ul{ - list-style-type:disc; + list-style-type:disc; } .ck-content ul ul{ - list-style-type:circle; - } + list-style-type:circle; +} .ck-content ul ul ul{ - list-style-type:square; - } + list-style-type:square; +} .ck-content ul ul ul ul{ - list-style-type:square; - } + list-style-type:square; +} :root{ - --ck-content-todo-list-checkmark-size:16px; + --ck-content-todo-list-checkmark-size:16px; } -.ck-content .todo-list{ - list-style:none; + +.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input{ + -webkit-appearance:none; + width:var(--ck-content-todo-list-checkmark-size); + height:var(--ck-content-todo-list-checkmark-size); + vertical-align:middle; + border:0; + margin-left:0; + margin-right:-15px; + display:inline-block; + position:relative; + left:-25px; + right:0; } -.ck-content .todo-list li{ - position:relative; - margin-bottom:5px; - } -.ck-content .todo-list li .todo-list{ - margin-top:5px; - } -.ck-content .todo-list .todo-list__label > input{ - -webkit-appearance:none; - display:inline-block; - position:relative; - width:var(--ck-content-todo-list-checkmark-size); - height:var(--ck-content-todo-list-checkmark-size); - vertical-align:middle; - border:0; - left:-25px; - margin-right:-15px; - right:0; - margin-left:0; - } -.ck-content[dir=rtl] .todo-list .todo-list__label > input{ - left:0; - margin-right:0; - right:-25px; - margin-left:-15px; - } -.ck-content .todo-list .todo-list__label > input::before{ - display:block; - position:absolute; - box-sizing:border-box; - content:''; - width:100%; - height:100%; - border:1px solid hsl(0, 0%, 20%); - border-radius:2px; - transition:250ms ease-in-out box-shadow; - } + +[dir="rtl"]:is(.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input){ + margin-left:-15px; + margin-right:0; + left:0; + right:-25px; +} + +:is(.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input):before{ + box-sizing:border-box; + content:""; + border:1px solid #333; + border-radius:2px; + width:100%; + height:100%; + transition:box-shadow .25s ease-in-out; + display:block; + position:absolute; +} + @media (prefers-reduced-motion: reduce){ -.ck-content .todo-list .todo-list__label > input::before{ - transition:none; - } - } -.ck-content .todo-list .todo-list__label > input::after{ - display:block; - position:absolute; - box-sizing:content-box; - pointer-events:none; - content:''; - left:calc( var(--ck-content-todo-list-checkmark-size) / 3); - top:calc( var(--ck-content-todo-list-checkmark-size) / 5.3); - width:calc( var(--ck-content-todo-list-checkmark-size) / 5.3); - height:calc( var(--ck-content-todo-list-checkmark-size) / 2.6); - border-style:solid; - border-color:transparent; - border-width:0 calc( var(--ck-content-todo-list-checkmark-size) / 8) calc( var(--ck-content-todo-list-checkmark-size) / 8) 0; - transform:rotate(45deg); - } -.ck-content .todo-list .todo-list__label > input[checked]::before{ - background:hsl(126, 64%, 41%); - border-color:hsl(126, 64%, 41%); - } -.ck-content .todo-list .todo-list__label > input[checked]::after{ - border-color:hsl(0, 0%, 100%); - } + :is(.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input):before{ + transition:none; + } +} + +:is(.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input):after{ + box-sizing:content-box; + pointer-events:none; + content:""; + left:calc(var(--ck-content-todo-list-checkmark-size) / 3); + top:calc(var(--ck-content-todo-list-checkmark-size) / 5.3); + width:calc(var(--ck-content-todo-list-checkmark-size) / 5.3); + height:calc(var(--ck-content-todo-list-checkmark-size) / 2.6); + border-style:solid; + border-color:#0000; + border-width:0 calc(var(--ck-content-todo-list-checkmark-size) / 8) calc(var(--ck-content-todo-list-checkmark-size) / 8) 0; + display:block; + position:absolute; + transform:rotate(45deg); +} + +:is(.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input)[checked]:before{ + background:#26ab33; + border-color:#26ab33; +} + +:is(.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input)[checked]:after{ + border-color:#fff; +} + +.ck-content .todo-list{ + list-style:none; +} + +.ck-content .todo-list li{ + margin-bottom:5px; + position:relative; +} + +.ck-content .todo-list li .todo-list{ + margin-top:5px; +} + .ck-content .todo-list .todo-list__label .todo-list__label__description{ - vertical-align:middle; - } -.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type=checkbox]{ - position:absolute; - } + vertical-align:middle; +} + +.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type="checkbox"]{ + position:absolute; +} + +.ck-editor__editable.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input{ + cursor:pointer; +} + +:is(.ck-editor__editable.ck-content .todo-list .todo-list__label > input, .ck-editor__editable.ck-content .todo-list .todo-list__label > span[contenteditable="false"] > input):hover:before{ + box-shadow:0 0 0 5px #0000001a; +} + +.ck-editor__editable.ck-content .todo-list .todo-list__label.todo-list__label_without-description input[type="checkbox"]{ + position:absolute; +} .ck-content .media{ - clear:both; - margin:0.9em 0; - display:block; - min-width:15em; + clear:both; + min-width:15em; + margin:.9em 0; + display:block; +} + +:root{ + --ck-content-color-mention-background:#9900301a; + --ck-content-color-mention-text:#990030; +} + +.ck-content .mention{ + background:var(--ck-content-color-mention-background); + color:var(--ck-content-color-mention-text); } .ck-content .page-break{ - position:relative; - clear:both; - padding:5px 0; - display:flex; - align-items:center; - justify-content:center; + clear:both; + justify-content:center; + align-items:center; + padding:5px 0; + display:flex; + position:relative; } -.ck-content .page-break::after{ - content:''; - position:absolute; - border-bottom:2px dashed hsl(0, 0%, 77%); - width:100%; - } +.ck-content .page-break:after{ + content:""; + border-bottom:2px dashed #c4c4c4; + width:100%; + position:absolute; +} .ck-content .page-break__label{ - position:relative; - z-index:1; - padding:.3em .6em; - display:block; - text-transform:uppercase; - border:1px solid hsl(0, 0%, 77%); - border-radius:2px; - font-size:0.75em; - font-weight:bold; - color:hsl(0, 0%, 20%); - background:hsl(0, 0%, 100%); - box-shadow:2px 2px 1px hsla(0, 0%, 0%, 0.15); - -webkit-user-select:none; - -moz-user-select:none; - -ms-user-select:none; - user-select:none; + z-index:1; + text-transform:uppercase; + color:#333; + -webkit-user-select:none; + user-select:none; + background:#fff; + border:1px solid #c4c4c4; + border-radius:2px; + padding:.3em .6em; + font-size:.75em; + font-weight:bold; + display:block; + position:relative; + box-shadow:2px 2px 1px #00000026; } -@media print{ - .ck-content .page-break{ - padding:0; - } - .ck-content .page-break::after{ - display:none; - } - .ck-content *:has(+ .page-break){ - margin-bottom:0; - } +@media print{ + .ck-content .page-break{ + padding:0; + } + + .ck-content .page-break:after{ + display:none; + } + + .ck-content :has( + .page-break){ + margin-bottom:0; + } +} + +.ck-content .table th{ + text-align:start; } .ck-content[dir="rtl"] .table th{ - text-align:right; - } + text-align:right; +} .ck-content[dir="ltr"] .table th{ - text-align:left; - } + text-align:left; +} .ck-content figure.table:not(.layout-table){ - display:table; - } + display:table; +} .ck-content figure.table:not(.layout-table) > table{ - width:100%; - height:100%; - } + width:100%; + height:100%; +} .ck-content .table:not(.layout-table){ - margin:0.9em auto; - } + margin:.9em auto; +} -.ck-content table.table:not(.layout-table), - .ck-content figure.table:not(.layout-table) > table{ - border-collapse:collapse; - border-spacing:0; - border:1px double hsl(0, 0%, 70%); - } +.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table{ + border-collapse:collapse; + border-spacing:0; + border:1px double #b3b3b3; +} -.ck-content table.table:not(.layout-table) > thead > tr > th, .ck-content figure.table:not(.layout-table) > table > thead > tr > th, .ck-content table.table:not(.layout-table) > tbody > tr > th, .ck-content figure.table:not(.layout-table) > table > tbody > tr > th{ - font-weight:bold; - background:hsla(0, 0%, 0%, 5%); - } +:is(:is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > thead, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tfoot, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tbody) > tr > th{ + background:#0000000d; + font-weight:bold; +} -.ck-content table.table:not(.layout-table) > thead > tr > td, - .ck-content figure.table:not(.layout-table) > table > thead > tr > td, - .ck-content table.table:not(.layout-table) > tbody > tr > td, - .ck-content figure.table:not(.layout-table) > table > tbody > tr > td, - .ck-content table.table:not(.layout-table) > thead > tr > th, - .ck-content figure.table:not(.layout-table) > table > thead > tr > th, - .ck-content table.table:not(.layout-table) > tbody > tr > th, - .ck-content figure.table:not(.layout-table) > table > tbody > tr > th{ +:is(:is(:is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > thead, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tfoot, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tbody) > tr > td, :is(:is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > thead, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tfoot, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tbody) > tr > th) > p:first-of-type{ + margin-top:0; +} - min-width:2em; - padding:0.4em; - border:1px solid hsl(0, 0%, 75%); - } +:is(:is(:is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > thead, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tfoot, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tbody) > tr > td, :is(:is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > thead, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tfoot, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tbody) > tr > th) > p:last-of-type{ + margin-bottom:0; +} -.ck-content table.table:not(.layout-table) > thead > tr > td > p:first-of-type, .ck-content figure.table:not(.layout-table) > table > thead > tr > td > p:first-of-type, .ck-content table.table:not(.layout-table) > tbody > tr > td > p:first-of-type, .ck-content figure.table:not(.layout-table) > table > tbody > tr > td > p:first-of-type, .ck-content table.table:not(.layout-table) > thead > tr > th > p:first-of-type, .ck-content figure.table:not(.layout-table) > table > thead > tr > th > p:first-of-type, .ck-content table.table:not(.layout-table) > tbody > tr > th > p:first-of-type, .ck-content figure.table:not(.layout-table) > table > tbody > tr > th > p:first-of-type{ - margin-top:0; - } - -.ck-content table.table:not(.layout-table) > thead > tr > td > p:last-of-type, .ck-content figure.table:not(.layout-table) > table > thead > tr > td > p:last-of-type, .ck-content table.table:not(.layout-table) > tbody > tr > td > p:last-of-type, .ck-content figure.table:not(.layout-table) > table > tbody > tr > td > p:last-of-type, .ck-content table.table:not(.layout-table) > thead > tr > th > p:last-of-type, .ck-content figure.table:not(.layout-table) > table > thead > tr > th > p:last-of-type, .ck-content table.table:not(.layout-table) > tbody > tr > th > p:last-of-type, .ck-content figure.table:not(.layout-table) > table > tbody > tr > th > p:last-of-type{ - margin-bottom:0; - } +:is(:is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > thead, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tfoot, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tbody) > tr > td, :is(:is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > thead, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tfoot, :is(.ck-content table.table:not(.layout-table), .ck-content figure.table:not(.layout-table) > table) > tbody) > tr > th{ + border:1px solid #bfbfbf; + min-width:2em; + padding:.4em; +} @media print{ - .ck-content figure.table:not(.layout-table){ - width:fit-content; - height:fit-content; - } - .ck-content figure.table:not(.layout-table) > table{ - height:initial; - } + .ck-content figure.table:not(.layout-table){ + width:fit-content; + height:fit-content; + } + + .ck-content figure.table:not(.layout-table) > table{ + height:initial; + } } -.ck-content table.table.layout-table, - .ck-content figure.table.layout-table{ - margin-top:0; - margin-bottom:0; - } - -.ck-content table.table.layout-table, - .ck-content figure.table.layout-table > table{ - border-spacing:0; - } - -:root{ - --ck-content-color-table-caption-background:hsl(0, 0%, 97%); - --ck-content-color-table-caption-text:hsl(0, 0%, 20%); -} -.ck-content .table > figcaption, -.ck-content figure.table > table > caption{ - display:table-caption; - caption-side:top; - word-break:normal; - overflow-wrap:anywhere; - text-align:center; - color:var(--ck-content-color-table-caption-text); - background-color:var(--ck-content-color-table-caption-background); - padding:.6em; - font-size:.75em; - outline-offset:-1px; -} -@media (forced-colors: active){ - .ck-content .table > figcaption, .ck-content figure.table > table > caption{ - background-color:unset; - color:unset; - } - } - -.ck-content .table .ck-table-resized{ - table-layout:fixed; +.ck-content table.table.layout-table, .ck-content figure.table.layout-table{ + margin-top:0; + margin-bottom:0; } -.ck-content .table td, -.ck-content .table th{ - overflow-wrap:break-word; +.ck-content table.table.layout-table, .ck-content figure.table.layout-table > table{ + border-spacing:0; } :root{ - --ck-content-table-style-spacing:1.5em; + --ck-content-table-style-spacing:1.5em; } .ck-content .table.table-style-align-left{ - float:left; - margin-right:var(--ck-content-table-style-spacing); - } + float:left; + margin-right:var(--ck-content-table-style-spacing); +} .ck-content .table.table-style-align-right{ - float:right; - margin-left:var(--ck-content-table-style-spacing); - } + float:right; + margin-left:var(--ck-content-table-style-spacing); +} .ck-content .table.table-style-align-center{ - margin-left:auto; - margin-right:auto; - } + margin-left:auto; + margin-right:auto; +} .ck-content .table.table-style-block-align-left{ - margin-left:0; - margin-right:auto; - } + margin-left:0; + margin-right:auto; +} .ck-content .table.table-style-block-align-right{ - margin-left:auto; - margin-right:0; - } \ No newline at end of file + margin-left:auto; + margin-right:0; +} + +:root{ + --ck-content-color-table-caption-background:#f7f7f7; + --ck-content-color-table-caption-text:#333; +} + +.ck-content .table > figcaption, .ck-content figure.table > table > caption{ + caption-side:top; + word-break:normal; + overflow-wrap:anywhere; + text-align:center; + color:var(--ck-content-color-table-caption-text); + background-color:var(--ck-content-color-table-caption-background); + outline-offset:-1px; + padding:.6em; + font-size:.75em; + display:table-caption; +} + +@media (forced-colors: active){ + .ck-content .table > figcaption, .ck-content figure.table > table > caption{ + background-color:unset; + color:unset; + } +} + +.ck-content .table .ck-table-resized{ + table-layout:fixed; +} + +.ck-content .table td, .ck-content .table th{ + overflow-wrap:break-word; +} \ No newline at end of file diff --git a/apps/edit-docs/src/edit-demo.ts b/apps/edit-docs/src/edit-demo.ts index 915d7c857e..af7dd1e0c7 100644 --- a/apps/edit-docs/src/edit-demo.ts +++ b/apps/edit-docs/src/edit-demo.ts @@ -1,9 +1,11 @@ +import { createZipFromDirectory, extractZip, importData, initializeDatabase, startElectron } from "./utils.js"; +import { initializeTranslations } from "@triliumnext/server/src/services/i18n.js"; import debounce from "@triliumnext/client/src/services/debounce.js"; import cls from "@triliumnext/server/src/services/cls.js"; import fs from "fs/promises"; import { join } from "path"; - -import { extractZip, importData, startElectron } from "./utils.js"; +import type { NoteMetaFile } from "@triliumnext/server/src/services/meta/note_meta.js"; +import type NoteMeta from "@triliumnext/server/src/services/meta/note_meta.js"; // Paths are relative to apps/edit-docs/dist. const DEMO_ZIP_PATH = join(__dirname, "../../server/src/assets/db/demo.zip"); @@ -15,21 +17,31 @@ async function main() { setTimeout(() => registerHandlers(), 10_000); }); - // TODO: Initialize core. + await initializeTranslations(); + await initializeDatabase(true); + + // Wait for becca to be loaded before importing data + const { becca_loader } = await import("@triliumnext/core"); + await becca_loader.beccaLoaded; + cls.init(async () => { await importData(DEMO_ZIP_DIR_PATH); setOptions(); initializedPromise.resolve(); }); - - initializedPromise.resolve(); } async function setOptions() { const optionsService = (await import("@triliumnext/server/src/services/options.js")).default; + const sql = (await import("@triliumnext/server/src/services/sql.js")).default; + optionsService.setOption("eraseUnusedAttachmentsAfterSeconds", 10); optionsService.setOption("eraseUnusedAttachmentsAfterTimeScale", 60); optionsService.setOption("compressImages", "false"); + + // Set initial note to the first visible child of root (not _hidden) + const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 AND noteId != '_hidden' ORDER BY notePosition") || "root"; + optionsService.setOption("openNoteContexts", JSON.stringify([{ notePath: startNoteId, active: true }])); } async function registerHandlers() { @@ -40,8 +52,10 @@ async function registerHandlers() { eraseService.eraseUnusedAttachmentsNow(); await exportData(); - await fs.rmdir(DEMO_ZIP_DIR_PATH, { recursive: true }).catch(() => {}); + await fs.rm(DEMO_ZIP_DIR_PATH, { recursive: true }).catch(() => {}); await extractZip(DEMO_ZIP_PATH, DEMO_ZIP_DIR_PATH); + await cleanUpMeta(DEMO_ZIP_DIR_PATH); + await createZipFromDirectory(DEMO_ZIP_DIR_PATH, DEMO_ZIP_PATH); }, 10_000); events.subscribe(events.ENTITY_CHANGED, async (e) => { if (e.entityName === "options") { @@ -58,4 +72,28 @@ async function exportData() { await zipExportService.exportToZipFile("root", "html", DEMO_ZIP_PATH); } +const EXPANDED_NOTE_IDS = new Set([ + "root", + "rvaX6hEaQlmk" // Trilium Demo +]); + +async function cleanUpMeta(dirPath: string) { + const metaPath = join(dirPath, "!!!meta.json"); + const meta = JSON.parse(await fs.readFile(metaPath, "utf-8")) as NoteMetaFile; + + for (const file of meta.files) { + file.notePosition = 1; + traverse(file); + } + + function traverse(el: NoteMeta) { + el.isExpanded = EXPANDED_NOTE_IDS.has(el.noteId); + for (const child of el.children || []) { + traverse(child); + } + } + + await fs.writeFile(metaPath, JSON.stringify(meta, null, 4)); +} + main(); diff --git a/apps/edit-docs/src/edit-docs.ts b/apps/edit-docs/src/edit-docs.ts index d7846b627d..2c7f9cdf45 100644 --- a/apps/edit-docs/src/edit-docs.ts +++ b/apps/edit-docs/src/edit-docs.ts @@ -139,9 +139,15 @@ async function main() { async function setOptions() { const optionsService = (await import("@triliumnext/server/src/services/options.js")).default; + const sql = (await import("@triliumnext/server/src/services/sql.js")).default; + optionsService.setOption("eraseUnusedAttachmentsAfterSeconds", 10); optionsService.setOption("eraseUnusedAttachmentsAfterTimeScale", 60); optionsService.setOption("compressImages", "false"); + + // Set initial note to the first visible child of root (not _hidden) + const startNoteId = sql.getValue("SELECT noteId FROM branches WHERE parentNoteId = 'root' AND isDeleted = 0 AND noteId != '_hidden' ORDER BY notePosition") || "root"; + optionsService.setOption("openNoteContexts", JSON.stringify([{ notePath: startNoteId, active: true }])); } async function exportData(noteId: string, format: ExportFormat, outputPath: string, ignoredFiles?: Set) { diff --git a/apps/edit-docs/src/utils.ts b/apps/edit-docs/src/utils.ts index 833028dd77..96c6c906bd 100644 --- a/apps/edit-docs/src/utils.ts +++ b/apps/edit-docs/src/utils.ts @@ -103,6 +103,14 @@ function waitForEnd(archive: Archiver, stream: WriteStream) { }); } +export async function createZipFromDirectory(dirPath: string, zipPath: string) { + const archive = archiver("zip", { zlib: { level: 5 } }); + const outputStream = fsExtra.createWriteStream(zipPath); + archive.directory(dirPath, false); + archive.pipe(outputStream); + await waitForEnd(archive, outputStream); +} + export async function extractZip(zipFilePath: string, outputPath: string, ignoredFiles?: Set) { const promise = deferred(); setTimeout(async () => { diff --git a/apps/server/package.json b/apps/server/package.json index 6f3741ad8e..91d9a3b6bc 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -30,11 +30,11 @@ "proxy-nginx-subdir": "docker run --name trilium-nginx-subdir --rm --network=host -v ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro nginx:latest" }, "dependencies": { - "@ai-sdk/anthropic": "3.0.66", - "@ai-sdk/google": "3.0.58", - "@ai-sdk/openai": "3.0.50", + "@ai-sdk/anthropic": "3.0.68", + "@ai-sdk/google": "3.0.60", + "@ai-sdk/openai": "3.0.52", "@modelcontextprotocol/sdk": "^1.12.1", - "ai": "6.0.146", + "ai": "6.0.153", "better-sqlite3": "12.8.0", "html-to-text": "9.0.5", "i18next-fs-backend": "2.6.3", @@ -73,7 +73,6 @@ "@types/ws": "8.18.1", "@types/xml2js": "0.4.14", "archiver": "7.0.1", - "axios": "1.14.0", "cheerio": "1.2.0", "chokidar": "5.0.0", "cls-hooked": "4.2.2", @@ -101,8 +100,8 @@ "ini": "6.0.0", "is-animated": "2.0.2", "is-svg": "6.1.0", - "jimp": "1.6.0", - "marked": "17.0.5", + "jimp": "1.6.1", + "marked": "18.0.0", "multer": "2.1.1", "normalize-strings": "1.1.1", "officeparser": "6.0.7", @@ -117,7 +116,7 @@ "time2fa": "1.4.2", "tmp": "0.2.5", "turnish": "1.8.0", - "vite": "8.0.5", + "vite": "8.0.7", "xml2js": "0.6.2", "yauzl": "3.3.0" } diff --git a/apps/server/scripts/build-server.sh b/apps/server/scripts/build-server.sh index d828f65e18..c140e18d1a 100644 --- a/apps/server/scripts/build-server.sh +++ b/apps/server/scripts/build-server.sh @@ -51,7 +51,8 @@ VERSION=`jq -r ".version" package.json` ARCHIVE_NAME="TriliumNotes-Server-${VERSION}-linux-${ARCH}" echo "Creating Archive $ARCHIVE_NAME..." -mkdir $DIST_DIR +rm -rf $DIST_DIR +mkdir -p $DIST_DIR cp -r "$BUILD_DIR" "$DIST_DIR/$ARCHIVE_NAME" cd $DIST_DIR tar cJf "$ARCHIVE_NAME.tar.xz" "$ARCHIVE_NAME" diff --git a/apps/server/src/assets/db/demo.zip b/apps/server/src/assets/db/demo.zip index c84c99383a..bbfca9feeb 100644 Binary files a/apps/server/src/assets/db/demo.zip and b/apps/server/src/assets/db/demo.zip differ diff --git a/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json b/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json index 5a36135f56..65558c848b 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json +++ b/apps/server/src/assets/doc_notes/en/User Guide/!!!meta.json @@ -1 +1 @@ -[{"id":"_help_BOCnjTMBCoxW","title":"Feature Highlights","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Feature Highlights"},{"name":"iconClass","value":"bx bx-star","type":"label"}]},{"id":"_help_Otzi9La2YAUX","title":"Installation & Setup","type":"book","attributes":[{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_poXkQfguuA0U","title":"Desktop Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation"},{"name":"iconClass","value":"bx bx-desktop","type":"label"}],"children":[{"id":"_help_nRqcgfTb97uV","title":"Using the desktop application as a server","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application "},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_Rp0q8bSP6Ayl","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]},{"id":"_help_Un4wj2Mak2Ky","title":"Nix flake","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]}]},{"id":"_help_WOcw2SLH6tbX","title":"Server Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation"},{"name":"iconClass","value":"bx bx-server","type":"label"}],"children":[{"id":"_help_Dgg7bR3b6K9j","title":"1. Installing the server","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_3tW6mORuTHnB","title":"Packaged version for Linux","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_rWX5eY045zbE","title":"Using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker"},{"name":"iconClass","value":"bx bxl-docker","type":"label"}]},{"id":"_help_moVgBcoxE3EK","title":"On NixOS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_J1Bb6lVlwU5T","title":"Manually","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]},{"id":"_help_DCmT6e7clMoP","title":"Using Kubernetes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes"},{"name":"iconClass","value":"bx bxl-kubernetes","type":"label"}]},{"id":"_help_klCWNks3ReaQ","title":"Multiple server instances","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances"},{"name":"iconClass","value":"bx bxs-user-account","type":"label"}]}]},{"id":"_help_vcjrb3VVYPZI","title":"2. Reverse proxy","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_ud6MShXL4WpO","title":"Nginx","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_fDLvzOx29Pfg","title":"Apache using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_LLzSMXACKhUs","title":"Trusted proxy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_5ERVJb9s4FRD","title":"Traefik","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_l2VkvOwUNfZj","title":"HTTPS (TLS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS)"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_0hzsNCP31IAB","title":"Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Authentication"},{"name":"iconClass","value":"bx bx-user","type":"label"}]},{"id":"_help_7DAiwaf8Z7Rz","title":"Multi-Factor Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication"},{"name":"iconClass","value":"bx bx-stopwatch","type":"label"}]},{"id":"_help_Un4wj2Mak2Ky","title":"Nix flake","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_yeEaYqosGLSh","title":"Third-party cloud hosting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting"},{"name":"iconClass","value":"bx bx-cloud","type":"label"}]},{"id":"_help_iGTnKjubbXkA","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]}]},{"id":"_help_cbkrhQjrkKrh","title":"Synchronization","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Synchronization"},{"name":"iconClass","value":"bx bx-sync","type":"label"}]},{"id":"_help_RDslemsQ6gCp","title":"Mobile Frontend","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Mobile Frontend"},{"name":"iconClass","value":"bx bx-mobile-alt","type":"label"}]},{"id":"_help_MtPxeAWVAzMg","title":"Web Clipper","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Web Clipper"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_n1lujUxCwipy","title":"Upgrading TriliumNext","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext"},{"name":"iconClass","value":"bx bx-up-arrow-alt","type":"label"}]},{"id":"_help_ODY7qQn5m2FT","title":"Backup","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Backup"},{"name":"iconClass","value":"bx bx-hdd","type":"label"}]},{"id":"_help_tAassRL4RSQL","title":"Data directory","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Data directory"},{"name":"iconClass","value":"bx bx-folder-open","type":"label"}]}]},{"id":"_help_gh7bpGYxajRS","title":"Basic Concepts and Features","type":"book","attributes":[{"name":"iconClass","value":"bx bx-help-circle","type":"label"}],"children":[{"id":"_help_Vc8PjrjAGuOp","title":"UI Elements","type":"book","attributes":[{"name":"iconClass","value":"bx bx-window-alt","type":"label"}],"children":[{"id":"_help_x0JgW8UqGXvq","title":"Vertical and horizontal layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout"},{"name":"iconClass","value":"bx bxs-layout","type":"label"}]},{"id":"_help_x3i7MxGccDuM","title":"Global menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_oPVyFC7WL2Lp","title":"Note Tree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree"},{"name":"iconClass","value":"bx bxs-tree-alt","type":"label"}],"children":[{"id":"_help_YtSN43OrfzaA","title":"Note tree contextual menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_yTjUdsOi4CIE","title":"Multiple selection","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_DvdZhoQZY9Yd","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_wyaGBBQrl4i3","title":"Hiding the subtree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Hiding the subtree"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]}]},{"id":"_help_BlN9DFI679QC","title":"Ribbon","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon"},{"name":"iconClass","value":"bx bx-dots-horizontal","type":"label"}]},{"id":"_help_3seOhtN8uLIY","title":"Tabs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs"},{"name":"iconClass","value":"bx bx-dock-top","type":"label"}]},{"id":"_help_xYmIYSP6wE3F","title":"Launch Bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar"},{"name":"iconClass","value":"bx bx-sidebar","type":"label"}]},{"id":"_help_8YBEPzcpUgxw","title":"Note buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons"},{"name":"iconClass","value":"bx bx-dots-vertical-rounded","type":"label"}]},{"id":"_help_4TIF1oA4VQRO","title":"Options","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]},{"id":"_help_luNhaphA37EO","title":"Split View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View"},{"name":"iconClass","value":"bx bx-dock-right","type":"label"}]},{"id":"_help_XpOYSgsLkTJy","title":"Floating buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons"},{"name":"iconClass","value":"bx bx-rectangle","type":"label"}]},{"id":"_help_RnaPdbciOfeq","title":"Right Sidebar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar"},{"name":"iconClass","value":"bx bxs-dock-right","type":"label"}]},{"id":"_help_r5JGHN99bVKn","title":"Recent Changes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_ny318J39E5Z0","title":"Zoom","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom"},{"name":"iconClass","value":"bx bx-zoom-in","type":"label"}]},{"id":"_help_lgKX7r3aL30x","title":"Note Tooltip","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip"},{"name":"iconClass","value":"bx bx-message-detail","type":"label"}]},{"id":"_help_IjZS7iK5EXtb","title":"New Layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/New Layout"},{"name":"iconClass","value":"bx bx-layout","type":"label"}],"children":[{"id":"_help_I6p2a06hdnL6","title":"Breadcrumb","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/New Layout/Breadcrumb"},{"name":"iconClass","value":"bx bx-chevron-right","type":"label"}]},{"id":"_help_AlJ73vBCjWDw","title":"Status bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/New Layout/Status bar"},{"name":"iconClass","value":"bx bx-dock-bottom","type":"label"}]}]}]},{"id":"_help_BFs8mudNFgCS","title":"Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes"},{"name":"iconClass","value":"bx bx-notepad","type":"label"}],"children":[{"id":"_help_p9kXRFAkwN4o","title":"Note Icons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_0vhv7lsOLy82","title":"Attachments","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_IakOLONlIfGI","title":"Cloning Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes"},{"name":"iconClass","value":"bx bx-duplicate","type":"label"}],"children":[{"id":"_help_TBwsyfadTA18","title":"Branch prefix","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix"},{"name":"iconClass","value":"bx bx-rename","type":"label"}]}]},{"id":"_help_bwg0e8ewQMak","title":"Protected Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_MKmLg5x6xkor","title":"Archived Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes"},{"name":"iconClass","value":"bx bx-box","type":"label"}]},{"id":"_help_vZWERwf8U3nx","title":"Note Revisions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_aGlEvb9hyDhS","title":"Sorting Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes"},{"name":"iconClass","value":"bx bx-sort-up","type":"label"}]},{"id":"_help_NRnIZmSMc5sj","title":"Printing & Exporting as PDF","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF"},{"name":"iconClass","value":"bx bx-printer","type":"label"}]},{"id":"_help_CoFPLs3dRlXc","title":"Read-Only Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_0ESUbbAxVnoK","title":"Note List","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note List"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]}]},{"id":"_help_wArbEsdSae6g","title":"Navigation","type":"book","attributes":[{"name":"iconClass","value":"bx bx-navigation","type":"label"}],"children":[{"id":"_help_kBrnXNG3Hplm","title":"Tree Concepts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}]},{"id":"_help_MMiBEQljMQh2","title":"Note Navigation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation"},{"name":"iconClass","value":"bx bxs-navigation","type":"label"}]},{"id":"_help_Ms1nauBra7gq","title":"Quick search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_F1r9QtzQLZqm","title":"Jump to...","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to"},{"name":"iconClass","value":"bx bx-send","type":"label"}]},{"id":"_help_eIg8jdvaoNNd","title":"Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_u3YFHC9tQlpm","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmarks","type":"label"}]},{"id":"_help_OR8WJ7Iz9K4U","title":"Note Hoisting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting"},{"name":"iconClass","value":"bx bxs-chevrons-up","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick edit"},{"name":"iconClass","value":"bx bx-edit","type":"label"}]},{"id":"_help_9sRHySam5fXb","title":"Workspaces","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces"},{"name":"iconClass","value":"bx bx-door-open","type":"label"}]},{"id":"_help_xWtq5NUHOwql","title":"Similar Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes"},{"name":"iconClass","value":"bx bx-bar-chart","type":"label"}]},{"id":"_help_McngOG2jbUWX","title":"Search in note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]}]},{"id":"_help_A9Oc6YKKc65v","title":"Keyboard Shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_Wy267RK4M69c","title":"Themes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes"},{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_VbjZvtUek0Ln","title":"Theme Gallery","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]},{"id":"_help_gOKqSJgXLcIj","title":"Icon Packs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Icon Packs"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_mHbBMPDPkVV5","title":"Import & Export","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export"},{"name":"iconClass","value":"bx bx-import","type":"label"}],"children":[{"id":"_help_Oau6X9rCuegd","title":"Markdown","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}],"children":[{"id":"_help_rJ9grSgoExl9","title":"Supported syntax","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown/Supported syntax"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]}]},{"id":"_help_syuSEKf2rUGr","title":"Evernote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}],"children":[{"id":"_help_dj3j8dG4th4l","title":"Process internal links by title","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GnhlmrATVqcH","title":"OneNote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}]}]},{"id":"_help_rC3pL2aptaRE","title":"Zen mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Zen mode"},{"name":"iconClass","value":"bx bxs-yin-yang","type":"label"}]},{"id":"_help_YzMcWlCVeW09","title":"Active content","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Active content"},{"name":"iconClass","value":"bx bxs-widget","type":"label"}]}]},{"id":"_help_s3YCWHBfmYuM","title":"Quick Start","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Quick Start"},{"name":"iconClass","value":"bx bx-run","type":"label"}]},{"id":"_help_i6dbnitykE5D","title":"FAQ","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/FAQ"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_KSZ04uQ2D1St","title":"Note Types","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types"},{"name":"iconClass","value":"bx bx-edit","type":"label"}],"children":[{"id":"_help_iPIMuisry3hd","title":"Text","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text"},{"name":"iconClass","value":"bx bx-note","type":"label"}],"children":[{"id":"_help_NwBbFdNZ9h7O","title":"Block quotes & admonitions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Block quotes & admonitions"},{"name":"iconClass","value":"bx bx-info-circle","type":"label"}]},{"id":"_help_oSuaNgyyKnhu","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmark","type":"label"}]},{"id":"_help_veGu4faJErEM","title":"Content language & Right-to-left support","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Content language & Right-to-le"},{"name":"iconClass","value":"bx bx-align-right","type":"label"}]},{"id":"_help_2x0ZAX9ePtzV","title":"Cut to subnote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Cut to subnote"},{"name":"iconClass","value":"bx bx-cut","type":"label"}]},{"id":"_help_UYuUB1ZekNQU","title":"Developer-specific formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_QxEyIjRBizuC","title":"Code blocks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks"},{"name":"iconClass","value":"bx bx-code","type":"label"}]}]},{"id":"_help_AgjCISero73a","title":"Footnotes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Footnotes"},{"name":"iconClass","value":"bx bx-bracket","type":"label"}]},{"id":"_help_nRhnJkTT8cPs","title":"Formatting toolbar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Formatting toolbar"},{"name":"iconClass","value":"bx bx-text","type":"label"}]},{"id":"_help_Gr6xFaF6ioJ5","title":"General formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/General formatting"},{"name":"iconClass","value":"bx bx-bold","type":"label"}]},{"id":"_help_AxshuNRegLAv","title":"Highlights list","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Highlights list"},{"name":"iconClass","value":"bx bx-highlight","type":"label"}]},{"id":"_help_mT0HEkOsz6i1","title":"Images","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images"},{"name":"iconClass","value":"bx bx-image-alt","type":"label"}],"children":[{"id":"_help_0Ofbk1aSuVRu","title":"Image references","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images/Image references"},{"name":"iconClass","value":"bx bxs-file-image","type":"label"}]}]},{"id":"_help_nBAXQFj20hS1","title":"Include Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Include Note"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_CohkqWQC1iBv","title":"Insert buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Insert buttons"},{"name":"iconClass","value":"bx bx-plus","type":"label"}]},{"id":"_help_oiVPnW8QfnvS","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_QEAPj01N5f7w","title":"Links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links"},{"name":"iconClass","value":"bx bx-link-alt","type":"label"}],"children":[{"id":"_help_3IDVtesTQ8ds","title":"External links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/External links"},{"name":"iconClass","value":"bx bx-link-external","type":"label"}]},{"id":"_help_hrZ1D00cLbal","title":"Internal (reference) links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/Internal (reference) links"},{"name":"iconClass","value":"bx bx-link","type":"label"}]}]},{"id":"_help_S6Xx8QIWTV66","title":"Lists","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Lists"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_QrtTYPmdd1qq","title":"Markdown-like formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Markdown-like formatting"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}]},{"id":"_help_YfYAtQBcfo5V","title":"Math Equations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Math Equations"},{"name":"iconClass","value":"bx bx-math","type":"label"}]},{"id":"_help_dEHYtoWWi8ct","title":"Other features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Other features"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_gLt3vA97tMcp","title":"Premium features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features"},{"name":"iconClass","value":"bx bx-star","type":"label"}],"children":[{"id":"_help_ZlN4nump6EbW","title":"Slash Commands","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Slash Commands"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_pwc194wlRzcH","title":"Text Snippets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Text Snippets"},{"name":"iconClass","value":"bx bx-align-left","type":"label"}]},{"id":"_help_5wZallV2Qo1t","title":"Format Painter","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Format Painter"},{"name":"iconClass","value":"bx bxs-paint-roll","type":"label"}]}]},{"id":"_help_oBo3iHIZnbG2","title":"Spell Check","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Spell Check"},{"name":"iconClass","value":"bx bx-check-double","type":"label"}]},{"id":"_help_BFvAtE74rbP6","title":"Table of contents","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Table of contents"},{"name":"iconClass","value":"bx bx-heading","type":"label"}]},{"id":"_help_NdowYOC1GFKS","title":"Tables","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Tables"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_6f9hih2hXXZk","title":"Code","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Code"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_m523cpzocqaD","title":"Saved Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Saved Search"},{"name":"iconClass","value":"bx bx-file-find","type":"label"}]},{"id":"_help_iRwzGnHPzonm","title":"Relation Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Relation Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_bdUJEHsAPYQR","title":"Note Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Note Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_HcABDtFCkbFN","title":"Render Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Render Note"},{"name":"iconClass","value":"bx bx-extension","type":"label"}]},{"id":"_help_s1aBHPd79XYj","title":"Mermaid Diagrams","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams"},{"name":"iconClass","value":"bx bx-selection","type":"label"}],"children":[{"id":"_help_RH6yLjjWJHof","title":"ELK layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_WWgeUaBb7UfC","title":"Syntax reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://mermaid.js.org/intro/syntax-reference.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_grjYqerjn243","title":"Canvas","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Canvas"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_1vHRoWCEjj0L","title":"Web View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Web View"},{"name":"iconClass","value":"bx bx-globe-alt","type":"label"}]},{"id":"_help_gBbsAeiuUxI5","title":"Mind Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mind Map"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_W8vYD3Q1zjCR","title":"File","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File"},{"name":"iconClass","value":"bx bx-file-blank","type":"label"}],"children":[{"id":"_help_XJGJrpu7F9sh","title":"PDFs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File/PDFs"},{"name":"iconClass","value":"bx bxs-file-pdf","type":"label"}]},{"id":"_help_AjqEeiDUOzj4","title":"Videos","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File/Videos"},{"name":"iconClass","value":"bx bx-video","type":"label"}]}]},{"id":"_help_GWHEkY4I4OE3","title":"Spreadsheets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Spreadsheets"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Calendar"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Table"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Kanban Board","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Kanban Board"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Geo Map"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_zP3PMqaG71Ct","title":"Presentation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Presentation"},{"name":"iconClass","value":"bx bx-slideshow","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Grid View"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_mULW0Q3VojwY","title":"List View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_CssoWBu8I7jF","title":"Collection Properties","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Collection Properties"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]}]},{"id":"_help_BgmBlOIl72jZ","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting"},{"name":"iconClass","value":"bx bx-bug","type":"label"}],"children":[{"id":"_help_wy8So3yZZlH9","title":"Reporting issues","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Reporting issues"},{"name":"iconClass","value":"bx bx-bug-alt","type":"label"}]},{"id":"_help_x59R8J8KV5Bp","title":"Anonymized Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Anonymized Database"},{"name":"iconClass","value":"bx bx-low-vision","type":"label"}]},{"id":"_help_qzNzp9LYQyPT","title":"Error logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs"},{"name":"iconClass","value":"bx bx-comment-error","type":"label"}],"children":[{"id":"_help_bnyigUA2UK7s","title":"Backend (server) logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Backend (server) logs"},{"name":"iconClass","value":"bx bx-server","type":"label"}]},{"id":"_help_9yEHzMyFirZR","title":"Frontend logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Frontend logs"},{"name":"iconClass","value":"bx bx-window-alt","type":"label"}]}]},{"id":"_help_vdlYGAcpXAgc","title":"Synchronization fails with 504 Gateway Timeout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Synchronization fails with 504"},{"name":"iconClass","value":"bx bx-error","type":"label"}]},{"id":"_help_s8alTXmpFR61","title":"Refreshing the application","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Refreshing the application"},{"name":"iconClass","value":"bx bx-refresh","type":"label"}]}]},{"id":"_help_pKK96zzmvBGf","title":"Theme development","type":"book","attributes":[{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_7NfNr5pZpVKV","title":"Creating a custom theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating a custom theme"},{"name":"iconClass","value":"bx bxs-color","type":"label"}]},{"id":"_help_WFGzWeUK6arS","title":"Customize the Next theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Customize the Next theme"},{"name":"iconClass","value":"bx bx-news","type":"label"}]},{"id":"_help_WN5z4M8ASACJ","title":"Reference","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Reference"},{"name":"iconClass","value":"bx bx-book-open","type":"label"}]},{"id":"_help_AlhDUqhENtH7","title":"Custom app-wide CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Custom app-wide CSS"},{"name":"iconClass","value":"bx bxs-file-css","type":"label"}]},{"id":"_help_g1mlRoU8CsqC","title":"Creating an icon pack","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating an icon pack"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_tC7s2alapj8V","title":"Advanced Usage","type":"book","attributes":[{"name":"iconClass","value":"bx bx-rocket","type":"label"}],"children":[{"id":"_help_zEY4DaJG4YT5","title":"Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes"},{"name":"iconClass","value":"bx bx-list-check","type":"label"}],"children":[{"id":"_help_HI6GBBIduIgv","title":"Labels","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Labels"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_Cq5X6iKQop6R","title":"Relations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Relations"},{"name":"iconClass","value":"bx bx-transfer","type":"label"}]},{"id":"_help_bwZpz2ajCEwO","title":"Attribute Inheritance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_OFXdgB2nNk1F","title":"Promoted Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_KC1HB96bqqHX","title":"Templates","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Templates"},{"name":"iconClass","value":"bx bx-copy","type":"label"}]},{"id":"_help_BCkXAVs63Ttv","title":"Note Map (Link map, Tree map)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map)"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_R9pX4DGra2Vt","title":"Sharing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing"},{"name":"iconClass","value":"bx bx-share-alt","type":"label"}],"children":[{"id":"_help_Qjt68inQ2bRj","title":"Serving directly the content of a note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_ycBFjKrrwE9p","title":"Exporting static HTML for web publishing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Exporting static HTML for web "},{"name":"iconClass","value":"bx bxs-file-html","type":"label"}]},{"id":"_help_sLIJ6f1dkJYW","title":"Reverse proxy configuration","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration"},{"name":"iconClass","value":"bx bx-world","type":"label"}]}]},{"id":"_help_5668rwcirq1t","title":"Advanced Showcases","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_l0tKav7yLHGF","title":"Day Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_R7abl2fc6Mxi","title":"Weight Tracker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker"},{"name":"iconClass","value":"bx bx-line-chart","type":"label"}]},{"id":"_help_xYjQUYhpbUEW","title":"Task Manager","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager"},{"name":"iconClass","value":"bx bx-calendar-check","type":"label"}]}]},{"id":"_help_J5Ex1ZrMbyJ6","title":"Custom Request Handler","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Request Handler"},{"name":"iconClass","value":"bx bx-globe","type":"label"}]},{"id":"_help_d3fAXQ2diepH","title":"Custom Resource Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Resource Providers"},{"name":"iconClass","value":"bx bxs-file-plus","type":"label"}]},{"id":"_help_pgxEVkzLl1OP","title":"ETAPI (REST API)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/ETAPI (REST API)"},{"name":"iconClass","value":"bx bx-extension","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/etapi/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_47ZrP6FNuoG8","title":"Default Note Title","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Default Note Title"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_wX4HbRucYSDD","title":"Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database"},{"name":"iconClass","value":"bx bx-data","type":"label"}],"children":[{"id":"_help_oyIAJ9PvvwHX","title":"Manually altering the database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database"},{"name":"iconClass","value":"bx bxs-edit","type":"label"}],"children":[{"id":"_help_YKWqdJhzi2VY","title":"SQL Console","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console"},{"name":"iconClass","value":"bx bx-data","type":"label"}]}]},{"id":"_help_6tZeKvSHEUiB","title":"Demo Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Demo Notes"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_Gzjqa934BdH4","title":"Configuration (config.ini or environment variables)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e"},{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_c5xB8m4g2IY6","title":"Trilium instance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance"},{"name":"iconClass","value":"bx bx-windows","type":"label"}]},{"id":"_help_LWtBjFej3wX3","title":"Cross-Origin Resource Sharing (CORS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing "},{"name":"iconClass","value":"bx bx-lock","type":"label"}]}]},{"id":"_help_ivYnonVFBxbQ","title":"Bulk Actions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Bulk Actions"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_4FahAwuGTAwC","title":"Note source","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note source"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_1YeN2MzFUluU","title":"Technologies used","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}],"children":[{"id":"_help_MI26XDLSAlCD","title":"CKEditor","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_N4IDkixaDG9C","title":"MindElixir","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_H0mM1lTxF9JI","title":"Excalidraw","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_MQHyy2dIFgxS","title":"Leaflet","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]}]},{"id":"_help_m1lbrzyKDaRB","title":"Note ID","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note ID"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_0vTSyvhPTAOz","title":"Internal API","type":"book","attributes":[{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/internal/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_2mUhVmZK8RF3","title":"Hidden Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Hidden Notes"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]},{"id":"_help_uYF7pmepw27K","title":"Metrics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Metrics"},{"name":"iconClass","value":"bx bxs-data","type":"label"}],"children":[{"id":"_help_bOP3TB56fL1V","title":"grafana-dashboard.json","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_64ZTlUPgEPtW","title":"Safe mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Safe mode"},{"name":"iconClass","value":"bx bxs-virus-block","type":"label"}]},{"id":"_help_HAIOFBoYIIdO","title":"Nightly release","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Nightly release"},{"name":"iconClass","value":"bx bx-moon","type":"label"}]},{"id":"_help_ZmT9ln8XJX2o","title":"Read-only database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Read-only database"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]}]},{"id":"_help_GBBMSlVSOIGP","title":"AI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI"},{"name":"iconClass","value":"bx bx-bot","type":"label"}]},{"id":"_help_CdNpE2pqjmI6","title":"Scripting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting"},{"name":"iconClass","value":"bx bxs-file-js","type":"label"}],"children":[{"id":"_help_yIhgI5H7A2Sm","title":"Frontend Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics"},{"name":"iconClass","value":"bx bx-window","type":"label"}],"children":[{"id":"_help_MgibgPcfeuGz","title":"Custom Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets"},{"name":"iconClass","value":"bx bxs-widget","type":"label"}],"children":[{"id":"_help_SynTBQiBsdYJ","title":"Widget Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_GhurYZjh8e1V","title":"Note context aware widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Note context aware widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_M8IppdwVHSjG","title":"Right pane widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_YNxAqkI5Kg1M","title":"Word count widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_VqGQnnPGnqAU","title":"CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_gMkgcLJ6jBkg","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Troubleshooting"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_TjLYAo3JMO8X","title":"\"New Task\" launcher button","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button"},{"name":"iconClass","value":"bx bx-task","type":"label"}]},{"id":"_help_7kZPMD0uFwkH","title":"Downloading responses from Google Forms","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/Downloading responses from Goo"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_DL92EjAaXT26","title":"Using promoted attributes to configure scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_4Gn3psZKsfSm","title":"Launch Bar Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets"},{"name":"iconClass","value":"bx bx-dock-left","type":"label"}],"children":[{"id":"_help_IPArqVfDQ4We","title":"Note Title Widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Note Title Widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_gcI7RPbaNSh3","title":"Analog Watch","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Analog Watch"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_KLsqhjaqh1QW","title":"Preact","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact"},{"name":"iconClass","value":"bx bxl-react","type":"label"}],"children":[{"id":"_help_Bqde6BvPo05g","title":"Component libraries","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/Component libraries"},{"name":"iconClass","value":"bx bxs-component","type":"label"}]},{"id":"_help_ykYtbM9k3a7B","title":"Hooks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/Hooks"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_Sg9GrCtyftZf","title":"CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/CSS"},{"name":"iconClass","value":"bx bxs-file-css","type":"label"}]},{"id":"_help_RSssb9S3xgSr","title":"Built-in components","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/Built-in components"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_i9B4IW7b6V6z","title":"Widget showcase","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]}]},{"id":"_help_SPirpZypehBG","title":"Backend scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts"},{"name":"iconClass","value":"bx bx-server","type":"label"}],"children":[{"id":"_help_fZ2IGYFXjkEy","title":"Server-side imports","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts/Server-side imports"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_GPERMystNGTB","title":"Events","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts/Events"},{"name":"iconClass","value":"bx bx-rss","type":"label"}]}]},{"id":"_help_wqXwKJl6VpNk","title":"Common concepts","type":"book","attributes":[{"name":"iconClass","value":"bx bxl-nodejs","type":"label"}],"children":[{"id":"_help_hA834UaHhSNn","title":"Script bundles","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Common concepts/Script bundles"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_GLks18SNjxmC","title":"Script API","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API"},{"name":"iconClass","value":"bx bx-code-curly","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"enforceAttributes":true,"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend/interfaces/FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/backend"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true},{"id":"_help_ApVHZ8JY5ofC","title":"Day.js","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API/Day.js"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]}]},{"id":"_help_vElnKeDNPSVl","title":"Logging","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Logging"},{"name":"iconClass","value":"bx bx-terminal","type":"label"}]},{"id":"_help_cNpC0ITcfX0N","title":"Breaking changes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Breaking changes"},{"name":"iconClass","value":"bx bx-up-arrow-alt","type":"label"}]}]},{"id":"_help_Fm0j45KqyHpU","title":"Miscellaneous","type":"book","attributes":[{"name":"iconClass","value":"bx bx-info-circle","type":"label"}],"children":[{"id":"_help_WFbFXrgnDyyU","title":"Privacy Policy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Privacy Policy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_NcsmUYZRWEW4","title":"Patterns of personal knowledge","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Patterns of personal knowledge"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}] \ No newline at end of file +[{"id":"_help_BOCnjTMBCoxW","title":"Feature Highlights","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Feature Highlights"},{"name":"iconClass","value":"bx bx-star","type":"label"}]},{"id":"_help_Otzi9La2YAUX","title":"Installation & Setup","type":"book","attributes":[{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_poXkQfguuA0U","title":"Desktop Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation"},{"name":"iconClass","value":"bx bx-desktop","type":"label"}],"children":[{"id":"_help_nRqcgfTb97uV","title":"Using the desktop application as a server","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Using the desktop application "},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_Rp0q8bSP6Ayl","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]},{"id":"_help_Un4wj2Mak2Ky","title":"Nix flake","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Desktop Installation/Nix flake"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]}]},{"id":"_help_WOcw2SLH6tbX","title":"Server Installation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation"},{"name":"iconClass","value":"bx bx-server","type":"label"}],"children":[{"id":"_help_Dgg7bR3b6K9j","title":"1. Installing the server","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_3tW6mORuTHnB","title":"Packaged version for Linux","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Packaged version for Linux"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_rWX5eY045zbE","title":"Using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Docker"},{"name":"iconClass","value":"bx bxl-docker","type":"label"}]},{"id":"_help_moVgBcoxE3EK","title":"On NixOS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/On NixOS"},{"name":"iconClass","value":"bx bxl-tux","type":"label"}]},{"id":"_help_J1Bb6lVlwU5T","title":"Manually","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Manually"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]},{"id":"_help_DCmT6e7clMoP","title":"Using Kubernetes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Using Kubernetes"},{"name":"iconClass","value":"bx bxl-kubernetes","type":"label"}]},{"id":"_help_klCWNks3ReaQ","title":"Multiple server instances","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/1. Installing the server/Multiple server instances"},{"name":"iconClass","value":"bx bxs-user-account","type":"label"}]}]},{"id":"_help_vcjrb3VVYPZI","title":"2. Reverse proxy","type":"book","attributes":[{"name":"iconClass","value":"bx bx-folder","type":"label"}],"children":[{"id":"_help_ud6MShXL4WpO","title":"Nginx","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Nginx"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_fDLvzOx29Pfg","title":"Apache using Docker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Apache using Docker"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_LLzSMXACKhUs","title":"Trusted proxy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Trusted proxy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_5ERVJb9s4FRD","title":"Traefik","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/2. Reverse proxy/Traefik"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_l2VkvOwUNfZj","title":"HTTPS (TLS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/HTTPS (TLS)"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_0hzsNCP31IAB","title":"Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Authentication"},{"name":"iconClass","value":"bx bx-user","type":"label"}]},{"id":"_help_7DAiwaf8Z7Rz","title":"Multi-Factor Authentication","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Multi-Factor Authentication"},{"name":"iconClass","value":"bx bx-stopwatch","type":"label"}]},{"id":"_help_Un4wj2Mak2Ky","title":"Nix flake","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Nix flake.clone"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_yeEaYqosGLSh","title":"Third-party cloud hosting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/Third-party cloud hosting"},{"name":"iconClass","value":"bx bx-cloud","type":"label"}]},{"id":"_help_iGTnKjubbXkA","title":"System Requirements","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Server Installation/System Requirements"},{"name":"iconClass","value":"bx bx-chip","type":"label"}]}]},{"id":"_help_cbkrhQjrkKrh","title":"Synchronization","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Synchronization"},{"name":"iconClass","value":"bx bx-sync","type":"label"}]},{"id":"_help_RDslemsQ6gCp","title":"Mobile Frontend","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Mobile Frontend"},{"name":"iconClass","value":"bx bx-mobile-alt","type":"label"}]},{"id":"_help_MtPxeAWVAzMg","title":"Web Clipper","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Web Clipper"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_n1lujUxCwipy","title":"Upgrading TriliumNext","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Upgrading TriliumNext"},{"name":"iconClass","value":"bx bx-up-arrow-alt","type":"label"}]},{"id":"_help_ODY7qQn5m2FT","title":"Backup","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Backup"},{"name":"iconClass","value":"bx bx-hdd","type":"label"}]},{"id":"_help_tAassRL4RSQL","title":"Data directory","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Installation & Setup/Data directory"},{"name":"iconClass","value":"bx bx-folder-open","type":"label"}]}]},{"id":"_help_gh7bpGYxajRS","title":"Basic Concepts and Features","type":"book","attributes":[{"name":"iconClass","value":"bx bx-help-circle","type":"label"}],"children":[{"id":"_help_Vc8PjrjAGuOp","title":"UI Elements","type":"book","attributes":[{"name":"iconClass","value":"bx bx-window-alt","type":"label"}],"children":[{"id":"_help_x0JgW8UqGXvq","title":"Vertical and horizontal layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Vertical and horizontal layout"},{"name":"iconClass","value":"bx bxs-layout","type":"label"}]},{"id":"_help_x3i7MxGccDuM","title":"Global menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Global menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_oPVyFC7WL2Lp","title":"Note Tree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree"},{"name":"iconClass","value":"bx bxs-tree-alt","type":"label"}],"children":[{"id":"_help_YtSN43OrfzaA","title":"Note tree contextual menu","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Note tree contextual menu"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_yTjUdsOi4CIE","title":"Multiple selection","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Multiple selection"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_DvdZhoQZY9Yd","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_wyaGBBQrl4i3","title":"Hiding the subtree","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tree/Hiding the subtree"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]}]},{"id":"_help_BlN9DFI679QC","title":"Ribbon","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Ribbon"},{"name":"iconClass","value":"bx bx-dots-horizontal","type":"label"}]},{"id":"_help_3seOhtN8uLIY","title":"Tabs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Tabs"},{"name":"iconClass","value":"bx bx-dock-top","type":"label"}]},{"id":"_help_xYmIYSP6wE3F","title":"Launch Bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Launch Bar"},{"name":"iconClass","value":"bx bx-sidebar","type":"label"}]},{"id":"_help_8YBEPzcpUgxw","title":"Note buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note buttons"},{"name":"iconClass","value":"bx bx-dots-vertical-rounded","type":"label"}]},{"id":"_help_4TIF1oA4VQRO","title":"Options","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Options"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]},{"id":"_help_luNhaphA37EO","title":"Split View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Split View"},{"name":"iconClass","value":"bx bx-dock-right","type":"label"}]},{"id":"_help_XpOYSgsLkTJy","title":"Floating buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Floating buttons"},{"name":"iconClass","value":"bx bx-rectangle","type":"label"}]},{"id":"_help_RnaPdbciOfeq","title":"Right Sidebar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Right Sidebar"},{"name":"iconClass","value":"bx bxs-dock-right","type":"label"}]},{"id":"_help_r5JGHN99bVKn","title":"Recent Changes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Recent Changes"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_ny318J39E5Z0","title":"Zoom","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Zoom"},{"name":"iconClass","value":"bx bx-zoom-in","type":"label"}]},{"id":"_help_lgKX7r3aL30x","title":"Note Tooltip","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/Note Tooltip"},{"name":"iconClass","value":"bx bx-message-detail","type":"label"}]},{"id":"_help_IjZS7iK5EXtb","title":"New Layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/New Layout"},{"name":"iconClass","value":"bx bx-layout","type":"label"}],"children":[{"id":"_help_I6p2a06hdnL6","title":"Breadcrumb","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/New Layout/Breadcrumb"},{"name":"iconClass","value":"bx bx-chevron-right","type":"label"}]},{"id":"_help_AlJ73vBCjWDw","title":"Status bar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/UI Elements/New Layout/Status bar"},{"name":"iconClass","value":"bx bx-dock-bottom","type":"label"}]}]}]},{"id":"_help_BFs8mudNFgCS","title":"Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes"},{"name":"iconClass","value":"bx bx-notepad","type":"label"}],"children":[{"id":"_help_p9kXRFAkwN4o","title":"Note Icons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Icons"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_0vhv7lsOLy82","title":"Attachments","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Attachments"},{"name":"iconClass","value":"bx bx-paperclip","type":"label"}]},{"id":"_help_IakOLONlIfGI","title":"Cloning Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes"},{"name":"iconClass","value":"bx bx-duplicate","type":"label"}],"children":[{"id":"_help_TBwsyfadTA18","title":"Branch prefix","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Cloning Notes/Branch prefix"},{"name":"iconClass","value":"bx bx-rename","type":"label"}]}]},{"id":"_help_bwg0e8ewQMak","title":"Protected Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Protected Notes"},{"name":"iconClass","value":"bx bx-lock-alt","type":"label"}]},{"id":"_help_MKmLg5x6xkor","title":"Archived Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Archived Notes"},{"name":"iconClass","value":"bx bx-box","type":"label"}]},{"id":"_help_vZWERwf8U3nx","title":"Note Revisions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note Revisions"},{"name":"iconClass","value":"bx bx-history","type":"label"}]},{"id":"_help_aGlEvb9hyDhS","title":"Sorting Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Sorting Notes"},{"name":"iconClass","value":"bx bx-sort-up","type":"label"}]},{"id":"_help_NRnIZmSMc5sj","title":"Printing & Exporting as PDF","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF"},{"name":"iconClass","value":"bx bx-printer","type":"label"}]},{"id":"_help_CoFPLs3dRlXc","title":"Read-Only Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Read-Only Notes"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_0ESUbbAxVnoK","title":"Note List","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Notes/Note List"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]}]},{"id":"_help_wArbEsdSae6g","title":"Navigation","type":"book","attributes":[{"name":"iconClass","value":"bx bx-navigation","type":"label"}],"children":[{"id":"_help_kBrnXNG3Hplm","title":"Tree Concepts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Tree Concepts"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}]},{"id":"_help_MMiBEQljMQh2","title":"Note Navigation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Navigation"},{"name":"iconClass","value":"bx bxs-navigation","type":"label"}]},{"id":"_help_Ms1nauBra7gq","title":"Quick search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_F1r9QtzQLZqm","title":"Jump to...","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to"},{"name":"iconClass","value":"bx bx-send","type":"label"}]},{"id":"_help_eIg8jdvaoNNd","title":"Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]},{"id":"_help_u3YFHC9tQlpm","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmarks","type":"label"}]},{"id":"_help_OR8WJ7Iz9K4U","title":"Note Hoisting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Note Hoisting"},{"name":"iconClass","value":"bx bxs-chevrons-up","type":"label"}]},{"id":"_help_ZjLYv08Rp3qC","title":"Quick edit","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Quick edit"},{"name":"iconClass","value":"bx bx-edit","type":"label"}]},{"id":"_help_9sRHySam5fXb","title":"Workspaces","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Workspaces"},{"name":"iconClass","value":"bx bx-door-open","type":"label"}]},{"id":"_help_xWtq5NUHOwql","title":"Similar Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Similar Notes"},{"name":"iconClass","value":"bx bx-bar-chart","type":"label"}]},{"id":"_help_McngOG2jbUWX","title":"Search in note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Navigation/Search in note"},{"name":"iconClass","value":"bx bx-search-alt-2","type":"label"}]}]},{"id":"_help_A9Oc6YKKc65v","title":"Keyboard Shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Keyboard Shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_Wy267RK4M69c","title":"Themes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes"},{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_VbjZvtUek0Ln","title":"Theme Gallery","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Theme Gallery"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]},{"id":"_help_gOKqSJgXLcIj","title":"Icon Packs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Themes/Icon Packs"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_mHbBMPDPkVV5","title":"Import & Export","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export"},{"name":"iconClass","value":"bx bx-import","type":"label"}],"children":[{"id":"_help_Oau6X9rCuegd","title":"Markdown","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}],"children":[{"id":"_help_rJ9grSgoExl9","title":"Supported syntax","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Markdown/Supported syntax"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}]}]},{"id":"_help_syuSEKf2rUGr","title":"Evernote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/Evernote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}],"children":[{"id":"_help_dj3j8dG4th4l","title":"Process internal links by title","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_GnhlmrATVqcH","title":"OneNote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Import & Export/OneNote"},{"name":"iconClass","value":"bx bx-window-open","type":"label"}]}]},{"id":"_help_rC3pL2aptaRE","title":"Zen mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Zen mode"},{"name":"iconClass","value":"bx bxs-yin-yang","type":"label"}]},{"id":"_help_YzMcWlCVeW09","title":"Active content","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Basic Concepts and Features/Active content"},{"name":"iconClass","value":"bx bxs-widget","type":"label"}]}]},{"id":"_help_s3YCWHBfmYuM","title":"Quick Start","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Quick Start"},{"name":"iconClass","value":"bx bx-run","type":"label"}]},{"id":"_help_i6dbnitykE5D","title":"FAQ","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/FAQ"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_KSZ04uQ2D1St","title":"Note Types","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types"},{"name":"iconClass","value":"bx bx-edit","type":"label"}],"children":[{"id":"_help_iPIMuisry3hd","title":"Text","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text"},{"name":"iconClass","value":"bx bx-note","type":"label"}],"children":[{"id":"_help_NwBbFdNZ9h7O","title":"Block quotes & admonitions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Block quotes & admonitions"},{"name":"iconClass","value":"bx bx-info-circle","type":"label"}]},{"id":"_help_oSuaNgyyKnhu","title":"Bookmarks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Bookmarks"},{"name":"iconClass","value":"bx bx-bookmark","type":"label"}]},{"id":"_help_veGu4faJErEM","title":"Content language & Right-to-left support","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Content language & Right-to-le"},{"name":"iconClass","value":"bx bx-align-right","type":"label"}]},{"id":"_help_2x0ZAX9ePtzV","title":"Cut to subnote","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Cut to subnote"},{"name":"iconClass","value":"bx bx-cut","type":"label"}]},{"id":"_help_UYuUB1ZekNQU","title":"Developer-specific formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting"},{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_QxEyIjRBizuC","title":"Code blocks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks"},{"name":"iconClass","value":"bx bx-code","type":"label"}]}]},{"id":"_help_AgjCISero73a","title":"Footnotes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Footnotes"},{"name":"iconClass","value":"bx bx-bracket","type":"label"}]},{"id":"_help_nRhnJkTT8cPs","title":"Formatting toolbar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Formatting toolbar"},{"name":"iconClass","value":"bx bx-text","type":"label"}]},{"id":"_help_Gr6xFaF6ioJ5","title":"General formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/General formatting"},{"name":"iconClass","value":"bx bx-bold","type":"label"}]},{"id":"_help_AxshuNRegLAv","title":"Highlights list","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Highlights list"},{"name":"iconClass","value":"bx bx-highlight","type":"label"}]},{"id":"_help_mT0HEkOsz6i1","title":"Images","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images"},{"name":"iconClass","value":"bx bx-image-alt","type":"label"}],"children":[{"id":"_help_0Ofbk1aSuVRu","title":"Image references","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Images/Image references"},{"name":"iconClass","value":"bx bxs-file-image","type":"label"}]}]},{"id":"_help_nBAXQFj20hS1","title":"Include Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Include Note"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_CohkqWQC1iBv","title":"Insert buttons","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Insert buttons"},{"name":"iconClass","value":"bx bx-plus","type":"label"}]},{"id":"_help_oiVPnW8QfnvS","title":"Keyboard shortcuts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Keyboard shortcuts"},{"name":"iconClass","value":"bx bxs-keyboard","type":"label"}]},{"id":"_help_QEAPj01N5f7w","title":"Links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links"},{"name":"iconClass","value":"bx bx-link-alt","type":"label"}],"children":[{"id":"_help_3IDVtesTQ8ds","title":"External links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/External links"},{"name":"iconClass","value":"bx bx-link-external","type":"label"}]},{"id":"_help_hrZ1D00cLbal","title":"Internal (reference) links","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Links/Internal (reference) links"},{"name":"iconClass","value":"bx bx-link","type":"label"}]}]},{"id":"_help_S6Xx8QIWTV66","title":"Lists","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Lists"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_QrtTYPmdd1qq","title":"Markdown-like formatting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Markdown-like formatting"},{"name":"iconClass","value":"bx bxl-markdown","type":"label"}]},{"id":"_help_YfYAtQBcfo5V","title":"Math Equations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Math Equations"},{"name":"iconClass","value":"bx bx-math","type":"label"}]},{"id":"_help_dEHYtoWWi8ct","title":"Other features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Other features"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_gLt3vA97tMcp","title":"Premium features","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features"},{"name":"iconClass","value":"bx bx-star","type":"label"}],"children":[{"id":"_help_ZlN4nump6EbW","title":"Slash Commands","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Slash Commands"},{"name":"iconClass","value":"bx bx-menu","type":"label"}]},{"id":"_help_pwc194wlRzcH","title":"Text Snippets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Text Snippets"},{"name":"iconClass","value":"bx bx-align-left","type":"label"}]},{"id":"_help_5wZallV2Qo1t","title":"Format Painter","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Premium features/Format Painter"},{"name":"iconClass","value":"bx bxs-paint-roll","type":"label"}]}]},{"id":"_help_oBo3iHIZnbG2","title":"Spell Check","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Spell Check"},{"name":"iconClass","value":"bx bx-check-double","type":"label"}]},{"id":"_help_BFvAtE74rbP6","title":"Table of contents","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Table of contents"},{"name":"iconClass","value":"bx bx-heading","type":"label"}]},{"id":"_help_NdowYOC1GFKS","title":"Tables","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Text/Tables"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_6f9hih2hXXZk","title":"Code","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Code"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_m523cpzocqaD","title":"Saved Search","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Saved Search"},{"name":"iconClass","value":"bx bx-file-find","type":"label"}]},{"id":"_help_iRwzGnHPzonm","title":"Relation Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Relation Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_bdUJEHsAPYQR","title":"Note Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Note Map"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_HcABDtFCkbFN","title":"Render Note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Render Note"},{"name":"iconClass","value":"bx bx-extension","type":"label"}]},{"id":"_help_s1aBHPd79XYj","title":"Mermaid Diagrams","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams"},{"name":"iconClass","value":"bx bx-selection","type":"label"}],"children":[{"id":"_help_RH6yLjjWJHof","title":"ELK layout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mermaid Diagrams/ELK layout"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_WWgeUaBb7UfC","title":"Syntax reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://mermaid.js.org/intro/syntax-reference.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_grjYqerjn243","title":"Canvas","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Canvas"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_1vHRoWCEjj0L","title":"Web View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Web View"},{"name":"iconClass","value":"bx bx-globe-alt","type":"label"}]},{"id":"_help_gBbsAeiuUxI5","title":"Mind Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Mind Map"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_W8vYD3Q1zjCR","title":"File","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File"},{"name":"iconClass","value":"bx bx-file-blank","type":"label"}],"children":[{"id":"_help_XJGJrpu7F9sh","title":"PDFs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File/PDFs"},{"name":"iconClass","value":"bx bxs-file-pdf","type":"label"}]},{"id":"_help_AjqEeiDUOzj4","title":"Videos","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/File/Videos"},{"name":"iconClass","value":"bx bx-video","type":"label"}]}]},{"id":"_help_GWHEkY4I4OE3","title":"Spreadsheets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Note Types/Spreadsheets"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_GTwFsgaA0lCt","title":"Collections","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections"},{"name":"iconClass","value":"bx bx-book","type":"label"}],"children":[{"id":"_help_xWbu3jpNWapp","title":"Calendar","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Calendar"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_2FvYrpmOXm29","title":"Table","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Table"},{"name":"iconClass","value":"bx bx-table","type":"label"}]},{"id":"_help_CtBQqbwXDx1w","title":"Kanban Board","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Kanban Board"},{"name":"iconClass","value":"bx bx-columns","type":"label"}]},{"id":"_help_81SGnPGMk7Xc","title":"Geo Map","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Geo Map"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]},{"id":"_help_zP3PMqaG71Ct","title":"Presentation","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Presentation"},{"name":"iconClass","value":"bx bx-slideshow","type":"label"}]},{"id":"_help_8QqnMzx393bx","title":"Grid View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Grid View"},{"name":"iconClass","value":"bx bxs-grid","type":"label"}]},{"id":"_help_mULW0Q3VojwY","title":"List View","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/List View"},{"name":"iconClass","value":"bx bx-list-ul","type":"label"}]},{"id":"_help_CssoWBu8I7jF","title":"Collection Properties","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Collections/Collection Properties"},{"name":"iconClass","value":"bx bx-cog","type":"label"}]}]},{"id":"_help_BgmBlOIl72jZ","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting"},{"name":"iconClass","value":"bx bx-bug","type":"label"}],"children":[{"id":"_help_wy8So3yZZlH9","title":"Reporting issues","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Reporting issues"},{"name":"iconClass","value":"bx bx-bug-alt","type":"label"}]},{"id":"_help_x59R8J8KV5Bp","title":"Anonymized Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Anonymized Database"},{"name":"iconClass","value":"bx bx-low-vision","type":"label"}]},{"id":"_help_qzNzp9LYQyPT","title":"Error logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs"},{"name":"iconClass","value":"bx bx-comment-error","type":"label"}],"children":[{"id":"_help_bnyigUA2UK7s","title":"Backend (server) logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Backend (server) logs"},{"name":"iconClass","value":"bx bx-server","type":"label"}]},{"id":"_help_9yEHzMyFirZR","title":"Frontend logs","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Error logs/Frontend logs"},{"name":"iconClass","value":"bx bx-window-alt","type":"label"}]}]},{"id":"_help_vdlYGAcpXAgc","title":"Synchronization fails with 504 Gateway Timeout","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Synchronization fails with 504"},{"name":"iconClass","value":"bx bx-error","type":"label"}]},{"id":"_help_s8alTXmpFR61","title":"Refreshing the application","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Troubleshooting/Refreshing the application"},{"name":"iconClass","value":"bx bx-refresh","type":"label"}]}]},{"id":"_help_pKK96zzmvBGf","title":"Theme development","type":"book","attributes":[{"name":"iconClass","value":"bx bx-palette","type":"label"}],"children":[{"id":"_help_7NfNr5pZpVKV","title":"Creating a custom theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating a custom theme"},{"name":"iconClass","value":"bx bxs-color","type":"label"}]},{"id":"_help_WFGzWeUK6arS","title":"Customize the Next theme","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Customize the Next theme"},{"name":"iconClass","value":"bx bx-news","type":"label"}]},{"id":"_help_WN5z4M8ASACJ","title":"Reference","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Reference"},{"name":"iconClass","value":"bx bx-book-open","type":"label"}]},{"id":"_help_AlhDUqhENtH7","title":"Custom app-wide CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Custom app-wide CSS"},{"name":"iconClass","value":"bx bxs-file-css","type":"label"}]},{"id":"_help_g1mlRoU8CsqC","title":"Creating an icon pack","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Theme development/Creating an icon pack"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_tC7s2alapj8V","title":"Advanced Usage","type":"book","attributes":[{"name":"iconClass","value":"bx bx-rocket","type":"label"}],"children":[{"id":"_help_zEY4DaJG4YT5","title":"Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes"},{"name":"iconClass","value":"bx bx-list-check","type":"label"}],"children":[{"id":"_help_HI6GBBIduIgv","title":"Labels","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Labels"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_Cq5X6iKQop6R","title":"Relations","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Relations"},{"name":"iconClass","value":"bx bx-transfer","type":"label"}]},{"id":"_help_bwZpz2ajCEwO","title":"Attribute Inheritance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Attribute Inheritance"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_OFXdgB2nNk1F","title":"Promoted Attributes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Attributes/Promoted Attributes"},{"name":"iconClass","value":"bx bx-table","type":"label"}]}]},{"id":"_help_KC1HB96bqqHX","title":"Templates","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Templates"},{"name":"iconClass","value":"bx bx-copy","type":"label"}]},{"id":"_help_BCkXAVs63Ttv","title":"Note Map (Link map, Tree map)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note Map (Link map, Tree map)"},{"name":"iconClass","value":"bx bxs-network-chart","type":"label"}]},{"id":"_help_R9pX4DGra2Vt","title":"Sharing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing"},{"name":"iconClass","value":"bx bx-share-alt","type":"label"}],"children":[{"id":"_help_Qjt68inQ2bRj","title":"Serving directly the content of a note","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Serving directly the content o"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_ycBFjKrrwE9p","title":"Exporting static HTML for web publishing","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Exporting static HTML for web "},{"name":"iconClass","value":"bx bxs-file-html","type":"label"}]},{"id":"_help_sLIJ6f1dkJYW","title":"Reverse proxy configuration","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Sharing/Reverse proxy configuration"},{"name":"iconClass","value":"bx bx-world","type":"label"}]}]},{"id":"_help_5668rwcirq1t","title":"Advanced Showcases","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_l0tKav7yLHGF","title":"Day Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Day Notes"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]},{"id":"_help_R7abl2fc6Mxi","title":"Weight Tracker","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Weight Tracker"},{"name":"iconClass","value":"bx bx-line-chart","type":"label"}]},{"id":"_help_xYjQUYhpbUEW","title":"Task Manager","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Advanced Showcases/Task Manager"},{"name":"iconClass","value":"bx bx-calendar-check","type":"label"}]}]},{"id":"_help_J5Ex1ZrMbyJ6","title":"Custom Request Handler","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Request Handler"},{"name":"iconClass","value":"bx bx-globe","type":"label"}]},{"id":"_help_d3fAXQ2diepH","title":"Custom Resource Providers","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Custom Resource Providers"},{"name":"iconClass","value":"bx bxs-file-plus","type":"label"}]},{"id":"_help_pgxEVkzLl1OP","title":"ETAPI (REST API)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/ETAPI (REST API)"},{"name":"iconClass","value":"bx bx-extension","type":"label"}],"children":[{"id":"_help_9qPsTWBorUhQ","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/etapi/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_47ZrP6FNuoG8","title":"Default Note Title","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Default Note Title"},{"name":"iconClass","value":"bx bx-edit-alt","type":"label"}]},{"id":"_help_wX4HbRucYSDD","title":"Database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database"},{"name":"iconClass","value":"bx bx-data","type":"label"}],"children":[{"id":"_help_oyIAJ9PvvwHX","title":"Manually altering the database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database"},{"name":"iconClass","value":"bx bxs-edit","type":"label"}],"children":[{"id":"_help_YKWqdJhzi2VY","title":"SQL Console","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Manually altering the database/SQL Console"},{"name":"iconClass","value":"bx bx-data","type":"label"}]}]},{"id":"_help_6tZeKvSHEUiB","title":"Demo Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Database/Demo Notes"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_Gzjqa934BdH4","title":"Configuration (config.ini or environment variables)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or e"},{"name":"iconClass","value":"bx bx-cog","type":"label"}],"children":[{"id":"_help_c5xB8m4g2IY6","title":"Trilium instance","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Trilium instance"},{"name":"iconClass","value":"bx bx-windows","type":"label"}]},{"id":"_help_LWtBjFej3wX3","title":"Cross-Origin Resource Sharing (CORS)","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Configuration (config.ini or environment variables)/Cross-Origin Resource Sharing "},{"name":"iconClass","value":"bx bx-lock","type":"label"}]}]},{"id":"_help_ivYnonVFBxbQ","title":"Bulk Actions","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Bulk Actions"},{"name":"iconClass","value":"bx bx-list-plus","type":"label"}]},{"id":"_help_4FahAwuGTAwC","title":"Note source","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note source"},{"name":"iconClass","value":"bx bx-code","type":"label"}]},{"id":"_help_1YeN2MzFUluU","title":"Technologies used","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used"},{"name":"iconClass","value":"bx bx-pyramid","type":"label"}],"children":[{"id":"_help_MI26XDLSAlCD","title":"CKEditor","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/CKEditor"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_N4IDkixaDG9C","title":"MindElixir","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/MindElixir"},{"name":"iconClass","value":"bx bx-sitemap","type":"label"}]},{"id":"_help_H0mM1lTxF9JI","title":"Excalidraw","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Excalidraw"},{"name":"iconClass","value":"bx bx-pen","type":"label"}]},{"id":"_help_MQHyy2dIFgxS","title":"Leaflet","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Technologies used/Leaflet"},{"name":"iconClass","value":"bx bx-map-alt","type":"label"}]}]},{"id":"_help_m1lbrzyKDaRB","title":"Note ID","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Note ID"},{"name":"iconClass","value":"bx bx-hash","type":"label"}]},{"id":"_help_0vTSyvhPTAOz","title":"Internal API","type":"book","attributes":[{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_z8O2VG4ZZJD7","title":"API Reference","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/rest-api/internal/"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_2mUhVmZK8RF3","title":"Hidden Notes","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Hidden Notes"},{"name":"iconClass","value":"bx bx-hide","type":"label"}]},{"id":"_help_uYF7pmepw27K","title":"Metrics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Metrics"},{"name":"iconClass","value":"bx bxs-data","type":"label"}],"children":[{"id":"_help_bOP3TB56fL1V","title":"grafana-dashboard.json","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_64ZTlUPgEPtW","title":"Safe mode","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Safe mode"},{"name":"iconClass","value":"bx bxs-virus-block","type":"label"}]},{"id":"_help_HAIOFBoYIIdO","title":"Nightly release","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Nightly release"},{"name":"iconClass","value":"bx bx-moon","type":"label"}]},{"id":"_help_ZmT9ln8XJX2o","title":"Read-only database","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Advanced Usage/Read-only database"},{"name":"iconClass","value":"bx bx-book-reader","type":"label"}]}]},{"id":"_help_GBBMSlVSOIGP","title":"AI","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/AI"},{"name":"iconClass","value":"bx bx-bot","type":"label"}]},{"id":"_help_CdNpE2pqjmI6","title":"Scripting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting"},{"name":"iconClass","value":"bx bxs-file-js","type":"label"}],"children":[{"id":"_help_yIhgI5H7A2Sm","title":"Frontend Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics"},{"name":"iconClass","value":"bx bx-window","type":"label"}],"children":[{"id":"_help_MgibgPcfeuGz","title":"Custom Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets"},{"name":"iconClass","value":"bx bxs-widget","type":"label"}],"children":[{"id":"_help_SynTBQiBsdYJ","title":"Widget Basics","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Widget Basics"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_GhurYZjh8e1V","title":"Note context aware widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Note context aware widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_M8IppdwVHSjG","title":"Right pane widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Right pane widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_YNxAqkI5Kg1M","title":"Word count widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_VqGQnnPGnqAU","title":"CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/CSS"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_gMkgcLJ6jBkg","title":"Troubleshooting","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Troubleshooting"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_es8OU2GuguFU","title":"Examples","type":"book","attributes":[{"name":"iconClass","value":"bx bx-code-alt","type":"label"}],"children":[{"id":"_help_TjLYAo3JMO8X","title":"\"New Task\" launcher button","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/New Task launcher button"},{"name":"iconClass","value":"bx bx-task","type":"label"}]},{"id":"_help_7kZPMD0uFwkH","title":"Downloading responses from Google Forms","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/Downloading responses from Goo"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_DL92EjAaXT26","title":"Using promoted attributes to configure scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Examples/Using promoted attributes to c"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_4Gn3psZKsfSm","title":"Launch Bar Widgets","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets"},{"name":"iconClass","value":"bx bx-dock-left","type":"label"}],"children":[{"id":"_help_IPArqVfDQ4We","title":"Note Title Widget","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Note Title Widget"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_gcI7RPbaNSh3","title":"Analog Watch","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Launch Bar Widgets/Analog Watch"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]},{"id":"_help_KLsqhjaqh1QW","title":"Preact","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact"},{"name":"iconClass","value":"bx bxl-react","type":"label"}],"children":[{"id":"_help_Bqde6BvPo05g","title":"Component libraries","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/Component libraries"},{"name":"iconClass","value":"bx bxs-component","type":"label"}]},{"id":"_help_ykYtbM9k3a7B","title":"Hooks","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/Hooks"},{"name":"iconClass","value":"bx bx-question-mark","type":"label"}]},{"id":"_help_Sg9GrCtyftZf","title":"CSS","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/CSS"},{"name":"iconClass","value":"bx bxs-file-css","type":"label"}]},{"id":"_help_RSssb9S3xgSr","title":"Built-in components","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Frontend Basics/Preact/Built-in components"},{"name":"iconClass","value":"bx bxs-component","type":"label"}],"children":[{"id":"_help_i9B4IW7b6V6z","title":"Widget showcase","type":"doc","attributes":[{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]}]},{"id":"_help_SPirpZypehBG","title":"Backend scripts","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts"},{"name":"iconClass","value":"bx bx-server","type":"label"}],"children":[{"id":"_help_fZ2IGYFXjkEy","title":"Server-side imports","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts/Server-side imports"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_GPERMystNGTB","title":"Events","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Backend scripts/Events"},{"name":"iconClass","value":"bx bx-rss","type":"label"}]}]},{"id":"_help_wqXwKJl6VpNk","title":"Common concepts","type":"book","attributes":[{"name":"iconClass","value":"bx bxl-nodejs","type":"label"}],"children":[{"id":"_help_hA834UaHhSNn","title":"Script bundles","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Common concepts/Script bundles"},{"name":"iconClass","value":"bx bx-package","type":"label"}]}]},{"id":"_help_GLks18SNjxmC","title":"Script API","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API"},{"name":"iconClass","value":"bx bx-code-curly","type":"label"}],"children":[{"id":"_help_Q2z6av6JZVWm","title":"Frontend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend"},{"name":"iconClass","value":"bx bx-folder","type":"label"}],"enforceAttributes":true,"children":[{"id":"_help_habiZ3HU8Kw8","title":"FNote","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/frontend/interfaces/FNote.html"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true}]},{"id":"_help_MEtfsqa5VwNi","title":"Backend API","type":"webView","attributes":[{"type":"label","name":"webViewSrc","value":"https://docs.triliumnotes.org/script-api/backend"},{"name":"iconClass","value":"bx bx-file","type":"label"}],"enforceAttributes":true},{"id":"_help_ApVHZ8JY5ofC","title":"Day.js","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Script API/Day.js"},{"name":"iconClass","value":"bx bx-calendar","type":"label"}]}]},{"id":"_help_vElnKeDNPSVl","title":"Logging","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Logging"},{"name":"iconClass","value":"bx bx-terminal","type":"label"}]},{"id":"_help_cNpC0ITcfX0N","title":"Breaking changes","type":"book","attributes":[{"name":"iconClass","value":"bx bx-up-arrow-alt","type":"label"}],"children":[{"id":"_help_fqAK6opjUagR","title":"v0.103.0: Removal of axios","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_pAJ0jWz16xFm","title":"v0.103.0: `cheerio` is now deprecated","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_72dxvnbnkDFY","title":"v0.102.0: Upgrade to jQuery 4.0.0","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Scripting/Breaking changes/v0.102.0 Upgrade to jQuery.0.0"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}]},{"id":"_help_Fm0j45KqyHpU","title":"Miscellaneous","type":"book","attributes":[{"name":"iconClass","value":"bx bx-info-circle","type":"label"}],"children":[{"id":"_help_WFbFXrgnDyyU","title":"Privacy Policy","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Privacy Policy"},{"name":"iconClass","value":"bx bx-file","type":"label"}]},{"id":"_help_NcsmUYZRWEW4","title":"Patterns of personal knowledge","type":"doc","attributes":[{"type":"label","name":"docName","value":"User Guide/User Guide/Miscellaneous/Patterns of personal knowledge"},{"name":"iconClass","value":"bx bx-file","type":"label"}]}]}] \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html index c4677663ce..800b0a2db4 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Installation & Setup/Backup.html @@ -18,6 +18,9 @@

Note that Synchronization provides also some backup capabilities by its nature of distributing the data to other computers.

+

Downloading backup

+

You can download a existing backup by going to Settings > Backup > + Existing backups > Download

Restoring backup

Let's assume you want to restore the weekly backup, here's how to do it:

    diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Spell Check.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Spell Check.html index 8d20024444..893abd6819 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Spell Check.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Spell Check.html @@ -3,7 +3,7 @@ or accessing Trilium through a web browser.

    Desktop

    The desktop app uses Chromium's built-in spellchecker. You can configure - it from Options Spell Check.

    + it from OptionsSpell Check.

    Enabling spell check

    Toggle Check spelling to enable or disable the spellchecker. A restart is required for changes to take effect — use the restart button @@ -14,7 +14,7 @@ by checking the boxes. The spellchecker will accept words that are valid in any of the selected languages.

    The available languages depend on your operating system's installed language - packs. For example, on Windows you can add languages through Options Time & Language Language & Region Add a language.

    + packs. For example, on Windows you can add languages through OptionsTime & LanguageLanguage & RegionAdd a language.

-

Known limitations

+

Known limitations

On Windows and macOS, Electron delegates "Add to dictionary" to the operating system's user dictionary. This means:

    diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.102.0 Upgrade to jQuery.0.0.html similarity index 97% rename from apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes.html rename to apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.102.0 Upgrade to jQuery.0.0.html index 2acf6aa197..9ba8bd42a5 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.102.0 Upgrade to jQuery.0.0.html @@ -1,4 +1,3 @@ -

    v0.102.0: Upgrade to jQuery 4.0.0

    jQuery 4 removes legacy browser support (such as IE11 support), but it also removes some APIs that are considered deprecated such as:

    diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.html new file mode 100644 index 0000000000..12379b5c61 --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.html @@ -0,0 +1,28 @@ +

    The api.axios library has been removed from + the backend scripting API.

    +

    Scripts that attempt to use api.axios will + now throw an error with migration instructions.

    +

    Reasoning

    +

    Axios was marked as deprecated at least since April 2024 in favor of the + native fetch() API, which is available in + both browser and Node.js environments. After two years of deprecation, + the library was removed following the March 2026 npm supply chain compromise, + where attackers published malicious versions that deployed a remote access + trojan. The Trilium's main developer almost got compromised, but pnpm not + trusting unknown post-install scripts successfully avoided that.

    +

    Migration

    +

    Replace api.axios calls with the native + fetch()API.

    +

    GET calls

    +

    Before (Axios):

    const response = await api.axios.get('https://api.example.com/data');
    +const data = response.data;
    +

    After (fetch):

    const response = await fetch('https://api.example.com/data');
    +const data = await response.json();
    +

    POST calls

    +

    Before (Axios):

    await api.axios.post('https://api.example.com/data', { key: 'value' });
    +

    After (fetch):

    await fetch('https://api.example.com/data', {
    +    method: 'POST',
    +    headers: { 'Content-Type': 'application/json' },
    +    body: JSON.stringify({ key: 'value' })
    +});
    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.html new file mode 100644 index 0000000000..78add86daf --- /dev/null +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.html @@ -0,0 +1,14 @@ +

    The api.cheerio library is deprecated and + will be removed in a future version.

    +

    Reasoning

    +

    Cheerio is only used for the scripting API while the server internally + uses node-html-parser for HTML parsing. Removing + cheerioreduces bundle size and maintenance overhead.

    +

    Migration

    +

    Before (cheerio):

    const $ = api.cheerio.load(html);
    +const title = $('h1').text();
    +const links = $('a').map((i, el) => $(el).attr('href')).get();
    +

    After (htmlParser):

    const root = api.htmlParser.parse(html);
    +const title = root.querySelector('h1')?.textContent;
    +const links = root.querySelectorAll('a').map(a => a.getAttribute('href'));
    \ No newline at end of file diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html index 52a8a2d30d..589d0989b1 100644 --- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html +++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.html @@ -80,6 +80,9 @@ class WordCountWidget extends api.NoteContextAwareWidget { module.exports = new WordCountWidget();

    After you make changes it is necessary to restart Trilium so that the layout can be rebuilt.

    +

    The widget only activates on text notes that have the #wordCount label. + This label can be a reference link to + enable the widget for an entire subtree.

    At the bottom of the note you can see the resulting widget:

    diff --git a/apps/server/src/assets/llm/skills/backend_scripting.md b/apps/server/src/assets/llm/skills/backend_scripting.md index 59ec934ece..f96d47d6c0 100644 --- a/apps/server/src/assets/llm/skills/backend_scripting.md +++ b/apps/server/src/assets/llm/skills/backend_scripting.md @@ -43,10 +43,19 @@ Backend scripts run in Node.js on the server. They have direct access to notes i - `api.getAppInfo()` - get application info ### Libraries -- `api.axios` - HTTP client - `api.dayjs` - date manipulation - `api.xml2js` - XML parser -- `api.cheerio` - HTML/XML parser +- `api.htmlParser` - HTML parser (node-html-parser), use `api.htmlParser.parse(html)` to parse +- `api.cheerio` - **DEPRECATED**, use `api.htmlParser` instead + +### HTTP Requests +Use the native `fetch()` API for HTTP requests: +```javascript +const response = await fetch('https://api.example.com/data'); +const data = await response.json(); +``` + +Note: `api.axios` was removed in 2026 due to a supply chain security incident. Use `fetch()` instead. ### Advanced - `api.transactional(func)` - wrap code in a database transaction diff --git a/apps/server/src/assets/translations/cn/server.json b/apps/server/src/assets/translations/cn/server.json index 505fe1ca45..ddc25e93a9 100644 --- a/apps/server/src/assets/translations/cn/server.json +++ b/apps/server/src/assets/translations/cn/server.json @@ -202,7 +202,7 @@ "shortcuts-title": "快捷键", "text-notes": "文本笔记", "code-notes-title": "代码笔记", - "images-title": "图片", + "images-title": "媒体", "spellcheck-title": "拼写检查", "password-title": "密码", "multi-factor-authentication-title": "多因素认证", @@ -220,7 +220,9 @@ "zen-mode": "禅模式", "tab-switcher-title": "标签切换器", "llm-chat-history-title": "AI对话历史", - "sidebar-chat-title": "AI对话" + "sidebar-chat-title": "AI对话", + "custom-dictionary-title": "自定义词典", + "llm-title": "AI / LLM" }, "notes": { "new-note": "新建笔记", @@ -363,7 +365,10 @@ "last-updated": "最后更新于 {{- date}}", "subpages": "子页面:", "on-this-page": "本页内容", - "expand": "展开" + "expand": "展开", + "toggle-navigation": "切换导航", + "toggle-toc": "切换目录", + "logo-alt": "Logo" }, "hidden_subtree_templates": { "text-snippet": "文本片段", @@ -399,5 +404,15 @@ }, "desktop": { "instance_already_running": "已经有一个运行中的实例,正在将焦点切换到该实例。" + }, + "search": { + "error": { + "in-context": "{{-context}} 中出错:{{-message}}", + "reserved-keyword": "\"{{- token}}\" 是一个保留关键字。要搜索字面值,请使用引号:\"{{- token}}\"", + "cannot-compare-with": "无法与“{{- token}}”进行比较。要搜索字面值,请使用引号:“{{- token}}”", + "misplaced-expression": "位置错误或不完整的表达式“{{- token}}”", + "fulltext-after-expression": "“{{- token}}”不是有效表达式。要搜索文本,请将其放在属性筛选器之前(例如,“{{- token}} #label”而不是“#label {{- token}}”)。", + "unrecognized-expression": "无法识别的表达式“{{- token}}”" + } } } diff --git a/apps/server/src/assets/translations/en/server.json b/apps/server/src/assets/translations/en/server.json index 75170e1ebf..afb8750769 100644 --- a/apps/server/src/assets/translations/en/server.json +++ b/apps/server/src/assets/translations/en/server.json @@ -404,5 +404,18 @@ }, "desktop": { "instance_already_running": "There's already an instance running, focusing that instance instead." + }, + "script": { + "wrong-environment": "Cannot execute note \"{{- noteTitle}}\" ({{- noteId}}). This is a {{- actualEnv}} script, but execution was attempted in the {{- expectedEnv}}." + }, + "search": { + "error": { + "in-context": "Error in {{- context}}: {{- message}}", + "reserved-keyword": "\"{{- token}}\" is a reserved keyword. To search for a literal value, use quotes: \"{{- token}}\"", + "cannot-compare-with": "cannot compare with \"{{- token}}\". To search for a literal value, use quotes: \"{{- token}}\"", + "misplaced-expression": "Misplaced or incomplete expression \"{{- token}}\"", + "fulltext-after-expression": "\"{{- token}}\" is not a valid expression. To search for text, place it before attribute filters (e.g., \"{{- token}} #label\" instead of \"#label {{- token}}\").", + "unrecognized-expression": "Unrecognized expression \"{{- token}}\"" + } } } diff --git a/apps/server/src/assets/translations/ja/server.json b/apps/server/src/assets/translations/ja/server.json index 44fd904cbe..60b6c61f1d 100644 --- a/apps/server/src/assets/translations/ja/server.json +++ b/apps/server/src/assets/translations/ja/server.json @@ -404,5 +404,15 @@ }, "desktop": { "instance_already_running": "すでにインスタンスが実行されているので、代わりにそのインスタンスにフォーカスします。" + }, + "search": { + "error": { + "in-context": "{{- context}} でエラーが発生しました: {{- message}}", + "reserved-keyword": "\"{{- token}}\" は予約語です。リテラル値を検索するには、引用符を使用してください: \"{{- token}}\"", + "cannot-compare-with": "\"{{- token}}\" と比較できません。リテラル値を検索するには、引用符を使用してください: \"{{- token}}\"", + "misplaced-expression": "\"{{- token}}\" という式が不適切または不完全です", + "fulltext-after-expression": "\"{{- token}}\" は有効な式ではありません。テキストを検索するには、属性フィルターの前に記述してください(例: \"#label {{- token}}\" ではなく \"{{- token}} #label\")。", + "unrecognized-expression": "認識されない式 \"{{- token}}\"" + } } } diff --git a/apps/server/src/assets/translations/tw/server.json b/apps/server/src/assets/translations/tw/server.json index 1b0f783364..ad355a944d 100644 --- a/apps/server/src/assets/translations/tw/server.json +++ b/apps/server/src/assets/translations/tw/server.json @@ -318,7 +318,8 @@ "tab-switcher-title": "切換分頁", "llm-chat-history-title": "AI 對話歷史", "llm-title": "AI / LLM", - "sidebar-chat-title": "AI 對話" + "sidebar-chat-title": "AI 對話", + "custom-dictionary-title": "自訂字典" }, "notes": { "new-note": "新增筆記", @@ -364,7 +365,10 @@ "last-updated": "最近於 {{- date}} 更新", "subpages": "子頁面:", "on-this-page": "本頁內容", - "expand": "展開" + "expand": "展開", + "toggle-navigation": "切換導航", + "toggle-toc": "切換目錄", + "logo-alt": "標誌" }, "hidden_subtree_templates": { "text-snippet": "文字片段", @@ -400,5 +404,15 @@ }, "desktop": { "instance_already_running": "已經有一個執行中的實例,正在將焦點切換到該實例。" + }, + "search": { + "error": { + "in-context": "{{- context}} 發生錯誤:{{- message}}", + "reserved-keyword": "\"{{- token}}\" 是一個保留關鍵字。若要搜尋字面值,請使用引號:\"{{- token}}\"", + "cannot-compare-with": "無法與 \"{{- token}}\" 進行比較。若要搜尋字面值,請使用引號:\"{{- token}}\"", + "misplaced-expression": "\"{{- token}}\" 的表達式位置不當或不完整", + "fulltext-after-expression": "\"{{- token}}\" 不是有效的表達式。若要搜尋文字,請將其置於屬性篩選條件之前(例如:\"{{- token}} #label\",而非 \"#label {{- token}}\")。", + "unrecognized-expression": "無法辨識的表達式 \"{{- token}}\"" + } } } diff --git a/apps/server/src/routes/api/database.ts b/apps/server/src/routes/api/database.ts index 08dc05121e..ef73983bde 100644 --- a/apps/server/src/routes/api/database.ts +++ b/apps/server/src/routes/api/database.ts @@ -1,12 +1,14 @@ import { BackupDatabaseNowResponse, DatabaseCheckIntegrityResponse } from "@triliumnext/commons"; import { becca_loader, ValidationError } from "@triliumnext/core"; -import type { Request } from "express"; -import { readFileSync } from "fs"; +import type { Request, Response } from "express"; +import fs, { readFileSync } from "fs"; +import path from "path"; import { getIntegrationTestDbPath } from "../../core_assets.js"; import anonymizationService from "../../services/anonymization.js"; import backupService from "../../services/backup.js"; import consistencyChecksService from "../../services/consistency_checks.js"; +import dataDir from "../../services/data_dir.js"; import log from "../../services/log.js"; import sql from "../../services/sql.js"; import sql_init from "../../services/sql_init.js"; @@ -64,6 +66,27 @@ function checkIntegrity() { } satisfies DatabaseCheckIntegrityResponse; } +function downloadBackup(req: Request, res: Response) { + const filePath = req.query.filePath as string; + if (!filePath) { + res.status(400).send("Missing filePath"); + return; + } + + const resolvedPath = path.resolve(filePath); + if (!resolvedPath.startsWith(path.resolve(dataDir.BACKUP_DIR) + path.sep)) { + res.status(403).send("Access denied"); + return; + } + + if (!fs.existsSync(resolvedPath)) { + res.status(404).send("Backup file not found"); + return; + } + + res.download(resolvedPath, path.basename(resolvedPath)); +} + export default { getExistingBackups, backupDatabase, @@ -72,5 +95,6 @@ export default { rebuildIntegrationTestDatabase, getExistingAnonymizedDatabases, anonymize, - checkIntegrity + checkIntegrity, + downloadBackup }; diff --git a/apps/server/src/routes/routes.ts b/apps/server/src/routes/routes.ts index bcc86eb8e7..d3f1957138 100644 --- a/apps/server/src/routes/routes.ts +++ b/apps/server/src/routes/routes.ts @@ -176,7 +176,7 @@ function register(app: express.Application) { // backup requires execution outside of transaction asyncRoute(PST, "/api/database/backup-database", [auth.checkApiAuthOrElectron, csrfMiddleware], databaseRoute.backupDatabase, apiResultHandler); apiRoute(GET, "/api/database/backups", databaseRoute.getExistingBackups); - + route(GET, "/api/database/backup/download", [auth.checkApiAuthOrElectron], databaseRoute.downloadBackup); // VACUUM requires execution outside of transaction asyncRoute(PST, "/api/database/vacuum-database", [auth.checkApiAuthOrElectron, csrfMiddleware], databaseRoute.vacuumDatabase, apiResultHandler); diff --git a/apps/server/src/services/llm/tools/helpers.ts b/apps/server/src/services/llm/tools/helpers.ts index e0913637e2..ee348740f1 100644 --- a/apps/server/src/services/llm/tools/helpers.ts +++ b/apps/server/src/services/llm/tools/helpers.ts @@ -14,6 +14,9 @@ const ATTACHMENT_PREVIEW_MAX_LENGTH = 200; /** Skip expensive content loading/conversion for notes larger than this. */ const CONTENT_PREVIEW_SIZE_THRESHOLD = 10_000; +/** Note IDs that must not be deleted, moved, or cloned by the LLM. */ +export const PROTECTED_SYSTEM_NOTES = new Set(["root", "_hidden", "_share", "_lbRoot", "_globalNoteMap"]); + /** * Return `true` if the value is truthy, otherwise `undefined`. * Since `undefined` values are omitted from JSON serialization, diff --git a/apps/server/src/services/llm/tools/hierarchy_tools.ts b/apps/server/src/services/llm/tools/hierarchy_tools.ts index cb75941c5e..b668b2380b 100644 --- a/apps/server/src/services/llm/tools/hierarchy_tools.ts +++ b/apps/server/src/services/llm/tools/hierarchy_tools.ts @@ -6,6 +6,9 @@ import { z } from "zod"; import becca from "../../../becca/becca.js"; import type BNote from "../../../becca/entities/bnote.js"; +import branchService from "../../branches.js"; +import cloningService from "../../cloning.js"; +import { PROTECTED_SYSTEM_NOTES } from "./helpers.js"; import { defineTools } from "./tool_registry.js"; //#region Subtree tool implementation @@ -89,5 +92,99 @@ export const hierarchyTools = defineTools({ return buildSubtree(note, 0, depth); } + }, + + move_note: { + description: "Move a note to a new parent. The note keeps its content and children but changes its location in the tree. Cannot move system notes.", + inputSchema: z.object({ + noteId: z.string().describe("The ID of the note to move"), + newParentNoteId: z.string().describe("The ID of the new parent note") + }), + mutates: true, + execute: ({ noteId, newParentNoteId }) => { + const note = becca.getNote(noteId); + if (!note) { + return { error: "Note not found" }; + } + if (PROTECTED_SYSTEM_NOTES.has(noteId)) { + return { error: "Cannot move system notes" }; + } + if (note.isProtected) { + return { error: "Note is protected and cannot be moved" }; + } + + const targetParent = becca.getNote(newParentNoteId); + if (!targetParent) { + return { error: "Target parent note not found" }; + } + if (!targetParent.isContentAvailable()) { + return { error: "Cannot move note to a protected parent" }; + } + if (!targetParent.isContentAvailable()) { + return { error: "Cannot move note to a protected parent" }; + } + + // Use the first (primary) parent branch for the move + const branches = note.getParentBranches(); + if (branches.length === 0) { + return { error: "Note has no parent branches" }; + } + + const result = branchService.moveBranchToNote(branches[0], newParentNoteId); + if (Array.isArray(result)) { + // Validation error: [statusCode, { success: false, message }] + const validation = result[1] as { success: boolean; message?: string }; + return { error: validation.message || "Move validation failed" }; + } + if (!result.success) { + return { error: "Failed to move note" }; + } + + return { + success: true, + noteId: note.noteId, + title: note.getTitleOrProtected(), + newParentNoteId, + newParentTitle: targetParent.getTitleOrProtected() + }; + } + }, + + clone_note: { + description: "Clone a note to an additional parent (Trilium supports multiple parents). The note appears in both locations and stays in sync. Use this to organize notes under multiple categories.", + inputSchema: z.object({ + noteId: z.string().describe("The ID of the note to clone"), + parentNoteId: z.string().describe("The ID of the new additional parent note"), + prefix: z.string().optional().describe("Optional branch prefix (displayed before the note title in the tree)") + }), + mutates: true, + execute: ({ noteId, parentNoteId, prefix }) => { + const note = becca.getNote(noteId); + if (!note) { + return { error: "Note not found" }; + } + if (note.isProtected) { + return { error: "Note is protected and cannot be cloned" }; + } + + const parent = becca.getNote(parentNoteId); + if (parent && !parent.isContentAvailable()) { + return { error: "Cannot clone note to a protected parent" }; + } + + const result = cloningService.cloneNoteToParentNote(noteId, parentNoteId, prefix ?? null); + if (!result.success) { + return { error: result.message || "Clone failed" }; + } + + return { + success: true, + noteId, + title: note.getTitleOrProtected(), + parentNoteId, + parentTitle: parent?.getTitleOrProtected() ?? parentNoteId, + branchId: result.branchId + }; + } } }); diff --git a/apps/server/src/services/llm/tools/note_tools.ts b/apps/server/src/services/llm/tools/note_tools.ts index a9bf918bf2..8fa7c9925d 100644 --- a/apps/server/src/services/llm/tools/note_tools.ts +++ b/apps/server/src/services/llm/tools/note_tools.ts @@ -9,7 +9,8 @@ import becca from "../../../becca/becca.js"; import noteService from "../../notes.js"; import SearchContext from "../../search/search_context.js"; import searchService from "../../search/services/search.js"; -import { getContentPreview, getNoteContentForLlm, getNoteMeta, setNoteContentFromLlm,TOOL_LIMITS } from "./helpers.js"; +import TaskContext from "../../task_context.js"; +import { PROTECTED_SYSTEM_NOTES, TOOL_LIMITS, getContentPreview, getNoteContentForLlm, getNoteMeta, setNoteContentFromLlm } from "./helpers.js"; import { defineTools } from "./tool_registry.js"; export const noteTools = defineTools({ @@ -231,5 +232,68 @@ export const noteTools = defineTools({ return { error: err instanceof Error ? err.message : "Failed to create note" }; } } + }, + + rename_note: { + description: "Change the title of an existing note.", + inputSchema: z.object({ + noteId: z.string().describe("The ID of the note to rename"), + newTitle: z.string().describe("The new title for the note") + }), + mutates: true, + execute: ({ noteId, newTitle }) => { + const note = becca.getNote(noteId); + if (!note) { + return { error: "Note not found" }; + } + if (note.isProtected) { + return { error: "Note is protected and cannot be renamed" }; + } + + const trimmedTitle = newTitle.trim(); + if (!trimmedTitle) { + return { error: "Title cannot be empty" }; + } + + note.title = trimmedTitle; + note.save(); + + return { + success: true, + noteId: note.noteId, + title: note.getTitleOrProtected() + }; + } + }, + + delete_note: { + description: "Delete a note and all its branches (parent links). This is a soft delete (recoverable via 'Recent Changes'). Cannot delete system notes (root, _hidden, etc.).", + inputSchema: z.object({ + noteId: z.string().describe("The ID of the note to delete") + }), + mutates: true, + execute: ({ noteId }) => { + if (PROTECTED_SYSTEM_NOTES.has(noteId)) { + return { error: "Cannot delete system notes" }; + } + + const note = becca.getNote(noteId); + if (!note) { + return { error: "Note not found" }; + } + if (note.isProtected) { + return { error: "Note is protected and cannot be deleted" }; + } + + const title = note.getTitleOrProtected(); + const taskContext = new TaskContext("no-progress-reporting", "deleteNotes", null); + note.deleteNote(null, taskContext); + + return { + success: true, + noteId, + deletedTitle: title + }; + } } }); diff --git a/apps/server/src/services/options_init.spec.ts b/apps/server/src/services/options_init.spec.ts new file mode 100644 index 0000000000..ddad092446 --- /dev/null +++ b/apps/server/src/services/options_init.spec.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from "vitest"; +import { migrateSyncTimeoutFromMilliseconds } from "./options_init.js"; + +describe("migrateSyncTimeoutFromMilliseconds", () => { + it("returns null when no migration is needed (values < 1000 are already in seconds)", () => { + expect(migrateSyncTimeoutFromMilliseconds(120)).toBeNull(); + expect(migrateSyncTimeoutFromMilliseconds(500)).toBeNull(); + expect(migrateSyncTimeoutFromMilliseconds(999)).toBeNull(); + expect(migrateSyncTimeoutFromMilliseconds(NaN)).toBeNull(); + }); + + it("converts milliseconds to seconds and sets display scale", () => { + // Value is always stored in seconds; scale is for display only + // Divisible by 60 → display as minutes + expect(migrateSyncTimeoutFromMilliseconds(60000)).toEqual({ value: 60, scale: 60 }); // 60s, display as 1 min + expect(migrateSyncTimeoutFromMilliseconds(120000)).toEqual({ value: 120, scale: 60 }); // 120s, display as 2 min + expect(migrateSyncTimeoutFromMilliseconds(3600000)).toEqual({ value: 3600, scale: 60 }); // 3600s, display as 60 min + + // Not divisible by 60 → display as seconds + expect(migrateSyncTimeoutFromMilliseconds(1000)).toEqual({ value: 1, scale: 1 }); + expect(migrateSyncTimeoutFromMilliseconds(45000)).toEqual({ value: 45, scale: 1 }); + expect(migrateSyncTimeoutFromMilliseconds(90000)).toEqual({ value: 90, scale: 1 }); + + // Rounds to nearest second + expect(migrateSyncTimeoutFromMilliseconds(120500)).toEqual({ value: 121, scale: 1 }); + }); +}); diff --git a/apps/server/src/services/sql_init.ts b/apps/server/src/services/sql_init.ts index 0b09bdc9a5..c8a624b660 100644 --- a/apps/server/src/services/sql_init.ts +++ b/apps/server/src/services/sql_init.ts @@ -1,22 +1,18 @@ -import { type OptionRow } from "@triliumnext/commons"; +import type { OptionRow } from "@triliumnext/commons"; import { sql_init as coreSqlInit } from "@triliumnext/core"; -const schemaExists = coreSqlInit.schemaExists; -const isDbInitialized = coreSqlInit.isDbInitialized; -const dbReady = coreSqlInit.dbReady; -const setDbAsInitialized = coreSqlInit.setDbAsInitialized; -const createInitialDatabase = coreSqlInit.createInitialDatabase; -const initializeDb = coreSqlInit.initializeDb; +export type { OptionRow }; + +export const dbReady = coreSqlInit.dbReady; export const getDbSize = coreSqlInit.getDbSize; -const createDatabaseForSync = coreSqlInit.createDatabaseForSync; export default { - dbReady, - schemaExists, - isDbInitialized, - createInitialDatabase, - createDatabaseForSync, - setDbAsInitialized, - getDbSize, - initializeDb + dbReady: coreSqlInit.dbReady, + schemaExists: coreSqlInit.schemaExists, + isDbInitialized: coreSqlInit.isDbInitialized, + createInitialDatabase: coreSqlInit.createInitialDatabase, + createDatabaseForSync: coreSqlInit.createDatabaseForSync, + setDbAsInitialized: coreSqlInit.setDbAsInitialized, + getDbSize: coreSqlInit.getDbSize, + initializeDb: coreSqlInit.initializeDb }; diff --git a/apps/server/src/services/sync_options.spec.ts b/apps/server/src/services/sync_options.spec.ts new file mode 100644 index 0000000000..16d048b683 --- /dev/null +++ b/apps/server/src/services/sync_options.spec.ts @@ -0,0 +1,48 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +// Mock the dependencies before importing the module +vi.mock("./config.js", () => ({ default: { Sync: {} } })); +vi.mock("./options.js", () => ({ default: { getOption: vi.fn() } })); + +import config from "./config.js"; +import optionService from "./options.js"; +import syncOptions from "./sync_options.js"; + +describe("syncOptions.getSyncTimeout", () => { + beforeEach(() => { + (config as any).Sync = {}; + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + it("converts database value from seconds to milliseconds", () => { + // TimeSelector stores value in seconds (displayed value × scale) + // Scale is UI-only, not used in backend calculation + vi.mocked(optionService.getOption).mockReturnValue("120"); // 120 seconds = 2 minutes + expect(syncOptions.getSyncTimeout()).toBe(120000); + + vi.mocked(optionService.getOption).mockReturnValue("30"); // 30 seconds + expect(syncOptions.getSyncTimeout()).toBe(30000); + + vi.mocked(optionService.getOption).mockReturnValue("3600"); // 3600 seconds = 1 hour + expect(syncOptions.getSyncTimeout()).toBe(3600000); + }); + + it("treats config override as raw milliseconds for backward compatibility", () => { + (config as any).Sync = { syncServerTimeout: "60000" }; // 60 seconds in ms + + // Config value takes precedence, db value is ignored + vi.mocked(optionService.getOption).mockReturnValue("9999"); + expect(syncOptions.getSyncTimeout()).toBe(60000); + }); + + it("uses safe defaults for invalid values", () => { + vi.mocked(optionService.getOption).mockReturnValue(""); + expect(syncOptions.getSyncTimeout()).toBe(120000); // default 120 seconds + + (config as any).Sync = { syncServerTimeout: "invalid" }; + expect(syncOptions.getSyncTimeout()).toBe(120000); // fallback for invalid config + }); +}); diff --git a/apps/web-clipper/entrypoints/options/index.ts b/apps/web-clipper/entrypoints/options/index.ts index b4050c977b..f230ab574d 100644 --- a/apps/web-clipper/entrypoints/options/index.ts +++ b/apps/web-clipper/entrypoints/options/index.ts @@ -26,10 +26,12 @@ async function saveTriliumServerSetup(e) { return; } + const triliumServerUrl = ($triliumServerUrl.val() as string).trim().replace(/\/+$/, ''); + let resp; try { - resp = await fetch(`${$triliumServerUrl.val()}/api/login/token`, { + resp = await fetch(`${triliumServerUrl}/api/login/token`, { method: "POST", headers: { 'Accept': 'application/json', @@ -60,7 +62,7 @@ async function saveTriliumServerSetup(e) { $triliumServerPassword.val(''); browser.storage.sync.set({ - triliumServerUrl: $triliumServerUrl.val(), + triliumServerUrl: triliumServerUrl, authToken: json.token }); diff --git a/apps/website/package.json b/apps/website/package.json index 18cb015e1b..d7e31961e7 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -21,8 +21,8 @@ "eslint-config-preact": "2.0.0", "typescript": "6.0.2", "user-agent-data-types": "0.4.3", - "vite": "8.0.5", - "vitest": "4.1.2" + "vite": "8.0.7", + "vitest": "4.1.3" }, "eslintConfig": { "extends": "preact" diff --git a/apps/website/src/translations/el/translation.json b/apps/website/src/translations/el/translation.json index 92aeaae1ca..b6314dcfa8 100644 --- a/apps/website/src/translations/el/translation.json +++ b/apps/website/src/translations/el/translation.json @@ -1,7 +1,7 @@ { "get-started": { "title": "Ξεκινήστε", - "desktop_title": "Κατεβάστε την εφαρμογή desktop (v{{version}})", + "desktop_title": "Κατεβάστε την desktop εφαρμογή (v{{version}})", "architecture": "Αρχιτεκτονική:", "older_releases": "Δείτε παλαιότερες εκδόσεις", "server_title": "Ρυθμίστε έναν server για πρόσβαση σε πολλαπλές συσκευές" diff --git a/docs/Developer Guide/Developer Guide/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md index 1ae8140ddb..0ebd70a6c6 100644 --- a/docs/Developer Guide/Developer Guide/Documentation.md +++ b/docs/Developer Guide/Developer Guide/Documentation.md @@ -1,5 +1,5 @@ # Documentation -There are multiple types of documentation for Trilium: +There are multiple types of documentation for Trilium: * The _User Guide_ represents the user-facing documentation. This documentation can be browsed by users directly from within Trilium, by pressing F1. * The _Developer's Guide_ represents a set of Markdown documents that present the internals of Trilium, for developers. diff --git a/docs/README-el.md b/docs/README-el.md index f031c0d960..0837f9f990 100644 --- a/docs/README-el.md +++ b/docs/README-el.md @@ -9,7 +9,7 @@
    -# Trilium Notes +# Σημειώσεις Trilium ![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran) ![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\ diff --git a/docs/Release Notes/Release Notes/v0.102.2.md b/docs/Release Notes/Release Notes/v0.102.2.md index 94a3b5e1fc..19d095621c 100644 --- a/docs/Release Notes/Release Notes/v0.102.2.md +++ b/docs/Release Notes/Release Notes/v0.102.2.md @@ -14,7 +14,6 @@ ## 🔒️ Security improvements * Content Handling - * Improved request handling for SVG content in share routes * Improved request handling for SVG content in the main API * Enhanced content rendering in the Mermaid diagram editor @@ -22,16 +21,13 @@ * Added validation for the `docName` attribute in the document renderer * Marked `docName` as a sensitive attribute in the commons module * Desktop Application (Electron) - * Added Electron fuses to harden the desktop application against external abuse * Improved application integrity checks * API & Import - * Added MIME type validation for image uploads via ETAPI * Aligned attachment upload validation with note upload validation * Import no longer preserves named note IDs to prevent potential conflicts * Authentication - * OpenID Connect now uses a more secure random number generator We've also updated our SECURITY.MD file to detail our security practices and how to report vulnerabilities. \ No newline at end of file diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json index eb0c3e462a..b04008c1a1 100644 --- a/docs/User Guide/!!!meta.json +++ b/docs/User Guide/!!!meta.json @@ -16459,6 +16459,13 @@ "value": "word-count", "isInheritable": false, "position": 40 + }, + { + "type": "relation", + "name": "internalLink", + "value": "hrZ1D00cLbal", + "isInheritable": false, + "position": 50 } ], "format": "markdown", @@ -17761,27 +17768,133 @@ "notePosition": 130, "prefix": null, "isExpanded": false, - "type": "text", - "mime": "text/html", + "type": "book", + "mime": "", "attributes": [ { "type": "label", "name": "iconClass", "value": "bx bx-up-arrow-alt", "isInheritable": false, - "position": 30 + "position": 10 }, { "type": "label", "name": "shareAlias", "value": "breaking-changes", "isInheritable": false, + "position": 20 + }, + { + "type": "relation", + "name": "template", + "value": "_template_list_view", + "isInheritable": false, + "position": 30 + }, + { + "type": "label", + "name": "sorted", + "value": "", + "isInheritable": false, "position": 40 + }, + { + "type": "label", + "name": "sortDirection", + "value": "desc", + "isInheritable": false, + "position": 50 } ], - "format": "markdown", - "dataFileName": "Breaking changes.md", - "attachments": [] + "attachments": [], + "dirFileName": "Breaking changes", + "children": [ + { + "isClone": false, + "noteId": "fqAK6opjUagR", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "cNpC0ITcfX0N", + "fqAK6opjUagR" + ], + "title": "v0.103.0: Removal of axios", + "notePosition": 10, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "axios-removal", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "v0.103.0 Removal of axios.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "pAJ0jWz16xFm", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "cNpC0ITcfX0N", + "pAJ0jWz16xFm" + ], + "title": "v0.103.0: `cheerio` is now deprecated", + "notePosition": 20, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "cheerio-deprecated", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "v0.103.0 `cheerio` is now depr.md", + "attachments": [] + }, + { + "isClone": false, + "noteId": "72dxvnbnkDFY", + "notePath": [ + "pOsGYCXsbNQG", + "CdNpE2pqjmI6", + "cNpC0ITcfX0N", + "72dxvnbnkDFY" + ], + "title": "v0.102.0: Upgrade to jQuery 4.0.0", + "notePosition": 30, + "prefix": null, + "isExpanded": false, + "type": "text", + "mime": "text/html", + "attributes": [ + { + "type": "label", + "name": "shareAlias", + "value": "jquery4", + "isInheritable": false, + "position": 30 + } + ], + "format": "markdown", + "dataFileName": "v0.102.0 Upgrade to jQuery.0.0.md", + "attachments": [] + } + ] } ] }, diff --git a/docs/User Guide/User Guide/Installation & Setup/Backup.md b/docs/User Guide/User Guide/Installation & Setup/Backup.md index 699ca0e009..dca45fbff7 100644 --- a/docs/User Guide/User Guide/Installation & Setup/Backup.md +++ b/docs/User Guide/User Guide/Installation & Setup/Backup.md @@ -12,6 +12,10 @@ This is only very basic backup solution, and you're encouraged to add some bette Note that Synchronization provides also some backup capabilities by its nature of distributing the data to other computers. +## Downloading backup + +You can download an existing backup by going to Settings > Backup > Existing backups > Download + ## Restoring backup Let's assume you want to restore the weekly backup, here's how to do it: diff --git a/docs/User Guide/User Guide/Scripting/Breaking changes.md b/docs/User Guide/User Guide/Scripting/Breaking changes/v0.102.0 Upgrade to jQuery.0.0.md similarity index 93% rename from docs/User Guide/User Guide/Scripting/Breaking changes.md rename to docs/User Guide/User Guide/Scripting/Breaking changes/v0.102.0 Upgrade to jQuery.0.0.md index 8b887aab99..5230543ea7 100644 --- a/docs/User Guide/User Guide/Scripting/Breaking changes.md +++ b/docs/User Guide/User Guide/Scripting/Breaking changes/v0.102.0 Upgrade to jQuery.0.0.md @@ -1,6 +1,4 @@ -# Breaking changes -## v0.102.0: Upgrade to jQuery 4.0.0 - +# v0.102.0: Upgrade to jQuery 4.0.0 jQuery 4 removes legacy browser support (such as IE11 support), but it also removes some APIs that are considered deprecated such as: > `jQuery.isArray`, `jQuery.parseJSON`, `jQuery.trim`, `jQuery.type`, `jQuery.now`, `jQuery.isNumeric`, `jQuery.isFunction`, `jQuery.isWindow`, `jQuery.camelCase`, `jQuery.nodeName`, `jQuery.cssNumber`, `jQuery.cssProps`, and `jQuery.fx.interval`. diff --git a/docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.md b/docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.md new file mode 100644 index 0000000000..fbaf7603ac --- /dev/null +++ b/docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 Removal of axios.md @@ -0,0 +1,46 @@ +# v0.103.0: Removal of axios +The `api.axios` library has been removed from the backend scripting API. + +Scripts that attempt to use `api.axios` will now throw an error with migration instructions. + +## Reasoning + +Axios was marked as deprecated at least since April 2024 in favor of the native `fetch()` API, which is available in both browser and Node.js environments. After two years of deprecation, the library was removed following the [March 2026 npm supply chain compromise](https://www.malwarebytes.com/blog/news/2026/03/axios-supply-chain-attack-chops-away-at-npm-trust), where attackers published malicious versions that deployed a remote access trojan. The Trilium's main developer almost got compromised, but `pnpm` not trusting unknown post-install scripts successfully avoided that. + +## Migration + +Replace `api.axios` calls with the native `fetch()` API. + +### `GET` calls + +Before (Axios): + +```javascript +const response = await api.axios.get('https://api.example.com/data'); +const data = response.data; +``` + +After (`fetch`): + +```javascript +const response = await fetch('https://api.example.com/data'); +const data = await response.json(); +``` + +### `POST` calls + +Before (Axios): + +```javascript +await api.axios.post('https://api.example.com/data', { key: 'value' }); +``` + +After (fetch): + +```javascript +await fetch('https://api.example.com/data', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ key: 'value' }) +}); +``` \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.md b/docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.md new file mode 100644 index 0000000000..b3c3f92db4 --- /dev/null +++ b/docs/User Guide/User Guide/Scripting/Breaking changes/v0.103.0 `cheerio` is now depr.md @@ -0,0 +1,24 @@ +# v0.103.0: `cheerio` is now deprecated +The `api.cheerio` library is deprecated and will be removed in a future version. + +## Reasoning + +Cheerio is only used for the scripting API while the server internally uses `node-html-parser` for HTML parsing. Removing `cheerio` reduces bundle size and maintenance overhead. + +## Migration + +Before (`cheerio`): + +```javascript +const $ = api.cheerio.load(html); +const title = $('h1').text(); +const links = $('a').map((i, el) => $(el).attr('href')).get(); +``` + +After (`htmlParser`): + +```javascript +const root = api.htmlParser.parse(html); +const title = root.querySelector('h1')?.textContent; +const links = root.querySelectorAll('a').map(a => a.getAttribute('href')); +``` \ No newline at end of file diff --git a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.md b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.md index 8b6be5684f..137e7ec414 100644 --- a/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.md +++ b/docs/User Guide/User Guide/Scripting/Frontend Basics/Custom Widgets/Word count widget.md @@ -84,6 +84,8 @@ module.exports = new WordCountWidget(); After you make changes it is necessary to [restart Trilium](../../../Troubleshooting/Refreshing%20the%20application.md) so that the layout can be rebuilt. +The widget only activates on text notes that have the `#wordCount` label. This label can be a [reference link](../../../Note%20Types/Text/Links/Internal%20\(reference\)%20links.md) to enable the widget for an entire subtree. + At the bottom of the note you can see the resulting widget:
    \ No newline at end of file diff --git a/package.json b/package.json index eefab37e06..ac25daf5b5 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,9 @@ "@types/express": "5.0.6", "@types/js-yaml": "4.0.9", "@types/node": "24.12.2", - "@vitest/browser-webdriverio": "4.1.2", - "@vitest/coverage-v8": "4.1.2", - "@vitest/ui": "4.1.2", + "@vitest/browser-webdriverio": "4.1.3", + "@vitest/coverage-v8": "4.1.3", + "@vitest/ui": "4.1.3", "chalk": "5.6.2", "cross-env": "10.1.0", "dpdm": "4.0.1", @@ -66,7 +66,7 @@ "eslint-config-preact": "2.0.0", "eslint-config-prettier": "10.1.8", "eslint-plugin-playwright": "2.10.1", - "eslint-plugin-simple-import-sort": "12.1.1", + "eslint-plugin-simple-import-sort": "13.0.0", "happy-dom": "20.8.9", "http-server": "14.1.1", "jiti": "2.6.1", @@ -77,11 +77,10 @@ "tslib": "2.8.1", "tsx": "4.21.0", "typescript": "6.0.2", - "typescript-eslint": "8.58.0", - "upath": "2.0.1", - "vite": "8.0.5", + "typescript-eslint": "8.58.1", + "vite": "8.0.7", "vite-plugin-dts": "4.5.4", - "vitest": "4.1.2" + "vitest": "4.1.3" }, "license": "AGPL-3.0-only", "author": { @@ -160,9 +159,16 @@ "handlebars@<4.7.9": ">=4.7.9", "qs@<6.14.2": ">=6.14.2", "minimatch@<3.1.4": "^3.1.4", - "minimatch@3>brace-expansion": "^1.1.13", + "minimatch@3>brace-expansion": "^5.0.0", "serialize-javascript@<7.0.5": ">=7.0.5", - "webpack@<5.104.1": ">=5.104.1" + "webpack@<5.104.1": ">=5.104.1", + "file-type@>=13.0.0 <21.3.1": ">=21.3.1", + "vite@>=7.0.0 <=7.3.1": ">=7.3.2", + "vite@>=7.1.0 <=7.3.1": ">=7.3.2", + "hono@<4.12.12": ">=4.12.12", + "hono@>=4.0.0 <=4.12.11": ">=4.12.12", + "@hono/node-server@<1.19.13": ">=1.19.13", + "basic-ftp@=5.2.0": ">=5.2.1" }, "ignoredBuiltDependencies": [ "sqlite3" diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json index 4e673864c6..c51e6bfec5 100644 --- a/packages/ckeditor5-admonition/package.json +++ b/packages/ckeditor5-admonition/package.json @@ -18,10 +18,10 @@ }, "devDependencies": { "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", - "@vitest/browser": "4.1.2", - "@vitest/coverage-istanbul": "4.1.2", + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@vitest/browser": "4.1.3", + "@vitest/coverage-istanbul": "4.1.3", "ckeditor5": "48.0.0", "eslint": "10.2.0", "eslint-config-ckeditor5": ">=9.1.0", @@ -29,7 +29,7 @@ "stylelint-config-ckeditor5": ">=9.1.0", "typescript": "6.0.2", "vite-plugin-svgo": "2.0.0", - "vitest": "4.1.2", + "vitest": "4.1.3", "webdriverio": "9.27.0" }, "peerDependencies": { diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json index 4f10ad434c..26de370c6f 100644 --- a/packages/ckeditor5-footnotes/package.json +++ b/packages/ckeditor5-footnotes/package.json @@ -19,10 +19,10 @@ }, "devDependencies": { "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", - "@vitest/browser": "4.1.2", - "@vitest/coverage-istanbul": "4.1.2", + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@vitest/browser": "4.1.3", + "@vitest/coverage-istanbul": "4.1.3", "ckeditor5": "48.0.0", "eslint": "10.2.0", "eslint-config-ckeditor5": ">=9.1.0", @@ -30,7 +30,7 @@ "stylelint-config-ckeditor5": ">=9.1.0", "typescript": "6.0.2", "vite-plugin-svgo": "2.0.0", - "vitest": "4.1.2", + "vitest": "4.1.3", "webdriverio": "9.27.0" }, "peerDependencies": { diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json index 2d561f6d3c..ce8e598fe3 100644 --- a/packages/ckeditor5-keyboard-marker/package.json +++ b/packages/ckeditor5-keyboard-marker/package.json @@ -21,10 +21,10 @@ }, "devDependencies": { "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", - "@vitest/browser": "4.1.2", - "@vitest/coverage-istanbul": "4.1.2", + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@vitest/browser": "4.1.3", + "@vitest/coverage-istanbul": "4.1.3", "ckeditor5": "48.0.0", "eslint": "10.2.0", "eslint-config-ckeditor5": ">=9.1.0", @@ -32,7 +32,7 @@ "stylelint-config-ckeditor5": ">=9.1.0", "typescript": "6.0.2", "vite-plugin-svgo": "2.0.0", - "vitest": "4.1.2", + "vitest": "4.1.3", "webdriverio": "9.27.0" }, "peerDependencies": { diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json index 32fffd2add..2b510a8bda 100644 --- a/packages/ckeditor5-math/package.json +++ b/packages/ckeditor5-math/package.json @@ -21,10 +21,10 @@ }, "devDependencies": { "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", - "@vitest/browser": "4.1.2", - "@vitest/coverage-istanbul": "4.1.2", + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@vitest/browser": "4.1.3", + "@vitest/coverage-istanbul": "4.1.3", "ckeditor5": "48.0.0", "eslint": "10.2.0", "eslint-config-ckeditor5": ">=9.1.0", @@ -32,7 +32,7 @@ "stylelint-config-ckeditor5": ">=9.1.0", "typescript": "6.0.2", "vite-plugin-svgo": "2.0.0", - "vitest": "4.1.2", + "vitest": "4.1.3", "webdriverio": "9.27.0" }, "peerDependencies": { diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json index d47a92d39a..f4679f8d1b 100644 --- a/packages/ckeditor5-mermaid/package.json +++ b/packages/ckeditor5-mermaid/package.json @@ -21,10 +21,10 @@ }, "devDependencies": { "@ckeditor/ckeditor5-inspector": ">=4.1.0", - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", - "@vitest/browser": "4.1.2", - "@vitest/coverage-istanbul": "4.1.2", + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", + "@vitest/browser": "4.1.3", + "@vitest/coverage-istanbul": "4.1.3", "ckeditor5": "48.0.0", "eslint": "10.2.0", "eslint-config-ckeditor5": ">=9.1.0", @@ -32,7 +32,7 @@ "stylelint-config-ckeditor5": ">=9.1.0", "typescript": "6.0.2", "vite-plugin-svgo": "2.0.0", - "vitest": "4.1.2", + "vitest": "4.1.3", "webdriverio": "9.27.0" }, "peerDependencies": { diff --git a/packages/ckeditor5/src/plugins.ts b/packages/ckeditor5/src/plugins.ts index abf51f0869..8407bd7026 100644 --- a/packages/ckeditor5/src/plugins.ts +++ b/packages/ckeditor5/src/plugins.ts @@ -31,6 +31,11 @@ import CodeBlockLanguageDropdown from "./plugins/code_block_language_dropdown.js import MoveBlockUpDownPlugin from "./plugins/move_block_updown.js"; import ScrollOnUndoRedoPlugin from "./plugins/scroll_on_undo_redo.js" import InlineCodeNoSpellcheck from "./plugins/inline_code_no_spellcheck.js"; +import InlineCodeToolbar from "./plugins/inline_code_toolbar.js"; +import AdmonitionTypeDropdown from "./plugins/admonition_type_dropdown.js"; +import AdmonitionToolbar from "./plugins/admonition_toolbar.js"; +import IncludeNoteBoxSizeDropdown from "./plugins/include_note_box_size_dropdown.js"; +import IncludeNoteToolbar from "./plugins/include_note_toolbar.js"; /** * Plugins that are specific to Trilium and not part of the CKEditor 5 core, included in both text editors but not in the attribute editor. @@ -53,6 +58,11 @@ const TRILIUM_PLUGINS: typeof Plugin[] = [ MoveBlockUpDownPlugin, ScrollOnUndoRedoPlugin, InlineCodeNoSpellcheck, + InlineCodeToolbar, + AdmonitionTypeDropdown, + AdmonitionToolbar, + IncludeNoteBoxSizeDropdown, + IncludeNoteToolbar, ]; /** diff --git a/packages/ckeditor5/src/plugins/admonition_toolbar.ts b/packages/ckeditor5/src/plugins/admonition_toolbar.ts new file mode 100644 index 0000000000..6aa7bbb696 --- /dev/null +++ b/packages/ckeditor5/src/plugins/admonition_toolbar.ts @@ -0,0 +1,43 @@ +import { Plugin, ViewDocumentFragment, WidgetToolbarRepository, type ViewNode } from "ckeditor5"; +import { Admonition } from "@triliumnext/ckeditor5-admonition"; +import AdmonitionTypeDropdown from "./admonition_type_dropdown"; + +export default class AdmonitionToolbar extends Plugin { + + static get requires() { + return [WidgetToolbarRepository, Admonition, AdmonitionTypeDropdown] as const; + } + + afterInit() { + const editor = this.editor; + const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository); + + widgetToolbarRepository.register("admonition", { + items: [ + "admonitionTypeDropdown" + ], + balloonClassName: "ck-toolbar-container admonition-type-list", + getRelatedElement(selection) { + const selectionPosition = selection.getFirstPosition(); + if (!selectionPosition) { + return null; + } + + let parent: ViewNode | ViewDocumentFragment | null = selectionPosition.parent; + while (parent) { + if (parent.is("element", "aside") || parent.is("element", "div")) { + // Check if it's an admonition by looking for the admonition class + const classes = (parent as any).getAttribute?.("class") || ""; + if (typeof classes === "string" && classes.includes("admonition")) { + return parent; + } + } + parent = parent.parent; + } + + return null; + } + }); + } + +} diff --git a/packages/ckeditor5/src/plugins/admonition_type_dropdown.ts b/packages/ckeditor5/src/plugins/admonition_type_dropdown.ts new file mode 100644 index 0000000000..f2d641c87a --- /dev/null +++ b/packages/ckeditor5/src/plugins/admonition_type_dropdown.ts @@ -0,0 +1,71 @@ +import { Plugin, type ListDropdownButtonDefinition, Collection, ViewModel, createDropdown, addListToDropdown, DropdownButtonView } from "ckeditor5"; +import { Admonition, ADMONITION_TYPES, type AdmonitionCommand, type AdmonitionType } from "@triliumnext/ckeditor5-admonition"; + +/** + * Toolbar item which displays the list of admonition types in a dropdown. + * Uses the same styling as the main admonition toolbar button. + */ +export default class AdmonitionTypeDropdown extends Plugin { + + static get requires() { + return [Admonition] as const; + } + + public init() { + const editor = this.editor; + const componentFactory = editor.ui.componentFactory; + + const itemDefinitions = this._getTypeListItemDefinitions(); + const command = editor.commands.get("admonition") as AdmonitionCommand; + + componentFactory.add("admonitionTypeDropdown", _locale => { + const dropdownView = createDropdown(editor.locale, DropdownButtonView); + dropdownView.buttonView.set({ + withText: true + }); + dropdownView.bind("isEnabled").to(command, "value", value => !!value); + dropdownView.buttonView.bind("label").to(command, "value", (value) => { + if (!value) return ""; + const typeDef = ADMONITION_TYPES[value as AdmonitionType]; + return typeDef?.title ?? value; + }); + dropdownView.on("execute", evt => { + const source = evt.source as any; + editor.execute("admonition", { + forceValue: source.commandParam + }); + editor.editing.view.focus(); + }); + addListToDropdown(dropdownView, itemDefinitions); + return dropdownView; + }); + } + + private _getTypeListItemDefinitions(): Collection { + const editor = this.editor; + const command = editor.commands.get("admonition") as AdmonitionCommand; + const itemDefinitions = new Collection(); + + for (const [type, typeDef] of Object.entries(ADMONITION_TYPES)) { + const definition: ListDropdownButtonDefinition = { + type: "button", + model: new ViewModel({ + commandParam: type, + label: typeDef.title, + class: `ck-tn-admonition-option ck-tn-admonition-${type}`, + role: "menuitemradio", + withText: true + }) + }; + + definition.model.bind("isOn").to(command, "value", value => { + return value === type; + }); + + itemDefinitions.add(definition); + } + + return itemDefinitions; + } + +} diff --git a/packages/ckeditor5/src/plugins/copy_to_clipboard_button.ts b/packages/ckeditor5/src/plugins/copy_to_clipboard_button.ts index 836549fb1c..9bea57e5b3 100644 --- a/packages/ckeditor5/src/plugins/copy_to_clipboard_button.ts +++ b/packages/ckeditor5/src/plugins/copy_to_clipboard_button.ts @@ -38,28 +38,43 @@ export class CopyToClipboardCommand extends Command { this.executeCallback = this.editor.config.get("clipboard")?.copy; } + // Try code block first const codeBlockEl = selection.getFirstPosition()?.findAncestor("codeBlock"); - if (!codeBlockEl) { - console.warn("Unable to find code block element to copy from."); + if (codeBlockEl) { + const codeText = Array.from(codeBlockEl.getChildren()) + .map(child => "data" in child ? child.data : "\n") + .join(""); + this.copyText(codeText, "code block"); return; } - const codeText = Array.from(codeBlockEl.getChildren()) - .map(child => "data" in child ? child.data : "\n") - .join(""); - - if (codeText) { - if (!this.executeCallback) { - navigator.clipboard.writeText(codeText).then(() => { - console.log('Code block copied to clipboard'); - }).catch(err => { - console.error('Failed to copy code block', err); - }); - } else { - this.executeCallback(codeText); + // Try inline code (text with 'code' attribute) + const position = selection.getFirstPosition(); + if (position) { + const textNode = position.textNode || position.nodeBefore || position.nodeAfter; + if (textNode && "data" in textNode && textNode.hasAttribute?.("code")) { + this.copyText(textNode.data as string, "inline code"); + return; } + } + + console.warn("No code block or inline code found to copy from."); + } + + private copyText(text: string, source: string) { + if (!text) { + console.warn(`No text found in ${source}.`); + return; + } + + if (!this.executeCallback) { + navigator.clipboard.writeText(text).then(() => { + console.log(`${source} copied to clipboard`); + }).catch(err => { + console.error(`Failed to copy ${source}`, err); + }); } else { - console.warn('No code block selected or found.'); + this.executeCallback(text); } } diff --git a/packages/ckeditor5/src/plugins/include_note_box_size_dropdown.ts b/packages/ckeditor5/src/plugins/include_note_box_size_dropdown.ts new file mode 100644 index 0000000000..c89ee52c11 --- /dev/null +++ b/packages/ckeditor5/src/plugins/include_note_box_size_dropdown.ts @@ -0,0 +1,71 @@ +import { Plugin, type ListDropdownButtonDefinition, Collection, ViewModel, createDropdown, addListToDropdown, DropdownButtonView, type Command } from "ckeditor5"; +import IncludeNote, { BOX_SIZE_COMMAND_NAME, BOX_SIZES, type BoxSizeValue } from "./includenote.js"; + +/** + * Toolbar item which displays the list of box sizes for include notes in a dropdown. + */ +export default class IncludeNoteBoxSizeDropdown extends Plugin { + + static get requires() { + return [IncludeNote] as const; + } + + public init() { + const editor = this.editor; + const componentFactory = editor.ui.componentFactory; + + const itemDefinitions = this._getBoxSizeListItemDefinitions(); + const command = editor.commands.get(BOX_SIZE_COMMAND_NAME) as Command & { value: BoxSizeValue | null }; + + componentFactory.add("includeNoteBoxSizeDropdown", _locale => { + const dropdownView = createDropdown(editor.locale, DropdownButtonView); + dropdownView.buttonView.set({ + withText: true, + tooltip: true, + label: "Box size" + }); + dropdownView.bind("isEnabled").to(command, "isEnabled"); + dropdownView.buttonView.bind("label").to(command, "value", (value) => { + if (!value) return "Box size"; + const sizeDef = BOX_SIZES.find(s => s.value === value); + return sizeDef?.label ?? value; + }); + dropdownView.on("execute", evt => { + const source = evt.source as any; + editor.execute(BOX_SIZE_COMMAND_NAME, { + value: source._boxSizeValue + }); + editor.editing.view.focus(); + }); + addListToDropdown(dropdownView, itemDefinitions); + return dropdownView; + }); + } + + private _getBoxSizeListItemDefinitions(): Collection { + const editor = this.editor; + const command = editor.commands.get(BOX_SIZE_COMMAND_NAME) as Command & { value: BoxSizeValue | null }; + const itemDefinitions = new Collection(); + + for (const sizeDef of BOX_SIZES) { + const definition: ListDropdownButtonDefinition = { + type: "button", + model: new ViewModel({ + _boxSizeValue: sizeDef.value, + label: sizeDef.label, + role: "menuitemradio", + withText: true + }) + }; + + definition.model.bind("isOn").to(command, "value", value => { + return value === sizeDef.value; + }); + + itemDefinitions.add(definition); + } + + return itemDefinitions; + } + +} diff --git a/packages/ckeditor5/src/plugins/include_note_toolbar.ts b/packages/ckeditor5/src/plugins/include_note_toolbar.ts new file mode 100644 index 0000000000..26c9d9faa8 --- /dev/null +++ b/packages/ckeditor5/src/plugins/include_note_toolbar.ts @@ -0,0 +1,45 @@ +import { Plugin, WidgetToolbarRepository, isWidget, type ViewElement } from "ckeditor5"; +import IncludeNote from "./includenote.js"; +import IncludeNoteBoxSizeDropdown from "./include_note_box_size_dropdown.js"; + +export default class IncludeNoteToolbar extends Plugin { + + static get requires() { + return [WidgetToolbarRepository, IncludeNote, IncludeNoteBoxSizeDropdown] as const; + } + + afterInit() { + const editor = this.editor; + const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository); + + widgetToolbarRepository.register("includeNote", { + items: [ + "includeNoteBoxSizeDropdown" + ], + balloonClassName: "ck-toolbar-container include-note-toolbar", + getRelatedElement(selection) { + const selectedElement = selection.getSelectedElement(); + + if (selectedElement && isIncludeNoteWidget(selectedElement)) { + return selectedElement; + } + + return null; + } + }); + } + +} + +function isIncludeNoteWidget(element: ViewElement): boolean { + if (!isWidget(element)) { + return false; + } + + if (!element.is("element", "section")) { + return false; + } + + const classes = element.getAttribute("class") || ""; + return typeof classes === "string" && classes.includes("include-note"); +} diff --git a/packages/ckeditor5/src/plugins/includenote.ts b/packages/ckeditor5/src/plugins/includenote.ts index 1ce633f357..730dbb8170 100644 --- a/packages/ckeditor5/src/plugins/includenote.ts +++ b/packages/ckeditor5/src/plugins/includenote.ts @@ -2,6 +2,16 @@ import { ButtonView, Command, Plugin, toWidget, Widget, type Editor, type Observ import noteIcon from '../icons/note.svg?raw'; export const COMMAND_NAME = 'insertIncludeNote'; +export const BOX_SIZE_COMMAND_NAME = 'includeNoteBoxSize'; + +export const BOX_SIZES = [ + { value: 'small', label: 'Small' }, + { value: 'medium', label: 'Medium' }, + { value: 'full', label: 'Full' }, + { value: 'expandable', label: 'Expandable' } +] as const; + +export type BoxSizeValue = typeof BOX_SIZES[number]['value']; export default class IncludeNote extends Plugin { static get requires() { @@ -54,6 +64,7 @@ class IncludeNoteEditing extends Plugin { this._defineConverters(); this.editor.commands.add( COMMAND_NAME, new InsertIncludeNoteCommand( this.editor ) ); + this.editor.commands.add( BOX_SIZE_COMMAND_NAME, new IncludeNoteBoxSizeCommand( this.editor ) ); } _defineSchema() { @@ -133,6 +144,29 @@ class IncludeNoteEditing extends Plugin { return toWidget( section, viewWriter, { label: 'include note widget' } ); } } ); + + // Handle boxSize attribute changes on existing elements + conversion.for( 'editingDowncast' ).add( dispatcher => { + dispatcher.on( 'attribute:boxSize:includeNote', ( evt, data, conversionApi ) => { + const viewElement = conversionApi.mapper.toViewElement( data.item ); + if ( !viewElement ) { + return; + } + + const viewWriter = conversionApi.writer; + const oldBoxSize = data.attributeOldValue as string; + const newBoxSize = data.attributeNewValue as string; + + // Remove old class and add new class + if ( oldBoxSize ) { + viewWriter.removeClass( 'box-size-' + oldBoxSize, viewElement ); + } + if ( newBoxSize ) { + viewWriter.addClass( 'box-size-' + newBoxSize, viewElement ); + viewWriter.setAttribute( 'data-box-size', newBoxSize, viewElement ); + } + } ); + } ); } } @@ -154,6 +188,41 @@ class InsertIncludeNoteCommand extends Command { } } +class IncludeNoteBoxSizeCommand extends Command { + declare value: BoxSizeValue | null; + + override execute( options: { value: BoxSizeValue } ) { + const model = this.editor.model; + const includeNoteElement = this._getSelectedIncludeNote(); + + if ( includeNoteElement ) { + model.change( writer => { + writer.setAttribute( 'boxSize', options.value, includeNoteElement ); + } ); + } + } + + override refresh() { + const includeNoteElement = this._getSelectedIncludeNote(); + + this.isEnabled = !!includeNoteElement; + this.value = includeNoteElement?.getAttribute( 'boxSize' ) as BoxSizeValue | null ?? null; + } + + private _getSelectedIncludeNote() { + const selection = this.editor.model.document.selection; + const selectedElement = selection.getSelectedElement(); + + if ( selectedElement?.name === 'includeNote' ) { + return selectedElement; + } + + // Check if we're inside an include note + const firstPosition = selection.getFirstPosition(); + return firstPosition?.findAncestor( 'includeNote' ) ?? null; + } +} + /** * Hack coming from https://github.com/ckeditor/ckeditor5/issues/4465 * Source issue: https://github.com/zadam/trilium/issues/1117 @@ -163,7 +232,17 @@ function preventCKEditorHandling( domElement: HTMLElement, editor: Editor ) { // commenting out click events to allow link click handler to still work //domElement.addEventListener( 'click', stopEventPropagationAndHackRendererFocus, { capture: true } ); - domElement.addEventListener( 'mousedown', stopEventPropagationAndHackRendererFocus, { capture: true } ); + + domElement.addEventListener( 'mousedown', ( evt: Event ) => { + evt.stopPropagation(); + // This prevents rendering changed view selection thus preventing to changing DOM selection while inside a widget. + //@ts-expect-error: We are accessing a private field. + editor.editing.view._renderer.isFocused = false; + + // Select the widget so the toolbar can appear + selectIncludeNoteWidget( domElement, editor ); + }, { capture: true } ); + domElement.addEventListener( 'focus', stopEventPropagationAndHackRendererFocus, { capture: true } ); // Prevents TAB handling or other editor keys listeners which might be executed on editors selection. @@ -176,3 +255,31 @@ function preventCKEditorHandling( domElement: HTMLElement, editor: Editor ) { editor.editing.view._renderer.isFocused = false; } } + +function selectIncludeNoteWidget( domElement: HTMLElement, editor: Editor ) { + // Find the parent section element (the widget container) + const sectionElement = domElement.closest( 'section.include-note' ) as HTMLElement | null; + if ( !sectionElement ) { + return; + } + + // Get the view element from the DOM element + const viewElement = editor.editing.view.domConverter.mapDomToView( sectionElement ); + if ( !viewElement || !viewElement.is( 'element' ) ) { + return; + } + + // Get the model element from the view element + const modelElement = editor.editing.mapper.toModelElement( viewElement ); + if ( !modelElement ) { + return; + } + + // Focus the editor view first to ensure selection sync works + editor.editing.view.focus(); + + // Select the model element using a non-undoable batch so it doesn't affect undo + editor.model.enqueueChange( { isUndoable: false }, writer => { + writer.setSelection( modelElement, 'on' ); + } ); +} diff --git a/packages/ckeditor5/src/plugins/inline_code_toolbar.ts b/packages/ckeditor5/src/plugins/inline_code_toolbar.ts new file mode 100644 index 0000000000..750bd158c4 --- /dev/null +++ b/packages/ckeditor5/src/plugins/inline_code_toolbar.ts @@ -0,0 +1,126 @@ +import { BalloonPanelView, ButtonView, Plugin, ToolbarView } from "ckeditor5"; +import CopyToClipboardButton from "./copy_to_clipboard_button"; +import copyIcon from "../icons/copy.svg?raw"; + +/** + * Shows a small toolbar with a copy button when the cursor is on inline code. + */ +export default class InlineCodeToolbar extends Plugin { + + static get requires() { + return [CopyToClipboardButton] as const; + } + + private balloon?: BalloonPanelView; + private toolbar?: ToolbarView; + + init() { + const editor = this.editor; + + // Create toolbar with copy button + this.toolbar = new ToolbarView(editor.locale); + const copyButton = new ButtonView(editor.locale); + copyButton.set({ + icon: copyIcon, + tooltip: "Copy to clipboard" + }); + copyButton.on("execute", () => { + editor.execute("copyToClipboard"); + this.hideToolbar(); + }); + this.toolbar.items.add(copyButton); + + // Create balloon panel + this.balloon = new BalloonPanelView(editor.locale); + this.balloon.content.add(this.toolbar); + this.balloon.class = "ck-toolbar-container"; + + editor.ui.view.body.add(this.balloon); + + // Show/hide based on selection + this.listenTo(editor.model.document.selection, "change:range", () => { + this.updateToolbarVisibility(); + }); + + // Hide on editor blur + this.listenTo(editor.ui.focusTracker, "change:isFocused", (_evt, _name, isFocused) => { + if (!isFocused) { + this.hideToolbar(); + } + }); + } + + private updateToolbarVisibility() { + const editor = this.editor; + const selection = editor.model.document.selection; + const position = selection.getFirstPosition(); + + // Don't show for code blocks (they have their own toolbar) + if (position?.findAncestor("codeBlock")) { + this.hideToolbar(); + return; + } + + // Check if cursor is on inline code + const textNode = position?.textNode; + if (textNode?.hasAttribute("code")) { + this.showToolbar(textNode); + } else { + this.hideToolbar(); + } + } + + private showToolbar(textNode: unknown) { + if (!this.balloon) return; + + const editor = this.editor; + const view = editor.editing.view; + const mapper = editor.editing.mapper; + + // Map model text node to view element + const viewRange = mapper.toViewRange(editor.model.createRangeOn(textNode as any)); + const viewElement = viewRange.getContainedElement(); + + if (!viewElement) { + this.hideToolbar(); + return; + } + + const domElement = view.domConverter.mapViewToDom(viewElement); + if (!domElement || !(domElement instanceof HTMLElement)) { + this.hideToolbar(); + return; + } + + const rect = domElement.getBoundingClientRect(); + this.balloon.pin({ + target: { + top: rect.top, + bottom: rect.bottom, + left: rect.left, + right: rect.right, + width: rect.width, + height: rect.height + } + }); + this.balloon.isVisible = true; + } + + private hideToolbar() { + if (this.balloon) { + this.balloon.isVisible = false; + this.balloon.unpin(); + } + } + + override destroy() { + super.destroy(); + if (this.balloon) { + this.balloon.destroy(); + } + if (this.toolbar) { + this.toolbar.destroy(); + } + } + +} diff --git a/packages/ckeditor5/src/plugins/internallink.ts b/packages/ckeditor5/src/plugins/internallink.ts index f6045dbc9f..b80591fe56 100644 --- a/packages/ckeditor5/src/plugins/internallink.ts +++ b/packages/ckeditor5/src/plugins/internallink.ts @@ -39,7 +39,11 @@ export default class InternalLinkPlugin extends Plugin { class InsertInternalLinkCommand extends Command { refresh() { - this.isEnabled = !this.editor.isReadOnly; + const selection = this.editor.model.document.selection; + const position = selection.getFirstPosition(); + const isInCodeBlock = position?.findAncestor("codeBlock"); + + this.isEnabled = !this.editor.isReadOnly && !isInCodeBlock; } execute() { diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json index 291c25d96a..b53799b55d 100644 --- a/packages/codemirror/package.json +++ b/packages/codemirror/package.json @@ -20,34 +20,34 @@ "@codemirror/state": "6.6.0", "@codemirror/view": "6.41.0", "@eslint/js": "10.0.1", - "@fsegurai/codemirror-theme-abcdef": "6.2.4", - "@fsegurai/codemirror-theme-abyss": "6.2.4", - "@fsegurai/codemirror-theme-android-studio": "6.2.4", - "@fsegurai/codemirror-theme-andromeda": "6.2.4", - "@fsegurai/codemirror-theme-basic-dark": "6.2.4", - "@fsegurai/codemirror-theme-basic-light": "6.2.4", - "@fsegurai/codemirror-theme-cobalt2": "6.0.4", - "@fsegurai/codemirror-theme-forest": "6.2.4", - "@fsegurai/codemirror-theme-github-dark": "6.2.4", - "@fsegurai/codemirror-theme-github-light": "6.2.4", - "@fsegurai/codemirror-theme-gruvbox-dark": "6.2.4", - "@fsegurai/codemirror-theme-gruvbox-light": "6.2.4", + "@fsegurai/codemirror-theme-abcdef": "6.2.5", + "@fsegurai/codemirror-theme-abyss": "6.2.5", + "@fsegurai/codemirror-theme-android-studio": "6.2.5", + "@fsegurai/codemirror-theme-andromeda": "6.2.5", + "@fsegurai/codemirror-theme-basic-dark": "6.2.5", + "@fsegurai/codemirror-theme-basic-light": "6.2.5", + "@fsegurai/codemirror-theme-cobalt2": "6.0.5", + "@fsegurai/codemirror-theme-forest": "6.2.5", + "@fsegurai/codemirror-theme-github-dark": "6.2.5", + "@fsegurai/codemirror-theme-github-light": "6.2.5", + "@fsegurai/codemirror-theme-gruvbox-dark": "6.2.5", + "@fsegurai/codemirror-theme-gruvbox-light": "6.2.5", "@fsegurai/codemirror-theme-high-contrast-dark": "6.0.2", "@fsegurai/codemirror-theme-high-contrast-light": "6.0.2", - "@fsegurai/codemirror-theme-material-dark": "6.2.4", - "@fsegurai/codemirror-theme-material-light": "6.2.4", + "@fsegurai/codemirror-theme-material-dark": "6.2.5", + "@fsegurai/codemirror-theme-material-light": "6.2.5", "@fsegurai/codemirror-theme-material-ocean": "6.0.1", - "@fsegurai/codemirror-theme-monokai": "6.2.4", - "@fsegurai/codemirror-theme-nord": "6.2.4", - "@fsegurai/codemirror-theme-palenight": "6.2.4", - "@fsegurai/codemirror-theme-solarized-dark": "6.2.4", - "@fsegurai/codemirror-theme-solarized-light": "6.2.4", + "@fsegurai/codemirror-theme-monokai": "6.2.5", + "@fsegurai/codemirror-theme-nord": "6.2.5", + "@fsegurai/codemirror-theme-palenight": "6.2.5", + "@fsegurai/codemirror-theme-solarized-dark": "6.2.5", + "@fsegurai/codemirror-theme-solarized-light": "6.2.5", "@fsegurai/codemirror-theme-synthwave-84": "6.0.2", - "@fsegurai/codemirror-theme-tokyo-night-day": "6.2.4", - "@fsegurai/codemirror-theme-tokyo-night-storm": "6.2.4", - "@fsegurai/codemirror-theme-volcano": "6.2.4", - "@fsegurai/codemirror-theme-vscode-dark": "6.2.5", - "@fsegurai/codemirror-theme-vscode-light": "6.2.5", + "@fsegurai/codemirror-theme-tokyo-night-day": "6.2.5", + "@fsegurai/codemirror-theme-tokyo-night-storm": "6.2.5", + "@fsegurai/codemirror-theme-volcano": "6.2.5", + "@fsegurai/codemirror-theme-vscode-dark": "6.2.6", + "@fsegurai/codemirror-theme-vscode-light": "6.2.6", "@replit/codemirror-indentation-markers": "6.5.3", "@replit/codemirror-lang-nix": "6.0.1", "@replit/codemirror-vim": "6.3.0", @@ -57,7 +57,7 @@ "codemirror-lang-elixir": "4.0.1", "codemirror-lang-hcl": "0.1.0", "codemirror-lang-mermaid": "0.5.0", - "eslint-linter-browserify": "10.1.0", + "eslint-linter-browserify": "10.2.0", "globals": "17.4.0" } } diff --git a/packages/commons/package.json b/packages/commons/package.json index eede4bf937..bdac3a743c 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -16,6 +16,6 @@ }, "dependencies": { "dayjs": "1.11.20", - "marked": "17.0.5" + "marked": "18.0.0" } } \ No newline at end of file diff --git a/packages/commons/src/lib/options_interface.ts b/packages/commons/src/lib/options_interface.ts index 590e3436dc..da6d9b7f01 100644 --- a/packages/commons/src/lib/options_interface.ts +++ b/packages/commons/src/lib/options_interface.ts @@ -23,6 +23,7 @@ export interface OptionDefinitions extends KeyboardShortcutsOptions 0 && ancestors[ancestors.length - 1] !== this) { + ancestors.pop(); + } + if (ancestors.includes(value)) { + return "[Circular]"; + } + if (ancestors.length >= MAX_LOG_DEPTH) { + return "[Object]"; + } + ancestors.push(value); + return value; + }; +} + export function formatLogMessage(message: string | object) { if (typeof message === "object") { try { - return JSON.stringify(message, null, 4); + return JSON.stringify(message, getCircularReplacer(), 4); } catch (e) { return message.toString(); } diff --git a/packages/commons/src/lib/ws_api.ts b/packages/commons/src/lib/ws_api.ts index c1f2457ccb..f92fe26ddf 100644 --- a/packages/commons/src/lib/ws_api.ts +++ b/packages/commons/src/lib/ws_api.ts @@ -120,6 +120,7 @@ export type WebSocketMessage = AllTaskDefinitions | { } | { type: "toast", message: string; + timeout?: number; } | { type: "api-log-messages", noteId: string, diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json index 1e24edd035..fba620256c 100644 --- a/packages/share-theme/package.json +++ b/packages/share-theme/package.json @@ -24,15 +24,15 @@ ], "license": "Apache-2.0", "dependencies": { - "fuse.js": "7.2.0", + "fuse.js": "7.3.0", "katex": "0.16.45", "mermaid": "11.14.0" }, "devDependencies": { "@digitak/esrun": "3.2.26", "@triliumnext/ckeditor5": "workspace:*", - "@typescript-eslint/eslint-plugin": "8.58.0", - "@typescript-eslint/parser": "8.58.0", + "@typescript-eslint/eslint-plugin": "8.58.1", + "@typescript-eslint/parser": "8.58.1", "dotenv": "17.4.1", "esbuild": "0.28.0", "eslint": "10.2.0", diff --git a/packages/splitjs/package.json b/packages/splitjs/package.json index 5e69a1de67..ab77cb8bee 100644 --- a/packages/splitjs/package.json +++ b/packages/splitjs/package.json @@ -39,6 +39,6 @@ "devDependencies": { "@rollup/plugin-buble": "1.0.3", "happy-dom": "20.8.9", - "vitest": "4.1.2" + "vitest": "4.1.3" } } diff --git a/packages/trilium-core/src/becca/becca_service.ts b/packages/trilium-core/src/becca/becca_service.ts index c7b5731e21..8dbf70a722 100644 --- a/packages/trilium-core/src/becca/becca_service.ts +++ b/packages/trilium-core/src/becca/becca_service.ts @@ -106,7 +106,7 @@ function getNoteTitleArrayForPath(notePathArray: string[]) { function getNoteTitleForPath(notePathArray: string[]) { const titles = getNoteTitleArrayForPath(notePathArray); - return titles.join(" / "); + return titles.join(" › "); } export default { diff --git a/packages/trilium-core/src/becca/similarity.ts b/packages/trilium-core/src/becca/similarity.ts index 2696c9c51b..28d59d0e32 100644 --- a/packages/trilium-core/src/becca/similarity.ts +++ b/packages/trilium-core/src/becca/similarity.ts @@ -409,7 +409,10 @@ async function findSimilarNotes(noteId: string): Promise([ "codeNoteTheme", "syncServerHost", "syncServerTimeout", + "syncServerTimeoutTimeScale", "syncProxy", "hoistedNoteId", "mainFontSize", @@ -94,6 +95,7 @@ const ALLOWED_OPTIONS = new Set([ "textNoteEmojiCompletionEnabled", "textNoteCompletionEnabled", "textNoteSlashCommandsEnabled", + "includeNoteDefaultBoxSize", "layoutOrientation", "backgroundEffects", "allowedHtmlTags", diff --git a/packages/trilium-core/src/services/backend_script_api.ts b/packages/trilium-core/src/services/backend_script_api.ts index 1ce6fc13eb..ef877a79bd 100644 --- a/packages/trilium-core/src/services/backend_script_api.ts +++ b/packages/trilium-core/src/services/backend_script_api.ts @@ -3,6 +3,7 @@ import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity"; import Becca from "../becca/becca-interface"; import axios from "axios"; import * as cheerio from "cheerio"; +import * as htmlParser from "node-html-parser"; import xml2js from "xml2js"; import branchService from "./branches"; import { NoteParams } from "./notes.js"; @@ -78,10 +79,10 @@ export interface Api { originEntity?: AbstractBeccaEntity | null; /** - * Axios library for HTTP requests. See {@link https://axios-http.com} for documentation - * @deprecated use native (browser compatible) fetch() instead + * @deprecated Axios was deprecated since April 2024 and has now been removed following the March 2026 supply chain attack. + * Use the native fetch() API instead. */ - axios: typeof axios; + axios: undefined; /** * day.js library for date manipulation. See {@link https://day.js.org} for documentation @@ -96,10 +97,16 @@ export interface Api { /** * cheerio library for HTML parsing and manipulation. See {@link https://cheerio.js.org} for documentation + * @deprecated cheerio will be removed in a future version. Use api.htmlParser (node-html-parser) instead. */ - cheerio: typeof cheerio; + /** + * node-html-parser library for HTML parsing. See {@link https://github.com/piotr-nicol/node-html-parser} for documentation. + * This is the recommended replacement for cheerio. + */ + htmlParser: typeof htmlParser; + /** * Instance name identifies particular Trilium instance. It can be useful for scripts * if some action needs to happen on only one specific instance. @@ -438,10 +445,18 @@ function BackendScriptApi(this: Api, currentNote: BNote, apiParams: ApiParams) { (this as any)[key] = apiParams[key as keyof ApiParams]; } - this.axios = axios; + // Throw when axios is used (removed after 2 years of deprecation + supply chain attack) + const axiosError = () => { + throw new Error("api.axios was deprecated since 2024 and has been removed following the March 2026 npm supply chain compromise. Please update your script to use the native fetch() API."); + }; + this.axios = new Proxy(axiosError, { + get: axiosError, + apply: axiosError + }) as unknown as undefined; this.dayjs = dayjs; this.xml2js = xml2js; this.cheerio = cheerio; + this.htmlParser = htmlParser; this.getInstanceName = () => (config.General ? config.General.instanceName : null); this.getNote = (noteId) => becca.getNote(noteId); this.getBranch = (branchId) => becca.getBranch(branchId); diff --git a/packages/trilium-core/src/services/sanitizer.ts b/packages/trilium-core/src/services/sanitizer.ts index 3d2446d370..e341a73796 100644 --- a/packages/trilium-core/src/services/sanitizer.ts +++ b/packages/trilium-core/src/services/sanitizer.ts @@ -50,7 +50,10 @@ export function sanitizeHtml(dirtyHtml: string) { allowedStyles: { "*": { color: colorRegex, - "background-color": colorRegex + "background-color": colorRegex, + "margin-left": sizeRegex, + "padding-left": sizeRegex, + "text-align": [/^\s*(left|center|right|justify)\s*$/] }, figure: { float: [/^\s*(left|right|none)\s*$/], diff --git a/packages/trilium-core/src/services/script.ts b/packages/trilium-core/src/services/script.ts index bbe58f8cab..d4fbb73df5 100644 --- a/packages/trilium-core/src/services/script.ts +++ b/packages/trilium-core/src/services/script.ts @@ -1,4 +1,5 @@ import { ScriptParams } from "@triliumnext/commons"; +import { t } from "i18next"; import { transform } from "sucrase"; import type Becca from "../becca/becca-interface.js"; @@ -8,6 +9,7 @@ import { getLog } from "./log.js"; import ScriptContext from "./script_context.js"; import { getContext } from "./context.js"; import { unwrapStringOrBuffer } from "./utils/binary.js"; +import ws from "./ws.js"; export interface Bundle { note?: BNote; @@ -19,9 +21,25 @@ export interface Bundle { } function executeNote(note: BNote, apiParams: ApiParams) { - if (!note.isJavaScript() || note.getScriptEnv() !== "backend" || !note.isContentAvailable()) { + if (!note.isContentAvailable()) { + throw new Error(`Cannot execute script note '${note.noteId}' because it is protected and protected session is not available. Enter protected session and try again.`); + } + + if (!note.isJavaScript() || note.getScriptEnv() !== "backend") { getLog().info(`Cannot execute note ${note.noteId} "${note.getTitleOrProtected()}", note must be of type "Code: JS backend"`); + // Warn the user if they're trying to run a frontend script in the backend + const actualEnv = note.getScriptEnv(); + if (note.isJavaScript() && actualEnv === "frontend") { + const message = t("script.wrong-environment", { + noteTitle: note.getTitleOrProtected(), + noteId: note.noteId, + actualEnv: "frontend", + expectedEnv: "backend" + }); + ws.sendMessageToAllClients({ type: "toast", message, timeout: 10000 }); + } + return; } @@ -119,6 +137,20 @@ function getParams(params?: ScriptParams) { } function getScriptBundleForFrontend(note: BNote, script?: string, params?: ScriptParams) { + // Warn the user if they're trying to run a backend script in the frontend + if (note.isJavaScript() && note.getScriptEnv() === "backend") { + getLog().info(`Cannot execute note ${note.noteId} "${note.getTitleOrProtected()}" in frontend, note is of type "Code: JS backend"`); + + const message = t("script.wrong-environment", { + noteTitle: note.getTitleOrProtected(), + noteId: note.noteId, + actualEnv: "backend", + expectedEnv: "frontend" + }); + ws.sendMessageToAllClients({ type: "toast", message, timeout: 10000 }); + return; + } + let overrideContent: string | null = null; if (script) { @@ -143,7 +175,7 @@ function getScriptBundleForFrontend(note: BNote, script?: string, params?: Scrip export function getScriptBundle(note: BNote, root: boolean = true, scriptEnv: string | null = null, includedNoteIds: string[] = [], overrideContent: string | null = null): Bundle | undefined { if (!note.isContentAvailable()) { - return; + throw new Error(`Cannot execute script note '${note.noteId}' because it is protected and protected session is not available. Enter protected session and try again.`); } if (!(note.isJavaScript() || note.isHtml() || note.isJsx())) { diff --git a/packages/trilium-core/src/services/search/services/parse.spec.ts b/packages/trilium-core/src/services/search/services/parse.spec.ts index cd59ce7f09..ccf4925499 100644 --- a/packages/trilium-core/src/services/search/services/parse.spec.ts +++ b/packages/trilium-core/src/services/search/services/parse.spec.ts @@ -285,7 +285,7 @@ describe("Invalid expressions", () => { searchContext }); - expect(searchContext.error).toEqual(`Error near token "#second" in "#first = #second", it's possible to compare with constant only.`); + expect(searchContext.error).toEqual(`Error in "#first = #second": cannot compare with "#second". To search for a literal value, use quotes: "#second"`); searchContext = new SearchContext(); searchContext.originalQuery = "#first = note.relations.second"; @@ -296,7 +296,7 @@ describe("Invalid expressions", () => { searchContext }); - expect(searchContext.error).toEqual(`Error near token "note" in "#first = note.relations.second", it's possible to compare with constant only.`); + expect(searchContext.error).toEqual(`Error in "#first = note.relations.second": "note" is a reserved keyword. To search for a literal value, use quotes: "note"`); const rootExp = parse( { @@ -317,6 +317,27 @@ describe("Invalid expressions", () => { expect(labelComparisonExp.attributeType).toEqual("label"); expect(labelComparisonExp.attributeName).toEqual("first"); expect(labelComparisonExp.comparator).toBeTruthy(); + + // Verify that quoted "note" keyword works (issue #8850) + const rootExp2 = parse( + { + fulltextTokens: [], + expressionTokens: [ + { token: "#clipType", inQuotes: false }, + { token: "=", inQuotes: false }, + { token: "note", inQuotes: true } + ], + searchContext: new SearchContext() + }, + AndExp + ); + + assertIsArchived(rootExp2.subExpressions[0]); + + const labelComparisonExp2 = expectExpression(rootExp2.subExpressions[2], LabelComparisonExp); + expect(labelComparisonExp2.attributeType).toEqual("label"); + expect(labelComparisonExp2.attributeName).toEqual("cliptype"); + expect(labelComparisonExp2.comparator).toBeTruthy(); }); it("searching by relation without note property", () => { diff --git a/packages/trilium-core/src/services/search/services/parse.ts b/packages/trilium-core/src/services/search/services/parse.ts index c0a08d89d0..6756c563f6 100644 --- a/packages/trilium-core/src/services/search/services/parse.ts +++ b/packages/trilium-core/src/services/search/services/parse.ts @@ -1,4 +1,5 @@ import { dayjs } from "@triliumnext/commons"; +import { t } from "i18next"; import AncestorExp from "../expressions/ancestor.js"; import AndExp from "../expressions/and.js"; @@ -96,7 +97,10 @@ function getExpression(tokens: TokenData[], searchContext: SearchContext, level const operand = tokens[i]; if (!operand.inQuotes && (operand.token.startsWith("#") || operand.token.startsWith("~") || operand.token === "note")) { - searchContext.addError(`Error near token "${operand.token}" in ${context(i)}, it's possible to compare with constant only.`); + const hint = operand.token === "note" + ? t("search.error.reserved-keyword", { token: operand.token }) + : t("search.error.cannot-compare-with", { token: operand.token }); + searchContext.addError(t("search.error.in-context", { context: context(i), message: hint })); return null; } @@ -434,9 +438,15 @@ function getExpression(tokens: TokenData[], searchContext: SearchContext, level searchContext.addError("Mixed usage of AND/OR - always use parenthesis to group AND/OR expressions."); } } else if (isOperator({ token })) { - searchContext.addError(`Misplaced or incomplete expression "${token}"`); + searchContext.addError(t("search.error.misplaced-expression", { token })); } else { - searchContext.addError(`Unrecognized expression "${token}"`); + // Check if this looks like a fulltext search term placed after attribute filters + const looksLikeFulltext = !token.startsWith("#") && !token.startsWith("~") && !token.startsWith("note."); + if (looksLikeFulltext) { + searchContext.addError(t("search.error.fulltext-after-expression", { token })); + } else { + searchContext.addError(t("search.error.unrecognized-expression", { token })); + } } if (!op && expressions.length > 1) { diff --git a/packages/turndown-plugin-gfm/package.json b/packages/turndown-plugin-gfm/package.json index c371be7ce1..ec1e5dd255 100644 --- a/packages/turndown-plugin-gfm/package.json +++ b/packages/turndown-plugin-gfm/package.json @@ -27,6 +27,6 @@ "devDependencies": { "happy-dom": "20.8.9", "turndown": "7.2.4", - "vitest": "4.1.2" + "vitest": "4.1.3" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 603b6fb235..abe72e5681 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,9 +61,16 @@ overrides: handlebars@<4.7.9: '>=4.7.9' qs@<6.14.2: '>=6.14.2' minimatch@<3.1.4: ^3.1.4 - minimatch@3>brace-expansion: ^1.1.13 + minimatch@3>brace-expansion: ^5.0.0 serialize-javascript@<7.0.5: '>=7.0.5' webpack@<5.104.1: '>=5.104.1' + file-type@>=13.0.0 <21.3.1: '>=21.3.1' + vite@>=7.0.0 <=7.3.1: '>=7.3.2' + vite@>=7.1.0 <=7.3.1: '>=7.3.2' + hono@<4.12.12: '>=4.12.12' + hono@>=4.0.0 <=4.12.11: '>=4.12.12' + '@hono/node-server@<1.19.13': '>=1.19.13' + basic-ftp@=5.2.0: '>=5.2.1' patchedDependencies: '@ckeditor/ckeditor5-code-block': @@ -99,14 +106,14 @@ importers: specifier: 24.12.2 version: 24.12.2 '@vitest/browser-webdriverio': - specifier: 4.1.2 - version: 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + specifier: 4.1.3 + version: 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/coverage-v8': - specifier: 4.1.2 - version: 4.1.2(@vitest/browser@4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(@vitest/browser@4.1.3)(vitest@4.1.3) '@vitest/ui': - specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(vitest@4.1.3) chalk: specifier: 5.6.2 version: 5.6.2 @@ -132,8 +139,8 @@ importers: specifier: 2.10.1 version: 2.10.1(eslint@10.2.0(jiti@2.6.1)) eslint-plugin-simple-import-sort: - specifier: 12.1.1 - version: 12.1.1(eslint@10.2.0(jiti@2.6.1)) + specifier: 13.0.0 + version: 13.0.0(eslint@10.2.0(jiti@2.6.1)) happy-dom: specifier: 20.8.9 version: 20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -154,7 +161,7 @@ importers: version: 0.18.0 rollup-plugin-webpack-stats: specifier: 3.1.0 - version: 3.1.0(rolldown@1.0.0-rc.12)(rollup@4.60.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.1.0(rolldown@1.0.0-rc.13)(rollup@4.60.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) tslib: specifier: 2.8.1 version: 2.8.1 @@ -165,20 +172,17 @@ importers: specifier: 6.0.2 version: 6.0.2 typescript-eslint: - specifier: 8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - upath: - specifier: 2.0.1 - version: 2.0.1 + specifier: 8.58.1 + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) vite: - specifier: 8.0.5 - version: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.0.7 + version: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@24.12.2)(rollup@4.60.1)(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.5.4(@types/node@24.12.2)(rollup@4.60.1)(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) apps/build-docs: dependencies: @@ -346,8 +350,8 @@ importers: specifier: 8.11.1 version: 8.11.1 marked: - specifier: 17.0.5 - version: 17.0.5 + specifier: 18.0.0 + version: 18.0.0 mermaid: specifier: 11.14.0 version: 11.14.0 @@ -386,8 +390,8 @@ importers: specifier: 5.0.0 version: 5.0.0 '@prefresh/vite': - specifier: 2.4.12 - version: 2.4.12(preact@10.29.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 3.0.0 + version: 3.0.0(preact@10.29.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -420,7 +424,7 @@ importers: version: 0.7.2 vite-plugin-static-copy: specifier: 4.0.1 - version: 4.0.1(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.0.1(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) apps/client-standalone: dependencies: @@ -560,8 +564,8 @@ importers: specifier: 8.11.1 version: 8.11.1 marked: - specifier: 17.0.5 - version: 17.0.5 + specifier: 18.0.0 + version: 18.0.0 mermaid: specifier: 11.14.0 version: 11.14.0 @@ -601,7 +605,7 @@ importers: version: 5.0.0 '@preact/preset-vite': specifier: 2.10.2 - version: 2.10.2(@babel/core@7.29.0)(preact@10.29.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.10.2(@babel/core@7.29.0)(preact@10.29.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@types/bootstrap': specifier: 5.2.10 version: 5.2.10 @@ -637,7 +641,7 @@ importers: version: 0.7.2 vite-plugin-static-copy: specifier: 4.0.1 - version: 4.0.1(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.0.1(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) apps/db-compare: dependencies: @@ -795,20 +799,20 @@ importers: apps/server: dependencies: '@ai-sdk/anthropic': - specifier: 3.0.66 - version: 3.0.66(zod@4.3.6) + specifier: 3.0.68 + version: 3.0.68(zod@4.3.6) '@ai-sdk/google': - specifier: 3.0.58 - version: 3.0.58(zod@4.3.6) + specifier: 3.0.60 + version: 3.0.60(zod@4.3.6) '@ai-sdk/openai': - specifier: 3.0.50 - version: 3.0.50(zod@4.3.6) + specifier: 3.0.52 + version: 3.0.52(zod@4.3.6) '@modelcontextprotocol/sdk': specifier: ^1.12.1 version: 1.29.0(zod@4.3.6) ai: - specifier: 6.0.146 - version: 6.0.146(zod@4.3.6) + specifier: 6.0.153 + version: 6.0.153(zod@4.3.6) better-sqlite3: specifier: 12.8.0 version: 12.8.0 @@ -918,9 +922,6 @@ importers: archiver: specifier: 7.0.1 version: 7.0.1 - axios: - specifier: 1.14.0 - version: 1.14.0(debug@4.4.3) cheerio: specifier: 1.2.0 version: 1.2.0 @@ -1003,11 +1004,11 @@ importers: specifier: 6.1.0 version: 6.1.0 jimp: - specifier: 1.6.0 - version: 1.6.0 + specifier: 1.6.1 + version: 1.6.1 marked: - specifier: 17.0.5 - version: 17.0.5 + specifier: 18.0.0 + version: 18.0.0 multer: specifier: 2.1.1 version: 2.1.1 @@ -1051,8 +1052,8 @@ importers: specifier: 1.8.0 version: 1.8.0 vite: - specifier: 8.0.5 - version: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.0.7 + version: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) xml2js: specifier: 0.6.2 version: 0.6.2 @@ -1074,10 +1075,10 @@ importers: devDependencies: '@wxt-dev/auto-icons': specifier: 1.1.1 - version: 1.1.1(wxt@0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 1.1.1(wxt@0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) wxt: specifier: 0.20.20 - version: 0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + version: 0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) apps/website: dependencies: @@ -1099,7 +1100,7 @@ importers: devDependencies: '@preact/preset-vite': specifier: 2.10.5 - version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.60.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.60.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) eslint: specifier: 10.2.0 version: 10.2.0(jiti@2.6.1) @@ -1113,11 +1114,11 @@ importers: specifier: 0.4.3 version: 0.4.3 vite: - specifier: 8.0.5 - version: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + specifier: 8.0.7 + version: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) packages/ckeditor5: dependencies: @@ -1152,17 +1153,17 @@ importers: specifier: '>=4.1.0' version: 5.0.0 '@typescript-eslint/eslint-plugin': - specifier: 8.58.0 - version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': - specifier: 8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@vitest/browser': - specifier: 4.1.2 - version: 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3) '@vitest/coverage-istanbul': - specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(vitest@4.1.3) ckeditor5: specifier: 48.0.0 version: 48.0.0 @@ -1183,10 +1184,10 @@ importers: version: 6.0.2 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.0.0(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) webdriverio: specifier: 9.27.0 version: 9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1197,17 +1198,17 @@ importers: specifier: '>=4.1.0' version: 5.0.0 '@typescript-eslint/eslint-plugin': - specifier: 8.58.0 - version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': - specifier: 8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@vitest/browser': - specifier: 4.1.2 - version: 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3) '@vitest/coverage-istanbul': - specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(vitest@4.1.3) ckeditor5: specifier: 48.0.0 version: 48.0.0 @@ -1228,10 +1229,10 @@ importers: version: 6.0.2 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.0.0(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) webdriverio: specifier: 9.27.0 version: 9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1242,17 +1243,17 @@ importers: specifier: '>=4.1.0' version: 5.0.0 '@typescript-eslint/eslint-plugin': - specifier: 8.58.0 - version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': - specifier: 8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@vitest/browser': - specifier: 4.1.2 - version: 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3) '@vitest/coverage-istanbul': - specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(vitest@4.1.3) ckeditor5: specifier: 48.0.0 version: 48.0.0 @@ -1273,10 +1274,10 @@ importers: version: 6.0.2 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.0.0(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) webdriverio: specifier: 9.27.0 version: 9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1294,17 +1295,17 @@ importers: specifier: '>=4.1.0' version: 5.0.0 '@typescript-eslint/eslint-plugin': - specifier: 8.58.0 - version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': - specifier: 8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@vitest/browser': - specifier: 4.1.2 - version: 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3) '@vitest/coverage-istanbul': - specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(vitest@4.1.3) ckeditor5: specifier: 48.0.0 version: 48.0.0 @@ -1325,10 +1326,10 @@ importers: version: 6.0.2 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.0.0(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) webdriverio: specifier: 9.27.0 version: 9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1339,17 +1340,17 @@ importers: specifier: '>=4.1.0' version: 5.0.0 '@typescript-eslint/eslint-plugin': - specifier: 8.58.0 - version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': - specifier: 8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@vitest/browser': - specifier: 4.1.2 - version: 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3) '@vitest/coverage-istanbul': - specifier: 4.1.2 - version: 4.1.2(vitest@4.1.2) + specifier: 4.1.3 + version: 4.1.3(vitest@4.1.3) ckeditor5: specifier: 48.0.0 version: 48.0.0 @@ -1370,10 +1371,10 @@ importers: version: 6.0.2 vite-plugin-svgo: specifier: 2.0.0 - version: 2.0.0(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + version: 2.0.0(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) webdriverio: specifier: 9.27.0 version: 9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) @@ -1426,41 +1427,41 @@ importers: specifier: 10.0.1 version: 10.0.1(eslint@10.2.0(jiti@2.6.1)) '@fsegurai/codemirror-theme-abcdef': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-abyss': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-android-studio': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-andromeda': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-basic-dark': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-basic-light': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-cobalt2': - specifier: 6.0.4 - version: 6.0.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.0.5 + version: 6.0.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-forest': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-github-dark': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-github-light': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-gruvbox-dark': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-gruvbox-light': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-high-contrast-dark': specifier: 6.0.2 version: 6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) @@ -1468,47 +1469,47 @@ importers: specifier: 6.0.2 version: 6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-material-dark': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-material-light': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-material-ocean': specifier: 6.0.1 version: 6.0.1(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-monokai': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-nord': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-palenight': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-solarized-dark': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-solarized-light': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-synthwave-84': specifier: 6.0.2 version: 6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-tokyo-night-day': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-tokyo-night-storm': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-volcano': - specifier: 6.2.4 - version: 6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.5 + version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-vscode-dark': - specifier: 6.2.5 - version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.6 + version: 6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@fsegurai/codemirror-theme-vscode-light': - specifier: 6.2.5 - version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) + specifier: 6.2.6 + version: 6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3) '@replit/codemirror-indentation-markers': specifier: 6.5.3 version: 6.5.3(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0) @@ -1537,8 +1538,8 @@ importers: specifier: 0.5.0 version: 0.5.0 eslint-linter-browserify: - specifier: 10.1.0 - version: 10.1.0 + specifier: 10.2.0 + version: 10.2.0 globals: specifier: 17.4.0 version: 17.4.0 @@ -1549,8 +1550,8 @@ importers: specifier: 1.11.20 version: 1.11.20 marked: - specifier: 17.0.5 - version: 17.0.5 + specifier: 18.0.0 + version: 18.0.0 packages/express-partial-content: {} @@ -1588,8 +1589,8 @@ importers: packages/share-theme: dependencies: fuse.js: - specifier: 7.2.0 - version: 7.2.0 + specifier: 7.3.0 + version: 7.3.0 katex: specifier: 0.16.45 version: 0.16.45 @@ -1604,11 +1605,11 @@ importers: specifier: workspace:* version: link:../ckeditor5 '@typescript-eslint/eslint-plugin': - specifier: 8.58.0 - version: 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/parser': - specifier: 8.58.0 - version: 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + specifier: 8.58.1 + version: 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) dotenv: specifier: 17.4.1 version: 17.4.1 @@ -1634,8 +1635,8 @@ importers: specifier: 20.8.9 version: 20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5) vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) packages/trilium-core: dependencies: @@ -1701,8 +1702,8 @@ importers: specifier: 7.2.4 version: 7.2.4 vitest: - specifier: 4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + specifier: 4.1.3 + version: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) packages: @@ -1712,32 +1713,32 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/anthropic@3.0.66': - resolution: {integrity: sha512-yJpQ2x6ACwbXo5D6HsVWd2FFnnWcetfGx4oxkG66P8FawusvrY2vL2qMiiNTruWrxEYDy+YHc3ctv8C769MMJA==} + '@ai-sdk/anthropic@3.0.68': + resolution: {integrity: sha512-BAd+fmgYoJMmGw0/uV+jRlXX60PyGxelA6Clp4cK/NI0dsyv9jOOwzQmKNaz2nwb+Jz7HqI7I70KK4XtU5EcXQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.88': - resolution: {integrity: sha512-AFoj7xdWAtCQcy0jJ235ENSakYM8D28qBX+rB+/rX4r8qe/LXgl0e5UivOqxAlIM5E9jnQdYxIPuj3XFtGk/yg==} + '@ai-sdk/gateway@3.0.93': + resolution: {integrity: sha512-8D6C9eEvDq6IgrdlWzpbniahDkoLiieTCrpzH8p/Hw63/0iPnZJ1uZcqxHrDIVDW/+aaGhBXqmx5C7HSd2eMmQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@3.0.58': - resolution: {integrity: sha512-7P7s8g/FoIxesx2y32eK8idAMLOFHN2f4gs5KYi8q2QaScuubXFjgFMFqbjYF5bc92akiOd/C6OG0vIDlV7t2Q==} + '@ai-sdk/google@3.0.60': + resolution: {integrity: sha512-ye/hG0LeO24VmjLbfgkFZV8V8k/l4nVBODutpJQkFPyUiGOCbFtFUTgxSeC7+njrk5+HhgyHrzJay4zmhwMH+w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@3.0.50': - resolution: {integrity: sha512-7M7bklrS+gckzPdpQpC3iG5aN5aQPRJdAJQ5jt7sEgYCqDgUuef9x4Nd570+ghIfKTZvV6tSqeeTuD6De/bZig==} + '@ai-sdk/openai@3.0.52': + resolution: {integrity: sha512-4Rr8NCGmfWTz6DCUvixn9UmyZcMatiHn0zWoMzI3JCUe9R1P/vsPOpCBALKoSzVYOjyJnhtnVIbfUKujcS39uw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.22': - resolution: {integrity: sha512-B2OTFcRw/Pdka9ZTjpXv6T6qZ6RruRuLokyb8HwW+aoW9ndJ3YasA3/mVswyJw7VMBF8ofXgqvcrCt9KYvFifg==} + '@ai-sdk/provider-utils@4.0.23': + resolution: {integrity: sha512-z8GlDaCmRSDlqkMF2f4/RFgWxdarvIbyuk+m6WXT1LYgsnGiXRJGTD2Z1+SDl3LqtFuRtGX1aghYvQLoHL/9pg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2551,12 +2552,15 @@ packages: engines: {node: '>=14.14'} hasBin: true - '@emnapi/core@1.9.0': - resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} + '@emnapi/core@1.9.1': + resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} '@emnapi/runtime@1.9.0': resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} + '@emnapi/runtime@1.9.1': + resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} + '@emnapi/wasi-threads@1.2.0': resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} @@ -2588,12 +2592,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.27.5': - resolution: {integrity: sha512-nGsF/4C7uzUj+Nj/4J+Zt0bYQ6bz33Phz8Lb2N80Mti1HjGclTJdXZ+9APC4kLvONbjxN1zfvYNd8FEcbBK/MQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.28.0': resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} @@ -2612,12 +2610,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.27.5': - resolution: {integrity: sha512-Oeghq+XFgh1pUGd1YKs4DDoxzxkoUkvko+T/IVKwlghKLvvjbGFB3ek8VEDBmNvqhwuL0CQS3cExdzpmUyIrgA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.28.0': resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} engines: {node: '>=18'} @@ -2636,12 +2628,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.27.5': - resolution: {integrity: sha512-Cv781jd0Rfj/paoNrul1/r4G0HLvuFKYh7C9uHZ2Pl8YXstzvCyyeWENTFR9qFnRzNMCjXmsulZuvosDg10Mog==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.28.0': resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} engines: {node: '>=18'} @@ -2660,12 +2646,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.27.5': - resolution: {integrity: sha512-nQD7lspbzerlmtNOxYMFAGmhxgzn8Z7m9jgFkh6kpkjsAhZee1w8tJW3ZlW+N9iRePz0oPUDrYrXidCPSImD0Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.28.0': resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} engines: {node: '>=18'} @@ -2684,12 +2664,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.27.5': - resolution: {integrity: sha512-I+Ya/MgC6rr8oRWGRDF3BXDfP8K1BVUggHqN6VI2lUZLdDi1IM1v2cy0e3lCPbP+pVcK3Tv8cgUhHse1kaNZZw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.28.0': resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} engines: {node: '>=18'} @@ -2708,12 +2682,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.5': - resolution: {integrity: sha512-MCjQUtC8wWJn/pIPM7vQaO69BFgwPD1jriEdqwTCKzWjGgkMbcg+M5HzrOhPhuYe1AJjXlHmD142KQf+jnYj8A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.28.0': resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} engines: {node: '>=18'} @@ -2732,12 +2700,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.27.5': - resolution: {integrity: sha512-X6xVS+goSH0UelYXnuf4GHLwpOdc8rgK/zai+dKzBMnncw7BTQIwquOodE7EKvY2UVUetSqyAfyZC1D+oqLQtg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.28.0': resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} engines: {node: '>=18'} @@ -2756,12 +2718,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.5': - resolution: {integrity: sha512-233X1FGo3a8x1ekLB6XT69LfZ83vqz+9z3TSEQCTYfMNY880A97nr81KbPcAMl9rmOFp11wO0dP+eB18KU/Ucg==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.28.0': resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} engines: {node: '>=18'} @@ -2780,12 +2736,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.27.5': - resolution: {integrity: sha512-euKkilsNOv7x/M1NKsx5znyprbpsRFIzTV6lWziqJch7yWYayfLtZzDxDTl+LSQDJYAjd9TVb/Kt5UKIrj2e4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.28.0': resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} engines: {node: '>=18'} @@ -2804,12 +2754,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.5': - resolution: {integrity: sha512-0wkVrYHG4sdCCN/bcwQ7yYMXACkaHc3UFeaEOwSVW6e5RycMageYAFv+JS2bKLwHyeKVUvtoVH+5/RHq0fgeFw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.28.0': resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} engines: {node: '>=18'} @@ -2828,12 +2772,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.27.5': - resolution: {integrity: sha512-hVRQX4+P3MS36NxOy24v/Cdsimy/5HYePw+tmPqnNN1fxV0bPrFWR6TMqwXPwoTM2VzbkA+4lbHWUKDd5ZDA/w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.28.0': resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} engines: {node: '>=18'} @@ -2852,12 +2790,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.5': - resolution: {integrity: sha512-mKqqRuOPALI8nDzhOBmIS0INvZOOFGGg5n1osGIXAx8oersceEbKd4t1ACNTHM3sJBXGFAlEgqM+svzjPot+ZQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.28.0': resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} engines: {node: '>=18'} @@ -2876,12 +2808,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.5': - resolution: {integrity: sha512-EE/QXH9IyaAj1qeuIV5+/GZkBTipgGO782Ff7Um3vPS9cvLhJJeATy4Ggxikz2inZ46KByamMn6GqtqyVjhenA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.28.0': resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} engines: {node: '>=18'} @@ -2900,12 +2826,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.5': - resolution: {integrity: sha512-0V2iF1RGxBf1b7/BjurA5jfkl7PtySjom1r6xOK2q9KWw/XCpAdtB6KNMO+9xx69yYfSCRR9FE0TyKfHA2eQMw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.28.0': resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} engines: {node: '>=18'} @@ -2924,12 +2844,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.27.5': - resolution: {integrity: sha512-rYxThBx6G9HN6tFNuvB/vykeLi4VDsm5hE5pVwzqbAjZEARQrWu3noZSfbEnPZ/CRXP3271GyFk/49up2W190g==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.28.0': resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} engines: {node: '>=18'} @@ -2948,12 +2862,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.27.5': - resolution: {integrity: sha512-uEP2q/4qgd8goEUc4QIdU/1P2NmEtZ/zX5u3OpLlCGhJIuBIv0s0wr7TB2nBrd3/A5XIdEkkS5ZLF0ULuvaaYQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.28.0': resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} engines: {node: '>=18'} @@ -2972,12 +2880,6 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.5': - resolution: {integrity: sha512-+Gq47Wqq6PLOOZuBzVSII2//9yyHNKZLuwfzCemqexqOQCSz0zy0O26kIzyp9EMNMK+nZ0tFHBZrCeVUuMs/ew==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.28.0': resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} engines: {node: '>=18'} @@ -2996,12 +2898,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.27.5': - resolution: {integrity: sha512-3F/5EG8VHfN/I+W5cO1/SV2H9Q/5r7vcHabMnBqhHK2lTWOh3F8vixNzo8lqxrlmBtZVFpW8pmITHnq54+Tq4g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.28.0': resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} engines: {node: '>=18'} @@ -3020,12 +2916,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.5': - resolution: {integrity: sha512-28t+Sj3CPN8vkMOlZotOmDgilQwVvxWZl7b8rxpn73Tt/gCnvrHxQUMng4uu3itdFvrtba/1nHejvxqz8xgEMA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.28.0': resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} engines: {node: '>=18'} @@ -3044,12 +2934,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.27.5': - resolution: {integrity: sha512-Doz/hKtiuVAi9hMsBMpwBANhIZc8l238U2Onko3t2xUp8xtM0ZKdDYHMnm/qPFVthY8KtxkXaocwmMh6VolzMA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.28.0': resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} engines: {node: '>=18'} @@ -3068,12 +2952,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.5': - resolution: {integrity: sha512-WfGVaa1oz5A7+ZFPkERIbIhKT4olvGl1tyzTRaB5yoZRLqC0KwaO95FeZtOdQj/oKkjW57KcVF944m62/0GYtA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.28.0': resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} engines: {node: '>=18'} @@ -3092,12 +2970,6 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.5': - resolution: {integrity: sha512-Xh+VRuh6OMh3uJ0JkCjI57l+DVe7VRGBYymen8rFPnTVgATBwA6nmToxM2OwTlSvrnWpPKkrQUj93+K9huYC6A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/openharmony-arm64@0.28.0': resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} engines: {node: '>=18'} @@ -3116,12 +2988,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.5': - resolution: {integrity: sha512-aC1gpJkkaUADHuAdQfuVTnqVUTLqqUNhAvEwHwVWcnVVZvNlDPGA0UveZsfXJJ9T6k9Po4eHi3c02gbdwO3g6w==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.28.0': resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} engines: {node: '>=18'} @@ -3140,12 +3006,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.5': - resolution: {integrity: sha512-0UNx2aavV0fk6UpZcwXFLztA2r/k9jTUa7OW7SAea1VYUhkug99MW1uZeXEnPn5+cHOd0n8myQay6TlFnBR07w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.28.0': resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} engines: {node: '>=18'} @@ -3164,12 +3024,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.27.5': - resolution: {integrity: sha512-5nlJ3AeJWCTSzR7AEqVjT/faWyqKU86kCi1lLmxVqmNR+j4HrYdns+eTGjS/vmrzCIe8inGQckUadvS0+JkKdQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.28.0': resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} engines: {node: '>=18'} @@ -3188,12 +3042,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.5': - resolution: {integrity: sha512-PWypQR+d4FLfkhBIV+/kHsUELAnMpx1bRvvsn3p+/sAERbnCzFrtDRG2Xw5n+2zPxBK2+iaP+vetsRl4Ti7WgA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.28.0': resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} engines: {node: '>=18'} @@ -3316,96 +3164,96 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@fsegurai/codemirror-theme-abcdef@6.2.4': - resolution: {integrity: sha512-+Q5RS9ExJf16Kgh8YoASdO/22g9zE9tjsFS8/yadb2Y/UNkmgNMCUU1vlYAkhNCbY+ODreCDXLmrBxUZiyoloA==} + '@fsegurai/codemirror-theme-abcdef@6.2.5': + resolution: {integrity: sha512-tLzQh6IZuvG5nxc6dYIn3+TTdTK8MfqXhqoW+UxCvBveDhKE488GXkoMZhTUcgk7ydUcwtL5wgftA7DdBe3eTA==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-abyss@6.2.4': - resolution: {integrity: sha512-1q8363+rbxRh9U/qTiIzsmGc8r96rgEaukqbuI2JNf+/NGPva/RaXgZIubvL9MtZ4hXQ1qT6fxAJR7KlnTbm8Q==} + '@fsegurai/codemirror-theme-abyss@6.2.5': + resolution: {integrity: sha512-kstZQWXsyCpLb7IIRHxs+72Bwj9G6jUEMmlEIMNijHNQO4DilUkSdsP1p84SX9c9bgvEEjMh0WGQV6f38DcLAg==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-android-studio@6.2.4': - resolution: {integrity: sha512-KqwALoBBeTacWr7anYdaXReLX28IUVW7TSOc4Vws79D5LalmSPkV43IxElH2cjgsxDu53pn6v9Eb+ggul/Ih7w==} + '@fsegurai/codemirror-theme-android-studio@6.2.5': + resolution: {integrity: sha512-UaIeR1tjGJOv7BZoU39y1lpFiVeZgJqeG5hiIXwLECBOTxqPT/brspGnoOQB7n9WepVL4XMjb6yOaYEUiJkX9g==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-andromeda@6.2.4': - resolution: {integrity: sha512-zAqMZo4B7IHN8E3l0Z5/XmMK4Ex10+p27wltswiCNxjcXejQnWImtXGyc4Rw86Ahrgk8lnb/YF3OKU/tCdDmmQ==} + '@fsegurai/codemirror-theme-andromeda@6.2.5': + resolution: {integrity: sha512-S9F9ES92+CkGBRMIu+HWgLIWnwxQZWezeCsYUB5TNtdp345CXiJJkZ/lBPo+GjrSzMJFvqlsYW2NKNfSjpkUIg==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-basic-dark@6.2.4': - resolution: {integrity: sha512-eRVOWo+ewGVt07fF1hTLIfrINVoPCc+gZ+QXmGHZI2bd9Rn4sTdn1YaX85hISjVmb47Wmc1LO8GvXb6XrqUhWw==} + '@fsegurai/codemirror-theme-basic-dark@6.2.5': + resolution: {integrity: sha512-7KT5zSoR936R5+z70fUqAy6RdiGzmxBpYFNuYj+X9CdSO7O6krVrfqyX9MLbI/XzlJIrAXVdyuu+KfWXPwj6jw==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-basic-light@6.2.4': - resolution: {integrity: sha512-lDF0S7ySfH31MSfkFZQif7IF2XbtyFPbouqhLNmniYe5316j9Bc5DGxb0TnH4LzM5ImtsuNXoZr5lrSAjnIjoA==} + '@fsegurai/codemirror-theme-basic-light@6.2.5': + resolution: {integrity: sha512-zZTahYPkZoWq9i0cCpg1Fg/sIKzNGw5q1x9agacuQoUn+2wcSunAPEW32/cDXem2MJuybEU2D2fCQ5x9MSk3Bg==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-cobalt2@6.0.4': - resolution: {integrity: sha512-YiNUpXVQd2wk8qgiWAL21Hx9LpOiiBmrb8NW5n0M6lDr1zZKbPGsijGP7xVrg48e57AVxINwZ3vAMu2ne72Y1A==} + '@fsegurai/codemirror-theme-cobalt2@6.0.5': + resolution: {integrity: sha512-eblgO8U9HMuwB8r790W/Dc0mFf855R8gTxsK5Wgze7F8NYKBAfSJItZsbsw67OO4dMAMH/sh/72+tqAyJ2PcQQ==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-forest@6.2.4': - resolution: {integrity: sha512-aHarQLOSaFMHvmfuyFNUJ2HrRq4bEyMKbB024nNn3eZI7O07eImvE6bCVS4TG/4DPJibipmU7J5JBWwMBmwNHA==} + '@fsegurai/codemirror-theme-forest@6.2.5': + resolution: {integrity: sha512-SXVVB44tdZRTRPrfil+suloQcmWk5mhx5uNNeK+hmnMBXkR4rowh/hU89cULoiYLOVry01F5p6VCMeLhvxJAyQ==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-github-dark@6.2.4': - resolution: {integrity: sha512-JFMn6XKm5BHCPUVhuuQ7KUP9IQ8Gf70GqszZIhowdMJwbEzS/x4/nXJBE91HC+onmatFdju3wegSC7umb7KaJw==} + '@fsegurai/codemirror-theme-github-dark@6.2.5': + resolution: {integrity: sha512-l7TjaAefatsyohaMgmTrXMUrCZfulIsNk+MhdgV2niBcXiGuEk24go6jsxEQ11i/B+VJNklV0mD+AQ1SqOW0nQ==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-github-light@6.2.4': - resolution: {integrity: sha512-NzbAMBYkgeLDoZVL9K7mX/1pn5vohyIAJh3zAkrlcVM4sFz8Co69HhZUgVyazAT67YOkjgQ8pxbsDbprb5F5Kg==} + '@fsegurai/codemirror-theme-github-light@6.2.5': + resolution: {integrity: sha512-F5G5Bs2txIrfbA2kBZl18Hdh4rYRVLyIeWz4txVIaYrOknUoaUFWCFred79nGYgM/WmySzbbm/tDIHNknHEGwg==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-gruvbox-dark@6.2.4': - resolution: {integrity: sha512-oWjvqNUKd6giQzgy7lHDG3stTufVVzJK4a6BdzlJgR0orwxoR5LAM3MwWnu4FsLRY+ko8KGtxJcjCcWkIMOHxg==} + '@fsegurai/codemirror-theme-gruvbox-dark@6.2.5': + resolution: {integrity: sha512-Dh59SCH/axsI58k2QxfLdxHrB/BWB7AZgR3ZqBpHzchT1Eop1nNw3YMOKRybW1DoY13A7+ZcwKqEFwkoyu6c5A==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-gruvbox-light@6.2.4': - resolution: {integrity: sha512-2fIxU+qPYNre2sSo9gHNxECZvPF/aBKwzQcSW/uRybMnfBWG/H3CFbs1N2CFLLQTFsiZDt+EZf+B6z3ubO5pOA==} + '@fsegurai/codemirror-theme-gruvbox-light@6.2.5': + resolution: {integrity: sha512-AnRHpM7YFI4lFG+m1+tW7skkOmH9j4KSFdXc0uK7DrNIBh8ue6gnBHEvZo2cLW9j5fNz9PkufyPb7lTuAb1Qnw==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 @@ -3428,16 +3276,16 @@ packages: '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-material-dark@6.2.4': - resolution: {integrity: sha512-jQXWtRVJbmjWu2IjeBSD97fhCW91uxnKgH6IKd5wq2mSKkFXZ5JLLjdd/INfcODXjXz8CMoj4g/iuiSFztVkeA==} + '@fsegurai/codemirror-theme-material-dark@6.2.5': + resolution: {integrity: sha512-/5xGm1sGxNsNc+yZSUS7BWZXt7JoD8ZLNd5dKsSrWiwyvE4mMtrCSorzi2fzxIpWYuU9Trgnqb3ycKoySRaURQ==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-material-light@6.2.4': - resolution: {integrity: sha512-7s9C/Xh/Dqk2rK85HVk+LML+SdGNa5ifegR1qBeAFhFFkuZCgSWs4618N6ZrKoDhmk8JBIVMpdGRtXq+4aTIYA==} + '@fsegurai/codemirror-theme-material-light@6.2.5': + resolution: {integrity: sha512-Y4r1R/babn4fQQuOK+uk6RGoz2QvzGcWDa+ossbz7uhB8DEpcgBaA7MACJGXXIN0qyuwagGFDHJauCNVk5SguA==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 @@ -3452,40 +3300,40 @@ packages: '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-monokai@6.2.4': - resolution: {integrity: sha512-pWiMJpoO3yKMKrahlUmAO8hZPRE7FxY10U1cMLNa+TDtuoWf2JrPEFRbkYf9wfOGSlUkGhx8HAn7xuXEEck4CQ==} + '@fsegurai/codemirror-theme-monokai@6.2.5': + resolution: {integrity: sha512-p3zrCbDMe3f6vwN322V6ZK1yKIPCYK4DSzDaoaF3w2imKv6zfX4qgrqizrsLSPF7hsREbYDKhwnTh2IGv7zAPA==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-nord@6.2.4': - resolution: {integrity: sha512-ELw/OnHm/PReHK534xKKrssU3y6Uu6mBCXQSyYGgOEkVuSv3JU+W3qUYuJITrIKDqigEb8wrxQ61LX0JJt6DXg==} + '@fsegurai/codemirror-theme-nord@6.2.5': + resolution: {integrity: sha512-5j2Pb7HuPQFNj+NydV81Akg6wFnwl64PczgIrKzqstWWhT4HfbdolcrWWEflrJpxbJgtoUcBTWpiV+awntST1A==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-palenight@6.2.4': - resolution: {integrity: sha512-c+S78iLTkIgKrnk4FdUSKDOIgASr8vZhyhnm0zjzc6lF9Slqv8K3hjpwv7rRhUT6uziAD0Q/ABbCy0z4KSn+jA==} + '@fsegurai/codemirror-theme-palenight@6.2.5': + resolution: {integrity: sha512-Li+D8ltJF5op+E6nm8RDKLu2yc5JWaWRveWCdNlwO3RDRwDkDcf1/xVQiCNPTrhUMjfqNMDV1d/re9/ge/+jRQ==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-solarized-dark@6.2.4': - resolution: {integrity: sha512-RM/U6KHGEdDc+dkXJgMrE2lGWSop2w7EAw3bVhLuMBc10Rx8aXHxDIqhHC0cXJBCsjLG+r6kzrb1bCJB4gbEBQ==} + '@fsegurai/codemirror-theme-solarized-dark@6.2.5': + resolution: {integrity: sha512-rYXKE2C1pixRUnEsaOqV6nok+P4tGNPYFi6A1/s3Ido5q197h6oyyPZkVLAkcsS844SzFQGKZSyDSNKHJ171lw==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-solarized-light@6.2.4': - resolution: {integrity: sha512-69tILyKvll+/0fWfL+qeUSlcVbUpR4vi5ET2qAOAsm0ZvICNeQTXGp9sWKp+fJBCyI648+2ou5Qn2WkoSgNidA==} + '@fsegurai/codemirror-theme-solarized-light@6.2.5': + resolution: {integrity: sha512-3rb7ZMV6oCFtcWRagot7kltDlGwFp/Ac1/XQUB6kDnKhZpuBmK0E80j4ucjYHkOijDqqHHbUha3bhJVSRttKqA==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 @@ -3500,40 +3348,40 @@ packages: '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-tokyo-night-day@6.2.4': - resolution: {integrity: sha512-R8kRPwiZxgSkNQ0mzOyZONTabcK4Xp81s6TTkjJ02dybbi7wy+9nE2w+7AgO2TSZNor4z43ZleYGs6CG3jh60Q==} + '@fsegurai/codemirror-theme-tokyo-night-day@6.2.5': + resolution: {integrity: sha512-Ienq2pQ/I9VV1YkeeEe4bHStTG1ymac3bh+4VIIWJt2Ob2OiJVpmUF/XmjAX2+HJkChz0oZcUYHwpORz1ObWhA==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.4': - resolution: {integrity: sha512-sgDfdDVz+v/cJL0d1XetMShXYDJyleMPF7s/zGnwdx2U/vXqU+4zwJJhA/wlXieXx/QVNMY83+io/Awde2FxKg==} + '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.5': + resolution: {integrity: sha512-fAgTyEinXpLwh1p3jkOTa+c/d/pV9bLUwMDmTxt+LFUrUX2VeVlLdW2j6vYJKnXdGNnyaMlKKGURmNrkrwfV1Q==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-volcano@6.2.4': - resolution: {integrity: sha512-rJDcxzaDwVwc9stEo4sfQrv8Sa/sVMwbcSKnSkvhjYh9yaPe8304GLGp8G9mPxL7t6mcLzvcXTr8TvB1x6qddw==} + '@fsegurai/codemirror-theme-volcano@6.2.5': + resolution: {integrity: sha512-jEUZ45GdxYj9QZE0Om1rgPNksTONQKc1trN1embVP8Wn7LCeZ0b5f06MkTx0DgYTAldq35KJIMS3olBjqxe9Xw==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-vscode-dark@6.2.5': - resolution: {integrity: sha512-ejYiN38Hs8pNzEITnMt1LLuK9Z2ioJLTcMo4XyXL2xWlhMUClGBTZJ2BHgwHVa9LIivU41r1vQKP/ZdICRgOpw==} + '@fsegurai/codemirror-theme-vscode-dark@6.2.6': + resolution: {integrity: sha512-OTfvFnEaCyp8CZhuHvT6YozHdr5ulEgzMTVwS9WSaYsyEX6z10o+eP8fE4AcaLlM+qFWspDYOKuSCanKvZNMaw==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-vscode-light@6.2.5': - resolution: {integrity: sha512-pwHZX/qm/9wSt8ANSvCfB1GGkQ1AW/PEFzJPJgIw+iLiQDG8O9luZmAlpxKX54UkqLnGIzwDIxXVOXXTceMIjA==} + '@fsegurai/codemirror-theme-vscode-light@6.2.6': + resolution: {integrity: sha512-6KAcGm7E7cMGPbxG1gcAICtAwuE0BeKum8k3x9T7MUSCpC1+Q88QQx/LtCTTbp+V5fxBimvY1zCXY0F9pePTWg==} peerDependencies: '@codemirror/language': 6.12.3 '@codemirror/state': ^6.0.0 @@ -3586,11 +3434,11 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@hono/node-server@1.19.12': - resolution: {integrity: sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw==} + '@hono/node-server@1.19.13': + resolution: {integrity: sha512-TsQLe4i2gvoTtrHje625ngThGBySOgSK3Xo2XRYOdqGN1teR8+I7vchQC46uLJi8OF62YTYA3AhSpumtkhsaKQ==} engines: {node: '>=18.14.1'} peerDependencies: - hono: ^4 + hono: '>=4.12.12' '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -3870,116 +3718,116 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jimp/core@1.6.0': - resolution: {integrity: sha512-EQQlKU3s9QfdJqiSrZWNTxBs3rKXgO2W+GxNXDtwchF3a4IqxDheFX1ti+Env9hdJXDiYLp2jTRjlxhPthsk8w==} + '@jimp/core@1.6.1': + resolution: {integrity: sha512-+BoKC5G6hkrSy501zcJ2EpfnllP+avPevcBfRcZe/CW+EwEfY6X1EZ8QWyT7NpDIvEEJb1fdJnMMfUnFkxmw9A==} engines: {node: '>=18'} - '@jimp/diff@1.6.0': - resolution: {integrity: sha512-+yUAQ5gvRC5D1WHYxjBHZI7JBRusGGSLf8AmPRPCenTzh4PA+wZ1xv2+cYqQwTfQHU5tXYOhA0xDytfHUf1Zyw==} + '@jimp/diff@1.6.1': + resolution: {integrity: sha512-YkKDPdHjLgo1Api3+Bhc0GLAygldlpt97NfOKoNg1U6IUNXA6X2MgosCjPfSBiSvJvrrz1fsIR+/4cfYXBI/HQ==} engines: {node: '>=18'} - '@jimp/file-ops@1.6.0': - resolution: {integrity: sha512-Dx/bVDmgnRe1AlniRpCKrGRm5YvGmUwbDzt+MAkgmLGf+jvBT75hmMEZ003n9HQI/aPnm/YKnXjg/hOpzNCpHQ==} + '@jimp/file-ops@1.6.1': + resolution: {integrity: sha512-T+gX6osHjprbDRad0/B71Evyre7ZdVY1z/gFGEG9Z8KOtZPKboWvPeP2UjbZYWQLy9UKCPQX1FNAnDiOPkJL7w==} engines: {node: '>=18'} - '@jimp/js-bmp@1.6.0': - resolution: {integrity: sha512-FU6Q5PC/e3yzLyBDXupR3SnL3htU7S3KEs4e6rjDP6gNEOXRFsWs6YD3hXuXd50jd8ummy+q2WSwuGkr8wi+Gw==} + '@jimp/js-bmp@1.6.1': + resolution: {integrity: sha512-xzWzNT4/u5zGrTT3Tme9sGU7YzIKxi13+BCQwLqACbt5DXf9SAfdzRkopZQnmDko+6In5nqaT89Gjs43/WdnYQ==} engines: {node: '>=18'} - '@jimp/js-gif@1.6.0': - resolution: {integrity: sha512-N9CZPHOrJTsAUoWkWZstLPpwT5AwJ0wge+47+ix3++SdSL/H2QzyMqxbcDYNFe4MoI5MIhATfb0/dl/wmX221g==} + '@jimp/js-gif@1.6.1': + resolution: {integrity: sha512-YjY2W26rQa05XhanYhRZ7dingCiNN+T2Ymb1JiigIbABY0B28wHE3v3Cf1/HZPWGu0hOg36ylaKgV5KxF2M58w==} engines: {node: '>=18'} - '@jimp/js-jpeg@1.6.0': - resolution: {integrity: sha512-6vgFDqeusblf5Pok6B2DUiMXplH8RhIKAryj1yn+007SIAQ0khM1Uptxmpku/0MfbClx2r7pnJv9gWpAEJdMVA==} + '@jimp/js-jpeg@1.6.1': + resolution: {integrity: sha512-HT9H3yOmlOFzYmdI15IYdfy6ggQhSRIaHeA+OTJSEORXBqEo97sUZu/DsgHIcX5NJ7TkJBTgZ9BZXsV6UbsyMg==} engines: {node: '>=18'} - '@jimp/js-png@1.6.0': - resolution: {integrity: sha512-AbQHScy3hDDgMRNfG0tPjL88AV6qKAILGReIa3ATpW5QFjBKpisvUaOqhzJ7Reic1oawx3Riyv152gaPfqsBVg==} + '@jimp/js-png@1.6.1': + resolution: {integrity: sha512-SZ/KVhI5UjcSzzlXsXdIi/LhJ7UShf2NkMOtVrbZQcGzsqNtynAelrOXeoTxcanfVqmNhAoVHg8yR2cYoqrYjA==} engines: {node: '>=18'} - '@jimp/js-tiff@1.6.0': - resolution: {integrity: sha512-zhReR8/7KO+adijj3h0ZQUOiun3mXUv79zYEAKvE0O+rP7EhgtKvWJOZfRzdZSNv0Pu1rKtgM72qgtwe2tFvyw==} + '@jimp/js-tiff@1.6.1': + resolution: {integrity: sha512-jDG/eJquID1M4MBlKMmDRBmz2TpXMv7TUyu2nIRUxhlUc2ogC82T+VQUkca9GJH1BBJ9dx5sSE5dGkWNjIbZxw==} engines: {node: '>=18'} - '@jimp/plugin-blit@1.6.0': - resolution: {integrity: sha512-M+uRWl1csi7qilnSK8uxK4RJMSuVeBiO1AY0+7APnfUbQNZm6hCe0CCFv1Iyw1D/Dhb8ph8fQgm5mwM0eSxgVA==} + '@jimp/plugin-blit@1.6.1': + resolution: {integrity: sha512-MwnI7C7K81uWddY9FLw1fCOIy6SsPIUftUz36Spt7jisCn8/40DhQMlSxpxTNelnZb/2SnloFimQfRZAmHLOqQ==} engines: {node: '>=18'} - '@jimp/plugin-blur@1.6.0': - resolution: {integrity: sha512-zrM7iic1OTwUCb0g/rN5y+UnmdEsT3IfuCXCJJNs8SZzP0MkZ1eTvuwK9ZidCuMo4+J3xkzCidRwYXB5CyGZTw==} + '@jimp/plugin-blur@1.6.1': + resolution: {integrity: sha512-lIo7Tzp5jQu30EFFSK/phXANK3citKVEjepDjQ6ljHoIFtuMRrnybnmI2Md24ulvWlDaz+hh3n6qrMb8ydwhZQ==} engines: {node: '>=18'} - '@jimp/plugin-circle@1.6.0': - resolution: {integrity: sha512-xt1Gp+LtdMKAXfDp3HNaG30SPZW6AQ7dtAtTnoRKorRi+5yCJjKqXRgkewS5bvj8DEh87Ko1ydJfzqS3P2tdWw==} + '@jimp/plugin-circle@1.6.1': + resolution: {integrity: sha512-kK1PavY6cKHNNKce37vdV4Tmpc1/zDKngGoeOV3j+EMatoHFZUinV3s6F9aWryPs3A0xhCLZgdJ6Zeea1d5LCQ==} engines: {node: '>=18'} - '@jimp/plugin-color@1.6.0': - resolution: {integrity: sha512-J5q8IVCpkBsxIXM+45XOXTrsyfblyMZg3a9eAo0P7VPH4+CrvyNQwaYatbAIamSIN1YzxmO3DkIZXzRjFSz1SA==} + '@jimp/plugin-color@1.6.1': + resolution: {integrity: sha512-LtUN1vAP+LRlZAtTNVhDRSiXx+26Kbz3zJaG6a5k59gQ95jgT5mknnF8lxkHcqJthM4MEk3/tPxkdJpEybyF/A==} engines: {node: '>=18'} - '@jimp/plugin-contain@1.6.0': - resolution: {integrity: sha512-oN/n+Vdq/Qg9bB4yOBOxtY9IPAtEfES8J1n9Ddx+XhGBYT1/QTU/JYkGaAkIGoPnyYvmLEDqMz2SGihqlpqfzQ==} + '@jimp/plugin-contain@1.6.1': + resolution: {integrity: sha512-m0qhrfA8jkTqretGv4w+T/ADFR4GwBpE0sCOC2uJ0dzr44/ddOMsIdrpi89kabqYiPYIrxkgdCVCLm3zn1Vkkg==} engines: {node: '>=18'} - '@jimp/plugin-cover@1.6.0': - resolution: {integrity: sha512-Iow0h6yqSC269YUJ8HC3Q/MpCi2V55sMlbkkTTx4zPvd8mWZlC0ykrNDeAy9IJegrQ7v5E99rJwmQu25lygKLA==} + '@jimp/plugin-cover@1.6.1': + resolution: {integrity: sha512-hZytnsth0zoll6cPf434BrT+p/v569Wr5tyO6Dp0dH1IDPhzhB5F38sZGMLDo7bzQiN9JFVB3fxkcJ/WYCJ3Mg==} engines: {node: '>=18'} - '@jimp/plugin-crop@1.6.0': - resolution: {integrity: sha512-KqZkEhvs+21USdySCUDI+GFa393eDIzbi1smBqkUPTE+pRwSWMAf01D5OC3ZWB+xZsNla93BDS9iCkLHA8wang==} + '@jimp/plugin-crop@1.6.1': + resolution: {integrity: sha512-EerRSLlclXyKDnYc/H9w/1amZW7b7v3OGi/VlerPd2M/pAu5X8TkyYWtfqYCXnNp1Ixtd8oCo9zGfY9zoXT4rg==} engines: {node: '>=18'} - '@jimp/plugin-displace@1.6.0': - resolution: {integrity: sha512-4Y10X9qwr5F+Bo5ME356XSACEF55485j5nGdiyJ9hYzjQP9nGgxNJaZ4SAOqpd+k5sFaIeD7SQ0Occ26uIng5Q==} + '@jimp/plugin-displace@1.6.1': + resolution: {integrity: sha512-K07QVl7xQwIfD6KfxRV/c3E9e7ZBXxUXdWuvoTWcKHL2qV48MOF5Nqbz/aJW4ThnQARIsxvYlZjPFiqkCjlU+g==} engines: {node: '>=18'} - '@jimp/plugin-dither@1.6.0': - resolution: {integrity: sha512-600d1RxY0pKwgyU0tgMahLNKsqEcxGdbgXadCiVCoGd6V6glyCvkNrnnwC0n5aJ56Htkj88PToSdF88tNVZEEQ==} + '@jimp/plugin-dither@1.6.1': + resolution: {integrity: sha512-+2V+GCV2WycMoX1/z977TkZ8Zq/4MVSKElHYatgUqtwXMi2fDK2gKYU2g9V39IqFvTJsTIsK0+58VFz/ROBVew==} engines: {node: '>=18'} - '@jimp/plugin-fisheye@1.6.0': - resolution: {integrity: sha512-E5QHKWSCBFtpgZarlmN3Q6+rTQxjirFqo44ohoTjzYVrDI6B6beXNnPIThJgPr0Y9GwfzgyarKvQuQuqCnnfbA==} + '@jimp/plugin-fisheye@1.6.1': + resolution: {integrity: sha512-XtS5ZyoZ0vxZxJ6gkqI63SivhtI58vX95foMPM+cyzYkRsJXMOYCr8DScxF5bp4Xr003NjYm/P+7+08tibwzHA==} engines: {node: '>=18'} - '@jimp/plugin-flip@1.6.0': - resolution: {integrity: sha512-/+rJVDuBIVOgwoyVkBjUFHtP+wmW0r+r5OQ2GpatQofToPVbJw1DdYWXlwviSx7hvixTWLKVgRWQ5Dw862emDg==} + '@jimp/plugin-flip@1.6.1': + resolution: {integrity: sha512-ws38W/sGj7LobNRayQ83garxiktOyWxM5vO/y4a/2cy9v65SLEUzVkrj+oeAaUSSObdz4HcCEla7XtGlnAGAaA==} engines: {node: '>=18'} - '@jimp/plugin-hash@1.6.0': - resolution: {integrity: sha512-wWzl0kTpDJgYVbZdajTf+4NBSKvmI3bRI8q6EH9CVeIHps9VWVsUvEyb7rpbcwVLWYuzDtP2R0lTT6WeBNQH9Q==} + '@jimp/plugin-hash@1.6.1': + resolution: {integrity: sha512-sZt6ZcMX6i8vFWb4GYnw0pR/o9++ef0dTVcboTB5B/g7nrxCODIB4wfEkJ/YqZM5wUvol77K1qeS0/rVO6z21A==} engines: {node: '>=18'} - '@jimp/plugin-mask@1.6.0': - resolution: {integrity: sha512-Cwy7ExSJMZszvkad8NV8o/Z92X2kFUFM8mcDAhNVxU0Q6tA0op2UKRJY51eoK8r6eds/qak3FQkXakvNabdLnA==} + '@jimp/plugin-mask@1.6.1': + resolution: {integrity: sha512-SIG0/FcmEj3tkwFxc7fAGLO8o4uNzMpSOdQOhbCgxefQKq5wOVMk9BQx/sdMPBwtMLr9WLq0GzLA/rk6t2v20A==} engines: {node: '>=18'} - '@jimp/plugin-print@1.6.0': - resolution: {integrity: sha512-zarTIJi8fjoGMSI/M3Xh5yY9T65p03XJmPsuNet19K/Q7mwRU6EV2pfj+28++2PV2NJ+htDF5uecAlnGyxFN2A==} + '@jimp/plugin-print@1.6.1': + resolution: {integrity: sha512-BYVz/X3Xzv8XYilVeDy11NOp0h7BTDjlOtu0BekIFHP1yHVd24AXNzbOy52XlzYZWQ0Dl36HOHEpl/nSNrzc6w==} engines: {node: '>=18'} - '@jimp/plugin-quantize@1.6.0': - resolution: {integrity: sha512-EmzZ/s9StYQwbpG6rUGBCisc3f64JIhSH+ncTJd+iFGtGo0YvSeMdAd+zqgiHpfZoOL54dNavZNjF4otK+mvlg==} + '@jimp/plugin-quantize@1.6.1': + resolution: {integrity: sha512-J2En9PLURfP+vwYDtuZ9T8yBW6BWYZBScydAjRiPBmJfEhTcNQqiiQODrZf7EqbbX/Sy5H6dAeRiqkgoV9N6Ww==} engines: {node: '>=18'} - '@jimp/plugin-resize@1.6.0': - resolution: {integrity: sha512-uSUD1mqXN9i1SGSz5ov3keRZ7S9L32/mAQG08wUwZiEi5FpbV0K8A8l1zkazAIZi9IJzLlTauRNU41Mi8IF9fA==} + '@jimp/plugin-resize@1.6.1': + resolution: {integrity: sha512-CLkrtJoIz2HdWnpYiN6p8KYcPc00rCH/SUu6o+lfZL05Q4uhecJlnvXuj9x+U6mDn3ldPmJj6aZqMHuUJzdVqg==} engines: {node: '>=18'} - '@jimp/plugin-rotate@1.6.0': - resolution: {integrity: sha512-JagdjBLnUZGSG4xjCLkIpQOZZ3Mjbg8aGCCi4G69qR+OjNpOeGI7N2EQlfK/WE8BEHOW5vdjSyglNqcYbQBWRw==} + '@jimp/plugin-rotate@1.6.1': + resolution: {integrity: sha512-nOjVjbbj705B02ksysKnh0POAwEBXZtJ9zQ5qC+X7Tavl3JNn+P3BzQovbBxLPSbUSld6XID9z5ijin4PtOAUg==} engines: {node: '>=18'} - '@jimp/plugin-threshold@1.6.0': - resolution: {integrity: sha512-M59m5dzLoHOVWdM41O8z9SyySzcDn43xHseOH0HavjsfQsT56GGCC4QzU1banJidbUrePhzoEdS42uFE8Fei8w==} + '@jimp/plugin-threshold@1.6.1': + resolution: {integrity: sha512-JOKv9F8s6tnVLf4sB/2fF0F339EFnHvgEdFYugO6VhowKLsap0pEZmLyE/DlRnYtIj2RddHZVxVMp/eKJ04l2Q==} engines: {node: '>=18'} - '@jimp/types@1.6.0': - resolution: {integrity: sha512-7UfRsiKo5GZTAATxm2qQ7jqmUXP0DxTArztllTcYdyw6Xi5oT4RaoXynVtCD4UyLK5gJgkZJcwonoijrhYFKfg==} + '@jimp/types@1.6.1': + resolution: {integrity: sha512-leI7YbveTNi565m910XgIOwXyuu074H5qazAD1357HImJSv2hqxnWXpwxQbadGWZ7goZRYBDZy5lpqud0p7q5w==} engines: {node: '>=18'} - '@jimp/utils@1.6.0': - resolution: {integrity: sha512-gqFTGEosKbOkYF/WFj26jMHOI5OH2jeP1MmC/zbK6BF6VJBf8rIC5898dPfSzZEbSA0wbbV5slbntWVc5PKLFA==} + '@jimp/utils@1.6.1': + resolution: {integrity: sha512-veFPRd93FCnS7AgmCkPgARVGoDRrJ9cm1ujuNyA+UfQ5VKbED2002sm5XfFLFwTsKC8j04heTrwe+tU1dluXOw==} engines: {node: '>=18'} '@jridgewell/gen-mapping@0.3.13': @@ -4226,8 +4074,11 @@ packages: resolution: {integrity: sha512-6NNmNxvoJKeucVjxaaRUt3La2i5jShgiAbaY3G/72s1Vp3U06XPrAIxkAjBxpDcamEn/t+WJ4OOlGmvILo4/Ew==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.3': + resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -4353,8 +4204,8 @@ packages: resolution: {integrity: sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==} engines: {node: '>=14'} - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.123.0': + resolution: {integrity: sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==} '@panva/asn1.js@1.0.0': resolution: {integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==} @@ -4481,13 +4332,13 @@ packages: resolution: {integrity: sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==} peerDependencies: '@babel/core': 7.x - vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x + vite: '>=7.3.2' '@preact/preset-vite@2.10.5': resolution: {integrity: sha512-p0vJpxiVO7KWWazWny3LUZ+saXyZKWv6Ju0bYMWNJRp2YveufRPgSUB1C4MTqGJfz07EehMgfN+AJNwQy+w6Iw==} peerDependencies: '@babel/core': 7.x - vite: 2.x || 3.x || 4.x || 5.x || 6.x || 7.x || 8.x + vite: '>=7.3.2' '@preact/signals-core@1.14.0': resolution: {integrity: sha512-AowtCcCU/33lFlh1zRFf/u+12rfrhtNakj7UpaGEsmMwUKpKWMVvcktOGcwBBNiB4lWrZWc01LhiyyzVklJyaQ==} @@ -4505,6 +4356,15 @@ packages: peerDependencies: preact: 10.29.1 + '@prefresh/rolldown@0.1.0': + resolution: {integrity: sha512-XFWqSNULnVvSQCy0x+9JQr1dw5Yks/cXSZPAaJiInECZGgfU+wY43Lf5erlCQGd1FT5otcbssu0SncXSlQ+uyA==} + peerDependencies: + rolldown: ^1.0.0-rc.12 + vite: ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + '@prefresh/utils@1.2.1': resolution: {integrity: sha512-vq/sIuN5nYfYzvyayXI4C2QkprfNaHUQ9ZX+3xLD8nL3rWyzpxOm1+K7RtMbhd+66QcaISViK7amjnheQ/4WZw==} @@ -4512,7 +4372,13 @@ packages: resolution: {integrity: sha512-FY1fzXpUjiuosznMV0YM7XAOPZjB5FIdWS0W24+XnlxYkt9hNAwwsiKYn+cuTEoMtD/ZVazS5QVssBr9YhpCQA==} peerDependencies: preact: 10.29.1 - vite: '>=2.0.0' + vite: '>=7.3.2' + + '@prefresh/vite@3.0.0': + resolution: {integrity: sha512-KlicHeLzD2L9e/Oyr+q16PWC0SAn8ks/RUfbtdwI6WAOu3efdqjqgx34PPBh5rs9WoyTKeNAfOM/ZXLb83qjLw==} + peerDependencies: + preact: 10.29.1 + vite: '>=7.3.2' '@promptbook/utils@0.69.5': resolution: {integrity: sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==} @@ -5230,103 +5096,103 @@ packages: '@codemirror/state': 6.x.x '@codemirror/view': 6.x.x - '@rolldown/binding-android-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} + '@rolldown/binding-android-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-5ZiiecKH2DXAVJTNN13gNMUcCDg4Jy8ZjbXEsPnqa248wgOVeYRX0iqXXD5Jz4bI9BFHgKsI2qmyJynstbmr+g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-tz/v/8G77seu8zAB3A5sK3UFoOl06zcshEzhUO62sAEtrEuW/H1CcyoupOrD+NbQJytYgA4CppXPzlrmp4JZKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.12': - resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + '@rolldown/binding-darwin-x64@1.0.0-rc.13': + resolution: {integrity: sha512-8DakphqOz8JrMYWTJmWA+vDJxut6LijZ8Xcdc4flOlAhU7PNVwo2MaWBF9iXjJAPo5rC/IxEFZDhJ3GC7NHvug==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': - resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': + resolution: {integrity: sha512-4wBQFfjDuXYN/SVI8inBF3Aa+isq40rc6VMFbk5jcpolUBTe5cYnMsHZ51nFWsx3PVyyNN3vgoESki0Hmr/4BA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': - resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': + resolution: {integrity: sha512-JW/e4yPIXLms+jmnbwwy5LA/LxVwZUWLN8xug+V200wzaVi5TEGIWQlh8o91gWYFxW609euI98OCCemmWGuPrw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-ZfKWpXiUymDnavepCaM6KG/uGydJ4l2nBmMxg60Ci4CbeefpqjPWpfaZM7PThOhk2dssqBAcwLc6rAyr0uTdXg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': + resolution: {integrity: sha512-bmRg3O6Z0gq9yodKKWCIpnlH051sEfdVwt+6m5UDffAQMUUqU0xjnQqqAUm+Gu7ofAAly9DqiQDtKu2nPDEABA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-8Wtnbw4k7pMYN9B/mOEAsQ8HOiq7AZ31Ig4M9BKn2So4xRaFEhtCSa4ZJaOutOWq50zpgR4N5+L/opnlaCx8wQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-D/0Nlo8mQuxSMohNJUF2lDXWRsFDsHldfRRgD9bRgktj+EndGPj4DOV37LqDKPYS+osdyhZEH7fTakTAEcW7qg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': + resolution: {integrity: sha512-eRrPvat2YaVQcwwKi/JzOP6MKf1WRnOCr+VaI3cTWz3ZoLcP/654z90lVCJ4dAuMEpPdke0n+qyAqXDZdIC4rA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': + resolution: {integrity: sha512-PsdONiFRp8hR8KgVjTWjZ9s7uA3uueWL0t74/cKHfM4dR5zXYv4AjB8BvA+QDToqxAFg4ZkcVEqeu5F7inoz5w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': + resolution: {integrity: sha512-hCNXgC5dI3TVOLrPT++PKFNZ+1EtS0mLQwfXXXSUD/+rGlB65gZDwN/IDuxLpQP4x8RYYHqGomlUXzpO8aVI2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': - resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': + resolution: {integrity: sha512-viLS5C5et8NFtLWw9Sw3M/w4vvnVkbWkO7wSNh3C+7G1+uCkGpr6PcjNDSFcNtmXY/4trjPBqUfcOL+P3sWy/g==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': + resolution: {integrity: sha512-Fqa3Tlt1xL4wzmAYxGNFV36Hb+VfPc9PYU+E25DAnswXv3ODDu/yyWjQDbXMo5AGWkQVjLgQExuVu8I/UaZhPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': + resolution: {integrity: sha512-/pLI5kPkGEi44TDlnbio3St/5gUFeN51YWNAk/Gnv6mEQBOahRBh52qVFVBpmrnU01n2yysvBML9Ynu7K4kGAQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-rc.12': - resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} + '@rolldown/pluginutils@1.0.0-rc.13': + resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} '@rollup/plugin-buble@1.0.3': resolution: {integrity: sha512-QYD9BKkJoof0FdCFeSYYhF6/Y8e0Mnf+098xGgmWOFJ4UPHlWujjqOYeVwEm2hJPOmlR5k7HPUdAjqtOWhN64Q==} @@ -6023,11 +5889,11 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/eslint-plugin@8.58.0': - resolution: {integrity: sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==} + '@typescript-eslint/eslint-plugin@8.58.1': + resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.0 + '@typescript-eslint/parser': ^8.58.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' @@ -6038,8 +5904,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.58.0': - resolution: {integrity: sha512-rLoGZIf9afaRBYsPUMtvkDWykwXwUPL60HebR4JgTI8mxfFe2cQTu3AGitANp4b9B2QlVru6WzjgB2IzJKiCSA==} + '@typescript-eslint/parser@8.58.1': + resolution: {integrity: sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -6051,48 +5917,48 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.57.2': - resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.58.0': resolution: {integrity: sha512-8Q/wBPWLQP1j16NxoPNIKpDZFMaxl7yWIoqXWYeWO+Bbd2mjgvoF0dxP2jKZg5+x49rgKdf7Ck473M8PC3V9lg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/project-service@8.58.1': + resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/scope-manager@8.57.1': resolution: {integrity: sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.57.2': - resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.58.0': resolution: {integrity: sha512-W1Lur1oF50FxSnNdGp3Vs6P+yBRSmZiw4IIjEeYxd8UQJwhUF0gDgDD/W/Tgmh73mxgEU3qX0Bzdl/NGuSPEpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.58.1': + resolution: {integrity: sha512-TPYUEqJK6avLcEjumWsIuTpuYODTTDAtoMdt8ZZa93uWMTX13Nb8L5leSje1NluammvU+oI3QRr5lLXPgihX3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.57.1': resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.57.2': - resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.58.0': resolution: {integrity: sha512-doNSZEVJsWEu4htiVC+PR6NpM+pa+a4ClH9INRWOWCUzMst/VA9c4gXq92F8GUD1rwhNvRLkgjfYtFXegXQF7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/tsconfig-utils@8.58.1': + resolution: {integrity: sha512-JAr2hOIct2Q+qk3G+8YFfqkqi7sC86uNryT+2i5HzMa2MPjw4qNFvtjnw1IiA1rP7QhNKVe21mSSLaSjwA1Olw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/type-utils@8.57.1': resolution: {integrity: sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6100,8 +5966,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.58.0': - resolution: {integrity: sha512-aGsCQImkDIqMyx1u4PrVlbi/krmDsQUs4zAcCV6M7yPcPev+RqVlndsJy9kJ8TLihW9TZ0kbDAzctpLn5o+lOg==} + '@typescript-eslint/type-utils@8.58.1': + resolution: {integrity: sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -6111,41 +5977,34 @@ packages: resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.57.2': - resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.58.0': resolution: {integrity: sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.58.1': + resolution: {integrity: sha512-io/dV5Aw5ezwzfPBBWLoT+5QfVtP8O7q4Kftjn5azJ88bYyp/ZMCsyW1lpKK46EXJcaYMZ1JtYj+s/7TdzmQMw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.57.1': resolution: {integrity: sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.57.2': - resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/typescript-estree@8.58.0': resolution: {integrity: sha512-7vv5UWbHqew/dvs+D3e1RvLv1v2eeZ9txRHPnEEBUgSNLx5ghdzjHa0sgLWYVKssH+lYmV0JaWdoubo0ncGYLA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.57.1': - resolution: {integrity: sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==} + '@typescript-eslint/typescript-estree@8.58.1': + resolution: {integrity: sha512-w4w7WR7GHOjqqPnvAYbazq+Y5oS68b9CzasGtnd6jIeOIeKUzYzupGTB2T4LTPSv4d+WPeccbxuneTFHYgAAWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.0.0' + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.57.2': - resolution: {integrity: sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg==} + '@typescript-eslint/utils@8.57.1': + resolution: {integrity: sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -6158,18 +6017,25 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/utils@8.58.1': + resolution: {integrity: sha512-Ln8R0tmWC7pTtLOzgJzYTXSCjJ9rDNHAqTaVONF4FEi2qwce8mD9iSOxOpLFFvWp/wBFlew0mjM1L1ihYWfBdQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + '@typescript-eslint/visitor-keys@8.57.1': resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.57.2': - resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.58.0': resolution: {integrity: sha512-XJ9UD9+bbDo4a4epraTwG3TsNPeiB9aShrUneAVXy8q4LuwowN+qu89/6ByLMINqvIMeI9H9hOHQtg/ijrYXzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.58.1': + resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -6731,64 +6597,64 @@ packages: resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} engines: {node: '>= 20'} - '@vitest/browser-webdriverio@4.1.2': - resolution: {integrity: sha512-5VKfMSq6ZoEAmvVu3sJGkDjEjGuxwk72tOgoNJfJYv+c+UQX1D4UqSdL8kXUMJcTQx1tKeWwQ9Zym0gRdMfyrA==} + '@vitest/browser-webdriverio@4.1.3': + resolution: {integrity: sha512-EeCY0116zZk5uedmwkVdW2dfpv1JEVtK1n+3WeNnyjBVWnBzDlqY1Kkf8Z3Re1qb5Nki8LgnQgQp1VT+q/ZaMQ==} peerDependencies: - vitest: 4.1.2 + vitest: 4.1.3 webdriverio: '*' - '@vitest/browser@4.1.2': - resolution: {integrity: sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==} + '@vitest/browser@4.1.3': + resolution: {integrity: sha512-CS9KjO2vijuBlbwz0JIgC0YuoI1BuqWI5ziD3Nll6jkpNYtWdjPMVgGynQ9vZovjsECeUqEeNjWrypP414d0CQ==} peerDependencies: - vitest: 4.1.2 + vitest: 4.1.3 - '@vitest/coverage-istanbul@4.1.2': - resolution: {integrity: sha512-WSz7+4a7PcMtMNvIP7AXUMffsq4JrWeJaguC8lg6fSQyGxSfaT4Rf81idqwxTT6qX5kjjZw2t9rAnCRRQobSqw==} + '@vitest/coverage-istanbul@4.1.3': + resolution: {integrity: sha512-IjlvIg2MaFDgeYOXgqxWwTh8c8Y8HkR/36SN0Iq5XtmsmbEau7a5i7g1F+Lv7G9R+vDzOt+HyNOmKqg/8kKzug==} peerDependencies: - vitest: 4.1.2 + vitest: 4.1.3 - '@vitest/coverage-v8@4.1.2': - resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} + '@vitest/coverage-v8@4.1.3': + resolution: {integrity: sha512-/MBdrkA8t6hbdCWFKs09dPik774xvs4Z6L4bycdCxYNLHM8oZuRyosumQMG19LUlBsB6GeVpL1q4kFFazvyKGA==} peerDependencies: - '@vitest/browser': 4.1.2 - vitest: 4.1.2 + '@vitest/browser': 4.1.3 + vitest: 4.1.3 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@4.1.2': - resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} + '@vitest/expect@4.1.3': + resolution: {integrity: sha512-CW8Q9KMtXDGHj0vCsqui0M5KqRsu0zm0GNDW7Gd3U7nZ2RFpPKSCpeCXoT+/+5zr1TNlsoQRDEz+LzZUyq6gnQ==} - '@vitest/mocker@4.1.2': - resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} + '@vitest/mocker@4.1.3': + resolution: {integrity: sha512-XN3TrycitDQSzGRnec/YWgoofkYRhouyVQj4YNsJ5r/STCUFqMrP4+oxEv3e7ZbLi4og5kIHrZwekDJgw6hcjw==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: '>=7.3.2' peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.2': - resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} + '@vitest/pretty-format@4.1.3': + resolution: {integrity: sha512-hYqqwuMbpkkBodpRh4k4cQSOELxXky1NfMmQvOfKvV8zQHz8x8Dla+2wzElkMkBvSAJX5TRGHJAQvK0TcOafwg==} - '@vitest/runner@4.1.2': - resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} + '@vitest/runner@4.1.3': + resolution: {integrity: sha512-VwgOz5MmT0KhlUj40h02LWDpUBVpflZ/b7xZFA25F29AJzIrE+SMuwzFf0b7t4EXdwRNX61C3B6auIXQTR3ttA==} - '@vitest/snapshot@4.1.2': - resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} + '@vitest/snapshot@4.1.3': + resolution: {integrity: sha512-9l+k/J9KG5wPJDX9BcFFzhhwNjwkRb8RsnYhaT1vPY7OufxmQFc9sZzScRCPTiETzl37mrIWVY9zxzmdVeJwDQ==} - '@vitest/spy@4.1.2': - resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} + '@vitest/spy@4.1.3': + resolution: {integrity: sha512-ujj5Uwxagg4XUIfAUyRQxAg631BP6e9joRiN99mr48Bg9fRs+5mdUElhOoZ6rP5mBr8Bs3lmrREnkrQWkrsTCw==} - '@vitest/ui@4.1.2': - resolution: {integrity: sha512-/irhyeAcKS2u6Zokagf9tqZJ0t8S6kMZq4ZG9BHZv7I+fkRrYfQX4w7geYeC2r6obThz39PDxvXQzZX+qXqGeg==} + '@vitest/ui@4.1.3': + resolution: {integrity: sha512-xBPy+43o1fgMLUDlufUXh7tlT/Es8uS5eiyBY2PyPfFYSGpApZskLw65DROoDz+rgYkPuAmb20Mv9Z9g1WQE7w==} peerDependencies: - vitest: 4.1.2 + vitest: 4.1.3 - '@vitest/utils@4.1.2': - resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} + '@vitest/utils@4.1.3': + resolution: {integrity: sha512-Pc/Oexse/khOWsGB+w3q4yzA4te7W4gpZZAvk+fr8qXfTURZUMj5i7kuxsNK5mP/dEB6ao3jfr0rs17fHhbHdw==} '@volar/language-core@2.4.13': resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==} @@ -7017,8 +6883,8 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@6.0.146: - resolution: {integrity: sha512-70DE8k1rR0N3mXxyyfjYAx/FxRln/kQ5ym18lt1ys1eUklcPuoIXGbUBwdfCbmkt6YF3jCDZ5+OgkWieP/NGDw==} + ai@6.0.153: + resolution: {integrity: sha512-UlgBe4k0Ja1m1Eufn6FVSsHoF0sc7qwxX35ywJPDogIvBz0pHc+NOmCqiRY904DczNYIuwpZfKBLVz8HXgu3mg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -7246,9 +7112,6 @@ packages: resolution: {integrity: sha512-zJAaP9zxTcvTHRlejau3ZOY4V7SRpiByf3/dxx2uyKxxor19tpmpV2QRsTKikckwhaPmr2dVpxxMr7jOCYVp5g==} engines: {node: '>=6.0.0'} - axios@1.14.0: - resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} - b4a@1.6.7: resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} @@ -7260,9 +7123,6 @@ packages: bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - balanced-match@4.0.3: resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} engines: {node: 20 || >=22} @@ -7392,9 +7252,6 @@ packages: bplist-creator@0.0.8: resolution: {integrity: sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==} - brace-expansion@1.1.13: - resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} - brace-expansion@5.0.5: resolution: {integrity: sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==} engines: {node: 18 || 20 || >=22} @@ -7863,9 +7720,6 @@ packages: resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} @@ -8722,11 +8576,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.27.5: - resolution: {integrity: sha512-zdQoHBjuDqKsvV5OPaWansOwfSQ0Js+Uj9J85TBvj3bFW1JjWTSULMRwdQAc8qMeIScbClxeMK0jlrtB9linhA==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} @@ -8778,8 +8627,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-linter-browserify@10.1.0: - resolution: {integrity: sha512-PEcXfZXc/Rqo+kUqq1uf4ia8jleXFertdQI8Icj8KBq1kLzjOXOmRACg1hLNsHBgQYNDZH71X3O1amv5/WqHfA==} + eslint-linter-browserify@10.2.0: + resolution: {integrity: sha512-3EI7WAce/YTRTyRmqYUKX7VRROyIoKacg3625Ler+079JvCU5YGQwVJLa/ifvBxr95bxv7gTsy4zw3is+hHpBg==} eslint-plugin-ckeditor5-rules@14.0.0: resolution: {integrity: sha512-TLdFs+qhiEzVO4LQgVrJmc/49ZQ62qKq0fx+M+231tzGXSqioRV6LpRLHvF7XxEuG3+3LblMUJTLM+pBm5fXMg==} @@ -8814,8 +8663,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-simple-import-sort@12.1.1: - resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} + eslint-plugin-simple-import-sort@13.0.0: + resolution: {integrity: sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==} peerDependencies: eslint: '>=5.0.0' @@ -9076,10 +8925,6 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - file-type@16.5.4: - resolution: {integrity: sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==} - engines: {node: '>=10'} - file-type@21.3.4: resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} engines: {node: '>=20'} @@ -9267,8 +9112,8 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - fuse.js@7.2.0: - resolution: {integrity: sha512-zf4vdcIGpjNKTuXwug33Hm2okqX6a0t2ZEbez+o9oBJQSNhVJ5AqERfeiRD3r8HcLqP66MrjdkmzxrncbAOTUQ==} + fuse.js@7.3.0: + resolution: {integrity: sha512-plz8RVjfcDedTGfVngWH1jmJvBvAwi1v2jecfDerbEnMcmOYUEEwKFTHbNoCiYyzaK2Ws8lABkTCcRSqCY1q4w==} engines: {node: '>=10'} futoin-hkdf@1.5.3: @@ -9621,8 +9466,8 @@ packages: hoist-non-react-statics@2.5.5: resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==} - hono@4.12.9: - resolution: {integrity: sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==} + hono@4.12.12: + resolution: {integrity: sha512-p1JfQMKaceuCbpJKAPKVqyqviZdS0eUxH9v82oWo1kb9xjQ5wA6iP3FNVAPDFlz5/p7d45lO+BpSk1tuSZMF4Q==} engines: {node: '>=16.9.0'} hookable@6.0.1: @@ -10201,8 +10046,8 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} - jimp@1.6.0: - resolution: {integrity: sha512-YcwCHw1kiqEeI5xRpDlPPBGL2EOpBKLwO4yIBJcXWHPj5PnA5urGq0jbyhM5KoNpypQ6VboSoxc9D8HyfvngSg==} + jimp@1.6.1: + resolution: {integrity: sha512-hNQh6rZtWfSVWSNVmvq87N5BPJsNH7k7I7qyrXf9DOma9xATQk3fsyHazCQe51nCjdkoWdTmh0vD7bjVSLoxxw==} engines: {node: '>=18'} jiti@2.6.1: @@ -10784,8 +10629,8 @@ packages: engines: {node: '>= 20'} hasBin: true - marked@17.0.5: - resolution: {integrity: sha512-6hLvc0/JEbRjRgzI6wnT2P1XuM1/RrrDEX0kPt0N7jGm1133g6X7DlxFasUIx+72aKAr904GTxhSLDrd5DIlZg==} + marked@18.0.0: + resolution: {integrity: sha512-2e7Qiv/HJSXj8rDEpgTvGKsP8yYtI9xXHKDnrftrmnrJPaFNM7VRb2YCzWaX4BP1iCJ/XPduzDJZMFoqTCcIMA==} engines: {node: '>= 20'} hasBin: true @@ -11566,6 +11411,18 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + oxc-unshadowed-visitor@0.0.1: + resolution: {integrity: sha512-IVQnhKE/MwXJHgydUYuutUwOG1kCmAOYARqpcOvATWJQZvkyDbJ+kGMAufwFosYluPp0otDb/yilsoVvF1Ar3g==} + engines: {node: '>=22.12.0 || ^24.0.0'} + peerDependencies: + oxc-parser: ^0.121.0 + rolldown: ^1.0.0-rc.12 + peerDependenciesMeta: + oxc-parser: + optional: true + rolldown: + optional: true + p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -11774,10 +11631,6 @@ packages: peberminta@0.9.0: resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} - peek-readable@4.1.0: - resolution: {integrity: sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==} - engines: {node: '>=8'} - peek-readable@7.0.0: resolution: {integrity: sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==} engines: {node: '>=18'} @@ -12037,10 +11890,6 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - proxy-from-env@2.1.0: - resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} - engines: {node: '>=10'} - prr@1.0.1: resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} @@ -12267,10 +12116,6 @@ packages: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readable-web-to-node-stream@3.0.4: - resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} - engines: {node: '>=8'} - readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} @@ -12482,8 +12327,17 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rolldown@1.0.0-rc.12: - resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} + rolldown-string@0.3.0: + resolution: {integrity: sha512-qGhBPNSv/27uzFBQdO+Cs4YAXC/1PKznD7Jz5Fl7NIAIlteuTPBTBWBhCpJ2AFTqLsoKvvUr7wSjqSUip0Fkpg==} + engines: {node: '>=20.19.0'} + peerDependencies: + rolldown: '*' + peerDependenciesMeta: + rolldown: + optional: true + + rolldown@1.0.0-rc.13: + resolution: {integrity: sha512-bvVj8YJmf0rq4pSFmH7laLa6pYrhghv3PRzrCdRAr23g66zOKVJ4wkvFtgohtPLWmthgg8/rkaqRHrpUEh0Zbw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -12493,7 +12347,7 @@ packages: peerDependencies: rolldown: ^1.0.0-beta.0 rollup: '>=4.59.0' - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: '>=7.3.2' peerDependenciesMeta: rolldown: optional: true @@ -12508,7 +12362,7 @@ packages: peerDependencies: rolldown: ^1.0.0-beta.0 rollup: '>=4.59.0' - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: '>=7.3.2' peerDependenciesMeta: rolldown: optional: true @@ -13219,10 +13073,6 @@ packages: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} engines: {node: '>=18'} - strtok3@6.3.0: - resolution: {integrity: sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==} - engines: {node: '>=10'} - stubborn-fs@2.0.0: resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} @@ -13477,10 +13327,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - token-types@4.2.1: - resolution: {integrity: sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==} - engines: {node: '>=10'} - token-types@6.1.2: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} @@ -13526,12 +13372,6 @@ packages: ts-algebra@1.2.2: resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -13640,8 +13480,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - typescript-eslint@8.58.0: - resolution: {integrity: sha512-e2TQzKfaI85fO+F3QywtX+tCTsu/D3WW5LVU6nz8hTFKFZ8yBJ6mSYRpXqdR3mFjPWmO0eWsTa5f+UpAOe/FMA==} + typescript-eslint@8.58.1: + resolution: {integrity: sha512-gf6/oHChByg9HJvhMO1iBexJh12AqqTfnuxscMDOVqfJW3htsdRJI/GfPpHTTcyeB8cSTUY2JcZmVgoyPqcrDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -13982,7 +13822,7 @@ packages: resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} peerDependencies: typescript: '*' - vite: '*' + vite: '>=7.3.2' peerDependenciesMeta: vite: optional: true @@ -13991,61 +13831,21 @@ packages: resolution: {integrity: sha512-r3kQUrrimduikhyRm58ayemoxsgB8lZdn/JULLL4wpXHAZlYejtyZx7E/id7dwRtIOSYWu/tWvFjdEOTzso2MA==} engines: {node: ^22.0.0 || >=24.0.0} peerDependencies: - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: '>=7.3.2' vite-plugin-svgo@2.0.0: resolution: {integrity: sha512-WaiOUlmt1fKw1w/WWJnx9gVk42D1BASKZmGCPpy6iTLE5iIemN2lim3MwI7Rffyt3aQnPrLfLSLnI8ZUJ9s49g==} peerDependencies: typescript: '>=4.9.4' - vite: '>=4.0.2' + vite: '>=7.3.2' vite-prerender-plugin@0.5.11: resolution: {integrity: sha512-xWOhb8Ef2zoJIiinYVunIf3omRfUbEXcPEvrkQcrDpJ2yjDokxhvQ26eSJbkthRhymntWx6816jpATrJphh+ug==} peerDependencies: - vite: 5.x || 6.x || 7.x + vite: '>=7.3.2' - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: '>=2.8.3' - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vite@8.0.5: - resolution: {integrity: sha512-nmu43Qvq9UopTRfMx2jOYW5l16pb3iDC1JH6yMuPkpVbzK0k+L7dfsEDH4jRgYFmsg0sTAqkojoZgzLMlwHsCQ==} + vite@8.0.7: + resolution: {integrity: sha512-P1PbweD+2/udplnThz3btF4cf6AgPky7kk23RtHUkJIU5BIxwPprhRGmOAHs6FTI7UiGbTNrgNP6jSYD6JaRnw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -14087,21 +13887,23 @@ packages: yaml: optional: true - vitest@4.1.2: - resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} + vitest@4.1.3: + resolution: {integrity: sha512-DBc4Tx0MPNsqb9isoyOq00lHftVx/KIU44QOm2q59npZyLUkENn8TMFsuzuO+4U2FUa9rgbbPt3udrP25GcjXw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.2 - '@vitest/browser-preview': 4.1.2 - '@vitest/browser-webdriverio': 4.1.2 - '@vitest/ui': 4.1.2 + '@vitest/browser-playwright': 4.1.3 + '@vitest/browser-preview': 4.1.3 + '@vitest/browser-webdriverio': 4.1.3 + '@vitest/coverage-istanbul': 4.1.3 + '@vitest/coverage-v8': 4.1.3 + '@vitest/ui': 4.1.3 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + vite: '>=7.3.2' peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -14115,6 +13917,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -14556,32 +14362,32 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/anthropic@3.0.66(zod@4.3.6)': + '@ai-sdk/anthropic@3.0.68(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.22(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/gateway@3.0.88(zod@4.3.6)': + '@ai-sdk/gateway@3.0.93(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.22(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) '@vercel/oidc': 3.1.0 zod: 4.3.6 - '@ai-sdk/google@3.0.58(zod@4.3.6)': + '@ai-sdk/google@3.0.60(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.22(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/openai@3.0.50(zod@4.3.6)': + '@ai-sdk/openai@3.0.52(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.22(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) zod: 4.3.6 - '@ai-sdk/provider-utils@4.0.22(zod@4.3.6)': + '@ai-sdk/provider-utils@4.0.23(zod@4.3.6)': dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 @@ -16444,7 +16250,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@emnapi/core@1.9.0': + '@emnapi/core@1.9.1': dependencies: '@emnapi/wasi-threads': 1.2.0 tslib: 2.8.1 @@ -16455,6 +16261,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.9.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.0': dependencies: tslib: 2.8.1 @@ -16473,7 +16284,7 @@ snapshots: '@es-joy/jsdoccomment@0.50.2': dependencies: '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/types': 8.58.0 comment-parser: 1.4.1 esquery: 1.7.0 jsdoc-type-pratt-parser: 4.1.0 @@ -16484,9 +16295,6 @@ snapshots: '@esbuild/aix-ppc64@0.27.4': optional: true - '@esbuild/aix-ppc64@0.27.5': - optional: true - '@esbuild/aix-ppc64@0.28.0': optional: true @@ -16496,9 +16304,6 @@ snapshots: '@esbuild/android-arm64@0.27.4': optional: true - '@esbuild/android-arm64@0.27.5': - optional: true - '@esbuild/android-arm64@0.28.0': optional: true @@ -16508,9 +16313,6 @@ snapshots: '@esbuild/android-arm@0.27.4': optional: true - '@esbuild/android-arm@0.27.5': - optional: true - '@esbuild/android-arm@0.28.0': optional: true @@ -16520,9 +16322,6 @@ snapshots: '@esbuild/android-x64@0.27.4': optional: true - '@esbuild/android-x64@0.27.5': - optional: true - '@esbuild/android-x64@0.28.0': optional: true @@ -16532,9 +16331,6 @@ snapshots: '@esbuild/darwin-arm64@0.27.4': optional: true - '@esbuild/darwin-arm64@0.27.5': - optional: true - '@esbuild/darwin-arm64@0.28.0': optional: true @@ -16544,9 +16340,6 @@ snapshots: '@esbuild/darwin-x64@0.27.4': optional: true - '@esbuild/darwin-x64@0.27.5': - optional: true - '@esbuild/darwin-x64@0.28.0': optional: true @@ -16556,9 +16349,6 @@ snapshots: '@esbuild/freebsd-arm64@0.27.4': optional: true - '@esbuild/freebsd-arm64@0.27.5': - optional: true - '@esbuild/freebsd-arm64@0.28.0': optional: true @@ -16568,9 +16358,6 @@ snapshots: '@esbuild/freebsd-x64@0.27.4': optional: true - '@esbuild/freebsd-x64@0.27.5': - optional: true - '@esbuild/freebsd-x64@0.28.0': optional: true @@ -16580,9 +16367,6 @@ snapshots: '@esbuild/linux-arm64@0.27.4': optional: true - '@esbuild/linux-arm64@0.27.5': - optional: true - '@esbuild/linux-arm64@0.28.0': optional: true @@ -16592,9 +16376,6 @@ snapshots: '@esbuild/linux-arm@0.27.4': optional: true - '@esbuild/linux-arm@0.27.5': - optional: true - '@esbuild/linux-arm@0.28.0': optional: true @@ -16604,9 +16385,6 @@ snapshots: '@esbuild/linux-ia32@0.27.4': optional: true - '@esbuild/linux-ia32@0.27.5': - optional: true - '@esbuild/linux-ia32@0.28.0': optional: true @@ -16616,9 +16394,6 @@ snapshots: '@esbuild/linux-loong64@0.27.4': optional: true - '@esbuild/linux-loong64@0.27.5': - optional: true - '@esbuild/linux-loong64@0.28.0': optional: true @@ -16628,9 +16403,6 @@ snapshots: '@esbuild/linux-mips64el@0.27.4': optional: true - '@esbuild/linux-mips64el@0.27.5': - optional: true - '@esbuild/linux-mips64el@0.28.0': optional: true @@ -16640,9 +16412,6 @@ snapshots: '@esbuild/linux-ppc64@0.27.4': optional: true - '@esbuild/linux-ppc64@0.27.5': - optional: true - '@esbuild/linux-ppc64@0.28.0': optional: true @@ -16652,9 +16421,6 @@ snapshots: '@esbuild/linux-riscv64@0.27.4': optional: true - '@esbuild/linux-riscv64@0.27.5': - optional: true - '@esbuild/linux-riscv64@0.28.0': optional: true @@ -16664,9 +16430,6 @@ snapshots: '@esbuild/linux-s390x@0.27.4': optional: true - '@esbuild/linux-s390x@0.27.5': - optional: true - '@esbuild/linux-s390x@0.28.0': optional: true @@ -16676,9 +16439,6 @@ snapshots: '@esbuild/linux-x64@0.27.4': optional: true - '@esbuild/linux-x64@0.27.5': - optional: true - '@esbuild/linux-x64@0.28.0': optional: true @@ -16688,9 +16448,6 @@ snapshots: '@esbuild/netbsd-arm64@0.27.4': optional: true - '@esbuild/netbsd-arm64@0.27.5': - optional: true - '@esbuild/netbsd-arm64@0.28.0': optional: true @@ -16700,9 +16457,6 @@ snapshots: '@esbuild/netbsd-x64@0.27.4': optional: true - '@esbuild/netbsd-x64@0.27.5': - optional: true - '@esbuild/netbsd-x64@0.28.0': optional: true @@ -16712,9 +16466,6 @@ snapshots: '@esbuild/openbsd-arm64@0.27.4': optional: true - '@esbuild/openbsd-arm64@0.27.5': - optional: true - '@esbuild/openbsd-arm64@0.28.0': optional: true @@ -16724,9 +16475,6 @@ snapshots: '@esbuild/openbsd-x64@0.27.4': optional: true - '@esbuild/openbsd-x64@0.27.5': - optional: true - '@esbuild/openbsd-x64@0.28.0': optional: true @@ -16736,9 +16484,6 @@ snapshots: '@esbuild/openharmony-arm64@0.27.4': optional: true - '@esbuild/openharmony-arm64@0.27.5': - optional: true - '@esbuild/openharmony-arm64@0.28.0': optional: true @@ -16748,9 +16493,6 @@ snapshots: '@esbuild/sunos-x64@0.27.4': optional: true - '@esbuild/sunos-x64@0.27.5': - optional: true - '@esbuild/sunos-x64@0.28.0': optional: true @@ -16760,9 +16502,6 @@ snapshots: '@esbuild/win32-arm64@0.27.4': optional: true - '@esbuild/win32-arm64@0.27.5': - optional: true - '@esbuild/win32-arm64@0.28.0': optional: true @@ -16772,9 +16511,6 @@ snapshots: '@esbuild/win32-ia32@0.27.4': optional: true - '@esbuild/win32-ia32@0.27.5': - optional: true - '@esbuild/win32-ia32@0.28.0': optional: true @@ -16784,9 +16520,6 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@esbuild/win32-x64@0.27.5': - optional: true - '@esbuild/win32-x64@0.28.0': optional: true @@ -16945,84 +16678,84 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@fsegurai/codemirror-theme-abcdef@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-abcdef@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-abyss@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-abyss@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-android-studio@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-android-studio@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-andromeda@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-andromeda@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-basic-dark@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-basic-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-basic-light@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-basic-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-cobalt2@6.0.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-cobalt2@6.0.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-forest@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-forest@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-github-dark@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-github-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-github-light@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-github-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-gruvbox-dark@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-gruvbox-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-gruvbox-light@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-gruvbox-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -17043,14 +16776,14 @@ snapshots: '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-material-dark@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-material-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-material-light@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-material-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -17064,35 +16797,35 @@ snapshots: '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-monokai@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-monokai@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-nord@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-nord@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-palenight@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-palenight@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-solarized-dark@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-solarized-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-solarized-light@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-solarized-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -17106,35 +16839,35 @@ snapshots: '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-tokyo-night-day@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-tokyo-night-day@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-volcano@6.2.4(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-volcano@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-vscode-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-vscode-dark@6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 '@lezer/highlight': 1.2.3 - '@fsegurai/codemirror-theme-vscode-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': + '@fsegurai/codemirror-theme-vscode-light@6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/highlight@1.2.3)': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -17188,9 +16921,9 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@hono/node-server@1.19.12(hono@4.12.9)': + '@hono/node-server@1.19.13(hono@4.12.12)': dependencies: - hono: 4.12.9 + hono: 4.12.12 '@humanfs/core@0.19.1': {} @@ -17445,193 +17178,227 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jimp/core@1.6.0': + '@jimp/core@1.6.1': dependencies: - '@jimp/file-ops': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/file-ops': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 await-to-js: 3.0.0 exif-parser: 0.1.12 - file-type: 16.5.4 + file-type: 21.3.4 mime: 3.0.0 + transitivePeerDependencies: + - supports-color - '@jimp/diff@1.6.0': + '@jimp/diff@1.6.1': dependencies: - '@jimp/plugin-resize': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/plugin-resize': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 pixelmatch: 5.3.0 + transitivePeerDependencies: + - supports-color - '@jimp/file-ops@1.6.0': {} + '@jimp/file-ops@1.6.1': {} - '@jimp/js-bmp@1.6.0': + '@jimp/js-bmp@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 bmp-ts: 1.0.9 + transitivePeerDependencies: + - supports-color - '@jimp/js-gif@1.6.0': + '@jimp/js-gif@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 gifwrap: 0.10.1 omggif: 1.0.10 + transitivePeerDependencies: + - supports-color - '@jimp/js-jpeg@1.6.0': + '@jimp/js-jpeg@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 jpeg-js: 0.4.4 + transitivePeerDependencies: + - supports-color - '@jimp/js-png@1.6.0': + '@jimp/js-png@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 pngjs: 7.0.0 + transitivePeerDependencies: + - supports-color - '@jimp/js-tiff@1.6.0': + '@jimp/js-tiff@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 utif2: 4.1.0 + transitivePeerDependencies: + - supports-color - '@jimp/plugin-blit@1.6.0': + '@jimp/plugin-blit@1.6.1': dependencies: - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 zod: 4.3.6 - '@jimp/plugin-blur@1.6.0': + '@jimp/plugin-blur@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/utils': 1.6.1 + transitivePeerDependencies: + - supports-color - '@jimp/plugin-circle@1.6.0': + '@jimp/plugin-circle@1.6.1': dependencies: - '@jimp/types': 1.6.0 + '@jimp/types': 1.6.1 zod: 4.3.6 - '@jimp/plugin-color@1.6.0': + '@jimp/plugin-color@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 tinycolor2: 1.6.0 zod: 4.3.6 + transitivePeerDependencies: + - supports-color - '@jimp/plugin-contain@1.6.0': + '@jimp/plugin-contain@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/plugin-blit': 1.6.0 - '@jimp/plugin-resize': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/plugin-blit': 1.6.1 + '@jimp/plugin-resize': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 + zod: 4.3.6 + transitivePeerDependencies: + - supports-color + + '@jimp/plugin-cover@1.6.1': + dependencies: + '@jimp/core': 1.6.1 + '@jimp/plugin-crop': 1.6.1 + '@jimp/plugin-resize': 1.6.1 + '@jimp/types': 1.6.1 + zod: 4.3.6 + transitivePeerDependencies: + - supports-color + + '@jimp/plugin-crop@1.6.1': + dependencies: + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 + zod: 4.3.6 + transitivePeerDependencies: + - supports-color + + '@jimp/plugin-displace@1.6.1': + dependencies: + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 zod: 4.3.6 - '@jimp/plugin-cover@1.6.0': + '@jimp/plugin-dither@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/plugin-crop': 1.6.0 - '@jimp/plugin-resize': 1.6.0 - '@jimp/types': 1.6.0 + '@jimp/types': 1.6.1 + + '@jimp/plugin-fisheye@1.6.1': + dependencies: + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 zod: 4.3.6 - '@jimp/plugin-crop@1.6.0': + '@jimp/plugin-flip@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/types': 1.6.1 zod: 4.3.6 - '@jimp/plugin-displace@1.6.0': + '@jimp/plugin-hash@1.6.1': dependencies: - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 - zod: 4.3.6 - - '@jimp/plugin-dither@1.6.0': - dependencies: - '@jimp/types': 1.6.0 - - '@jimp/plugin-fisheye@1.6.0': - dependencies: - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 - zod: 4.3.6 - - '@jimp/plugin-flip@1.6.0': - dependencies: - '@jimp/types': 1.6.0 - zod: 4.3.6 - - '@jimp/plugin-hash@1.6.0': - dependencies: - '@jimp/core': 1.6.0 - '@jimp/js-bmp': 1.6.0 - '@jimp/js-jpeg': 1.6.0 - '@jimp/js-png': 1.6.0 - '@jimp/js-tiff': 1.6.0 - '@jimp/plugin-color': 1.6.0 - '@jimp/plugin-resize': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/js-bmp': 1.6.1 + '@jimp/js-jpeg': 1.6.1 + '@jimp/js-png': 1.6.1 + '@jimp/js-tiff': 1.6.1 + '@jimp/plugin-color': 1.6.1 + '@jimp/plugin-resize': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 any-base: 1.1.0 + transitivePeerDependencies: + - supports-color - '@jimp/plugin-mask@1.6.0': + '@jimp/plugin-mask@1.6.1': dependencies: - '@jimp/types': 1.6.0 + '@jimp/types': 1.6.1 zod: 4.3.6 - '@jimp/plugin-print@1.6.0': + '@jimp/plugin-print@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/js-jpeg': 1.6.0 - '@jimp/js-png': 1.6.0 - '@jimp/plugin-blit': 1.6.0 - '@jimp/types': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/js-jpeg': 1.6.1 + '@jimp/js-png': 1.6.1 + '@jimp/plugin-blit': 1.6.1 + '@jimp/types': 1.6.1 parse-bmfont-ascii: 1.0.6 parse-bmfont-binary: 1.0.6 parse-bmfont-xml: 1.1.6 simple-xml-to-json: 1.2.3 zod: 4.3.6 + transitivePeerDependencies: + - supports-color - '@jimp/plugin-quantize@1.6.0': + '@jimp/plugin-quantize@1.6.1': dependencies: image-q: 4.0.0 zod: 4.3.6 - '@jimp/plugin-resize@1.6.0': + '@jimp/plugin-resize@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/types': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/types': 1.6.1 zod: 4.3.6 + transitivePeerDependencies: + - supports-color - '@jimp/plugin-rotate@1.6.0': + '@jimp/plugin-rotate@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/plugin-crop': 1.6.0 - '@jimp/plugin-resize': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/plugin-crop': 1.6.1 + '@jimp/plugin-resize': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 zod: 4.3.6 + transitivePeerDependencies: + - supports-color - '@jimp/plugin-threshold@1.6.0': + '@jimp/plugin-threshold@1.6.1': dependencies: - '@jimp/core': 1.6.0 - '@jimp/plugin-color': 1.6.0 - '@jimp/plugin-hash': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/plugin-color': 1.6.1 + '@jimp/plugin-hash': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 zod: 4.3.6 + transitivePeerDependencies: + - supports-color - '@jimp/types@1.6.0': + '@jimp/types@1.6.1': dependencies: zod: 4.3.6 - '@jimp/utils@1.6.0': + '@jimp/utils@1.6.1': dependencies: - '@jimp/types': 1.6.0 + '@jimp/types': 1.6.1 tinycolor2: 1.6.0 '@jridgewell/gen-mapping@0.3.13': @@ -17847,7 +17614,7 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.12(hono@4.12.9) + '@hono/node-server': 1.19.13(hono@4.12.12) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 @@ -17857,7 +17624,7 @@ snapshots: eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 8.3.2(express@5.2.1) - hono: 4.12.9 + hono: 4.12.12 jose: 6.2.2 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 @@ -17925,10 +17692,10 @@ snapshots: '@napi-rs/canvas-win32-x64-msvc': 0.1.96 optional: true - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)': dependencies: - '@emnapi/core': 1.9.0 - '@emnapi/runtime': 1.9.0 + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -18075,7 +17842,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.34.0': {} - '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.123.0': {} '@panva/asn1.js@1.0.0': {} @@ -18166,35 +17933,35 @@ snapshots: '@popperjs/core@2.11.8': {} - '@preact/preset-vite@2.10.2(@babel/core@7.29.0)(preact@10.29.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + '@preact/preset-vite@2.10.2(@babel/core@7.29.0)(preact@10.29.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@rollup/pluginutils': 4.2.1 babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 picocolors: 1.1.1 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - vite-prerender-plugin: 0.5.11(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite-prerender-plugin: 0.5.11(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - preact - supports-color - '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.60.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.60.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@prefresh/vite': 2.4.12(preact@10.29.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) '@rollup/pluginutils': 5.1.4(rollup@4.60.1) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - vite-prerender-plugin: 0.5.11(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite-prerender-plugin: 0.5.11(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -18214,20 +17981,45 @@ snapshots: dependencies: preact: 10.29.1 + '@prefresh/rolldown@0.1.0(rolldown@1.0.0-rc.13)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + oxc-unshadowed-visitor: 0.0.1(rolldown@1.0.0-rc.13) + rolldown: 1.0.0-rc.13 + rolldown-string: 0.3.0(rolldown@1.0.0-rc.13) + optionalDependencies: + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - oxc-parser + '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + '@prefresh/vite@2.4.12(preact@10.29.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.29.0 '@prefresh/babel-plugin': 0.5.2 '@prefresh/core': 1.5.5(preact@10.29.1) '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.1 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color + '@prefresh/vite@3.0.0(preact@10.29.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + dependencies: + '@babel/core': 7.29.0 + '@prefresh/babel-plugin': 0.5.2 + '@prefresh/core': 1.5.5(preact@10.29.1) + '@prefresh/rolldown': 0.1.0(rolldown@1.0.0-rc.13)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@prefresh/utils': 1.2.1 + '@rollup/pluginutils': 4.2.1 + preact: 10.29.1 + rolldown: 1.0.0-rc.13 + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + transitivePeerDependencies: + - oxc-parser + - supports-color + '@promptbook/utils@0.69.5': dependencies: spacetrim: 0.11.59 @@ -18998,54 +18790,56 @@ snapshots: '@codemirror/state': 6.6.0 '@codemirror/view': 6.41.0 - '@rolldown/binding-android-arm64@1.0.0-rc.12': + '@rolldown/binding-android-arm64@1.0.0-rc.13': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + '@rolldown/binding-darwin-arm64@1.0.0-rc.13': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.12': + '@rolldown/binding-darwin-x64@1.0.0-rc.13': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + '@rolldown/binding-freebsd-x64@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.13': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.13': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.13': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.13': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@emnapi/core': 1.9.1 + '@emnapi/runtime': 1.9.1 + '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.13': optional: true - '@rolldown/pluginutils@1.0.0-rc.12': {} + '@rolldown/pluginutils@1.0.0-rc.13': {} '@rollup/plugin-buble@1.0.3(rollup@4.60.1)': dependencies: @@ -19230,7 +19024,7 @@ snapshots: '@stylistic/eslint-plugin@4.4.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@typescript-eslint/utils': 8.57.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) eslint: 10.2.0(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -19768,19 +19562,19 @@ snapshots: eslint: 10.2.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@6.0.2) + ts-api-utils: 2.5.0(typescript@6.0.2) typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/type-utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.1 eslint: 10.2.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 @@ -19801,12 +19595,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@typescript-eslint/scope-manager': 8.58.0 - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/visitor-keys': 8.58.1 debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) typescript: 6.0.2 @@ -19815,17 +19609,8 @@ snapshots: '@typescript-eslint/project-service@8.57.1(typescript@6.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@6.0.2) - '@typescript-eslint/types': 8.57.2 - debug: 4.4.3 - typescript: 6.0.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.57.2(typescript@6.0.2)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@6.0.2) - '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/tsconfig-utils': 8.58.0(typescript@6.0.2) + '@typescript-eslint/types': 8.58.0 debug: 4.4.3 typescript: 6.0.2 transitivePeerDependencies: @@ -19840,30 +19625,39 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.58.1(typescript@6.0.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) + '@typescript-eslint/types': 8.58.1 + debug: 4.4.3 + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.57.1': dependencies: '@typescript-eslint/types': 8.57.1 '@typescript-eslint/visitor-keys': 8.57.1 - '@typescript-eslint/scope-manager@8.57.2': - dependencies: - '@typescript-eslint/types': 8.57.2 - '@typescript-eslint/visitor-keys': 8.57.2 - '@typescript-eslint/scope-manager@8.58.0': dependencies: '@typescript-eslint/types': 8.58.0 '@typescript-eslint/visitor-keys': 8.58.0 + '@typescript-eslint/scope-manager@8.58.1': + dependencies: + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/visitor-keys': 8.58.1 + '@typescript-eslint/tsconfig-utils@8.57.1(typescript@6.0.2)': dependencies: typescript: 6.0.2 - '@typescript-eslint/tsconfig-utils@8.57.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.2)': dependencies: typescript: 6.0.2 - '@typescript-eslint/tsconfig-utils@8.58.0(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.58.1(typescript@6.0.2)': dependencies: typescript: 6.0.2 @@ -19874,16 +19668,16 @@ snapshots: '@typescript-eslint/utils': 8.57.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@6.0.2) + ts-api-utils: 2.5.0(typescript@6.0.2) typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: - '@typescript-eslint/types': 8.58.0 - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) debug: 4.4.3 eslint: 10.2.0(jiti@2.6.1) ts-api-utils: 2.5.0(typescript@6.0.2) @@ -19893,10 +19687,10 @@ snapshots: '@typescript-eslint/types@8.57.1': {} - '@typescript-eslint/types@8.57.2': {} - '@typescript-eslint/types@8.58.0': {} + '@typescript-eslint/types@8.58.1': {} + '@typescript-eslint/typescript-estree@8.57.1(typescript@6.0.2)': dependencies: '@typescript-eslint/project-service': 8.57.1(typescript@6.0.2) @@ -19907,22 +19701,7 @@ snapshots: minimatch: 10.2.4 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@6.0.2) - typescript: 6.0.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.57.2(typescript@6.0.2)': - dependencies: - '@typescript-eslint/project-service': 8.57.2(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@6.0.2) - '@typescript-eslint/types': 8.57.2 - '@typescript-eslint/visitor-keys': 8.57.2 - debug: 4.4.3 - minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@6.0.2) + ts-api-utils: 2.5.0(typescript@6.0.2) typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -19942,6 +19721,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.58.1(typescript@6.0.2)': + dependencies: + '@typescript-eslint/project-service': 8.58.1(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.2) + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/visitor-keys': 8.58.1 + debug: 4.4.3 + minimatch: 10.2.4 + semver: 7.7.4 + tinyglobby: 0.2.15 + ts-api-utils: 2.5.0(typescript@6.0.2) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.57.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) @@ -19953,17 +19747,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.2(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': - dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.57.2 - '@typescript-eslint/types': 8.57.2 - '@typescript-eslint/typescript-estree': 8.57.2(typescript@6.0.2) - eslint: 10.2.0(jiti@2.6.1) - typescript: 6.0.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/utils@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) @@ -19975,21 +19758,32 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.58.1 + '@typescript-eslint/types': 8.58.1 + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + eslint: 10.2.0(jiti@2.6.1) + typescript: 6.0.2 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.57.1': dependencies: '@typescript-eslint/types': 8.57.1 eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.57.2': - dependencies: - '@typescript-eslint/types': 8.57.2 - eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.58.0': dependencies: '@typescript-eslint/types': 8.58.0 eslint-visitor-keys: 5.0.1 + '@typescript-eslint/visitor-keys@8.58.1': + dependencies: + '@typescript-eslint/types': 8.58.1 + eslint-visitor-keys: 5.0.1 + '@ungap/structured-clone@1.3.0': {} '@univerjs-pro/collaboration-client-ui@0.20.0(@types/react-dom@19.1.6(@types/react@19.1.7))(@types/react@19.1.7)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(rxjs@7.8.2)': @@ -21415,10 +21209,10 @@ snapshots: '@vercel/oidc@3.1.0': {} - '@vitest/browser-webdriverio@4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + '@vitest/browser-webdriverio@4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': dependencies: - '@vitest/browser': 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/browser': 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3) + vitest: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) webdriverio: 9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21426,16 +21220,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)': + '@vitest/browser@4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.2(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/utils': 4.1.2 + '@vitest/mocker': 4.1.3(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/utils': 4.1.3 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) ws: 8.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: - bufferutil @@ -21443,7 +21237,7 @@ snapshots: - utf-8-validate - vite - '@vitest/coverage-istanbul@4.1.2(vitest@4.1.2)': + '@vitest/coverage-istanbul@4.1.3(vitest@4.1.3)': dependencies: '@babel/core': 7.29.0 '@istanbuljs/schema': 0.1.3 @@ -21455,14 +21249,14 @@ snapshots: magicast: 0.5.2 obug: 2.1.1 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.1.2(@vitest/browser@4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2))(vitest@4.1.2)': + '@vitest/coverage-v8@4.1.3(@vitest/browser@4.1.3)(vitest@4.1.3)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.3 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -21471,60 +21265,60 @@ snapshots: obug: 2.1.1 std-env: 4.0.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: - '@vitest/browser': 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2) + '@vitest/browser': 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3) - '@vitest/expect@4.1.2': + '@vitest/expect@4.1.3': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/spy': 4.1.3 + '@vitest/utils': 4.1.3 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.2(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.3(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: - '@vitest/spy': 4.1.2 + '@vitest/spy': 4.1.3 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.7.5(@types/node@24.12.2)(typescript@6.0.2) - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/pretty-format@4.1.2': + '@vitest/pretty-format@4.1.3': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.2': + '@vitest/runner@4.1.3': dependencies: - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.3 pathe: 2.0.3 - '@vitest/snapshot@4.1.2': + '@vitest/snapshot@4.1.3': dependencies: - '@vitest/pretty-format': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/pretty-format': 4.1.3 + '@vitest/utils': 4.1.3 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.2': {} + '@vitest/spy@4.1.3': {} - '@vitest/ui@4.1.2(vitest@4.1.2)': + '@vitest/ui@4.1.3(vitest@4.1.3)': dependencies: - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.3 fflate: 0.8.2 flatted: 3.4.2 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/utils@4.1.2': + '@vitest/utils@4.1.3': dependencies: - '@vitest/pretty-format': 4.1.2 + '@vitest/pretty-format': 4.1.3 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -21718,12 +21512,12 @@ snapshots: optionalDependencies: react: 19.2.4 - '@wxt-dev/auto-icons@1.1.1(wxt@0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': + '@wxt-dev/auto-icons@1.1.1(wxt@0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: defu: 6.1.6 fs-extra: 11.3.4 sharp: 0.34.5 - wxt: 0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + wxt: 0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) '@wxt-dev/browser@0.1.38': dependencies: @@ -21807,11 +21601,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ai@6.0.146(zod@4.3.6): + ai@6.0.153(zod@4.3.6): dependencies: - '@ai-sdk/gateway': 3.0.88(zod@4.3.6) + '@ai-sdk/gateway': 3.0.93(zod@4.3.6) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.22(zod@4.3.6) + '@ai-sdk/provider-utils': 4.0.23(zod@4.3.6) '@opentelemetry/api': 1.9.0 zod: 4.3.6 @@ -22074,14 +21868,6 @@ snapshots: await-to-js@3.0.0: {} - axios@1.14.0(debug@4.4.3): - dependencies: - follow-redirects: 1.15.11(debug@4.4.3) - form-data: 4.0.5 - proxy-from-env: 2.1.0 - transitivePeerDependencies: - - debug - b4a@1.6.7: {} babel-plugin-transform-hook-names@1.0.2(@babel/core@7.29.0): @@ -22090,8 +21876,6 @@ snapshots: bail@2.0.2: {} - balanced-match@1.0.2: {} - balanced-match@4.0.3: {} bare-events@2.7.0: {} @@ -22232,11 +22016,6 @@ snapshots: stream-buffers: 2.2.0 optional: true - brace-expansion@1.1.13: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - brace-expansion@5.0.5: dependencies: balanced-match: 4.0.3 @@ -22874,8 +22653,6 @@ snapshots: transitivePeerDependencies: - supports-color - concat-map@0.0.1: {} - concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 @@ -23971,35 +23748,6 @@ snapshots: '@esbuild/win32-ia32': 0.27.4 '@esbuild/win32-x64': 0.27.4 - esbuild@0.27.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.5 - '@esbuild/android-arm': 0.27.5 - '@esbuild/android-arm64': 0.27.5 - '@esbuild/android-x64': 0.27.5 - '@esbuild/darwin-arm64': 0.27.5 - '@esbuild/darwin-x64': 0.27.5 - '@esbuild/freebsd-arm64': 0.27.5 - '@esbuild/freebsd-x64': 0.27.5 - '@esbuild/linux-arm': 0.27.5 - '@esbuild/linux-arm64': 0.27.5 - '@esbuild/linux-ia32': 0.27.5 - '@esbuild/linux-loong64': 0.27.5 - '@esbuild/linux-mips64el': 0.27.5 - '@esbuild/linux-ppc64': 0.27.5 - '@esbuild/linux-riscv64': 0.27.5 - '@esbuild/linux-s390x': 0.27.5 - '@esbuild/linux-x64': 0.27.5 - '@esbuild/netbsd-arm64': 0.27.5 - '@esbuild/netbsd-x64': 0.27.5 - '@esbuild/openbsd-arm64': 0.27.5 - '@esbuild/openbsd-x64': 0.27.5 - '@esbuild/openharmony-arm64': 0.27.5 - '@esbuild/sunos-x64': 0.27.5 - '@esbuild/win32-arm64': 0.27.5 - '@esbuild/win32-ia32': 0.27.5 - '@esbuild/win32-x64': 0.27.5 - esbuild@0.28.0: optionalDependencies: '@esbuild/aix-ppc64': 0.28.0 @@ -24082,7 +23830,7 @@ snapshots: dependencies: eslint: 10.2.0(jiti@2.6.1) - eslint-linter-browserify@10.1.0: {} + eslint-linter-browserify@10.2.0: {} eslint-plugin-ckeditor5-rules@14.0.0: dependencies: @@ -24142,7 +23890,7 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-simple-import-sort@12.1.1(eslint@10.2.0(jiti@2.6.1)): + eslint-plugin-simple-import-sort@13.0.0(eslint@10.2.0(jiti@2.6.1)): dependencies: eslint: 10.2.0(jiti@2.6.1) @@ -24460,12 +24208,6 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-type@16.5.4: - dependencies: - readable-web-to-node-stream: 3.0.4 - strtok3: 6.3.0 - token-types: 4.2.1 - file-type@21.3.4: dependencies: '@tokenizer/inflate': 0.4.1 @@ -24552,9 +24294,7 @@ snapshots: imul: 1.0.1 optional: true - follow-redirects@1.15.11(debug@4.4.3): - optionalDependencies: - debug: 4.4.3 + follow-redirects@1.15.11: {} for-each@0.3.5: dependencies: @@ -24685,7 +24425,7 @@ snapshots: functions-have-names@1.2.3: {} - fuse.js@7.2.0: {} + fuse.js@7.3.0: {} futoin-hkdf@1.5.3: {} @@ -25147,7 +24887,7 @@ snapshots: hoist-non-react-statics@2.5.5: {} - hono@4.12.9: {} + hono@4.12.12: {} hookable@6.0.1: {} @@ -25275,7 +25015,7 @@ snapshots: http-proxy@1.18.1: dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.15.11 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -25716,35 +25456,37 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jimp@1.6.0: + jimp@1.6.1: dependencies: - '@jimp/core': 1.6.0 - '@jimp/diff': 1.6.0 - '@jimp/js-bmp': 1.6.0 - '@jimp/js-gif': 1.6.0 - '@jimp/js-jpeg': 1.6.0 - '@jimp/js-png': 1.6.0 - '@jimp/js-tiff': 1.6.0 - '@jimp/plugin-blit': 1.6.0 - '@jimp/plugin-blur': 1.6.0 - '@jimp/plugin-circle': 1.6.0 - '@jimp/plugin-color': 1.6.0 - '@jimp/plugin-contain': 1.6.0 - '@jimp/plugin-cover': 1.6.0 - '@jimp/plugin-crop': 1.6.0 - '@jimp/plugin-displace': 1.6.0 - '@jimp/plugin-dither': 1.6.0 - '@jimp/plugin-fisheye': 1.6.0 - '@jimp/plugin-flip': 1.6.0 - '@jimp/plugin-hash': 1.6.0 - '@jimp/plugin-mask': 1.6.0 - '@jimp/plugin-print': 1.6.0 - '@jimp/plugin-quantize': 1.6.0 - '@jimp/plugin-resize': 1.6.0 - '@jimp/plugin-rotate': 1.6.0 - '@jimp/plugin-threshold': 1.6.0 - '@jimp/types': 1.6.0 - '@jimp/utils': 1.6.0 + '@jimp/core': 1.6.1 + '@jimp/diff': 1.6.1 + '@jimp/js-bmp': 1.6.1 + '@jimp/js-gif': 1.6.1 + '@jimp/js-jpeg': 1.6.1 + '@jimp/js-png': 1.6.1 + '@jimp/js-tiff': 1.6.1 + '@jimp/plugin-blit': 1.6.1 + '@jimp/plugin-blur': 1.6.1 + '@jimp/plugin-circle': 1.6.1 + '@jimp/plugin-color': 1.6.1 + '@jimp/plugin-contain': 1.6.1 + '@jimp/plugin-cover': 1.6.1 + '@jimp/plugin-crop': 1.6.1 + '@jimp/plugin-displace': 1.6.1 + '@jimp/plugin-dither': 1.6.1 + '@jimp/plugin-fisheye': 1.6.1 + '@jimp/plugin-flip': 1.6.1 + '@jimp/plugin-hash': 1.6.1 + '@jimp/plugin-mask': 1.6.1 + '@jimp/plugin-print': 1.6.1 + '@jimp/plugin-quantize': 1.6.1 + '@jimp/plugin-resize': 1.6.1 + '@jimp/plugin-rotate': 1.6.1 + '@jimp/plugin-threshold': 1.6.1 + '@jimp/types': 1.6.1 + '@jimp/utils': 1.6.1 + transitivePeerDependencies: + - supports-color jiti@2.6.1: {} @@ -26362,7 +26104,7 @@ snapshots: marked@16.4.2: {} - marked@17.0.5: {} + marked@18.0.0: {} marked@4.3.0: {} @@ -26798,7 +26540,7 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.13 + brace-expansion: 5.0.5 minimatch@5.1.9: dependencies: @@ -27400,6 +27142,10 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + oxc-unshadowed-visitor@0.0.1(rolldown@1.0.0-rc.13): + optionalDependencies: + rolldown: 1.0.0-rc.13 + p-cancelable@2.1.1: {} p-defer@1.0.0: {} @@ -27602,8 +27348,6 @@ snapshots: peberminta@0.9.0: {} - peek-readable@4.1.0: {} - peek-readable@7.0.0: {} pend@1.2.0: {} @@ -27872,8 +27616,6 @@ snapshots: proxy-from-env@1.1.0: {} - proxy-from-env@2.1.0: {} - prr@1.0.1: optional: true @@ -28132,10 +27874,6 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readable-web-to-node-stream@3.0.4: - dependencies: - readable-stream: 4.7.0 - readdir-glob@1.1.3: dependencies: minimatch: 5.1.9 @@ -28408,40 +28146,46 @@ snapshots: robust-predicates@3.0.2: {} - rolldown@1.0.0-rc.12: + rolldown-string@0.3.0(rolldown@1.0.0-rc.13): dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.12 + magic-string: 0.30.21 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-x64': 1.0.0-rc.12 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 + rolldown: 1.0.0-rc.13 - rollup-plugin-stats@2.1.0(rolldown@1.0.0-rc.12)(rollup@4.60.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): - optionalDependencies: - rolldown: 1.0.0-rc.12 - rollup: 4.60.1 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - - rollup-plugin-webpack-stats@3.1.0(rolldown@1.0.0-rc.12)(rollup@4.60.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + rolldown@1.0.0-rc.13: dependencies: - rollup-plugin-stats: 2.1.0(rolldown@1.0.0-rc.12)(rollup@4.60.1)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@oxc-project/types': 0.123.0 + '@rolldown/pluginutils': 1.0.0-rc.13 optionalDependencies: - rolldown: 1.0.0-rc.12 + '@rolldown/binding-android-arm64': 1.0.0-rc.13 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.13 + '@rolldown/binding-darwin-x64': 1.0.0-rc.13 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.13 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.13 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.13 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.13 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.13 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.13 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.13 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.13 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.13 + + rollup-plugin-stats@2.1.0(rolldown@1.0.0-rc.13)(rollup@4.60.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + optionalDependencies: + rolldown: 1.0.0-rc.13 rollup: 4.60.1 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + + rollup-plugin-webpack-stats@3.1.0(rolldown@1.0.0-rc.13)(rollup@4.60.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + dependencies: + rollup-plugin-stats: 2.1.0(rolldown@1.0.0-rc.13)(rollup@4.60.1)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + optionalDependencies: + rolldown: 1.0.0-rc.13 + rollup: 4.60.1 + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) rollup@4.60.1: dependencies: @@ -28473,6 +28217,7 @@ snapshots: '@rollup/rollup-win32-x64-gnu': 4.60.1 '@rollup/rollup-win32-x64-msvc': 4.60.1 fsevents: 2.3.3 + optional: true roughjs@4.6.6: dependencies: @@ -29257,11 +29002,6 @@ snapshots: dependencies: '@tokenizer/token': 0.3.0 - strtok3@6.3.0: - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 4.1.0 - stubborn-fs@2.0.0: dependencies: stubborn-utils: 1.0.2 @@ -29600,11 +29340,6 @@ snapshots: toidentifier@1.0.1: {} - token-types@4.2.1: - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - token-types@6.1.2: dependencies: '@borewit/text-codec': 0.2.2 @@ -29654,10 +29389,6 @@ snapshots: ts-algebra@1.2.2: {} - ts-api-utils@2.4.0(typescript@6.0.2): - dependencies: - typescript: 6.0.2 - ts-api-utils@2.5.0(typescript@6.0.2): dependencies: typescript: 6.0.2 @@ -29783,12 +29514,12 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-eslint@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): + typescript-eslint@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.0(@typescript-eslint/parser@8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.0(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.0(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.2) + '@typescript-eslint/utils': 8.58.1(eslint@10.2.0(jiti@2.6.1))(typescript@6.0.2) eslint: 10.2.0(jiti@2.6.1) typescript: 6.0.2 transitivePeerDependencies: @@ -30102,18 +29833,19 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@5.3.0(@types/node@24.12.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): + vite-node@5.3.0(@types/node@24.12.2)(esbuild@0.27.4)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): 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.12.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.27.4)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' + - '@vitejs/devtools' + - esbuild - jiti - less - - lightningcss - sass - sass-embedded - stylus @@ -30122,7 +29854,7 @@ snapshots: - tsx - yaml - vite-plugin-dts@4.5.4(@types/node@24.12.2)(rollup@4.60.1)(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-dts@4.5.4(@types/node@24.12.2)(rollup@4.60.1)(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@microsoft/api-extractor': 7.52.8(@types/node@24.12.2) '@rollup/pluginutils': 5.1.4(rollup@4.60.1) @@ -30135,27 +29867,27 @@ snapshots: magic-string: 0.30.21 typescript: 6.0.2 optionalDependencies: - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-static-copy@4.0.1(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-static-copy@4.0.1(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: chokidar: 3.6.0 p-map: 7.0.4 picocolors: 1.1.1 tinyglobby: 0.2.15 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - vite-plugin-svgo@2.0.0(typescript@6.0.2)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-plugin-svgo@2.0.0(typescript@6.0.2)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: svgo: 4.0.1 typescript: 6.0.2 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - vite-prerender-plugin@0.5.11(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + vite-prerender-plugin@0.5.11(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -30163,34 +29895,14 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - vite@7.3.1(@types/node@24.12.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): - dependencies: - esbuild: 0.27.5 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.8 - rollup: 4.60.1 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 24.12.2 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.1.3 - lightningcss: 1.32.0 - sass: 1.91.0 - sass-embedded: 1.91.0 - terser: 5.44.0 - tsx: 4.21.0 - yaml: 2.8.3 - - vite@8.0.5(@types/node@24.12.2)(esbuild@0.27.4)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): + vite@8.0.7(@types/node@24.12.2)(esbuild@0.27.4)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.8 - rolldown: 1.0.0-rc.12 + rolldown: 1.0.0-rc.13 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.12.2 @@ -30204,12 +29916,12 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): + vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 postcss: 8.5.8 - rolldown: 1.0.0-rc.12 + rolldown: 1.0.0-rc.13 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.12.2 @@ -30223,15 +29935,15 @@ snapshots: tsx: 4.21.0 yaml: 2.8.3 - vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.2)(@vitest/ui@4.1.2)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.3(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.3)(@vitest/coverage-istanbul@4.1.3)(@vitest/coverage-v8@4.1.3)(@vitest/ui@4.1.3)(happy-dom@20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.2 - '@vitest/runner': 4.1.2 - '@vitest/snapshot': 4.1.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/expect': 4.1.3 + '@vitest/mocker': 4.1.3(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.3 + '@vitest/runner': 4.1.3 + '@vitest/snapshot': 4.1.3 + '@vitest/spy': 4.1.3 + '@vitest/utils': 4.1.3 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -30243,13 +29955,15 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.12.2 - '@vitest/browser-webdriverio': 4.1.2(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.5(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.2)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) - '@vitest/ui': 4.1.2(vitest@4.1.2) + '@vitest/browser-webdriverio': 4.1.3(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.2))(utf-8-validate@6.0.5)(vite@8.0.7(@types/node@24.12.2)(esbuild@0.28.0)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3))(vitest@4.1.3)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@vitest/coverage-istanbul': 4.1.3(vitest@4.1.3) + '@vitest/coverage-v8': 4.1.3(@vitest/browser@4.1.3)(vitest@4.1.3) + '@vitest/ui': 4.1.3(vitest@4.1.3) happy-dom: 20.8.9(bufferutil@4.0.9)(utf-8-validate@6.0.5) jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5) transitivePeerDependencies: @@ -30600,7 +30314,7 @@ snapshots: is-wsl: 3.1.1 powershell-utils: 0.1.0 - wxt@0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): + wxt@0.20.20(@types/node@24.12.2)(eslint@10.2.0(jiti@2.6.1))(jiti@2.6.1)(less@4.1.3)(rollup@4.60.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: '@1natsu/wait-element': 4.1.2 '@aklinker1/rollup-plugin-visualizer': 5.12.0(rollup@4.60.1) @@ -30643,8 +30357,8 @@ snapshots: scule: 1.3.0 tinyglobby: 0.2.15 unimport: 5.6.0 - vite: 8.0.5(@types/node@24.12.2)(esbuild@0.27.4)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) - vite-node: 5.3.0(@types/node@24.12.2)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.32.0)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite: 8.0.7(@types/node@24.12.2)(esbuild@0.27.4)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) + vite-node: 5.3.0(@types/node@24.12.2)(esbuild@0.27.4)(jiti@2.6.1)(less@4.1.3)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.21.0)(yaml@2.8.3) web-ext-run: 0.2.4 optionalDependencies: eslint: 10.2.0(jiti@2.6.1) @@ -30654,7 +30368,6 @@ snapshots: - canvas - jiti - less - - lightningcss - rollup - sass - sass-embedded