New to Claude Skills? Learn how to install them →

jakubkrehel on GitHub

Better UI

Free

Enhance your UI designs with polished details.

by jakubkrehel3.3k stars on jakubkrehel/skills
7 views
Updated Aug 6, 2026
Get this skill

Free · Opens the source repo

What Better UI does

Creating a polished user interface involves a multitude of small details that collectively enhance the user experience. The Better UI skill provides a set of design engineering principles focused on refining these details, making it an essential tool for developers and designers alike. This skill is particularly useful when building or reviewing UI components, as it emphasizes the importance of motion, visual hierarchy, and subtle design elements that contribute to a more engaging interface.

When utilizing this skill, developers are encouraged to slow down the interface animations to identify what feels off during user interactions. By replaying animations at a reduced speed, it becomes easier to spot inconsistencies and areas for improvement. The skill also stresses the importance of adhering to established design systems, ensuring that any enhancements align with the existing component library and motion language of the project.

Better UI covers a range of design aspects, including surface treatment, animations, icon usage, and performance considerations. It provides specific guidelines for achieving optimal border radii, aligning elements visually rather than geometrically, and implementing animations that enhance user interactions without overwhelming them. Additionally, the skill offers insights into icon design, ensuring that icons maintain visual consistency with text and adapt to different states effectively.

Overall, Better UI is designed for those who want to elevate their UI design work by focusing on the finer details that contribute to a cohesive and polished user experience. Whether you are a developer implementing UI components or a designer reviewing frontend code, this skill will help you create interfaces that feel intuitive and visually appealing.

When to use it

Use this skill when building or reviewing UI components to ensure that every detail contributes positively to the user experience.

When not to use it

This skill is not suitable for addressing broader design topics like typography or accessibility, which are covered by other specialized skills.

What you can build with it

Reviewing UI Components

Utilize the Better UI skill to assess existing UI components, ensuring they adhere to principles of optical alignment and motion.

Implementing Animations

Apply the skill's guidelines for creating smooth, interruptible animations that enhance user engagement without being distracting.

Designing Icons

Use the principles for icon design to ensure visual consistency and responsiveness across different states in your UI.

How to install Better UI

View source

1. Install with the skills CLI

npx skills add jakubkrehel/skills/better-ui --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by jakubkrehel

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.

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.

Preserve the project's component library, tokens, and density. Match its established motion language except where a principle below prescribes an exact interaction pattern.

Typography (text wrapping, font rendering, tabular numbers, spacing) is covered by the better-typography skill; use that for anything text-related. Accessibility (hit areas, focus states, keyboard support, ARIA, reduced motion) is covered by the better-accessibility skill. Layout structure (grouping, spacing between sections, breakpoints, spatial RTL) is covered by the better-layout skill.

Quick Reference

CategoryWhen to Use
SurfacesBorder radius, optical alignment, shadows, image outlines
AnimationsInterruptible animations, enter/exit transitions, icon animations, scale on press, motion restraint
IconsIcon stroke weight, states via currentColor, outline vs fill, sizing, RTL flipping
PerformanceTransition 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. 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.

9. 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.

10. 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.

11. Never Use transition: all

Always specify exact properties: transition-property: scale, opacity. Tailwind's transition-transform covers transform, translate, scale, rotate.

12. Use will-change Sparingly

Only for transform, opacity, filter, the properties the GPU can composite. Never use will-change: all. Only add when you notice first-frame stutter.

13. 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.

14. 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.

15. 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 (color, icon, label).

Common Mistakes

MistakeFix
Same border radius on closely nested parent and childCalculate outerRadius = innerRadius + padding
Icons look off-centerAdjust optically with padding or fix SVG directly
Border used only to fake elevationUse layered box-shadow with transparency; keep structural and state borders
Jarring staged entrance or contextual exitStagger infrequent entrances and keep context-preserving exits subtle
Stateful icon or toggle animates its default state on page loadAdd initial={false} to that AnimatePresence; preserve intentional page entrances
transition: all on elementsSpecify exact properties
First-frame animation stutterAdd will-change: transform (sparingly)
Hairline icon beside bold textMatch the stroke width to the text weight
Separate icon assets per stateOne currentColor SVG, states via CSS
Filled icons everywhereOutline as default, fill only for the active state
Entrance animation on every hover or keystrokeInstant feedback or ≤150ms opacity/color transition

Review Output Format

Use this format only when the user asks for a standalone UI-polish review. When better-interface orchestrates the review, provide domain evidence and findings to that skill and let its output format, severity scale, consolidation rules, cap, and verdict take precedence.

Present the standalone review in two parts.

Findings

Group all confirmed findings by principle. Use a markdown table with Severity, Location, Before, After, and Why columns. Never use separate "Before:" / "After:" lines.

  • Severity: HIGH makes an interaction misleading, unresponsive, or repeatedly disruptive; MEDIUM creates a noticeable craft or consistency problem; LOW is isolated polish.
  • 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 how it affects the interface.

Consolidate a repeated systemic issue into one row and list every affected location. Omit principles with no findings.

Example

Concentric border radius

SeverityLocationBeforeAfterWhy
LOWsrc/Card.tsx:28rounded-xl on card + rounded-xl on inner button (p-2)rounded-2xl on card (8 + 8 = 16), rounded-lg on inner buttonNested corners should be concentric
LOWsrc/card.css:11border-radius: 16px on both nested surfacesOuter 24px, inner 16px with 8px paddingEqual nested radii make the inner surface look pinched

Scale on press

SeverityLocationBeforeAfterWhy
LOWsrc/Button.tsx:19<button className="...">Add active:scale-[0.96] transition-transformPress feedback makes the control feel responsive
MEDIUMsrc/button.css:24scale(0.9) on pressRaise to scale(0.96)Anything below 0.95 feels exaggerated

Verification and Verdict

After the findings:

  1. Verification: list the exact checks 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, state what still needs verification.
  2. Verdict: Block if any HIGH finding remains, Needs changes if only MEDIUM or LOW findings remain, and Approve only when no actionable findings remain.

When there are no findings, omit the tables, state "No actionable UI-polish findings", report verification, and end with Approve.

Frequently asked questions about Better UI

Similar skills