> = {
cssClass: t("attribute_detail.css_class"),
iconClass: t("attribute_detail.icon_class"),
pageSize: t("attribute_detail.page_size"),
- customRequestHandler: t("attribute_detail.custom_request_handler"),
- customResourceProvider: t("attribute_detail.custom_resource_provider"),
+ customRequestHandler: { description: t("attribute_detail.custom_request_handler"), helpPage: "J5Ex1ZrMbyJ6" },
+ customResourceProvider: { description: t("attribute_detail.custom_resource_provider"), helpPage: "J5Ex1ZrMbyJ6" },
widget: t("attribute_detail.widget"),
workspace: t("attribute_detail.workspace"),
workspaceIconClass: t("attribute_detail.workspace_icon_class"),
@@ -655,9 +662,21 @@ export default class AttributeDetailWidget extends NoteContextAwareWidget {
const attrName = String(this.$inputName.val());
if (this.attrType && this.attrType in ATTR_HELP && attrName && attrName in ATTR_HELP[this.attrType]) {
+ const entry = ATTR_HELP[this.attrType][attrName];
+ const description = typeof entry === "string" ? entry : entry.description;
+ const helpPage = typeof entry === "string" ? undefined : entry.helpPage;
+
+ const $td = $("").append($("").text(attrName)).append(" - ").append(description);
+
+ if (helpPage) {
+ const $helpButton = $(` `);
+ $helpButton.on("click", () => openInAppHelpFromUrl(helpPage));
+ $td.append($helpButton);
+ }
+
this.$attrHelp
.empty()
- .append($("").append($("").text(attrName)).append(" - ").append(ATTR_HELP[this.attrType][attrName]))
+ .append($td)
.show();
} else {
this.$attrHelp.empty().hide();
diff --git a/apps/client/src/widgets/containers/scrolling_container.css b/apps/client/src/widgets/containers/scrolling_container.css
index a3fae557a3..e759d3bb74 100644
--- a/apps/client/src/widgets/containers/scrolling_container.css
+++ b/apps/client/src/widgets/containers/scrolling_container.css
@@ -23,7 +23,7 @@ body.mobile .scrolling-container {
--content-margin-inline: 8px;
}
-.note-split.type-code:not(.mime-text-x-sqlite) {
+.note-split.type-code:not(.mime-text-x-sqlite, .mime-text-x-markdown) {
&> .scrolling-container {
background-color: var(--code-background-color);
--scrollbar-background-color: var(--main-background-color);
diff --git a/apps/client/src/widgets/dialogs/PopupEditor.css b/apps/client/src/widgets/dialogs/PopupEditor.css
index c1f5c7b2a3..d68c3cab88 100644
--- a/apps/client/src/widgets/dialogs/PopupEditor.css
+++ b/apps/client/src/widgets/dialogs/PopupEditor.css
@@ -1,7 +1,14 @@
/** Reduce the z-index of modals so that ckeditor popups are properly shown on top of it. */
-body.popup-editor-open > .modal-backdrop { z-index: 998; }
-body.popup-editor-open .popup-editor-dialog { z-index: 999; }
-body.popup-editor-open .ck-clipboard-drop-target-line { z-index: 1000; }
+body.popup-editor-open:not(.popup-editor-stacked) > .modal-backdrop { z-index: 998; }
+body.popup-editor-open:not(.popup-editor-stacked) .popup-editor-dialog { z-index: 999; }
+body.popup-editor-open:not(.popup-editor-stacked) .ck-clipboard-drop-target-line { z-index: 1000; }
+
+/** When stacked on top of another Bootstrap modal (e.g. opened from a dialog's help button),
+ raise the popup and its own backdrop above the underlying modal (Bootstrap defaults are
+ backdrop 1050, dialog 1055 — no native stacking increment). */
+body.popup-editor-stacked .popup-editor-dialog { z-index: 1100; }
+body.popup-editor-stacked .ck-clipboard-drop-target-line { z-index: 1101; }
+.modal-backdrop.popup-editor-backdrop { z-index: 1099; }
body.desktop .modal.popup-editor-dialog .modal-dialog {
max-width: 75vw;
diff --git a/apps/client/src/widgets/dialogs/PopupEditor.tsx b/apps/client/src/widgets/dialogs/PopupEditor.tsx
index 92851ddc93..851cefcbad 100644
--- a/apps/client/src/widgets/dialogs/PopupEditor.tsx
+++ b/apps/client/src/widgets/dialogs/PopupEditor.tsx
@@ -30,6 +30,7 @@ const isNewLayout = isExperimentalFeatureEnabled("new-layout");
export default function PopupEditor() {
const [ shown, setShown ] = useState(false);
+ const [ stacked, setStacked ] = useState(false);
const parentComponent = useContext(ParentComponent);
const [ noteContext, setNoteContext ] = useState(new NoteContext("_popup-editor"));
const isMobile = utils.isMobile();
@@ -40,6 +41,7 @@ export default function PopupEditor() {
useTriliumEvent("openInPopup", async ({ noteIdOrPath }) => {
const noteContext = new NoteContext("_popup-editor");
+ setStacked(!!document.querySelector(".modal.show"));
const noteId = tree.getNoteIdAndParentIdFromUrl(noteIdOrPath);
if (!noteId.noteId) return;
@@ -51,7 +53,8 @@ export default function PopupEditor() {
viewScope: {
// Override auto-readonly notes to be editable, but respect user's choice to have a read-only note.
readOnlyTemporarilyDisabled: !hasUserSetNoteReadOnly
- }
+ },
+ keepActiveDialog: true
});
// Events triggered at note context level (e.g. the save indicator) would not work since the note context has no parent component. Propagate events to parent component so that they can be handled properly.
@@ -63,7 +66,20 @@ export default function PopupEditor() {
// Add a global class to be able to handle issues with z-index due to rendering in a popup.
useEffect(() => {
document.body.classList.toggle("popup-editor-open", shown);
- }, [shown]);
+ document.body.classList.toggle("popup-editor-stacked", shown && stacked);
+ }, [shown, stacked]);
+
+ // When stacked on top of another modal, raise this popup's own backdrop above
+ // the underlying modal. Bootstrap does not auto-increment z-index for stacked
+ // modals, and the appended `.modal-backdrop` is not individually addressable.
+ useEffect(() => {
+ if (!shown || !stacked) return;
+ const backdrops = document.querySelectorAll(".modal-backdrop");
+ const popupBackdrop = backdrops[backdrops.length - 1] as HTMLElement | undefined;
+ if (!popupBackdrop) return;
+ popupBackdrop.classList.add("popup-editor-backdrop");
+ return () => popupBackdrop.classList.remove("popup-editor-backdrop");
+ }, [shown, stacked]);
return (
diff --git a/apps/client/src/widgets/dialogs/delete_notes.css b/apps/client/src/widgets/dialogs/delete_notes.css
index 864fcc2e0c..ef72030081 100644
--- a/apps/client/src/widgets/dialogs/delete_notes.css
+++ b/apps/client/src/widgets/dialogs/delete_notes.css
@@ -17,6 +17,9 @@
.delete-notes-dialog .preview-list li {
padding: 6px 16px;
border-bottom: 1px solid var(--main-border-color);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
.delete-notes-dialog .preview-list li:last-child {
diff --git a/apps/client/src/widgets/dialogs/delete_notes.tsx b/apps/client/src/widgets/dialogs/delete_notes.tsx
index 2a5cb0c0b5..a37be2d76d 100644
--- a/apps/client/src/widgets/dialogs/delete_notes.tsx
+++ b/apps/client/src/widgets/dialogs/delete_notes.tsx
@@ -1,7 +1,10 @@
import "./delete_notes.css";
import type { DeleteNotesPreview } from "@triliumnext/commons";
+import { CSSProperties } from "preact";
import { useEffect, useRef, useState } from "preact/hooks";
+import type React from "react";
+import { List, type RowComponentProps } from "react-window";
import froca from "../../services/froca.js";
import { t } from "../../services/i18n.js";
@@ -173,18 +176,42 @@ function DeleteAllClonesOption({ cloneInfo, deleteAllClones, setDeleteAllClones
);
}
+const ROW_HEIGHT = 36;
+const VIRTUALIZE_THRESHOLD = 100;
+const MAX_LIST_HEIGHT = 400;
+
+function DeletedNoteRow({ index, style, noteIds }: RowComponentProps<{ noteIds: string[] }>) {
+ return (
+
+
+
+ ) as React.ReactElement;
+}
+
function DeletedNotes({ noteIdsToBeDeleted }: { noteIdsToBeDeleted: DeleteNotesPreview["noteIdsToBeDeleted"] }) {
return (
0}>
{noteIdsToBeDeleted.length ? (
-
- {noteIdsToBeDeleted.map((noteId) => (
-
-
-
- ))}
-
+ noteIdsToBeDeleted.length > VIRTUALIZE_THRESHOLD ? (
+
+ ) : (
+
+ {noteIdsToBeDeleted.map((noteId) => (
+
+
+
+ ))}
+
+ )
) : (
{t("delete_notes.no_note_to_delete")}
)}
diff --git a/apps/client/src/widgets/dialogs/print_preview.css b/apps/client/src/widgets/dialogs/print_preview.css
new file mode 100644
index 0000000000..f1c89f1beb
--- /dev/null
+++ b/apps/client/src/widgets/dialogs/print_preview.css
@@ -0,0 +1,54 @@
+.modal.print-preview-dialog {
+ .modal-body {
+ height: 78vh;
+ padding: 0;
+ display: flex;
+ }
+
+ .print-preview-settings {
+ padding: 16px;
+ min-width: 250px;
+ overflow-y: auto;
+ }
+
+ .print-preview-page-ranges {
+ width: 140px;
+ }
+
+ .print-preview-pane {
+ flex: 1;
+ position: relative;
+ }
+
+ .print-preview-loading-overlay {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1;
+ background-color: var(--modal-bg-color, rgba(255, 255, 255, 0.8));
+
+ .bx-loader-circle {
+ font-size: 2rem;
+ }
+ }
+
+ .margin-editor {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 4px;
+ padding: 8px 0;
+ }
+
+ .margin-editor-row {
+ display: flex;
+ gap: 24px;
+ align-items: center;
+ }
+
+ .margin-spinner {
+ width: 130px;
+ }
+}
diff --git a/apps/client/src/widgets/dialogs/print_preview.tsx b/apps/client/src/widgets/dialogs/print_preview.tsx
index c99e63cd17..78275329e2 100644
--- a/apps/client/src/widgets/dialogs/print_preview.tsx
+++ b/apps/client/src/widgets/dialogs/print_preview.tsx
@@ -1,3 +1,5 @@
+import "./print_preview.css";
+
import { useCallback, useEffect, useMemo, useRef, useState } from "preact/hooks";
import FNote from "../../entities/fnote";
@@ -7,6 +9,8 @@ import { dynamicRequire, isElectron } from "../../services/utils";
import Button, { ButtonGroup } from "../react/Button";
import Dropdown from "../react/Dropdown";
import { FormListHeader, FormListItem } from "../react/FormList";
+import FormSelect from "../react/FormSelect";
+import FormTextBox, { FormTextBoxWithUnit } from "../react/FormTextBox";
import { useNoteLabelBoolean, useNoteLabelWithDefault, useTriliumEvent } from "../react/hooks";
import Modal from "../react/Modal";
import Slider from "../react/Slider";
@@ -71,7 +75,6 @@ function isValidPageRanges(value: string): boolean {
}
export interface PrintPreviewData {
- pdfBuffer: Uint8Array;
note: FNote;
notePath: string;
}
@@ -92,7 +95,7 @@ export default function PrintPreviewDialog() {
const bufferRef = useRef();
const notePathRef = useRef("");
const pdfUrlRef = useRef();
- const generationRef = useRef(0);
+
const [landscape, setLandscape] = useNoteLabelBoolean(note, "printLandscape");
const [pageSize, setPageSize] = useNoteLabelWithDefault(note, "printPageSize", "Letter");
@@ -110,8 +113,6 @@ export default function PrintPreviewDialog() {
const [printers, setPrinters] = useState([]);
const [destination, setDestination] = useState(DESTINATION_PDF);
- const skipNextRegenRef = useRef(false);
-
useEffect(() => {
if (!shown || !isElectron()) return;
const { ipcRenderer } = dynamicRequire("electron");
@@ -137,15 +138,11 @@ export default function PrintPreviewDialog() {
}, []);
useTriliumEvent("showPrintPreview", (data: PrintPreviewData) => {
- // When the dialog is already open, it manages its own regeneration via
- // a persistent IPC listener. Ignore duplicate events from NoteDetail's
- // listener to avoid overwriting the preview with stale data.
if (shown) return;
- skipNextRegenRef.current = true;
setNote(data.note);
notePathRef.current = data.notePath;
- updatePreview(data.pdfBuffer);
+ setLoading(true);
setShown(true);
});
@@ -157,8 +154,6 @@ export default function PrintPreviewDialog() {
const { ipcRenderer } = dynamicRequire("electron");
const onResult = (_e: any, { buffer, error }: { buffer?: Uint8Array; error?: string }) => {
- if (generationRef.current <= 0) return;
-
toast.closePersistent("printing");
if (error) {
setLoading(false);
@@ -188,7 +183,6 @@ export default function PrintPreviewDialog() {
const regeneratePreview = useCallback((opts: PreviewOpts) => {
if (!isElectron()) return;
- ++generationRef.current;
setLoading(true);
const { ipcRenderer } = dynamicRequire("electron");
ipcRenderer.send("export-as-pdf-preview", {
@@ -201,20 +195,23 @@ export default function PrintPreviewDialog() {
});
}, []);
+ const isFirstGenerationRef = useRef(true);
+
useEffect(() => {
if (!shown || !pageRangesValid) return;
- if (skipNextRegenRef.current) {
- skipNextRegenRef.current = false;
- return;
- }
+
+ const delay = isFirstGenerationRef.current ? 0 : 800;
+ isFirstGenerationRef.current = false;
+
const handle = setTimeout(() => {
regeneratePreview({ landscape, pageSize, scale, margins: marginsStr, pageRanges: pageRanges.trim() });
- }, 400);
+ }, delay);
return () => clearTimeout(handle);
}, [shown, landscape, pageSize, scale, marginsStr, pageRanges, pageRangesValid, regeneratePreview]);
function handleClose() {
setShown(false);
+ isFirstGenerationRef.current = true;
toast.closePersistent("print-preview-error");
if (pdfUrlRef.current) {
URL.revokeObjectURL(pdfUrlRef.current);
@@ -278,7 +275,7 @@ export default function PrintPreviewDialog() {
size="xl"
show={shown}
onHidden={handleClose}
- bodyStyle={{ height: "78vh", padding: 0, display: "flex" }}
+ stackable
footerAlignment="between"
footer={
<>
@@ -305,7 +302,7 @@ export default function PrintPreviewDialog() {
>
}
>
-
+
- setPageSize((e.target as HTMLSelectElement).value)}
+ ({ key: size, title: size }))}
+ keyProperty="key"
+ titleProperty="title"
+ currentValue={pageSize}
+ onChange={setPageSize}
disabled={loading}
- >
- {PAGE_SIZES.map((size) => (
- {size}
- ))}
-
+ />
@@ -379,17 +374,19 @@ export default function PrintPreviewDialog() {
- setMarginsStr(serializeMargins((e.target as HTMLSelectElement).value as MarginPreset | "custom", customMargins))}
+ setMarginsStr(serializeMargins(value as MarginPreset | "custom", customMargins))}
disabled={loading}
- >
- {t("print_preview.margins_default")}
- {t("print_preview.margins_none")}
- {t("print_preview.margins_minimum")}
- {t("print_preview.margins_custom")}
-
+ />
{marginPreset === "custom" && (
@@ -401,26 +398,24 @@ export default function PrintPreviewDialog() {
label={t("print_preview.page_ranges")}
description={!pageRangesValid ? t("print_preview.page_ranges_invalid") : t("print_preview.page_ranges_hint")}
>
- setPageRanges((e.target as HTMLInputElement).value)}
+ onChange={(value) => setPageRanges(value)}
disabled={loading}
- style={{ width: "140px" }}
/>
-
+
{loading && (
-
-
+
+
)}
- {pdfUrl &&
}
+ {pdfUrl &&
}
);
@@ -439,42 +434,37 @@ function MarginEditor({ margins, onChange, disabled }: {
onChange: (side: keyof CustomMargins, value: number) => void;
disabled: boolean;
}) {
- const spinnerStyle = { width: "130px" };
-
return (
-
-
onChange("top", v)} disabled={disabled} style={spinnerStyle} />
-
-
onChange("left", v)} disabled={disabled} style={spinnerStyle} />
- onChange("right", v)} disabled={disabled} style={spinnerStyle} />
+
+
onChange("top", v)} disabled={disabled} />
+
+ onChange("left", v)} disabled={disabled} />
+ onChange("right", v)} disabled={disabled} />
- onChange("bottom", v)} disabled={disabled} style={spinnerStyle} />
+ onChange("bottom", v)} disabled={disabled} />
);
}
-function MarginSpinner({ label, value, onChange, disabled, style }: {
+function MarginSpinner({ label, value, onChange, disabled }: {
label: string;
value: number;
onChange: (value: number) => void;
disabled: boolean;
- style?: Record;
}) {
return (
-
- onChange(Math.min(100, (e.target as HTMLInputElement).valueAsNumber || 0))}
- disabled={disabled}
- />
- mm
-
+ onChange(Math.min(100, parseInt(val, 10) || 0))}
+ disabled={disabled}
+ unit="mm"
+ />
);
}
diff --git a/apps/client/src/widgets/dialogs/revisions.tsx b/apps/client/src/widgets/dialogs/revisions.tsx
index 2e2094267c..c1daef2050 100644
--- a/apps/client/src/widgets/dialogs/revisions.tsx
+++ b/apps/client/src/widgets/dialogs/revisions.tsx
@@ -31,6 +31,8 @@ import NoItems from "../react/NoItems";
import { RawHtmlBlock, SanitizedHtml } from "../react/RawHtml";
import PdfViewer from "../type_widgets/file/PdfViewer";
+const DIFFABLE_TYPES = ["text", "code", "mermaid"];
+
export default function RevisionsDialog() {
const [ note, setNote ] = useState();
const [ noteContent, setNoteContent ] = useState();
@@ -358,7 +360,7 @@ function RevisionToolbar({ revisionItem, showDiff, setShowDiff, setShown, onRevi
onRevisionDeleted?: () => void,
onDescriptionUpdated?: (revisionId: string, description: string) => void,
}) {
- const canShowDiff = ["text", "code", "mermaid"].includes(revisionItem?.type ?? "");
+ const canShowDiff = DIFFABLE_TYPES.includes(revisionItem?.type ?? "");
const canInteract = revisionItem && (!revisionItem.isProtected || protected_session_holder.isProtectedSessionAvailable());
const [ editingDescription, setEditingDescription ] = useState(false);
const [ descriptionDraft, setDescriptionDraft ] = useState("");
@@ -529,7 +531,7 @@ function RevisionContent({ noteContent, revisionItem, fullRevision, showDiff }:
return <>>;
}
- if (showDiff) {
+ if (showDiff && DIFFABLE_TYPES.includes(revisionItem.type)) {
return ;
}
switch (revisionItem.type) {
diff --git a/apps/client/src/widgets/layout/Breadcrumb.tsx b/apps/client/src/widgets/layout/Breadcrumb.tsx
index 8c393f9dad..f520483d93 100644
--- a/apps/client/src/widgets/layout/Breadcrumb.tsx
+++ b/apps/client/src/widgets/layout/Breadcrumb.tsx
@@ -187,6 +187,15 @@ interface BreadcrumbSeparatorProps {
}
function BreadcrumbSeparator(props: BreadcrumbSeparatorProps) {
+ const notePathComponents = (props.notePath ?? "").split("/");
+ const parentNoteId = notePathComponents.at(-1);
+ const parentNote = useNote(parentNoteId);
+ const [ subtreeHidden ] = useNoteLabelBoolean(parentNote, "subtreeHidden");
+
+ if (subtreeHidden && !props.activeNotePath) {
+ return null;
+ }
+
return (
}
diff --git a/apps/client/src/widgets/layout/InlineTitle.tsx b/apps/client/src/widgets/layout/InlineTitle.tsx
index d4e2602f9e..8502ac3d48 100644
--- a/apps/client/src/widgets/layout/InlineTitle.tsx
+++ b/apps/client/src/widgets/layout/InlineTitle.tsx
@@ -24,13 +24,14 @@ const supportedNoteTypes = new Set([
export default function InlineTitle() {
const { note, parentComponent, viewScope } = useNoteContext();
const type = useNoteProperty(note, "type");
+ const mime = useNoteProperty(note, "mime");
const [ shown, setShown ] = useState(shouldShow(note, type, viewScope));
const containerRef = useRef(null);
const [ titleHidden, setTitleHidden ] = useState(false);
useLayoutEffect(() => {
setShown(shouldShow(note, type, viewScope));
- }, [ note, type, viewScope ]);
+ }, [ note, type, mime, viewScope ]);
useLayoutEffect(() => {
if (!shown) return;
diff --git a/apps/client/src/widgets/layout/StatusBar.css b/apps/client/src/widgets/layout/StatusBar.css
index f0a10ab8b8..a35890fc3c 100644
--- a/apps/client/src/widgets/layout/StatusBar.css
+++ b/apps/client/src/widgets/layout/StatusBar.css
@@ -179,15 +179,22 @@ body.experimental-feature-new-layout.mobile div.similar-notes-widget div.similar
display: flex;
padding: 6px 12px;
background: var(--bottom-panel-title-bar-background-color);
- justify-content: space-between;
align-items: center;
+ gap: 4px;
.bottom-panel-title-bar-caption {
+ flex-grow: 1;
text-transform: uppercase;
letter-spacing: .3pt;
font-weight: 600;
font-size: .85em;
}
+
+ .icon-action {
+ --icon-button-size: 24px;
+ --icon-button-icon-ratio: 0.8;
+ border-radius: 50%;
+ }
}
.bottom-panel-content {
diff --git a/apps/client/src/widgets/layout/StatusBar.tsx b/apps/client/src/widgets/layout/StatusBar.tsx
index 50657867cd..69c9f327f6 100644
--- a/apps/client/src/widgets/layout/StatusBar.tsx
+++ b/apps/client/src/widgets/layout/StatusBar.tsx
@@ -24,9 +24,9 @@ import { useActiveNoteContext, useLegacyImperativeHandlers, useNoteLabel, useNot
import Icon from "../react/Icon";
import LinkButton from "../react/LinkButton";
import { ParentComponent } from "../react/react_utils";
+import AutoLinkAttributesTab from "../ribbon/AutoLinkAttributesTab";
import { ContentLanguagesModal, NoteTypeCodeNoteList, NoteTypeOptionsModal, useLanguageSwitcher, useMimeTypes } from "../ribbon/BasicPropertiesTab";
import AttributeEditor, { AttributeEditorImperativeHandlers } from "../ribbon/components/AttributeEditor";
-import AutoLinkAttributesTab from "../ribbon/AutoLinkAttributesTab";
import InheritedAttributesTab from "../ribbon/InheritedAttributesTab";
import { NoteSizeWidget, useNoteMetadata } from "../ribbon/NoteInfoTab";
import { NotePathsWidget, useSortedNotePaths } from "../ribbon/NotePathsTab";
@@ -397,7 +397,8 @@ function AttributesPane({ note, noteContext, attributesShown, setAttributesShown
+ setVisible={setAttributesShown}
+ helpPage="zEY4DaJG4YT5">
{t("inherited_attribute_list.title")}
@@ -583,12 +584,14 @@ interface BottomPanelParams {
visible: boolean;
setVisible?: (visible: boolean) => void;
className?: string;
+ helpPage?: string;
}
-function BottomPanel({ children, title, visible, setVisible, className }: BottomPanelParams) {
+function BottomPanel({ children, title, visible, setVisible, className, helpPage }: BottomPanelParams) {
return
{title}
+ {helpPage && openInAppHelpFromUrl(helpPage)} title={t("open-help-page")} />}
setVisible?.(false)} />
diff --git a/apps/client/src/widgets/react/Icon.tsx b/apps/client/src/widgets/react/Icon.tsx
index 4bae69c460..1490e024c4 100644
--- a/apps/client/src/widgets/react/Icon.tsx
+++ b/apps/client/src/widgets/react/Icon.tsx
@@ -1,7 +1,7 @@
import clsx from "clsx";
import { HTMLAttributes } from "preact";
-interface IconProps extends Pick
, "className" | "onClick" | "title"> {
+interface IconProps extends Pick, "className" | "onClick" | "title" | "style"> {
icon?: string;
className?: string;
}
diff --git a/apps/client/src/widgets/react/Modal.tsx b/apps/client/src/widgets/react/Modal.tsx
index f84bac3222..ab312cb170 100644
--- a/apps/client/src/widgets/react/Modal.tsx
+++ b/apps/client/src/widgets/react/Modal.tsx
@@ -3,8 +3,10 @@ import clsx from "clsx";
import { ComponentChildren, CSSProperties, RefObject } from "preact";
import { useEffect, useMemo, useRef } from "preact/hooks";
+import appContext from "../../components/app_context";
import { openDialog } from "../../services/dialog";
import { t } from "../../services/i18n";
+import { openInAppHelpFromUrl } from "../../services/utils";
import { useSyncedRef } from "./hooks";
interface CustomTitleBarButton {
@@ -170,7 +172,12 @@ export default function Modal({ children, className, size, title, customTitleBar
)}
{header}
{helpPageId && (
- ?
+ appContext.triggerCommand("openInPopup", { noteIdOrPath: `_help_${helpPageId}` })}
+ >?
)}
{titleBarButtons?.filter((b) => b !== null).map((titleBarButton) => (
diff --git a/apps/client/src/widgets/ribbon/NoteActions.tsx b/apps/client/src/widgets/ribbon/NoteActions.tsx
index f9442f7185..94548d3194 100644
--- a/apps/client/src/widgets/ribbon/NoteActions.tsx
+++ b/apps/client/src/widgets/ribbon/NoteActions.tsx
@@ -76,13 +76,15 @@ export function NoteContextMenu({ note, noteContext, itemsAtStart, itemsNearNote
const [viewType] = useNoteLabel(note, "viewType");
const canBeConvertedToAttachment = note?.isEligibleForConversionToAttachment();
const isSourceView = noteContext?.viewScope?.viewMode === "source";
- const isSearchable = isSourceView || ["text", "code", "book", "mindMap", "doc", "spreadsheet"].includes(noteType);
+ const isSearchable = isSourceView || ["text", "code", "book", "mindMap", "doc", "spreadsheet"].includes(noteType)
+ || (noteType === "file" && note.mime === "application/pdf");
const isInOptionsOrHelp = note?.noteId.startsWith("_options") || note?.noteId.startsWith("_help");
const isExportableToImage = ["mermaid", "mindMap"].includes(noteType);
const isContentAvailable = note.isContentAvailable();
const isPrintable = isContentAvailable && (
- ["text", "code"].includes(noteType) ||
- (noteType === "book" && ["presentation", "list", "table"].includes(viewType ?? ""))
+ ["text", "code", "spreadsheet"].includes(noteType) ||
+ (noteType === "book" && ["presentation", "list", "table"].includes(viewType ?? "")) ||
+ (noteType === "file" && note.mime === "application/pdf")
);
const isElectron = getIsElectron();
const isMac = getIsMac();
diff --git a/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx b/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx
index c62b538af5..bf25947f8d 100644
--- a/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx
+++ b/apps/client/src/widgets/ribbon/SearchDefinitionOptions.tsx
@@ -8,6 +8,7 @@ import FNote from "../../entities/fnote";
import { removeOwnedAttributesByNameOrType } from "../../services/attributes";
import { t } from "../../services/i18n";
import server from "../../services/server";
+import { openInAppHelpFromUrl } from "../../services/utils";
import Admonition from "../react/Admonition";
import FormSelect from "../react/FormSelect";
import FormTextArea from "../react/FormTextArea";
@@ -165,7 +166,10 @@ function SearchStringOption({ note, refreshResults, error, ...restProps }: Searc
title={t("search_string.title_column")}
className={clsx({ "has-error": !!error })}
help={<>
- {t("search_string.search_syntax")} - {t("search_string.also_see")} {t("search_string.complete_help")}
+ {t("search_string.search_syntax")} - {t("search_string.also_see")} {
+ e.preventDefault();
+ openInAppHelpFromUrl("eIg8jdvaoNNd");
+ }}>{t("search_string.complete_help")}
{t("search_string.full_text_search")}
#abc - {t("search_string.label_abc")}
diff --git a/apps/client/src/widgets/sidebar/RightPanelContainer.css b/apps/client/src/widgets/sidebar/RightPanelContainer.css
index 2000a20d75..8351868cb3 100644
--- a/apps/client/src/widgets/sidebar/RightPanelContainer.css
+++ b/apps/client/src/widgets/sidebar/RightPanelContainer.css
@@ -13,9 +13,17 @@ body.experimental-feature-new-layout #right-pane {
justify-content: flex-start;
--icon-button-size: 26px;
+ .icon-action {
+ flex-shrink: 0;
+ transition: transform 0.15s ease;
+ }
+
.card-header-title {
padding-inline: 0;
flex-grow: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
}
}
@@ -28,13 +36,33 @@ body.experimental-feature-new-layout #right-pane {
border-bottom: 0;
}
- &.collapsed .card-header > .tn-icon {
+ &.collapsed .card-header > .icon-action {
transform: rotate(-90deg);
}
}
.card.grow:not(.collapsed) {
- flex-grow: 1;
+ flex: 1;
+ flex-shrink: 1;
+ min-height: 0;
+ display: flex;
+ flex-direction: column;
+
+ .body-wrapper {
+ flex: 1;
+ min-height: 0;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ }
+
+ .card-body {
+ flex: 1;
+ min-height: 0;
+ overflow: auto;
+ display: flex;
+ flex-direction: column;
+ }
}
.gutter-vertical + .card .card-header {
diff --git a/apps/client/src/widgets/sidebar/RightPanelContainer.tsx b/apps/client/src/widgets/sidebar/RightPanelContainer.tsx
index b758cea301..d8688186e4 100644
--- a/apps/client/src/widgets/sidebar/RightPanelContainer.tsx
+++ b/apps/client/src/widgets/sidebar/RightPanelContainer.tsx
@@ -16,6 +16,7 @@ import { useActiveNoteContext, useLegacyWidget, useNoteProperty, useTriliumEvent
import NoItems from "../react/NoItems";
import LegacyRightPanelWidget from "../right_panel_widget";
import HighlightsList from "./HighlightsList";
+import PdfAnnotations from "./pdf/PdfAnnotations";
import PdfAttachments from "./pdf/PdfAttachments";
import PdfLayers from "./pdf/PdfLayers";
import PdfPages from "./pdf/PdfPages";
@@ -75,7 +76,7 @@ function useItems(rightPaneVisible: boolean, widgetsByParent: WidgetsByParent) {
const definitions: RightPanelWidgetDefinition[] = [
{
el: ,
- enabled: (noteType === "text" || noteType === "doc" || isPdf),
+ enabled: (noteType === "text" || noteType === "doc" || isPdf || !!note?.isMarkdown()),
},
{
el: ,
@@ -89,6 +90,10 @@ function useItems(rightPaneVisible: boolean, widgetsByParent: WidgetsByParent) {
el: ,
enabled: isPdf,
},
+ {
+ el: ,
+ enabled: isPdf,
+ },
{
el: ,
enabled: noteType === "text" && highlightsList.length > 0,
diff --git a/apps/client/src/widgets/sidebar/RightPanelWidget.tsx b/apps/client/src/widgets/sidebar/RightPanelWidget.tsx
index 604b39e7c4..3b05f24627 100644
--- a/apps/client/src/widgets/sidebar/RightPanelWidget.tsx
+++ b/apps/client/src/widgets/sidebar/RightPanelWidget.tsx
@@ -30,6 +30,7 @@ export default function RightPanelWidget({ id, title, buttons, children, contain
return (
-
+
{chat.messages.length === 0 && !chat.isStreaming && (
{((noteType === "text" && isReadOnly) || (noteType === "doc")) && }
{noteType === "text" && !isReadOnly && }
- {noteType === "file" && noteMime === "application/pdf" && }
+ {noteType === "file" && noteMime === "application/pdf" && }
+ {note?.isMarkdown() && }
);
}
-function PdfTableOfContents() {
+function ContextDataTableOfContents() {
const data = useGetContextData("toc");
return (
diff --git a/apps/client/src/widgets/sidebar/pdf/PdfAnnotations.css b/apps/client/src/widgets/sidebar/pdf/PdfAnnotations.css
new file mode 100644
index 0000000000..67473e2252
--- /dev/null
+++ b/apps/client/src/widgets/sidebar/pdf/PdfAnnotations.css
@@ -0,0 +1,59 @@
+.pdf-annotations-list {
+ width: 100%;
+}
+
+
+.pdf-annotation-item {
+ display: flex;
+ align-items: flex-start;
+ gap: 8px;
+ padding: 8px 12px;
+ margin: 6px 8px;
+ border-radius: 6px;
+ cursor: pointer;
+ transition: filter 0.2s;
+}
+
+.pdf-annotation-item:hover {
+ filter: brightness(0.9);
+}
+
+.pdf-annotation-item,
+.pdf-annotation-item .tn-icon {
+ color: #333;
+}
+
+.pdf-annotation-item .tn-icon {
+ flex-shrink: 0;
+ font-size: 18px;
+}
+
+.pdf-annotation-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.pdf-annotation-highlighted-text {
+ font-size: 13px;
+ font-style: italic;
+ color: #555;
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+
+.pdf-annotation-contents {
+ font-size: 13px;
+ color: #333;
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+}
+
+.pdf-annotation-author {
+ font-size: 11px;
+ color: #555;
+ margin-top: 2px;
+}
diff --git a/apps/client/src/widgets/sidebar/pdf/PdfAnnotations.tsx b/apps/client/src/widgets/sidebar/pdf/PdfAnnotations.tsx
new file mode 100644
index 0000000000..73d9f79f6f
--- /dev/null
+++ b/apps/client/src/widgets/sidebar/pdf/PdfAnnotations.tsx
@@ -0,0 +1,73 @@
+import "./PdfAnnotations.css";
+
+import { t } from "../../../services/i18n";
+import { useActiveNoteContext, useGetContextData, useNoteProperty } from "../../react/hooks";
+import Icon from "../../react/Icon";
+import RightPanelWidget from "../RightPanelWidget";
+
+const TYPE_ICONS: Record = {
+ text: "bx bxs-comment-detail",
+ highlight: "bx bx-highlight",
+};
+
+export default function PdfAnnotations() {
+ const { note } = useActiveNoteContext();
+ const noteType = useNoteProperty(note, "type");
+ const noteMime = useNoteProperty(note, "mime");
+ const annotationsData = useGetContextData("pdfAnnotations");
+
+ if (noteType !== "file" || noteMime !== "application/pdf") {
+ return null;
+ }
+
+ if (!annotationsData || annotationsData.annotations.length === 0) {
+ return null;
+ }
+
+ return (
+
+
+ {annotationsData.annotations.map((annotation) => (
+
+ ))}
+
+
+ );
+}
+
+function PdfAnnotationItem({
+ annotation,
+ onNavigate
+}: {
+ annotation: PdfAnnotationInfo;
+ onNavigate: (annotationId: string, pageNumber: number) => void;
+}) {
+ const icon = annotation.contents
+ ? "bx bxs-comment-detail"
+ : TYPE_ICONS[annotation.type] ?? "bx bx-comment";
+
+ return (
+ onNavigate(annotation.id, annotation.pageNumber)}
+ style={annotation.color ? { backgroundColor: annotation.color } : undefined}
+ >
+
+
+ {annotation.highlightedText && (
+
{annotation.highlightedText}
+ )}
+ {annotation.contents && (
+
{annotation.contents}
+ )}
+ {annotation.author && (
+
{annotation.author}
+ )}
+
+
+ );
+}
diff --git a/apps/client/src/widgets/sidebar/pdf/PdfPages.css b/apps/client/src/widgets/sidebar/pdf/PdfPages.css
index 408f453336..692a242f63 100644
--- a/apps/client/src/widgets/sidebar/pdf/PdfPages.css
+++ b/apps/client/src/widgets/sidebar/pdf/PdfPages.css
@@ -1,14 +1,18 @@
.pdf-pages-list {
width: 100%;
- height: 100%;
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
- gap: 8px;
- padding: 8px;
- align-content: flex-start;
+ flex: 1;
+ min-height: 0;
+}
+
+.pdf-page-row {
+ display: flex;
+ gap: 4px;
+ padding: 0 8px;
}
.pdf-page-item {
+ flex: 1;
+ min-width: 0;
display: flex;
flex-direction: column;
align-items: center;
@@ -18,19 +22,6 @@
transition: border-color 0.2s;
box-sizing: border-box;
position: relative;
-
- .pdf-page-number {
- font-size: 12px;
- margin-bottom: 4px;
- color: var(--main-text-color);
- position: absolute;
- bottom: 1em;
- left: 50%;
- transform: translateX(-50%);
- background-color: var(--accented-background-color);
- padding: 0.2em 0.5em;
- border-radius: 4px;
- }
}
.pdf-page-item:hover {
@@ -44,6 +35,8 @@
.pdf-page-thumbnail {
width: 100%;
+ flex: 1;
+ min-height: 0;
display: flex;
align-items: center;
justify-content: center;
@@ -55,6 +48,15 @@
object-fit: contain;
}
+.pdf-page-number {
+ font-size: 12px;
+ margin-top: 4px;
+ color: var(--main-text-color);
+ background-color: var(--accented-background-color);
+ padding: 0.2em 0.5em;
+ border-radius: 4px;
+}
+
.pdf-page-loading {
color: var(--muted-text-color);
font-size: 11px;
diff --git a/apps/client/src/widgets/sidebar/pdf/PdfPages.tsx b/apps/client/src/widgets/sidebar/pdf/PdfPages.tsx
index fd6c2bcafa..985deacb3b 100644
--- a/apps/client/src/widgets/sidebar/pdf/PdfPages.tsx
+++ b/apps/client/src/widgets/sidebar/pdf/PdfPages.tsx
@@ -1,12 +1,17 @@
import "./PdfPages.css";
import { useCallback, useEffect, useRef, useState } from "preact/hooks";
+import type React from "react";
+import { List, type RowComponentProps } from "react-window";
import { NoteContextDataMap } from "../../../components/note_context";
import { t } from "../../../services/i18n";
import { useActiveNoteContext, useGetContextData, useNoteProperty } from "../../react/hooks";
import RightPanelWidget from "../RightPanelWidget";
+const ROW_HEIGHT = 180;
+const COLUMNS = 2;
+
export default function PdfPages() {
const { note } = useActiveNoteContext();
const noteType = useNoteProperty(note, "type");
@@ -27,9 +32,10 @@ export default function PdfPages() {
function PdfPagesList({ pagesData }: { pagesData: NoteContextDataMap["pdfPages"] }) {
const [thumbnails, setThumbnails] = useState>(new Map());
const requestedThumbnails = useRef>(new Set());
+ const containerRef = useRef(null);
+ const [containerHeight, setContainerHeight] = useState(0);
useEffect(() => {
- // Listen for thumbnail responses via custom event
function handleThumbnail(event: CustomEvent) {
const { pageNumber, dataUrl } = event.detail;
setThumbnails(prev => new Map(prev).set(pageNumber, dataUrl));
@@ -41,8 +47,18 @@ function PdfPagesList({ pagesData }: { pagesData: NoteContextDataMap["pdfPages"]
};
}, []);
+ useEffect(() => {
+ const el = containerRef.current;
+ if (!el) return;
+
+ const observer = new ResizeObserver(([entry]) => {
+ setContainerHeight(entry.contentRect.height);
+ });
+ observer.observe(el);
+ return () => observer.disconnect();
+ }, []);
+
const requestThumbnail = useCallback((pageNumber: number) => {
- // Only request if we haven't already requested it and don't have it
if (!requestedThumbnails.current.has(pageNumber) && !thumbnails.has(pageNumber) && pagesData) {
requestedThumbnails.current.add(pageNumber);
pagesData.requestThumbnail(pageNumber);
@@ -53,52 +69,77 @@ function PdfPagesList({ pagesData }: { pagesData: NoteContextDataMap["pdfPages"]
return No pages available
;
}
- const pages = Array.from({ length: pagesData.totalPages }, (_, i) => i + 1);
-
return (
-
- {pages.map(pageNumber => (
-
pagesData.scrollToPage(pageNumber)}
+
+ {containerHeight > 0 && (
+
- ))}
+ )}
);
}
-function PdfPageItem({
- pageNumber,
- isActive,
- thumbnail,
- onRequestThumbnail,
- onPageClick
-}: {
+interface PdfPageRowData {
+ totalPages: number;
+ thumbnails: Map;
+ currentPage: number;
+ requestThumbnail: (page: number) => void;
+ scrollToPage: (page: number) => void;
+}
+
+function PdfPageRow({ index, style, ...data }: RowComponentProps) {
+ const { totalPages, thumbnails, currentPage, requestThumbnail, scrollToPage } = data;
+ const startPage = index * COLUMNS + 1;
+ const pages = Array.from({ length: COLUMNS }, (_, i) => startPage + i).filter(p => p <= totalPages);
+
+ return (
+
+ {pages.map(pageNumber => (
+
+ ))}
+
+ ) as React.ReactElement;
+}
+
+function PdfPageCell({ pageNumber, isActive, thumbnail, requestThumbnail, scrollToPage }: {
pageNumber: number;
isActive: boolean;
thumbnail?: string;
- onRequestThumbnail(page: number): void;
- onPageClick(): void;
+ requestThumbnail: (page: number) => void;
+ scrollToPage: (page: number) => void;
}) {
const hasRequested = useRef(false);
useEffect(() => {
if (!thumbnail && !hasRequested.current) {
hasRequested.current = true;
- onRequestThumbnail(pageNumber);
+ requestThumbnail(pageNumber);
}
- }, [pageNumber, thumbnail, onRequestThumbnail]);
+ }, [pageNumber, thumbnail, requestThumbnail]);
return (
scrollToPage(pageNumber)}
>
-
{pageNumber}
{thumbnail ? (
@@ -106,6 +147,7 @@ function PdfPageItem({
{t("pdf.pages_loading")}
)}
+
{pageNumber}
);
}
diff --git a/apps/client/src/widgets/type_widgets/ReadOnlyTextRepresentation.tsx b/apps/client/src/widgets/type_widgets/ReadOnlyTextRepresentation.tsx
index a5bada9f6b..03c5a3120d 100644
--- a/apps/client/src/widgets/type_widgets/ReadOnlyTextRepresentation.tsx
+++ b/apps/client/src/widgets/type_widgets/ReadOnlyTextRepresentation.tsx
@@ -69,8 +69,16 @@ export function TextRepresentation({ textUrl, processUrl }: TextRepresentationPr
const result = response.result;
const minConfidence = response.minConfidence ?? 0;
+ // Check if this is an image-based PDF (no text extracted)
+ if (result && !result.text && result.processingType === 'pdf') {
+ toast.showPersistent({
+ id: `ocr-pdf-unsupported-${randomString(8)}`,
+ icon: "bx bx-info-circle",
+ message: t("ocr.image_based_pdf_not_supported"),
+ timeout: 15000
+ });
// Check if text was filtered due to low confidence
- if (result && !result.text && result.confidence > 0 && minConfidence > 0) {
+ } else if (result && !result.text && result.confidence > 0 && minConfidence > 0) {
const confidencePercent = Math.round(result.confidence * 100);
const thresholdPercent = Math.round(minConfidence * 100);
toast.showPersistent({
diff --git a/apps/client/src/widgets/type_widgets/code/Markdown.css b/apps/client/src/widgets/type_widgets/code/Markdown.css
index 30edf72ffe..224fb0d62f 100644
--- a/apps/client/src/widgets/type_widgets/code/Markdown.css
+++ b/apps/client/src/widgets/type_widgets/code/Markdown.css
@@ -13,11 +13,6 @@
overflow: auto;
padding: 0.5em 1em;
user-select: text;
-
- .mermaid-diagram,
- .mermaid-diagram svg {
- max-width: 100%;
- }
}
.markdown-preview [data-source-line] {
diff --git a/apps/client/src/widgets/type_widgets/code/Markdown.spec.ts b/apps/client/src/widgets/type_widgets/code/Markdown.spec.ts
index 0addb5037a..a7231a880f 100644
--- a/apps/client/src/widgets/type_widgets/code/Markdown.spec.ts
+++ b/apps/client/src/widgets/type_widgets/code/Markdown.spec.ts
@@ -3,18 +3,23 @@ import { describe, expect, it } from "vitest";
import { renderWithSourceLines } from "./Markdown.js";
describe("renderWithSourceLines", () => {
- function extractLines(html: string): number[] {
+ function extractLines(src: string): number[] {
+ const { html } = renderWithSourceLines(src);
return [ ...html.matchAll(/data-source-line="(\d+)"/g) ].map((m) => parseInt(m[1], 10));
}
- it("returns empty string for empty input", () => {
- expect(renderWithSourceLines("")).toBe("");
+ function html(src: string): string {
+ return renderWithSourceLines(src).html;
+ }
+
+ it("returns empty html for empty input", () => {
+ expect(html("")).toBe("");
});
it("tags a single block as line 1", () => {
- const html = renderWithSourceLines("hello");
- expect(extractLines(html)).toEqual([ 1 ]);
- expect(html).toContain("hello");
+ const result = html("hello");
+ expect(extractLines("hello")).toEqual([ 1 ]);
+ expect(result).toContain("hello");
});
it("assigns correct source lines to consecutive blocks separated by blank lines", () => {
@@ -26,7 +31,7 @@ describe("renderWithSourceLines", () => {
"Another one." // line 5
].join("\n");
- expect(extractLines(renderWithSourceLines(src))).toEqual([ 1, 3, 5 ]);
+ expect(extractLines(src)).toEqual([ 1, 3, 5 ]);
});
it("counts multi-line blocks so subsequent blocks get the right line", () => {
@@ -39,19 +44,18 @@ describe("renderWithSourceLines", () => {
"after" // 6
].join("\n");
- expect(extractLines(renderWithSourceLines(src))).toEqual([ 1, 6 ]);
+ expect(extractLines(src)).toEqual([ 1, 6 ]);
});
it("renders standard markdown constructs inside the wrappers", () => {
- const html = renderWithSourceLines("## Heading\n\n- item\n");
- expect(html).toContain("Heading ");
- expect(html).toContain("");
- expect(html).toContain("item ");
+ const result = html("## Heading\n\n- item\n");
+ expect(result).toContain("Heading ");
+ expect(result).toContain("");
+ expect(result).toContain("item ");
});
it("keeps H1 as H1 in the preview (no title-row context to avoid)", () => {
- const html = renderWithSourceLines("# Top level");
- expect(html).toContain("Top level ");
+ expect(html("# Top level")).toContain("Top level ");
});
it("preserves reference-style links across per-block parsing", () => {
@@ -61,33 +65,47 @@ describe("renderWithSourceLines", () => {
"[t]: https://example.com"
].join("\n");
- const html = renderWithSourceLines(src);
- expect(html).toContain('href="https://example.com"');
+ expect(html(src)).toContain('href="https://example.com"');
});
it("normalizes fenced code languages to CKEditor MIME identifiers for syntax highlighting", () => {
- const html = renderWithSourceLines("```javascript\nconst x = 1;\n```");
- expect(html).toMatch(/class="language-application-javascript-env-(backend|frontend)"/);
+ expect(html("```javascript\nconst x = 1;\n```")).toMatch(/class="language-application-javascript-env-(backend|frontend)"/);
});
it("produces CKEditor admonition markup for GFM callouts", () => {
- const html = renderWithSourceLines("> [!NOTE]\n> heads up");
- expect(html).toContain('');
+ expect(html("> [!NOTE]\n> heads up")).toContain('');
});
it("preserves the `mermaid` fence language so the mermaid rewrite can match it", () => {
- const html = renderWithSourceLines("```mermaid\ngraph TD;\nA-->B;\n```");
- expect(html).toContain('class="language-mermaid"');
+ expect(html("```mermaid\ngraph TD;\nA-->B;\n```")).toContain('class="language-mermaid"');
});
it("produces math-tex spans for inline math", () => {
- const html = renderWithSourceLines("Energy: $e=mc^2$.");
- expect(html).toContain('');
+ expect(html("Energy: $e=mc^2$.")).toContain('');
});
it("renders [[wikilinks]] with hash-router hrefs so the preview navigates correctly", () => {
- const html = renderWithSourceLines("See [[abc123]] for details.");
- expect(html).toContain('class="reference-link"');
- expect(html).toContain('href="#root/abc123"');
+ const result = html("See [[abc123]] for details.");
+ expect(result).toContain('class="reference-link"');
+ expect(result).toContain('href="#root/abc123"');
+ });
+
+ it("extracts headings with correct levels and lines", () => {
+ const src = [
+ "# Title", // line 1
+ "", // line 2
+ "text", // line 3
+ "", // line 4
+ "## Section", // line 5
+ "", // line 6
+ "### Sub" // line 7
+ ].join("\n");
+
+ const { headings } = renderWithSourceLines(src);
+ expect(headings).toEqual([
+ { id: "md-heading-0", level: 1, text: "Title", line: 1 },
+ { id: "md-heading-1", level: 2, text: "Section", line: 5 },
+ { id: "md-heading-2", level: 3, text: "Sub", line: 7 }
+ ]);
});
});
diff --git a/apps/client/src/widgets/type_widgets/code/Markdown.tsx b/apps/client/src/widgets/type_widgets/code/Markdown.tsx
index 05a27ad511..c2cd4a7815 100644
--- a/apps/client/src/widgets/type_widgets/code/Markdown.tsx
+++ b/apps/client/src/widgets/type_widgets/code/Markdown.tsx
@@ -1,20 +1,45 @@
import "./Markdown.css";
import VanillaCodeMirror from "@triliumnext/codemirror";
-import { renderToHtml } from "@triliumnext/commons";
+import { CustomMarkdownRenderer, renderToHtml } from "@triliumnext/commons";
import DOMPurify from "dompurify";
-import { Marked } from "marked";
+import { Marked, type Tokens } from "marked";
import { createContext } from "preact";
import { useContext, useEffect, useMemo, useState } from "preact/hooks";
-
+import NoteContext from "../../../components/note_context";
import SplitEditor from "../helpers/SplitEditor";
import { ReadOnlyTextContent } from "../text/ReadOnlyText";
import { TypeWidgetProps } from "../type_widget";
const marked = new Marked({ breaks: true, gfm: true });
+/**
+ * The default {@link CustomMarkdownRenderer} falls back to
+ * `language-text-x-trilium-auto` on unlabeled fences, which drives
+ * `syntax_highlight.ts` into `highlightAuto` — that dynamic-imports every hljs
+ * language bundle on first render and runs detection on each block, which is
+ * both slow and often wrong on short snippets. For the live preview we instead
+ * emit unlabeled fences without a `language-` class so the highlighter skips
+ * them entirely.
+ */
+class MarkdownPreviewRenderer extends CustomMarkdownRenderer {
+ override code(token: Tokens.Code): string {
+ const html = super.code(token);
+ if (token.lang) return html;
+ return html.replace('', ``);
+ }
+}
+
+export interface MarkdownHeading {
+ id: string;
+ level: number;
+ text: string;
+ line: number;
+}
+
interface MarkdownContextValue {
html: string;
+ headings: MarkdownHeading[];
setEditorView: (view: VanillaCodeMirror | null) => void;
setPreviewEl: (el: HTMLDivElement | null) => void;
}
@@ -31,14 +56,15 @@ export default function Markdown(props: TypeWidgetProps) {
const [ content, setContent ] = useState("");
const [ editorView, setEditorView ] = useState(null);
const [ previewEl, setPreviewEl ] = useState(null);
- const html = useMemo(() => renderWithSourceLines(content), [ content ]);
+ const { html, headings } = useMemo(() => renderWithSourceLines(content), [ content ]);
useSyncedScrolling(editorView, previewEl);
useSyncedHighlight(editorView, previewEl, html);
+ usePublishToc(props.noteContext, editorView, headings);
const ctx = useMemo(
- () => ({ html, setEditorView, setPreviewEl }),
- [ html ]
+ () => ({ html, headings, setEditorView, setPreviewEl }),
+ [ html, headings ]
);
return (
@@ -67,6 +93,36 @@ function MarkdownPreview({ ntxId }: { ntxId: TypeWidgetProps["ntxId"] }) {
);
}
+//#region Table of contents
+/**
+ * Publishes heading data via `setContextData("toc", ...)` so the sidebar
+ * Table of Contents can display headings extracted from the markdown source,
+ * independent of whether the preview pane is visible.
+ */
+function usePublishToc(
+ noteContext: NoteContext | undefined,
+ editorView: VanillaCodeMirror | null,
+ headings: MarkdownHeading[]
+) {
+ useEffect(() => {
+ if (!noteContext) return;
+ noteContext.setContextData("toc", {
+ headings,
+ scrollToHeading(heading) {
+ if (!editorView) return;
+ const mdHeading = headings.find(h => h.id === heading.id);
+ if (!mdHeading) return;
+ const line = editorView.state.doc.line(Math.min(mdHeading.line, editorView.state.doc.lines));
+ const lineBlock = editorView.lineBlockAt(line.from);
+ const scrollerHeight = editorView.scrollDOM.clientHeight;
+ const targetTop = lineBlock.top - scrollerHeight / 2 + lineBlock.height / 2;
+ editorView.scrollDOM.scrollTo({ top: targetTop, behavior: "smooth" });
+ }
+ });
+ }, [ noteContext, headings, editorView ]);
+}
+//#endregion
+
//#region Synced scrolling
/**
* One-directional (editor → preview) scroll sync. On editor scroll, finds the
@@ -161,23 +217,34 @@ const NON_RENDERED_TOKENS = new Set([ "space", "def" ]);
* with the matching lexer token's start line. Marked does not emit source
* positions (markedjs/marked#1267) so we count newlines in `raw` ourselves.
*/
-export function renderWithSourceLines(src: string): string {
+export function renderWithSourceLines(src: string): { html: string; headings: MarkdownHeading[] } {
// Compute the start line of each renderable top-level token in source order.
const tokens = marked.lexer(src);
const lines: number[] = [];
+ const headings: MarkdownHeading[] = [];
let line = 1;
+ let headingIdx = 0;
for (const token of tokens) {
const startLine = line;
line += (token.raw.match(/\n/g) ?? []).length;
if (!NON_RENDERED_TOKENS.has(token.type)) lines.push(startLine);
+ if (token.type === "heading") {
+ headings.push({
+ id: `md-heading-${headingIdx++}`,
+ level: (token as { depth: number }).depth,
+ text: token.text ?? "",
+ line: startLine
+ });
+ }
}
const html = renderToHtml(src, "", {
sanitize: (h) => DOMPurify.sanitize(h),
wikiLink: { formatHref: (id) => `#root/${id}` },
- demoteH1: false
+ demoteH1: false,
+ renderer: new MarkdownPreviewRenderer({ async: false })
});
- if (!html) return "";
+ if (!html) return { html: "", headings };
const container = document.createElement("div");
container.innerHTML = html;
@@ -188,6 +255,6 @@ export function renderWithSourceLines(src: string): string {
const sourceLine = lines[i] ?? lines[lines.length - 1] ?? 1;
parts.push(`${children[i].outerHTML}
`);
}
- return parts.join("");
+ return { html: parts.join(""), headings };
}
//#endregion
diff --git a/apps/client/src/widgets/type_widgets/file/Pdf.tsx b/apps/client/src/widgets/type_widgets/file/Pdf.tsx
index cd010857a7..582dd39693 100644
--- a/apps/client/src/widgets/type_widgets/file/Pdf.tsx
+++ b/apps/client/src/widgets/type_widgets/file/Pdf.tsx
@@ -5,7 +5,7 @@ import type NoteContext from "../../../components/note_context";
import FBlob from "../../../entities/fblob";
import FNote from "../../../entities/fnote";
import { useViewModeConfig } from "../../collections/NoteList";
-import { useBlobEditorSpacedUpdate, useTriliumEvent } from "../../react/hooks";
+import { useBlobEditorSpacedUpdate, useEffectiveReadOnly, useTriliumEvent } from "../../react/hooks";
import PdfViewer from "./PdfViewer";
export default function PdfPreview({ note, blob, componentId, noteContext }: {
@@ -15,6 +15,7 @@ export default function PdfPreview({ note, blob, componentId, noteContext }: {
componentId: string | undefined;
}) {
const iframeRef = useRef(null);
+ const isReadOnly = useEffectiveReadOnly(note, noteContext);
const historyConfig = useViewModeConfig(note, "pdfHistory");
const spacedUpdate = useBlobEditorSpacedUpdate({
@@ -56,7 +57,7 @@ export default function PdfPreview({ note, blob, componentId, noteContext }: {
useEffect(() => {
function handleMessage(event: PdfMessageEvent) {
if (event.data?.type === "pdfjs-viewer-document-modified") {
- if (event.data.noteId === note.noteId && event.data.ntxId === noteContext.ntxId) {
+ if (!isReadOnly && event.data.noteId === note.noteId && event.data.ntxId === noteContext.ntxId) {
spacedUpdate.resetUpdateTimer();
spacedUpdate.scheduleUpdate();
}
@@ -153,6 +154,19 @@ export default function PdfPreview({ note, blob, componentId, noteContext }: {
});
}
+ if (event.data.type === "pdfjs-viewer-annotations") {
+ noteContext.setContextData("pdfAnnotations", {
+ annotations: event.data.annotations,
+ scrollToAnnotation: (annotationId: string, pageNumber: number) => {
+ iframeRef.current?.contentWindow?.postMessage({
+ type: "trilium-scroll-to-annotation",
+ annotationId,
+ pageNumber
+ }, window.location.origin);
+ }
+ });
+ }
+
if (event.data.type === "pdfjs-viewer-layers") {
noteContext.setContextData("pdfLayers", {
layers: event.data.layers,
@@ -171,7 +185,7 @@ export default function PdfPreview({ note, blob, componentId, noteContext }: {
return () => {
window.removeEventListener("message", handleMessage);
};
- }, [ note, historyConfig, componentId, blob, noteContext ]);
+ }, [ note, historyConfig, componentId, blob, noteContext, isReadOnly, spacedUpdate ]);
useTriliumEvent("customDownload", ({ ntxId }) => {
if (ntxId !== noteContext.ntxId) return;
@@ -180,6 +194,20 @@ export default function PdfPreview({ note, blob, componentId, noteContext }: {
});
});
+ useTriliumEvent("printActiveNote", () => {
+ if (!noteContext.isActive()) return;
+ iframeRef.current?.contentWindow?.postMessage({
+ type: "trilium-print"
+ }, window.location.origin);
+ });
+
+ useTriliumEvent("findInText", () => {
+ if (!noteContext.isActive()) return;
+ iframeRef.current?.contentWindow?.postMessage({
+ type: "trilium-find"
+ }, window.location.origin);
+ });
+
return (historyConfig &&
);
}
diff --git a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx
index c072cb328c..aa742d325d 100644
--- a/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx
+++ b/apps/client/src/widgets/type_widgets/file/PdfViewer.tsx
@@ -22,6 +22,8 @@ interface PdfViewerProps extends Pick, "tabInd
* If set, enables editable mode which includes persistence of user settings, annotations as well as specific features such as sending table of contents data for the sidebar.
*/
editable?: boolean;
+ /** If set, hides the toolbar. Defaults to `true` (visible). */
+ toolbar?: boolean;
/** If set, disables text selection in the rendered PDF. */
disableSelection?: boolean;
}
@@ -29,7 +31,7 @@ interface PdfViewerProps extends Pick, "tabInd
/**
* Reusable component displaying a PDF. The PDF needs to be provided via a URL.
*/
-export default function PdfViewer({ iframeRef: externalIframeRef, pdfUrl, onLoad, editable, disableSelection }: PdfViewerProps) {
+export default function PdfViewer({ iframeRef: externalIframeRef, pdfUrl, onLoad, editable, toolbar = true, disableSelection }: PdfViewerProps) {
const iframeRef = useSyncedRef(externalIframeRef, null);
const [ locale ] = useTriliumOption("locale");
const [ newLayout ] = useTriliumOptionBool("newLayout");
@@ -40,7 +42,7 @@ export default function PdfViewer({ iframeRef: externalIframeRef, pdfUrl, onLoad
ref={iframeRef}
class="pdf-preview"
style={{width: "100%", height: "100%"}}
- src={`pdfjs/web/viewer.html?v=${glob.triliumVersion}&file=${pdfUrl}&lang=${locale}&sidebar=${newLayout ? "0" : "1"}&editable=${editable ? "1" : "0"}`}
+ src={`pdfjs/web/viewer.html?v=${glob.triliumVersion}&file=${pdfUrl}&locale=${locale}&sidebar=${newLayout ? "0" : "1"}&editable=${editable ? "1" : "0"}&toolbar=${toolbar ? "1" : "0"}`}
onLoad={() => {
injectStyles();
onLoad?.();
diff --git a/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx b/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx
index 60e874c7af..cc97811380 100644
--- a/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx
+++ b/apps/client/src/widgets/type_widgets/helpers/SplitEditor.tsx
@@ -98,8 +98,7 @@ export default function SplitEditor({ note, noteContext, error, splitOptions, pr
useEffect(() => {
if (mode !== "split" || !utils.isDesktop() || !containerRef.current) return;
// Only the visible (non-display:none) panes participate in the split.
- const elements = (Array.from(containerRef.current.children) as HTMLElement[])
- .filter(el => el.offsetParent !== null);
+ const elements = (Array.from(containerRef.current.children) as HTMLElement[]);
const splitInstance = Split(elements, {
rtl: glob.isRtl,
sizes: [ 50, 50 ],
@@ -113,7 +112,7 @@ export default function SplitEditor({ note, noteContext, error, splitOptions, pr
const layoutClass = mode === "source" ? "split-source-only"
: mode === "preview" ? "split-read-only"
- : `split-${splitEditorOrientation}`;
+ : `split-${splitEditorOrientation}`;
return (
diff --git a/apps/client/src/widgets/type_widgets/llm_chat/ChatMessage.tsx b/apps/client/src/widgets/type_widgets/llm_chat/ChatMessage.tsx
index 26a7f36c46..e394d53556 100644
--- a/apps/client/src/widgets/type_widgets/llm_chat/ChatMessage.tsx
+++ b/apps/client/src/widgets/type_widgets/llm_chat/ChatMessage.tsx
@@ -1,14 +1,12 @@
import "./ChatMessage.css";
+import { type LlmCitation, renderToHtml } from "@triliumnext/commons";
import DOMPurify from "dompurify";
-import { Marked } from "marked";
-import { useEffect, useMemo, useRef } from "preact/hooks";
+import { useMemo } from "preact/hooks";
-import { type LlmCitation, createWikiLinkExtension } from "@triliumnext/commons";
-
-import link from "../../../services/link.js";
import { t } from "../../../services/i18n.js";
import utils from "../../../services/utils.js";
+import { ReadOnlyTextContent } from "../text/ReadOnlyText.js";
import { ExpandableCard, ExpandableSection } from "./ExpandableCard.js";
import { type ContentBlock, getMessageText, type StoredMessage, type TextBlock, type ToolCallBlock } from "./llm_chat_types.js";
import ToolCallCard from "./ToolCallCard.js";
@@ -19,41 +17,20 @@ function shortenNumber(n: number): string {
return n.toString();
}
-// Configure marked for safe rendering with client-side URL format
-const markedInstance = new Marked({
- breaks: true, // Convert \n to
- gfm: true // GitHub Flavored Markdown
-});
-markedInstance.use({
- extensions: [createWikiLinkExtension({ formatHref: (id) => `#root/${id}` })]
-});
-
-/** Parse markdown to HTML. */
+/** Parse markdown to HTML using the shared rendering pipeline. */
function renderMarkdown(markdown: string): string {
- return markedInstance.parse(markdown) as string;
+ return renderToHtml(markdown, "", {
+ sanitize: (h) => DOMPurify.sanitize(h),
+ wikiLink: { formatHref: (id) => `#root/${id}` },
+ demoteH1: false
+ });
}
-/** Renders markdown content with reference link title loading. */
+/** Renders markdown content using the shared read-only text pipeline (math, syntax highlighting, mermaid, etc.). */
function MarkdownContent({ html, isStreaming }: { html: string; isStreaming?: boolean }) {
- const containerRef = useRef
(null);
-
- useEffect(() => {
- if (!containerRef.current) return;
-
- const referenceLinks = containerRef.current.querySelectorAll("a.reference-link");
- for (const el of referenceLinks) {
- link.loadReferenceLinkTitle($(el), el.href);
- }
- }, [html]);
-
return (
<>
-
+
{isStreaming && }
>
);
@@ -213,7 +190,7 @@ export default function ChatMessage({ message, isStreaming }: Props) {
{message.usage.cost != null && (
<>
·
- ~${message.usage.cost.toFixed(4)}
+ ~${message.usage.cost.toFixed(2)}
>
)}
>
diff --git a/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.css b/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.css
index 06af4bac6c..671818d934 100644
--- a/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.css
+++ b/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.css
@@ -2,8 +2,15 @@
display: flex;
flex-direction: column;
height: 100%;
- padding: 1rem;
box-sizing: border-box;
+
+ .llm-chat-messages {
+ padding: 1em;
+ }
+
+ .llm-chat-input-form {
+ padding: 0.5em 1em;
+ }
}
.llm-chat-messages {
diff --git a/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.tsx b/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.tsx
index 301141f0d8..a192c8521b 100644
--- a/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.tsx
+++ b/apps/client/src/widgets/type_widgets/llm_chat/LlmChat.tsx
@@ -55,7 +55,7 @@ export default function LlmChat({ note, ntxId, noteContext }: TypeWidgetProps) {
return (
-
+
{chat.messages.length === 0 && !chat.isStreaming && (
.expandable-section-body > .expandable-section:first-child {
+ border-top: 1px solid var(--main-border-color);
+}
+
.llm-chat-tool-call-note-ref {
font-weight: 400;
margin-left: 0.25rem;
diff --git a/apps/client/src/widgets/type_widgets/llm_chat/ToolCallCard.tsx b/apps/client/src/widgets/type_widgets/llm_chat/ToolCallCard.tsx
index aa766fd1b4..d81b45ab99 100644
--- a/apps/client/src/widgets/type_widgets/llm_chat/ToolCallCard.tsx
+++ b/apps/client/src/widgets/type_widgets/llm_chat/ToolCallCard.tsx
@@ -51,18 +51,20 @@ function getToolCallContext(toolCall: ToolCall): ToolCallContext {
return { noteId: null, parentNoteId: null, detailText: detailText || null };
}
+function toolNameIcon(toolName: string): string {
+ if (toolName.includes("search")) return "bx bx-search";
+ if (toolName.includes("note")) return "bx bx-note";
+ if (toolName.includes("attribute")) return "bx bx-purchase-tag";
+ if (toolName.includes("attachment")) return "bx bx-paperclip";
+ if (toolName.includes("skill")) return "bx bx-book-open";
+ if (toolName.includes("web")) return "bx bx-globe";
+ return "bx bx-wrench";
+}
+
function toolCallIcon(toolCall: ToolCall): string {
if (toolCall.isError) return "bx bx-error-circle";
if (!toolCall.result) return "bx bx-loader-alt bx-spin";
-
- const name = toolCall.toolName;
- if (name.includes("search")) return "bx bx-search";
- if (name.includes("note")) return "bx bx-note";
- if (name.includes("attribute")) return "bx bx-purchase-tag";
- if (name.includes("attachment")) return "bx bx-paperclip";
- if (name.includes("skill")) return "bx bx-book-open";
- if (name.includes("web")) return "bx bx-globe";
- return "bx bx-wrench";
+ return toolNameIcon(toolCall.toolName);
}
/** Try to parse a JSON string into a structured value. */
@@ -201,13 +203,57 @@ function ToolCallSection({ toolCall }: { toolCall: ToolCall }) {
);
}
-/** A card that groups one or more sequential tool calls together. */
-export default function ToolCallCard({ toolCalls }: { toolCalls: ToolCall[] }) {
+/** Fold a section showing multiple invocations of the same tool under a single header. */
+function ToolCallGroupSection({ toolCalls }: { toolCalls: ToolCall[] }) {
+ const first = toolCalls[0];
+ const anyPending = toolCalls.some(tc => !tc.result);
+ const anyError = toolCalls.some(tc => tc.isError);
+
+ const icon = anyPending ? "bx bx-loader-alt bx-spin" : toolNameIcon(first.toolName);
+ const friendlyName = t(`llm.tools.${first.toolName}`, { defaultValue: first.toolName });
+ const label = (
+ <>
+ {friendlyName}
+ ×{toolCalls.length}
+ {anyError && {t("llm_chat.tool_error")} }
+ >
+ );
+
return (
-
+
{toolCalls.map((tc, idx) => (
))}
+
+ );
+}
+
+/** Group consecutive tool calls that share the same tool name. Singletons pass through unchanged. */
+function groupByToolName(toolCalls: ToolCall[]): Array {
+ const groups: Array = [];
+ for (const tc of toolCalls) {
+ const last = groups[groups.length - 1];
+ if (Array.isArray(last) && last[0].toolName === tc.toolName) {
+ last.push(tc);
+ } else if (last && !Array.isArray(last) && last.toolName === tc.toolName) {
+ groups[groups.length - 1] = [last, tc];
+ } else {
+ groups.push(tc);
+ }
+ }
+ return groups;
+}
+
+/** A card that groups one or more sequential tool calls together. */
+export default function ToolCallCard({ toolCalls }: { toolCalls: ToolCall[] }) {
+ const groups = groupByToolName(toolCalls);
+ return (
+
+ {groups.map((group, idx) => (
+ Array.isArray(group)
+ ?
+ :
+ ))}
);
}
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 f52fb6cc61..6abe534a2e 100644
--- a/apps/client/src/widgets/type_widgets/llm_chat/useLlmChat.ts
+++ b/apps/client/src/widgets/type_widgets/llm_chat/useLlmChat.ts
@@ -38,6 +38,7 @@ export interface UseLlmChatReturn {
contextNoteId: string | undefined;
lastPromptTokens: number;
messagesEndRef: RefObject;
+ scrollContainerRef: RefObject;
textareaRef: RefObject;
/** Whether a provider is configured and available */
hasProvider: boolean;
@@ -90,8 +91,10 @@ export function useLlmChat(
const [hasProvider, setHasProvider] = useState(true); // Assume true initially
const [isCheckingProvider, setIsCheckingProvider] = useState(true);
const messagesEndRef = useRef(null);
+ const scrollContainerRef = useRef(null);
const textareaRef = useRef(null);
const abortControllerRef = useRef(null);
+ const isNearBottomRef = useRef(true);
// Refs to get fresh values in getContent (avoids stale closures)
const messagesRef = useRef(messages);
@@ -147,9 +150,28 @@ export function useLlmChat(
refreshModels();
}, []);
- // Scroll to bottom when content changes
+ // Track whether the user is near the bottom of the scroll container
+ useEffect(() => {
+ const container = scrollContainerRef.current;
+ if (!container) return;
+
+ const THRESHOLD = 50; // px from bottom
+ const handleScroll = () => {
+ isNearBottomRef.current =
+ container.scrollHeight - container.scrollTop - container.clientHeight <= THRESHOLD;
+ };
+
+ container.addEventListener("scroll", handleScroll, { passive: true });
+ return () => container.removeEventListener("scroll", handleScroll);
+ }, []);
+
+ // Scroll to bottom when content changes, but only if user hasn't scrolled away.
+ // Always use instant scroll — smooth animations race with the scroll listener
+ // during streaming, causing the auto-scroll to "unstick" mid-animation.
const scrollToBottom = useCallback(() => {
- messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
+ if (isNearBottomRef.current) {
+ messagesEndRef.current?.scrollIntoView({ behavior: "instant" });
+ }
}, []);
useEffect(() => {
@@ -419,6 +441,7 @@ export function useLlmChat(
contextNoteId,
lastPromptTokens,
messagesEndRef,
+ scrollContainerRef,
textareaRef,
hasProvider,
isCheckingProvider,
diff --git a/apps/client/src/widgets/type_widgets/spreadsheet/Spreadsheet.tsx b/apps/client/src/widgets/type_widgets/spreadsheet/Spreadsheet.tsx
index 6b84fbc8d8..6f19183daa 100644
--- a/apps/client/src/widgets/type_widgets/spreadsheet/Spreadsheet.tsx
+++ b/apps/client/src/widgets/type_widgets/spreadsheet/Spreadsheet.tsx
@@ -5,8 +5,10 @@ import "@univerjs/preset-sheets-conditional-formatting/lib/index.css";
import "@univerjs/preset-sheets-find-replace/lib/index.css";
import "@univerjs/preset-sheets-note/lib/index.css";
import "@univerjs/preset-sheets-filter/lib/index.css";
+import "@univerjs/preset-sheets-hyper-link/lib/index.css";
import "@univerjs/preset-sheets-data-validation/lib/index.css";
+import { DEFAULT_STYLES } from '@univerjs/core';
import { UniverSheetsConditionalFormattingPreset } from '@univerjs/preset-sheets-conditional-formatting';
import UniverPresetSheetsConditionalFormattingEnUS from '@univerjs/preset-sheets-conditional-formatting/locales/en-US';
import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core';
@@ -17,17 +19,46 @@ import { UniverSheetsFilterPreset } from '@univerjs/preset-sheets-filter';
import UniverPresetSheetsFilterEnUS from '@univerjs/preset-sheets-filter/locales/en-US';
import { UniverSheetsFindReplacePreset } from '@univerjs/preset-sheets-find-replace';
import sheetsFindReplaceEnUS from '@univerjs/preset-sheets-find-replace/locales/en-US';
+import { UniverSheetsHyperLinkPreset } from '@univerjs/preset-sheets-hyper-link';
+import UniverPresetSheetsHyperLinkEnUS from '@univerjs/preset-sheets-hyper-link/locales/en-US';
import { UniverSheetsNotePreset } from '@univerjs/preset-sheets-note';
import sheetsNoteEnUS from '@univerjs/preset-sheets-note/locales/en-US';
import { UniverSheetsSortPreset } from '@univerjs/preset-sheets-sort';
import UniverPresetSheetsSortEnUS from '@univerjs/preset-sheets-sort/locales/en-US';
import { createUniver, FUniver, LocaleType, mergeLocales } from '@univerjs/presets';
+import { IDialogService, ISidebarService } from '@univerjs/ui';
import { MutableRef, useEffect, useRef } from "preact/hooks";
-import { useColorScheme, useEffectiveReadOnly, useTriliumEvent } from "../../react/hooks";
+import type NoteContext from "../../../components/note_context";
+import { t } from "../../../services/i18n";
+import { useColorScheme, useEffectiveReadOnly, useTriliumEvent, useTriliumEvents } from "../../react/hooks";
import { TypeWidgetProps } from "../type_widget";
import usePersistence from "./persistence";
+function buildReadOnlyLocaleOverrides() {
+ const msg = t("spreadsheet.read-only");
+ return {
+ permission: {
+ dialog: {
+ editErr: msg,
+ commonErr: msg,
+ pasteErr: msg,
+ setStyleErr: msg,
+ copyErr: msg,
+ setRowColStyleErr: msg,
+ moveRowColErr: msg,
+ moveRangeErr: msg,
+ autoFillErr: msg,
+ filterErr: msg,
+ operatorSheetErr: msg,
+ formulaErr: msg,
+ hyperLinkErr: msg,
+ commentErr: msg,
+ }
+ }
+ };
+}
+
export default function Spreadsheet(props: TypeWidgetProps) {
const readOnly = useEffectiveReadOnly(props.note, props.noteContext);
@@ -41,8 +72,9 @@ function SpreadsheetEditor({ note, noteContext, readOnly }: TypeWidgetProps & {
useInitializeSpreadsheet(containerRef, apiRef, readOnly);
useDarkMode(apiRef);
- usePersistence(note, noteContext, apiRef, containerRef, readOnly);
- useSearchIntegration(apiRef);
+ usePersistence(note, noteContext, apiRef, containerRef);
+ useSearchIntegration(apiRef, noteContext);
+ useDismissDialogsOnNoteSwitch(apiRef);
useFixRadixPortals();
// Focus the spreadsheet when the note is focused.
@@ -92,6 +124,12 @@ function useInitializeSpreadsheet(containerRef: MutableRef {
if (!containerRef.current) return;
+ // Override Univer's hardcoded default font to match Trilium's UI font.
+ const ff = getComputedStyle(document.body).getPropertyValue("--detail-font-family").trim();
+ if (ff) {
+ DEFAULT_STYLES.ff = ff;
+ }
+
const { univerAPI } = createUniver({
locale: LocaleType.EN_US,
locales: {
@@ -103,6 +141,8 @@ function useInitializeSpreadsheet(containerRef: MutableRef {
+ if (stage === univerAPI.Enum.LifecycleStages.Rendered) {
+ const workbook = univerAPI.getActiveWorkbook();
+ if (!workbook) return;
+
+ workbook.disableSelection();
+ workbook.getWorkbookPermission().setReadOnly();
+ }
+ });
+ }
+
apiRef.current = univerAPI;
return () => univerAPI.dispose();
}, [ apiRef, containerRef, readOnly ]);
@@ -142,8 +196,10 @@ function useDarkMode(apiRef: MutableRef) {
}, [ colorScheme, apiRef ]);
}
-function useSearchIntegration(apiRef: MutableRef) {
+function useSearchIntegration(apiRef: MutableRef, noteContext: NoteContext | undefined) {
useTriliumEvent("findInText", () => {
+ if (!noteContext?.isActive()) return;
+
const univerAPI = apiRef.current;
if (!univerAPI) return;
@@ -151,3 +207,14 @@ function useSearchIntegration(apiRef: MutableRef) {
univerAPI.executeCommand("ui.operation.open-find-dialog");
});
}
+
+function useDismissDialogsOnNoteSwitch(apiRef: MutableRef) {
+ useTriliumEvents(["beforeNoteSwitch", "noteTypeMimeChanged"], () => {
+ const univerAPI = apiRef.current;
+ if (!univerAPI) return;
+
+ const injector = (univerAPI as unknown as { _injector: { get(id: unknown): { closeAll(): void; close(): void } } })._injector;
+ injector.get(IDialogService).closeAll();
+ injector.get(ISidebarService).close();
+ });
+}
diff --git a/apps/client/src/widgets/type_widgets/spreadsheet/persistence.tsx b/apps/client/src/widgets/type_widgets/spreadsheet/persistence.tsx
index b3717c9ace..99fc85e484 100644
--- a/apps/client/src/widgets/type_widgets/spreadsheet/persistence.tsx
+++ b/apps/client/src/widgets/type_widgets/spreadsheet/persistence.tsx
@@ -18,7 +18,7 @@ interface SpreadsheetViewState {
scrollCol?: number;
}
-export default function usePersistence(note: FNote, noteContext: NoteContext | null | undefined, apiRef: MutableRef, containerRef: MutableRef, readOnly: boolean) {
+export default function usePersistence(note: FNote, noteContext: NoteContext | null | undefined, apiRef: MutableRef, containerRef: MutableRef) {
const changeListener = useRef(null);
const pendingContent = useRef(null);
@@ -69,12 +69,7 @@ export default function usePersistence(note: FNote, noteContext: NoteContext | n
function applyContent(univerAPI: FUniver, newContent: string) {
const viewState = saveViewState(univerAPI);
-
- // Dispose the existing workbook.
const existingWorkbook = univerAPI.getActiveWorkbook();
- if (existingWorkbook) {
- univerAPI.disposeUnit(existingWorkbook.getId());
- }
let workbookData: Partial = {};
if (newContent) {
@@ -89,12 +84,12 @@ export default function usePersistence(note: FNote, noteContext: NoteContext | n
}
}
+ // Create the new workbook BEFORE disposing the old one so the formula
+ // engine transitions cleanly without a gap where stale state could leak.
const workbook = univerAPI.createWorkbook(workbookData);
- if (readOnly) {
- workbook.disableSelection();
- const permission = workbook.getPermission();
- permission.setWorkbookEditPermission(workbook.getId(), false);
- permission.setPermissionDialogVisible(false);
+
+ if (existingWorkbook) {
+ univerAPI.disposeUnit(existingWorkbook.getId());
}
restoreViewState(workbook, viewState);
diff --git a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css
index 1d5a6ac719..e60260e7be 100644
--- a/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css
+++ b/apps/client/src/widgets/type_widgets/text/ReadOnlyText.css
@@ -1,11 +1,18 @@
-/* h1 should not be used at all since semantically that's a note title */
.note-detail-readonly-text-content {
+ /* h1 should not be used at all since semantically that's a note title */
h1 { font-size: 1.8em; }
h2 { font-size: 1.6em; }
h3 { font-size: 1.4em; }
h4 { font-size: 1.2em; }
h5 { font-size: 1.1em; }
h6 { font-size: 1.0em; }
+
+ .mermaid-diagram,
+ .mermaid-diagram svg,
+ img {
+ max-width: 100%;
+ height: auto;
+ }
}
body.heading-style-markdown .note-detail-readonly-text-content {
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
index adcc312bf4..710e010c88 100644
--- a/apps/desktop/package.json
+++ b/apps/desktop/package.json
@@ -45,7 +45,7 @@
"@triliumnext/server": "workspace:*",
"@types/electron-squirrel-startup": "1.0.2",
"copy-webpack-plugin": "14.0.0",
- "electron": "41.2.0",
+ "electron": "41.3.0",
"prebuild-install": "7.1.3"
}
}
\ No newline at end of file
diff --git a/apps/edit-docs/package.json b/apps/edit-docs/package.json
index 5859232bbe..72356f1f24 100644
--- a/apps/edit-docs/package.json
+++ b/apps/edit-docs/package.json
@@ -13,7 +13,7 @@
"@triliumnext/desktop": "workspace:*",
"@types/fs-extra": "11.0.4",
"copy-webpack-plugin": "14.0.0",
- "electron": "41.2.0",
+ "electron": "41.3.0",
"fs-extra": "11.3.4"
},
"scripts": {
diff --git a/apps/edit-docs/src/utils.ts b/apps/edit-docs/src/utils.ts
index 96c6c906bd..1b5aa4c85b 100644
--- a/apps/edit-docs/src/utils.ts
+++ b/apps/edit-docs/src/utils.ts
@@ -1,5 +1,4 @@
import cls from "@triliumnext/server/src/services/cls.js";
-import TaskContext from "@triliumnext/server/src/services/task_context.js";
import windowService from "@triliumnext/server/src/services/window.js";
import archiver, { type Archiver } from "archiver";
import electron from "electron";
@@ -62,9 +61,8 @@ export function startElectron(callback: () => void): DeferredPromise {
export async function importData(path: string) {
const buffer = await createImportZip(path);
- const { zipImportService } = (await import("@triliumnext/core"));
+ const { zipImportService, TaskContext, becca } = (await import("@triliumnext/core"));
const context = new TaskContext("no-progress-reporting", "importNotes", null);
- const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
const rootNote = becca.getRoot();
if (!rootNote) {
diff --git a/apps/script-deployer/.gitignore b/apps/script-deployer/.gitignore
new file mode 100644
index 0000000000..8fce603003
--- /dev/null
+++ b/apps/script-deployer/.gitignore
@@ -0,0 +1 @@
+data/
diff --git a/apps/script-deployer/package.json b/apps/script-deployer/package.json
new file mode 100644
index 0000000000..049fb1bfea
--- /dev/null
+++ b/apps/script-deployer/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "@triliumnext/script-deployer",
+ "version": "1.0.0",
+ "private": true,
+ "description": "Development harness for writing and deploying Trilium scripts to a local instance",
+ "scripts": {
+ "dev": "tsx watch --clear-screen=false --ignore '../client/node_modules/.vite-temp' src/dev.ts",
+ "test": "vitest run",
+ "clean": "rm -rf data"
+ }
+}
diff --git a/apps/script-deployer/scripts/auto-import-rnote.ts b/apps/script-deployer/scripts/auto-import-rnote.ts
new file mode 100644
index 0000000000..8ed5106975
--- /dev/null
+++ b/apps/script-deployer/scripts/auto-import-rnote.ts
@@ -0,0 +1,498 @@
+/**
+ * @trilium-script
+ *
+ * id: auto-import-rnote
+ * type: backend
+ * title: Auto-import Rnote to Canvas
+ * executeButton: true
+ * executeDescription: Converts all .rnote children of this note into Excalidraw canvas notes.
+ */
+
+import zlib from "zlib";
+
+// ── Types (rnote v0.9+ / v0.13 JSON format) ────────────────────────────────
+
+interface RnoteColor {
+ r: number;
+ g: number;
+ b: number;
+ a: number;
+}
+
+interface RnoteElement {
+ pos: [number, number];
+ pressure: number;
+}
+
+interface RnoteSegment {
+ lineto?: { end: RnoteElement };
+ quadbezto?: { cp: [number, number]; end: RnoteElement };
+ cubbezto?: { cp1: [number, number]; cp2: [number, number]; end: RnoteElement };
+}
+
+interface RnotePath {
+ start: RnoteElement;
+ segments: RnoteSegment[];
+}
+
+interface RnoteSmoothStyle {
+ stroke_width: number;
+ stroke_color: RnoteColor;
+ fill_color?: RnoteColor;
+ pressure_curve: string;
+ line_style?: string;
+ line_cap?: string;
+}
+
+interface RnoteBrushStroke {
+ path: RnotePath;
+ style: { smooth?: RnoteSmoothStyle; rough?: Record; textured?: Record };
+}
+
+interface RnoteTextStyle {
+ font_family?: string;
+ font_size?: number;
+ color?: RnoteColor;
+}
+
+interface RnoteTextStroke {
+ text: string;
+ transform: { affine: number[] | number[][] };
+ // v0.13: style, v0.14: text_style
+ style?: RnoteTextStyle;
+ text_style?: RnoteTextStyle;
+}
+
+interface RnoteBitmapImage {
+ // v0.13: image is base64 string, v0.14: image is { data, pixel_width, pixel_height, ... }
+ image: string | { data: string; pixel_width?: number; pixel_height?: number; memory_format?: string };
+ // v0.13: { mins, maxs }, v0.14: { cuboid: { half_extents }, transform: { affine } }
+ rectangle:
+ | { mins: [number, number]; maxs: [number, number] }
+ | { cuboid: { half_extents: [number, number] }; transform: { affine: number[] } };
+}
+
+interface RnoteSlotEntry {
+ value: {
+ brushstroke?: RnoteBrushStroke;
+ textstroke?: RnoteTextStroke;
+ bitmapimage?: RnoteBitmapImage;
+ vectorimage?: Record;
+ shapestroke?: Record;
+ } | null;
+ version: number;
+}
+
+interface RnoteFile {
+ version: string;
+ data: {
+ engine_snapshot: {
+ document: {
+ x: number;
+ y: number;
+ width: number;
+ height: number;
+ };
+ stroke_components: RnoteSlotEntry[];
+ };
+ };
+}
+
+// ── Raw RGBA → PNG encoding ─────────────────────────────────────────────────
+
+/** Encode raw RGBA pixels into a minimal PNG buffer using zlib. */
+function encodeRawRgbaToPng(data: Buffer, width: number, height: number): Buffer {
+ // Un-premultiply alpha (R8g8b8a8Premultiplied → straight RGBA)
+ const straight = Buffer.from(data);
+ for (let i = 0; i < straight.length; i += 4) {
+ const a = straight[i + 3];
+ if (a > 0 && a < 255) {
+ straight[i] = Math.min(255, Math.round((straight[i] * 255) / a));
+ straight[i + 1] = Math.min(255, Math.round((straight[i + 1] * 255) / a));
+ straight[i + 2] = Math.min(255, Math.round((straight[i + 2] * 255) / a));
+ }
+ }
+
+ // Build PNG filter rows: each row prefixed with filter byte 0 (None)
+ const rowLen = width * 4;
+ const rawRows = Buffer.alloc(height * (1 + rowLen));
+ for (let y = 0; y < height; y++) {
+ rawRows[y * (1 + rowLen)] = 0; // filter: None
+ straight.copy(rawRows, y * (1 + rowLen) + 1, y * rowLen, y * rowLen + rowLen);
+ }
+
+ const compressed = zlib.deflateSync(rawRows);
+
+ // CRC-32 (used by PNG chunks)
+ const crcTable: number[] = [];
+ for (let n = 0; n < 256; n++) {
+ let c = n;
+ for (let k = 0; k < 8; k++) c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);
+ crcTable[n] = c;
+ }
+ function crc32(buf: Buffer): number {
+ let crc = 0xffffffff;
+ for (let i = 0; i < buf.length; i++) crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);
+ return (crc ^ 0xffffffff) >>> 0;
+ }
+
+ function makeChunk(type: string, data: Buffer): Buffer {
+ const len = Buffer.alloc(4);
+ len.writeUInt32BE(data.length);
+ const typeB = Buffer.from(type, "ascii");
+ const payload = Buffer.concat([typeB, data]);
+ const crcB = Buffer.alloc(4);
+ crcB.writeUInt32BE(crc32(payload));
+ return Buffer.concat([len, payload, crcB]);
+ }
+
+ // IHDR: width, height, bit depth 8, color type 6 (RGBA)
+ const ihdrData = Buffer.alloc(13);
+ ihdrData.writeUInt32BE(width, 0);
+ ihdrData.writeUInt32BE(height, 4);
+ ihdrData[8] = 8; // bit depth
+ ihdrData[9] = 6; // color type: RGBA
+ ihdrData[10] = 0; // compression
+ ihdrData[11] = 0; // filter
+ ihdrData[12] = 0; // interlace
+
+ return Buffer.concat([
+ Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]), // PNG signature
+ makeChunk("IHDR", ihdrData),
+ makeChunk("IDAT", compressed),
+ makeChunk("IEND", Buffer.alloc(0)),
+ ]);
+}
+
+// ── Color conversion ────────────────────────────────────────────────────────
+
+function convertColor(c: RnoteColor): string {
+ const r = Math.round(c.r * 255);
+ const g = Math.round(c.g * 255);
+ const b = Math.round(c.b * 255);
+ return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
+}
+
+function convertOpacity(c: RnoteColor): number {
+ return Math.round(c.a * 100);
+}
+
+// ── Excalidraw element helpers ──────────────────────────────────────────────
+
+function generateId(): string {
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ let id = "";
+ for (let i = 0; i < 20; i++) {
+ id += chars[Math.floor(Math.random() * chars.length)];
+ }
+ return id;
+}
+
+function makeBaseElement(type: string, x: number, y: number, width: number, height: number) {
+ return {
+ id: generateId(),
+ type,
+ x,
+ y,
+ width,
+ height,
+ angle: 0,
+ strokeColor: "#000000",
+ backgroundColor: "transparent",
+ fillStyle: "solid",
+ strokeWidth: 1,
+ strokeStyle: "solid",
+ roughness: 0,
+ opacity: 100,
+ groupIds: [] as string[],
+ frameId: null,
+ index: null,
+ roundness: null,
+ seed: Math.floor(Math.random() * 2_000_000_000),
+ version: 1,
+ versionNonce: Math.floor(Math.random() * 2_000_000_000),
+ isDeleted: false,
+ boundElements: null,
+ updated: Date.now(),
+ link: null,
+ locked: false,
+ } as Record;
+}
+
+// ── Bezier flattening ───────────────────────────────────────────────────────
+
+const BEZIER_STEPS = 8;
+
+function flattenQuadBezier(
+ p0: [number, number], pr0: number,
+ cp: [number, number],
+ p1: [number, number], pr1: number,
+): { pos: [number, number]; pressure: number }[] {
+ const result: { pos: [number, number]; pressure: number }[] = [];
+ for (let i = 1; i <= BEZIER_STEPS; i++) {
+ const t = i / BEZIER_STEPS;
+ const u = 1 - t;
+ const x = u * u * p0[0] + 2 * u * t * cp[0] + t * t * p1[0];
+ const y = u * u * p0[1] + 2 * u * t * cp[1] + t * t * p1[1];
+ const p = u * pr0 + t * pr1;
+ result.push({ pos: [x, y], pressure: p });
+ }
+ return result;
+}
+
+function flattenCubicBezier(
+ p0: [number, number], pr0: number,
+ cp1: [number, number], cp2: [number, number],
+ p1: [number, number], pr1: number,
+): { pos: [number, number]; pressure: number }[] {
+ const result: { pos: [number, number]; pressure: number }[] = [];
+ for (let i = 1; i <= BEZIER_STEPS; i++) {
+ const t = i / BEZIER_STEPS;
+ const u = 1 - t;
+ const x = u * u * u * p0[0] + 3 * u * u * t * cp1[0] + 3 * u * t * t * cp2[0] + t * t * t * p1[0];
+ const y = u * u * u * p0[1] + 3 * u * u * t * cp1[1] + 3 * u * t * t * cp2[1] + t * t * t * p1[1];
+ const p = u * pr0 + t * pr1;
+ result.push({ pos: [x, y], pressure: p });
+ }
+ return result;
+}
+
+// ── Converters ──────────────────────────────────────────────────────────────
+
+interface ExcalidrawFile {
+ mimeType: string;
+ id: string;
+ dataURL: string;
+ created: number;
+ lastRetrieved: number;
+}
+
+function convertBrushStroke(stroke: RnoteBrushStroke) {
+ const style = stroke.style.smooth;
+ if (!style) return null; // rough/textured styles not yet supported
+
+ // Flatten path into points + pressures
+ const allPoints: { pos: [number, number]; pressure: number }[] = [
+ { pos: stroke.path.start.pos, pressure: stroke.path.start.pressure },
+ ];
+
+ let lastPos = stroke.path.start.pos;
+ let lastPressure = stroke.path.start.pressure;
+
+ for (const seg of stroke.path.segments) {
+ if (seg.lineto) {
+ const end = seg.lineto.end;
+ allPoints.push({ pos: end.pos, pressure: end.pressure });
+ lastPos = end.pos;
+ lastPressure = end.pressure;
+ } else if (seg.quadbezto) {
+ const end = seg.quadbezto.end;
+ const flattened = flattenQuadBezier(lastPos, lastPressure, seg.quadbezto.cp, end.pos, end.pressure);
+ allPoints.push(...flattened);
+ lastPos = end.pos;
+ lastPressure = end.pressure;
+ } else if (seg.cubbezto) {
+ const end = seg.cubbezto.end;
+ const flattened = flattenCubicBezier(lastPos, lastPressure, seg.cubbezto.cp1, seg.cubbezto.cp2, end.pos, end.pressure);
+ allPoints.push(...flattened);
+ lastPos = end.pos;
+ lastPressure = end.pressure;
+ }
+ }
+
+ if (allPoints.length < 2) return null;
+
+ const originX = allPoints[0].pos[0];
+ const originY = allPoints[0].pos[1];
+
+ const points: number[][] = [];
+ const pressures: number[] = [];
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
+
+ for (const pt of allPoints) {
+ const px = pt.pos[0] - originX;
+ const py = pt.pos[1] - originY;
+ points.push([px, py]);
+ pressures.push(pt.pressure);
+ minX = Math.min(minX, px);
+ minY = Math.min(minY, py);
+ maxX = Math.max(maxX, px);
+ maxY = Math.max(maxY, py);
+ }
+
+ const el = makeBaseElement("freedraw", originX, originY, maxX - minX, maxY - minY);
+ el.points = points;
+ el.pressures = pressures;
+ el.simulatePressure = false;
+ el.strokeColor = convertColor(style.stroke_color);
+ el.strokeWidth = Math.max(1, Math.floor((style.stroke_width || 1) / 2));
+ el.opacity = convertOpacity(style.stroke_color);
+ el.lastCommittedPoint = points[points.length - 1] || null;
+
+ return el;
+}
+
+function convertTextStroke(text: RnoteTextStroke) {
+ if (!text.text) return null;
+
+ // Extract position from affine transform
+ // v0.13: nested arrays [[1,0,tx],[0,1,ty],[0,0,1]]
+ // v0.14: flat array [1,0,0, 0,1,0, tx,ty,1]
+ const affine = text.transform?.affine;
+ let x = 0, y = 0;
+ if (Array.isArray(affine?.[0])) {
+ // nested: row-major 3x3
+ const nested = affine as number[][];
+ x = nested[0]?.[2] ?? 0;
+ y = nested[1]?.[2] ?? 0;
+ } else if (affine) {
+ // flat 9-element array (column-major: [m00,m10,m20, m01,m11,m21, tx,ty,1])
+ const flat = affine as number[];
+ x = flat[6] ?? 0;
+ y = flat[7] ?? 0;
+ }
+ const ts = text.text_style ?? text.style;
+ const size = ts?.font_size ?? 12;
+ const color = ts?.color ?? { r: 0, g: 0, b: 0, a: 1 };
+
+ const lines = text.text.split("\n");
+ const estWidth = Math.max(...lines.map((l) => l.length)) * size * 0.6;
+ const estHeight = lines.length * size * 1.3;
+
+ const el = makeBaseElement("text", x, y, estWidth, estHeight);
+ el.text = text.text;
+ el.fontSize = size;
+ el.fontFamily = 5;
+ el.textAlign = "left";
+ el.verticalAlign = "top";
+ el.strokeColor = convertColor(color);
+ el.opacity = convertOpacity(color);
+ el.containerId = null;
+ el.originalText = text.text;
+ el.autoResize = true;
+ el.lineHeight = 1.25;
+
+ return el;
+}
+
+function convertBitmapImage(img: RnoteBitmapImage, files: Record) {
+ if (!img.image) return null;
+
+ // Extract base64 image data and encode as PNG if needed
+ let dataURL: string;
+ if (typeof img.image === "string") {
+ // v0.13: already PNG base64
+ dataURL = `data:image/png;base64,${img.image}`;
+ } else {
+ // v0.14: raw RGBA pixels, need to encode as PNG
+ const rawBuf = Buffer.from(img.image.data, "base64");
+ const pw = img.image.pixel_width ?? 0;
+ const ph = img.image.pixel_height ?? 0;
+ if (!pw || !ph) return null;
+ const pngBuf = encodeRawRgbaToPng(rawBuf, pw, ph);
+ dataURL = `data:image/png;base64,${pngBuf.toString("base64")}`;
+ }
+
+ // Extract bounds: v0.13 uses mins/maxs, v0.14 uses cuboid + transform
+ let minX: number, minY: number, w: number, h: number;
+ if ("mins" in img.rectangle) {
+ [minX, minY] = img.rectangle.mins;
+ const [maxX, maxY] = img.rectangle.maxs;
+ w = maxX - minX;
+ h = maxY - minY;
+ } else {
+ const [halfW, halfH] = img.rectangle.cuboid.half_extents;
+ const affine = img.rectangle.transform.affine;
+ // flat affine: tx=affine[6], ty=affine[7]
+ const cx = affine[6] ?? 0;
+ const cy = affine[7] ?? 0;
+ minX = cx - halfW;
+ minY = cy - halfH;
+ w = halfW * 2;
+ h = halfH * 2;
+ }
+
+ const fileId = generateId();
+ files[fileId] = {
+ mimeType: "image/png",
+ id: fileId,
+ dataURL,
+ created: Date.now(),
+ lastRetrieved: Date.now(),
+ };
+
+ const el = makeBaseElement("image", minX, minY, w, h);
+ el.fileId = fileId;
+ el.status = "saved";
+ el.scale = [1, 1];
+
+ return el;
+}
+
+// ── Main conversion ─────────────────────────────────────────────────────────
+
+function convertRnote(doc: RnoteFile) {
+ const snapshot = doc.data?.engine_snapshot;
+ if (!snapshot) throw new Error("Not a valid .rnote file: missing engine_snapshot");
+
+ const elements: Record[] = [];
+ const files: Record = {};
+
+ for (const entry of snapshot.stroke_components) {
+ if (!entry.value) continue;
+
+ if (entry.value.brushstroke) {
+ const el = convertBrushStroke(entry.value.brushstroke);
+ if (el) elements.push(el);
+ } else if (entry.value.textstroke) {
+ const el = convertTextStroke(entry.value.textstroke);
+ if (el) elements.push(el);
+ } else if (entry.value.bitmapimage) {
+ const el = convertBitmapImage(entry.value.bitmapimage, files);
+ if (el) elements.push(el);
+ }
+ }
+
+ return {
+ type: "excalidraw",
+ version: 2,
+ elements,
+ files,
+ appState: {
+ gridModeEnabled: false,
+ viewBackgroundColor: "#ffffff",
+ },
+ };
+}
+
+// ── Entry point ─────────────────────────────────────────────────────────────
+
+const scriptNote = api.currentNote;
+const childNotes = scriptNote.getChildNotes();
+
+for (const note of childNotes) {
+ if (note.type !== "file" || !note.title?.endsWith(".rnote")) {
+ continue;
+ }
+
+ try {
+ const content = note.getContent();
+ const jsonBuffer = zlib.gunzipSync(content);
+ const doc: RnoteFile = JSON.parse(jsonBuffer.toString("utf-8"));
+
+ const excalidrawData = convertRnote(doc);
+ const title = note.title.replace(/\.rnote$/, "");
+
+ const { note: canvasNote } = api.createNewNote({
+ parentNoteId: scriptNote.noteId,
+ title,
+ content: JSON.stringify(excalidrawData),
+ type: "canvas",
+ });
+
+ api.log(`auto-import-rnote: converted "${note.title}" → canvas note ${canvasNote.noteId}`);
+ } catch (err) {
+ const msg = err instanceof Error ? err.message : String(err);
+ api.log(`auto-import-rnote: failed for "${note.title}": ${msg}`);
+ }
+}
diff --git a/apps/script-deployer/scripts/auto-import-xopp.ts b/apps/script-deployer/scripts/auto-import-xopp.ts
new file mode 100644
index 0000000000..b800f1d319
--- /dev/null
+++ b/apps/script-deployer/scripts/auto-import-xopp.ts
@@ -0,0 +1,324 @@
+/**
+ * @trilium-script
+ *
+ * id: auto-import-xopp
+ * type: backend
+ * title: Auto-import XOPP to Canvas
+ * executeButton: true
+ * executeDescription: Converts all .xopp children of this note into Excalidraw canvas notes.
+ */
+
+import zlib from "zlib";
+
+// ── Color mapping ────────────────────────────────────────────────────────────
+
+const XOPP_COLORS: Record = {
+ black: "#000000",
+ blue: "#3333cc",
+ red: "#ff0000",
+ green: "#008000",
+ gray: "#808080",
+ lightblue: "#00c0ff",
+ lightgreen: "#00ff00",
+ magenta: "#ff00ff",
+ orange: "#ff8000",
+ yellow: "#ffff00",
+ white: "#ffffff",
+};
+
+function convertColor(color: string | null): string {
+ if (!color) return "#000000";
+ const lower = color.toLowerCase();
+ if (XOPP_COLORS[lower]) return XOPP_COLORS[lower];
+ if (lower.startsWith("#")) {
+ return lower.length > 7 ? lower.slice(0, 7) : lower;
+ }
+ return "#000000";
+}
+
+function extractOpacity(color: string | null): number {
+ if (!color) return 100;
+ if (color.startsWith("#") && color.length === 9) {
+ const alpha = parseInt(color.slice(7, 9), 16);
+ return Math.round((alpha / 255) * 100);
+ }
+ return 100;
+}
+
+// ── Excalidraw element helpers ───────────────────────────────────────────────
+
+function generateId(): string {
+ const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+ let id = "";
+ for (let i = 0; i < 20; i++) {
+ id += chars[Math.floor(Math.random() * chars.length)];
+ }
+ return id;
+}
+
+function makeBaseElement(type: string, x: number, y: number, width: number, height: number) {
+ return {
+ id: generateId(),
+ type,
+ x,
+ y,
+ width,
+ height,
+ angle: 0,
+ strokeColor: "#000000",
+ backgroundColor: "transparent",
+ fillStyle: "solid",
+ strokeWidth: 1,
+ strokeStyle: "solid",
+ roughness: 0,
+ opacity: 100,
+ groupIds: [] as string[],
+ frameId: null,
+ index: null,
+ roundness: null,
+ seed: Math.floor(Math.random() * 2_000_000_000),
+ version: 1,
+ versionNonce: Math.floor(Math.random() * 2_000_000_000),
+ isDeleted: false,
+ boundElements: null,
+ updated: Date.now(),
+ link: null,
+ locked: false,
+ } as Record;
+}
+
+// ── xml2js element accessors ─────────────────────────────────────────────────
+
+/** Get attribute from an xml2js node. */
+function attr(node: Record, name: string): string | null {
+ const attrs = node.$ as Record | undefined;
+ return attrs?.[name] ?? null;
+}
+
+/** Get text content from an xml2js node. */
+function text(node: Record): string {
+ return (node._ as string | undefined)?.trim() ?? "";
+}
+
+/** Get child elements by tag name, always as array. */
+function children(node: Record, tag: string): Record[] {
+ const val = node[tag];
+ if (!val) return [];
+ return Array.isArray(val) ? val : [val as Record];
+}
+
+// ── Converters ───────────────────────────────────────────────────────────────
+
+interface ExcalidrawFile {
+ mimeType: string;
+ id: string;
+ dataURL: string;
+ created: number;
+ lastRetrieved: number;
+}
+
+function convertStroke(strokeNode: Record, yOffset: number) {
+ const coordText = text(strokeNode);
+ const coords = coordText.split(/\s+/).map(Number);
+ if (coords.length < 4) return null;
+
+ const originX = coords[0];
+ const originY = coords[1] + yOffset;
+ const points: number[][] = [];
+ let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
+
+ for (let i = 0; i < coords.length; i += 2) {
+ const px = coords[i] - originX;
+ const py = (coords[i + 1] + yOffset) - originY;
+ points.push([px, py]);
+ minX = Math.min(minX, px);
+ minY = Math.min(minY, py);
+ maxX = Math.max(maxX, px);
+ maxY = Math.max(maxY, py);
+ }
+
+ const widthAttr = attr(strokeNode, "width") || "2";
+ const widths = widthAttr.trim().split(/\s+/).map(Number);
+ const hasPressure = widths.length > 1;
+
+ let pressures: number[] = [];
+ if (hasPressure) {
+ const maxW = Math.max(...widths);
+ pressures = widths.map((w) => maxW > 0 ? w / maxW : 0.5);
+ while (pressures.length < points.length) {
+ pressures.push(pressures[pressures.length - 1] || 0.5);
+ }
+ pressures = pressures.slice(0, points.length);
+ }
+
+ const color = attr(strokeNode, "color") || "black";
+ const tool = attr(strokeNode, "tool") || "pen";
+ const isHighlighter = tool === "highlighter";
+
+ const el = makeBaseElement("freedraw", originX, originY, maxX - minX, maxY - minY);
+ el.points = points;
+ el.pressures = hasPressure ? pressures : [];
+ el.simulatePressure = !hasPressure;
+ el.strokeColor = convertColor(color);
+ el.strokeWidth = Math.floor(widths[0] || 1);
+ el.opacity = isHighlighter ? 40 : extractOpacity(color);
+ el.lastCommittedPoint = points[points.length - 1] || null;
+
+ return el;
+}
+
+function convertText(textNode: Record, yOffset: number) {
+ const x = parseFloat(attr(textNode, "x") ?? "0");
+ const y = parseFloat(attr(textNode, "y") ?? "0") + yOffset;
+ const size = parseFloat(attr(textNode, "size") ?? "12");
+ const color = attr(textNode, "color") || "black";
+ const content = text(textNode);
+
+ if (!content) return null;
+
+ const lines = content.split("\n");
+ const estWidth = Math.max(...lines.map((l) => l.length)) * size * 0.6;
+ const estHeight = lines.length * size * 1.3;
+
+ const el = makeBaseElement("text", x, y, estWidth, estHeight);
+ el.text = content;
+ el.fontSize = size;
+ el.fontFamily = 5;
+ el.textAlign = "left";
+ el.verticalAlign = "top";
+ el.strokeColor = convertColor(color);
+ el.opacity = extractOpacity(color);
+ el.containerId = null;
+ el.originalText = content;
+ el.autoResize = true;
+ el.lineHeight = 1.25;
+
+ return el;
+}
+
+function convertImage(
+ imageNode: Record,
+ yOffset: number,
+ files: Record,
+) {
+ const left = parseFloat(attr(imageNode, "left") ?? "");
+ const top = parseFloat(attr(imageNode, "top") ?? "") + yOffset;
+ const right = parseFloat(attr(imageNode, "right") ?? "");
+ const bottom = parseFloat(attr(imageNode, "bottom") ?? "") + yOffset;
+
+ if (isNaN(left) || isNaN(top) || isNaN(right) || isNaN(bottom)) return null;
+
+ const imgData = text(imageNode);
+ if (!imgData) return null;
+
+ const fileId = generateId();
+ files[fileId] = {
+ mimeType: "image/png",
+ id: fileId,
+ dataURL: `data:image/png;base64,${imgData}`,
+ created: Date.now(),
+ lastRetrieved: Date.now(),
+ };
+
+ const el = makeBaseElement("image", left, top, right - left, bottom - top);
+ el.fileId = fileId;
+ el.status = "saved";
+ el.scale = [1, 1];
+
+ return el;
+}
+
+// ── Main conversion ──────────────────────────────────────────────────────────
+
+function convertXoppXml(doc: Record) {
+ const xournal = doc.xournal as Record | undefined;
+ if (!xournal) throw new Error("Not a valid .xopp file: missing root element");
+
+ const pages = children(xournal, "page");
+ const elements: Record[] = [];
+ const files: Record = {};
+ let yOffset = 0;
+ const PAGE_GAP = 80;
+
+ for (const page of pages) {
+ const pageHeight = parseFloat(attr(page, "height") ?? "792");
+ const pageWidth = parseFloat(attr(page, "width") ?? "612");
+
+ // Page boundary rectangle
+ const bgRect = makeBaseElement("rectangle", 0, yOffset, pageWidth, pageHeight);
+ bgRect.strokeColor = "#d0d0d0";
+ bgRect.strokeWidth = 1;
+ bgRect.strokeStyle = "dashed";
+ bgRect.backgroundColor = "transparent";
+ bgRect.opacity = 50;
+ elements.push(bgRect);
+
+ const layers = children(page, "layer");
+ for (const layer of layers) {
+ for (const stroke of children(layer, "stroke")) {
+ const el = convertStroke(stroke, yOffset);
+ if (el) elements.push(el);
+ }
+ for (const txt of children(layer, "text")) {
+ const el = convertText(txt, yOffset);
+ if (el) elements.push(el);
+ }
+ for (const img of children(layer, "image")) {
+ const el = convertImage(img, yOffset, files);
+ if (el) elements.push(el);
+ }
+ }
+
+ yOffset += pageHeight + PAGE_GAP;
+ }
+
+ return {
+ type: "excalidraw",
+ version: 2,
+ elements,
+ files,
+ appState: {
+ gridModeEnabled: false,
+ viewBackgroundColor: "#ffffff",
+ },
+ };
+}
+
+// ── Entry point (manually run) ───────────────────────────────────────────────
+
+const scriptNote = api.currentNote;
+const childNotes = scriptNote.getChildNotes();
+
+for (const note of childNotes) {
+ if (note.type !== "file" || !note.title?.endsWith(".xopp")) {
+ continue;
+ }
+
+ const content = note.getContent();
+ const xmlBuffer = zlib.gunzipSync(content);
+ const xmlString = xmlBuffer.toString("utf-8");
+
+ api.xml2js.parseString(xmlString, (err: Error | null, result: Record) => {
+ if (err) {
+ api.log(`auto-import-xopp: failed to parse XML for "${note.title}": ${err.message}`);
+ return;
+ }
+
+ try {
+ const excalidrawData = convertXoppXml(result);
+ const title = note.title.replace(/\.xopp$/, "");
+
+ const { note: canvasNote } = api.createNewNote({
+ parentNoteId: scriptNote.noteId,
+ title,
+ content: JSON.stringify(excalidrawData),
+ type: "canvas",
+ });
+
+ api.log(`auto-import-xopp: converted "${note.title}" → canvas note ${canvasNote.noteId}`);
+ } catch (convErr) {
+ const msg = convErr instanceof Error ? convErr.message : String(convErr);
+ api.log(`auto-import-xopp: conversion failed for "${note.title}": ${msg}`);
+ }
+ });
+}
diff --git a/apps/script-deployer/src/deploy.spec.ts b/apps/script-deployer/src/deploy.spec.ts
new file mode 100644
index 0000000000..5166615810
--- /dev/null
+++ b/apps/script-deployer/src/deploy.spec.ts
@@ -0,0 +1,386 @@
+import { beforeEach, describe, expect, it, vi } from "vitest";
+import becca from "@triliumnext/server/src/becca/becca";
+import BBranch from "@triliumnext/server/src/becca/entities/bbranch";
+import { buildNote } from "@triliumnext/server/src/test/becca_easy_mocking";
+import {
+ parseScriptMeta,
+ transpile,
+ deployScript,
+ codeNoteId,
+ renderNoteId,
+ SCRIPTS_NOTE_ID,
+ type NoteService,
+} from "./deploy";
+
+// ── Mocks — only SQL and entity_changes, becca is real ───────────────────────
+
+vi.mock("@triliumnext/server/src/services/sql", () => ({
+ default: {
+ transactional: (cb: Function) => cb(),
+ upsert: () => {},
+ execute: () => {},
+ replace: () => {},
+ getMap: () => {},
+ getValue: () => null,
+ },
+}));
+
+vi.mock("@triliumnext/server/src/services/sql_init", () => ({
+ dbReady: () => {},
+}));
+
+vi.mock("@triliumnext/server/src/services/entity_changes", () => ({
+ default: { putEntityChange: () => {} },
+ putEntityChange: () => {},
+}));
+
+// ── parseScriptMeta ──────────────────────────────────────────────────────────
+
+describe("parseScriptMeta", () => {
+ it("parses a valid @trilium-script block", () => {
+ const source = `/**
+ * @trilium-script
+ *
+ * id: my-script
+ * type: render
+ * title: My Script
+ */
+export default function() {}`;
+
+ const meta = parseScriptMeta(source, "my-script.jsx");
+ expect(meta).toEqual({
+ id: "my-script",
+ type: "render",
+ title: "My Script",
+ });
+ });
+
+ it("returns null when @trilium-script marker is missing", () => {
+ const source = `/** Just a normal comment */\nexport default function() {}`;
+ expect(parseScriptMeta(source, "test.jsx")).toBeNull();
+ });
+
+ it("returns null and logs error when id is missing", () => {
+ const spy = vi.spyOn(console, "error").mockImplementation(() => {});
+ const source = `/**
+ * @trilium-script
+ *
+ * type: render
+ * title: My Script
+ */`;
+ expect(parseScriptMeta(source, "test.jsx")).toBeNull();
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("missing required fields: id"));
+ spy.mockRestore();
+ });
+
+ it("returns null when type is missing", () => {
+ const spy = vi.spyOn(console, "error").mockImplementation(() => {});
+ const source = `/**
+ * @trilium-script
+ *
+ * id: test
+ * title: Test
+ */`;
+ expect(parseScriptMeta(source, "test.jsx")).toBeNull();
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("missing required fields: type"));
+ spy.mockRestore();
+ });
+
+ it("returns null when title is missing", () => {
+ const spy = vi.spyOn(console, "error").mockImplementation(() => {});
+ const source = `/**
+ * @trilium-script
+ *
+ * id: test
+ * type: code
+ */`;
+ expect(parseScriptMeta(source, "test.jsx")).toBeNull();
+ expect(spy).toHaveBeenCalledWith(expect.stringContaining("missing required fields: title"));
+ spy.mockRestore();
+ });
+
+ it("preserves extra metadata fields", () => {
+ const source = `/**
+ * @trilium-script
+ *
+ * id: test
+ * type: render
+ * title: Test
+ * icon: bx-rocket
+ */`;
+ const meta = parseScriptMeta(source, "test.jsx");
+ expect(meta).toMatchObject({ icon: "bx-rocket" });
+ });
+});
+
+// ── transpile ────────────────────────────────────────────────────────────────
+
+describe("transpile", () => {
+ it("passes .jsx files through unchanged", () => {
+ const source = `const x: number = 1; return {x}
;`;
+ expect(transpile(source, "test.jsx")).toBe(source);
+ });
+
+ it("strips type annotations from .tsx but preserves JSX", () => {
+ const source = `const x: number = 1;\nconst el = {x}
;`;
+ const result = transpile(source, "test.tsx");
+ expect(result).not.toContain(": number");
+ expect(result).toContain("");
+ });
+
+ it("strips type annotations from .ts", () => {
+ const source = `const x: number = 1;`;
+ const result = transpile(source, "test.ts");
+ expect(result).not.toContain(": number");
+ expect(result).toContain("const x = 1");
+ });
+
+ it("passes .js files through unchanged", () => {
+ const source = `const x = 1;`;
+ expect(transpile(source, "test.js")).toBe(source);
+ });
+});
+
+// ── deployScript ─────────────────────────────────────────────────────────────
+
+describe("deployScript", () => {
+ /**
+ * A NoteService backed by buildNote — each createNewNote call
+ * populates the real becca cache via becca_easy_mocking.
+ */
+ const notesService: NoteService = {
+ createNewNote(params) {
+ const note = buildNote({
+ id: params.noteId,
+ title: params.title,
+ type: params.type as Parameters
[0]["type"],
+ mime: params.mime ?? "text/html",
+ content: params.content,
+ });
+ // buildNote doesn't create a branch to the parent, so add one.
+ new BBranch({
+ branchId: `${params.parentNoteId}_${params.noteId}`,
+ noteId: params.noteId,
+ parentNoteId: params.parentNoteId,
+ });
+ return { note: { noteId: note.noteId } };
+ },
+ };
+
+ beforeEach(() => {
+ becca.reset();
+
+ // Root + Scripts folder, using buildNote for the tree structure.
+ buildNote({
+ id: "root",
+ title: "root",
+ children: [
+ { id: SCRIPTS_NOTE_ID, title: "Scripts", type: "doc" },
+ ],
+ });
+ });
+
+ describe("render note with JSX", () => {
+ const meta = { id: "xopp-importer", type: "render", title: "XOPP Importer" };
+ const jsxContent = `import { h } from "trilium:preact";\nexport default function() { return Hello
; }`;
+ const mime = "text/jsx";
+
+ it("creates a render note as parent with code note child linked via ~renderNote", () => {
+ deployScript(meta, jsxContent, mime, becca, notesService);
+
+ const renderId = renderNoteId(meta.id);
+ const codeId = codeNoteId(meta.id);
+ const renderNote = becca.notes[renderId];
+ const codeNote = becca.notes[codeId];
+
+ // Render note exists with correct type/title
+ expect(renderNote).toBeDefined();
+ expect(renderNote.type).toBe("render");
+ expect(renderNote.title).toBe("XOPP Importer");
+
+ // Code note exists with correct type/title
+ expect(codeNote).toBeDefined();
+ expect(codeNote.type).toBe("code");
+ expect(codeNote.title).toBe("XOPP Importer");
+
+ // Code note is a child of the render note
+ expect(codeNote.getParentBranches().some((b) => b.parentNoteId === renderId)).toBe(true);
+
+ // Render note is under scripts folder
+ expect(renderNote.getParentBranches().some((b) => b.parentNoteId === SCRIPTS_NOTE_ID)).toBe(true);
+
+ // ~renderNote relation points to the code note
+ const relation = renderNote.getRelations().find((a) => a.name === "renderNote");
+ expect(relation).toBeDefined();
+ expect(relation!.value).toBe(codeId);
+ });
+
+ it("returns a 'created' result with both note IDs", () => {
+ const result = deployScript(meta, jsxContent, mime, becca, notesService);
+ expect(result).toEqual({
+ action: "created",
+ codeNoteId: codeNoteId(meta.id),
+ renderNoteId: renderNoteId(meta.id),
+ title: "XOPP Importer",
+ type: "render",
+ });
+ });
+ });
+
+ describe("render note with TSX", () => {
+ const meta = { id: "tsx-widget", type: "render", title: "TSX Widget" };
+ const tsxSource = `const x: number = 1;\nexport default function() { return {x}
; }`;
+ const transpiledContent = transpile(tsxSource, "tsx-widget.tsx");
+ const mime = "text/jsx";
+
+ it("creates the same render+code structure as JSX, with types stripped but JSX preserved", () => {
+ // Content was correctly transpiled
+ expect(transpiledContent).not.toContain(": number");
+ expect(transpiledContent).toContain("");
+
+ deployScript(meta, transpiledContent, mime, becca, notesService);
+
+ const renderId = renderNoteId(meta.id);
+ const codeId = codeNoteId(meta.id);
+
+ expect(becca.notes[renderId]).toBeDefined();
+ expect(becca.notes[renderId].type).toBe("render");
+ expect(becca.notes[codeId]).toBeDefined();
+ expect(becca.notes[codeId].type).toBe("code");
+ });
+ });
+
+ describe("updating an existing script", () => {
+ const meta = { id: "existing-script", type: "render", title: "Original" };
+ const mime = "text/jsx";
+
+ it("updates content and title of existing code note", () => {
+ deployScript(meta, "old content", mime, becca, notesService);
+
+ const codeId = codeNoteId(meta.id);
+ const note = becca.notes[codeId];
+ const saveSpy = vi.fn();
+ const setContentSpy = vi.fn();
+ note.save = saveSpy;
+ note.setContent = setContentSpy;
+
+ const result = deployScript({ ...meta, title: "New Title" }, "new content", mime, becca, notesService);
+ expect(result.action).toBe("updated");
+ expect(note.title).toBe("New Title");
+ expect(saveSpy).toHaveBeenCalled();
+ expect(setContentSpy).toHaveBeenCalledWith("new content");
+ });
+ });
+
+ describe("plain code note (non-render)", () => {
+ const meta = { id: "backend-helper", type: "code", title: "Backend Helper" };
+ const content = "module.exports = {};";
+ const mime = "application/javascript;env=backend";
+
+ it("creates a single code note under scripts folder, no render note", () => {
+ deployScript(meta, content, mime, becca, notesService);
+
+ const codeId = codeNoteId(meta.id);
+ const codeNote = becca.notes[codeId];
+
+ expect(codeNote).toBeDefined();
+ expect(codeNote.type).toBe("code");
+ expect(codeNote.getParentBranches().some((b) => b.parentNoteId === SCRIPTS_NOTE_ID)).toBe(true);
+
+ // No render note was created
+ expect(becca.notes[renderNoteId(meta.id)]).toBeUndefined();
+ });
+
+ it("returns a 'created' result without renderNoteId", () => {
+ const result = deployScript(meta, content, mime, becca, notesService);
+ expect(result).toEqual({
+ action: "created",
+ codeNoteId: codeNoteId(meta.id),
+ title: "Backend Helper",
+ type: "code",
+ });
+ });
+ });
+
+ describe("backend script", () => {
+ const meta = { id: "hello-world", type: "backend", run: "backendStartup", title: "Hello World" };
+ const content = `api.log("Hello from script-deployer!");`;
+ const mime = "application/javascript;env=backend";
+
+ it("creates a code note with #run label", () => {
+ deployScript(meta, content, mime, becca, notesService);
+
+ const codeId = codeNoteId(meta.id);
+ const codeNote = becca.notes[codeId];
+
+ expect(codeNote).toBeDefined();
+ expect(codeNote.type).toBe("code");
+
+ const runLabel = codeNote.getLabels().find((a) => a.name === "run");
+ expect(runLabel).toBeDefined();
+ expect(runLabel!.value).toBe("backendStartup");
+ });
+
+ it("places the code note under scripts folder, no render note", () => {
+ deployScript(meta, content, mime, becca, notesService);
+
+ const codeId = codeNoteId(meta.id);
+ const codeNote = becca.notes[codeId];
+ expect(codeNote.getParentBranches().some((b) => b.parentNoteId === SCRIPTS_NOTE_ID)).toBe(true);
+ expect(becca.notes[renderNoteId(meta.id)]).toBeUndefined();
+ });
+
+ it("does not set #run when run field is absent", () => {
+ const metaNoRun = { id: "no-run", type: "backend", title: "No Run" };
+ deployScript(metaNoRun, content, mime, becca, notesService);
+
+ const codeNote = becca.notes[codeNoteId(metaNoRun.id)];
+ expect(codeNote.getLabels().find((a) => a.name === "run")).toBeUndefined();
+ });
+ });
+
+ describe("execute labels", () => {
+ const content = `api.log("test");`;
+ const mime = "application/javascript;env=backend";
+
+ it("sets executeButton, executeDescription, and executeTitle on creation", () => {
+ const meta = {
+ id: "exec-test",
+ type: "backend",
+ title: "Exec Test",
+ executeButton: "true",
+ executeDescription: "Does something useful",
+ executeTitle: "Run It",
+ };
+ deployScript(meta, content, mime, becca, notesService);
+
+ const codeNote = becca.notes[codeNoteId(meta.id)];
+ const labels = codeNote.getLabels();
+ expect(labels.find((a) => a.name === "executeButton")?.value).toBe("true");
+ expect(labels.find((a) => a.name === "executeDescription")?.value).toBe("Does something useful");
+ expect(labels.find((a) => a.name === "executeTitle")?.value).toBe("Run It");
+ });
+
+ it("sets execute labels on update of an existing note", () => {
+ const meta = { id: "exec-update", type: "backend", title: "Before" };
+ deployScript(meta, content, mime, becca, notesService);
+
+ const updated = { ...meta, title: "After", executeButton: "true", executeDescription: "Now executable" };
+ const result = deployScript(updated, content, mime, becca, notesService);
+
+ expect(result.action).toBe("updated");
+ const labels = becca.notes[codeNoteId(meta.id)].getLabels();
+ expect(labels.find((a) => a.name === "executeButton")?.value).toBe("true");
+ expect(labels.find((a) => a.name === "executeDescription")?.value).toBe("Now executable");
+ });
+
+ it("does not set execute labels when absent from metadata", () => {
+ const meta = { id: "no-exec", type: "backend", title: "Plain" };
+ deployScript(meta, content, mime, becca, notesService);
+
+ const labels = becca.notes[codeNoteId(meta.id)].getLabels();
+ expect(labels.find((a) => a.name === "executeButton")).toBeUndefined();
+ expect(labels.find((a) => a.name === "executeDescription")).toBeUndefined();
+ });
+ });
+});
diff --git a/apps/script-deployer/src/deploy.ts b/apps/script-deployer/src/deploy.ts
new file mode 100644
index 0000000000..4853cf2791
--- /dev/null
+++ b/apps/script-deployer/src/deploy.ts
@@ -0,0 +1,232 @@
+/**
+ * Core deployment logic for Trilium scripts.
+ *
+ * Extracted from dev.ts so it can be tested without the full server lifecycle.
+ */
+
+import { extname } from "node:path";
+import { transformSync } from "esbuild";
+// ── Public constants ─────────────────────────────────────────────────────────
+
+export const SCRIPTS_NOTE_ID = "_scripts";
+
+export const MIME_BY_EXT: Record
= {
+ ".jsx": "text/jsx",
+ ".tsx": "text/jsx",
+ ".js": "application/javascript;env=frontend",
+ ".ts": "application/javascript;env=backend",
+ ".html": "text/html",
+ ".css": "text/css",
+};
+
+// ── Front-matter parsing ─────────────────────────────────────────────────────
+
+export interface ScriptMeta {
+ id: string;
+ type: string;
+ title: string;
+ [key: string]: string;
+}
+
+/**
+ * Parses the `@trilium-script` YAML front matter from a JSDoc comment block.
+ *
+ * ```
+ * /**
+ * * @trilium-script
+ * *
+ * * id: my-script
+ * * type: render
+ * * title: My Script
+ * *\/
+ * ```
+ *
+ * Returns `null` (with a console error) when the marker is missing or
+ * required fields (`id`, `type`, `title`) are absent.
+ */
+export function parseScriptMeta(source: string, filePath: string): ScriptMeta | null {
+ const match = source.match(/\/\*\*[\s\S]*?@trilium-script\s*([\s\S]*?)\*\//);
+ if (!match) return null;
+
+ const block = match[1];
+ const meta: Record = {};
+
+ for (const line of block.split("\n")) {
+ const cleaned = line.replace(/^\s*\*\s?/, "").trim();
+ if (!cleaned) continue;
+
+ const colon = cleaned.indexOf(":");
+ if (colon === -1) continue;
+
+ const key = cleaned.slice(0, colon).trim();
+ const value = cleaned.slice(colon + 1).trim();
+ if (key && value) meta[key] = value;
+ }
+
+ const missing = ["id", "type", "title"].filter((k) => !meta[k]);
+ if (missing.length) {
+ console.error(` SKIP ${filePath}: missing required fields: ${missing.join(", ")}`);
+ return null;
+ }
+
+ return meta as ScriptMeta;
+}
+
+// ── Transpilation ────────────────────────────────────────────────────────────
+
+/** Extensions that need esbuild transpilation before deployment. */
+const TRANSPILE_EXTS = new Set([".ts", ".tsx"]);
+
+/**
+ * Strips TypeScript type annotations via esbuild, preserving JSX intact.
+ * Trilium's frontend handles JSX natively, so we only strip types.
+ */
+export function transpile(source: string, filePath: string): string {
+ const ext = extname(filePath);
+ if (!TRANSPILE_EXTS.has(ext)) return source;
+
+ const isBackend = ext === ".ts";
+ const result = transformSync(source, {
+ loader: ext === ".tsx" ? "tsx" : "ts",
+ jsx: "preserve",
+ sourcemap: false,
+ ...(isBackend && { format: "cjs" }),
+ });
+ return result.code;
+}
+
+// ── Note ID helpers ──────────────────────────────────────────────────────────
+
+export function codeNoteId(scriptId: string) {
+ return `_sd_${scriptId}`;
+}
+
+export function renderNoteId(scriptId: string) {
+ return `_sd_${scriptId}_render`;
+}
+
+// ── Deployment ───────────────────────────────────────────────────────────────
+
+/**
+ * Abstraction over the note-creation service so that tests can supply
+ * a mock while the real dev server passes the actual `notesService`.
+ */
+export interface NoteService {
+ createNewNote(params: {
+ noteId: string;
+ parentNoteId: string;
+ title: string;
+ type: string; // NoteType union at runtime, kept as string for test compatibility
+ mime?: string;
+ content: string;
+ }): { note: { noteId: string } };
+}
+
+/** Helper to cast the real notesService (which uses NoteType) to our interface. */
+// eslint-disable-next-line @typescript-eslint/no-explicit-any
+export function asNoteService(svc: any): NoteService {
+ return svc as NoteService;
+}
+
+export interface BeccaLike {
+ notes: Record;
+}
+
+export interface DeployResult {
+ action: "created" | "updated";
+ codeNoteId: string;
+ renderNoteId?: string;
+ title: string;
+ type: string;
+}
+
+/** Labels that map directly from front-matter keys to note attributes. */
+const PASSTHROUGH_LABELS = ["run", "executeButton", "executeDescription", "executeTitle"] as const;
+
+function applyLabels(note: BeccaLike["notes"][string], meta: ScriptMeta) {
+ note.setLabel("readOnly");
+ for (const label of PASSTHROUGH_LABELS) {
+ if (meta[label]) {
+ note.setLabel(label, meta[label]);
+ }
+ }
+ // BNote caches attributes eagerly during setLabel's save() path.
+ // Invalidate so subsequent reads see all labels we just set.
+ note.invalidateThisCache();
+}
+
+/**
+ * Deploys a single script file into the Trilium note tree.
+ *
+ * - For `type: render`: creates a render note with a child code note
+ * linked via `~renderNote`.
+ * - For other types: creates a plain code note under the scripts folder.
+ * - If the code note already exists, only its content and title are updated.
+ */
+export function deployScript(
+ meta: ScriptMeta,
+ content: string,
+ mime: string,
+ becca: BeccaLike,
+ notesService: NoteService,
+ parentNoteId: string = SCRIPTS_NOTE_ID,
+): DeployResult {
+ const codeId = codeNoteId(meta.id);
+ const existing = becca.notes[codeId];
+
+ if (existing) {
+ existing.title = meta.title;
+ existing.save();
+ existing.setContent(content);
+ applyLabels(existing, meta);
+ return { action: "updated", codeNoteId: codeId, title: meta.title, type: meta.type };
+ }
+
+ if (meta.type === "render") {
+ const renderId = renderNoteId(meta.id);
+
+ notesService.createNewNote({
+ noteId: renderId,
+ parentNoteId,
+ title: meta.title,
+ type: "render",
+ content: "",
+ });
+
+ notesService.createNewNote({
+ noteId: codeId,
+ parentNoteId: renderId,
+ title: meta.title,
+ type: "code",
+ mime,
+ content,
+ });
+
+ const renderNote = becca.notes[renderId];
+ renderNote.setRelation("renderNote", codeId);
+
+ return { action: "created", codeNoteId: codeId, renderNoteId: renderId, title: meta.title, type: meta.type };
+ }
+
+ // Plain code note (backend script, widget, etc.)
+ notesService.createNewNote({
+ noteId: codeId,
+ parentNoteId,
+ title: meta.title,
+ type: "code",
+ mime,
+ content,
+ });
+
+ applyLabels(becca.notes[codeId], meta);
+
+ return { action: "created", codeNoteId: codeId, title: meta.title, type: meta.type };
+}
diff --git a/apps/script-deployer/src/dev.ts b/apps/script-deployer/src/dev.ts
new file mode 100644
index 0000000000..4816637b7c
--- /dev/null
+++ b/apps/script-deployer/src/dev.ts
@@ -0,0 +1,212 @@
+/**
+ * Starts a dedicated Trilium instance for script development.
+ *
+ * On first run it initializes a fresh database (no demo content),
+ * creates an ETAPI token and persists it to data/.etapi-token.
+ * On subsequent runs it just boots the server.
+ */
+
+import { existsSync, mkdirSync, readdirSync, readFileSync, watch, writeFileSync } from "node:fs";
+import { extname,join, resolve } from "node:path";
+
+import { asNoteService,codeNoteId, deployScript, MIME_BY_EXT, parseScriptMeta, renderNoteId, SCRIPTS_NOTE_ID, transpile } from "./deploy";
+
+// ── Environment — must be set before any server module is imported ──────────
+const DATA_DIR = resolve(__dirname, "../data");
+const TOKEN_PATH = join(DATA_DIR, ".etapi-token");
+const PORT = 37842;
+
+mkdirSync(DATA_DIR, { recursive: true });
+
+process.env.TRILIUM_DATA_DIR = DATA_DIR;
+process.env.TRILIUM_PORT = String(PORT);
+process.env.TRILIUM_RESOURCE_DIR = resolve(__dirname, "../../server/src");
+process.env.NODE_ENV = "development";
+process.env.TRILIUM_ENV = "dev";
+
+// ── Constants ───────────────────────────────────────────────────────────────
+const SCRIPTS_DIR = resolve(__dirname, "../scripts");
+const needsInit = !existsSync(join(DATA_DIR, "document.db"));
+
+async function ensureTranslations() {
+ const i18n = await import("@triliumnext/server/src/services/i18n.js");
+ await i18n.initializeTranslations();
+}
+
+async function ensureDatabase() {
+ if (!needsInit) return;
+
+ console.log("No database found — creating a fresh instance…");
+
+ const cls = (await import("@triliumnext/server/src/services/cls.js")).default;
+ const sqlInit = (await import("@triliumnext/server/src/services/sql_init.js")).default;
+
+ // createInitialDatabase must run inside CLS (it touches becca).
+ await cls.init(async () => {
+ await sqlInit.createInitialDatabase(/* skipDemoDb */ true);
+ });
+
+ console.log("Database created.");
+}
+
+async function ensureEtapiToken() {
+ if (existsSync(TOKEN_PATH)) {
+ const token = readFileSync(TOKEN_PATH, "utf-8").trim();
+ console.log(`ETAPI token: ${token}`);
+ return;
+ }
+
+ const cls = (await import("@triliumnext/server/src/services/cls.js")).default;
+ const etapiTokens = (await import("@triliumnext/server/src/services/etapi_tokens.js")).default;
+
+ const authToken: string = cls.init(() => {
+ const { authToken } = etapiTokens.createToken("script-deployer");
+ return authToken;
+ });
+
+ writeFileSync(TOKEN_PATH, `${authToken }\n`);
+ console.log(`ETAPI token created and saved to ${TOKEN_PATH}`);
+ console.log(`ETAPI token: ${authToken}`);
+}
+
+async function ensureScriptsFolder() {
+ const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
+ if (becca.notes[SCRIPTS_NOTE_ID]) return;
+
+ const cls = (await import("@triliumnext/server/src/services/cls.js")).default;
+ const notesService = (await import("@triliumnext/server/src/services/notes.js")).default;
+
+ cls.init(() => {
+ notesService.createNewNote({
+ noteId: SCRIPTS_NOTE_ID,
+ parentNoteId: "root",
+ title: "Scripts",
+ type: "doc",
+ content: "",
+ });
+ });
+
+ console.log("Created 'Scripts' folder note.");
+}
+
+async function deployScripts() {
+ const files = readdirSync(SCRIPTS_DIR).filter((f) => MIME_BY_EXT[extname(f)]);
+ if (!files.length) {
+ console.log("No scripts to deploy.");
+ return;
+ }
+
+ const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
+ const cls = (await import("@triliumnext/server/src/services/cls.js")).default;
+ const notesService = (await import("@triliumnext/server/src/services/notes.js")).default;
+
+ console.log(`Deploying ${files.length} script(s)…`);
+
+ for (const file of files) {
+ const filePath = join(SCRIPTS_DIR, file);
+ const source = readFileSync(filePath, "utf-8");
+ const meta = parseScriptMeta(source, file);
+ if (!meta) continue;
+
+ const mime = MIME_BY_EXT[extname(file)]!;
+ const content = transpile(source, file);
+
+ cls.init(() => {
+ const result = deployScript(meta, content, mime, becca, asNoteService(notesService));
+ console.log(` ${result.action === "created" ? "Created" : "Updated"}: ${result.title} (${result.codeNoteId})`);
+ });
+ }
+}
+
+function watchScripts() {
+ // Debounce per file — editors can fire multiple events on a single save.
+ const timers = new Map>();
+
+ watch(SCRIPTS_DIR, (_eventType, filename) => {
+ if (!filename || !MIME_BY_EXT[extname(filename)]) return;
+
+ if (timers.has(filename)) clearTimeout(timers.get(filename));
+ timers.set(filename, setTimeout(() => {
+ timers.delete(filename);
+ syncFile(filename);
+ }, 100));
+ });
+
+ async function syncFile(filename: string) {
+ const filePath = join(SCRIPTS_DIR, filename);
+ if (!existsSync(filePath)) return;
+
+ const source = readFileSync(filePath, "utf-8");
+ const meta = parseScriptMeta(source, filename);
+ if (!meta) return;
+
+ const noteId = codeNoteId(meta.id);
+
+ const becca = (await import("@triliumnext/server/src/becca/becca.js")).default;
+ const cls = (await import("@triliumnext/server/src/services/cls.js")).default;
+
+ const note = becca.notes[noteId];
+ if (!note) {
+ console.log(` [watch] ${filename}: note ${noteId} not found, restart to create.`);
+ return;
+ }
+
+ const content = transpile(source, filename);
+
+ cls.init(() => {
+ note.setContent(content);
+ });
+
+ // For render scripts, trigger a refresh of all contexts viewing
+ // the render note by injecting a client-side script via websocket.
+ if (meta.type === "render") {
+ const ws = (await import("@triliumnext/server/src/services/ws.js")).default;
+ const renderId = renderNoteId(meta.id);
+ ws.sendMessageToAllClients({
+ type: "execute-script",
+ script: `function({ renderId, title }) {
+ for (const ctx of api.getNoteContexts()) {
+ if (ctx.noteId === renderId) {
+ api.triggerEvent("refreshData", { ntxId: ctx.ntxId });
+ console.log("[script-deployer] refreshed", title, "in context", ctx.ntxId);
+ }
+ }
+ }`,
+ params: [{
+ renderId,
+ title: meta.title
+ }],
+ currentNoteId: noteId,
+ originEntityName: "notes",
+ originEntityId: noteId,
+ });
+ }
+
+ console.log(` [watch] Synced: ${meta.title}`);
+ }
+
+ console.log(`Watching ${SCRIPTS_DIR} for changes…`);
+}
+
+async function main() {
+ await ensureTranslations();
+ await ensureDatabase();
+ await ensureEtapiToken();
+
+ // Start the full HTTP server — this loads becca and makes the note
+ // tree available for subsequent setup steps.
+ const startTriliumServer = (await import("@triliumnext/server/src/www.js")).default;
+ await startTriliumServer();
+
+ await ensureScriptsFolder();
+ await deployScripts();
+ watchScripts();
+
+ console.log(`\nScript-deployer Trilium instance running on http://localhost:${PORT}`);
+ console.log(`Token file: ${TOKEN_PATH}\n`);
+}
+
+main().catch((err) => {
+ console.error("Fatal:", err);
+ process.exit(1);
+});
diff --git a/apps/script-deployer/src/trilium-env.d.ts b/apps/script-deployer/src/trilium-env.d.ts
new file mode 100644
index 0000000000..31a81e4c2c
--- /dev/null
+++ b/apps/script-deployer/src/trilium-env.d.ts
@@ -0,0 +1,115 @@
+///
+
+/**
+ * Ambient type declarations for the virtual modules available inside
+ * Trilium user scripts (`trilium:preact` and `trilium:api`).
+ *
+ * These modules don't exist on disk — the server rewrites imports at
+ * runtime — but providing declarations here gives us editor
+ * intellisense and `tsc` checking for scripts in the `scripts/` dir.
+ *
+ * Types are pulled directly from the real implementations so they
+ * stay in sync automatically.
+ */
+
+type FrontendApi = import("@triliumnext/client/src/services/frontend_script_api").Api;
+type PreactApi = typeof import("@triliumnext/client/src/services/frontend_script_api_preact").preactAPI;
+
+/**
+ * `trilium:api` — destructured members of the frontend script API.
+ *
+ * At runtime the server rewrites `require("trilium:api")` to `api`,
+ * which is the FrontendApi instance. Scripts destructure named
+ * members from it: `import { runOnBackend, showMessage } from "trilium:api"`.
+ */
+declare module "trilium:api" {
+ // Re-export every member of the frontend API as a named export.
+ export const {
+ activateNote,
+ showMessage,
+ showError,
+ runOnBackend,
+ getNote,
+ getActiveContextNote,
+ getActiveContextTextEditor,
+ getActiveContextCodeEditor,
+ getActiveContextNotePath,
+ getComponentByEl,
+ bindGlobalShortcut,
+ triggerEvent,
+ triggerCommand,
+ getNoteContexts,
+ refreshIncludedNote,
+ createLink,
+ startNote,
+ currentNote,
+ originEntity,
+ dayjs,
+ }: FrontendApi;
+}
+
+/**
+ * `trilium:preact` — destructured members of the Preact API surface.
+ *
+ * At runtime the server rewrites `require("trilium:preact")` to
+ * `api.preact`, which is the frozen preactAPI object. Scripts
+ * destructure from it: `import { useState, h } from "trilium:preact"`.
+ */
+declare module "trilium:preact" {
+ export const {
+ // Core
+ h,
+ Fragment,
+ createContext,
+ defineWidget,
+ defineLauncherWidget,
+
+ // Hooks
+ useCallback,
+ useContext,
+ useEffect,
+ useLayoutEffect,
+ useMemo,
+ useReducer,
+ useRef,
+ useState,
+
+ // Built-in components
+ ActionButton,
+ Admonition,
+ Button,
+ CKEditor,
+ Collapsible,
+ Dropdown,
+ FormCheckbox,
+ FormDropdownList,
+ FormFileUploadButton,
+ FormFileUploadActionButton,
+ FormGroup,
+ FormListItem,
+ FormDropdownDivider,
+ FormDropdownSubmenu,
+ FormRadioGroup,
+ FormText,
+ FormTextArea,
+ FormTextBox,
+ FormToggle,
+ Icon,
+ LinkButton,
+ LoadingSpinner,
+ Modal,
+ NoteAutocomplete,
+ NoteLink,
+ RawHtml,
+ Slider,
+ RightPanelWidget,
+ }: PreactApi;
+}
+
+/**
+ * Global `api` object available inside `runOnBackend()` callbacks.
+ * The function body is serialised and executed on the server where
+ * Trilium injects this as a global.
+ */
+// eslint-disable-next-line no-var
+declare var api: import("@triliumnext/server/src/services/backend_script_api").Api;
diff --git a/apps/script-deployer/tsconfig.json b/apps/script-deployer/tsconfig.json
new file mode 100644
index 0000000000..eae3e9e904
--- /dev/null
+++ b/apps/script-deployer/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "noEmit": true,
+ "jsx": "preserve",
+ "moduleResolution": "bundler",
+ "module": "esnext"
+ },
+ "include": ["src", "scripts", "../server/src/express.d.ts"]
+}
diff --git a/apps/script-deployer/vite.config.mts b/apps/script-deployer/vite.config.mts
new file mode 100644
index 0000000000..6477713f68
--- /dev/null
+++ b/apps/script-deployer/vite.config.mts
@@ -0,0 +1,20 @@
+///
+import { defineConfig } from "vite";
+
+export default defineConfig(() => ({
+ root: __dirname,
+ test: {
+ watch: false,
+ globals: true,
+ environment: "node",
+ env: {
+ NODE_ENV: "development",
+ TRILIUM_DATA_DIR: "./data",
+ TRILIUM_INTEGRATION_TEST: "memory",
+ TRILIUM_RESOURCE_DIR: "../server/src",
+ TRILIUM_ENV: "dev",
+ },
+ include: ["src/**/*.{test,spec}.ts"],
+ testTimeout: 20_000,
+ },
+}));
diff --git a/apps/server/package.json b/apps/server/package.json
index 581c2f5995..3b42991da5 100644
--- a/apps/server/package.json
+++ b/apps/server/package.json
@@ -31,11 +31,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.69",
- "@ai-sdk/google": "3.0.63",
+ "@ai-sdk/anthropic": "3.0.71",
+ "@ai-sdk/google": "3.0.64",
"@ai-sdk/openai": "3.0.53",
"@modelcontextprotocol/sdk": "^1.12.1",
- "ai": "6.0.161",
+ "ai": "6.0.168",
"better-sqlite3": "12.9.0",
"html-to-text": "9.0.5",
"i18next-fs-backend": "2.6.3",
@@ -83,7 +83,7 @@
"debounce": "3.0.0",
"debug": "4.4.3",
"ejs": "5.0.2",
- "electron": "41.2.0",
+ "electron": "41.3.0",
"electron-window-state": "5.0.3",
"express": "5.2.1",
"express-http-proxy": "2.1.2",
@@ -97,13 +97,13 @@
"html2plaintext": "2.1.4",
"http-proxy-agent": "9.0.0",
"https-proxy-agent": "9.0.0",
- "i18next-fs-backend": "2.6.3",
+ "i18next-fs-backend": "2.6.4",
"image-type": "6.1.0",
"ini": "6.0.0",
"is-animated": "2.0.2",
"is-svg": "6.1.0",
"jimp": "1.6.1",
- "marked": "18.0.1",
+ "marked": "18.0.2",
"mime-types": "3.0.2",
"multer": "2.1.1",
"normalize-strings": "1.1.1",
@@ -119,7 +119,7 @@
"time2fa": "1.4.2",
"tmp": "0.2.5",
"turnish": "1.8.0",
- "vite": "8.0.8",
+ "vite": "8.0.9",
"xml2js": "0.6.2",
"yauzl": "3.3.0"
}
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to & command palette.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to & command palette.html
index c6ab832bdb..f25684284a 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to & command palette.html
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Navigation/Jump to & command palette.html
@@ -52,8 +52,7 @@
Type a few words to filter between commands.
Use the up and down arrows on the keyboard or the mouse to select a command.
- Press Enter to execute the command.
+ Press Enter to execute the command.
To exit the command palette:
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html
index 331753192b..f945451b0f 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Basic Concepts and Features/Notes/Printing & Exporting as PDF.html
@@ -5,7 +5,7 @@
Trilium allows printing notes to a real printer, or generating a structured
PDF for a single note or for multiple notes through Collections .
+ href="#root/_help_GTwFsgaA0lCt">Collections.
Note that not all note types are printable as of now. We do plan to increase
the coverage of supported note types in the future.
Printing and exporting as PDF are not perfect. Due to technical limitations,
@@ -20,10 +20,10 @@
On the desktop application of Trilium it is possible to export a note
as PDF. To print a note:
This will trigger the print preview screen next.
Print preview & print options
@@ -32,11 +32,9 @@
The printer to use
@@ -71,7 +69,7 @@
spellcheck="false">#printScale, #printMargins).
This means that the print settings will be restored when printing the
same note. There are no default settings that can be configured for all
- the notes, but this can be achieved via inheritable attributes .
+ the notes, but this can be achieved via inheritable attributes .
Printing on the browser
This feature allows printing of notes. It works on both the desktop client,
@@ -116,8 +114,7 @@
First create a collection.
Configure it to use List View .
- Print the collection note normally.
+ Print the collection note normally.
The resulting collection will contain all the children of the collection,
while maintaining the hierarchy.
@@ -134,9 +131,9 @@
href="#root/_help_4TIF1oA4VQRO">Options and assigning a key combination
for:
- Print Active Note
+ Print Active Note
- Export Active Note as PDF
+ Export Active Note as PDF
Constraints & limitations
@@ -212,13 +209,12 @@
To remark:
Multiple CSS notes can be add by using multiple ~printCss relations.
- If the note pointing to the printCss doesn't
+ If the note pointing to the printCss doesn't
have the right note type or mime type, it will be ignored.
- If migrating from a previous version where Custom app-wide CSS , there's no need for
- @media print { since the style-sheet is used only for printing.
+ If migrating from a previous version where Custom app-wide CSS , there's no need for
+ @media print { since the style-sheet is used only for printing.
Under the hood
Both printing and exporting as PDF use the same mechanism: a note is rendered
@@ -232,13 +228,7 @@
understand why a particular note doesn't render well. The mechanism for
rendering is similar to the one used in Note List .
-
\ No newline at end of file
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Code.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Code.html
index a658cdc82a..3702117519 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Code.html
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Code.html
@@ -4,16 +4,15 @@
This can be useful for a few things:
computer programmers can store code snippets as notes with syntax highlighting
- JavaScript code notes can be executed inside Trilium for some extra functionality
+ JavaScript code notes can be executed inside Trilium for some extra functionality
we call such JavaScript code notes "scripts" - see Scripting
-
- JSON, XML etc. can be used as storage for structured data (typically used
- in conjunction with scripting)
+
+ JSON, XML etc. can be used as storage for structured data (typically used
+ in conjunction with scripting)
For shorter snippets of code that can be embedded in Text notes,
see Code blocks .
@@ -41,26 +40,24 @@
Word wrap
Long lines can be displayed on multiple lines:
- Globally for all code notes, from Options → Code Notes.
+ Globally for all code notes, from Options → Code Notes.
For a particular note, by going to the menu in Note buttons and
- selecting Word wrap and selecting the appropriate option:
+ href="#root/_help_8YBEPzcpUgxw">Note buttons and selecting Word wrap and
+ selecting the appropriate option:
Auto , to respect the global word wrap for code notes.
- On or Off , to change the state of the word wrap for this
+ On or Off , to change the state of the word wrap for this
note regardless of the global option.
-
+
Adjusting options using the status bar
This feature is only available for the New Layout .
- For the old layout, the tab width can be adjusted at note level using the
- #tabWidthattribute, but re-indentation is not available.
+ href="#root/_help_IjZS7iK5EXtb">New Layout. For the old layout, the tab width
+ can be adjusted at note level using the #tabWidth attribute,
+ but re-indentation is not available.
The status bar at the bottom of the editor shows the current indentation
settings and language. Clicking on the indentation indicator opens a menu
@@ -70,8 +67,7 @@
override is active, a "Reset to default" option appears.
Display Width — choose from preset widths (1, 2, 3, 4,
6, 8). Changes are saved as a per-note #tabWidth label.
- Re-indent Content To — convert existing indentation to
+ Re-indent Content To — convert existing indentation to
a different style. For example, re-indent a file from 4 spaces to 2 spaces,
or from spaces to tabs. This rewrites the leading whitespace on every line
while preserving alignment remainders.
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File/PDFs.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File/PDFs.html
index d502c2c243..2f673f8b5c 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File/PDFs.html
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/File/PDFs.html
@@ -8,6 +8,32 @@
which is a customization of Mozilla's PDF.js viewer (also
built-in in the Mozilla Firefox browser). Versions prior to that render
PDFs using the browser's default PDF viewer.
+Features
+
+
+ The last page viewed and scroll position is maintained in between restarts
+ or note navigations.
+
+
+ Annotations (text, highlights) as well as comments. These are saved automatically.
+
+
+ Forms can be filled.
+
+
+ Can be printed or downloaded.
+
+
+ Can be saved as a template and
+ the content of the PDF will be copied over to the new note. This is especially
+ useful in combination with annotations or filled forms.
+
+
+ Integrates with the sidebar in the New Layout ,
+ by displaying the list of pages with thumbnails, table of contents and
+ a listing of the annotations.
+
+
Storing last position and settings
For every PDF, Trilium will remember the following information:
@@ -29,6 +55,18 @@ class="admonition tip">
annotation buttons on the right side of the PDF toolbar (
).
+ Since v0.103.0:
+
+ Annotations are disabled if the note is marked as Read-Only Notes .
+ Comments can also be added, which is similar to highlights but also attach
+ a text.
+ The Right Sidebar also
+ displays a list of annotations (highlights, comments), but only in the
+ New Layout .
+
Supported annotations
The following annotation methods are supported:
@@ -82,33 +120,43 @@ class="admonition tip">
Table of contents/outline
All the headings and “bookmarks” will be displayed hierarchially.
- The heading on the current page is also highlighted (note that it can
+ The heading on the current page is also highlighted (note that it can
be slightly offset depending on how many headings are on the same page).
- Clicking on a heading will jump to the corresponding position in the PDF.
+ Clicking on a heading will jump to the corresponding position in the PDF.
-
- Pages
-
- A preview of all the pages with a small thumbnail.
- Clicking on a page will automatically navigate to that page.
+
+ Pages
+
+ A preview of all the pages with a small thumbnail.
+ Clicking on a page will automatically navigate to that page.
+
+
+ Annotations
+
+ Highlight and comment annotations are listed here.
+ For the old layout, this feature is not directly available, however there
+ is a listing of comments directly in the PDF toolbar.
+
+
+ Attachments
+
+ If the PDF has its own attachments (not to be confused with Trilium's
+ Attachments ), they will be displayed in a list.
+ Some information such as the name and size of the attachment are displayed.
+ It's possible to download the attachment by clicking on the download button.
-
- Attachments
-
- If the PDF has its own attachments (not to be confused with Trilium's
- Attachments ), they will be displayed in a list.
- Some information such as the name and size of the attachment are displayed.
- It's possible to download the attachment by clicking on the download button.
-
-
- Layers
-
- A less common feature, if the PDF has toggle-able layers, these layers
- will be displayed in a list here.
- It's possible to toggle the visibility for each individual layer.
-
-
+
+ Layers
+
+ A less common feature, if the PDF has toggle-able layers, these layers
+ will be displayed in a list here.
+ It's possible to toggle the visibility for each individual layer.
+
+
Share functionality
PDFs can also be shared using the Sharing feature.
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Markdown.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Markdown.html
index be12436732..caac5619ea 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Markdown.html
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Markdown.html
@@ -32,46 +32,63 @@
The following features are supported by Trilium's Markdown format and
will show up in the preview pane:
-
- All standard and GitHub-flavored syntax (basic formatting, tables, blockquotes)
-
-
- Code blocks with syntax highlight (e.g. ```js)
- and automatic syntax highlight
-
-
- Block quotes & admonitions
-
-
-
- Math Equations
-
-
-
- Mermaid Diagrams using
- ```mermaid
-
-
-
- Include Note (no
- builtin Markdown syntax, but HTML syntax works just fine):
<section class="include-note" data-note-id="vJDjQm0VK8Na" data-box-size="expandable">
+ All standard and GitHub-flavored syntax (basic formatting, tables, blockquotes)
+ Code blocks with syntax highlight. Note that the language must be specified
+ for syntax highlight to apply (e.g. ```js).
+ Block quotes & admonitions
+
+ Math Equations (both
+ inline and block)
+ Mermaid Diagrams using
+ ```mermaid
+
+
+ Include Note (no
+ built-in Markdown syntax, but HTML syntax works just fine):
<section class="include-note" data-note-id="vJDjQm0VK8Na" data-box-size="expandable">
</section>n
-
-
- Internal (reference) links via
- its HTML syntax, or through a Wikilinks -like format (only
- Note ID ):
[[Hg8TS5ZOxti6]]
+
+
+ Internal (reference) links via
+ its HTML syntax, or through a Wikilinks -like format (only
+ Note ID ):
[[Hg8TS5ZOxti6]]
+
+
+ Footnotes are
+ also supported via the corresponding Markdown syntax:
This is [^1], while this is [^2].
+
+[^1]: the first footnote
+[^2]: the second footnote
+
+
+Other features
+
+Shared notes
+When a Markdown note is shared publicly ,
+ it will be rendered with extended formatting just like Text notes.
+Most of the features described previously should be supported. If you
+ face any issues, feel free to report it alongside
+ a sample Markdown file.
Creating Markdown notes
There are two ways to create a Markdown note:
Create a new note (e.g. in the Note Tree )
and select the type Markdown , just like all the other note types.
- Create a note of type Code and
+ Create a note of type Code and
select as the language either Markdown or GitHub-Flavored Markdown .
This maintains compatibility with your existing notes prior to the introduction
of this feature.
diff --git a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html
index d159034940..33cd1f2b65 100644
--- a/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html
+++ b/apps/server/src/assets/doc_notes/en/User Guide/User Guide/Note Types/Text/Developer-specific formatting/Code blocks.html
@@ -62,10 +62,9 @@
It is possible to disable the syntax highlighting for all the notes by
selecting “No syntax highlighting” in the “Color scheme” option.
- Word wrapping is disabled by default, but can be configured from the same
+ Word wrapping is disabled by default, but can be configured from the same
section.
- The tab width can also be adjusted from Options.
+ The tab width can also be adjusted from Options.
Context regarding syntax highlighting
diff --git a/apps/server/src/assets/translations/cn/server.json b/apps/server/src/assets/translations/cn/server.json
index bebe357241..fec95a4b69 100644
--- a/apps/server/src/assets/translations/cn/server.json
+++ b/apps/server/src/assets/translations/cn/server.json
@@ -103,7 +103,8 @@
"find-in-text": "在文本中查找",
"back-in-note-history": "导航到历史记录中的上一个笔记",
"forward-in-note-history": "导航到历史记录的下一个笔记",
- "scroll-to-active-note": "滚动笔记树到当前笔记"
+ "scroll-to-active-note": "滚动笔记树到当前笔记",
+ "save-named-revision": "保存活动笔记的命名修订"
},
"login": {
"title": "登录",
@@ -357,7 +358,8 @@
"open-developer-tools": "打开开发者工具",
"find-in-text": "在文本中查找",
"toggle-left-pane": "切换左侧面板",
- "toggle-full-screen": "切换全屏模式"
+ "toggle-full-screen": "切换全屏模式",
+ "save-named-revision": "保存已命名的修订"
},
"share_theme": {
"site-theme": "网站主题",
diff --git a/apps/server/src/assets/translations/it/server.json b/apps/server/src/assets/translations/it/server.json
index 6148e02556..4978367069 100644
--- a/apps/server/src/assets/translations/it/server.json
+++ b/apps/server/src/assets/translations/it/server.json
@@ -187,7 +187,8 @@
"migration": {
"old_version": "La migrazione diretta dalla tua versione attuale non è supportata. Aggiorna prima all'ultima versione v0.60.4 e solo dopo a questa versione.",
"error_message": "Errore durante la migrazione alla versione {{version}}: {{stack}}",
- "wrong_db_version": "La versione del database ({{version}}) è più recente di quanto l'applicazione si aspetti ({{targetVersion}}), il che significa che è stato creato da una versione più nuova e incompatibile di Trilium. Aggiorna Trilium all'ultima versione per risolvere questo problema."
+ "wrong_db_version": "La versione del database ({{version}}) è più recente di quanto l'applicazione si aspetti ({{targetVersion}}), il che significa che è stato creato da una versione più nuova e incompatibile di Trilium. Aggiorna Trilium all'ultima versione per risolvere questo problema.",
+ "invalid_db_version": "La versione del database non è un numero valido. Questo di solito indica che l'opzione «dbVersion» nel database è danneggiata. Si prega di ripristinare il sistema da un backup."
},
"modals": {
"error_title": "Errore"
diff --git a/apps/server/src/assets/translations/tw/server.json b/apps/server/src/assets/translations/tw/server.json
index 8e6d11f087..9c765461fb 100644
--- a/apps/server/src/assets/translations/tw/server.json
+++ b/apps/server/src/assets/translations/tw/server.json
@@ -103,7 +103,8 @@
"find-in-text": "切換搜尋面板",
"toggle-classic-editor-toolbar": "切換固定工具列編輯器的格式分頁",
"export-as-pdf": "匯出目前筆記為 PDF",
- "toggle-zen-mode": "啟用 / 禁用禪模式(極簡界面以專注編輯)"
+ "toggle-zen-mode": "啟用 / 禁用禪模式(極簡界面以專注編輯)",
+ "save-named-revision": "儲存目前筆記的命名修訂"
},
"login": {
"title": "登入",
@@ -259,7 +260,8 @@
"find-in-text": "在文字中尋找",
"toggle-left-pane": "切換左側面板",
"toggle-full-screen": "切換全螢幕",
- "command-palette": "命令面板"
+ "command-palette": "命令面板",
+ "save-named-revision": "儲存命名修訂"
},
"weekdayNumber": "第 {weekNumber} 週",
"quarterNumber": "第 {quarterNumber} 季度",
@@ -353,7 +355,8 @@
"migration": {
"old_version": "您目前的版本不支援直接遷移。請先更新至最新的 v0.60.4 然後再到此版本。",
"error_message": "遷移至版本 {{version}} 時發生錯誤:{{stack}}",
- "wrong_db_version": "資料庫版本({{version}})比程式預期({{targetVersion}})新,這意味著它由一個更新且不相容的 Trilium 版本所創建。升級至最新版的 Trilium 以解決此問題。"
+ "wrong_db_version": "資料庫版本({{version}})比程式預期({{targetVersion}})新,這意味著它由一個更新且不相容的 Trilium 版本所創建。升級至最新版的 Trilium 以解決此問題。",
+ "invalid_db_version": "資料庫版本號不是有效的數字。這通常表示資料庫中的「dbVersion」選項已損毀。請從備份還原。"
},
"modals": {
"error_title": "錯誤"
@@ -414,5 +417,11 @@
"fulltext-after-expression": "\"{{- token}}\" 不是有效的表達式。若要搜尋文字,請將其置於屬性篩選條件之前(例如:\"{{- token}} #label\",而非 \"#label {{- token}}\")。",
"unrecognized-expression": "無法辨識的表達式 \"{{- token}}\""
}
+ },
+ "password": {
+ "incorrect": "您輸入的密碼不正確。"
+ },
+ "script": {
+ "wrong-environment": "無法執行筆記「{{- noteTitle}}」({{- noteId}})。這是一個 {{- actualEnv}} 腳本,但嘗試在 {{- expectedEnv}} 中執行。"
}
}
diff --git a/apps/server/src/routes/api/database.ts b/apps/server/src/routes/api/database.ts
index 58457a1ebf..a5f810daf2 100644
--- a/apps/server/src/routes/api/database.ts
+++ b/apps/server/src/routes/api/database.ts
@@ -83,7 +83,13 @@ function downloadBackup(req: Request, res: Response) {
return;
}
- res.download(resolvedPath, path.basename(resolvedPath));
+ const mtime = fs.statSync(resolvedPath).mtime;
+ const dateStr = mtime.toISOString().slice(0, 19)
+ .replaceAll(":", "-")
+ .replace("T", "_");
+ const ext = path.extname(resolvedPath);
+ const baseName = path.basename(resolvedPath, ext);
+ res.download(resolvedPath, `${baseName}_${dateStr}${ext}`);
}
export default {
diff --git a/apps/server/src/services/blob.spec.ts b/apps/server/src/services/blob.spec.ts
new file mode 100644
index 0000000000..438b9ae58b
--- /dev/null
+++ b/apps/server/src/services/blob.spec.ts
@@ -0,0 +1,51 @@
+import type { BlobRow } from "@triliumnext/commons";
+import { blob as blobService } from "@triliumnext/core";
+import { describe, expect, it } from "vitest";
+
+// These tests lock the exact output of calculateContentHash against known inputs.
+// The hash is written to entity_changes.hash and shipped to sync peers — any
+// change to the formula (fields, separators, ordering) silently invalidates
+// hashes on already-synced blobs, so changes must be deliberate. If a code
+// change breaks these expectations, update the expected values AND ensure a
+// migration or sync-compatibility plan is in place.
+describe("calculateContentHash", () => {
+ const baseBlob: Pick = {
+ blobId: "blob001",
+ content: "hello world"
+ };
+
+ it("hashes a blob without textRepresentation to the locked value (no trailing separator)", () => {
+ // Must match hash("blobId|content") — same formula used before
+ // textRepresentation existed, so pre-OCR blobs don't re-hash on upgrade.
+ expect(blobService.calculateContentHash(baseBlob)).toBe("dyhIZrQHB3Bb1bhcZVPld8Q6ONU=");
+ });
+
+ it("hashes a blob with textRepresentation to the locked value", () => {
+ expect(blobService.calculateContentHash({ ...baseBlob, textRepresentation: "OCR result" }))
+ .toBe("CsMYMZbvYJtrGVGJwxnr5w6KbMg=");
+ });
+
+ it("treats undefined, null, and empty-string textRepresentation identically", () => {
+ const undefinedHash = blobService.calculateContentHash(baseBlob);
+ const nullHash = blobService.calculateContentHash({ ...baseBlob, textRepresentation: null });
+ const emptyHash = blobService.calculateContentHash({ ...baseBlob, textRepresentation: "" });
+ expect(nullHash).toBe(undefinedHash);
+ expect(emptyHash).toBe(undefinedHash);
+ });
+
+ it("produces different hashes for different blobIds, content, and textRepresentation", () => {
+ const base = blobService.calculateContentHash(baseBlob);
+ const diffId = blobService.calculateContentHash({ ...baseBlob, blobId: "blob002" });
+ const diffContent = blobService.calculateContentHash({ ...baseBlob, content: "other" });
+ const diffTextRep = blobService.calculateContentHash({ ...baseBlob, textRepresentation: "x" });
+ expect(diffId).not.toBe(base);
+ expect(diffContent).not.toBe(base);
+ expect(diffTextRep).not.toBe(base);
+ });
+
+ it("hashes string and equivalent Buffer content identically", () => {
+ const stringHash = blobService.calculateContentHash(baseBlob);
+ const bufferHash = blobService.calculateContentHash({ ...baseBlob, content: Buffer.from("hello world") });
+ expect(bufferHash).toBe(stringHash);
+ });
+});
diff --git a/apps/server/src/services/llm/providers/anthropic.ts b/apps/server/src/services/llm/providers/anthropic.ts
index aef87f8258..3e57ceb5e6 100644
--- a/apps/server/src/services/llm/providers/anthropic.ts
+++ b/apps/server/src/services/llm/providers/anthropic.ts
@@ -11,6 +11,12 @@ import { BaseProvider, buildModelList } from "./base_provider.js";
*/
const { models: AVAILABLE_MODELS, pricing: MODEL_PRICING } = buildModelList([
// ===== Current Models =====
+ {
+ id: "claude-opus-4-7",
+ name: "Claude Opus 4.7",
+ pricing: { input: 5, output: 25 },
+ contextWindow: 1000000
+ },
{
id: "claude-sonnet-4-6",
name: "Claude Sonnet 4.6",
@@ -18,12 +24,6 @@ const { models: AVAILABLE_MODELS, pricing: MODEL_PRICING } = buildModelList([
contextWindow: 1000000,
isDefault: true
},
- {
- id: "claude-opus-4-6",
- name: "Claude Opus 4.6",
- pricing: { input: 5, output: 25 },
- contextWindow: 1000000
- },
{
id: "claude-haiku-4-5-20251001",
name: "Claude Haiku 4.5",
@@ -31,6 +31,13 @@ const { models: AVAILABLE_MODELS, pricing: MODEL_PRICING } = buildModelList([
contextWindow: 200000
},
// ===== Legacy Models =====
+ {
+ id: "claude-opus-4-6",
+ name: "Claude Opus 4.6",
+ pricing: { input: 5, output: 25 },
+ contextWindow: 1000000,
+ isLegacy: true
+ },
{
id: "claude-sonnet-4-5-20250929",
name: "Claude Sonnet 4.5",
diff --git a/apps/server/src/services/llm/providers/base_provider.ts b/apps/server/src/services/llm/providers/base_provider.ts
index 5000b4fcbf..d61efe3f3c 100644
--- a/apps/server/src/services/llm/providers/base_provider.ts
+++ b/apps/server/src/services/llm/providers/base_provider.ts
@@ -105,6 +105,9 @@ export abstract class BaseProvider implements LlmProvider {
parts.push(
`When referring to notes in your responses, use the wiki-link format [[noteId]] to create clickable internal links. Use the note ID (not the title) from tool results. The link will automatically display the note's title and icon, so don't repeat the title in your text. For example: "You can find more details in [[ZjSfLhzlqNY6]]" instead of "You can find more details in the Meeting Notes note ([[ZjSfLhzlqNY6]])".`
);
+ parts.push(
+ `Do not create, modify, or delete notes unless the user explicitly asks you to (e.g. "create a note", "save this to a note"). The chat supports rich Markdown rendering including code blocks, math equations, mermaid diagrams, and tables — so always present content directly in your response rather than creating a note for it. For example, if asked to "visualize an algorithm", render a mermaid diagram in the chat, don't create a note.`
+ );
} else if (config.contextNoteId) {
parts.push(
`You can see the current note's metadata above, but you cannot search or access other notes. If the user asks about other notes, inform them that "Note access" is disabled and they need to enable it in the chat settings (click on the model name dropdown and toggle "Note access").`
@@ -122,6 +125,32 @@ export abstract class BaseProvider implements LlmProvider {
);
}
+ // Parallel tool-call hint
+ if (config.enableNoteTools || config.enableWebSearch) {
+ parts.push(
+ `When you need several independent pieces of information, issue the tool calls in parallel within the same turn instead of waiting for each result before requesting the next. Only chain calls sequentially when a later call genuinely depends on the output of an earlier one.`
+ );
+ }
+
+ // Markdown formatting hints
+ parts.push(
+ `Your responses are rendered as Markdown with extended features. Use them when appropriate:\n\n`
+ + `**Admonitions** — GitHub-style callout blocks. Use sparingly, only when a plain paragraph would under-sell the point:\n`
+ + `- \`> [!NOTE]\` — neutral side information worth highlighting\n`
+ + `- \`> [!TIP]\` — an optional improvement or shortcut\n`
+ + `- \`> [!IMPORTANT]\` — information the user should not miss\n`
+ + `- \`> [!WARNING]\` — something that may cause problems or surprise\n`
+ + `- \`> [!CAUTION]\` — a destructive or irreversible action\n`
+ + `Syntax: the marker must be on its own line, and every content line must start with \`>\`.\n\n`
+ + `**Math equations** — KaTeX (LaTeX subset). Use \`$...$\` for inline math and \`$$...$$\` for display (block) math. Example: \`$E = mc^2$\` or:\n`
+ + `$$\n\\int_0^\\infty e^{-x^2} dx = \\frac{\\sqrt{\\pi}}{2}\n$$\n\n`
+ + `**Mermaid diagrams** — use a fenced code block with the \`mermaid\` language tag. Example:\n`
+ + "```mermaid\ngraph LR\n A --> B\n```\n\n"
+ + `**Code blocks** — use fenced code blocks with a language tag for syntax highlighting (e.g. \`\`\`js, \`\`\`python).\n\n`
+ + `**Footnotes** — use \`[^1]\` in text and \`[^1]: explanation\` at the bottom.\n\n`
+ + `**Task lists** — use \`- [ ]\` for unchecked and \`- [x]\` for checked items.`
+ );
+
return parts.length > 0 ? parts.join("\n\n") : undefined;
}
diff --git a/apps/server/src/services/llm/stream.ts b/apps/server/src/services/llm/stream.ts
index e66da16a5b..91a0056b67 100644
--- a/apps/server/src/services/llm/stream.ts
+++ b/apps/server/src/services/llm/stream.ts
@@ -3,19 +3,38 @@
*/
import type { LlmStreamChunk } from "@triliumnext/commons";
+import type { LanguageModelUsage } from "ai";
import type { ModelPricing, StreamResult } from "./types.js";
+// Cache pricing assumes Anthropic's 5-min ephemeral rates (writes 1.25× input, reads 0.1× input).
+// OpenAI/Gemini bill caches differently but the gap is small compared to the current behaviour
+// of treating cached tokens at full input price.
+const CACHE_WRITE_MULTIPLIER = 1.25;
+const CACHE_READ_MULTIPLIER = 0.1;
+
/**
* Calculate estimated cost in USD based on token usage and pricing.
+ * Accounts for cache read/write pricing tiers when the provider reports them;
+ * reasoning tokens are already included in `outputTokens` per the AI SDK.
*/
-function calculateCost(inputTokens: number, outputTokens: number, pricing?: ModelPricing): number | undefined {
+function calculateCost(usage: LanguageModelUsage, pricing?: ModelPricing): number | undefined {
if (!pricing) return undefined;
- const inputCost = (inputTokens / 1_000_000) * pricing.input;
- const outputCost = (outputTokens / 1_000_000) * pricing.output;
+ const details = usage.inputTokenDetails;
+ const cacheReadTokens = details?.cacheReadTokens ?? usage.cachedInputTokens ?? 0;
+ const cacheWriteTokens = details?.cacheWriteTokens ?? 0;
+ const noCacheInputTokens = details?.noCacheTokens
+ ?? Math.max(0, (usage.inputTokens ?? 0) - cacheReadTokens - cacheWriteTokens);
+ const outputTokens = usage.outputTokens ?? 0;
- return inputCost + outputCost;
+ const M = 1_000_000;
+ return (
+ (noCacheInputTokens / M) * pricing.input
+ + (cacheReadTokens / M) * pricing.input * CACHE_READ_MULTIPLIER
+ + (cacheWriteTokens / M) * pricing.input * CACHE_WRITE_MULTIPLIER
+ + (outputTokens / M) * pricing.output
+ );
}
export interface StreamOptions {
@@ -85,7 +104,7 @@ export async function* streamToChunks(result: StreamResult, options: StreamOptio
// Get usage information after stream completes
const usage = await result.usage;
if (usage && typeof usage.inputTokens === "number" && typeof usage.outputTokens === "number") {
- const cost = calculateCost(usage.inputTokens, usage.outputTokens, options.pricing);
+ const cost = calculateCost(usage, options.pricing);
yield {
type: "usage",
usage: {
diff --git a/apps/server/src/services/ocr/ocr_service.ts b/apps/server/src/services/ocr/ocr_service.ts
index 938ef30131..ebc6552c6b 100644
--- a/apps/server/src/services/ocr/ocr_service.ts
+++ b/apps/server/src/services/ocr/ocr_service.ts
@@ -17,6 +17,7 @@ export interface OCRResult {
extractedAt: string;
language?: string;
pageCount?: number;
+ processingType?: string;
}
export interface OCRProcessingOptions {
@@ -116,6 +117,7 @@ class OCRService {
}
const result = await processor.extractText(fileBuffer, { ...options, mimeType });
+ result.processingType = processor.getProcessingType();
log.info(`OCR extraction completed. Confidence: ${Math.round(result.confidence * 100)}%, Text length: ${result.text.length}`);
return result;
diff --git a/apps/server/src/services/ocr/processors/pdf_processor.ts b/apps/server/src/services/ocr/processors/pdf_processor.ts
index 9605665857..1b5b8ff464 100644
--- a/apps/server/src/services/ocr/processors/pdf_processor.ts
+++ b/apps/server/src/services/ocr/processors/pdf_processor.ts
@@ -22,10 +22,11 @@ export class PDFProcessor extends FileProcessor {
const pdf = await getDocumentProxy(new Uint8Array(buffer));
const { totalPages, text } = await extractText(pdf, { mergePages: true });
+ const trimmed = text.trim();
return {
- text: text.trim(),
- confidence: 0.99,
+ text: trimmed,
+ confidence: trimmed.length > 0 ? 0.99 : 0,
extractedAt: new Date().toISOString(),
language: options.language || "eng",
pageCount: totalPages
diff --git a/apps/server/src/share/content_renderer.ts b/apps/server/src/share/content_renderer.ts
index 0a10eeea93..58d3e43e44 100644
--- a/apps/server/src/share/content_renderer.ts
+++ b/apps/server/src/share/content_renderer.ts
@@ -1,4 +1,4 @@
-import { renderSpreadsheetToHtml } from "@triliumnext/commons";
+import { renderSpreadsheetToHtml, renderToHtml as renderMarkdownToHtml } from "@triliumnext/commons";
import { icon_packs as iconPackService, sanitize, utils } from "@triliumnext/core";
import { highlightAuto } from "@triliumnext/highlightjs";
import ejs from "ejs";
@@ -274,6 +274,8 @@ export function getContent(note: SNote | BNote) {
if (note.type === "text") {
renderText(result, note);
+ } else if (note.type === "code" && note.mime === "text/x-markdown") {
+ renderMarkdown(result, note);
} else if (note.type === "code") {
renderCode(result);
} else if (note.type === "mermaid") {
@@ -450,6 +452,38 @@ function cleanUpReferenceLinks(linkEl: HTMLElement, getNote: GetNoteFunction) {
}
}
+/**
+ * Renders a markdown code note by converting the markdown source to HTML
+ * using the shared {@link renderMarkdownToHtml} pipeline.
+ */
+function renderMarkdown(result: Result, note: SNote | BNote) {
+ if (typeof result.content !== "string" || !result.content?.trim()) {
+ result.isEmpty = true;
+ return;
+ }
+
+ const html = renderMarkdownToHtml(result.content, note.title, {
+ sanitize: sanitize.sanitizeHtml,
+ wikiLink: { formatHref: (id) => `./${id}` }
+ });
+
+ // Apply syntax highlighting to code blocks, same as renderText.
+ const parseOpts: Partial = { blockTextElements: {} };
+ const document = parse(html, parseOpts);
+ for (const codeEl of document.querySelectorAll("pre code")) {
+ if (codeEl.classList.contains("language-mermaid")
+ || codeEl.classList.contains("language-text-x-trilium-auto")) {
+ continue;
+ }
+
+ const highlightResult = highlightAuto(codeEl.text);
+ codeEl.innerHTML = highlightResult.value;
+ codeEl.classList.add("hljs");
+ }
+
+ result.content = document.innerHTML;
+}
+
/**
* Renders a code note.
*/
@@ -483,7 +517,7 @@ function renderImage(result: Result, note: SNote | BNote) {
function renderFile(note: SNote | BNote, result: Result) {
if (note.mime === "application/pdf") {
- result.content = ``;
+ result.content = ``;
} else {
result.content = `Download file `;
}
diff --git a/apps/web-clipper/package.json b/apps/web-clipper/package.json
index f02d35dc6e..05bab297e3 100644
--- a/apps/web-clipper/package.json
+++ b/apps/web-clipper/package.json
@@ -13,10 +13,10 @@
"postinstall": "wxt prepare"
},
"keywords": [],
- "packageManager": "pnpm@10.33.0",
+ "packageManager": "pnpm@10.33.1",
"devDependencies": {
"@wxt-dev/auto-icons": "1.1.1",
- "wxt": "0.20.24"
+ "wxt": "0.20.25"
},
"dependencies": {
"cash-dom": "8.1.5"
diff --git a/apps/website/package.json b/apps/website/package.json
index 47c8abe2dd..1f920daad6 100644
--- a/apps/website/package.json
+++ b/apps/website/package.json
@@ -9,7 +9,7 @@
"preview": "pnpm build && vite preview"
},
"dependencies": {
- "i18next": "26.0.5",
+ "i18next": "26.0.6",
"preact": "10.29.1",
"preact-iso": "2.11.1",
"preact-render-to-string": "6.6.7",
@@ -21,8 +21,8 @@
"eslint-config-preact": "2.0.0",
"typescript": "6.0.3",
"user-agent-data-types": "0.4.3",
- "vite": "8.0.8",
- "vitest": "4.1.4"
+ "vite": "8.0.9",
+ "vitest": "4.1.5"
},
"eslintConfig": {
"extends": "preact"
diff --git a/docs/Developer Guide/Developer Guide/Documentation.md b/docs/Developer Guide/Developer Guide/Documentation.md
index 72b644ea00..368acc4d18 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-ug.md b/docs/README-ug.md
index 201a5d0071..32d30c3cc6 100644
--- a/docs/README-ug.md
+++ b/docs/README-ug.md
@@ -45,8 +45,8 @@ Trilium Notes بولسا ھەقسىز، ئوچۇق كودلۇق، سىستېما
## ھۆججەتلەر📚
-بىزنىڭ تولۇق قوللانمىمىزنى كۆرۈڭ:
-[docs.triliumnotes.org](https://docs.triliumnotes.org/)
+**بىزنىڭ تولۇق قوللانمىمىزنى كۆرۈڭ:
+docs.triliumnotes.org](https://docs.triliumnotes.org/)**
بىزنىڭ قوللانمىمىزنىڭ بىر قانچە خىل شەكىلدىكى نۇسخىلىرى بار:
- **تور قوللانمىسى**:بىزنىڭ تولۇق قوللانمىمىزنى مۇشۇ شەكىلدە كۆرۈڭ:
@@ -175,9 +175,9 @@ zadam/Trilium نۇسخىسىدىن TriliumNext/Notes غا كۆچۈش ئۈچۈن
- `General `Matrix ئۆيىمۇ [XMPP](xmpp:discuss@trilium.thisgreat.party?join) غا
ئۇلانغان
- [GitHub Discussions](https://github.com/TriliumNext/Trilium/discussions)
- (ئاسىنكرون مۇنازىرە).
+ (ئاسىنكرون مۇنازىرە.)
- [GitHub Issues](https://github.com/TriliumNext/Trilium/issues) (خاتالىق مەلۇم
- قىلىش ۋە ئىقتىدار ئېھتىياجىنى ئوتتۇرىغا قويۇش).
+ قىلىش ۋە ئىقتىدار ئېھتىياجىنى ئوتتۇرىغا قويۇش.)
## 🏗 قاچىلاش
@@ -185,7 +185,7 @@ zadam/Trilium نۇسخىسىدىن TriliumNext/Notes غا كۆچۈش ئۈچۈن
[ئەڭ يېڭى نەشرى بېتى](https://github.com/TriliumNext/Trilium/releases/latest)دىن
سۇپىڭىزغا ماس كېلىدىغان سىستېما ھۆججىتىنى چۈشۈرۈڭ، پرېستىن يەشكەندىن كېيىن
-`trilium` ئىجرا ھۆججىتىنى قوزغىتىڭ.)
+`trilium` ئىجرا ھۆججىتىنى قوزغىتىڭ.
### Linux
@@ -197,8 +197,8 @@ zadam/Trilium نۇسخىسىدىن TriliumNext/Notes غا كۆچۈش ئۈچۈن
سىز يەنە [ئەڭ يېڭى ئېلان قىلىنغان
بەت](https://github.com/TriliumNext/Trilium/releases/latest)تىن مۇناسىپ سۇپىنىڭ
-سىستېما ھۆججىتىنى چۈشۈرۈپ، پرېستىن يېشىپ بولغاندىن كېيىن trilium ئىجرا ھۆججىتىنى
-قوزغاتسىڭىز بولىدۇ.
+سىستېما ھۆججىتىنى چۈشۈرۈپ، پرېستىن يېشىپ بولغاندىن كېيىن `trilium` ئىجرا
+ھۆججىتىنى قوزغاتسىڭىز بولىدۇ.
TriliumNext يەنە Flatpak نۇسخىسى بىلەن تەمىنلەيدۇ، ئەمما تېخى FlatHub غا
چىقىرىلمىدى.
@@ -206,7 +206,7 @@ TriliumNext يەنە Flatpak نۇسخىسى بىلەن تەمىنلەيدۇ، ئ
### Browser (ھەرقانداق مەشغۇلات سىستېمىسى)
ئەگەر سىزدە (تۆۋەندىكىدەك) مۇلازىمىتىر قاچىلانمىسى بولسا، تور كۆرۈنمە يۈزىنى
-بىۋاسىتە ساقىلالايسىز (ئۇ بىر تەرەپ قىلغۇچ دېتالى بىلەن ئاساسەن ئوخشاش)
+بىۋاسىتە ساقىلالايسىز (ئۇ بىر تەرەپ قىلغۇچ دېتالى بىلەن ئاساسەن ئوخشاش).
نۆۋەتتە پەقەت Chrome ۋە Firefox نىڭ ئەڭ يېڭى نەشرىنىلا قوللايدۇ (ھەمدە ئەمەلىي
سىناقتىن ئۆتكەن).
@@ -329,7 +329,7 @@ pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32
(https://docs.triliumnotes.org/user-guide/note-types/relation-map) ۋە ئۇلىنىش
خەرىتىسى
(https://docs.triliumnotes.org/user-guide/advanced-usage/note-map#link-map)
- ئۈچۈن ئىشلىتىلىدۇ.
+ ئۈچۈن ئىشلىتىلىدۇ
## 🤝 بىزنى قوللاش
diff --git a/docs/User Guide/!!!meta.json b/docs/User Guide/!!!meta.json
index 36deaaf658..522f111df4 100644
--- a/docs/User Guide/!!!meta.json
+++ b/docs/User Guide/!!!meta.json
@@ -4680,108 +4680,136 @@
{
"type": "relation",
"name": "internalLink",
- "value": "wy8So3yZZlH9",
+ "value": "GTwFsgaA0lCt",
"isInheritable": false,
"position": 10
},
{
"type": "relation",
"name": "internalLink",
- "value": "CohkqWQC1iBv",
+ "value": "8YBEPzcpUgxw",
"isInheritable": false,
"position": 20
},
{
"type": "relation",
"name": "internalLink",
- "value": "GTwFsgaA0lCt",
+ "value": "A9Oc6YKKc65v",
+ "isInheritable": false,
+ "position": 30
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "F1r9QtzQLZqm",
"isInheritable": false,
"position": 40
},
{
"type": "relation",
"name": "internalLink",
- "value": "mULW0Q3VojwY",
+ "value": "zEY4DaJG4YT5",
"isInheritable": false,
"position": 50
},
{
"type": "relation",
"name": "internalLink",
- "value": "4TIF1oA4VQRO",
+ "value": "bwZpz2ajCEwO",
"isInheritable": false,
"position": 60
},
{
"type": "relation",
"name": "internalLink",
- "value": "KSZ04uQ2D1St",
+ "value": "wy8So3yZZlH9",
"isInheritable": false,
"position": 70
},
{
"type": "relation",
"name": "internalLink",
- "value": "6f9hih2hXXZk",
+ "value": "CohkqWQC1iBv",
"isInheritable": false,
"position": 80
},
{
"type": "relation",
"name": "internalLink",
- "value": "zP3PMqaG71Ct",
+ "value": "mULW0Q3VojwY",
"isInheritable": false,
"position": 90
},
{
"type": "relation",
"name": "internalLink",
- "value": "grjYqerjn243",
+ "value": "4TIF1oA4VQRO",
"isInheritable": false,
"position": 100
},
{
"type": "relation",
"name": "internalLink",
- "value": "gBbsAeiuUxI5",
+ "value": "KSZ04uQ2D1St",
"isInheritable": false,
"position": 110
},
{
"type": "relation",
"name": "internalLink",
- "value": "2FvYrpmOXm29",
+ "value": "6f9hih2hXXZk",
"isInheritable": false,
"position": 120
},
{
"type": "relation",
"name": "internalLink",
- "value": "AlhDUqhENtH7",
+ "value": "zP3PMqaG71Ct",
"isInheritable": false,
"position": 130
},
{
"type": "relation",
"name": "internalLink",
- "value": "bwZpz2ajCEwO",
+ "value": "grjYqerjn243",
"isInheritable": false,
"position": 140
},
{
"type": "relation",
"name": "internalLink",
- "value": "KC1HB96bqqHX",
+ "value": "gBbsAeiuUxI5",
"isInheritable": false,
"position": 150
},
{
"type": "relation",
"name": "internalLink",
- "value": "0ESUbbAxVnoK",
+ "value": "2FvYrpmOXm29",
"isInheritable": false,
"position": 160
},
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "AlhDUqhENtH7",
+ "isInheritable": false,
+ "position": 170
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "KC1HB96bqqHX",
+ "isInheritable": false,
+ "position": 180
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "0ESUbbAxVnoK",
+ "isInheritable": false,
+ "position": 190
+ },
{
"type": "label",
"name": "iconClass",
@@ -4795,34 +4823,6 @@
"value": "printing-and-pdf-export",
"isInheritable": false,
"position": 110
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "8YBEPzcpUgxw",
- "isInheritable": false,
- "position": 170
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "A9Oc6YKKc65v",
- "isInheritable": false,
- "position": 180
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "F1r9QtzQLZqm",
- "isInheritable": false,
- "position": 190
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "zEY4DaJG4YT5",
- "isInheritable": false,
- "position": 200
}
],
"format": "markdown",
@@ -9864,6 +9864,20 @@
"isInheritable": false,
"position": 60
},
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "8YBEPzcpUgxw",
+ "isInheritable": false,
+ "position": 70
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "IjZS7iK5EXtb",
+ "isInheritable": false,
+ "position": 80
+ },
{
"type": "label",
"name": "shareAlias",
@@ -9877,20 +9891,6 @@
"value": "bx bx-code",
"isInheritable": false,
"position": 90
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "8YBEPzcpUgxw",
- "isInheritable": false,
- "position": 100
- },
- {
- "type": "relation",
- "name": "internalLink",
- "value": "IjZS7iK5EXtb",
- "isInheritable": false,
- "position": 110
}
],
"format": "markdown",
@@ -10805,6 +10805,20 @@
"value": "pdf",
"isInheritable": false,
"position": 60
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "CoFPLs3dRlXc",
+ "isInheritable": false,
+ "position": 70
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "KC1HB96bqqHX",
+ "isInheritable": false,
+ "position": 80
}
],
"format": "markdown",
@@ -11050,6 +11064,41 @@
"value": "markdown",
"isInheritable": false,
"position": 40
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "R9pX4DGra2Vt",
+ "isInheritable": false,
+ "position": 130
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "AgjCISero73a",
+ "isInheritable": false,
+ "position": 140
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "BFvAtE74rbP6",
+ "isInheritable": false,
+ "position": 150
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "RnaPdbciOfeq",
+ "isInheritable": false,
+ "position": 160
+ },
+ {
+ "type": "relation",
+ "name": "internalLink",
+ "value": "IjZS7iK5EXtb",
+ "isInheritable": false,
+ "position": 170
}
],
"format": "markdown",
diff --git a/docs/User Guide/User Guide/Note Types/File/PDFs.md b/docs/User Guide/User Guide/Note Types/File/PDFs.md
index ea97274e0e..771c650454 100644
--- a/docs/User Guide/User Guide/Note Types/File/PDFs.md
+++ b/docs/User Guide/User Guide/Note Types/File/PDFs.md
@@ -5,6 +5,15 @@ PDFs file can be uploaded in Trilium, where they will be displayed without the n
Since v0.102.0, PDFs will be rendered using Trilium's built-in PDF viewer, which is a customization of [Mozilla's PDF.js viewer](https://mozilla.github.io/pdf.js/) (also built-in in the Mozilla Firefox browser). Versions prior to that render PDFs using the browser's default PDF viewer.
+## Features
+
+* The last page viewed and scroll position is maintained in between restarts or note navigations.
+* Annotations (text, highlights) as well as comments. These are saved automatically.
+* Forms can be filled.
+* Can be printed or downloaded.
+* Can be saved as a [template](../../Advanced%20Usage/Templates.md) and the content of the PDF will be copied over to the new note. This is especially useful in combination with annotations or filled forms.
+* Integrates with the sidebar in the New Layout , by displaying the list of pages with thumbnails, table of contents and a listing of the annotations.
+
## Storing last position and settings
For every PDF, Trilium will remember the following information:
@@ -22,6 +31,12 @@ This makes it useful when reading large documents since the position is remember
Since v0.102.0 it's possible to annotate PDFs. To do so, look for the annotation buttons on the right side of the PDF toolbar ( ).
+Since v0.103.0:
+
+* Annotations are disabled if the note is marked as Read-Only Notes .
+* Comments can also be added, which is similar to highlights but also attach a text.
+* The Right Sidebar also displays a list of annotations (highlights, comments), but only in the New Layout .
+
### Supported annotations
The following annotation methods are supported:
@@ -71,6 +86,9 @@ When a PDF file is opened in Trilium the Attachments ), they will be displayed in a list.
* Some information such as the name and size of the attachment are displayed.
diff --git a/docs/User Guide/User Guide/Note Types/Markdown.md b/docs/User Guide/User Guide/Note Types/Markdown.md
index 906645611e..e4df7ba71e 100644
--- a/docs/User Guide/User Guide/Note Types/Markdown.md
+++ b/docs/User Guide/User Guide/Note Types/Markdown.md
@@ -25,11 +25,11 @@ Even if Markdown is now specially treated by having a preview mechanism, Trilium
The following features are supported by Trilium's Markdown format and will show up in the preview pane:
* All standard and GitHub-flavored syntax (basic formatting, tables, blockquotes)
-* Code blocks with syntax highlight (e.g. ` ```js `) and automatic syntax highlight
+* Code blocks with syntax highlight. Note that the language must be specified for syntax highlight to apply (e.g. ` ```js `).
* Block quotes & admonitions
-* Math Equations
+* Math Equations (both inline and block)
* Mermaid Diagrams using ` ```mermaid `
-* Include Note (no builtin Markdown syntax, but HTML syntax works just fine):
+* Include Note (no built-in Markdown syntax, but HTML syntax works just fine):
```
@@ -41,6 +41,25 @@ The following features are supported by Trilium's Markdown format and will show
```
[[Hg8TS5ZOxti6]]
```
+* Footnotes are also supported via the corresponding Markdown syntax:
+
+ ```
+ This is [^1], while this is [^2].
+
+ [^1]: the first footnote
+ [^2]: the second footnote
+ ```
+
+### Other features
+
+* The Table of contents will be displayed in the Right Sidebar based on the Markdown-level headings.
+ * This feature is available only on the New Layout .
+
+### Shared notes
+
+When a Markdown note is [shared publicly](../Advanced%20Usage/Sharing.md), it will be rendered with extended formatting just like Text notes.
+
+Most of the features described previously should be supported. If you face any issues, feel free to [report it](../Troubleshooting/Reporting%20issues.md) alongside a sample Markdown file.
## Creating Markdown notes
diff --git a/package.json b/package.json
index db4d3083bd..0635f7c25f 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"client:test": "pnpm run --filter client test",
"client:build": "pnpm run --filter client build",
"client:coverage": "pnpm run --filter client test --coverage",
+ "client:stylelint": "pnpm run --filter client stylelint",
"server:test": "pnpm run --filter server test",
"server:build": "pnpm run --filter server build",
"server:coverage": "pnpm run --filter server test --coverage",
@@ -52,16 +53,16 @@
},
"private": true,
"devDependencies": {
- "@electron/rebuild": "4.0.3",
+ "@electron/rebuild": "4.0.4",
"@fast-csv/parse": "5.0.5",
"@playwright/test": "1.59.1",
"@triliumnext/server": "workspace:*",
"@types/express": "5.0.6",
"@types/js-yaml": "4.0.9",
"@types/node": "24.12.2",
- "@vitest/browser-webdriverio": "4.1.4",
- "@vitest/coverage-v8": "4.1.4",
- "@vitest/ui": "4.1.4",
+ "@vitest/browser-webdriverio": "4.1.5",
+ "@vitest/coverage-v8": "4.1.5",
+ "@vitest/ui": "4.1.5",
"chalk": "5.6.2",
"cross-env": "10.1.0",
"dpdm": "4.0.1",
@@ -69,7 +70,7 @@
"eslint": "10.2.1",
"eslint-config-preact": "2.0.0",
"eslint-config-prettier": "10.1.8",
- "eslint-plugin-playwright": "2.10.1",
+ "eslint-plugin-playwright": "2.10.2",
"eslint-plugin-simple-import-sort": "13.0.0",
"happy-dom": "20.9.0",
"http-server": "14.1.1",
@@ -81,10 +82,10 @@
"tslib": "2.8.1",
"tsx": "4.21.0",
"typescript": "6.0.3",
- "typescript-eslint": "8.58.2",
- "vite": "8.0.8",
+ "typescript-eslint": "8.59.0",
+ "vite": "8.0.9",
"vite-plugin-dts": "4.5.4",
- "vitest": "4.1.4"
+ "vitest": "4.1.5"
},
"license": "AGPL-3.0-only",
"author": {
@@ -100,7 +101,7 @@
"url": "https://github.com/TriliumNext/Trilium/issues"
},
"homepage": "https://triliumnotes.org",
- "packageManager": "pnpm@10.33.0",
+ "packageManager": "pnpm@10.33.1",
"pnpm": {
"patchedDependencies": {
"@ckeditor/ckeditor5-mention": "patches/@ckeditor__ckeditor5-mention.patch",
diff --git a/packages/ckeditor5-admonition/package.json b/packages/ckeditor5-admonition/package.json
index d91dd13368..43df2f8eb5 100644
--- a/packages/ckeditor5-admonition/package.json
+++ b/packages/ckeditor5-admonition/package.json
@@ -18,22 +18,22 @@
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": ">=4.1.0",
- "@typescript-eslint/eslint-plugin": "8.58.2",
- "@typescript-eslint/parser": "8.58.2",
- "@vitest/browser": "4.1.4",
- "@vitest/coverage-istanbul": "4.1.4",
- "ckeditor5": "48.0.0",
+ "@typescript-eslint/eslint-plugin": "8.59.0",
+ "@typescript-eslint/parser": "8.59.0",
+ "@vitest/browser": "4.1.5",
+ "@vitest/coverage-istanbul": "4.1.5",
+ "ckeditor5": "48.0.1",
"eslint": "10.2.1",
"eslint-config-ckeditor5": ">=9.1.0",
- "stylelint": "17.7.0",
+ "stylelint": "17.8.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"typescript": "6.0.3",
"vite-plugin-svgo": "2.0.0",
- "vitest": "4.1.4",
+ "vitest": "4.1.5",
"webdriverio": "9.27.0"
},
"peerDependencies": {
- "ckeditor5": "48.0.0"
+ "ckeditor5": "48.0.1"
},
"author": "Elian Doran ",
"license": "GPL-2.0-or-later",
diff --git a/packages/ckeditor5-footnotes/package.json b/packages/ckeditor5-footnotes/package.json
index 5b0a0a0bbb..db314142bd 100644
--- a/packages/ckeditor5-footnotes/package.json
+++ b/packages/ckeditor5-footnotes/package.json
@@ -19,22 +19,22 @@
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": ">=4.1.0",
- "@typescript-eslint/eslint-plugin": "8.58.2",
- "@typescript-eslint/parser": "8.58.2",
- "@vitest/browser": "4.1.4",
- "@vitest/coverage-istanbul": "4.1.4",
- "ckeditor5": "48.0.0",
+ "@typescript-eslint/eslint-plugin": "8.59.0",
+ "@typescript-eslint/parser": "8.59.0",
+ "@vitest/browser": "4.1.5",
+ "@vitest/coverage-istanbul": "4.1.5",
+ "ckeditor5": "48.0.1",
"eslint": "10.2.1",
"eslint-config-ckeditor5": ">=9.1.0",
- "stylelint": "17.7.0",
+ "stylelint": "17.8.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"typescript": "6.0.3",
"vite-plugin-svgo": "2.0.0",
- "vitest": "4.1.4",
+ "vitest": "4.1.5",
"webdriverio": "9.27.0"
},
"peerDependencies": {
- "ckeditor5": "48.0.0"
+ "ckeditor5": "48.0.1"
},
"scripts": {
"lint": "eslint \"**/*.{js,ts}\" --quiet",
diff --git a/packages/ckeditor5-keyboard-marker/package.json b/packages/ckeditor5-keyboard-marker/package.json
index 5aadcb08f3..934956eb7e 100644
--- a/packages/ckeditor5-keyboard-marker/package.json
+++ b/packages/ckeditor5-keyboard-marker/package.json
@@ -21,22 +21,22 @@
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": ">=4.1.0",
- "@typescript-eslint/eslint-plugin": "8.58.2",
- "@typescript-eslint/parser": "8.58.2",
- "@vitest/browser": "4.1.4",
- "@vitest/coverage-istanbul": "4.1.4",
- "ckeditor5": "48.0.0",
+ "@typescript-eslint/eslint-plugin": "8.59.0",
+ "@typescript-eslint/parser": "8.59.0",
+ "@vitest/browser": "4.1.5",
+ "@vitest/coverage-istanbul": "4.1.5",
+ "ckeditor5": "48.0.1",
"eslint": "10.2.1",
"eslint-config-ckeditor5": ">=9.1.0",
- "stylelint": "17.7.0",
+ "stylelint": "17.8.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"typescript": "6.0.3",
"vite-plugin-svgo": "2.0.0",
- "vitest": "4.1.4",
+ "vitest": "4.1.5",
"webdriverio": "9.27.0"
},
"peerDependencies": {
- "ckeditor5": "48.0.0"
+ "ckeditor5": "48.0.1"
},
"scripts": {
"lint": "eslint \"**/*.{js,ts}\" --quiet",
diff --git a/packages/ckeditor5-keyboard-marker/src/kbdediting.ts b/packages/ckeditor5-keyboard-marker/src/kbdediting.ts
index 44db8299c3..7c119d22fd 100644
--- a/packages/ckeditor5-keyboard-marker/src/kbdediting.ts
+++ b/packages/ckeditor5-keyboard-marker/src/kbdediting.ts
@@ -1,4 +1,4 @@
-import { AttributeCommand, Plugin } from "ckeditor5";
+import { AttributeCommand, Plugin, TwoStepCaretMovement } from "ckeditor5";
const KBD = 'kbd';
@@ -14,6 +14,10 @@ export default class KbdEditing extends Plugin {
return 'KbdEditing' as const;
}
+ public static get requires() {
+ return [ TwoStepCaretMovement ] as const;
+ }
+
/**
* @inheritDoc
*/
@@ -27,9 +31,17 @@ export default class KbdEditing extends Plugin {
copyOnEnter: true
} );
+ // Enable two-step caret movement so the user can arrow out of the kbd element.
+ editor.plugins.get( TwoStepCaretMovement ).registerAttribute( KBD );
+
editor.conversion.attributeToElement( {
model: KBD,
- view: KBD
+ view: {
+ name: KBD,
+ attributes: {
+ spellcheck: 'false'
+ }
+ }
} );
editor.commands.add( KBD, new AttributeCommand( editor, KBD ) );
diff --git a/packages/ckeditor5-math/package.json b/packages/ckeditor5-math/package.json
index 22e3019405..ea18cf9570 100644
--- a/packages/ckeditor5-math/package.json
+++ b/packages/ckeditor5-math/package.json
@@ -21,22 +21,22 @@
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": ">=4.1.0",
- "@typescript-eslint/eslint-plugin": "8.58.2",
- "@typescript-eslint/parser": "8.58.2",
- "@vitest/browser": "4.1.4",
- "@vitest/coverage-istanbul": "4.1.4",
- "ckeditor5": "48.0.0",
+ "@typescript-eslint/eslint-plugin": "8.59.0",
+ "@typescript-eslint/parser": "8.59.0",
+ "@vitest/browser": "4.1.5",
+ "@vitest/coverage-istanbul": "4.1.5",
+ "ckeditor5": "48.0.1",
"eslint": "10.2.1",
"eslint-config-ckeditor5": ">=9.1.0",
- "stylelint": "17.7.0",
+ "stylelint": "17.8.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"typescript": "6.0.3",
"vite-plugin-svgo": "2.0.0",
- "vitest": "4.1.4",
+ "vitest": "4.1.5",
"webdriverio": "9.27.0"
},
"peerDependencies": {
- "ckeditor5": "48.0.0"
+ "ckeditor5": "48.0.1"
},
"scripts": {
"lint": "eslint \"**/*.{js,ts}\" --quiet",
@@ -45,7 +45,7 @@
"test:debug": "vitest --inspect-brk --no-file-parallelism --browser.headless=false"
},
"dependencies": {
- "@ckeditor/ckeditor5-icons": "48.0.0",
+ "@ckeditor/ckeditor5-icons": "48.0.1",
"mathlive": "0.109.1"
}
}
diff --git a/packages/ckeditor5-mermaid/package.json b/packages/ckeditor5-mermaid/package.json
index a5b6fdf901..1ba639c4f2 100644
--- a/packages/ckeditor5-mermaid/package.json
+++ b/packages/ckeditor5-mermaid/package.json
@@ -21,22 +21,22 @@
},
"devDependencies": {
"@ckeditor/ckeditor5-inspector": ">=4.1.0",
- "@typescript-eslint/eslint-plugin": "8.58.2",
- "@typescript-eslint/parser": "8.58.2",
- "@vitest/browser": "4.1.4",
- "@vitest/coverage-istanbul": "4.1.4",
- "ckeditor5": "48.0.0",
+ "@typescript-eslint/eslint-plugin": "8.59.0",
+ "@typescript-eslint/parser": "8.59.0",
+ "@vitest/browser": "4.1.5",
+ "@vitest/coverage-istanbul": "4.1.5",
+ "ckeditor5": "48.0.1",
"eslint": "10.2.1",
"eslint-config-ckeditor5": ">=9.1.0",
- "stylelint": "17.7.0",
+ "stylelint": "17.8.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"typescript": "6.0.3",
"vite-plugin-svgo": "2.0.0",
- "vitest": "4.1.4",
+ "vitest": "4.1.5",
"webdriverio": "9.27.0"
},
"peerDependencies": {
- "ckeditor5": "48.0.0"
+ "ckeditor5": "48.0.1"
},
"scripts": {
"lint": "eslint \"**/*.{js,ts}\" --quiet",
diff --git a/packages/ckeditor5/package.json b/packages/ckeditor5/package.json
index 13fc4e4a93..e4ee0e7cd0 100644
--- a/packages/ckeditor5/package.json
+++ b/packages/ckeditor5/package.json
@@ -12,7 +12,7 @@
"@triliumnext/ckeditor5-keyboard-marker": "workspace:*",
"@triliumnext/ckeditor5-math": "workspace:*",
"@triliumnext/ckeditor5-mermaid": "workspace:*",
- "ckeditor5": "48.0.0",
- "ckeditor5-premium-features": "48.0.0"
+ "ckeditor5": "48.0.1",
+ "ckeditor5-premium-features": "48.0.1"
}
}
diff --git a/packages/codemirror/package.json b/packages/codemirror/package.json
index bebd4d51d1..983dd651fd 100644
--- a/packages/codemirror/package.json
+++ b/packages/codemirror/package.json
@@ -17,9 +17,9 @@
"@codemirror/lang-vue": "0.1.3",
"@codemirror/lang-xml": "6.1.0",
"@codemirror/legacy-modes": "6.5.2",
- "@codemirror/search": "6.6.0",
+ "@codemirror/search": "6.7.0",
"@codemirror/state": "6.6.0",
- "@codemirror/view": "6.41.0",
+ "@codemirror/view": "6.41.1",
"@eslint/js": "10.0.1",
"@fsegurai/codemirror-theme-abcdef": "6.2.5",
"@fsegurai/codemirror-theme-abyss": "6.2.5",
diff --git a/packages/commons/package.json b/packages/commons/package.json
index 97808bc76f..496497d1bf 100644
--- a/packages/commons/package.json
+++ b/packages/commons/package.json
@@ -16,6 +16,7 @@
},
"dependencies": {
"dayjs": "1.11.20",
- "marked": "18.0.1"
+ "marked": "18.0.2",
+ "marked-footnote": "1.4.0"
}
}
\ No newline at end of file
diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts
index 8c2cfc595c..ebcf3ac56b 100644
--- a/packages/commons/src/index.ts
+++ b/packages/commons/src/index.ts
@@ -16,6 +16,7 @@ export * from "./lib/dayjs.js";
export * from "./lib/notes.js";
export * from "./lib/week_utils.js";
export { default as BUILTIN_ATTRIBUTES } from "./lib/builtin_attributes.js";
+export * from "./lib/spreadsheet/extract_text.js";
export * from "./lib/spreadsheet/render_to_html.js";
export * from "./lib/llm_api.js";
export * from "./lib/marked_extensions.js";
diff --git a/packages/commons/src/lib/markdown_renderer.ts b/packages/commons/src/lib/markdown_renderer.ts
index 1afcc48057..51ea850ca0 100644
--- a/packages/commons/src/lib/markdown_renderer.ts
+++ b/packages/commons/src/lib/markdown_renderer.ts
@@ -1,4 +1,5 @@
import { Marked, Renderer, type Tokens } from "marked";
+import markedFootnote from "marked-footnote";
import { getMimeTypeFromMarkdownName, MIME_TYPE_AUTO, normalizeMimeTypeForCKEditor } from "./mime_type.js";
import {
@@ -48,6 +49,14 @@ export interface RenderToHtmlOptions {
* preview) so authored H1s are shown as-is.
*/
demoteH1?: boolean;
+ /**
+ * Optional custom renderer — defaults to {@link CustomMarkdownRenderer}.
+ * Callers that need caller-specific output (e.g. the Markdown live preview
+ * suppressing the auto-language fallback on unlabeled fences) can subclass
+ * and pass an instance. A fresh instance should be passed per call since
+ * marked attaches a parser to the renderer during parsing.
+ */
+ renderer?: Renderer;
}
function escapeHtml(str: string): string {
@@ -160,8 +169,12 @@ function restoreFromMap(text: string, map: Map): string {
/**
* Keep renderer code up to date with https://github.com/markedjs/marked/blob/master/src/Renderer.ts.
+ *
+ * Exported so callers can subclass and override specific methods (e.g. `code()`) for
+ * caller-specific output, then pass the subclass instance through
+ * {@link RenderToHtmlOptions.renderer}.
*/
-class CustomMarkdownRenderer extends Renderer {
+export class CustomMarkdownRenderer extends Renderer {
override heading(data: Tokens.Heading): string {
if (data.depth === 1) {
@@ -274,7 +287,8 @@ export function renderToHtml(content: string, title: string, options: RenderToHt
const { processedText, placeholderMap: formulaMap } = extractFormulas(content);
- const marked = new Marked({ async: false });
+ const marked = new Marked({ async: false, gfm: true });
+ marked.use(markedFootnote());
marked.use({
// Order is important, especially for wikilinks.
extensions: [
@@ -283,7 +297,7 @@ export function renderToHtml(content: string, title: string, options: RenderToHt
]
});
- const renderer = new CustomMarkdownRenderer({ async: false });
+ const renderer = options.renderer ?? new CustomMarkdownRenderer({ async: false });
let html = marked.parse(processedText, { async: false, renderer }) as string;
html = restoreFromMap(html, formulaMap);
diff --git a/packages/commons/src/lib/server_api.ts b/packages/commons/src/lib/server_api.ts
index 2ea0bea19b..983b794c90 100644
--- a/packages/commons/src/lib/server_api.ts
+++ b/packages/commons/src/lib/server_api.ts
@@ -309,6 +309,7 @@ export interface OCRProcessResponse {
extractedAt: string;
language?: string;
pageCount?: number;
+ processingType?: string;
};
/** The minimum confidence threshold that was applied (0-1 scale). */
minConfidence?: number;
diff --git a/packages/commons/src/lib/spreadsheet/extract_text.spec.ts b/packages/commons/src/lib/spreadsheet/extract_text.spec.ts
new file mode 100644
index 0000000000..714dca28f3
--- /dev/null
+++ b/packages/commons/src/lib/spreadsheet/extract_text.spec.ts
@@ -0,0 +1,349 @@
+import { describe, expect, it } from "vitest";
+import { extractSpreadsheetText } from "./extract_text.js";
+
+describe("extractSpreadsheetText", () => {
+ it("extracts cell values from a basic spreadsheet", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0,
+ cellData: {
+ "1": { "1": { v: "The", t: 1 } },
+ "2": { "2": { v: "quick", t: 1 } },
+ "3": { "3": { v: "brown", t: 1 } },
+ "4": { "1": { v: "fox", t: 1 } }
+ },
+ rowData: {},
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toBe("The quick brown fox");
+ });
+
+ it("skips hidden sheets", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1", "s2"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Visible",
+ hidden: 0,
+ cellData: { "0": { "0": { v: "shown" } } },
+ rowData: {},
+ columnData: {}
+ },
+ s2: {
+ id: "s2",
+ name: "Hidden",
+ hidden: 1,
+ cellData: { "0": { "0": { v: "secret" } } },
+ rowData: {},
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toContain("shown");
+ expect(text).not.toContain("secret");
+ });
+
+ it("skips hidden rows", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0,
+ cellData: {
+ "0": { "0": { v: "visible row" } },
+ "1": { "0": { v: "hidden row" } }
+ },
+ rowData: { "1": { hd: 1 } },
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toContain("visible row");
+ expect(text).not.toContain("hidden row");
+ });
+
+ it("skips hidden columns", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0,
+ cellData: {
+ "0": {
+ "0": { v: "visible col" },
+ "1": { v: "hidden col" }
+ }
+ },
+ rowData: {},
+ columnData: { "1": { hd: 1 } }
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toContain("visible col");
+ expect(text).not.toContain("hidden col");
+ });
+
+ it("extracts text from multiple visible sheets", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1", "s2"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Data",
+ hidden: 0,
+ cellData: { "0": { "0": { v: "alpha" } } },
+ rowData: {},
+ columnData: {}
+ },
+ s2: {
+ id: "s2",
+ name: "Summary",
+ hidden: 0,
+ cellData: { "0": { "0": { v: "beta" } } },
+ rowData: {},
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toContain("alpha");
+ expect(text).toContain("beta");
+ });
+
+ it("handles boolean values", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0,
+ cellData: {
+ "0": {
+ "0": { v: true, t: 3 },
+ "1": { v: false, t: 3 }
+ }
+ },
+ rowData: {},
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toContain("TRUE");
+ expect(text).toContain("FALSE");
+ });
+
+ it("handles numeric values", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0,
+ cellData: {
+ "0": { "0": { v: 42 }, "1": { v: 3.14 } }
+ },
+ rowData: {},
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toContain("42");
+ expect(text).toContain("3.14");
+ });
+
+ it("skips cells with null or undefined values", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0,
+ cellData: {
+ "0": {
+ "0": { v: "data" },
+ "1": { v: null },
+ "2": {},
+ "3": { s: "someStyle" }
+ }
+ },
+ rowData: {},
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toBe("data");
+ });
+
+ it("returns empty string for invalid JSON", () => {
+ expect(extractSpreadsheetText("not json")).toBe("");
+ });
+
+ it("returns empty string for empty workbook", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0,
+ cellData: {},
+ rowData: {},
+ columnData: {}
+ }
+ }
+ }
+ });
+
+ expect(extractSpreadsheetText(input)).toBe("");
+ });
+
+ it("returns empty string for missing workbook", () => {
+ expect(extractSpreadsheetText(JSON.stringify({ version: 1 }))).toBe("");
+ });
+
+ it("handles sheet with missing cellData", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "Sheet1",
+ hidden: 0
+ }
+ }
+ }
+ });
+
+ expect(extractSpreadsheetText(input)).toBe("");
+ });
+
+ it("handles lowercased JSON from normalize()", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ sheetOrder: ["s1"],
+ sheets: {
+ s1: {
+ id: "s1",
+ name: "sheet1",
+ hidden: 0,
+ cellData: {
+ "0": { "0": { v: "hello" } }
+ },
+ rowData: { "1": { hd: 1 } },
+ columnData: { "2": { hd: 1 } }
+ }
+ }
+ }
+ }).toLowerCase();
+
+ expect(extractSpreadsheetText(input)).toBe("hello");
+ });
+
+ it("extracts text from the sample spreadsheet", () => {
+ const input = JSON.stringify({
+ version: 1,
+ workbook: {
+ id: "vlyRSv",
+ sheetOrder: ["YdJwCRPZnEn4twLYtcdrE"],
+ name: "",
+ appVersion: "0.20.1",
+ locale: "zhCN",
+ styles: {
+ yIwJoC: { bl: 1 },
+ bTNHmx: { it: 1 },
+ "6ZCsr1": { ff: "Arial" }
+ },
+ sheets: {
+ YdJwCRPZnEn4twLYtcdrE: {
+ id: "YdJwCRPZnEn4twLYtcdrE",
+ name: "Sheet1",
+ hidden: 0,
+ rowCount: 1000,
+ columnCount: 20,
+ defaultColumnWidth: 88,
+ defaultRowHeight: 24,
+ mergeData: [],
+ cellData: {
+ "1": { "1": { v: "The", t: 1 } },
+ "2": { "2": { v: "quick", t: 1 } },
+ "3": { "3": { s: "yIwJoC", v: "brown", t: 1 } },
+ "4": { "1": { s: "bTNHmx", v: "fox", t: 1 } },
+ "8": {
+ "0": { s: "6ZCsr1" },
+ "3": { v: "This text is available only in the spreadsheet", t: 1 }
+ }
+ },
+ rowData: {},
+ columnData: {},
+ showGridlines: 1
+ }
+ }
+ }
+ });
+
+ const text = extractSpreadsheetText(input);
+ expect(text).toContain("The");
+ expect(text).toContain("quick");
+ expect(text).toContain("brown");
+ expect(text).toContain("fox");
+ expect(text).toContain("This text is available only in the spreadsheet");
+ });
+});
diff --git a/packages/commons/src/lib/spreadsheet/extract_text.ts b/packages/commons/src/lib/spreadsheet/extract_text.ts
new file mode 100644
index 0000000000..ff38abdb2a
--- /dev/null
+++ b/packages/commons/src/lib/spreadsheet/extract_text.ts
@@ -0,0 +1,86 @@
+/**
+ * Extracts plain text from a UniversJS workbook JSON structure for full-text search indexing.
+ * Mirrors the traversal logic of {@link renderSpreadsheetToHtml}: only visible sheets,
+ * skipping hidden rows and columns.
+ *
+ * Handles both original camelCase keys and lowercased keys (the search preprocessor
+ * runs `normalize()` on content before passing it here, which lowercases the entire
+ * JSON string).
+ */
+
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
+/** Read a property by trying the camelCase name first, then the lowercased form. */
+function prop(obj: any, camel: string): any {
+ if (obj == null) return undefined;
+ return obj[camel] ?? obj[camel.toLowerCase()];
+}
+
+/**
+ * Parses the raw JSON content of a spreadsheet note and extracts all visible
+ * cell values as a single plain-text string (space-separated).
+ *
+ * Returns an empty string for invalid or empty spreadsheets.
+ */
+export function extractSpreadsheetText(jsonContent: string): string {
+ let data: any;
+ try {
+ data = JSON.parse(jsonContent);
+ } catch {
+ return "";
+ }
+
+ const workbook = prop(data, "workbook");
+ const sheets = workbook && prop(workbook, "sheets");
+ if (!sheets) {
+ return "";
+ }
+
+ const sheetOrder: string[] | undefined = prop(workbook, "sheetOrder");
+ const sheetIds = sheetOrder ?? Object.keys(sheets);
+ const visibleSheets = sheetIds
+ .map((id: string) => sheets[id])
+ .filter((s: any) => s && !prop(s, "hidden"));
+
+ if (visibleSheets.length === 0) {
+ return "";
+ }
+
+ const parts: string[] = [];
+ for (const sheet of visibleSheets) {
+ extractSheetText(sheet, parts);
+ }
+
+ return parts.join(" ");
+}
+
+function extractSheetText(sheet: any, parts: string[]): void {
+ const cellData = prop(sheet, "cellData");
+ if (!cellData) return;
+
+ const rowData = prop(sheet, "rowData") ?? {};
+ const columnData = prop(sheet, "columnData") ?? {};
+
+ for (const rowStr of Object.keys(cellData)) {
+ const row = Number(rowStr);
+ if (prop(rowData[row], "hd")) continue;
+
+ const cols = cellData[row];
+ for (const colStr of Object.keys(cols)) {
+ const col = Number(colStr);
+ if (prop(columnData[col], "hd")) continue;
+
+ const cell = cols[col];
+ if (cell?.v == null) continue;
+
+ if (typeof cell.v === "boolean") {
+ parts.push(cell.v ? "TRUE" : "FALSE");
+ } else {
+ const text = String(cell.v).trim();
+ if (text) {
+ parts.push(text);
+ }
+ }
+ }
+ }
+}
diff --git a/packages/pdfjs-viewer/src/annotations.spec.ts b/packages/pdfjs-viewer/src/annotations.spec.ts
new file mode 100644
index 0000000000..23cb7866db
--- /dev/null
+++ b/packages/pdfjs-viewer/src/annotations.spec.ts
@@ -0,0 +1,81 @@
+import { describe, expect, it } from "vitest";
+import { processAnnotation, AnnotationType, rgbToHex } from "./annotations";
+
+const SAMPLE_HIGHLIGHT = {
+ annotationType: 9,
+ annotationFlags: 4,
+ borderStyle: { width: 0, rawWidth: 1, style: 1, dashArray: [3], horizontalCornerRadius: 0, verticalCornerRadius: 0 },
+ color: { "0": 128, "1": 235, "2": 255 },
+ backgroundColor: null,
+ borderColor: null,
+ rotation: 0,
+ contentsObj: { str: "Comment goes here.", dir: "ltr" },
+ hasAppearance: true,
+ id: "18R",
+ modificationDate: null,
+ rect: [352.43, 276.30, 489.91, 314.61],
+ subtype: "Highlight",
+ hasOwnCanvas: false,
+ noRotate: false,
+ noHTML: false,
+ isEditable: true,
+ structParent: -1,
+ titleObj: { str: "", dir: "ltr" },
+ creationDate: "D:20260425093822",
+ popupRef: "24R",
+ opacity: 1,
+ quadPoints: { "0": 353.35, "1": 313.98, "2": 489.05, "3": 313.98, "4": 353.35, "5": 276.95, "6": 489.05, "7": 276.95 },
+ overlaidText: "First slide"
+};
+
+describe("processAnnotation", () => {
+ it("extracts all fields from a highlight annotation", () => {
+ const result = processAnnotation(SAMPLE_HIGHLIGHT, 3)!;
+ expect(result).not.toBeNull();
+ expect(result.id).toBe("18R");
+ expect(result.type).toBe("highlight");
+ expect(result.contents).toBe("Comment goes here.");
+ expect(result.highlightedText).toBe("First slide");
+ expect(result.author).toBe("");
+ expect(result.pageNumber).toBe(3);
+ expect(result.color).toBe("#80ebff");
+ expect(result.creationDate).toBe("D:20260425093822");
+ expect(result.modificationDate).toBeNull();
+ });
+
+ it("extracts author from titleObj.str", () => {
+ const withAuthor = { ...SAMPLE_HIGHLIGHT, titleObj: { str: "John Doe", dir: "ltr" } };
+ expect(processAnnotation(withAuthor, 1)!.author).toBe("John Doe");
+ });
+
+ it("skips non-comment types and empty annotations", () => {
+ const link = { ...SAMPLE_HIGHLIGHT, annotationType: 2 }; // LINK
+ expect(processAnnotation(link, 1)).toBeNull();
+
+ const empty = { ...SAMPLE_HIGHLIGHT, contentsObj: { str: "", dir: "ltr" }, overlaidText: "" };
+ expect(processAnnotation(empty, 1)).toBeNull();
+ });
+
+ it("keeps annotations with only one of contents or highlightedText", () => {
+ const highlightOnly = { ...SAMPLE_HIGHLIGHT, contentsObj: { str: "", dir: "ltr" } };
+ expect(processAnnotation(highlightOnly, 1)).not.toBeNull();
+ expect(processAnnotation(highlightOnly, 1)!.highlightedText).toBe("First slide");
+
+ const commentOnly = { ...SAMPLE_HIGHLIGHT, annotationType: AnnotationType.TEXT, overlaidText: undefined };
+ expect(processAnnotation(commentOnly, 1)).not.toBeNull();
+ expect(processAnnotation(commentOnly, 1)!.contents).toBe("Comment goes here.");
+ });
+
+ it("handles null color", () => {
+ expect(processAnnotation({ ...SAMPLE_HIGHLIGHT, color: null }, 1)!.color).toBeNull();
+ });
+});
+
+describe("rgbToHex", () => {
+ it("converts various color formats to hex", () => {
+ expect(rgbToHex({ 0: 128, 1: 235, 2: 255 })).toBe("#80ebff");
+ expect(rgbToHex([255, 0, 0])).toBe("#ff0000");
+ expect(rgbToHex([0, 0, 0])).toBe("#000000");
+ expect(rgbToHex([255, 255, 255])).toBe("#ffffff");
+ });
+});
diff --git a/packages/pdfjs-viewer/src/annotations.ts b/packages/pdfjs-viewer/src/annotations.ts
new file mode 100644
index 0000000000..2d33c36b28
--- /dev/null
+++ b/packages/pdfjs-viewer/src/annotations.ts
@@ -0,0 +1,201 @@
+// PDF annotation type constants (from PDF spec / pdfjs-dist AnnotationType)
+export const AnnotationType = {
+ TEXT: 1,
+ HIGHLIGHT: 9,
+} as const;
+
+/** Annotation types we display in the sidebar. */
+const COMMENT_TYPES = new Set([
+ AnnotationType.TEXT,
+ AnnotationType.HIGHLIGHT,
+]);
+
+const TYPE_NAMES: Record = {
+ [AnnotationType.TEXT]: "text",
+ [AnnotationType.HIGHLIGHT]: "highlight",
+};
+
+/**
+ * Process a raw PDF.js annotation object into a normalized PdfAnnotationInfo,
+ * or return null if it should be skipped.
+ */
+export function processAnnotation(ann: Record, pageNumber: number): PdfAnnotationInfo | null {
+ if (!COMMENT_TYPES.has(ann.annotationType)) {
+ return null;
+ }
+
+ const contents = ann.contentsObj?.str || "";
+ const highlightedText = ann.overlaidText || "";
+
+ // Skip annotations that have no meaningful content
+ if (!contents && !highlightedText) {
+ return null;
+ }
+
+ return {
+ id: ann.id,
+ type: TYPE_NAMES[ann.annotationType] ?? "unknown",
+ contents,
+ highlightedText,
+ author: ann.titleObj?.str || "",
+ pageNumber,
+ color: ann.color ? rgbToHex(ann.color) : null,
+ creationDate: ann.creationDate || null,
+ modificationDate: ann.modificationDate || null
+ };
+}
+
+export async function setupPdfAnnotations() {
+ await extractAndSendAnnotations();
+
+ window.addEventListener("message", (event) => {
+ if (event.origin !== window.location.origin) return;
+
+ if (event.data?.type === "trilium-scroll-to-annotation") {
+ scrollToAnnotation(event.data.annotationId, event.data.pageNumber);
+ }
+ });
+}
+
+/**
+ * Must be called AFTER manageSave() so we can chain onto the
+ * onSetModified callback it installs.
+ */
+export function setupAnnotationLiveUpdates() {
+ const app = window.PDFViewerApplication!;
+ const storage = app.pdfDocument.annotationStorage;
+
+ let debounceTimer: number | null = null;
+ const debouncedRefresh = () => {
+ if (debounceTimer) clearTimeout(debounceTimer);
+ debounceTimer = window.setTimeout(() => extractAndSendAnnotations(), 500);
+ };
+
+ // Chain onto the existing onSetModified set by manageSave.
+ // Fires when annotations are added/removed.
+ const previousOnSetModified = (storage as any).onSetModified;
+ (storage as any).onSetModified = () => {
+ previousOnSetModified?.();
+ debouncedRefresh();
+ };
+
+ // Fires when editor properties change (e.g. color, thickness).
+ app.eventBus.on("annotationeditorparamschanged", debouncedRefresh);
+
+ // Catches deletions, undo/redo, and comment deletion which
+ // don't trigger onSetModified or annotationeditorparamschanged.
+ app.eventBus.on("editingstateschanged", debouncedRefresh);
+}
+
+async function extractAndSendAnnotations() {
+ const app = window.PDFViewerApplication;
+ try {
+ const annotations = await extractFromDocument(app.pdfDocument);
+ applyEditorOverrides(annotations, app.pdfDocument.annotationStorage);
+ sendAnnotations(annotations);
+ } catch (error) {
+ console.error("Error extracting annotations:", error);
+ sendAnnotations([]);
+ }
+}
+
+/**
+ * Re-extract annotations from freshly saved PDF bytes.
+ * Opens a temporary document to read the latest data (including
+ * newly created highlights with their overlaidText), then closes it.
+ */
+export async function extractFromSavedData(data: ArrayBuffer | Uint8Array) {
+ try {
+ const tempDoc = await (globalThis as any).pdfjsLib.getDocument({ data }).promise;
+ const annotations = await extractFromDocument(tempDoc);
+ tempDoc.destroy();
+ sendAnnotations(annotations);
+ } catch (error) {
+ console.error("Error extracting annotations from saved data:", error);
+ }
+}
+
+async function extractFromDocument(pdfDocument: any): Promise {
+ const numPages = pdfDocument.numPages;
+ const annotations: PdfAnnotationInfo[] = [];
+
+ for (let i = 1; i <= numPages; i++) {
+ const page = await pdfDocument.getPage(i);
+ const pageAnnotations = await page.getAnnotations({ intent: "display" });
+
+ for (const ann of pageAnnotations) {
+ const processed = processAnnotation(ann, i);
+ if (processed) {
+ annotations.push(processed);
+ }
+ }
+ }
+
+ return annotations;
+}
+
+function applyEditorOverrides(annotations: PdfAnnotationInfo[], storage: any) {
+ for (const ann of annotations) {
+ const editor = storage.getEditor?.(ann.id);
+ if (!editor) continue;
+ if (editor.deleted) {
+ annotations.splice(annotations.indexOf(ann), 1);
+ continue;
+ }
+ if (editor.color) {
+ ann.color = editor.color;
+ }
+ if (editor.comment?.text) {
+ ann.contents = editor.comment.text;
+ }
+ }
+}
+
+function sendAnnotations(annotations: PdfAnnotationInfo[]) {
+ window.parent.postMessage({
+ type: "pdfjs-viewer-annotations",
+ annotations
+ } satisfies PdfViewerAnnotationsMessage, window.location.origin);
+}
+
+function scrollToAnnotation(annotationId: string, pageNumber: number) {
+ const app = window.PDFViewerApplication;
+ const container = app.pdfViewer.container as HTMLElement;
+
+ function scrollToEl(el: Element) {
+ const containerRect = container.getBoundingClientRect();
+ const elRect = el.getBoundingClientRect();
+ const offsetTop = elRect.top - containerRect.top + container.scrollTop;
+ container.scrollTo({
+ top: offsetTop - container.clientHeight / 2 + elRect.height / 2,
+ behavior: "smooth"
+ });
+ }
+
+ // Try to find the element directly (nearby pages are pre-rendered)
+ const el = document.querySelector(`[data-annotation-id="${CSS.escape(annotationId)}"]`);
+ if (el) {
+ scrollToEl(el);
+ return;
+ }
+
+ // Element not in DOM yet — jump to the page and wait for it to render
+ app.pdfViewer.currentPageNumber = pageNumber;
+ const observer = new MutationObserver(() => {
+ const el = document.querySelector(`[data-annotation-id="${CSS.escape(annotationId)}"]`);
+ if (el) {
+ observer.disconnect();
+ scrollToEl(el);
+ }
+ });
+ observer.observe(document.getElementById("viewer")!, { childList: true, subtree: true });
+ // Clean up if annotation never appears
+ setTimeout(() => observer.disconnect(), 3000);
+}
+
+export function rgbToHex(rgb: Uint8ClampedArray | Record | number[]): string {
+ const r = rgb[0];
+ const g = rgb[1];
+ const b = rgb[2];
+ return `#${((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1)}`;
+}
diff --git a/packages/pdfjs-viewer/src/custom.css b/packages/pdfjs-viewer/src/custom.css
index 8f7ff95343..54782291f8 100644
--- a/packages/pdfjs-viewer/src/custom.css
+++ b/packages/pdfjs-viewer/src/custom.css
@@ -21,14 +21,20 @@
}
body.read-only-document {
- /* TODO: find a more elegant way to display a PDF in a read only view */
- --toolbar-height: 0;
- .toolbar,
+ #editorModeButtons,
+ #editorModeSeparator,
.editToolbar {
display: none !important;
}
}
+body.no-toolbar {
+ --toolbar-height: 0;
+ .toolbar {
+ display: none !important;
+ }
+}
+
:root button,
:root dialog,
:root #toolbarContainer,
diff --git a/packages/pdfjs-viewer/src/custom.ts b/packages/pdfjs-viewer/src/custom.ts
index 997b8d66f1..4689eef3ba 100644
--- a/packages/pdfjs-viewer/src/custom.ts
+++ b/packages/pdfjs-viewer/src/custom.ts
@@ -3,19 +3,22 @@ import { extractAndSendToc, setupScrollToHeading, setupActiveHeadingTracking } f
import { setupPdfPages } from "./pages";
import { setupPdfAttachments } from "./attachments";
import { setupPdfLayers } from "./layers";
+import { setupPdfAnnotations, setupAnnotationLiveUpdates, extractFromSavedData } from "./annotations";
async function main() {
const urlParams = new URLSearchParams(window.location.search);
const isEditable = urlParams.get("editable") === "1";
+ const hideToolbar = urlParams.get("toolbar") === "0";
document.body.classList.toggle("read-only-document", !isEditable);
+ document.body.classList.toggle("no-toolbar", hideToolbar);
if (urlParams.get("sidebar") === "0") {
hideSidebar();
}
if (isEditable) {
- interceptPersistence(getCustomAppOptions(urlParams));
+ interceptPersistence();
}
configurePdfViewerOptions();
@@ -26,6 +29,12 @@ async function main() {
}
const app = window.PDFViewerApplication;
+ manageParentCommands();
+
+ app.eventBus.on("documentloaded", () => {
+ setupPdfAnnotations();
+ });
+
if (isEditable) {
app.eventBus.on("documentloaded", () => {
manageSave();
@@ -36,22 +45,34 @@ async function main() {
setupPdfPages();
setupPdfAttachments();
setupPdfLayers();
+ // Must be after manageSave() so we chain onto its onSetModified
+ setupAnnotationLiveUpdates();
});
}
await app.initializedPromise;
};
function configurePdfViewerOptions() {
+ const urlParams = new URLSearchParams(window.location.search);
+ const locale = urlParams.get("locale");
+
const pdfOptionsHandler = (event: CustomEvent) => {
if (event.detail?.source === window && window.PDFViewerApplicationOptions) {
window.PDFViewerApplicationOptions.set("disablePreferences", true);
window.PDFViewerApplicationOptions.set("enableHighlightFloatingButton", true);
window.PDFViewerApplicationOptions.set("enableComment", true);
+ if (locale) {
+ window.PDFViewerApplicationOptions.set("localeProperties", { lang: locale });
+ }
}
};
- if (window.parent && window.parent !== window) {
+
+ const isInIframe = window.parent && window.parent !== window;
+ if (isInIframe) {
window.parent.addEventListener("webviewerloaded", pdfOptionsHandler, { once: true });
window.addEventListener("pagehide", () => window.parent?.removeEventListener("webviewerloaded", pdfOptionsHandler));
+ } else {
+ document.addEventListener("webviewerloaded", pdfOptionsHandler, { once: true });
}
}
@@ -67,15 +88,6 @@ function hideSidebar() {
}
}
-function getCustomAppOptions(urlParams: URLSearchParams) {
- return {
- localeProperties: {
- // Read from URL query
- lang: urlParams.get("lang") || "en"
- }
- };
-}
-
function manageSave() {
const app = window.PDFViewerApplication;
const storage = app.pdfDocument.annotationStorage;
@@ -102,6 +114,9 @@ function manageSave() {
ntxId: window.TRILIUM_NTX_ID,
noteId: window.TRILIUM_NOTE_ID
} satisfies PdfDocumentBlobResultMessage, window.location.origin);
+ // Re-extract annotations from the saved data so new
+ // highlights get their overlaidText populated.
+ extractFromSavedData(data);
}
});
@@ -111,6 +126,14 @@ function manageSave() {
app.eventBus.on("switchannotationeditorparams", () => {
onChange();
});
+ // Catches deletions of existing annotations, undo/redo, and comment deletion
+ // which don't trigger onSetModified or switchannotationeditorparams.
+ // Only trigger when there are actual unsaved changes, not on selection.
+ app.eventBus.on("editingstateschanged", ({ details }: { details: Record }) => {
+ if (details.hasSomethingToUndo) {
+ onChange();
+ }
+ });
}
function manageDownload() {
@@ -124,4 +147,18 @@ function manageDownload() {
});
}
+function manageParentCommands() {
+ window.addEventListener("message", event => {
+ if (event.origin !== window.location.origin) return;
+
+ if (event.data?.type === "trilium-print") {
+ window.print();
+ }
+
+ if (event.data?.type === "trilium-find") {
+ window.PDFViewerApplication?.findBar?.open();
+ }
+ });
+}
+
main();
diff --git a/packages/pdfjs-viewer/src/typings.d.ts b/packages/pdfjs-viewer/src/typings.d.ts
index db12b178d0..88797a5ce4 100644
--- a/packages/pdfjs-viewer/src/typings.d.ts
+++ b/packages/pdfjs-viewer/src/typings.d.ts
@@ -44,6 +44,11 @@ declare global {
on(event: string, listener: (...args: any[]) => void): void;
dispatch(event: string, data?: any): void;
};
+ findBar?: {
+ open(): void;
+ close(): void;
+ toggle(): void;
+ };
store: ViewHistory;
};
PDFViewerApplicationOptions?: { set(name: string, value: any): void; }
diff --git a/packages/pdfjs-viewer/vitest.config.ts b/packages/pdfjs-viewer/vitest.config.ts
new file mode 100644
index 0000000000..381fd00be9
--- /dev/null
+++ b/packages/pdfjs-viewer/vitest.config.ts
@@ -0,0 +1,18 @@
+import { defineConfig } from 'vite';
+
+export default defineConfig(() => ({
+ root: __dirname,
+ cacheDir: '../../node_modules/.vite/packages/pdfjs-viewer',
+ plugins: [],
+ test: {
+ 'watch': false,
+ 'globals': true,
+ 'environment': "node",
+ 'include': ["src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
+ 'reporters': ["default"],
+ 'coverage': {
+ 'reportsDirectory': './test-output/vitest/coverage',
+ 'provider': 'v8' as const,
+ }
+ },
+}));
diff --git a/packages/share-theme/package.json b/packages/share-theme/package.json
index ef45676bea..f095993d49 100644
--- a/packages/share-theme/package.json
+++ b/packages/share-theme/package.json
@@ -31,8 +31,8 @@
"devDependencies": {
"@digitak/esrun": "3.2.26",
"@triliumnext/ckeditor5": "workspace:*",
- "@typescript-eslint/eslint-plugin": "8.58.2",
- "@typescript-eslint/parser": "8.58.2",
+ "@typescript-eslint/eslint-plugin": "8.59.0",
+ "@typescript-eslint/parser": "8.59.0",
"dotenv": "17.4.2",
"esbuild": "0.28.0",
"eslint": "10.2.1",
diff --git a/packages/share-theme/src/scripts/index.ts b/packages/share-theme/src/scripts/index.ts
index 83fbd0b1d3..2c7f58bf62 100644
--- a/packages/share-theme/src/scripts/index.ts
+++ b/packages/share-theme/src/scripts/index.ts
@@ -37,7 +37,7 @@ document.addEventListener(
() => {
const noteType = determineNoteType();
- if (noteType === "text") {
+ if (noteType === "text" || document.querySelector("#content.ck-content")) {
setupTextNote();
}
diff --git a/packages/share-theme/src/styles/base.css b/packages/share-theme/src/styles/base.css
index 80129bfcc1..744ee87faa 100644
--- a/packages/share-theme/src/styles/base.css
+++ b/packages/share-theme/src/styles/base.css
@@ -122,6 +122,27 @@ iframe.pdf-view {
display: none;
}
+/* Markdown footnotes (marked-footnote plugin) */
+.ck-content section.footnotes[data-footnotes] {
+ border-top: 1px solid #c4c4c4;
+ margin: 1em 0;
+ padding: 10px;
+ font-size: 0.9em;
+}
+
+.ck-content section.footnotes[data-footnotes] .sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+}
+
+.ck-content section.footnotes[data-footnotes] li:target p {
+ background: #eee;
+ border-radius: 2px;
+}
+
.ck-content .todo-list .todo-list__label > input:before {
background-color: var(--background-primary);
border-color: var(--text-primary) !important;
diff --git a/packages/share-theme/src/templates/page.ejs b/packages/share-theme/src/templates/page.ejs
index be8b2bda8e..e3391e59ba 100644
--- a/packages/share-theme/src/templates/page.ejs
+++ b/packages/share-theme/src/templates/page.ejs
@@ -156,7 +156,7 @@ content = content.replaceAll(headingRe, (...match) => {
-
ck-content<% } %><% if (isEmpty) { %> no-content<% } %>">
+
ck-content<% } %><% if (isEmpty) { %> no-content<% } %>">
<%- renderSnippets("content:start") %>
<%= note.title %>
<% if (isEmpty && (!note.hasVisibleChildren() && note.type !== "book")) { %>
diff --git a/packages/splitjs/package.json b/packages/splitjs/package.json
index ab40f5578f..d56d790753 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.9.0",
- "vitest": "4.1.4"
+ "vitest": "4.1.5"
}
}
diff --git a/packages/trilium-core/src/services/blob.ts b/packages/trilium-core/src/services/blob.ts
index caa4952121..490e27a9fa 100644
--- a/packages/trilium-core/src/services/blob.ts
+++ b/packages/trilium-core/src/services/blob.ts
@@ -52,7 +52,8 @@ function processContent(content: Uint8Array | string | null, isProtected: boolea
}
function calculateContentHash({ blobId, content, textRepresentation }: Pick
) {
- return hash(`${blobId}|${content.toString()}|${textRepresentation ?? ""}`);
+ const textRepresentationSegment = textRepresentation ? `|${textRepresentation}` : "";
+ return hash(`${blobId}|${content.toString()}${textRepresentationSegment}`);
}
export default {
diff --git a/packages/trilium-core/src/services/handlers.ts b/packages/trilium-core/src/services/handlers.ts
index f5b701825b..0ad5d22286 100644
--- a/packages/trilium-core/src/services/handlers.ts
+++ b/packages/trilium-core/src/services/handlers.ts
@@ -102,7 +102,7 @@ eventService.subscribe(eventService.ENTITY_CREATED, ({ entityName, entity }) =>
const content = note.getContent();
if (
- ["text", "code", "mermaid", "canvas", "relationMap", "mindMap", "webView"].includes(note.type) &&
+ note.hasStringContent() &&
typeof content === "string" &&
// if the note has already content we're not going to overwrite it with template's one
(!content || content.trim().length === 0) &&
diff --git a/packages/trilium-core/src/services/notes.ts b/packages/trilium-core/src/services/notes.ts
index 2ecd711f5e..5a34282615 100644
--- a/packages/trilium-core/src/services/notes.ts
+++ b/packages/trilium-core/src/services/notes.ts
@@ -1,4 +1,4 @@
-import { type AttachmentRow, type AttributeRow, type BranchRow, dayjs, type NoteRow, NoteType } from "@triliumnext/commons";
+import { type AttachmentRow, type AttributeRow, type BranchRow, dayjs, type NoteRow, type NoteType } from "@triliumnext/commons";
import fs from "fs";
import html2plaintext from "html2plaintext";
import { t } from "i18next";
@@ -9,10 +9,10 @@ import BAttachment from "../becca/entities/battachment.js";
import BAttribute from "../becca/entities/battribute.js";
import BBranch from "../becca/entities/bbranch.js";
import BNote from "../becca/entities/bnote.js";
-import log, { getLog } from "../services/log.js";
+import { ValidationError } from "../errors.js";
+import { getLog } from "../services/log.js";
import protectedSessionService from "../services/protected_session.js";
-import { newEntityId, quoteRegex, toMap, unescapeHtml } from "./utils/index.js";
-import date_utils from "./utils/date.js";
+import * as cls from "./context.js";
import entityChangesService from "./entity_changes.js";
import eventService from "./events.js";
import imageService from "./image.js";
@@ -20,14 +20,14 @@ import noteTypesService from "./note_types.js";
import optionService from "./options.js";
import request from "./request.js";
import revisionService from "./revisions.js";
-import type TaskContext from "./task_context.js";
-import ws from "./ws.js";
-import { decodeBase64 } from "./utils/binary.js";
-import { getSql } from "./sql/index.js";
import { sanitizeHtml } from "./sanitizer.js";
-import { ValidationError } from "../errors.js";
-import * as cls from "./context.js";
+import { getSql } from "./sql/index.js";
+import type TaskContext from "./task_context.js";
+import { decodeBase64 } from "./utils/binary.js";
+import date_utils from "./utils/date.js";
+import { newEntityId, quoteRegex, toMap, unescapeHtml } from "./utils/index.js";
import { basename } from "./utils/path.js";
+import ws from "./ws.js";
interface FoundLink {
name: "imageLink" | "internalLink" | "includeNoteLink" | "relationMapLink";
@@ -224,6 +224,17 @@ function createNewNote(params: NoteParams): {
throw new Error(error);
}
+ // When creating from a template, inherit the template's type and mime if not explicitly provided.
+ // This ensures binary types (PDF, images, etc.) get the correct mime from the start.
+ if (params.templateNoteId) {
+ const templateNote = becca.getNote(params.templateNoteId);
+ if (templateNote) {
+ if (!params.mime) {
+ params.mime = templateNote.mime;
+ }
+ }
+ }
+
return getSql().transactional(() => {
let note, branch, isEntityEventsDisabled;
@@ -280,6 +291,15 @@ function createNewNote(params: NoteParams): {
throw new Error(`Template note '${params.templateNoteId}' does not exist.`);
}
+ // for binary content types (PDF, images, etc.), copy the template's content directly
+ // since the event handler in handlers.ts only handles string content
+ if (!templateNote.hasStringContent()) {
+ const templateContent = templateNote.getContent();
+ if (templateContent) {
+ note.setContent(templateContent);
+ }
+ }
+
note.addRelation("template", params.templateNoteId);
copyAttachments(templateNote, note);
@@ -694,40 +714,40 @@ function downloadImages(noteId: string, content: string) {
cls.getContext().init(() => {
getSql().transactional(() => {
- const imageNotes = becca.getNotes(Object.values(imageUrlToAttachmentIdMapping), true);
+ const imageNotes = becca.getNotes(Object.values(imageUrlToAttachmentIdMapping), true);
const log = getLog();
- const origNote = becca.getNote(noteId);
+ const origNote = becca.getNote(noteId);
- if (!origNote) {
- log.error(`Cannot find note '${noteId}' to replace image link.`);
- return;
+ if (!origNote) {
+ log.error(`Cannot find note '${noteId}' to replace image link.`);
+ return;
+ }
+
+ const origContent = origNote.getContent();
+ let updatedContent = origContent;
+
+ if (typeof updatedContent !== "string") {
+ log.error(`Note '${noteId}' has a non-string content, cannot replace image link.`);
+ return;
+ }
+
+ for (const url in imageUrlToAttachmentIdMapping) {
+ const imageNote = imageNotes.find((note) => note.noteId === imageUrlToAttachmentIdMapping[url]);
+
+ if (imageNote) {
+ updatedContent = replaceUrl(updatedContent, url, imageNote);
}
+ }
- const origContent = origNote.getContent();
- let updatedContent = origContent;
+ // update only if the links have not been already fixed.
+ if (updatedContent !== origContent) {
+ origNote.setContent(updatedContent);
- if (typeof updatedContent !== "string") {
- log.error(`Note '${noteId}' has a non-string content, cannot replace image link.`);
- return;
- }
+ asyncPostProcessContent(origNote, updatedContent);
- for (const url in imageUrlToAttachmentIdMapping) {
- const imageNote = imageNotes.find((note) => note.noteId === imageUrlToAttachmentIdMapping[url]);
-
- if (imageNote) {
- updatedContent = replaceUrl(updatedContent, url, imageNote);
- }
- }
-
- // update only if the links have not been already fixed.
- if (updatedContent !== origContent) {
- origNote.setContent(updatedContent);
-
- asyncPostProcessContent(origNote, updatedContent);
-
- console.log(`Fixed the image links for note '${noteId}' to the offline saved.`);
- }
+ console.log(`Fixed the image links for note '${noteId}' to the offline saved.`);
+ }
});
});
}, 5000);
diff --git a/packages/trilium-core/src/services/sanitizer.ts b/packages/trilium-core/src/services/sanitizer.ts
index bb0bf96b7d..e1f190735b 100644
--- a/packages/trilium-core/src/services/sanitizer.ts
+++ b/packages/trilium-core/src/services/sanitizer.ts
@@ -43,7 +43,9 @@ export function sanitizeHtml(dirtyHtml: string) {
allowedTags: allowedTags as string[],
allowedAttributes: {
"*": ["class", "style", "title", "src", "href", "hash", "disabled", "align", "alt", "center", "data-*"],
- a: ["id"], // CKEditor bookmark anchors use
+ a: ["id"],
+ h2: ["id"],
+ li: ["id"],
input: ["type", "checked"],
img: ["width", "height"],
code: [ "spellcheck" ]
diff --git a/packages/trilium-core/src/services/search/expressions/note_content_fulltext.ts b/packages/trilium-core/src/services/search/expressions/note_content_fulltext.ts
index 23603d80d0..18a2b45cca 100644
--- a/packages/trilium-core/src/services/search/expressions/note_content_fulltext.ts
+++ b/packages/trilium-core/src/services/search/expressions/note_content_fulltext.ts
@@ -83,7 +83,7 @@ class NoteContentFulltextExp extends Expression {
for (const row of getSql().iterateRows(`
SELECT noteId, type, mime, content, isProtected
FROM notes JOIN blobs USING (blobId)
- WHERE type IN ('text', 'code', 'mermaid', 'canvas', 'mindMap')
+ WHERE type IN ('text', 'code', 'mermaid', 'canvas', 'mindMap', 'spreadsheet')
AND isDeleted = 0
AND LENGTH(content) < ${MAX_SEARCH_CONTENT_SIZE}`)) {
this.findInText(row, inputNoteSet, resultNoteSet);
diff --git a/packages/trilium-core/src/services/search/expressions/note_content_fulltext_preprocessor.ts b/packages/trilium-core/src/services/search/expressions/note_content_fulltext_preprocessor.ts
index f53a941be6..dd48594700 100644
--- a/packages/trilium-core/src/services/search/expressions/note_content_fulltext_preprocessor.ts
+++ b/packages/trilium-core/src/services/search/expressions/note_content_fulltext_preprocessor.ts
@@ -1,3 +1,4 @@
+import { extractSpreadsheetText } from "@triliumnext/commons";
import striptags from "striptags";
import { normalizeSearchText } from "../utils/text_utils";
import { normalize } from "../../utils/index";
@@ -16,6 +17,8 @@ export default function preprocessContent(rawContent: string | Uint8Array, type:
content = processMindmapContent(content);
} else if (type === "canvas" && mime === "application/json") {
content = processCanvasContent(content);
+ } else if (type === "spreadsheet" && mime === "application/json") {
+ content = extractSpreadsheetText(content);
}
return content.trim();
diff --git a/packages/trilium-e2e/src/note_types/pdf.spec.ts b/packages/trilium-e2e/src/note_types/pdf.spec.ts
index d79ddb37e4..f42d7b36c1 100644
--- a/packages/trilium-e2e/src/note_types/pdf.spec.ts
+++ b/packages/trilium-e2e/src/note_types/pdf.spec.ts
@@ -35,7 +35,6 @@ test("Page navigation works", async ({ page, context }) => {
// Check count is correct.
await expect(app.sidebar).toContainText("28 pages");
- expect(await pagesList.locator(".pdf-page-item").count()).toBe(28);
// Go to page 3.
await pagesList.locator(".pdf-page-item").nth(2).click();
diff --git a/packages/turndown-plugin-gfm/package.json b/packages/turndown-plugin-gfm/package.json
index 73e69d148f..62abdf8a98 100644
--- a/packages/turndown-plugin-gfm/package.json
+++ b/packages/turndown-plugin-gfm/package.json
@@ -27,6 +27,6 @@
"devDependencies": {
"happy-dom": "20.9.0",
"turndown": "7.2.4",
- "vitest": "4.1.4"
+ "vitest": "4.1.5"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 59a036f715..ea469b8284 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -85,8 +85,8 @@ importers:
.:
devDependencies:
'@electron/rebuild':
- specifier: 4.0.3
- version: 4.0.3
+ specifier: 4.0.4
+ version: 4.0.4
'@fast-csv/parse':
specifier: 5.0.5
version: 5.0.5
@@ -106,14 +106,14 @@ importers:
specifier: 24.12.2
version: 24.12.2
'@vitest/browser-webdriverio':
- specifier: 4.1.4
- version: 4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
+ specifier: 4.1.5
+ version: 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
'@vitest/coverage-v8':
- specifier: 4.1.4
- version: 4.1.4(@vitest/browser@4.1.4)(vitest@4.1.4)
+ specifier: 4.1.5
+ version: 4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5)
'@vitest/ui':
- specifier: 4.1.4
- version: 4.1.4(vitest@4.1.4)
+ specifier: 4.1.5
+ version: 4.1.5(vitest@4.1.5)
chalk:
specifier: 5.6.2
version: 5.6.2
@@ -136,8 +136,8 @@ importers:
specifier: 10.1.8
version: 10.1.8(eslint@10.2.1(jiti@2.6.1))
eslint-plugin-playwright:
- specifier: 2.10.1
- version: 2.10.1(eslint@10.2.1(jiti@2.6.1))
+ specifier: 2.10.2
+ version: 2.10.2(eslint@10.2.1(jiti@2.6.1))
eslint-plugin-simple-import-sort:
specifier: 13.0.0
version: 13.0.0(eslint@10.2.1(jiti@2.6.1))
@@ -161,7 +161,7 @@ importers:
version: 0.18.0
rollup-plugin-webpack-stats:
specifier: 3.1.1
- version: 3.1.1(rolldown@1.0.0-rc.15)(rollup@4.60.1)(vite@8.0.8(@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.1(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.9(@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
@@ -172,17 +172,17 @@ importers:
specifier: 6.0.3
version: 6.0.3
typescript-eslint:
- specifier: 8.58.2
- version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
vite:
- specifier: 8.0.8
- version: 8.0.8(@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.9
+ version: 8.0.9(@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.3)(vite@8.0.8(@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.3)(vite@8.0.9(@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.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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:
@@ -194,8 +194,8 @@ importers:
version: link:../server
devDependencies:
'@redocly/cli':
- specifier: 2.28.0
- version: 2.28.0(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)
+ specifier: 2.29.1
+ version: 2.29.1(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)
archiver:
specifier: 7.0.1
version: 7.0.1
@@ -215,8 +215,8 @@ importers:
apps/client:
dependencies:
'@excalidraw/excalidraw':
- specifier: 0.18.0
- version: 0.18.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)
+ specifier: 0.18.1
+ version: 0.18.1(@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)
'@fullcalendar/core':
specifier: 6.1.20
version: 6.1.20
@@ -246,7 +246,7 @@ importers:
version: 0.2.1(mermaid@11.14.0)
'@mind-elixir/node-menu':
specifier: 5.0.1
- version: 5.0.1(mind-elixir@5.10.0)
+ version: 5.0.1(mind-elixir@5.11.0)
'@preact/signals':
specifier: 2.9.0
version: 2.9.0(preact@10.29.1)
@@ -314,8 +314,8 @@ importers:
specifier: 3.0.0
version: 3.0.0
dompurify:
- specifier: 3.4.0
- version: 3.4.0
+ specifier: 3.4.1
+ version: 3.4.1
draggabilly:
specifier: 3.0.0
version: 3.0.0
@@ -326,11 +326,11 @@ importers:
specifier: 1.0.5
version: 1.0.5
i18next:
- specifier: 26.0.5
- version: 26.0.5(typescript@6.0.3)
+ specifier: 26.0.6
+ version: 26.0.6(typescript@6.0.3)
i18next-http-backend:
- specifier: 3.0.4
- version: 3.0.4(encoding@0.1.13)
+ specifier: 3.0.5
+ version: 3.0.5(encoding@0.1.13)
jquery:
specifier: 4.0.0
version: 4.0.0
@@ -353,14 +353,14 @@ importers:
specifier: 8.11.1
version: 8.11.1
marked:
- specifier: 18.0.1
- version: 18.0.1
+ specifier: 18.0.2
+ version: 18.0.2
mermaid:
specifier: 11.14.0
version: 11.14.0
mind-elixir:
- specifier: 5.10.0
- version: 5.10.0
+ specifier: 5.11.0
+ version: 5.11.0
panzoom:
specifier: 9.4.4
version: 9.4.4
@@ -369,7 +369,7 @@ importers:
version: 10.29.1
react-i18next:
specifier: 17.0.4
- version: 17.0.4(i18next@26.0.5(typescript@6.0.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.3)
+ version: 17.0.4(i18next@26.0.6(typescript@6.0.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.3)
react-window:
specifier: 2.2.7
version: 2.2.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
@@ -394,7 +394,7 @@ importers:
version: 5.0.0
'@prefresh/vite':
specifier: 3.0.0
- version: 3.0.0(preact@10.29.1)(vite@8.0.8(@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.0.0(preact@10.29.1)(vite@8.0.9(@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
@@ -411,8 +411,8 @@ importers:
specifier: 8.11.12
version: 8.11.12
'@types/tabulator-tables':
- specifier: 6.3.1
- version: 6.3.1
+ specifier: 6.3.2
+ version: 6.3.2
copy-webpack-plugin:
specifier: 14.0.0
version: 14.0.0(webpack@5.105.4(esbuild@0.28.0))
@@ -425,9 +425,12 @@ importers:
script-loader:
specifier: 0.7.2
version: 0.7.2
+ stylelint:
+ specifier: 17.8.0
+ version: 17.8.0(typescript@6.0.3)
vite-plugin-static-copy:
- specifier: 4.0.1
- version: 4.0.1(vite@8.0.8(@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.0
+ version: 4.1.0(vite@8.0.9(@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:
@@ -614,7 +617,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.8(@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.9(@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/aes-js':
specifier: 3.1.4
version: 3.1.4
@@ -653,7 +656,7 @@ importers:
version: 0.7.2
vite-plugin-static-copy:
specifier: 4.0.1
- version: 4.0.1(vite@8.0.8(@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.9(@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:
@@ -674,7 +677,7 @@ importers:
dependencies:
'@electron/remote':
specifier: 2.1.3
- version: 2.1.3(electron@41.2.0)
+ version: 2.1.3(electron@41.3.0)
better-sqlite3:
specifier: 12.9.0
version: 12.9.0
@@ -734,8 +737,8 @@ importers:
specifier: 14.0.0
version: 14.0.0(webpack@5.105.4(esbuild@0.28.0))
electron:
- specifier: 41.2.0
- version: 41.2.0
+ specifier: 41.3.0
+ version: 41.3.0
prebuild-install:
specifier: 7.1.3
version: 7.1.3
@@ -793,8 +796,8 @@ importers:
specifier: 14.0.0
version: 14.0.0(webpack@5.105.4(esbuild@0.28.0))
electron:
- specifier: 41.2.0
- version: 41.2.0
+ specifier: 41.3.0
+ version: 41.3.0
fs-extra:
specifier: 11.3.4
version: 11.3.4
@@ -824,14 +827,16 @@ importers:
specifier: 8.3.1
version: 8.3.1
+ apps/script-deployer: {}
+
apps/server:
dependencies:
'@ai-sdk/anthropic':
- specifier: 3.0.69
- version: 3.0.69(zod@4.3.6)
+ specifier: 3.0.71
+ version: 3.0.71(zod@4.3.6)
'@ai-sdk/google':
- specifier: 3.0.63
- version: 3.0.63(zod@4.3.6)
+ specifier: 3.0.64
+ version: 3.0.64(zod@4.3.6)
'@ai-sdk/openai':
specifier: 3.0.53
version: 3.0.53(zod@4.3.6)
@@ -839,8 +844,8 @@ importers:
specifier: ^1.12.1
version: 1.29.0(zod@4.3.6)
ai:
- specifier: 6.0.161
- version: 6.0.161(zod@4.3.6)
+ specifier: 6.0.168
+ version: 6.0.168(zod@4.3.6)
better-sqlite3:
specifier: 12.9.0
version: 12.9.0
@@ -865,7 +870,7 @@ importers:
version: 7.1.2
'@electron/remote':
specifier: 2.1.3
- version: 2.1.3(electron@41.2.0)
+ version: 2.1.3(electron@41.3.0)
'@triliumnext/commons':
specifier: workspace:*
version: link:../../packages/commons
@@ -978,8 +983,8 @@ importers:
specifier: 5.0.2
version: 5.0.2
electron:
- specifier: 41.2.0
- version: 41.2.0
+ specifier: 41.3.0
+ version: 41.3.0
electron-window-state:
specifier: 5.0.3
version: 5.0.3
@@ -1035,8 +1040,8 @@ importers:
specifier: 1.6.1
version: 1.6.1
marked:
- specifier: 18.0.1
- version: 18.0.1
+ specifier: 18.0.2
+ version: 18.0.2
mime-types:
specifier: 3.0.2
version: 3.0.2
@@ -1083,8 +1088,8 @@ importers:
specifier: 1.8.0
version: 1.8.0
vite:
- specifier: 8.0.8
- version: 8.0.8(@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.9
+ version: 8.0.9(@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
@@ -1100,16 +1105,16 @@ importers:
devDependencies:
'@wxt-dev/auto-icons':
specifier: 1.1.1
- version: 1.1.1(wxt@0.20.24(@types/node@24.12.2)(eslint@10.2.1(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))
+ version: 1.1.1(wxt@0.20.25(@types/node@24.12.2)(eslint@10.2.1(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.24
- version: 0.20.24(@types/node@24.12.2)(eslint@10.2.1(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)
+ specifier: 0.20.25
+ version: 0.20.25(@types/node@24.12.2)(eslint@10.2.1(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:
i18next:
- specifier: 26.0.5
- version: 26.0.5(typescript@6.0.3)
+ specifier: 26.0.6
+ version: 26.0.6(typescript@6.0.3)
preact:
specifier: 10.29.1
version: 10.29.1
@@ -1121,11 +1126,11 @@ importers:
version: 6.6.7(preact@10.29.1)
react-i18next:
specifier: 17.0.4
- version: 17.0.4(i18next@26.0.5(typescript@6.0.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.3)
+ version: 17.0.4(i18next@26.0.6(typescript@6.0.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.3)
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.8(@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.9(@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.1
version: 10.2.1(jiti@2.6.1)
@@ -1139,11 +1144,11 @@ importers:
specifier: 0.4.3
version: 0.4.3
vite:
- specifier: 8.0.8
- version: 8.0.8(@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.9
+ version: 8.0.9(@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.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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:
@@ -1166,11 +1171,11 @@ importers:
specifier: workspace:*
version: link:../commons
ckeditor5:
- specifier: 48.0.0
- version: 48.0.0
+ specifier: 48.0.1
+ version: 48.0.1
ckeditor5-premium-features:
- specifier: 48.0.0
- version: 48.0.0(bufferutil@4.0.9)(ckeditor5@48.0.0)(utf-8-validate@6.0.5)
+ specifier: 48.0.1
+ version: 48.0.1(bufferutil@4.0.9)(ckeditor5@48.0.1)(utf-8-validate@6.0.5)
packages/ckeditor5-admonition:
devDependencies:
@@ -1178,41 +1183,41 @@ importers:
specifier: '>=4.1.0'
version: 5.0.0
'@typescript-eslint/eslint-plugin':
- specifier: 8.58.2
- version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: 8.58.2
- version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@vitest/browser':
- specifier: 4.1.4
- version: 4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)
+ specifier: 4.1.5
+ version: 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)
'@vitest/coverage-istanbul':
- specifier: 4.1.4
- version: 4.1.4(vitest@4.1.4)
+ specifier: 4.1.5
+ version: 4.1.5(vitest@4.1.5)
ckeditor5:
- specifier: 48.0.0
- version: 48.0.0
+ specifier: 48.0.1
+ version: 48.0.1
eslint:
specifier: 10.2.1
version: 10.2.1(jiti@2.6.1)
eslint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ version: 15.0.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
stylelint:
- specifier: 17.7.0
- version: 17.7.0(typescript@6.0.3)
+ specifier: 17.8.0
+ version: 17.8.0(typescript@6.0.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(stylelint@17.7.0(typescript@6.0.3))
+ version: 15.0.0(stylelint@17.8.0(typescript@6.0.3))
typescript:
specifier: 6.0.3
version: 6.0.3
vite-plugin-svgo:
specifier: 2.0.0
- version: 2.0.0(typescript@6.0.3)(vite@8.0.8(@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.3)(vite@8.0.9(@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.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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)
@@ -1223,41 +1228,41 @@ importers:
specifier: '>=4.1.0'
version: 5.0.0
'@typescript-eslint/eslint-plugin':
- specifier: 8.58.2
- version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: 8.58.2
- version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@vitest/browser':
- specifier: 4.1.4
- version: 4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)
+ specifier: 4.1.5
+ version: 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)
'@vitest/coverage-istanbul':
- specifier: 4.1.4
- version: 4.1.4(vitest@4.1.4)
+ specifier: 4.1.5
+ version: 4.1.5(vitest@4.1.5)
ckeditor5:
- specifier: 48.0.0
- version: 48.0.0
+ specifier: 48.0.1
+ version: 48.0.1
eslint:
specifier: 10.2.1
version: 10.2.1(jiti@2.6.1)
eslint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ version: 15.0.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
stylelint:
- specifier: 17.7.0
- version: 17.7.0(typescript@6.0.3)
+ specifier: 17.8.0
+ version: 17.8.0(typescript@6.0.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(stylelint@17.7.0(typescript@6.0.3))
+ version: 15.0.0(stylelint@17.8.0(typescript@6.0.3))
typescript:
specifier: 6.0.3
version: 6.0.3
vite-plugin-svgo:
specifier: 2.0.0
- version: 2.0.0(typescript@6.0.3)(vite@8.0.8(@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.3)(vite@8.0.9(@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.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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)
@@ -1268,41 +1273,41 @@ importers:
specifier: '>=4.1.0'
version: 5.0.0
'@typescript-eslint/eslint-plugin':
- specifier: 8.58.2
- version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: 8.58.2
- version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@vitest/browser':
- specifier: 4.1.4
- version: 4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)
+ specifier: 4.1.5
+ version: 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)
'@vitest/coverage-istanbul':
- specifier: 4.1.4
- version: 4.1.4(vitest@4.1.4)
+ specifier: 4.1.5
+ version: 4.1.5(vitest@4.1.5)
ckeditor5:
- specifier: 48.0.0
- version: 48.0.0
+ specifier: 48.0.1
+ version: 48.0.1
eslint:
specifier: 10.2.1
version: 10.2.1(jiti@2.6.1)
eslint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ version: 15.0.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
stylelint:
- specifier: 17.7.0
- version: 17.7.0(typescript@6.0.3)
+ specifier: 17.8.0
+ version: 17.8.0(typescript@6.0.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(stylelint@17.7.0(typescript@6.0.3))
+ version: 15.0.0(stylelint@17.8.0(typescript@6.0.3))
typescript:
specifier: 6.0.3
version: 6.0.3
vite-plugin-svgo:
specifier: 2.0.0
- version: 2.0.0(typescript@6.0.3)(vite@8.0.8(@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.3)(vite@8.0.9(@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.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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)
@@ -1310,8 +1315,8 @@ importers:
packages/ckeditor5-math:
dependencies:
'@ckeditor/ckeditor5-icons':
- specifier: 48.0.0
- version: 48.0.0
+ specifier: 48.0.1
+ version: 48.0.1
mathlive:
specifier: 0.109.1
version: 0.109.1
@@ -1320,41 +1325,41 @@ importers:
specifier: '>=4.1.0'
version: 5.0.0
'@typescript-eslint/eslint-plugin':
- specifier: 8.58.2
- version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: 8.58.2
- version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@vitest/browser':
- specifier: 4.1.4
- version: 4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)
+ specifier: 4.1.5
+ version: 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)
'@vitest/coverage-istanbul':
- specifier: 4.1.4
- version: 4.1.4(vitest@4.1.4)
+ specifier: 4.1.5
+ version: 4.1.5(vitest@4.1.5)
ckeditor5:
- specifier: 48.0.0
- version: 48.0.0
+ specifier: 48.0.1
+ version: 48.0.1
eslint:
specifier: 10.2.1
version: 10.2.1(jiti@2.6.1)
eslint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ version: 15.0.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
stylelint:
- specifier: 17.7.0
- version: 17.7.0(typescript@6.0.3)
+ specifier: 17.8.0
+ version: 17.8.0(typescript@6.0.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(stylelint@17.7.0(typescript@6.0.3))
+ version: 15.0.0(stylelint@17.8.0(typescript@6.0.3))
typescript:
specifier: 6.0.3
version: 6.0.3
vite-plugin-svgo:
specifier: 2.0.0
- version: 2.0.0(typescript@6.0.3)(vite@8.0.8(@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.3)(vite@8.0.9(@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.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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)
@@ -1365,41 +1370,41 @@ importers:
specifier: '>=4.1.0'
version: 5.0.0
'@typescript-eslint/eslint-plugin':
- specifier: 8.58.2
- version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: 8.58.2
- version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@vitest/browser':
- specifier: 4.1.4
- version: 4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)
+ specifier: 4.1.5
+ version: 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)
'@vitest/coverage-istanbul':
- specifier: 4.1.4
- version: 4.1.4(vitest@4.1.4)
+ specifier: 4.1.5
+ version: 4.1.5(vitest@4.1.5)
ckeditor5:
- specifier: 48.0.0
- version: 48.0.0
+ specifier: 48.0.1
+ version: 48.0.1
eslint:
specifier: 10.2.1
version: 10.2.1(jiti@2.6.1)
eslint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ version: 15.0.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
stylelint:
- specifier: 17.7.0
- version: 17.7.0(typescript@6.0.3)
+ specifier: 17.8.0
+ version: 17.8.0(typescript@6.0.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
- version: 14.1.0(stylelint@17.7.0(typescript@6.0.3))
+ version: 15.0.0(stylelint@17.8.0(typescript@6.0.3))
typescript:
specifier: 6.0.3
version: 6.0.3
vite-plugin-svgo:
specifier: 2.0.0
- version: 2.0.0(typescript@6.0.3)(vite@8.0.8(@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.3)(vite@8.0.9(@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.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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)
@@ -1443,110 +1448,110 @@ importers:
specifier: 6.5.2
version: 6.5.2
'@codemirror/search':
- specifier: 6.6.0
- version: 6.6.0
+ specifier: 6.7.0
+ version: 6.7.0
'@codemirror/state':
specifier: 6.6.0
version: 6.6.0
'@codemirror/view':
- specifier: 6.41.0
- version: 6.41.0
+ specifier: 6.41.1
+ version: 6.41.1
'@eslint/js':
specifier: 10.0.1
version: 10.0.1(eslint@10.2.1(jiti@2.6.1))
'@fsegurai/codemirror-theme-abcdef':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-abyss':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-android-studio':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-andromeda':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-basic-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-basic-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-cobalt2':
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)
+ version: 6.0.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-forest':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-github-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-github-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-gruvbox-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-gruvbox-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@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)
+ version: 6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-high-contrast-light':
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)
+ version: 6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-material-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-material-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@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)
+ version: 6.0.1(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-monokai':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-nord':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-palenight':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-solarized-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-solarized-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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@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)
+ version: 6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-tokyo-night-day':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-tokyo-night-storm':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-volcano':
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)
+ version: 6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-vscode-dark':
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)
+ version: 6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)
'@fsegurai/codemirror-theme-vscode-light':
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)
+ version: 6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@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)
+ version: 6.5.3(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)
'@replit/codemirror-lang-nix':
specifier: 6.0.1
- version: 6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.2)
+ version: 6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.2)
'@replit/codemirror-vim':
specifier: 6.3.0
- version: 6.3.0(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)
+ version: 6.3.0(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/search@6.7.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)
'@ssddanbrown/codemirror-lang-smarty':
specifier: 1.0.0
version: 1.0.0
@@ -1578,8 +1583,11 @@ importers:
specifier: 1.11.20
version: 1.11.20
marked:
- specifier: 18.0.1
- version: 18.0.1
+ specifier: 18.0.2
+ version: 18.0.2
+ marked-footnote:
+ specifier: 1.4.0
+ version: 1.4.0(marked@18.0.2)
packages/express-partial-content: {}
@@ -1633,11 +1641,11 @@ importers:
specifier: workspace:*
version: link:../ckeditor5
'@typescript-eslint/eslint-plugin':
- specifier: 8.58.2
- version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
'@typescript-eslint/parser':
- specifier: 8.58.2
- version: 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ specifier: 8.59.0
+ version: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
dotenv:
specifier: 17.4.2
version: 17.4.2
@@ -1663,8 +1671,8 @@ importers:
specifier: 20.9.0
version: 20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
vitest:
- specifier: 4.1.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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:
@@ -1736,8 +1744,8 @@ importers:
specifier: 7.2.4
version: 7.2.4
vitest:
- specifier: 4.1.4
- version: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5
+ version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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:
@@ -1747,20 +1755,20 @@ packages:
'@adobe/css-tools@4.4.4':
resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
- '@ai-sdk/anthropic@3.0.69':
- resolution: {integrity: sha512-LshR7X3pFugY0o41G2VKTmg1XoGpSl7uoYWfzk6zjVZLhCfeFiwgpOga+eTV4XY1VVpZwKVqRnkDbIL7K2eH5g==}
+ '@ai-sdk/anthropic@3.0.71':
+ resolution: {integrity: sha512-bUWOzrzR0gJKJO/PLGMR4uH2dqEgqGhrsCV+sSpk4KtOEnUQlfjZI/F7BFlqSvVpFbjdgYRRLysAeEZpJ6S1lg==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- '@ai-sdk/gateway@3.0.98':
- resolution: {integrity: sha512-Ol+nP8PIlj8FjN8qKlxhE89N0woqAaGi9CUBGp1boe3RafpphJ7WMuq/RErSvxtwTqje03TP+zIdzP113krxRg==}
+ '@ai-sdk/gateway@3.0.104':
+ resolution: {integrity: sha512-ZKX5n74io8VIRlhIMSLWVlvT3sXC8Z7cZ9GHuWBWZDVi96+62AIsWuLGvMfcBA1STYuSoDrp6rIziZmvrTq0TA==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
- '@ai-sdk/google@3.0.63':
- resolution: {integrity: sha512-RfOZWVMYSPu2sPRfGajrauWAZ9BSaRopSn+AszkKWQ1MFj8nhaXvCqRHB5pBQUaHTfZKagvOmMpNfa/s3gPLgQ==}
+ '@ai-sdk/google@3.0.64':
+ resolution: {integrity: sha512-CbR82EgGPNrj/6q0HtclwuCqe0/pDShyv3nWDP/A9DroujzWXnLMlUJVrgPOsg4b40zQCwwVs2XSKCxvt/4QaA==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
@@ -2016,283 +2024,298 @@ packages:
'@catppuccin/palette@1.7.1':
resolution: {integrity: sha512-aRc1tbzrevOTV7nFTT9SRdF26w/MIwT4Jwt4fDMc9itRZUDXCuEDBLyz4TQMlqO9ZP8mf5Hu4Jr6D03NLFc6Gw==}
+ '@chevrotain/cst-dts-gen@11.0.3':
+ resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==}
+
'@chevrotain/cst-dts-gen@11.1.1':
resolution: {integrity: sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==}
+ '@chevrotain/gast@11.0.3':
+ resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==}
+
'@chevrotain/gast@11.1.1':
resolution: {integrity: sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==}
+ '@chevrotain/regexp-to-ast@11.0.3':
+ resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==}
+
'@chevrotain/regexp-to-ast@11.1.1':
resolution: {integrity: sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==}
+ '@chevrotain/types@11.0.3':
+ resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==}
+
'@chevrotain/types@11.1.1':
resolution: {integrity: sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==}
+ '@chevrotain/utils@11.0.3':
+ resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==}
+
'@chevrotain/utils@11.1.1':
resolution: {integrity: sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==}
- '@ckeditor/ckeditor-cloud-services-collaboration@54.0.1':
- resolution: {integrity: sha512-fPJFY2Ruz8EsVUY7wUy6LQ7zoyfcX6Wj84oPgtB/yby8AEMJsNBEpNPIMlUgaH74miCSpC615QX12fAW1RrArg==}
+ '@ckeditor/ckeditor-cloud-services-collaboration@54.0.3':
+ resolution: {integrity: sha512-RQ6tz0A+OAth16EPO0eCKFZAQWDch1jSk+E+xEs6vmpzEuSdS9M7x4FjIcj5U3yBmrmqzV0gkNK2QC5cwIiRiw==}
peerDependencies:
'@ckeditor/ckeditor5-utils': '>= 42.0.0 || ^0.0.0-nightly || ^0.0.0-internal'
- '@ckeditor/ckeditor5-adapter-ckfinder@48.0.0':
- resolution: {integrity: sha512-qNMICWAlocqa3XYp8MlDF26jSVgahl7I8dOlPWQXhDWtWPF1rGVnNzBxvjICMHzwN/oHtRMyjVIRyGae5Id9rA==}
+ '@ckeditor/ckeditor5-adapter-ckfinder@48.0.1':
+ resolution: {integrity: sha512-qKrdKjiMmRvuXg6gV5vS+Z/fajl4TDa5aeiCQROR1RlNPO6oSxQJFjgYoE+nDMz2bkK08qbULnq86wgQtn+r+g==}
- '@ckeditor/ckeditor5-ai@48.0.0':
- resolution: {integrity: sha512-MwIdOL7fE7rOHBMUuIgP+gXHLJ2DswxmlCR4nwLbrCG2sDf3epSi9qF05JG5RvOJY2JlxI5xVpVp5gpk5122Cw==}
+ '@ckeditor/ckeditor5-ai@48.0.1':
+ resolution: {integrity: sha512-NqynWQpw7LDSD0rSussdM0Ea1YdJ66axnGwX3DTS8aWzizLXJ1Q9J8SJmt1hURM4kEv+J18AiVlAdTZEe3ZK7Q==}
- '@ckeditor/ckeditor5-alignment@48.0.0':
- resolution: {integrity: sha512-6wdG0n5a69cZJQVw5WJinrFdMuGhq1YWbEsiowFXTw0zREbGjRpZs8FLV2g4tPK3Gw+jXZgVo3t8RHOYdX2G8g==}
+ '@ckeditor/ckeditor5-alignment@48.0.1':
+ resolution: {integrity: sha512-ZvrIrz/VXX7o3SU9VnH1NxnqY16Mh2455pqpeB0YvdWOt4LFU+jwv/5S0EJGs2HqZJiD7NH+5zIS4PgmlKryBw==}
- '@ckeditor/ckeditor5-autoformat@48.0.0':
- resolution: {integrity: sha512-Fr8Gp0kgEI8foRLrGrRyxuU4zAfux7OAbrDxS47bEBckbf9mGuwGOA90fcmFY3hwIDxxfgZA8h6qHJOZBCqWSg==}
+ '@ckeditor/ckeditor5-autoformat@48.0.1':
+ resolution: {integrity: sha512-gn/CbnAPuWWxxgkIXCqUbA0XeKRsWe2Sbc2/Bf+w7rPX5MdlQ1KpfNSTiiM6R76tbWqw3RiAqDRuj6dEYTb4pQ==}
- '@ckeditor/ckeditor5-autosave@48.0.0':
- resolution: {integrity: sha512-/5nm78GoqEA94RcOCQtQ6g+nv1ibz5/pu7p1N3NWwKQBc04fM0HzdioxhcDnSd1qSjXHx1Lzo3ICZAyp0GnAjw==}
+ '@ckeditor/ckeditor5-autosave@48.0.1':
+ resolution: {integrity: sha512-9pUOznmE2gmLqjVz61NDN5KK0QRcNm+o+nheu/DyEFQfboaMFPo68rkZwi1zIkdVVoNXDjqBHkU4LTVTxZJbRg==}
- '@ckeditor/ckeditor5-basic-styles@48.0.0':
- resolution: {integrity: sha512-6EX+Wmb/wHljeutCdLPVers35PENkANtslXe+qM5NKhEw9WLQEaS5fXYh+4A5xZJsppV0l/zQpMMRP7MPoQQMQ==}
+ '@ckeditor/ckeditor5-basic-styles@48.0.1':
+ resolution: {integrity: sha512-XEdxIhB/mD9Nwd/rQK6RxtKwwVC+Nd/V1MKv4hbsKd98L8HNjWHDUY2ApXg9dAr4KdpDzDjvhT9QYJsYdQ6A8Q==}
- '@ckeditor/ckeditor5-block-quote@48.0.0':
- resolution: {integrity: sha512-lgznrbDscTPqob99NJDNTFCRO8AGUKl9pXlXbW6yRf9zycfubHWU0inEp771Tc3nNHveTphwPiuTStshsPZb9A==}
+ '@ckeditor/ckeditor5-block-quote@48.0.1':
+ resolution: {integrity: sha512-LWTl++pcvzxp8FL5LIyFV7bCTYU/ScFqikavPYmloVdAlusd1DAqutHxyCEADGfQZgPmG2TUVqWCBp6FQfDfzA==}
- '@ckeditor/ckeditor5-bookmark@48.0.0':
- resolution: {integrity: sha512-EmvW4HJYIMfp+0a6F1RrfcM9qMFyh3HjmFWz5IOsosqYUWh1BhQAf99r0cK/nUWEIwmAyX5PdbtMVLmkWOASAg==}
+ '@ckeditor/ckeditor5-bookmark@48.0.1':
+ resolution: {integrity: sha512-N293hFCKt95dIFGphO1Z91qvQfgUc4wUSslqXmSFY+Rsmjr6efo42Q85oukH4WPrYjOjVmYoajqXzNU7QYGdxA==}
- '@ckeditor/ckeditor5-case-change@48.0.0':
- resolution: {integrity: sha512-XL/zwSojfdQ21cd7Hy9EwY42Z6oXAzJ/qilEGmDMt367xYgtPL9yjwAshTHeyNyElxU2h6v6eJzjunDpmPYFtw==}
+ '@ckeditor/ckeditor5-case-change@48.0.1':
+ resolution: {integrity: sha512-3ZIJk6YM/vBdgFs/EJfq+dfmOzh3GDfN2JkjcOn1XzZDMrYei5WlVCMZEB/5LGjFSD+VQqHbvHjEmI5LpXAT5w==}
- '@ckeditor/ckeditor5-ckbox@48.0.0':
- resolution: {integrity: sha512-O6Le5xGxdjntf6VSVbO6jwEUkoJbGIrSWJFD7REOS/bKq+xO59NnjhCuYcIwCuBveNf+i6u7KPWCdlFl+r2zGA==}
+ '@ckeditor/ckeditor5-ckbox@48.0.1':
+ resolution: {integrity: sha512-n6o7szp3u4aHMkENBV4VWaPIhp5Zn7UwQfHoVDfYKGN2YHyRenzjmLmDZW9QP/5rXYsPHMQjYVBW8CiTVNIYqQ==}
- '@ckeditor/ckeditor5-ckfinder@48.0.0':
- resolution: {integrity: sha512-UuuxpUG03zp1YpxHpBs8UprkMpGySVp58o7adTJv5zJeMA9GLcKm+cB6UL066kKxzfKhBS6eSzsefHyPTaUMpg==}
+ '@ckeditor/ckeditor5-ckfinder@48.0.1':
+ resolution: {integrity: sha512-UC/oMyN5XKcjwc95hPCWcRQvzNfMCcwsrfJN4CoV/EUgQRuc4g1oUCEAgiZxrNDbHsovY5wLIuPjLIbYihJctA==}
- '@ckeditor/ckeditor5-clipboard@48.0.0':
- resolution: {integrity: sha512-wW3Lhn3zrTmXDvE3y6w5xnie7fLxnPnewMKw/82a7vnYG+pPpA2K79czZov4h/TQ2X91JC5i9/G6PT/tMQ2UTg==}
+ '@ckeditor/ckeditor5-clipboard@48.0.1':
+ resolution: {integrity: sha512-uAS/vlrGZ3xGpRv4r1gr/gEp+5rUenHJsga9sLj0KXgkvg8wnbzY/hC0s58YOFRjOXQvMgkAwabvlDuRNQKWqg==}
- '@ckeditor/ckeditor5-cloud-services@48.0.0':
- resolution: {integrity: sha512-XsXT7PZ8C68uBFYNhO+HctlnjW4mXUNbqXibLFFJmc78L+aWsYw73jdxLMG97qe7ekDncrSsKJoaegdURZE5yw==}
+ '@ckeditor/ckeditor5-cloud-services@48.0.1':
+ resolution: {integrity: sha512-U4TSzsqnzNQ5nVogqFONL+FuQ0F8i0dzUxcSIVwgVsRojbZs0zuufHvpLy4sYDK8qJD4MZhEkcKG0FlwNNwcqQ==}
- '@ckeditor/ckeditor5-code-block@48.0.0':
- resolution: {integrity: sha512-R4rBaEg0si0u1TmsnROPGimqyru13DwoEThEoMN6B4+Z9x0K4gWuBcLJQ9DbbfcrX4FI6A42VE6pdMsjlgN1Cg==}
+ '@ckeditor/ckeditor5-code-block@48.0.1':
+ resolution: {integrity: sha512-728KFsW6Uj5Wpv+0hUEyqyLIW56Mt8EbaVjrhc3EXEKgI39vHOjgsfnxKeXmsW3Y+DDLhfx6JE5MAaIRqrGYeQ==}
- '@ckeditor/ckeditor5-collaboration-core@48.0.0':
- resolution: {integrity: sha512-9CC2taNZBS1LLaP58rFI2Uuscqez9Ok4D27IvWt5DWlQhS9IhLoAeP3ATftVZzMf3OvZ6Ay8LtbCeavnDH2NMQ==}
+ '@ckeditor/ckeditor5-collaboration-core@48.0.1':
+ resolution: {integrity: sha512-7PhmfSiamltrvy3z0M1lKBDw8oX5iyY7M7qB+LwwrB3xOTiY8ugoTQcDN5MRZbWY1XLYA3t8EwB0F5ViVsTiQg==}
- '@ckeditor/ckeditor5-comments@48.0.0':
- resolution: {integrity: sha512-AU+Esz6KKMG2LHmhVagEpEVL1txkCPtscimZ9KKIcdfRNyZvgf4hWH5Ht08p5Ap+7xklyy9U1eDilr6+phsotQ==}
+ '@ckeditor/ckeditor5-comments@48.0.1':
+ resolution: {integrity: sha512-fGdSNEITe35V78gBblbyuzCN3KPNkjVMLDOvmIO32oyNLual6wAkD66V0Or+cipPv8vHlkNGXOdXpn6Bn01O2Q==}
- '@ckeditor/ckeditor5-core@48.0.0':
- resolution: {integrity: sha512-alN+AOKd8a5C8xgNim7ojKlW3r2jOWjIh3KrYBIfL92LvBXmFutNJRYuxzSMVO5I9+stbcYp2oAZZ1jxtpL/7g==}
+ '@ckeditor/ckeditor5-core@48.0.1':
+ resolution: {integrity: sha512-jhAMvv4GCD8aPWBdYC2RFS/xtuTubgGfSKGabG5cDFn1uHv+sGIiFdLEV8jhNFKrRgdEd2jT90KYx73izdm9jw==}
- '@ckeditor/ckeditor5-document-outline@48.0.0':
- resolution: {integrity: sha512-X5LUVPPDGw+GlBsyPufkTdlQronOgWeTBOqOL4ihoNwwqf8wXxJM/Vp3uPCBmBHCSThSyDE28+E7+JzF4W5vKg==}
+ '@ckeditor/ckeditor5-document-outline@48.0.1':
+ resolution: {integrity: sha512-5YwMJ9DwVJU4CaUwDIte1q0fAt3SDc0GJJymppBJMpQKe5ztd9eMHq5AUR5LS394pcCvVU0vV1CqbXl6A0SBNg==}
- '@ckeditor/ckeditor5-easy-image@48.0.0':
- resolution: {integrity: sha512-dLblbP7Skvbx3olIiHxnZnfZUr159V5ixNzge63IlN5qRfJxLguInpm/93bQY5kMpfARU4dgI2/07B6RtYP3XA==}
+ '@ckeditor/ckeditor5-easy-image@48.0.1':
+ resolution: {integrity: sha512-mXtS87krxR1infQ/7BIS2kY4h5dLPdJhIyPyr15W6MlT48j79CG3OfWFeXUO11RsKHFs9oB+bIqLCb8wq5Tt3w==}
- '@ckeditor/ckeditor5-editor-balloon@48.0.0':
- resolution: {integrity: sha512-yrDqeV+3SspIvnqMJt4pGyOOC91z691uJYFFP369WF9w40sQPKpt5rtJjYmwFaSNO4vX1f7QlG8xuxD8eP/cyQ==}
+ '@ckeditor/ckeditor5-editor-balloon@48.0.1':
+ resolution: {integrity: sha512-wpYCOpNdh4DWkGsuYX9IxK0Ednij4KecvqTcFhKS6rswkiY6dfDJq89qKuyHvOZA5Mw2cElaCCX8ogY/xKeQ5Q==}
- '@ckeditor/ckeditor5-editor-classic@48.0.0':
- resolution: {integrity: sha512-PUtB1e3uMD5vNYFSThapmf2qCQ9i1vM7w50rOPBIFbXeBM3NgNgQ4uj7DBQe5CSxPlTZDerHujPjvur576KvVQ==}
+ '@ckeditor/ckeditor5-editor-classic@48.0.1':
+ resolution: {integrity: sha512-EUtLco5ZP1b8EsBULlh+CJ+R2QSHpTPTe43TyugsjHR2Ead03XkhR6Xw1Wbd2KBJjlgrHOi3XuXpQNtFlbZtnQ==}
- '@ckeditor/ckeditor5-editor-decoupled@48.0.0':
- resolution: {integrity: sha512-zsKb1IQJ7Cb9mxnCbI/Foec6pE3L+GmXfyI38sXQTbsWdf0rE48CpNsot4MpPkRig+z1xovwAYT1J4F37RTLPg==}
+ '@ckeditor/ckeditor5-editor-decoupled@48.0.1':
+ resolution: {integrity: sha512-NrIjEoqpuxd+FNbI6HxW8GIskjc+s7I5LGkOfyl9BcBcVNjEfqAHmfK59X7xuZ6uPxse8X61BFgDini+qgYdHg==}
- '@ckeditor/ckeditor5-editor-inline@48.0.0':
- resolution: {integrity: sha512-V2hdVLyR39frbIMi3BZbRrvLRRbyq6pBc65btbMDAstRWQ46rKeXVMv5z9AHRh1bRxhFZWji7e3Xmy3sp7035w==}
+ '@ckeditor/ckeditor5-editor-inline@48.0.1':
+ resolution: {integrity: sha512-ZJlG0DH548aqcNzvWAIwWrg9cOXBBv7DBKwCCPTk6D4x0VdGXnaaewdbIIj6gxIip6j9k3+YDjsloPDFAzoyBw==}
- '@ckeditor/ckeditor5-editor-multi-root@48.0.0':
- resolution: {integrity: sha512-6I20v8RhznnSSinNq4vEO1/T+PGslCvnJXhzJDdNWJKB1szF7pfCStpEFNCR43q/n78tBQS8a5cPr5ZFXeQOeQ==}
+ '@ckeditor/ckeditor5-editor-multi-root@48.0.1':
+ resolution: {integrity: sha512-wu0YK4QrOGUqfAvb47nSJuC3PWUJUmKS/7qY8MOyBppoa9jrHxzsnjyMvzTNBpbMy5h0qB5OXeT0nCpF1Z22oA==}
- '@ckeditor/ckeditor5-email@48.0.0':
- resolution: {integrity: sha512-mGJpgXlbvSZieRcOI/MnC16qEaoW7Gk93CjrRuq6wxOf+dXBKVUxAo6H4SQAxVPBDT4xLgEhqOvw5gc8bsn8mg==}
+ '@ckeditor/ckeditor5-email@48.0.1':
+ resolution: {integrity: sha512-X0KWf2dYFjWZU3pw7aFqQ+Cnp7G2WDDCyRVRRRws+O0cBc9ifwE2wNit5ks2f5+OMiS+vi3+/hD7AtTdefYe+A==}
- '@ckeditor/ckeditor5-emoji@48.0.0':
- resolution: {integrity: sha512-Ho2C+rAQwACupQH1C0tidvj3fAx9HuLBDfD1LEtHpfkQZoFanYBVFIb+9ADv4rsChe9P9dBCnqTF8RNpoafS1A==}
+ '@ckeditor/ckeditor5-emoji@48.0.1':
+ resolution: {integrity: sha512-z1iTGRNwZ9zvIqLQSCr/aL2/kq/xmBMdat5j86//cG1Dv9a5TgwbhUBu9EZJLQvFnZ7FF18peX2mYY/MAyklhA==}
- '@ckeditor/ckeditor5-engine@48.0.0':
- resolution: {integrity: sha512-Z/K+qz8R/pcCWFbe+w5my1hDWcfpsVmyeiWRsrecbxLBZ6o6l+04XFBFgMQpxFgHKcoqS699WnWYk+1zGZDf+w==}
+ '@ckeditor/ckeditor5-engine@48.0.1':
+ resolution: {integrity: sha512-qT+SOBibvH3pr4I08myvyDLv09tofA83umwsA4Mk8sG+9yqeEx2AEKUP8lu6sUzfe/WKLwOUIAT3TAWWt+Oheg==}
- '@ckeditor/ckeditor5-enter@48.0.0':
- resolution: {integrity: sha512-VPWc64iEaH2mxkpZi5j0tyJFlIPLMGuwRvhWhKyk8/W8SXt4lOHx+nmi90G9W3aPkqnLjscCuvOzfQSsl5vYeg==}
+ '@ckeditor/ckeditor5-enter@48.0.1':
+ resolution: {integrity: sha512-U48yfgYvtKNJbVO2E72KrFJjFkR06nkb//zA5uubEuwPYVQi/L3AWaXsPEviowq6Hv2nZHmOF0YcKqgNyHuBUA==}
- '@ckeditor/ckeditor5-essentials@48.0.0':
- resolution: {integrity: sha512-3PeYnM4oLbw5fAwsPLbMtQjxDs+hKqMwIFa8Qpk559Ldf5PPxdC1q4HNQDY6EZSjNguAzSMxqYaOlUcJC7zcHw==}
+ '@ckeditor/ckeditor5-essentials@48.0.1':
+ resolution: {integrity: sha512-wLiEhL11pQBAGWRCx5mWn0FSZOUq2bTvAnAQIVLUitz3pJcH4GQsAUrCfGRLm6ZRyy+oU69MddSVFeLl1Dqs7g==}
- '@ckeditor/ckeditor5-export-inline-styles@48.0.0':
- resolution: {integrity: sha512-zOaqL1PDi8M1Tm5ZJAYevcqJhRHGdpA+IuoVbHEYKK6+o9jmtlK0abVUW/NnULvRcLfSPRCgzo5Il6zG+9K35Q==}
+ '@ckeditor/ckeditor5-export-inline-styles@48.0.1':
+ resolution: {integrity: sha512-5zEXw9wIj73a8IMrIHvJRMRAORA1H/ufmqp3ng/E+lpl9MiEyCVIRQnBT3CvTsIX3Vjk7fapzlWzgFs0SySv8g==}
- '@ckeditor/ckeditor5-export-pdf@48.0.0':
- resolution: {integrity: sha512-YheJ15+9RtLKXb2Gcjg2NKdqOfPifKj3fIeXAjlOcxzykKSM1Y9hhYPBPrnE5eooeCu2ANQCoAifSEaw+b2b5w==}
+ '@ckeditor/ckeditor5-export-pdf@48.0.1':
+ resolution: {integrity: sha512-vQSVq0aMPIzjuTqDTvhRTPdM1mvXpX5I8w5ME9y6luhYuhlwdrkBS/L12szagoTOQwfdPzEj1yzk26itsMZ8IA==}
- '@ckeditor/ckeditor5-export-word@48.0.0':
- resolution: {integrity: sha512-dI6Fkg/zOO72xc65qdCrusB5yKDilMRAKa2RJBzSNYnTywUshW6fMhbinRzUAmZyIyUn07TEXLYXXURUCepyiA==}
+ '@ckeditor/ckeditor5-export-word@48.0.1':
+ resolution: {integrity: sha512-7wKVb5HVDWSyGW4brFVAjyW3ncy/eU1zCWsD6SnHZQuCWD/5sBJ1hgtUBma7oeja8hKmuHDXQesv309Zzs+1cw==}
- '@ckeditor/ckeditor5-find-and-replace@48.0.0':
- resolution: {integrity: sha512-a2+sJpPh/cXfSKDSI5lLZU7QXl2fuBoVFE+J4eBct/5QuCRmNcgpsHsZ3Q6wTeeG2zPlafcWzoa6LkeDgXjsKA==}
+ '@ckeditor/ckeditor5-find-and-replace@48.0.1':
+ resolution: {integrity: sha512-tfyvqZRV8BC0w0c/YCpWAyIhVVce09Z/NLcptwLkFlH3pXAoYt3iOMdctmGCNXMCFaH+J21B89hNox3twmQJqw==}
- '@ckeditor/ckeditor5-font@48.0.0':
- resolution: {integrity: sha512-V/if+TMyNb1a23LLY0NZl4a7uuHNRWGu/ZL4PYbQDk/wEJPte8Mippp00iBBsIYC/LdTavc7YiJKET14DBSFyw==}
+ '@ckeditor/ckeditor5-font@48.0.1':
+ resolution: {integrity: sha512-mbYk3b9XGNYi6+jQ/9Rkl25RvqzPfZCZ2RMuznwSre+wrlcnLHiyJULOen5aesuhQcOVJKloVwzV7YQu+aKUXg==}
- '@ckeditor/ckeditor5-footnotes@48.0.0':
- resolution: {integrity: sha512-3qYOVUJhxbDZAf21t7/zLENHs+IocgYx8GaQNsMtZPqc1oml3xfAMPaTPAezuvLlhCjpR2HMCs6sNKmjmXmVHg==}
+ '@ckeditor/ckeditor5-footnotes@48.0.1':
+ resolution: {integrity: sha512-5yn7IAYe8BEpACTU8LP54UUypA5NyeFWgwKZhoSlWPIcW8lD560u2zj4Oksp9N3x/KIYTx5eqVE7QdoNMDogXw==}
- '@ckeditor/ckeditor5-format-painter@48.0.0':
- resolution: {integrity: sha512-skmohEaISJZAPJt53eeJy7jsLoaPsLBiR38rEyEv9mR7JO95bZMHmexKvmKxNm8zT2RkjD5jvqnjpuCwo9U/6A==}
+ '@ckeditor/ckeditor5-format-painter@48.0.1':
+ resolution: {integrity: sha512-cnYgtxjE7EP99WbLVwVKOISo/xWhPYA1ckbtWS2wd8N0NUsanevL0GghzwvEDSmiudnqanYJ1yDmb96IPcgHFw==}
- '@ckeditor/ckeditor5-fullscreen@48.0.0':
- resolution: {integrity: sha512-bPf4AbQs4PC0+HAjyip07LsF8Bg8C7Rxr0j9vEw7ltwShjGknvMpBacWPPr4LVmuV++GgPh04kpRAtQVZUDgVw==}
+ '@ckeditor/ckeditor5-fullscreen@48.0.1':
+ resolution: {integrity: sha512-ZczSnvffikjGUTZc8AimIrFza7ugGkDhA9v/MxWYDz8u5fvkNUO6LsJ/dM3flAQo7QbFpjf48apj1pRo2wxBCg==}
- '@ckeditor/ckeditor5-heading@48.0.0':
- resolution: {integrity: sha512-/Hj1k13XyD5ABI/NIF075eccC+OEPNipEJqvdiVXIerywjIfcNIPbf/X0PQxOFixCN9CBmhCPHNF6VI/Wheeog==}
+ '@ckeditor/ckeditor5-heading@48.0.1':
+ resolution: {integrity: sha512-s/6Lx1mlTomyd5o0pE7LiqfSJfUPB3gE018lZqxKjNOPqDnZ+tuzoXxHpJnmA/Ir06giSVXxpM1LkzDL6qtROg==}
- '@ckeditor/ckeditor5-highlight@48.0.0':
- resolution: {integrity: sha512-1uE6dzorsJGJ1x2NsLQGhBiIeClKAjiUFSelFJRqxPzWywfY8aMjnsc3kCbTKXar8j9jNwTZrFvQdqK9jI9agQ==}
+ '@ckeditor/ckeditor5-highlight@48.0.1':
+ resolution: {integrity: sha512-2Ho4bVzZDd+uZ9IujbfLGZubCugGenGddFbyZ90TT7fQGuDMcYwpsc7p655cdDOeJ0BiyYXA01gN74AK13Hf7g==}
- '@ckeditor/ckeditor5-horizontal-line@48.0.0':
- resolution: {integrity: sha512-FWnU3QC5HjqNGEfC9ljtzM/qyDVvdLZtIvU2octNddoNWCXHw+IUFDxuO/M3on71Rx6ibl+GQyNgHPug7tlAkw==}
+ '@ckeditor/ckeditor5-horizontal-line@48.0.1':
+ resolution: {integrity: sha512-YqUtXT8uXzCKVtv5YSq7DRItelU0+tHzTmUbxoTPNaEbW2qmKqJSzKeq1VYO6hMtyrLZKyBDmYrXf7aFAzy6Vg==}
- '@ckeditor/ckeditor5-html-embed@48.0.0':
- resolution: {integrity: sha512-7FNfPCR8O3mhEY4NpdaVpA1NLWd76WLnHmDUbFSRZLE+tulXxXWmV3oe3TWrfoFaILLKHYLFwL063mM81dPd8w==}
+ '@ckeditor/ckeditor5-html-embed@48.0.1':
+ resolution: {integrity: sha512-Y1g0iP3JVZ8Ff73XeT/5lbXzX7lmhyM7v+4sC8g+zNP7++48KKHCJGrbbllESJ/oEWX6mmsFOJJy7L0yREQHHw==}
- '@ckeditor/ckeditor5-html-support@48.0.0':
- resolution: {integrity: sha512-ahnXoBcbdNDBkwhJQmx2WRWOq0t0EJBbSFEamUxAlyVVVctASWGAKl1qlQ3JmXbnJYrfBt4dM4ECAOYxCbB+hw==}
+ '@ckeditor/ckeditor5-html-support@48.0.1':
+ resolution: {integrity: sha512-zM1co42HVyRJlOoG+fqjlD5CuTQ4dnNONt/a14Hr8taTGODnA967VXRoakVqjEo/e5FiWXThsBZRy3GoRIWjQA==}
- '@ckeditor/ckeditor5-icons@48.0.0':
- resolution: {integrity: sha512-PWHECNrUipXbtKdN3Rvhcz8NpcsKW6Gke4U+5UFndoOBtSbgxooZMoovlo1nN3PmQ9aKbEF1owf3Pa+oeG32rA==}
+ '@ckeditor/ckeditor5-icons@48.0.1':
+ resolution: {integrity: sha512-aulG/+JEtn5R1Ku0pygKfYffQfARqaEB5l7g50JFvnXDSpUGHP/mx1EbzzvdNyiAAl67PpIGe8VtxyovxC5u5Q==}
- '@ckeditor/ckeditor5-image@48.0.0':
- resolution: {integrity: sha512-0MT8PIcUQgo9vj7PRNpClAdZ6rjqdCz2egk4ktgh+AoYIFOVh/znzBAiLcJghsoCjZLGI8REzu3dwQ0ynJsGVg==}
+ '@ckeditor/ckeditor5-image@48.0.1':
+ resolution: {integrity: sha512-ISfJBqYISHo+3p++GNCTXvNSWq88XAMugyyOQWoY7oxsbfOsqsqZ5e+MjjrWgzUNKOlzR/VRzuPHTN/r4sfQtw==}
- '@ckeditor/ckeditor5-import-word@48.0.0':
- resolution: {integrity: sha512-5DQj1MDKkFkK08ySwzUro7WRsPzaJ3nzdQZl/LN6z/ZZa6BnzqKwCsUipPVr2wKz32ZW88egs7cPkVDHkQUzmg==}
+ '@ckeditor/ckeditor5-import-word@48.0.1':
+ resolution: {integrity: sha512-PwJ1fMAZ72RPgB3NTaow3UjoBdBkHcXwxil5UKVLWxw1su84uaW6PIwQCtjSl1IeaLTgKXx35VcWfLzgjUOXIQ==}
- '@ckeditor/ckeditor5-indent@48.0.0':
- resolution: {integrity: sha512-TCyJtxBJPHMN6Q2zMfZXe2bzS95SChTIcVWOxG3KL5kOtn5AsC+gU4K5t+SM1ITVhQYYpBI9elUMy12h93PceA==}
+ '@ckeditor/ckeditor5-indent@48.0.1':
+ resolution: {integrity: sha512-0YShggoO85v9WILMF07Ld9afhcpekH8NeH76QYSoBQm7hk5RRUVbAFRHnTTxXwe8KY02m/mymgtHoToZFnrZeg==}
'@ckeditor/ckeditor5-inspector@5.0.0':
resolution: {integrity: sha512-WVCa1mtePJkLtI81Rn2E6orV0B2Az/+O7f+corJzYapoH5koVEe9TcVyoKRquKUWeBXMG+D1m72vmR2kuoLNhA==}
- '@ckeditor/ckeditor5-language@48.0.0':
- resolution: {integrity: sha512-56iohiWWwrO23YY3chD9GbqKGgmm0g579OaSpz/zNtcSEpH3RJTdsliFyyv+bPQMbPYOmJiHKkj9eWVucHI4gw==}
+ '@ckeditor/ckeditor5-language@48.0.1':
+ resolution: {integrity: sha512-5pwHJFGnxId1XHg9kw9ufwDxL7ott6jT7arhoPM0C3n60XwNIf9znjjmjPtkdAR/m9+EgDSADhqSyXwIdbwyqw==}
- '@ckeditor/ckeditor5-line-height@48.0.0':
- resolution: {integrity: sha512-ahzjsCt5ua6LTkkJjmxDnss/rxi7sBocnILVgHVZDX6uHrBBBNNiRK4WovbIgLwWZrZxOwRlEMbC5wHdFdO3nQ==}
+ '@ckeditor/ckeditor5-line-height@48.0.1':
+ resolution: {integrity: sha512-6lfB/ZztUvOrBZuW0k6QGQ+9fAEDXNJmA8uAba6UUYicJ8H0J1mPPfb+J+1/yLBddOfuoD0sezzjyUuvvD7NIQ==}
- '@ckeditor/ckeditor5-link@48.0.0':
- resolution: {integrity: sha512-j1vu9R+cPD7cY4oD6oN+sgUTFRTvH7+JFaqU0DoIiyKBq/g3RlufZfASpJ7DlonqfniFxC/7aBuz0taWBsViug==}
+ '@ckeditor/ckeditor5-link@48.0.1':
+ resolution: {integrity: sha512-giGxJeWN16eS5yYm+11QOjrXFocXfknfpmvyZlRYJ7NEwruYxUuf1Co5je5x/8iKBD2Qb6RLOzhBWF2WNWvErQ==}
- '@ckeditor/ckeditor5-list-multi-level@48.0.0':
- resolution: {integrity: sha512-/ccJzqg+MLgOzWiQxSu6J8Y52CbotxwchGP+0vmHdlbHJ+CyGX08Np2VmpGOG0gJaI5btBOCyvozKaK45MY2xQ==}
+ '@ckeditor/ckeditor5-list-multi-level@48.0.1':
+ resolution: {integrity: sha512-RlnnP3F+XAdTkAqhzcx+k+JJoCOy3cq5uqsqKMjkWhghbm0ijt3tQfA5jkgJ/qofRqcv32/TInsgVSQ0E9+F2w==}
- '@ckeditor/ckeditor5-list@48.0.0':
- resolution: {integrity: sha512-PeRDmPvs20p40l43wMBtbPd7H/E8XGAjIPOOccSp4DHA+Vx6YvtFws1OTJhdEWaTjfa1BdF7UXPj5MdTkcuVEw==}
+ '@ckeditor/ckeditor5-list@48.0.1':
+ resolution: {integrity: sha512-LOjn8ZDPjI2seVRUrNGqgK6csoUGNjywmJ3CyaH2U64AkXWzQ7uTvli8WkeU3XCwIjx3E11W/dwYH69k7KKX3g==}
- '@ckeditor/ckeditor5-markdown-gfm@48.0.0':
- resolution: {integrity: sha512-DNae4xYkZCe3f51HFYNkJZPNj2lJB6H3WwHFHb+3wqT0NrVcKd31eqqt2G4sJjpzcSeKSGIPaX46OrtZujDTLQ==}
+ '@ckeditor/ckeditor5-markdown-gfm@48.0.1':
+ resolution: {integrity: sha512-c2uYCOSgBD9yAm2T6jh368QCfCytzl9UuM0+E/tDn8hLizBUVgAAHOrhmLOWEcKcuFW5OoJ7ly9JmL7WWKLuaw==}
- '@ckeditor/ckeditor5-media-embed@48.0.0':
- resolution: {integrity: sha512-be/4of06/oqOeYUUHSB8pECLHYR+2maizqPofmFuyIoXJ73gu19qMQgougjdOY6bFpTuu8rNsePZCkIJhSem/w==}
+ '@ckeditor/ckeditor5-media-embed@48.0.1':
+ resolution: {integrity: sha512-npwJbS+++Vf4uLYC92cLzJGRav2fH4dPwkk7L+O1UCvf5Kg3XpP53nf9a5bIk75WLWlJnm/15Z3RMH/oTPbVNA==}
- '@ckeditor/ckeditor5-mention@48.0.0':
- resolution: {integrity: sha512-ocRNslENNnLkvwrwjl4M9ikQFO4/ih8TyFBnbjieUfYhVHO2TrOgCMwR/3U8sSZ4IQaqnq/B1Hb9kUJKsvfhBQ==}
+ '@ckeditor/ckeditor5-mention@48.0.1':
+ resolution: {integrity: sha512-Dxidz6L+XTSGsOpzqyG0mdOKWo5XJleglZ3AjhGz7nKjcbEbQUF9PKD/FdaUi/XYJFjRcdDq8VFHUzTZ5/Zl1A==}
- '@ckeditor/ckeditor5-merge-fields@48.0.0':
- resolution: {integrity: sha512-c3sMS1ExZ9TzEvGa9FZh3AibUa7fAFko+HEKT8Mca0wUQENxAfjmAh93X6x6GdUEQ0/LC54f/jmT038yyZjGKg==}
+ '@ckeditor/ckeditor5-merge-fields@48.0.1':
+ resolution: {integrity: sha512-cLRFO/ThIfLhdgwacGhdPxa2zTcJbtLhqhSBn9bOTS8VlHDsx2oFOJAFetgp+36mvDn/grp2w8zlP3CIsGwckw==}
- '@ckeditor/ckeditor5-minimap@48.0.0':
- resolution: {integrity: sha512-0nlr9Y/x2XN9zEJ5AcuzxAUTUXzy+oiJA46kw6ENEqg1KmenmuXVtzlyuIVyfN2TagyWXoz7k9slxereO6lxsQ==}
+ '@ckeditor/ckeditor5-minimap@48.0.1':
+ resolution: {integrity: sha512-XdqzY0KOJ9ouzz8LhoCGzLUUDmAYGU0mQ6IPlrmr0cpMS6RaMQA5kdr3YzSKIBZE56pWlRlMnGLvuqcGlqFQiw==}
- '@ckeditor/ckeditor5-operations-compressor@48.0.0':
- resolution: {integrity: sha512-hSVDomEeUOJKqCkcluUD16ufx/vjtG9DthjMl9/J2YLmBBZF2ixYvjxPtlgZUkd5e6Sokc8UWycSuPmLYqqP7A==}
+ '@ckeditor/ckeditor5-operations-compressor@48.0.1':
+ resolution: {integrity: sha512-q77dldoBAvh/tvZiyy2C/f9E9fNb97bc1snQWpIXAuJzBN8CfHYEeBbX2jnpeymA16BRkv8jeysRD28bekht9g==}
- '@ckeditor/ckeditor5-page-break@48.0.0':
- resolution: {integrity: sha512-eiCPti0A2xk0EpGXe+/lBZFhY+8UNMMA6ZUufjPwcZNIwVwzuQOJRKQwyqMdvmNz4Xjz42Vk+3RRcJQUy4QJsw==}
+ '@ckeditor/ckeditor5-page-break@48.0.1':
+ resolution: {integrity: sha512-ojacQc8bpkcVCon/wAXMgcws8+YQCdbDbHZehCVVtZz6knImC4y5lEcrMS1M4NqhBcGTynL7nHi/MDiw4Ry3Fw==}
- '@ckeditor/ckeditor5-pagination@48.0.0':
- resolution: {integrity: sha512-eI28EtEOEOMECHYth584/QwvUCAXk4FFhFS7q7xggJozKjiX6+Kes72b1vtLdjuHwPwT6Mmr1TiR1emr7EPcHQ==}
+ '@ckeditor/ckeditor5-pagination@48.0.1':
+ resolution: {integrity: sha512-ZvkgL6hNNT1Y1bSeml0cCTK1wClfqZdkxDPLI5KyA9BJ7fKuGWlPuuRDW+oyLcFMf/JC1YpwfzUA7au9lfaX2g==}
- '@ckeditor/ckeditor5-paragraph@48.0.0':
- resolution: {integrity: sha512-LPHDgn878ypHJ0e2n4xsqj4eIJpo53KrliKBDKhZGNMpFD7vOXNPxiXAAGOq0EtxUbSRtCTeymJTuW3q1oYOQw==}
+ '@ckeditor/ckeditor5-paragraph@48.0.1':
+ resolution: {integrity: sha512-/+EXLxRk8G8qcm5g6xOG2vuFd8Wq2jdGsoHNiqRa8pJnSHRMlT8+olT4tzV4FzGtaGvcTfodCjVobDhbfJNrWA==}
- '@ckeditor/ckeditor5-paste-from-office-enhanced@48.0.0':
- resolution: {integrity: sha512-nIhEVfvnd+uDA4Xp6gHK+180J89lXHjHXpn2G2uasOtvclhwBdO+8lhLxl0O8z0zvcdekDG9dye/hRjgUj8tVQ==}
+ '@ckeditor/ckeditor5-paste-from-office-enhanced@48.0.1':
+ resolution: {integrity: sha512-t4RZj7tZgMV4qZ/MnKo8IB2ntyj9fMMpTJpjnl0WbV69AeQACrnbMmTKfRGhm9oMSJk5loP5baFwa2qNxV3Z4g==}
- '@ckeditor/ckeditor5-paste-from-office@48.0.0':
- resolution: {integrity: sha512-7fj6hqWScR9w/cfmGrnNNxWkYIWTR5ffqM0zmw+HR0DpItRjLCVBrRUp0oqmLs6CFqq2TY3rerFy/NjYaJkvuA==}
+ '@ckeditor/ckeditor5-paste-from-office@48.0.1':
+ resolution: {integrity: sha512-vla3v7zsLz6JctSnn4XzxexE2DH6bpF7A4BNYsIsS1qeBIYmuvOU0gsVI6+viBQTGfDx++p1GGar7XuaR0loUA==}
- '@ckeditor/ckeditor5-real-time-collaboration@48.0.0':
- resolution: {integrity: sha512-GtepxByk1j75m+t0waq5pau9nG1Ttzd6jeYrSrFJWkEr8eKlMgyZqeMV2T2UMdRp765X/PdZDw+ob+uRM7tGjA==}
+ '@ckeditor/ckeditor5-real-time-collaboration@48.0.1':
+ resolution: {integrity: sha512-o31M2UDGjeE/UK/116kwIBlBAyCsPI86YHjWGsFYaWBW2aWSv8nWS6GlqXbTs8LDG99s1OtuVBcf6FxqCJd0Lw==}
- '@ckeditor/ckeditor5-remove-format@48.0.0':
- resolution: {integrity: sha512-Xwrh114VUIhAY2FP20TLVYwFvdFgDNmpigYj3Ev9SLhVSQQimckhIxYZxXYhSlDjG6+bYiEa1NSl7BUQtG7IuA==}
+ '@ckeditor/ckeditor5-remove-format@48.0.1':
+ resolution: {integrity: sha512-LwhU/NOOjIy9ejr/zkJOBh7bTxg3kea1gXhWG7S1z6+F7K6f4mvrjiVO5yutThbp8bWLUZlKxNiSIJ79etgXdw==}
- '@ckeditor/ckeditor5-restricted-editing@48.0.0':
- resolution: {integrity: sha512-GIxCV9yyuOCP93nkndmyf11Vuqp352w1ErtZd6YxcX0+JDERTmCzAMbEQsPHsf6jKHikg5ei/FTjFl8YVs38Ag==}
+ '@ckeditor/ckeditor5-restricted-editing@48.0.1':
+ resolution: {integrity: sha512-yUIkiCC0vPo7atsC0PlKkVQDcmV4foUnZdizhdSmDnDNnDimqvLNIa0pGDb9D2MrMVUMPhv+8eCE+QpOKNm/+Q==}
- '@ckeditor/ckeditor5-revision-history@48.0.0':
- resolution: {integrity: sha512-Ald+7ACalqcm96fRUhnOYbyz/vbFGuaIJIeoSiM9XflwvTSfzdumyxrrcULYDWgJ1wMcpmLKThjFcOk69glwNw==}
+ '@ckeditor/ckeditor5-revision-history@48.0.1':
+ resolution: {integrity: sha512-fVi20dLjB1VL0iWzUp9FQe1tQwoUMSJzCQmVg7dVvUa+KW1s4c4s71wfEbThqP1w1y9+xGhz7klsH5k9TBrBpg==}
- '@ckeditor/ckeditor5-select-all@48.0.0':
- resolution: {integrity: sha512-YnhvKuoetfulualgCphPKrY9DIg8ZDa5+P8Dh2lmWt0bOSDBZ4yKoLLxTccUOweRQFnYP0vRCc/YDnKGh2nhhA==}
+ '@ckeditor/ckeditor5-select-all@48.0.1':
+ resolution: {integrity: sha512-KoAQnaJ/buWUjKgj0k/p5wsOSWfi1qEJQDHWvrKY6tPuULD1/PtqVOY124Y0zai/ndZOpvT1X0tyaOXXA2ipig==}
- '@ckeditor/ckeditor5-show-blocks@48.0.0':
- resolution: {integrity: sha512-lCtp5nF9hReBV/8QASM4seTylA58FBceL2wvwEfAocptzI7rS398nX4cBwrSbFzpE55KE225/m4L6P/4RtA/wA==}
+ '@ckeditor/ckeditor5-show-blocks@48.0.1':
+ resolution: {integrity: sha512-BR9uJxxuRhwBrVIbzw/O09q4d8iAkzz88rUHXgDe1pICzUUqrqYw0/qjzgc4EL30IvPdTtm5UmtU5dOVuFmVNg==}
- '@ckeditor/ckeditor5-slash-command@48.0.0':
- resolution: {integrity: sha512-Tra7eBkz4MyIxBogbV1i2McTskWtnEwg4+8tbBk6HqOCFqzkOuK2+z6gHpNjM6sMlUo9+jObIJQ1GNCi3jZMYg==}
+ '@ckeditor/ckeditor5-slash-command@48.0.1':
+ resolution: {integrity: sha512-W1o1ELbLwQPEyZQ1JugkK8Vd4eOCn037RUAmwZf72+eWGmfZSCP8YWfxi+dtgCOgZb3mi0sOOgmOYzinbQvyVA==}
- '@ckeditor/ckeditor5-source-editing-enhanced@48.0.0':
- resolution: {integrity: sha512-I1HtUkr+0TCmRBtOiatXEtiH77ttSVpbCr2dRLVmv0JkrHy8ocJA4BQoPudcw2CC/J/wceBbD0wXdCvmnjaPrw==}
+ '@ckeditor/ckeditor5-source-editing-enhanced@48.0.1':
+ resolution: {integrity: sha512-M7ulUy1EdKr9qUt1uERnB2ekdNAWR77i0u0d7t7Nubsiwfk2yf22/DkoE/nuvX+2om7OchTL+RxYK8AqrcxSAA==}
- '@ckeditor/ckeditor5-source-editing@48.0.0':
- resolution: {integrity: sha512-H4sNbAX+kFz1W9L860uZuZFCBxDfCodpUUk1ocoaPZcm42X2Oo8F2HlH0DWX2VJ+Fgsu9OAO25818EPOCaU7RA==}
+ '@ckeditor/ckeditor5-source-editing@48.0.1':
+ resolution: {integrity: sha512-n+uSghFxWyMg1DEWme14A8n/FLWglRtuIRBpgcUbft0Rdpe3nD44uCFNjmgbYhHjGX+Bz3DBrEbSnKxquv7kdw==}
- '@ckeditor/ckeditor5-special-characters@48.0.0':
- resolution: {integrity: sha512-sfbRkC4syER66Pr3E9WIcgSaOIS8ZX7MkronAthP3lVHI5jBkyyJduOgPyvC6f8fcTd/Dclr5Bs8sqZUzGEG1A==}
+ '@ckeditor/ckeditor5-special-characters@48.0.1':
+ resolution: {integrity: sha512-ZziowQbdNUFokvjlIe6ZBg+3IYyUW4vUiEaudiA9NPN15W6dXvJNyJ0ECYako8NtcVLB8OBR/Ow/q723TIcGQA==}
- '@ckeditor/ckeditor5-style@48.0.0':
- resolution: {integrity: sha512-nQMrg6RwSEXz8VYT3w05CGUTZb8guhJkdwgNJVnYexQReDeJxElGBfXnjitEisd1gxaiWBMKiuqv0nKLlqyhsQ==}
+ '@ckeditor/ckeditor5-style@48.0.1':
+ resolution: {integrity: sha512-bX+OaEHlvno4TrqkSB2b5J76r0zhovfRbpMzyS4Ij1KWJyVKVMesEt4tOeasUYN34q62DKQBO6aCksiuzk8r3A==}
- '@ckeditor/ckeditor5-table@48.0.0':
- resolution: {integrity: sha512-opm+ZRxmfEZJdVh4OZ9koTmCm7ecdTRIoYOWHwUufZyi6jIy8Ea1kCYL2s86fLHgpUHTq28yP8wI2UN4b4Riag==}
+ '@ckeditor/ckeditor5-table@48.0.1':
+ resolution: {integrity: sha512-RVnNxYprfDE8AQtvIxZT1JJZ2En7aj/qKA+lo5E6j0CngmGRLTkXHTcTXy5YuwdKMo8RM1SAAexNzlvLHHqRQA==}
- '@ckeditor/ckeditor5-template@48.0.0':
- resolution: {integrity: sha512-3IglxnG6MbqzccqD7C0x7TAy5JPdsr524mcbln2zb6gMFjwoREDq/b9Yz3zp/8BEbX5Qm8okb5pWkInedk/C0Q==}
+ '@ckeditor/ckeditor5-template@48.0.1':
+ resolution: {integrity: sha512-ekhttSF0h8AopfHjdSsC2YOBpL0yJUpGri9yMoLzEe/G5LW4fQCwkMyo2gXMOyT6qBjNXx4idIy2q14g6su5eA==}
- '@ckeditor/ckeditor5-track-changes@48.0.0':
- resolution: {integrity: sha512-s3GcNRi3xOs+B5N+jpbvm4Rh9iBn7PQmfYnFEBQ/UZsNqN/uZ4+2FOFB3fu4BatC+cnqiK8xvvvs14/z+JoZEw==}
+ '@ckeditor/ckeditor5-track-changes@48.0.1':
+ resolution: {integrity: sha512-5OjoPYwUQj+UxDu1piv/+/AKUFMlslrF3kG1EbZDHQq5pSysvjfBb2GYdIn6dQVZEUL6rE0nOvPV3INI2R80hw==}
- '@ckeditor/ckeditor5-typing@48.0.0':
- resolution: {integrity: sha512-mJogY78t6qWcTnwwHQKzkzUrRtP16E+tVnUsBlvMsn0RJzyZAORVHxSrUkNhfFTrW6TwrSYtDjBY6+I1f4m9fA==}
+ '@ckeditor/ckeditor5-typing@48.0.1':
+ resolution: {integrity: sha512-mfUHVEnm4XuyWofg/4o+DL6h4WPPanToEJL0Ku5QZhZNqJ1jysCADXAkmOwzkSXowT4y/dyGF9do6Z8DL3PH5w==}
- '@ckeditor/ckeditor5-ui@48.0.0':
- resolution: {integrity: sha512-CzjQPUj4W8BEscJwCfm9iwLMTyBwIiT0KXF4RbTqZ4YgDJhurCquYF1JOfttGBYYlX1qdXmuMMTbDF8mYH1pWA==}
+ '@ckeditor/ckeditor5-ui@48.0.1':
+ resolution: {integrity: sha512-pRZBfqPBPXo9BaKgY+YeYg9atr7V/5MhUKDjI9WBAkg5JVKqR6eih2F9NjhrCbMEP0CeJKxdjgfl6SipnZkVkg==}
- '@ckeditor/ckeditor5-undo@48.0.0':
- resolution: {integrity: sha512-DQTi8si89EQSWwAqGwOGEdt9jm3u0RQME9RknSHw/AylNutlEg6BykvVRA5fWi3cXPv/agKZjdohFGJ1ZOQALA==}
+ '@ckeditor/ckeditor5-undo@48.0.1':
+ resolution: {integrity: sha512-OMezYgjdQ2ZFYM/+Z52CEGCIHIofX/MvSy/jVGXaY5ROS54prjfxkEq20yr1DepRCck319cOOCpRa9SbA/+byA==}
- '@ckeditor/ckeditor5-upload@48.0.0':
- resolution: {integrity: sha512-S0tOjeX6jJ7RspT0UXuxmXa/xZPQvTP0G5qQXeWPeNhaTazz8BQeZC8xzGhqLywClvFEKuBY+3fQaNz5nkijVw==}
+ '@ckeditor/ckeditor5-upload@48.0.1':
+ resolution: {integrity: sha512-ssABMlpkCCXqJOZwPerqSDND5TTMGuc6h9hZ28QdMTf/wAa5DL+XdZeMSTbEU5L4PjcBtbh9ri6iLJ33c9Hxrw==}
- '@ckeditor/ckeditor5-uploadcare@48.0.0':
- resolution: {integrity: sha512-ePe4HINpXv+EILlTbbrJ6bJ7fIqJBQqAm+7nPVuu3995ETYIdKGcrhEl5j7mX4cDI8LNIWjX5ixDn1HgOxO9DQ==}
+ '@ckeditor/ckeditor5-uploadcare@48.0.1':
+ resolution: {integrity: sha512-tyDcvhnf5c1ymn5vAj3BkofaYnn9mWsBhJoAIge8X4rqZBIsioscsUmj95shQ9ErSDn50ivyTzi11MQn7R0hCQ==}
- '@ckeditor/ckeditor5-utils@48.0.0':
- resolution: {integrity: sha512-EXPeI4uc3aizehvfgxnc9Ryt0qa1xvoow0BJ+T97ijOQ2XL+gaA5+NGvnIBiYshXQFtrYHW1zJ62Q8yWGUx7Wg==}
+ '@ckeditor/ckeditor5-utils@48.0.1':
+ resolution: {integrity: sha512-Oe0yUdgwJG7vSQZ0lLF04mG8EAgkE21norfVc3hyp8zJV24MB13/6lyZe3dhmWO20tEFrppXIDiEaN94nblpew==}
- '@ckeditor/ckeditor5-watchdog@48.0.0':
- resolution: {integrity: sha512-CE+y4am+dkfbb6zePcy5mxIGdcaJgOD09VLBOWDTQGlM6Lw48kQ9FDzp7y0L6tEaJYLjcuG16kNyEKFAOFK81w==}
+ '@ckeditor/ckeditor5-watchdog@48.0.1':
+ resolution: {integrity: sha512-Rpn8kXTHidmozRiB7lcX5lsYl2IIQfiWNQ+rskYBNZsctOJlViPXDyyXk5yG8aSBjk1bKIbCa8wlCBrqkWqL1g==}
- '@ckeditor/ckeditor5-widget@48.0.0':
- resolution: {integrity: sha512-10d4WNxTApQVTFrBV0PIVsctr5KUUuAkbZPj+30TLlptJCAx8vK0P0BG/UjtNWWNNUAoKzJ9dQD4gvzXnvte0Q==}
+ '@ckeditor/ckeditor5-widget@48.0.1':
+ resolution: {integrity: sha512-bMyJW4uNIqPg4OoSCBs6AVTct8GTak8LiDZeKoA8u+yUMDb4SbLP4+5RmrGQusSseSZ6Kcf3ZMpnnhXTwtTp6w==}
- '@ckeditor/ckeditor5-word-count@48.0.0':
- resolution: {integrity: sha512-NfEGWQmRia5TmGmz/LfDLSCazvsb0LydJOQAa5tGbX9OVDiiWX9/CSTPS8tGV9s15rAKExd1WAp/kJURFKt4BQ==}
+ '@ckeditor/ckeditor5-word-count@48.0.1':
+ resolution: {integrity: sha512-U7mSd7AGQzWYS0W2BiicIC0RvawcCj8kARKtPjcqV50d80hgR4BPjOtNAM9u2hDfHwT8yat7KG3NJ4cyOiXUQw==}
'@codemirror/autocomplete@6.18.6':
resolution: {integrity: sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==}
@@ -2381,8 +2404,8 @@ packages:
'@codemirror/lint@6.8.5':
resolution: {integrity: sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==}
- '@codemirror/search@6.6.0':
- resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==}
+ '@codemirror/search@6.7.0':
+ resolution: {integrity: sha512-ZvGm99wc/s2cITtMT15LFdn8aH/aS+V+DqyGq/N5ZlV5vWtH+nILvC2nw0zX7ByNoHHDZ2IxxdW38O0tc5nVHg==}
'@codemirror/state@6.6.0':
resolution: {integrity: sha512-4nbvra5R5EtiCzr9BTHiTLc+MLXK2QGiAVYMyi8PkQd3SR+6ixar/Q/01Fa21TBIDOZXgeWV4WppsQolSreAPQ==}
@@ -2390,8 +2413,8 @@ packages:
'@codemirror/theme-one-dark@6.1.2':
resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==}
- '@codemirror/view@6.41.0':
- resolution: {integrity: sha512-6H/qadXsVuDY219Yljhohglve8xf4B8xJkVOEWfA5uiYKiTFppjqsvsfR5iPA0RbvRBoOyTZpbLIxe9+0UR8xA==}
+ '@codemirror/view@6.41.1':
+ resolution: {integrity: sha512-ToDnWKbBnke+ZLrP6vgTTDScGi5H37YYuZGniQaBzxMVdtCxMrslsmtnOvbPZk4RX9bvkQqnWR/WS/35tJA0qg==}
'@cortex-js/compute-engine@0.30.2':
resolution: {integrity: sha512-Zx+iisk9WWdbxjm8EYsneIBszvjfUs7BHNwf1jBtSINIgfWGpHrTTq9vW0J59iGCFt6bOFxbmWyxNMRSmksHMA==}
@@ -2627,8 +2650,8 @@ packages:
engines: {node: '>=12.13.0'}
hasBin: true
- '@electron/rebuild@4.0.3':
- resolution: {integrity: sha512-u9vpTHRMkOYCs/1FLiSVAFZ7FbjsXK+bQuzviJZa+lG7BHZl1nz52/IcGvwa3sk80/fc3llutBkbCq10Vh8WQA==}
+ '@electron/rebuild@4.0.4':
+ resolution: {integrity: sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==}
engines: {node: '>=22.12.0'}
hasBin: true
@@ -2652,6 +2675,9 @@ packages:
'@emnapi/core@1.9.2':
resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==}
+ '@emnapi/runtime@1.9.0':
+ resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==}
+
'@emnapi/runtime@1.9.1':
resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==}
@@ -3217,6 +3243,12 @@ packages:
react: ^17.0.2 || ^18.2.0 || ^19.0.0
react-dom: ^17.0.2 || ^18.2.0 || ^19.0.0
+ '@excalidraw/excalidraw@0.18.1':
+ resolution: {integrity: sha512-6i5Gt7IDTOH//qa0Z315Ly5iVRhjWpu2whrlQFqkuwrkKUWgRsMk0P5qdE7bpyDpai7jeLeWYkyj1eVAfni1lw==}
+ peerDependencies:
+ react: ^17.0.2 || ^18.2.0 || ^19.0.0
+ react-dom: ^17.0.2 || ^18.2.0 || ^19.0.0
+
'@excalidraw/laser-pointer@1.3.1':
resolution: {integrity: sha512-psA1z1N2qeAfsORdXc9JmD2y4CmDwmuMRxnNdJHZexIcPwaNEyIpNcelw+QkL9rz9tosaN9krXuKaRqYpRAR6g==}
@@ -3226,6 +3258,9 @@ packages:
'@excalidraw/mermaid-to-excalidraw@1.1.2':
resolution: {integrity: sha512-hAFv/TTIsOdoy0dL5v+oBd297SQ+Z88gZ5u99fCIFuEMHfQuPgLhU/ztKhFSTs7fISwVo6fizny/5oQRR3d4tQ==}
+ '@excalidraw/mermaid-to-excalidraw@2.2.2':
+ resolution: {integrity: sha512-5VKQq5CdRocC82vOIUpQ5ufJOVV9FpBTdHGA+ULqazeIVV+cr299877omQCibsdS3Bpitz2fsnTwnIXEmLVDSg==}
+
'@excalidraw/random-username@1.1.0':
resolution: {integrity: sha512-nULYsQxkWHnbmHvcs+efMkJ4/9TtvNyFeLyHdeGxW0zHs6P+jYVqcRff9A6Vq9w9JXeDRnRh2VKvTtS19GW2qA==}
engines: {node: '>=10'}
@@ -4114,6 +4149,9 @@ packages:
peerDependencies:
mermaid: 11.14.0
+ '@mermaid-js/parser@0.6.3':
+ resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==}
+
'@mermaid-js/parser@1.1.0':
resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==}
@@ -4233,6 +4271,12 @@ packages:
'@emnapi/core': ^1.7.1
'@emnapi/runtime': ^1.7.1
+ '@napi-rs/wasm-runtime@1.1.4':
+ resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==}
+ 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==}
@@ -4255,10 +4299,6 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@npmcli/agent@3.0.0':
- resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
'@npmcli/agent@4.0.0':
resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -4360,8 +4400,8 @@ packages:
'@oxc-project/types@0.123.0':
resolution: {integrity: sha512-YtECP/y8Mj1lSHiUWGSRzy/C6teUKlS87dEfuVKT09LgQbUsBW1rNg+MiJ4buGu3yuADV60gbIvo9/HplA56Ew==}
- '@oxc-project/types@0.124.0':
- resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==}
+ '@oxc-project/types@0.126.0':
+ resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==}
'@panva/asn1.js@1.0.0':
resolution: {integrity: sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==}
@@ -5202,8 +5242,8 @@ packages:
'@redocly/cli-otel@0.1.2':
resolution: {integrity: sha512-Bg7BoO5t1x3lVK+KhA5aGPmeXpQmdf6WtTYHhelKJCsQ+tRMiJoFAQoKHoBHAoNxXrhlS3K9lKFLHGmtxsFQfA==}
- '@redocly/cli@2.28.0':
- resolution: {integrity: sha512-hAHtMjo4fLdLqZXtZwQqlwGnAiOzEAh7EPbE01rs9j7cewj2btOXrGQW8v6Eg3gDh+i77/DOxxazRWvZ/zAa7w==}
+ '@redocly/cli@2.29.1':
+ resolution: {integrity: sha512-n85tU21emkYc1k7IZhOFqIrEQizvQuHzHMOwcMZ503XNhzf9OYLLQ8AEcQl1hjpUGtJWsMeSJbpuEwewgb4T0Q==}
engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'}
hasBin: true
@@ -5217,12 +5257,12 @@ packages:
resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==}
engines: {node: '>=18.17.0', npm: '>=9.5.0'}
- '@redocly/openapi-core@2.28.0':
- resolution: {integrity: sha512-Htpp4PsjKMgEuMT9iJu4iuFFzWCDe8FylvpGaQEA5D7jZXWv+8XvnqhpGCKN2cM/n/Uri2QfqNdw0JlKIC59sg==}
+ '@redocly/openapi-core@2.29.1':
+ resolution: {integrity: sha512-T9FeS2+lpXR9V/XHqiJ53uGjoF1Hs80nRA9ACEXpTLF9a4jzzSANO92/f9HKuQvl0bHgyaIbP5OsBgVU3EP1KQ==}
engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'}
- '@redocly/respect-core@2.28.0':
- resolution: {integrity: sha512-svjCRzXsj/EyN7chfB9pTVYvWT1+hlOqMkZVlkrH6PqFKXAHYeP47YRW9+3omUSDBd1Ph4A4J4NBUW1PRph5+g==}
+ '@redocly/respect-core@2.29.1':
+ resolution: {integrity: sha512-TklpmSho4nSp2ySXWRUJlFQaHoN4BtSTTWabzQPetblAJ6KRVZtgFk6x8eD8KwWUaJj8c7ed4/KAIHOqTdNVxg==}
engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'}
'@replit/codemirror-indentation-markers@6.5.3':
@@ -5258,8 +5298,8 @@ packages:
cpu: [arm64]
os: [android]
- '@rolldown/binding-android-arm64@1.0.0-rc.15':
- resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==}
+ '@rolldown/binding-android-arm64@1.0.0-rc.16':
+ resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
@@ -5270,8 +5310,8 @@ packages:
cpu: [arm64]
os: [darwin]
- '@rolldown/binding-darwin-arm64@1.0.0-rc.15':
- resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==}
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.16':
+ resolution: {integrity: sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
@@ -5282,8 +5322,8 @@ packages:
cpu: [x64]
os: [darwin]
- '@rolldown/binding-darwin-x64@1.0.0-rc.15':
- resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==}
+ '@rolldown/binding-darwin-x64@1.0.0-rc.16':
+ resolution: {integrity: sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
@@ -5294,8 +5334,8 @@ packages:
cpu: [x64]
os: [freebsd]
- '@rolldown/binding-freebsd-x64@1.0.0-rc.15':
- resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==}
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.16':
+ resolution: {integrity: sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
@@ -5306,8 +5346,8 @@ packages:
cpu: [arm]
os: [linux]
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15':
- resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==}
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16':
+ resolution: {integrity: sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
@@ -5319,8 +5359,8 @@ packages:
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15':
- resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==}
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16':
+ resolution: {integrity: sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
@@ -5333,8 +5373,8 @@ packages:
os: [linux]
libc: [musl]
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15':
- resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==}
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16':
+ resolution: {integrity: sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
@@ -5347,8 +5387,8 @@ packages:
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15':
- resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==}
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16':
+ resolution: {integrity: sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
@@ -5361,8 +5401,8 @@ packages:
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15':
- resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==}
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16':
+ resolution: {integrity: sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
@@ -5375,8 +5415,8 @@ packages:
os: [linux]
libc: [glibc]
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15':
- resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==}
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16':
+ resolution: {integrity: sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
@@ -5389,8 +5429,8 @@ packages:
os: [linux]
libc: [musl]
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.15':
- resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==}
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.16':
+ resolution: {integrity: sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
@@ -5402,8 +5442,8 @@ packages:
cpu: [arm64]
os: [openharmony]
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.15':
- resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==}
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.16':
+ resolution: {integrity: sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
@@ -5413,9 +5453,9 @@ packages:
engines: {node: '>=14.0.0'}
cpu: [wasm32]
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.15':
- resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==}
- engines: {node: '>=14.0.0'}
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.16':
+ resolution: {integrity: sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [wasm32]
'@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13':
@@ -5424,8 +5464,8 @@ packages:
cpu: [arm64]
os: [win32]
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15':
- resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==}
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16':
+ resolution: {integrity: sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
@@ -5436,8 +5476,8 @@ packages:
cpu: [x64]
os: [win32]
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15':
- resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==}
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16':
+ resolution: {integrity: sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
@@ -5445,8 +5485,8 @@ packages:
'@rolldown/pluginutils@1.0.0-rc.13':
resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==}
- '@rolldown/pluginutils@1.0.0-rc.15':
- resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==}
+ '@rolldown/pluginutils@1.0.0-rc.16':
+ resolution: {integrity: sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==}
'@rollup/plugin-buble@1.0.3':
resolution: {integrity: sha512-QYD9BKkJoof0FdCFeSYYhF6/Y8e0Mnf+098xGgmWOFJ4UPHlWujjqOYeVwEm2hJPOmlR5k7HPUdAjqtOWhN64Q==}
@@ -6102,6 +6142,9 @@ packages:
'@types/tabulator-tables@6.3.1':
resolution: {integrity: sha512-qL05wGXVy0yfWcF8LCE9+9uSeUIpeKdgpm8YmOAPTjLd3FaoZziPOhVxIiLzEhLTFfOvbuwnaWDm4v4i87diRQ==}
+ '@types/tabulator-tables@6.3.2':
+ resolution: {integrity: sha512-ox1MLWti8gNnWMNYd0Kob2nRNxttvjB0FwtZkWC3MkDtO9SdOe785dfEN+8Bjmrn9x5RzGR6Lj837Icr0seOeg==}
+
'@types/tmp@0.2.6':
resolution: {integrity: sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA==}
@@ -6141,122 +6184,63 @@ packages:
'@types/yauzl@2.10.3':
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
- '@typescript-eslint/eslint-plugin@8.58.1':
- resolution: {integrity: sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ==}
+ '@typescript-eslint/eslint-plugin@8.59.0':
+ resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.58.1
+ '@typescript-eslint/parser': ^8.59.0
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/eslint-plugin@8.58.2':
- resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- '@typescript-eslint/parser': ^8.58.2
- eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
- typescript: '>=4.8.4 <6.1.0'
-
- '@typescript-eslint/parser@8.58.1':
- resolution: {integrity: sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw==}
+ '@typescript-eslint/parser@8.59.0':
+ resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==}
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/parser@8.58.2':
- resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==}
+ '@typescript-eslint/project-service@8.59.0':
+ resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/scope-manager@8.59.0':
+ resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/tsconfig-utils@8.59.0':
+ resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <6.1.0'
+
+ '@typescript-eslint/type-utils@8.59.0':
+ resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==}
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/project-service@8.58.1':
- resolution: {integrity: sha512-gfQ8fk6cxhtptek+/8ZIqw8YrRW5048Gug8Ts5IYcMLCw18iUgrZAEY/D7s4hkI0FxEfGakKuPK/XUMPzPxi5g==}
+ '@typescript-eslint/types@8.59.0':
+ resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.59.0':
+ resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==}
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.2':
- resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <6.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/scope-manager@8.58.2':
- resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.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/tsconfig-utils@8.58.2':
- resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <6.1.0'
-
- '@typescript-eslint/type-utils@8.58.1':
- resolution: {integrity: sha512-HUFxvTJVroT+0rXVJC7eD5zol6ID+Sn5npVPWoFuHGg9Ncq5Q4EYstqR+UOqaNRFXi5TYkpXXkLhoCHe3G0+7w==}
+ '@typescript-eslint/utils@8.59.0':
+ resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==}
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/type-utils@8.58.2':
- resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==}
- 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/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/types@8.58.2':
- resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
- '@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:
- typescript: '>=4.8.4 <6.1.0'
-
- '@typescript-eslint/typescript-estree@8.58.2':
- resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- 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/utils@8.58.2':
- resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==}
- 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.58.1':
- resolution: {integrity: sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
- '@typescript-eslint/visitor-keys@8.58.2':
- resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==}
+ '@typescript-eslint/visitor-keys@8.59.0':
+ resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.3.0':
@@ -6819,40 +6803,40 @@ packages:
'@upsetjs/venn.js@2.0.0':
resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==}
- '@vercel/oidc@3.1.0':
- resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==}
+ '@vercel/oidc@3.2.0':
+ resolution: {integrity: sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug==}
engines: {node: '>= 20'}
- '@vitest/browser-webdriverio@4.1.4':
- resolution: {integrity: sha512-AhBipo9kfFpZ11Vx+kLD6rwJ+pnp/TpYm7tA1jOh1t1DMoj4IrofW82vW9EUY4Tmx2s/aWDxPDjrYMSoyilt8w==}
+ '@vitest/browser-webdriverio@4.1.5':
+ resolution: {integrity: sha512-irkLM1yClclWZL38CnklUsywd+DkJXHXys+BGOL4A9qiV2h1riSrXu1E7XVuGaxXvsJ55cUlVyV7x5mw3pDR6A==}
peerDependencies:
- vitest: 4.1.4
+ vitest: 4.1.5
webdriverio: '*'
- '@vitest/browser@4.1.4':
- resolution: {integrity: sha512-TrNaY/yVOwxtrxNsDUC/wQ56xSwplpytTeRAqF/197xV/ZddxxulBsxR6TrhVMyniJmp9in8d5u0AcDaNRY30w==}
+ '@vitest/browser@4.1.5':
+ resolution: {integrity: sha512-iCDGI8c4yg+xmjUg2VsygdAUSIIB4x5Rht/P68OXy1hPELKXHDkzh87lkuTcdYmemRChDkEpB426MmDjzC0ziA==}
peerDependencies:
- vitest: 4.1.4
+ vitest: 4.1.5
- '@vitest/coverage-istanbul@4.1.4':
- resolution: {integrity: sha512-Pyi4F8RnqU6hBGiIDhS/e8gVD4FRcUvZJ2AbFiIlmIxHlEIsKyCxGOqufCECobty/dXELcN8oIH4Gms3hVOCYA==}
+ '@vitest/coverage-istanbul@4.1.5':
+ resolution: {integrity: sha512-X4kQMDEWh9mA0IiLuigtdYv4kXe+W8KLTbucoz15lbyZRPAxT5l+hu0JizI7Am050+G9vQnB7QJNgYi2LnwV4w==}
peerDependencies:
- vitest: 4.1.4
+ vitest: 4.1.5
- '@vitest/coverage-v8@4.1.4':
- resolution: {integrity: sha512-x7FptB5oDruxNPDNY2+S8tCh0pcq7ymCe1gTHcsp733jYjrJl8V1gMUlVysuCD9Kz46Xz9t1akkv08dPcYDs1w==}
+ '@vitest/coverage-v8@4.1.5':
+ resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==}
peerDependencies:
- '@vitest/browser': 4.1.4
- vitest: 4.1.4
+ '@vitest/browser': 4.1.5
+ vitest: 4.1.5
peerDependenciesMeta:
'@vitest/browser':
optional: true
- '@vitest/expect@4.1.4':
- resolution: {integrity: sha512-iPBpra+VDuXmBFI3FMKHSFXp3Gx5HfmSCE8X67Dn+bwephCnQCaB7qWK2ldHa+8ncN8hJU8VTMcxjPpyMkUjww==}
+ '@vitest/expect@4.1.5':
+ resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==}
- '@vitest/mocker@4.1.4':
- resolution: {integrity: sha512-R9HTZBhW6yCSGbGQnDnH3QHfJxokKN4KB+Yvk9Q1le7eQNYwiCyKxmLmurSpFy6BzJanSLuEUDrD+j97Q+ZLPg==}
+ '@vitest/mocker@4.1.5':
+ resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==}
peerDependencies:
msw: ^2.4.9
vite: '>=7.3.2'
@@ -6862,25 +6846,25 @@ packages:
vite:
optional: true
- '@vitest/pretty-format@4.1.4':
- resolution: {integrity: sha512-ddmDHU0gjEUyEVLxtZa7xamrpIefdEETu3nZjWtHeZX4QxqJ7tRxSteHVXJOcr8jhiLoGAhkK4WJ3WqBpjx42A==}
+ '@vitest/pretty-format@4.1.5':
+ resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==}
- '@vitest/runner@4.1.4':
- resolution: {integrity: sha512-xTp7VZ5aXP5ZJrn15UtJUWlx6qXLnGtF6jNxHepdPHpMfz/aVPx+htHtgcAL2mDXJgKhpoo2e9/hVJsIeFbytQ==}
+ '@vitest/runner@4.1.5':
+ resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==}
- '@vitest/snapshot@4.1.4':
- resolution: {integrity: sha512-MCjCFgaS8aZz+m5nTcEcgk/xhWv0rEH4Yl53PPlMXOZ1/Ka2VcZU6CJ+MgYCZbcJvzGhQRjVrGQNZqkGPttIKw==}
+ '@vitest/snapshot@4.1.5':
+ resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==}
- '@vitest/spy@4.1.4':
- resolution: {integrity: sha512-XxNdAsKW7C+FLydqFJLb5KhJtl3PGCMmYwFRfhvIgxJvLSXhhVI1zM8f1qD3Zg7RCjTSzDVyct6sghs9UEgBEQ==}
+ '@vitest/spy@4.1.5':
+ resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==}
- '@vitest/ui@4.1.4':
- resolution: {integrity: sha512-EgFR7nlj5iTDYZYCvavjFokNYwr3c3ry0sFiCg+N7B233Nwp+NNx7eoF/XvMWDCKY71xXAG3kFkt97ZHBJVL8A==}
+ '@vitest/ui@4.1.5':
+ resolution: {integrity: sha512-3Z9HNFiV0IF1fk0JPiK+7kE1GcaIPefQQIBYur6PM5yFIq6agys3uqP/0t966e1wXfmjbRCHDe7qW236Xjwnag==}
peerDependencies:
- vitest: 4.1.4
+ vitest: 4.1.5
- '@vitest/utils@4.1.4':
- resolution: {integrity: sha512-13QMT+eysM5uVGa1rG4kegGYNp6cnQcsTc67ELFbhNLQO+vgsygtYJx2khvdt4gVQqSSpC/KT5FZZxUpP3Oatw==}
+ '@vitest/utils@4.1.5':
+ resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==}
'@volar/language-core@2.4.13':
resolution: {integrity: sha512-MnQJ7eKchJx5Oz+YdbqyFUk8BN6jasdJv31n/7r6/WwlOOv7qzvot6B66887l2ST3bUW4Mewml54euzpJWA6bg==}
@@ -7034,10 +7018,6 @@ packages:
abbrev@1.1.1:
resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
- abbrev@3.0.1:
- resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
abbrev@4.0.0:
resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -7113,8 +7093,8 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
- ai@6.0.161:
- resolution: {integrity: sha512-ufhmijmx2YyWTPAicGgtpLOB/xD7mG8zKs1pT1Trj+JL/3r1rS8fkMi/cHZoChSAQSGB4pgmcWVxDrVTUvK2IQ==}
+ ai@6.0.168:
+ resolution: {integrity: sha512-2HqCJuO+1V2aV7vfYs5LFEUfxbkGX+5oa54q/gCCTL7KLTdbxcCu5D7TdLA5kwsrs3Szgjah9q6D9tpjHM3hUQ==}
engines: {node: '>=18'}
peerDependencies:
zod: ^3.25.76 || ^4.1.8
@@ -7581,10 +7561,6 @@ packages:
resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
- cacache@19.0.1:
- resolution: {integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
cacache@20.0.1:
resolution: {integrity: sha512-+7LYcYGBYoNqTp1Rv7Ny1YjUo5E0/ftkQtraH3vkfAGgVHc+ouWdC8okAwQgQR7EVIdW6JTzTmhKFwzb+4okAQ==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -7695,6 +7671,9 @@ packages:
peerDependencies:
chevrotain: ^11.0.0
+ chevrotain@11.0.3:
+ resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==}
+
chevrotain@11.1.1:
resolution: {integrity: sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==}
@@ -7741,13 +7720,13 @@ packages:
resolution: {integrity: sha512-m+gbmlIP6gAG7tDvo2kpeSPAz/uh5wY5/zx10ymjdpbbiTHNTNoYnP2lCiyqtmbLxwhEdq8/lsVbsy4GTc9oUw==}
engines: {node: '>=16'}
- ckeditor5-premium-features@48.0.0:
- resolution: {integrity: sha512-oOHmTAxevQDMQU56kPix4yA73pJubljlFePFhM8e8iK7PK8TErWG70LWR5ODWlV1WeBZwZMHutey6JaRIq2pkA==}
+ ckeditor5-premium-features@48.0.1:
+ resolution: {integrity: sha512-GRlfDfjvxmRIERQWoRgeq3y2a+c7vWRI5qakko49i7FPOn/0nThAtg+4zo0uGgCPPcklIpwSdBu4tmdbRNtGlg==}
peerDependencies:
- ckeditor5: 48.0.0
+ ckeditor5: 48.0.1
- ckeditor5@48.0.0:
- resolution: {integrity: sha512-DALFz+yuNaZTqguQHNRrlordhnlpuUfuhg4Juqm1KR1p6+ZvD7+mvpdTyh9L3Rg2FxE2+U+Ote7wV4kjN7g0MQ==}
+ ckeditor5@48.0.1:
+ resolution: {integrity: sha512-8db92XXDEwU7KkwGBjMrWlfKifI+ISw9DHvZVMK7khY69CyAJizl9TjDQiDT0l+05KkgETzDvZ0j4RYvKq0wUg==}
class-variance-authority@0.7.1:
resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
@@ -8561,8 +8540,8 @@ packages:
resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
engines: {node: '>= 4'}
- dompurify@3.4.0:
- resolution: {integrity: sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==}
+ dompurify@3.4.1:
+ resolution: {integrity: sha512-JahakDAIg1gyOm7dlgWSDjV4n7Ip2PKR55NIT6jrMfIgLFgWo81vdr1/QGqWtFNRqXP9UV71oVePtjqS2ebnPw==}
domutils@2.8.0:
resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
@@ -8679,8 +8658,8 @@ packages:
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
engines: {node: '>=8.0.0'}
- electron@41.2.0:
- resolution: {integrity: sha512-0OKLiymqfV0WK68RBXqAm3Myad2TpI5wwxLCBEUcH5Nugo3YfSk7p1Js/AL9266qTz5xZioUnxt9hG8FFwax0g==}
+ electron@41.3.0:
+ resolution: {integrity: sha512-2Q5aeocmFdeheZGDUTrAvSR3t+n0c3d104AJWWEnt7syJU0tE4VdibMYaPtQ47QuXSoUf0/xSsfUUvu/uSXIfg==}
engines: {node: '>= 12.20.55'}
hasBin: true
@@ -8860,8 +8839,8 @@ packages:
engines: {node: '>=6.0'}
hasBin: true
- eslint-config-ckeditor5@14.1.0:
- resolution: {integrity: sha512-mDDu0YB/GnoIXbXKCldUaEsC+Z/5lZVrHetEvpP8MI0zuWChbNBrPIokeQ829Yz7uSF7PEk8bFPXktwAK2ccQA==}
+ eslint-config-ckeditor5@15.0.0:
+ resolution: {integrity: sha512-XpemPdkTE96OIRIBNbbVovqw/KejKheCHL3tlil0vz8mDdVp/TO7Cj81GEvHz2jdoR4SuY1GCTFUp8FzMRhdHg==}
engines: {node: '>=24.11.0'}
peerDependencies:
eslint: ^9.0.0
@@ -8881,8 +8860,8 @@ packages:
eslint-linter-browserify@10.2.1:
resolution: {integrity: sha512-vtIHGDSGZE9x2S4G1e76naWHYFu0T3BBYya3TnAM5lkwUctKrER5J/VY3vbzZYb7AIXOHJ5+frQh4WA6clGxCg==}
- eslint-plugin-ckeditor5-rules@14.1.0:
- resolution: {integrity: sha512-ssewEesRNL0MVfNTraM7l8xtTfBKmlNIjK0kCXsiJgLanmoRn0CZ1LEepICZifNx2eKzCf5tF+6phYVleh88PA==}
+ eslint-plugin-ckeditor5-rules@15.0.0:
+ resolution: {integrity: sha512-naZRNFCpiEhanWKaCqqgxB9hlx+K8RmKATkVwxt4z7nPQnPjg5Yh2UYAoBtCBXhG9iiHclR35T4b694o0KynTw==}
engines: {node: '>=24.11.0'}
eslint-plugin-compat@6.0.2:
@@ -8896,8 +8875,8 @@ packages:
peerDependencies:
eslint: '>=9.0.0'
- eslint-plugin-playwright@2.10.1:
- resolution: {integrity: sha512-qea3UxBOb8fTwJ77FMApZKvRye5DOluDHcev0LDJwID3RELeun0JlqzrNIXAB/SXCyB/AesCW/6sZfcT9q3Edg==}
+ eslint-plugin-playwright@2.10.2:
+ resolution: {integrity: sha512-0N+2OWc3NZbOZ0gK8mp2TK6Qu3UWcJTQ9rqU0UM2yRJXgT758pvpY0lsOLIySfbyFrLqn3TcXjixbmcK90VnuQ==}
engines: {node: '>=16.9.0'}
peerDependencies:
eslint: '>=8.40.0'
@@ -9855,6 +9834,9 @@ packages:
i18next-http-backend@3.0.4:
resolution: {integrity: sha512-udwrBIE6cNpqn1gRAqRULq3+7MzIIuaiKRWrz++dVz5SqWW2VwXmPJtAgkI0JtMLFaADC9qNmnZAxWAhsxXx2g==}
+ i18next-http-backend@3.0.5:
+ resolution: {integrity: sha512-QaWHnsxieEDcqKe+vo/RFqpiIFRi/KBqlOSPcUlvinBaISCeiTRCbtrazHAjtHtsLC66oDsROAH8frWkQzfMMQ==}
+
i18next@26.0.5:
resolution: {integrity: sha512-9uHb4T27TdV36phJXcbpnRPt5yzAfqHXVrdASvmHZyPuZJtrLythd+GyXhiaHV5LlpuuskbAqhwPjmfTbKbi8w==}
peerDependencies:
@@ -9863,6 +9845,14 @@ packages:
typescript:
optional: true
+ i18next@26.0.6:
+ resolution: {integrity: sha512-A4U6eCXodIbrhf8EarRurB9/4ebyaurH4+fu4gig9bqxmpSt+fCAFm/GpRQDcN1Xzu/LdFCx4nYHsnM1edIIbg==}
+ peerDependencies:
+ typescript: ^5 || ^6
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
@@ -10536,6 +10526,10 @@ packages:
resolution: {integrity: sha512-q3RBbsO5A5zrPhB6CaCS8ZUv+NWCXv6JJT4Em0i264G9W0fdPB8YRfnnEi7Dm7X7omAkBIPojzYJ2D1oHTHqug==}
engines: {node: '>=18'}
+ langium@3.3.1:
+ resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==}
+ engines: {node: '>=16.0.0'}
+
langium@4.2.1:
resolution: {integrity: sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==}
engines: {node: '>=20.10.0', npm: '>=10.2.3'}
@@ -10861,10 +10855,6 @@ packages:
resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
- make-fetch-happen@14.0.3:
- resolution: {integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
make-fetch-happen@15.0.3:
resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -10890,6 +10880,11 @@ packages:
markdown-table@3.0.4:
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+ marked-footnote@1.4.0:
+ resolution: {integrity: sha512-fZTxAhI1TcLEs5UOjCfYfTHpyKGaWQevbxaGTEA68B51l7i87SctPFtHETYqPkEN0ka5opvy4Dy1l/yXVC+hmg==}
+ peerDependencies:
+ marked: '>=7.0.0'
+
marked@16.4.2:
resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==}
engines: {node: '>= 20'}
@@ -10900,6 +10895,11 @@ packages:
engines: {node: '>= 20'}
hasBin: true
+ marked@18.0.2:
+ resolution: {integrity: sha512-NsmlUYBS/Zg57rgDWMYdnre6OTj4e+qq/JS2ot3KrYLSoHLw+sDu0Nm1ZGpRgYAq6c+b1ekaY5NzVchMCQnzcg==}
+ engines: {node: '>= 20'}
+ hasBin: true
+
marked@4.3.0:
resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==}
engines: {node: '>= 12'}
@@ -11148,6 +11148,9 @@ packages:
mind-elixir@5.10.0:
resolution: {integrity: sha512-AY/tDXz8stMbx0MIutdn63Dz0uwY1VVMKIxCqOOA2hg5WGdCGm2qqEZF498deLDxoZbL+hDf1SwBWzvWADBoPA==}
+ mind-elixir@5.11.0:
+ resolution: {integrity: sha512-KaTi6/rwFEV1deDSjXF1z7PfvjTXSpul+viGuu6LT4SD6ATLBzkkBmsz5HOmpDj/bAyFP9oGlqzScSXsiOOXUA==}
+
minimatch@10.2.5:
resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
engines: {node: 18 || 20 || >=22}
@@ -11178,10 +11181,6 @@ packages:
resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
- minipass-fetch@4.0.1:
- resolution: {integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
minipass-fetch@5.0.0:
resolution: {integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -11206,6 +11205,10 @@ packages:
resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
engines: {node: '>=8'}
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
minipass@7.1.3:
resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -11430,11 +11433,6 @@ packages:
resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
hasBin: true
- node-gyp@11.4.2:
- resolution: {integrity: sha512-3gD+6zsrLQH7DyYOUIutaauuXrcyxeTPyQuZQCQoNPZMHMMS5m4y0xclNpvYzoK3VNzuyxT6eF4mkIL4WSZ1eQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
- hasBin: true
-
node-gyp@12.2.0:
resolution: {integrity: sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -11466,11 +11464,6 @@ packages:
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
hasBin: true
- nopt@8.1.0:
- resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==}
- engines: {node: ^18.17.0 || >=20.5.0}
- hasBin: true
-
nopt@9.0.0:
resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -12035,8 +12028,8 @@ packages:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.5.9:
- resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==}
+ postcss@8.5.10:
+ resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==}
engines: {node: ^10 || ^12 || >=14}
postject@1.0.0-alpha.6:
@@ -12083,10 +12076,6 @@ packages:
resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
- proc-log@5.0.0:
- resolution: {integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
proc-log@6.1.0:
resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==}
engines: {node: ^20.17.0 || >=22.9.0}
@@ -12138,6 +12127,10 @@ packages:
resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==}
engines: {node: '>=12.0.0'}
+ protobufjs@7.5.5:
+ resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==}
+ engines: {node: '>=12.0.0'}
+
protocol-buffers-schema@3.6.1:
resolution: {integrity: sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==}
@@ -12608,8 +12601,8 @@ packages:
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
- rolldown@1.0.0-rc.15:
- resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==}
+ rolldown@1.0.0-rc.16:
+ resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -13373,8 +13366,8 @@ packages:
react-dom:
optional: true
- stylelint-config-ckeditor5@14.1.0:
- resolution: {integrity: sha512-/fGcg0+G9WrsaQoFYQdd+4cYmbE6TqB8xWQOJOv5v/AeThdYPAqQmnsks2SlFD8ulCInVn7r7shz8KeOG8hpMA==}
+ stylelint-config-ckeditor5@15.0.0:
+ resolution: {integrity: sha512-GlTwI0uuYolqbvUUeGRCY1wtpWOAa5zv5CKqJegXJmseT1wTMmiz3V5w8q4dBhIvjTDIbknts8ATDXKhcczwwg==}
engines: {node: '>=24.11.0'}
peerDependencies:
stylelint: '>=16.0.0'
@@ -13385,14 +13378,14 @@ packages:
peerDependencies:
stylelint: ^16.16.0
- stylelint-plugin-ckeditor5-rules@14.1.0:
- resolution: {integrity: sha512-Y0rm/5rf0VCbp5o4aLGboclVnBj4E6nIHHcIG8ji9BPC+bh+K9KMxjlbN3bl6wRN7RpHqpEEiWaPGmBPY5jIkw==}
+ stylelint-plugin-ckeditor5-rules@15.0.0:
+ resolution: {integrity: sha512-MiLpJqN5n+WBQJR8z3WCUZbRAjfNy/7GH3yHGTaQfF7gwMU4OcPoyFBY3UQwhMS7OpH7TvOmCekBl6+Co4/LhA==}
engines: {node: '>=24.11.0'}
peerDependencies:
stylelint: '>=16.0.0'
- stylelint@17.7.0:
- resolution: {integrity: sha512-n/+4RheCRl+cecGnF+S/Adz59iCRaK9BVznJYB+a7GOksfwNzjiOPnYv17pTO0HgRse9IiqbMtekGNhOb2tVYQ==}
+ stylelint@17.8.0:
+ resolution: {integrity: sha512-oHkld9T60LDSaUQ4CSVc+tlt9eUoDlxhaGWShsUCKyIL14boZfmK5bSphZqx64aiC5tCqX+BsQMTMoSz8D1zIg==}
engines: {node: '>=20.19.0'}
hasBin: true
@@ -13572,8 +13565,8 @@ packages:
resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==}
engines: {node: '>=18'}
- tinyglobby@0.2.15:
- resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
engines: {node: '>=12.0.0'}
tinyqueue@3.0.0:
@@ -13762,15 +13755,8 @@ packages:
peerDependencies:
typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x
- 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
- typescript: '>=4.8.4 <6.1.0'
-
- typescript-eslint@8.58.2:
- resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==}
+ typescript-eslint@8.59.0:
+ resolution: {integrity: sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -14130,6 +14116,12 @@ packages:
peerDependencies:
vite: '>=7.3.2'
+ vite-plugin-static-copy@4.1.0:
+ resolution: {integrity: sha512-9XOarNV7LgP0KBB7AApxdgFikLXx3daZdqjC3AevYsL6MrUH62zphonLUs2a6LZc1HN1GY+vQdheZ8VVJb6dQQ==}
+ engines: {node: ^22.0.0 || >=24.0.0}
+ peerDependencies:
+ vite: '>=7.3.2'
+
vite-plugin-svgo@2.0.0:
resolution: {integrity: sha512-WaiOUlmt1fKw1w/WWJnx9gVk42D1BASKZmGCPpy6iTLE5iIemN2lim3MwI7Rffyt3aQnPrLfLSLnI8ZUJ9s49g==}
peerDependencies:
@@ -14141,8 +14133,8 @@ packages:
peerDependencies:
vite: '>=7.3.2'
- vite@8.0.8:
- resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==}
+ vite@8.0.9:
+ resolution: {integrity: sha512-t7g7GVRpMXjNpa67HaVWI/8BWtdVIQPCL2WoozXXA7LBGEFK4AkkKkHx2hAQf5x1GZSlcmEDPkVLSGahxnEEZw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
@@ -14184,20 +14176,20 @@ packages:
yaml:
optional: true
- vitest@4.1.4:
- resolution: {integrity: sha512-tFuJqTxKb8AvfyqMfnavXdzfy3h3sWZRWwfluGbkeR7n0HUev+FmNgZ8SDrRBTVrVCjgH5cA21qGbCffMNtWvg==}
+ vitest@4.1.5:
+ resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==}
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.4
- '@vitest/browser-preview': 4.1.4
- '@vitest/browser-webdriverio': 4.1.4
- '@vitest/coverage-istanbul': 4.1.4
- '@vitest/coverage-v8': 4.1.4
- '@vitest/ui': 4.1.4
+ '@vitest/browser-playwright': 4.1.5
+ '@vitest/browser-preview': 4.1.5
+ '@vitest/browser-webdriverio': 4.1.5
+ '@vitest/coverage-istanbul': 4.1.5
+ '@vitest/coverage-v8': 4.1.5
+ '@vitest/ui': 4.1.5
happy-dom: '*'
jsdom: '*'
vite: '>=7.3.2'
@@ -14246,6 +14238,9 @@ packages:
resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
hasBin: true
+ vscode-uri@3.0.8:
+ resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
@@ -14492,8 +14487,8 @@ packages:
resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==}
engines: {node: '>=20'}
- wxt@0.20.24:
- resolution: {integrity: sha512-dzvsP9t3pfXw71qPplDMoubehfGtO2Y8ZsJEL2b/EjEaf4mduKHhxlYisk7qDcgWVGY7kTcKZZ+3vX7ATs0NRg==}
+ wxt@0.20.25:
+ resolution: {integrity: sha512-ca+8Yt0Auzn9tX0ZW2Kzocb9yM8F/RoOjcYQ0fHkwcSc7/IUkqV2+1JUNn1SMSNAS4Gr3YQHAn/pi3q+jIGRqw==}
engines: {bun: '>=1.2.0', node: '>=20.12.0'}
hasBin: true
peerDependencies:
@@ -14657,20 +14652,20 @@ snapshots:
'@adobe/css-tools@4.4.4': {}
- '@ai-sdk/anthropic@3.0.69(zod@4.3.6)':
+ '@ai-sdk/anthropic@3.0.71(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
zod: 4.3.6
- '@ai-sdk/gateway@3.0.98(zod@4.3.6)':
+ '@ai-sdk/gateway@3.0.104(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
- '@vercel/oidc': 3.1.0
+ '@vercel/oidc': 3.2.0
zod: 4.3.6
- '@ai-sdk/google@3.0.63(zod@4.3.6)':
+ '@ai-sdk/google@3.0.64(zod@4.3.6)':
dependencies:
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
@@ -15030,34 +15025,51 @@ snapshots:
'@catppuccin/palette': 1.7.1
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3
'@catppuccin/highlightjs@1.0.1': {}
'@catppuccin/palette@1.7.1': {}
+ '@chevrotain/cst-dts-gen@11.0.3':
+ dependencies:
+ '@chevrotain/gast': 11.0.3
+ '@chevrotain/types': 11.0.3
+ lodash-es: 4.18.1
+
'@chevrotain/cst-dts-gen@11.1.1':
dependencies:
'@chevrotain/gast': 11.1.1
'@chevrotain/types': 11.1.1
lodash-es: 4.18.1
+ '@chevrotain/gast@11.0.3':
+ dependencies:
+ '@chevrotain/types': 11.0.3
+ lodash-es: 4.18.1
+
'@chevrotain/gast@11.1.1':
dependencies:
'@chevrotain/types': 11.1.1
lodash-es: 4.18.1
+ '@chevrotain/regexp-to-ast@11.0.3': {}
+
'@chevrotain/regexp-to-ast@11.1.1': {}
+ '@chevrotain/types@11.0.3': {}
+
'@chevrotain/types@11.1.1': {}
+ '@chevrotain/utils@11.0.3': {}
+
'@chevrotain/utils@11.1.1': {}
- '@ckeditor/ckeditor-cloud-services-collaboration@54.0.1(@ckeditor/ckeditor5-utils@48.0.0)(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
+ '@ckeditor/ckeditor-cloud-services-collaboration@54.0.3(@ckeditor/ckeditor5-utils@48.0.1)(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
- '@ckeditor/ckeditor5-utils': 48.0.0
- protobufjs: 7.5.4
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ protobufjs: 7.5.5
socket.io-client: 4.7.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
socket.io-parser: 4.2.6
url-parse: 1.5.10
@@ -15067,25 +15079,25 @@ snapshots:
- supports-color
- utf-8-validate
- '@ckeditor/ckeditor5-adapter-ckfinder@48.0.0':
+ '@ckeditor/ckeditor5-adapter-ckfinder@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-upload': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-upload': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-ai@48.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
+ '@ckeditor/ckeditor5-ai@48.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-collaboration-core': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-markdown-gfm': 48.0.0
- '@ckeditor/ckeditor5-real-time-collaboration': 48.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
- '@ckeditor/ckeditor5-table': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-collaboration-core': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-markdown-gfm': 48.0.1
+ '@ckeditor/ckeditor5-real-time-collaboration': 48.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
+ '@ckeditor/ckeditor5-table': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
diff: 8.0.3
dom-serializer: 2.0.0
domhandler: 5.0.3
@@ -15100,484 +15112,484 @@ snapshots:
- supports-color
- utf-8-validate
- '@ckeditor/ckeditor5-alignment@48.0.0':
+ '@ckeditor/ckeditor5-alignment@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-autoformat@48.0.0':
+ '@ckeditor/ckeditor5-autoformat@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-heading': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-heading': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-autosave@48.0.0':
+ '@ckeditor/ckeditor5-autosave@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-basic-styles@48.0.0':
+ '@ckeditor/ckeditor5-basic-styles@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-block-quote@48.0.0':
+ '@ckeditor/ckeditor5-block-quote@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-bookmark@48.0.0':
+ '@ckeditor/ckeditor5-bookmark@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-link': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-link': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
- '@ckeditor/ckeditor5-case-change@48.0.0':
+ '@ckeditor/ckeditor5-case-change@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-ckbox@48.0.0':
+ '@ckeditor/ckeditor5-ckbox@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-link': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-upload': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-link': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-upload': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
blurhash: 2.0.5
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-ckfinder@48.0.0':
+ '@ckeditor/ckeditor5-ckfinder@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-adapter-ckfinder': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-link': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-adapter-ckfinder': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-link': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-clipboard@48.0.0':
+ '@ckeditor/ckeditor5-clipboard@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-cloud-services@48.0.0':
+ '@ckeditor/ckeditor5-cloud-services@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-upload': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-upload': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-code-block@48.0.0(patch_hash=1530be090e4f5235e197fb6208a8e8230e3355d5633fc7cad2b2e892659e9c04)':
+ '@ckeditor/ckeditor5-code-block@48.0.1(patch_hash=1530be090e4f5235e197fb6208a8e8230e3355d5633fc7cad2b2e892659e9c04)':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-collaboration-core@48.0.0':
+ '@ckeditor/ckeditor5-collaboration-core@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-comments': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-link': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-track-changes': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-comments': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-link': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-track-changes': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
'@types/luxon': 3.6.2
diff: 8.0.3
luxon: 3.6.1
- '@ckeditor/ckeditor5-comments@48.0.0':
+ '@ckeditor/ckeditor5-comments@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-collaboration-core': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-paragraph': 48.0.0
- '@ckeditor/ckeditor5-revision-history': 48.0.0
- '@ckeditor/ckeditor5-select-all': 48.0.0
- '@ckeditor/ckeditor5-source-editing': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-undo': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-collaboration-core': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-paragraph': 48.0.1
+ '@ckeditor/ckeditor5-revision-history': 48.0.1
+ '@ckeditor/ckeditor5-select-all': 48.0.1
+ '@ckeditor/ckeditor5-source-editing': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-undo': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-core@48.0.0':
+ '@ckeditor/ckeditor5-core@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-watchdog': 48.0.0
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-watchdog': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-document-outline@48.0.0':
+ '@ckeditor/ckeditor5-document-outline@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-heading': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-heading': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-easy-image@48.0.0':
+ '@ckeditor/ckeditor5-easy-image@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-upload': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-upload': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-editor-balloon@48.0.0':
+ '@ckeditor/ckeditor5-editor-balloon@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-editor-classic@48.0.0':
+ '@ckeditor/ckeditor5-editor-classic@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-editor-decoupled@48.0.0':
+ '@ckeditor/ckeditor5-editor-decoupled@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-editor-inline@48.0.0':
+ '@ckeditor/ckeditor5-editor-inline@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-editor-multi-root@48.0.0':
+ '@ckeditor/ckeditor5-editor-multi-root@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-email@48.0.0':
+ '@ckeditor/ckeditor5-email@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-export-inline-styles': 48.0.0
- '@ckeditor/ckeditor5-font': 48.0.0
- '@ckeditor/ckeditor5-html-support': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-table': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-export-inline-styles': 48.0.1
+ '@ckeditor/ckeditor5-font': 48.0.1
+ '@ckeditor/ckeditor5-html-support': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-table': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-emoji@48.0.0':
+ '@ckeditor/ckeditor5-emoji@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-mention': 48.0.0(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-mention': 48.0.1(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
fuzzysort: 3.1.0
- '@ckeditor/ckeditor5-engine@48.0.0':
+ '@ckeditor/ckeditor5-engine@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-enter@48.0.0':
+ '@ckeditor/ckeditor5-enter@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-essentials@48.0.0':
+ '@ckeditor/ckeditor5-essentials@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-select-all': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-undo': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-select-all': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-undo': 48.0.1
- '@ckeditor/ckeditor5-export-inline-styles@48.0.0':
+ '@ckeditor/ckeditor5-export-inline-styles@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
specificity: 0.4.1
- '@ckeditor/ckeditor5-export-pdf@48.0.0':
+ '@ckeditor/ckeditor5-export-pdf@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-merge-fields': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-merge-fields': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-export-word@48.0.0':
+ '@ckeditor/ckeditor5-export-word@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-collaboration-core': 48.0.0
- '@ckeditor/ckeditor5-comments': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-merge-fields': 48.0.0
- '@ckeditor/ckeditor5-track-changes': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-collaboration-core': 48.0.1
+ '@ckeditor/ckeditor5-comments': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-merge-fields': 48.0.1
+ '@ckeditor/ckeditor5-track-changes': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-find-and-replace@48.0.0':
+ '@ckeditor/ckeditor5-find-and-replace@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-font@48.0.0':
+ '@ckeditor/ckeditor5-font@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-footnotes@48.0.0':
+ '@ckeditor/ckeditor5-footnotes@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
- '@ckeditor/ckeditor5-format-painter@48.0.0':
+ '@ckeditor/ckeditor5-format-painter@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-remove-format': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-remove-format': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-fullscreen@48.0.0':
+ '@ckeditor/ckeditor5-fullscreen@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-editor-classic': 48.0.0
- '@ckeditor/ckeditor5-editor-decoupled': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-editor-classic': 48.0.1
+ '@ckeditor/ckeditor5-editor-decoupled': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-heading@48.0.0':
+ '@ckeditor/ckeditor5-heading@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-paragraph': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-paragraph': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-highlight@48.0.0':
+ '@ckeditor/ckeditor5-highlight@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-horizontal-line@48.0.0':
+ '@ckeditor/ckeditor5-horizontal-line@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
- '@ckeditor/ckeditor5-html-embed@48.0.0':
+ '@ckeditor/ckeditor5-html-embed@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
- '@ckeditor/ckeditor5-html-support@48.0.0':
+ '@ckeditor/ckeditor5-html-support@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-heading': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-remove-format': 48.0.0
- '@ckeditor/ckeditor5-table': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-heading': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-remove-format': 48.0.1
+ '@ckeditor/ckeditor5-table': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-icons@48.0.0': {}
+ '@ckeditor/ckeditor5-icons@48.0.1': {}
- '@ckeditor/ckeditor5-image@48.0.0':
+ '@ckeditor/ckeditor5-image@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-undo': 48.0.0
- '@ckeditor/ckeditor5-upload': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-undo': 48.0.1
+ '@ckeditor/ckeditor5-upload': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-import-word@48.0.0':
+ '@ckeditor/ckeditor5-import-word@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-merge-fields': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-merge-fields': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-indent@48.0.0':
+ '@ckeditor/ckeditor5-indent@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-heading': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-heading': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
'@ckeditor/ckeditor5-inspector@5.0.0': {}
- '@ckeditor/ckeditor5-language@48.0.0':
+ '@ckeditor/ckeditor5-language@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-line-height@48.0.0':
+ '@ckeditor/ckeditor5-line-height@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-link@48.0.0':
+ '@ckeditor/ckeditor5-link@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-list-multi-level@48.0.0':
+ '@ckeditor/ckeditor5-list-multi-level@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-list@48.0.0':
+ '@ckeditor/ckeditor5-list@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-font': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-font': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-markdown-gfm@48.0.0':
+ '@ckeditor/ckeditor5-markdown-gfm@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
'@types/hast': 3.0.4
hast-util-from-dom: 5.0.1
hast-util-to-html: 9.0.5
@@ -15596,180 +15608,180 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@ckeditor/ckeditor5-media-embed@48.0.0':
+ '@ckeditor/ckeditor5-media-embed@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-undo': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-undo': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
- '@ckeditor/ckeditor5-mention@48.0.0(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)':
+ '@ckeditor/ckeditor5-mention@48.0.1(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-merge-fields@48.0.0':
+ '@ckeditor/ckeditor5-merge-fields@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-mention': 48.0.0(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-mention': 48.0.1(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-minimap@48.0.0':
+ '@ckeditor/ckeditor5-minimap@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-operations-compressor@48.0.0':
+ '@ckeditor/ckeditor5-operations-compressor@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- protobufjs: 7.5.4
+ protobufjs: 7.5.5
- '@ckeditor/ckeditor5-page-break@48.0.0':
+ '@ckeditor/ckeditor5-page-break@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
- '@ckeditor/ckeditor5-pagination@48.0.0':
+ '@ckeditor/ckeditor5-pagination@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-paragraph@48.0.0':
+ '@ckeditor/ckeditor5-paragraph@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-paste-from-office-enhanced@48.0.0':
+ '@ckeditor/ckeditor5-paste-from-office-enhanced@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-paste-from-office': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-paste-from-office': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-paste-from-office@48.0.0':
+ '@ckeditor/ckeditor5-paste-from-office@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
- '@ckeditor/ckeditor5-real-time-collaboration@48.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
+ '@ckeditor/ckeditor5-real-time-collaboration@48.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
- '@ckeditor/ckeditor-cloud-services-collaboration': 54.0.1(@ckeditor/ckeditor5-utils@48.0.0)(bufferutil@4.0.9)(utf-8-validate@6.0.5)
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-collaboration-core': 48.0.0
- '@ckeditor/ckeditor5-comments': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-editor-multi-root': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-operations-compressor': 48.0.0
- '@ckeditor/ckeditor5-revision-history': 48.0.0
- '@ckeditor/ckeditor5-track-changes': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor-cloud-services-collaboration': 54.0.3(@ckeditor/ckeditor5-utils@48.0.1)(bufferutil@4.0.9)(utf-8-validate@6.0.5)
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-collaboration-core': 48.0.1
+ '@ckeditor/ckeditor5-comments': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-editor-multi-root': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-operations-compressor': 48.0.1
+ '@ckeditor/ckeditor5-revision-history': 48.0.1
+ '@ckeditor/ckeditor5-track-changes': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
- '@ckeditor/ckeditor5-remove-format@48.0.0':
+ '@ckeditor/ckeditor5-remove-format@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-restricted-editing@48.0.0':
+ '@ckeditor/ckeditor5-restricted-editing@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-revision-history@48.0.0':
+ '@ckeditor/ckeditor5-revision-history@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-autosave': 48.0.0
- '@ckeditor/ckeditor5-collaboration-core': 48.0.0
- '@ckeditor/ckeditor5-comments': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-autosave': 48.0.1
+ '@ckeditor/ckeditor5-collaboration-core': 48.0.1
+ '@ckeditor/ckeditor5-comments': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
'@types/luxon': 3.6.2
es-toolkit: 1.45.1
luxon: 3.6.1
- '@ckeditor/ckeditor5-select-all@48.0.0':
+ '@ckeditor/ckeditor5-select-all@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-show-blocks@48.0.0':
+ '@ckeditor/ckeditor5-show-blocks@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-slash-command@48.0.0':
+ '@ckeditor/ckeditor5-slash-command@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-heading': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-mention': 48.0.0(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
- '@ckeditor/ckeditor5-style': 48.0.0
- '@ckeditor/ckeditor5-template': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-heading': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-mention': 48.0.1(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
+ '@ckeditor/ckeditor5-style': 48.0.1
+ '@ckeditor/ckeditor5-template': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-source-editing-enhanced@48.0.0':
+ '@ckeditor/ckeditor5-source-editing-enhanced@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
'@codemirror/autocomplete': 6.18.6
'@codemirror/commands': 6.8.1
'@codemirror/lang-html': 6.4.11
@@ -15777,180 +15789,180 @@ snapshots:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
'@codemirror/theme-one-dark': 6.1.2
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
- '@ckeditor/ckeditor5-source-editing@48.0.0':
+ '@ckeditor/ckeditor5-source-editing@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-special-characters@48.0.0':
+ '@ckeditor/ckeditor5-special-characters@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-style@48.0.0':
+ '@ckeditor/ckeditor5-style@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-html-support': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-table': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-html-support': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-table': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-table@48.0.0':
+ '@ckeditor/ckeditor5-table@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-template@48.0.0':
+ '@ckeditor/ckeditor5-template@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-track-changes@48.0.0':
+ '@ckeditor/ckeditor5-track-changes@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-code-block': 48.0.0(patch_hash=1530be090e4f5235e197fb6208a8e8230e3355d5633fc7cad2b2e892659e9c04)
- '@ckeditor/ckeditor5-collaboration-core': 48.0.0
- '@ckeditor/ckeditor5-comments': 48.0.0
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-editor-multi-root': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-find-and-replace': 48.0.0
- '@ckeditor/ckeditor5-font': 48.0.0
- '@ckeditor/ckeditor5-heading': 48.0.0
- '@ckeditor/ckeditor5-highlight': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-link': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-media-embed': 48.0.0
- '@ckeditor/ckeditor5-merge-fields': 48.0.0
- '@ckeditor/ckeditor5-restricted-editing': 48.0.0
- '@ckeditor/ckeditor5-style': 48.0.0
- '@ckeditor/ckeditor5-table': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-code-block': 48.0.1(patch_hash=1530be090e4f5235e197fb6208a8e8230e3355d5633fc7cad2b2e892659e9c04)
+ '@ckeditor/ckeditor5-collaboration-core': 48.0.1
+ '@ckeditor/ckeditor5-comments': 48.0.1
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-editor-multi-root': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-find-and-replace': 48.0.1
+ '@ckeditor/ckeditor5-font': 48.0.1
+ '@ckeditor/ckeditor5-heading': 48.0.1
+ '@ckeditor/ckeditor5-highlight': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-link': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-media-embed': 48.0.1
+ '@ckeditor/ckeditor5-merge-fields': 48.0.1
+ '@ckeditor/ckeditor5-restricted-editing': 48.0.1
+ '@ckeditor/ckeditor5-style': 48.0.1
+ '@ckeditor/ckeditor5-table': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-typing@48.0.0':
+ '@ckeditor/ckeditor5-typing@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-ui@48.0.0':
+ '@ckeditor/ckeditor5-ui@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-editor-multi-root': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-editor-multi-root': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
'@types/color-convert': 2.0.4
color-convert: 3.1.0
color-parse: 2.0.2
es-toolkit: 1.45.1
vanilla-colorful: 0.7.2
- '@ckeditor/ckeditor5-undo@48.0.0':
+ '@ckeditor/ckeditor5-undo@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-upload@48.0.0':
+ '@ckeditor/ckeditor5-upload@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
- '@ckeditor/ckeditor5-uploadcare@48.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
+ '@ckeditor/ckeditor5-uploadcare@48.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-upload': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-upload': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
'@uploadcare/file-uploader': 1.24.5(bufferutil@4.0.9)(utf-8-validate@6.0.5)
'@uploadcare/upload-client': 6.14.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
- bufferutil
- utf-8-validate
- '@ckeditor/ckeditor5-utils@48.0.0':
+ '@ckeditor/ckeditor5-utils@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-ui': 48.0.0
+ '@ckeditor/ckeditor5-ui': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-watchdog@48.0.0':
+ '@ckeditor/ckeditor5-watchdog@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-widget@48.0.0':
+ '@ckeditor/ckeditor5-widget@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
- '@ckeditor/ckeditor5-word-count@48.0.0':
+ '@ckeditor/ckeditor5-word-count@48.0.1':
dependencies:
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
es-toolkit: 1.45.1
'@codemirror/autocomplete@6.18.6':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@codemirror/commands@6.10.3':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@codemirror/commands@6.8.1':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@codemirror/lang-angular@0.1.4':
@@ -15990,7 +16002,7 @@ snapshots:
'@codemirror/lang-javascript': 6.2.5
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/css': 1.1.11
'@lezer/html': 1.3.12
@@ -16006,7 +16018,7 @@ snapshots:
'@codemirror/language': 6.12.3
'@codemirror/lint': 6.8.5
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/javascript': 1.5.1
@@ -16016,7 +16028,7 @@ snapshots:
'@codemirror/lang-html': 6.4.11
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.2
@@ -16040,7 +16052,7 @@ snapshots:
'@codemirror/lang-html': 6.4.11
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.2
@@ -16051,7 +16063,7 @@ snapshots:
'@codemirror/lang-html': 6.4.11
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/markdown': 1.4.3
@@ -16061,7 +16073,7 @@ snapshots:
'@codemirror/lang-html': 6.4.11
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/markdown': 1.4.3
@@ -16124,7 +16136,7 @@ snapshots:
'@codemirror/autocomplete': 6.18.6
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/xml': 1.0.6
@@ -16167,7 +16179,7 @@ snapshots:
'@codemirror/language@6.12.3':
dependencies:
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.2
@@ -16180,13 +16192,13 @@ snapshots:
'@codemirror/lint@6.8.5':
dependencies:
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
crelt: 1.0.6
- '@codemirror/search@6.6.0':
+ '@codemirror/search@6.7.0':
dependencies:
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
crelt: 1.0.6
'@codemirror/state@6.6.0':
@@ -16197,10 +16209,10 @@ snapshots:
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3
- '@codemirror/view@6.41.0':
+ '@codemirror/view@6.41.1':
dependencies:
'@codemirror/state': 6.6.0
crelt: 1.0.6
@@ -16665,27 +16677,20 @@ snapshots:
- bluebird
- supports-color
- '@electron/rebuild@4.0.3':
+ '@electron/rebuild@4.0.4':
dependencies:
'@malept/cross-spawn-promise': 2.0.0
debug: 4.4.3
- detect-libc: 2.1.2
- got: 11.8.6
- graceful-fs: 4.2.11
node-abi: 4.28.0
node-api-version: 0.2.1
- node-gyp: 11.4.2
- ora: 5.4.1
+ node-gyp: 12.2.0
read-binary-file-arch: 1.0.6
- semver: 7.7.3
- tar: 7.5.11
- yargs: 17.7.2
transitivePeerDependencies:
- supports-color
- '@electron/remote@2.1.3(electron@41.2.0)':
+ '@electron/remote@2.1.3(electron@41.3.0)':
dependencies:
- electron: 41.2.0
+ electron: 41.3.0
'@electron/universal@2.0.2':
dependencies:
@@ -16721,6 +16726,11 @@ snapshots:
tslib: 2.8.1
optional: true
+ '@emnapi/runtime@1.9.0':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@emnapi/runtime@1.9.1':
dependencies:
tslib: 2.8.1
@@ -16754,7 +16764,7 @@ snapshots:
'@es-joy/jsdoccomment@0.50.2':
dependencies:
'@types/estree': 1.0.8
- '@typescript-eslint/types': 8.58.1
+ '@typescript-eslint/types': 8.59.0
comment-parser: 1.4.1
esquery: 1.7.0
jsdoc-type-pratt-parser: 4.1.0
@@ -17097,6 +17107,46 @@ snapshots:
- '@types/react-dom'
- immer
+ '@excalidraw/excalidraw@0.18.1(@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)':
+ dependencies:
+ '@braintree/sanitize-url': 6.0.2
+ '@excalidraw/laser-pointer': 1.3.1
+ '@excalidraw/mermaid-to-excalidraw': 2.2.2
+ '@excalidraw/random-username': 1.1.0
+ '@radix-ui/react-popover': 1.1.6(@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)
+ '@radix-ui/react-tabs': 1.0.2(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
+ browser-fs-access: 0.29.1
+ canvas-roundrect-polyfill: 0.0.1
+ clsx: 1.1.1
+ cross-env: 7.0.3
+ es6-promise-pool: 2.5.0
+ fractional-indexing: 3.2.0
+ fuzzy: 0.1.3
+ image-blob-reduce: 3.0.1
+ jotai: 2.11.0(@types/react@19.1.7)(react@19.2.4)
+ jotai-scope: 0.7.2(jotai@2.11.0(@types/react@19.1.7)(react@19.2.4))(react@19.2.4)
+ lodash.debounce: 4.0.8
+ lodash.throttle: 4.1.1
+ nanoid: 5.1.7
+ open-color: 1.9.1
+ pako: 2.0.3
+ perfect-freehand: 1.2.0
+ pica: 7.1.1
+ png-chunk-text: 1.0.0
+ png-chunks-encode: 1.0.0
+ png-chunks-extract: 1.0.0
+ points-on-curve: 1.0.1
+ pwacompat: 2.0.17
+ react: 19.2.4
+ react-dom: 19.2.4(react@19.2.4)
+ roughjs: 4.6.6
+ sass: 1.51.0
+ tunnel-rat: 0.1.2(@types/react@19.1.7)(react@19.2.4)
+ transitivePeerDependencies:
+ - '@types/react'
+ - '@types/react-dom'
+ - immer
+
'@excalidraw/laser-pointer@1.3.1': {}
'@excalidraw/markdown-to-text@0.1.2': {}
@@ -17107,6 +17157,13 @@ snapshots:
mermaid: 11.14.0
nanoid: 5.1.7
+ '@excalidraw/mermaid-to-excalidraw@2.2.2':
+ dependencies:
+ '@excalidraw/markdown-to-text': 0.1.2
+ '@mermaid-js/parser': 0.6.3
+ mermaid: 11.14.0
+ nanoid: 5.1.7
+
'@excalidraw/random-username@1.1.0': {}
'@exercism/highlightjs-gdscript@0.0.1': {}
@@ -17148,200 +17205,200 @@ snapshots:
'@floating-ui/utils@0.2.11': {}
- '@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)':
+ '@fsegurai/codemirror-theme-abcdef@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-abyss@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-android-studio@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-andromeda@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-basic-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-basic-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-cobalt2@6.0.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-forest@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-github-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-github-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-gruvbox-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-gruvbox-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3
- '@fsegurai/codemirror-theme-high-contrast-dark@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-high-contrast-dark@6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3
- '@fsegurai/codemirror-theme-high-contrast-light@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-high-contrast-light@6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-material-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-material-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3
- '@fsegurai/codemirror-theme-material-ocean@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-material-ocean@6.0.1(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-monokai@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-nord@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-palenight@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-solarized-dark@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-solarized-light@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3
- '@fsegurai/codemirror-theme-synthwave-84@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-synthwave-84@6.0.2(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-tokyo-night-day@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-tokyo-night-storm@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-volcano@6.2.5(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-vscode-dark@6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@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)':
+ '@fsegurai/codemirror-theme-vscode-light@6.2.6(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/highlight@1.2.3)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/highlight': 1.2.3
'@fullcalendar/core@6.1.20':
@@ -17500,7 +17557,7 @@ snapshots:
'@img/sharp-wasm32@0.34.5':
dependencies:
- '@emnapi/runtime': 1.9.2
+ '@emnapi/runtime': 1.9.0
optional: true
'@img/sharp-win32-arm64@0.34.5':
@@ -18155,6 +18212,10 @@ snapshots:
elkjs: 0.9.3
mermaid: 11.14.0
+ '@mermaid-js/parser@0.6.3':
+ dependencies:
+ langium: 3.3.1
+
'@mermaid-js/parser@1.1.0':
dependencies:
langium: 4.2.1
@@ -18198,6 +18259,10 @@ snapshots:
dependencies:
mind-elixir: 5.10.0
+ '@mind-elixir/node-menu@5.0.1(mind-elixir@5.11.0)':
+ dependencies:
+ mind-elixir: 5.11.0
+
'@mixmark-io/domino@2.2.0': {}
'@modelcontextprotocol/sdk@1.29.0(zod@4.3.6)':
@@ -18287,7 +18352,7 @@ snapshots:
'@tybys/wasm-util': 0.10.1
optional: true
- '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)':
+ '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)':
dependencies:
'@emnapi/core': 1.9.2
'@emnapi/runtime': 1.9.2
@@ -18314,16 +18379,6 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.19.1
- '@npmcli/agent@3.0.0':
- dependencies:
- agent-base: 7.1.4
- http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6
- lru-cache: 10.4.3
- socks-proxy-agent: 8.0.5
- transitivePeerDependencies:
- - supports-color
-
'@npmcli/agent@4.0.0':
dependencies:
agent-base: 7.1.4
@@ -18333,7 +18388,6 @@ snapshots:
socks-proxy-agent: 8.0.5
transitivePeerDependencies:
- supports-color
- optional: true
'@npmcli/fs@2.1.2':
dependencies:
@@ -18439,7 +18493,7 @@ snapshots:
'@oxc-project/types@0.123.0': {}
- '@oxc-project/types@0.124.0': {}
+ '@oxc-project/types@0.126.0': {}
'@panva/asn1.js@1.0.0': {}
@@ -18530,35 +18584,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.8(@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.9(@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.8(@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.9(@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.8(@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.8(@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.9(@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.9(@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.8(@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.9(@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.8(@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.9(@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.8(@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.8(@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.9(@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.9(@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
@@ -18578,19 +18632,19 @@ snapshots:
dependencies:
preact: 10.29.1
- '@prefresh/rolldown@0.1.0(rolldown@1.0.0-rc.13)(vite@8.0.8(@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/rolldown@0.1.0(rolldown@1.0.0-rc.13)(vite@8.0.9(@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.8(@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.9(@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.8(@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.9(@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
@@ -18598,21 +18652,21 @@ snapshots:
'@prefresh/utils': 1.2.1
'@rollup/pluginutils': 4.2.1
preact: 10.29.1
- vite: 8.0.8(@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.9(@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.8(@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@3.0.0(preact@10.29.1)(vite@8.0.9(@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.8(@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/rolldown': 0.1.0(rolldown@1.0.0-rc.13)(vite@8.0.9(@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.8(@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.9(@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
@@ -19275,15 +19329,15 @@ snapshots:
dependencies:
ulid: 2.4.0
- '@redocly/cli@2.28.0(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)':
+ '@redocly/cli@2.29.1(@opentelemetry/api@1.9.0)(bufferutil@4.0.9)(core-js@3.46.0)(encoding@0.1.13)(utf-8-validate@6.0.5)':
dependencies:
'@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.9.0)
'@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.34.0
'@redocly/cli-otel': 0.1.2
- '@redocly/openapi-core': 2.28.0
- '@redocly/respect-core': 2.28.0
+ '@redocly/openapi-core': 2.29.1
+ '@redocly/respect-core': 2.29.1
abort-controller: 3.0.0
ajv: '@redocly/ajv@8.18.0'
ajv-formats: 3.0.1(@redocly/ajv@8.18.0)
@@ -19335,7 +19389,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@redocly/openapi-core@2.28.0':
+ '@redocly/openapi-core@2.29.1':
dependencies:
'@redocly/ajv': 8.18.0
'@redocly/config': 0.48.0
@@ -19348,12 +19402,12 @@ snapshots:
pluralize: 8.0.0
yaml-ast-parser: 0.0.43
- '@redocly/respect-core@2.28.0':
+ '@redocly/respect-core@2.29.1':
dependencies:
'@faker-js/faker': 7.6.0
'@noble/hashes': 1.8.0
'@redocly/ajv': 8.18.0
- '@redocly/openapi-core': 2.28.0
+ '@redocly/openapi-core': 2.29.1
ajv: '@redocly/ajv@8.18.0'
better-ajv-errors: 1.2.0(@redocly/ajv@8.18.0)
colorette: 2.0.20
@@ -19363,100 +19417,100 @@ snapshots:
outdent: 0.8.0
picomatch: 4.0.4
- '@replit/codemirror-indentation-markers@6.5.3(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)':
+ '@replit/codemirror-indentation-markers@6.5.3(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)':
dependencies:
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
- '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.2)':
+ '@replit/codemirror-lang-nix@6.0.1(@codemirror/autocomplete@6.18.6)(@codemirror/language@6.12.3)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)(@lezer/common@1.5.2)(@lezer/highlight@1.2.3)(@lezer/lr@1.4.2)':
dependencies:
'@codemirror/autocomplete': 6.18.6
'@codemirror/language': 6.12.3
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@lezer/common': 1.5.2
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.2
- '@replit/codemirror-vim@6.3.0(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/search@6.6.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.0)':
+ '@replit/codemirror-vim@6.3.0(@codemirror/commands@6.10.3)(@codemirror/language@6.12.3)(@codemirror/search@6.7.0)(@codemirror/state@6.6.0)(@codemirror/view@6.41.1)':
dependencies:
'@codemirror/commands': 6.10.3
'@codemirror/language': 6.12.3
- '@codemirror/search': 6.6.0
+ '@codemirror/search': 6.7.0
'@codemirror/state': 6.6.0
- '@codemirror/view': 6.41.0
+ '@codemirror/view': 6.41.1
'@rolldown/binding-android-arm64@1.0.0-rc.13':
optional: true
- '@rolldown/binding-android-arm64@1.0.0-rc.15':
+ '@rolldown/binding-android-arm64@1.0.0-rc.16':
optional: true
'@rolldown/binding-darwin-arm64@1.0.0-rc.13':
optional: true
- '@rolldown/binding-darwin-arm64@1.0.0-rc.15':
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.16':
optional: true
'@rolldown/binding-darwin-x64@1.0.0-rc.13':
optional: true
- '@rolldown/binding-darwin-x64@1.0.0-rc.15':
+ '@rolldown/binding-darwin-x64@1.0.0-rc.16':
optional: true
'@rolldown/binding-freebsd-x64@1.0.0-rc.13':
optional: true
- '@rolldown/binding-freebsd-x64@1.0.0-rc.15':
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.16':
optional: true
'@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.13':
optional: true
- '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15':
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16':
optional: true
'@rolldown/binding-linux-arm64-gnu@1.0.0-rc.13':
optional: true
- '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15':
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16':
optional: true
'@rolldown/binding-linux-arm64-musl@1.0.0-rc.13':
optional: true
- '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15':
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16':
optional: true
'@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.13':
optional: true
- '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15':
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16':
optional: true
'@rolldown/binding-linux-s390x-gnu@1.0.0-rc.13':
optional: true
- '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15':
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16':
optional: true
'@rolldown/binding-linux-x64-gnu@1.0.0-rc.13':
optional: true
- '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15':
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16':
optional: true
'@rolldown/binding-linux-x64-musl@1.0.0-rc.13':
optional: true
- '@rolldown/binding-linux-x64-musl@1.0.0-rc.15':
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.16':
optional: true
'@rolldown/binding-openharmony-arm64@1.0.0-rc.13':
optional: true
- '@rolldown/binding-openharmony-arm64@1.0.0-rc.15':
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.16':
optional: true
'@rolldown/binding-wasm32-wasi@1.0.0-rc.13':
@@ -19466,28 +19520,28 @@ snapshots:
'@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.1)(@emnapi/runtime@1.9.1)
optional: true
- '@rolldown/binding-wasm32-wasi@1.0.0-rc.15':
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.16':
dependencies:
'@emnapi/core': 1.9.2
'@emnapi/runtime': 1.9.2
- '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)
+ '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)
optional: true
'@rolldown/binding-win32-arm64-msvc@1.0.0-rc.13':
optional: true
- '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15':
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16':
optional: true
'@rolldown/binding-win32-x64-msvc@1.0.0-rc.13':
optional: true
- '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15':
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16':
optional: true
'@rolldown/pluginutils@1.0.0-rc.13': {}
- '@rolldown/pluginutils@1.0.0-rc.15': {}
+ '@rolldown/pluginutils@1.0.0-rc.16': {}
'@rollup/plugin-buble@1.0.3(rollup@4.60.1)':
dependencies:
@@ -19672,7 +19726,7 @@ snapshots:
'@stylistic/eslint-plugin@4.4.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
eslint: 10.2.1(jiti@2.6.1)
eslint-visitor-keys: 4.2.1
espree: 10.4.0
@@ -19682,17 +19736,17 @@ snapshots:
- supports-color
- typescript
- '@stylistic/stylelint-plugin@3.1.3(stylelint@17.7.0(typescript@6.0.3))':
+ '@stylistic/stylelint-plugin@3.1.3(stylelint@17.8.0(typescript@6.0.3))':
dependencies:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
'@csstools/media-query-list-parser': 3.0.1(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
is-plain-object: 5.0.0
- postcss: 8.5.9
+ postcss: 8.5.10
postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0
style-search: 0.1.0
- stylelint: 17.7.0(typescript@6.0.3)
+ stylelint: 17.8.0(typescript@6.0.3)
'@symbiotejs/symbiote@1.11.7': {}
@@ -20166,6 +20220,8 @@ snapshots:
'@types/tabulator-tables@6.3.1': {}
+ '@types/tabulator-tables@6.3.2': {}
+
'@types/tmp@0.2.6': {}
'@types/tough-cookie@4.0.5':
@@ -20203,14 +20259,14 @@ snapshots:
'@types/node': 24.12.2
optional: true
- '@typescript-eslint/eslint-plugin@8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
+ '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/scope-manager': 8.58.1
- '@typescript-eslint/type-utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.58.1
+ '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/scope-manager': 8.59.0
+ '@typescript-eslint/type-utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.59.0
eslint: 10.2.1(jiti@2.6.1)
ignore: 7.0.5
natural-compare: 1.4.0
@@ -20219,87 +20275,41 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
+ '@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
dependencies:
- '@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/scope-manager': 8.58.2
- '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.58.2
- eslint: 10.2.1(jiti@2.6.1)
- ignore: 7.0.5
- natural-compare: 1.4.0
- ts-api-utils: 2.5.0(typescript@6.0.3)
- typescript: 6.0.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
- dependencies:
- '@typescript-eslint/scope-manager': 8.58.1
- '@typescript-eslint/types': 8.58.1
- '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.58.1
+ '@typescript-eslint/scope-manager': 8.59.0
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/visitor-keys': 8.59.0
debug: 4.4.3
eslint: 10.2.1(jiti@2.6.1)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
+ '@typescript-eslint/project-service@8.59.0(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.58.2
- '@typescript-eslint/types': 8.58.2
- '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3)
- '@typescript-eslint/visitor-keys': 8.58.2
- debug: 4.4.3
- eslint: 10.2.1(jiti@2.6.1)
- typescript: 6.0.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/project-service@8.58.1(typescript@6.0.3)':
- dependencies:
- '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.3)
- '@typescript-eslint/types': 8.58.1
+ '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.0
debug: 4.4.3
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.58.2(typescript@6.0.3)':
+ '@typescript-eslint/scope-manager@8.59.0':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3)
- '@typescript-eslint/types': 8.58.2
- debug: 4.4.3
- typescript: 6.0.3
- transitivePeerDependencies:
- - supports-color
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/visitor-keys': 8.59.0
- '@typescript-eslint/scope-manager@8.58.1':
- dependencies:
- '@typescript-eslint/types': 8.58.1
- '@typescript-eslint/visitor-keys': 8.58.1
-
- '@typescript-eslint/scope-manager@8.58.2':
- dependencies:
- '@typescript-eslint/types': 8.58.2
- '@typescript-eslint/visitor-keys': 8.58.2
-
- '@typescript-eslint/tsconfig-utils@8.58.1(typescript@6.0.3)':
+ '@typescript-eslint/tsconfig-utils@8.59.0(typescript@6.0.3)':
dependencies:
typescript: 6.0.3
- '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.3)':
+ '@typescript-eslint/type-utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
dependencies:
- typescript: 6.0.3
-
- '@typescript-eslint/type-utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
- dependencies:
- '@typescript-eslint/types': 8.58.1
- '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
debug: 4.4.3
eslint: 10.2.1(jiti@2.6.1)
ts-api-utils: 2.5.0(typescript@6.0.3)
@@ -20307,82 +20317,37 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/type-utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
+ '@typescript-eslint/types@8.59.0': {}
+
+ '@typescript-eslint/typescript-estree@8.59.0(typescript@6.0.3)':
dependencies:
- '@typescript-eslint/types': 8.58.2
- '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3)
- '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- debug: 4.4.3
- eslint: 10.2.1(jiti@2.6.1)
- ts-api-utils: 2.5.0(typescript@6.0.3)
- typescript: 6.0.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/types@8.58.1': {}
-
- '@typescript-eslint/types@8.58.2': {}
-
- '@typescript-eslint/typescript-estree@8.58.1(typescript@6.0.3)':
- dependencies:
- '@typescript-eslint/project-service': 8.58.1(typescript@6.0.3)
- '@typescript-eslint/tsconfig-utils': 8.58.1(typescript@6.0.3)
- '@typescript-eslint/types': 8.58.1
- '@typescript-eslint/visitor-keys': 8.58.1
+ '@typescript-eslint/project-service': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/visitor-keys': 8.59.0
debug: 4.4.3
minimatch: 10.2.5
semver: 7.7.4
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
ts-api-utils: 2.5.0(typescript@6.0.3)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.3)':
- dependencies:
- '@typescript-eslint/project-service': 8.58.2(typescript@6.0.3)
- '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.3)
- '@typescript-eslint/types': 8.58.2
- '@typescript-eslint/visitor-keys': 8.58.2
- debug: 4.4.3
- minimatch: 10.2.5
- semver: 7.7.4
- tinyglobby: 0.2.15
- ts-api-utils: 2.5.0(typescript@6.0.3)
- typescript: 6.0.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/utils@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
+ '@typescript-eslint/utils@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
dependencies:
'@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(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.3)
+ '@typescript-eslint/scope-manager': 8.59.0
+ '@typescript-eslint/types': 8.59.0
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
eslint: 10.2.1(jiti@2.6.1)
typescript: 6.0.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)':
+ '@typescript-eslint/visitor-keys@8.59.0':
dependencies:
- '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.6.1))
- '@typescript-eslint/scope-manager': 8.58.2
- '@typescript-eslint/types': 8.58.2
- '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3)
- eslint: 10.2.1(jiti@2.6.1)
- typescript: 6.0.3
- transitivePeerDependencies:
- - supports-color
-
- '@typescript-eslint/visitor-keys@8.58.1':
- dependencies:
- '@typescript-eslint/types': 8.58.1
- eslint-visitor-keys: 5.0.1
-
- '@typescript-eslint/visitor-keys@8.58.2':
- dependencies:
- '@typescript-eslint/types': 8.58.2
+ '@typescript-eslint/types': 8.59.0
eslint-visitor-keys: 5.0.1
'@ungap/structured-clone@1.3.0': {}
@@ -21808,12 +21773,12 @@ snapshots:
d3-selection: 3.0.0
d3-transition: 3.0.1(d3-selection@3.0.0)
- '@vercel/oidc@3.1.0': {}
+ '@vercel/oidc@3.2.0': {}
- '@vitest/browser-webdriverio@4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))':
+ '@vitest/browser-webdriverio@4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))':
dependencies:
- '@vitest/browser': 4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)
- vitest: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)
+ vitest: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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
@@ -21821,16 +21786,16 @@ snapshots:
- utf-8-validate
- vite
- '@vitest/browser@4.1.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)':
+ '@vitest/browser@4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)':
dependencies:
'@blazediff/core': 1.9.1
- '@vitest/mocker': 4.1.4(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.4
+ '@vitest/mocker': 4.1.5(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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.5
magic-string: 0.30.21
pngjs: 7.0.0
sirv: 3.0.2
tinyrainbow: 3.1.0
- vitest: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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
@@ -21838,7 +21803,7 @@ snapshots:
- utf-8-validate
- vite
- '@vitest/coverage-istanbul@4.1.4(vitest@4.1.4)':
+ '@vitest/coverage-istanbul@4.1.5(vitest@4.1.5)':
dependencies:
'@babel/core': 7.29.0
'@istanbuljs/schema': 0.1.3
@@ -21850,14 +21815,14 @@ snapshots:
magicast: 0.5.2
obug: 2.1.1
tinyrainbow: 3.1.0
- vitest: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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.4(@vitest/browser@4.1.4)(vitest@4.1.4)':
+ '@vitest/coverage-v8@4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5)':
dependencies:
'@bcoe/v8-coverage': 1.0.2
- '@vitest/utils': 4.1.4
+ '@vitest/utils': 4.1.5
ast-v8-to-istanbul: 1.0.0
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
@@ -21866,60 +21831,60 @@ snapshots:
obug: 2.1.1
std-env: 4.0.0
tinyrainbow: 3.1.0
- vitest: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)
+ '@vitest/browser': 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)
- '@vitest/expect@4.1.4':
+ '@vitest/expect@4.1.5':
dependencies:
'@standard-schema/spec': 1.1.0
'@types/chai': 5.2.2
- '@vitest/spy': 4.1.4
- '@vitest/utils': 4.1.4
+ '@vitest/spy': 4.1.5
+ '@vitest/utils': 4.1.5
chai: 6.2.2
tinyrainbow: 3.1.0
- '@vitest/mocker@4.1.4(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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.4
+ '@vitest/spy': 4.1.5
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
msw: 2.7.5(@types/node@24.12.2)(typescript@6.0.3)
- vite: 8.0.8(@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.9(@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.4':
+ '@vitest/pretty-format@4.1.5':
dependencies:
tinyrainbow: 3.1.0
- '@vitest/runner@4.1.4':
+ '@vitest/runner@4.1.5':
dependencies:
- '@vitest/utils': 4.1.4
+ '@vitest/utils': 4.1.5
pathe: 2.0.3
- '@vitest/snapshot@4.1.4':
+ '@vitest/snapshot@4.1.5':
dependencies:
- '@vitest/pretty-format': 4.1.4
- '@vitest/utils': 4.1.4
+ '@vitest/pretty-format': 4.1.5
+ '@vitest/utils': 4.1.5
magic-string: 0.30.21
pathe: 2.0.3
- '@vitest/spy@4.1.4': {}
+ '@vitest/spy@4.1.5': {}
- '@vitest/ui@4.1.4(vitest@4.1.4)':
+ '@vitest/ui@4.1.5(vitest@4.1.5)':
dependencies:
- '@vitest/utils': 4.1.4
+ '@vitest/utils': 4.1.5
fflate: 0.8.2
flatted: 3.4.2
pathe: 2.0.3
sirv: 3.0.2
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
tinyrainbow: 3.1.0
- vitest: 4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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.4':
+ '@vitest/utils@4.1.5':
dependencies:
- '@vitest/pretty-format': 4.1.4
+ '@vitest/pretty-format': 4.1.5
convert-source-map: 2.0.0
tinyrainbow: 3.1.0
@@ -22113,12 +22078,12 @@ snapshots:
optionalDependencies:
react: 19.2.4
- '@wxt-dev/auto-icons@1.1.1(wxt@0.20.24(@types/node@24.12.2)(eslint@10.2.1(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/auto-icons@1.1.1(wxt@0.20.25(@types/node@24.12.2)(eslint@10.2.1(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.24(@types/node@24.12.2)(eslint@10.2.1(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: 0.20.25(@types/node@24.12.2)(eslint@10.2.1(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.40':
dependencies:
@@ -22143,10 +22108,7 @@ snapshots:
abbrev@1.1.1: {}
- abbrev@3.0.1: {}
-
- abbrev@4.0.0:
- optional: true
+ abbrev@4.0.0: {}
abort-controller@3.0.0:
dependencies:
@@ -22204,9 +22166,9 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
- ai@6.0.161(zod@4.3.6):
+ ai@6.0.168(zod@4.3.6):
dependencies:
- '@ai-sdk/gateway': 3.0.98(zod@4.3.6)
+ '@ai-sdk/gateway': 3.0.104(zod@4.3.6)
'@ai-sdk/provider': 3.0.8
'@ai-sdk/provider-utils': 4.0.23(zod@4.3.6)
'@opentelemetry/api': 1.9.0
@@ -22753,21 +22715,6 @@ snapshots:
transitivePeerDependencies:
- bluebird
- cacache@19.0.1:
- dependencies:
- '@npmcli/fs': 4.0.0
- fs-minipass: 3.0.3
- glob: 13.0.6
- lru-cache: 10.4.3
- minipass: 7.1.3
- minipass-collect: 2.0.1
- minipass-flush: 1.0.5
- minipass-pipeline: 1.2.4
- p-map: 7.0.4
- ssri: 12.0.0
- tar: 7.5.11
- unique-filename: 4.0.0
-
cacache@20.0.1:
dependencies:
'@npmcli/fs': 4.0.0
@@ -22781,7 +22728,6 @@ snapshots:
p-map: 7.0.4
ssri: 12.0.0
unique-filename: 4.0.0
- optional: true
cacheable-lookup@5.0.4: {}
@@ -22908,11 +22854,25 @@ snapshots:
undici: 8.0.2
whatwg-mimetype: 4.0.0
+ chevrotain-allstar@0.3.1(chevrotain@11.0.3):
+ dependencies:
+ chevrotain: 11.0.3
+ lodash-es: 4.18.1
+
chevrotain-allstar@0.3.1(chevrotain@11.1.1):
dependencies:
chevrotain: 11.1.1
lodash-es: 4.18.1
+ chevrotain@11.0.3:
+ dependencies:
+ '@chevrotain/cst-dts-gen': 11.0.3
+ '@chevrotain/gast': 11.0.3
+ '@chevrotain/regexp-to-ast': 11.0.3
+ '@chevrotain/types': 11.0.3
+ '@chevrotain/utils': 11.0.3
+ lodash-es: 4.18.1
+
chevrotain@11.1.1:
dependencies:
'@chevrotain/cst-dts-gen': 11.1.1
@@ -22971,101 +22931,101 @@ snapshots:
regexp-util: 2.0.3
unicode-regex: 4.2.0
- ckeditor5-premium-features@48.0.0(bufferutil@4.0.9)(ckeditor5@48.0.0)(utf-8-validate@6.0.5):
+ ckeditor5-premium-features@48.0.1(bufferutil@4.0.9)(ckeditor5@48.0.1)(utf-8-validate@6.0.5):
dependencies:
- '@ckeditor/ckeditor5-ai': 48.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
- '@ckeditor/ckeditor5-case-change': 48.0.0
- '@ckeditor/ckeditor5-collaboration-core': 48.0.0
- '@ckeditor/ckeditor5-comments': 48.0.0
- '@ckeditor/ckeditor5-document-outline': 48.0.0
- '@ckeditor/ckeditor5-email': 48.0.0
- '@ckeditor/ckeditor5-export-inline-styles': 48.0.0
- '@ckeditor/ckeditor5-export-pdf': 48.0.0
- '@ckeditor/ckeditor5-export-word': 48.0.0
- '@ckeditor/ckeditor5-footnotes': 48.0.0
- '@ckeditor/ckeditor5-format-painter': 48.0.0
- '@ckeditor/ckeditor5-import-word': 48.0.0
- '@ckeditor/ckeditor5-line-height': 48.0.0
- '@ckeditor/ckeditor5-list-multi-level': 48.0.0
- '@ckeditor/ckeditor5-merge-fields': 48.0.0
- '@ckeditor/ckeditor5-pagination': 48.0.0
- '@ckeditor/ckeditor5-paste-from-office-enhanced': 48.0.0
- '@ckeditor/ckeditor5-real-time-collaboration': 48.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
- '@ckeditor/ckeditor5-revision-history': 48.0.0
- '@ckeditor/ckeditor5-slash-command': 48.0.0
- '@ckeditor/ckeditor5-source-editing-enhanced': 48.0.0
- '@ckeditor/ckeditor5-template': 48.0.0
- '@ckeditor/ckeditor5-track-changes': 48.0.0
- '@ckeditor/ckeditor5-uploadcare': 48.0.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
- '@ckeditor/ckeditor5-utils': 48.0.0
- ckeditor5: 48.0.0
+ '@ckeditor/ckeditor5-ai': 48.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
+ '@ckeditor/ckeditor5-case-change': 48.0.1
+ '@ckeditor/ckeditor5-collaboration-core': 48.0.1
+ '@ckeditor/ckeditor5-comments': 48.0.1
+ '@ckeditor/ckeditor5-document-outline': 48.0.1
+ '@ckeditor/ckeditor5-email': 48.0.1
+ '@ckeditor/ckeditor5-export-inline-styles': 48.0.1
+ '@ckeditor/ckeditor5-export-pdf': 48.0.1
+ '@ckeditor/ckeditor5-export-word': 48.0.1
+ '@ckeditor/ckeditor5-footnotes': 48.0.1
+ '@ckeditor/ckeditor5-format-painter': 48.0.1
+ '@ckeditor/ckeditor5-import-word': 48.0.1
+ '@ckeditor/ckeditor5-line-height': 48.0.1
+ '@ckeditor/ckeditor5-list-multi-level': 48.0.1
+ '@ckeditor/ckeditor5-merge-fields': 48.0.1
+ '@ckeditor/ckeditor5-pagination': 48.0.1
+ '@ckeditor/ckeditor5-paste-from-office-enhanced': 48.0.1
+ '@ckeditor/ckeditor5-real-time-collaboration': 48.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
+ '@ckeditor/ckeditor5-revision-history': 48.0.1
+ '@ckeditor/ckeditor5-slash-command': 48.0.1
+ '@ckeditor/ckeditor5-source-editing-enhanced': 48.0.1
+ '@ckeditor/ckeditor5-template': 48.0.1
+ '@ckeditor/ckeditor5-track-changes': 48.0.1
+ '@ckeditor/ckeditor5-uploadcare': 48.0.1(bufferutil@4.0.9)(utf-8-validate@6.0.5)
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ ckeditor5: 48.0.1
transitivePeerDependencies:
- bufferutil
- supports-color
- utf-8-validate
- ckeditor5@48.0.0:
+ ckeditor5@48.0.1:
dependencies:
- '@ckeditor/ckeditor5-adapter-ckfinder': 48.0.0
- '@ckeditor/ckeditor5-alignment': 48.0.0
- '@ckeditor/ckeditor5-autoformat': 48.0.0
- '@ckeditor/ckeditor5-autosave': 48.0.0
- '@ckeditor/ckeditor5-basic-styles': 48.0.0
- '@ckeditor/ckeditor5-block-quote': 48.0.0
- '@ckeditor/ckeditor5-bookmark': 48.0.0
- '@ckeditor/ckeditor5-ckbox': 48.0.0
- '@ckeditor/ckeditor5-ckfinder': 48.0.0
- '@ckeditor/ckeditor5-clipboard': 48.0.0
- '@ckeditor/ckeditor5-cloud-services': 48.0.0
- '@ckeditor/ckeditor5-code-block': 48.0.0(patch_hash=1530be090e4f5235e197fb6208a8e8230e3355d5633fc7cad2b2e892659e9c04)
- '@ckeditor/ckeditor5-core': 48.0.0
- '@ckeditor/ckeditor5-easy-image': 48.0.0
- '@ckeditor/ckeditor5-editor-balloon': 48.0.0
- '@ckeditor/ckeditor5-editor-classic': 48.0.0
- '@ckeditor/ckeditor5-editor-decoupled': 48.0.0
- '@ckeditor/ckeditor5-editor-inline': 48.0.0
- '@ckeditor/ckeditor5-editor-multi-root': 48.0.0
- '@ckeditor/ckeditor5-emoji': 48.0.0
- '@ckeditor/ckeditor5-engine': 48.0.0
- '@ckeditor/ckeditor5-enter': 48.0.0
- '@ckeditor/ckeditor5-essentials': 48.0.0
- '@ckeditor/ckeditor5-find-and-replace': 48.0.0
- '@ckeditor/ckeditor5-font': 48.0.0
- '@ckeditor/ckeditor5-fullscreen': 48.0.0
- '@ckeditor/ckeditor5-heading': 48.0.0
- '@ckeditor/ckeditor5-highlight': 48.0.0
- '@ckeditor/ckeditor5-horizontal-line': 48.0.0
- '@ckeditor/ckeditor5-html-embed': 48.0.0
- '@ckeditor/ckeditor5-html-support': 48.0.0
- '@ckeditor/ckeditor5-icons': 48.0.0
- '@ckeditor/ckeditor5-image': 48.0.0
- '@ckeditor/ckeditor5-indent': 48.0.0
- '@ckeditor/ckeditor5-language': 48.0.0
- '@ckeditor/ckeditor5-link': 48.0.0
- '@ckeditor/ckeditor5-list': 48.0.0
- '@ckeditor/ckeditor5-markdown-gfm': 48.0.0
- '@ckeditor/ckeditor5-media-embed': 48.0.0
- '@ckeditor/ckeditor5-mention': 48.0.0(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
- '@ckeditor/ckeditor5-minimap': 48.0.0
- '@ckeditor/ckeditor5-page-break': 48.0.0
- '@ckeditor/ckeditor5-paragraph': 48.0.0
- '@ckeditor/ckeditor5-paste-from-office': 48.0.0
- '@ckeditor/ckeditor5-remove-format': 48.0.0
- '@ckeditor/ckeditor5-restricted-editing': 48.0.0
- '@ckeditor/ckeditor5-select-all': 48.0.0
- '@ckeditor/ckeditor5-show-blocks': 48.0.0
- '@ckeditor/ckeditor5-source-editing': 48.0.0
- '@ckeditor/ckeditor5-special-characters': 48.0.0
- '@ckeditor/ckeditor5-style': 48.0.0
- '@ckeditor/ckeditor5-table': 48.0.0
- '@ckeditor/ckeditor5-typing': 48.0.0
- '@ckeditor/ckeditor5-ui': 48.0.0
- '@ckeditor/ckeditor5-undo': 48.0.0
- '@ckeditor/ckeditor5-upload': 48.0.0
- '@ckeditor/ckeditor5-utils': 48.0.0
- '@ckeditor/ckeditor5-watchdog': 48.0.0
- '@ckeditor/ckeditor5-widget': 48.0.0
- '@ckeditor/ckeditor5-word-count': 48.0.0
+ '@ckeditor/ckeditor5-adapter-ckfinder': 48.0.1
+ '@ckeditor/ckeditor5-alignment': 48.0.1
+ '@ckeditor/ckeditor5-autoformat': 48.0.1
+ '@ckeditor/ckeditor5-autosave': 48.0.1
+ '@ckeditor/ckeditor5-basic-styles': 48.0.1
+ '@ckeditor/ckeditor5-block-quote': 48.0.1
+ '@ckeditor/ckeditor5-bookmark': 48.0.1
+ '@ckeditor/ckeditor5-ckbox': 48.0.1
+ '@ckeditor/ckeditor5-ckfinder': 48.0.1
+ '@ckeditor/ckeditor5-clipboard': 48.0.1
+ '@ckeditor/ckeditor5-cloud-services': 48.0.1
+ '@ckeditor/ckeditor5-code-block': 48.0.1(patch_hash=1530be090e4f5235e197fb6208a8e8230e3355d5633fc7cad2b2e892659e9c04)
+ '@ckeditor/ckeditor5-core': 48.0.1
+ '@ckeditor/ckeditor5-easy-image': 48.0.1
+ '@ckeditor/ckeditor5-editor-balloon': 48.0.1
+ '@ckeditor/ckeditor5-editor-classic': 48.0.1
+ '@ckeditor/ckeditor5-editor-decoupled': 48.0.1
+ '@ckeditor/ckeditor5-editor-inline': 48.0.1
+ '@ckeditor/ckeditor5-editor-multi-root': 48.0.1
+ '@ckeditor/ckeditor5-emoji': 48.0.1
+ '@ckeditor/ckeditor5-engine': 48.0.1
+ '@ckeditor/ckeditor5-enter': 48.0.1
+ '@ckeditor/ckeditor5-essentials': 48.0.1
+ '@ckeditor/ckeditor5-find-and-replace': 48.0.1
+ '@ckeditor/ckeditor5-font': 48.0.1
+ '@ckeditor/ckeditor5-fullscreen': 48.0.1
+ '@ckeditor/ckeditor5-heading': 48.0.1
+ '@ckeditor/ckeditor5-highlight': 48.0.1
+ '@ckeditor/ckeditor5-horizontal-line': 48.0.1
+ '@ckeditor/ckeditor5-html-embed': 48.0.1
+ '@ckeditor/ckeditor5-html-support': 48.0.1
+ '@ckeditor/ckeditor5-icons': 48.0.1
+ '@ckeditor/ckeditor5-image': 48.0.1
+ '@ckeditor/ckeditor5-indent': 48.0.1
+ '@ckeditor/ckeditor5-language': 48.0.1
+ '@ckeditor/ckeditor5-link': 48.0.1
+ '@ckeditor/ckeditor5-list': 48.0.1
+ '@ckeditor/ckeditor5-markdown-gfm': 48.0.1
+ '@ckeditor/ckeditor5-media-embed': 48.0.1
+ '@ckeditor/ckeditor5-mention': 48.0.1(patch_hash=70377e48a04e2f45abba79aa35f3d5527ec7aa7ffce44056f9957a49a24a4a60)
+ '@ckeditor/ckeditor5-minimap': 48.0.1
+ '@ckeditor/ckeditor5-page-break': 48.0.1
+ '@ckeditor/ckeditor5-paragraph': 48.0.1
+ '@ckeditor/ckeditor5-paste-from-office': 48.0.1
+ '@ckeditor/ckeditor5-remove-format': 48.0.1
+ '@ckeditor/ckeditor5-restricted-editing': 48.0.1
+ '@ckeditor/ckeditor5-select-all': 48.0.1
+ '@ckeditor/ckeditor5-show-blocks': 48.0.1
+ '@ckeditor/ckeditor5-source-editing': 48.0.1
+ '@ckeditor/ckeditor5-special-characters': 48.0.1
+ '@ckeditor/ckeditor5-style': 48.0.1
+ '@ckeditor/ckeditor5-table': 48.0.1
+ '@ckeditor/ckeditor5-typing': 48.0.1
+ '@ckeditor/ckeditor5-ui': 48.0.1
+ '@ckeditor/ckeditor5-undo': 48.0.1
+ '@ckeditor/ckeditor5-upload': 48.0.1
+ '@ckeditor/ckeditor5-utils': 48.0.1
+ '@ckeditor/ckeditor5-watchdog': 48.0.1
+ '@ckeditor/ckeditor5-widget': 48.0.1
+ '@ckeditor/ckeditor5-word-count': 48.0.1
transitivePeerDependencies:
- supports-color
@@ -23339,7 +23299,7 @@ snapshots:
normalize-path: 3.0.0
schema-utils: 4.3.3
serialize-javascript: 7.0.5
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
webpack: 5.105.4(esbuild@0.28.0)
core-js@3.46.0: {}
@@ -23868,7 +23828,7 @@ snapshots:
dependencies:
domelementtype: 2.3.0
- dompurify@3.4.0:
+ dompurify@3.4.1:
optionalDependencies:
'@types/trusted-types': 2.0.7
@@ -24060,7 +24020,7 @@ snapshots:
- supports-color
optional: true
- electron@41.2.0:
+ electron@41.3.0:
dependencies:
'@electron/get': 2.0.3
'@types/node': 24.12.2
@@ -24367,17 +24327,17 @@ snapshots:
optionalDependencies:
source-map: 0.6.1
- eslint-config-ckeditor5@14.1.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3):
+ eslint-config-ckeditor5@15.0.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3):
dependencies:
'@eslint/js': 9.39.4
'@eslint/markdown': 6.6.0
'@stylistic/eslint-plugin': 4.4.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
eslint: 10.2.1(jiti@2.6.1)
- eslint-plugin-ckeditor5-rules: 14.1.0
+ eslint-plugin-ckeditor5-rules: 15.0.0
eslint-plugin-mocha: 11.2.0(eslint@10.2.1(jiti@2.6.1))
globals: 16.5.0
typescript: 6.0.3
- typescript-eslint: 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ typescript-eslint: 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
transitivePeerDependencies:
- supports-color
@@ -24402,7 +24362,7 @@ snapshots:
eslint-linter-browserify@10.2.1: {}
- eslint-plugin-ckeditor5-rules@14.1.0:
+ eslint-plugin-ckeditor5-rules@15.0.0:
dependencies:
'@es-joy/jsdoccomment': 0.50.2
enhanced-resolve: 5.20.1
@@ -24429,7 +24389,7 @@ snapshots:
eslint: 10.2.1(jiti@2.6.1)
globals: 15.15.0
- eslint-plugin-playwright@2.10.1(eslint@10.2.1(jiti@2.6.1)):
+ eslint-plugin-playwright@2.10.2(eslint@10.2.1(jiti@2.6.1)):
dependencies:
eslint: 10.2.1(jiti@2.6.1)
globals: 17.5.0
@@ -25165,7 +25125,7 @@ snapshots:
glob@13.0.0:
dependencies:
minimatch: 10.2.5
- minipass: 7.1.3
+ minipass: 7.1.2
path-scurry: 2.0.0
glob@13.0.6:
@@ -25662,12 +25622,24 @@ snapshots:
transitivePeerDependencies:
- encoding
+ i18next-http-backend@3.0.5(encoding@0.1.13):
+ dependencies:
+ cross-fetch: 4.1.0(encoding@0.1.13)
+ transitivePeerDependencies:
+ - encoding
+
i18next@26.0.5(typescript@6.0.3):
dependencies:
'@babel/runtime': 7.29.2
optionalDependencies:
typescript: 6.0.3
+ i18next@26.0.6(typescript@6.0.3):
+ dependencies:
+ '@babel/runtime': 7.29.2
+ optionalDependencies:
+ typescript: 6.0.3
+
iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
@@ -26006,8 +25978,7 @@ snapshots:
isexe@3.1.5: {}
- isexe@4.0.0:
- optional: true
+ isexe@4.0.0: {}
isobject@3.0.1: {}
@@ -26270,6 +26241,14 @@ snapshots:
ky@1.14.2: {}
+ langium@3.3.1:
+ dependencies:
+ chevrotain: 11.0.3
+ chevrotain-allstar: 0.3.1(chevrotain@11.0.3)
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-textdocument: 1.0.12
+ vscode-uri: 3.0.8
+
langium@4.2.1:
dependencies:
chevrotain: 11.1.1
@@ -26535,7 +26514,8 @@ snapshots:
lowercase-keys@2.0.0: {}
- lru-cache@10.4.3: {}
+ lru-cache@10.4.3:
+ optional: true
lru-cache@11.2.7: {}
@@ -26606,22 +26586,6 @@ snapshots:
- bluebird
- supports-color
- make-fetch-happen@14.0.3:
- dependencies:
- '@npmcli/agent': 3.0.0
- cacache: 19.0.1
- http-cache-semantics: 4.2.0
- minipass: 7.1.3
- minipass-fetch: 4.0.1
- minipass-flush: 1.0.5
- minipass-pipeline: 1.2.4
- negotiator: 1.0.0
- proc-log: 5.0.0
- promise-retry: 2.0.1
- ssri: 12.0.0
- transitivePeerDependencies:
- - supports-color
-
make-fetch-happen@15.0.3:
dependencies:
'@npmcli/agent': 4.0.0
@@ -26637,7 +26601,6 @@ snapshots:
ssri: 13.0.0
transitivePeerDependencies:
- supports-color
- optional: true
many-keys-map@2.0.1: {}
@@ -26687,10 +26650,16 @@ snapshots:
markdown-table@3.0.4: {}
+ marked-footnote@1.4.0(marked@18.0.2):
+ dependencies:
+ marked: 18.0.2
+
marked@16.4.2: {}
marked@18.0.1: {}
+ marked@18.0.2: {}
+
marked@4.3.0: {}
marky@1.3.0: {}
@@ -26876,7 +26845,7 @@ snapshots:
d3-sankey: 0.12.3
dagre-d3-es: 7.0.14
dayjs: 1.11.20
- dompurify: 3.4.0
+ dompurify: 3.4.1
katex: 0.16.45
khroma: 2.1.0
lodash-es: 4.18.1
@@ -27119,6 +27088,8 @@ snapshots:
mind-elixir@5.10.0: {}
+ mind-elixir@5.11.0: {}
+
minimatch@10.2.5:
dependencies:
brace-expansion: 5.0.5
@@ -27153,14 +27124,6 @@ snapshots:
optionalDependencies:
encoding: 0.1.13
- minipass-fetch@4.0.1:
- dependencies:
- minipass: 7.1.3
- minipass-sized: 1.0.3
- minizlib: 3.1.0
- optionalDependencies:
- encoding: 0.1.13
-
minipass-fetch@5.0.0:
dependencies:
minipass: 7.1.3
@@ -27168,7 +27131,6 @@ snapshots:
minizlib: 3.1.0
optionalDependencies:
encoding: 0.1.13
- optional: true
minipass-flush@1.0.5:
dependencies:
@@ -27190,6 +27152,8 @@ snapshots:
dependencies:
yallist: 4.0.0
+ minipass@7.1.2: {}
+
minipass@7.1.3: {}
minizlib@2.1.2:
@@ -27404,21 +27368,6 @@ snapshots:
node-gyp-build@4.8.4:
optional: true
- node-gyp@11.4.2:
- dependencies:
- env-paths: 2.2.1
- exponential-backoff: 3.1.3
- graceful-fs: 4.2.11
- make-fetch-happen: 14.0.3
- nopt: 8.1.0
- proc-log: 5.0.0
- semver: 7.7.4
- tar: 7.5.11
- tinyglobby: 0.2.15
- which: 5.0.0
- transitivePeerDependencies:
- - supports-color
-
node-gyp@12.2.0:
dependencies:
env-paths: 2.2.1
@@ -27429,11 +27378,10 @@ snapshots:
proc-log: 6.1.0
semver: 7.7.4
tar: 7.5.11
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
which: 6.0.1
transitivePeerDependencies:
- supports-color
- optional: true
node-html-parser@6.1.13:
dependencies:
@@ -27469,14 +27417,9 @@ snapshots:
dependencies:
abbrev: 1.1.1
- nopt@8.1.0:
- dependencies:
- abbrev: 3.0.1
-
nopt@9.0.0:
dependencies:
abbrev: 4.0.0
- optional: true
normalize-package-data@2.5.0:
dependencies:
@@ -28061,9 +28004,9 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss-safe-parser@7.0.1(postcss@8.5.9):
+ postcss-safe-parser@7.0.1(postcss@8.5.10):
dependencies:
- postcss: 8.5.9
+ postcss: 8.5.10
postcss-selector-parser@6.1.2:
dependencies:
@@ -28083,7 +28026,7 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
- postcss@8.5.9:
+ postcss@8.5.10:
dependencies:
nanoid: 3.3.11
picocolors: 1.1.1
@@ -28131,10 +28074,7 @@ snapshots:
proc-log@2.0.1: {}
- proc-log@5.0.0: {}
-
- proc-log@6.1.0:
- optional: true
+ proc-log@6.1.0: {}
process-nextick-args@2.0.1: {}
@@ -28185,6 +28125,21 @@ snapshots:
'@types/node': 24.12.2
long: 5.3.2
+ protobufjs@7.5.5:
+ dependencies:
+ '@protobufjs/aspromise': 1.1.2
+ '@protobufjs/base64': 1.1.2
+ '@protobufjs/codegen': 2.0.4
+ '@protobufjs/eventemitter': 1.1.0
+ '@protobufjs/fetch': 1.1.0
+ '@protobufjs/float': 1.0.2
+ '@protobufjs/inquire': 1.1.0
+ '@protobufjs/path': 1.1.2
+ '@protobufjs/pool': 1.1.0
+ '@protobufjs/utf8': 1.1.0
+ '@types/node': 24.12.2
+ long: 5.3.2
+
protocol-buffers-schema@3.6.1: {}
proxy-addr@2.0.7:
@@ -28337,6 +28292,17 @@ snapshots:
react-dom: 19.2.4(react@19.2.4)
typescript: 6.0.3
+ react-i18next@17.0.4(i18next@26.0.6(typescript@6.0.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@6.0.3):
+ dependencies:
+ '@babel/runtime': 7.29.2
+ html-parse-stringify: 3.0.1
+ i18next: 26.0.6(typescript@6.0.3)
+ react: 19.2.4
+ use-sync-external-store: 1.6.0(react@19.2.4)
+ optionalDependencies:
+ react-dom: 19.2.4(react@19.2.4)
+ typescript: 6.0.3
+
react-interactive@0.8.3(react@16.14.0):
dependencies:
detect-it: 3.0.7
@@ -28490,7 +28456,7 @@ snapshots:
classnames: 2.5.1
core-js: 3.46.0
decko: 1.2.0
- dompurify: 3.4.0
+ dompurify: 3.4.1
eventemitter3: 5.0.1
json-pointer: 0.6.2
lunr: 2.3.9
@@ -28769,40 +28735,40 @@ snapshots:
'@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.13
'@rolldown/binding-win32-x64-msvc': 1.0.0-rc.13
- rolldown@1.0.0-rc.15:
+ rolldown@1.0.0-rc.16:
dependencies:
- '@oxc-project/types': 0.124.0
- '@rolldown/pluginutils': 1.0.0-rc.15
+ '@oxc-project/types': 0.126.0
+ '@rolldown/pluginutils': 1.0.0-rc.16
optionalDependencies:
- '@rolldown/binding-android-arm64': 1.0.0-rc.15
- '@rolldown/binding-darwin-arm64': 1.0.0-rc.15
- '@rolldown/binding-darwin-x64': 1.0.0-rc.15
- '@rolldown/binding-freebsd-x64': 1.0.0-rc.15
- '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15
- '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15
- '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15
- '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15
- '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15
- '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15
- '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15
- '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15
- '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15
- '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15
- '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15
+ '@rolldown/binding-android-arm64': 1.0.0-rc.16
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.16
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.16
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.16
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.16
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.16
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.16
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.16
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.16
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.16
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.16
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.16
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.16
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.16
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.16
- rollup-plugin-stats@2.1.1(rolldown@1.0.0-rc.15)(rollup@4.60.1)(vite@8.0.8(@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-stats@2.1.1(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.9(@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.15
+ rolldown: 1.0.0-rc.16
rollup: 4.60.1
- vite: 8.0.8(@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.9(@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.1(rolldown@1.0.0-rc.15)(rollup@4.60.1)(vite@8.0.8(@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.1(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.9(@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.1(rolldown@1.0.0-rc.15)(rollup@4.60.1)(vite@8.0.8(@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-stats: 2.1.1(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.9(@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.15
+ rolldown: 1.0.0-rc.16
rollup: 4.60.1
- vite: 8.0.8(@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.9(@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:
@@ -28920,7 +28886,7 @@ snapshots:
htmlparser2: 10.1.0
is-plain-object: 5.0.0
parse-srcset: 1.0.2
- postcss: 8.5.9
+ postcss: 8.5.10
sass-embedded-all-unknown@1.91.0:
dependencies:
@@ -29450,7 +29416,6 @@ snapshots:
ssri@13.0.0:
dependencies:
minipass: 7.1.3
- optional: true
ssri@9.0.1:
dependencies:
@@ -29648,22 +29613,22 @@ snapshots:
optionalDependencies:
react-dom: 19.2.4(react@19.2.4)
- stylelint-config-ckeditor5@14.1.0(stylelint@17.7.0(typescript@6.0.3)):
+ stylelint-config-ckeditor5@15.0.0(stylelint@17.8.0(typescript@6.0.3)):
dependencies:
- '@stylistic/stylelint-plugin': 3.1.3(stylelint@17.7.0(typescript@6.0.3))
- stylelint: 17.7.0(typescript@6.0.3)
- stylelint-config-recommended: 16.0.0(stylelint@17.7.0(typescript@6.0.3))
- stylelint-plugin-ckeditor5-rules: 14.1.0(stylelint@17.7.0(typescript@6.0.3))
+ '@stylistic/stylelint-plugin': 3.1.3(stylelint@17.8.0(typescript@6.0.3))
+ stylelint: 17.8.0(typescript@6.0.3)
+ stylelint-config-recommended: 16.0.0(stylelint@17.8.0(typescript@6.0.3))
+ stylelint-plugin-ckeditor5-rules: 15.0.0(stylelint@17.8.0(typescript@6.0.3))
- stylelint-config-recommended@16.0.0(stylelint@17.7.0(typescript@6.0.3)):
+ stylelint-config-recommended@16.0.0(stylelint@17.8.0(typescript@6.0.3)):
dependencies:
- stylelint: 17.7.0(typescript@6.0.3)
+ stylelint: 17.8.0(typescript@6.0.3)
- stylelint-plugin-ckeditor5-rules@14.1.0(stylelint@17.7.0(typescript@6.0.3)):
+ stylelint-plugin-ckeditor5-rules@15.0.0(stylelint@17.8.0(typescript@6.0.3)):
dependencies:
- stylelint: 17.7.0(typescript@6.0.3)
+ stylelint: 17.8.0(typescript@6.0.3)
- stylelint@17.7.0(typescript@6.0.3):
+ stylelint@17.8.0(typescript@6.0.3):
dependencies:
'@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
'@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
@@ -29692,8 +29657,8 @@ snapshots:
micromatch: 4.0.8
normalize-path: 3.0.0
picocolors: 1.1.1
- postcss: 8.5.9
- postcss-safe-parser: 7.0.1(postcss@8.5.9)
+ postcss: 8.5.10
+ postcss-safe-parser: 7.0.1(postcss@8.5.10)
postcss-selector-parser: 7.1.1
postcss-value-parser: 4.2.0
string-width: 8.2.0
@@ -29714,7 +29679,7 @@ snapshots:
lines-and-columns: 1.2.4
mz: 2.7.0
pirates: 4.0.7
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
ts-interface-checker: 0.1.13
sumchecker@3.0.1:
@@ -29929,7 +29894,7 @@ snapshots:
tinyexec@1.0.4: {}
- tinyglobby@0.2.15:
+ tinyglobby@0.2.16:
dependencies:
fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4
@@ -30132,23 +30097,12 @@ snapshots:
typescript: 6.0.3
yaml: 2.8.3
- typescript-eslint@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3):
+ typescript-eslint@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.58.1(@typescript-eslint/parser@8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/parser': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/typescript-estree': 8.58.1(typescript@6.0.3)
- '@typescript-eslint/utils': 8.58.1(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- eslint: 10.2.1(jiti@2.6.1)
- typescript: 6.0.3
- transitivePeerDependencies:
- - supports-color
-
- typescript-eslint@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3):
- dependencies:
- '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/parser': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
- '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.3)
- '@typescript-eslint/utils': 8.58.2(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3))(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/parser': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
+ '@typescript-eslint/typescript-estree': 8.59.0(typescript@6.0.3)
+ '@typescript-eslint/utils': 8.59.0(eslint@10.2.1(jiti@2.6.1))(typescript@6.0.3)
eslint: 10.2.1(jiti@2.6.1)
typescript: 6.0.3
transitivePeerDependencies:
@@ -30250,7 +30204,7 @@ snapshots:
pkg-types: 2.3.0
scule: 1.3.0
strip-literal: 3.1.0
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
unplugin: 2.3.11
unplugin-utils: 0.3.1
@@ -30472,7 +30426,7 @@ snapshots:
es-module-lexer: 2.0.0
obug: 2.1.1
pathe: 2.0.3
- vite: 8.0.8(@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.9(@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'
@@ -30487,7 +30441,7 @@ snapshots:
- tsx
- yaml
- vite-plugin-dts@4.5.4(@types/node@24.12.2)(rollup@4.60.1)(typescript@6.0.3)(vite@8.0.8(@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.3)(vite@8.0.9(@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)
@@ -30500,27 +30454,35 @@ snapshots:
magic-string: 0.30.21
typescript: 6.0.3
optionalDependencies:
- vite: 8.0.8(@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.9(@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.8(@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.9(@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.8(@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)
+ tinyglobby: 0.2.16
+ vite: 8.0.9(@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.3)(vite@8.0.8(@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.1.0(vite@8.0.9(@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.16
+ vite: 8.0.9(@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.3)(vite@8.0.9(@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.3
- vite: 8.0.8(@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.9(@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.8(@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.9(@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
@@ -30528,15 +30490,15 @@ snapshots:
simple-code-frame: 1.3.0
source-map: 0.7.6
stack-trace: 1.0.0-pre2
- vite: 8.0.8(@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.9(@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.8(@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.9(@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.9
- rolldown: 1.0.0-rc.15
- tinyglobby: 0.2.15
+ postcss: 8.5.10
+ rolldown: 1.0.0-rc.16
+ tinyglobby: 0.2.16
optionalDependencies:
'@types/node': 24.12.2
esbuild: 0.27.4
@@ -30549,13 +30511,13 @@ snapshots:
tsx: 4.21.0
yaml: 2.8.3
- vite@8.0.8(@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.9(@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.9
- rolldown: 1.0.0-rc.15
- tinyglobby: 0.2.15
+ postcss: 8.5.10
+ rolldown: 1.0.0-rc.16
+ tinyglobby: 0.2.16
optionalDependencies:
'@types/node': 24.12.2
esbuild: 0.28.0
@@ -30568,15 +30530,15 @@ snapshots:
tsx: 4.21.0
yaml: 2.8.3
- vitest@4.1.4(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.4)(@vitest/coverage-istanbul@4.1.4)(@vitest/coverage-v8@4.1.4)(@vitest/ui@4.1.4)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.5(@opentelemetry/api@1.9.0)(@types/node@24.12.2)(@vitest/browser-webdriverio@4.1.5)(@vitest/coverage-istanbul@4.1.5)(@vitest/coverage-v8@4.1.5)(@vitest/ui@4.1.5)(happy-dom@20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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.4
- '@vitest/mocker': 4.1.4(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.8(@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.4
- '@vitest/runner': 4.1.4
- '@vitest/snapshot': 4.1.4
- '@vitest/spy': 4.1.4
- '@vitest/utils': 4.1.4
+ '@vitest/expect': 4.1.5
+ '@vitest/mocker': 4.1.5(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(vite@8.0.9(@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.5
+ '@vitest/runner': 4.1.5
+ '@vitest/snapshot': 4.1.5
+ '@vitest/spy': 4.1.5
+ '@vitest/utils': 4.1.5
es-module-lexer: 2.0.0
expect-type: 1.3.0
magic-string: 0.30.21
@@ -30586,17 +30548,17 @@ snapshots:
std-env: 4.0.0
tinybench: 2.9.0
tinyexec: 1.0.4
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
tinyrainbow: 3.1.0
- vite: 8.0.8(@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.9(@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.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.8(@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.4)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
- '@vitest/coverage-istanbul': 4.1.4(vitest@4.1.4)
- '@vitest/coverage-v8': 4.1.4(@vitest/browser@4.1.4)(vitest@4.1.4)
- '@vitest/ui': 4.1.4(vitest@4.1.4)
+ '@vitest/browser-webdriverio': 4.1.5(bufferutil@4.0.9)(msw@2.7.5(@types/node@24.12.2)(typescript@6.0.3))(utf-8-validate@6.0.5)(vite@8.0.9(@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.5)(webdriverio@9.27.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
+ '@vitest/coverage-istanbul': 4.1.5(vitest@4.1.5)
+ '@vitest/coverage-v8': 4.1.5(@vitest/browser@4.1.5)(vitest@4.1.5)
+ '@vitest/ui': 4.1.5(vitest@4.1.5)
happy-dom: 20.9.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
jsdom: 26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
transitivePeerDependencies:
@@ -30619,6 +30581,8 @@ snapshots:
dependencies:
vscode-languageserver-protocol: 3.17.5
+ vscode-uri@3.0.8: {}
+
vscode-uri@3.1.0: {}
vt-pbf@3.1.3:
@@ -30880,7 +30844,6 @@ snapshots:
which@6.0.1:
dependencies:
isexe: 4.0.0
- optional: true
why-is-node-running@2.3.0:
dependencies:
@@ -30947,7 +30910,7 @@ snapshots:
is-wsl: 3.1.1
powershell-utils: 0.1.0
- wxt@0.20.24(@types/node@24.12.2)(eslint@10.2.1(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@0.20.25(@types/node@24.12.2)(eslint@10.2.1(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)
@@ -30986,9 +30949,9 @@ snapshots:
prompts: 2.4.2
publish-browser-extension: 3.0.3
scule: 1.3.0
- tinyglobby: 0.2.15
+ tinyglobby: 0.2.16
unimport: 5.6.0
- vite: 8.0.8(@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.9(@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:
diff --git a/tsconfig.json b/tsconfig.json
index 568582616b..6fcdc2b198 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -74,6 +74,9 @@
},
{
"path": "./scripts"
+ },
+ {
+ "path": "./apps/script-deployer"
}
]
}