Compare commits

..

22 Commits

Author SHA1 Message Date
Elian Doran
22e9a948fe chore(client): address requested changes 2026-02-15 11:32:27 +02:00
Elian Doran
2ef4eb7eae chore(client): fix type errors 2026-02-14 12:43:40 +02:00
Elian Doran
7b230706cb feat(badges/content): improve color support 2026-02-14 12:41:41 +02:00
Elian Doran
5a2b04adba feat(badges/content): add support for web view 2026-02-14 12:35:06 +02:00
Elian Doran
50dcd3ba44 feat(badges/content): add support for render note 2026-02-14 12:30:43 +02:00
Elian Doran
740b02952f feat(badges/content): disable toggle when not necessary 2026-02-14 12:22:27 +02:00
Elian Doran
866d3110da feat(badges/content): add badge for custom CSS 2026-02-14 12:05:24 +02:00
Elian Doran
7a3e7fccec feat(badges/content): handle widgets as separate content type 2026-02-14 11:56:40 +02:00
Elian Doran
3107bc8840 feat(badges/content): add toggle for widget 2026-02-14 11:47:42 +02:00
Elian Doran
2d34cdef5e feat(badges/content): integrate options for frontend script 2026-02-14 11:37:20 +02:00
Elian Doran
bd1f0909a2 feat(badges/content): configurable backend run options 2026-02-14 11:30:05 +02:00
Elian Doran
ef75de63fe feat(badges/content): option to execute now 2026-02-14 11:15:08 +02:00
Elian Doran
a739d28563 feat(badges/content): option to open API docs 2026-02-14 11:12:55 +02:00
Elian Doran
66ff009b72 feat(badges/content): option to open documentation 2026-02-14 11:08:30 +02:00
Elian Doran
a68e82c1c8 feat(badges/content): basic support for backend scripts 2026-02-14 10:57:32 +02:00
Elian Doran
46556c1c14 chore(badges/content): make toggle more compact 2026-02-14 10:40:19 +02:00
Elian Doran
7be637798f feat(badges/content): functional enable/disable toggle 2026-02-14 10:30:34 +02:00
Elian Doran
9b3396349e refactor(commons): add builtin_attributes to commons 2026-02-14 10:30:24 +02:00
Elian Doran
ccff210b4c feat(badges/content): indicate enabled/disabled state 2026-02-14 09:57:40 +02:00
Elian Doran
a2264847b6 refactor(badges/content): use shared mechanism for extracting info 2026-02-14 09:53:37 +02:00
Elian Doran
7d103f8c50 refactor(badges/content): extract to separate file 2026-02-14 09:37:48 +02:00
Elian Doran
f3dccc0aec feat(badges/content): detect icon pack 2026-02-14 09:19:46 +02:00
29 changed files with 552 additions and 208 deletions

View File

@@ -11,12 +11,12 @@
"license": "AGPL-3.0-only",
"packageManager": "pnpm@10.29.3",
"devDependencies": {
"@redocly/cli": "2.18.1",
"@redocly/cli": "2.18.0",
"archiver": "7.0.1",
"fs-extra": "11.3.3",
"react": "19.2.4",
"react-dom": "19.2.4",
"typedoc": "0.28.17",
"typedoc": "0.28.16",
"typedoc-plugin-missing-exports": "4.1.2"
}
}

View File

@@ -27,7 +27,7 @@
"@mermaid-js/layout-elk": "0.2.0",
"@mind-elixir/node-menu": "5.0.1",
"@popperjs/core": "2.11.8",
"@preact/signals": "2.8.0",
"@preact/signals": "2.7.1",
"@triliumnext/ckeditor5": "workspace:*",
"@triliumnext/codemirror": "workspace:*",
"@triliumnext/commons": "workspace:*",
@@ -44,7 +44,7 @@
"draggabilly": "3.0.0",
"force-graph": "1.51.1",
"globals": "17.3.0",
"i18next": "25.8.7",
"i18next": "25.8.6",
"i18next-http-backend": "3.0.2",
"jquery": "4.0.0",
"jquery.fancytree": "2.38.5",
@@ -61,7 +61,7 @@
"panzoom": "9.4.3",
"preact": "10.28.3",
"react-i18next": "16.5.4",
"react-window": "2.2.7",
"react-window": "2.2.6",
"reveal.js": "5.2.1",
"svg-pan-zoom": "3.6.2",
"tabulator-tables": "6.3.1",

View File

@@ -700,6 +700,15 @@ export default class FNote {
return this.hasAttribute(LABEL, name);
}
/**
* Returns `true` if the note has a label with the given name (same as {@link hasOwnedLabel}), or it has a label with the `disabled:` prefix (for example due to a safe import).
* @param name the name of the label to look for.
* @returns `true` if the label exists, or its version with the `disabled:` prefix.
*/
hasLabelOrDisabled(name: string) {
return this.hasLabel(name) || this.hasLabel(`disabled:${name}`);
}
/**
* @param name - label name
* @returns true if label exists (including inherited) and does not have "false" value.

View File

@@ -210,6 +210,7 @@
--badge-share-background-color: #4d4d4d;
--badge-clipped-note-background-color: #295773;
--badge-execute-background-color: #604180;
--badge-active-content-background-color: rgb(12, 68, 70);
--note-icon-background-color: #444444;
--note-icon-color: #d4d4d4;
@@ -238,9 +239,9 @@
--bottom-panel-background-color: #11111180;
--bottom-panel-title-bar-background-color: #3F3F3F80;
--status-bar-border-color: var(--main-border-color);
--scrollbar-thumb-color: #fdfdfd5c;
--scrollbar-thumb-hover-color: #ffffff7d;
--scrollbar-background-color: transparent;
@@ -351,4 +352,4 @@ body .todo-list input[type="checkbox"]:not(:checked):before {
.note-split.with-hue *::selection,
.quick-edit-dialog-wrapper.with-hue *::selection {
--selection-background-color: hsl(var(--custom-color-hue), 49.2%, 35%);
}
}

View File

@@ -202,6 +202,7 @@
--badge-share-background-color: #6b6b6b;
--badge-clipped-note-background-color: #2284c0;
--badge-execute-background-color: #7b47af;
--badge-active-content-background-color: rgb(27, 164, 168);
--note-icon-background-color: #4f4f4f;
--note-icon-color: white;
@@ -322,4 +323,4 @@
.note-split.with-hue *::selection,
.quick-edit-dialog-wrapper.with-hue *::selection {
--selection-background-color: hsl(var(--custom-color-hue), 60%, 90%);
}
}

View File

@@ -53,21 +53,6 @@
"prefix": "Πρόθεμα: ",
"save": "Αποθήκευση",
"branch_prefix_saved": "Το πρόθεμα κλάδου αποθηκεύτηκε.",
"branch_prefix_saved_multiple": "Το πρόθεμα κλάδου αποθηκεύτηκε για {{count}} κλάδους.",
"affected_branches": "Επηρεαζόμενοι κλάδοι ({{count}}):"
},
"bulk_actions": {
"bulk_actions": "Μαζικές ενέργειες",
"affected_notes": "Επηρεαζόμενες σημειώσεις",
"include_descendants": "Συμπερίληψη απογόνων των επιλεγμένων σημειώσεων",
"available_actions": "Διαθέσιμες ενέργειες",
"chosen_actions": "Επιλεγμένες ενέργειες",
"execute_bulk_actions": "Εκτέλεση μαζικών ενεργειών",
"bulk_actions_executed": "Οι μαζικές ενέργειες εκτελέστηκαν επιτυχώς.",
"none_yet": "Καμία ακόμη… προσθέστε μια ενέργεια επιλέγοντας μία από τις διαθέσιμες παραπάνω.",
"labels": "Ετικέτες",
"relations": "Συσχετίσεις",
"notes": "Σημειώσεις",
"other": "Λοιπά"
"branch_prefix_saved_multiple": "Το πρόθεμα κλάδου αποθηκεύτηκε για {{count}} κλάδους."
}
}

View File

@@ -2288,5 +2288,27 @@
},
"bookmark_buttons": {
"bookmarks": "Bookmarks"
},
"active_content_badges": {
"type_icon_pack": "Icon pack",
"type_backend_script": "Backend script",
"type_frontend_script": "Frontend script",
"type_widget": "Widget",
"type_app_css": "Custom CSS",
"type_render_note": "Render note",
"type_web_view": "Web view",
"toggle_tooltip_enable_tooltip": "Click to enable this {{type}}.",
"toggle_tooltip_disable_tooltip": "Click to disable this {{type}}.",
"menu_docs": "Open documentation",
"menu_execute_now": "Execute script now",
"menu_run": "Run automatically",
"menu_run_disabled": "Manually",
"menu_run_backend_startup": "When the backend starts up",
"menu_run_hourly": "Hourly",
"menu_run_daily": "Daily",
"menu_run_frontend_startup": "When the desktop frontend starts up",
"menu_run_mobile_startup": "When the mobile frontend starts up",
"menu_change_to_widget": "Change to widget",
"menu_change_to_frontend_script": "Change to frontend script"
}
}

View File

@@ -1590,8 +1590,7 @@
"description": "Cur síos",
"reload_app": "Athlódáil an aip chun na hathruithe a chur i bhfeidhm",
"set_all_to_default": "Socraigh gach aicearra go dtí an réamhshocrú",
"confirm_reset": "An bhfuil tú cinnte gur mhaith leat na haicearraí méarchláir go léir a athshocrú go dtí an rogha réamhshocraithe?",
"no_results": "Níor aimsíodh aon aicearraí a mheaitseálann '{{filter}}'"
"confirm_reset": "An bhfuil tú cinnte gur mhaith leat na haicearraí méarchláir go léir a athshocrú go dtí an rogha réamhshocraithe?"
},
"spellcheck": {
"title": "Seiceáil Litrithe",
@@ -1809,9 +1808,7 @@
"print_report_collection_content_many": "Níorbh fhéidir {{count}} nótaí sa bhailiúchán a phriontáil mar nach dtacaítear leo nó mar go bhfuil siad faoi chosaint.",
"print_report_collection_content_other": "Níorbh fhéidir {{count}} nótaí sa bhailiúchán a phriontáil mar nach dtacaítear leo nó mar go bhfuil siad faoi chosaint.",
"print_report_collection_details_button": "Féach sonraí",
"print_report_collection_details_ignored_notes": "Nótaí neamhairdithe",
"print_report_error_title": "Theip ar phriontáil",
"print_report_stack_trace": "Rian cruachta"
"print_report_collection_details_ignored_notes": "Nótaí neamhairdithe"
},
"note_title": {
"placeholder": "clóscríobh teideal an nóta anseo...",

View File

@@ -0,0 +1,310 @@
import { BUILTIN_ATTRIBUTES } from "@triliumnext/commons";
import clsx from "clsx";
import { useEffect, useState } from "preact/hooks";
import FNote from "../../entities/fnote";
import attributes from "../../services/attributes";
import { t } from "../../services/i18n";
import { openInAppHelpFromUrl } from "../../services/utils";
import { BadgeWithDropdown } from "../react/Badge";
import { FormDropdownDivider, FormDropdownSubmenu, FormListItem } from "../react/FormList";
import FormToggle from "../react/FormToggle";
import { useNoteContext, useNoteLabel, useNoteLabelBoolean, useTriliumEvent } from "../react/hooks";
const DANGEROUS_ATTRIBUTES = BUILTIN_ATTRIBUTES.filter(a => a.isDangerous || a.name === "appCss");
const activeContentLabels = [ "iconPack", "widget", "appCss" ] as const;
interface ActiveContentInfo {
type: "iconPack" | "backendScript" | "frontendScript" | "widget" | "appCss" | "renderNote" | "webView";
isEnabled: boolean;
canToggleEnabled: boolean;
}
const typeMappings: Record<ActiveContentInfo["type"], {
icon: string;
helpPage: string;
apiDocsPage?: string;
isExecutable?: boolean
}> = {
iconPack: {
icon: "bx bx-package",
helpPage: "g1mlRoU8CsqC",
},
backendScript: {
icon: "bx bx-server",
helpPage: "SPirpZypehBG",
apiDocsPage: "MEtfsqa5VwNi",
isExecutable: true,
},
frontendScript: {
icon: "bx bx-window",
helpPage: "yIhgI5H7A2Sm",
apiDocsPage: "Q2z6av6JZVWm",
isExecutable: true
},
widget: {
icon: "bx bxs-widget",
helpPage: "MgibgPcfeuGz"
},
appCss: {
icon: "bx bxs-file-css",
helpPage: "AlhDUqhENtH7"
},
renderNote: {
icon: "bx bx-extension",
helpPage: "HcABDtFCkbFN"
},
webView: {
icon: "bx bx-globe",
helpPage: "1vHRoWCEjj0L"
}
};
export function ActiveContentBadges() {
const { note } = useNoteContext();
const info = useActiveContentInfo(note);
return (note && info &&
<>
{info.canToggleEnabled && <ActiveContentToggle info={info} note={note} />}
<ActiveContentBadge info={info} note={note} />
</>
);
}
function ActiveContentBadge({ info, note }: { note: FNote, info: ActiveContentInfo }) {
const { icon, helpPage, apiDocsPage, isExecutable } = typeMappings[info.type];
return (
<BadgeWithDropdown
className={clsx("active-content-badge", info.canToggleEnabled && !info.isEnabled && "disabled")}
icon={icon}
text={getTranslationForType(info.type)}
>
{isExecutable && (
<>
<FormListItem
icon="bx bx-play"
triggerCommand="runActiveNote"
>{t("active_content_badges.menu_execute_now")}</FormListItem>
<ScriptRunOptions note={note} info={info} />
<FormDropdownDivider />
</>
)}
{(info.type === "frontendScript" || info.type === "widget") && (
<>
<WidgetSwitcher note={note} />
<FormDropdownDivider />
</>
)}
<FormListItem
icon="bx bx-help-circle"
onClick={() => openInAppHelpFromUrl(helpPage)}
>{t("active_content_badges.menu_docs")}</FormListItem>
{apiDocsPage && <FormListItem
icon="bx bx-book-content"
onClick={() => openInAppHelpFromUrl(apiDocsPage)}
>{t("code_buttons.trilium_api_docs_button_title")}</FormListItem>}
</BadgeWithDropdown>
);
}
function ScriptRunOptions({ info, note }: { note: FNote, info: ActiveContentInfo }) {
const [ run, setRun ] = useNoteLabel(note, "run");
const options: {
title: string;
value: string | null;
type: "both" | "backendScript" | "frontendScript";
}[] = ([
{
title: t("active_content_badges.menu_run_disabled"),
value: null,
type: "both"
},
{
title: t("active_content_badges.menu_run_backend_startup"),
value: "backendStartup",
type: "backendScript"
},
{
title: t("active_content_badges.menu_run_daily"),
value: "daily",
type: "backendScript"
},
{
title: t("active_content_badges.menu_run_hourly"),
value: "hourly",
type: "backendScript"
},
{
title: t("active_content_badges.menu_run_frontend_startup"),
value: "frontendStartup",
type: "frontendScript"
},
{
title: t("active_content_badges.menu_run_mobile_startup"),
value: "mobileStartup",
type: "frontendScript"
}
] as const).filter(option => option.type === "both" || option.type === info.type);
return (
<FormDropdownSubmenu title={t("active_content_badges.menu_run")} icon="bx bx-rss" dropStart>
{options.map(({ title, value }) => (
<FormListItem
key={value}
onClick={() => setRun(value)}
checked={run ? run === value : value === null }
>{title}</FormListItem>
))}
</FormDropdownSubmenu>
);
}
function WidgetSwitcher({ note }: { note: FNote }) {
const [ widget, setWidget ] = useNoteLabelBoolean(note, "widget");
const [ disabledWidget, setDisabledWidget ] = useNoteLabelBoolean(note, "disabled:widget");
return (widget || disabledWidget)
? <FormListItem
icon="bx bx-window"
onClick={() => {
setWidget(false);
setDisabledWidget(false);
}}
>{t("active_content_badges.menu_change_to_frontend_script")}</FormListItem>
: <FormListItem
icon={widget ? "bx bx-window" : "bx bxs-widget"}
onClick={() => {
setWidget(true);
}}
>{t("active_content_badges.menu_change_to_widget")}</FormListItem>;
}
function getTranslationForType(type: ActiveContentInfo["type"]) {
switch (type) {
case "iconPack":
return t("active_content_badges.type_icon_pack");
case "backendScript":
return t("active_content_badges.type_backend_script");
case "frontendScript":
return t("active_content_badges.type_frontend_script");
case "widget":
return t("active_content_badges.type_widget");
case "appCss":
return t("active_content_badges.type_app_css");
case "renderNote":
return t("active_content_badges.type_render_note");
case "webView":
return t("active_content_badges.type_web_view");
}
}
function ActiveContentToggle({ note, info }: { note: FNote, info: ActiveContentInfo }) {
const typeTranslation = getTranslationForType(info.type);
return info && <FormToggle
switchOnName="" switchOffName=""
currentValue={info.isEnabled}
switchOffTooltip={t("active_content_badges.toggle_tooltip_disable_tooltip", { type: typeTranslation })}
switchOnTooltip={t("active_content_badges.toggle_tooltip_enable_tooltip", { type: typeTranslation })}
onChange={async (willEnable) => {
const attrs = note.getOwnedAttributes()
.filter(attr => {
if (attr.isInheritable) return false;
const baseName = getNameWithoutPrefix(attr.name);
return DANGEROUS_ATTRIBUTES.some(item => item.name === baseName && item.type === attr.type);
});
for (const attr of attrs) {
const baseName = getNameWithoutPrefix(attr.name);
const newName = willEnable ? baseName : `disabled:${baseName}`;
if (newName === attr.name) continue;
// We are adding and removing afterwards to avoid a flicker (because for a moment there would be no active content attribute anymore) because the operations are done in sequence and not atomically.
if (attr.type === "label") {
await attributes.setLabel(note.noteId, newName, attr.value);
} else {
await attributes.setRelation(note.noteId, newName, attr.value);
}
await attributes.removeAttributeById(note.noteId, attr.attributeId);
}
}}
/>;
}
function getNameWithoutPrefix(name: string) {
return name.startsWith("disabled:") ? name.substring(9) : name;
}
function useActiveContentInfo(note: FNote | null | undefined) {
const [ info, setInfo ] = useState<ActiveContentInfo | null>(null);
function refresh() {
let type: ActiveContentInfo["type"] | null = null;
let isEnabled = false;
let canToggleEnabled = false;
if (!note) {
setInfo(null);
return;
}
if (note.type === "render") {
type = "renderNote";
isEnabled = note.hasRelation("renderNote");
canToggleEnabled = note.hasRelation("renderNote") || note.hasRelation("disabled:renderNote");
} else if (note.type === "webView") {
type = "webView";
isEnabled = note.hasLabel("webViewSrc");
canToggleEnabled = note.hasLabelOrDisabled("webViewSrc");
} else if (note.type === "code" && note.mime === "application/javascript;env=backend") {
type = "backendScript";
for (const backendLabel of [ "run", "customRequestHandler", "customResourceProvider" ]) {
isEnabled ||= note.hasLabel(backendLabel);
if (!canToggleEnabled && note.hasLabelOrDisabled(backendLabel)) {
canToggleEnabled = true;
}
}
} else if (note.type === "code" && note.mime === "application/javascript;env=frontend") {
type = "frontendScript";
isEnabled = note.hasLabel("widget") || note.hasLabel("run");
canToggleEnabled = note.hasLabelOrDisabled("widget") || note.hasLabelOrDisabled("run");
}
for (const labelToCheck of activeContentLabels ) {
if (note.hasLabel(labelToCheck)) {
type = labelToCheck;
break;
} else if (note.hasLabel(`disabled:${labelToCheck}`)) {
type = labelToCheck;
isEnabled = false;
break;
}
}
console.log({ type, isEnabled, canToggleEnabled });
if (type) {
setInfo({ type, isEnabled, canToggleEnabled });
} else {
setInfo(null);
}
}
// Refresh on note change.
useEffect(refresh, [ note ]);
useTriliumEvent("entitiesReloaded", ({ loadResults }) => {
if (loadResults.getAttributeRows().some(attr => attributes.isAffecting(attr, note))) {
refresh();
}
});
return info;
}

View File

@@ -37,6 +37,10 @@
pointer-events: none;
}
}
&.active-content-badge { --color: var(--badge-active-content-background-color); }
&.active-content-badge.disabled {
opacity: 0.5;
}
min-width: 0;
@@ -45,6 +49,11 @@
text-overflow: ellipsis;
min-width: 0;
}
.switch-button {
--switch-track-height: 8px;
--switch-track-width: 30px;
}
}
.dropdown-badge {

View File

@@ -10,6 +10,7 @@ import { FormDropdownDivider, FormListItem } from "../react/FormList";
import { useGetContextData, useIsNoteReadOnly, useNoteContext, useNoteLabel, useNoteLabelBoolean } from "../react/hooks";
import { useShareState } from "../ribbon/BasicPropertiesTab";
import { useShareInfo } from "../shared_info";
import { ActiveContentBadges } from "./ActiveContentBadges";
export default function NoteBadges() {
return (
@@ -19,6 +20,7 @@ export default function NoteBadges() {
<ShareBadge />
<ClippedNoteBadge />
<ExecuteBadge />
<ActiveContentBadges />
</div>
);
}

View File

@@ -70,7 +70,6 @@ export default function NoteActionsCustom(props: NoteActionsCustomProps) {
>
<AddChildButton {...innerProps} />
<RunActiveNoteButton {...innerProps } />
<OpenTriliumApiDocsButton {...innerProps} />
<SwitchSplitOrientationButton {...innerProps} />
<ToggleReadOnlyButton {...innerProps} />
<SaveToNoteButton {...innerProps} />
@@ -230,15 +229,6 @@ function SaveToNoteButton({ note, noteMime }: NoteActionsCustomInnerProps) {
/>;
}
function OpenTriliumApiDocsButton({ noteMime }: NoteActionsCustomInnerProps) {
const isEnabled = noteMime.startsWith("application/javascript;env=");
return isEnabled && <NoteAction
icon="bx bx-help-circle"
text={t("code_buttons.trilium_api_docs_button_title")}
onClick={() => openInAppHelpFromUrl(noteMime.endsWith("frontend") ? "Q2z6av6JZVWm" : "MEtfsqa5VwNi")}
/>;
}
function InAppHelpButton({ note }: NoteActionsCustomInnerProps) {
const helpUrl = getHelpUrlForNote(note);
const isEnabled = !!helpUrl;

View File

@@ -35,7 +35,7 @@
"@triliumnext/commons": "workspace:*",
"@triliumnext/server": "workspace:*",
"copy-webpack-plugin": "13.0.1",
"electron": "40.4.1",
"electron": "40.4.0",
"@electron-forge/cli": "7.11.1",
"@electron-forge/maker-deb": "7.11.1",
"@electron-forge/maker-dmg": "7.11.1",

View File

@@ -12,7 +12,7 @@
"@triliumnext/desktop": "workspace:*",
"@types/fs-extra": "11.0.4",
"copy-webpack-plugin": "13.0.1",
"electron": "40.4.1",
"electron": "40.4.0",
"fs-extra": "11.3.3"
},
"scripts": {

View File

@@ -83,7 +83,7 @@
"debounce": "3.0.0",
"debug": "4.4.3",
"ejs": "4.0.1",
"electron": "40.4.1",
"electron": "40.4.0",
"electron-debug": "4.1.0",
"electron-window-state": "5.0.3",
"escape-html": "1.0.3",
@@ -99,7 +99,7 @@
"html2plaintext": "2.1.4",
"http-proxy-agent": "7.0.2",
"https-proxy-agent": "7.0.6",
"i18next": "25.8.7",
"i18next": "25.8.6",
"i18next-fs-backend": "2.6.1",
"image-type": "6.0.0",
"ini": "6.0.0",
@@ -112,7 +112,7 @@
"multer": "2.0.2",
"normalize-strings": "1.1.1",
"ollama": "0.6.3",
"openai": "6.22.0",
"openai": "6.21.0",
"rand-token": "1.0.1",
"safe-compare": "1.1.4",
"sanitize-filename": "1.6.3",

View File

@@ -34,19 +34,6 @@
"duplicate-subtree": "Αντιγραφή υποδέντρου",
"tabs-and-windows": "Καρτέλες & Παράθυρα",
"open-new-tab": "Άνοιγμα νέας καρτέλας",
"close-active-tab": "Κλείσιμο ενεργής καρτέλας",
"reopen-last-tab": "Επαναφορά τελευταίας κλειστής καρτέλας",
"activate-next-tab": "Ενεργοποίηση καρτέλας στα δεξιά",
"activate-previous-tab": "Ενεργοποίηση καρτέλας στα αριστερά",
"open-new-window": "Άνοιγμα νέου κενού παραθύρου",
"toggle-tray": "Εμφάνιση/Απόκρυψη εφαρμογής από το system tray",
"first-tab": "Ενεργοποίηση πρώτης καρτέλας στη λίστα",
"second-tab": "Ενεργοποίηση της δεύτερης καρτέλας στη λίστα",
"third-tab": "Ενεργοποίηση της τρίτης καρτέλας στη λίστα",
"fourth-tab": "Ενεργοποίηση της τέταρτης καρτέλας στη λίστα",
"fifth-tab": "Ενεργοποίηση της πέμπτης καρτέλας στη λίστα",
"sixth-tab": "Ενεργοποίηση της έκτης καρτέλας στη λίστα",
"seventh-tab": "Ενεργοποίηση της έβδομης καρτέλας στη λίστα",
"eight-tab": "Ενεργοποίηση της όγδοης καρτέλας στη λίστα"
"close-active-tab": "Κλείσιμο ενεργής καρτέλας"
}
}

View File

@@ -1,11 +1,11 @@
import BUILTIN_ATTRIBUTES from "./builtin_attributes.js";
import { AnonymizedDbResponse, BUILTIN_ATTRIBUTES, DatabaseAnonymizeResponse } from "@triliumnext/commons";
import Database from "better-sqlite3";
import fs from "fs";
import path from "path";
import dataDir from "./data_dir.js";
import dateUtils from "./date_utils.js";
import Database from "better-sqlite3";
import sql from "./sql.js";
import path from "path";
import { AnonymizedDbResponse, DatabaseAnonymizeResponse } from "@triliumnext/commons";
function getFullAnonymizationScript() {
// we want to delete all non-builtin attributes because they can contain sensitive names and values
@@ -86,7 +86,7 @@ function getExistingAnonymizedDatabases() {
.readdirSync(dataDir.ANONYMIZED_DB_DIR)
.filter((fileName) => fileName.includes("anonymized"))
.map((fileName) => ({
fileName: fileName,
fileName,
filePath: path.resolve(dataDir.ANONYMIZED_DB_DIR, fileName)
})) satisfies AnonymizedDbResponse[];
}

View File

@@ -1,13 +1,11 @@
"use strict";
import { type AttributeRow, BUILTIN_ATTRIBUTES } from "@triliumnext/commons";
import searchService from "./search/services/search.js";
import sql from "./sql.js";
import becca from "../becca/becca.js";
import BAttribute from "../becca/entities/battribute.js";
import attributeFormatter from "./attribute_formatter.js";
import BUILTIN_ATTRIBUTES from "./builtin_attributes.js";
import type BNote from "../becca/entities/bnote.js";
import type { AttributeRow } from "@triliumnext/commons";
import attributeFormatter from "./attribute_formatter.js";
import searchService from "./search/services/search.js";
import sql from "./sql.js";
const ATTRIBUTE_TYPES = new Set(["label", "relation"]);
@@ -41,18 +39,18 @@ function getNoteWithLabel(name: string, value?: string): BNote | null {
function createLabel(noteId: string, name: string, value: string = "") {
return createAttribute({
noteId: noteId,
noteId,
type: "label",
name: name,
value: value
name,
value
});
}
function createRelation(noteId: string, name: string, targetNoteId: string) {
return createAttribute({
noteId: noteId,
noteId,
type: "relation",
name: name,
name,
value: targetNoteId
});
}

View File

@@ -9,7 +9,7 @@
"preview": "pnpm build && vite preview"
},
"dependencies": {
"i18next": "25.8.7",
"i18next": "25.8.6",
"i18next-http-backend": "3.0.2",
"preact": "10.28.3",
"preact-iso": "2.11.1",

4
docs/README-el.md vendored
View File

@@ -135,8 +135,8 @@ script)](./README-ZH_TW.md) | [English](../README.md) | [French](./README-fr.md)
εύκολη αποθήκευση περιεχομένου ιστού
* Προσαρμόσιμο UI (κουμπιά πλαϊνής γραμμής, γραφικά στοιχεία που ορίζονται από
το χρήστη,...)
* [Μετρικές](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics),
μαζί με ένα Grafana Dashboard.
* [Metrics](https://docs.triliumnotes.org/user-guide/advanced-usage/metrics),
along with a Grafana Dashboard.
✨ Ρίξτε μια ματιά στους ακόλουθους πόρους/κοινότητες τρίτων για περισσότερες
δυνατότητες που σχετίζονται με το TriliumNext:

View File

@@ -33,7 +33,7 @@
"eslint-config-ckeditor5": ">=9.1.0",
"http-server": "14.1.1",
"lint-staged": "16.2.7",
"stylelint": "17.3.0",
"stylelint": "17.2.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"ts-node": "10.9.2",
"typescript": "5.9.3",

View File

@@ -34,7 +34,7 @@
"eslint-config-ckeditor5": ">=9.1.0",
"http-server": "14.1.1",
"lint-staged": "16.2.7",
"stylelint": "17.3.0",
"stylelint": "17.2.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"ts-node": "10.9.2",
"typescript": "5.9.3",

View File

@@ -36,7 +36,7 @@
"eslint-config-ckeditor5": ">=9.1.0",
"http-server": "14.1.1",
"lint-staged": "16.2.7",
"stylelint": "17.3.0",
"stylelint": "17.2.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"ts-node": "10.9.2",
"typescript": "5.9.3",

View File

@@ -36,7 +36,7 @@
"eslint-config-ckeditor5": ">=9.1.0",
"http-server": "14.1.1",
"lint-staged": "16.2.7",
"stylelint": "17.3.0",
"stylelint": "17.2.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"ts-node": "10.9.2",
"typescript": "5.9.3",

View File

@@ -36,7 +36,7 @@
"eslint-config-ckeditor5": ">=9.1.0",
"http-server": "14.1.1",
"lint-staged": "16.2.7",
"stylelint": "17.3.0",
"stylelint": "17.2.0",
"stylelint-config-ckeditor5": ">=9.1.0",
"ts-node": "10.9.2",
"typescript": "5.9.3",

View File

@@ -13,3 +13,4 @@ export * from "./lib/attribute_names.js";
export * from "./lib/utils.js";
export * from "./lib/dayjs.js";
export * from "./lib/notes.js";
export { default as BUILTIN_ATTRIBUTES } from "./lib/builtin_attributes.js";

View File

@@ -22,6 +22,11 @@ type Labels = {
pageUrl: string;
dateNote: string;
// Scripting
run: string;
widget: boolean;
"disabled:widget": boolean;
// Tree specific
subtreeHidden: boolean;

277
pnpm-lock.yaml generated
View File

@@ -156,8 +156,8 @@ importers:
apps/build-docs:
devDependencies:
'@redocly/cli':
specifier: 2.18.1
version: 2.18.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)
specifier: 2.18.0
version: 2.18.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)
archiver:
specifier: 7.0.1
version: 7.0.1
@@ -171,11 +171,11 @@ importers:
specifier: 19.2.4
version: 19.2.4(react@19.2.4)
typedoc:
specifier: 0.28.17
version: 0.28.17(typescript@5.9.3)
specifier: 0.28.16
version: 0.28.16(typescript@5.9.3)
typedoc-plugin-missing-exports:
specifier: 4.1.2
version: 4.1.2(typedoc@0.28.17(typescript@5.9.3))
version: 4.1.2(typedoc@0.28.16(typescript@5.9.3))
apps/client:
dependencies:
@@ -213,8 +213,8 @@ importers:
specifier: 2.11.8
version: 2.11.8
'@preact/signals':
specifier: 2.8.0
version: 2.8.0(preact@10.28.3)
specifier: 2.7.1
version: 2.7.1(preact@10.28.3)
'@triliumnext/ckeditor5':
specifier: workspace:*
version: link:../../packages/ckeditor5
@@ -264,8 +264,8 @@ importers:
specifier: 17.3.0
version: 17.3.0
i18next:
specifier: 25.8.7
version: 25.8.7(typescript@5.9.3)
specifier: 25.8.6
version: 25.8.6(typescript@5.9.3)
i18next-http-backend:
specifier: 3.0.2
version: 3.0.2(encoding@0.1.13)
@@ -313,10 +313,10 @@ importers:
version: 10.28.3
react-i18next:
specifier: 16.5.4
version: 16.5.4(i18next@25.8.7(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
version: 16.5.4(i18next@25.8.6(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
react-window:
specifier: 2.2.7
version: 2.2.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
specifier: 2.2.6
version: 2.2.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4)
reveal.js:
specifier: 5.2.1
version: 5.2.1
@@ -392,7 +392,7 @@ importers:
dependencies:
'@electron/remote':
specifier: 2.1.3
version: 2.1.3(electron@40.4.1)
version: 2.1.3(electron@40.4.0)
better-sqlite3:
specifier: 12.6.2
version: 12.6.2
@@ -449,8 +449,8 @@ importers:
specifier: 13.0.1
version: 13.0.1(webpack@5.101.3(esbuild@0.27.3))
electron:
specifier: 40.4.1
version: 40.4.1
specifier: 40.4.0
version: 40.4.0
prebuild-install:
specifier: 7.1.3
version: 7.1.3
@@ -505,8 +505,8 @@ importers:
specifier: 13.0.1
version: 13.0.1(webpack@5.101.3(esbuild@0.27.3))
electron:
specifier: 40.4.1
version: 40.4.1
specifier: 40.4.0
version: 40.4.0
fs-extra:
specifier: 11.3.3
version: 11.3.3
@@ -543,7 +543,7 @@ importers:
version: 7.1.2
'@electron/remote':
specifier: 2.1.3
version: 2.1.3(electron@40.4.1)
version: 2.1.3(electron@40.4.0)
'@triliumnext/commons':
specifier: workspace:*
version: link:../../packages/commons
@@ -680,8 +680,8 @@ importers:
specifier: 4.0.1
version: 4.0.1
electron:
specifier: 40.4.1
version: 40.4.1
specifier: 40.4.0
version: 40.4.0
electron-debug:
specifier: 4.1.0
version: 4.1.0
@@ -728,8 +728,8 @@ importers:
specifier: 7.0.6
version: 7.0.6
i18next:
specifier: 25.8.7
version: 25.8.7(typescript@5.9.3)
specifier: 25.8.6
version: 25.8.6(typescript@5.9.3)
i18next-fs-backend:
specifier: 2.6.1
version: 2.6.1
@@ -767,8 +767,8 @@ importers:
specifier: 0.6.3
version: 0.6.3
openai:
specifier: 6.22.0
version: 6.22.0(ws@8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12)
specifier: 6.21.0
version: 6.21.0(ws@8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12)
rand-token:
specifier: 1.0.1
version: 1.0.1
@@ -849,8 +849,8 @@ importers:
apps/website:
dependencies:
i18next:
specifier: 25.8.7
version: 25.8.7(typescript@5.9.3)
specifier: 25.8.6
version: 25.8.6(typescript@5.9.3)
i18next-http-backend:
specifier: 3.0.2
version: 3.0.2(encoding@0.1.13)
@@ -865,7 +865,7 @@ importers:
version: 6.6.5(preact@10.28.3)
react-i18next:
specifier: 16.5.4
version: 16.5.4(i18next@25.8.7(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
version: 16.5.4(i18next@25.8.6(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)
devDependencies:
'@preact/preset-vite':
specifier: 2.10.3
@@ -962,11 +962,11 @@ importers:
specifier: 16.2.7
version: 16.2.7
stylelint:
specifier: 17.3.0
version: 17.3.0(typescript@5.9.3)
specifier: 17.2.0
version: 17.2.0(typescript@5.9.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
version: 13.0.0(stylelint@17.3.0(typescript@5.9.3))
version: 13.0.0(stylelint@17.2.0(typescript@5.9.3))
ts-node:
specifier: 10.9.2
version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.13)(typescript@5.9.3)
@@ -1022,11 +1022,11 @@ importers:
specifier: 16.2.7
version: 16.2.7
stylelint:
specifier: 17.3.0
version: 17.3.0(typescript@5.9.3)
specifier: 17.2.0
version: 17.2.0(typescript@5.9.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
version: 13.0.0(stylelint@17.3.0(typescript@5.9.3))
version: 13.0.0(stylelint@17.2.0(typescript@5.9.3))
ts-node:
specifier: 10.9.2
version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.13)(typescript@5.9.3)
@@ -1082,11 +1082,11 @@ importers:
specifier: 16.2.7
version: 16.2.7
stylelint:
specifier: 17.3.0
version: 17.3.0(typescript@5.9.3)
specifier: 17.2.0
version: 17.2.0(typescript@5.9.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
version: 13.0.0(stylelint@17.3.0(typescript@5.9.3))
version: 13.0.0(stylelint@17.2.0(typescript@5.9.3))
ts-node:
specifier: 10.9.2
version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.13)(typescript@5.9.3)
@@ -1149,11 +1149,11 @@ importers:
specifier: 16.2.7
version: 16.2.7
stylelint:
specifier: 17.3.0
version: 17.3.0(typescript@5.9.3)
specifier: 17.2.0
version: 17.2.0(typescript@5.9.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
version: 13.0.0(stylelint@17.3.0(typescript@5.9.3))
version: 13.0.0(stylelint@17.2.0(typescript@5.9.3))
ts-node:
specifier: 10.9.2
version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.13)(typescript@5.9.3)
@@ -1216,11 +1216,11 @@ importers:
specifier: 16.2.7
version: 16.2.7
stylelint:
specifier: 17.3.0
version: 17.3.0(typescript@5.9.3)
specifier: 17.2.0
version: 17.2.0(typescript@5.9.3)
stylelint-config-ckeditor5:
specifier: '>=9.1.0'
version: 13.0.0(stylelint@17.3.0(typescript@5.9.3))
version: 13.0.0(stylelint@17.2.0(typescript@5.9.3))
ts-node:
specifier: 10.9.2
version: 10.9.2(@swc/core@1.11.29(@swc/helpers@0.5.17))(@types/node@24.10.13)(typescript@5.9.3)
@@ -2210,8 +2210,8 @@ packages:
'@csstools/css-parser-algorithms': ^3.0.5
'@csstools/css-tokenizer': ^3.0.4
'@csstools/css-calc@3.1.1':
resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==}
'@csstools/css-calc@3.0.0':
resolution: {integrity: sha512-q4d82GTl8BIlh/dTnVsWmxnbWJeb3kiU8eUH71UxlxnS+WIaALmtzTL8gR15PkYOexMQYVk0CO4qIG93C1IvPA==}
engines: {node: '>=20.19.0'}
peerDependencies:
'@csstools/css-parser-algorithms': ^4.0.0
@@ -2236,6 +2236,10 @@ packages:
peerDependencies:
'@csstools/css-tokenizer': ^4.0.0
'@csstools/css-syntax-patches-for-csstree@1.0.25':
resolution: {integrity: sha512-g0Kw9W3vjx5BEBAF8c5Fm2NcB/Fs8jJXh85aXqwEXiL+tqtOut07TWgyaGzAAfTM+gKckrrncyeGEZPcaRgm2Q==}
engines: {node: '>=18'}
'@csstools/css-syntax-patches-for-csstree@1.0.27':
resolution: {integrity: sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==}
@@ -4428,8 +4432,8 @@ packages:
'@preact/signals-core@1.13.0':
resolution: {integrity: sha512-slT6XeTCAbdql61GVLlGU4x7XHI7kCZV5Um5uhE4zLX4ApgiiXc0UYFvVOKq06xcovzp7p+61l68oPi563ARKg==}
'@preact/signals@2.8.0':
resolution: {integrity: sha512-lcILM82mei8s/53n2M6uZlrDHLlgLld8Squ0PVSUL5Ae1M45uEstWfHm+wcDqp2U5I/ZYrBvCY65udFyTo5OZw==}
'@preact/signals@2.7.1':
resolution: {integrity: sha512-mP2+wMYHqDXVKFGzjqkL6CiHj3okB8eVTTJUZBrSVGozi/XfA+zZRCEALKKZYRoSoqLyT4J6qM4lhwT9155s1Q==}
peerDependencies:
preact: 10.28.3
@@ -4770,11 +4774,14 @@ packages:
'@radix-ui/rect@1.1.0':
resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
'@redocly/ajv@8.17.4':
resolution: {integrity: sha512-BieiCML/IgP6x99HZByJSt7fJE4ipgzO7KAFss92Bs+PEI35BhY7vGIysFXLT+YmS7nHtQjZjhOQyPPEf7xGHA==}
'@redocly/ajv@8.17.1':
resolution: {integrity: sha512-EDtsGZS964mf9zAUXAl9Ew16eYbeyAFWhsPr0fX6oaJxgd8rApYlPBf0joyhnUHz88WxrigyFtTaqqzXNzPgqw==}
'@redocly/cli@2.18.1':
resolution: {integrity: sha512-x3OBHb3T6GM+b48hKZkyTAwT58lWyJbBFfTQbX5WQXPJMB/+2x/KhrUlbAOiGPBtkTNnVBG5iskTv7l6bs6tig==}
'@redocly/ajv@8.17.2':
resolution: {integrity: sha512-rcbDZOfXAgGEJeJ30aWCVVJvxV9ooevb/m1/SFblO2qHs4cqTk178gx7T/vdslf57EA4lTofrwsq5K8rxK9g+g==}
'@redocly/cli@2.18.0':
resolution: {integrity: sha512-LZCfASCqlHThihfXbs5OLR/ggBs+8GeMDeP6vw39eX4uyCOtSeadRGXnVlEbMqNOmXM7YITApPrWKiAoZ18uag==}
engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'}
hasBin: true
@@ -4788,12 +4795,12 @@ packages:
resolution: {integrity: sha512-0EbE8LRbkogtcCXU7liAyC00n9uNG9hJ+eMyHFdUsy9lB/WGqnEBgwjA9q2cyzAVcdTkQqTBBU1XePNnN3OijA==}
engines: {node: '>=18.17.0', npm: '>=9.5.0'}
'@redocly/openapi-core@2.18.1':
resolution: {integrity: sha512-1fjuH85SpFyIFHcdQiGoT5uWsoErs+qJyK+2HqaqTANkNO3ONpDBS6B79Z/mYUH44+LxeTTVzbDPBEcI0ZJHhQ==}
'@redocly/openapi-core@2.18.0':
resolution: {integrity: sha512-I6SqmxPb/Q0Wf9eu3cbWxtTsHocgW/cL1+hEmS9C05aO1BQ+a+sd5BX96ffTxv8PRpwTeCdkuhmvmfczgvD3hA==}
engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'}
'@redocly/respect-core@2.18.1':
resolution: {integrity: sha512-o/XgvxuZZhZkugFxpICqdmgpz5oFzpmhO7v3hziHk1tc4CYtI1pG6PlTJuJv5ufGAlAMZOn93ymgl27A7x/GUA==}
'@redocly/respect-core@2.18.0':
resolution: {integrity: sha512-mLCXnGYjiW+fq9AB3UAMhpOPAMd/ww2L2h+lbDOtTVC9PfFnC7QZcBKN40MoEwoM0b/KKf5y8lsSzkctLIj4XQ==}
engines: {node: '>=22.12.0 || >=20.19.0 <21.0.0', npm: '>=10'}
'@replit/codemirror-indentation-markers@6.5.3':
@@ -8323,8 +8330,8 @@ packages:
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
engines: {node: '>=8.0.0'}
electron@40.4.1:
resolution: {integrity: sha512-N1ZXybQZL8kYemO8vAeh9nrk4mSvqlAO8xs0QCHkXIvRnuB/7VGwEehjvQbsU5/f4bmTKpG+2GQERe/zmKpudQ==}
electron@40.4.0:
resolution: {integrity: sha512-31l4V7Ys4oUuXyaN/cCNnyBdDXN9RwOVOG+JhiHCf4zx5tZkHd43PKGY6KLEWpeYCxaphsuGSEjagJLfPqKj8g==}
engines: {node: '>= 12.20.55'}
hasBin: true
@@ -9622,8 +9629,8 @@ packages:
i18next-http-backend@3.0.2:
resolution: {integrity: sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==}
i18next@25.8.7:
resolution: {integrity: sha512-ttxxc5+67S/0hhoeVdEgc1lRklZhdfcUSEPp1//uUG2NB88X3667gRsDar+ZWQFdysnOsnb32bcoMsa4mtzhkQ==}
i18next@25.8.6:
resolution: {integrity: sha512-HsS6p2yr/Vo5EPljWuBJ9OxKVFok2Q/Oa6PvFTpv2bMcDt2sQMOnKDQ7FTDDdME+3d1YULQjKj7aVSZP1bCouQ==}
peerDependencies:
typescript: ^5
peerDependenciesMeta:
@@ -11602,8 +11609,8 @@ packages:
resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
engines: {node: '>=12'}
openai@6.22.0:
resolution: {integrity: sha512-7Yvy17F33Bi9RutWbsaYt5hJEEJ/krRPOrwan+f9aCPuMat1WVsb2VNSII5W1EksKT6fF69TG/xj4XzodK3JZw==}
openai@6.21.0:
resolution: {integrity: sha512-26dQFi76dB8IiN/WKGQOV+yKKTTlRCxQjoi2WLt0kMcH8pvxVyvfdBDkld5GTl7W1qvBpwVOtFcsqktj3fBRpA==}
hasBin: true
peerDependencies:
ws: ^8.18.0
@@ -12765,8 +12772,8 @@ packages:
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-window@2.2.7:
resolution: {integrity: sha512-SH5nvfUQwGHYyriDUAOt7wfPsfG9Qxd6OdzQxl5oQ4dsSsUicqQvjV7dR+NqZ4coY0fUn3w1jnC5PwzIUWEg5w==}
react-window@2.2.6:
resolution: {integrity: sha512-v89O08xRdpCaEuf380B39D1C/0KgUDZA59xft6SVAjzjz/xQxSyXrgDWHymIsYI6TMrqE8WO+G0/PB9AGE8VNA==}
peerDependencies:
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
@@ -13779,10 +13786,6 @@ packages:
resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==}
engines: {node: '>=20'}
string-width@8.1.1:
resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==}
engines: {node: '>=20'}
string.prototype.matchall@4.0.12:
resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
engines: {node: '>= 0.4'}
@@ -13950,8 +13953,8 @@ packages:
engines: {node: '>=18.12.0'}
hasBin: true
stylelint@17.3.0:
resolution: {integrity: sha512-1POV91lcEMhj6SLVaOeA0KlS9yattS+qq+cyWqP/nYzWco7K5jznpGH1ExngvPlTM9QF1Kjd2bmuzJu9TH2OcA==}
stylelint@17.2.0:
resolution: {integrity: sha512-602jhMkRt6P1dSh9kEzbFIaOKY//h4D0E7u/w2WHKxmi5VAjjMqe6P8rQPJuCWdbB3apOkjOFN5kcg6qWPIZWQ==}
engines: {node: '>=20.19.0'}
hasBin: true
@@ -14381,8 +14384,8 @@ packages:
peerDependencies:
typedoc: ^0.28.1
typedoc@0.28.17:
resolution: {integrity: sha512-ZkJ2G7mZrbxrKxinTQMjFqsCoYY6a5Luwv2GKbTnBCEgV2ihYm5CflA9JnJAwH0pZWavqfYxmDkFHPt4yx2oDQ==}
typedoc@0.28.16:
resolution: {integrity: sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==}
engines: {node: '>= 18', pnpm: '>= 10'}
hasBin: true
peerDependencies:
@@ -16021,6 +16024,8 @@ snapshots:
'@ckeditor/ckeditor5-core': 47.4.0
'@ckeditor/ckeditor5-upload': 47.4.0
ckeditor5: 47.4.0
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-ai@47.4.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)':
dependencies:
@@ -16167,6 +16172,8 @@ snapshots:
'@ckeditor/ckeditor5-core': 47.4.0
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-code-block@47.4.0(patch_hash=2361d8caad7d6b5bddacc3a3b4aa37dbfba260b1c1b22a450413a79c1bb1ce95)':
dependencies:
@@ -16359,6 +16366,8 @@ snapshots:
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
es-toolkit: 1.39.5
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-editor-classic@47.4.0':
dependencies:
@@ -16368,6 +16377,8 @@ snapshots:
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
es-toolkit: 1.39.5
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-editor-decoupled@47.4.0':
dependencies:
@@ -16377,6 +16388,8 @@ snapshots:
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
es-toolkit: 1.39.5
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-editor-inline@47.4.0':
dependencies:
@@ -16568,6 +16581,8 @@ snapshots:
'@ckeditor/ckeditor5-utils': 47.4.0
'@ckeditor/ckeditor5-widget': 47.4.0
ckeditor5: 47.4.0
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-html-embed@47.4.0':
dependencies:
@@ -16897,6 +16912,8 @@ snapshots:
'@ckeditor/ckeditor5-ui': 47.4.0
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-restricted-editing@47.4.0':
dependencies:
@@ -16983,6 +17000,8 @@ snapshots:
'@ckeditor/ckeditor5-ui': 47.4.0
'@ckeditor/ckeditor5-utils': 47.4.0
ckeditor5: 47.4.0
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-special-characters@47.4.0':
dependencies:
@@ -17319,7 +17338,7 @@ snapshots:
'@csstools/css-tokenizer': 3.0.4
optional: true
'@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-calc@3.0.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
dependencies:
'@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
'@csstools/css-tokenizer': 4.0.0
@@ -17340,6 +17359,8 @@ snapshots:
dependencies:
'@csstools/css-tokenizer': 4.0.0
'@csstools/css-syntax-patches-for-csstree@1.0.25': {}
'@csstools/css-syntax-patches-for-csstree@1.0.27': {}
'@csstools/css-tokenizer@3.0.4': {}
@@ -17783,9 +17804,9 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@electron/remote@2.1.3(electron@40.4.1)':
'@electron/remote@2.1.3(electron@40.4.0)':
dependencies:
electron: 40.4.1
electron: 40.4.0
'@electron/universal@2.0.2':
dependencies:
@@ -19621,7 +19642,7 @@ snapshots:
'@preact/signals-core@1.13.0': {}
'@preact/signals@2.8.0(preact@10.28.3)':
'@preact/signals@2.7.1(preact@10.28.3)':
dependencies:
'@preact/signals-core': 1.13.0
preact: 10.28.3
@@ -19966,24 +19987,31 @@ snapshots:
'@radix-ui/rect@1.1.0': {}
'@redocly/ajv@8.17.4':
'@redocly/ajv@8.17.1':
dependencies:
fast-deep-equal: 3.1.3
fast-uri: 3.1.0
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
'@redocly/cli@2.18.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)':
'@redocly/ajv@8.17.2':
dependencies:
fast-deep-equal: 3.1.3
fast-uri: 3.1.0
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
'@redocly/cli@2.18.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)':
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/openapi-core': 2.18.1
'@redocly/respect-core': 2.18.1
'@redocly/openapi-core': 2.18.0
'@redocly/respect-core': 2.18.0
abort-controller: 3.0.0
ajv: '@redocly/ajv@8.17.4'
ajv-formats: 3.0.1(@redocly/ajv@8.17.4)
ajv: '@redocly/ajv@8.17.1'
ajv-formats: 3.0.1(@redocly/ajv@8.17.1)
colorette: 1.4.0
cookie: 0.7.2
dotenv: 16.4.7
@@ -20020,7 +20048,7 @@ snapshots:
'@redocly/openapi-core@1.34.5':
dependencies:
'@redocly/ajv': 8.17.4
'@redocly/ajv': 8.17.2
'@redocly/config': 0.22.2
colorette: 1.4.0
https-proxy-agent: 7.0.6
@@ -20032,12 +20060,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@redocly/openapi-core@2.18.1':
'@redocly/openapi-core@2.18.0':
dependencies:
'@redocly/ajv': 8.17.4
'@redocly/ajv': 8.17.2
'@redocly/config': 0.43.0
ajv: '@redocly/ajv@8.17.4'
ajv-formats: 3.0.1(@redocly/ajv@8.17.4)
ajv: '@redocly/ajv@8.17.2'
ajv-formats: 3.0.1(@redocly/ajv@8.17.2)
colorette: 1.4.0
js-levenshtein: 1.1.6
js-yaml: 4.1.1
@@ -20045,14 +20073,14 @@ snapshots:
pluralize: 8.0.0
yaml-ast-parser: 0.0.43
'@redocly/respect-core@2.18.1':
'@redocly/respect-core@2.18.0':
dependencies:
'@faker-js/faker': 7.6.0
'@noble/hashes': 1.8.0
'@redocly/ajv': 8.17.4
'@redocly/openapi-core': 2.18.1
ajv: '@redocly/ajv@8.17.4'
better-ajv-errors: 1.2.0(@redocly/ajv@8.17.4)
'@redocly/ajv': 8.17.1
'@redocly/openapi-core': 2.18.0
ajv: '@redocly/ajv@8.17.1'
better-ajv-errors: 1.2.0(@redocly/ajv@8.17.1)
colorette: 2.0.20
json-pointer: 0.6.2
jsonpath-rfc9535: 1.3.0
@@ -20774,7 +20802,7 @@ snapshots:
- supports-color
- typescript
'@stylistic/stylelint-plugin@3.1.3(stylelint@17.3.0(typescript@5.9.3))':
'@stylistic/stylelint-plugin@3.1.3(stylelint@17.2.0(typescript@5.9.3))':
dependencies:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-tokenizer': 3.0.4
@@ -20784,7 +20812,7 @@ snapshots:
postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0
style-search: 0.1.0
stylelint: 17.3.0(typescript@5.9.3)
stylelint: 17.2.0(typescript@5.9.3)
'@swc/core-darwin-arm64@1.11.29':
optional: true
@@ -22127,9 +22155,13 @@ snapshots:
optionalDependencies:
ajv: 8.17.1
ajv-formats@3.0.1(@redocly/ajv@8.17.4):
ajv-formats@3.0.1(@redocly/ajv@8.17.1):
optionalDependencies:
ajv: '@redocly/ajv@8.17.4'
ajv: '@redocly/ajv@8.17.1'
ajv-formats@3.0.1(@redocly/ajv@8.17.2):
optionalDependencies:
ajv: '@redocly/ajv@8.17.2'
ajv-formats@3.0.1(ajv@8.13.0):
optionalDependencies:
@@ -22494,11 +22526,11 @@ snapshots:
batch@0.6.1: {}
better-ajv-errors@1.2.0(@redocly/ajv@8.17.4):
better-ajv-errors@1.2.0(@redocly/ajv@8.17.1):
dependencies:
'@babel/code-frame': 7.27.1
'@humanwhocodes/momoa': 2.0.4
ajv: '@redocly/ajv@8.17.4'
ajv: '@redocly/ajv@8.17.1'
chalk: 4.1.2
jsonpointer: 5.0.1
leven: 3.1.0
@@ -24324,10 +24356,10 @@ snapshots:
- supports-color
optional: true
electron@40.4.1:
electron@40.4.0:
dependencies:
'@electron/get': 2.0.3
'@types/node': 24.10.13
'@types/node': 24.10.10
extract-zip: 2.0.1
transitivePeerDependencies:
- supports-color
@@ -26033,7 +26065,7 @@ snapshots:
domelementtype: 2.3.0
domhandler: 5.0.3
domutils: 3.2.2
entities: 6.0.1
entities: 6.0.0
htmlparser2@10.1.0:
dependencies:
@@ -26195,7 +26227,7 @@ snapshots:
transitivePeerDependencies:
- encoding
i18next@25.8.7(typescript@5.9.3):
i18next@25.8.6(typescript@5.9.3):
dependencies:
'@babel/runtime': 7.28.4
optionalDependencies:
@@ -28527,7 +28559,7 @@ snapshots:
is-docker: 2.2.1
is-wsl: 2.2.0
openai@6.22.0(ws@8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12):
openai@6.21.0(ws@8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(zod@4.1.12):
optionalDependencies:
ws: 8.19.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)
zod: 4.1.12
@@ -29638,11 +29670,11 @@ snapshots:
react: 19.2.4
scheduler: 0.27.0
react-i18next@16.5.4(i18next@25.8.7(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
react-i18next@16.5.4(i18next@25.8.6(typescript@5.9.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3):
dependencies:
'@babel/runtime': 7.28.4
html-parse-stringify: 3.0.1
i18next: 25.8.7(typescript@5.9.3)
i18next: 25.8.6(typescript@5.9.3)
react: 19.2.4
use-sync-external-store: 1.6.0(react@19.2.4)
optionalDependencies:
@@ -29714,7 +29746,7 @@ snapshots:
prop-types: 15.8.1
react: 19.2.4
react-window@2.2.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
react-window@2.2.6(react-dom@19.2.4(react@19.2.4))(react@19.2.4):
dependencies:
react: 19.2.4
react-dom: 19.2.4(react@19.2.4)
@@ -30993,11 +31025,6 @@ snapshots:
get-east-asian-width: 1.4.0
strip-ansi: 7.1.2
string-width@8.1.1:
dependencies:
get-east-asian-width: 1.4.0
strip-ansi: 7.1.2
string.prototype.matchall@4.0.12:
dependencies:
call-bind: 1.0.8
@@ -31148,34 +31175,34 @@ snapshots:
postcss: 8.5.6
postcss-selector-parser: 7.1.1
stylelint-config-ckeditor5@13.0.0(stylelint@17.3.0(typescript@5.9.3)):
stylelint-config-ckeditor5@13.0.0(stylelint@17.2.0(typescript@5.9.3)):
dependencies:
'@stylistic/stylelint-plugin': 3.1.3(stylelint@17.3.0(typescript@5.9.3))
stylelint: 17.3.0(typescript@5.9.3)
stylelint-config-recommended: 16.0.0(stylelint@17.3.0(typescript@5.9.3))
stylelint-plugin-ckeditor5-rules: 13.0.0(stylelint@17.3.0(typescript@5.9.3))
'@stylistic/stylelint-plugin': 3.1.3(stylelint@17.2.0(typescript@5.9.3))
stylelint: 17.2.0(typescript@5.9.3)
stylelint-config-recommended: 16.0.0(stylelint@17.2.0(typescript@5.9.3))
stylelint-plugin-ckeditor5-rules: 13.0.0(stylelint@17.2.0(typescript@5.9.3))
stylelint-config-ckeditor5@2.0.1(stylelint@16.26.1(typescript@5.0.4)):
dependencies:
stylelint: 16.26.1(typescript@5.0.4)
stylelint-config-recommended: 3.0.0(stylelint@16.26.1(typescript@5.0.4))
stylelint-config-recommended@16.0.0(stylelint@17.3.0(typescript@5.9.3)):
stylelint-config-recommended@16.0.0(stylelint@17.2.0(typescript@5.9.3)):
dependencies:
stylelint: 17.3.0(typescript@5.9.3)
stylelint: 17.2.0(typescript@5.9.3)
stylelint-config-recommended@3.0.0(stylelint@16.26.1(typescript@5.0.4)):
dependencies:
stylelint: 16.26.1(typescript@5.0.4)
stylelint-plugin-ckeditor5-rules@13.0.0(stylelint@17.3.0(typescript@5.9.3)):
stylelint-plugin-ckeditor5-rules@13.0.0(stylelint@17.2.0(typescript@5.9.3)):
dependencies:
stylelint: 17.3.0(typescript@5.9.3)
stylelint: 17.2.0(typescript@5.9.3)
stylelint@16.26.1(typescript@5.0.4):
dependencies:
'@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
'@csstools/css-syntax-patches-for-csstree': 1.0.27
'@csstools/css-syntax-patches-for-csstree': 1.0.25
'@csstools/css-tokenizer': 3.0.4
'@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
'@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1)
@@ -31217,9 +31244,9 @@ snapshots:
- supports-color
- typescript
stylelint@17.3.0(typescript@5.9.3):
stylelint@17.2.0(typescript@5.9.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-calc': 3.0.0(@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)
'@csstools/css-syntax-patches-for-csstree': 1.0.27
'@csstools/css-tokenizer': 4.0.0
@@ -31253,7 +31280,7 @@ snapshots:
postcss-safe-parser: 7.0.1(postcss@8.5.6)
postcss-selector-parser: 7.1.1
postcss-value-parser: 4.2.0
string-width: 8.1.1
string-width: 8.1.0
supports-hyperlinks: 4.4.0
svg-tags: 1.0.0
table: 6.9.0
@@ -31816,11 +31843,11 @@ snapshots:
typedarray@0.0.6: {}
typedoc-plugin-missing-exports@4.1.2(typedoc@0.28.17(typescript@5.9.3)):
typedoc-plugin-missing-exports@4.1.2(typedoc@0.28.16(typescript@5.9.3)):
dependencies:
typedoc: 0.28.17(typescript@5.9.3)
typedoc: 0.28.16(typescript@5.9.3)
typedoc@0.28.17(typescript@5.9.3):
typedoc@0.28.16(typescript@5.9.3):
dependencies:
'@gerrit0/mini-shiki': 3.17.0
lunr: 2.3.9