Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
wshobson avatar

Interaction Design

  • 11.8k installs
  • 38.5k repo stars
  • Updated July 22, 2026
  • wshobson/agents

How to design and implement purposeful motion, feedback patterns, and state transitions that enhance UI usability and delight users.

About

This skill teaches developers how to design and build engaging user interactions through motion, feedback patterns, and thoughtful state transitions. It covers microinteractions (button hovers, clicks), loading states (skeleton screens, progress bars), page transitions, gesture-based interactions (swipe-to-dismiss), and notification systems. Developers use it when adding polish to UI, improving perceived performance, or creating delightful experiences. Key workflows include timing guidelines (100-150ms for micro-feedback, 300-500ms for modals), easing functions (ease-out for entering, ease-in for exiting), and accessibility patterns (respecting prefers-reduced-motion). The skill emphasizes performance optimization using transform and opacity, spring-based physics, and interruptible animations.

  • Timing guidelines for different interaction types: 100-150ms micro-feedback, 200-300ms small transitions, 300-500ms moda
  • Easing functions and spring-based animations using cubic-bezier curves and Framer Motion
  • Loading state patterns: skeleton screens, progress indicators, and animation pulse effects
  • Accessibility: prefers-reduced-motion media query support and reduced animation fallbacks
  • Performance optimization: use transform and opacity for 60fps, avoid animating width/height/top/left

Interaction Design by the numbers

  • 11,849 all-time installs (skills.sh)
  • +268 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Ranked #57 of 1,880 Design & UI/UX skills by installs in the Skillselion catalog
  • Security screen: LOW risk (skills.sh audit)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
At a glance

interaction-design capabilities & compatibility

Capabilities
design microinteractions and button feedback · implement smooth page and component transitions · create loading states and skeleton screens · build gesture based interactions (swipe, drag) · generate easing curves and spring physics · ensure motion accessibility compliance
Works with
figma
Use cases
ui design · frontend
Platforms
macOS · Windows · Linux
Runs
Runs locally
Pricing
Free
npx skills add https://github.com/wshobson/agents --skill interaction-design

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs11.8k
repo stars38.5k
Security audit3 / 3 scanners passed
Last updatedJuly 22, 2026
Repositorywshobson/agents

What it does

Implement microinteractions, motion design, and state transitions to enhance UI polish and user feedback.

Who is it for?

Adding polish to interactive UI elements, improving feedback clarity, creating gesture-based flows, implementing accessible animations.

Skip if: Static page layouts, backend animation logic, real-time graphics rendering, non-interactive content.

When should I use this skill?

Building buttons with hover/tap states, designing loading experiences, implementing page transitions, creating swipe-to-dismiss or drag-drop interfaces.

What you get

Developers can build smooth 60fps microinteractions, loading states, gestures, and page transitions that respect motion preferences and improve perceived performance.

  • Microinteraction components (buttons, toggles)
  • Loading state patterns
  • Page transition wrappers

By the numbers

  • 8 interaction pattern categories covered: microinteractions, loading states, state transitions, page transitions, feedba
  • 3 easing function types provided: ease-out (entering), ease-in (exiting), ease-in-out (moving between)
  • 5 timing duration ranges defined from 100ms to 500ms+

Files

SKILL.mdMarkdownGitHub ↗

Interaction Design

Create engaging, intuitive interactions through motion, feedback, and thoughtful state transitions that enhance usability and delight users.

When to Use This Skill

  • Adding microinteractions to enhance user feedback
  • Implementing smooth page and component transitions
  • Designing loading states and skeleton screens
  • Creating gesture-based interactions
  • Building notification and toast systems
  • Implementing drag-and-drop interfaces
  • Adding scroll-triggered animations
  • Designing hover and focus states

Core Principles

1. Purposeful Motion

Motion should communicate, not decorate:

  • Feedback: Confirm user actions occurred
  • Orientation: Show where elements come from/go to
  • Focus: Direct attention to important changes
  • Continuity: Maintain context during transitions

2. Timing Guidelines

DurationUse Case
100-150msMicro-feedback (hovers, clicks)
200-300msSmall transitions (toggles, dropdowns)
300-500msMedium transitions (modals, page changes)
500ms+Complex choreographed animations

3. Easing Functions

/* Common easings */
--ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* Decelerate - entering */
--ease-in: cubic-bezier(0.55, 0, 1, 0.45); /* Accelerate - exiting */
--ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); /* Both - moving between */
--spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* Overshoot - playful */

Quick Start: Button Microinteraction

import { motion } from "framer-motion";

export function InteractiveButton({ children, onClick }) {
  return (
    <motion.button
      onClick={onClick}
      whileHover={{ scale: 1.02 }}
      whileTap={{ scale: 0.98 }}
      transition={{ type: "spring", stiffness: 400, damping: 17 }}
      className="px-4 py-2 bg-blue-600 text-white rounded-lg"
    >
      {children}
    </motion.button>
  );
}

Interaction Patterns

1. Loading States

Skeleton Screens: Preserve layout while loading

function CardSkeleton() {
  return (
    <div className="animate-pulse">
      <div className="h-48 bg-gray-200 rounded-lg" />
      <div className="mt-4 h-4 bg-gray-200 rounded w-3/4" />
      <div className="mt-2 h-4 bg-gray-200 rounded w-1/2" />
    </div>
  );
}

Progress Indicators: Show determinate progress

function ProgressBar({ progress }: { progress: number }) {
  return (
    <div className="h-2 bg-gray-200 rounded-full overflow-hidden">
      <motion.div
        className="h-full bg-blue-600"
        initial={{ width: 0 }}
        animate={{ width: `${progress}%` }}
        transition={{ ease: "easeOut" }}
      />
    </div>
  );
}

2. State Transitions

Toggle with smooth transition:

function Toggle({ checked, onChange }) {
  return (
    <button
      role="switch"
      aria-checked={checked}
      onClick={() => onChange(!checked)}
      className={`
        relative w-12 h-6 rounded-full transition-colors duration-200
        ${checked ? "bg-blue-600" : "bg-gray-300"}
      `}
    >
      <motion.span
        className="absolute top-1 left-1 w-4 h-4 bg-white rounded-full shadow"
        animate={{ x: checked ? 24 : 0 }}
        transition={{ type: "spring", stiffness: 500, damping: 30 }}
      />
    </button>
  );
}

3. Page Transitions

Framer Motion layout animations:

import { AnimatePresence, motion } from "framer-motion";

function PageTransition({ children, key }) {
  return (
    <AnimatePresence mode="wait">
      <motion.div
        key={key}
        initial={{ opacity: 0, y: 20 }}
        animate={{ opacity: 1, y: 0 }}
        exit={{ opacity: 0, y: -20 }}
        transition={{ duration: 0.3 }}
      >
        {children}
      </motion.div>
    </AnimatePresence>
  );
}

4. Feedback Patterns

Ripple effect on click:

function RippleButton({ children, onClick }) {
  const [ripples, setRipples] = useState([]);

  const handleClick = (e) => {
    const rect = e.currentTarget.getBoundingClientRect();
    const ripple = {
      x: e.clientX - rect.left,
      y: e.clientY - rect.top,
      id: Date.now(),
    };
    setRipples((prev) => [...prev, ripple]);
    setTimeout(() => {
      setRipples((prev) => prev.filter((r) => r.id !== ripple.id));
    }, 600);
    onClick?.(e);
  };

  return (
    <button onClick={handleClick} className="relative overflow-hidden">
      {children}
      {ripples.map((ripple) => (
        <span
          key={ripple.id}
          className="absolute bg-white/30 rounded-full animate-ripple"
          style={{ left: ripple.x, top: ripple.y }}
        />
      ))}
    </button>
  );
}

5. Gesture Interactions

Swipe to dismiss:

function SwipeCard({ children, onDismiss }) {
  return (
    <motion.div
      drag="x"
      dragConstraints={{ left: 0, right: 0 }}
      onDragEnd={(_, info) => {
        if (Math.abs(info.offset.x) > 100) {
          onDismiss();
        }
      }}
      className="cursor-grab active:cursor-grabbing"
    >
      {children}
    </motion.div>
  );
}

CSS Animation Patterns

Keyframe Animations

@keyframes fadeIn {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

@keyframes pulse {
  0%,
  100% {
    opacity: 1;
  }
  50% {
    opacity: 0.5;
  }
}

@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

.animate-fadeIn {
  animation: fadeIn 0.3s ease-out;
}
.animate-pulse {
  animation: pulse 2s ease-in-out infinite;
}
.animate-spin {
  animation: spin 1s linear infinite;
}

CSS Transitions

.card {
  transition:
    transform 0.2s ease-out,
    box-shadow 0.2s ease-out;
}

.card:hover {
  transform: translateY(-4px);
  box-shadow: 0 12px 24px rgba(0, 0, 0, 0.1);
}

Accessibility Considerations

/* Respect user motion preferences */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}
function AnimatedComponent() {
  const prefersReducedMotion = window.matchMedia(
    "(prefers-reduced-motion: reduce)",
  ).matches;

  return (
    <motion.div
      animate={{ opacity: 1 }}
      transition={{ duration: prefersReducedMotion ? 0 : 0.3 }}
    />
  );
}

Best Practices

1. Performance First: Use transform and opacity for smooth 60fps 2. Reduce Motion Support: Always respect prefers-reduced-motion 3. Consistent Timing: Use a timing scale across the app 4. Natural Physics: Prefer spring animations over linear 5. Interruptible: Allow users to cancel long animations 6. Progressive Enhancement: Work without JS animations 7. Test on Devices: Performance varies significantly

Common Issues

  • Janky Animations: Avoid animating width, height, top, left
  • Over-animation: Too much motion causes fatigue
  • Blocking Interactions: Never prevent user input during animations
  • Memory Leaks: Clean up animation listeners on unmount
  • Flash of Content: Use will-change sparingly for optimization

Related skills

Forks & variants (1)

Interaction Design has 1 known copy in the catalog totaling 2 installs. They canonicalize to this original listing.

How it compares

Choose interaction-design over static layout skills when the task is motion, feedback, and state transitions rather than wireframes or color systems.

FAQ

What properties should I animate for smooth performance?

Use only transform and opacity for 60fps animations. Avoid animating width, height, top, left as they trigger layout recalculations.

What are the standard timing durations for different interactions?

100-150ms for micro-feedback (hovers/clicks), 200-300ms for small transitions (toggles/dropdowns), 300-500ms for medium transitions (modals/page changes), 500ms+ for complex choreographed animations.

How do I respect user motion preferences?

Use the prefers-reduced-motion media query to set animation-duration: 0.01ms and transition-duration: 0.01ms for users who prefer reduced motion.

Is Interaction Design safe to install?

skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.