From 4d274aad7a77a9a05df54c426e7612c573be8e21 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Tue, 7 Jul 2026 23:41:50 +0800 Subject: [PATCH] =?UTF-8?q?docs(plan):=20=E5=89=8D=E7=AB=AF=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E7=B3=BB=E7=BB=9F=E6=B2=BB=E7=90=86=E9=87=8D=E6=9E=84?= =?UTF-8?q?=EF=BC=88ds-flow=20=E5=85=A8=E7=AB=AF=EF=BC=89=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E8=AE=A1=E5=88=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 用 ds-flow 把 Flutter 五端 + 官网 + 用户中心收口到「设计单源·代码镜像· 静态闸拦漂移·golden/fidelity 双级像素验收兜底」。 摸底结论:pangolin 非从零 bootstrap,已约 65% 达标(token 单源含暗色、 Flutter codegen+drift 闸、golden+CI 闸、pre-commit 写好未启用)。本计划是 补缺口 + Web 共享原子层去重,非推倒重来。主题保持 light/dark。 6 阶段:CLAUDE.md → 原型三件套(atoms/icons/index.html,收敛 ui_kits) → Web token 同源闸 → Web 原子层去重(各自实现+同源闸) → Flutter 收尾+golden 补齐 → 静态闸挂满+启用 pre-commit+fidelity 体检。 真相源(含 checkbox)+ HTML 阅读版 + 登记 docs/index.html;todo #19 tier-1。 Co-Authored-By: Claude Opus 4.8 --- docs/frontend-ds-refactor-plan.html | 163 ++++++++++++++++++ docs/index.html | 5 + .../plans/2026-07-07-frontend-ds-refactor.md | 132 ++++++++++++++ todo/todo.html | 144 +++++++++++++++- todo/todo.json | 85 +++++++-- 5 files changed, 504 insertions(+), 25 deletions(-) create mode 100644 docs/frontend-ds-refactor-plan.html create mode 100644 docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md diff --git a/docs/frontend-ds-refactor-plan.html b/docs/frontend-ds-refactor-plan.html new file mode 100644 index 0000000..45632cf --- /dev/null +++ b/docs/frontend-ds-refactor-plan.html @@ -0,0 +1,163 @@ + + + + + +前端设计系统治理重构(ds-flow)· 实现计划 + + + +
+ +

← 文档索引

+

前端设计系统治理重构 ds-flow

+

用 ds-flow 把 Flutter 五端 + 官网 + 用户中心收口到「设计单源 · 代码镜像 · 静态闸拦漂移 · 双级像素验收兜底」

+ +
+阅读版;执行真相源 docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md(含 checkbox)。
+关键前提:pangolin 不是从零 bootstrap,已约 65% 达标——token 单源(含暗色)、Flutter codegen + drift 闸、golden + CI 闸、pre-commit(写好未启用)都在。本计划是补缺口 + Web 共享原子层去重,非推倒重来。主题保持 light / dark 双主题。 +
+ +

现状盘点

+
+ + + + + + + + + + + +
维度现状缺口
Token 单源✓ colors_and_type.css(含 [data-theme=dark])迁为 ds-flow 原型结构
Flutter codegen / 主题层✓ gen 层/实现层分离 + drift 闸
Flutter UI 硬编码✓ 零裸 hex(唯 1 处裸色 adaptive_menu)清 1 处
Flutter golden✓ 36 张 + harness + 真字体 + CI6 张 failure;缺 CJK 测试字体;覆盖不全
website / usercenter✓ 179 / 171 处 var(--token)零前端测试
跨端共享组件✗ 下拉/按钮/卡片两端各写一遍抽 atoms 对齐
原型三件套⚠ 有 _ds_manifest/preview/ui_kits缺 atoms.css / icons.js / index.html
静态闸✓ redline / analyze+test / codegen-drift / golden✗ 硬编码色扫描 / fidelity / Web 同源
pre-commit⚠ .githooks 写好默认未启用
+
+ +

已定决策

+ + +

执行阶段(6 阶段)

+ +
+

Phase 0 — 更新 CLAUDE.md + 计划落库

+
    +
  • CLAUDE.md 补「前端设计系统治理(ds-flow)」章节:原型单源位置、codegen 命令、L1/L2/L3 三层规则、四道静态闸 +「违规谁拦」对照表、golden/fidelity 双闸定位
  • +
  • 本计划 .md 定稿 + HTML 阅读版 + 登记 docs/index.html
  • +
  • /todo 建 tier-1 条目 + 6 子任务
  • +
+
+ +
+

Phase 1 — 原型单源三件套(design/prototype/)

+

把散在 ui_kits / preview / _ds_manifest.json 的东西收敛为 ds-flow 标准三件套。

+
    +
  • serve.mjs 照搬 jiu(零依赖热重载)
  • +
  • tokens.css:现有 token 数值不变,重排为「基础 :root 标量 + [data-theme=dark] 颜色覆盖」结构
  • +
  • atoms.css:按钮/卡片/输入/语言下拉/徽章/状态药丸公用原子(只引 var(--token))
  • +
  • icons.js:SVG sprite 单源,收敛 website / usercenter / Flutter 三处图标集
  • +
  • index.html:活登记页——light/dark 切换 + 声明式色板 + 全组件/图标展示卡(每 atom 必登记)
  • +
  • ui_kits jsx 副本提炼后删除;屏级布局参考迁 prototype/screens/
  • +
+
+ +
+

Phase 2 — Web token 升为一等公民 + 同源闸

+
    +
  • 两端 token 落点统一指向原型 tokens.css(website→tokens.gen.css / usercenter→public/colors_and_type.css)
  • +
  • tools/check-l1-sync.mjs(照搬 jiu 裁剪):website / usercenter token 值逐值同源 + icons 同集 + Web hex 白名单扫描
  • +
  • build-tokens 幂等:重跑零 diff(纳入 CI)
  • +
+
+ +
+

Phase 3 — Web 共享原子层对齐 工作量最大

+

各自实现 + 同源闸:两端对齐同一 atoms.css,靠闸防漂移。

+
    +
  • 抽公共原子:langsel / button / card / input / badge / pill → atoms.css canonical
  • +
  • website:website.css/site-extra.css 对齐 atoms 语义,非白/黑/logo 硬编码清零
  • +
  • usercenter:shared.tsx 的 card/input/LangSeg 对齐 atoms 语义,13 处硬编码核对
  • +
  • 两端 langsel 一致性纳入登记;更新 CONTRACT.md(Web 原子清单 + 屏级三态台账)
  • +
+
+ +
+

Phase 4 — Flutter 收尾 + golden 补齐

+
    +
  • 清 adaptive_menu.dart 唯 1 处裸色 → token
  • +
  • 测试字体补 CJK 子集(make-cjk-subset.sh → client/test/fonts + flutter_test_config 注册)
  • +
  • 处理现存 6 张 failure diff,逐张确认后 --update-goldens 重录
  • +
  • golden 覆盖扩容:desktop/tablet/mobile 全屏 × light/dark 双主题矩阵
  • +
  • harness 对齐 jiu:多主题循环 + 钉死 viewport/dpr + ProviderScope 固定数据
  • +
+
+ +
+

Phase 5 — 静态闸挂满 + 启用 pre-commit + fidelity 体检

+
    +
  • 硬编码色扫描:Flutter check_ds_code.mjs(含 --changed)+ Web hex 并入 check-l1-sync
  • +
  • 原型校验 check-ds.mjs(照搬 jiu 12 道,按 pangolin 断点/主题裁剪)
  • +
  • CI 串起来:原型校验 → 跨端同源 → 代码色单源 → codegen 零 diff(已有)→ 测试含 golden(补 mobile+主题)
  • +
  • 启用 pre-commit:install-hooks 纳入文档,增挂 check-ds --changed(条件触发)
  • +
  • fidelity 像素闸(本地体检,不进 CI):screens.mjs + fidelity.mjs,逐屏阈值=实测残差+2pp
  • +
  • 全景文档 docs/frontend-overview.html(照搬 jiu 十节)+ 登记索引
  • +
+
+ +

Verification(端到端)

+ + +

不在本轮

+ + +

真相源(含 checkbox 执行跟踪):docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md

+ +
+ + diff --git a/docs/index.html b/docs/index.html index 57ee198..2c8a8fb 100644 --- a/docs/index.html +++ b/docs/index.html @@ -86,6 +86,11 @@

实现计划 / Plans

+ +
前端设计系统治理重构(ds-flow 全端)HTML
+
阅读版;执行真相源 docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md(含 checkbox)。用 ds-flow 把 Flutter 五端 + 官网 + 用户中心收口到「设计单源·代码镜像·静态闸拦漂移·golden/fidelity 双级像素验收兜底」。非从零 bootstrap(已约 65% 达标):补原型三件套(atoms.css/icons.js/index.html 登记页)+ Web 共享原子层去重(各自实现+同源闸)+ 硬编码色/fidelity 闸 + 启用 pre-commit。6 阶段:CLAUDE.md → 原型单源 → Web token 同源 → Web 原子对齐 → Flutter golden 补齐 → 闸挂满。主题保持 light/dark。
+
docs/frontend-ds-refactor-plan.html · 真相源 docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md
+
控制面 TLS(Cloudflare Tunnel 前置)实现计划 HTML
阅读版;执行真相源 docs/superpowers/plans/2026-07-06-control-plane-tls-tunnel.md(含 checkbox)。把控制面 API 从明文 http://103.119.13.48:8080 迁到 https://api.yanmeiai.com(cloudflared 出站隧道前置,源站仅绑 127.0.0.1,数据面 sing-box REALITY :443 全程不动)。6 任务:CF Tunnel 供给 → 客户端切 https/Android 去明文 → CI 守护禁明文 → PANGOLIN_PUBLIC_URL 切 https → 退役明文口(收 loopback,带上线顺序闸)→ 文档。
diff --git a/docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md b/docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md new file mode 100644 index 0000000..436ee26 --- /dev/null +++ b/docs/superpowers/plans/2026-07-07-frontend-ds-refactor.md @@ -0,0 +1,132 @@ +# 前端设计系统治理重构(ds-flow 落地全端) + +> 用 ds-flow 方法论把 pangolin 全部前端(Flutter 五端 + 官网 website + 用户中心 usercenter) +> 收口到「设计只有一个出生地(原型单源),代码永远是镜像;漂移由静态闸在提交/CI 前拦截, +> 走样由 golden/fidelity 双级像素验收兜底」。 +> +> **关键前提(摸底结论)**:pangolin 不是从零 bootstrap,已约 65% 达标—— +> token 单源(`design/colors_and_type.css` 含 `[data-theme=dark]`)、Flutter codegen + drift 闸、 +> golden + CI 闸、pre-commit(写好未启用)都在。本计划是**补缺口 + Web 共享原子层去重**, +> 不是推倒重来。 +> +> 主题模型:pangolin 用 **light / dark 两主题**(非 jiu 的 a/b/c 三主题),全程保持。 +> +> 已定决策:① Web 两端**各自实现 + 同源闸**(不建跨端共享组件包); +> ② `design/ui_kits/` 的 jsx/css 端原型**收敛为纯 HTML 原型**并删副本; +> ③ **先定稿本计划,再逐刀执行**(每刀 commit)。 +> +> 参考样板:`~/code/jiu`(`design/prototype/` + `tools/` + `client/lib/core/theme/` + `docs/frontend-overview.html`)。 + +--- + +## Phase 0 — 更新 CLAUDE.md + 计划落库 + +- [ ] 0.1 CLAUDE.md 新增「## 前端设计系统治理(ds-flow)」章节: + - 原型单源位置(`design/prototype/`:tokens/atoms/icons/index.html 登记簿)+ 只读约定 + - codegen 命令(Flutter `gen_flutter_tokens.mjs`;Web `build-tokens.mjs` 同源) + - 三层治理 L1/L2/L3 规则速查 + - 四道静态闸清单 + 「违规谁拦」对照表(原型校验 / 跨端同源 / 代码色单源 / codegen 零 diff) + - golden(多主题回归自比)/ fidelity(对原型 pixelmatch,本地体检不进 CI)双闸定位 +- [ ] 0.2 本 `.md` 定稿 + 生成 HTML 阅读版 `docs/frontend-ds-refactor-plan.html`,登记进 `docs/index.html`「实现计划」 +- [ ] 0.3 `/todo` 建 tier-1 条目跟踪本重构,拆 6 个子任务(对应 Phase 1-5 + 收尾) + +--- + +## Phase 1 — 原型单源三件套(design/prototype/) + +把散在 `ui_kits/`(6 端 jsx/css 原型)+ `preview/`(20 规格 HTML)+ `_ds_manifest.json`(登记簿) +的东西收敛成 ds-flow 标准三件套。 + +- [ ] 1.1 建 `design/prototype/` 目录;`serve.mjs` 照搬 jiu(零依赖热重载,默认端口按 jiu) +- [ ] 1.2 `design/prototype/tokens.css`:从现有 `colors_and_type.css` 迁移/规整为 + 「基础 `:root`(主题无关标量:间距/圆角/字号/字体/阴影/动效)+ `[data-theme=dark]` 颜色覆盖块」结构。 + **保持数值不变**,只重排为 ds-flow 结构;`colors_and_type.css` 作为兼容别名或迁移为薄封装(不破坏现有 codegen) +- [ ] 1.3 `design/prototype/atoms.css`:把按钮/卡片/输入/**语言下拉**/徽章/状态药丸等公用原子类沉淀为 + 只引 `var(--token)` 的 CSS(镜像 `design/preview/` 现有规格 + client widgets 实现语义) +- [ ] 1.4 `design/prototype/icons.js`:SVG sprite 单源(``), + 收敛现有分散图标(website Icon.astro / usercenter icons.tsx / Flutter pangolin_icons.dart 三处的图标集) +- [ ] 1.5 `design/prototype/index.html`:活登记页——三…两主题(light/dark)切换 + `data-swatches` 声明式色板 + + 字号梯度 + 圆角/间距/阴影 + 全部公用组件原子展示卡 + 图标库全展示。**每个 atom 必须在此登记** +- [ ] 1.6 `design/ui_kits/` 的 jsx/css 端原型:提炼进 prototype 后**删除 jsx 组件副本**(消除与 + 「禁向 design/ 提组件代码副本」的冲突 + 漂移源);保留必要的屏级 HTML 布局参考迁进 `prototype/screens/` +- [ ] 1.7 更新/退役 `_ds_manifest.json` + `_ds_bundle.js`:登记簿职责交给 `index.html`, + manifest 若仍被消费则保留为派生产物(记清谁是真源) + +--- + +## Phase 2 — Web token 升为一等公民 + 同源闸 + +现状:Web 的 `build-tokens.mjs` 只是「原样拷 css,删 Google Fonts 行」。升级为受闸守护的同源关系。 + +- [ ] 2.1 确认两端 token 落点与生成链:website→`src/styles/tokens.gen.css`、 + usercenter→`public/colors_and_type.css`;源统一指向 `design/prototype/tokens.css`(Phase 1 后) +- [ ] 2.2 建 `tools/check-l1-sync.mjs`(照搬 jiu 裁剪): + - ① website `tokens.gen.css` token 值 ≡ 原型 tokens.css(逐值) + - ② usercenter `public/colors_and_type.css` ≡ 原型(逐值) + - ③ icons 同源:website / usercenter / Flutter 三处图标集 ⊆ 原型 icons.js sprite + - ④ Web 硬编码色扫描(白名单 `#fff/#000/logo 固定色`,其余报警) +- [ ] 2.3 codegen 幂等:重跑 `build-tokens.mjs` 后 `git diff` 零差异(纳入 CI,见 Phase 5) + +--- + +## Phase 3 — Web 共享原子层对齐(各自实现 + 同源闸)★工作量最大 + +不建跨端组件包;两端各自实现,但都对齐 `design/prototype/atoms.css`,靠闸保证不漂移。 + +- [ ] 3.1 抽公共原子清单:langsel(语言下拉,刚修的两套合规范)/ button / card / input / badge / pill。 + 对每个原子在 `atoms.css` 定义 canonical 样式 +- [ ] 3.2 website:`website.css` + `site-extra.css` 里的按钮/卡片/下拉 class 对齐 atoms.css 语义, + 残留 `#fff/#000`/logo 外的硬编码色清零(当前业务硬编码 ~30 处,多为可保留的白/黑/logo) +- [ ] 3.3 usercenter:`shared.tsx` 的 `card/input/LangSeg` 内联对象对齐 atoms.css 语义; + 残留 13 处硬编码(基本 `#fff`)核对,非白/黑/logo 的清零 +- [ ] 3.4 两端 langsel 行为/样式一致性核对(此前刚统一为自定义下拉,纳入 atoms 登记) +- [ ] 3.5 更新 `design/CONTRACT.md`:Web 原子清单 + 屏级台账(同步/快照/代码先行三态) + +--- + +## Phase 4 — Flutter 收尾 + golden 补齐 + +Flutter 已很干净(UI 层零裸 hex),只需收尾。 + +- [ ] 4.1 清 `client/lib/widgets/adaptive_menu.dart` 唯 1 处裸 Material 色 → 走 token +- [ ] 4.2 测试字体补 CJK 子集:用 `tools/fonts/make-cjk-subset.sh` 生成 Noto Sans SC 子集放 + `client/test/fonts/`,`flutter_test_config.dart` 注册——消除 golden 中文与生产渲染差异 +- [ ] 4.3 处理现存 6 张 `client/test/golden/failures/` diff:逐张确认「原型对得上」后 `--update-goldens` 重录入库 +- [ ] 4.4 golden 覆盖扩容:desktop/tablet/mobile 全屏 × light/dark 双主题矩阵 + (现有 `desktop_pages/tablet_pages/components/auth` → 补 mobile + 主题维度) +- [ ] 4.5 `client/test/helpers/harness.dart` 对齐 jiu `golden_harness.dart` 手法: + 多主题循环辅助 + 钉死 viewport/dpr + ProviderScope 固定数据(防动态值翻车) + +--- + +## Phase 5 — 静态闸挂满 + 启用 pre-commit + fidelity 体检 + +- [ ] 5.1 硬编码色扫描闸: + - Flutter `client/tool/check_ds_code.mjs`(照搬 jiu,含 `--changed` 供 pre-commit):禁 `Color(0x..)`/裸 `Colors.x` + - Web hex 扫描并入 `check-l1-sync.mjs` ④ +- [ ] 5.2 原型校验闸 `design/prototype/tools/check-ds.mjs`(照搬 jiu 12 道,按 pangolin 断点/主题裁剪) +- [ ] 5.3 CI 串起来(`.gitea/workflows/ci.yml` 增补): + 原型校验 → 跨端同源 → 代码色单源 → codegen 零 diff(已有)→ 测试含 golden(已有,补 mobile+主题) +- [ ] 5.4 启用 pre-commit:`ci/install-hooks.sh` 纳入 onboarding 文档 + CLAUDE.md, + `.githooks/pre-commit` 增挂 `check-ds --changed`(只在动了 `design/prototype/` 时跑,轻量条件触发) +- [ ] 5.5 fidelity 像素闸(本地体检,不进 CI):`tools/screens.mjs` 屏注册表 + `tools/fidelity.mjs` + (原型 Chromium 截图 vs Flutter golden pixelmatch,逐屏阈值=实测残差+2pp,两边统一注入 CJK 字体) +- [ ] 5.6 全景文档 `docs/frontend-overview.html`(照搬 jiu 十节):一次 UI 改动标准路径 + 目录地图 + + 三层分治 + 闸全景 + 像素验收体系 + 响应式范式 + 规则速查,登记进 docs/index.html + +--- + +## Verification(端到端) + +- **原型**:`node design/prototype/serve.mjs` 起服务,浏览器逐屏目检 light/dark;`check-ds.mjs` 12 道全绿 +- **同源**:`node tools/check-l1-sync.mjs` 全绿(tokens 逐值 / icons 同集 / Web hex 白名单) +- **Flutter**:`flutter analyze` + `flutter test`(含 golden ×双主题);`check_ds_code.mjs` 全绿;codegen 重跑零 diff +- **Web**:两端 `npm run build` 通过;token 同源闸绿;langsel/button/card 对齐 atoms +- **fidelity**:`node tools/fidelity.mjs` 逐屏残差在阈内(首次校准记录各屏实测值) +- **闸生效**:`ci/install-hooks.sh` 后改一处硬编码色/未登记组件 → pre-commit 或 CI 拦下 + +## 不在本轮 + +- 新功能/新屏开发(本轮是治理重构,不加业务) +- iOS/iPad 专属布局深度优化(响应式已覆盖,超阈再单独立项) +- 三主题扩展(保持 light/dark 双主题) diff --git a/todo/todo.html b/todo/todo.html index 23d5d63..2187bd2 100644 --- a/todo/todo.html +++ b/todo/todo.html @@ -100,6 +100,8 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } .t-tag:hover { background: #d9e8fb; color: #1d4ed8; } .ver-badge { font-weight: 700; color: #1f7a44; } .sub-progress-badge { background: #f0f4ff; color: #3730a3; } +.owner-user{background:rgba(232,192,122,.16);border:1px solid #e8c07a;color:#e8c07a} +.owner-agent{background:rgba(126,224,162,.14);border:1px solid #7ee0a2;color:#7ee0a2} /* 状态徽章 */ .status-badge { font-size: 11.5px; } @@ -246,6 +248,78 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } .modal-cmd-code { font-family: "JetBrains Mono", "Fira Code", monospace; font-size: 13px; color: #86efac; word-break: break-all; display: block; } .modal-copy-btn { margin-top: 10px; padding: 5px 14px; border-radius: 6px; background: #334155; color: #e2e8f0; border: none; font-size: 12px; cursor: pointer; } .modal-copy-btn:hover { background: #475569; } +/* ════ 家族深色主题覆盖层(2026-07-06 对齐 brain/docs 家族风格;后置覆盖上方浅色基础样式) ════ */ +:root{--bg:#0d1117;--card:#161b22;--card-2:#1c2330;--border:#283041;--fg:#e6edf3;--fg-soft:#aeb9c7;--muted:#7d8896;--accent:#58a6ff;--green:#3fb950;--amber:#d29922;--red:#f85149} +body{color:var(--fg);background:radial-gradient(1200px 600px at 80% -10%,rgba(88,166,255,.08),transparent 60%),var(--bg)} +header{background:linear-gradient(135deg,#101a2c 0%,#15294a 100%);border-bottom:1px solid var(--border)} +header .header-meta{color:var(--fg-soft)} +.stat-pill{background:rgba(88,166,255,.12);border:1px solid var(--border)} +.filter-bar{background:rgba(13,17,23,.92);backdrop-filter:blur(6px);border-bottom:1px solid var(--border)} +.filter-label{color:var(--muted)} +.filter-chip,.filter-btn{background:var(--card);border-color:var(--border);color:var(--fg-soft)} +.filter-chip:hover,.filter-btn:hover{border-color:var(--accent);color:var(--accent)} +.filter-chip.active,.filter-btn.active{background:var(--accent);border-color:var(--accent);color:#0d1117} +.filter-sep{background:var(--border)} +.section-title .s-count{background:rgba(255,255,255,.08)} +.st-open {background:rgba(88,166,255,.10);color:#79b8ff;border-left-color:var(--accent)} +.st-doing {background:rgba(210,153,34,.10);color:#e3b341;border-left-color:var(--amber)} +.st-done {background:rgba(63,185,80,.08);color:#7ee787;border-left-color:var(--green)} +.st-accepted{background:rgba(63,185,80,.12);color:#7ee787;border-left-color:var(--green)} +.todo-card{background:var(--card);border-color:var(--border)} +.todo-card.s-doing{border-left-color:var(--amber)} +.todo-card.s-done{border-left-color:var(--green)} +.todo-card.s-accepted{background:rgba(63,185,80,.06);border-left-color:var(--green)} +.item-id{color:var(--accent);background:#0b1020;border-color:var(--border)} +.item-title{color:var(--fg)} +.todo-card.s-accepted .item-title{color:var(--muted)} +.item-desc{color:var(--fg-soft)} +.item-desc code{background:#0b1020;border:1px solid var(--border);color:#c9d6e6} +.item-meta{color:var(--muted)} +.t-block{background:rgba(248,81,73,.15);color:#ff9492} +.t-high{background:rgba(210,153,34,.15);color:#e3b341} +.t-low{background:rgba(88,166,255,.12);color:#79b8ff} +.t-tag{background:var(--card-2);color:var(--fg-soft)} +.t-tag:hover{background:rgba(88,166,255,.15);color:var(--accent)} +.ver-badge{color:var(--green)} +.sub-progress-badge{background:rgba(88,166,255,.12);color:#79b8ff} +.s-open{background:rgba(88,166,255,.15);color:#79b8ff} +.s-doing{background:rgba(210,153,34,.18);color:#e3b341} +.s-done{background:rgba(63,185,80,.15);color:#7ee787} +.s-accepted{background:rgba(63,185,80,.18);color:#7ee787} +.empty-tip{color:var(--muted)} +.tier-1{background:rgba(163,113,247,.15);color:#d2a8ff} +.tier-2{background:rgba(57,197,187,.12);color:#76e3db} +.tier-3{background:var(--card-2);color:var(--fg-soft)} +.reject-btn{background:transparent;border-color:var(--red);color:#ff9492} +.reject-btn:hover{background:var(--red);color:#0d1117} +.reject-note{background:rgba(248,81,73,.08);border-color:rgba(248,81,73,.4);color:#ff9492} +.reject-date{color:rgba(248,81,73,.6)} +.gate-pending{background:rgba(210,153,34,.08);border-color:rgba(210,153,34,.4)} +.gate-granted{background:rgba(63,185,80,.08);border-color:rgba(63,185,80,.4)} +.gate-info{background:var(--card-2);border-color:var(--border)} +.gate-kind,.gate-note,.gate-ref{color:var(--fg-soft)} +.gate-date{color:var(--muted)} +.gate-note code,.gate-ref code{background:#0b1020;border:1px solid var(--border);color:#c9d6e6} +.subtask-block{background:var(--card-2);border-color:var(--border)} +.subtask-label{color:var(--muted)} +.subtask-progress-text{color:var(--fg-soft)} +.subtask-progress-bar{background:var(--border)} +.subtask-item{background:var(--card);border-color:var(--border)} +.subtask-item.s-done,.subtask-item.s-accepted{background:rgba(63,185,80,.06);border-color:rgba(63,185,80,.3)} +.subtask-item.s-doing{background:rgba(210,153,34,.06);border-color:rgba(210,153,34,.3)} +.sub-icon.s-open{color:var(--muted)} +.sub-sid{color:var(--muted)} +.subtask-item.s-done .sub-title,.subtask-item.s-accepted .sub-title{color:var(--muted)} +.dep-label{color:var(--muted)} +.dep-done{background:rgba(63,185,80,.15);color:#7ee787} +.dep-pending{background:rgba(248,81,73,.15);color:#ff9492} +.modal-overlay{background:rgba(0,0,0,.6)} +.modal-box{background:var(--card);border:1px solid var(--border)} +.modal-box h3{color:var(--fg)} +.modal-subtitle{color:var(--fg-soft)} +.modal-label{color:var(--fg-soft)} +.modal-textarea{background:#0b1020;border-color:var(--border);color:var(--fg)} +.modal-btn-cancel{background:var(--card-2);color:var(--fg-soft)} @@ -253,14 +327,14 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }

feature+windows — 项目 TODO

-
生成于 2026-07-01 · 真相源 todo/todo.json
+
生成于 2026-07-07 · 真相源 todo/todo.json
-
17全部
-
8待开始
+
18全部
+
9待开始
0开发中
1待验收
8已验收
- +
1待确认
@@ -293,7 +367,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
平台 / 标签 - +
@@ -302,7 +376,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
- 📋 待开始 8 + 📋 待开始 9 ▴ 收起
@@ -332,6 +406,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }