From d380e18db007c22a131cf7007e798f338cba5c01 Mon Sep 17 00:00:00 2001 From: m1saka Date: Thu, 15 Oct 2026 21:25:58 +0800 Subject: [PATCH] feat(web): follow system dark mode and simplify workspace hint --- README.md | 2 +- web/index.html | 2 +- web/src/MonacoProfileEditor.tsx | 4 ++++ web/src/RuntimeWorkspace.tsx | 2 +- web/src/Workspace.tsx | 2 +- web/src/nightMode.test.ts | 32 +++++++++++++++++++++++++ web/src/nightMode.ts | 16 +++++++++++++ web/src/style.css | 42 +++++++++++++++++++++++++++++++++ 8 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 web/src/nightMode.test.ts create mode 100644 web/src/nightMode.ts diff --git a/README.md b/README.md index 0e0a310..3cbce15 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,6 @@ bash scripts/smoke-image.sh "$RUNTIME_IMAGE_ID" # 已由管理员构建的本 构建历史接口现默认分页(20条,最大100条),列表不再携带日志正文;日志通过 `/api/builds/{id}` 按需读取。升级面板后请刷新已打开的旧页面;外部脚本需按 API.md 更新,不能再依赖 `/api/builds` 返回全部历史或日志。 -合理替代方案为:stdlib HTTP Docker client而非官方SDK;每实例独立bridge而非共享bridge;服务端保管DSH cookie而非下发浏览器。前端已改用 Tailwind CSS + Radix 原语的 shadcn 风格组件(保留本地Monaco),桌面与移动端共用一套响应式界面。这些是选型差异,不降低功能、安全或验收标准,详见验收表。 +合理替代方案为:stdlib HTTP Docker client而非官方SDK;每实例独立bridge而非共享bridge;服务端保管DSH cookie而非下发浏览器。前端已改用 Tailwind CSS + Radix 原语的 shadcn 风格组件(保留本地Monaco),桌面与移动端共用一套响应式界面。界面跟随系统深浅色设置自动切换夜间模式(含 Monaco 编辑器),与内嵌 DSH 行为一致,无独立开关。这些是选型差异,不降低功能、安全或验收标准,详见验收表。 同源路径代理仅适用于可信用户/插件,尚无独立origin及宿主/局域网出站防护。默认软配额不能阻止agent直接写满磁盘;硬quota是依赖宿主的可选增强,不是默认路线必做项。升级/恢复快照需额外容量,home快照上限1 GiB,模板7的 `/workspace` 就是实例home,会随home快照回滚;旧共享目录不随回滚恢复;中断及回滚失败仍可能需要管理员恢复。 diff --git a/web/index.html b/web/index.html index 0477518..7e46cf3 100644 --- a/web/index.html +++ b/web/index.html @@ -1,2 +1,2 @@ -DSH · 工作台
+DSH · 工作台
diff --git a/web/src/MonacoProfileEditor.tsx b/web/src/MonacoProfileEditor.tsx index 8c2a752..f798a87 100644 --- a/web/src/MonacoProfileEditor.tsx +++ b/web/src/MonacoProfileEditor.tsx @@ -3,6 +3,7 @@ import { useEffect, useRef } from 'react'; import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; import 'monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution'; import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'; +import { useNightMode } from './nightMode'; // Vite emits this worker locally; no AMD loader or CDN is involved. self.MonacoEnvironment = { getWorker: () => new EditorWorker() }; @@ -21,6 +22,7 @@ export default function MonacoProfileEditor({ value, onChange, readOnly = false, change.current = onChange; const initialValue = useRef(value); const updating = useRef(false); + const dark = useNightMode(); useEffect(() => { if (!host.current) return; const model = monaco.editor.createModel(initialValue.current, 'yaml'); @@ -28,6 +30,7 @@ export default function MonacoProfileEditor({ value, onChange, readOnly = false, model, automaticLayout: true, minimap: { enabled: false }, scrollBeyondLastLine: false, tabSize: 2, insertSpaces: true, wordWrap: 'on', ariaLabel: label, readOnly, + theme: dark ? 'vs-dark' : 'vs', }); editor.current = instance; const listener = instance.onDidChangeModelContent(() => { @@ -44,5 +47,6 @@ export default function MonacoProfileEditor({ value, onChange, readOnly = false, } }, [value]); useEffect(() => { editor.current?.updateOptions({ readOnly, ariaLabel: label }); }, [readOnly, label]); + useEffect(() => { monaco.editor.setTheme(dark ? 'vs-dark' : 'vs'); }, [dark]); return
; } diff --git a/web/src/RuntimeWorkspace.tsx b/web/src/RuntimeWorkspace.tsx index 61ac0cf..1c2431f 100644 --- a/web/src/RuntimeWorkspace.tsx +++ b/web/src/RuntimeWorkspace.tsx @@ -116,7 +116,7 @@ export function RuntimeWorkspace({ runtime, visible, manage, settings }: {
} {selected?.status === 'running' &&
{frameError &&
DSH 页面加载失败或登录已失效,请重新加载或在新窗口打开。
} -