Skills ui-polish-pass

install
source · Clone the upstream repo
git clone https://github.com/openclaw/skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/aa-on-ai/ui-polish-pass" ~/.claude/skills/openclaw-skills-ui-polish-pass && rm -rf "$T"
OpenClaw · Install into ~/.openclaw/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/aa-on-ai/ui-polish-pass" ~/.openclaw/skills/openclaw-skills-ui-polish-pass && rm -rf "$T"
manifest: skills/aa-on-ai/ui-polish-pass/SKILL.md
source content

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