Interaction Design
Design skill, available on Zeplik
Interaction Design is a ready-to-run design skill on Zeplik. Not for overall visual aesthetics (use frontend-design) or UI audits (use ui-ux-pro-max). Ask in plain language and Zeplik applies the skill's method for you inside the conversation, on whichever AI model you prefer.
The Interaction Design skill loads automatically when your request matches it, or you can invoke it directly by typing /interaction-design in any chat. It works with attachments, connectors, and any model that supports the task, so you get the same expert method every time without setting anything up.
What the Interaction Design skill can do
- Design purposeful microinteractions with feedback and easing curves
- Build loading states, skeleton screens, and progress indicators
- Create smooth state transitions like toggles, modals, and page changes
- Implement gesture interactions like swipe to dismiss and drag and drop
Try these prompts on Zeplik
Pick a prompt to open it in the Zeplik app. If you are not signed in yet, your prompt is waiting for you the moment you do.
How the Interaction Design skill works
/interaction-design
Create engaging, intuitive interactions through motion, feedback, and thoughtful state transitions that enhance usability and delight users. This skill is about how the UI behaves and responds; for the overall look (layout, typography, color) use frontend-design.
When to Use
- 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
| Duration | Use Case |
|---|---|
| 100-150ms | Micro-feedback (hovers, clicks) |
| 200-300ms | Small transitions (toggles, dropdowns) |
| 300-500ms | Medium 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
- Performance first: Use
transformandopacityfor smooth 60fps - Reduce motion support: Always respect
prefers-reduced-motion - Consistent timing: Use a timing scale across the app
- Natural physics: Prefer spring animations over linear
- Interruptible: Allow users to cancel long animations
- Progressive enhancement: Work without JS animations
- 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-changesparingly for optimization
Deeper References
references/microinteraction-patterns.md-- catalog of microinteraction recipesreferences/animation-libraries.md-- library selection and usage (Framer Motion, GSAP, etc.)references/scroll-animations.md-- scroll-triggered and scroll-driven animation patterns
Usage
/interaction-design $ARGUMENTS
How to use the Interaction Design skill
Sign in to Zeplik
Create a free Zeplik account or sign in. New accounts start with free credits, so you can try the Interaction Design skill right away.
Describe your design task
Ask in plain language, or type /interaction-design to invoke the skill directly. Zeplik recognizes the Interaction Design skill and applies its method.
Review and refine the result
Zeplik returns a clear, structured answer. Ask follow-ups in the same chat to refine it or take the next step.
Source and credit
- Author
- wshobson
- License
- MIT
Adapted from the open-source wshobson/agents project and tuned to run natively on Zeplik. View source on GitHub.
Frequently asked questions
- What is the Interaction Design skill?
- Interaction Design is a ready-to-run design skill on Zeplik. Not for overall visual aesthetics (use frontend-design) or UI audits (use ui-ux-pro-max). Ask in plain language and Zeplik applies the skill's method for you inside the conversation, on whichever AI model you prefer.
- How do I use Interaction Design on Zeplik?
- Sign in to Zeplik and ask in plain language, or type /interaction-design in any chat to invoke it directly. The skill applies its method and returns a result you can refine in the same conversation.
- Which AI model does the Interaction Design skill use?
- Any model you choose. Zeplik works across every model in one chat, so the Interaction Design skill runs on your preferred model for the task.
- Where does the Interaction Design skill come from?
- The Interaction Design skill is adapted from the open-source wshobson/agents project (MIT) and tuned to run natively on Zeplik. The original source is linked on this page.
- How much does the Interaction Design skill cost?
- Using the skill is free to start. You only spend Zeplik credits when the assistant runs, and new accounts begin with free credits.
Related design skills
- Accessibility ReviewUse when the user asks to audit a design or page for accessibility — "check a11y", "is this accessible?", "run a WCAG audit" — covering color contrast, keyboard navigation, focus order, touch target size, and screen reader behavior against WCAG 2.1 AA before handoff.
- Brand Guidelines BuilderUse when the user wants Anthropic's official brand look-and-feel applied to an artifact — brand colors, typography, visual formatting, company design standards. Trigger: "use Anthropic branding", "apply our brand style". Visual identity only; not for brand voice or tone in writing (use brand-voice-enforcement).
- Brand Landing PageRuns a brand interview with no established visual direction, then generates deployment-ready landing-page HTML. Not for dashboards or app UI (use frontend-design).
- Design CritiqueUse when the user shares a design, mockup, screenshot, or Figma link and asks for feedback — "review this design", "critique this mockup", "what do you think of this screen?". Gives structured feedback on usability, hierarchy, and consistency. Not for a WCAG audit (use accessibility-review).
- Design Delivery NavigatorUse to chain UI delivery across skills -- research, design, systemize, accessibility, handoff. Not for a single critique (use design-critique).
- Design Handoff PackageUse when a design is ready for engineering and the user wants a developer handoff spec — layout, design tokens, component props, interaction states, responsive breakpoints, edge cases, animation details. Trigger: "write the handoff spec", "prep this design for devs", "spec this screen out".
More on Zeplik
Try Interaction Design on Zeplik
Every model, one chat. Bring the Interaction Design skill into your next conversation and let the assistant do the work.