Skip to main content
skill CX Codex

micro-interactions · dembrandt — Claude Code skill: UI animation patterns

A skill for small purposeful animations: toggles, animated icons, success moments. Useful when an interface gives no feedback.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add dembrandt/dembrandt-skills --skill micro-interactions -a claude-code
Open on GitHub

What micro-interactions does

The skill covers short UI animations: a checkmark that draws itself, a heart that pulses on like, a toggle that eases into place with a slight overshoot, confetti when a goal is completed. These moments run 200–600ms. The reference point is the natural world — nothing snaps instantly, everything has weight and a settling phase.

Inside are patterns with ready CSS: checkmark draw-on via stroke-dashoffset, icon pulse, hamburger-to-close morph, bell shake, a springy toggle on cubic-bezier(0.34, 1.56, 0.64, 1), accordion reveal through max-height, and a fade from skeleton to loaded content. There is a stability rule for buttons: hover, focus and press must not change outer dimensions or layout position. Feedback comes from colour, inner shadows, or movement of inner elements such as an arrow shifting a couple of pixels.

A section on change blindness tells you to guide the eye when something updates away from the user's focus — a notification badge that briefly scales up, a row background that fades from a brand tint to transparent, a small 2–4px shake. The skill activates on components/**, src/components/**, **/*.css, **/*.scss, **/*.tsx, **/*.jsx and design-system/**.

What it helps with

  • make a toggle feel like a physical switch
  • draw a checkmark when a form submits
  • pulse an icon on like
  • highlight a list update the user missed
  • replace a content flash with a fade from the skeleton

Example prompts for the agent

  • make this toggle feel more satisfying
  • add a small animation when the form is submitted
  • animate the checkmark on success

How to install micro-interactions

1Skills CLI (Vercel)

npx skills add dembrandt/dembrandt-skills --skill micro-interactions -a claude-code

2Manually: put the files in place

~/.claude/skills/micro-interactions/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/micro-interactions/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about micro-interactions

How do I install micro-interactions in Claude?

Run npx skills add dembrandt/dembrandt-skills --skill micro-interactions -a claude-code. The skill lands at ~/.claude/skills/micro-interactions/SKILL.md.

What does micro-interactions do?

It describes patterns for small animations: toggles, animated icons, success moments, content reveals. Each pattern ships with CSS.

When does the skill kick in?

It is tied to components/**, src/components/**, **/*.css, **/*.scss, **/*.tsx, **/*.jsx and design-system/**, so it triggers while you edit components and styles.

Source text

SKILL.md · MIT
---
name: micro-interactions
description: Small purposeful animations — toggles, animated icons, success moments. Use when designing interactive feedback, success states or loaders.
metadata:
  priority: 6
  pathPatterns:
    - "components/**"
    - "src/components/**"
    - "**/*.css"
    - "**/*.scss"
    - "**/*.tsx"
    - "**/*.jsx"
    - "design-system/**"
  promptSignals:
    phrases:
      - "micro-interaction"
      - "micro interaction"
      - "animated icon"
      - "delight"
      - "satisfying"
      - "toggle animation"
      - "celebrate"
      - "reward"
      - "lottie"
      - "tiny animation"
retrieval:
  aliases:
    - micro-interactions
    - delight
    - animated icons
    - satisfying UI
    - toggle animation
    - success animation
  intents:
    - add a micro-interaction
    - make this feel more satisfying
    - animate this icon
    - celebrate a user action
    - add delight to this component
  examples:
    - make this toggle feel more satisfying
    - add a small animation when the form is submitted
    - animate the checkmark on success
    - make this button feel alive
---

# Micro-Interactions

A micro-interaction is a moment. A checkbox that draws its checkmark. A heart that pulses when liked. A toggle that eases into place with a little overshoot. A confetti burst on completing a goal. These moments are small in duration — 200–600ms — but they communicate that the product was made by people who cared.

The reference is always the natural world. Nothing in nature snaps instantly. Everything has weight, momentum, and a moment of settling.

---

## What Makes a Good Micro-Interaction

A micro-interaction earns its place when it:

1. **Confirms an action** — makes the result of a click, tap, or input unmistakably clear
2. **Rewards a milestone** — celebrates something the user worked toward
3. **Reveals something** — unfolds information in a way that aids understanding
4. **Adds texture** — makes an otherwise flat moment feel physical and real

It fails when it:
- Delays the user (animation blocks the next action)
- Repeats too often (becomes noise, not signal)
- Exists only for decoration (no information is conveyed)

---

## Natural World as Reference

Physical objects have inertia, springiness, and weight. UI that borrows these properties feels intuitive because it matches expectations built over a lifetime.

| Natural behaviour | UI equivalent |
|---|---|
| A door swinging to rest | Toggle that overshoots slightly before settling |
| Water dripping | Staggered list item reveals |
| A rubber band snapping back | Pull-to-refresh bounce |
| A leaf falling | Gentle fade + drift downward on dismiss |
| A bell ringing | Icon that briefly oscillates (shakes) on trigger |
| A stamp pressing paper | Inner element shift (e.g. icon nudge) without shifting button bounds |

The motion should feel *inevitable* — as if the element has physical properties and cannot behave any other way.

---

## Patterns

### Animated Icons

Icons that animate on trigger communicate state change more vividly than a static swap.

**Checkmark draw-on:** A checkmark that draws itself from start to end point on completion.
```css
@keyframes check-draw {
  from { stroke-dashoffset: 20; }
  to   { stroke-dashoffset: 0; }
}
.checkmark path {
  stroke-dasharray: 20;
  animation: check-draw 300ms ease-out forwards;
}
```

**Heart pulse on like:** Scale up slightly then settle back.
```css
@keyframes heart-pulse {
  0%   { transform: scale(1); }
  40%  { transform: scale(1.25); }
  100% { transform: scale(1); }
}
```

**Hamburger → close morphing:** Lines animate to form an × when a menu opens.

**Bell shake on notification:** A brief oscillating rotation.

**Loading spinner:** Rotate with easing rather than linear — a spring rotation feels alive; linear feels mechanical.

### Toggle / Switch

A toggle should feel like a physical switch, not a state change.

```css
.toggle-thumb {
  transition: transform 200ms cubic-bezier(0.34, 1.56, 0.64, 1);
  /* cubic-bezier with overshoot — the thumb slides and bounces slightly */
}
.toggle:checked .toggle-thumb {
  transform: translateX(20px);
}
```

The cubic-bezier `(0.34, 1.56, 0.64, 1)` produces a spring effect — the thumb overshoots and settles. This is the difference between a switch that feels cheap and one that feels premium.

### Success / Completion

Mark moments of genuine completion — a form submitted, an onboarding step finished, a goal reached.

- **Checkmark animation** that draws on
- **Subtle confetti** for high-value milestones (first purchase, account created, goal achieved) — use sparingly, never for routine actions
- **Green fill transition** on a progress bar completing
- **Number count-up** when a stat reaches its final value

### Reveal and Disclosure

Accordions, tooltips, and popovers that open via a small reveal feel more considered than appearing instantly.

```css
.accordion-content {
  overflow: hidden;
  max-height: 0;
  transition: max-height 250ms ease-out;
}
.accordion-content.open {
  max-height: 500px; /* generous upper bound */
}
```

Content that slides down as if gravity is pulling it into place feels natural. Content that blinks into existence does not.

### Button Interaction Feedback (Stability Rule)

Buttons must never change their outer dimensions or shift their position in the layout when hovered, focused, or clicked.

```css
.btn {
  transition: background-color 150ms ease-out, box-shadow 150ms ease-out;
}
.btn:hover {
  background-color: var(--color-brand-600); /* subtle shift in hue or brightness */
}
.btn:active {
  background-color: var(--color-brand-700); /* deeper contrast on press */
  box-shadow: inset 0 2px 4px rgba(0,0,0,0.1); /* inner shadow suggests depth without scaling */
}
```

The button remains rock-solid in the layout. Feedback is conveyed through colour, internal shadows, or subtle micro-animations of *inner* elements (like an arrow moving 2px to the right) that do not affect the button's footprint.

### Skeleton → Content Transition

When content loads, do not flash it in. Fade it over the skeleton at 150–200ms. The skeleton dissolves, the content arrives.

```css
.content-loaded {
  animation: fade-in 150ms ease-out;
}
@keyframes fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}
```

### Attracting Attention to Remote Changes

Users often miss updates that occur far away from their current focus or click area (change blindness). If an area changes that the user is not currently looking at—such as a notification in a distant corner—use a subtle animation to guide their eye.

- **Notification Badge Bloom:** When a new notification arrives, briefly scale the badge up (1.2) and settle back to 1.0.
- **Background Highlight Fade:** If a list item updates or a new row is added, highlight its background with a subtle brand tint and fade it to transparent over 1–2 seconds.
- **Subtle Shake:** A very small horizontal shake (2–4px) can draw attention to a sidebar or toolbar item without being aggressive.

**Rule:** The animation should be non-looping. Once the eye is caught, the motion must stop to avoid becoming a permanent distraction.

---

## The Sacred Rule of Component Stability

Interactive elements — especially buttons — must be layout-stable.

- **No Scaling:** Never use `transform: scale()` on hover or click for buttons. It causes visual vibrating and can feel "squishy" rather than premium.
- **No Shifting:** Never use `translate` or margins that change the element's position relative to its neighbors.
- **Why:** Layout stability creates a sense of professional engineering and "sturdiness." If the UI moves under the user's cursor, it feels unpredictable.

---

## How to Declare the Motion

**Transitions for state, keyframes for sequences.** A CSS transition can be interrupted: move the cursor away mid-hover and the element turns around from where it is. A keyframe animation cannot — it plays to the end, then snaps. Every hover, focus, active and selected state is a transition. Reserve `@keyframes` for a staged entrance or a loop that runs on its own.

**Name the properties.** `transition: all` animates whatever happens to change, including layout properties that force the browser to re-lay-out the page every frame — and it is how a component starts sliding when an unrelated class lands on it.

```css
/* the element decides what moves */
transition-property: opacity, scale;
transition-duration: 200ms;
transition-timing-function: cubic-bezier(0.2, 0, 0, 1);
```

**`will-change` is a last resort.** Add it only when you have seen the first frame stutter, only on `transform`, `opacity` or `filter`, and remove it when the animation ends. It reserves a compositor layer; applied broadly it costs more memory than it saves time.

---

## Restraint

Micro-interactions are seasoning, not the meal.

- **Once per trigger** — a checkmark animates once on save, not on every render
- **Skip on repeat actions** — a bulk delete of 50 items should not animate 50 times
- **No blocking animations** — the user must be able to continue immediately; the animation runs alongside, not instead of, the result
- **Respect `prefers-reduced-motion`** — always

```css
@media (prefers-reduced-motion: reduce) {
  * { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}
```

**Ask for each interaction:** does this make the result clearer, or just more visually busy? If the answer is the latter, remove it.

---

## Review Checklist

- [ ] **Sacred Rule:** Do buttons and interactive elements remain perfectly stable (no size change, no shifting) during hover and click?
- [ ] Does each micro-interaction confirm an action, reward a milestone, or aid understanding?
- [ ] Is the duration 200–600ms — not instant, not slow enough to feel like waiting?
- [ ] Does motion reference natural physics (spring, ease-out, overshoot) rather than linear timing?
- [ ] Is the animation non-blocking — the user can continue immediately?
- [ ] Is `prefers-reduced-motion` respected?
- [ ] Are high-effort celebrations (confetti, bloom effects) reserved for genuine milestones?
- [ ] Do animated icons clearly communicate the state change they represent?
- [ ] Does the toggle/switch use a spring easing curve, not linear?
- [ ] Are remote changes (outside focal area) highlighted with a brief, non-looping animation to guide the eye?

© dembrandt · MIT · dembrandt/dembrandt-skills

Similar skills

Everything for Frontend and UI →

micro-interactions by other authors comes first.

From the same set34

button-states A skill that defines six states for interactive elements and derives hover and active colours from the base colour in HSL. Useful when buttons in a project look unfinished. CX Codex +1 877installs component-family-consistency Keeps buttons, inputs, badges and pills on the same radius, colour logic, shadow, border and spacing. Useful when building or reviewing a component library. CX Codex +1 874installs loading-states-and-perceived-performance A coding-agent skill that picks the right spinner, skeleton or progress bar and makes a slow interface feel faster. CX Codex +1 871installs generate-ui-from-brand Turns a site URL or a DESIGN.md file into design tokens, UX decisions and a UI spec you can paste into a project. CX Codex +1 870installs status-colors-and-errors A skill that sets rules for semantic status colours and error copy: how many colours to keep, what each one means, and how to write a message with a way forward. CX Codex +1 859installs elevation-and-depth Defines rules for shadows, border radius, and surface layering in CSS. Helps the agent style cards, modals, dropdowns, and tooltips with physical depth. CX Codex +1 854installs sticky-and-fixed-elements Decides what stays on screen while the user scrolls: sticky headers, bottom toolbars, floating action buttons, pinned table headers. CX Codex +1 855installs data-display-and-selection Guides the agent through data collections: view modes, row selection, mass actions, sorting, filters and search patterns. CX Codex +1 855installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor