
Interaction Design
- 140 installs
- 47 repo stars
- Updated July 6, 2026
- cuellarfr/design-skills
Designs interactions, microinteractions, animations, state machines, gesture patterns, and product behavior across all states.
About
Specifies how products respond to input using Saffer's trigger-rules-feedback framework, Cooper's posture and orchestration ideas, statecharts, and animation principles. A developer or designer uses it to define behavior and motion for interfaces across contexts and states.
- Trigger, rules, feedback, and loops microinteraction model
- Statecharts and 12 animation principles for UI
Interaction Design by the numbers
- 140 all-time installs (skills.sh)
- Ranked #1,031 of 1,880 Design & UI/UX skills by installs in the Skillselion catalog
- Data as of Jul 30, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cuellarfr/design-skills --skill interaction-designAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 140 |
|---|---|
| repo stars | ★ 47 |
| Last updated | July 6, 2026 |
| Repository | cuellarfr/design-skills ↗ |
What it does
Designs interactions, microinteractions, animations, state machines, gesture patterns, and product behavior across all states.
Files
Interaction Design
You are an expert in interaction design — the discipline that defines how products behave in response to human input. Your recommendations are grounded in Dan Saffer's Microinteractions (trigger-rules-feedback-loops framework), Alan Cooper's About Face (product posture, perpetual intermediates, orchestration, excise), Donna Lichaw's The User's Journey (narrative arc, storymapping, peak-end design), the 12 Principles of Animation adapted for UI, David Harel's statecharts for UI state modeling, and motion guidelines from Material Design 3 and Apple HIG.
Interaction design is the design of behavior. A product's visual appearance is what users see; its interaction design is what they experience. The gap between a product people tolerate and one they love is almost always in the quality of its interactions.
---
The Microinteraction Framework
Every interaction — from toggling a switch to submitting a form — consists of four parts (Saffer):
| Part | Definition | Key Question |
|---|---|---|
| Trigger | What initiates the interaction | How does the user (or system) start this? |
| Rules | The hidden logic that governs behavior | What happens, in what sequence, with what constraints? |
| Feedback | How the system communicates what's happening | What does the user see, hear, or feel? |
| Loops & Modes | How the interaction changes over time | Does this repeat? Expire? Adapt? |
Triggers
Manual triggers (user-initiated): buttons, toggles, gestures, voice commands, keyboard shortcuts.
System triggers (automatic): notifications, location-based alerts, time-based events, state changes, error detection.
Trigger design principles: 1. Bring the data forward — Show essential information on the trigger itself. A mail icon with an unread count. A battery icon showing charge level. Don't force users to open something just to check status 2. Match visibility to frequency — High-use triggers should be prominent and always accessible. Infrequent triggers can be less visible 3. Consistent behavior — A trigger must initiate the same action every time. Inconsistency destroys trust 4. Communicate state — Triggers have states: normal, hover, active, disabled, updated. Each state must be visually distinct
Rules
Rules define what happens when a trigger fires. Users never see rules directly — they experience them through feedback.
Rules design principles: 1. Start with the goal — What is the user trying to accomplish? Every rule serves this goal 2. Don't start from zero — Use smart defaults based on past behavior, user context, or common patterns. Remember what the user did last time 3. Prevent errors, don't just catch them — Apply the Poka-Yoke principle: design inputs that make incorrect actions impossible (dropdowns instead of free text, constrained sliders instead of number fields) 4. Define every edge case — What happens with empty input? Maximum values? Network failure? Interrupted actions? If you haven't designed for it, users will find it
Feedback
Feedback makes the invisible rules visible. It's also where a product's personality lives.
| Type | Best For | Guidelines |
|---|---|---|
| Visual | Most interactions | Near the trigger. Brief. Respect visual hierarchy. Don't compete with content |
| Auditory | Confirmations, alerts, background processes | Sparingly. Short. Avoid negative sounds — use positive ones. Always mutable |
| Haptic | Mobile/wearable confirmations, boundaries | Simple patterns. Confirm actions. Signal errors. Limited vocabulary |
Feedback principles: 1. Convey the most with the least — Minimal, purposeful. A subtle color change beats a modal dialog 2. Match intensity to importance — Routine confirmation: subtle. Error with data loss: prominent and persistent 3. Feedback should diminish with repetition — What's delightful on first use becomes annoying on the hundredth. Consider reducing feedback intensity for repeated actions 4. Personality is appropriate in moderation — A touch of character is good. Cute error messages that block work are not
Loops and Modes
Loops govern repetition and timing:
- Count-controlled: Retry 3 times, then stop
- Condition-controlled: Keep checking until connected
- Long loops ("The Long Wow"): How the interaction evolves from first use to hundredth use — progressive disclosure, adaptive defaults, earned shortcuts
Modes alter functionality:
- Settings mode: Adjust parameters (alarm sound, snooze duration)
- Spring-loaded mode: Active only while physically held (long-press, key held down) — safest mode because user always knows it's active
- One-off mode: Activates for a single action, then reverts automatically
Critical rule: Minimize modes. Zero is ideal. One is acceptable if clearly visible. More than one in a microinteraction is a design smell.
---
Product Posture
A product's posture determines how much attention it demands and how its interactions should be designed (Cooper).
| Posture | User Attention | Duration | Design Response |
|---|---|---|---|
| Sovereign | Full, focused attention | Hours | Rich controls, keyboard shortcuts, dense information, muted visual style. Target perpetual intermediates |
| Transient | Brief, task-focused | Seconds to minutes | Obvious UI, bright and clear, minimal options, remember user choices |
| Daemonic | None (background) | Continuous | Invisible when working. Surface only when there's a problem. Configure via a transient settings panel |
Perpetual Intermediates
~80% of users are neither beginners nor experts — they're perpetual intermediates (Cooper). They've passed the learning phase but haven't memorized every feature.
Design implications:
- Optimize the interface for intermediate usage patterns, not beginners or experts
- Provide multiple command modalities: toolbar buttons (pedagogic/discoverable) + keyboard shortcuts (fast/memorized)
- Use progressive disclosure: show essential controls by default, hide advanced ones behind expandable panels
- Inflect the interface: place the most frequent functions in the most accessible locations
- Don't punish intermediates with beginner hand-holding they can't skip
- Don't hide essential functions behind expert-only mechanisms
---
Orchestration and Flow
Flow State
When interaction is well-designed, users enter a state of flow — focused, productive, unaware of the interface. The interface becomes transparent.
Flow killers:
- Modal dialogs interrupting work
- Confirmation prompts for reversible actions ("Are you sure?" — provide Undo instead)
- Navigation that breaks context
- Requiring users to re-enter information the system already has
- Errors that blame the user
Harmonious Interaction Principles (Cooper)
1. Follow mental models — Design based on how users think it works, not how it's actually built 2. Less is more — Every additional element competes for attention 3. Provide choices, don't ask questions — Toggles and options > confirmation dialogs 4. Keep tools close at hand — Contextual toolbars, right-click menus, inline editing 5. Provide modeless feedback — Status information that doesn't interrupt. Progress indicators in the UI, not in a dialog 6. Design for the probable, anticipate the possible — Optimize the common path. Handle edge cases gracefully 7. Avoid blank slates — Empty states should guide, not stare blankly
---
Narrative Structure in Product Design
Microinteractions define how individual moments behave. Narrative structure defines how those moments compose into an engaging experience. Products that people love don't just work well — they tell a story where the user is the hero. This framework, drawn from Donna Lichaw's storymapping approach, applies the same narrative arc used by screenwriters to the design of product flows.
The Narrative Arc Applied to Products
Every story — and every product experience — follows the same arc:
| Plot Point | In Story | In Product | Design Question |
|---|---|---|---|
| Exposition | Introduces the world and characters | User arrives and orients | Is it immediately clear what this is and what I can do? |
| Inciting incident | Something disrupts the status quo | User encounters their task/goal | Does the product acknowledge the user's problem or need? |
| Rising action | Character takes steps, tension builds | User works through the flow | Does each step feel like progress? Does engagement build? |
| Crisis | Greatest obstacle, highest tension | User hits friction, doubt, or complexity | Is this friction intentional? Can the user overcome it? |
| Climax | Turning point, peak emotion | The payoff — the "aha!" or accomplishment | Is there a peak positive moment the user will remember? |
| Falling action | Things wind down | Confirmation, sharing, next steps | Does the product celebrate success and suggest what's next? |
| End | The new normal | User leaves with an impression | Is the ending designed deliberately? |
The user is always the hero. Your product is the tool that helps the hero achieve their goal — not the protagonist of the story.
Three Types of Product Stories
| Story Type | What It Maps | Scale | Key Question |
|---|---|---|---|
| Concept story | The big picture — what this product is and why it matters | Product-level | "What is the story of this product?" |
| Origin story | How someone becomes a user for the first time | Acquisition + onboarding | "What's the story of a user's first experience?" |
| Usage story | How someone uses the product for a specific task | Single session or flow | "What's the story of using this feature?" |
Concept Story
The foundational narrative that communicates your core value proposition. Maps the product's reason for being onto the narrative arc.
- Exposition: Who is this for? What's their world like?
- Inciting incident: What problem disrupts their status quo?
- Rising action: What approaches have they tried?
- Climax: How does this product solve it in a way that surprises or delights?
- End: What does the user's world look like now?
A concept story without a climax is anticlimactic — "just another X." Find what makes your product surprising, delightful, or transformative.
Origin Story
The journey from awareness to first meaningful use. Bridges marketing and product design.
Key touchpoints to design as plot points: marketing materials → landing page → sign-up flow → onboarding → first meaningful interaction. Each should build on the last. The crisis is often "Another thing to sign up for?" — design the climax to answer it with immediate demonstrated value.
Usage Story
A single task or session mapped as a narrative arc. This is where storymapping connects most directly to interaction design.
- Map the moment-by-moment experience of completing a task
- Identify where the peak positive moment should be — the "boom"
- Design the ending deliberately — the peak-end rule means users judge the entire experience by its best moment and its ending
Storymapping Process
1. Define the story — Who is the hero? What is their goal? Which story type are you mapping? 2. Plot the arc — Use sticky notes on a wall or a spreadsheet. One note per plot point. Map left to right chronologically 3. Test the arc — Read it aloud. Does it build? Is there real tension? Is the climax satisfying? If any plot point is weak, the whole story suffers 4. Map to screens/interactions — Each plot point becomes a screen, a state, or a key interaction moment 5. Design the crisis deliberately — Don't eliminate all friction. Some friction creates engagement. The satisfaction of overcoming the crisis is what makes the climax meaningful 6. Design the climax — This is the moment users will remember. Invest disproportionate design effort here 7. Design the ending — Confirmation, celebration, sharing, or a bridge to the next story
Applying the Peak-End Rule
Research on how humans evaluate experiences (Kahneman) shows they judge by two moments: the peak (highest emotional intensity) and the end (final impression). The total duration and the average quality matter far less.
Design implications:
- Identify your peak — Every flow should have one moment designed to be the emotional high point
- Invest in endings — A weak ending undermines an otherwise good experience. Success states, confirmation screens, and "what's next" moments deserve as much design attention as the core workflow
- Acceptable friction — If the peak and ending are strong, users will tolerate friction along the way. Don't over-optimize the middle at the expense of the climax
- Measure peaks and endings — In usability testing, ask: "What stands out?" and "How did it end?" These reveal the remembered experience
When to Use Storymapping
| Situation | Story Type to Map |
|---|---|
| Designing a new product or major feature | Concept story first, then origin story |
| Improving onboarding or activation | Origin story |
| Designing or improving a specific flow | Usage story |
| Diagnosing why users aren't engaged | All three — find which story is broken |
| Pitching a product vision to stakeholders | Concept story as the narrative backbone |
---
Excise
Excise is work that doesn't contribute to the user's goal (Cooper). Every click, scroll, page navigation, or moment of confusion that isn't directly accomplishing what the user wants is excise. Eliminate it.
Four Types of Excise
| Type | Definition | Examples |
|---|---|---|
| Cognitive | Comprehending product behavior, decoding layouts | Unclear labels, ambiguous icons, complex jargon |
| Memory | Remembering commands, locations, passwords, settings | Forgetting where a setting lives, re-entering the same data |
| Visual | Figuring out where to look, finding items, decoding hierarchy | Cluttered screens, poor contrast, undifferentiated lists |
| Physical | Unnecessary clicks, mouse travel, mode switching | Deep navigation, distant controls, repeated scrolling |
Navigational Excise (Most Prevalent)
Navigation is the most common source of excise. Reduce it:
- Reduce places to go — Flatten hierarchies. Combine related functions
- Provide signposts — Breadcrumbs, active states, location indicators
- Provide overviews — Dashboards, summaries, previews
- Don't force window/screen switching — If a function affects the current context, perform it in the current context
- Don't replicate mechanical-age models — Digital products shouldn't mimic physical limitations
The Excise Test
For every interaction step, ask: "Does this directly help the user achieve their goal?"
- Yes → Keep it, optimize it
- No → Eliminate it, automate it, or hide it behind progressive disclosure
---
State Design
Every Element Has States
Design every interactive element across all its possible states:
| State | When | Required Visual Change |
|---|---|---|
| Default | Resting, ready | Base appearance |
| Hover | Cursor over (desktop) | Subtle highlight, cursor change |
| Focus | Keyboard navigation | Visible focus ring (2px, 3:1 contrast) |
| Active/Pressed | Being activated | Depressed appearance, scale reduction |
| Disabled | Not currently available | Reduced opacity (40%), no pointer events |
| Loading | Awaiting data/response | Skeleton or spinner replacing content |
| Empty | No data to display | Illustration + guidance + action |
| Error | Something went wrong | Error color + message + recovery path |
| Success | Action completed | Confirmation + next step |
| Selected | Chosen in a multi-select | Accent border or background |
| Expanded/Collapsed | Toggle content visibility | Arrow/chevron rotation + content reveal |
| Dragging | Being repositioned | Elevated shadow, ghost at origin |
State Machines
For complex interactions, model behavior as a finite state machine:
[Idle] --click--> [Loading] --success--> [Displaying Data]
--error--> [Error State]
[Error State] --retry--> [Loading]
[Displaying Data] --refresh--> [Loading]
--delete--> [Confirming]
[Confirming] --confirm--> [Deleting] --done--> [Idle]
--cancel--> [Displaying Data]Benefits:
- Makes impossible states impossible (you can't delete while loading)
- Forces you to define every transition explicitly
- Reveals missing states early (what happens on timeout?)
- Serves as documentation developers can implement directly
---
Responsiveness Thresholds
| Duration | User Perception | Design Response |
|---|---|---|
| 0-100ms | Instantaneous | No feedback needed beyond the state change |
| 100ms-1s | Responsive, slight delay | Show the result. Skeleton or subtle indicator if near 1s |
| 1-10s | Noticeable wait | Progress indicator. Explain what's happening. Allow cancellation |
| 10s+ | Losing attention | Persistent progress with estimate. Background the task. Notify on completion |
Critical rule: Never leave users without feedback for more than 1 second. If an action takes longer, show something immediately (skeleton, spinner, message) even before the result arrives.
---
Gesture Patterns
Touch Gestures
| Gesture | Action | When to Use |
|---|---|---|
| Tap | Select, activate | Primary action on any touchable element |
| Long press | Secondary action, context menu | Less discoverable — always provide an alternative path |
| Swipe | Navigate, dismiss, reveal actions | Natural for lists, cards, pages. Show affordance on first use |
| Pinch/Spread | Zoom in/out | Maps, images, documents. Bidirectional |
| Drag | Reorder, move, resize | Show drop targets. Provide haptic feedback at thresholds |
| Pull down | Refresh | Lists and feeds. Show progress animation |
Gesture Design Rules
1. Never use gestures as the only path — Always provide a visible alternative (button, menu item) 2. Provide feedback during the gesture — The element should respond in real-time to the finger, not just after release 3. Respect the platform — iOS swipe-back, Android back button. Don't override system gestures 4. Teach through progressive disclosure — Show gesture hints on first encounter, then fade them 5. Touch targets minimum 44×44px (Apple HIG) or 48×48dp (Material) — smaller targets cause errors
---
Common Mistakes
| Mistake | Why It Fails | Instead |
|---|---|---|
| Designing only the happy path | Real users encounter errors, empty states, slow connections, edge cases | Design every state for every element |
| Confirming every action with a dialog | Interrupts flow, teaches users to click "OK" without reading | Provide Undo instead of asking permission |
| Identical feedback for different outcomes | User can't tell if their action succeeded, failed, or is still processing | Differentiate success, error, and loading feedback clearly |
| Gestures without visible alternatives | Users who don't discover the gesture are stuck | Always pair gestures with a visible control |
| Animations that block interaction | Users wait for an animation to finish before they can act | Keep animations under 300ms for direct interactions. Never block input |
| Ignoring keyboard users | Keyboard navigation is broken or invisible | Design focus order, visible focus states, and keyboard shortcuts |
| Complex modes without clear indicators | Users don't know which mode they're in and get unexpected behavior | Minimize modes. If unavoidable, make the current mode impossible to miss |
---
Reference Files
Load these for deeper guidance on specific topics:
references/microinteractions.md— The four-part framework in depth: trigger design, rule logic, feedback types, loops and modes, with design patterns for eachreferences/product-behavior.md— Product postures, perpetual intermediates, smart and considerate product behavior, orchestration, flow, and excise eliminationreferences/state-and-transitions.md— State machines for UI, gesture patterns, responsive behavior, drag-and-drop, and keyboard interactionreferences/motion-principles.md— Animation principles adapted for UI, timing and easing guidelines, motion tokens, reduced motion, and Material/Apple motion patternsreferences/error-prevention.md— Error prevention hierarchy, undo patterns, inline validation, empty states, loading patterns, and recovery flows
Templates
templates/microinteraction-spec-template.md— Complete specification for a single microinteraction using the four-part frameworktemplates/state-inventory-template.md— State audit for all interactive elements in a feature or screen
Examples
examples/microinteraction-walkthrough.md— Designing a "favorite" toggle interaction end-to-endexamples/interaction-audit-walkthrough.md— Auditing and improving interactions in a fictional product
Interaction Audit Walkthrough
Auditing and improving interactions in a fictional task management product.
---
Context
Product: TaskPilot — a web-based task management app for small teams Trigger: Users complain the app "feels clunky" despite the UI looking clean. Support tickets about lost work and confusing behavior are rising. The team suspects interaction design issues rather than visual design problems. Scope: The main task list view — the screen users spend 80% of their time on.
---
Step 1: Identify All Interactive Elements
Walk through the task list screen and catalog every element that responds to user input:
| # | Element | Type | Location |
|---|---|---|---|
| 1 | Task checkbox | Toggle | Left of each task row |
| 2 | Task title | Text (clickable) | Center of each task row |
| 3 | Priority selector | Dropdown | Right of task title |
| 4 | Due date | Date picker trigger | Right of priority |
| 5 | Assignee avatar | Clickable avatar | Right of due date |
| 6 | "Add task" button | Button | Bottom of task list |
| 7 | Task row (entire) | Clickable area | Full row |
| 8 | Drag handle | Drag target | Left edge (hidden until hover) |
| 9 | Sort controls | Dropdown | List header |
| 10 | Filter controls | Multi-select | List header |
| 11 | Search input | Text field | Top of page |
| 12 | Keyboard shortcuts | Hidden | Global |
---
Step 2: State Inventory
Audit each element's states. Mark gaps.
Task Checkbox
| State | Designed? | Issue |
|---|---|---|
| Default (unchecked) | Yes | OK |
| Checked | Yes | OK |
| Hover | No | No hover feedback — users aren't sure if it's clickable |
| Focus | No | Can't tab to checkboxes — keyboard users can't complete tasks |
| Disabled | No | What happens during sync? Can users check offline tasks? |
| Loading (syncing) | No | Checkbox changes instantly but there's no feedback if sync fails |
| Error (sync failed) | No | If the server rejects the change, the checkbox stays checked — data mismatch |
Issues found: 4 missing states. Keyboard inaccessible. No error handling for sync failures.
Task Title (Click to Open Detail)
| State | Designed? | Issue |
|---|---|---|
| Default | Yes | OK |
| Hover | Partially | Text underlines on hover, but the entire row also has a hover state — two competing hover effects |
| Focus | No | Can't keyboard-navigate to task titles |
| Truncated (long title) | Yes | Ellipsis, but no tooltip showing full title |
| Empty | No | What if a task has no title? Blank space with no affordance |
"Add Task" Button
| State | Designed? | Issue |
|---|---|---|
| Default | Yes | OK |
| Hover | Yes | OK |
| Focus | No | Can't tab to it |
| Active | Yes | OK |
| Loading (creating) | No | Button doesn't change during task creation — user clicks multiple times, creating duplicate tasks |
| Disabled | No | Should it be disabled while another task is being created? |
Drag Handle for Reordering
| State | Designed? | Issue |
|---|---|---|
| Default | Hidden until row hover | OK for mouse users |
| Hover on handle | Yes | Cursor changes to grab |
| Dragging | Partially | Row lifts but no drop zone indicators. User can't tell where the task will land |
| Drop | No | Task snaps to position with no animation — feels jarring |
| Keyboard alternative | Missing entirely | No way to reorder with keyboard |
| Touch alternative | Missing | No drag affordance on mobile. Long-press doesn't work |
---
Step 3: Identify Excise
Navigational Excise
- Editing a task requires opening the detail panel: Click task → panel opens on right → make changes → close panel. For quick edits (changing a due date), this is 3 extra clicks. The due date picker is visible on the row but only for display — can't edit inline
- Assigning a task requires 4 clicks: Click assignee → popover opens → search for person → click person → popover closes. Most teams have 5-10 people. A simple dropdown would be 2 clicks
Modal Excise
- "Are you sure you want to delete this task?" — Every single time. No undo option. The dialog doesn't even say which task is being deleted
Cognitive Excise
- Priority levels are colors only: Red, orange, yellow, gray. No labels. New users must learn the color code. Color-blind users can't distinguish orange from red
Physical Excise
- "Add task" button is at the bottom of the list: For long lists, user must scroll to the bottom to add a task. Should be at the top or accessible via keyboard shortcut
---
Step 4: Prioritize Improvements
Rank by frequency × severity:
| # | Issue | Frequency | Severity | Fix |
|---|---|---|---|---|
| 1 | No keyboard navigation | Every session for keyboard users | High — accessibility violation | Add tabindex, focus styles, Enter/Space to activate |
| 2 | Duplicate tasks on double-click | Multiple times/day | High — data corruption | Disable button during creation. Debounce |
| 3 | No sync error handling on checkbox | Every session | High — silent data loss | Optimistic UI + revert on failure + error toast |
| 4 | Inline editing blocked | Multiple times/day | Medium — excessive navigation | Enable inline edit for title, due date, priority, assignee |
| 5 | Delete confirmation without undo | Weekly | Medium — excise | Remove dialog. Add undo toast (10 seconds) |
| 6 | Drag-and-drop missing feedback | Weekly | Medium — confusing | Add drop zone indicators, animation, keyboard alternative |
| 7 | Priority colors without labels | First use + ongoing for color-blind | Medium — accessibility | Add text labels alongside colors |
| 8 | "Add task" at bottom only | Multiple times/day | Low-Medium — physical excise | Add to top + Cmd+N keyboard shortcut |
---
Step 5: Redesign Top Issues
Fix #1: Keyboard Navigation
Before: Tab key skips the task list entirely. Only mouse interaction.
After:
- Tab enters the task list. Arrow keys navigate between tasks
- Each task is a composite widget: Tab stops on the row, then Arrow Right moves between checkbox → title → priority → due date → assignee
- Enter on checkbox: toggle complete. Enter on title: open detail. Space on priority: open dropdown
- Focus ring: 2px
color-border-focus, clearly visible on every focusable element
Fix #2: Prevent Duplicate Tasks
Before: Click "Add task." Nothing visible happens for 500ms while the API creates the task. User clicks again. Two tasks created.
After:
- Click "Add task" → button immediately shows spinner + "Creating..." text → button is disabled
- New task row appears with cursor in the title field (optimistic UI)
- API confirms → spinner disappears → button re-enables
- If API fails → task row shows error state ("Couldn't create task. Try again?")
State machine:
[Ready] --click--> [Creating] --success--> [Ready] + new task in list
--error--> [Ready] + error toastFix #3: Sync Error Handling
Before: User checks a task. Checkbox fills immediately. API call fails silently. User thinks the task is complete. It isn't.
After:
- User checks task → checkbox fills immediately (optimistic)
- API call fires
- If success: task gets a brief green flash (100ms) and subtitle shows "Just now"
- If failure: checkbox reverts to unchecked (150ms crossfade). Toast: "Couldn't mark complete. Try again." Task row briefly highlights in
color-feedback-errorbackground (1 second fade) - Auto-retry once after 3 seconds. If retry succeeds, update silently
Fix #5: Undo Instead of Confirmation
Before: Click delete → "Are you sure you want to delete this task?" → OK/Cancel
After:
- Click delete → task immediately fades out and collapses (200ms)
- Toast appears at bottom: "[Task title] deleted. Undo (10s)"
- If undo clicked: task smoothly expands back into its original position (200ms)
- If 10 seconds pass: toast dismisses. Task is permanently deleted (soft-delete for 30 days, actually)
- Keyboard: Cmd+Z also undoes the last delete within the 10-second window
---
Step 6: Measure Impact
Metrics to Track
| Metric | Before | Target | How to Measure |
|---|---|---|---|
| Duplicate task creation rate | ~8% of sessions | <1% | Count tasks created within 2 seconds of each other |
| Checkbox sync failure rate (unnoticed) | Unknown — no tracking | 0% unnoticed | Track revert events vs. silent failures |
| Delete confirmation dialog dismissal | 73% always click OK | N/A (dialog removed) | Track undo usage rate (expect 5-10% of deletes are undone) |
| Tasks completed via keyboard | 0% | Measurable usage | Track completion events with keyboard flag |
| "Feels clunky" support tickets | 12/month | <3/month | Tag and count support tickets |
---
Key Takeaways
1. "Feels clunky" is almost always an interaction problem, not a visual one. The UI looked fine — the behavior was broken 2. The state inventory revealed 15+ missing states across 12 elements. Each missing state is a potential bug or user frustration 3. Excise was the biggest contributor to "clunky" feeling. Four extra clicks to edit a due date. A confirmation dialog on every delete. Scrolling to add a task. These individually seem minor but compound into a sluggish experience 4. Optimistic UI with error recovery is almost always better than waiting for server confirmation. Users get instant feedback, and errors are handled gracefully instead of blocking the happy path 5. Keyboard accessibility wasn't just an accessibility issue — it was a power-user productivity issue. Many users prefer keyboard for task management
Microinteraction Walkthrough
Designing a "Favorite" toggle interaction end-to-end using the four-part framework.
---
Context
Product: A recipe-sharing web and mobile app Feature: Users can favorite recipes to save them to a personal collection Interaction: Tapping a heart icon on a recipe card toggles the favorite state
---
Step 1: Define the Goal
User goal: Save a recipe I like so I can find it later.
This is a binary state toggle — on or off — which makes it a single microinteraction, not a feature.
---
Step 2: Design the Trigger
Type
Manual trigger — user taps/clicks a heart icon.
Placement
On the recipe card (top-right corner) AND on the recipe detail page (next to the title). Same trigger, same behavior, two locations.
Data Brought Forward
- Not favorited: Empty heart outline
- Favorited: Filled heart in accent color
- Favorited count: "24 saves" text below heart on detail page (social proof)
The user can see the favorite state without tapping — the filled vs. outline heart communicates status immediately.
Trigger States
| State | Recipe Card | Detail Page |
|---|---|---|
| Default (not favorited) | Outline heart, color-text-tertiary | Outline heart, color-text-secondary, "Save" label |
| Default (favorited) | Filled heart, color-feedback-error (red) | Filled heart, color-feedback-error, "Saved" label |
| Hover | Scale to 110%, outline thickens | Scale to 105%, background tint |
| Active/Pressed | Scale to 90% (squash) | Scale to 95% |
| Disabled | 40% opacity (e.g., user not logged in) | 40% opacity + "Log in to save" tooltip |
| Loading | Pulse animation on heart | Pulse animation |
---
Step 3: Design the Rules
Primary Action
- Tap unfavorited → Favorite the recipe (add to user's collection)
- Tap favorited → Unfavorite the recipe (remove from collection)
Sequence (Favorite)
1. Heart immediately fills (optimistic UI — don't wait for server) 2. API request sent to save the favorite 3. If success: count increments, state is persisted 4. If failure: heart reverts to outline, brief error toast
Sequence (Unfavorite)
1. Heart immediately empties (optimistic UI) 2. API request sent to remove the favorite 3. If success: count decrements 4. If failure: heart reverts to filled, brief error toast
Smart Defaults
- If user is not logged in: show heart as disabled. On tap, prompt login (not a full redirect — a sheet/modal). After login, complete the favorite action automatically
- Count is fetched with the recipe data. No extra request
Edge Cases
| Edge Case | Handling |
|---|---|
| Rapid double-tap | Debounce. Only send the final state after 300ms of no taps. Visual state toggles immediately for each tap |
| Network failure | Revert visual state. Show toast: "Couldn't save. Try again." Heart returns to previous state |
| Already favorited on another device | Sync state on load. No conflict — last-write-wins is fine for favorites |
| Recipe deleted while favorited | Remove from favorites list on next load. No error needed |
| User taps from notification | Deep-link to recipe detail. Favorite state is correct on load |
What the System Remembers
- Favorite state per recipe per user (persistent, server-side)
- Total favorite count per recipe (cached, eventually consistent)
---
Step 4: Design the Feedback
Visual Feedback
Favoriting (outline → filled): 1. Heart scales down to 90% (50ms, ease-in) — the "squash" 2. Heart fills with red while scaling up to 120% (150ms, spring) — the "pop" 3. Heart settles to 100% (100ms, ease-out) — landing 4. Brief particle burst around heart (3-5 small hearts or sparkles, 300ms, fade out) — delight
Total timing: ~400ms
Unfavoriting (filled → outline): 1. Heart scales down to 95% (50ms, ease-in) 2. Fill drains (crossfade to outline, 100ms) 3. Heart returns to 100% (50ms, ease-out)
Total timing: ~200ms — unfavoriting is faster and less celebratory. Exit is swift.
Haptic Feedback (Mobile)
- Favoriting: Medium impact tap at the pop moment (step 2)
- Unfavoriting: Light tap at the drain moment (step 2)
Auditory Feedback
None. Favoriting is a frequent, casual action. Sound would become annoying. (Exception: if the product has an explicitly playful brand, a subtle "pop" sound could work — but it must be mutable.)
Error Feedback
- Toast appears at bottom: "Couldn't save favorite. Try again." with a retry button
- Toast auto-dismisses after 5 seconds
- Heart reverts to previous state with a 150ms crossfade (no jarring snap)
---
Step 5: Design Loops and Modes
Modes
None. This interaction has no modes. Tapping always toggles. No settings to configure.
Loops
- No retry loop: If the API call fails, the system does not auto-retry. It reverts the visual state and shows the error toast. The user can tap again to retry manually
- Debounce loop: Rapid taps are debounced to 300ms. The visual state toggles immediately (responsive), but the API call only fires once with the final state
Long Loop (The Long Wow)
| Phase | Behavior |
|---|---|
| First favorite | After the animation completes, show a brief tooltip: "Find your saved recipes in Favorites." This teaches the user where to access favorites. Show only once |
| Regular use | Standard animation. No tooltip. Fast and quiet |
| After 10+ favorites | On the Favorites page, surface a suggestion: "You've saved 15 desserts. Browse our Dessert collection?" — the system recognizes patterns |
| Return after absence | "Welcome back! You have 23 saved recipes." — reconnect the user to their collection |
---
Step 6: State Machine
[Unfavorited] --tap--> [Saving]
[Saving] --API success--> [Favorited]
[Saving] --API failure--> [Unfavorited] + show error toast
[Favorited] --tap--> [Removing]
[Removing] --API success--> [Unfavorited]
[Removing] --API failure--> [Favorited] + show error toast
[Unfavorited] --tap (not logged in)--> [Login Prompt]
[Login Prompt] --login success--> [Saving]
[Login Prompt] --dismiss--> [Unfavorited]Note: Visual state changes optimistically (immediately on tap), but the actual state machine waits for API confirmation before settling.
---
Step 7: Accessibility
| Requirement | Implementation |
|---|---|
| Keyboard | Focus with Tab. Toggle with Enter or Space |
| Focus ring | 2px ring around heart icon, color-border-focus, 2px offset |
| ARIA | role="checkbox", aria-checked="true/false", aria-label="Save [Recipe Name] to favorites" |
| Screen reader | On toggle: announces "Saved to favorites" or "Removed from favorites" via aria-live="polite" region |
| Color independence | State communicated by fill (filled vs. outline) and label ("Save" vs. "Saved"), not just color |
| Reduced motion | Skip scale animation and particle burst. Instant crossfade between filled/outline (50ms opacity transition only) |
| Touch target | 44×44px minimum hit area (heart icon may be visually smaller, but tap target extends) |
---
Outcome
This single microinteraction — a heart toggle — touches all four parts of the framework:
- Trigger: Heart icon with data forward (filled/outline state), clear states
- Rules: Optimistic UI, debounce, login handling, error recovery
- Feedback: Asymmetric animation (celebratory favorite, swift unfavorite), haptic, contextual errors
- Loops/Modes: No modes (good). Long loop with first-use education and pattern recognition
Total specification: ~2 pages. Implementation: ~1 day. Impact: the difference between a product users tolerate and one they love.
Error Prevention and Recovery
Error prevention hierarchy, undo patterns, inline validation, empty states, loading patterns, and recovery flows. Based on Cooper's About Face and Saffer's Microinteractions.
---
The Error Prevention Hierarchy
Address errors in this order — prevention is always cheaper than recovery:
| Level | Approach | Example | Cost to User |
|---|---|---|---|
| 1. Eliminate | Remove the possibility of the error entirely | Auto-save eliminates "forgot to save." Dropdown eliminates misspelled country names | Zero |
| 2. Prevent | Design inputs that make errors impossible | Date picker prevents invalid dates. Slider prevents out-of-range values | Zero |
| 3. Detect early | Catch errors as they happen, before submission | Inline validation on field blur. Real-time format checking | Low |
| 4. Recover gracefully | When errors occur, make recovery easy and painless | Undo after delete. Auto-correct with "Did you mean...?" | Medium |
| 5. Explain clearly | If recovery requires user action, explain exactly what to do | Inline error with specific message + highlight + fix suggestion | Medium-High |
| 6. Diagnose | Help users understand what went wrong and why | Detailed error page with troubleshooting steps | High |
Never design at Level 5-6 when you could design at Level 1-2.
---
Inline Validation
When to Validate
| Timing | How It Works | Best For |
|---|---|---|
| On blur (field exit) | Validate when user leaves the field | Most fields. Gives user time to finish typing |
| On input (real-time) | Validate as user types | Format-sensitive fields (phone, credit card). Show checkmarks as requirements are met |
| On submit | Validate all fields when form is submitted | Final check. Should rarely be the only validation |
Rule: Never validate on input for fields where the user is still typing valid content. "j" is not an invalid email — the user hasn't finished typing.
Validation Message Design
| Element | Guideline |
|---|---|
| Placement | Below the field, aligned with input text. Never in a separate error summary only |
| Color | color-feedback-error for border and message. Red icon (plus text — never color alone) |
| Icon | Error icon (!) next to message text. Provides a non-color signal |
| Message | Specific, actionable. "Enter a valid email (e.g., name@example.com)" not "Invalid input" |
| Timing | Appear on blur or after brief typing pause (300ms). Disappear as soon as the input is corrected |
| Focus | On submit with errors, focus the first error field. Scroll it into view if off-screen |
Error Message Writing
| Bad | Good |
|---|---|
| "Invalid input" | "Enter a number between 1 and 100" |
| "Error: field required" | "Email is required to create your account" |
| "Validation failed" | "This username is already taken. Try adding a number?" |
| "Error 422" | "We couldn't save your changes. Check the highlighted fields" |
| "Something went wrong" | "We couldn't connect to the server. Check your internet connection and try again" |
Principles: 1. Say what happened (briefly) 2. Say what the user can do about it (specifically) 3. Never blame the user ("We couldn't process" not "You entered an invalid") 4. Never use jargon (no error codes, no "validation", no "exception")
---
Undo Patterns
Undo Instead of Confirmation
Confirmation dialogs ("Are you sure?") are excise. They interrupt flow, and users learn to click "OK" without reading. Undo is almost always better.
| Confirmation Dialog | Undo Alternative |
|---|---|
| "Are you sure you want to delete?" | Delete immediately. Show "Undo" toast for 10 seconds |
| "Discard unsaved changes?" | Auto-save continuously. Nothing to discard |
| "Send this message?" | Send immediately. Show "Undo send" for 5 seconds |
| "Move to trash?" | Move immediately. "Moved to trash. Undo" |
| "Remove team member?" | Remove immediately. "Removed. Undo" (the member is just deactivated for the undo period) |
When Confirmation IS Appropriate
Some actions genuinely warrant confirmation because they're:
- Truly irreversible — Permanently deleting data (not just moving to trash)
- High-consequence — Publishing to production, sending to 10,000 users, financial transactions
- Affect others — Removing someone's access, deleting shared resources
Even then, state the consequences specifically: "This will permanently delete 23 files. This cannot be undone." Not just "Are you sure?"
Undo Implementation Patterns
| Pattern | How It Works | Duration |
|---|---|---|
| Toast undo | Action executes. Toast appears with "Undo" button. Clicking undoes the action | 5-10 seconds |
| Soft delete | Item is hidden/flagged, not actually deleted. Can be restored from trash | 30 days (typical) |
| Multi-level undo | Cmd+Z steps back through action history | Unlimited (within session) |
| Version history | Every save creates a version that can be restored | Persistent |
| Draft recovery | Work-in-progress is auto-saved. Can be restored if lost | 30 days (typical) |
---
Empty States
Every screen that can display data must also handle having no data. Empty states are first impressions for new users and recovery moments for users who've cleared their content.
Empty State Types
| Type | Cause | Design Response |
|---|---|---|
| First use | User hasn't created anything yet | Welcome message + clear CTA ("Create your first project") |
| No results | Search or filter returned nothing | Explain why + suggest alternatives ("Try a different search term") |
| Cleared | User deleted all items | Acknowledge + offer to start fresh ("All done! Create a new task?") |
| Error | Data failed to load | Explain + offer retry ("Couldn't load your projects. Try again") |
| Permission | User doesn't have access | Explain + offer a path ("Ask your admin for access to this workspace") |
Empty State Design Rules
1. Never show a blank screen — Always provide context and a path forward 2. Show one primary action — Not a menu of everything the user could do 3. Use illustration sparingly — A simple icon or illustration humanizes the moment, but it shouldn't dominate 4. Match the tone — First-use empty states can be welcoming. Error empty states should be empathetic 5. Include educational content — "Projects help you organize your team's work" — briefly explain the concept for new users
---
Loading Patterns
Choosing the Right Pattern
| Pattern | Duration | Best For |
|---|---|---|
| No indicator | <100ms | Instant responses. No feedback needed |
| Skeleton screen | 100ms-3s | Content areas. Preserves layout. Reduces perceived wait time |
| Spinner | 500ms-10s | Indeterminate processes. Small area (button, card) |
| Progress bar | 2s-60s | Determinate processes. Upload, download, multi-step |
| Background task | >10s | Long processes. Let user continue other work. Notify on completion |
Skeleton Screen Rules
- Match the layout of the actual content exactly — same heights, widths, spacing
- Use neutral gray blocks for text lines, rectangles for images, circles for avatars
- Animate with a subtle pulse or shimmer (left-to-right wave)
- Replace with real content via crossfade (150-200ms)
- Never show a skeleton for content that loads instantly
Progress Indication Rules
1. Show something within 1 second — Even if you don't know how long it'll take, show a spinner 2. Determinate > indeterminate — If you know the progress, show a progress bar with percentage. Users prefer knowing "60% done" over an infinite spinner 3. Estimate time when possible — "About 2 minutes remaining" reduces anxiety 4. Allow cancellation — Any process over 5 seconds should have a cancel button 5. Show what's happening — "Uploading photo 3 of 7..." is better than just a progress bar 6. Don't restart progress — If a process has multiple stages, keep the bar moving forward, don't reset to 0%
---
Recovery Flows
Network Error Recovery
Action → Network Error
→ Show inline error: "Couldn't save. No internet connection."
→ Auto-retry silently in background (3 attempts, exponential backoff)
→ If reconnected: Save and show brief success confirmation
→ If still offline: "Still offline. Your changes are saved locally and will sync when you're back online."Server Error Recovery
Action → Server Error (500)
→ Show inline error: "Something went wrong on our end."
→ Offer retry button
→ Auto-retry once after 5 seconds
→ If persistent: "We're looking into this. Your work is saved locally."
→ Provide support link for critical flowsSession Expiry Recovery
User Returns After Timeout
→ Silently attempt token refresh
→ If refresh succeeds: Continue seamlessly (user never knows)
→ If refresh fails: Overlay login prompt
→ After re-auth: Return user to exact state they were in
→ Never discard unsaved work due to session expiryConflict Recovery
User Saves → Server Reports Conflict (another user edited)
→ Show both versions side-by-side
→ Let user choose: "Keep mine" / "Keep theirs" / "Merge"
→ Never silently overwrite another user's workMicrointeractions
The four-part framework in depth, with design patterns for triggers, rules, feedback, and loops/modes. Based on Dan Saffer's Microinteractions.
---
Triggers in Depth
Manual Trigger Patterns
| Pattern | Mechanism | Best For |
|---|---|---|
| Button | Click/tap to activate | Single, discrete actions (submit, save, send) |
| Toggle | Click/tap to switch between two states | Binary settings (on/off, show/hide, enabled/disabled) |
| Slider | Drag along a track | Continuous value within a range (volume, brightness) |
| Stepper | Click +/- to increment/decrement | Precise numeric input with small range (quantity, font size) |
| Gesture | Swipe, pinch, long-press | Spatial or navigation interactions (swipe to delete, pinch to zoom) |
| Voice | Spoken command | Hands-free contexts, accessibility, smart assistants |
| Keyboard shortcut | Key combination | Frequent actions for power users (Cmd+S, Ctrl+Z) |
| Hover | Cursor enters element area | Preview, tooltip, additional options (desktop only) |
System Trigger Patterns
| Pattern | Condition | Example |
|---|---|---|
| Time-based | Clock reaches a time, duration expires | Alarm fires, session timeout, scheduled notification |
| Location-based | Device enters/leaves a geofence | "You're near the store" reminder |
| State change | Data or connection state changes | New message received, network restored, download complete |
| Threshold | A value crosses a boundary | Battery below 20%, storage nearly full |
| Error detection | System detects an anomaly | Failed sync, broken link, invalid data |
| Inactivity | User hasn't interacted for N seconds | Auto-save, screen dim, session warning |
Bringing Data Forward
The most effective triggers surface information from inside the interaction on the trigger itself:
| Trigger | Without Data | With Data Forward |
|---|---|---|
| Mail icon | Envelope icon | Envelope icon + "3" badge (3 unread) |
| Battery indicator | Battery icon | Battery icon + "47%" + charging bolt |
| Download button | "Download" | "Download (2.3 MB)" |
| Sync button | Circular arrows | Circular arrows + "Last synced 5 min ago" |
| Notification bell | Bell icon | Bell icon + red dot (new notifications) |
| Settings toggle | "Notifications: Settings" | "Notifications: On (3 channels)" |
This reduces the need to "open to check" — a common source of navigational excise.
---
Rules in Depth
Rule Design Checklist
For every microinteraction, define:
- [ ] What happens when the trigger fires (the primary action)
- [ ] What the user can control (parameters, options)
- [ ] What the user cannot do (constraints, disabled states)
- [ ] The sequence of steps (if multi-step)
- [ ] How the system responds to valid input
- [ ] How the system responds to invalid input (error prevention first, then error handling)
- [ ] What data is used (pre-filled, remembered, derived)
- [ ] How the interaction ends (what state does the system return to?)
- [ ] What the system remembers (for next time)
Smart Defaults
| Principle | Example |
|---|---|
| Remember last value | Last-used save location, last-selected format, last search query |
| Use context | Prefill city from GPS. Default to user's timezone. Suggest recent contacts |
| Use frequency | Most-used option first. Recently-used items at top |
| Use the data | If the user entered a phone number, default country code from their profile |
| Progressive defaults | First time: guide with defaults. Repeat: use the user's previous choices |
Rule: If it was worth it to the user to enter it, it's worth it to the application to remember it (Cooper).
Error Prevention (Poka-Yoke)
Design inputs that make errors impossible:
| Technique | How | Example |
|---|---|---|
| Constrained input | Limit options to valid values | Dropdown instead of free text for country. Date picker instead of text field |
| Forgiving formats | Accept multiple input formats | Phone number accepts "(555) 123-4567" or "5551234567" or "+1 555-123-4567" |
| Real-time validation | Check as user types, not after submit | Email field shows error before user moves to next field |
| Smart parsing | Interpret ambiguous input intelligently | "next tuesday" → Tuesday March 31, 2026 |
| Undo over prevention | Let users act freely, provide easy reversal | Delete immediately + "Undo" toast > "Are you sure?" dialog |
| Physical constraints | Design controls that can't produce invalid states | Slider can't go below 0 or above 100 |
---
Feedback in Depth
Visual Feedback Patterns
| Pattern | Duration | Use Case |
|---|---|---|
| Color change | 150-300ms transition | State change (active, selected, error) |
| Checkmark/icon swap | 200-400ms | Action confirmation (saved, sent, copied) |
| Progress bar | Duration of process | Determinate processes (upload, download, form completion) |
| Spinner | Until complete | Indeterminate processes (loading, searching) |
| Skeleton screen | Until content loads | Content areas replacing with actual data |
| Toast/snackbar | 3-5 seconds auto-dismiss | Non-critical confirmations ("Item saved," "Link copied") |
| Inline message | Until resolved | Validation errors, field-level guidance |
| Badge/dot | Until acknowledged | Notifications, unread counts, status changes |
| Shake/bounce | 300-600ms | Invalid input, boundary reached |
| Highlight/pulse | 1-2 seconds | Drawing attention to a change or new element |
Feedback Intensity Scale
Match feedback intensity to message importance:
| Importance | Intensity | Example |
|---|---|---|
| Low (routine confirmation) | Subtle — small icon change, brief toast | "Settings saved" toast |
| Medium (status change) | Moderate — visible animation, color change | Toggle switch animates on/off |
| High (error, warning) | Strong — persistent message, accent color, icon | Inline error message with red border |
| Critical (data loss risk) | Maximum — modal, blocking, requires action | "Unsaved changes will be lost. Save now?" |
Auditory Feedback Guidelines
- Use sound to reinforce, not replace visual feedback — some users have sound off
- Short sounds (50-200ms) for confirmations — longer sounds for completion
- Positive sounds for success (ascending tone). Neutral sounds for alerts. Avoid harsh negative sounds
- Provide volume control and a mute option for all sounds
- Don't play sounds for repeated routine actions — a sound for every keystroke becomes maddening
Haptic Feedback Guidelines
- Light tap — Routine confirmation (toggle, selection)
- Medium tap — Boundary reached (end of scrollable list, slider endpoint)
- Heavy tap — Error or significant event (failed action, important alert)
- Pattern — Specific notification type (different vibration for message vs. call)
---
Loops and Modes in Depth
Long Loops (The Long Wow)
Design the interaction across its entire lifecycle:
| Phase | User State | Design Response |
|---|---|---|
| First use | Uncertain, exploring | Guided defaults, contextual hints, generous feedback |
| Learning (days 2-7) | Building mental model | Reduce guidance, introduce shortcuts, remember preferences |
| Regular use (weeks) | Intermediate, efficient | Streamlined flow, keyboard shortcuts, reduced feedback for known actions |
| Return after absence | Partially forgotten | "Welcome back" re-orientation, highlight what changed, preserve state |
| Expert use (months+) | Power user | Advanced features discoverable, customization, batch operations |
Progressive Disclosure Over Time
| First Use | After 5 Uses | After 50 Uses |
|---|---|---|
| Tooltip hints on all controls | Hints only on less-used controls | No hints (but available on hover) |
| Onboarding walkthrough | "Tip of the day" (dismissible) | Nothing — user knows the product |
| Default view with essential options | "Show advanced" toggle remembered | Advanced always visible (if user toggled it) |
| Confirmation dialogs for destructive actions | "Don't ask again" checkbox | Skip confirmation, rely on Undo |
Mode Design Rules
1. Zero modes is ideal — Can you achieve this without a mode? Try harder 2. One mode maximum per microinteraction — More creates confusion 3. Make the mode unmistakable — If the user can't tell which mode they're in at a glance, the design has failed 4. Prefer spring-loaded modes — Active only while held (long-press for selection mode, Shift for multi-select). Users always know because they're actively holding 5. One-off modes auto-revert — Use for rare, single actions. The mode fires once and returns to normal 6. Settings modes on separate screens — Don't interleave settings with primary interaction
---
Microinteraction Quality Checklist
When reviewing a microinteraction:
- [ ] Trigger is discoverable and its state is clear (normal, hover, disabled, updated)
- [ ] Data is brought forward where possible (badges, counts, current values on the trigger)
- [ ] Rules handle valid input, invalid input, empty input, and edge cases
- [ ] Smart defaults reduce work (remembered values, contextual pre-fill)
- [ ] Feedback is proportional to importance (subtle for routine, prominent for errors)
- [ ] Visual + auditory + haptic channels used appropriately (not relying on one alone)
- [ ] Feedback doesn't block interaction (toasts over modals; inline over interrupting)
- [ ] Modes are minimized (0-1) and clearly indicated
- [ ] Long loop considered (first use vs. regular use vs. return)
- [ ] Error prevention precedes error handling (constraints, smart parsing, forgiving formats)
- [ ] Undo is available for destructive actions (instead of confirmation dialogs)
- [ ] Keyboard accessible — interaction works without a mouse/touch
- [ ] Reduced motion alternative exists (instant state change, no animation)
Motion Principles
Animation principles adapted for UI, timing and easing guidelines, motion tokens, reduced motion, and platform motion patterns.
---
Purpose of Motion in UI
Motion serves four functions. If an animation doesn't serve at least one, remove it.
| Function | When to Use | Duration Range | Priority |
|---|---|---|---|
| Feedback | Confirming a user action | 100-200ms | Highest — directly responds to input |
| Orientation | Showing spatial relationships, navigation | 200-400ms | High — helps users understand where they are |
| Focus | Directing attention to changes | 150-300ms | Medium — guides the eye to what matters |
| Delight | Brand personality, celebration | 300-600ms | Lowest — earn it sparingly |
---
12 Animation Principles Adapted for UI
From Disney's principles (Thomas & Johnston), adapted for digital interfaces:
1. Timing
Speed conveys weight and importance. Fast = light, responsive. Slow = heavy, significant.
- UI rule: Direct-manipulation feedback under 200ms. Transitions 200-400ms. Never exceed 500ms for functional animation.
2. Easing (Slow In/Slow Out)
Nothing in the physical world starts or stops instantly. Motion should accelerate and decelerate.
- UI rule: Use ease-out for elements entering (arrive quickly, settle gently). Use ease-in for elements exiting (leave quickly). Use ease-in-out for elements moving on-screen.
3. Anticipation
A preparatory movement before the main action.
- UI rule: Use sparingly. A brief scale-up (102%) before a button bounce. A slight pull-back before a swipe animation. Overuse feels cartoonish.
4. Follow-Through
Elements don't stop dead — they overshoot slightly and settle.
- UI rule: Spring physics for playful interfaces. Subtle overshoot (2-5%) for toggle switches, modal appearances. Zero overshoot for data-heavy professional interfaces.
5. Staging
Present information so the audience knows where to look.
- UI rule: Animate one thing at a time. If multiple elements enter, stagger them (50-100ms delay between each). The most important element animates first.
6. Arcs
Natural movement follows curved paths, not straight lines.
- UI rule: Elements that move across the screen should follow a slight curve, especially for longer distances. Short movements (button press, toggle) can be linear.
7. Secondary Action
Supporting motion that adds richness without distracting.
- UI rule: When a card expands, its shadow grows as a secondary action. When a dialog opens, the background dims. These support but don't compete with the primary motion.
8. Squash and Stretch
Objects deform to convey weight and elasticity.
- UI rule: Very subtle in UI. A loading dot that stretches slightly as it bounces. A notification that squashes slightly on landing. Keep deformation under 10%.
9. Exaggeration
Amplify to make an action clear.
- UI rule: Error shake is exaggerated (wider displacement than a real head-shake would be). Success checkmark draws with emphasis. Subtle exaggeration makes intent clear.
10. Solid Drawing (Consistency)
Objects maintain consistent dimensionality.
- UI rule: Elements should maintain consistent proportions during animation. A card that scales up should scale uniformly. Shadows should remain physically plausible.
11. Appeal
Animation should be pleasing to watch.
- UI rule: Smooth easing curves. No jitter. No jarring speed changes. Motion should feel effortless.
12. Straight-Ahead vs. Pose-to-Pose
Either animate continuously or define key poses and interpolate.
- UI rule: Most UI animation is pose-to-pose (start state → end state, browser interpolates). Use straight-ahead only for physics simulations (drag, throw, bounce).
---
Timing Guidelines
Duration by Interaction Type
| Interaction | Duration | Easing | Notes |
|---|---|---|---|
| Button press feedback | 50-100ms | ease-out | Fastest. Color change, scale |
| Toggle switch | 150-200ms | ease-in-out | State swap animation |
| Tooltip appear | 100-150ms | ease-out | Quick in, don't delay information |
| Tooltip disappear | 75-100ms | ease-in | Faster exit than enter |
| Dropdown open | 150-200ms | ease-out | Reveals content |
| Dropdown close | 100-150ms | ease-in | Close is faster than open |
| Modal open | 200-300ms | ease-out | Fade + scale from 95% to 100% |
| Modal close | 150-200ms | ease-in | Fade + scale to 95% |
| Page transition | 250-350ms | ease-in-out | Slide, fade, or shared element |
| Skeleton → content | 150-200ms | ease-out | Crossfade. No layout shift |
| Notification enter | 200-300ms | ease-out (or spring) | Slide in + fade |
| Notification exit | 150-200ms | ease-in | Slide out + fade |
| Error shake | 400-600ms | spring | 2-3 oscillations, decreasing |
| Success checkmark | 400-600ms | ease-out | Draw + scale. Celebratory |
| Pull to refresh | Continuous | spring | Follows finger, bounces on release |
| Scroll momentum | Physics-based | deceleration | Matches platform behavior |
Easing Curves
| Name | CSS Value | Use |
|---|---|---|
| Standard | cubic-bezier(0.2, 0, 0, 1) | Most transitions. Moving elements on screen |
| Enter (decelerate) | cubic-bezier(0, 0, 0.2, 1) | Elements appearing, fading in, sliding in |
| Exit (accelerate) | cubic-bezier(0.4, 0, 1, 1) | Elements leaving, fading out, sliding out |
| Linear | linear | Opacity fades. Progress bars. Color transitions |
| Spring | Varies by framework | Bouncy, playful. Toggles, notifications, celebrations |
The Rule of Asymmetry
Enter slower, exit faster. Arrival is celebrated; departure is swift.
- Modal opens: 250ms. Modal closes: 150ms
- Tooltip appears: 150ms. Tooltip disappears: 100ms
- Sidebar opens: 300ms. Sidebar closes: 200ms
---
Motion Tokens
Standardize timing across the design system:
motion-duration-instant: 0ms (no animation)
motion-duration-fast: 100ms (hover, toggle)
motion-duration-normal: 200ms (open, appear, state change)
motion-duration-slow: 300ms (page transition, complex reveal)
motion-duration-slower: 400ms (celebration, complex orchestration)
motion-easing-standard: cubic-bezier(0.2, 0, 0, 1)
motion-easing-enter: cubic-bezier(0, 0, 0.2, 1)
motion-easing-exit: cubic-bezier(0.4, 0, 1, 1)
motion-easing-linear: linear---
Reduced Motion
prefers-reduced-motion
Users who set "Reduce motion" in their OS settings have told you they don't want unnecessary animation. Respect it.
Minimum response (required):
- Remove all transform-based animations (slide, scale, bounce, rotate)
- Remove parallax effects
- Keep opacity fades (cross-fade is acceptable)
- Instant state changes where animation existed
Ideal response:
- Replace motion with instant state changes
- Replace slide-in panels with instant appearance
- Replace animated progress with static progress bars
- Keep functional feedback (loading spinners can remain but should not bounce/pulse)
- Reduce auto-playing media
Implementation
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
}
}Override selectively for truly essential animations (like a loading spinner that needs to spin).
---
Platform Motion Conventions
Material Design 3
- Container transforms: Shared-element transitions between screens. A card expands into a detail page, maintaining spatial continuity
- Fade through: For unrelated transitions. Element fades out, new element fades in. 300ms total (150 out + 150 in)
- Shared axis: For related transitions (wizard steps, tabs). Content slides along the shared axis of navigation
Apple HIG
- Fluid transitions: Elements morph between states rather than cutting. Navigation push/pop uses edge-to-edge slide
- Spring animations: iOS uses spring physics for many interactions (sheet pull-down, notification bounce). Damping ~0.7, stiffness varies
- Contextual: Transitions reflect the spatial relationship between the trigger and the destination
Product Behavior
Product postures, smart and considerate behavior, orchestration, flow, and excise elimination. Based on Alan Cooper's About Face.
---
Product Postures
Sovereign Applications
Apps that monopolize attention for extended periods. Users keep them running continuously, often maximized.
Examples: Email clients, IDEs, design tools, spreadsheets, project management.
Design rules:
- Be generous with screen real estate — Use the full screen. Dense information display is appropriate
- Muted visual style — Users stare at these for hours. Avoid saturated colors for chrome. Reserve color for data and status
- Rich input support — Direct manipulation, keyboard shortcuts, customizable toolbars. Target perpetual intermediates
- Rich feedback — Detailed status bars, progress indicators, inline validation. Users are invested enough to want detailed information
- Design for documents — Maximize content area. Minimize UI chrome
- Provide multiple command modalities — Menus (discoverable), toolbars (accessible), keyboard shortcuts (fast)
Transient Applications
Apps that appear briefly, serve a purpose, and disappear. Users don't invest in learning them.
Examples: Calculators, settings panels, dialog boxes, dashboard widgets, installers.
Design rules:
- Make it immediately obvious — Users won't learn your transient app. It must be self-evident
- Bright and clear visual style — Unlike sovereign apps, transient ones should be visually distinctive to draw attention and communicate quickly
- Minimal options — Show only what's needed for this interaction
- Remember user choices — Even though it's transient, remember settings between sessions
- Fast to invoke, fast to dismiss — Keyboard shortcut to open. Escape to close. Click outside to dismiss
Daemonic Applications
Apps that run invisibly in the background, serving without user interaction.
Examples: Print spoolers, backup services, sync agents, virus scanners, notification services.
Design rules:
- Invisible when working correctly — Don't notify users of routine success
- Surface immediately when there's a problem — A failed backup requires attention
- Configure via transient settings panel — System preferences, control panels
- Provide status on demand — Menu bar icon, system tray indicator. Users should be able to check status when they want, not be force-fed it
- Fail gracefully and recover automatically — Retry before alerting. Only alert the user when human intervention is actually needed
---
Smart and Considerate Product Behavior
Considerate Products (Cooper)
Design products that behave like a thoughtful human colleague:
| Principle | What It Means | Example |
|---|---|---|
| Take an interest | Remember habits and everything the user tells you | Remember last-used settings, recently accessed files, preferred views |
| Be forthcoming | Volunteer useful information at appropriate moments | "You have a meeting in 15 minutes" — without being asked |
| Anticipate needs | Predict what the user will do based on what they've done | Pre-download the next page, pre-populate related fields |
| Use common sense | Don't do obviously wrong things | Don't auto-save an empty file over a full one |
| Be conscientious | Remember details and stay consistent | Same interaction works the same way everywhere |
| Don't burden with internal problems | Handle technical issues internally | Retry a failed network request before showing an error |
| Keep informed | Provide status without being asked | Background processes show progress in the status bar |
| Fail gracefully | When things go wrong, recover or degrade with dignity | Save a draft before crashing. Restore state on restart |
| Help avoid mistakes | Prevent errors rather than reporting them | Gray out unavailable options. Constrain inputs to valid ranges |
| Take responsibility | Treat user mistakes as system design failures | "We couldn't process your request" not "Invalid input" |
Smart Products
| Principle | Implementation |
|---|---|
| Put idle cycles to work | Pre-compute, prefetch, index, compress while user isn't actively requesting |
| Remember everything | If the user configured it, the app remembers it. File locations, window sizes, sort orders, view preferences |
| Use task coherence | What the user did yesterday is likely similar to what they'll do today. Use recent behavior as the basis for defaults |
| Multi-session memory | Undo history, recent files, draft recovery should persist across sessions |
| Predictive behavior | Autocomplete, smart suggestions, pre-filled forms based on context |
---
Orchestration
Definition
All elements in an interface must work together coherently. When orchestration is good, the interface becomes invisible — users focus on their work, not on the tool.
Orchestration Principles
1. Follow mental models — Design based on how users think, not how the system is built. The represented model (what users see) should match the mental model (what users expect), not the implementation model (how it actually works) 2. Provide choices, don't ask questions — "Bold / Italic / Underline" toggles > "How would you like to format this text?" dialog 3. Keep tools close at hand — Contextual toolbars near selection. Right-click menus at cursor. Inline editing where the content lives 4. Provide modeless feedback — Status information visible in the interface, not in dialog boxes. Errors inline, not in pop-ups where possible 5. Design for the probable, anticipate the possible — Optimize the most common path. Make the edge case possible but not in the way 6. Reflect status — Every data object and process should communicate its current state through visual cues 7. Avoid blank slates — Empty screens should guide users toward action: "No projects yet. Create your first project to get started" 8. Differentiate command from configuration — Commands (action buttons, direct manipulation) are for regular use. Configuration (settings panels) is for occasional setup. Don't mix them
---
Flow
What Breaks Flow
| Flow Breaker | Why It's Damaging | Alternative |
|---|---|---|
| Modal error dialogs | Stop all work. Force the user to deal with the system's problem | Inline errors. Auto-recovery. Undo |
| Confirmation dialogs | Interrupt for routine actions. Users learn to click "OK" without reading | Undo instead of permission |
| Context switching | Navigating away from current work to perform a related function | In-context panels, popovers, inline editing |
| Re-entering data | Typing information the system already has | Auto-fill, smart defaults, remembered values |
| Waiting without feedback | User doesn't know if the system is working | Immediate skeleton/spinner, progress indication |
| Required sequential steps | Forcing users through a wizard when they know what they want | Allow direct access for experienced users. Wizard for first-timers |
| Unnecessary notifications | Alerts for non-urgent information | Quiet indicators (badges, dots). Reserve alerts for urgent items |
---
Excise Audit
How to Conduct an Excise Audit
1. Define the goal path — What is the user trying to accomplish? Map the ideal path from intent to completion 2. Map the actual path — Walk through the current product interaction step by step 3. Label each step — Is it goal-directed (directly advancing the user's objective) or excise (overhead that doesn't contribute)? 4. Categorize excise — Cognitive, memory, visual, or physical? 5. Score severity — How much does this excise cost the user in time, effort, or frustration? 6. Prioritize elimination — Highest-severity excise that affects the most users first
Excise Reduction Techniques
| Excise Type | Reduction Technique |
|---|---|
| Cognitive | Clear labels. Consistent patterns. Match mental models. Reduce jargon |
| Memory | Remember settings. Show recent items. Auto-fill. Provide search |
| Visual | Clear hierarchy. Adequate contrast. Group related elements. Reduce clutter |
| Physical | Reduce clicks. Shorten navigation paths. Provide shortcuts. Use inline editing |
| Navigational | Flatten hierarchies. Combine related screens. Use tabs instead of pages |
| Modal | Replace dialogs with inline actions. Undo instead of confirm. Auto-save instead of manual save |
The "Do It, Don't Ask" Principle
Whenever the system can make a reasonable decision on the user's behalf:
| Instead of | Do This |
|---|---|
| "Where would you like to save?" | Save to last-used location. Let user move later |
| "What format?" | Default to most common format. Let user change if needed |
| "Are you sure you want to delete?" | Delete immediately. Provide Undo for 10 seconds |
| "Would you like to enable notifications?" | Enable sensible defaults. Let user adjust in settings |
| "Session expired. Please log in again" | Refresh token silently. Only ask for credentials when necessary |
State and Transitions
State machines for UI, gesture patterns, keyboard interaction, drag-and-drop, and responsive behavior.
---
State Machines for UI
Why State Machines
Most interaction bugs are state bugs: the UI shows something that shouldn't be possible, or transitions between states are missing or broken. Modeling interactions as state machines prevents this by making states explicit and transitions enumerable.
Anatomy of a State Machine
States: The finite set of conditions the UI can be in
Events: User actions or system events that trigger transitions
Transitions: Movement from one state to another in response to an event
Actions: Side effects that happen during a transition (API calls, animations, data updates)
Guards: Conditions that must be true for a transition to occurBuilding a State Machine
Step 1: List all possible states
For a form submission:
Idle → Editing → Validating → Submitting → Success → ErrorStep 2: List all events
user_types, user_submits, validation_passes, validation_fails,
server_responds_ok, server_responds_error, user_retries, user_resetsStep 3: Define transitions
| From State | Event | To State | Action |
|---|---|---|---|
| Idle | user_types | Editing | Enable submit button |
| Editing | user_submits | Validating | Run client-side validation |
| Validating | validation_passes | Submitting | Send API request |
| Validating | validation_fails | Editing | Show inline errors |
| Submitting | server_responds_ok | Success | Show success message |
| Submitting | server_responds_error | Error | Show error + retry option |
| Error | user_retries | Submitting | Resend API request |
| Error | user_resets | Idle | Clear form |
| Success | user_resets | Idle | Clear form |
Step 4: Verify impossible states
Check that the machine prevents nonsensical combinations:
- Can't submit while already submitting (no transition from Submitting on user_submits)
- Can't show success and error simultaneously (they're different states)
- Can't edit while submitting (Submitting only transitions on server events)
Parallel States
Some UI elements have independent state dimensions that operate simultaneously:
Form State: Idle | Editing | Submitting | Success | Error
Connection State: Online | Offline | Reconnecting
Sidebar State: Open | ClosedThese run in parallel. The form can be in "Editing" while the connection is "Offline" and the sidebar is "Closed." Model them as separate machines, not one combined machine (which would have state explosion).
Nested States (Statecharts)
When a state has sub-states, use David Harel's statecharts:
Authenticated
├── Dashboard
│ ├── Overview (default)
│ └── Detailed
├── Settings
│ ├── Profile
│ └── Notifications
└── Editor
├── Editing
└── PreviewingThe user is always in "Authenticated" AND one of its child states. Entering "Authenticated" defaults to "Dashboard > Overview." This reduces the number of transitions needed.
---
Gesture Patterns
Touch Gesture Catalog
| Gesture | Fingers | Motion | Standard Action | Discoverability |
|---|---|---|---|---|
| Tap | 1 | Touch + release | Select, activate | High — visible targets |
| Double tap | 1 | 2 rapid taps | Zoom in, select word | Medium — learned convention |
| Long press | 1 | Touch + hold (>500ms) | Context menu, selection mode, drag start | Low — always provide visible alternative |
| Swipe | 1 | Touch + horizontal/vertical drag | Navigate, dismiss, reveal actions | Medium — hints help on first use |
| Drag | 1 | Touch + move continuously | Reorder, move, resize | Low — needs affordance (handle icon) |
| Pinch | 2 | Two fingers move toward each other | Zoom out | Low — learned convention |
| Spread | 2 | Two fingers move apart | Zoom in | Low — learned convention |
| Rotate | 2 | Two fingers rotate around center | Rotate image/object | Very low — use only for spatial apps |
| Edge swipe | 1 | Swipe from screen edge | System navigation (back, drawer) | Low — platform-specific |
Swipe Action Patterns
For list items with swipe-to-reveal actions:
| Direction | Convention | Example |
|---|---|---|
| Swipe left | Destructive/secondary action | Delete, archive, dismiss |
| Swipe right | Constructive/primary action | Mark as done, accept, favorite |
| Partial swipe | Reveal action buttons | Show "Delete" and "Archive" buttons |
| Full swipe | Execute most common action | Swipe fully right to mark as read |
Rules:
- Show a preview of the action during the swipe (icon + color + label)
- Provide haptic feedback at the commitment threshold
- Allow the user to cancel by reversing the swipe before releasing
- Never make swipe the only way to access an action
Drag and Drop
During drag:
- Element elevates (shadow increase) to show it's "lifted"
- Ghost/placeholder remains at origin to show where it came from
- Valid drop targets highlight as the element passes over them
- Invalid areas dim or show a "forbidden" cursor
On drop:
- Element animates to its new position (200-300ms ease-out)
- Origin placeholder collapses
- System provides feedback (haptic + visual) confirming the move
Keyboard alternative:
- Select item with Space/Enter
- Move with Arrow keys
- Confirm placement with Space/Enter
- Cancel with Escape
---
Keyboard Interaction
Focus Management
| Principle | Implementation |
|---|---|
| Visible focus | 2px focus ring, 3:1 contrast. Never remove :focus styles without replacement |
| Logical tab order | Tab follows visual reading order (left-to-right, top-to-bottom in LTR layouts) |
| Focus trapping | Modal dialogs trap focus inside. Tab from last element returns to first. Escape closes |
| Focus restoration | When a modal/popover closes, return focus to the element that opened it |
| Skip navigation | "Skip to main content" link as first focusable element on pages |
| Focus on dynamic content | When content loads or changes, move focus to the new content or announce it |
Standard Keyboard Patterns
| Key | Standard Action |
|---|---|
| Tab | Move focus to next interactive element |
| Shift+Tab | Move focus to previous interactive element |
| Enter | Activate focused button/link. Submit form |
| Space | Toggle checkbox/toggle. Activate button. Scroll page (no focused element) |
| Escape | Close modal/popover/dropdown. Cancel current action. Exit mode |
| Arrow keys | Navigate within a component (tabs, menus, radio groups, grids) |
| Home/End | First/last item in a list, menu, or tab set |
Roving Tabindex
For composite widgets (tab bars, toolbars, menus):
- The component itself gets one tab stop
- Arrow keys navigate between items within the component
- This prevents Tab from walking through every item in a long list
---
Responsive Interaction Behavior
Adaptation by Input Method
| Input | Characteristics | Design Adjustments |
|---|---|---|
| Mouse | Precise, hover available, right-click | Small targets OK (min 24px). Hover states. Context menus |
| Touch | Imprecise, no hover, gestures available | Large targets (min 44px). Long-press for context. Swipe gestures |
| Keyboard | Sequential, no pointing | Visible focus, logical tab order, keyboard shortcuts |
| Voice | Hands-free, error-prone | Clear confirmation, undo, disambiguation |
| Gamepad | D-pad navigation, limited buttons | Focus-based navigation, large selection areas, simple actions |
Adaptation by Screen Size
| Breakpoint | Interaction Changes |
|---|---|
| Desktop (>1024px) | Multi-column layouts. Hover interactions. Side panels. Drag and drop. Keyboard shortcuts prominent |
| Tablet (768-1024px) | Touch-optimized. Larger tap targets. Swipe gestures. Reduced hover dependency. Collapsible panels |
| Mobile (<768px) | Single column. Bottom navigation. Full-screen modals. Sheet-style panels. Pull to refresh. Gesture-heavy |
Interaction Breakpoints
Some interactions should fundamentally change at certain screen sizes:
| Desktop | Mobile |
|---|---|
| Hover dropdown menu | Tap to open, tap to close |
| Drag-and-drop reorder | Hold-to-drag or explicit "Edit order" mode |
| Right-click context menu | Long-press or "..." overflow button |
| Multi-select with Ctrl+Click | Selection mode toggle + tap to select |
| Side-by-side comparison | Swipe between / toggle between |
| Tooltips on hover | Tap-and-hold or info icon |
Microinteraction Spec: [Interaction Name]
Component/Feature: [Where this interaction lives] Version: [1.0.0] Owner: [Person] Last updated: [Date]
---
Goal
[One sentence: What is the user trying to accomplish with this interaction?]
---
1. Trigger
Type
[ ] Manual (user-initiated) / [ ] System (automatic)
Mechanism
[How is the interaction initiated? Button, toggle, gesture, keyboard shortcut, system event, time-based?]
Trigger States
| State | Visual Treatment | When |
|---|---|---|
| Default | [Description] | Ready to be activated |
| Hover | [Description] | Cursor over (desktop) |
| Focus | [Description] | Keyboard navigation |
| Active | [Description] | Being pressed |
| Disabled | [Description] | Not currently available |
| Updated | [Description] | Something changed since last interaction |
Data Brought Forward
[What information is shown on the trigger before activation? Badge count, current value, status?]
---
2. Rules
Primary Action
[What happens when the trigger is activated?]
Sequence
1. [First thing that happens] 2. [Second thing] 3. [Third thing] 4. [Final state]
User Controls
[What can the user adjust? Parameters, options, settings?]
Constraints
[What can't the user do? Limits, disabled actions, maximum values?]
Smart Defaults
[What values are pre-filled or remembered? What does the system infer?]
Edge Cases
| Edge Case | Handling |
|---|---|
| Empty input | [What happens] |
| Maximum value exceeded | [What happens] |
| Network failure during action | [What happens] |
| Action interrupted (user navigates away) | [What happens] |
| Concurrent action by another user | [What happens] |
| [Other edge case] | [What happens] |
How It Ends
[What state does the system return to after the interaction completes?]
What the System Remembers
[What values, settings, or choices does the system remember for next time?]
---
3. Feedback
Visual Feedback
| Moment | Feedback | Duration | Intensity |
|---|---|---|---|
| Trigger activated | [Description] | [ms] | [Subtle/Moderate/Strong] |
| Processing | [Description] | [Until complete] | [Intensity] |
| Success | [Description] | [ms or auto-dismiss time] | [Intensity] |
| Error | [Description] | [Until resolved] | [Intensity] |
Auditory Feedback
[If applicable: What sounds play and when? Is there a mute option?]
Haptic Feedback
[If applicable: What vibration patterns and when?]
Motion
| Animation | Duration | Easing | Reduced Motion Alternative |
|---|---|---|---|
| [Description] | [ms] | [Curve] | [Instant state change / fade only] |
| [Description] | [ms] | [Curve] | [Alternative] |
Tokens Used
[Token references for colors, durations, easing curves]---
4. Loops & Modes
Loops
| Type | Behavior |
|---|---|
| Retry on failure | [How many times? Backoff strategy?] |
| Auto-refresh | [Does it poll? At what interval?] |
| Repeat | [Can the user repeat the action? How?] |
Modes
[Are there any modes? If so, describe each:]
| Mode | Trigger | Indicator | How to Exit |
|---|---|---|---|
| [Mode name] | [How user enters] | [How they know they're in it] | [How they leave] |
Long Loop (Lifecycle)
| Phase | Behavior |
|---|---|
| First use | [Onboarding hints? Guided defaults?] |
| Regular use | [Streamlined? Reduced feedback?] |
| Return after absence | [Re-orientation? What's changed?] |
| Power user | [Shortcuts? Advanced options?] |
---
5. Accessibility
| Requirement | Implementation |
|---|---|
| Keyboard trigger | [Key or key combination] |
| Focus management | [Where does focus go?] |
| Screen reader announcement | [What is announced at each stage?] |
| Color independence | [How is information conveyed without color?] |
| Reduced motion | [Alternative for prefers-reduced-motion] |
| Touch target | [Minimum size] |
---
6. State Machine
[State diagram showing all states and transitions]
Example:
[Idle] --trigger--> [Processing] --success--> [Complete]
--error--> [Error]
[Error] --retry--> [Processing]
[Complete] --reset--> [Idle]---
Related Interactions
| Interaction | Relationship |
|---|---|
| [Name] | [How they relate — triggers after, alternative path, etc.] |
State Inventory: [Feature/Screen Name]
Date: [Date] Auditor: [Name] Scope: [Which screen, feature, or flow is covered]
---
Instructions
For every interactive element in the feature, document all possible states. Use this template to identify missing states — any cell with "Not designed" represents a potential bug or poor user experience.
---
Interactive Elements
[Element 1 Name] (e.g., "Save Button")
| State | Designed? | Visual Treatment | Notes |
|---|---|---|---|
| Default | [ ] Yes / [ ] No | [Description] | |
| Hover | [ ] Yes / [ ] No / [ ] N/A | [Description] | N/A for touch-only |
| Focus | [ ] Yes / [ ] No | [Description] | Must have visible focus ring |
| Active/Pressed | [ ] Yes / [ ] No | [Description] | |
| Disabled | [ ] Yes / [ ] No | [Description] | When is it disabled? |
| Loading | [ ] Yes / [ ] No / [ ] N/A | [Description] | |
| Success | [ ] Yes / [ ] No / [ ] N/A | [Description] | |
| Error | [ ] Yes / [ ] No / [ ] N/A | [Description] |
[Element 2 Name] (e.g., "Email Input")
| State | Designed? | Visual Treatment | Notes |
|---|---|---|---|
| Empty (placeholder) | [ ] Yes / [ ] No | [Description] | |
| Focused (empty) | [ ] Yes / [ ] No | [Description] | |
| Filled (valid) | [ ] Yes / [ ] No | [Description] | |
| Filled (invalid) | [ ] Yes / [ ] No | [Description] | When validated? |
| Disabled | [ ] Yes / [ ] No | [Description] | |
| Read-only | [ ] Yes / [ ] No / [ ] N/A | [Description] | |
| Error (with message) | [ ] Yes / [ ] No | [Description] | Message text? |
[Element 3 Name] (e.g., "Data Table")
| State | Designed? | Visual Treatment | Notes |
|---|---|---|---|
| Loading | [ ] Yes / [ ] No | [Description] | Skeleton? Spinner? |
| Empty (no data) | [ ] Yes / [ ] No | [Description] | What CTA? |
| Populated | [ ] Yes / [ ] No | [Description] | |
| Error (failed to load) | [ ] Yes / [ ] No | [Description] | Retry option? |
| Filtered (no results) | [ ] Yes / [ ] No | [Description] | Clear filters CTA? |
| Selected row(s) | [ ] Yes / [ ] No | [Description] | Bulk actions? |
| Sorting | [ ] Yes / [ ] No | [Description] | Active sort indicator? |
[Repeat for each interactive element]
---
Page-Level States
| State | Designed? | Description | Notes |
|---|---|---|---|
| First visit (new user) | [ ] Yes / [ ] No | [Description] | Onboarding? |
| Populated (normal use) | [ ] Yes / [ ] No | [Description] | |
| Loading (initial) | [ ] Yes / [ ] No | [Description] | Full skeleton? |
| Loading (refresh) | [ ] Yes / [ ] No | [Description] | Partial? Pull-to-refresh? |
| Offline | [ ] Yes / [ ] No | [Description] | Cached data? Banner? |
| Error (page-level) | [ ] Yes / [ ] No | [Description] | Retry? Fallback? |
| Unauthorized | [ ] Yes / [ ] No | [Description] | Login prompt? Request access? |
| Responsive (mobile) | [ ] Yes / [ ] No | [Description] | Layout changes? |
| Responsive (tablet) | [ ] Yes / [ ] No | [Description] | |
| [ ] Yes / [ ] No / [ ] N/A | [Description] |
---
Transitions
| From State | To State | Trigger | Animation | Duration |
|---|---|---|---|---|
| Loading | Populated | Data received | [Crossfade/slide/none] | [ms] |
| Populated | Loading | Refresh triggered | [Description] | [ms] |
| Populated | Error | Request failed | [Description] | [ms] |
| Error | Loading | Retry clicked | [Description] | [ms] |
| [From] | [To] | [Trigger] | [Animation] | [Duration] |
---
Coverage Summary
| Category | Total States | Designed | Missing | Coverage |
|---|---|---|---|---|
| Element states | [#] | [#] | [#] | [%] |
| Page-level states | [#] | [#] | [#] | [%] |
| Transitions | [#] | [#] | [#] | [%] |
| Total | [#] | [#] | [#] | [%] |
---
Priority Gaps
List the most impactful missing states:
| # | Missing State | Element | Impact | Priority |
|---|---|---|---|---|
| 1 | [Description] | [Element] | [User impact if not designed] | [High/Med/Low] |
| 2 | [Description] | [Element] | [Impact] | [Priority] |
| 3 | [Description] | [Element] | [Impact] | [Priority] |