make-interfaces-feel-better
Skill14 starsChanged 21 days agoMITView on GitHub
UI polish principles: animations, typography, shadows, hover states.
40 other projects use a version of this, 31 of them edited.
Adopted by
Most recently taken up by
- ZhouYinLong-lab/Dog-Skillsedited, first seen Nov 8, 2026
- crbnos/carbonedited, first seen Nov 7, 2026
- beeblock/orkestraiedited, first seen Nov 4, 2026
- theexperiencecompany/gaiaedited, first seen Nov 3, 2026
- robinbril/claude-code-harnessedited, first seen Nov 1, 2026
- arthjean/skillsedited, first seen Nov 1, 2026
Used with
Projects with it also use add-block, userinterface-wiki and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
Ame-AlSkilladd-block
Create or update a Sim integration block with correct subBlocks, conditions, dependsOn, modes, canonicalParamId usage, outputs, and tool wiring. Use when working on `apps/sim/blocks/blocks/{service}.ts` or aligning a block with its tools.
Also in 3 projects that use this
raphaelsalajaSkilluserinterface-wiki
UI/UX best practices for web interfaces. Use when reviewing animations, CSS, audio, typography, UX patterns, prefetching, or icon implementations. Covers 11 categories from animation principles to typography. Outputs file:line findings.
Also in 3 projects that use this
AnasX7Skilltransitions-dev
Production-ready CSS transitions for web apps. Use when implementing notification badges, dropdowns, modals, panel reveals, page transitions, card resizes, number pop-ins, text swaps, icon swaps, success checks, avatar group hovers, error state shakes, search/input clear, skeleton loaders, shimmer text, sliding tabs, tooltips, staggered text reveals, card hover tilt, plus-to-menu morph, accordions, toasts, like buttons, learn-more hovers, checkbox checks, spinning counters, toggles, AI thinking states, reasoning streams, streaming text, matrix dot loaders, or banner stacking. Triggers on "add a transition", "animate the dropdown", "make the modal open smoothly", "swap icon", "page slide", "stagger animation", "open / close transition", "make it animate", "fade between", "success animation", "form error", "shake on invalid", "hover lift", "avatar stack hover", "clear the search", "skeleton loader", "loading shimmer", "shimmer text", "sliding tabs", "segmented control", "tooltip", "reveal text", "tilt card", "3D hover tilt", "cursor glare", "plus to menu", "FAB morph", "accordion", "collapsible", "expand / collapse", "disclosure", "toast", "snackbar", "like button", "heart animation", "learn more arrow", "checkbox", "check animation", "spinning counter", "odometer", "slot machine digits", "toggle", "switch", "thinking states", "AI status line", "agent reasoning", "reasoning stream", "streaming text", "stream words in", "matrix loader", "dot loader", "banner stack", "stacked toasts". Also "motion tokens", "scan for ad-hoc transitions", "replace hardcoded durations with motion tokens", "tokenize my animations", and the commands transitions reveal, transitions review, transitions apply, transitions refine.
Also in 6 projects that use this
AnasX7Skillbetter-typography
Focuses on type scale, spacing, sizing, variable fonts, OpenType features, wrapping, truncation and other details that make typography feel great across your product.
Also in 5 projects that use this
agentset-aiSkillfixing-accessibility
Fix accessibility issues.
Also in 4 projects that use this
VercelSkillemil-design-eng
This skill encodes Emil Kowalski's philosophy on UI polish, component design, animation decisions, and the invisible details that make software feel great.
Also in 15 projects that use this
- +6 more from AnasX7
Other versions40 projects use a version of this.
Word for word · 0
None found.
Edited · 31
- simstudioai/sim★ 30k42% same
- samuelclay/NewsBlur★ 7.7k66% same
- crbnos/carbon★ 2.8k58% same
- moumen-soliman/uitripled★ 1.4k58% same
- VladSez/easy-invoice-pdf★ 1.1k66% same
- theexperiencecompany/gaia★ 32566% same
- PunGrumpy/logixlysia★ 27560% same
- julianromli/ai-skills★ 21558% same
- WatermelonCorp/watermelon-platform★ 18758% same
- wibus-wee/cradle-app★ 7558% same
21 more not listed
Wrote their own version · 9
- Fmarzochi/EGC★ 61same name
- woxiangyangzhimao/skills★ 14same name
- ammdevl/vibe-match★ 8same name
- gongyijie85/dsh-ecc★ 8same name
- NISTALTALSON/essential-claude-skills★ 1same name
- SamuelNDCE/claude-super-skill-library★ 1same name
- davidanthonyn/claude-skills★ 0same name
- renepf/claude-skills★ 0same name
- studio-lgtm/Claude-Skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- agent-reachSkill
- anthropic-skills-indexSkill
- cavemanSkill
- client-literature-monitorSkill
- cybersecurity-skills-indexSkill
- dev-pairSkill
- estate-experimentsSkill
- failure-is-not-an-optionSkill
- llm-councilSkill
- pdf-creatorSkill
- quality-guardSkill
- senior-dev-promptSkill
- verify-resultsSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
13 rules. 2 are common, 3 are distinctive, and 8 are very specific to this project.
2
Common
Most of the 39 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 20
When reviewing, slow the interface down: replay motion at 10% speed in the browser's Animations panel and walk every state: hover, focus, …
- Common: line 40
When geometric centering looks off, align optically.
- Common: line 48
Use CSS transitions for interactive state changes — they can be interrupted mid-animation.
- Very specific: line 56
Use a small fixed translateY instead of full height.
- Very specific: line 68
Use font-variant-numeric: tabular-nums for any dynamically updating numbers to prevent layout shift.
- Very specific: line 72
Use text-wrap: balance on headings.
- Very specific: line 84
Use initial={false} on AnimatePresence to prevent enter animations on first render.
- Very specific: line 88
Always specify exact properties: transition-property: scale, opacity.
- Very specific: line 92
Only for transform, opacity, filter — properties the GPU can composite.
- Distinctive: line 108
No custom animation on high-frequency interactions: the attention cost repeats on every trigger.
- Very specific: line 131
Use full when no review mode is supplied.
- Distinctive: line 187
Do not invent filler. If the scope contains fewer borderline candidates, include the ones that exist and say so.
- Very specific: line 196
When there are no findings, omit the findings table, state "No actionable interface-polish findings", report verification and rejected …
“Common” is measured: kept by at least 6 in 10 of the 39 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Details that make interfaces feel better
Great interfaces rarely come from a single thing. It's usually a collection of small details that compound into a great experience. Apply these principles when building or reviewing UI code. Before suggesting or writing a fix, identify the project's existing styling system and express the change in that system: Tailwind in a Tailwind project, plain CSS in a CSS project, or the established CSS-in-JS approach. Never introduce a second styling system just to apply a polish fix.
When reviewing, slow the interface down: replay motion at 10% speed in the browser's Animations panel and walk every state: hover, focus, active, loading, empty. What feels off at 10% speed is what's subtly wrong at full speed.
Quick Reference
| Category | When to Use |
| Typography | Text wrapping, font smoothing, tabular numbers |
| Surfaces | Border radius, optical alignment, shadows, image outlines, hit areas |
| Animations | Interruptible animations, enter/exit transitions, icon animations, scale on press, motion restraint |
| Icons | Icon stroke weight, states via currentColor, outline vs fill, sizing, RTL flipping |
| Performance | Transition specificity, will-change usage |
Core Principles
1. Concentric Border Radius
Outer radius = inner radius + padding. Mismatched radii on nested elements is the most common thing that makes interfaces feel off.
2. Optical Over Geometric Alignment
When geometric centering looks off, align optically. Buttons with icons, play triangles, and asymmetric icons all need manual adjustment.
3. Shadows for Elevation, Borders for Structure
For buttons, cards, and containers whose border exists only to create depth, prefer layered transparent box-shadow values. Keep borders that communicate structure or state: dividers, layout separators, and selected or focus states.
4. Interruptible Animations
Use CSS transitions for interactive state changes — they can be interrupted mid-animation. Reserve keyframes for staged sequences that run once.
5. Split and Stagger Enter Animations
For an infrequent staged entrance where sequence helps communicate hierarchy, break content into semantic chunks and stagger them by ~100ms instead of animating one container. Do not stagger routine, high-frequency interactions.
6. Subtle Exit Animations
Use a small fixed translateY instead of full height. Exits should be softer than enters. Use ease-out for both enter and exit transitions.
7. Contextual Icon Animations
Animate icons with opacity, scale, and blur instead of toggling visibility. Use exactly these values: scale from 0.25 to 1, opacity from 0 to 1, blur from 4px to 0px. If the project has motion or framer-motion in package.json, match that package's import path (or the established nearby imports when both exist) and use transition: { type: "spring", duration: 0.3, bounce: 0 } — bounce must always be 0. If no motion library is installed, keep both icons in the DOM (one absolute-positioned) and cross-fade with CSS transitions using cubic-bezier(0.2, 0, 0, 1) — this gives both enter and exit animations without any dependency.
8. Font Smoothing
Apply -webkit-font-smoothing: antialiased to the root layout on macOS for crisper text.
9. Tabular Numbers
Use font-variant-numeric: tabular-nums for any dynamically updating numbers to prevent layout shift.
10. Text Wrapping
Use text-wrap: balance on headings. Use text-wrap: pretty for body text to avoid orphans.
11. Image Outlines
Add a subtle 1px outline with low opacity to images for consistent depth. The color must be pure black in light mode (oklch(0 0 0 / 0.1)) and pure white in dark mode (oklch(1 0 0 / 0.1)), never a near-black like slate, zinc, or any tinted neutral. A tinted outline picks up the surface color underneath it and reads as dirt on the image edge.
12. Scale on Press
A subtle scale(0.96) on click gives buttons tactile feedback. Always use 0.96. Never use a value smaller than 0.95 — anything below feels exaggerated. Add a static prop to disable it when motion would be distracting.
13. Skip Animation on Page Load
Use initial={false} on AnimatePresence to prevent enter animations on first render. Verify it doesn't break intentional entrance animations.
14. Never Use transition: all
Always specify exact properties: transition-property: scale, opacity. Tailwind's transition-transform covers transform, translate, scale, rotate.
15. Use will-change Sparingly
Only for transform, opacity, filter — properties the GPU can composite. Never use will-change: all. Only add when you notice first-frame stutter.
16. Minimum Hit Area
Interactive elements should prefer a 44×44px hit area for touch or mobile contexts. In dense desktop interfaces, use at least 40×40px. Extend with a pseudo-element if the visible element is smaller. Never let hit areas of two elements overlap.
17. Match Icon Stroke to Text Weight
An icon next to text carries the text's optical weight: 1.5px stroke beside regular (400) text, 2px beside semibold (600). One stroke weight per icon set; never mix libraries on one surface.
18. One SVG, Recolored per State
Icons use currentColor and get their states (hover, selected, disabled) from CSS color and opacity, never from separate assets. Outline variant is the default; fill variant marks the active state.
19. Motion Restraint
No custom animation on high-frequency interactions: the attention cost repeats on every trigger. Motion is never the only feedback channel; every animated state change also needs a static cue such as color, icon, or label.
Common Mistakes
| Mistake | Fix |
| Same border radius on parent and child | Calculate outerRadius = innerRadius + padding |
| Icons look off-center | Adjust optically with padding or fix SVG directly |
| Border used only to fake elevation | Use layered box-shadow with transparency; keep structural and state borders |
| Jarring staged entrance or contextual exit | Stagger infrequent entrances and keep context-preserving exits subtle |
| Numbers cause layout shift | Apply tabular-nums |
| Heavy text on macOS | Apply antialiased to root |
| Animation plays on page load | Add initial={false} to AnimatePresence |
transition: all on elements | Specify exact properties |
| First-frame animation stutter | Add will-change: transform (sparingly) |
| Tiny hit areas on small controls | Extend with a pseudo-element to 44×44px for touch/mobile, or at least 40×40px in dense desktop UI |
| Hairline icon beside bold text | Match the stroke width to the text weight |
| Separate icon assets per state | One currentColor SVG, states via CSS |
| Filled icons everywhere | Outline as default, fill only for the active state |
| Entrance animation on every hover or keystroke | Instant feedback or ≤150ms opacity/color transition |
Review Output Format
Use full when no review mode is supplied.
| Mode | Coverage | Finding cap |
quick | Primary user path and highest-traffic states; report only HIGH and MEDIUM issues | 5 |
full | Entire requested scope across typography, surfaces, animations, icons, and performance | 15 |
Scope and Coverage
State the mode, exact scope, framework, styling conventions, and any review boundary. Show what was actually inspected:
| Category | Evidence inspected | Result |
| Typography | Files, components, states, or checks | Findings count, Clear, or Not reviewed with a reason |
Include all five Quick Reference categories. Never imply an uninspected surface was reviewed.
Findings
Group findings by principle. Use a markdown table with Severity, Location, Before, After, and Why columns. Include every change made or proposed, not a subset. Never use separate "Before:" / "After:" lines.
- Severity:
HIGHmakes an interaction inaccessible, misleading, unreadable, or repeatedly disruptive;MEDIUMcreates a noticeable usability or consistency problem;LOWis isolated polish and appears only infullmode. - Location: cite
path/to/file:line. If the artifact has no source files, cite the exact screen and component instead. - Before / After: show the current implementation and an actionable replacement.
- Why: name the violated principle and explain its user impact.
Consolidate a repeated systemic issue into one row and list every affected location. Omit principles with no findings and never pad the report to reach the cap.
Example
Concentric border radius
| Severity | Location | Before | After | Why |
| LOW | src/Card.tsx:28 | rounded-xl on card + rounded-xl on inner button (p-2) | rounded-2xl on card (8 + 8 = 16), rounded-lg on inner button | Nested corners should be concentric |
| LOW | src/card.css:11 | border-radius: 16px on both nested surfaces | Outer 24px, inner 16px with 8px padding | Equal nested radii make the inner surface look pinched |
Tabular numbers
| Severity | Location | Before | After | Why |
| MEDIUM | src/Counter.tsx:17 | <span>{count}</span> | <span className="tabular-nums">{count}</span> | Proportional digits cause changing values to shift |
| LOW | src/timer.css:8 | Default numerals on a timer | Add font-variant-numeric: tabular-nums to the timer | Equal-width digits keep the timer stable |
Scale on press
| Severity | Location | Before | After | Why |
| LOW | src/Button.tsx:19 | <button className="..."> | Add active:scale-[0.96] transition-transform | Press feedback makes the control feel responsive |
| MEDIUM | src/button.css:24 | scale(0.9) on press | Raise to scale(0.96) | Anything below 0.95 feels exaggerated |
Considered but Rejected
Include 1–3 real candidates in quick mode and 2–5 in full mode:
| Location | Candidate | Rejected because |
src/Card.tsx:28 | Increase the shadow | Existing depth matches the shared surface token; changing one card would reduce consistency |
Do not invent filler. If the scope contains fewer borderline candidates, include the ones that exist and say so.
Verification and Verdict
After the findings:
- Verification: list the exact commands or interactions run and their observed results. Walk every relevant state and inspect motion at 10% speed when animation is involved. If a check was not run, label it Not verified and state what remains.
- Verdict:
Blockif anyHIGHfinding remains,Needs changesif onlyMEDIUMorLOWfindings remain, andApproveonly when no actionable findings remain. List every unverified check beside the verdict.
When there are no findings, omit the findings table, state "No actionable interface-polish findings", report verification and rejected candidates, and end with Approve.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

