Compare commits

...

55 Commits

Author SHA1 Message Date
Elian Doran
b069fab82f chore(website): use static loading of translations 2025-10-27 17:17:37 +02:00
Elian Doran
d5ce01a65b Revert "fix(website): missing suspense"
This reverts commit dbfa94a9ee.
2025-10-27 16:45:52 +02:00
Elian Doran
dbfa94a9ee fix(website): missing suspense 2025-10-27 16:35:26 +02:00
Elian Doran
86aaa97809 fix(website): language-specific pages not properly determined 2025-10-27 16:30:03 +02:00
Elian Doran
c4c8fe23a9 fix(website): pages not prerendered 2025-10-27 16:29:44 +02:00
Elian Doran
f20078f3b0 fix(print): some images not loading 2025-10-27 16:17:51 +02:00
Elian Doran
b2f1b3c910 chore(deps): update dependency @types/turndown to v5.0.6 (#7521) 2025-10-27 08:13:12 +02:00
renovate[bot]
2197fae700 chore(deps): update dependency @types/turndown to v5.0.6 2025-10-27 01:55:23 +00:00
Elian Doran
d8e9cad23d feat(website): describe presentation collection 2025-10-26 19:24:43 +02:00
Elian Doran
6ed333d222 style(website): redesign list with screenshot 2025-10-26 19:11:11 +02:00
Elian Doran
d534db29c9 feat(note_icon): add an empty option (closes #7370) 2025-10-26 10:03:51 +02:00
Elian Doran
40edd42740 Translations update from Hosted Weblate (#7516) 2025-10-25 23:57:24 +03:00
Newcomer1989
d2c7011735 Translated using Weblate (German)
Currently translated at 20.5% (30 of 146 strings)

Translation: Trilium Notes/Website
Translate-URL: https://hosted.weblate.org/projects/trilium/website/de/
2025-10-25 20:54:49 +00:00
Manfred Manni
a050d1741b Translated using Weblate (German)
Currently translated at 22.8% (27 of 118 strings)

Translation: Trilium Notes/README
Translate-URL: https://hosted.weblate.org/projects/trilium/readme/de/
2025-10-25 20:54:48 +00:00
greenfork
18982865da Translated using Weblate (Russian)
Currently translated at 99.1% (1607 of 1621 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/ru/
2025-10-25 20:54:48 +00:00
Newcomer1989
3aa810fed7 Translated using Weblate (German)
Currently translated at 100.0% (1621 of 1621 strings)

Translation: Trilium Notes/Client
Translate-URL: https://hosted.weblate.org/projects/trilium/client/de/
2025-10-25 20:54:47 +00:00
Elian Doran
c5ecc22c67 chore(website): update macOS requirement 2025-10-25 23:54:37 +03:00
Elian Doran
252f8ccb1f Internationalization improvements for the website (#7515) 2025-10-25 23:46:43 +03:00
Elian Doran
e1bb704383 fix(website/i18n): language list fit on mobile 2025-10-25 23:33:54 +03:00
Elian Doran
dce0d9400b chore(website/i18n): bring back root-level pages 2025-10-25 23:11:02 +03:00
Elian Doran
615c783fe3 chore(website/i18n): add t to list of deps 2025-10-25 22:52:38 +03:00
Elian Doran
f29411baf7 fix(website/i18n): header link not indicating active 2025-10-25 22:49:22 +03:00
Elian Doran
be5e70130c feat(website/i18n): highlight current language 2025-10-25 22:39:04 +03:00
Elian Doran
9ba1e9d732 feat(website/i18n): swap locale when footer 2025-10-25 22:36:27 +03:00
Elian Doran
e1dc4d1433 chore(website/i18n): another missing translation 2025-10-25 22:18:07 +03:00
Elian Doran
d0d268496c Update apps/website/src/components/Header.tsx
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-10-25 22:16:50 +03:00
Elian Doran
8a6950c945 Merge branch 'main' into feature/website_i18n 2025-10-25 22:03:18 +03:00
Elian Doran
477592d176 fix(website/i18n): language detection not always working 2025-10-25 21:55:53 +03:00
Elian Doran
7e5c2ed79d chore(website): set up testing 2025-10-25 21:54:30 +03:00
Elian Doran
bc580f2a88 feat(website/i18n): language auto-detection 2025-10-25 21:39:02 +03:00
Elian Doran
71cd92e0b5 fix(website/i18n): header sometimes not correctly translated 2025-10-25 21:13:48 +03:00
Elian Doran
a4d92e12be chore(website/i18n): add more CJK fonts 2025-10-25 21:05:54 +03:00
Elian Doran
c40279b480 chore(website): missing a translation 2025-10-25 20:40:05 +03:00
Elian Doran
4c7e7c157c chore(website): solve a warning about sectioned h1 size 2025-10-25 20:31:08 +03:00
Elian Doran
c08386450a chore(website/i18n): different load mechanism for translations 2025-10-25 20:27:42 +03:00
Elian Doran
eb93762ecc chore(website/i18n): missing translations in header 2025-10-25 20:27:23 +03:00
Elian Doran
2697f9a25d fix(website/i18n): get started in download button not working 2025-10-25 20:00:09 +03:00
Elian Doran
9515e2099b feat(website/i18n): set right dir and lang tags 2025-10-25 19:58:31 +03:00
Elian Doran
966c08da87 fix(website/i18n): home page link not working 2025-10-25 19:53:36 +03:00
Elian Doran
ea04446e81 chore(website/i18n): handle Chinese 2025-10-25 19:17:26 +03:00
Elian Doran
e4f806ed14 feat(website/i18n): get translation to actually render 2025-10-25 19:13:28 +03:00
Elian Doran
49cf7ae1a3 feat(website/i18n): render pages by locale 2025-10-25 18:54:24 +03:00
Elian Doran
1a6f5a027f chore(website/i18n): add English too 2025-10-25 18:21:52 +03:00
Elian Doran
f4796f0f9e feat(website/i18n): footer navigation 2025-10-25 18:18:47 +03:00
Elian Doran
30480b2c23 chore(website/i18n): start generating routes 2025-10-25 17:25:58 +03:00
Elian Doran
b7b1d17817 chore(website): add list of locales 2025-10-25 16:41:10 +03:00
Elian Doran
c4e5494c14 chore(deps): update dependency @types/express to v5.0.4 (#7487) 2025-10-25 16:37:47 +03:00
Elian Doran
b0f63c02c9 chore(deps): update dependency vite to v7.1.12 (#7495) 2025-10-25 16:37:20 +03:00
Elian Doran
2480509811 chore(deps): update dependency electron to v38.4.0 (#7500) 2025-10-25 16:28:45 +03:00
Elian Doran
7872193ed0 chore(deps): update dependency node-abi to v4.15.0 (#7501) 2025-10-25 16:28:37 +03:00
Elian Doran
14e06c4555 chore(dev): add entry point for starting web site in dev mode 2025-10-25 09:34:53 +03:00
renovate[bot]
48e85fad43 chore(deps): update dependency node-abi to v4.15.0 2025-10-25 06:17:51 +00:00
renovate[bot]
189071deb8 chore(deps): update dependency electron to v38.4.0 2025-10-25 06:17:20 +00:00
renovate[bot]
b78893b106 chore(deps): update dependency vite to v7.1.12 2025-10-25 06:14:32 +00:00
renovate[bot]
1794f8546d chore(deps): update dependency @types/express to v5.0.4 2025-10-25 06:12:41 +00:00
64 changed files with 693 additions and 428 deletions

View File

@@ -37,7 +37,7 @@
"devDependencies": { "devDependencies": {
"@playwright/test": "1.56.1", "@playwright/test": "1.56.1",
"@stylistic/eslint-plugin": "5.5.0", "@stylistic/eslint-plugin": "5.5.0",
"@types/express": "5.0.3", "@types/express": "5.0.4",
"@types/node": "22.18.12", "@types/node": "22.18.12",
"@types/yargs": "17.0.34", "@types/yargs": "17.0.34",
"@vitest/coverage-v8": "3.2.4", "@vitest/coverage-v8": "3.2.4",

View File

@@ -56,7 +56,20 @@ function SingleNoteRenderer({ note, onReady }: RendererProps) {
await import("@triliumnext/ckeditor5/src/theme/ck-content.css"); await import("@triliumnext/ckeditor5/src/theme/ck-content.css");
} }
const { $renderedContent } = await content_renderer.getRenderedContent(note, { noChildrenList: true }); const { $renderedContent } = await content_renderer.getRenderedContent(note, { noChildrenList: true });
containerRef.current?.replaceChildren(...$renderedContent); const container = containerRef.current!;
container.replaceChildren(...$renderedContent);
// Wait for all images to load.
const images = Array.from(container.querySelectorAll("img"));
await Promise.all(
images.map(img => {
if (img.complete) return Promise.resolve();
return new Promise<void>(resolve => {
img.addEventListener("load", () => resolve(), { once: true });
img.addEventListener("error", () => resolve(), { once: true });
});
})
);
} }
load().then(() => requestAnimationFrame(onReady)) load().then(() => requestAnimationFrame(onReady))

View File

@@ -648,7 +648,8 @@
"logout": "Abmelden", "logout": "Abmelden",
"show-cheatsheet": "Cheatsheet anzeigen", "show-cheatsheet": "Cheatsheet anzeigen",
"toggle-zen-mode": "Zen Modus", "toggle-zen-mode": "Zen Modus",
"new-version-available": "Neues Update verfügbar" "new-version-available": "Neues Update verfügbar",
"download-update": "Version {{latestVersion}} herunterladen"
}, },
"sync_status": { "sync_status": {
"unknown": "<p>Der Synchronisations-Status wird bekannt, sobald der nächste Synchronisierungsversuch gestartet wird.</p><p>Klicke, um eine Synchronisierung jetzt auszulösen.</p>", "unknown": "<p>Der Synchronisations-Status wird bekannt, sobald der nächste Synchronisierungsversuch gestartet wird.</p><p>Klicke, um eine Synchronisierung jetzt auszulösen.</p>",
@@ -2082,6 +2083,7 @@
}, },
"presentation_view": { "presentation_view": {
"edit-slide": "Folie bearbeiten", "edit-slide": "Folie bearbeiten",
"start-presentation": "Präsentation starten" "start-presentation": "Präsentation starten",
"slide-overview": "Übersicht der Folien ein-/ausblenden"
} }
} }

View File

@@ -320,7 +320,8 @@
"explodeArchivesTooltip": "Если этот флажок установлен, Trilium будет читать файлы <code>.zip</code>, <code>.enex</code> и <code>.opml</code> и создавать заметки из файлов внутри этих архивов. Если флажок не установлен, Trilium будет прикреплять сами архивы к заметке.", "explodeArchivesTooltip": "Если этот флажок установлен, Trilium будет читать файлы <code>.zip</code>, <code>.enex</code> и <code>.opml</code> и создавать заметки из файлов внутри этих архивов. Если флажок не установлен, Trilium будет прикреплять сами архивы к заметке.",
"explodeArchives": "Прочитать содержимое архивов <code>.zip</code>, <code>.enex</code> и <code>.opml</code>.", "explodeArchives": "Прочитать содержимое архивов <code>.zip</code>, <code>.enex</code> и <code>.opml</code>.",
"shrinkImagesTooltip": "<p>Если этот параметр включен, Trilium попытается уменьшить размер импортируемых изображений путём масштабирования и оптимизации, что может повлиять на воспринимаемое качество изображения. Если этот параметр не установлен, изображения будут импортированы без изменений.</p><p>Это не относится к импорту файлов <code>.zip</code> с метаданными, поскольку предполагается, что эти файлы уже оптимизированы.</p>", "shrinkImagesTooltip": "<p>Если этот параметр включен, Trilium попытается уменьшить размер импортируемых изображений путём масштабирования и оптимизации, что может повлиять на воспринимаемое качество изображения. Если этот параметр не установлен, изображения будут импортированы без изменений.</p><p>Это не относится к импорту файлов <code>.zip</code> с метаданными, поскольку предполагается, что эти файлы уже оптимизированы.</p>",
"codeImportedAsCode": "Импортировать распознанные файлы кода (например, <code>.json</code>) в виде заметок типа \"код\", если это неясно из метаданных" "codeImportedAsCode": "Импортировать распознанные файлы кода (например, <code>.json</code>) в виде заметок типа \"код\", если это неясно из метаданных",
"importZipRecommendation": "При импорте ZIP файла иерархия заметок будет отражена в структуре папок внутри архива."
}, },
"markdown_import": { "markdown_import": {
"dialog_title": "Импорт Markdown", "dialog_title": "Импорт Markdown",
@@ -980,7 +981,8 @@
"open_sql_console_history": "Открыть историю консоли SQL", "open_sql_console_history": "Открыть историю консоли SQL",
"show_shared_notes_subtree": "Поддерево общедоступных заметок", "show_shared_notes_subtree": "Поддерево общедоступных заметок",
"switch_to_mobile_version": "Перейти на мобильную версию", "switch_to_mobile_version": "Перейти на мобильную версию",
"switch_to_desktop_version": "Переключиться на версию для ПК" "switch_to_desktop_version": "Переключиться на версию для ПК",
"new-version-available": "Доступно обновление"
}, },
"zpetne_odkazy": { "zpetne_odkazy": {
"backlink": "{{count}} ссылки", "backlink": "{{count}} ссылки",

View File

@@ -147,6 +147,12 @@ const categories: Category[] = [
]; ];
const icons: Icon[] = [ const icons: Icon[] = [
{
name: "empty",
slug: "empty",
category_id: 113,
type_of_icon: "REGULAR"
},
{ {
name: "child", name: "child",
slug: "child-regular", slug: "child-regular",

View File

@@ -56,4 +56,16 @@
.note-icon-widget .icon-list span:hover { .note-icon-widget .icon-list span:hover {
border: 1px solid var(--main-border-color); border: 1px solid var(--main-border-color);
}
.note-icon-widget .icon-list span.bx-empty {
width: unset;
}
.note-icon-widget .icon-list span.bx-empty::before {
display: inline-block;
content: "";
border: 1px dashed var(--muted-text-color);
width: 1em;
height: 1em;
} }

View File

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

View File

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

View File

@@ -61,7 +61,7 @@
"@types/supertest": "6.0.3", "@types/supertest": "6.0.3",
"@types/swagger-ui-express": "4.1.8", "@types/swagger-ui-express": "4.1.8",
"@types/tmp": "0.2.6", "@types/tmp": "0.2.6",
"@types/turndown": "5.0.5", "@types/turndown": "5.0.6",
"@types/ws": "8.18.1", "@types/ws": "8.18.1",
"@types/xml2js": "0.4.14", "@types/xml2js": "0.4.14",
"archiver": "7.0.1", "archiver": "7.0.1",
@@ -80,7 +80,7 @@
"debounce": "2.2.0", "debounce": "2.2.0",
"debug": "4.4.3", "debug": "4.4.3",
"ejs": "3.1.10", "ejs": "3.1.10",
"electron": "38.3.0", "electron": "38.4.0",
"electron-debug": "4.1.0", "electron-debug": "4.1.0",
"electron-window-state": "5.0.3", "electron-window-state": "5.0.3",
"escape-html": "1.0.3", "escape-html": "1.0.3",
@@ -126,7 +126,7 @@
"tmp": "0.2.5", "tmp": "0.2.5",
"turndown": "7.2.2", "turndown": "7.2.2",
"unescape": "1.0.1", "unescape": "1.0.1",
"vite": "7.1.11", "vite": "7.1.12",
"ws": "8.18.3", "ws": "8.18.3",
"xml2js": "0.6.2", "xml2js": "0.6.2",
"yauzl": "3.2.0" "yauzl": "3.2.0"

View File

@@ -5,6 +5,7 @@
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
"test": "vitest",
"preview": "pnpm build && vite preview" "preview": "pnpm build && vite preview"
}, },
"dependencies": { "dependencies": {
@@ -21,7 +22,7 @@
"eslint-config-preact": "2.0.0", "eslint-config-preact": "2.0.0",
"typescript": "5.9.3", "typescript": "5.9.3",
"user-agent-data-types": "0.4.2", "user-agent-data-types": "0.4.2",
"vite": "7.1.11" "vite": "7.1.12"
}, },
"eslintConfig": { "eslintConfig": {
"extends": "preact" "extends": "preact"

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -1,8 +0,0 @@
{
"get-started": {
"title": "Loslegen",
"desktop_title": "Die Desktop-App herunterladen (v{{version}})",
"architecture": "Architektur:",
"older_releases": "Ältere Releases anzeigen"
}
}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24"><!--Boxicons v3.0 https://boxicons.com | License https://docs.boxicons.com/free--><path d="M20 3H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h7v3H8v2h8v-2h-3v-3h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2M4 15V5h16v10z"/><path d="m10 13 5-3-5-3z"/></svg>

After

Width:  |  Height:  |  Size: 298 B

View File

@@ -1,7 +1,7 @@
import { ComponentChildren, HTMLAttributes } from "preact"; import { ComponentChildren, HTMLAttributes } from "preact";
import { Link } from "./Button.js"; import { Link } from "./Button.js";
import Icon from "./Icon.js"; import Icon from "./Icon.js";
import { t } from "../i18n.js"; import { useTranslation } from "react-i18next";
interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> { interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
title: ComponentChildren; title: ComponentChildren;
@@ -13,6 +13,8 @@ interface CardProps extends Omit<HTMLAttributes<HTMLDivElement>, "title"> {
} }
export default function Card({ title, children, imageUrl, iconSvg, className, moreInfoUrl, ...restProps }: CardProps) { export default function Card({ title, children, imageUrl, iconSvg, className, moreInfoUrl, ...restProps }: CardProps) {
const { t } = useTranslation();
return ( return (
<div className={`card ${className}`} {...restProps}> <div className={`card ${className}`} {...restProps}>
{imageUrl && <img class="image" src={imageUrl} loading="lazy" />} {imageUrl && <img class="image" src={imageUrl} loading="lazy" />}

View File

@@ -3,18 +3,21 @@ import "./DownloadButton.css";
import Button from "./Button.js"; import Button from "./Button.js";
import downloadIcon from "../assets/boxicons/bx-arrow-in-down-square-half.svg?raw"; import downloadIcon from "../assets/boxicons/bx-arrow-in-down-square-half.svg?raw";
import packageJson from "../../../../package.json" with { type: "json" }; import packageJson from "../../../../package.json" with { type: "json" };
import { useEffect, useState } from "preact/hooks"; import { useContext, useEffect, useState } from "preact/hooks";
import { t } from "../i18n.js"; import { useTranslation } from "react-i18next";
import { LocaleContext } from "../index.js";
interface DownloadButtonProps { interface DownloadButtonProps {
big?: boolean; big?: boolean;
} }
export default function DownloadButton({ big }: DownloadButtonProps) { export default function DownloadButton({ big }: DownloadButtonProps) {
const locale = useContext(LocaleContext);
const { t } = useTranslation();
const [ recommendedDownload, setRecommendedDownload ] = useState<RecommendedDownload | null>(); const [ recommendedDownload, setRecommendedDownload ] = useState<RecommendedDownload | null>();
useEffect(() => { useEffect(() => {
getRecommendedDownload()?.then(setRecommendedDownload); getRecommendedDownload(t)?.then(setRecommendedDownload);
}, []); }, [ t ]);
return (recommendedDownload && return (recommendedDownload &&
<> <>
@@ -35,7 +38,7 @@ export default function DownloadButton({ big }: DownloadButtonProps) {
) : ( ) : (
<Button <Button
className={`download-button desktop-only ${big ? "big" : ""}`} className={`download-button desktop-only ${big ? "big" : ""}`}
href="/get-started/" href={`/${locale}/get-started/`}
iconSvg={downloadIcon} iconSvg={downloadIcon}
text={<> text={<>
{t("download_now.text")} {t("download_now.text")}

View File

@@ -5,17 +5,26 @@ footer {
color: var(--muted-color); color: var(--muted-color);
font-size: 0.8em; font-size: 0.8em;
.content-wrapper { .row {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
flex-direction: column-reverse; flex-direction: column-reverse;
gap: 2em; gap: 2em;
margin-bottom: 1em;
@media (min-width: 720px) { @media (min-width: 720px) {
flex-direction: row; flex-direction: row;
} }
} }
nav.languages {
flex-grow: 1;
justify-content: center;
flex-wrap: wrap;
display: flex;
gap: 0.5em 1em;
}
} }
.social-buttons { .social-buttons {

View File

@@ -5,24 +5,46 @@ import githubDiscussionsIcon from "../assets/boxicons/bx-discussion.svg?raw";
import matrixIcon from "../assets/boxicons/bx-message-dots.svg?raw"; import matrixIcon from "../assets/boxicons/bx-message-dots.svg?raw";
import redditIcon from "../assets/boxicons/bx-reddit.svg?raw"; import redditIcon from "../assets/boxicons/bx-reddit.svg?raw";
import { Link } from "./Button.js"; import { Link } from "./Button.js";
import { t } from "../i18n"; import { LOCALES, swapLocaleInUrl } from "../i18n";
import { useTranslation } from "react-i18next";
import { useLocation } from "preact-iso";
import { useContext } from "preact/hooks";
import { LocaleContext } from "..";
export default function Footer() { export default function Footer() {
const { t } = useTranslation();
const { url } = useLocation();
const currentLocale = useContext(LocaleContext);
return ( return (
<footer> <footer>
<div class="content-wrapper"> <div class="content-wrapper">
<div class="footer-text"> <div class="row">
© 2024-2025 <Link href="https://github.com/eliandoran" openExternally>Elian Doran</Link>{t("footer.copyright_and_the")}<Link href="https://github.com/TriliumNext/Trilium/graphs/contributors" openExternally>{t("footer.copyright_community")}</Link>.<br /> <div class="footer-text">
© 2017-2024 <Link href="https://github.com/zadam" openExternally>zadam</Link>. © 2024-2025 <Link href="https://github.com/eliandoran" openExternally>Elian Doran</Link>{t("footer.copyright_and_the")}<Link href="https://github.com/TriliumNext/Trilium/graphs/contributors" openExternally>{t("footer.copyright_community")}</Link>.<br />
© 2017-2024 <Link href="https://github.com/zadam" openExternally>zadam</Link>.
</div>
<SocialButtons />
</div> </div>
<SocialButtons /> <div class="row">
<nav class="languages">
{LOCALES.map(locale => (
locale.id !== currentLocale
? <Link href={swapLocaleInUrl(url, locale.id)}>{locale.name}</Link>
: <span className="active">{locale.name}</span>
))}
</nav>
</div>
</div> </div>
</footer> </footer>
) )
} }
export function SocialButtons({ className, withText }: { className?: string, withText?: boolean }) { export function SocialButtons({ className, withText }: { className?: string, withText?: boolean }) {
const { t } = useTranslation();
return ( return (
<div className={`social-buttons ${className}`}> <div className={`social-buttons ${className}`}>
<SocialButton <SocialButton

View File

@@ -1,13 +1,16 @@
import "./Header.css"; import "./Header.css";
import { Link } from "./Button.js"; import { Link } from "./Button.js";
import { SocialButtons, SocialButton } from "./Footer.js"; import { SocialButtons, SocialButton } from "./Footer.js";
import { useEffect, useMemo, useState } from "preact/hooks"; import { useContext, useEffect, useMemo, useState } from "preact/hooks";
import { useLocation } from 'preact-iso'; import { useLocation } from 'preact-iso';
import DownloadButton from './DownloadButton.js'; import DownloadButton from './DownloadButton.js';
import githubIcon from "../assets/boxicons/bx-github.svg?raw"; import githubIcon from "../assets/boxicons/bx-github.svg?raw";
import Icon from "./Icon.js"; import Icon from "./Icon.js";
import logoPath from "../assets/icon-color.svg"; import logoPath from "../assets/icon-color.svg";
import menuIcon from "../assets/boxicons/bx-menu.svg?raw"; import menuIcon from "../assets/boxicons/bx-menu.svg?raw";
import { LocaleContext } from "..";
import { useTranslation } from "react-i18next";
import { swapLocaleInUrl } from "../i18n";
interface HeaderLink { interface HeaderLink {
url: string; url: string;
@@ -15,21 +18,26 @@ interface HeaderLink {
external?: boolean; external?: boolean;
} }
const HEADER_LINKS: HeaderLink[] = [
{ url: "/get-started/", text: "Get started" },
{ url: "https://docs.triliumnotes.org/", text: "Documentation", external: true },
{ url: "/support-us/", text: "Support us" }
]
export function Header(props: {repoStargazersCount: number}) { export function Header(props: {repoStargazersCount: number}) {
const { url } = useLocation(); const { url } = useLocation();
const { t } = useTranslation();
const locale = useContext(LocaleContext);
const [ mobileMenuShown, setMobileMenuShown ] = useState(false); const [ mobileMenuShown, setMobileMenuShown ] = useState(false);
const [ headerLinks, setHeaderLinks ] = useState<HeaderLink[]>([]);
useEffect(() => {
setHeaderLinks([
{ url: "/get-started", text: t("header.get-started") },
{ url: "https://docs.triliumnotes.org/", text: t("header.documentation"), external: true },
{ url: "/support-us", text: t("header.support-us") }
]);
}, [ locale, t ]);
return ( return (
<header> <header>
<div class="content-wrapper"> <div class="content-wrapper">
<div class="first-row"> <div class="first-row">
<a class="banner" href="/"> <a class="banner" href={`/${locale}/`}>
<img src={logoPath} width="300" height="300" alt="Trilium Notes logo" />&nbsp;<span>Trilium Notes</span> <img src={logoPath} width="300" height="300" alt="Trilium Notes logo" />&nbsp;<span>Trilium Notes</span>
</a> </a>
@@ -46,16 +54,17 @@ export function Header(props: {repoStargazersCount: number}) {
</div> </div>
<nav className={`${mobileMenuShown ? "mobile-shown" : ""}`}> <nav className={`${mobileMenuShown ? "mobile-shown" : ""}`}>
{HEADER_LINKS.map(link => ( {headerLinks.map(link => {
<Link const linkHref = link.external ? link.url : swapLocaleInUrl(link.url, locale);
href={link.url} return (<Link
className={url === link.url ? "active" : ""} href={linkHref}
className={url === linkHref ? "active" : ""}
openExternally={link.external} openExternally={link.external}
onClick={() => { onClick={() => {
setMobileMenuShown(false); setMobileMenuShown(false);
}} }}
>{link.text}</Link> >{link.text}</Link>)
))} })}
<SocialButtons className="mobile-only" withText /> <SocialButtons className="mobile-only" withText />
</nav> </nav>
@@ -74,4 +83,4 @@ export function Header(props: {repoStargazersCount: number}) {
</div> </div>
</header> </header>
); );
} }

View File

@@ -1,5 +1,5 @@
import { TFunction } from 'i18next';
import rootPackageJson from '../../../package.json' with { type: "json" }; import rootPackageJson from '../../../package.json' with { type: "json" };
import { t } from './i18n';
export type App = "desktop" | "server"; export type App = "desktop" | "server";
@@ -34,151 +34,155 @@ export interface RecommendedDownload {
type DownloadMatrix = Record<App, { [ P in Platform ]?: DownloadMatrixEntry }>; type DownloadMatrix = Record<App, { [ P in Platform ]?: DownloadMatrixEntry }>;
// Keep compatibility info inline with https://github.com/electron/electron/blob/main/README.md#platform-support. // Keep compatibility info inline with https://github.com/electron/electron/blob/main/README.md#platform-support.
export const downloadMatrix: DownloadMatrix = { export function getDownloadMatrix(t: TFunction<"translation", undefined>): DownloadMatrix {
desktop: { return {
windows: { desktop: {
title: { windows: {
x64: t("download_helper_desktop_windows.title_x64"), title: {
arm64: t("download_helper_desktop_windows.title_arm64") x64: t("download_helper_desktop_windows.title_x64"),
}, arm64: t("download_helper_desktop_windows.title_arm64")
description: {
x64: t("download_helper_desktop_windows.description_x64"),
arm64: t("download_helper_desktop_windows.description_arm64"),
},
quickStartTitle: t("download_helper_desktop_windows.quick_start"),
quickStartCode: "winget install TriliumNext.Notes",
downloads: {
exe: {
recommended: true,
name: t("download_helper_desktop_windows.download_exe")
}, },
zip: { description: {
name: t("download_helper_desktop_windows.download_zip") x64: t("download_helper_desktop_windows.description_x64"),
arm64: t("download_helper_desktop_windows.description_arm64"),
}, },
scoop: { quickStartTitle: t("download_helper_desktop_windows.quick_start"),
name: t("download_helper_desktop_windows.download_scoop"), quickStartCode: "winget install TriliumNext.Notes",
url: "https://scoop.sh/#/apps?q=trilium&id=7c08bc3c105b9ee5c00dd4245efdea0f091b8a5c" downloads: {
exe: {
recommended: true,
name: t("download_helper_desktop_windows.download_exe")
},
zip: {
name: t("download_helper_desktop_windows.download_zip")
},
scoop: {
name: t("download_helper_desktop_windows.download_scoop"),
url: "https://scoop.sh/#/apps?q=trilium&id=7c08bc3c105b9ee5c00dd4245efdea0f091b8a5c"
}
}
},
linux: {
title: {
x64: t("download_helper_desktop_linux.title_x64"),
arm64: t("download_helper_desktop_linux.title_arm64")
},
description: {
x64: t("download_helper_desktop_linux.description_x64"),
arm64: t("download_helper_desktop_linux.description_arm64"),
},
quickStartTitle: t("download_helper_desktop_linux.quick_start"),
downloads: {
deb: {
recommended: true,
name: t("download_helper_desktop_linux.download_deb")
},
rpm: {
recommended: true,
name: t("download_helper_desktop_linux.download_rpm")
},
flatpak: {
name: t("download_helper_desktop_linux.download_flatpak")
},
zip: {
name: t("download_helper_desktop_linux.download_zip")
},
nixpkgs: {
name: t("download_helper_desktop_linux.download_nixpkgs"),
url: "https://search.nixos.org/packages?query=trilium-next"
},
aur: {
name: t("download_helper_desktop_linux.download_aur"),
url: "https://aur.archlinux.org/packages/triliumnext-bin"
}
}
},
macos: {
title: {
x64: t("download_helper_desktop_macos.title_x64"),
arm64: t("download_helper_desktop_macos.title_arm64")
},
description: {
x64: t("download_helper_desktop_macos.description_x64"),
arm64: t("download_helper_desktop_macos.description_arm64"),
},
quickStartTitle: t("download_helper_desktop_macos.quick_start"),
quickStartCode: "brew install --cask trilium-notes",
downloads: {
dmg: {
recommended: true,
name: t("download_helper_desktop_macos.download_dmg")
},
homebrew: {
name: t("download_helper_desktop_macos.download_homebrew_cask"),
url: "https://formulae.brew.sh/cask/trilium-notes#default"
},
zip: {
name: t("download_helper_desktop_macos.download_zip")
}
} }
} }
}, },
linux: { server: {
title: { docker: {
x64: t("download_helper_desktop_linux.title_x64"), title: t("download_helper_server_docker.title"),
arm64: t("download_helper_desktop_linux.title_arm64") description: t("download_helper_server_docker.description"),
}, helpUrl: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.html",
description: { quickStartCode: "docker pull triliumnext/trilium\ndocker run -p 8080:8080 -d -v ./data:/home/node/trilium-data triliumnext/trilium",
x64: t("download_helper_desktop_linux.description_x64"), downloads: {
arm64: t("download_helper_desktop_linux.description_arm64"), dockerhub: {
}, name: t("download_helper_server_docker.download_dockerhub"),
quickStartTitle: t("download_helper_desktop_linux.quick_start"), url: "https://hub.docker.com/r/triliumnext/trilium"
downloads: { },
deb: { ghcr: {
recommended: true, name: t("download_helper_server_docker.download_ghcr"),
name: t("download_helper_desktop_linux.download_deb") url: "https://github.com/TriliumNext/Trilium/pkgs/container/trilium"
}, }
rpm: {
recommended: true,
name: t("download_helper_desktop_linux.download_rpm")
},
flatpak: {
name: t("download_helper_desktop_linux.download_flatpak")
},
zip: {
name: t("download_helper_desktop_linux.download_zip")
},
nixpkgs: {
name: t("download_helper_desktop_linux.download_nixpkgs"),
url: "https://search.nixos.org/packages?query=trilium-next"
},
aur: {
name: t("download_helper_desktop_linux.download_aur"),
url: "https://aur.archlinux.org/packages/triliumnext-bin"
} }
}
},
macos: {
title: {
x64: t("download_helper_desktop_macos.title_x64"),
arm64: t("download_helper_desktop_macos.title_arm64")
}, },
description: { linux: {
x64: t("download_helper_desktop_macos.description_x64"), title: t("download_helper_server_linux.title"),
arm64: t("download_helper_desktop_macos.description_arm64"), description: t("download_helper_server_linux.description"),
helpUrl: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/1.%20Installing%20the%20server/Packaged%20version%20for%20Linux.html",
downloads: {
tarX64: {
recommended: true,
name: t("download_helper_server_linux.download_tar_x64"),
url: `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-x64.tar.xz`,
},
tarArm64: {
recommended: true,
name: t("download_helper_server_linux.download_tar_arm64"),
url: `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-arm64.tar.xz`
},
nixos: {
name: t("download_helper_server_linux.download_nixos"),
url: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/On%20NixOS"
}
}
}, },
quickStartTitle: t("download_helper_desktop_macos.quick_start"), pikapod: {
quickStartCode: "brew install --cask trilium-notes", title: t("download_helper_server_hosted.title"),
downloads: { description: t("download_helper_server_hosted.description"),
dmg: { downloads: {
recommended: true, pikapod: {
name: t("download_helper_desktop_macos.download_dmg") recommended: true,
}, name: t("download_helper_server_hosted.download_pikapod"),
homebrew: { url: "https://www.pikapods.com/pods?run=trilium-next"
name: t("download_helper_desktop_macos.download_homebrew_cask"), },
url: "https://formulae.brew.sh/cask/trilium-notes#default" triliumcc: {
}, name: t("download_helper_server_hosted.download_triliumcc"),
zip: { url: "https://trilium.cc/"
name: t("download_helper_desktop_macos.download_zip") }
}
}
}
},
server: {
docker: {
title: t("download_helper_server_docker.title"),
description: t("download_helper_server_docker.description"),
helpUrl: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.html",
quickStartCode: "docker pull triliumnext/trilium\ndocker run -p 8080:8080 -d -v ./data:/home/node/trilium-data triliumnext/trilium",
downloads: {
dockerhub: {
name: t("download_helper_server_docker.download_dockerhub"),
url: "https://hub.docker.com/r/triliumnext/trilium"
},
ghcr: {
name: t("download_helper_server_docker.download_ghcr"),
url: "https://github.com/TriliumNext/Trilium/pkgs/container/trilium"
}
}
},
linux: {
title: t("download_helper_server_linux.title"),
description: t("download_helper_server_linux.description"),
helpUrl: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/1.%20Installing%20the%20server/Packaged%20version%20for%20Linux.html",
downloads: {
tarX64: {
recommended: true,
name: t("download_helper_server_linux.download_tar_x64"),
url: `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-x64.tar.xz`,
},
tarArm64: {
recommended: true,
name: t("download_helper_server_linux.download_tar_arm64"),
url: `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-Server-v${version}-linux-arm64.tar.xz`
},
nixos: {
name: t("download_helper_server_linux.download_nixos"),
url: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/On%20NixOS"
}
}
},
pikapod: {
title: t("download_helper_server_hosted.title"),
description: t("download_helper_server_hosted.description"),
downloads: {
pikapod: {
recommended: true,
name: t("download_helper_server_hosted.download_pikapod"),
url: "https://www.pikapods.com/pods?run=trilium-next"
},
triliumcc: {
name: t("download_helper_server_hosted.download_triliumcc"),
url: "https://trilium.cc/"
} }
} }
} }
} }
}; };
export function buildDownloadUrl(app: App, platform: Platform, format: string, architecture: Architecture): string { export function buildDownloadUrl(t: TFunction<"translation", undefined>, app: App, platform: Platform, format: string, architecture: Architecture): string {
const downloadMatrix = getDownloadMatrix(t);
if (app === "desktop") { if (app === "desktop") {
return downloadMatrix.desktop[platform]?.downloads[format].url ?? return downloadMatrix.desktop[platform]?.downloads[format].url ??
`https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-v${version}-${platform}-${architecture}.${format}`; `https://github.com/TriliumNext/Trilium/releases/download/v${version}/TriliumNotes-v${version}-${platform}-${architecture}.${format}`;
@@ -218,8 +222,9 @@ export function getPlatform(): Platform | null {
} }
} }
export async function getRecommendedDownload(): Promise<RecommendedDownload | null> { export async function getRecommendedDownload(t: TFunction<"translation", undefined>): Promise<RecommendedDownload | null> {
if (typeof window === "undefined") return null; if (typeof window === "undefined") return null;
const downloadMatrix = getDownloadMatrix(t);
const architecture = await getArchitecture(); const architecture = await getArchitecture();
const platform = getPlatform(); const platform = getPlatform();
@@ -233,7 +238,7 @@ export async function getRecommendedDownload(): Promise<RecommendedDownload | nu
if (!recommendedDownload) return null; if (!recommendedDownload) return null;
const format = recommendedDownload[0]; const format = recommendedDownload[0];
const url = buildDownloadUrl("desktop", platform, format || 'zip', architecture); const url = buildDownloadUrl(t, "desktop", platform, format || 'zip', architecture);
const platformTitle = platformInfo.title; const platformTitle = platformInfo.title;
const name = typeof platformTitle === "string" ? platformTitle : platformTitle[architecture] as string; const name = typeof platformTitle === "string" ? platformTitle : platformTitle[architecture] as string;

View File

@@ -0,0 +1,32 @@
import { describe, expect, it } from "vitest";
import { extractLocaleFromUrl, mapLocale, swapLocaleInUrl } from "./i18n";
describe("mapLocale", () => {
it("maps Chinese", () => {
expect(mapLocale("zh-TW")).toStrictEqual("zh-Hant");
expect(mapLocale("zh-CN")).toStrictEqual("zh-Hans");
});
it("maps languages without countries", () => {
expect(mapLocale("ro-RO")).toStrictEqual("ro");
expect(mapLocale("ro")).toStrictEqual("ro");
});
});
describe("swapLocale", () => {
it("swap locale in URL", () => {
expect(swapLocaleInUrl("/get-started", "ro")).toStrictEqual("/ro/get-started");
expect(swapLocaleInUrl("/ro/get-started", "ro")).toStrictEqual("/ro/get-started");
expect(swapLocaleInUrl("/en/get-started", "ro")).toStrictEqual("/ro/get-started");
expect(swapLocaleInUrl("/ro/", "en")).toStrictEqual("/en/");
expect(swapLocaleInUrl("/ro", "en")).toStrictEqual("/en");
});
});
describe("extractLocaleFromUrl", () => {
it("properly extracts locale", () => {
expect(extractLocaleFromUrl("/en/get-started")).toStrictEqual("en");
expect(extractLocaleFromUrl("/get-started")).toStrictEqual(undefined);
expect(extractLocaleFromUrl("/")).toStrictEqual(undefined);
});
});

View File

@@ -1,19 +1,85 @@
import { default as i18next } from "i18next"; import i18next from "i18next";
import HttpApi from 'i18next-http-backend';
import { initReactI18next } from "react-i18next"; import { initReactI18next } from "react-i18next";
i18next interface Locale {
.use(HttpApi) id: string;
.use(initReactI18next); name: string;
rtl?: boolean;
}
await i18next.init({ i18next.use(initReactI18next);
debug: true, const localeFiles = import.meta.glob("./translations/*/translation.json", { eager: true });
lng: "en", const resources: Record<string, Record<string, string>> = {};
fallbackLng: "en", for (const [ path, translations ] of Object.entries(localeFiles)) {
backend: { const id = path.split("/").at(-2);
loadPath: "/translations/{{lng}}/{{ns}}.json", if (!resources[id]) resources[id] = {};
}, if ("default" in (translations as any)) {
returnEmptyString: false resources[id].translation = (translations as any).default;
}); } else {
resources[id].translation = translations;
}
}
export const t = i18next.t; export function initTranslations(lng: string) {
i18next.init({
fallbackLng: "en",
lng,
returnEmptyString: false,
resources,
initAsync: false,
react: {
useSuspense: false
}
});
}
export const LOCALES: Locale[] = [
{ id: "en", name: "English" },
{ id: "ro", name: "Română" },
{ id: "zh-Hans", name: "简体中文" },
{ id: "zh-Hant", name: "繁體中文" },
{ id: "fr", name: "Français" },
{ id: "it", name: "Italiano" },
{ id: "ja", name: "日本語" },
{ id: "pl", name: "Polski" },
{ id: "es", name: "Español" },
{ id: "ar", name: "اَلْعَرَبِيَّةُ", rtl: true },
].toSorted((a, b) => a.name.localeCompare(b.name));
export function mapLocale(locale: string) {
if (!locale) return 'en';
const lower = locale.toLowerCase();
if (lower.startsWith('zh')) {
if (lower.includes('tw') || lower.includes('hk') || lower.includes('mo') || lower.includes('hant')) {
return 'zh-Hant';
}
return 'zh-Hans';
}
// Default for everything else
return locale.split('-')[0]; // e.g. "en-US" -> "en"
}
export function swapLocaleInUrl(url: string, newLocale: string) {
const components = url.split("/");
if (components.length === 2) {
const potentialLocale = components[1];
const correspondingLocale = LOCALES.find(l => l.id === potentialLocale);
if (correspondingLocale) {
return `/${newLocale}`;
} else {
return `/${newLocale}${url}`;
}
} else {
components[1] = newLocale;
return components.join("/");
}
}
export function extractLocaleFromUrl(url: string) {
const localeId = url.split('/')[1];
const correspondingLocale = LOCALES.find(l => l.id === localeId);
if (!correspondingLocale) return undefined;
return localeId;
}

View File

@@ -2,29 +2,69 @@ import './style.css';
import { FALLBACK_STARGAZERS_COUNT, getRepoStargazersCount } from './github-utils.js'; import { FALLBACK_STARGAZERS_COUNT, getRepoStargazersCount } from './github-utils.js';
import { Header } from './components/Header.jsx'; import { Header } from './components/Header.jsx';
import { Home } from './pages/Home/index.jsx'; import { Home } from './pages/Home/index.jsx';
import { LocationProvider, Router, Route, hydrate, prerender as ssr } from 'preact-iso'; import { LocationProvider, Router, Route, hydrate, prerender as ssr, useLocation } from 'preact-iso';
import { NotFound } from './pages/_404.jsx'; import { NotFound } from './pages/_404.jsx';
import Footer from './components/Footer.js'; import Footer from './components/Footer.js';
import GetStarted from './pages/GetStarted/get-started.js'; import GetStarted from './pages/GetStarted/get-started.js';
import SupportUs from './pages/SupportUs/SupportUs.js'; import SupportUs from './pages/SupportUs/SupportUs.js';
import { createContext } from 'preact';
import { useLayoutEffect, useRef, useState } from 'preact/hooks';
import { default as i18next, changeLanguage } from 'i18next';
import { extractLocaleFromUrl, initTranslations, LOCALES, mapLocale } from './i18n';
import HttpApi from 'i18next-http-backend';
import { initReactI18next } from "react-i18next";
export const LocaleContext = createContext('en');
export function App(props: {repoStargazersCount: number}) { export function App(props: {repoStargazersCount: number}) {
return ( return (
<LocationProvider> <LocationProvider>
<Header repoStargazersCount={props.repoStargazersCount} /> <LocaleProvider>
<main> <Header repoStargazersCount={props.repoStargazersCount} />
<Router> <main>
<Route path="/" component={Home} /> <Router>
<Route default component={NotFound} /> <Route path="/" component={Home} />
<Route path="/get-started" component={GetStarted} /> <Route path="/get-started" component={GetStarted} />
<Route path="/support-us" component={SupportUs} /> <Route path="/support-us" component={SupportUs} />
</Router>
</main> <Route path="/:locale:/" component={Home} />
<Footer /> <Route path="/:locale:/get-started" component={GetStarted} />
<Route path="/:locale:/support-us" component={SupportUs} />
<Route default component={NotFound} />
</Router>
</main>
<Footer />
</LocaleProvider>
</LocationProvider> </LocationProvider>
); );
} }
export function LocaleProvider({ children }) {
const { path } = useLocation();
const localeId = mapLocale(extractLocaleFromUrl(path) || navigator.language);
const loadedRef = useRef(false);
if (!loadedRef.current) {
initTranslations(localeId);
loadedRef.current = true;
} else {
changeLanguage(localeId);
}
useLayoutEffect(() => {
const correspondingLocale = LOCALES.find(l => l.id === localeId);
document.documentElement.lang = localeId;
document.documentElement.dir = correspondingLocale?.rtl ? "rtl" : "ltr";
}, [ localeId ]);
return (
<LocaleContext.Provider value={localeId}>
{children}
</LocaleContext.Provider>
);
}
if (typeof window !== 'undefined') { if (typeof window !== 'undefined') {
hydrate(<App repoStargazersCount={FALLBACK_STARGAZERS_COUNT} />, document.getElementById('app')!); hydrate(<App repoStargazersCount={FALLBACK_STARGAZERS_COUNT} />, document.getElementById('app')!);
} }

View File

@@ -1,18 +1,20 @@
import { useLayoutEffect, useState } from "preact/hooks"; import { useLayoutEffect, useState } from "preact/hooks";
import Card from "../../components/Card.js"; import Card from "../../components/Card.js";
import Section from "../../components/Section.js"; import Section from "../../components/Section.js";
import { App, Architecture, buildDownloadUrl, downloadMatrix, DownloadMatrixEntry, getArchitecture, getPlatform, Platform } from "../../download-helper.js"; import { App, Architecture, buildDownloadUrl, DownloadMatrixEntry, getArchitecture, getDownloadMatrix, getPlatform, Platform } from "../../download-helper.js";
import { usePageTitle } from "../../hooks.js"; import { usePageTitle } from "../../hooks.js";
import Button, { Link } from "../../components/Button.js"; import Button, { Link } from "../../components/Button.js";
import Icon from "../../components/Icon.js"; import Icon from "../../components/Icon.js";
import helpIcon from "../../assets/boxicons/bx-help-circle.svg?raw"; import helpIcon from "../../assets/boxicons/bx-help-circle.svg?raw";
import "./get-started.css"; import "./get-started.css";
import packageJson from "../../../../../package.json" with { type: "json" }; import packageJson from "../../../../../package.json" with { type: "json" };
import { t } from "../../i18n.js"; import { useTranslation } from "react-i18next";
export default function DownloadPage() { export default function DownloadPage() {
const { t } = useTranslation();
const [ currentArch, setCurrentArch ] = useState<Architecture>("x64"); const [ currentArch, setCurrentArch ] = useState<Architecture>("x64");
const [ userPlatform, setUserPlatform ] = useState<Platform>(); const [ userPlatform, setUserPlatform ] = useState<Platform>();
const downloadMatrix = getDownloadMatrix(t);
useLayoutEffect(() => { useLayoutEffect(() => {
getArchitecture().then((arch) => setCurrentArch(arch ?? "x64")); getArchitecture().then((arch) => setCurrentArch(arch ?? "x64"));
@@ -71,6 +73,7 @@ export function DownloadCard({ app, arch, entry: [ platform, entry ], isRecommen
return (typeof text === "string" ? text : text[arch]); return (typeof text === "string" ? text : text[arch]);
} }
const { t } = useTranslation();
const allDownloads = Object.entries(entry.downloads); const allDownloads = Object.entries(entry.downloads);
const recommendedDownloads = allDownloads.filter(download => download[1].recommended); const recommendedDownloads = allDownloads.filter(download => download[1].recommended);
const restDownloads = allDownloads.filter(download => !download[1].recommended); const restDownloads = allDownloads.filter(download => !download[1].recommended);
@@ -107,7 +110,7 @@ export function DownloadCard({ app, arch, entry: [ platform, entry ], isRecommen
{recommendedDownloads.map(recommendedDownload => ( {recommendedDownloads.map(recommendedDownload => (
<Button <Button
className="recommended" className="recommended"
href={buildDownloadUrl(app, platform as Platform, recommendedDownload[0], arch)} href={buildDownloadUrl(t, app, platform as Platform, recommendedDownload[0], arch)}
text={recommendedDownload[1].name} text={recommendedDownload[1].name}
openExternally={!!recommendedDownload[1].url} openExternally={!!recommendedDownload[1].url}
/> />
@@ -117,7 +120,7 @@ export function DownloadCard({ app, arch, entry: [ platform, entry ], isRecommen
<div class="other-options"> <div class="other-options">
{restDownloads.map(download => ( {restDownloads.map(download => (
<Link <Link
href={buildDownloadUrl(app, platform as Platform, download[0], arch)} href={buildDownloadUrl(t, app, platform as Platform, download[0], arch)}
openExternally={!!download[1].url} openExternally={!!download[1].url}
> >
{download[1].name} {download[1].name}

View File

@@ -57,6 +57,8 @@ section.hero-section {
color: transparent; color: transparent;
line-height: 1.1; line-height: 1.1;
font-weight: 400; font-weight: 400;
font-size: 2em;
margin-block: 0.65em;
} }
} }
@@ -181,72 +183,43 @@ section.faq {
display: flex; display: flex;
} }
h3 {
color: var(--brand-1);
}
ul { ul {
list-style-type: none; list-style-type: none;
margin: 0; margin: 0;
padding: 0; padding: 0;
gap: 1em;
display: grid;
@media (min-width: 720px) {
grid-template-columns: 1fr 1fr 1fr;
}
li { li {
margin-bottom: 1em; margin: 0;
&:last-of-type {
margin-bottom: 0;
}
.card { .card {
border: 1px solid transparent; border: 1px solid transparent;
} height: 100%;
}
&.selected .card {
border: 1px solid var(--brand-1);
}
} }
} }
.details { .details {
flex-basis: 50%; max-height: 35vh;
flex-shrink: 0; overflow: hidden;
display: flex;
flex-direction: column;
@media (max-width: 719px) { @media (max-width: 719px) {
margin-top: 1em; margin-top: 1em;
} }
} }
&.horizontal { img {
flex-direction: column-reverse; object-fit: contain;
ul {
gap: 1em;
display: grid;
@media (min-width: 720px) {
grid-template-columns: 1fr 1fr 1fr;
}
}
li {
margin: 0;
}
.card {
height: 100%;
}
h3 {
color: var(--brand-1);
}
.details {
max-height: 35vh;
overflow: hidden;
display: flex;
flex-direction: column;
img {
height: 100%;
width: auto;
object-fit: contain;
}
}
} }
} }

View File

@@ -29,10 +29,10 @@ import calendarIcon from "../../assets/boxicons/bx-calendar.svg?raw";
import tableIcon from "../../assets/boxicons/bx-table.svg?raw"; import tableIcon from "../../assets/boxicons/bx-table.svg?raw";
import boardIcon from "../../assets/boxicons/bx-columns-3.svg?raw"; import boardIcon from "../../assets/boxicons/bx-columns-3.svg?raw";
import geomapIcon from "../../assets/boxicons/bx-map.svg?raw"; import geomapIcon from "../../assets/boxicons/bx-map.svg?raw";
import presentationIcon from "../../assets/boxicons/bx-slideshow.svg?raw";
import { getPlatform } from '../../download-helper.js'; import { getPlatform } from '../../download-helper.js';
import { useEffect, useState } from 'preact/hooks'; import { useEffect, useState } from 'preact/hooks';
import { t } from '../../i18n.js'; import { Trans, useTranslation } from 'react-i18next';
import { Trans } from 'react-i18next';
export function Home() { export function Home() {
usePageTitle(""); usePageTitle("");
@@ -52,6 +52,7 @@ export function Home() {
} }
function HeroSection() { function HeroSection() {
const { t } = useTranslation();
const platform = getPlatform(); const platform = getPlatform();
const colorScheme = useColorScheme(); const colorScheme = useColorScheme();
const [ screenshotUrl, setScreenshotUrl ] = useState<string>(); const [ screenshotUrl, setScreenshotUrl ] = useState<string>();
@@ -96,6 +97,7 @@ function HeroSection() {
} }
function OrganizationBenefitsSection() { function OrganizationBenefitsSection() {
const { t } = useTranslation();
return ( return (
<> <>
<Section className="benefits" title={t("organization_benefits.title")}> <Section className="benefits" title={t("organization_benefits.title")}>
@@ -110,6 +112,7 @@ function OrganizationBenefitsSection() {
} }
function ProductivityBenefitsSection() { function ProductivityBenefitsSection() {
const { t } = useTranslation();
return ( return (
<> <>
<Section className="benefits accented" title={t("productivity_benefits.title")}> <Section className="benefits accented" title={t("productivity_benefits.title")}>
@@ -127,9 +130,10 @@ function ProductivityBenefitsSection() {
} }
function NoteTypesSection() { function NoteTypesSection() {
const { t } = useTranslation();
return ( return (
<Section className="note-types" title="Multiple ways to represent your information"> <Section className="note-types" title={t("note_types.title")}>
<ListWithScreenshot horizontal items={[ <ListWithScreenshot items={[
{ {
title: t("note_types.text_title"), title: t("note_types.text_title"),
imageUrl: "/type_text.webp", imageUrl: "/type_text.webp",
@@ -190,6 +194,7 @@ function NoteTypesSection() {
} }
function ExtensibilityBenefitsSection() { function ExtensibilityBenefitsSection() {
const { t } = useTranslation();
return ( return (
<> <>
<Section className="benefits accented" title={t("extensibility_benefits.title")}> <Section className="benefits accented" title={t("extensibility_benefits.title")}>
@@ -205,8 +210,9 @@ function ExtensibilityBenefitsSection() {
} }
function CollectionsSection() { function CollectionsSection() {
const { t } = useTranslation();
return ( return (
<Section className="collections" title="Collections"> <Section className="collections" title={t("collections.title")}>
<ListWithScreenshot items={[ <ListWithScreenshot items={[
{ {
title: t("collections.calendar_title"), title: t("collections.calendar_title"),
@@ -235,49 +241,45 @@ function CollectionsSection() {
imageUrl: "/collection_geomap.webp", imageUrl: "/collection_geomap.webp",
moreInfo: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Note%20Types/Collections/Geo%20Map%20View.html", moreInfo: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Note%20Types/Collections/Geo%20Map%20View.html",
description: t("collections.geomap_description") description: t("collections.geomap_description")
},
{
title: t("collections.presentation_title"),
iconSvg: presentationIcon,
imageUrl: "/collection_presentation.webp",
moreInfo: "https://docs.triliumnotes.org/User%20Guide/User%20Guide/Note%20Types/Collections/Presentation%20View.html",
description: t("collections.presentation_description")
} }
]} /> ]} />
</Section> </Section>
); );
} }
function ListWithScreenshot({ items, horizontal, cardExtra }: { function ListWithScreenshot({ items, cardExtra }: {
items: { title: string, imageUrl: string, description: string, moreInfo: string, iconSvg?: string }[]; items: { title: string, imageUrl: string, description: string, moreInfo: string, iconSvg?: string }[];
horizontal?: boolean;
cardExtra?: ComponentChildren; cardExtra?: ComponentChildren;
}) { }) {
const [ selectedItem, setSelectedItem ] = useState(items[0]);
return ( return (
<div className={`list-with-screenshot ${horizontal ? "horizontal" : ""}`}> <div className={`list-with-screenshot`}>
<ul> <ul>
{items.map(item => ( {items.map(item => (
<li className={`${item === selectedItem ? "selected" : ""}`}> <li>
<Card <Card
title={item.title} title={item.title}
onMouseEnter={() => setSelectedItem(item)}
onClick={() => setSelectedItem(item)}
moreInfoUrl={item.moreInfo} moreInfoUrl={item.moreInfo}
iconSvg={item.iconSvg} iconSvg={item.iconSvg}
imageUrl={item.imageUrl}
> >
{item.description} {item.description}
</Card> </Card>
</li> </li>
))} ))}
</ul> </ul>
<div className="details">
{selectedItem && (
<>
<img src={selectedItem.imageUrl} alt={t("components.list_with_screenshot_alt")} loading="lazy" />
</>
)}
</div>
</div> </div>
) )
} }
function FaqSection() { function FaqSection() {
const { t } = useTranslation();
return ( return (
<Section className="faq" title={t("faq.title")}> <Section className="faq" title={t("faq.title")}>
<div class="grid-2-cols"> <div class="grid-2-cols">
@@ -301,6 +303,7 @@ function FaqItem({ question, children }: { question: string; children: Component
} }
function FinalCta() { function FinalCta() {
const { t } = useTranslation();
return ( return (
<Section className="final-cta accented" title={t("final_cta.title")}> <Section className="final-cta accented" title={t("final_cta.title")}>
<p>{t("final_cta.description")}</p> <p>{t("final_cta.description")}</p>

View File

@@ -6,10 +6,10 @@ import buyMeACoffeeIcon from "../../assets/boxicons/bx-buy-me-a-coffee.svg?raw";
import Button, { Link } from "../../components/Button.js"; import Button, { Link } from "../../components/Button.js";
import Card from "../../components/Card.js"; import Card from "../../components/Card.js";
import { usePageTitle } from "../../hooks.js"; import { usePageTitle } from "../../hooks.js";
import { t } from "../../i18n.js"; import { Trans, useTranslation } from "react-i18next";
import { Trans } from "react-i18next";
export default function Donate() { export default function Donate() {
const { t } = useTranslation();
usePageTitle(t("support_us.title")); usePageTitle(t("support_us.title"));
return ( return (

View File

@@ -1,9 +1,10 @@
import { useTranslation } from "react-i18next";
import Section from "../components/Section.js"; import Section from "../components/Section.js";
import { usePageTitle } from "../hooks.js"; import { usePageTitle } from "../hooks.js";
import { t } from "../i18n.js";
import "./_404.css"; import "./_404.css";
export function NotFound() { export function NotFound() {
const { t } = useTranslation();
usePageTitle(t("404.title")); usePageTitle(t("404.title"));
return ( return (

View File

@@ -31,7 +31,13 @@ html,
body { body {
margin: 0; margin: 0;
line-height: 1.5; line-height: 1.5;
font-family: Inter, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial; font-family: Inter,
system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial,
"Noto Sans", "Noto Sans CJK SC",
"Hiragino Sans", "Hiragino Kaku Gothic ProN",
"Microsoft YaHei", "Meiryo", "Malgun Gothic",
"PingFang SC", "Source Han Sans SC",
"Source Han Sans JP", "Source Han Sans KR";
min-height: 100vh; min-height: 100vh;
} }

View File

@@ -0,0 +1,46 @@
{
"get-started": {
"title": "Loslegen",
"desktop_title": "Die Desktop-App herunterladen (v{{version}})",
"architecture": "Architektur:",
"older_releases": "Ältere Releases anzeigen",
"server_title": "Richte einen Server für den Zugriff auf mehreren Geräten ein"
},
"hero_section": {
"github": "GitHub",
"get_started": "Loslegen",
"dockerhub": "Docker Hub",
"title": "Organisieren Sie Ihre Gedanken. Bauen Sie Ihre persönliche Wissensdatenbank auf.",
"subtitle": "Trilium ist eine Open-Source-Lösung zum Erstellen von Notizen und Organisieren einer persönlichen Wissensdatenbank. Sie kann lokal auf dem Desktop verwendet oder mit einem selbst gehosteten Server synchronisieren werden, um erstellte Notizen überall verfügbar zu haben.",
"screenshot_alt": "Screenshot der Desktop-Anwendung Trilium Notes"
},
"organization_benefits": {
"title": "Organisation",
"note_structure_title": "Notizstruktur",
"attributes_title": "Notiz Labels und Beziehungen"
},
"productivity_benefits": {
"revisions_title": "Notizrevisionen",
"title": "Produktivität und Sicherheit",
"sync_title": "Synchronisation",
"protected_notes_title": "Geschützte Notizen",
"jump_to_title": "Schnellsuche und Kommandos",
"search_title": "Leistungsstarke Suche",
"web_clipper_title": "Web clipper"
},
"note_types": {
"text_title": "Text Notizen",
"code_title": "Code Notizen",
"canvas_title": "Canvas",
"mermaid_title": "Mermaid Diagramm",
"mindmap_title": "Mind Map"
},
"extensibility_benefits": {
"import_export_title": "Import/Export",
"scripting_title": "Erweitertes Scripting",
"api_title": "REST API"
},
"collections": {
"calendar_title": "Kalender"
}
}

View File

@@ -39,6 +39,7 @@
"web_clipper_content": "Grab web pages (or screenshots) and place them directly into Trilium using the web clipper browser extension." "web_clipper_content": "Grab web pages (or screenshots) and place them directly into Trilium using the web clipper browser extension."
}, },
"note_types": { "note_types": {
"title": "Multiple ways to represent your information",
"text_title": "Text notes", "text_title": "Text notes",
"text_description": "The notes are edited using a visual (WYSIWYG) editor, with support for tables, images, math expressions, code blocks with syntax highlighting. Quickly format the text using Markdown-like syntax or using slash commands.", "text_description": "The notes are edited using a visual (WYSIWYG) editor, with support for tables, images, math expressions, code blocks with syntax highlighting. Quickly format the text using Markdown-like syntax or using slash commands.",
"code_title": "Code notes", "code_title": "Code notes",
@@ -65,6 +66,7 @@
"api_description": "Interact with Trilium programatically using its builtin REST API." "api_description": "Interact with Trilium programatically using its builtin REST API."
}, },
"collections": { "collections": {
"title": "Collections",
"calendar_title": "Calendar", "calendar_title": "Calendar",
"calendar_description": "Organize your personal or professional events using a calendar, with support for all-day and multi-day events. See your events at a glance with the week, month and year views. Easy interaction to add or drag events.", "calendar_description": "Organize your personal or professional events using a calendar, with support for all-day and multi-day events. See your events at a glance with the week, month and year views. Easy interaction to add or drag events.",
"table_title": "Table", "table_title": "Table",
@@ -72,7 +74,9 @@
"board_title": "Board", "board_title": "Board",
"board_description": "Organize your tasks or project status into a Kanban board with an easy way to create new items and columns and simply changing their status by dragging across the board.", "board_description": "Organize your tasks or project status into a Kanban board with an easy way to create new items and columns and simply changing their status by dragging across the board.",
"geomap_title": "Geomap", "geomap_title": "Geomap",
"geomap_description": "Plan your vacations or mark your points of interest directly on a geographical map using customizable markers. Display recorded GPX tracks to track itineraries." "geomap_description": "Plan your vacations or mark your points of interest directly on a geographical map using customizable markers. Display recorded GPX tracks to track itineraries.",
"presentation_title": "Presentation",
"presentation_description": "Organize information into slides and present them in full-screen with smooth transitions. The slides can also be exported to PDF for easy sharing."
}, },
"faq": { "faq": {
"title": "Frequently Asked Questions", "title": "Frequently Asked Questions",
@@ -95,8 +99,7 @@
"get_started": "Get started" "get_started": "Get started"
}, },
"components": { "components": {
"link_learn_more": "Learn more...", "link_learn_more": "Learn more..."
"list_with_screenshot_alt": "Screenshot of the feature being selected"
}, },
"download_now": { "download_now": {
"text": "Download now ", "text": "Download now ",
@@ -106,6 +109,11 @@
"linux_small": "for Linux", "linux_small": "for Linux",
"more_platforms": "More platforms & server setup" "more_platforms": "More platforms & server setup"
}, },
"header": {
"get-started": "Get started",
"documentation": "Documentation",
"support-us": "Support us"
},
"footer": { "footer": {
"copyright_and_the": " and the ", "copyright_and_the": " and the ",
"copyright_community": "community" "copyright_community": "community"
@@ -163,7 +171,7 @@
"download_helper_desktop_macos": { "download_helper_desktop_macos": {
"title_x64": "macOS for Intel", "title_x64": "macOS for Intel",
"title_arm64": "macOS for Apple Silicon", "title_arm64": "macOS for Apple Silicon",
"description_x64": "For Intel-based Macs running macOS Big Sur or later.", "description_x64": "For Intel-based Macs running macOS Monterey or later.",
"description_arm64": "For Apple Silicon Macs such as those with M1 and M2 chips.", "description_arm64": "For Apple Silicon Macs such as those with M1 and M2 chips.",
"quick_start": "To install via Homebrew:", "quick_start": "To install via Homebrew:",
"download_dmg": "Download Installer (.dmg)", "download_dmg": "Download Installer (.dmg)",

View File

@@ -163,7 +163,7 @@
"download_helper_desktop_macos": { "download_helper_desktop_macos": {
"title_x64": "macOS para Intel", "title_x64": "macOS para Intel",
"title_arm64": "macOS para Apple Silicon", "title_arm64": "macOS para Apple Silicon",
"description_x64": "Para Macs con procesador Intel que ejecuten macOS Big Sur o posterior.", "description_x64": "Para Macs con procesador Intel que ejecuten macOS Monterey o posterior.",
"description_arm64": "Para Macs con Apple Silicon, como los que tienen chips M1 y M2.", "description_arm64": "Para Macs con Apple Silicon, como los que tienen chips M1 y M2.",
"quick_start": "Para instalar mediante Homebrew:", "quick_start": "Para instalar mediante Homebrew:",
"download_dmg": "Descargar instalador (.dmg)", "download_dmg": "Descargar instalador (.dmg)",

View File

@@ -124,7 +124,7 @@
"download_helper_desktop_macos": { "download_helper_desktop_macos": {
"title_x64": "macOS pour Intel", "title_x64": "macOS pour Intel",
"title_arm64": "macOS pour Apple Silicon", "title_arm64": "macOS pour Apple Silicon",
"description_x64": "Pour les Mac basés sur Intel exécutant macOS Big Sur ou une version ultérieure.", "description_x64": "Pour les Mac basés sur Intel exécutant macOS Monterey ou une version ultérieure.",
"description_arm64": "Pour les Mac Apple Silicon tels que ceux équipés de puces M1 et M2.", "description_arm64": "Pour les Mac Apple Silicon tels que ceux équipés de puces M1 et M2.",
"quick_start": "Pour installer via Homebrew :", "quick_start": "Pour installer via Homebrew :",
"download_dmg": "Télécharger le programme d'installation (.dmg)", "download_dmg": "Télécharger le programme d'installation (.dmg)",

View File

@@ -163,7 +163,7 @@
"download_helper_desktop_macos": { "download_helper_desktop_macos": {
"title_x64": "macOS per Intel", "title_x64": "macOS per Intel",
"title_arm64": "macOS per Apple Silicon", "title_arm64": "macOS per Apple Silicon",
"description_x64": "Per Mac basati su Intel con macOS Big Sur o versioni successive.", "description_x64": "Per Mac basati su Intel con macOS Monterey o versioni successive.",
"description_arm64": "Per i Mac Apple Silicon, come quelli con chip M1 e M2.", "description_arm64": "Per i Mac Apple Silicon, come quelli con chip M1 e M2.",
"quick_start": "Per installare tramite Homebrew:", "quick_start": "Per installare tramite Homebrew:",
"download_dmg": "Scarica il programma di installazione (.dmg)", "download_dmg": "Scarica il programma di installazione (.dmg)",

View File

@@ -163,7 +163,7 @@
"download_helper_desktop_macos": { "download_helper_desktop_macos": {
"title_x64": "Intel 向け macOS", "title_x64": "Intel 向け macOS",
"title_arm64": "Apple Silicon 向け macOS", "title_arm64": "Apple Silicon 向け macOS",
"description_x64": "macOS Big Sur 以降を実行している Intel ベースの Mac 向け。", "description_x64": "macOS Monterey 以降を実行している Intel ベースの Mac 向け。",
"description_arm64": "M1 および M2 チップを搭載した Apple Silicon Mac 向け。", "description_arm64": "M1 および M2 チップを搭載した Apple Silicon Mac 向け。",
"quick_start": "Homebrew 経由でインストールするには:", "quick_start": "Homebrew 経由でインストールするには:",
"download_dmg": "インストーラーをダウンロード (.dmg)", "download_dmg": "インストーラーをダウンロード (.dmg)",

View File

@@ -106,6 +106,11 @@
"linux_small": "pentru Linux", "linux_small": "pentru Linux",
"more_platforms": "Mai multe platforme și instalarea server-ului" "more_platforms": "Mai multe platforme și instalarea server-ului"
}, },
"header": {
"get-started": "Primii pași",
"documentation": "Documentație",
"support-us": "Sprijină-ne"
},
"footer": { "footer": {
"copyright_and_the": " și ", "copyright_and_the": " și ",
"copyright_community": "comunitatea" "copyright_community": "comunitatea"
@@ -157,7 +162,7 @@
"download_helper_desktop_macos": { "download_helper_desktop_macos": {
"title_x64": "macOS pentru Intel", "title_x64": "macOS pentru Intel",
"title_arm64": "macOS pentru Apple Silicon", "title_arm64": "macOS pentru Apple Silicon",
"description_x64": "Pentru Mac-uri bazate pe Intel ce rulează macOS Big Sur sau mai nou.", "description_x64": "Pentru Mac-uri bazate pe Intel ce rulează macOS Monterey sau mai nou.",
"description_arm64": "Pentru Mac-uri bazate pe Apple Silicon, precum cele cu chip-uri M1, M2.", "description_arm64": "Pentru Mac-uri bazate pe Apple Silicon, precum cele cu chip-uri M1, M2.",
"quick_start": "Instalați prin Homebrew:", "quick_start": "Instalați prin Homebrew:",
"download_dmg": "Descarcă instalatorul (.dmg)", "download_dmg": "Descarcă instalatorul (.dmg)",

View File

@@ -163,7 +163,7 @@
"download_helper_desktop_macos": { "download_helper_desktop_macos": {
"title_x64": "macOS 適用於 Intel", "title_x64": "macOS 適用於 Intel",
"title_arm64": "macOS 適用於 Apple Silicon", "title_arm64": "macOS 適用於 Apple Silicon",
"description_x64": "適用於搭載 Intel 處理器的 Mac並運行 macOS Big Sur 或更新版本。", "description_x64": "適用於搭載 Intel 處理器的 Mac並運行 macOS Monterey 或更新版本。",
"description_arm64": "適用於搭載 Apple Silicon 的 Mac例如配備 M1 和 M2 晶片的機型。", "description_arm64": "適用於搭載 Apple Silicon 的 Mac例如配備 M1 和 M2 晶片的機型。",
"quick_start": "透過 Homebrew 安裝:", "quick_start": "透過 Homebrew 安裝:",
"download_dmg": "下載安裝程式 (.dmg)", "download_dmg": "下載安裝程式 (.dmg)",

View File

@@ -14,4 +14,7 @@ export default defineConfig({
}, },
}), }),
], ],
test: {
environment: "happy-dom"
}
}); });

2
docs/README-de.md vendored
View File

@@ -58,7 +58,7 @@ Unsere Dokumentation ist verfügbar in mehreren Formaten:
- [Erste Schritte](https://docs.triliumnotes.org/) - [Erste Schritte](https://docs.triliumnotes.org/)
- [Installationsanleitung](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md) - [Installationsanleitung](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md)
- [Docker - [Docker
Setup](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md) Einrichten](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md)
- [TriliumNext - [TriliumNext
aktualisieren](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md) aktualisieren](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md)
- [Grundkonzepte und - [Grundkonzepte und

View File

@@ -17,6 +17,7 @@
"desktop:start": "pnpm run --filter desktop dev", "desktop:start": "pnpm run --filter desktop dev",
"desktop:build": "pnpm run --filter desktop build", "desktop:build": "pnpm run --filter desktop build",
"desktop:start-prod": "pnpm run --filter desktop start-prod", "desktop:start-prod": "pnpm run --filter desktop start-prod",
"website:start": "pnpm run --filter website dev",
"website:build": "pnpm run --filter website build", "website:build": "pnpm run --filter website build",
"electron:build": "pnpm desktop:build", "electron:build": "pnpm desktop:build",
"electron:start": "pnpm desktop:start", "electron:start": "pnpm desktop:start",
@@ -40,7 +41,7 @@
"@fast-csv/parse": "5.0.5", "@fast-csv/parse": "5.0.5",
"@playwright/test": "1.56.1", "@playwright/test": "1.56.1",
"@triliumnext/server": "workspace:*", "@triliumnext/server": "workspace:*",
"@types/express": "5.0.3", "@types/express": "5.0.4",
"@types/node": "22.18.12", "@types/node": "22.18.12",
"@vitest/coverage-v8": "3.2.4", "@vitest/coverage-v8": "3.2.4",
"@vitest/ui": "3.2.4", "@vitest/ui": "3.2.4",
@@ -62,7 +63,7 @@
"typescript": "~5.9.0", "typescript": "~5.9.0",
"typescript-eslint": "8.46.2", "typescript-eslint": "8.46.2",
"upath": "2.0.1", "upath": "2.0.1",
"vite": "7.1.11", "vite": "7.1.12",
"vite-plugin-dts": "~4.5.0", "vite-plugin-dts": "~4.5.0",
"vitest": "3.2.4" "vitest": "3.2.4"
}, },
@@ -103,7 +104,7 @@
"on-headers@<1.1.0": ">=1.1.0", "on-headers@<1.1.0": ">=1.1.0",
"form-data@>=4.0.0 <4.0.4": ">=4.0.4", "form-data@>=4.0.0 <4.0.4": ">=4.0.4",
"form-data@>=3.0.0 <3.0.4": ">=3.0.4", "form-data@>=3.0.0 <3.0.4": ">=3.0.4",
"node-abi": "4.14.0" "node-abi": "4.15.0"
}, },
"ignoredBuiltDependencies": [ "ignoredBuiltDependencies": [
"sqlite3" "sqlite3"

259
pnpm-lock.yaml generated
View File

@@ -20,7 +20,7 @@ overrides:
on-headers@<1.1.0: '>=1.1.0' on-headers@<1.1.0: '>=1.1.0'
form-data@>=4.0.0 <4.0.4: '>=4.0.4' form-data@>=4.0.0 <4.0.4: '>=4.0.4'
form-data@>=3.0.0 <3.0.4: '>=3.0.4' form-data@>=3.0.0 <3.0.4: '>=3.0.4'
node-abi: 4.14.0 node-abi: 4.15.0
patchedDependencies: patchedDependencies:
'@ckeditor/ckeditor5-code-block': '@ckeditor/ckeditor5-code-block':
@@ -50,8 +50,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:apps/server version: link:apps/server
'@types/express': '@types/express':
specifier: 5.0.3 specifier: 5.0.4
version: 5.0.3 version: 5.0.4
'@types/node': '@types/node':
specifier: 22.18.12 specifier: 22.18.12
version: 22.18.12 version: 22.18.12
@@ -99,7 +99,7 @@ importers:
version: 0.18.0 version: 0.18.0
rollup-plugin-webpack-stats: rollup-plugin-webpack-stats:
specifier: 2.1.6 specifier: 2.1.6
version: 2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
tslib: tslib:
specifier: 2.8.1 specifier: 2.8.1
version: 2.8.1 version: 2.8.1
@@ -116,11 +116,11 @@ importers:
specifier: 2.0.1 specifier: 2.0.1
version: 2.0.1 version: 2.0.1
vite: vite:
specifier: 7.1.11 specifier: 7.1.12
version: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
vite-plugin-dts: vite-plugin-dts:
specifier: ~4.5.0 specifier: ~4.5.0
version: 4.5.4(@types/node@22.18.12)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 4.5.4(@types/node@22.18.12)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
vitest: vitest:
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
@@ -280,7 +280,7 @@ importers:
version: 5.0.0 version: 5.0.0
'@preact/preset-vite': '@preact/preset-vite':
specifier: 2.10.2 specifier: 2.10.2
version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
'@types/bootstrap': '@types/bootstrap':
specifier: 5.2.10 specifier: 5.2.10
version: 5.2.10 version: 5.2.10
@@ -313,7 +313,7 @@ importers:
version: 0.7.2 version: 0.7.2
vite-plugin-static-copy: vite-plugin-static-copy:
specifier: 3.1.4 specifier: 3.1.4
version: 3.1.4(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 3.1.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
apps/db-compare: apps/db-compare:
dependencies: dependencies:
@@ -334,7 +334,7 @@ importers:
dependencies: dependencies:
'@electron/remote': '@electron/remote':
specifier: 2.1.3 specifier: 2.1.3
version: 2.1.3(electron@38.3.0) version: 2.1.3(electron@38.4.0)
better-sqlite3: better-sqlite3:
specifier: 12.4.1 specifier: 12.4.1
version: 12.4.1 version: 12.4.1
@@ -391,8 +391,8 @@ importers:
specifier: 13.0.1 specifier: 13.0.1
version: 13.0.1(webpack@5.101.3(esbuild@0.25.11)) version: 13.0.1(webpack@5.101.3(esbuild@0.25.11))
electron: electron:
specifier: 38.3.0 specifier: 38.4.0
version: 38.3.0 version: 38.4.0
prebuild-install: prebuild-install:
specifier: 7.1.3 specifier: 7.1.3
version: 7.1.3 version: 7.1.3
@@ -447,8 +447,8 @@ importers:
specifier: 13.0.1 specifier: 13.0.1
version: 13.0.1(webpack@5.101.3(esbuild@0.25.11)) version: 13.0.1(webpack@5.101.3(esbuild@0.25.11))
electron: electron:
specifier: 38.3.0 specifier: 38.4.0
version: 38.3.0 version: 38.4.0
fs-extra: fs-extra:
specifier: 11.3.2 specifier: 11.3.2
version: 11.3.2 version: 11.3.2
@@ -470,10 +470,10 @@ importers:
version: 7.1.1 version: 7.1.1
'@electron/remote': '@electron/remote':
specifier: 2.1.3 specifier: 2.1.3
version: 2.1.3(electron@38.3.0) version: 2.1.3(electron@38.4.0)
'@preact/preset-vite': '@preact/preset-vite':
specifier: 2.10.2 specifier: 2.10.2
version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
'@triliumnext/commons': '@triliumnext/commons':
specifier: workspace:* specifier: workspace:*
version: link:../../packages/commons version: link:../../packages/commons
@@ -497,7 +497,7 @@ importers:
version: 1.8.1 version: 1.8.1
'@types/cookie-parser': '@types/cookie-parser':
specifier: 1.4.10 specifier: 1.4.10
version: 1.4.10(@types/express@5.0.3) version: 1.4.10(@types/express@5.0.4)
'@types/debounce': '@types/debounce':
specifier: 1.2.4 specifier: 1.2.4
version: 1.2.4 version: 1.2.4
@@ -559,8 +559,8 @@ importers:
specifier: 0.2.6 specifier: 0.2.6
version: 0.2.6 version: 0.2.6
'@types/turndown': '@types/turndown':
specifier: 5.0.5 specifier: 5.0.6
version: 5.0.5 version: 5.0.6
'@types/ws': '@types/ws':
specifier: 8.18.1 specifier: 8.18.1
version: 8.18.1 version: 8.18.1
@@ -616,8 +616,8 @@ importers:
specifier: 3.1.10 specifier: 3.1.10
version: 3.1.10 version: 3.1.10
electron: electron:
specifier: 38.3.0 specifier: 38.4.0
version: 38.3.0 version: 38.4.0
electron-debug: electron-debug:
specifier: 4.1.0 specifier: 4.1.0
version: 4.1.0 version: 4.1.0
@@ -754,8 +754,8 @@ importers:
specifier: 1.0.1 specifier: 1.0.1
version: 1.0.1 version: 1.0.1
vite: vite:
specifier: 7.1.11 specifier: 7.1.12
version: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
ws: ws:
specifier: 8.18.3 specifier: 8.18.3
version: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) version: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)
@@ -795,7 +795,7 @@ importers:
devDependencies: devDependencies:
'@preact/preset-vite': '@preact/preset-vite':
specifier: 2.10.2 specifier: 2.10.2
version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
eslint: eslint:
specifier: 9.38.0 specifier: 9.38.0
version: 9.38.0(jiti@2.6.1) version: 9.38.0(jiti@2.6.1)
@@ -809,8 +809,8 @@ importers:
specifier: 0.4.2 specifier: 0.4.2
version: 0.4.2 version: 0.4.2
vite: vite:
specifier: 7.1.11 specifier: 7.1.12
version: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
packages/ckeditor5: packages/ckeditor5:
dependencies: dependencies:
@@ -862,7 +862,7 @@ importers:
version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
'@vitest/browser': '@vitest/browser':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(vitest@3.2.4) version: 3.2.4(vitest@3.2.4)
@@ -895,7 +895,7 @@ importers:
version: 5.9.3 version: 5.9.3
vite-plugin-svgo: vite-plugin-svgo:
specifier: ~2.0.0 specifier: ~2.0.0
version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
vitest: vitest:
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
@@ -922,7 +922,7 @@ importers:
version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
'@vitest/browser': '@vitest/browser':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(vitest@3.2.4) version: 3.2.4(vitest@3.2.4)
@@ -955,7 +955,7 @@ importers:
version: 5.9.3 version: 5.9.3
vite-plugin-svgo: vite-plugin-svgo:
specifier: ~2.0.0 specifier: ~2.0.0
version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
vitest: vitest:
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
@@ -982,7 +982,7 @@ importers:
version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
'@vitest/browser': '@vitest/browser':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(vitest@3.2.4) version: 3.2.4(vitest@3.2.4)
@@ -1015,7 +1015,7 @@ importers:
version: 5.9.3 version: 5.9.3
vite-plugin-svgo: vite-plugin-svgo:
specifier: ~2.0.0 specifier: ~2.0.0
version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
vitest: vitest:
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
@@ -1049,7 +1049,7 @@ importers:
version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
'@vitest/browser': '@vitest/browser':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(vitest@3.2.4) version: 3.2.4(vitest@3.2.4)
@@ -1082,7 +1082,7 @@ importers:
version: 5.9.3 version: 5.9.3
vite-plugin-svgo: vite-plugin-svgo:
specifier: ~2.0.0 specifier: ~2.0.0
version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
vitest: vitest:
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
@@ -1116,7 +1116,7 @@ importers:
version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)
'@vitest/browser': '@vitest/browser':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) version: 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
'@vitest/coverage-istanbul': '@vitest/coverage-istanbul':
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(vitest@3.2.4) version: 3.2.4(vitest@3.2.4)
@@ -1149,7 +1149,7 @@ importers:
version: 5.9.3 version: 5.9.3
vite-plugin-svgo: vite-plugin-svgo:
specifier: ~2.0.0 specifier: ~2.0.0
version: 2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) version: 2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
vitest: vitest:
specifier: 3.2.4 specifier: 3.2.4
version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) version: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
@@ -4958,6 +4958,9 @@ packages:
'@types/express@5.0.3': '@types/express@5.0.3':
resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==}
'@types/express@5.0.4':
resolution: {integrity: sha512-g64dbryHk7loCIrsa0R3shBnEu5p6LPJ09bu9NG58+jz+cRUjFrc3Bz0kNQ7j9bXeCsrRDvNET1G54P/GJkAyA==}
'@types/fs-extra@11.0.4': '@types/fs-extra@11.0.4':
resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==}
@@ -5063,9 +5066,6 @@ packages:
'@types/node@20.19.18': '@types/node@20.19.18':
resolution: {integrity: sha512-KeYVbfnbsBCyKG8e3gmUqAfyZNcoj/qpEbHRkQkfZdKOBrU7QQ+BsTdfqLSWX9/m1ytYreMhpKvp+EZi3UFYAg==} resolution: {integrity: sha512-KeYVbfnbsBCyKG8e3gmUqAfyZNcoj/qpEbHRkQkfZdKOBrU7QQ+BsTdfqLSWX9/m1ytYreMhpKvp+EZi3UFYAg==}
'@types/node@20.19.22':
resolution: {integrity: sha512-hRnu+5qggKDSyWHlnmThnUqg62l29Aj/6vcYgUaSFL9oc7DVjeWEQN3PRgdSc6F8d9QRMWkf36CLMch1Do/+RQ==}
'@types/node@20.19.23': '@types/node@20.19.23':
resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==} resolution: {integrity: sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==}
@@ -5075,9 +5075,6 @@ packages:
'@types/node@22.15.30': '@types/node@22.15.30':
resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==} resolution: {integrity: sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==}
'@types/node@22.18.10':
resolution: {integrity: sha512-anNG/V/Efn/YZY4pRzbACnKxNKoBng2VTFydVu8RRs5hQjikP8CQfaeAV59VFSCzKNp90mXiVXW2QzV56rwMrg==}
'@types/node@22.18.12': '@types/node@22.18.12':
resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==}
@@ -5191,8 +5188,8 @@ packages:
'@types/trusted-types@2.0.7': '@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
'@types/turndown@5.0.5': '@types/turndown@5.0.6':
resolution: {integrity: sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w==} resolution: {integrity: sha512-ru00MoyeeouE5BX4gRL+6m/BsDfbRayOskWqUvh7CLGW+UXxHQItqALa38kKnOiZPqJrtzJUgAC2+F0rL1S4Pg==}
'@types/unist@3.0.3': '@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
@@ -7361,8 +7358,8 @@ packages:
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
engines: {node: '>=8.0.0'} engines: {node: '>=8.0.0'}
electron@38.3.0: electron@38.4.0:
resolution: {integrity: sha512-Wij4AzX4SAV0X/ktq+NrWrp5piTCSS8F6YWh1KAcG+QRtNzyns9XLKERP68nFHIwfprhxF2YCN2uj7nx9DaeJw==} resolution: {integrity: sha512-9CsXKbGf2qpofVe2pQYSgom2E//zLDJO2rGLLbxgy9tkdTOs7000Gte+d/PUtzLjI/DS95jDK0ojYAeqjLvpYg==}
engines: {node: '>= 12.20.55'} engines: {node: '>= 12.20.55'}
hasBin: true hasBin: true
@@ -10138,8 +10135,8 @@ packages:
nice-try@1.0.5: nice-try@1.0.5:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
node-abi@4.14.0: node-abi@4.15.0:
resolution: {integrity: sha512-E4n91K4Nk1Rch2KzD+edU2bfZTP4W42GypAUDXU4vu1A+4u9PvUNDkGI0dXbsy8ZeF3WGj0SD/uHxnXD/sW+3w==} resolution: {integrity: sha512-w5n9oW45LIgHXqDhA2tL4/uzjeussOn0c5WgWQT48xMbk49+kTlVgZjaEyCBuvS1AP+HuizfiAKGZwIYsILGcw==}
engines: {node: '>=22.12.0'} engines: {node: '>=22.12.0'}
node-addon-api@7.1.1: node-addon-api@7.1.1:
@@ -13641,8 +13638,8 @@ packages:
peerDependencies: peerDependencies:
vite: 5.x || 6.x || 7.x vite: 5.x || 6.x || 7.x
vite@7.1.11: vite@7.1.12:
resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==}
engines: {node: ^20.19.0 || >=22.12.0} engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -15068,6 +15065,8 @@ snapshots:
'@ckeditor/ckeditor5-utils': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0
'@ckeditor/ckeditor5-watchdog': 47.1.0 '@ckeditor/ckeditor5-watchdog': 47.1.0
es-toolkit: 1.39.5 es-toolkit: 1.39.5
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)': '@ckeditor/ckeditor5-dev-build-tools@43.1.0(@swc/helpers@0.5.17)(tslib@2.8.1)(typescript@5.9.3)':
dependencies: dependencies:
@@ -15259,8 +15258,6 @@ snapshots:
'@ckeditor/ckeditor5-utils': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0
ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
es-toolkit: 1.39.5 es-toolkit: 1.39.5
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-editor-multi-root@47.1.0': '@ckeditor/ckeditor5-editor-multi-root@47.1.0':
dependencies: dependencies:
@@ -15757,6 +15754,8 @@ snapshots:
'@ckeditor/ckeditor5-ui': 47.1.0 '@ckeditor/ckeditor5-ui': 47.1.0
'@ckeditor/ckeditor5-utils': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0
ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41) ckeditor5: 47.1.0(patch_hash=8331a09d41443b39ea1c784daaccfeb0da4f9065ed556e7de92e9c77edd9eb41)
transitivePeerDependencies:
- supports-color
'@ckeditor/ckeditor5-restricted-editing@47.1.0': '@ckeditor/ckeditor5-restricted-editing@47.1.0':
dependencies: dependencies:
@@ -16417,7 +16416,7 @@ snapshots:
'@malept/cross-spawn-promise': 2.0.0 '@malept/cross-spawn-promise': 2.0.0
debug: 4.4.3(supports-color@6.0.0) debug: 4.4.3(supports-color@6.0.0)
fs-extra: 10.1.0 fs-extra: 10.1.0
semver: 7.7.2 semver: 7.7.3
username: 5.1.0 username: 5.1.0
transitivePeerDependencies: transitivePeerDependencies:
- bluebird - bluebird
@@ -16557,7 +16556,7 @@ snapshots:
plist: 3.1.0 plist: 3.1.0
resedit: 2.0.3 resedit: 2.0.3
resolve: 1.22.10 resolve: 1.22.10
semver: 7.7.2 semver: 7.7.3
yargs-parser: 21.1.1 yargs-parser: 21.1.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -16571,11 +16570,11 @@ snapshots:
detect-libc: 2.1.1 detect-libc: 2.1.1
fs-extra: 10.1.0 fs-extra: 10.1.0
got: 11.8.6 got: 11.8.6
node-abi: 4.14.0 node-abi: 4.15.0
node-api-version: 0.2.1 node-api-version: 0.2.1
ora: 5.4.1 ora: 5.4.1
read-binary-file-arch: 1.0.6 read-binary-file-arch: 1.0.6
semver: 7.7.2 semver: 7.7.3
tar: 6.2.1 tar: 6.2.1
yargs: 17.7.2 yargs: 17.7.2
transitivePeerDependencies: transitivePeerDependencies:
@@ -16590,7 +16589,7 @@ snapshots:
detect-libc: 2.0.4 detect-libc: 2.0.4
got: 11.8.6 got: 11.8.6
graceful-fs: 4.2.11 graceful-fs: 4.2.11
node-abi: 4.14.0 node-abi: 4.15.0
node-api-version: 0.2.1 node-api-version: 0.2.1
node-gyp: 11.2.0 node-gyp: 11.2.0
ora: 5.4.1 ora: 5.4.1
@@ -16601,9 +16600,9 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@electron/remote@2.1.3(electron@38.3.0)': '@electron/remote@2.1.3(electron@38.4.0)':
dependencies: dependencies:
electron: 38.3.0 electron: 38.4.0
'@electron/universal@2.0.2': '@electron/universal@2.0.2':
dependencies: dependencies:
@@ -18020,18 +18019,18 @@ snapshots:
'@popperjs/core@2.11.8': {} '@popperjs/core@2.11.8': {}
'@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': '@preact/preset-vite@2.10.2(@babel/core@7.28.0)(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))':
dependencies: dependencies:
'@babel/core': 7.28.0 '@babel/core': 7.28.0
'@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.0)
'@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.0)
'@prefresh/vite': 2.4.8(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@prefresh/vite': 2.4.8(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.28.0)
debug: 4.4.1 debug: 4.4.1
picocolors: 1.1.1 picocolors: 1.1.1
vite: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
vite-prerender-plugin: 0.5.11(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) vite-prerender-plugin: 0.5.11(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
transitivePeerDependencies: transitivePeerDependencies:
- preact - preact
- supports-color - supports-color
@@ -18044,7 +18043,7 @@ snapshots:
'@prefresh/utils@1.2.1': {} '@prefresh/utils@1.2.1': {}
'@prefresh/vite@2.4.8(preact@10.27.2)(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': '@prefresh/vite@2.4.8(preact@10.27.2)(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))':
dependencies: dependencies:
'@babel/core': 7.28.0 '@babel/core': 7.28.0
'@prefresh/babel-plugin': 0.5.2 '@prefresh/babel-plugin': 0.5.2
@@ -18052,7 +18051,7 @@ snapshots:
'@prefresh/utils': 1.2.1 '@prefresh/utils': 1.2.1
'@rollup/pluginutils': 4.2.1 '@rollup/pluginutils': 4.2.1
preact: 10.27.2 preact: 10.27.2
vite: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -19244,7 +19243,7 @@ snapshots:
'@types/appdmg@0.5.5': '@types/appdmg@0.5.5':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
optional: true optional: true
'@types/archiver@6.0.4': '@types/archiver@6.0.4':
@@ -19266,7 +19265,7 @@ snapshots:
'@types/bonjour@3.5.13': '@types/bonjour@3.5.13':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/bootstrap@5.2.10': '@types/bootstrap@5.2.10':
dependencies: dependencies:
@@ -19280,7 +19279,7 @@ snapshots:
dependencies: dependencies:
'@types/http-cache-semantics': 4.0.4 '@types/http-cache-semantics': 4.0.4
'@types/keyv': 3.1.4 '@types/keyv': 3.1.4
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/responselike': 1.0.3 '@types/responselike': 1.0.3
'@types/chai@5.2.2': '@types/chai@5.2.2':
@@ -19305,15 +19304,15 @@ snapshots:
'@types/connect-history-api-fallback@1.5.4': '@types/connect-history-api-fallback@1.5.4':
dependencies: dependencies:
'@types/express-serve-static-core': 5.1.0 '@types/express-serve-static-core': 5.1.0
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/connect@3.4.38': '@types/connect@3.4.38':
dependencies: dependencies:
'@types/node': 22.18.12 '@types/node': 22.18.12
'@types/cookie-parser@1.4.10(@types/express@5.0.3)': '@types/cookie-parser@1.4.10(@types/express@5.0.4)':
dependencies: dependencies:
'@types/express': 5.0.3 '@types/express': 5.0.4
'@types/cookie@0.6.0': '@types/cookie@0.6.0':
optional: true optional: true
@@ -19322,7 +19321,7 @@ snapshots:
'@types/cors@2.8.19': '@types/cors@2.8.19':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/cssnano@5.1.3(postcss@8.5.6)': '@types/cssnano@5.1.3(postcss@8.5.6)':
dependencies: dependencies:
@@ -19503,6 +19502,12 @@ snapshots:
'@types/express-serve-static-core': 5.1.0 '@types/express-serve-static-core': 5.1.0
'@types/serve-static': 1.15.10 '@types/serve-static': 1.15.10
'@types/express@5.0.4':
dependencies:
'@types/body-parser': 1.19.6
'@types/express-serve-static-core': 5.1.0
'@types/serve-static': 1.15.10
'@types/fs-extra@11.0.4': '@types/fs-extra@11.0.4':
dependencies: dependencies:
'@types/jsonfile': 6.1.4 '@types/jsonfile': 6.1.4
@@ -19510,7 +19515,7 @@ snapshots:
'@types/fs-extra@9.0.13': '@types/fs-extra@9.0.13':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
optional: true optional: true
'@types/geojson-vt@3.2.5': '@types/geojson-vt@3.2.5':
@@ -19522,7 +19527,7 @@ snapshots:
'@types/glob@7.2.0': '@types/glob@7.2.0':
dependencies: dependencies:
'@types/minimatch': 5.1.2 '@types/minimatch': 5.1.2
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/hast@3.0.4': '@types/hast@3.0.4':
dependencies: dependencies:
@@ -19536,7 +19541,7 @@ snapshots:
'@types/http-proxy@1.17.16': '@types/http-proxy@1.17.16':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/ini@4.1.1': {} '@types/ini@4.1.1': {}
@@ -19554,7 +19559,7 @@ snapshots:
'@types/keyv@3.1.4': '@types/keyv@3.1.4':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/leaflet-gpx@1.3.8': '@types/leaflet-gpx@1.3.8':
dependencies: dependencies:
@@ -19608,7 +19613,7 @@ snapshots:
'@types/node-forge@1.3.14': '@types/node-forge@1.3.14':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/node@16.9.1': {} '@types/node@16.9.1': {}
@@ -19616,10 +19621,6 @@ snapshots:
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 6.21.0
'@types/node@20.19.22':
dependencies:
undici-types: 6.21.0
'@types/node@20.19.23': '@types/node@20.19.23':
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 6.21.0
@@ -19632,10 +19633,6 @@ snapshots:
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 6.21.0
'@types/node@22.18.10':
dependencies:
undici-types: 6.21.0
'@types/node@22.18.12': '@types/node@22.18.12':
dependencies: dependencies:
undici-types: 6.21.0 undici-types: 6.21.0
@@ -19647,6 +19644,7 @@ snapshots:
'@types/node@24.9.1': '@types/node@24.9.1':
dependencies: dependencies:
undici-types: 7.16.0 undici-types: 7.16.0
optional: true
'@types/parse-json@4.0.2': {} '@types/parse-json@4.0.2': {}
@@ -19678,7 +19676,7 @@ snapshots:
'@types/responselike@1.0.3': '@types/responselike@1.0.3':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/retry@0.12.2': {} '@types/retry@0.12.2': {}
@@ -19705,7 +19703,7 @@ snapshots:
'@types/serve-index@1.9.4': '@types/serve-index@1.9.4':
dependencies: dependencies:
'@types/express': 5.0.3 '@types/express': 5.0.4
'@types/serve-static@1.15.10': '@types/serve-static@1.15.10':
dependencies: dependencies:
@@ -19719,7 +19717,7 @@ snapshots:
'@types/sockjs@0.3.36': '@types/sockjs@0.3.36':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/statuses@2.0.6': '@types/statuses@2.0.6':
optional: true optional: true
@@ -19755,7 +19753,7 @@ snapshots:
'@types/through2@2.0.41': '@types/through2@2.0.41':
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
'@types/tmp@0.2.6': {} '@types/tmp@0.2.6': {}
@@ -19765,7 +19763,7 @@ snapshots:
'@types/trusted-types@2.0.7': '@types/trusted-types@2.0.7':
optional: true optional: true
'@types/turndown@5.0.5': {} '@types/turndown@5.0.6': {}
'@types/unist@3.0.3': {} '@types/unist@3.0.3': {}
@@ -19793,7 +19791,7 @@ snapshots:
'@types/yauzl@2.10.3': '@types/yauzl@2.10.3':
dependencies: dependencies:
'@types/node': 22.18.10 '@types/node': 22.18.12
optional: true optional: true
'@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)':
@@ -19922,11 +19920,11 @@ snapshots:
- bufferutil - bufferutil
- utf-8-validate - utf-8-validate
'@vitest/browser@3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))': '@vitest/browser@3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))':
dependencies: dependencies:
'@testing-library/dom': 10.4.0 '@testing-library/dom': 10.4.0
'@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0)
'@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
'@vitest/utils': 3.2.4 '@vitest/utils': 3.2.4
magic-string: 0.30.18 magic-string: 0.30.18
sirv: 3.0.1 sirv: 3.0.1
@@ -19975,7 +19973,7 @@ snapshots:
tinyrainbow: 2.0.0 tinyrainbow: 2.0.0
vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.18.12)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(happy-dom@20.0.8)(jiti@2.6.1)(jsdom@26.1.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))(less@4.1.3)(lightningcss@1.30.1)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
optionalDependencies: optionalDependencies:
'@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -19987,14 +19985,14 @@ snapshots:
chai: 5.2.0 chai: 5.2.0
tinyrainbow: 2.0.0 tinyrainbow: 2.0.0
'@vitest/mocker@3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))': '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))':
dependencies: dependencies:
'@vitest/spy': 3.2.4 '@vitest/spy': 3.2.4
estree-walker: 3.0.3 estree-walker: 3.0.3
magic-string: 0.30.18 magic-string: 0.30.18
optionalDependencies: optionalDependencies:
msw: 2.7.5(@types/node@22.18.12)(typescript@5.9.3) msw: 2.7.5(@types/node@22.18.12)(typescript@5.9.3)
vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
'@vitest/pretty-format@3.2.4': '@vitest/pretty-format@3.2.4':
dependencies: dependencies:
@@ -20105,11 +20103,11 @@ snapshots:
'@wdio/repl@9.16.2': '@wdio/repl@9.16.2':
dependencies: dependencies:
'@types/node': 20.19.22 '@types/node': 20.19.23
'@wdio/types@9.20.0': '@wdio/types@9.20.0':
dependencies: dependencies:
'@types/node': 20.19.22 '@types/node': 20.19.23
'@wdio/utils@9.20.0': '@wdio/utils@9.20.0':
dependencies: dependencies:
@@ -22445,7 +22443,7 @@ snapshots:
glob: 7.2.3 glob: 7.2.3
lodash: 4.17.21 lodash: 4.17.21
parse-author: 2.0.0 parse-author: 2.0.0
semver: 7.7.2 semver: 7.7.3
tmp-promise: 3.0.3 tmp-promise: 3.0.3
optionalDependencies: optionalDependencies:
'@types/fs-extra': 9.0.13 '@types/fs-extra': 9.0.13
@@ -22532,10 +22530,10 @@ snapshots:
- supports-color - supports-color
optional: true optional: true
electron@38.3.0: electron@38.4.0:
dependencies: dependencies:
'@electron/get': 2.0.3 '@electron/get': 2.0.3
'@types/node': 22.18.10 '@types/node': 22.18.12
extract-zip: 2.0.1 extract-zip: 2.0.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -22594,7 +22592,7 @@ snapshots:
engine.io@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5): engine.io@6.6.4(bufferutil@4.0.9)(utf-8-validate@6.0.5):
dependencies: dependencies:
'@types/cors': 2.8.19 '@types/cors': 2.8.19
'@types/node': 24.9.1 '@types/node': 22.18.12
accepts: 1.3.8 accepts: 1.3.8
base64id: 2.0.0 base64id: 2.0.0
cookie: 0.7.2 cookie: 0.7.2
@@ -23832,7 +23830,7 @@ snapshots:
es6-error: 4.1.1 es6-error: 4.1.1
matcher: 3.0.0 matcher: 3.0.0
roarr: 2.15.4 roarr: 2.15.4
semver: 7.7.2 semver: 7.7.3
serialize-error: 7.0.1 serialize-error: 7.0.1
optional: true optional: true
@@ -24718,13 +24716,13 @@ snapshots:
jest-worker@26.6.2: jest-worker@26.6.2:
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
merge-stream: 2.0.0 merge-stream: 2.0.0
supports-color: 7.2.0 supports-color: 7.2.0
jest-worker@27.5.1: jest-worker@27.5.1:
dependencies: dependencies:
'@types/node': 24.9.1 '@types/node': 22.18.12
merge-stream: 2.0.0 merge-stream: 2.0.0
supports-color: 8.1.1 supports-color: 8.1.1
@@ -26189,9 +26187,9 @@ snapshots:
nice-try@1.0.5: {} nice-try@1.0.5: {}
node-abi@4.14.0: node-abi@4.15.0:
dependencies: dependencies:
semver: 7.7.2 semver: 7.7.3
node-addon-api@7.1.1: {} node-addon-api@7.1.1: {}
@@ -27637,7 +27635,7 @@ snapshots:
minimist: 1.2.8 minimist: 1.2.8
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
napi-build-utils: 2.0.0 napi-build-utils: 2.0.0
node-abi: 4.14.0 node-abi: 4.15.0
pump: 3.0.3 pump: 3.0.3
rc: 1.2.8 rc: 1.2.8
simple-get: 4.0.1 simple-get: 4.0.1
@@ -27691,7 +27689,7 @@ snapshots:
'@protobufjs/path': 1.1.2 '@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0 '@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0 '@protobufjs/utf8': 1.1.0
'@types/node': 24.9.1 '@types/node': 22.18.12
long: 5.3.2 long: 5.3.2
protocol-buffers-schema@3.6.0: {} protocol-buffers-schema@3.6.0: {}
@@ -28216,11 +28214,11 @@ snapshots:
'@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.29
optional: true optional: true
rollup-plugin-stats@1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): rollup-plugin-stats@1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
optionalDependencies: optionalDependencies:
rolldown: 1.0.0-beta.29 rolldown: 1.0.0-beta.29
rollup: 4.52.0 rollup: 4.52.0
vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
rollup-plugin-styles@4.0.0(rollup@4.40.0): rollup-plugin-styles@4.0.0(rollup@4.40.0):
dependencies: dependencies:
@@ -28249,13 +28247,13 @@ snapshots:
'@rollup/pluginutils': 5.1.4(rollup@4.40.0) '@rollup/pluginutils': 5.1.4(rollup@4.40.0)
rollup: 4.40.0 rollup: 4.40.0
rollup-plugin-webpack-stats@2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): rollup-plugin-webpack-stats@2.1.6(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
dependencies: dependencies:
rollup-plugin-stats: 1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) rollup-plugin-stats: 1.5.1(rolldown@1.0.0-beta.29)(rollup@4.52.0)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
optionalDependencies: optionalDependencies:
rolldown: 1.0.0-beta.29 rolldown: 1.0.0-beta.29
rollup: 4.52.0 rollup: 4.52.0
vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
rollup@4.40.0: rollup@4.40.0:
dependencies: dependencies:
@@ -29936,7 +29934,8 @@ snapshots:
undici-types@6.21.0: {} undici-types@6.21.0: {}
undici-types@7.16.0: {} undici-types@7.16.0:
optional: true
undici@6.21.3: {} undici@6.21.3: {}
@@ -30161,7 +30160,7 @@ snapshots:
debug: 4.4.3(supports-color@6.0.0) debug: 4.4.3(supports-color@6.0.0)
es-module-lexer: 1.7.0 es-module-lexer: 1.7.0
pathe: 2.0.3 pathe: 2.0.3
vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- jiti - jiti
@@ -30176,7 +30175,7 @@ snapshots:
- tsx - tsx
- yaml - yaml
vite-plugin-dts@4.5.4(@types/node@22.18.12)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): vite-plugin-dts@4.5.4(@types/node@22.18.12)(rollup@4.52.0)(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
dependencies: dependencies:
'@microsoft/api-extractor': 7.52.8(@types/node@22.18.12) '@microsoft/api-extractor': 7.52.8(@types/node@22.18.12)
'@rollup/pluginutils': 5.1.4(rollup@4.52.0) '@rollup/pluginutils': 5.1.4(rollup@4.52.0)
@@ -30189,27 +30188,27 @@ snapshots:
magic-string: 0.30.17 magic-string: 0.30.17
typescript: 5.9.3 typescript: 5.9.3
optionalDependencies: optionalDependencies:
vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- rollup - rollup
- supports-color - supports-color
vite-plugin-static-copy@3.1.4(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): vite-plugin-static-copy@3.1.4(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
dependencies: dependencies:
chokidar: 3.6.0 chokidar: 3.6.0
p-map: 7.0.3 p-map: 7.0.3
picocolors: 1.1.1 picocolors: 1.1.1
tinyglobby: 0.2.15 tinyglobby: 0.2.15
vite: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): vite-plugin-svgo@2.0.0(typescript@5.9.3)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
dependencies: dependencies:
svgo: 3.3.2 svgo: 3.3.2
typescript: 5.9.3 typescript: 5.9.3
vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
vite-prerender-plugin@0.5.11(vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)): vite-prerender-plugin@0.5.11(vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)):
dependencies: dependencies:
kolorist: 1.8.0 kolorist: 1.8.0
magic-string: 0.30.18 magic-string: 0.30.18
@@ -30217,9 +30216,9 @@ snapshots:
simple-code-frame: 1.3.0 simple-code-frame: 1.3.0
source-map: 0.7.6 source-map: 0.7.6
stack-trace: 1.0.0-pre2 stack-trace: 1.0.0-pre2
vite: 7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1):
dependencies: dependencies:
esbuild: 0.25.11 esbuild: 0.25.11
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
@@ -30239,7 +30238,7 @@ snapshots:
tsx: 4.20.6 tsx: 4.20.6
yaml: 2.8.1 yaml: 2.8.1
vite@7.1.11(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1): vite@7.1.12(@types/node@24.9.1)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1):
dependencies: dependencies:
esbuild: 0.25.11 esbuild: 0.25.11
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
@@ -30263,7 +30262,7 @@ snapshots:
dependencies: dependencies:
'@types/chai': 5.2.2 '@types/chai': 5.2.2
'@vitest/expect': 3.2.4 '@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/mocker': 3.2.4(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))
'@vitest/pretty-format': 3.2.4 '@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4 '@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4 '@vitest/snapshot': 3.2.4
@@ -30281,13 +30280,13 @@ snapshots:
tinyglobby: 0.2.15 tinyglobby: 0.2.15
tinypool: 1.1.1 tinypool: 1.1.1
tinyrainbow: 2.0.0 tinyrainbow: 2.0.0
vite: 7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite: 7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
vite-node: 3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1) vite-node: 3.2.4(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1)
why-is-node-running: 2.3.0 why-is-node-running: 2.3.0
optionalDependencies: optionalDependencies:
'@types/debug': 4.1.12 '@types/debug': 4.1.12
'@types/node': 22.18.12 '@types/node': 22.18.12
'@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.11(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5)) '@vitest/browser': 3.2.4(bufferutil@4.0.9)(msw@2.7.5(@types/node@22.18.12)(typescript@5.9.3))(playwright@1.56.1)(utf-8-validate@6.0.5)(vite@7.1.12(@types/node@22.18.12)(jiti@2.6.1)(less@4.1.3)(lightningcss@1.30.1)(sass-embedded@1.91.0)(sass@1.91.0)(terser@5.44.0)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)(webdriverio@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5))
'@vitest/ui': 3.2.4(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4)
happy-dom: 20.0.8 happy-dom: 20.0.8
jsdom: 26.1.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)
@@ -30380,7 +30379,7 @@ snapshots:
webdriver@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5): webdriver@9.20.0(bufferutil@4.0.9)(utf-8-validate@6.0.5):
dependencies: dependencies:
'@types/node': 20.19.22 '@types/node': 20.19.23
'@types/ws': 8.18.1 '@types/ws': 8.18.1
'@wdio/config': 9.20.0 '@wdio/config': 9.20.0
'@wdio/logger': 9.18.0 '@wdio/logger': 9.18.0