From 1d76c3b8ac06e8690e3a99ea4dfa0e656548ae6f Mon Sep 17 00:00:00 2001 From: PMon Dev Date: Mon, 9 Nov 2026 17:24:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(design-system):=20=E5=90=88=E5=85=A5=20V2?= =?UTF-8?q?=20=E7=BA=BF=E5=B9=B6=E7=BB=9F=E4=B8=80=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E4=B8=BA=20Inkwatch=EF=BC=8C=E8=A1=A5=E9=BD=90=E6=B7=B1?= =?UTF-8?q?=E8=89=B2=E4=B8=BB=E9=A2=98=E4=B8=8E=E7=8A=B6=E6=80=81=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E5=9B=BE=E6=A0=87=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 本提交收口本轮四件事。三者改动在同一批文件里交织(改名触及 theme.dart、 深色化也在 theme.dart),按文件无法干净切分,故合为一个可审计的提交, 下面按事由分述。 一、命名统一:Pmon* → Inkwatch*(合入 V2 线后的收尾) · 包名 pmon_client → inkwatch_client,Rust crate pmon-core → inkwatch-core。 改名后必须 flutter pub get 重建 package_config,否则 dart analyze 会报 1688 个"找不到 package:pmon_client"的假错误。 · 符号:PmonColors→InkwatchColors、PmonPalette→InkwatchPalette、 PmonTextStyles→InkwatchTextStyles、PmonRadius→InkwatchRadius、 PmonEinkText→InkwatchEinkText、PMON_LOG_*→INKWATCH_LOG_*。 · 覆盖 server/ client/ rust-core/ tests/ 全树;已用 git grep -In 'Pmon\|PMON\|pmon' 复核,零残留(tokens.css 里最后一处 §2.8 的类名注释也在本提交修掉)。 · rust-core/Cargo.lock 的变动只是包名变化导致 [[package]] 字典序重排。 二、深色主题:58 键同名覆写 + Flutter 整屏深色化 · tokens.css 增 dark 块(58 键),键名与浅色**逐一相同**—— 这是 token_parity_test.dart 的深色 parity 组在守的约束。 · theme.dart:新增 InkwatchDarkColors / _assemble(palette, brightness), 把语义色从"常量"改为"随 brightness 装配"。 · main.dart:darkTheme + 显式 themeMode(ValueNotifier 持久化,不用 ThemeMode.system —— 水墨屏用户要的是自己定,不是跟系统)。 · theme_guard_test.dart C-15 → C-15′:从"禁止出现深色"改为"允许深色, 但必须 58 键同名",护栏跟着设计意图一起改,而不是删掉。 · 新增 dark_theme_test.dart / dark_ui_test.dart 覆盖装配与整屏渲染。 三、状态符号图标化:Unicode 字形 → Material Icons · symbol_guard_test.dart 按**码位**扫 lib/(注释之外),命中 5 处: transfer_card.dart 的 ⚠️/✓/✓/⚠,viewer_page.dart 的 ✓。 · 只删字形会留下不可见的 U+FE0F,源码看不出、界面渲染成豆腐块, 且按 emoji 区间匹配的旧护栏看不见它 —— 故护栏按码位判,且判据选 "扫注释之外全部字符"(错了只会多报,不会漏)。 · 改法:状态图标单独一槽,不拼进文案。 - transfer_card.dart:_offerHint 由 String? 改为 ({IconData? icon, Color? tint, String text})?,渲染为 Row(Icon+Text); 「已收下」结果块同理(check_circle / error_outline)。 图标着色:warning_amber→_p.suspect,check_circle→_p.online。 - viewer_page.dart:_lanSummary() 返回 ({IconData? icon, String text}), 诊断行由 ('对端内网', _lanSummary(), null) 改为 (…, lan.text, lan.icon)。 调用点提到 return 之前只算一次。 · 理由不只是"好看":字符符号在水墨屏上会渲染成方框,且无法随主题着色。 验证 · client/scripts/test.sh:674 项全过(+674,0 失败,23s) · tests/run-guards.sh(RUN_AXE=1): web-token-guard.js PASS 21/0 phase3b-static-guard.js PASS 87/0 dockerfile-coverage-test.js PASS 53/0 schema-consistency-test.js PASS 116/0 client Dart 全量 PASS 674 项 admin-axe-audit.mjs PASS 42/42 格 viol=0(inc=12 有台账) 6 套件 PASS 6 / FAIL 0 / SKIPPED 0 · dart analyze:9 issues / 0 error(全部为既有 info/warning,非本次引入) · 两处 tokens.css(仓库内 admin/assets 与设计系统交付目录)逐字节一致 sha256 088873cf6ece8da78135f96ca4633a537ac7802ea5f0fc8bd9c9294bb8a7bcaa 已知未做(写下来,不藏) · flutter analyze 在本机因仓库路径含中文(水墨屏工具)触发 analysis_server 的 LSP 分帧 UTF-8 错误(FormatException: Unterminated string)。 绕法是用 dart analyze,或把工作树放到纯 ASCII 路径下。 · 窄屏降级态 + 失败态的组合真机复核:仍未做。 · VoiceOver / NVDA 实机验证:NOT RUN。 · 管理台登录框仍缺持久