From a5c29472bb2d88bc23e802dc29a54a0c18208e32 Mon Sep 17 00:00:00 2001 From: raclen-55600 <2275025@qq.com> Date: Sun, 1 Nov 2026 00:38:58 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=EF=BC=9A=E4=B8=A4?= =?UTF-8?q?=E5=A5=97=E6=9A=96=E8=89=B2=E7=8B=AC=E7=AB=8B=E8=89=B2=E6=9D=BF?= =?UTF-8?q?=E3=80=8C=E6=9E=AB=E5=8F=B6=C2=B7=E7=99=BD=20/=20=E6=9E=AB?= =?UTF-8?q?=E5=8F=B6=C2=B7=E9=BB=91=E3=80=8D=EF=BC=8C=E4=BD=9C=E4=B8=BA=20?= =?UTF-8?q?`maple-light`=20/=20`maple-dark`=20=E4=B8=A4=E4=B8=AA=E6=A1=A3?= =?UTF-8?q?=E4=BD=8D=E6=8E=A5=E5=85=A5=E8=AE=BE=E7=BD=AE=E9=A1=B5=E3=80=8C?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E6=A8=A1=E5=BC=8F=E3=80=8D=E3=80=82=E4=B8=A4?= =?UTF-8?q?=E6=A1=A3=E5=90=84=E8=87=AA=E5=9B=BA=E5=AE=9A=E6=98=8E=E6=9A=97?= =?UTF-8?q?=E3=80=81=E4=B8=8D=E9=9A=8F=E7=B3=BB=E7=BB=9F=E5=8F=98=E5=8C=96?= =?UTF-8?q?=EF=BC=9B=E7=AA=97=E5=8F=A3=E6=A0=87=E9=A2=98=E6=A0=8F=E4=B8=8E?= =?UTF-8?q?=20`color-scheme`=20=E9=9A=8F=E4=B9=8B=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E4=BC=9A=E5=87=BA=E7=8E=B0=E6=B7=B1=E8=89=B2?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E9=85=8D=E6=B5=85=E8=89=B2=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E6=A0=8F=E3=80=82=E6=A1=8C=E9=9D=A2=E7=AB=AF=E3=80=81=E7=A7=BB?= =?UTF-8?q?=E5=8A=A8=E7=AB=AF=E3=80=81=E9=A6=96=E5=B1=8F=E5=86=85=E8=81=94?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E4=B8=89=E5=A4=84=E5=88=A4=E5=AE=9A=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=E7=BB=9F=E4=B8=80=E3=80=82=202.=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=EF=BC=9A=E4=BE=A7=E6=A0=8F=E5=BA=95=E9=83=A8=E7=9A=84=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E4=B8=89=E9=94=AE=EF=BC=88`#theme-switch`=EF=BC=89?= =?UTF-8?q?=E3=80=82=E4=B8=BB=E9=A2=98=E5=85=A5=E5=8F=A3=E6=94=B6=E6=95=9B?= =?UTF-8?q?=E5=88=B0=E8=AE=BE=E7=BD=AE=20=E2=86=92=20=E6=98=BE=E7=A4=BA=20?= =?UTF-8?q?=E2=86=92=20=E6=98=BE=E7=A4=BA=E6=A8=A1=E5=BC=8F=E4=B8=80?= =?UTF-8?q?=E5=A4=84=EF=BC=8C=E9=81=BF=E5=85=8D=E5=90=8C=E4=B8=80=E4=BB=BD?= =?UTF-8?q?=E5=81=8F=E5=A5=BD=E6=9C=89=E4=B8=A4=E5=A5=97=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E3=80=81=E7=8A=B6=E6=80=81=E4=BA=92=E7=9B=B8=E6=89=93=E6=9E=B6?= =?UTF-8?q?=EF=BC=9B`ui-kit/styles/shell.css`=20=E9=87=8C=E4=B8=BA?= =?UTF-8?q?=E8=BF=99=E4=B8=AA=E5=AE=B9=E5=99=A8=E5=86=99=E7=9A=84=E4=B8=89?= =?UTF-8?q?=E6=9D=A1=E5=93=8D=E5=BA=94=E5=BC=8F=E8=A7=84=E5=88=99=E4=B8=80?= =?UTF-8?q?=E5=B9=B6=E5=88=A0=E9=99=A4=E3=80=82=203.=20=E8=A1=A5=E5=85=A8?= =?UTF-8?q?=EF=BC=9A=E4=BA=94=E8=AF=AD=E8=A8=80=EF=BC=88en=20/=20ja=20/=20?= =?UTF-8?q?ko=20/=20pt-BR=20/=20zh-Hant=EF=BC=89=E7=9A=84=E6=A1=A3?= =?UTF-8?q?=E4=BD=8D=E5=90=8D=E7=A7=B0=E3=80=81=E7=8A=B6=E6=80=81=E8=AF=B4?= =?UTF-8?q?=E6=98=8E=E4=B8=8E=E6=8F=90=E7=A4=BA=E6=96=87=E6=A1=88=E3=80=82?= =?UTF-8?q?=204.=20=E5=90=8C=E6=9C=9F=E4=BA=A7=E7=89=A9=EF=BC=9A=E9=87=8D?= =?UTF-8?q?=E5=BB=BA=20`ui/islands/ui.css`=20=E4=B8=8E=20`ui.js`=EF=BC=8C?= =?UTF-8?q?=E9=87=8D=E7=BC=96=20`ui/i18n/*`=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 窗口层级只认浅色 / 深色两个语义(`setWindowTheme`),所以枫叶两档需要映射到最接近的一侧,而不是把自定义名直接透传下去 —— `app.js` 与 `index.html` 的首屏脚本都按这个口径判定。 Co-Authored-By: Claude Code --- desktop-tauri/i18n/i18n-src/en/settings.json | 5 + desktop-tauri/i18n/i18n-src/ja/settings.json | 5 + desktop-tauri/i18n/i18n-src/ko/settings.json | 5 + .../i18n/i18n-src/pt-BR/settings.json | 5 + .../i18n/i18n-src/zh-Hant/settings.json | 5 + desktop-tauri/mobile/src/pages/MorePage.tsx | 10 +- desktop-tauri/mobile/src/state/store.ts | 9 +- .../ui-islands/src/desktop-shell.tsx | 13 +- .../ui-islands/src/islands/settings-model.ts | 33 ++- .../ui-islands/src/islands/settings-page.tsx | 10 +- desktop-tauri/ui-kit/styles/shell.css | 19 -- desktop-tauri/ui-kit/styles/theme.css | 243 ++++++++++++++++++ desktop-tauri/ui/app.js | 17 +- desktop-tauri/ui/i18n/en/settings.js | 2 +- desktop-tauri/ui/i18n/ja/settings.js | 2 +- desktop-tauri/ui/i18n/ko/settings.js | 2 +- desktop-tauri/ui/i18n/pt-BR/settings.js | 2 +- desktop-tauri/ui/i18n/zh-Hant/settings.js | 2 +- desktop-tauri/ui/index.html | 4 +- desktop-tauri/ui/islands/ui.css | 2 +- desktop-tauri/ui/islands/ui.js | 122 ++++----- 21 files changed, 393 insertions(+), 124 deletions(-) diff --git a/desktop-tauri/i18n/i18n-src/en/settings.json b/desktop-tauri/i18n/i18n-src/en/settings.json index 9bd2855db..26a6091b3 100644 --- a/desktop-tauri/i18n/i18n-src/en/settings.json +++ b/desktop-tauri/i18n/i18n-src/en/settings.json @@ -502,6 +502,7 @@ "控制报表与请求日志里 Token 读数的写法:开启后按「万 / 亿」式的本地量级词显示(简体为万 / 亿,繁体为萬 / 億,日文为万 / 億,韩文为만 / 억),关闭则用 k / M 缩写(与上游文档、接口字段的写法一致)。英文 / 葡语的本地量级词就是 k / M,这项对它们没有区别。只影响显示口径,不改变任何统计与存储的数值。": "Controls how Token counts are written in reports and request logs: when on, values are shown with 万 / 亿-style local magnitude words (万 / 亿 in Simplified Chinese, 萬 / 億 in Traditional Chinese, 万 / 億 in Japanese, 만 / 억 in Korean); when off, k / M abbreviations are used (matching how upstream docs and API fields write them). For English / Portuguese the local magnitude words are k / M, so this makes no difference to them. This only affects how values are displayed; no statistics or stored numbers change.", "控制报表与请求日志里 Token 读数的写法:开启后按中文量级显示(1.2亿 / 8400万),关闭则用 k / M / B 缩写(与上游文档、接口字段的写法一致)。这只影响显示口径,不改变任何统计与存储的数值。": "Controls how token counts read in reports and request logs: on shows Chinese magnitudes (1.2亿 / 8400万), off uses k / M / B abbreviations (consistent with upstream docs and API fields). This only changes the display; no statistics or stored numbers are affected.", "控制界面的深浅色,与左侧边栏底部的三个主题按钮是同一个设置(改哪一处,另一处立刻跟上)。「跟随系统」会随操作系统当前的浅色 / 深色自动切换,并在系统主题变化时即时跟上;选「浅色」或「深色」则把界面固定在该模式,不再随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏的情况。": "Controls the UI's light / dark colors; it is the same setting as the three theme buttons at the bottom of the left sidebar (change either one and the other follows immediately). \"System\" switches automatically with the operating system's current light / dark setting and follows changes as they happen; choosing \"Light\" or \"Dark\" pins the UI to that mode regardless of the system. The window title bar's light / dark color stays in sync too, so you never end up with a dark UI under a light title bar.", + "控制界面的配色。「跟随系统」随操作系统的浅色 / 深色自动切换;「浅色」「深色」把界面固定在该模式;「枫叶·白」「枫叶·黑」是两套暖色独立色板(暖米白 / 暖石墨底配陶红强调),各自固定明暗、不随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏。": "Colors for the interface. \"System\" follows the OS light/dark setting; \"Light\" and \"Dark\" pin the interface to that mode; \"Maple Light\" and \"Maple Dark\" are two warm standalone palettes (warm off-white / warm graphite with a terracotta accent) that are each fixed to their own lightness and never follow the system. The window title bar follows along, so you never get a dark interface with a light title bar.", "提建议": "Make a Suggestion", "提示词文件": "Prompt File", "提示词文件已更新": "Prompt file updated", @@ -600,6 +601,10 @@ "条数": "Record count", "来源设备:{device}": "Source device: {device}", "来自 {device},生成于 {time}": "From {device}, created at {time}", + "枫叶·白": "Maple Light", + "枫叶·白:暖米白底配陶红强调的固定浅色主题,不随系统变化。": "Maple Light: a fixed light theme — warm off-white with a terracotta accent. Does not follow the system.", + "枫叶·黑": "Maple Dark", + "枫叶·黑:暖石墨底配同一抹陶红的固定深色主题,不随系统变化。": "Maple Dark: a fixed dark theme — warm graphite with the same terracotta accent. Does not follow the system.", "架构": "Architecture", "查看、安装和管理所连接网关的插件": "", "查询管理员状态失败:{message}": "Failed to check admin status: {message}", diff --git a/desktop-tauri/i18n/i18n-src/ja/settings.json b/desktop-tauri/i18n/i18n-src/ja/settings.json index 1b06bf44d..718d2ec7b 100644 --- a/desktop-tauri/i18n/i18n-src/ja/settings.json +++ b/desktop-tauri/i18n/i18n-src/ja/settings.json @@ -502,6 +502,7 @@ "控制报表与请求日志里 Token 读数的写法:开启后按「万 / 亿」式的本地量级词显示(简体为万 / 亿,繁体为萬 / 億,日文为万 / 億,韩文为만 / 억),关闭则用 k / M 缩写(与上游文档、接口字段的写法一致)。英文 / 葡语的本地量级词就是 k / M,这项对它们没有区别。只影响显示口径,不改变任何统计与存储的数值。": "レポートとリクエストログにおける Token の数値表記を制御します:オンにすると「万 / 億」式のローカル量級語で表示し(簡体字は万 / 亿、繁体字は萬 / 億、日本語は万 / 億、韓国語は만 / 억)、オフにすると k / M 略記を使用します(アップストリームのドキュメントやインターフェースのフィールド表記と一致)。英語 / ポルトガル語ではローカル量級語がそのまま k / M なので、この項目による違いはありません。影響するのは表示の形式のみで、統計や保存される数値は変わりません。", "控制报表与请求日志里 Token 读数的写法:开启后按中文量级显示(1.2亿 / 8400万),关闭则用 k / M / B 缩写(与上游文档、接口字段的写法一致)。这只影响显示口径,不改变任何统计与存储的数值。": "レポートとリクエストログの Token 表記を切り替えます。オンでは中国語の数量単位(1.2億 / 8400万)、オフでは k / M / B の略記(上流のドキュメントや API フィールドと同じ書き方)で表示します。表示だけが変わり、統計値や保存値は変わりません。", "控制界面的深浅色,与左侧边栏底部的三个主题按钮是同一个设置(改哪一处,另一处立刻跟上)。「跟随系统」会随操作系统当前的浅色 / 深色自动切换,并在系统主题变化时即时跟上;选「浅色」或「深色」则把界面固定在该模式,不再随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏的情况。": "UI のライト / ダークを制御します。左サイドバー下部の 3 つのテーマボタンと同じ設定です(どちらを変更しても、もう一方にすぐ反映されます)。「システム」は OS の現在のライト / ダークに自動で切り替わり、システムテーマの変化にも即座に追従します。「ライト」または「ダーク」を選ぶと UI はそのモードに固定され、システムには連動しなくなります。ウィンドウタイトルバーのライト / ダークも一緒に同期され、ダークの UI にライトのタイトルバーが付くようなことはありません。", + "控制界面的配色。「跟随系统」随操作系统的浅色 / 深色自动切换;「浅色」「深色」把界面固定在该模式;「枫叶·白」「枫叶·黑」是两套暖色独立色板(暖米白 / 暖石墨底配陶红强调),各自固定明暗、不随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏。": "画面の配色。「システム」は OS のライト / ダーク設定に従います。「ライト」「ダーク」はそのモードに固定します。「メープル・ライト」「メープル・ダーク」は暖色系の独立パレット(温かいオフホワイト / 温かいグラファイトにテラコッタのアクセント)で、それぞれ明暗が固定され、システムには追従しません。ウィンドウのタイトルバーも連動するため、ダーク画面に明るいタイトルバーが残ることはありません。", "提建议": "提案する", "提示词文件": "システムプロンプトファイル", "提示词文件已更新": "システムプロンプトファイルを更新しました", @@ -600,6 +601,10 @@ "条数": "件数", "来源设备:{device}": "取得元デバイス:{device}", "来自 {device},生成于 {time}": "{device} から、{time} に作成", + "枫叶·白": "メープル・ライト", + "枫叶·白:暖米白底配陶红强调的固定浅色主题,不随系统变化。": "メープル・ライト:温かいオフホワイトにテラコッタのアクセントを添えた固定ライトテーマ。システムには追従しません。", + "枫叶·黑": "メープル・ダーク", + "枫叶·黑:暖石墨底配同一抹陶红的固定深色主题,不随系统变化。": "メープル・ダーク:温かいグラファイトに同じテラコッタのアクセントを添えた固定ダークテーマ。システムには追従しません。", "架构": "アーキテクチャ", "查看、安装和管理所连接网关的插件": "", "查询管理员状态失败:{message}": "管理者状態の照会に失敗しました:{message}", diff --git a/desktop-tauri/i18n/i18n-src/ko/settings.json b/desktop-tauri/i18n/i18n-src/ko/settings.json index 12453877e..2ed363f34 100644 --- a/desktop-tauri/i18n/i18n-src/ko/settings.json +++ b/desktop-tauri/i18n/i18n-src/ko/settings.json @@ -502,6 +502,7 @@ "控制报表与请求日志里 Token 读数的写法:开启后按「万 / 亿」式的本地量级词显示(简体为万 / 亿,繁体为萬 / 億,日文为万 / 億,韩文为만 / 억),关闭则用 k / M 缩写(与上游文档、接口字段的写法一致)。英文 / 葡语的本地量级词就是 k / M,这项对它们没有区别。只影响显示口径,不改变任何统计与存储的数值。": "리포트와 요청 로그에서 Token 수치를 쓰는 방식을 제어합니다. 켜면 「만 / 억」 단위의 로컬 규모 단어로 표시하고(중국어 간체는 万 / 亿, 중국어 번체는 萬 / 億, 일본어는 万 / 億, 한국어는 만 / 억), 끄면 k / M 축약을 사용합니다(업스트림 문서와 인터페이스 필드의 표기와 동일). 영어 / 포르투갈어의 로컬 규모 단어는 k / M이므로 이 항목은 이들 언어에 차이가 없습니다. 표시 방식에만 영향을 주며 통계와 저장된 수치는 바뀌지 않습니다.", "控制报表与请求日志里 Token 读数的写法:开启后按中文量级显示(1.2亿 / 8400万),关闭则用 k / M / B 缩写(与上游文档、接口字段的写法一致)。这只影响显示口径,不改变任何统计与存储的数值。": "보고서와 요청 로그의 Token 표기 방식을 바꿉니다. 켜면 중국어 단위(1.2억 / 8400만), 끄면 k / M / B 약어(업스트림 문서와 API 필드와 같은 표기)로 표시합니다. 표시 방식만 바뀌며 통계와 저장 값은 달라지지 않습니다.", "控制界面的深浅色,与左侧边栏底部的三个主题按钮是同一个设置(改哪一处,另一处立刻跟上)。「跟随系统」会随操作系统当前的浅色 / 深色自动切换,并在系统主题变化时即时跟上;选「浅色」或「深色」则把界面固定在该模式,不再随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏的情况。": "인터페이스의 라이트/다크를 제어하며, 왼쪽 사이드바 하단의 테마 버튼 세 개와 같은 설정입니다(어느 쪽을 바꾸든 다른 쪽이 즉시 따라갑니다). 「시스템」은 운영 체제의 현재 라이트 / 다크 설정에 따라 자동으로 전환되고 시스템 테마가 바뀌면 즉시 따라갑니다. 「라이트」나 「다크」를 선택하면 인터페이스가 해당 모드로 고정되어 시스템 설정을 따르지 않습니다. 창 제목 표시줄의 색상도 함께 동기화되어, 다크 인터페이스에 라이트 제목 표시줄이 붙는 일은 없습니다.", + "控制界面的配色。「跟随系统」随操作系统的浅色 / 深色自动切换;「浅色」「深色」把界面固定在该模式;「枫叶·白」「枫叶·黑」是两套暖色独立色板(暖米白 / 暖石墨底配陶红强调),各自固定明暗、不随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏。": "인터페이스 색상입니다. \"시스템\"은 운영체제의 라이트 / 다크 설정을 따릅니다. \"라이트\"와 \"다크\"는 해당 모드로 고정합니다. \"메이플 라이트\"와 \"메이플 다크\"는 따뜻한 톤의 독립 팔레트(따뜻한 오프화이트 / 따뜻한 그래파이트에 테라코타 강조색)로, 각각 밝기가 고정되어 시스템을 따르지 않습니다. 창 제목 표시줄도 함께 바뀌므로 어두운 화면에 밝은 제목 표시줄이 남는 일은 없습니다.", "提建议": "제안하기", "提示词文件": "시스템 프롬프트 파일", "提示词文件已更新": "시스템 프롬프트 파일이 업데이트되었습니다", @@ -600,6 +601,10 @@ "条数": "건수", "来源设备:{device}": "원본 기기: {device}", "来自 {device},生成于 {time}": "{device}에서 {time}에 생성", + "枫叶·白": "메이플 라이트", + "枫叶·白:暖米白底配陶红强调的固定浅色主题,不随系统变化。": "메이플 라이트: 따뜻한 오프화이트에 테라코타 강조색을 더한 고정 라이트 테마입니다. 시스템을 따르지 않습니다.", + "枫叶·黑": "메이플 다크", + "枫叶·黑:暖石墨底配同一抹陶红的固定深色主题,不随系统变化。": "메이플 다크: 따뜻한 그래파이트에 같은 테라코타 강조색을 더한 고정 다크 테마입니다. 시스템을 따르지 않습니다.", "架构": "아키텍처", "查看、安装和管理所连接网关的插件": "", "查询管理员状态失败:{message}": "관리자 상태 조회 실패: {message}", diff --git a/desktop-tauri/i18n/i18n-src/pt-BR/settings.json b/desktop-tauri/i18n/i18n-src/pt-BR/settings.json index 753495eb4..de67cca36 100644 --- a/desktop-tauri/i18n/i18n-src/pt-BR/settings.json +++ b/desktop-tauri/i18n/i18n-src/pt-BR/settings.json @@ -502,6 +502,7 @@ "控制报表与请求日志里 Token 读数的写法:开启后按「万 / 亿」式的本地量级词显示(简体为万 / 亿,繁体为萬 / 億,日文为万 / 億,韩文为만 / 억),关闭则用 k / M 缩写(与上游文档、接口字段的写法一致)。英文 / 葡语的本地量级词就是 k / M,这项对它们没有区别。只影响显示口径,不改变任何统计与存储的数值。": "Controla como o Token é exibido no relatório e nos logs de requisições: quando ativado, exibe com magnitudes locais no estilo “k / M” (chinês simplificado: 万 / 亿; chinês tradicional: 萬 / 億; japonês: 万 / 億; coreano: 만 / 억); quando desativado, usa abreviações k / M (igual à forma usada na documentação e nos campos da API do upstream). Para inglês e português, as magnitudes locais são exatamente k / M, então esta opção não faz diferença para eles. Afeta apenas a forma de exibição; não altera nenhum valor de estatística ou de armazenamento.", "控制报表与请求日志里 Token 读数的写法:开启后按中文量级显示(1.2亿 / 8400万),关闭则用 k / M / B 缩写(与上游文档、接口字段的写法一致)。这只影响显示口径,不改变任何统计与存储的数值。": "Controla como as contagens de token aparecem nos relatórios e no log de requisições: ativado mostra magnitudes chinesas (1.2亿 / 8400万), desativado usa abreviações k / M / B (iguais às dos documentos e campos de API do upstream). Isso altera apenas a exibição; nenhum número estatístico ou armazenado muda.", "控制界面的深浅色,与左侧边栏底部的三个主题按钮是同一个设置(改哪一处,另一处立刻跟上)。「跟随系统」会随操作系统当前的浅色 / 深色自动切换,并在系统主题变化时即时跟上;选「浅色」或「深色」则把界面固定在该模式,不再随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏的情况。": "Controla o tema claro / escuro da interface; é a mesma configuração dos três botões de tema no rodapé da barra lateral esquerda (mudar em um lugar reflete imediatamente no outro). “Sistema” acompanha automaticamente o tema claro / escuro atual do sistema operacional e reage na hora a mudanças no tema do sistema; escolher “Claro” ou “Escuro” fixa a interface nesse modo, sem seguir o sistema. A barra de título da janela acompanha junto, então não ocorre de a interface ficar escura com uma barra de título clara.", + "控制界面的配色。「跟随系统」随操作系统的浅色 / 深色自动切换;「浅色」「深色」把界面固定在该模式;「枫叶·白」「枫叶·黑」是两套暖色独立色板(暖米白 / 暖石墨底配陶红强调),各自固定明暗、不随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏。": "Cores da interface. \"Sistema\" segue a configuração claro/escuro do sistema operacional; \"Claro\" e \"Escuro\" fixam a interface nesse modo; \"Maple Claro\" e \"Maple Escuro\" são duas paletas quentes independentes (branco quente / grafite quente com destaque em terracota), cada uma com luminosidade fixa e sem seguir o sistema. A barra de título da janela acompanha, então nunca fica uma interface escura com barra de título clara.", "提建议": "Enviar sugestão", "提示词文件": "Arquivo de prompt", "提示词文件已更新": "Arquivo de prompt atualizado", @@ -600,6 +601,10 @@ "条数": "Quantidade de registros", "来源设备:{device}": "Dispositivo de origem: {device}", "来自 {device},生成于 {time}": "De {device}, criado em {time}", + "枫叶·白": "Maple Claro", + "枫叶·白:暖米白底配陶红强调的固定浅色主题,不随系统变化。": "Maple Claro: tema claro fixo — branco quente com destaque em terracota. Não segue o sistema.", + "枫叶·黑": "Maple Escuro", + "枫叶·黑:暖石墨底配同一抹陶红的固定深色主题,不随系统变化。": "Maple Escuro: tema escuro fixo — grafite quente com o mesmo destaque em terracota. Não segue o sistema.", "架构": "Arquitetura", "查看、安装和管理所连接网关的插件": "", "查询管理员状态失败:{message}": "Falha ao consultar o status do administrador: {message}", diff --git a/desktop-tauri/i18n/i18n-src/zh-Hant/settings.json b/desktop-tauri/i18n/i18n-src/zh-Hant/settings.json index 1c20acbcd..d60f65fb0 100644 --- a/desktop-tauri/i18n/i18n-src/zh-Hant/settings.json +++ b/desktop-tauri/i18n/i18n-src/zh-Hant/settings.json @@ -474,6 +474,7 @@ "控制报表与请求日志里 Token 读数的写法:开启后按「万 / 亿」式的本地量级词显示(简体为万 / 亿,繁体为萬 / 億,日文为万 / 億,韩文为만 / 억),关闭则用 k / M 缩写(与上游文档、接口字段的写法一致)。英文 / 葡语的本地量级词就是 k / M,这项对它们没有区别。只影响显示口径,不改变任何统计与存储的数值。": "", "控制报表与请求日志里 Token 读数的写法:开启后按中文量级显示(1.2亿 / 8400万),关闭则用 k / M / B 缩写(与上游文档、接口字段的写法一致)。这只影响显示口径,不改变任何统计与存储的数值。": "控制報表與請求日誌裡 Token 讀數的寫法:開啟後按中文量級顯示(1.2億 / 8400萬),關閉則用 k / M / B 縮寫(與上游文件、介面欄位的寫法一致)。這只影響顯示口徑,不改變任何統計與儲存的數值。", "控制界面的深浅色,与左侧边栏底部的三个主题按钮是同一个设置(改哪一处,另一处立刻跟上)。「跟随系统」会随操作系统当前的浅色 / 深色自动切换,并在系统主题变化时即时跟上;选「浅色」或「深色」则把界面固定在该模式,不再随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏的情况。": "", + "控制界面的配色。「跟随系统」随操作系统的浅色 / 深色自动切换;「浅色」「深色」把界面固定在该模式;「枫叶·白」「枫叶·黑」是两套暖色独立色板(暖米白 / 暖石墨底配陶红强调),各自固定明暗、不随系统变化。窗口标题栏的深浅色会一并同步,不会出现深色界面配一条浅色标题栏。": "控制介面的配色。「跟隨系統」隨作業系統的淺色 / 深色自動切換;「淺色」「深色」把介面固定在該模式;「楓葉·白」「楓葉·黑」是兩套暖色獨立色板(暖米白 / 暖石墨底配陶紅強調),各自固定明暗、不隨系統變化。視窗標題列的深淺色會一併同步,不會出現深色介面配一條淺色標題列。", "提建议": "", "提示词文件": "", "提示词文件已更新": "", @@ -567,6 +568,10 @@ "条数": "筆數", "来源设备:{device}": "", "来自 {device},生成于 {time}": "", + "枫叶·白": "楓葉·白", + "枫叶·白:暖米白底配陶红强调的固定浅色主题,不随系统变化。": "楓葉·白:暖米白底配陶紅強調的固定淺色主題,不隨系統變化。", + "枫叶·黑": "楓葉·黑", + "枫叶·黑:暖石墨底配同一抹陶红的固定深色主题,不随系统变化。": "楓葉·黑:暖石墨底配同一抹陶紅的固定深色主題,不隨系統變化。", "架构": "", "查看、安装和管理所连接网关的插件": "", "查询管理员状态失败:{message}": "", diff --git a/desktop-tauri/mobile/src/pages/MorePage.tsx b/desktop-tauri/mobile/src/pages/MorePage.tsx index 5ddfd39b8..0c36f0797 100644 --- a/desktop-tauri/mobile/src/pages/MorePage.tsx +++ b/desktop-tauri/mobile/src/pages/MorePage.tsx @@ -1,6 +1,6 @@ import { PageHead, SectionHead, IconButton } from '../components/ui' import { Icon, type IconName } from '../components/Icon' -import { store, useStore } from '../state/store' +import { store, useStore, type ThemeMode } from '../state/store' import { apiBase, baseLabel } from '../lib/servers' import { isRateLimited } from '../lib/format' import { usePullToRefresh, PullIndicator } from '../components/PullToRefresh' @@ -193,14 +193,16 @@ export function MorePage() { ) } -/** 主题三档:跟随系统 / 浅色 / 深色 */ +/** 主题五档:跟随系统 / 浅色 / 深色 / 枫叶·白 / 枫叶·黑(与桌面端设置页同一份取值) */ export function ThemeSwitch() { const { theme } = useStore() - const options: Array<{ value: 'system' | 'light' | 'dark'; label: string }> = [ + const options: Array<{ value: ThemeMode; label: string }> = [ { value: 'system', label: t('系统') }, { value: 'light', label: t('浅色') }, { value: 'dark', label: t('深色') }, + { value: 'maple-light', label: t('枫叶·白') }, + { value: 'maple-dark', label: t('枫叶·黑') }, ] return store.setTheme(value as 'system' | 'light' | 'dark')} /> + onValueChange={value => store.setTheme(value)} /> } diff --git a/desktop-tauri/mobile/src/state/store.ts b/desktop-tauri/mobile/src/state/store.ts index 01562fa64..cd37fb671 100644 --- a/desktop-tauri/mobile/src/state/store.ts +++ b/desktop-tauri/mobile/src/state/store.ts @@ -31,7 +31,7 @@ import { type ServerEntry, } from '../lib/servers' -export type ThemeMode = 'system' | 'light' | 'dark' +export type ThemeMode = 'system' | 'light' | 'dark' | 'maple-light' | 'maple-dark' type Listener = () => void @@ -65,7 +65,8 @@ const THEME_KEY = 'workbuddy-desktop-theme' function readTheme(): ThemeMode { try { const value = localStorage.getItem(THEME_KEY) - if (value === 'light' || value === 'dark' || value === 'system') return value + if (value === 'light' || value === 'dark' || value === 'system' + || value === 'maple-light' || value === 'maple-dark') return value } catch { /* 隐私模式 */ } @@ -86,7 +87,9 @@ function readInitialRoute(): Route { function applyTheme(mode: ThemeMode): void { document.documentElement.dataset.theme = mode const systemDark = window.matchMedia('(prefers-color-scheme: dark)').matches - const effective = mode === 'dark' || (mode === 'system' && systemDark) ? 'dark' : 'light' + // 枫叶两档固定明暗(名字里的白 / 黑),不随系统变;判定与桌面端 app.js 同一口径 + const effective = mode === 'dark' || mode === 'maple-dark' + || (mode === 'system' && systemDark) ? 'dark' : 'light' document.documentElement.style.colorScheme = effective // 手机浏览器 / PWA 状态栏配色。页面里有两套 media 版 theme-color(见 // m.html),这里把第一条的 media 摘掉后统一改写 —— 否则手选主题会被 diff --git a/desktop-tauri/ui-islands/src/desktop-shell.tsx b/desktop-tauri/ui-islands/src/desktop-shell.tsx index 1168d9df7..cf18d0967 100644 --- a/desktop-tauri/ui-islands/src/desktop-shell.tsx +++ b/desktop-tauri/ui-islands/src/desktop-shell.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { flushSync } from 'react-dom' import { createRoot } from 'react-dom/client' -import { AppFrame, Badge, BadgeDot, Button, Empty, NavList, NavItem, PageHeader, SegmentedControl, Sheet, SheetClose, SheetContent, Sidebar, SidebarContent, SidebarFooter, SidebarGroupLabel, SidebarHeader, Toaster, toastManager, useMediaQuery } from '@ui' +import { AppFrame, Badge, BadgeDot, Button, Empty, NavList, NavItem, PageHeader, Sheet, SheetClose, SheetContent, Sidebar, SidebarContent, SidebarFooter, SidebarGroupLabel, SidebarHeader, Toaster, toastManager, useMediaQuery } from '@ui' import { t } from './i18n' type Menu = { key: string; label: string; icon: string } @@ -11,7 +11,6 @@ type ShellApi = { sidebar(groups: Group[]): void page(page: string, label: string): void status(items: Status[], title?: string): void - theme(mode: string): void closeNavigation(): void toast(message: string, kind?: string): void } @@ -26,7 +25,6 @@ const host = () => window as unknown as HostWindow let groups: Group[] = [] let page = 'overview' let label = t('报表') -let mode = localStorage.getItem('workbuddy-desktop-theme') || 'system' let status: Status[] = [] let title = '' const listeners = new Set<() => void>() @@ -54,13 +52,6 @@ function Navigation() { } -function ThemeControl() { - React.useSyncExternalStore(listener => { listeners.add(listener); return () => listeners.delete(listener) }, () => revision) - return host().wbApp?.applyTheme(value)} /> -} - function TopbarStatus() { React.useSyncExternalStore(listener => { listeners.add(listener); return () => listeners.delete(listener) }, () => revision) const variants = { ok: 'success', warn: 'warning', bad: 'destructive', brand: 'brand' } as const @@ -94,7 +85,6 @@ function Frame() { }}>