跨端: 修卡片投影/页签条圆角/日视图/周视图 — 五处对 WebUI 的误读

用户逐条指出后,用 CDP 读 WebUI 的 computed style 与祖先链,发现五处都是我读错/抄错。

## ① 列表底部那条"不知道什么玩意的阴影"(用户原话)

根因:我把 `instance.shadow(Theme.glassShadow)` 挂在 **每张卡片** 上。
WebUI 全仓 `box-shadow` 只有三处 —— `.app-shell > *`(窗格)、
`html[data-bg='on'] .app-shell > *`、`.narrow-nav`(底部导航条)。
**卡片 `.glass-card` 一次都没有**(整个规则块只有 radius/border/bg/transition)。

一屏十几张卡各投一次 ⇒ 叠加成灰雾。设备实测(x=600,卡片底边 y≈1847):
    有投影 y=1846→231、y=1852→230(向下衰减的暗带)
    去掉后 y=1846→255、y=1852→251(消失)
⇒ 投影移到 `PaneModifier`(窗格层),与 WebUI 一致。

★ 判定实验还排除了一个嫌疑:`List` 默认 `edgeEffect(EdgeEffect.Spring)`
  (官方文档「支持弹簧效果和**阴影效果**」)。设 `EdgeEffect.None` 后暗带照样在
  ⇒ 不是它。**弹簧是滚到边缘的正常反馈,不该为遮一个 bug 把它关掉。**

## ② 页签条右上角"那个圆角"(用户原话)

两道弧叠在一起。WebUI 实测(CDP 读祖先链):
    .comm-pane   x=80 w=320 radius=14px overflow=hidden   ← 窗格
      tabstrip   x=80 w=320 radius=0px                    ← 页签条
**两者横向完全齐平**,页签条自己直角、靠窗格裁圆 ⇒ 只有一道弧。
我们内缩 16vp + 自己带角 ⇒ 两道弧,中间一弯月牙。
⇒ 改成与窗格齐平、只留左上角圆角。

★ 期间我犯过两个错,都记在注释里:先把半径设成 `HEADER_HEIGHT/2`=22(条高也是
  44,那就是一个完整胶囊),后来自作主张把整条改成"通栏+下边框+无玻璃"——
  那是重做而不是用户要的小改,已还原。

## ③ 日视图与周视图一样(用户原话)

`DayTimeline()` 我写好了却**从未调用**。日视图一直走 `rows()`(周视图那套七列)。
⇒ 按 scale 分流:日视图 → 24 小时时间轴(对齐 WebUI `DayGrid` 的 `HOURS` 逐行、
  当前小时淡蓝底);周/日格子改用 `WEEK_CELL_HEIGHT`(240) 并画日程标题条
  (对齐 `EventChip`:`HH:mm` + 标题,停用的加删除线 + 灰底)。

## ④ 邮件正文垂直居中(用户原话)

官方 FAQ `faqs-arkui-725` 原文:内容比 `Scroll` 矮时「**默认居中排布**」,
要 `.align(Alignment.Top)` 才是顶部排布。
实测内容块在 `Scroll` 里偏移 731px = (1944−481)/2 —— 正好居中。
⇒ 4 处 Scroll/List 补 `.align(Alignment.Top)`(详情页 y 从 1018 → 287)。

## ⑤ 窄屏圆角/留白全丢(用户:「你的邮件的圆角呢?日历的圆角呢?」)

`borderRadius(this.isWide ? glassRadius : 0)` —— 窄屏恒 0;
`left/right: isWide ? paneGap : 0` —— 把 WebUI「窄屏**底边**留白为 0」
错推广成「四边都为 0」。
WebUI 两条 shell 规则**都给圆角**,差的只是底边留白。
⇒ 圆角两端都开;左右留白两端都给;只有底边分宽窄。

## 连带修的两个真问题

· **底部导航避让**(用户:「为什么不避让底部导航栏」):根是 `NavBar` 与内容
  是 `Stack` 里的**并列兄弟**(互相重叠),所以每个滚动容器都得手写
  `contentEndOffset` —— 我漏了 8 处。照 WebUI 改成 `Column{内容, NavBar}`
  (WebUI 实测 `scroller.bottom=861` / `nav.top=871`,内容停在导航上方)。
· **不透明的那一张卡**(用户:「有一个完全不透明的邮箱项」):`MailRow` 手写
  `Theme.surface`(系统卡片色 α=1),而 `GroupHeader` 用的是 `GlassCardModifier`。
  ⇒ 改用同一件基础件 + 新增 `TintModifier` 合成状态色(`.attributeModifier`
  是单一插槽,色必须参与合成)。实测 `(255,255,255)` → `(195,218,204)`。

判据随之反转 3 条(`harmony-widescreen` 两处把"窄屏 0"改成"两端都要"、
`cross-client-theme` 抓到我新写的 `Theme.border` 当 `fontColor`)。
This commit is contained in:
2026-09-21 12:04:52 +08:00
parent 3e16065002
commit f83c23362a
10 changed files with 1003 additions and 91 deletions

View File

@ -218,6 +218,46 @@ export class Theme {
* (10px 面板 / 18px 浮条),抄就得抄全套,不能只挑一个数。
*/
static readonly glassCardRadius: number = 18;
/*
* ── 卡片的"玻璃":**白色 + alpha,不做模糊** ──
*
* ★★ 2026-09-21 更正(用户:「邮件看着没有玻璃效果」,我实测后才发现自己搞错了)。
*
* WebUI 的 `.glass-card`(`index.css:1629`)**根本没有 `backdrop-filter`**:
*
* .glass-card { background-color: rgb(255 255 255 / 0.92); }
* html[data-bg='on'] … { background-color: rgb(255 255 255 / 0.78); }
* ↑ 就是"白 + alpha",没有 blur
*
* 全仓 `backdrop-filter` **只出现两处**(`index.css:844` 与 `:1204`):
* · `.glass-control` —— 控件档,`blur(8px) saturate(1.1)`
* · `.narrow-nav` —— **底部导航条**,`blur(18px) saturate(1.5)`
*
* 而我给**每张卡片**都挂了 `blur(18px) saturate(1.5)` —— 用的是**导航条那档**参数。
* 这正是 `index.css:990` 明确警告的做法:
* 「再 backdrop-filter 一次纯属叠加:不会更"玻璃",只会更脏更糊,
* 而且每层都要重新采样一次背景(滚动时明显掉帧)」
*
* ⇒ 后果:列表里每张卡各糊一次,多层叠加后正文发灰、滚动掉帧 ——
* 比"没有玻璃"更糟。修法就是照 WebUI:**卡片只用白 + alpha**。
*/
/*
* 卡片的白 + alpha(ArkUI 的 `#AARRGGBB`:前两位是 alpha)。
*
* glassCard #EBFFFFFF ≈ 白 / 0.92 ← WebUI `--glass-card-a: 0.92`
* glassCardWall #C7FFFFFF ≈ 白 / 0.78 ← WebUI `--glass-card-wall-a: 0.78`
*
* ★ 为什么必须**显式写 alpha**而不是像以前那样用 `Color.Transparent`:
* 卡片在壁纸上要是一层"薄白纱"(壁纸透上来但被压淡),
* 全透明等于壁纸原样穿过 —— 卡片的边界没了,文字也没有底衬(可读性掉)。
* WebUI 的 0.78 就是在这两者之间取的平衡值。
*
* ★ 深浅两色同一个值:因为**基色恒为白**(WebUI `--glass-base` 注释:
* 「基材恒为白,主题之间只差 alpha」)。深色下靠 `brightness` 与
* 文字令牌保证对比度,而不是把底也调黑。
*/
static readonly glassCard: string = '#EBFFFFFF';
static readonly glassCardWall: string = '#C7FFFFFF';
static readonly glassCardSaturation: number = 1.5;
/**
* 「悬浮玻璃板」的另外两半:**投影 + 发丝描边**。