Skip to content

【已审核】style(ui): 统一全代码库滚动条架构 - #1427

Open
climashscape wants to merge 1 commit into
proma-ai:mainfrom
climashscape:style/ui-unify-scrollbar-architecture
Open

【已审核】style(ui): 统一全代码库滚动条架构#1427
climashscape wants to merge 1 commit into
proma-ai:mainfrom
climashscape:style/ui-unify-scrollbar-architecture

Conversation

@climashscape

Copy link
Copy Markdown
Contributor

概述

统一 Proma 全代码库滚动条架构。此前滚动条样式散落在 7 处(工具类、Shiki/mermaid 代码块、diff 组件、@pierre/diffs 渲染器、ProseMirror 输入框、Radix ScrollArea、系统默认兜底),尺寸/颜色/圆角互相不一致,且全局缺少 color-scheme 导致深色/彩色主题下滚动条显色异常。

本次在 globals.css :root 建立 --scrollbar-* 变量作为单一事实来源(SSOT),所有滚动条统一引用;同时补齐 color-scheme 主题跟随,并加全局 *::-webkit-scrollbar 兜底让未套工具类的滚动容器也统一。

改动

  • styles/globals.css(+101/-…)
    • 新增 --scrollbar-size / --scrollbar-size-sm / --scrollbar-radius / --scrollbar-track / --scrollbar-thumb-opacity / --scrollbar-thumb-hover-opacity 变量
    • :root / .dark 分别设 color-scheme: light / dark,让系统滚动条与 light-dark() 跟随应用主题
    • .scrollbar-thin 工具类引用变量(颜色在使用处写 hsl(var(--muted-foreground) / var(--opacity)),保证主题跟随)
    • Shiki/mermaid 滚动条引用变量
    • 新增全局兜底 *::-webkit-scrollbar(未套类容器统一 6px 胶囊)
    • 新增 .scroll-area-thumb(Radix ScrollArea 统一)
  • pierre-styles.ts(-30):抽取共享 PIERRE_SCROLLBAR_CSS 常量,PIERRE_DIFF_CSS / PIERRE_FILE_CSS 复用;:hostcolor-scheme: inherit 覆盖库默认,让 diff 内 light-dark() 跟随应用主题
  • DiffView.tsx(-60):删除内联重复的 unsafeCSS,复用 PIERRE_DIFF_CSS;顺带修复原 .diff-scroll [data-code] 前缀在 shadow DOM 内不生效的隐藏 bug
  • diff-scroll.css:引用全局变量
  • rich-text-input.tsx(ProseMirror):宽度引用 --scrollbar-size-sm,补全 thumb/track/radius(原仅有宽度、深色下用系统默认 thumb)
  • scroll-area.tsx:轨道宽度 10px→6px(--scrollbar-size),thumb 引用 .scroll-area-thumb
  • VoiceDictationApp.tsx:隐藏滚动条改用 .scrollbar-none 工具类

关键设计点

  • 颜色必须在使用处计算hsl(var(--muted-foreground) / var(--scrollbar-thumb-opacity))。不能预先算成 --scrollbar-thumb 变量——CSS 自定义属性在声明元素(:root)上替换 var(),深色/彩色主题继承的是已计算值,主题色相会丢失(经浏览器实测确认)。
  • 全局兜底优先级.scrollbar-none(display:none,0,1,0)与 .scrollbar-thin 细化样式高于 *(0,0,0),隐藏保留滚动与细化覆盖不受影响。
  • shadow DOM--scrollbar-* 经 host 继承链穿透 shadow root;pierre 的 color-scheme: inherit 覆盖库自带 light dark

测试

  • bun run typecheck:6 包全部 0 错误
  • bun run --filter='@proma/electron' build:通过(含 proma CLI 编译)
  • 浏览器实测:浅色 thumb rgba(115,115,115,.3) / 深色 rgba(163,163,163,.3) 主题跟随正确;.scrollbar-none 隐藏优先;shadow DOM + @layer unsafecolor-scheme: inherit 覆盖语义正确
  • 两轮独立子会话 BDD 自审通过(第一轮发现并修复 P1 主题跟随 bug;第二轮 approve)

紧急度

常规

备注

  • 本 PR 仅做滚动条视觉与架构统一,不改变任何滚动行为/布局逻辑;全局兜底使此前显示系统默认滚动条的容器(文件浏览器、设置面板、自动任务列表、Radix 弹层等)变为 6px 胶囊统一样式,内容区宽度会相应变化约 6px,属预期
  • 特殊主题(ocean/forest/slate/terminal 的 -light/-dark 后缀)均定义 --muted-foregroundcolor-scheme 跟随 .dark class 逻辑与 theme.ts 完全同步;CRT 终端(旧屏微光)的 ScrollMinimap 特制滚动指示器为自定义 div + !important,不受全局兜底影响,已确认保留

Establish --scrollbar-* CSS variables as the single source of truth for all
scrollbars (tools, code blocks, diff, pierre renderers, ProseMirror, Radix
ScrollArea, native fallback), eliminating 7 duplicated/inconsistent styles.

- globals.css: add scrollbar tokens (size/radius/track/opacity), color-scheme
  light/dark per theme, global *::-webkit-scrollbar fallback, scroll-area-thumb
  unified style
- pierre-styles.ts: extract shared PIERRE_SCROLLBAR_CSS, inherit color-scheme
- DiffView.tsx: reuse PIERRE_DIFF_CSS, drop dead .diff-scroll prefix CSS
- diff-scroll.css / rich-text-input.tsx / scroll-area.tsx / VoiceDictationApp:
  reference shared tokens instead of hardcoded values

Fixes theme-following for dark/colored themes (ocean/forest/slate/terminal)
and ensures consistent 6px pill scrollbars everywhere.
@climashscape
climashscape marked this pull request as ready for review August 4, 2026 12:59
@climashscape climashscape changed the title 【等待审核】style(ui): 统一全代码库滚动条架构 【已审核】style(ui): 统一全代码库滚动条架构 Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant