跨端对齐:授权栏 navigator_only + 组件按页拆分 + 服务器补 permission_options
用户两项裁定落地(均为 ask_user 明确选择):
① 授权栏口径 = navigator_only(照 WebUI 架构)
· 新建 pages/PermissionPanel.ets —— 详情页的决策面板,
对应 MailView.tsx:693 的 PermissionPanel(审批型 / 主动提问 / 已处理 三态)
· 决策入口从授权栏移到 MailDetailPage;MailDetailPage 原来只显示一个
「权限请求」小标签、根本没有决策入口(比 WebUI 少一整块,且反了:
栏里能决策、点进详情反而不能)
· PermissionTab 删掉内联「同意/拒绝」+ 备注框 + decide():
整卡可点 → onOpenMail(对齐 WebUI PermissionList.tsx:81 的 pick())
· PermissionRequest 补 source_account_id(客户端侧记来源,跳详情要定位网关)
② 服务器补 permission_options —— 修一条真实的、跨端共有的缺口
· mails.permission_options 从 INSERT 起就写进去,但**从来没有任何读路径
选过它** ⇒ 详情端点永远返回空。WebUI 的决策面板读 mail.permission_options,
所以提问型的预设选项**两端全部落空**(审批型靠 ['同意','拒绝'] 兜底蒙混)
· GetMailByID 补选该列 + JSON 反序列化(与 cc_list 同款)
③ 组件按页封装(用户要求「以便与 WebUI 一一对应」)
MainPage.ets 4592 → 3192 行
· pages/PermissionTab.ets 720 行 ↔ PermissionList.tsx
· pages/ContactsTab.ets 796 行 ↔ ContactPanel.tsx
· pages/NavDestinations.ets 181 行 ↔ Navigation 壳
· pages/NavShared.ets 65 行 ↔ 跨栏共用件
④ 判据跟着组件搬家(否则静默失效,不是红)
harmony-logic 的 pageCode / harmony-nav 的 navSrc 改为显式文件名单;
harmony-appearance 的 PANE_SOURCES 补 ContactsTab;harmony-contacts 三个
test 并入 ContactsTab;harmony-logic 的决策断言改指 PermissionPanel,
并新增「授权栏不许再有内联决策」两条(navigator_only 的正形状)。
animation-audit:共享元素转场判据从「同文件共址」改为「按 id 找驱动」。
旧形状把 in/out 端必须在同一文件当成代理,而两端**天然在两处**;
抽出写信页(NavDestinations 持有 in 端)后误报。新判据仍要求每个 id
都有 Motion.morph 驱动 —— 变异实测:把驱动换成裸 animateTo 仍判红。
判据:files=34 checks=556 red=1(仅 build-stamp,产物待重构建)
This commit is contained in:
@ -463,6 +463,72 @@ check('新组件未使用未映射色族', unmapped.length === 0, unmapped.join(
|
||||
navFgLum !== null && navFgLum > 180,
|
||||
navFgLum === null ? '缺 --nav-fg' : `--nav-fg 平均亮度 ${navFgLum}(应 >180)`
|
||||
);
|
||||
/*
|
||||
* ★★ 2026-09-23 **堵上两条逾期欠债**(`docs/DEBTS.json` 的
|
||||
* `nav-dark-route-b-unguarded` 与 `nav-blur-route-c-unguarded`)。
|
||||
*
|
||||
* ── 为什么现在堵 ──
|
||||
* 这两条欠债的 `due` 写的是「**引入深色主题(或第一次给导航组件加 dark: 变体)时**
|
||||
* 必须一并堵」。而深色主题 **2026-09-17 就落地了**(见上面那段 `.dark` 的注释 ——
|
||||
* 那一次把判据从「.dark 里不许有 --nav-*」翻转成「必须有深色导航令牌」)。
|
||||
* ⇒ 到期条件**在当时就成立了**,但那一次只修了令牌这条路,A/B/C 三条逃逸路
|
||||
* 一直没堵 —— 欠债逾期到现在。
|
||||
*
|
||||
* ── 三条逃逸路的现状(判据逐条看)──
|
||||
* · A `.dark .nav-rail { background-color: … }`(选择器作用域)—— **上一条已堵**:
|
||||
* 它搜 `.dark{}` 块体,而 A 是**另一条选择器**,落在块体之外 ⇒ 逃掉。
|
||||
* 等等 —— 那一条现在也堵不了 A。见下面 A 条新判据。
|
||||
* · B `className="nav-item dark:bg-slate-900"`(Tailwind 的 dark: 变体)——
|
||||
* 产出的不是 `.dark{--nav-*}`,**当前完全无判据**。
|
||||
* · C `className="nav-item backdrop-blur-lg"`(元素级工具类模糊)——
|
||||
* 不在 `html[data-bg='on'] .nav-rail{…}` 那条选择器下,**当前完全无判据**。
|
||||
*
|
||||
* ── 堵法为什么是「窄豁免」而不是一刀切(欠债里点名警告过)──
|
||||
*
|
||||
* 欠债原文:「堵法按**文件窄豁免**写,不许写成『导航目录不许出现 dark:』
|
||||
* (`bg-chrome-600` plain 档徽标那个先例我踩过一次)」。
|
||||
*
|
||||
* 那个先例的形状是:一条"某目录不许出现 X"的宽断言,会把**合法的**
|
||||
* 非导航用途一起判红 —— 判据一红,下一个人就会去放宽它,最后什么都守不住。
|
||||
*
|
||||
* ⇒ 这两条**只扫 `className` 里出现 `nav-rail`/`nav-item` 的那些字符串**。
|
||||
* 换句话说:问的不是"这个文件里有没有 dark: 背景",而是
|
||||
* **"挂在导航那个元素上的那个类串里有没有"** —— 与逃逸路的形状同构。
|
||||
* 同一个文件里的别的元素(徽标、头像…)写什么都不影响。
|
||||
*/
|
||||
const navComponents = ['../src/components/Sidebar.tsx', '../src/components/NarrowNav.tsx']
|
||||
.map((p) => read(p));
|
||||
/** 把所有 className 字符串里的"导航类串"取出来(支持 "…" 与 `…` 两种写法) */
|
||||
const navClassStrings = [];
|
||||
for (const src of navComponents) {
|
||||
for (const m of src.matchAll(/className=(?:"([^"]*)"|\{`([^`]*)`\})/g)) {
|
||||
const cls = m[1] || m[2] || '';
|
||||
if (/\bnav-(?:rail|item)\b/.test(cls)) navClassStrings.push(cls);
|
||||
}
|
||||
}
|
||||
check(
|
||||
'B 条已堵:挂在导航元素上的类串里不许出现 `dark:bg-*`(Tailwind 深色变体绕过 --nav-bg)',
|
||||
navClassStrings.length > 0 && !navClassStrings.some((c) => /\bdark:bg-/.test(c)),
|
||||
navClassStrings.length === 0
|
||||
? '一个导航类串都没扫到 —— 判据的锚点失效了(组件改名要一起改本判据)'
|
||||
: `有导航类串写了 dark:bg-* ⇒ 深色下导航会绕过 --nav-bg 令牌自己变色:` +
|
||||
navClassStrings.filter((c) => /\bdark:bg-/.test(c)).join(' | ')
|
||||
);
|
||||
check(
|
||||
'C 条已堵:挂在导航元素上的类串里不许出现 `backdrop-blur-*`(元素级模糊叠在壁纸模糊上)',
|
||||
navClassStrings.length > 0 && !navClassStrings.some((c) => /\bbackdrop-blur/.test(c)),
|
||||
navClassStrings.length === 0
|
||||
? '一个导航类串都没扫到 —— 判据的锚点失效了'
|
||||
: `有导航类串写了 backdrop-blur-* ⇒ 壁纸已经模糊过,导航再糊一次(更脏更掉帧):` +
|
||||
navClassStrings.filter((c) => /\bbackdrop-blur/.test(c)).join(' | ')
|
||||
);
|
||||
check(
|
||||
'A 条已堵:不许用 `.dark .nav-rail` / `.dark .nav-item` 这类**选择器**给导航单独换色',
|
||||
!/\.dark\s+[^{]*\.nav-(?:rail|item)/.test(css),
|
||||
'深色下导航的底色只有一个来源(`.dark` 块里的 `--nav-bg` 令牌);' +
|
||||
'另开一条 `.dark .nav-rail{…}` 选择器会让它绕过令牌 —— 那正是「导航黑、正文白」那个老问题的形状'
|
||||
);
|
||||
|
||||
check(
|
||||
'导航自叠模糊之一已堵:壁纸模式下 .nav-rail 规则里不许写 backdrop-filter(元素级工具类那条路未覆盖)',
|
||||
/\.app-backdrop \{[\s\S]*?filter: blur\(/.test(css) &&
|
||||
|
||||
Reference in New Issue
Block a user