fix(webui): 窄屏「我的」页补上圆角(与日历那次同一个根因,另一条分支)

用户(2026-09-14):「webui的『我的』页面,还是没有圆角」。

根因不在 AccountPage —— 在 App.tsx 的**分支**:没有列表栏的页面(我的/管理/写信)
走 `<div className="flex-1 min-h-0 flex">{main}</div>`,而 `.narrow-shell > *` 那条
圆角正落在这一层上。它是透明的、且 overflow: visible —— 有底色的是它里面的页面
根节点(`… bg-white`),内层直角从透明外壳里原样戳出来。
这与日历那次(`.narrow-stack` / `.cal-panes`)是同一条教训的**第三处**:
圆角必须给到**有底色的那一层**。

实测(390x844,真浏览器读渲染像素):
  改前 面板 radius=0px,四角像素 255,255,255(纯白=方角)
  改后 面板 radius=14px,四角像素 = 页面底色 249,250,251(被切掉)
  宽屏 1280 一直是好的(对照:与收件箱详情栏的四角剖面逐像素一致)

改法:那一层挂 `narrow-solo`,圆角写在 `.narrow-solo > *`(有底色的那层),
**不写 overflow:hidden**(这层下面的子元素自己就是滚动容器,与 app-shell 那段同一个坑)。
横屏紧凑的两栏(`narrow-duo`)照 `cal-panes` 只给**外沿**:首元素左两角、末元素右两角。

判据 narrow-layout 新增 3 条(规则与 JSX 按类名接得上 / 不写 overflow:hidden /
两栏只给外沿);变异自检:把 `narrow-solo` 类名去掉,判据立刻红。
已部署(d3f6f3b·0914-1904);.deb 与 dist 同批重打。
This commit is contained in:
pi
2026-09-14 19:07:28 +08:00
parent d3f6f3baf6
commit 5544edabaf
3 changed files with 76 additions and 2 deletions

View File

@ -272,6 +272,42 @@ check(
/className="narrow-stack[^"]*overflow-hidden/.test(stack),
'圆角落在了裁不住东西的层上:观感仍是方角(computed radius 却是 14px)'
);
/*
* 5.12) 窄屏「单页」容器(没有列表栏的页面:我的 / 管理 / 写信)
*
* 用户(2026-09-14):「webui的『我的』页面,还是没有圆角」。
*
* 与 5.11 同一个根因、**另一条分支**:App.tsx 在 `!hasList` 时用的是
* `<div className="flex-1 min-h-0 flex">{main}</div>`,`.narrow-shell > *` 那条圆角
* 落在它身上(透明、overflow: visible),而真正有底色的是里面的页面根节点。
* 实测 390×844「我的」页:面板 radius **0px**,四角都是白像素(255,255,255),
* 而页面底色是 249,250,251。
*
* 修法照 `cal-panes`:**圆角给到有底色的那一层**(`> *`),不写 overflow:hidden
* (这一层下面的子元素自己就是滚动容器,见 app-shell 那段)。
*/
const appSrc = read('../src/App.tsx');
const solo = (css.match(/\.narrow-solo\s*>\s*\*\s*\{[\s\S]*?\n\}/) || [''])[0];
check(
'窄屏单页容器挂上了标记,且圆角给到**有底色的那一层**',
/className="narrow-solo[ "]/.test(appSrc) &&
/border-radius:\s*var\(--radius-card\)/.test(solo),
'CSS 有规则但 JSX 没挂类名(或反之);或圆角又落在了透明外壳上——两种都是"computed 正常、看着还是方角"'
);
check(
'那一层不写 overflow:hidden(它的子元素自己就是滚动容器)',
solo !== '' && !/overflow:\s*hidden/.test(solo),
'在这一层裁会杀掉滚动(与 app-shell 那次同一个坑)'
);
const duoFirst = (css.match(/\.narrow-duo\s*>\s*:first-child\s*\{[\s\S]*?\n\}/) || [''])[0];
const duoLast = (css.match(/\.narrow-duo\s*>\s*:last-child\s*\{[\s\S]*?\n\}/) || [''])[0];
check(
'横屏紧凑两栏:外沿分左右给角(内侧不圆,否则分隔线两边露底色)',
/className="narrow-duo[ "]/.test(appSrc) &&
/border-start-start-radius/.test(duoFirst) && /border-start-end-radius/.test(duoLast),
'两栏并排是"一张卡两块面板",四角全给或全不给都不对'
);
check('根视口使用 100dvh 跟随软键盘', css.includes('@supports (height: 100dvh)'));
// 6) 横向内边距在窄屏收窄(px-6 在 375px 屏上白吃 48px)