From 773196d68982399caf1c8c090ac4243fa61bae96 Mon Sep 17 00:00:00 2001 From: CNWei Date: Mon, 26 Oct 2026 00:04:45 +0800 Subject: [PATCH] =?UTF-8?q?style(frontend):=20=E5=AF=B9=E9=BD=90=20Alright?= =?UTF-8?q?=20=E4=B8=BB=E9=A2=98=E5=B9=B6=E6=8E=A5=E5=85=A5=E7=A6=BB?= =?UTF-8?q?=E7=BA=BF=E5=AD=97=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 主题色板、圆角、阴影与 0.3s 缓动对齐参考站点,布局与尺寸不变 - index.html 预加载本地字体,index.css 定义 LXGW WenKai / Outfit-Medium - 新增断网渲染端到端用例与 ADR-0006 --- .../0006-visual-theme-and-offline-fonts.md | 32 ++++ frontend/e2e/dashboard.spec.ts | 38 +++++ frontend/index.html | 16 +- frontend/public/fonts/Outfit-Medium.ttf | Bin 0 -> 54824 bytes frontend/src/App.css | 154 +++++++++--------- frontend/src/index.css | 114 +++++++++---- 6 files changed, 247 insertions(+), 107 deletions(-) create mode 100644 docs/decisions/0006-visual-theme-and-offline-fonts.md create mode 100644 frontend/public/fonts/Outfit-Medium.ttf diff --git a/docs/decisions/0006-visual-theme-and-offline-fonts.md b/docs/decisions/0006-visual-theme-and-offline-fonts.md new file mode 100644 index 0000000..9e05ef9 --- /dev/null +++ b/docs/decisions/0006-visual-theme-and-offline-fonts.md @@ -0,0 +1,32 @@ +# ADR-0006:视觉风格对齐主题并自托管字体 + +- 状态:已接受 +- 日期:2026-10-25 + +## 背景 + +产品要求前端视觉与参考站点(Alright / nicetheme)一致,包括字体、配色和交互,但不改变既有布局。参考站点使用 Bootstrap 5 + 自定义变量,正文依赖 CDN 的 `lxgw-wenkai-webfont`,标题使用自托管的 `Outfit-Medium`。 + +本项目的目标是"本机、离线可复现":依赖 CDN 会在断网、内网或 CDN 故障时导致字体回退,从而破坏视觉一致性。 + +## 决策 + +1. 从参考站点抓取其 CSS 的变量定义,把真实色值映射到本项目既有语义变量(`--primary`、`--text-main`、`--border`、`--success` 等),布局相关声明一律不改。 +2. 交互细节对齐主题:`0.3s ease-in-out` 过渡、主/危险按钮 hover 使用 `opacity: .85`、输入框聚焦使用主色半透明光环、选中项使用主色浅染。 +3. 字重遵循主题的 `--font-weight-bold: 500`;标题与指标数字使用 `Outfit-Medium`,正文使用 `LXGW WenKai`,等宽使用主题的 `SFMono-Regular…Consolas` 栈。 +4. 字体全部自托管:`Outfit-Medium.ttf` 直接取自主题;`LXGW WenKai` 由官方 webfont 的 97 个 woff2 子集合并后,再裁剪到 GB2312 + 常用符号子集,输出简体中文 Regular 与 Bold 两个文件。 +5. 移除所有 Google Fonts / CDN 字体链接,`index.html` 只 preload 本地字体文件。 +6. 新增端到端用例"renders fully offline":拦截并拒绝一切非 `127.0.0.1` 请求,断言页面正常渲染、`document.fonts.check` 命中两种字体且没有任何外部请求。 + +## 原因 + +- 直接用主题的变量值,颜色不会"看起来像"而是确实一致。 +- 字体子集化把 8.8 MB 的 194 个子集压到 6.7 MB 的两个文件,仓库与安装包体积可控,浏览器只需一次请求。 +- 离线断言把"可复现"变成可回归的测试,而不是口头承诺。 + +## 边界 + +- 字体子集覆盖 GB2312(6763 字)+ Latin + CJK 标点 + 全角符号;更生僻的汉字(GB18030 扩展区)会按浏览器逐字回退到系统字体,显示正常但字形风格不一致。 +- 只包含 400 / 700 两个字重,500 / 600 由 CSS 字重匹配落到 400 / 700;主题的 Light(300)未包含。 +- 未实现参考站点的暗色模式(`data-scheme="dark"`)。 +- 字体文件随 `frontend/public/fonts` 一起进入安装包,体积增加约 6.7 MB。 diff --git a/frontend/e2e/dashboard.spec.ts b/frontend/e2e/dashboard.spec.ts index 6ad661b..5803dfd 100644 --- a/frontend/e2e/dashboard.spec.ts +++ b/frontend/e2e/dashboard.spec.ts @@ -221,3 +221,41 @@ test('cancels a running task from the log drawer', async ({ await drawer.getByRole('button', { name: '取消运行' }).click() await expect(drawer.locator('.status-cancelled').first()).toBeVisible() }) + +test('renders fully offline with bundled fonts', async ({ page }) => { + const blocked: string[] = [] + await page.route('**/*', (route) => { + const url = route.request().url() + const isLocal = + url.startsWith('http://127.0.0.1:5173') || + url.startsWith('http://localhost:5173') || + url.startsWith('data:') || + url.startsWith('blob:') + if (isLocal) { + return route.continue() + } + blocked.push(url) + return route.abort() + }) + + await page.goto('/') + await expect(page.getByRole('heading', { name: 'TaskPilot' })).toBeVisible() + + const fonts = await page.evaluate(async () => { + await document.fonts.ready + return { + wenkai: document.fonts.check('14px "LXGW WenKai"'), + display: document.fonts.check('500 26px "Outfit-Medium"'), + loaded: Array.from(document.fonts).map((face) => face.family), + } + }) + + expect(blocked).toEqual([]) + expect(fonts.wenkai).toBe(true) + expect(fonts.display).toBe(true) + expect(fonts.loaded).toContain('LXGW WenKai') + await page.screenshot({ + path: 'test-results/dashboard-offline.png', + fullPage: true, + }) +}) diff --git a/frontend/index.html b/frontend/index.html index 595f0b3..f4fb96b 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -7,11 +7,19 @@ name="description" content="TaskPilot - Windows 本地定时任务管理平台" /> - - + TaskPilot diff --git a/frontend/public/fonts/Outfit-Medium.ttf b/frontend/public/fonts/Outfit-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7ae796b940d1cdbde6ff8ee0647800e82678ec78 GIT binary patch literal 54824 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 TrgDP)B