diff --git a/docs-site/docs/getting-started/quick-start.md b/docs-site/docs/getting-started/quick-start.md index 07ec539a..86a9133c 100644 --- a/docs-site/docs/getting-started/quick-start.md +++ b/docs-site/docs/getting-started/quick-start.md @@ -169,10 +169,3 @@ Dragonfly 支持把当前会话输出录制为日志文件。 - 想了解终端增强与录制:查看 [终端功能](../guide/terminal) - 想配置 OTP:查看 [OTP 与认证](../guide/otp-and-auth) - 想启用云同步和加密备份:查看 [同步与备份](../guide/sync-and-backup) - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/session-types/new-session-tabs.png` -- 建议展示内容:新建连接窗口中 SSH / 本地终端 / Telnet / 串口四个标签 -- 另一个推荐图片路径:`/img/docs/layout/quick-start-split-workspace.png` -- 建议先执行:连接一个 SSH 会话,再新建一个本地终端并对标签页做一次分屏 -::: diff --git a/docs-site/docs/guide/file-transfer.md b/docs-site/docs/guide/file-transfer.md index 9627ca0a..3fcbb599 100644 --- a/docs-site/docs/guide/file-transfer.md +++ b/docs-site/docs/guide/file-transfer.md @@ -175,10 +175,3 @@ Dragonfly 会把上传 / 下载任务统一放进传输队列中,便于你查 - 权限的八进制表示 如果你的流程需要先核对权限再替换文件,这里会比单纯依赖 `ls -l` 更直观。 - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/file-transfer/remote-file-browser.png` -- 建议连接一个 SSH 会话后,在文件浏览器中展示目录树、工具栏与右键菜单 -- 另一个推荐图片路径:`/img/docs/file-transfer/auto-upload-dialog.png` -- 建议先打开一个远程文本文件,再在本地编辑器中保存一次以触发自动上传提示 -::: diff --git a/docs-site/docs/guide/layout-and-workspace.md b/docs-site/docs/guide/layout-and-workspace.md index 53a6344e..584d80b3 100644 --- a/docs-site/docs/guide/layout-and-workspace.md +++ b/docs-site/docs/guide/layout-and-workspace.md @@ -150,9 +150,3 @@ Dragonfly 的核心体验不是“单个终端标签页”,而是一个可组 - 打开远程文件,本地编辑后自动回传 - 把当前目录或文件路径直接发送到终端继续执行命令 -:::tip 截图建议 -- 推荐图片路径:`/img/docs/layout/quick-start-split-workspace.png` -- 建议展示一个 SSH 会话 + 一个本地终端的分屏工作区 -- 另一个推荐图片路径:`/img/docs/readme/main-workspace.png` -- 建议同时包含左侧活动栏、右侧面板、中心终端与底部辅助区 -::: diff --git a/docs-site/docs/guide/otp-and-auth.md b/docs-site/docs/guide/otp-and-auth.md index fe67eb01..5100e2fb 100644 --- a/docs-site/docs/guide/otp-and-auth.md +++ b/docs-site/docs/guide/otp-and-auth.md @@ -100,10 +100,3 @@ OTP 不是替代密码或私钥,而是和它们配合使用: 2. 再在具体 SSH 连接中绑定这些材料 这样连接配置会更干净,也更方便后续统一替换认证信息。 - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/security/otp-management.png` -- 建议展示 OTP 管理页中的 TOTP / HOTP 切换、二维码导入入口和验证码面板 -- 另一个推荐图片路径:`/img/docs/security/otp-dialog.png` -- 建议展示 SSH 登录过程中弹出的 OTP 输入对话框 -::: diff --git a/docs-site/docs/guide/security.md b/docs-site/docs/guide/security.md index eb39e9b4..0d1dd5cb 100644 --- a/docs-site/docs/guide/security.md +++ b/docs-site/docs/guide/security.md @@ -151,10 +151,3 @@ SSH 首次连接未知主机时,Dragonfly 支持三种策略: - 对共享电脑或演示机,开启 **主密码** 与 **屏幕锁定** - 对需要经常穿过堡垒机的环境,把 **跳板机** 和 **代理** 做成明确的已保存配置 - 对首次连接的新主机,核对主机密钥来源后再信任 - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/security/security-settings.png` -- 建议展示主密码、屏幕锁定、空闲锁定时间、主机密钥策略 -- 另一个推荐图片路径:`/img/docs/security/security-auth-panel.png` -- 建议展示 Security/Auth 面板中的密钥、密码、OTP 三个标签 -::: diff --git a/docs-site/docs/guide/session-types.md b/docs-site/docs/guide/session-types.md index c437cad5..310760c9 100644 --- a/docs-site/docs/guide/session-types.md +++ b/docs-site/docs/guide/session-types.md @@ -115,9 +115,3 @@ Dragonfly 的优势之一,是允许你把这些类型混合放进同一工作 - 再开一个串口标签观察设备启动信息 这也是为什么文档里很多功能会写成“某会话类型专属”或“某会话类型才显示”的原因——工作区统一,但能力边界仍然取决于底层会话类型。 - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/session-types/new-session-tabs.png` -- 建议展示新建连接窗口中的 SSH / 本地终端 / Telnet / 串口四个标签 -- 可同时保留各标签的默认字段区域,便于用户理解差异 -::: diff --git a/docs-site/docs/guide/ssh-connection.md b/docs-site/docs/guide/ssh-connection.md index 989cfa08..643beb95 100644 --- a/docs-site/docs/guide/ssh-connection.md +++ b/docs-site/docs/guide/ssh-connection.md @@ -151,10 +151,3 @@ Dragonfly 会为 SSH 主机维护已知主机记录,并提供三种主机密 - 你希望把连接长期保存下来复用 如果你只是想在 Dragonfly 里开一个本地 shell,请改用 [会话类型](./session-types) 里的 **本地终端**。 - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/session-types/ssh-advanced-form.png` -- 建议展示 SSH 表单中的主机、认证方式,以及高级区域中的代理 / 跳板机 / OTP 绑定 -- 另一个推荐图片路径:`/img/docs/network/ssh-import-and-groups.png` -- 建议展示已保存连接分组与导入入口 -::: diff --git a/docs-site/docs/guide/terminal.md b/docs-site/docs/guide/terminal.md index 9f3eac18..a5ec10a2 100644 --- a/docs-site/docs/guide/terminal.md +++ b/docs-site/docs/guide/terminal.md @@ -168,10 +168,3 @@ Dragonfly 支持会话录制,适合: - 资源监控 这样更容易拍出“终端在真实工作流中使用”的截图,而不是单独展示某个开关。 - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/terminal/gutter-line-numbers-timestamps.png` -- 建议先在 **设置 → 终端** 中开启行号与时间戳,再执行:`scripts/demo-terminal-gutter.sh` -- 另一个推荐图片路径:`/img/docs/terminal/action-links-and-highlights.png` -- 建议先开启动作链接与关键词高亮,再执行:`scripts/demo-terminal-output.sh` 与 `scripts/demo-action-links.sh` -::: diff --git a/docs-site/docs/guide/tunnels-and-proxy.md b/docs-site/docs/guide/tunnels-and-proxy.md index a8ce1148..7fba04de 100644 --- a/docs-site/docs/guide/tunnels-and-proxy.md +++ b/docs-site/docs/guide/tunnels-and-proxy.md @@ -125,10 +125,3 @@ Dragonfly 在网络面板中提供专门的隧道管理页,可把端口映射 - 建立 SSH 连接 - 保存一个本地隧道 `localhost:15432 -> db.internal:5432` - 之后本地工具即可通过 `127.0.0.1:15432` 访问数据库 - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/network/network-panel.png` -- 建议展示网络面板中的代理与隧道两个标签 -- 另一个推荐图片路径:`/img/docs/network/tunnel-dialog.png` -- 建议展示隧道类型、本地监听端口、目标主机与自动打开选项 -::: diff --git a/docs-site/docs/intro.md b/docs-site/docs/intro.md index 53ddee7e..125fb40a 100644 --- a/docs-site/docs/intro.md +++ b/docs-site/docs/intro.md @@ -85,9 +85,3 @@ Dragonfly 不只支持 SSH,还支持: 7. [代理、跳板机与隧道](./guide/tunnels-and-proxy) 8. [OTP 与认证](./guide/otp-and-auth) 9. [同步与备份](./guide/sync-and-backup) - -:::tip 截图建议 -- 推荐图片路径:`/img/docs/readme/main-workspace.png` -- 建议展示内容:左侧活动栏、右侧面板、中心多标签终端、底部快捷区 -- 适合先执行的脚本:`scripts/demo-terminal-output.sh` -::: diff --git a/docs-site/docusaurus.config.ts b/docs-site/docusaurus.config.ts index 25eb6a67..97a384b5 100644 --- a/docs-site/docusaurus.config.ts +++ b/docs-site/docusaurus.config.ts @@ -14,6 +14,7 @@ const config: Config = { projectName: 'dragonfly', onBrokenLinks: 'throw', + onBrokenAnchors: 'ignore', markdown: { hooks: { @@ -66,10 +67,23 @@ const config: Config = { }, items: [ { - type: 'docSidebar', - sidebarId: 'docs', + to: '/#features', + position: 'left', + label: '功能', + className: 'navbar__center-link navbar__center-link--features', + activeBaseRegex: 'a^', + }, + { + to: '/docs/', position: 'left', label: '文档', + className: 'navbar__center-link navbar__center-link--docs', + }, + { + to: '/changelog', + position: 'left', + label: '日志', + className: 'navbar__center-link navbar__center-link--changelog', }, { type: 'localeDropdown', diff --git a/docs-site/i18n/en/code.json b/docs-site/i18n/en/code.json index 2260f293..aee957e4 100644 --- a/docs-site/i18n/en/code.json +++ b/docs-site/i18n/en/code.json @@ -43,5 +43,218 @@ }, "现代高性能 SSH 客户端,基于 Tauri 和 React 构建": { "message": "A modern, high-performance SSH client built with Tauri and React" + }, + "下载": { + "message": "Download" + }, + "选择下载平台": { + "message": "Choose download platform" + }, + "Windows x86_64": { + "message": "Windows x86_64" + }, + "Linux x86_64": { + "message": "Linux x86_64" + }, + "macOS Intel": { + "message": "macOS Intel" + }, + "macOS Apple Silicon": { + "message": "macOS Apple Silicon" + }, + "Dragonfly 日间主题功能截图": { + "message": "Dragonfly feature screenshot in light theme" + }, + "Dragonfly 夜间主题功能截图": { + "message": "Dragonfly feature screenshot in dark theme" + }, + "产品截图预览": { + "message": "Product screenshot preview" + }, + "Dragonfly 日间主题产品截图": { + "message": "Dragonfly product screenshot in light theme" + }, + "Dragonfly 夜间主题产品截图": { + "message": "Dragonfly product screenshot in dark theme" + }, + "SSH": { + "message": "SSH" + }, + "Local Shell": { + "message": "Local Shell" + }, + "Telnet / Serial": { + "message": "Telnet / Serial" + }, + "SFTP": { + "message": "SFTP" + }, + "WebDAV / S3": { + "message": "WebDAV / S3" + }, + "用于 SSH、串口和本地命令行工作的桌面终端客户端。": { + "message": "A desktop terminal client for SSH, serial connections, and local command-line work." + }, + "Dragonfly 将终端会话、远程文件、认证信息、端口转发和配置备份放在同一个桌面应用中,适合日常开发、服务器维护和设备调试。": { + "message": "Dragonfly brings terminal sessions, remote files, credentials, port forwarding, and configuration backups into one desktop app for daily development, server maintenance, and device debugging." + }, + "功能展示": { + "message": "Feature showcase" + }, + "安装并建立第一个连接": { + "message": "Install and create your first connection" + }, + "了解安装方式、创建连接和进入工作区的基本流程。": { + "message": "Learn the basics of installation, connection setup, and entering the workspace." + }, + "查看快速开始": { + "message": "View quick start" + }, + "按功能查阅使用说明": { + "message": "Browse guides by feature" + }, + "查看 SSH、SFTP、终端操作、OTP、主题、代理和同步备份的具体用法。": { + "message": "See detailed guides for SSH, SFTP, terminal operations, OTP, themes, proxies, and sync & backup." + }, + "查看文档": { + "message": "View docs" + }, + "查看版本变化": { + "message": "See version changes" + }, + "了解各版本新增功能、行为调整和需要注意的兼容性变化。": { + "message": "Review new features, behavior changes, and compatibility notes across releases." + }, + "查看更新记录": { + "message": "View changelog" + }, + "继续了解 Dragonfly": { + "message": "Continue exploring Dragonfly" + }, + "多种终端会话": { + "message": "Multiple session types" + }, + "支持 SSH、本地 shell、Telnet 和串口会话,可在标签页和分屏中同时工作。": { + "message": "Supports SSH, local shell, Telnet, and serial sessions, with tabs and split layouts for simultaneous work." + }, + "终端输出阅读": { + "message": "Terminal output readability" + }, + "提供搜索、命令历史建议、时间戳、关键词高亮和大输出保护。": { + "message": "Provides search, command history suggestions, timestamps, keyword highlighting, and large-output protection." + }, + "文件、认证与网络": { + "message": "Files, auth, and networking" + }, + "包含 SFTP、OTP、代理、跳板机、端口转发和主机密钥校验。": { + "message": "Includes SFTP, OTP, proxies, jump hosts, port forwarding, and host key verification." + }, + "配置同步与备份": { + "message": "Config sync and backup" + }, + "可通过 WebDAV 或 S3 兼容存储保存加密配置快照。": { + "message": "Save encrypted configuration snapshots through WebDAV or S3-compatible storage." + }, + "工作区": { + "message": "Workspace" + }, + "在一个工作区中组织多种会话": { + "message": "Organize multiple session types in one workspace" + }, + "SSH、本地 shell、Telnet 和串口会话使用同一套标签页与分屏布局,便于同时查看不同主机、设备或任务。": { + "message": "SSH, local shell, Telnet, and serial sessions share the same tab and split-pane layout, making it easy to view different hosts, devices, or tasks side by side." + }, + "用标签页区分不同连接、任务或环境": { + "message": "Use tabs to separate different connections, tasks, or environments" + }, + "在单个标签页内横向或纵向拆分终端区域": { + "message": "Split terminal areas horizontally or vertically within a single tab" + }, + "在侧边区域查看会话列表、文件和资源信息": { + "message": "View session lists, files, and resource information in side panels" + }, + "终端": { + "message": "Terminal" + }, + "改进命令输入和输出阅读": { + "message": "Improve command input and output reading" + }, + "终端区域提供搜索、命令历史建议和输出标记,减少在长日志、重复命令和排错信息之间来回查找的成本。": { + "message": "The terminal area provides search, command history suggestions, and output markers to reduce the effort of navigating long logs, repeated commands, and troubleshooting output." + }, + "根据历史命令提供输入建议": { + "message": "Suggest input based on command history" + }, + "支持终端内搜索、选中文本搜索和翻译": { + "message": "Support in-terminal search, selected-text search, and translation" + }, + "可显示时间戳、动作链接和关键词高亮": { + "message": "Show timestamps, action links, and keyword highlighting" + }, + "文件传输": { + "message": "File transfer" + }, + "在终端旁处理远程文件": { + "message": "Work with remote files beside the terminal" + }, + "SFTP 文件浏览器与终端工作区并列使用,适合查看日志、上传构建产物或调整远程配置文件。": { + "message": "Use the SFTP file explorer alongside the terminal workspace to inspect logs, upload build artifacts, or adjust remote configuration files." + }, + "支持上传、下载、重命名、移动、删除和属性查看": { + "message": "Supports upload, download, rename, move, delete, and property inspection" + }, + "传输任务可暂停、继续、取消和失败重试": { + "message": "Transfer tasks can be paused, resumed, canceled, and retried after failure" + }, + "本地编辑文件后可自动回传到远端路径": { + "message": "Automatically upload files back to the remote path after local editing" + }, + "安全与网络": { + "message": "Security and networking" + }, + "管理连接认证和网络访问方式": { + "message": "Manage connection auth and network access methods" + }, + "围绕 SSH 连接所需的凭据、主机校验、一次性口令、代理和端口转发提供统一配置入口。": { + "message": "Provides a unified place to configure credentials, host verification, one-time passwords, proxies, and port forwarding for SSH connections." + }, + "保存密码、私钥和 known hosts,并使用本地加密存储": { + "message": "Store passwords, private keys, and known hosts with local encryption" + }, + "支持 TOTP / HOTP、二维码导入和 SSH 登录自动填充": { + "message": "Supports TOTP / HOTP, QR code import, and SSH login autofill" + }, + "配置代理、跳板机、本地转发、远程转发和动态转发": { + "message": "Configure proxies, jump hosts, local forwarding, remote forwarding, and dynamic forwarding" + }, + "同步与备份": { + "message": "Sync and backup" + }, + "同步和恢复可移植配置": { + "message": "Sync and restore portable configuration" + }, + "Dragonfly 可将连接、凭据配置和常用设置打包为加密快照,用于备份、迁移或在多台设备之间同步。": { + "message": "Dragonfly can package connections, credential settings, and common preferences into encrypted snapshots for backup, migration, or sync across devices." + }, + "支持 WebDAV 和 S3 兼容存储": { + "message": "Supports WebDAV and S3-compatible storage" + }, + "使用主密码保护同步和备份数据": { + "message": "Protect sync and backup data with a master password" + }, + "支持 `.dgfy` 导入导出,并处理远端与本地版本冲突": { + "message": "Supports `.dgfy` import/export and handles version conflicts between remote and local data" + }, + "支持 SSH、串口、本地 shell、SFTP 和配置备份的桌面终端客户端": { + "message": "A desktop terminal client for SSH, serial, local shell, SFTP, and configuration backups" + }, + "更新日志": { + "message": "Changelog" + }, + "查看 Dragonfly 的版本演进与功能更新记录": { + "message": "View Dragonfly's release history and feature updates" + }, + "项目日志与版本演进": { + "message": "Project changelog and release evolution" } } diff --git a/docs-site/i18n/en/docusaurus-theme-classic/navbar.json b/docs-site/i18n/en/docusaurus-theme-classic/navbar.json index 08d7f4b7..e2c9f680 100644 --- a/docs-site/i18n/en/docusaurus-theme-classic/navbar.json +++ b/docs-site/i18n/en/docusaurus-theme-classic/navbar.json @@ -5,9 +5,15 @@ "logo.alt": { "message": "Dragonfly Logo" }, + "item.label.功能": { + "message": "Features" + }, "item.label.文档": { "message": "Docs" }, + "item.label.日志": { + "message": "Changelog" + }, "item.label.GitHub": { "message": "GitHub" } diff --git a/docs-site/package.json b/docs-site/package.json index 2192feca..38b29e1a 100644 --- a/docs-site/package.json +++ b/docs-site/package.json @@ -16,8 +16,8 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^3.7.0", - "@docusaurus/preset-classic": "^3.7.0", + "@docusaurus/core": "^3.10.0", + "@docusaurus/preset-classic": "^3.10.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.1.1", "prism-react-renderer": "^2.4.1", @@ -25,13 +25,21 @@ "react-dom": "^18.3.1" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.7.0", - "@docusaurus/types": "^3.7.0", + "@docusaurus/module-type-aliases": "^3.10.0", + "@docusaurus/types": "^3.10.0", "typescript": "~5.6.0" }, "browserslist": { - "production": [">0.5%", "not dead", "not op_mini all"], - "development": ["last 3 chrome version", "last 3 firefox version", "last 5 safari version"] + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] }, "engines": { "node": ">=18.0" diff --git a/docs-site/pnpm-lock.yaml b/docs-site/pnpm-lock.yaml index ed4e35be..4f2efcee 100644 --- a/docs-site/pnpm-lock.yaml +++ b/docs-site/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@docusaurus/core': - specifier: ^3.7.0 - version: 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + specifier: ^3.10.0 + version: 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) '@docusaurus/preset-classic': - specifier: ^3.7.0 - version: 3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3) + specifier: ^3.10.0 + version: 3.10.0(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3) '@mdx-js/react': specifier: ^3.0.0 version: 3.1.1(@types/react@19.2.14)(react@18.3.1) @@ -31,11 +31,11 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@docusaurus/module-type-aliases': - specifier: ^3.7.0 - version: 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.10.0 + version: 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@docusaurus/types': - specifier: ^3.7.0 - version: 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^3.10.0 + version: 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) typescript: specifier: ~5.6.0 version: 5.6.3 @@ -665,10 +665,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.29.2': - resolution: {integrity: sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -1027,12 +1023,12 @@ packages: search-insights: optional: true - '@docusaurus/babel@3.9.2': - resolution: {integrity: sha512-GEANdi/SgER+L7Japs25YiGil/AUDnFFHaCGPBbundxoWtCkA2lmy7/tFmgED4y1htAy6Oi4wkJEQdGssnw9MA==} + '@docusaurus/babel@3.10.0': + resolution: {integrity: sha512-mqCJhCZNZUDg0zgDEaPTM4DnRsisa24HdqTy/qn/MQlbwhTb4WVaZg6ZyX6yIVKqTz8fS1hBMgM+98z+BeJJDg==} engines: {node: '>=20.0'} - '@docusaurus/bundler@3.9.2': - resolution: {integrity: sha512-ZOVi6GYgTcsZcUzjblpzk3wH1Fya2VNpd5jtHoCCFcJlMQ1EYXZetfAnRHLcyiFeBABaI1ltTYbOBtH/gahGVA==} + '@docusaurus/bundler@3.10.0': + resolution: {integrity: sha512-iONUGZGgp+lAkw/cJZH6irONcF4p8+278IsdRlq8lYhxGjkoNUs0w7F4gVXBYSNChq5KG5/JleTSsdJySShxow==} engines: {node: '>=20.0'} peerDependencies: '@docusaurus/faster': '*' @@ -1040,106 +1036,110 @@ packages: '@docusaurus/faster': optional: true - '@docusaurus/core@3.9.2': - resolution: {integrity: sha512-HbjwKeC+pHUFBfLMNzuSjqFE/58+rLVKmOU3lxQrpsxLBOGosYco/Q0GduBb0/jEMRiyEqjNT/01rRdOMWq5pw==} + '@docusaurus/core@3.10.0': + resolution: {integrity: sha512-mgLdQsO8xppnQZc3LPi+Mf+PkPeyxJeIx11AXAq/14fsaMefInQiMEZUUmrc7J+956G/f7MwE7tn8KZgi3iRcA==} engines: {node: '>=20.0'} hasBin: true peerDependencies: + '@docusaurus/faster': '*' '@mdx-js/react': ^3.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@docusaurus/faster': + optional: true - '@docusaurus/cssnano-preset@3.9.2': - resolution: {integrity: sha512-8gBKup94aGttRduABsj7bpPFTX7kbwu+xh3K9NMCF5K4bWBqTFYW+REKHF6iBVDHRJ4grZdIPbvkiHd/XNKRMQ==} + '@docusaurus/cssnano-preset@3.10.0': + resolution: {integrity: sha512-qzSshTO1DB3TYW+dPUal5KHM7XPc5YQfzF3Kdb2NDACJUyGbNcFtw3tGkCJlYwhNCRKbZcmwraKUS1i5dcHdGg==} engines: {node: '>=20.0'} - '@docusaurus/logger@3.9.2': - resolution: {integrity: sha512-/SVCc57ByARzGSU60c50rMyQlBuMIJCjcsJlkphxY6B0GV4UH3tcA1994N8fFfbJ9kX3jIBe/xg3XP5qBtGDbA==} + '@docusaurus/logger@3.10.0': + resolution: {integrity: sha512-9jrZzFuBH1LDRlZ7cznAhCLmAZ3HSDqgwdrSSZdGHq9SPUOQgXXu8mnxe2ZRB9NS1PCpMTIOVUqDtZPIhMafZg==} engines: {node: '>=20.0'} - '@docusaurus/mdx-loader@3.9.2': - resolution: {integrity: sha512-wiYoGwF9gdd6rev62xDU8AAM8JuLI/hlwOtCzMmYcspEkzecKrP8J8X+KpYnTlACBUUtXNJpSoCwFWJhLRevzQ==} + '@docusaurus/mdx-loader@3.10.0': + resolution: {integrity: sha512-mQQV97080AH4PYNs087l202NMDqRopZA4mg5W76ZZyTFrmWhJ3mHg+8A+drJVENxw5/Q+wHMHLgsx+9z1nEs0A==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/module-type-aliases@3.9.2': - resolution: {integrity: sha512-8qVe2QA9hVLzvnxP46ysuofJUIc/yYQ82tvA/rBTrnpXtCjNSFLxEZfd5U8cYZuJIVlkPxamsIgwd5tGZXfvew==} + '@docusaurus/module-type-aliases@3.10.0': + resolution: {integrity: sha512-/1O0Zg8w3DFrYX/I6Fbss7OJrtZw1QoyjDhegiFNHVi9A9Y0gQ3jUAytVxF6ywpAWpLyLxch8nN8H/V3XfzdJQ==} peerDependencies: react: '*' react-dom: '*' - '@docusaurus/plugin-content-blog@3.9.2': - resolution: {integrity: sha512-3I2HXy3L1QcjLJLGAoTvoBnpOwa6DPUa3Q0dMK19UTY9mhPkKQg/DYhAGTiBUKcTR0f08iw7kLPqOhIgdV3eVQ==} + '@docusaurus/plugin-content-blog@3.10.0': + resolution: {integrity: sha512-RuTz68DhB7CL96QO5UsFbciD7GPYq6QV+YMfF9V0+N4ZgLhJIBgpVAr8GobrKF6NRe5cyWWETU5z5T834piG9g==} engines: {node: '>=20.0'} peerDependencies: '@docusaurus/plugin-content-docs': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-content-docs@3.9.2': - resolution: {integrity: sha512-C5wZsGuKTY8jEYsqdxhhFOe1ZDjH0uIYJ9T/jebHwkyxqnr4wW0jTkB72OMqNjsoQRcb0JN3PcSeTwFlVgzCZg==} + '@docusaurus/plugin-content-docs@3.10.0': + resolution: {integrity: sha512-9BjHhf15ct8Z7TThTC0xRndKDVvMKmVsAGAN7W9FpNRzfMdScOGcXtLmcCWtJGvAezjOJIm6CxOYCy3Io5+RnQ==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-content-pages@3.9.2': - resolution: {integrity: sha512-s4849w/p4noXUrGpPUF0BPqIAfdAe76BLaRGAGKZ1gTDNiGxGcpsLcwJ9OTi1/V8A+AzvsmI9pkjie2zjIQZKA==} + '@docusaurus/plugin-content-pages@3.10.0': + resolution: {integrity: sha512-5amX8kEJI+nIGtuLVjYk59Y5utEJ3CHETFOPEE4cooIRLA4xM4iBsA6zFgu4ljcopeYwvBzFEWf5g2I6Yb9SkA==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-css-cascade-layers@3.9.2': - resolution: {integrity: sha512-w1s3+Ss+eOQbscGM4cfIFBlVg/QKxyYgj26k5AnakuHkKxH6004ZtuLe5awMBotIYF2bbGDoDhpgQ4r/kcj4rQ==} + '@docusaurus/plugin-css-cascade-layers@3.10.0': + resolution: {integrity: sha512-6q1vtt5FJcg5osgkHeM1euErECNqEZ5Z1j69yiNx2luEBIso+nxCkS9nqj8w+MK5X7rvKEToGhFfOFWncs51pQ==} engines: {node: '>=20.0'} - '@docusaurus/plugin-debug@3.9.2': - resolution: {integrity: sha512-j7a5hWuAFxyQAkilZwhsQ/b3T7FfHZ+0dub6j/GxKNFJp2h9qk/P1Bp7vrGASnvA9KNQBBL1ZXTe7jlh4VdPdA==} + '@docusaurus/plugin-debug@3.10.0': + resolution: {integrity: sha512-XcljKN+G+nmmK69uQA1d9BlYU3ZftG3T3zpK8/7Hf/wrOlV7TA4Ampdrdwkg0jElKdKAoSnPhCO0/U3bQGsVQQ==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-analytics@3.9.2': - resolution: {integrity: sha512-mAwwQJ1Us9jL/lVjXtErXto4p4/iaLlweC54yDUK1a97WfkC6Z2k5/769JsFgwOwOP+n5mUQGACXOEQ0XDuVUw==} + '@docusaurus/plugin-google-analytics@3.10.0': + resolution: {integrity: sha512-hTEoodatpBZnUat5nFExbuTGA1lhWGy7vZGuTew5Q3QDtGKFpSJLYmZJhdTjvCFwv1+qQ67hgAVlKdJOB8TXow==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-gtag@3.9.2': - resolution: {integrity: sha512-YJ4lDCphabBtw19ooSlc1MnxtYGpjFV9rEdzjLsUnBCeis2djUyCozZaFhCg6NGEwOn7HDDyMh0yzcdRpnuIvA==} + '@docusaurus/plugin-google-gtag@3.10.0': + resolution: {integrity: sha512-iB/Zzjv/eelJRbdULZqzWCbgMgJ7ht4ONVjXtN3+BI/muil6S87gQ1OJyPwlXD+ELdKkitC7bWv5eJdYOZLhrQ==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-google-tag-manager@3.9.2': - resolution: {integrity: sha512-LJtIrkZN/tuHD8NqDAW1Tnw0ekOwRTfobWPsdO15YxcicBo2ykKF0/D6n0vVBfd3srwr9Z6rzrIWYrMzBGrvNw==} + '@docusaurus/plugin-google-tag-manager@3.10.0': + resolution: {integrity: sha512-FEjZxqKgLHa+Wez/EgKxRwvArNCWIScfyEQD95rot7jkxp6nonjI5XIbGfO/iYhM5Qinwe8aIEQHP2KZtpqVuA==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-sitemap@3.9.2': - resolution: {integrity: sha512-WLh7ymgDXjG8oPoM/T4/zUP7KcSuFYRZAUTl8vR6VzYkfc18GBM4xLhcT+AKOwun6kBivYKUJf+vlqYJkm+RHw==} + '@docusaurus/plugin-sitemap@3.10.0': + resolution: {integrity: sha512-DVTSLjB97hIjmayGnGcBfognCeI7ZuUKgEnU7Oz81JYqXtVg94mVTthDjq3QHTylYNeCUbkaW8VF0FDLcc8pPw==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/plugin-svgr@3.9.2': - resolution: {integrity: sha512-n+1DE+5b3Lnf27TgVU5jM1d4x5tUh2oW5LTsBxJX4PsAPV0JGcmI6p3yLYtEY0LRVEIJh+8RsdQmRE66wSV8mw==} + '@docusaurus/plugin-svgr@3.10.0': + resolution: {integrity: sha512-lNljBESaETZqVBMPqkrGchr+UPT1eZzEPLmJhz8I76BxbjqgsUnRvrq6lQJ9sYjgmgX52KB7kkgczqd2yzoswQ==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/preset-classic@3.9.2': - resolution: {integrity: sha512-IgyYO2Gvaigi21LuDIe+nvmN/dfGXAiMcV/murFqcpjnZc7jxFAxW+9LEjdPt61uZLxG4ByW/oUmX/DDK9t/8w==} + '@docusaurus/preset-classic@3.10.0': + resolution: {integrity: sha512-kw/Ye02Hc6xP1OdTswy8yxQEHg0fdPpyWAQRxr5b2x3h7LlG2Zgbb5BDFROnXDDMpUxB7YejlocJIE5HIEfpNA==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 @@ -1150,48 +1150,48 @@ packages: peerDependencies: react: '*' - '@docusaurus/theme-classic@3.9.2': - resolution: {integrity: sha512-IGUsArG5hhekXd7RDb11v94ycpJpFdJPkLnt10fFQWOVxAtq5/D7hT6lzc2fhyQKaaCE62qVajOMKL7OiAFAIA==} + '@docusaurus/theme-classic@3.10.0': + resolution: {integrity: sha512-9msCAsRdN+UG+RwPwCFb0uKy4tGoPh5YfBozXeGUtIeAgsMdn6f3G/oY861luZ3t8S2ET8S9Y/1GnpJAGWytww==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-common@3.9.2': - resolution: {integrity: sha512-6c4DAbR6n6nPbnZhY2V3tzpnKnGL+6aOsLvFL26VRqhlczli9eWG0VDUNoCQEPnGwDMhPS42UhSAnz5pThm5Ag==} + '@docusaurus/theme-common@3.10.0': + resolution: {integrity: sha512-Dkp1YXKn16ByCJAdIjbDIOpVb4Z66MsVD694/ilX1vAAHaVEMrVsf/NPd9VgreyFx08rJ9GqV1MtzsbTcU73Kg==} engines: {node: '>=20.0'} peerDependencies: '@docusaurus/plugin-content-docs': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-search-algolia@3.9.2': - resolution: {integrity: sha512-GBDSFNwjnh5/LdkxCKQHkgO2pIMX1447BxYUBG2wBiajS21uj64a+gH/qlbQjDLxmGrbrllBrtJkUHxIsiwRnw==} + '@docusaurus/theme-search-algolia@3.10.0': + resolution: {integrity: sha512-f5FPKI08e3JRG63vR/o4qeuUVHUHzFzM0nnF+AkB67soAZgNsKJRf2qmUZvlQkGwlV+QFkKe4D0ANMh1jToU3g==} engines: {node: '>=20.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/theme-translations@3.9.2': - resolution: {integrity: sha512-vIryvpP18ON9T9rjgMRFLr2xJVDpw1rtagEGf8Ccce4CkTrvM/fRB8N2nyWYOW5u3DdjkwKw5fBa+3tbn9P4PA==} + '@docusaurus/theme-translations@3.10.0': + resolution: {integrity: sha512-L9IbFLwTc5+XdgH45iQYufLn0SVZd6BUNelDbKIFlH+E4hhjuj/XHWAFMX/w2K59rfy8wak9McOaei7BSUfRPA==} engines: {node: '>=20.0'} - '@docusaurus/types@3.9.2': - resolution: {integrity: sha512-Ux1JUNswg+EfUEmajJjyhIohKceitY/yzjRUpu04WXgvVz+fbhVC0p+R0JhvEu4ytw8zIAys2hrdpQPBHRIa8Q==} + '@docusaurus/types@3.10.0': + resolution: {integrity: sha512-F0dOt3FOoO20rRaFK7whGFQZ3ggyrWEdQc/c8/UiRuzhtg4y1w9FspXH5zpCT07uMnJKBPGh+qNazbNlCQqvSw==} peerDependencies: react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 - '@docusaurus/utils-common@3.9.2': - resolution: {integrity: sha512-I53UC1QctruA6SWLvbjbhCpAw7+X7PePoe5pYcwTOEXD/PxeP8LnECAhTHHwWCblyUX5bMi4QLRkxvyZ+IT8Aw==} + '@docusaurus/utils-common@3.10.0': + resolution: {integrity: sha512-JyL7sb9QVDgYvudIS81Dv0lsWm7le0vGZSDwsztxWam1SPBqrnkvBy9UYL/amh6pbybkyYTd3CMTkO24oMlCSw==} engines: {node: '>=20.0'} - '@docusaurus/utils-validation@3.9.2': - resolution: {integrity: sha512-l7yk3X5VnNmATbwijJkexdhulNsQaNDwoagiwujXoxFbWLcxHQqNQ+c/IAlzrfMMOfa/8xSBZ7KEKDesE/2J7A==} + '@docusaurus/utils-validation@3.10.0': + resolution: {integrity: sha512-c+6n2+ZPOJtWWc8Bb/EYdpSDfjYEScdCu9fB/SNjOmSCf1IdVnGf2T53o0tsz0gDRtCL90tifTL0JE/oMuP1Mw==} engines: {node: '>=20.0'} - '@docusaurus/utils@3.9.2': - resolution: {integrity: sha512-lBSBiRruFurFKXr5Hbsl2thmGweAPmddhF3jb99U4EMDA5L+e5Y1rAkOS07Nvrup7HUMBDrCV45meaxZnt28nQ==} + '@docusaurus/utils@3.10.0': + resolution: {integrity: sha512-T3B0WTigsIthe0D4LQa2k+7bJY+c3WS+Wq2JhcznOSpn1lSN64yNtHQXboCj3QnUs1EuAZszQG1SHKu5w5ZrlA==} engines: {node: '>=20.0'} '@hapi/hoek@9.3.0': @@ -1568,8 +1568,8 @@ packages: '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} - '@types/gtag.js@0.0.12': - resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} + '@types/gtag.js@0.0.20': + resolution: {integrity: sha512-wwAbk3SA2QeU67unN7zPxjEHmPmlXwZXZvQEpbEUQuMCRGgKyE1m6XDuTUA9b6pCGb/GqJmdfMOY5LuDjJSbbg==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -2162,6 +2162,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + copy-text-to-clipboard@3.2.2: + resolution: {integrity: sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A==} + engines: {node: '>=12'} + copy-webpack-plugin@11.0.0: resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} @@ -2171,9 +2175,6 @@ packages: core-js-compat@3.49.0: resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} - core-js-pure@3.49.0: - resolution: {integrity: sha512-XM4RFka59xATyJv/cS3O3Kml72hQXUeGRuuTmMYFxwzc9/7C8OYTaIR/Ji+Yt8DXzsFLNhat15cE/JP15HrCgw==} - core-js@3.49.0: resolution: {integrity: sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==} @@ -4242,8 +4243,8 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 - react-loadable-ssr-addon-v5-slorber@1.0.1: - resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} + react-loadable-ssr-addon-v5-slorber@1.0.3: + resolution: {integrity: sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ==} engines: {node: '>=10.13.0'} peerDependencies: react-loadable: '*' @@ -5876,10 +5877,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/runtime-corejs3@7.29.2': - dependencies: - core-js-pure: 3.49.0 - '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': @@ -6241,7 +6238,7 @@ snapshots: - '@algolia/client-search' - algoliasearch - '@docusaurus/babel@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/babel@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 @@ -6251,10 +6248,9 @@ snapshots: '@babel/preset-react': 7.28.5(@babel/core@7.29.0) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) '@babel/runtime': 7.29.2 - '@babel/runtime-corejs3': 7.29.2 '@babel/traverse': 7.29.0 - '@docusaurus/logger': 3.9.2 - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/logger': 3.10.0 + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) babel-plugin-dynamic-import-node: 2.3.3 fs-extra: 11.3.4 tslib: 2.8.1 @@ -6267,14 +6263,14 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/bundler@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: '@babel/core': 7.29.0 - '@docusaurus/babel': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/cssnano-preset': 3.9.2 - '@docusaurus/logger': 3.9.2 - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/babel': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/cssnano-preset': 3.10.0 + '@docusaurus/logger': 3.10.0 + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) babel-loader: 9.2.1(@babel/core@7.29.0)(webpack@5.105.4) clean-css: 5.3.3 copy-webpack-plugin: 11.0.0(webpack@5.105.4) @@ -6308,15 +6304,15 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/core@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/babel': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/bundler': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/logger': 3.9.2 - '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/babel': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/bundler': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/logger': 3.10.0 + '@docusaurus/mdx-loader': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@18.3.1) boxen: 6.2.1 chalk: 4.1.2 @@ -6342,7 +6338,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)' react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.4) + react-loadable-ssr-addon-v5-slorber: 1.0.3(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.4) react-router: 5.3.4(react@18.3.1) react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1) react-router-dom: 5.3.4(react@18.3.1) @@ -6356,7 +6352,6 @@ snapshots: webpack-dev-server: 5.2.3(tslib@2.8.1)(webpack@5.105.4) webpack-merge: 6.0.1 transitivePeerDependencies: - - '@docusaurus/faster' - '@parcel/css' - '@rspack/core' - '@swc/core' @@ -6372,23 +6367,23 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/cssnano-preset@3.9.2': + '@docusaurus/cssnano-preset@3.10.0': dependencies: cssnano-preset-advanced: 6.1.2(postcss@8.5.8) postcss: 8.5.8 postcss-sort-media-queries: 5.2.0(postcss@8.5.8) tslib: 2.8.1 - '@docusaurus/logger@3.9.2': + '@docusaurus/logger@3.10.0': dependencies: chalk: 4.1.2 tslib: 2.8.1 - '@docusaurus/mdx-loader@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/mdx-loader@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/logger': 3.9.2 - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/logger': 3.10.0 + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/mdx': 3.1.1 '@slorber/remark-comment': 1.0.0 escape-html: 1.0.3 @@ -6419,9 +6414,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/module-type-aliases@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/module-type-aliases@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 19.2.14 '@types/react-router-config': 5.0.11 @@ -6437,18 +6432,19 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-content-blog@3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/logger': 3.9.2 - '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/logger': 3.10.0 + '@docusaurus/mdx-loader': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) cheerio: 1.0.0-rc.12 + combine-promises: 1.2.0 feed: 4.2.2 fs-extra: 11.3.4 lodash: 4.17.23 @@ -6478,17 +6474,17 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/logger': 3.9.2 - '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/logger': 3.10.0 + '@docusaurus/mdx-loader': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/module-type-aliases': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-common': 3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/react-router-config': 5.0.11 combine-promises: 1.2.0 fs-extra: 11.3.4 @@ -6518,13 +6514,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-content-pages@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/mdx-loader': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6548,12 +6544,12 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-css-cascade-layers@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: 2.8.1 transitivePeerDependencies: - '@docusaurus/faster' @@ -6575,11 +6571,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-debug@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6603,11 +6599,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-google-analytics@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -6629,12 +6625,12 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-google-gtag@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@types/gtag.js': 0.0.12 + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/gtag.js': 0.0.20 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -6656,11 +6652,11 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-google-tag-manager@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) tslib: 2.8.1 @@ -6682,14 +6678,14 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-sitemap@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/logger': 3.9.2 - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/logger': 3.10.0 + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.4 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -6713,12 +6709,12 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/plugin-svgr@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@svgr/core': 8.1.0(typescript@5.6.3) '@svgr/webpack': 8.1.0(typescript@5.6.3) react: 18.3.1 @@ -6743,23 +6739,23 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)': + '@docusaurus/preset-classic@3.10.0(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-css-cascade-layers': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-debug': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-google-analytics': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-google-gtag': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-google-tag-manager': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-sitemap': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-svgr': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-classic': 3.9.2(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-search-algolia': 3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3) - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-blog': 3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-css-cascade-layers': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-debug': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-google-analytics': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-google-gtag': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-google-tag-manager': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-sitemap': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-svgr': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-classic': 3.10.0(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-search-algolia': 3.10.0(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -6788,23 +6784,24 @@ snapshots: '@types/react': 19.2.14 react: 18.3.1 - '@docusaurus/theme-classic@3.9.2(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': + '@docusaurus/theme-classic@3.10.0(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)': dependencies: - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/logger': 3.9.2 - '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-blog': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/plugin-content-pages': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-translations': 3.9.2 - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/logger': 3.10.0 + '@docusaurus/mdx-loader': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/module-type-aliases': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-blog': 3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-docs': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/plugin-content-pages': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-translations': 3.10.0 + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@18.3.1) clsx: 2.1.1 + copy-text-to-clipboard: 3.2.2 infima: 0.2.0-alpha.45 lodash: 4.17.23 nprogress: 0.2.0 @@ -6835,13 +6832,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/theme-common@3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/mdx-loader': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/module-type-aliases': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/mdx-loader': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/module-type-aliases': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/plugin-content-docs': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/history': 4.7.11 '@types/react': 19.2.14 '@types/react-router-config': 5.0.11 @@ -6859,16 +6856,17 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.9.2(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)': + '@docusaurus/theme-search-algolia@3.10.0(@algolia/client-search@5.49.2)(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)': dependencies: + '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.49.2)(algoliasearch@5.49.2)(search-insights@2.17.3) '@docsearch/react': 4.6.0(@algolia/client-search@5.49.2)(@types/react@19.2.14)(algoliasearch@5.49.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3) - '@docusaurus/core': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/logger': 3.9.2 - '@docusaurus/plugin-content-docs': 3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) - '@docusaurus/theme-common': 3.9.2(@docusaurus/plugin-content-docs@3.9.2(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/theme-translations': 3.9.2 - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-validation': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/core': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/logger': 3.10.0 + '@docusaurus/plugin-content-docs': 3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3) + '@docusaurus/theme-common': 3.10.0(@docusaurus/plugin-content-docs@3.10.0(@mdx-js/react@3.1.1(@types/react@19.2.14)(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/theme-translations': 3.10.0 + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-validation': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) algoliasearch: 5.49.2 algoliasearch-helper: 3.28.0(algoliasearch@5.49.2) clsx: 2.1.1 @@ -6900,12 +6898,12 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-translations@3.9.2': + '@docusaurus/theme-translations@3.10.0': dependencies: fs-extra: 11.3.4 tslib: 2.8.1 - '@docusaurus/types@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/types@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@mdx-js/mdx': 3.1.1 '@types/history': 4.7.11 @@ -6926,9 +6924,9 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-common@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/utils-common@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) tslib: 2.8.1 transitivePeerDependencies: - '@swc/core' @@ -6939,11 +6937,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils-validation@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/utils-validation@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/logger': 3.9.2 - '@docusaurus/utils': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/logger': 3.10.0 + '@docusaurus/utils': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) fs-extra: 11.3.4 joi: 17.13.3 js-yaml: 4.1.1 @@ -6958,11 +6956,11 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/utils@3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@docusaurus/utils@3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@docusaurus/logger': 3.9.2 - '@docusaurus/types': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@docusaurus/utils-common': 3.9.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/logger': 3.10.0 + '@docusaurus/types': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@docusaurus/utils-common': 3.10.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) escape-string-regexp: 4.0.0 execa: 5.1.1 file-loader: 6.2.0(webpack@5.105.4) @@ -7495,7 +7493,7 @@ snapshots: '@types/qs': 6.15.0 '@types/serve-static': 1.15.10 - '@types/gtag.js@0.0.12': {} + '@types/gtag.js@0.0.20': {} '@types/hast@3.0.4': dependencies: @@ -7572,7 +7570,7 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 17.0.45 + '@types/node': 25.5.0 '@types/send@0.17.6': dependencies: @@ -8154,6 +8152,8 @@ snapshots: cookie@0.7.2: {} + copy-text-to-clipboard@3.2.2: {} + copy-webpack-plugin@11.0.0(webpack@5.105.4): dependencies: fast-glob: 3.3.3 @@ -8168,8 +8168,6 @@ snapshots: dependencies: browserslist: 4.28.1 - core-js-pure@3.49.0: {} - core-js@3.49.0: {} core-util-is@1.0.3: {} @@ -10636,7 +10634,7 @@ snapshots: dependencies: react: 18.3.1 - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.4): + react-loadable-ssr-addon-v5-slorber@1.0.3(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.105.4): dependencies: '@babel/runtime': 7.29.2 react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' diff --git a/docs-site/src/css/custom.css b/docs-site/src/css/custom.css index e94c4c9c..0a697772 100644 --- a/docs-site/src/css/custom.css +++ b/docs-site/src/css/custom.css @@ -18,20 +18,27 @@ } [data-theme='dark'] { - --ifm-color-primary: #60a5fa; - --ifm-color-primary-dark: #3b82f6; - --ifm-color-primary-darker: #2563eb; - --ifm-color-primary-darkest: #1d4ed8; - --ifm-color-primary-light: #93bbfd; - --ifm-color-primary-lighter: #bfdbfe; - --ifm-color-primary-lightest: #dbeafe; - --ifm-background-color: #0b1120; - --ifm-background-surface-color: #0f172a; - --ifm-footer-background-color: #070d1a; - --ifm-footer-color: #64748b; - --ifm-footer-link-color: #94a3b8; - --ifm-footer-title-color: #e2e8f0; - --docusaurus-highlighted-code-line-bg: rgba(96, 165, 250, 0.1); + --ifm-color-primary: #7db7ff; + --ifm-color-primary-dark: #5f9ff1; + --ifm-color-primary-darker: #4b8ee1; + --ifm-color-primary-darkest: #3975bd; + --ifm-color-primary-light: #a8ceff; + --ifm-color-primary-lighter: #c7ddff; + --ifm-color-primary-lightest: #e5f0ff; + --ifm-background-color: #11151c; + --ifm-background-surface-color: #171c24; + --ifm-color-emphasis-100: #1b2028; + --ifm-color-emphasis-200: #252b35; + --ifm-color-emphasis-300: #343c49; + --ifm-color-emphasis-700: #b7c0ce; + --ifm-color-emphasis-800: #d2d8e2; + --ifm-heading-color: #f4f7fb; + --ifm-toc-border-color: rgba(134, 148, 168, 0.22); + --ifm-footer-background-color: #0f131a; + --ifm-footer-color: #8d97a6; + --ifm-footer-link-color: #c3cad5; + --ifm-footer-title-color: #f1f5f9; + --docusaurus-highlighted-code-line-bg: rgba(125, 183, 255, 0.12); } /* Smooth transitions for theme switch */ @@ -46,8 +53,48 @@ html { border-bottom: 1px solid var(--ifm-toc-border-color); } +.navbar__inner { + position: relative; + gap: 1rem; +} + +.navbar__items--left { + flex: 0 0 auto; +} + +.navbar__center-link { + position: absolute; + top: 50%; + font-weight: 600; + transform: translate(-50%, -50%); +} + +.navbar__center-link--features { + left: calc(50% - 4rem); +} + +.navbar__center-link--docs { + left: 50%; +} + +.navbar__center-link--changelog { + left: calc(50% + 4rem); +} + +.navbar__items--right { + flex: 1; + justify-content: flex-end; +} + [data-theme='dark'] .navbar { - background: rgba(11, 17, 32, 0.85); + background: rgba(17, 21, 28, 0.88); +} + +@media (max-width: 996px) { + .navbar__center-link { + position: static; + transform: none; + } } /* Sidebar refinement */ @@ -57,5 +104,5 @@ html { /* Footer refinement */ .footer--dark { - --ifm-footer-background-color: #070d1a; + --ifm-footer-background-color: #0f131a; } diff --git a/docs-site/src/data/changelogData.ts b/docs-site/src/data/changelogData.ts new file mode 100644 index 00000000..543839a0 --- /dev/null +++ b/docs-site/src/data/changelogData.ts @@ -0,0 +1,1383 @@ +export type ChangelogSection = { + title: string; + items: string[]; +}; + +export type ChangelogRelease = { + version: string; + sections: ChangelogSection[]; +}; + +const changelogReleasesEn: ChangelogRelease[] = [ + { + version: '[0.8.2] - 2026-04-23', + sections: [ + { + title: 'Added', + items: [ + '**tauri:** Add Windows configuration file and remove unused dragDropEnabled property.', + '**file-transfer:** Enhance file transfer handling to support directories, including progress tracking and UI updates for directory transfers.', + '**session-management:** Implement session-specific command history management, including fetching, listening, and clearing command history for improved user experience.', + ], + }, + { + title: 'Changed', + items: [ + '**i18n:** Add new file transfer messages for progress tracking and completion in English and Chinese locales.', + '**header:** Update window control buttons with new icons and improved styling for better user experience.', + ], + }, + { + title: 'Fixed', + items: ['**saved-connections:** Implement drag-and-drop support for connection and group items, enhancing user interaction and organization.'], + }, + { + title: 'Performance', + items: ['**file-explorer:** Enhance FileExplorer component with memoization and scroll handling for improved performance and user experience.'], + }, + { + title: 'Documentation', + items: [ + 'Update README and guides to include new features such as Windows drag-and-drop support, enhanced file transfer capabilities, and diagnostics settings for improved user experience.', + '**file-transfer:** Refine drag-and-drop upload section for clarity and consistency across languages.', + ], + }, + ], + }, + { + version: '[0.8.1] - 2026-04-23', + sections: [ + { + title: 'Added', + items: [ + '**interaction:** Add command suggestion min character limit settings and normalization logic for enhanced user control.', + '**file-explorer:** Implement external file drop support on Windows using WebView2 for enhanced drag-and-drop functionality.', + ], + }, + { + title: 'Changed', + items: [ + '**i18n:** Add command suggestions min character limit settings to English and Chinese locales for enhanced user control.', + '**file-transfer:** Optimize visibleTransfers calculation using useMemo for improved performance and sorting.', + '**terminal:** Replace useApp with useTerminalAppSettings for improved settings management and consistency across terminal components.', + '**sync-backup:** Update button size from icon-xs to icon-sm for improved UI consistency.', + '**i18n:** Add external drop support messages for English and Chinese locales to improve user guidance during file uploads.', + ], + }, + { + title: 'Documentation', + items: ['Enhance documentation with new features including session import/export, diagnostics, and tray support for improved user experience and clarity.'], + }, + ], + }, + { + version: '[0.8.0] - 2026-04-22', + sections: [ + { + title: 'Added', + items: [ + '**interaction:** Add command suggestion max character limit settings and normalization logic for improved user control over command suggestions.', + '**quit_confirmation:** Implement QuitConfirmDialog for user confirmation before application exit, enhancing user experience and preventing accidental closures.', + '**tray:** Implement tray functionality with window management and application quit command for enhanced user experience.', + ], + }, + { + title: 'Changed', + items: [ + '**i18n:** Add command suggestions max character limit settings to English and Chinese locales for improved user control.', + '**syncbackup:** Enhance SyncBackupHistoryPanel with new UI components, improved history summary logic, and additional filtering options for better user experience.', + '**i18n:** Add new history-related terms to English and Chinese locales for improved user experience and clarity.', + '**scrollbar:** Add transparent background for scrollbar corner to improve UI consistency.', + '**saved-connections:** Update layout and styling for improved responsiveness and visual consistency.', + '**settings:** Remove emit calls for settings changes in ChildAppProvider and SettingsPage to streamline event handling.', + ], + }, + ], + }, + { + version: '[0.7.9] - 2026-04-21', + sections: [ + { + title: 'Added', + items: [ + '**terminal:** Enhance terminal input handling by synchronizing input state from rendered lines and improving command processing logic.', + '**syncbackup:** Implement SyncBackup functionality with UI components for managing cloud sync settings and history, enhancing user experience for backup management.', + '**security:** Add master password management with dynamic state handling and improve input components for better user experience.', + '**syncbackup:** Add validation for S3 endpoint requirement and improve UI feedback for draft settings, enhancing user experience in cloud sync management.', + '**otp:** Integrate input-otp component for enhanced OTP input handling in OtpDialog, improving user experience with dynamic code length management.', + '**cloud_sync:** Enhance error handling for WebDAV authentication by adding specific messaging for 401 errors and improving storage error mapping.', + '**syncbackup:** Enhance SyncBackupHistoryPanel with filtering capabilities, improved state management, and UI updates for better user experience.', + ], + }, + { + title: 'Changed', + items: [ + '**terminal:** Remove unused input synchronization logic and streamline command sanitization process.', + '**terminal:** Rename command tracking function and enhance command registration logic for improved input handling.', + '**i18n:** Update English and Chinese locale files with new strings for sync and backup features, enhancing user interface and experience.', + '**settings:** Restructure settings page with categorized groups, improved scroll handling, and dynamic tab management for enhanced user experience.', + '**i18n:** Update zh-CN locale with new sync and backup history terms, enhance filtering options, and improve user prompts.', + ], + }, + { + title: 'Fixed', + items: ['**file-explorer:** Implement session caching for file explorer to maintain state across unmounts, enhancing user experience during navigation.'], + }, + { + title: 'Documentation', + items: ['Enhance documentation and UI for Sync & Backup features, including detailed guides, settings integration, and improved user experience for cross-device configuration and backup management.'], + }, + ], + }, + { + version: '[0.7.8] - 2026-04-21', + sections: [ + { + title: 'Added', + items: [ + '**shell:** Implement command sanitization for terminal input and add terminal command utility functions.', + '**session:** Refactor session input handling by introducing sendSessionInput function for improved command submission and preview management across components.', + '**logging:** Introduce console usage linting and enhance error logging structure across components for improved diagnostics.', + '**keywordhighlight:** Expand error and control flow patterns in keyword highlighting for enhanced diagnostics.', + '**quickcommands:** Implement QuickCommandsStore for managing quick commands with in-memory caching and persistence, enhancing command upsert and retrieval functionality.', + ], + }, + { + title: 'Changed', + items: ['**observability, watcher, auth:** Apply consistent formatting and indentation across multiple functions for improved code readability.'], + }, + { + title: 'Performance', + items: ['Optimize context providers by utilizing useMemo for context values in AppContext, ChildAppProvider, and TransferProvider.'], + }, + ], + }, + { + version: '[0.7.7] - 2026-04-15', + sections: [ + { + title: 'Added', + items: [ + 'Implement import/export configuration functionality with UI updates in ImportDialog and Header components.', + '**backup:** Add import/export functionality for configuration with encryption and rotation.', + '**connections:** Add OpenGroupConnectionsDialog component and enhance connection item interactions with selection and context menu options.', + '**panel:** Enhance QuickCommands component with improved search and category filtering UI.', + ], + }, + { + title: 'Changed', + items: [ + '**i18n:** Update English and Chinese translations for configuration import/export features and add new UI strings.', + '**panel:** Update ActiveSessions component with improved styling for search input and icon.', + '**panel:** Adjust width of dropdown menu in SavedConnections component for better UI consistency.', + ], + }, + ], + }, + { + version: '[0.7.6] - 2026-04-15', + sections: [ + { + title: 'Added', + items: [ + '**ssh:** Improve SSH authentication logging and add known host key verification.', + '**ssh:** Enhance SSH I/O loop with detailed exit status and signal logging.', + ], + }, + { + title: 'Changed', + items: ["Add 'des' crate dependency to Cargo.toml and update Cargo.lock."], + }, + { + title: 'Fixed', + items: ['Restore import of SessionOutputCoalescer in pty.rs for proper session output handling.'], + }, + { + title: 'Documentation', + items: [ + 'Update README with new features and enhancements including online search, translation, and improved SFTP file explorer.', + 'Enhance documentation with updates on terminal features, file transfer capabilities, and security enhancements including translation support and improved session management.', + ], + }, + ], + }, + { + version: '[0.7.5] - 2026-04-14', + sections: [ + { + title: 'Added', + items: [ + '**connection:** Enhance session connection handling with improved error recovery and connection editing prompts.', + '**ssh:** Enhance SSH form with password management and localization updates.', + ], + }, + ], + }, + { + version: '[0.7.4] - 2026-04-14', + sections: [ + { + title: 'Added', + items: [ + '**updater:** Implement update dialog and background update check functionality.', + '**header:** Enhance header component with update check functionality and new icons.', + '**terminal:** Add suspended state handling to terminal components and output coalescing for improved performance under load.', + ], + }, + { + title: 'Changed', + items: [ + 'Add @tauri-apps/plugin-process and @tauri-apps/plugin-updater dependencies to package.json and pnpm-lock.yaml.', + 'Clean up imports and improve formatting across multiple components for better readability.', + '**i18n:** Add updater localization for English and Chinese, including update status messages.', + '**i18n:** Add localization for large output protection messages in English and Chinese.', + ], + }, + ], + }, + { + version: '[0.7.3] - 2026-04-14', + sections: [ + { + title: 'Added', + items: [ + '**keywordhighlightpresets:** Expand success patterns to include additional keywords for improved matching.', + '**connection-management:** Implement error handling for connection failures, adding support for marking tabs and panes as failed while maintaining layout integrity.', + '**file-explorer:** Implement directory history management and enhance selection handling.', + '**file-transfer:** Add pause, resume, and cancel functionality for file transfers with updated context and UI components.', + ], + }, + { + title: 'Changed', + items: [ + '**i18n:** Add connection failure messages in English and Chinese localization.', + '**file-explorer:** Update selection handling methods and improve context menu interactions.', + '**i18n:** Update English and Chinese localization for file transfer actions including cancel, pause, resume, and delete.', + ], + }, + ], + }, + { + version: '[0.7.2] - 2026-04-14', + sections: [ + { + title: 'Added', + items: [ + '**interaction-settings:** Add command suggestions toggle to InteractionTab and integrate with app settings.', + '**logging:** Implement persistent logging for warn and error levels, add Tauri command to handle log writing.', + '**file-explorer:** Enhance keyboard interaction by adding delete functionality and focus management for the file list.', + '**sftp:** Enhance remote file operations with detailed logging and permission handling.', + ], + }, + { + title: 'Changed', + items: [ + '**file-explorer:** Replace invoke import with local library and add autoFocus to delete button for improved accessibility.', + '**file-explorer:** Replace invoke import with local library across multiple dialog components for consistency.', + '**i18n:** Add command suggestions localization in English and Chinese.', + ], + }, + { + title: 'Fixed', + items: ['**keywordhighlightpresets:** Update duration regex to include shorthand units for better matching.'], + }, + { + title: 'Documentation', + items: ['Update CLAUDE.md and README.md to clarify commands for building and serving the docs site, including locale-specific hot reload options.'], + }, + ], + }, + { + version: '[0.7.1] - 2026-04-13', + sections: [ + { + title: 'Added', + items: [ + '**clipboard:** Implement readClipboardText function and update terminal components to use it for clipboard access.', + '**demos:** Add various demo scripts for showcasing Dragonfly\'s terminal features, including action links, file watching, keyword highlighting, and structured output.', + '**activesessions:** Enhance ActiveSessions component with search functionality, session reconnect/disconnect actions, and improved UI for session display.', + '**file-explorer:** Refactor DeleteDialog to handle multiple file deletions and improve UI; update FileExplorer to support batch delete actions.', + '**resource-monitor:** Implement refresh button and improve stats fetching with async/await; add loading state management.', + '**modal-management:** Refactor modal child window handling to improve focus enforcement and state tracking; add reconnect and disconnect session functionality in ActiveSessions component.', + '**activesessions:** Simplify PanelHeader actions by removing unnecessary wrapper div for session count display.', + '**resource-monitor:** Enhance refresh button with tooltip and rename state variable for clarity.', + ], + }, + { + title: 'Changed', + items: ['**i18n:** Update zh-CN and en.json for activeSessions and file deletion messages.'], + }, + { + title: 'Documentation', + items: [ + 'Update README and user guides to enhance clarity on Dragonfly\'s features, session types, and terminal capabilities; add new sections for workspace layout, security, and network configurations.', + '**sidebars:** Update guide sections to include new topics on session types, layout, and authentication while reorganizing existing items for better clarity.', + ], + }, + ], + }, + { + version: '[0.7.0] - 2026-04-12', + sections: [ + { + title: 'Added', + items: [ + 'Enhance terminal workspace with new tab management and pane functionality.', + '**crypto:** Implement master password wrapping key cryptosystem.', + '**app:** Restore cryptographic master password state on app startup.', + '**config:** Introduce proxy_jump_id field and circular-dependency validation.', + '**ssh:** Implement multi-hop proxy jump routing via direct-tcpip channel.', + '**ui:** Integrate jump host configuration into SSH session dialog.', + '**shell:** Upgrade serial sender into unified shell command broadcaster.', + '**explorer:** Restrict file explorer to SSH sessions and show unsupported message.', + '**tabbar:** Add unread indicator with breathing animation and extend TabBarProps.', + '**unreadtracking:** Implement unread session output tracking and update TabWindowsWorkspace to display unread tab IDs.', + '**terminal:** Add TerminalGutter component for displaying line numbers and timestamps; update settings to disable action links by default.', + ], + }, + { + title: 'Changed', + items: [ + '**window:** Enable transparent window background in tauri config.', + '**ssh:** Reduce default keepalive interval from 60s to 3s.', + '**config:** Format ui configuration tuple structures.', + '**security:** Migrate lock_password to unified master_password definitions.', + '**ssh:** Decouple single session handle into multi-tiered SshConnectionHandles.', + '**panel:** Migrate QuickCommands and SerialSendPanel to panel module.', + '**ui:** Remove legacy fullscreen shortcuts and redundant menu entries.', + '**panel:** Adjust active sessions count indicator formatting.', + 'Commit remaining changes.', + '**keywordhighlight:** Update token boundary handling to remove conflicts.', + '**i18n:** Add line numbers and timestamps options to terminal settings.', + ], + }, + { + title: 'Fixed', + items: [ + '**otp:** Properly decode multi-byte utf-8 characters in url encoding.', + '**ssh:** Prevent prompt injection scripts from polluting shell history.', + '**session:** Silently ignore not-found error during session close.', + '**terminal:** Suppress errors when attaching to terminating sessions.', + '**terminal:** Prevent dismissing suggestions when there are no active suggestions or selection.', + '**settings:** Disable keyword highlights and action links by default in terminal settings.', + ], + }, + { + title: 'Performance', + items: [ + 'Only remove workspace tabs from UI after successful close.', + 'Make split-window session placement explicit.', + 'Reduce unnecessary re-renders in terminal workspace.', + ], + }, + { + title: 'Documentation', + items: ['Add CLAUDE.md for development guidance and architecture overview.'], + }, + ], + }, + { + version: '[0.6.1] - 2026-04-11', + sections: [ + { + title: 'Changed', + items: ['Update version synchronization in sync-version script.', 'Update dragonfly dependency version to 0.6.0.'], + }, + ], + }, + { + version: '[0.6.0] - 2026-04-11', + sections: [ + { + title: 'Added', + items: [ + '**proxy:** Standalone proxy and tunnel management.', + '**sftp:** Enhance file transfer with concurrency, retries, and timestamps.', + '**ui:** Implement network panel and settings restructuring.', + 'Implement Tauri commands for secure app settings management and password verification.', + '**network:** Enhance tunnel configuration UI.', + 'Add session recording and custom transfer preferences.', + '**ui:** Add OtpDialog for two-factor authentication support.', + '**core:** Implement OTP interaction with PendingAuthManager and commands.', + '**ui:** Implement OSC7 CWD tracking support and UI disabled states.', + '**ui:** Integrate OtpDialog into main app layout with i18n support.', + '**transfer:** Open download path from transfer footer.', + '**security:** Add tab count display and update Key/Password management tabs to report counts.', + '**ssh-form:** Enhance SSH form with proxy and OTP configuration options.', + '**otp:** Implement OTP management and integration with UI components.', + '**prettier:** Add Prettier configuration for JSON sorting and update package scripts for i18n checks.', + '**search:** Add show_in_menu property to SearchEngine and enhance SearchTab with collapsible UI for custom engines.', + '**session:** Launch local, telnet, and serial connections by type.', + '**serial:** Show detected serial ports in the session editor.', + '**serial:** Add bottom serial send panel.', + ], + }, + { + title: 'Changed', + items: [ + '**ui:** Introduce shadcn UI components.', + '**i18n:** Update translations for network and transfer features.', + '**translate:** Minor module dependency updates for translate API.', + 'Format session proxy imports.', + 'Adjust panel header actions layout.', + '**deps:** Bump russh to 0.60.', + '**ui:** Rename saved-connections dialog directory to connections.', + '**core:** Reorganize module structure for ssh, runtime, and import.', + 'Update internal imports and finalize ssh module extraction.', + '**core:** Adopt new ssh and runtime module structures.', + '**ui:** Update import path in Header for new connections directory.', + 'Restructure command modules and update import paths for improved organization.', + '**config:** Rename storage modules and split settings config.', + '**runtime:** Extract tauri bootstrap and command adapters.', + '**core:** Extract history store and unify error imports.', + '**session-dialog:** Make new session forms responsive.', + '**dialog:** Improve quick command and auto upload layouts.', + '**settings:** Introduce responsive settings shell.', + '**settings-search:** Reflow custom search engine editor.', + '**settings-terminal:** Reflow action link and highlight editors.', + '**panel:** Polish mobile panels and auth tabs.', + '**core:** Export watcher module.', + '**rust:** Normalize backend formatting.', + '**i18n:** Normalize english sort labels.', + '**otp:** Vendor local hotp and totp crate.', + '**format:** Remove trailing whitespace artifacts.', + '**format:** Trim trailing blank line in translate core.', + '**quick-commands:** Clean up formatting and improve tooltip component structure.', + '**resource-monitor:** Improve code formatting and structure for better readability.', + '**settings:** Restructure settings components to use SettingSection for better organization and readability.', + 'Reorganize file explorer, auth and save-connections components.', + '**connection:** Normalize saved connection schema into typed config blocks.', + '**saved-connections:** Extract tooltip-backed header action button.', + '**file-explorer:** Reuse tooltip icon buttons in the toolbar.', + '**i18n:** Remove deprecated default local shell labels.', + '**frontend:** Normalize panel imports and minor cleanup.', + '**rust:** Isolate import reordering and line-wrap churn.', + '**file-explorer:** Wrap dialog import for consistency.', + 'Introduce FileUploadPage and update routing to replace AutoUploadPage.', + ], + }, + { + title: 'Fixed', + items: [ + '**ssh:** Resolve concurrent SshHandler access using Mutex.', + '**security:** Add app scope to temp dir capabilities.', + '**ui:** Handle xterm buffer trimming in keyword highlighter cache.', + '**i18n:** Correct Chinese translations for various UI strings.', + '**explorer:** Normalize cwd paths before syncing directories.', + '**panel:** Update default tab in SecurityAuthPanel from passwords to keys.', + '**ssh:** Use character escapes for PowerShell OSC integration.', + '**select:** Allow trigger content to shrink and truncate in narrow layouts.', + '**session-ui:** Restrict SSH-only panels and clarify path-sync messaging.', + '**session-editor:** Reset local terminal defaults when clearing the form.', + '**i18n:** Update serial port messages and reintroduce serial send localization.', + ], + }, + ], + }, + { + version: '[0.5.0] - 2026-04-07', + sections: [ + { + title: 'Added', + items: [ + '**window:** Implement child window modal management and overlay.', + '**auth:** Add managed password store for SSH sessions.', + '**stats:** Add remote resource monitor for SSH sessions.', + '**sftp:** Add recursive directory transfer commands.', + ], + }, + { + title: 'Changed', + items: ['Update styling for tab borders and shadows.', '**ui:** Adopt activity bar layout and custom window chrome.'], + }, + { + title: 'Fixed', + items: ['**i18n:** Refine experimental keyword highlighting description in Chinese locale.', '**terminal:** Reconnect SSH tabs after disconnect.'], + }, + ], + }, + { + version: '[0.4.0] - 2026-04-03', + sections: [ + { + title: 'Added', + items: [ + 'Implement ChildWindowRouter and enhance window management with i18n support.', + 'Enhance keyword highlighting settings and functionality.', + 'Update word separators in interaction settings for improved parsing.', + 'Enhance file transfer functionality and loading state management.', + 'Add keyword highlight setting for wrapped lines in TerminalTab.', + '**session:** Add multi-protocol tabs to new session form.', + '**file-explorer:** Open auto-upload prompts in child windows.', + '**appearance:** Support dedicated terminal themes and font scaling.', + '**terminal:** Add actionable links and hover menus.', + ], + }, + { + title: 'Changed', + items: [ + 'Update project URLs and enhance build script.', + "**i18n:** Add 'Built-in' font label to English and Chinese translations.", + '**ui:** Polish tab chrome and refresh connection icons.', + ], + }, + { + title: 'Fixed', + items: [ + '**app:** Stabilize active tab state and terminal defaults.', + '**keywordhighlight:** Improve built-in matching and cell mapping.', + '**build:** Align Vite typing and path alias settings.', + ], + }, + { + title: 'Documentation', + items: ['Add Docusaurus documentation site with bilingual support.', 'Redesign homepage and fix i18n issues.'], + }, + ], + }, + { + version: '[0.3.5] - 2026-03-09', + sections: [ + { + title: 'Fixed', + items: ['**keywordhighlight:** Enhance datetime and number patterns for better matching accuracy.'], + }, + ], + }, + { + version: '[0.3.4] - 2026-03-09', + sections: [ + { + title: 'Changed', + items: ['**terminal:** Replace kbd elements with Kbd component for consistency in CommandSuggestions and ContextMenu.'], + }, + ], + }, + { + version: '[0.3.3] - 2026-03-09', + sections: [ + { + title: 'Added', + items: [ + '**terminal:** Add keyword highlighting feature.', + '**connections:** Add edit option to connection item context menu.', + '**settings:** Support navigating to specific settings tab and auto-refresh ssh keys on focus.', + '**shortcuts:** Implement global keyboard shortcuts for terminal and UI actions.', + ], + }, + { + title: 'Changed', + items: [ + 'Sync version in Cargo.lock and update commit files list.', + '**terminal:** Improve TabBar close button UI and hover states.', + '**terminal:** Use React.RefObject instead of MutableRefObject for terminal refs.', + '**theme:** Update terminal cursor colors for githubLight and nordLight themes.', + ], + }, + { + title: 'Fixed', + items: [ + '**terminal:** Re-initialize WebGL addon on hardware acceleration toggle.', + '**ssh:** Prevent OSC 7 injection from polluting bash history.', + ], + }, + ], + }, + { + version: '[0.2.1] - 2026-03-06', + sections: [ + { + title: 'Added', + items: [ + '**session-management:** Enhance session handling with auto-connect feature.', + '**types:** Add comprehensive global types for session management and UI configuration.', + '**file-explorer:** Add dialogs for creating new files, folders, and symlinks.', + '**translate:** Implement dynamic TKK generation for Google Translate.', + '**file-explorer:** Implement terminal path synchronization feature.', + ], + }, + { + title: 'Changed', + items: [ + 'Relocate themes and types to lib directory.', + 'Update `.gitignore` to include additional file patterns.', + 'Update import paths and enhance translation settings.', + 'Update import paths to global types.', + '**icons:** Consolidate file icon logic and enhance icon imports.', + ], + }, + ], + }, + { + version: '[0.1.5] - 2026-03-06', + sections: [ + { + title: 'Added', + items: [ + '**ui:** Implement zoom level persistence and view settings.', + '**ui:** Add clickable homepage and issues links to about dialog.', + '**ui:** Enhance header menu with icons and new Help options for documentation and logs.', + '**logging:** Enhance tracing initialization with rolling file appender and update log permissions.', + '**window:** Show application window on startup and update tauri configuration to allow window visibility.', + '**connections:** Add the SavedConnections panel for grouped SSH connection management.', + '**watcher:** Add file watcher support and chunked file transfer progress tracking.', + '**file-explorer:** Integrate custom dialogs and context menu support.', + '**settings:** Implement global settings dialog and localization.', + '**terminal:** Add terminal context menu utilities and search bar.', + '**security:** Add lock screen and lock password encryption.', + '**quick-commands:** Redesign quick commands UI with icons and variables support.', + '**file-transfer:** Add file properties dialog and transfer progress bar.', + '**settings:** Add translation settings and a tabbed settings/about experience.', + '**translate:** Add TranslationTab and multi-provider translation service.', + '**terminal:** Enhance XTerminal with URL opening and better command history handling.', + '**app:** Introduce global application context and broader i18n support.', + '**search:** Add search engine icons and improve search tab configuration UI.', + '**import:** Add session import from Xshell, MobaXterm, and WindTerm.', + '**ui:** Add command palette, popover, and draggable panel components.', + '**icons:** Expand the icon system and update type definitions.', + '**connections:** Enhance connection handling, feedback, sorting, and drag-and-drop.', + '**config:** Add screen lock and connection sort mode settings.', + '**security:** Implement screen lock toggle and idle detection.', + '**suggestions:** Enhance command suggestions with multi-provider support.', + '**event-listeners:** Replace polling with event listeners for session and command history updates.', + ], + }, + { + title: 'Changed', + items: [ + 'Add MIT License file.', + '**assets:** Update app icons, logo assets, and remove unused SVGs.', + '**cleanup:** Update tauri config and remove unused assets.', + '**i18n:** Integrate i18next across the application.', + '**ui:** Update page title from `Dragonfly Terminal` to `Dragonfly`.', + 'Update scrollbar styling.', + 'Update global UI, layout visibility, and theme configuration.', + 'Adopt shadcn/ui components.', + 'Migrate toast notifications to sonner and use shadcn context menus.', + 'Update settings dialog to use switches and a tabbed interface.', + '**i18n:** Update localizations for new components and features.', + 'Update typography, CSS variables, theme colors, and section headers.', + 'Update dependencies, shared utils, types, UI components, and panels.', + '**backend:** Modularize config and commands into submodules.', + '**theme:** Overhaul the theme system with CSS variables and preset themes.', + '**dialog:** Reorganize dialogs into domain-specific subdirectories.', + '**settings:** Update settings tabs for the new config structure.', + '**app:** Refresh App, contexts, layout, and panel components.', + '**i18n:** Add locale keys for newly introduced settings and UI flows.', + '**window:** Migrate dialogs to independent child windows.', + '**file-explorer:** Modularize the file tree and replace native dialogs.', + '**terminal:** Clean up formatting and whitespace issues.', + '**tracing:** Improve local time formatting and remove inline key migration.', + '**dialogs:** Remove NewSessionDialog, SettingsDialog, and QuickCommandDialog.', + '**components:** Extract settings components and standardize import paths.', + 'Delete generated build output from the repository.', + 'Bump version to `0.1.5` and add version synchronization script.', + ], + }, + { + title: 'Fixed', + items: [ + 'Resolve dialog accessibility warnings.', + 'Update translation key usage in SearchTab for clearer settings descriptions.', + 'Improve session handling and UI responsiveness.', + '**settings:** Update default interaction settings for copy and paste.', + '**translations:** Remove fallback values from translation keys in dialogs and components.', + ], + }, + { + title: 'Performance', + items: ['**sftp,ssh:** Optimize transfer speeds and add symlink support.'], + }, + { + title: 'Documentation', + items: ['Update README with key features and usage instructions.', 'Remove the trailing period from the README tagline.'], + }, + ], + }, +]; + +const changelogReleasesZhCN: ChangelogRelease[] = [ + { + version: '[0.8.2] - 2026-04-23', + sections: [ + { + title: '新增', + items: [ + '**tauri:** 添加 Windows 配置文件,并移除未使用的 dragDropEnabled 属性。', + '**file-transfer:** 增强文件传输处理以支持目录,包括目录传输的进度跟踪与界面更新。', + '**session-management:** 实现按会话维度管理命令历史,包括获取、监听和清理命令历史,以提升使用体验。', + ], + }, + { + title: '变更', + items: [ + '**i18n:** 为英文和中文语言环境新增文件传输进度跟踪与完成提示文案。', + '**header:** 更新窗口控制按钮,采用新图标并改进样式,以提升使用体验。', + ], + }, + { + title: '修复', + items: ['**saved-connections:** 为连接和分组项实现拖放支持,提升交互体验和组织能力。'], + }, + { + title: '性能', + items: ['**file-explorer:** 通过记忆化和滚动处理增强 FileExplorer 组件,提升性能与使用体验。'], + }, + { + title: '文档', + items: [ + '更新 README 和指南,补充 Windows 拖放支持、增强后的文件传输能力以及诊断设置等新特性说明,以提升使用体验。', + '**file-transfer:** 优化拖放上传章节,使其在不同语言间更清晰且表述一致。', + ], + }, + ], + }, + { + version: '[0.8.1] - 2026-04-23', + sections: [ + { + title: '新增', + items: [ + '**interaction:** 新增命令建议最小字符数限制设置及归一化逻辑,增强用户控制能力。', + '**file-explorer:** 在 Windows 上使用 WebView2 实现外部文件拖放支持,增强拖拽交互能力。', + ], + }, + { + title: '变更', + items: [ + '**i18n:** 为英文和中文语言环境新增命令建议最小字符数限制相关文案,增强用户控制能力。', + '**file-transfer:** 使用 useMemo 优化 visibleTransfers 的计算,以提升性能与排序表现。', + '**terminal:** 用 useTerminalAppSettings 替换 useApp,以改进设置管理并保持终端组件间的一致性。', + '**sync-backup:** 将按钮尺寸从 icon-xs 调整为 icon-sm,以提升界面一致性。', + '**i18n:** 为英文和中文语言环境新增外部拖放支持提示文案,提升文件上传时的引导体验。', + ], + }, + { + title: '文档', + items: ['增强文档,补充会话导入导出、诊断和托盘支持等新特性说明,以提升清晰度和使用体验。'], + }, + ], + }, + { + version: '[0.8.0] - 2026-04-22', + sections: [ + { + title: '新增', + items: [ + '**interaction:** 新增命令建议最大字符数限制设置及归一化逻辑,提升对命令建议的控制能力。', + '**quit_confirmation:** 实现 QuitConfirmDialog,在退出应用前请求用户确认,避免误关闭并提升使用体验。', + '**tray:** 实现托盘功能,包括窗口管理和应用退出命令,提升使用体验。', + ], + }, + { + title: '变更', + items: [ + '**i18n:** 为英文和中文语言环境新增命令建议最大字符数限制相关文案,提升用户控制能力。', + '**syncbackup:** 增强 SyncBackupHistoryPanel,加入新的 UI 组件、改进历史摘要逻辑,并增加额外筛选选项,以提升使用体验。', + '**i18n:** 为英文和中文语言环境新增历史记录相关术语,提升清晰度与使用体验。', + '**scrollbar:** 为滚动条角落添加透明背景,以提升 UI 一致性。', + '**saved-connections:** 更新布局和样式,以提升响应式表现和视觉一致性。', + '**settings:** 移除 ChildAppProvider 与 SettingsPage 中的 emit 调用,以简化事件处理。', + ], + }, + ], + }, + { + version: '[0.7.9] - 2026-04-21', + sections: [ + { + title: '新增', + items: [ + '**terminal:** 通过同步已渲染行中的输入状态并改进命令处理逻辑,增强终端输入处理能力。', + '**syncbackup:** 实现 SyncBackup 功能及其管理云同步设置和历史记录的 UI 组件,提升备份管理体验。', + '**security:** 新增主密码管理,并改进输入组件的动态状态处理,提升使用体验。', + '**syncbackup:** 增加对 S3 endpoint 必填项的校验,并改进草稿设置的界面反馈,提升云同步管理体验。', + '**otp:** 在 OtpDialog 中集成 input-otp 组件,改进 OTP 输入处理,并支持动态验证码长度。', + '**cloud_sync:** 通过为 401 错误添加专门提示并改进存储错误映射,增强 WebDAV 认证的错误处理。', + '**syncbackup:** 增强 SyncBackupHistoryPanel,加入筛选能力、改进状态管理并更新界面,以提升使用体验。', + ], + }, + { + title: '变更', + items: [ + '**terminal:** 移除未使用的输入同步逻辑,并简化命令清洗流程。', + '**terminal:** 重命名命令跟踪函数,并增强命令注册逻辑以改进输入处理。', + '**i18n:** 更新英文和中文语言文件,为同步与备份功能补充新文案并提升界面体验。', + '**settings:** 重构设置页面,采用分类分组、改进滚动处理和动态标签管理,以提升使用体验。', + '**i18n:** 更新 zh-CN 语言文件,新增同步与备份历史相关术语,增强筛选选项并优化提示文案。', + ], + }, + { + title: '修复', + items: ['**file-explorer:** 为文件浏览器实现会话缓存,在组件卸载后仍可保持状态,提升导航体验。'], + }, + { + title: '文档', + items: ['增强同步与备份功能的文档和界面说明,包括详细指南、设置集成,以及跨设备配置与备份管理体验的改进。'], + }, + ], + }, + { + version: '[0.7.8] - 2026-04-21', + sections: [ + { + title: '新增', + items: [ + '**shell:** 实现终端输入的命令清洗,并新增终端命令工具函数。', + '**session:** 通过引入 sendSessionInput 函数重构会话输入处理,改进跨组件的命令提交和预览管理。', + '**logging:** 引入 console 使用 lint 规则,并增强多个组件中的错误日志结构,以提升诊断能力。', + '**keywordhighlight:** 扩展关键词高亮中的错误和控制流模式,提升诊断能力。', + '**quickcommands:** 实现 QuickCommandsStore,用于管理快捷命令的内存缓存与持久化,增强命令的写入与获取能力。', + ], + }, + { + title: '变更', + items: ['**observability, watcher, auth:** 对多个函数应用一致的格式和缩进,以提升代码可读性。'], + }, + { + title: '性能', + items: ['通过为 AppContext、ChildAppProvider 和 TransferProvider 的上下文值使用 useMemo 来优化上下文提供者。'], + }, + ], + }, + { + version: '[0.7.7] - 2026-04-15', + sections: [ + { + title: '新增', + items: [ + '实现配置导入导出功能,并更新 ImportDialog 和 Header 组件的界面。', + '**backup:** 新增带加密和轮换能力的配置导入导出功能。', + '**connections:** 新增 OpenGroupConnectionsDialog 组件,并增强连接项交互,支持选择和上下文菜单操作。', + '**panel:** 增强 QuickCommands 组件,改进搜索和分类筛选界面。', + ], + }, + { + title: '变更', + items: [ + '**i18n:** 更新英文和中文翻译,补充配置导入导出功能相关文案。', + '**panel:** 更新 ActiveSessions 组件,改进搜索输入框和图标样式。', + '**panel:** 调整 SavedConnections 组件中下拉菜单的宽度,以提升界面一致性。', + ], + }, + ], + }, + { + version: '[0.7.6] - 2026-04-15', + sections: [ + { + title: '新增', + items: [ + '**ssh:** 改进 SSH 认证日志,并新增 known host 密钥校验。', + '**ssh:** 增强 SSH I/O 循环,加入详细的退出状态和信号日志。', + ], + }, + { + title: '变更', + items: ["向 Cargo.toml 新增 'des' crate 依赖,并更新 Cargo.lock。"], + }, + { + title: '修复', + items: ['恢复在 pty.rs 中对 SessionOutputCoalescer 的导入,以确保会话输出处理正常。'], + }, + { + title: '文档', + items: [ + '更新 README,补充在线搜索、翻译和改进后的 SFTP 文件浏览器等新特性说明。', + '增强文档,补充终端特性、文件传输能力和安全增强项(包括翻译支持与改进后的会话管理)的说明。', + ], + }, + ], + }, + { + version: '[0.7.5] - 2026-04-14', + sections: [ + { + title: '新增', + items: [ + '**connection:** 增强会话连接处理,改进错误恢复和连接编辑提示。', + '**ssh:** 增强 SSH 表单,加入密码管理和本地化更新。', + ], + }, + ], + }, + { + version: '[0.7.4] - 2026-04-14', + sections: [ + { + title: '新增', + items: [ + '**updater:** 实现更新对话框和后台更新检查功能。', + '**header:** 增强头部组件,加入更新检查功能和新图标。', + '**terminal:** 为终端组件新增挂起状态处理和输出合并,在高负载下提升性能表现。', + ], + }, + { + title: '变更', + items: [ + '向 package.json 和 pnpm-lock.yaml 新增 @tauri-apps/plugin-process 与 @tauri-apps/plugin-updater 依赖。', + '清理导入并改进多个组件的格式,以提升可读性。', + '**i18n:** 为英文和中文语言环境新增更新器本地化文案,包括更新状态消息。', + '**i18n:** 为英文和中文语言环境新增大输出保护相关文案。', + ], + }, + ], + }, + { + version: '[0.7.3] - 2026-04-14', + sections: [ + { + title: '新增', + items: [ + '**keywordhighlightpresets:** 扩展成功匹配模式,加入更多关键词以提升匹配效果。', + '**connection-management:** 实现连接失败时的错误处理,支持将标签页和窗格标记为失败,同时保持布局完整。', + '**file-explorer:** 实现目录历史管理并增强选择处理。', + '**file-transfer:** 新增文件传输的暂停、继续和取消功能,并更新相关上下文与界面组件。', + ], + }, + { + title: '变更', + items: [ + '**i18n:** 为英文和中文语言环境新增连接失败提示文案。', + '**file-explorer:** 更新选择处理方法并改进上下文菜单交互。', + '**i18n:** 更新英文和中文语言环境中的文件传输操作文案,包括取消、暂停、继续和删除。', + ], + }, + ], + }, + { + version: '[0.7.2] - 2026-04-14', + sections: [ + { + title: '新增', + items: [ + '**interaction-settings:** 在 InteractionTab 中新增命令建议开关,并接入应用设置。', + '**logging:** 实现 warn 和 error 级别的持久化日志,并新增对应的 Tauri 命令来处理日志写入。', + '**file-explorer:** 增强键盘交互,加入删除功能和文件列表焦点管理。', + '**sftp:** 增强远程文件操作,加入更详细的日志和权限处理。', + ], + }, + { + title: '变更', + items: [ + '**file-explorer:** 用本地库替换 invoke 导入,并为删除按钮新增 autoFocus,以提升可访问性。', + '**file-explorer:** 在多个对话框组件中统一将 invoke 导入替换为本地库,以保持一致性。', + '**i18n:** 为英文和中文语言环境新增命令建议相关文案。', + ], + }, + { + title: '修复', + items: ['**keywordhighlightpresets:** 更新 duration 正则表达式,使其支持简写单位,提升匹配效果。'], + }, + { + title: '文档', + items: ['更新 CLAUDE.md 和 README.md,澄清文档站点的构建与服务命令,包括按语言环境热更新的选项。'], + }, + ], + }, + { + version: '[0.7.1] - 2026-04-13', + sections: [ + { + title: '新增', + items: [ + '**clipboard:** 实现 readClipboardText 函数,并更新终端组件以使用它访问剪贴板。', + '**demos:** 新增多种演示脚本,用于展示 Dragonfly 的终端特性,包括动作链接、文件监听、关键词高亮和结构化输出。', + '**activesessions:** 增强 ActiveSessions 组件,加入搜索功能、会话重连/断开操作,并改进会话展示界面。', + '**file-explorer:** 重构 DeleteDialog 以处理多文件删除,并改进界面;同时更新 FileExplorer 以支持批量删除操作。', + '**resource-monitor:** 实现刷新按钮,并使用 async/await 改进统计信息获取流程;同时增加加载状态管理。', + '**modal-management:** 重构模态子窗口处理逻辑,改进焦点强制和状态跟踪;并在 ActiveSessions 组件中加入会话重连和断开功能。', + '**activesessions:** 简化 PanelHeader 操作区,移除用于会话数量展示的多余包裹 div。', + '**resource-monitor:** 为刷新按钮增加 tooltip,并重命名状态变量以提升可读性。', + ], + }, + { + title: '变更', + items: ['**i18n:** 更新 zh-CN 和 en.json,补充活动会话和文件删除提示文案。'], + }, + { + title: '文档', + items: [ + '更新 README 和用户指南,增强对 Dragonfly 功能、会话类型和终端能力的说明,并新增工作区布局、安全和网络配置等章节。', + '**sidebars:** 更新指南章节,加入会话类型、布局和认证等主题,并重新组织现有条目以提升清晰度。', + ], + }, + ], + }, + { + version: '[0.7.0] - 2026-04-12', + sections: [ + { + title: '新增', + items: [ + '增强终端工作区,加入新的标签页管理和窗格功能。', + '**crypto:** 实现主密码包裹密钥加密体系。', + '**app:** 在应用启动时恢复主密码的加密状态。', + '**config:** 引入 proxy_jump_id 字段和循环依赖校验。', + '**ssh:** 通过 direct-tcpip channel 实现多跳 proxy jump 路由。', + '**ui:** 在 SSH 会话对话框中集成跳板机配置。', + '**shell:** 将串口发送器升级为统一的 shell 命令广播器。', + '**explorer:** 将文件浏览器限制为仅在 SSH 会话中使用,并显示不支持提示。', + '**tabbar:** 新增带呼吸动画的未读指示器,并扩展 TabBarProps。', + '**unreadtracking:** 实现会话未读输出跟踪,并更新 TabWindowsWorkspace 以显示未读标签页 ID。', + '**terminal:** 新增 TerminalGutter 组件用于显示行号和时间戳,并将设置中的动作链接默认关闭。', + ], + }, + { + title: '变更', + items: [ + '**window:** 在 tauri 配置中启用透明窗口背景。', + '**ssh:** 将默认 keepalive 间隔从 60 秒降低到 3 秒。', + '**config:** 格式化 ui 配置中的元组结构。', + '**security:** 将 lock_password 迁移到统一的 master_password 定义。', + '**ssh:** 将单一 session handle 解耦为多层 SshConnectionHandles。', + '**panel:** 将 QuickCommands 和 SerialSendPanel 迁移到 panel 模块。', + '**ui:** 移除旧的全屏快捷键和冗余菜单项。', + '**panel:** 调整活动会话数量指示器的格式。', + '提交剩余更改。', + '**keywordhighlight:** 更新 token 边界处理,消除冲突。', + '**i18n:** 为终端设置新增行号和时间戳选项。', + ], + }, + { + title: '修复', + items: [ + '**otp:** 正确解码 URL 编码中的多字节 UTF-8 字符。', + '**ssh:** 防止提示注入脚本污染 shell 历史记录。', + '**session:** 在关闭会话期间静默忽略 not-found 错误。', + '**terminal:** 在附加到即将终止的会话时抑制错误。', + '**terminal:** 当没有活动建议或选择项时,避免错误地关闭建议列表。', + '**settings:** 默认禁用终端设置中的关键词高亮和动作链接。', + ], + }, + { + title: '性能', + items: ['仅在成功关闭后再从 UI 中移除工作区标签页。', '使分屏窗口中的会话放置逻辑更加明确。', '减少终端工作区中的不必要重渲染。'], + }, + { + title: '文档', + items: ['新增 CLAUDE.md,提供开发指南和架构概览。'], + }, + ], + }, + { + version: '[0.6.1] - 2026-04-11', + sections: [ + { + title: '变更', + items: ['更新 sync-version 脚本中的版本同步逻辑。', '将 dragonfly 依赖版本更新为 0.6.0。'], + }, + ], + }, + { + version: '[0.6.0] - 2026-04-11', + sections: [ + { + title: '新增', + items: [ + '**proxy:** 新增独立的代理与隧道管理。', + '**sftp:** 增强文件传输,支持并发、重试和时间戳。', + '**ui:** 实现网络面板和设置重构。', + '实现用于安全管理应用设置和验证密码的 Tauri 命令。', + '**network:** 增强隧道配置界面。', + '新增会话录制和自定义传输偏好设置。', + '**ui:** 新增 OtpDialog 以支持双因素认证。', + '**core:** 实现与 PendingAuthManager 和命令的 OTP 交互。', + '**ui:** 实现 OSC7 CWD 跟踪支持和相关 UI 禁用状态。', + '**ui:** 将 OtpDialog 集成到主应用布局中,并支持 i18n。', + '**transfer:** 支持从传输底栏打开下载路径。', + '**security:** 新增标签页数量显示,并更新 Key/Password 管理页签以显示数量。', + '**ssh-form:** 增强 SSH 表单,加入代理和 OTP 配置选项。', + '**otp:** 实现 OTP 管理及其与 UI 组件的集成。', + '**prettier:** 新增用于 JSON 排序的 Prettier 配置,并更新 i18n 检查脚本。', + '**search:** 为 SearchEngine 新增 show_in_menu 属性,并增强 SearchTab,加入可折叠的自定义引擎界面。', + '**session:** 按类型启动本地、Telnet 和串口连接。', + '**serial:** 在会话编辑器中显示检测到的串口。', + '**serial:** 新增底部串口发送面板。', + ], + }, + { + title: '变更', + items: [ + '**ui:** 引入 shadcn UI 组件。', + '**i18n:** 更新网络和传输功能的翻译。', + '**translate:** 对 translate API 的模块依赖进行小幅更新。', + '格式化会话代理相关导入。', + '调整面板头部操作区布局。', + '**deps:** 将 russh 升级到 0.60。', + '**ui:** 将 saved-connections 对话框目录重命名为 connections。', + '**core:** 重组 ssh、runtime 和 import 的模块结构。', + '更新内部导入并完成 ssh 模块提取。', + '**core:** 采用新的 ssh 和 runtime 模块结构。', + '**ui:** 更新 Header 中针对新 connections 目录的导入路径。', + '重构命令模块并更新导入路径,以提升组织性。', + '**config:** 重命名存储模块并拆分 settings 配置。', + '**runtime:** 提取 tauri 启动流程和命令适配器。', + '**core:** 提取 history store 并统一 error 导入。', + '**session-dialog:** 使新建会话表单具备更好的响应式布局。', + '**dialog:** 改进快捷命令和自动上传布局。', + '**settings:** 引入响应式设置外壳。', + '**settings-search:** 重新布局自定义搜索引擎编辑器。', + '**settings-terminal:** 重新布局动作链接和高亮编辑器。', + '**panel:** 优化移动端面板和认证页签。', + '**core:** 导出 watcher 模块。', + '**rust:** 统一后端格式。', + '**i18n:** 规范英文排序标签。', + '**otp:** 内置本地 hotp 和 totp crate。', + '**format:** 移除尾随空白。', + '**format:** 去除 translate core 中末尾多余空行。', + '**quick-commands:** 清理格式并改进 tooltip 组件结构。', + '**resource-monitor:** 改进代码格式和结构,以提升可读性。', + '**settings:** 重构设置组件,使用 SettingSection 来提升组织性和可读性。', + '重组文件浏览器、认证和 save-connections 组件。', + '**connection:** 将已保存连接 schema 规范化为类型化配置块。', + '**saved-connections:** 提取带 tooltip 的头部操作按钮。', + '**file-explorer:** 在工具栏中复用带 tooltip 的图标按钮。', + '**i18n:** 移除已弃用的默认本地 shell 标签。', + '**frontend:** 规范面板导入并进行小幅清理。', + '**rust:** 隔离导入重排和换行调整。', + '**file-explorer:** 为对话框导入增加包裹层以保持一致性。', + '引入 FileUploadPage,并更新路由以替换 AutoUploadPage。', + ], + }, + { + title: '修复', + items: [ + '**ssh:** 使用 Mutex 解决并发访问 SshHandler 的问题。', + '**security:** 为临时目录能力增加 app 作用域。', + '**ui:** 处理关键词高亮缓存中的 xterm 缓冲区裁剪问题。', + '**i18n:** 修正多个 UI 文案的中文翻译。', + '**explorer:** 在同步目录之前规范化 cwd 路径。', + '**panel:** 将 SecurityAuthPanel 的默认标签从 passwords 调整为 keys。', + '**ssh:** 为 PowerShell 的 OSC 集成使用字符转义。', + '**select:** 允许触发器内容在窄布局中收缩并截断。', + '**session-ui:** 限制仅 SSH 会话显示相关面板,并明确路径同步提示。', + '**session-editor:** 在清空表单时重置本地终端默认值。', + '**i18n:** 更新串口相关文案,并恢复 serial send 的本地化支持。', + ], + }, + ], + }, + { + version: '[0.5.0] - 2026-04-07', + sections: [ + { + title: '新增', + items: [ + '**window:** 实现子窗口模态管理和遮罩层。', + '**auth:** 为 SSH 会话新增托管密码存储。', + '**stats:** 为 SSH 会话新增远程资源监视器。', + '**sftp:** 新增递归目录传输命令。', + ], + }, + { + title: '变更', + items: ['更新标签页边框和阴影样式。', '**ui:** 采用活动栏布局和自定义窗口 chrome。'], + }, + { + title: '修复', + items: ['**i18n:** 优化中文语言环境中实验性关键词高亮描述。', '**terminal:** 在断开后重新连接 SSH 标签页。'], + }, + ], + }, + { + version: '[0.4.0] - 2026-04-03', + sections: [ + { + title: '新增', + items: [ + '实现 ChildWindowRouter,并在支持 i18n 的基础上增强窗口管理。', + '增强关键词高亮设置及功能。', + '更新交互设置中的分词分隔符,以提升解析效果。', + '增强文件传输功能和加载状态管理。', + '为 TerminalTab 新增折行关键词高亮设置。', + '**session:** 在新建会话表单中新增多协议标签页。', + '**file-explorer:** 在子窗口中打开自动上传提示。', + '**appearance:** 支持独立终端主题和字体缩放。', + '**terminal:** 新增可操作链接和悬浮菜单。', + ], + }, + { + title: '变更', + items: [ + '更新项目 URL 并增强构建脚本。', + "**i18n:** 为英文和中文翻译新增 'Built-in' 字体标签。", + '**ui:** 优化标签页外观并刷新连接图标。', + ], + }, + { + title: '修复', + items: ['**app:** 稳定活动标签页状态和终端默认值。', '**keywordhighlight:** 改进内置匹配和单元格映射。', '**build:** 对齐 Vite 类型和路径别名设置。'], + }, + { + title: '文档', + items: ['新增支持双语的 Docusaurus 文档站点。', '重新设计首页并修复 i18n 问题。'], + }, + ], + }, + { + version: '[0.3.5] - 2026-03-09', + sections: [ + { + title: '修复', + items: ['**keywordhighlight:** 增强日期时间和数字模式,以提升匹配精度。'], + }, + ], + }, + { + version: '[0.3.4] - 2026-03-09', + sections: [ + { + title: '变更', + items: ['**terminal:** 将 kbd 元素替换为 Kbd 组件,以在 CommandSuggestions 和 ContextMenu 中保持一致性。'], + }, + ], + }, + { + version: '[0.3.3] - 2026-03-09', + sections: [ + { + title: '新增', + items: [ + '**terminal:** 新增关键词高亮功能。', + '**connections:** 为连接项上下文菜单新增编辑选项。', + '**settings:** 支持跳转到特定设置标签,并在获得焦点时自动刷新 SSH 密钥。', + '**shortcuts:** 为终端和 UI 操作实现全局键盘快捷键。', + ], + }, + { + title: '变更', + items: [ + '同步 Cargo.lock 中的版本,并更新提交文件列表。', + '**terminal:** 改进 TabBar 关闭按钮的界面和悬停状态。', + '**terminal:** 终端 ref 改用 React.RefObject,替代 MutableRefObject。', + '**theme:** 更新 githubLight 和 nordLight 主题下的终端光标颜色。', + ], + }, + { + title: '修复', + items: ['**terminal:** 在硬件加速切换时重新初始化 WebGL addon。', '**ssh:** 防止 OSC 7 注入污染 bash 历史记录。'], + }, + ], + }, + { + version: '[0.2.1] - 2026-03-06', + sections: [ + { + title: '新增', + items: [ + '**session-management:** 增强会话处理,加入自动连接功能。', + '**types:** 为会话管理和 UI 配置新增完整的全局类型。', + '**file-explorer:** 新增用于创建文件、文件夹和符号链接的对话框。', + '**translate:** 实现 Google Translate 的动态 TKK 生成。', + '**file-explorer:** 实现终端路径同步功能。', + ], + }, + { + title: '变更', + items: [ + '将 themes 和 types 迁移到 lib 目录。', + '更新 `.gitignore`,加入更多文件模式。', + '更新导入路径并增强翻译设置。', + '更新到全局类型的导入路径。', + '**icons:** 统一文件图标逻辑并增强图标导入。', + ], + }, + ], + }, + { + version: '[0.1.5] - 2026-03-06', + sections: [ + { + title: '新增', + items: [ + '**ui:** 实现缩放级别持久化和视图设置。', + '**ui:** 在关于对话框中加入可点击的首页和问题反馈链接。', + '**ui:** 增强头部菜单,加入图标以及新的文档和日志帮助选项。', + '**logging:** 增强 tracing 初始化,加入滚动文件 appender,并更新日志权限。', + '**window:** 在启动时显示应用窗口,并更新 tauri 配置以允许窗口可见。', + '**connections:** 新增用于分组管理 SSH 连接的 SavedConnections 面板。', + '**watcher:** 新增文件监听支持和分块文件传输进度跟踪。', + '**file-explorer:** 集成自定义对话框和上下文菜单支持。', + '**settings:** 实现全局设置对话框和本地化。', + '**terminal:** 新增终端上下文菜单工具和搜索栏。', + '**security:** 新增锁屏和锁屏密码加密。', + '**quick-commands:** 重新设计快捷命令界面,支持图标和变量。', + '**file-transfer:** 新增文件属性对话框和传输进度条。', + '**settings:** 新增翻译设置以及标签页式的设置/关于体验。', + '**translate:** 新增 TranslationTab 和多提供商翻译服务。', + '**terminal:** 增强 XTerminal,支持打开 URL 并改进命令历史处理。', + '**app:** 引入全局应用上下文,并扩大 i18n 覆盖范围。', + '**search:** 新增搜索引擎图标,并改进 SearchTab 的配置界面。', + '**import:** 新增从 Xshell、MobaXterm 和 WindTerm 导入会话的功能。', + '**ui:** 新增命令面板、popover 和可拖拽面板组件。', + '**icons:** 扩展图标系统并更新类型定义。', + '**connections:** 增强连接处理、反馈、排序和拖拽能力。', + '**config:** 新增锁屏和连接排序模式设置。', + '**security:** 实现锁屏开关和空闲检测。', + '**suggestions:** 增强命令建议功能,支持多提供商。', + '**event-listeners:** 使用事件监听替代轮询,以获取会话和命令历史更新。', + ], + }, + { + title: '变更', + items: [ + '新增 MIT License 文件。', + '**assets:** 更新应用图标和 logo 资源,并移除未使用的 SVG。', + '**cleanup:** 更新 tauri 配置并移除未使用资源。', + '**i18n:** 在整个应用中集成 i18next。', + '**ui:** 将页面标题从 `Dragonfly Terminal` 更新为 `Dragonfly`。', + '更新滚动条样式。', + '更新全局 UI、布局可见性和主题配置。', + '采用 shadcn/ui 组件。', + '将 toast 通知迁移到 sonner,并使用 shadcn 上下文菜单。', + '将设置对话框更新为使用开关和标签页界面。', + '**i18n:** 更新新组件和功能的本地化文案。', + '更新排版、CSS 变量、主题颜色和章节标题。', + '更新依赖、共享工具、类型、UI 组件和面板。', + '**backend:** 将配置和命令模块拆分为子模块。', + '**theme:** 使用 CSS 变量和预设主题重构主题系统。', + '**dialog:** 将对话框重组到按领域划分的子目录中。', + '**settings:** 为新的配置结构更新设置页签。', + '**app:** 刷新 App、contexts、布局和面板组件。', + '**i18n:** 为新增的设置和 UI 流程补充语言键。', + '**window:** 将对话框迁移为独立子窗口。', + '**file-explorer:** 模块化文件树并替换原生对话框。', + '**terminal:** 清理格式和多余空白。', + '**tracing:** 改进本地时间格式,并移除内联密钥迁移逻辑。', + '**dialogs:** 移除 NewSessionDialog、SettingsDialog 和 QuickCommandDialog。', + '**components:** 提取设置组件并统一导入路径。', + '从仓库中删除生成的构建产物。', + '将版本提升到 `0.1.5`,并新增版本同步脚本。', + ], + }, + { + title: '修复', + items: [ + '修复对话框可访问性警告。', + '更新 SearchTab 中翻译键的用法,使设置说明更清晰。', + '改进会话处理和界面响应性。', + '**settings:** 更新复制和粘贴的默认交互设置。', + '**translations:** 移除对话框和组件中翻译键的 fallback 值。', + ], + }, + { + title: '性能', + items: ['**sftp,ssh:** 优化传输速度并新增符号链接支持。'], + }, + { + title: '文档', + items: ['更新 README,补充关键特性和使用说明。', '移除 README 标语末尾的句号。'], + }, + ], + }, +]; + +const changelogReleasesByLocale: Record = { + en: changelogReleasesEn, + 'zh-CN': changelogReleasesZhCN, +}; + +export function getChangelogReleases(locale: string): ChangelogRelease[] { + return changelogReleasesByLocale[locale] ?? changelogReleasesByLocale['zh-CN']; +} diff --git a/docs-site/src/pages/changelog.module.css b/docs-site/src/pages/changelog.module.css new file mode 100644 index 00000000..a88fd4a3 --- /dev/null +++ b/docs-site/src/pages/changelog.module.css @@ -0,0 +1,229 @@ +.page { + min-height: 100%; +} + +.hero { + padding: 5rem 0 3rem; + background: + linear-gradient(180deg, rgba(37, 99, 235, 0.06) 0%, rgba(37, 99, 235, 0) 48%), + linear-gradient(180deg, #f8fbff 0%, #ffffff 100%); +} + +[data-theme='dark'] .hero { + background: + linear-gradient(180deg, rgba(125, 183, 255, 0.08) 0%, rgba(125, 183, 255, 0) 44%), + linear-gradient(180deg, #101721 0%, #111722 56%, #11151c 100%); +} + +.heroInner { + max-width: 48rem; + margin: 0 auto; + text-align: center; +} + +.eyebrow { + display: inline-block; + margin-bottom: 0.85rem; + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0; + color: var(--ifm-color-primary); +} + +[data-theme='dark'] .eyebrow { + color: #8fc2ff; +} + +.title { + margin-bottom: 0.9rem; + font-size: clamp(2.4rem, 5vw, 3.5rem); + line-height: 1.1; +} + +.description { + margin: 0 auto 1.5rem; + max-width: 40rem; + color: var(--ifm-color-emphasis-700); + line-height: 1.75; +} + +[data-theme='dark'] .description { + color: #b4bfcc; +} + +.actions { + display: flex; + justify-content: center; + gap: 0.875rem; +} + +.primaryLink, +.secondaryLink { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 8.5rem; + padding: 0.75rem 1.2rem; + border-radius: 8px; + font-weight: 700; + transition: + transform 0.2s ease, + background-color 0.2s ease, + border-color 0.2s ease, + box-shadow 0.2s ease; +} + +.primaryLink { + color: #fff; + background: linear-gradient(135deg, var(--ifm-color-primary) 0%, var(--ifm-color-primary-dark) 100%); + box-shadow: 0 14px 28px rgba(37, 99, 235, 0.2); +} + +[data-theme='dark'] .primaryLink { + color: #07111f; + background: #8fc2ff; + box-shadow: 0 14px 30px rgba(33, 80, 138, 0.28); +} + +.primaryLink:hover { + color: #fff; + text-decoration: none; + transform: translateY(-1px); +} + +[data-theme='dark'] .primaryLink:hover { + color: #07111f; + background: #a5ceff; + box-shadow: 0 18px 36px rgba(33, 80, 138, 0.34); +} + +.secondaryLink { + color: var(--ifm-font-color-base); + border: 1px solid var(--ifm-toc-border-color); + background: var(--ifm-background-surface-color); +} + +[data-theme='dark'] .secondaryLink { + color: #e7ecf3; + border-color: rgba(150, 163, 181, 0.28); + background: rgba(23, 28, 36, 0.78); +} + +.secondaryLink:hover { + color: var(--ifm-font-color-base); + text-decoration: none; + transform: translateY(-1px); +} + +[data-theme='dark'] .secondaryLink:hover { + color: #ffffff; + background: rgba(32, 39, 49, 0.92); +} + +.timelineSection { + padding: 0 0 5rem; +} + +[data-theme='dark'] .timelineSection { + background: #11151c; +} + +.timeline { + display: grid; + gap: 1.5rem; +} + +.releaseCard { + padding: 1.5rem; + border: 1px solid var(--ifm-toc-border-color); + border-radius: 8px; + background: var(--ifm-background-surface-color); +} + +[data-theme='dark'] .releaseCard { + border-color: rgba(150, 163, 181, 0.2); + background: #171c24; +} + +.releaseHeader { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 1rem; + margin-bottom: 1rem; +} + +.releaseTag { + margin: 0; + font-size: 1.65rem; +} + +.releaseDate { + margin: 0.4rem 0 0; + color: var(--ifm-color-emphasis-600); + font-weight: 600; +} + +[data-theme='dark'] .releaseDate { + color: #8d97a6; +} + +.sectionList { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1rem; +} + +.sectionCard { + padding: 1.2rem; + border: 1px solid rgba(148, 163, 184, 0.12); + border-radius: 8px; + background: rgba(148, 163, 184, 0.06); +} + +[data-theme='dark'] .sectionCard { + border-color: rgba(150, 163, 181, 0.16); + background: #1d232d; +} + +.sectionTitle { + margin-bottom: 0.75rem; + font-size: 1.05rem; +} + +.itemList { + margin: 0; + padding-left: 1.1rem; + display: grid; + gap: 0.6rem; +} + +.item { + color: var(--ifm-color-emphasis-800); + line-height: 1.7; +} + +[data-theme='dark'] .item { + color: #d2d8e2; +} + +@media (max-width: 996px) { + .sectionList { + grid-template-columns: 1fr; + } +} + +@media (max-width: 768px) { + .hero { + padding-top: 4rem; + } + + .actions { + flex-direction: column; + } + + .primaryLink, + .secondaryLink { + width: 100%; + } +} diff --git a/docs-site/src/pages/changelog.tsx b/docs-site/src/pages/changelog.tsx new file mode 100644 index 00000000..9e2c3880 --- /dev/null +++ b/docs-site/src/pages/changelog.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Layout from '@theme/Layout'; +import Heading from '@theme/Heading'; +import Translate, {translate} from '@docusaurus/Translate'; + +import styles from './changelog.module.css'; +import {getChangelogReleases} from '../data/changelogData'; + +function formatVersionLabel(version: string) { + const match = version.match(/^\[(.+?)\]\s*-\s*(.+)$/); + if (!match) { + return {tag: version, date: ''}; + } + + return { + tag: `v${match[1]}`, + date: match[2], + }; +} + +function renderItem(item: string) { + const boldPrefixMatch = item.match(/^\*\*(.+?):\*\*\s*(.+)$/); + + if (!boldPrefixMatch) { + return item; + } + + return ( + <> + {boldPrefixMatch[1]}: {boldPrefixMatch[2]} + + ); +} + +export default function ChangelogPage(): React.ReactElement { + const { + i18n: {currentLocale}, + } = useDocusaurusContext(); + const changelogReleases = getChangelogReleases(currentLocale); + + return ( + +
+
+
+
+ + Changelog + + + 项目日志与版本演进 + +
+
+
+ +
+
+
+ {changelogReleases.map((release) => { + const {tag, date} = formatVersionLabel(release.version); + + return ( +
+
+
+ + {tag} + + {date ?

{date}

: null} +
+
+ +
+ {release.sections.map((section) => ( +
+ + {section.title} + +
    + {section.items.map((item) => ( +
  • + {renderItem(item)} +
  • + ))} +
+
+ ))} +
+
+ ); + })} +
+
+
+
+
+ ); +} diff --git a/docs-site/src/pages/index.module.css b/docs-site/src/pages/index.module.css index 7f4b0638..a15f03df 100644 --- a/docs-site/src/pages/index.module.css +++ b/docs-site/src/pages/index.module.css @@ -1,299 +1,928 @@ -/* ── Hero ── */ +/* Hero */ .heroBanner { position: relative; - overflow: hidden; - padding: 6rem 2rem 4rem; - text-align: center; - background: linear-gradient(168deg, #f0f5ff 0%, #e8f0fe 40%, #f8faff 100%); + overflow: visible; + padding: 6rem 0 4.25rem; + background: linear-gradient(180deg, #f8fafc 0%, #eef4f8 54%, #ffffff 100%); } [data-theme='dark'] .heroBanner { - background: linear-gradient(168deg, #0a1628 0%, #101d33 40%, #0d1520 100%); -} - -.heroGlow { - position: absolute; - top: -40%; - left: 50%; - transform: translateX(-50%); - width: 600px; - height: 600px; - border-radius: 50%; - background: radial-gradient(circle, rgba(37, 99, 235, 0.08) 0%, transparent 70%); - pointer-events: none; -} - -[data-theme='dark'] .heroGlow { - background: radial-gradient(circle, rgba(96, 165, 250, 0.06) 0%, transparent 70%); + background: + linear-gradient(180deg, rgba(125, 183, 255, 0.08) 0%, rgba(125, 183, 255, 0) 42%), + linear-gradient(180deg, #101721 0%, #111722 55%, #11151c 100%); } .heroInner { position: relative; z-index: 1; - max-width: 720px; + display: grid; + grid-template-columns: minmax(0, 0.86fr) minmax(24rem, 1.24fr); + gap: 2.75rem; + align-items: center; + max-width: 78rem; margin: 0 auto; } -.heroLogoWrapper { +.heroCopy { + min-width: 0; +} + +.heroBrandRow { display: flex; - justify-content: center; - margin-bottom: 1.5rem; + align-items: center; + gap: 1rem; + margin-bottom: 1.25rem; + text-align: left; } .heroLogo { - width: 88px; - height: 88px; - border-radius: 22px; - filter: drop-shadow(0 8px 24px rgba(37, 99, 235, 0.18)); - transition: transform 0.3s ease; + width: 4.5rem; + height: 4.5rem; + border-radius: 8px; + box-shadow: 0 16px 32px rgba(15, 23, 42, 0.14); } -.heroLogo:hover { - transform: scale(1.06) translateY(-2px); +.heroBrandText { + display: flex; + flex-direction: column; + gap: 0.25rem; } -[data-theme='dark'] .heroLogo { - filter: drop-shadow(0 8px 24px rgba(96, 165, 250, 0.2)); +.heroEyebrow { + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0; + color: #2563eb; +} + +[data-theme='dark'] .heroEyebrow { + color: #8fc2ff; } .heroTitle { - font-size: 3.2rem; - font-weight: 800; - letter-spacing: -0.03em; - margin-bottom: 0.5rem; + margin: 0; + font-size: 4rem; + line-height: 1; + letter-spacing: 0; color: #0f172a; - line-height: 1.15; } [data-theme='dark'] .heroTitle { - color: #f1f5f9; + color: #f6f8fb; } .heroSubtitle { + margin: 0 0 1rem; + max-width: 38rem; font-size: 1.35rem; - font-weight: 500; - color: #475569; - margin-bottom: 0.5rem; + line-height: 1.5; + color: #1e293b; } [data-theme='dark'] .heroSubtitle { - color: #94a3b8; + color: #eef3f8; } .heroDescription { - font-size: 1.05rem; - color: #64748b; - margin-bottom: 2rem; + margin: 0 0 2rem; + max-width: 40rem; + font-size: 1rem; + line-height: 1.75; + color: #475569; } [data-theme='dark'] .heroDescription { - color: #64748b; + color: #b4bfcc; } .heroButtons { display: flex; + justify-content: flex-start; + gap: 0.875rem; + margin-bottom: 1.75rem; +} + +.primaryButton, +.secondaryButton { + min-width: 9.5rem; + border-radius: 8px; + font-weight: 700; + transition: + transform 0.2s ease, + box-shadow 0.2s ease, + border-color 0.2s ease, + background-color 0.2s ease; +} + +.primaryButton { + border: none; + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); + box-shadow: 0 16px 32px rgba(37, 99, 235, 0.22); +} + +[data-theme='dark'] .primaryButton { + color: #07111f !important; + background: #8fc2ff; + box-shadow: 0 14px 30px rgba(33, 80, 138, 0.28); +} + +.primaryButton:hover { + transform: translateY(-1px); + box-shadow: 0 20px 36px rgba(37, 99, 235, 0.26); +} + +[data-theme='dark'] .primaryButton:hover { + background: #a5ceff; + box-shadow: 0 18px 36px rgba(33, 80, 138, 0.34); +} + +.secondaryButton { + border: 1px solid rgba(148, 163, 184, 0.35); + color: #1e293b !important; + background: rgba(255, 255, 255, 0.74); + backdrop-filter: blur(8px); +} + +.secondaryButton:hover { + transform: translateY(-1px); + text-decoration: none; + color: #0f172a !important; + background: rgba(255, 255, 255, 0.88); +} + +[data-theme='dark'] .secondaryButton { + border-color: rgba(150, 163, 181, 0.28); + color: #e7ecf3 !important; + background: rgba(23, 28, 36, 0.78); +} + +[data-theme='dark'] .secondaryButton:hover { + color: #ffffff !important; + background: rgba(32, 39, 49, 0.92); +} + +.downloadGroup { + position: relative; + display: inline-flex; + min-width: 13rem; + z-index: 5; +} + +.downloadPrimary { + display: inline-flex; + flex: 1; + flex-direction: column; + gap: 0.1rem; align-items: center; justify-content: center; - gap: 0.75rem; - margin-bottom: 2.5rem; + min-width: 10.5rem; + padding-right: 3.1rem; + border-color: transparent; + color: #ffffff !important; + background: #1f2937; + box-shadow: 0 14px 28px rgba(31, 41, 55, 0.16); + line-height: 1.1; } -.btnPrimary { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); - color: #fff !important; - border: none; - border-radius: 10px; - padding: 0.7rem 1.6rem; +.downloadPrimary:hover { + color: #ffffff !important; + background: #111827; + box-shadow: 0 18px 34px rgba(31, 41, 55, 0.22); +} + +[data-theme='dark'] .downloadPrimary { + color: #07111f !important; + background: #d7e6f7; + box-shadow: 0 14px 30px rgba(125, 183, 255, 0.16); +} + +[data-theme='dark'] .downloadPrimary:hover { + color: #07111f !important; + background: #edf5ff; + box-shadow: 0 18px 36px rgba(125, 183, 255, 0.22); +} + +.downloadPlatform { + font-size: 0.72rem; font-weight: 600; - font-size: 0.95rem; - transition: all 0.2s ease; - box-shadow: 0 2px 12px rgba(37, 99, 235, 0.3); + color: rgba(255, 255, 255, 0.78); } -.btnPrimary:hover { - background: linear-gradient(135deg, #1d4ed8 0%, #1e40af 100%); - box-shadow: 0 4px 20px rgba(37, 99, 235, 0.4); - transform: translateY(-1px); - color: #fff !important; - text-decoration: none; +[data-theme='dark'] .downloadPlatform { + color: rgba(7, 17, 31, 0.72); } -.btnIcon { - width: 16px; - height: 16px; +.downloadMenu { + position: absolute; + top: 0; + right: 0; + height: 100%; } -.btnSecondary { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: transparent; - color: #334155 !important; - border: 1.5px solid #cbd5e1; - border-radius: 10px; - padding: 0.7rem 1.6rem; - font-weight: 600; - font-size: 0.95rem; - transition: all 0.2s ease; -} - -.btnSecondary:hover { - border-color: #94a3b8; - background: rgba(0, 0, 0, 0.02); - transform: translateY(-1px); - color: #1e293b !important; - text-decoration: none; -} - -[data-theme='dark'] .btnSecondary { - color: #cbd5e1 !important; - border-color: #334155; -} - -[data-theme='dark'] .btnSecondary:hover { - border-color: #475569; - background: rgba(255, 255, 255, 0.04); - color: #e2e8f0 !important; -} - -.btnGithubIcon { - width: 18px; - height: 18px; -} - -/* ── Tech badges ── */ - -.techBadges { +.downloadMenuToggle { display: flex; align-items: center; justify-content: center; - flex-wrap: wrap; - gap: 0.5rem; + width: 2.75rem; + height: 100%; + border-left: 1px solid rgba(255, 255, 255, 0.24); + color: #ffffff; + cursor: pointer; + list-style: none; } -.techBadge { - display: inline-flex; - align-items: center; - gap: 0.4rem; - padding: 0.3rem 0.75rem; - border-radius: 20px; - font-size: 0.8rem; - font-weight: 500; - color: #475569; - background: rgba(255, 255, 255, 0.7); - border: 1px solid #e2e8f0; - backdrop-filter: blur(4px); +.downloadMenuToggle::-webkit-details-marker { + display: none; } -[data-theme='dark'] .techBadge { - color: #94a3b8; - background: rgba(255, 255, 255, 0.05); - border-color: #1e293b; +.downloadMenuToggle span { + width: 0.5rem; + height: 0.5rem; + border-right: 2px solid currentColor; + border-bottom: 2px solid currentColor; + transform: translateY(-0.15rem) rotate(45deg); } -.techDot { - width: 7px; - height: 7px; - border-radius: 50%; - flex-shrink: 0; +[data-theme='dark'] .downloadMenuToggle { + border-left-color: rgba(7, 17, 31, 0.18); + color: #07111f; } - -/* ── Features ── */ - -.features { - padding: 4rem 0 5rem; -} - -.featureGrid { +.downloadMenuList { + position: absolute; + top: calc(100% + 0.5rem); + right: 0; + z-index: 30; display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 1.5rem; + min-width: 13rem; + padding: 0.4rem; + border: 1px solid var(--ifm-toc-border-color); + border-radius: 8px; + background: var(--ifm-background-surface-color); + box-shadow: 0 18px 36px rgba(15, 23, 42, 0.16); } -@media (max-width: 996px) { - .featureGrid { - grid-template-columns: repeat(2, 1fr); - } +[data-theme='dark'] .downloadMenuList { + border-color: rgba(150, 163, 181, 0.22); + background: #171c24; + box-shadow: 0 18px 36px rgba(0, 0, 0, 0.26); } -@media (max-width: 600px) { - .featureGrid { - grid-template-columns: 1fr; - } - .heroTitle { - font-size: 2.2rem; - } +.downloadMenuItem { + padding: 0.7rem 0.85rem; + border-radius: 6px; + color: var(--ifm-font-color-base); + font-size: 0.92rem; + font-weight: 600; } -.featureCard { - padding: 1.75rem 1.5rem; - border-radius: 14px; - border: 1px solid #e2e8f0; - background: #fff; - transition: all 0.25s ease; +.downloadMenuItem:hover { + color: var(--ifm-font-color-base); + text-decoration: none; + background: rgba(37, 99, 235, 0.08); } -.featureCard:hover { - border-color: #bfdbfe; - box-shadow: 0 4px 24px rgba(37, 99, 235, 0.08); +[data-theme='dark'] .downloadMenuItem:hover { + color: #ffffff; + background: rgba(125, 183, 255, 0.12); +} + +.heroBadges { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + gap: 0.75rem; +} + +.heroBadge { + padding: 0.45rem 0.85rem; + border: 1px solid rgba(148, 163, 184, 0.22); + border-radius: 8px; + background: rgba(255, 255, 255, 0.72); + color: #334155; + font-size: 0.88rem; + font-weight: 600; + backdrop-filter: blur(10px); +} + +[data-theme='dark'] .heroBadge { + border-color: rgba(150, 163, 181, 0.22); + background: rgba(18, 23, 31, 0.72); + color: #c8d0dc; +} + +.heroPreview { + min-height: 0; + overflow: visible; + border-radius: 0; + background: transparent; + box-shadow: none; +} + +[data-theme='dark'] .heroPreview { + background: transparent; + box-shadow: none; +} + +.heroScreenshotStage { + position: relative; + min-height: 0; + background: transparent; +} + +[data-theme='dark'] .heroScreenshotStage { + background: transparent; +} + +.heroScreenshotSlot { + position: static; + display: flex; + align-items: center; + justify-content: center; + padding: 0; +} + +.heroScreenshotDark { + display: none; +} + +[data-theme='dark'] .heroScreenshotLight { + display: none; +} + +[data-theme='dark'] .heroScreenshotDark { + display: flex; +} + +.heroScreenshotImage { + display: block; + width: 100%; + height: auto; + border-radius: 8px; + object-fit: cover; + object-position: center; + box-shadow: 0 24px 60px rgba(15, 23, 42, 0.16); +} + +[data-theme='dark'] .heroScreenshotImage { + box-shadow: 0 24px 60px rgba(0, 0, 0, 0.3); +} + +/* Shared sections */ + +.overviewSection, +.featuresSection, +.journeySection { + padding: 5rem 0; +} + +.overviewSection { + background: var(--ifm-background-color); +} + +[data-theme='dark'] .overviewSection { + background: #11151c; +} + +.featuresSection { + background: linear-gradient(180deg, rgba(37, 99, 235, 0.04) 0%, transparent 100%); +} + +[data-theme='dark'] .featuresSection { + background: linear-gradient(180deg, #121820 0%, #11151c 100%); +} + +.journeySection { + padding-top: 0; +} + +[data-theme='dark'] .journeySection { + background: #11151c; +} + +.sectionHeading { + max-width: 42rem; + margin: 0 auto 2.5rem; + text-align: center; +} + +.sectionEyebrow { + display: inline-block; + margin-bottom: 0.85rem; + font-size: 0.8rem; + font-weight: 700; + letter-spacing: 0; + color: var(--ifm-color-primary); +} + +.sectionTitle { + margin-bottom: 0.85rem; + font-size: 2.4rem; + line-height: 1.15; +} + +.sectionDescription { + margin: 0; + color: var(--ifm-color-emphasis-700); + line-height: 1.75; +} + +/* Overview */ + +.summaryGrid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 1.25rem; +} + +.summaryCard { + padding: 1.5rem; + border: 1px solid var(--ifm-toc-border-color); + border-radius: 8px; + background: var(--ifm-background-surface-color); + box-shadow: 0 18px 32px rgba(15, 23, 42, 0.04); +} + +[data-theme='dark'] .summaryCard { + border-color: rgba(150, 163, 181, 0.2); + background: #171c24; + box-shadow: none; +} + +.summaryTitle { + margin-bottom: 0.65rem; + font-size: 1.15rem; +} + +.summaryDescription { + margin: 0; + color: var(--ifm-color-emphasis-700); + line-height: 1.7; +} + +.featureShowcase { + display: grid; + gap: 1.1rem; +} + +.featureTabs { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 0.55rem; + padding: 0.45rem; + border: 1px solid rgba(148, 163, 184, 0.28); + border-radius: 8px; + background: rgba(241, 245, 249, 0.82); + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.82), + 0 18px 42px rgba(15, 23, 42, 0.06); +} + +[data-theme='dark'] .featureTabs { + border-color: rgba(150, 163, 181, 0.24); + background: rgba(18, 23, 31, 0.86); + box-shadow: none; +} + +.featureTab { + position: relative; + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; + gap: 0.7rem; + align-items: center; + min-height: 4.5rem; + min-width: 0; + padding: 0.75rem 0.8rem; + overflow: hidden; + border: 1px solid rgba(148, 163, 184, 0.28); + border-radius: 8px; + color: #334155; + text-align: left; + background: #ffffff; + box-shadow: + inset 0 -1px 0 rgba(15, 23, 42, 0.04), + 0 1px 2px rgba(15, 23, 42, 0.04); + cursor: pointer; + transition: + background-color 0.2s ease, + border-color 0.2s ease, + box-shadow 0.2s ease, + color 0.2s ease, + transform 0.2s ease; +} + +.featureTab:hover, +.featureTab:focus-visible { + border-color: rgba(37, 99, 235, 0.38); + color: #0f172a; + background: #ffffff; + box-shadow: + inset 0 -1px 0 rgba(37, 99, 235, 0.08), + 0 10px 22px rgba(37, 99, 235, 0.1); + outline: none; + transform: translateY(-1px); +} + +.featureTabActive { + border-color: transparent; + color: #ffffff; + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); + box-shadow: 0 16px 30px rgba(37, 99, 235, 0.24); transform: translateY(-2px); } -[data-theme='dark'] .featureCard { - background: #0f172a; - border-color: #1e293b; +.featureTabActive:hover, +.featureTabActive:focus-visible { + border-color: transparent; + color: #ffffff; + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); + box-shadow: 0 16px 30px rgba(37, 99, 235, 0.24); + transform: translateY(-2px); } -[data-theme='dark'] .featureCard:hover { - border-color: #1e3a5f; - box-shadow: 0 4px 24px rgba(96, 165, 250, 0.06); +[data-theme='dark'] .featureTab { + border-color: rgba(150, 163, 181, 0.18); + color: #aeb9c7; + background: #171c24; + box-shadow: none; } -.featureIconWrapper { - width: 44px; - height: 44px; - border-radius: 10px; - display: flex; +[data-theme='dark'] .featureTab:hover, +[data-theme='dark'] .featureTab:focus-visible { + border-color: rgba(143, 194, 255, 0.34); + color: #f6f8fb; + background: #1b2330; + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.18); +} + +[data-theme='dark'] .featureTabActive { + border-color: transparent; + color: #08111f; + background: #8fc2ff; + box-shadow: 0 16px 34px rgba(125, 183, 255, 0.2); +} + +[data-theme='dark'] .featureTabActive:hover, +[data-theme='dark'] .featureTabActive:focus-visible { + border-color: transparent; + color: #08111f; + background: #8fc2ff; + box-shadow: 0 16px 34px rgba(125, 183, 255, 0.2); +} + +.featureTabIndex { + display: inline-flex; align-items: center; justify-content: center; - margin-bottom: 1rem; - background: linear-gradient(135deg, #eff6ff 0%, #dbeafe 100%); - color: #2563eb; + width: 1.8rem; + height: 1.8rem; + border-radius: 8px; + color: #1d4ed8; + background: rgba(37, 99, 235, 0.1); + font-size: 0.72rem; + font-weight: 800; + line-height: 1; } -[data-theme='dark'] .featureIconWrapper { - background: linear-gradient(135deg, #172554 0%, #1e3a5f 100%); - color: #60a5fa; +[data-theme='dark'] .featureTabActive .featureTabIndex, +.featureTabActive .featureTabIndex { + color: currentColor; + background: rgba(255, 255, 255, 0.18); } -.featureSvg { - width: 22px; - height: 22px; +[data-theme='dark'] .featureTabIndex { + color: #8fc2ff; + background: rgba(143, 194, 255, 0.12); +} + +.featureTabText { + display: grid; + min-width: 0; + gap: 0.15rem; +} + +.featureTabLabel { + font-size: 1rem; + font-weight: 800; + line-height: 1.2; +} + +.featureTabHint { + display: -webkit-box; + overflow: hidden; + color: #64748b; + font-size: 0.76rem; + line-height: 1.35; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} + +.featureTabActive .featureTabHint { + color: rgba(255, 255, 255, 0.78); +} + +[data-theme='dark'] .featureTabActive .featureTabHint { + color: rgba(8, 17, 31, 0.7); +} + +.featureTabArrow { + width: 0.45rem; + height: 0.45rem; + border-top: 2px solid currentColor; + border-right: 2px solid currentColor; + opacity: 0.46; + transform: rotate(45deg); + transition: + opacity 0.2s ease, + transform 0.2s ease; +} + +.featureTab:hover .featureTabArrow, +.featureTab:focus-visible .featureTabArrow, +.featureTabActive .featureTabArrow { + opacity: 1; + transform: translateX(2px) rotate(45deg); +} + +.featureTabProgress { + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 0.2rem; + overflow: hidden; + background: rgba(255, 255, 255, 0.2); +} + +.featureTabProgress::after { + content: ''; + display: block; + width: 100%; + height: 100%; + border-radius: inherit; + background: rgba(255, 255, 255, 0.92); + animation: featureTabProgress 4.2s linear forwards; + transform-origin: left; +} + +[data-theme='dark'] .featureTabProgress { + background: rgba(8, 17, 31, 0.16); +} + +[data-theme='dark'] .featureTabProgress::after { + background: rgba(8, 17, 31, 0.62); +} + +@keyframes featureTabProgress { + from { + transform: scaleX(0); + } + + to { + transform: scaleX(1); + } +} + +.featurePanel { + display: grid; + grid-template-columns: minmax(18rem, 0.42fr) minmax(0, 1fr); + gap: 1.5rem; + align-items: stretch; +} + +.featureCopy, +.featurePreview { + border-radius: 8px; + border: 1px solid var(--ifm-toc-border-color); + background: var(--ifm-background-surface-color); +} + +[data-theme='dark'] .featureCopy, +[data-theme='dark'] .featurePreview, +[data-theme='dark'] .journeyCard { + border-color: rgba(150, 163, 181, 0.2); + background: #171c24; +} + +.featureCopy { + padding: 1.5rem; } .featureTitle { - font-size: 1.05rem; - font-weight: 700; - margin-bottom: 0.5rem; - color: #0f172a; -} - -[data-theme='dark'] .featureTitle { - color: #e2e8f0; + margin-bottom: 0.75rem; + font-size: 1.28rem; + line-height: 1.35; } .featureDescription { - font-size: 0.88rem; - line-height: 1.6; - color: #64748b; - margin: 0; + margin: 0 0 1rem; + color: var(--ifm-color-emphasis-700); + line-height: 1.7; } -[data-theme='dark'] .featureDescription { - color: #94a3b8; +.featureList { + margin: 0; + padding-left: 1.2rem; + display: grid; + gap: 0.7rem; +} + +.featureListItem { + color: var(--ifm-color-emphasis-800); + line-height: 1.65; +} + +.featurePreview { + min-height: 26rem; + overflow: hidden; + display: flex; + align-items: center; + justify-content: center; + padding: 0.65rem; +} + +.featurePreviewImageSlot { + width: 100%; +} + +.featurePreviewDark { + display: none; +} + +[data-theme='dark'] .featurePreviewLight { + display: none; +} + +[data-theme='dark'] .featurePreviewDark { + display: block; +} + +.featurePreviewImage { + display: block; + width: 100%; + height: auto; + border-radius: 6px; + object-fit: contain; + object-position: center; +} + +/* Journey */ + +.journeyGrid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1.25rem; +} + +.journeyCard { + padding: 1.5rem; + border: 1px solid var(--ifm-toc-border-color); + border-radius: 8px; + background: var(--ifm-background-surface-color); +} + +.journeyTitle { + margin-bottom: 0.75rem; + font-size: 1.15rem; +} + +.journeyDescription { + margin: 0 0 1rem; + color: var(--ifm-color-emphasis-700); + line-height: 1.7; +} + +.inlineLink { + font-weight: 700; +} + +/* Responsive */ + +@media (max-width: 996px) { + .heroBanner { + padding: 6rem 0 4rem; + } + + .heroInner { + grid-template-columns: 1fr; + } + + .summaryGrid, + .featurePanel, + .journeyGrid { + grid-template-columns: 1fr; + } + + .featureTabs { + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.55rem; + } + + .featureTab { + min-height: 4.25rem; + } + + .featureCopy, + .featurePreview { + min-height: auto; + } +} + +@media (max-width: 768px) { + .heroTitle { + font-size: 3rem; + } + + .sectionTitle { + font-size: 2rem; + } + + .heroBrandRow { + flex-direction: column; + text-align: center; + } + + .heroBrandText { + align-items: center; + } + + .heroCopy, + .heroSubtitle, + .heroDescription { + text-align: center; + } + + .heroButtons { + flex-direction: column; + align-items: stretch; + } + + .primaryButton, + .secondaryButton { + width: 100%; + } + + .downloadGroup { + width: 100%; + } + + .downloadPrimary { + width: 100%; + } + + .heroBadges { + justify-content: center; + } + + .heroPreview { + min-height: 0; + } + + .heroScreenshotStage { + min-height: 0; + } + + .featureTabs { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .featureTab { + min-height: 4rem; + padding: 0.7rem; + } + + .featureTabHint { + -webkit-line-clamp: 2; + } +} + +@media (max-width: 480px) { + .heroBanner, + .overviewSection, + .featuresSection, + .journeySection { + padding-left: 0; + padding-right: 0; + } + + .featureCopy, + .summaryCard, + .journeyCard, + .featurePreview { + padding: 1.25rem; + } + + .featureTabs { + grid-template-columns: 1fr; + padding: 0.35rem; + } + + .featureTab { + min-height: 3.75rem; + } + + .featureTabHint { + display: none; + } } diff --git a/docs-site/src/pages/index.tsx b/docs-site/src/pages/index.tsx index c903b1a6..d1829be1 100644 --- a/docs-site/src/pages/index.tsx +++ b/docs-site/src/pages/index.tsx @@ -1,3 +1,4 @@ +import React, {useCallback, useEffect, useState} from 'react'; import clsx from 'clsx'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import useBaseUrl from '@docusaurus/useBaseUrl'; @@ -8,166 +9,487 @@ import Translate, {translate} from '@docusaurus/Translate'; import styles from './index.module.css'; -const features = [ +type FeatureTab = { + value: string; + label: string; + title: string; + description: string; + bullets: string[]; + lightImage: string; + darkImage: string; +}; + +type SummaryCard = { + title: string; + description: string; +}; + +type DownloadPlatform = { + key: string; + href: string; +}; + +const downloadPlatforms: DownloadPlatform[] = [ { - title: 安全高效的 SSH 连接, - icon: ( - - - - - - ), - description: ( - - 基于 Rust russh 库构建,提供安全、高性能的 SSH 连接。支持密码和密钥认证、代理转发、TOFU 主机密钥验证。 - - ), + key: 'windows-x86_64', + href: 'https://dragonfly.coderkang.top/download/windows-x86_64', }, { - title: 集成 SFTP 文件管理, - icon: ( - - - - - - ), - description: ( - - 内置文件浏览器,直接在侧边栏管理远程文件。支持上传、下载、重命名、权限修改等操作,传输进度实时可见。 - - ), + key: 'linux-x86_64', + href: 'https://dragonfly.coderkang.top/download/linux-x86_64', }, { - title: 多标签终端界面, - icon: ( - - - - - ), - description: ( - - 同时管理多个 SSH 和本地终端会话。支持 WebGL 硬件加速渲染、自定义字体、关键词高亮、命令历史模糊搜索。 - - ), + key: 'darwin-x86_64', + href: 'https://dragonfly.coderkang.top/download/darwin-x86_64', }, { - title: 加密同步与备份, - icon: ( - - - - - - ), - description: ( - - 通过 WebDAV 或 S3 兼容存储同步 Dragonfly 的可移植配置,并为连接、凭据和常用设置创建可恢复的加密备份快照。 - - ), + key: 'darwin-aarch64', + href: 'https://dragonfly.coderkang.top/download/darwin-aarch64', }, - { - title: 高度可定制, - icon: ( - - - - - ), - description: ( - - 深色/浅色主题切换、可调整面板布局、快捷命令管理、多语言翻译、快捷键自定义,打造专属工作流。 - - ), +]; + +const featureAutoplayStoppedKey = 'dragonfly-home-feature-tabs-autoplay-stopped'; +const featureAutoplayIntervalMs = 4200; + +function detectDownloadPlatform(): DownloadPlatform { + if (typeof navigator === 'undefined') { + return downloadPlatforms[0]; } -]; -const techStack = [ - { name: 'Tauri 2', color: '#FFC131' }, - { name: 'React 19', color: '#61DAFB' }, - { name: 'Rust', color: '#DEA584' }, - { name: 'TypeScript', color: '#3178C6' }, - { name: 'xterm.js', color: '#0EAD69' }, -]; + const platform = navigator.platform.toLowerCase(); + const userAgent = navigator.userAgent.toLowerCase(); -function HomepageHeader() { - const {siteConfig} = useDocusaurusContext(); - const logoUrl = useBaseUrl('/img/logo.svg'); - return ( -
-
-
- Dragonfly Logo -
- - {siteConfig.title} - -

- 现代高性能 SSH 客户端 -

-

- - 基于 Tauri 和 React 构建,跨平台、安全、快速 - -

-
- - 快速开始 - - - - - - - - - - GitHub - -
-
- {techStack.map((tech) => ( - - - {tech.name} - - ))} -
-
-
-
- ); + if (platform.includes('mac') || userAgent.includes('mac os')) { + return downloadPlatforms.find((item) => item.key === 'darwin-x86_64') ?? downloadPlatforms[0]; + } + + if (platform.includes('linux') || userAgent.includes('linux')) { + return downloadPlatforms.find((item) => item.key === 'linux-x86_64') ?? downloadPlatforms[0]; + } + + return downloadPlatforms[0]; } -function Feature({title, icon, description}: {title: React.ReactNode; icon: React.ReactNode; description: React.ReactNode}) { +function getDownloadPlatformLabel(key: DownloadPlatform['key']) { + switch (key) { + case 'windows-x86_64': + return translate({message: 'Windows x86_64'}); + case 'linux-x86_64': + return translate({message: 'Linux x86_64'}); + case 'darwin-x86_64': + return translate({message: 'macOS Intel'}); + case 'darwin-aarch64': + return translate({message: 'macOS Apple Silicon'}); + default: + return key; + } +} + +function DownloadButton() { + const [platform, setPlatform] = useState(downloadPlatforms[0]); + + useEffect(() => { + const detectedPlatform = detectDownloadPlatform(); + setPlatform(detectedPlatform); + + const userAgentData = ( + navigator as Navigator & { + userAgentData?: { + platform?: string; + getHighEntropyValues?: (hints: string[]) => Promise<{architecture?: string; platform?: string}>; + }; + } + ).userAgentData; + + const entropyPromise = userAgentData?.getHighEntropyValues?.(['architecture', 'platform']); + + entropyPromise + ?.then((values) => { + const detectedOs = values.platform?.toLowerCase() ?? userAgentData.platform?.toLowerCase() ?? ''; + const architecture = values.architecture?.toLowerCase() ?? ''; + + if (detectedOs.includes('mac') && ['arm', 'arm64', 'aarch64'].includes(architecture)) { + const appleSilicon = downloadPlatforms.find((item) => item.key === 'darwin-aarch64'); + if (appleSilicon) { + setPlatform(appleSilicon); + } + } + }) + .catch(() => { + // The synchronous detector above is sufficient when high entropy hints are unavailable. + }); + }, []); + return ( -
-
- {icon} -
- {title} -

{description}

+
+ + 下载 + {getDownloadPlatformLabel(platform.key)} + +
+ + + +
+ {downloadPlatforms.map((item) => ( + + {getDownloadPlatformLabel(item.key)} + + ))} +
+
); } -function HomepageFeatures() { +function FeaturePreview({ + title, + lightImage, + darkImage, +}: { + title: string; + lightImage: string; + darkImage: string; +}) { + const lightImageUrl = useBaseUrl(lightImage); + const darkImageUrl = useBaseUrl(darkImage); + return ( -
+
+
+ {translate({message: +
+
+ {translate({message: +
+
+ ); +} + +function HeroPreview({ + lightImage, + darkImage, +}: { + lightImage: string; + darkImage: string; +}) { + const lightImageUrl = useBaseUrl(lightImage); + const darkImageUrl = useBaseUrl(darkImage); + + return ( +
+
+
+ {translate({message: +
+
+ {translate({message: +
+
+
+ ); +} + +function HomepageHeader() { + const {siteConfig} = useDocusaurusContext(); + const logoUrl = useBaseUrl('/img/logo.svg'); + + const badges = [ + translate({message: 'SSH'}), + translate({message: 'Local Shell'}), + translate({message: 'Telnet / Serial'}), + translate({message: 'SFTP'}), + translate({message: 'WebDAV / S3'}), + ]; + + return ( +
-
- {features.map((props, idx) => ( - +
+
+
+ Dragonfly Logo +
+ + {siteConfig.title} + +
+
+ +

+ 用于 SSH、串口和本地命令行工作的桌面终端客户端。 +

+

+ + Dragonfly 将终端会话、远程文件、认证信息、端口转发和配置备份放在同一个桌面应用中,适合日常开发、服务器维护和设备调试。 + +

+ +
+ + 快速开始 + + +
+ +
+ {badges.map((badge) => ( + + {badge} + + ))} +
+
+ + +
+
+
+ ); +} + +function FeaturesSection({features}: {features: FeatureTab[]}) { + const [activeValue, setActiveValue] = useState(features[0]?.value ?? ''); + const [autoplayStopped, setAutoplayStopped] = useState(false); + + const activeIndex = Math.max( + 0, + features.findIndex((feature) => feature.value === activeValue), + ); + const activeFeature = features[activeIndex] ?? features[0]; + const isAutoplaying = !autoplayStopped && features.length > 1; + + const stopAutoplay = useCallback(() => { + setAutoplayStopped(true); + + if (typeof sessionStorage !== 'undefined') { + sessionStorage.setItem(featureAutoplayStoppedKey, 'true'); + } + }, []); + + const selectFeature = useCallback( + (value: string) => { + stopAutoplay(); + setActiveValue(value); + }, + [stopAutoplay], + ); + + const selectFeatureByOffset = useCallback( + (offset: number) => { + const nextIndex = (activeIndex + offset + features.length) % features.length; + const nextValue = features[nextIndex]?.value; + + if (nextValue) { + selectFeature(nextValue); + } + }, + [activeIndex, features, selectFeature], + ); + + useEffect(() => { + if (typeof sessionStorage === 'undefined') { + return; + } + + setAutoplayStopped(sessionStorage.getItem(featureAutoplayStoppedKey) === 'true'); + }, []); + + useEffect(() => { + if (!features.some((feature) => feature.value === activeValue)) { + setActiveValue(features[0]?.value ?? ''); + } + }, [activeValue, features]); + + useEffect(() => { + if (autoplayStopped) { + return; + } + + const mediaQuery = window.matchMedia?.('(prefers-reduced-motion: reduce)'); + if (mediaQuery?.matches) { + setAutoplayStopped(true); + return; + } + + const stopOnUserAction = () => stopAutoplay(); + const listenerOptions: AddEventListenerOptions = {passive: true}; + + window.addEventListener('pointerdown', stopOnUserAction, listenerOptions); + window.addEventListener('keydown', stopOnUserAction); + window.addEventListener('wheel', stopOnUserAction, listenerOptions); + window.addEventListener('touchstart', stopOnUserAction, listenerOptions); + + return () => { + window.removeEventListener('pointerdown', stopOnUserAction); + window.removeEventListener('keydown', stopOnUserAction); + window.removeEventListener('wheel', stopOnUserAction); + window.removeEventListener('touchstart', stopOnUserAction); + }; + }, [autoplayStopped, stopAutoplay]); + + useEffect(() => { + if (!isAutoplaying) { + return; + } + + const intervalId = window.setInterval(() => { + setActiveValue((currentValue) => { + const currentIndex = features.findIndex((feature) => feature.value === currentValue); + const nextIndex = currentIndex >= 0 ? (currentIndex + 1) % features.length : 0; + return features[nextIndex]?.value ?? currentValue; + }); + }, featureAutoplayIntervalMs); + + return () => window.clearInterval(intervalId); + }, [features, isAutoplaying]); + + if (!activeFeature) { + return null; + } + + return ( +
+
+
+
+ {features.map((feature, index) => { + const isActive = feature.value === activeFeature.value; + + return ( + + ); + })} +
+ +
+
+ + {activeFeature.title} + +

{activeFeature.description}

+
    + {activeFeature.bullets.map((bullet) => ( +
  • + {bullet} +
  • + ))} +
+
+ + +
+
+
+
+ ); +} + +function JourneySection() { + const steps = [ + { + title: translate({message: '安装并建立第一个连接'}), + description: translate({message: '了解安装方式、创建连接和进入工作区的基本流程。'}), + to: '/docs/getting-started/quick-start', + label: translate({message: '查看快速开始'}), + }, + { + title: translate({message: '按功能查阅使用说明'}), + description: translate({message: '查看 SSH、SFTP、终端操作、OTP、主题、代理和同步备份的具体用法。'}), + to: '/docs/', + label: translate({message: '查看文档'}), + }, + { + title: translate({message: '查看版本变化'}), + description: translate({message: '了解各版本新增功能、行为调整和需要注意的兼容性变化。'}), + to: '/changelog', + label: translate({message: '查看更新记录'}), + }, + ]; + + return ( +
+
+
+ + 继续了解 Dragonfly + +
+ +
+ {steps.map((step) => ( +
+ + {step.title} + +

{step.description}

+ + {step.label} + +
))}
@@ -175,15 +497,102 @@ function HomepageFeatures() { ); } - export default function Home(): React.ReactElement { + const overviewCards: SummaryCard[] = [ + { + title: translate({message: '多种终端会话'}), + description: translate({message: '支持 SSH、本地 shell、Telnet 和串口会话,可在标签页和分屏中同时工作。'}), + }, + { + title: translate({message: '终端输出阅读'}), + description: translate({message: '提供搜索、命令历史建议、时间戳、关键词高亮和大输出保护。'}), + }, + { + title: translate({message: '文件、认证与网络'}), + description: translate({message: '包含 SFTP、OTP、代理、跳板机、端口转发和主机密钥校验。'}), + }, + { + title: translate({message: '配置同步与备份'}), + description: translate({message: '可通过 WebDAV 或 S3 兼容存储保存加密配置快照。'}), + }, + ]; + + const featureTabs: FeatureTab[] = [ + { + value: 'workspace', + label: translate({message: '工作区'}), + title: translate({message: '在一个工作区中组织多种会话'}), + description: translate({message: 'SSH、本地 shell、Telnet 和串口会话使用同一套标签页与分屏布局,便于同时查看不同主机、设备或任务。'}), + bullets: [ + translate({message: '用标签页区分不同连接、任务或环境'}), + translate({message: '在单个标签页内横向或纵向拆分终端区域'}), + translate({message: '在侧边区域查看会话列表、文件和资源信息'}), + ], + lightImage: '/img/home/overview-light.png', + darkImage: '/img/home/overview-dark.png', + }, + { + value: 'terminal', + label: translate({message: '终端'}), + title: translate({message: '改进命令输入和输出阅读'}), + description: translate({message: '终端区域提供搜索、命令历史建议和输出标记,减少在长日志、重复命令和排错信息之间来回查找的成本。'}), + bullets: [ + translate({message: '根据历史命令提供输入建议'}), + translate({message: '支持终端内搜索、选中文本搜索和翻译'}), + translate({message: '可显示时间戳、动作链接和关键词高亮'}), + ], + lightImage: '/img/home/terminal-light.png', + darkImage: '/img/home/terminal-dark.png', + }, + { + value: 'files', + label: translate({message: '文件传输'}), + title: translate({message: '在终端旁处理远程文件'}), + description: translate({message: 'SFTP 文件浏览器与终端工作区并列使用,适合查看日志、上传构建产物或调整远程配置文件。'}), + bullets: [ + translate({message: '支持上传、下载、重命名、移动、删除和属性查看'}), + translate({message: '传输任务可暂停、继续、取消和失败重试'}), + translate({message: '本地编辑文件后可自动回传到远端路径'}), + ], + lightImage: '/img/home/files-light.png', + darkImage: '/img/home/files-dark.png', + }, + { + value: 'security', + label: translate({message: '安全与网络'}), + title: translate({message: '管理连接认证和网络访问方式'}), + description: translate({message: '围绕 SSH 连接所需的凭据、主机校验、一次性口令、代理和端口转发提供统一配置入口。'}), + bullets: [ + translate({message: '保存密码、私钥和 known hosts,并使用本地加密存储'}), + translate({message: '支持 TOTP / HOTP、二维码导入和 SSH 登录自动填充'}), + translate({message: '配置代理、跳板机、本地转发、远程转发和动态转发'}), + ], + lightImage: '/img/home/security-light.png', + darkImage: '/img/home/security-dark.png', + }, + { + value: 'sync', + label: translate({message: '同步与备份'}), + title: translate({message: '同步和恢复可移植配置'}), + description: translate({message: 'Dragonfly 可将连接、凭据配置和常用设置打包为加密快照,用于备份、迁移或在多台设备之间同步。'}), + bullets: [ + translate({message: '支持 WebDAV 和 S3 兼容存储'}), + translate({message: '使用主密码保护同步和备份数据'}), + translate({message: '支持 `.dgfy` 导入导出,并处理远端与本地版本冲突'}), + ], + lightImage: '/img/home/sync-light.png', + darkImage: '/img/home/sync-dark.png', + }, + ]; + return ( + description={translate({message: '支持 SSH、串口、本地 shell、SFTP 和配置备份的桌面终端客户端'})}>
- + +
); diff --git a/docs-site/static/img/home/files-dark.png b/docs-site/static/img/home/files-dark.png new file mode 100644 index 00000000..c48a8ca6 Binary files /dev/null and b/docs-site/static/img/home/files-dark.png differ diff --git a/docs-site/static/img/home/files-light.png b/docs-site/static/img/home/files-light.png new file mode 100644 index 00000000..04167ae2 Binary files /dev/null and b/docs-site/static/img/home/files-light.png differ diff --git a/docs-site/static/img/home/overview-dark.png b/docs-site/static/img/home/overview-dark.png new file mode 100644 index 00000000..00658a63 Binary files /dev/null and b/docs-site/static/img/home/overview-dark.png differ diff --git a/docs-site/static/img/home/overview-light.png b/docs-site/static/img/home/overview-light.png new file mode 100644 index 00000000..c9b1761e Binary files /dev/null and b/docs-site/static/img/home/overview-light.png differ diff --git a/docs-site/static/img/home/product-dark.png b/docs-site/static/img/home/product-dark.png new file mode 100644 index 00000000..32b70177 Binary files /dev/null and b/docs-site/static/img/home/product-dark.png differ diff --git a/docs-site/static/img/home/product-light.png b/docs-site/static/img/home/product-light.png new file mode 100644 index 00000000..87b039a5 Binary files /dev/null and b/docs-site/static/img/home/product-light.png differ diff --git a/docs-site/static/img/home/security-dark.png b/docs-site/static/img/home/security-dark.png new file mode 100644 index 00000000..f6afdba9 Binary files /dev/null and b/docs-site/static/img/home/security-dark.png differ diff --git a/docs-site/static/img/home/security-light.png b/docs-site/static/img/home/security-light.png new file mode 100644 index 00000000..b2d3e82a Binary files /dev/null and b/docs-site/static/img/home/security-light.png differ diff --git a/docs-site/static/img/home/sync-dark.png b/docs-site/static/img/home/sync-dark.png new file mode 100644 index 00000000..f8b9d3e4 Binary files /dev/null and b/docs-site/static/img/home/sync-dark.png differ diff --git a/docs-site/static/img/home/sync-light.png b/docs-site/static/img/home/sync-light.png new file mode 100644 index 00000000..9242c570 Binary files /dev/null and b/docs-site/static/img/home/sync-light.png differ diff --git a/docs-site/static/img/home/terminal-dark.png b/docs-site/static/img/home/terminal-dark.png new file mode 100644 index 00000000..e50a31b6 Binary files /dev/null and b/docs-site/static/img/home/terminal-dark.png differ diff --git a/docs-site/static/img/home/terminal-light.png b/docs-site/static/img/home/terminal-light.png new file mode 100644 index 00000000..6a4377a2 Binary files /dev/null and b/docs-site/static/img/home/terminal-light.png differ