Skip to content

[P2] 全部下拉框都是 macOS 原生外观,与产品其余控件不成一套 #55

Description

@yujiezhang-ops

应用里所有 <select> 都在用系统原生渲染,没有任何统一样式。同一个界面里按钮、输入框、卡片都有自己的一套视觉,只有下拉框跟着操作系统走,跨平台和跨主题都对不上。

现状

全应用共 4 个 <select>

位置 类名
components/ProviderSegment.tsx:23 #provider-select完全没有 CSS
components/NavigationSidebar.tsx:48 .language-select-wide
components/NavigationSidebar.tsx:52 .language-select-compact
components/ThemePicker.tsx:29 .theme-picker select

浏览器实测四个全部是 appearance: auto。全仓库 CSS 里 没有一处 appearance: none —— 只有 base.css:33font: inherit:49 的焦点环,都不涉及外观。

#provider-select 一条样式规则都没有,所以它和侧栏那两个连尺寸都不一致。

为什么值得做

  • 跨平台不一致:macOS 的 select 是圆角带阴影的原生控件,Windows 和 Linux 各自又是另一套。同一份界面在三个平台上下拉框长得都不一样,而按钮和输入框是一致的。
  • 深色模式靠系统兜:现在能在深色下勉强可读,是因为 :root 设了 color-scheme: light darktokens.css:2)让系统自己反色。这意味着下拉框的配色不由 --window-bg / --text-primary 这套 token 决定 —— 主题 token 改了它不跟着变。
  • 没有统一的箭头与状态:原生箭头样式、hover、focus、disabled 全部由系统决定,和 .button / .text-field 已有的 140ms 过渡与 --blue-soft 焦点环不成一套。

建议

抽一条共享的 select 规则(base.css.text-field 旁边),做 appearance: none + 自绘箭头 + 用现有 token 上色,然后让四处都用它。箭头用 background-image 的内联 SVG 或 ::after 都可以,注意 <select> 不支持伪元素,所以自绘箭头需要一个包裹元素或者走 background。

要一并注意的:

  • appearance: none 之后必须自己补 focus 样式,否则会丢掉 base.css:49 那条焦点环覆盖的可见性
  • 展开后的 <option> 列表是操作系统绘制的,CSS 改不了。所以"统一"只能做到收起状态;如果要连展开态也统一,那就得换成自定义组件,那是另一个量级的改动,也要自己处理键盘导航和无障碍。建议先只统一收起态
  • 侧栏两个 select 在 900px 断点下会缩到 48px 宽、10px 字号(app.css:1019:1023),自绘箭头要保证这个尺寸下不挤压文字

优先级定为 P2:纯视觉一致性问题,不影响功能,也没有可用性阻塞。#54 那个才是拦住用户的。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions