UI Polish Pass
Core Pack — Always Active
This is a core skill. Use as the final step after design-review and ux-baseline-check on all visual work.
The screen works. Now make it feel right. This is the difference between functional and professional.
Core Lens
- - Distill before decorating.
- Strip the screen to its essential structure, then add back only what earns its place.
- If a polish pass needs more color, more cards, and more chrome, it is probably not a polish pass.
- Use
/bolder and /quieter as directional moves:
-
/bolder = increase contrast, hierarchy, or confidence without adding clutter
-
/quieter = remove noise, reduce emphasis, let the right thing lead
The Pass (run sequentially)
Pass 1: Spacing & Breathing Room
- - [ ] Section spacing — major sections have clear visual separation (32-48px minimum between groups)
- [ ] Element spacing — consistent gaps within groups (use the project's spacing scale, usually 4/8/12/16/24)
- [ ] Edge padding — content doesn't touch container edges. Minimum 16px padding, 24-32px preferred
- [ ] The squint test — do clear groups emerge, or is it one undifferentiated blob?
- [ ] Remove, don't add — if two elements feel crowded, try removing one before adding more UI
Pass 2: Typography Hierarchy
- - [ ] One clear headline — the page has exactly one thing that reads as the primary heading
- [ ] Three levels max — heading, subheading, body. If you need more, the IA is probably wrong
- [ ] Weight before size — try bold before bigger. Try softer opacity before smaller
- [ ] No orphan labels — labels without content, headers without their section
- [ ] Consistent text styles — same content type uses the same style everywhere
Pass 3: Alignment & Grid
- - [ ] Left-align by default — center alignment is for special moments, not routine content
- [ ] Consistent gutters — columns have the same gap throughout
- [ ] Baseline alignment — text in adjacent columns sits cleanly together
- [ ] No rogue pixels — near-miss alignment reads cheap fast
- [ ] Max content width — prose doesn't exceed 65-75 characters per line
Pass 4: Color & Contrast
- - [ ] Restrained palette — use project colors only, don't improvise new ones
- [ ] Tinted neutrals — prefer slightly warm/cool neutrals over pure gray
- [ ] Hierarchy through opacity — secondary text at 60-70%, tertiary at 40-50% when appropriate
- [ ] No decoration color — color means action, status, selection, or rare emphasis
- [ ] Dark/light mode — if the project supports both, check both
Pass 5: Interactive Feel
- - [ ] Hover states exist — every clickable element acknowledges intent
- [ ] Transitions are smooth — 150-200ms for micro-interactions, ~300ms for layout changes
- [ ] Easing is refined — no bounce, no elastic, no novelty curves
- [ ] Cursor changes — pointer on clickable, not-allowed on disabled, grab on draggable
- [ ] Focus visible — tab through the page, always know where you are
- [ ] No dead zones — click targets are generous, not tiny islands of text
Pass 6: Micro-Details
- - [ ] Tabular numbers — any dynamically updating number uses
font-variant-numeric: tabular-nums to prevent layout shift (counters, prices, stats, timers) - [ ] Text wrapping — headings use
text-wrap: balance, body text uses text-wrap: pretty to avoid orphans - [ ] Font smoothing — root layout has
-webkit-font-smoothing: antialiased for crisper text on macOS - [ ] Concentric border radius — nested rounded elements have outer radius = inner radius + padding (see alignment.md)
- [ ] Image outlines — images on light backgrounds get a subtle
outline: 1px solid rgba(0,0,0,0.06) for consistent depth - [ ] Icon animations — icons that change state (open/close, play/pause) cross-fade with opacity + scale, not hard swap
- [ ] Scale on press — buttons use
scale(0.97) on active state for tactile feedback, 100ms transition - [ ] No
transition: all — always specify exact properties (transition-property: transform, opacity)
Pass 7: Final Proof
- - [ ] Screenshot at 1x — does it still look professional at actual pixels?
- [ ] Compare to reference — side by side, honestly
- [ ] The 3-second test — can someone tell what the screen is for quickly?
- [ ] Would Linear or Vercel ship this?
- [ ] Final distill pass — what can you remove and make better at the same time?
When NOT to Polish
- - Prototypes Aaron hasn't aligned on yet
- Throwaway experiments or spikes
- Internal tools where speed matters more than beauty
Polish comes after structure is approved. Never polish a bad foundation.
Speed Tips
- - Fix spacing first — it solves half the problem
- Use the browser inspector grid overlay to check alignment
- Compare at actual viewport width, not narrow devtools panels
- If you're spending more than 15 minutes on polish, something structural is probably wrong
- If the UI feels weak, choose a direction:
/bolder or /quieter, then commit
UI 精修检查
核心包——始终启用
这是一项核心技能。在所有视觉工作的设计评审和用户体验基线检查之后,作为最后一步使用。
屏幕功能已经实现。现在让它感觉对味。这就是功能性与专业性的区别。
核心视角
- - 先提炼,再装饰。
- 将屏幕剥离至其基本结构,然后只添加那些值得占据位置的内容。
- 如果一次精修检查需要更多颜色、更多卡片和更多装饰,那它可能根本不是精修检查。
- 使用/增强和/减弱作为方向性操作:
- /增强 = 在不增加杂乱的前提下,增加对比度、层级或自信度
- /减弱 = 移除噪音,减少强调,让正确的内容主导
检查流程(按顺序执行)
第一遍:间距与呼吸空间
- - [ ] 区块间距——主要区块之间有清晰的视觉分隔(组之间至少32-48px)
- [ ] 元素间距——组内间距保持一致(使用项目的间距规范,通常为4/8/12/16/24)
- [ ] 边缘内边距——内容不接触容器边缘。最小16px内边距,24-32px为佳
- [ ] 眯眼测试——是否形成了清晰的组,还是只是一团无法区分的模糊块?
- [ ] 做减法,而非加法——如果两个元素感觉拥挤,先尝试移除一个,而不是添加更多UI
第二遍:排版层级
- - [ ] 一个清晰的标题——页面恰好有一个内容作为主标题
- [ ] 最多三级——标题、副标题、正文。如果需要更多层级,信息架构可能有问题
- [ ] 先加粗,再放大——先尝试加粗,再考虑放大。先尝试降低透明度,再考虑缩小
- [ ] 无孤立标签——没有内容的标签,没有所属区块的标题
- [ ] 一致的文本样式——相同内容类型在所有地方使用相同样式
第三遍:对齐与网格
- - [ ] 默认左对齐——居中对齐用于特殊时刻,而非常规内容
- [ ] 一致的间距——列之间始终保持相同间距
- [ ] 基线对齐——相邻列中的文本整齐对齐
- [ ] 无像素偏差——接近但未对齐会迅速显得廉价
- [ ] 最大内容宽度——散文每行不超过65-75个字符
第四遍:颜色与对比度
- - [ ] 克制的调色板——仅使用项目颜色,不要即兴创作新颜色
- [ ] 微调中性色——偏好略带暖/冷调的中性色,而非纯灰色
- [ ] 通过透明度建立层级——次要文本使用60-70%,三级文本在适当时使用40-50%
- [ ] 无装饰性颜色——颜色意味着操作、状态、选择或罕见的强调
- [ ] 深色/浅色模式——如果项目支持两者,请同时检查
第五遍:交互感受
- - [ ] 存在悬停状态——每个可点击元素都表明意图
- [ ] 过渡流畅——微交互150-200ms,布局变化约300ms
- [ ] 缓动效果精良——无弹跳、无弹性、无新奇曲线
- [ ] 光标变化——可点击元素使用指针,禁用元素使用禁止,可拖拽元素使用抓取
- [ ] 焦点可见——通过Tab键浏览页面,始终知道当前位置
- [ ] 无死区——点击目标要宽裕,而不是微小的文本孤岛
第六遍:微细节
- - [ ] 表格数字——任何动态更新的数字使用font-variant-numeric: tabular-nums以防止布局偏移(计数器、价格、统计、计时器)
- [ ] 文本换行——标题使用text-wrap: balance,正文使用text-wrap: pretty以避免孤行
- [ ] 字体平滑——根布局设置-webkit-font-smoothing: antialiased,在macOS上获得更清晰的文本
- [ ] 同心圆角——嵌套的圆角元素,外半径 = 内半径 + 内边距(参见alignment.md)
- [ ] 图像轮廓——浅色背景上的图像添加微妙的outline: 1px solid rgba(0,0,0,0.06)以获得一致的深度感
- [ ] 图标动画——状态变化的图标(打开/关闭、播放/暂停)使用不透明度+缩放的交叉淡入淡出,而非硬切换
- [ ] 按下缩放——按钮在激活状态使用scale(0.97)以获得触觉反馈,100ms过渡
- [ ] 不使用transition: all——始终指定具体属性(transition-property: transform, opacity)
第七遍:最终验证
- - [ ] 1倍屏截图——在实际像素下看起来仍然专业吗?
- [ ] 与参考对比——并排对比,诚实评估
- [ ] 3秒测试——别人能快速看出这个屏幕是做什么的吗?
- [ ] Linear或Vercel会发布这个吗?
- [ ] 最终提炼——你能移除什么并同时让它变得更好?
何时不进行精修
- - Aaron尚未对齐的原型
- 一次性实验或探索性工作
- 速度比美观更重要的内部工具
精修在结构获得批准后进行。永远不要精修一个糟糕的基础。
速度技巧
- - 先修复间距——这能解决一半的问题
- 使用浏览器检查器的网格叠加来检查对齐
- 在实际视口宽度下比较,而非狭窄的开发者工具面板
- 如果你在精修上花费超过15分钟,结构上可能有问题
- 如果UI感觉薄弱,选择一个方向:/增强或/减弱,然后坚定执行