mcpField
D
design-philosophy

design-philosophy

github.com/microsoft设计与 UI194.4k89 次安装今天更新
代码仓库

关于 design-philosophy

design-philosophy 是面向开发者和 Agent 的 VS Code UI 设计指南,将体验价值、评估原则与具体设计手法相连,帮助团队在实现前讨论和修正界面。

主要功能

  1. 01用于评估 UI 的四项价值
  2. 02以问题形式呈现的设计原则
  3. 03与原则对应的具体设计手法
  4. 04说明不可用功能的指导
  5. 05团队共享的设计语言

适用场景

  1. 01检查视觉嘈杂的面板
  2. 02处理界面层级冲突
  3. 03清楚说明已禁用功能

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/microsoft/vscode --skill design-philosophy

安装后在 Claude Code 中输入/design-philosophy确认已加载。

详细介绍

VS Code 设计理念

这项技能是VS Code 设计理念的权威依据——是开发者和 Agent 思考 UI 时唯一可信的来源。

越来越多的 UI 由 Agent 和工具实现,像素层面的工作也越来越能自行完成,而稀缺的人类工作则变成了背后的设计判断。

这关乎左移——用设计术语讨论 UI,而不是讨论像素,并尽早展开这种对话。发现某处看起来不对劲时,说“这里是 8px,应该改成 6px”只能修正一个数字;说“这个表面的圆角属于错误的层级档位”则指出了规则,因此修复会覆盖所有地方,而且我们能在设计稿或截图中发现问题,而不是等到代码审查时才发现。我们的目标是用设计师和工程师都能理解的语言,就UI 应该是什么样,以及为什么达成共识——设计确定后,实现细节(使用哪个令牌、哪个文件)通常就会随之而来。


如何阅读:三个层次

任何设计语言中最难的部分,都是把*“感觉不对”*变成清晰一致、人人认同的修复方案。本文分三步搭起这座桥,每一层都解释下一层:

层次含义示例
价值我们希望人们感受到什么,以及为何这一点至关重要专注
原则可用于评估设计的规则,以问题的形式表述“一项内容引领,其余内容辅助”——视线首先落在哪里?
手法具体的实现机制,每种手法都说明选哪种以及为什么将次要面板降级为凹陷背景令牌/更轻柔的字体角色

学习这套体系时从上往下读,修复问题时从下往上读:先指出感受,再找出违背的原则,最后采用能恢复这种感受的手法。

示例——繁杂的面板

  • **观察:**面板显得繁杂,总是把视线从编辑器上拉开。
  • **感受:**既不平静,也不专注。
  • **原则:**违背了静止时保持安静(它带有不该有的常驻填充色)和一项内容引领(次要的界面装饰元素与编辑器争夺注意力)。
  • **手法:**将面板改为凹陷/透明背景令牌,仅在悬停时显示边框,并将其标签降级为更轻柔的字体角色。

价值:我们设计所追求的体验

这四项价值描述了我们希望人们使用 VS Code 时感受到什么——它们是最高层次,是下文每条原则和每种手法最终服务的目标。掌握它们,你就能描述几乎所有问题。每项都是 UI 应带给人的一种感受;每项都由下文的一条或多条原则来支撑。先从价值入手,再看原则,最后选择手法。

价值含义违背时的感受……原则
平静静止时保持安静、整洁;留有呼吸空间;柔和而不尖锐;表达朴实自然繁杂、嘈杂、局促、参差、晦涩、刺耳
专注层级清晰;一项内容引领,其余内容辅助扁平、千篇一律,视线无处可落
一致一切遵循相同的尺度和层级随意、偏离网格、逐渐走样
愉悦能发挥作用的小惊喜——引导、确认、定位缺乏生气、突兀或哗众取宠

先说*“这感觉很吵,不够平静”,再说“背景应该透明”*。价值能让所有人聚焦于同一条原则。

为什么是这四项?

有人会问:谁会想要一个不够平静、专注、一致、令人愉悦的 UI?这正是重点。这些并非我们声称相较于其他产品的差异化优势——它们是在我们这类工具中最容易受到威胁的品质,而将它们明确提出,正是我们捍卫这些品质的方式。我们之所以选择它们,是因为 VS Code 在结构上最容易失去这些价值:

  • 平静是 IDE 最先牺牲的品质。VS Code 信息密集,人们一用就是几个小时;每个功能团队都有充分理由再增加一个操作入口,累积起来就成了噪声。平静这一价值能抵御我们自身的惯性。
  • 专注很重要,因为我们的界面层次很深。在一个强大工具中,满屏都是权重相同、同样合理的控件,是默认的失败模式。明确提出专注,能迫使我们决定什么才是主角。
  • 一致是最需要捍卫、覆盖面也最大的品质。VS Code 由许多人历经多年构建;偏差是自然状态。一致与其说是一种愿景,不如说是一种维护纪律。
  • 令人愉悦是我们刻意限量使用的品质。只有真正发挥作用时,它才值得保留(原则 7)。我们提出它,不是为了增添更多修饰,而是为了让它保持真诚:让愉悦感起到引导和确认作用,而不是装饰。

每个价值都体现了一种真实的权衡,而不是毫无代价的好处——这正是它们值得明确提出、而非沦为陈词滥调的原因:

  • 平静与信息密度相权衡——在静止状态下,我们要展示多少内容?
  • 专注与平等访问相权衡——我们要弱化什么,才能让一项内容成为主角?
  • 一致与真正特殊的情况相权衡——什么时候差异是有依据的,而非偏差?
  • 令人愉悦与克制相权衡——什么时候点缀会变成噪声?

因此,真正有用的问题不是“我们会不想要这些品质吗?”,而是“这个界面牺牲了哪项价值,我们是有意这样做的吗?”当某项价值确实必须让步时——例如,一条重要警告应该打破平静以吸引注意——这就是经过深思熟虑、明确标注的例外,而不是放弃这项价值的理由。


原则

原则是评估标准:每条原则都提出一个可以用来审视任何界面的问题,答案会告诉你设计是否恰当——与任何像素值无关。它们按所维护的价值分组。


平静
1. 静时安静,交互时显现

提问: 没有任何操作时,有什么东西在大声喧哗吗?

除非用户与之交互,否则界面元素应退居幕后。一个常驻填充色、边框或焦点环,却没有充分理由的界面,会和用户内容争夺本不需要的注意力。现代风格是克制的:元素在用户有意操作时——悬停、聚焦、交互——才显现,其他时候则安静待命。

如果这条原则没有落实,人们会说“静止时太醒目了/应该等到悬停时再显现”或“点击时触发了焦点环”——这是对行为的描述,而非颜色值。

通过以下方式落实: 按需显现的行为、单线条、主题颜色。

2. 留出呼吸空间

提问: 这里是否显得拥挤、局促或杂乱?

平静的 UI 应当宽松、柔和。留白不是浪费;它能让视线休息,并在不画任何线条的情况下将内容分组。边缘应圆润而非尖锐。当界面让人感到封闭或繁杂时,通常应在间距阶梯上增加留白,而不是缩小内容。

通过以下方式落实: 间距阶梯、层级(圆润而非尖锐)。

3. 界面应直白、友善地说明自身

提问: 用户能否一眼看懂,而不必猜测?

UI 的表达应像人与人交谈。优先使用文字,而不是含义不明的字形;采用句首字母大写的格式;保持语气亲切自然。一个没有标签的孤立图标,或一个标题格式的营销口号,都会让用户付出不必要的精力——表达绝不晦涩,也绝不大声喧哗。

通过以下方式落实: 文字与大小写。

让不可用的功能一目了然

用户会寻找他们在发行说明、文档或宣传内容中看到的功能。如果策略、账户权限、设置或版本要求导致某个相关选项无法使用,悄悄将其移除会让用户觉得产品出了问题。最好保留该选项供用户发现,但将其禁用,并简洁、如实地说明原因和有用的下一步操作。

  • 使用权威状态区分受组织策略限制、需要登录/升级/更新、此处不支持和仍在加载;仅仅未出现在列表中,并不能证明它受策略限制。
  • 沿用现有的禁用行样式,并使用公文包指示器表示受管理策略限制。提供可见的原因说明或可独立操作的了解原因链接;不要只通过悬停才能查看说明。
  • 展示方式不得授予访问权限:阻止指针、键盘和过期菜单触发操作,同时确保说明链接仍可操作。请遵循无障碍指南。
  • 这并不意味着一律公开所有内容。保留明确隐藏功能的选项(包括禁用 AI)、不受支持的提供商能力以及尚未发布的功能门控。在相关位置说明不可用的功能,但不要凭空声称支持,也不要暴露敏感的策略值。

重用以下模式,而不是复制整个实现:

界面示例
设置受管理设置指示器和无障碍策略文本
模型选择器不可用模型及针对管理员、升级和更新的不同说明
Harness 选择器可用性说明和策略帮助链接
权限选择器共享的权限级别策略展示和选择器集成,以及运行时策略边界

示例——被挤满的工具栏

  • **看到:**工具栏放在一条实心填充的栏上,每个按钮之间都有分隔线,按钮彼此紧贴。
  • **感受:**并不宁静——显得繁杂、局促。
  • **原则:**违背了静止时保持安静(填充和分隔线成了永久的装饰,却没有存在的必要)和留出呼吸空间(按钮挤在一起)。
  • **做法:**让工具栏静止时呈现透明效果,去掉分隔线(一道线——在这里答案是不需要),并在渐变过程中拉开按钮间距。
聚焦
4. 突出一项,其余内容辅助

**思考:**视线首先会落在哪里——有没有次要内容在争抢注意力?

每个视图都应有明确的视觉焦点——视线首先应该落到的那一项。让次要信息避开这个位置:为其采用更低调的字体角色、凹陷的表面或更小的图标来弱化,让重要内容突出,其余内容提供辅助。如果所有内容的视觉权重都相同,视图就会显得平淡——视线无处可落。

通过以下方式实现:字体角色、层级、按上下文设置图标大小。

5. 层级通过编码表达,而非凭感觉判断

提问: 这个表面的圆角程度,是否与它相对下方内容的悬浮高度相匹配?

表面的圆润程度和凸起高度都有意义:它们能说明表面在层级中的位置。浮动覆盖层看起来会比平放在窗格中的控件更圆润。圆角取决于表面在层级中的角色,而非个人喜好。(这同时体现了聚焦和一致。)

通过以下方式落实: 层级、按需显示(滚动阴影)。

示例——扁平的设置行

  • **观察:**设置行中的标签、帮助文本和“重置”操作,大小和字重都一样。
  • **感受:**不够聚焦——显得扁平;视线不知道该落在哪里。
  • **原则:**违背了突出一个重点——没有任何内容是关注中心。
  • **调整:**将标签提升为首要文本角色,将帮助文本降为 body2,并将“重置”设为低调的次要操作,让设置行按从上到下的顺序呈现。
一致
6. 相同之物应看起来相同

提问: 两个相似的事物看起来是否完全一致——这里的任何差异是否都是有意为之?

相同的元素必须看起来相同,因为它们使用同一套命名尺度。两个相似的事物若有差异,这种差异就应该有意义;意外的偏差是大忌。这就是为什么每个尺寸、圆角、字重和颜色都是带有角色的命名令牌,而不是具体数值——具体数值只是对应令牌的替代写法。

通过以下方式落实:下文中的每项做法——它们就是共享尺度。尤其参见设计令牌、间距阶梯、字号阶梯、图标尺寸、统一描边。

示例——两个不匹配的对话框

  • **观察:**两个对话框并排打开;一个圆角为 8px,另一个为 6px——它们都是浮动覆盖层。
  • **感受:**不够一致——界面显得前后不一。
  • **原则:**违背了相同之物应看起来相同(两个等效表面无故看起来不同),也违背了层级通过编码表达(覆盖层应属于 Outer 层级)。
  • **调整:**让两者都使用 Outer 圆角令牌;6px 是某人直接输入的具体数值,而非通过命名层级来选用。
愉悦
7. 愉悦设计必须物有所值

提问: 这能帮助用户做什么?

动效、渐显效果和润饰细节都值得采用——但每一项都必须发挥作用:引导视线、确认操作、帮助用户定位,或让跳转更平顺。如果无法回答这个问题,那它就是装饰,而装饰看起来只会像噪声(回到平静)。保持细腻、短暂且可中断;遵循 prefers-reduced-motion;绝不为动画而动画。

动效的问题应当是*“这个过渡对我毫无帮助”(删掉它),或“这个跳转让人摸不着方向——需要一个有实际作用的过渡”*(加上一个),而不是纠结时长或缓动值。

通过以下方式落实:按需显示行为。

示例——弹跳面板

  • **观察:**每次切换侧面板时,它都会以 600ms 的弹跳效果滑入。
  • **感受:**不够愉悦(显得花哨),也不够平静(缓慢而张扬)。
  • **原则:**违背了愉悦设计必须物有所值——弹跳没有发挥作用,而且切换操作本身已经很明显。
  • **调整:**如果无需帮助用户定位,就删掉动画;如果面板出现时确实需要帮助用户理解位置变化,就用短暂、细腻且可中断的淡入效果替代,并遵循 prefers-reduced-motion。

具体做法:机械工具箱

具体做法是具体的机制——令牌、递增阶梯和层级。单独来看,它们只是允许值的列表;让每项具体做法真正可用的,是说明选哪个值,以及为什么的决策规则,以及它所服务的原则。采用某项具体做法时,先讲规则,而不是照搬字面值。

本节是唯一涉及实现的部分——即便如此,目标仍是让对话围绕设计展开。应将具体做法视为让已达成共识的设计得以一致实现的共享词汇,而不是评审的开场白。先明确感受和原则,再采用具体做法,绝不能用它们取而代之。

尺寸和字体令牌位于 baseSizes.ts;完整参考请见 design-tokens.instructions.md。

令牌才是事实来源,而不是像素

设计系统中的间距、圆角、字体角色和颜色,在有对应命名令牌或递增阶梯时,应使用它们。结构性尺寸仍可使用原始字面值。

  • **决策规则:**发现某处看起来不对时,找到它应该表达的令牌,并围绕令牌进行推理,而不是围绕字面值。
  • **服务于:**相同之处应体现相同(6)。

一个 8px 的圆角并不是“8px”。它是有人直接输入字面值的外层表面圆角。明确角色后,修复方法自然就清楚了。

高度层级——按角色取整,而不是按字面值

圆角半径表达一个表面相对于其下方表面的悬浮高度。每个带圆角的元素都恰好属于一个层级:

层级半径令牌含义
控件4px--vscode-cornerRadius-small可交互元素——按钮、输入框、列表行、标签页
内部6px--vscode-cornerRadius-medium位于表面内部的非控件容器
外层8px--vscode-cornerRadius-large悬浮/覆盖层表面——菜单、悬停提示、对话框、提示气泡

胶囊形元素(半径约为高度的一半)应为全圆形(--vscode-cornerRadius-circle),而不是“一个很大的半径”。

  • 决策规则:根据表面在层叠结构中的角色选择层级,而不是看圆角的外观。此处的错误应描述为*“这个覆盖层使用了控件层级的圆角”,而不是“这里需要更大的 border-radius”*。
  • **服务于:**高度通过视觉编码(5)、留出呼吸空间(2)。

间距递增阶梯——符合阶梯或不符合阶梯

内边距、外边距和间隙应取自间距递增阶梯(0、2、4、6、8、10、12、16、20、24、28、32、36、40)。

  • 决策规则:一个值要么符合阶梯,要么不符合。不符合阶梯的值(3、5、7、14、26……)会破坏节奏;应调整到最近的步长,距离相同时向上取整。描述节奏问题时,应说“这个值不符合间距递增阶梯”,而不是“加几个像素”。
  • **服务于:**留出呼吸空间(2)、相同之处应体现相同(6)。

字体递增阶梯——明确角色和两种字重,而非随意设定字号

文本样式是角色,不是任意字号:heading1–3、body1–2、label1–3。字重恰好有两种——regular(400)和 semiBold(600)。没有 medium(500)。所谓“强调”不是放大字号,而是使用相同角色令牌并设为 semiBold。

  • 决策规则:根据文本在层级中的位置选择角色,而不是凭目测字号。看起来不够醒目的标题,问题应描述为*“字体角色不对”或“缺少 semiBold 字重”,而不是“把字体调到 14”*。任何地方出现 500 都表示不符合递增阶梯。
  • **服务于:**突出一个重点(4)、相同之处应体现相同(6)。

图标尺寸 - 两种尺寸,按上下文选择

Codicon 的尺寸为 **16px(基础)**或 12px(紧凑),没有其他尺寸;14px 始终是错误。在紧凑尺寸下,还要改用 *Compact 字形(Codicon.close → Codicon.closeCompact),让图标经过视觉优化,而不只是缩放。

  • 决策规则:尺寸取决于上下文的密度和层级。独立显示或用于主要操作、需要舒适点击区域时,使用基础尺寸(16px);用于密集行、行内字形,以及与文本并列的次要界面元素时,使用紧凑尺寸(12px)。因此,对于“用 16 还是 12?”这个问题,答案是*“这个图标在此处扮演什么角色?”,而不是个人喜好。应说“这个图标应使用紧凑尺寸”,而不是“把它稍微缩小一点”*。
  • 服务于: 突出一项内容(4)、一致性传达一致性(6)。

单一线宽

标准边框/分隔线宽度为 1px(--vscode-strokeThickness)。

  • 决策规则:是否显示普通边框是一个是/否的决定。保留较粗的语义性或无障碍线条,例如焦点指示器。
  • 服务于: 静止时保持安静(1)、一致性传达一致性(6)。

颜色来自主题

所有颜色都是 --vscode-* 主题令牌,因此 UI 会适配当前主题和高对比度模式。

  • 决策规则:硬编码十六进制颜色本身就是错误。颜色问题应描述为“主题令牌错误”(或“令牌在浅色/HC 模式下不可见”),而不是需要微调的十六进制值。
  • 服务于: 静止时保持安静(1)、一致性传达一致性(6)。

按需显示的行为

过去一直带有填充色的界面元素现在在静止时显示为透明,只在交互时显现。每种行为也各司其职,因此一举两得:

  • commandCenter - 静止时透明;悬停时显示背景/边框,让指针确认自己所指向的对象。

  • statusBar - 与窗口融为一体;悬停时只有背景变化,前景保持不变。

  • keyboardFocusOnly - 仅在键盘聚焦(:focus-visible)时显示焦点环,鼠标点击时不会显示,因此只在有用时才呈现相应提示。

  • scrollShadows - 内容在表面边缘下方渐隐,而不是被硬边界截断,让人感受到折叠区域之外还有更多内容。

  • 服务于: 静止时保持安静(1)、恰到好处的惊喜才有价值(7),以及(滚动阴影)用高度变化编码层级(5)。

文案与大小写

优先使用文字标签,而不是图标。文字一看便知;图标则需要猜测。只有在含义近乎普遍(关闭、搜索)或空间确实有限时才使用字形,否则就用文字标注,或者在需要兼顾识别与记忆时搭配图标和标签。单独出现的神秘字形才是问题,而不是图标选得不够好:应说“这个操作没有标签——给它加上文字”,而不是“找个更清晰的图标”。

使用句首字母大写格式。标签、按钮、菜单和消息只将首词和专有名词首字母大写——“Start new session”,而不是“Start New Session”。这种格式更平和、亲切,也更便于快速浏览。应将问题描述为“这是标题式大小写——改为句首字母大写”,这是语气上的调整,而不是改写文案。

⚠️ 已知冲突 - 后续协调。此处的句首字母大写规范是现代 UI 的预期方向,但它与仓库级编码指南相矛盾;该指南要求命令标签、按钮和菜单项使用标题式大小写(参见 coding-guidelines.instructions.md 中的“UI labels”)。这两种规范尚未协调。在协调完成前,已发布的非实验性 UI 应遵循现有的标题式大小写规则,句首字母大写仅适用于已明确采用现代 UI 方向的界面。TODO:确定统一的大小写规范,并更新相应文档。

  • 服务于: 界面能自我说明(3)。

措辞手册:描述问题,指出原则

先说角色 / 层级 / 阶梯,而不是数值——然后指出原则,让修复能应用到所有地方,而不只是眼前这一处。数值只是症状。

❌ 不要这样说✅ 应该这样说原则
“圆角半径应该是 6,而不是 8”“这是一个 Inner 表面,应使用 Outer 层级的圆角”5 · Elevation
“这个菜单的圆角太尖了”“这个叠加层应该使用 Outer 圆角层级”5 · Elevation
“增加 2px 内边距”“此内容偏离间距阶梯 / 需要留出阶梯间距”2 · 留出呼吸空间
“把这个改成 14px”“这里应该使用 label1 / body1 字体角色”4 · 以一为先
“标题看起来太细了”“标题缺少 semiBold 字重”4 · 以一为先
“这里用 font-weight 500”“500 不在阶梯上——应改为 semiBold(600)”6 · 一致性
“把这个图标稍微缩小一点”“这个图标应该使用紧凑(12px)尺寸 + *Compact 字形”4 · 以一为先
“这个图标是 14px”“codicon 只有 16 或 12 两种尺寸——选标准尺寸或紧凑尺寸”6 · 一致性
“这个普通边框太粗了”“标准边框是单像素描边(1px)——这里应该 / 不应该有边框;较粗的焦点 / 语义描边应保留”1 · 静止时保持低调
“换掉这个灰色十六进制值”“这是错误的主题令牌 / 在浅色 / HC 模式下会消失”6 · 一致性
“命令中心周围有个方框”“界面装饰在静止时应保持低调,悬停时再显现”1 · 静止时保持低调
“我点击时会显示焦点轮廓”“焦点环只应在键盘焦点时显示(:focus-visible)”1 · 静止时保持低调
“列表底部被截断了”“这个表面缺少滚动阴影渐隐效果”7 · 愉悦感 / 5 · Elevation
“窗格标题有条线 / 硬边”“窗格标题应是圆角、无分隔线的分区标题”1 · 静止时保持低调

提出和接收反馈

描述设计,而不是像素。 指出被违反的规则后,修复就能应用到所有出问题的地方,而不只是你碰巧注意到的那一处。

发现问题时,按以下顺序说明:

  1. 感受——缺少四种价值中的哪一种?平静、专注、一致、愉悦。
  2. 界面表面——是什么,在哪里?“侧边栏窗格标题”,“保存对话框”。
  3. 违反的原则——导致这种感受的规则。
  4. 修复方式——能够恢复这种感受的具体做法。
  5. 最后才说数值(如有帮助)——“现在是 4px,看起来应该是 6px。”

示例 “活动栏让人感觉不够平静——静止时太过抢眼。图标一直带有填充色,和编辑器争夺注意力(静止时保持低调,有交互意图时再显现)。能否改为悬停时再显示填充色?它看起来也差不多紧了 2px,不过填充色才是主要问题。”

先说感受,而不是修复方式

这个词能让所有人想到同一个原则,即使大家还没就具体像素达成一致:

先这样说不要这样说
“这让人感觉不够平静——静止时太吵了”“把背景设为透明”
“这不够专注——视线无处落点”“把标题做大一点”
“这让人感觉不一致——这两个对话框不匹配”“把圆角改为 6”
“这个过渡不够愉悦,只是装饰而已”“把动画调快一点”
为什么反馈难以落实

这些反馈并没有错,只是不够完整——它们修好了一个地方,却又渐渐偏离了统一标准:

  • 只给出一个数字。 “这里应该是 6px。” 是哪个令牌?为什么?说明用途,修复才能应用到所有地方。
  • 只表达喜好,没有规则。 “我不喜欢这个圆角。” 把它与某个值或原则联系起来,这样它才是共同标准,而不是个人偏好。
  • 只说怎么改,没有说明感受。 “把它设为透明。” 也许可以——但先说清楚问题是什么(“它在静止时太抢眼”),这样我们修复的是根因,而不只是这个实例。
  • 一次提出多件事。 把 “这个面板太杂乱、不符合网格,而且图标也不对” 拆成三条,每条都对应一个值。
实用建议
  • 标明界面区域。 一张截图或一段短视频(用于说明动态效果),再加上视图名称,胜过一大段描述。圈出问题位置。
  • 每个讨论串只讨论一条观察。 每条反馈只针对一个界面区域和一个值,这样就能单独讨论并解决。
  • 浅色、深色与高对比度主题。 如果问题只在某个主题下出现,请说明——这通常意味着是主题令牌的问题,而不是颜色选择的问题。
  • 减少动态效果。 对于动画反馈,请说明是否启用了 prefers-reduced-motion;即使没有动态效果,过渡也应该合理。

评论

支持 Markdown