Files
deepseek-harness/packages/client/ui-theme/README.zh.md
Chinesezjc c3e9690b2e fix(ui-theme): gate the standard scrollbar properties behind the missing WebKit pseudo-element
A non-`auto` `scrollbar-width` or `scrollbar-color` makes Chromium and Safari
discard every `::-webkit-scrollbar*` rule for that element, including
`::-webkit-scrollbar-thumb:hover`. Declaring both unconditionally left the
hover tokens rendering nowhere: the engines implementing the hover
pseudo-element are exactly the ones the standard properties silence, and
Firefox has no hover pseudo-element to fall back on. Both hover tokens and all
four elevated surfaces' hover rebinds were therefore dead code.

Measured in chromium on probe elements with `scrollbar-gutter: stable`: an 8px
`::-webkit-scrollbar` alone reserved a 30px band, and adding
`scrollbar-width: thin` dropped it to the 10px `thin` reserves.

The standard properties now sit inside `@supports not
selector(::-webkit-scrollbar)`, so Firefox takes them and WebKit-based engines
take the pseudo-elements. The WebKit rules stay ungated: an engine without
those pseudo-elements drops them as unknown selectors, and gating them would
hide them from an engine that implements them without `selector()` — the
pre-16.4 Safari the ungated form serves correctly.

Three unit assertions pin the split by source offset, which the existing
at-rule-flattening parser cannot see. The web e2e now reads the path chromium
actually takes: the `auto` standard properties as the gate's signature, the
pseudo-element sizing and track, the indirection variables resolved per
throwaway probe, and the hover declaration as cascade rule text — chromium
folds the `:hover` rule into `getComputedStyle(el,
'::-webkit-scrollbar-thumb')`, so no computed query separates the states.
2026-07-28 15:02:20 +08:00

2.6 KiB
Raw Blame History

@deepseek-ai/dsh-client-ui-theme

English | 中文

主题插件:基于 --dsw-* token 基础样式表(静态尺度 + 别名语义层)的 ThemeService。该服务拥有主题偏好lightdarksystem,以 dsh.theme 为键持久化),将 system 通过 prefers-color-scheme 解析为实际主题,并发布不可变的 ThemeSnapshot,通过 theme/change 事件通知变化;它绝不接触 DOMui-layout 的呈现器会应用解析后的快照(html { color-scheme }body[data-ds-dark-theme],以及主题的别名 token 内联变量。契约api-contracts v3 §8。

src/styles/ 下有五张样式表,全部由 web 壳的 base.css 导入:base.cssdesign-platform.cssscrollbar.cssgradient-shadow-text.cssshiki.cssscrollbar.css--dsw-alias-scrollbar-* token 的唯一消费方,必须排在声明这些 token 的 design-platform.css 之后。

滚动条重新绑定契约:scrollbar.cssbody 上把 --dsh-scrollbar-thumb--dsh-scrollbar-thumb-hover 绑定到 l1基础表面token两条渲染路径都读取这一组变量。抬升表面菜单、浮层、对话框在自己的容器上设置 --dsh-scrollbar-thumb: var(--dsw-alias-scrollbar-bg-l2)--dsh-scrollbar-thumb-hover: var(--dsw-alias-scrollbar-hover-l2);一次重新绑定即可为引擎实际走的那条路径换色。

两条路径在构造上互斥。scrollbar-widthscrollbar-color 写在 @supports not selector(::-webkit-scrollbar) 之内,因为这两个属性只要取非 autoChromium 与 Safari 就会丢弃该元素上的全部 ::-webkit-scrollbar* 规则,::-webkit-scrollbar-thumb:hover 也在其中——若无条件地同时声明,--dsh-scrollbar-thumb-hover 在任何引擎上都不会被渲染。因此 Firefox 走标准属性WebKit 系引擎走伪元素hover token 只经由伪元素这条路径渲染。推理过程与实测计算值见滚动条 Agent Note

模型体验

无。主题服务管理浏览器偏好;这里没有任何内容进入模型请求。

KV Cache 影响

无;该包既不组装也不发送提供方请求。

已知限制与暂缓事项

  • 第三方主题是表层,不是产品:注册主题意味着覆盖同名别名变量;目前不会验证一组覆盖是否完整。
  • token 样式表是颜色的唯一权威:不会追加 cssdesign 中缺失的值(例如设计中的 #4176E6 标签页蓝色);应使用最接近的语义 token裁定于 2026-07-22