better-ui
Skill8 starsChanged 38 days agoMITView on GitHub
Polishes and improves the UI in your project. Covers concentric border radius, optical alignment, surface depth, contextual icons, hit areas and more.
39 other projects use a version of this, 30 of them edited; 2 new projects in the last 4 weeks, against 5 the 4 before.
Adopted by
Cooling: 2 new projects took it in the last 4 weeks, 0.4× the 4 weeks before.thin data
Most recently taken up by
- The-Vibe-Company/quivredited, first seen Nov 8, 2026
- memi-design/design-skillsedited, first seen Nov 8, 2026
- Tresnanda/kybernword for word, first seen Nov 8, 2026
- genex-games/genex-desktopedited, first seen Nov 8, 2026
- compozy/compozyword for word, first seen Nov 7, 2026
- iurysza/agent-skillsedited, first seen Nov 1, 2026
Used with
Projects with it also use capture-learning-tools, design-frontend-dev and 7 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.
The-Vibe-CompanySkillcapture-learning-tools
Turn technical conversations, bugs, CI failures, review comments,
Also in 5 projects that use this
The-Vibe-CompanySkilldesign-frontend-dev
Clean Impeccable frontend design skill. Use when the user wants to
Also in 5 projects that use this
studio-lgtmSkillmake-interfaces-feel-better
Apply design engineering best practices to polish UI components - use when reviewing or improving interfaces, animations, typography, or interaction details.
Also in 5 projects that use this
wxyhgkSkillfind-animation-opportunities
Search a codebase or UI for places that don't animate but should, and reject everything that shouldn't. Read-only; it proposes motion with exact values, it does not implement it. Use when the user asks "what could be animated here?" or wants to "make this feel more alive". For fixing existing animations, use improve-animations or review-animations instead.
Also in 4 projects that use this
attentiondotnetSkillanimation-vocabulary
Reverse-lookup glossary that turns a vague description of a web animation or motion effect into its exact term ("the bouncy thing when a popover opens" → Pop in; "the iOS rubber-band scroll" → Rubber-banding). Use when the user asks "what's it called when…", or describes a motion effect without knowing its name and wants the right word to prompt an AI or designer with. For naming an effect, not designing or building one.
Also in 4 projects that use this
jaydubya818Skillthermo-nuclear-code-quality-review
Use when the user requests an intentionally strict maintainability review.
Also in 4 projects that use this
- +3 more from The-Vibe-Company
Other versions39 projects use a version of this.
Word for word · 7
- compozy/compozy★ 2.9k100% same
- Dimon94/dverity★ 107100% same
- Dimon94/skills★ 107100% same
- Tresnanda/kybern★ 83100% same
- arthjean/skills★ 3100% same
- AnasX7/skills★ 1100% same
- arkan/skills★ 1100% same
Edited · 30
- QuivrHQ/quivr★ 40k67% same
- The-Vibe-Company/quivr★ 40k67% same
- trycompai/crm★ 12k21% same
- jakubkrehel/skills★ 12k17% same
- talebook/talebook★ 5.9k26% same
- The-Vibe-Company/claude-code-controller★ 2.4k67% same
- The-Vibe-Company/companion★ 2.4k67% same
- moumen-soliman/uitripled★ 1.4k95% same
- VladSez/easy-invoice-pdf★ 1.1k100% same
- genex-games/genex-desktop★ 81093% same
20 more not listed
Wrote their own version · 2
- transitive-bullshit/skills★ 5same name
- hsynozdamar-byte/claude-skills-edited★ 4same 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 repository19 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- figma-designSkill
- figma-designSkill
- accessibility-reviewSkill
- animateSkill
- better-accessibilitySkill
- better-colorsSkill
- better-layoutSkill
- better-typographySkill
- breakSkill
- create-design-mdSkill
- design-critiqueSkill
- design-handoffSkill
- design-systemSkill
- emil-design-engSkill
- frontend-designSkill
- research-synthesisSkill
- user-researchSkill
- ux-copySkill
The file
We split this skill into the rules it gives an agent
10 rules. 2 are common, 3 are distinctive, and 5 are very specific to this project.
2
Common
Most of the 32 edited versions we read keep these.
3
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 10
When reviewing, slow the interface down.
- Distinctive: line 12
Keep the project's component library, tokens and density, and match its motion language except where a rule below prescribes an exact …
- Very specific: line 14
Every duration, curve, scale and blur below is a specific value, not a range to approximate.
- Common: line 24
When geometric centering looks off, align optically.
- Common: line 32
Use CSS transitions for interactive state changes, because they can be interrupted mid-animation.
- Very specific: line 40
Use a small fixed translateY rather than full height.
- Very specific: line 60
Use initial={false} on AnimatePresence to keep enter animations off the first render.
- Very specific: line 68
Always name the exact properties: transition-property: scale, opacity.
- Very specific: line 72
Only for transform, opacity and filter, which the GPU can composite.
- Distinctive: line 86
Every animated state change also needs a static cue: color, an icon, or a label.
“Common” is measured: kept by at least 6 in 10 of the 32 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
UI polish
Polish comes from a pile of small details that compound. This skill is the reference for which are worth having and what values they take.
When reviewing, slow the interface down. What feels off at 10% speed is what is subtly wrong at full speed.
Keep the project's component library, tokens and density, and match its motion language except where a rule below prescribes an exact interaction.
Every duration, curve, scale and blur below is a specific value, not a range to approximate. cubic-bezier(0.2, 0, 0, 1) is not cubic-bezier(0.4, 0, 0.2, 1), and 0.96 is not 0.95. Use what is written.
Text wrapping, font rendering, tabular numbers and text spacing belong to better-typography. Hit areas, focus, keyboard support, ARIA and reduced motion belong to better-accessibility. Grouping, section spacing, breakpoints and spatial RTL belong to better-layout.
Concentric border radius
Outer radius = inner radius + padding. Mismatched radii on nested elements is the most common thing that makes an interface feel off. Radius, shadow and outline recipes are in surfaces.md.
Optical over geometric alignment
When geometric centering looks off, align optically. Buttons with icons, play triangles and asymmetric icons all need a manual nudge.
Shadows for elevation, borders for structure
Where a border exists only to create depth, prefer layered transparent box-shadow values. Keep borders that communicate structure or state: dividers, separators and selected or focus states.
Interruptible animations
Use CSS transitions for interactive state changes, because they can be interrupted mid-animation. Reserve keyframes for staged sequences that run once.
Split and stagger enter animations
For an infrequent staged entrance where sequence communicates hierarchy, break the content into semantic chunks and stagger them by ~100ms. Animating one container gets you less for the same cost. Leave high-frequency interactions unstaggered. See enter-exit.md.
Subtle exit animations
Use a small fixed translateY rather than full height. Exits should be softer than enters. Use ease-out for both directions.
Contextual icon animations
Animate icons with opacity, scale and blur rather than toggling visibility. Use exactly these values: scale 0.25 to 1, opacity 0 to 1, blur 4px to 0px.
With a motion library (motion or framer-motion in package.json), match that package's import path, or nearby imports where both exist. Use transition: { type: "spring", duration: 0.3, bounce: 0 }. Bounce is always 0.
Without one, keep both icons in the DOM with one absolutely positioned, and cross-fade with cubic-bezier(0.2, 0, 0, 1). That gives you enter and exit with no dependency. Both recipes are in icon-transitions.md.
Image outlines
Give images a 1px outline at low opacity for consistent depth. Pure black in light mode (oklch(0 0 0 / 0.1)), pure white in dark (oklch(1 0 0 / 0.1)). Never a near-black like slate or zinc and never a tinted neutral. A tinted outline picks up the surface underneath and reads as dirt on the image edge.
Scale on press
A scale(0.96) on click gives a button tactile feedback. Always 0.96; anything below 0.95 feels exaggerated. Add a static prop to switch it off where motion would distract. See recipes for CSS, Tailwind and Motion.
Skip animation on page load
Use initial={false} on AnimatePresence to keep enter animations off the first render. Check that it leaves intentional page entrances intact.
Suppress transitions on theme switch
A theme flip changes color, background, border and shadow on nearly every element at once. Every transition on those properties fires together and the switch smears instead of snapping. Inject *,*::before,*::after{transition:none !important}, force a reflow, then remove it on the next frame. See the recipe.
Transition only what changes
Always name the exact properties: transition-property: scale, opacity. Tailwind's transition-transform covers transform, translate, scale, rotate.
Use will-change sparingly
Only for transform, opacity and filter, which the GPU can composite. Never will-change: all. Add it when you see first-frame stutter, not before. See performance.md.
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 and one icon library per surface. Sizing and RTL flipping are in icons.md.
One SVG, recolored per state
Icons use currentColor and take hover, selected and disabled states from CSS color and opacity, never from separate assets. Outline is the default variant; fill marks the active state.
Motion restraint
Give high-frequency interactions instant feedback, or a transition of 150ms or less on opacity and color. A custom animation there charges its attention cost on every trigger.
Every animated state change also needs a static cue: color, an icon, or a label. Motion is never the only feedback channel.
Before you finish
| Mistake | Fix |
| Icons look off-center | Nudge optically with padding, or fix the SVG |
| Jarring staged entrance or exit | Stagger infrequent entrances; keep exits subtle |
| Theme toggle crossfades the whole page | Disable transitions for the swap, force a reflow, restore on the next frame |
transition: all on elements | Specify exact properties |
| First-frame animation stutter | Add will-change: transform (sparingly) |
| Hairline icon beside bold text | Match the stroke width to the text weight |
Reporting
Severity. HIGH breaks an interaction, makes motion unusable, or leaves a state change visible only while the animation runs. MEDIUM is a visible inconsistency in surfaces, icons, or motion. LOW is isolated polish.
Verification. Without a browser: every state the component defines, meaning hover, focus, active, loading and empty, plus motion durations and easings read from the code. With one: walk each state, and replay motion at 10% speed in the browser's Animations panel. Report every check you could not run as Not verified.
Format. Group findings under the principle each violates, ordered by severity, one row per root cause listing every location it appears in:
| Severity | Location | Before | After | Why |
Location is path/to/file:line. Why names the principle and the user impact.
End with Block when any HIGH remains, Approve otherwise, leaving the rest in the table as work to do. Never Approve coverage you did not inspect. With nothing to report, state "No actionable UI-polish findings" and report verification.
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.

