
Microinteractions
- 6 installs
- 33 repo stars
- Updated July 27, 2026
- dirnbauer/webconsulting-skills
This is a copy of microinteractions by wondelai - installs and ranking accrue to the original listing.
Helps with ai & agent building tasks.
About
microinteractions is a Claude Code skill for ai & agent building. It helps solo builders move faster with AI-assisted coding.
- microinteractions
- AI & Agent Building
- AI-coding skill
Microinteractions by the numbers
- 6 all-time installs (skills.sh)
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/dirnbauer/webconsulting-skills --skill microinteractionsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 6 |
|---|---|
| repo stars | ★ 33 |
| Last updated | July 27, 2026 |
| Repository | dirnbauer/webconsulting-skills ↗ |
What it does
Helps with ai & agent building tasks.
Files
Microinteractions Framework
Design the tiny, contained product moments users touch every day -- toggles, password fields, loading indicators, pull-to-refresh, like buttons. Based on Dan Saffer's four-part structure (Trigger, Rules, Feedback, Loops & Modes), this framework turns invisible details into the polish that separates forgettable products from beloved ones.
Core Principle
The difference between a product you tolerate and a product you love is almost always in the microinteractions. A microinteraction is a contained moment built around a single use case -- changing a setting, syncing data, picking a password -- so small that users rarely think about it consciously, but they feel it. Every microinteraction follows the same four-part structure: a Trigger initiates it, Rules determine what happens, Feedback shows what is happening, and Loops & Modes define its long-term behavior.
Scoring
Goal: 10/10. Rate microinteractions 0-10 against the principles below: a 10/10 gives every interactive moment a deliberate trigger, clear rules, immediate feedback, and thoughtful loop/mode behavior. Always state the current score and the specific improvements needed to reach 10/10.
The Microinteraction Structure
Six areas of focus for designing world-class microinteractions:
1. Triggers
Core concept: The trigger initiates a microinteraction -- manual (tap, click, swipe, voice command) or system-initiated (time, location, incoming data, error state). It is the front door of every microinteraction.
Why it works: Without a clear trigger, users cannot discover or initiate the interaction, and the product cannot respond to changing conditions. Well-designed triggers make functionality discoverable and set accurate expectations.
Key insights:
- A trigger must communicate three things: that it exists, what it does, and what state it is in
- Match trigger prominence to action importance -- high-stakes actions need prominent triggers
- Pair invisible triggers (gestures, shake, proximity) with a visible alternative for discoverability
- Make trigger states -- default, hover, active, disabled, loading -- visually distinct
Product applications:
| Context | Application | Example |
|---|---|---|
| Toggle controls | Manual trigger with binary state | iOS Wi-Fi switch: tap to toggle, position shows state |
| Pull-to-refresh | Hidden gesture with visible affordance | Pull past threshold triggers refresh animation |
| System alerts | System trigger on condition met | Low battery notification at 20% threshold |
Ethical boundary: Never hide critical triggers behind gestures or invisible interactions without a visible fallback.
See: references/trigger-design.md for trigger affordances, states, placement, and reducing trigger complexity.
2. Rules
Core concept: Rules define what happens once a microinteraction is triggered -- the sequence of events, constraints, processing, and ending. Users never see rules directly, but they feel when rules are wrong.
Why it works: Rules create the mental model users build about how the interaction works. Consistent rules that match expectations feel natural; violations -- a toggle that does not toggle, a slider that jumps in value -- destroy trust.
Key insights:
- Define the goal of the microinteraction first, then derive rules from it
- Match existing mental models and platform conventions
- Constrain inputs to prevent errors: limit character counts, set value ranges, enforce formats
- Handle edge cases explicitly: zero, maximum, repeated triggers, interruption
Product applications:
| Context | Application | Example |
|---|---|---|
| Password strength | Rules evaluate input in real-time | Meter updates as user types; color shifts red to green |
| Character counter | Rule constrains and shows remaining | Twitter/X: counter decreases, turns red at limit |
| Undo action | Rule sets time window for reversal | Gmail "Undo send" available for 30 seconds |
Ethical boundary: Keep rules transparent and predictable -- never hide rules that manipulate behavior, such as making unsubscribe harder than subscribe.
See: references/rules-and-state.md for state management, constraints, error states, and edge cases.
3. Feedback
Core concept: Feedback communicates the rules to the user, answering "What is happening right now?" -- visually (color, animation, movement), aurally (clicks, chimes), or haptically (vibration). Show only what matters: minimal, meaningful, contextual.
Why it works: Without feedback, users cannot tell if their action registered, the system is working, or the operation succeeded. Too little feedback creates anxiety; too much creates noise; the right feedback at the right time makes interactions feel responsive and trustworthy.
Key insights:
- Feedback must be immediate -- under 100ms for direct manipulation
- Use the least noticeable feedback that still communicates, and prefer animating existing elements (the button itself, not a separate toast)
- Scale feedback to event significance: small action = small feedback, big result = big feedback
- Visual feedback is primary; audio and haptic are supplementary, never the only channel
- Progress indicators reduce perceived wait time even when actual time is unchanged
Product applications:
| Context | Application | Example |
|---|---|---|
| Button press | Visual state change on click | Button depresses, color shifts, text becomes "Saving..." |
| Form validation | Inline feedback as user types | Green checkmark next to valid email field |
| Error state | Contextual error near the source | Red border on field + "Password must be 8+ characters" |
Ethical boundary: Keep feedback honest -- no fake progress bars, manipulative countdowns, or deceptive completion percentages.
See: references/feedback-patterns.md for feedback channels, timing, and preventing overload.
4. Loops and Modes
Core concept: Loops are the meta-rules over time -- does the interaction change after the 100th use, expire, adapt? Modes are forks in the rules where the same control temporarily behaves differently (edit mode vs. view mode).
Why it works: Thoughtful loops let microinteractions mature gracefully -- reducing friction for power users while staying discoverable for new ones. Modes, used sparingly, let one control serve multiple purposes without cluttering the interface.
Key insights:
- Open loops continue until explicitly stopped (a repeating alarm); closed loops run once and end (a timer)
- Long loops change the interaction over time: first use shows a tooltip; the 50th does not
- Progressive reduction: strip away scaffolding as users demonstrate mastery
- Modes are dangerous -- they violate "same action, same result"; minimize them and make the current mode highly visible (Caps Lock indicator, edit banner)
Product applications:
| Context | Application | Example |
|---|---|---|
| Onboarding tooltips | Long loop removes hints after N uses | First 3 sessions show "Swipe to archive"; then stop |
| Alarm clock | Open loop repeats until disabled | Fires every weekday at 7am until toggled off |
| Text editing | Mode: view vs. edit | Banner reads "Editing" with a "Done" button to exit |
Ethical boundary: Loops should benefit the user, not the business -- never adapt loops to ramp up notifications or make opt-outs progressively harder.
See: references/loops-modes.md for long loops, mode errors, and progressive complexity.
5. Signature Moments
Core concept: A signature moment is a microinteraction so distinctive it becomes part of the product's identity -- the Facebook Like, slide-to-unlock, Slack's loading messages. Every product should have one or two; not every interaction should be one.
Why it works: Signature moments create emotional memory and make products feel crafted rather than assembled. They are what users demonstrate first when describing your product to others.
Key insights:
- Put signature moments on frequent, visible actions -- not buried settings
- Functional first, delightful second -- never sacrifice usability for novelty
- Animation, sound, and copy are the three most common tools
- Align with brand personality: playful brands get playful moments
- Apply the removal test: if users would not miss it, it is decoration, not signature
Product applications:
| Context | Application | Example |
|---|---|---|
| Social reaction | Animated response to engagement | Facebook Like: thumbs-up animates with particles |
| Loading state | Branded waiting experience | Slack: rotating quotes during load |
| Completion | Celebratory confirmation | Stripe payment: animated checkmark with confetti |
Ethical boundary: Never obscure important information or delay the user to show off an animation -- function precedes delight.
See: references/signature-moments.md for when to invest and making mundane interactions delightful.
6. Reducing and Simplifying
Core concept: The best microinteraction is barely noticed because it is so simple and fast. Reduce (fewer options, steps, decisions), then simplify what remains until it feels effortless.
Why it works: Every option, field, and decision adds cognitive load -- users do not want to configure a toggle, they want it to work. The most elegant microinteractions have zero configuration, one action, and immediate results.
Key insights:
- If a microinteraction needs instructions, it is too complex
- Remove options with smart defaults -- pick the best choice and commit to it
- Collapse multi-step interactions into a single action where possible
- Use progressive disclosure: show simple first, reveal complexity only on request
- Keep rule count proportional to frequency of use: common actions need few rules
Product applications:
| Context | Application | Example |
|---|---|---|
| Smart defaults | Eliminate configuration | Camera app opens in photo mode, not settings |
| Single action | One tap replaces multi-step flow | Double-tap to like instead of menu + select reaction |
| Anticipatory design | Predict and pre-fill | Shipping form fills city and state from ZIP code |
Ethical boundary: Do not auto-opt users into business-serving features or remove control over meaningful choices.
Common Mistakes
| Mistake | Why It Fails | Fix |
|---|---|---|
| No feedback on action | Users cannot tell if their tap registered | Add immediate visual state change to every interactive element |
| Overdesigning simple moments | Complex animations slow frequent actions | Reserve rich animation for infrequent, high-impact moments |
| Ignoring edge cases | Interaction breaks at zero, max, or double-tap | Map every state: empty, loading, partial, full, error, disabled |
| Invisible triggers | Users cannot discover functionality | Pair gesture triggers with a visible alternative |
| Mode errors | Same action gives different results based on hidden state | Make current mode visible; minimize modes |
| Ignoring long loops | Interaction feels identical on day 1 and day 100 | Use progressive reduction for returning users |
| Feedback overload | Every action triggers a toast, sound, or animation | Use the smallest feedback that communicates |
| Fake progress indicators | Users feel deceived when they discover the bar is fake | Use honest, deterministic progress; indeterminate spinner when unknown |
Quick Diagnostic
Audit any microinteraction:
| Question | If No | Action |
|---|---|---|
| Is there a clear, discoverable trigger? | Users cannot initiate the interaction | Add a visible control or affordance |
| Does the trigger show its current state? | Users cannot tell if it is on, off, or loading | Add distinct visual states for every trigger state |
| Are the rules simple and predictable? | Users are confused by what happened | Simplify rules; match platform conventions |
| Is there immediate feedback? | Users question whether their action worked | Add visual response within 100ms |
| Does feedback match the event's significance? | Small actions feel dramatic, or big results feel trivial | Scale feedback to event importance |
| Does the interaction evolve over time? | Power users still see beginner hints | Add progressive reduction through long loops |
| Is the interaction free of unnecessary modes? | Users perform the wrong action in the wrong mode | Remove modes or make the current mode highly visible |
| Could a first-time user figure it out without help? | Interaction needs explanation | Simplify or add a one-time hint via long loop |
Reference Files
- trigger-design.md: Manual and system triggers, trigger affordances, trigger states, invisible trigger design, placement and visibility
- rules-and-state.md: Defining rules, state management, constraints, error states, edge cases
- feedback-patterns.md: Visual, audio, and haptic feedback, timing, progressive disclosure, preventing overload
- loops-modes.md: Open and closed loops, long loops, modes, mode errors, progressive complexity
- signature-moments.md: Brand-defining microinteractions, examples, when to invest, making mundane interactions delightful
- case-studies.md: Detailed design breakdowns of form submission, toggle/switch, pull-to-refresh, loading states, and notifications
Further Reading
This skill is based on Dan Saffer's definitive guide to designing with details:
- *"Microinteractions: Designing with Details"* by Dan Saffer
About the Author
Dan Saffer is a designer and design leader who has led teams at Twitter, Jawbone, and Smart Design. His book Microinteractions codified the framework design teams worldwide use to audit, design, and improve the small details that make products feel polished and alive. He also wrote Designing for Interaction and Designing Gestural Interfaces.
---
Credits & Attribution
This skill is based on the excellent work by [wondelai](https://github.com/wondelai).
Original repository: https://github.com/wondelai/skills
Copyright (c) wondelai - Microinteractions framework adaptation of Dan Saffer's Microinteractions: Designing with Details (MIT License)
Special thanks to wondelai for their generous open-source contributions, which helped shape this skill collection. Adapted by webconsulting.at for this skill collection
Microinteraction Case Studies
Detailed design breakdowns of common UI patterns, analyzed through the four-part microinteraction structure: Trigger, Rules, Feedback, and Loops & Modes. Each case study documents the interaction from first use through edge cases, providing a practical blueprint for implementation.
Table of Contents
1. Case Study 1: Form Submission 2. Case Study 2: Toggle / Switch 3. Case Study 3: Pull-to-Refresh 4. Case Study 4: Loading States 5. Case Study 5: Notifications (Toast / Snackbar) 6. Cross-Cutting Patterns
---
Case Study 1: Form Submission
A form submission microinteraction covers the moment from when the user taps "Submit" to when they receive confirmation of success or details of failure. It is one of the highest-stakes microinteractions because users have invested time and data.
The Four Parts
Trigger:
- Manual trigger: "Submit" button (primary action, full-width or prominent)
- Keyboard trigger: Enter key in last field (convention, not always expected)
- System trigger: Auto-save draft after 30 seconds of inactivity (background)
Rules: 1. On trigger, validate all required fields client-side before sending to server 2. If validation fails, prevent submission and highlight first invalid field 3. If validation passes, disable submit button and show loading state 4. Send data to server 5. On server success (200), show success feedback and redirect or reset form 6. On server error (4xx/5xx), show error message and preserve all input 7. On network timeout (>15 seconds), show retry option with preserved input
Feedback:
| State | Visual | Copy | Duration |
|---|---|---|---|
| Idle | Blue "Submit" button, normal state | "Submit" or "Create Account" | Persistent |
| Validating | Button briefly disabled | "Checking..." | 0-500ms |
| Validation error | Red border on invalid fields, scroll to first error | "Please enter a valid email" inline | Until corrected |
| Submitting | Button shows spinner, text changes | "Submitting..." | Server response time |
| Success | Green checkmark replaces spinner | "Done! Redirecting..." | 1-2 seconds |
| Server error | Red banner at top, button re-enabled | "Something went wrong. Please try again." | Until dismissed |
| Network error | Yellow banner, retry button | "Connection lost. Your data is saved locally." | Until retry succeeds |
Loops & Modes:
- Auto-save loop: draft saved to local storage every 30 seconds (open loop)
- Long loop: after 3+ submissions, hide optional tooltips and field hints
- No modes (single-purpose interaction)
Edge Cases
| Edge Case | Handling |
|---|---|
| User double-clicks submit | Disable button on first click; debounce server request |
| User navigates away mid-submission | Show "Unsaved changes" dialog; save draft to local storage |
| Session expires during submission | Queue submission; re-authenticate and retry |
| Very long form (20+ fields) | Show progress indicator; validate sections independently |
| Paste of formatted text | Strip formatting; accept plain text only |
| Autofill conflict | Accept autofill values; re-validate on submit |
Implementation Notes
| Platform | Key Detail |
|---|---|
| Web | Use <form> native validation as baseline; enhance with JS. Preserve form data in sessionStorage. |
| iOS | Use UITextFieldDelegate for per-field validation. Keyboard "Return" key should move to next field, not submit. |
| Android | TextInputLayout with setError() for inline validation. Handle back button to save draft. |
---
Case Study 2: Toggle / Switch
A toggle is a binary microinteraction: on or off. Despite its apparent simplicity, a well-designed toggle requires careful attention to state communication, animation timing, and accessibility.
The Four Parts
Trigger:
- Manual trigger: tap/click anywhere on the toggle (track or thumb)
- Keyboard trigger: Space bar when toggle is focused
- Drag trigger: drag thumb from one position to the other
- System trigger: external state change (admin disables feature remotely)
Rules: 1. On trigger, immediately start transition animation 2. If action requires server confirmation, send request in background 3. Toggling on may trigger additional UI (reveal settings, enable features) 4. Toggling off may trigger confirmation dialog for destructive changes 5. If server rejects the change, revert toggle to previous state with error message 6. Rapid toggling (clicking multiple times fast) should debounce: only the final state is sent
Feedback:
| State | Thumb Position | Track Color | Label (if used) | Haptic |
|---|---|---|---|---|
| Off | Left | Gray (#E5E7EB) | "Off" | None |
| Transitioning on | Sliding right | Transitioning to green | -- | None |
| On | Right | Green (#22C55E) | "On" | Light tap |
| Transitioning off | Sliding left | Transitioning to gray | -- | None |
| Disabled | Current position | Faded (40% opacity) | "Unavailable" | None |
| Loading | Current position | Faded with inline spinner | "Updating..." | None |
| Error | Reverted position | Flash red briefly, return to normal | "Failed to update" | Error pattern |
Loops & Modes:
- No traditional loop (single action)
- Long loop: if toggle controls a feature with settings, first 3 toggles might show a tooltip explaining the feature
- No modes
Animation Specification
| Property | Value | Easing |
|---|---|---|
| Thumb position (left to right) | 150-200ms | ease-in-out |
| Track color transition | 150-200ms | ease-in-out (synchronized with thumb) |
| Thumb shadow on drag | 100ms to enlarge shadow | ease-out |
| Revert on error | 200ms | ease-out with red flash |
Accessibility
| Requirement | Implementation |
|---|---|
| ARIA role | role="switch" with aria-checked="true/false" |
| Focus indicator | 2px blue outline around entire toggle on Tab focus |
| Keyboard | Space bar toggles; no Enter (per switch role spec) |
| Screen reader | "Wi-Fi, switch, on" -- announces label, role, and state |
| Reduced motion | Skip animation; instant state change |
| Touch target | Minimum 44x44pt including padding around toggle |
Edge Cases
| Edge Case | Handling |
|---|---|
| Toggle + settings reveal | Settings panel slides open below toggle; accordion animation 200ms |
| Toggle with destructive off | Confirmation dialog: "Disabling will delete all data. Are you sure?" |
| Toggle server failure | Revert toggle; show inline error for 3 seconds |
| Rapid toggling | Debounce 500ms; only send final state to server |
| Toggle with dependent toggles | Child toggles disable when parent turns off |
---
Case Study 3: Pull-to-Refresh
Pull-to-refresh is a gesture-triggered microinteraction invented by Loren Brichter for Tweetie (acquired by Twitter). It transforms a natural gesture (pulling down on a list) into a data refresh. It is one of the most widely adopted microinteraction patterns in mobile design.
The Four Parts
Trigger:
- Manual trigger: pull down on a scrollable list past a threshold (~60pt)
- The trigger is invisible -- no button exists; the gesture is the trigger
- System fallback: auto-refresh on app foreground after X minutes (system trigger)
Rules: 1. User must be scrolled to the top of the list for pull to activate 2. Pulling down below threshold shows visual hint but does not trigger refresh 3. Pulling past threshold (typically 60-80pt) "locks" the refresh 4. Releasing after passing threshold triggers the refresh request 5. Releasing before threshold snaps back with no refresh 6. While refreshing, spinner remains visible at top; list is still scrollable 7. On data received, new content animates into list; spinner dismisses 8. On failure, spinner dismisses; error message appears briefly 9. Minimum spinner display: 500ms (prevents flash for fast connections)
Feedback:
| Pull Distance | Visual Feedback | Haptic Feedback |
|---|---|---|
| 0-20pt | Slight rubber-band stretch | None |
| 20-60pt | Spinner icon appears, partially rotated proportional to pull | None |
| 60pt (threshold) | Spinner completes rotation; visual snap indicating activation | Light tap (selection feedback) |
| 60pt+ (past threshold) | Spinner remains complete; pull distance continues with resistance | None |
| Release (past threshold) | Spinner animates (spinning); list adjusts to accommodate | None |
| Data received | Spinner stops; new items slide in from top; spinner area collapses | None |
| Error | Spinner stops; brief error text ("Could not refresh"); area collapses | Error pattern |
Loops & Modes:
- Auto-refresh loop: if user has not pulled-to-refresh in 5+ minutes and returns to app, auto-refresh fires (system trigger)
- Long loop: for first 3 uses on a new device, show a subtle "Pull down to refresh" hint text
- Rate limiting rule: ignore pull-to-refresh if last refresh was < 5 seconds ago
- No modes
Discoverability Strategy
Pull-to-refresh has zero visible affordance -- it relies entirely on platform convention. For apps where users might not know the gesture:
| Strategy | Implementation | When to Remove |
|---|---|---|
| Hint text | "Pull down to refresh" text above list, visible at scroll top | After 3 successful pull-to-refresh actions |
| Auto-refresh on first load | Show the refresh animation automatically on first visit | After first visit only |
| Visible refresh button | Small refresh icon in header as fallback | Never (always keep as alternative) |
Platform-Specific Implementations
| Platform | Key Detail |
|---|---|
| iOS | UIRefreshControl -- native component. Spinner is an ActivityIndicator. Threshold is system-defined. |
| Android | SwipeRefreshLayout -- Material Design. Uses circular progress that fills as user pulls. |
| Web | Custom implementation required. Must handle touch events; prevent native browser pull-to-refresh interference. Use overscroll-behavior: contain on scroll container. |
---
Case Study 4: Loading States
Loading is not a single microinteraction but a family of patterns for communicating "the system is working." The design challenge is keeping users informed and engaged during a period they cannot control.
Loading Pattern Selection
| Scenario | Best Pattern | Why |
|---|---|---|
| < 300ms | No indicator (instant feel) | Any indicator would flash distractingly |
| 300ms - 1s | Inline spinner | Acknowledges loading without drama |
| 1s - 5s | Skeleton screen | Shows layout immediately; reduces perceived wait |
| 5s - 30s | Determinate progress bar | Users need to see actual progress |
| 30s+ | Progress bar + background option | Users should be able to do other things |
| Unknown duration | Indeterminate spinner + status text | Transparency: "Processing..." then "Almost done..." |
Skeleton Screen Design
Trigger: System trigger -- content request initiated.
Rules: 1. Show skeleton immediately on navigation (within 100ms) 2. Skeleton shapes must match the final layout precisely 3. Use subtle pulse animation on skeleton shapes (opacity 0.3 to 0.6, 1.5s loop) 4. Load content progressively: text first, then images 5. Crossfade from skeleton to real content (200ms) 6. Never show skeleton for content already in cache
Skeleton Visual Specification:
| Content Type | Skeleton Shape | Color | Animation |
|---|---|---|---|
| Text line | Rounded rectangle, 60-80% width | Gray-200 (#E5E7EB) | Pulse 0.3-0.6 opacity |
| Heading | Rounded rectangle, 40-50% width, taller | Gray-200 | Pulse 0.3-0.6 opacity |
| Avatar | Circle, matching avatar size | Gray-200 | Pulse 0.3-0.6 opacity |
| Image | Rounded rectangle, matching aspect ratio | Gray-200 | Pulse 0.3-0.6 opacity |
| Button | Rounded rectangle, matching button size | Gray-200 | Pulse 0.3-0.6 opacity |
Progress Bar Design
Trigger: System trigger -- long operation begins.
Rules: 1. Appear within 200ms of operation start 2. Progress must be real (based on actual progress, not fake animation) 3. Never go backward (if real progress reverses, pause at current point) 4. Final 5% should be server confirmation, not client processing 5. On completion, bar fills to 100%, brief pause, then success state
Feedback:
| Progress State | Visual | Text |
|---|---|---|
| 0% | Empty bar with subtle background | "Starting upload..." |
| 1-99% | Bar fills proportionally; color stays blue | "Uploading... 47%" |
| 99% | Bar nearly full; slight pause | "Finalizing..." |
| 100% | Bar fills completely; transitions to green | "Complete!" |
| Error at any point | Bar turns red; stops at current position | "Upload failed at 47%. Retry?" |
| Cancelled | Bar fades out; reset | "Upload cancelled." |
Loading State Accessibility
| Requirement | Implementation |
|---|---|
| Screen reader | aria-live="polite" region announces "Loading content" and "Content loaded" |
| Progress bar | role="progressbar" with aria-valuenow, aria-valuemin, aria-valuemax |
| Reduced motion | Replace pulse animation with static gray; replace spinner with "Loading..." text |
| Timeout | If loading exceeds 30 seconds, announce "Still loading. You can continue waiting or try again." |
---
Case Study 5: Notifications (Toast / Snackbar)
Notifications are transient microinteractions that communicate system events without requiring full user attention. They appear, convey a message, and disappear -- but the design details determine whether they are helpful or infuriating.
The Four Parts
Trigger:
- System trigger: action completes (save, send, delete)
- System trigger: external event occurs (new message, status change)
- System trigger: error detected (network loss, permission denied)
- Manual trigger: user action with reversible outcome (delete triggers "Undo" toast)
Rules: 1. Appear in a consistent position (bottom-center for mobile, bottom-left or top-right for desktop) 2. Stack if multiple appear simultaneously (limit to 3 visible; queue additional) 3. Auto-dismiss after 5-8 seconds for informational; persist for errors until acknowledged 4. Slide in with animation (300ms); slide out on dismiss (200ms) 5. Must not cover critical UI elements (primary actions, navigation) 6. If toast contains an action ("Undo"), the action must be available for the entire display duration 7. Dismissable via swipe (mobile) or close button (desktop)
Feedback:
| Notification Type | Background Color | Icon | Auto-Dismiss | Action |
|---|---|---|---|---|
| Success | Green or dark gray | Checkmark | 5 seconds | None or "View" |
| Info | Blue or dark gray | Info circle | 5 seconds | Optional link |
| Warning | Yellow/amber | Warning triangle | 8 seconds | "Fix" or "Dismiss" |
| Error | Red | X circle | No (persist) | "Retry" and "Dismiss" |
| Undo | Dark gray | Undo arrow | 8 seconds | "Undo" (primary) |
Loops & Modes:
- Stacking loop: if user triggers 5 actions rapidly, queue toasts; show max 3 at once
- Long loop: if same notification appears 3+ times in a session, batch: "3 items saved"
- Consolidation: "3 files uploaded" instead of three separate "File uploaded" toasts
- No modes
Toast Layout Specification
┌────────────────────────────────────────────────┐
│ [Icon] Message text here [Action] [X]│
│ Secondary text (optional) │
└────────────────────────────────────────────────┘| Element | Specification |
|---|---|
| Width | Min 288px, max 568px (desktop); full-width minus margins (mobile) |
| Height | Min 48px, max 112px (2 lines + action) |
| Padding | 16px horizontal, 12px vertical |
| Border radius | 8px |
| Shadow | Medium elevation (shadow-md) |
| Position | Bottom-center (mobile), bottom-left or top-right (desktop), 16px from edge |
| Z-index | Above all content, below modals and dialogs |
Animation Specification
| Transition | Duration | Easing | Direction |
|---|---|---|---|
| Enter | 300ms | ease-out (deceleration) | Slide up from below (mobile) or slide in from right (desktop) |
| Exit (auto-dismiss) | 200ms | ease-in (acceleration) | Slide down or fade out |
| Exit (swipe dismiss) | 150ms | ease-out | Follow swipe direction |
| Stack push | 200ms | ease-in-out | Existing toasts shift up to accommodate new one |
Accessibility
| Requirement | Implementation |
|---|---|
| Screen reader | role="status" with aria-live="polite" (info/success); role="alert" with aria-live="assertive" (error) |
| Focus management | Do not steal focus from user's current position; action button reachable via Tab |
| Keyboard | Esc key dismisses; Tab reaches action buttons |
| Timeout | For error toasts, no auto-dismiss; for info toasts, pause timer on hover/focus |
| Reduced motion | Replace slide animation with fade (200ms) |
Edge Cases
| Edge Case | Handling |
|---|---|
| 10 toasts triggered at once | Queue: show 3; dismiss oldest first; show queued |
| Toast covers primary action | Reposition toast above the action; or provide alternative placement |
| User clicks Undo at last second | Accept undo if within the timeout window, even if fade-out started |
| Toast during full-screen mode | Overlay on top of full-screen content with higher z-index |
| Long text content | Truncate at 2 lines with "..." and "Show more" link |
| Network loss while showing "Undo" | Queue undo action locally; execute when connection returns |
---
Cross-Cutting Patterns
Patterns That Apply Across All Case Studies
| Pattern | Application | Example |
|---|---|---|
| Debouncing | Prevent rapid duplicate triggers | Double-click submit, rapid toggle, pull-to-refresh spam |
| Optimistic UI | Show result before server confirms | Toggle, like, delete with undo |
| Progressive disclosure | Show simple first, details on demand | Error summary first, full details expandable |
| Graceful degradation | Work without JavaScript, animation, or haptics | Form submits via native HTML; toggle works without animation |
| Accessibility baseline | All patterns must work for all users | ARIA roles, keyboard operation, reduced motion, screen reader |
| State persistence | Preserve user work across interruptions | Form drafts, scroll position, toggle state |
Feedback Patterns for Microinteractions
Feedback is how a microinteraction communicates its rules to the user. It answers the most fundamental question in any interaction: "What just happened?" Without feedback, users operate in the dark -- unsure if their action registered, if the system is working, or if the result was what they intended. Feedback bridges the Gulf of Evaluation by making the invisible visible.
The Feedback Hierarchy
Not all feedback is equal. The type, intensity, and duration of feedback should match the significance of the event.
| Event Significance | Feedback Level | Duration | Example |
|---|---|---|---|
| Micro (hover, focus) | Subtle visual change | Instant, continuous | Background lightens on hover |
| Minor (tap, toggle) | Clear visual change | 100-300ms | Toggle slides, color shifts |
| Medium (save, send) | Visual change + state label | 1-3 seconds | "Saved" text appears briefly |
| Major (purchase, delete) | Multi-signal confirmation | 3-5 seconds, user-dismissable | Confirmation banner with undo option |
| Critical (error, failure) | Prominent, persistent | Until acknowledged | Red banner with error message and action |
The Minimum Feedback Rule
Use the least amount of feedback that still communicates the message. A hover state does not need a sound effect. A successful save does not need a modal dialog. A button press does not need a full-screen animation. Escalate feedback only when the event demands it.
---
Visual Feedback
Visual feedback is the primary feedback channel for nearly every microinteraction. It is silent, non-intrusive, and universally accessible (when designed with sufficient contrast).
Color Changes
| Pattern | When to Use | Implementation | Example |
|---|---|---|---|
| State color shift | Show current state | Background or border color changes | Toggle track: gray (off) to green (on) |
| Validation color | Indicate input validity | Border or icon color changes | Green border = valid, red border = invalid |
| Progress color | Show completion level | Fill color changes as progress increases | Upload bar shifts from blue to green at 100% |
| Attention color | Draw focus to a change | Brief highlight animation | Row flashes yellow after being updated |
| Semantic color | Communicate meaning | Consistent color system | Red = error, green = success, yellow = warning, blue = info |
Animations
| Animation Type | Duration | Easing | When to Use | Example |
|---|---|---|---|---|
| Button press | 50-100ms | ease-out | Every button interaction | Scale down to 0.97, then back |
| Toggle slide | 150-250ms | ease-in-out | Binary state change | Thumb slides from left to right |
| Expand/collapse | 200-300ms | ease-in-out | Revealing or hiding content | Accordion section opens smoothly |
| Fade in/out | 150-300ms | ease-in (in), ease-out (out) | Elements appearing/disappearing | Toast notification fades in |
| Slide in/out | 200-400ms | ease-out (in), ease-in (out) | Panels, drawers, sheets | Side panel slides from right edge |
| Skeleton to content | 200-400ms | ease-in-out | Content loading | Gray placeholders crossfade to real content |
| Checkmark draw | 300-500ms | ease-out | Success confirmation | SVG checkmark animates stroke from left to right |
| Shake | 300-500ms | ease-in-out (oscillate) | Invalid input | Field shakes horizontally 2-3 times |
| Bounce | 200-400ms | spring | Attention, arrival | New item bounces into list |
Animation Principles for Microinteractions
1. Purpose over decoration. Every animation should communicate something: state change, direction, connection, or confirmation. If you cannot articulate what the animation communicates, remove it.
2. Interruptible. If the user acts before an animation completes, the animation should yield to the new action. Never make users wait for an animation to finish.
3. Consistent timing. Use a small set of durations (100ms, 200ms, 300ms, 500ms) and apply them consistently by category. Do not use random durations.
4. Physics-based easing. Use ease-out for elements entering (decelerating arrival), ease-in for elements leaving (accelerating departure), and ease-in-out for elements that stay but change state.
Progress Indicators
| Indicator Type | When to Use | Design Details |
|---|---|---|
| Determinate progress bar | Duration is known or estimable | Shows percentage; bar fills left to right; show time remaining if > 10s |
| Indeterminate spinner | Duration is unknown, expected < 10s | Rotating circle or dots; use brand-consistent style |
| Skeleton screen | Content layout is known, data loading | Gray rectangles matching final layout shape and size |
| Percentage text | Long operations where users want precision | "47% complete" text; pair with progress bar |
| Step indicator | Multi-step process | "Step 2 of 4" with visual step markers |
| Inline spinner | Loading within a specific component | Small spinner inside the button or field that triggered loading |
Progress Indicator Selection Guide
| Load Time | Best Indicator | Why |
|---|---|---|
| < 0.3s | None (instant) | Any indicator would flash and distract |
| 0.3-1s | Subtle inline spinner | Acknowledges loading without overdoing it |
| 1-5s | Skeleton screen or spinner | Shows the system is working |
| 5-30s | Determinate progress bar | Users need to see progress |
| 30s+ | Progress bar + percentage + estimated time | Users need reassurance and ability to leave |
---
Audio Feedback
Audio feedback provides confirmation through sound. It is powerful when visual attention is elsewhere, but it is easily annoying and must be used sparingly.
When Audio Feedback Is Appropriate
| Appropriate | Inappropriate |
|---|---|
| Confirmation of important action (payment, send) | Every button click |
| Error that needs immediate attention | Form validation errors |
| Background task completion (download, print) | Hover or focus changes |
| Accessibility (screen reader announcements) | Decorative or branding sounds |
| Physical product interaction (keyboard typing) | Any action that occurs frequently (> 10x/min) |
Audio Feedback Design Rules
1. Short. Sounds should be 50-200ms for confirmations, up to 1 second for completions. Never longer.
2. Quiet. Default volume should be unobtrusive. Users should be able to disable all sounds.
3. Distinct. Success and error sounds must be obviously different -- do not rely on subtle pitch changes.
4. Non-verbal. Avoid spoken words in feedback sounds (they do not scale across languages and are slow). Pure tones or abstract sounds work best.
5. Consistent. Use the same sound for the same type of event across the entire product. Success always sounds the same.
Audio Feedback Patterns
| Event | Sound Character | Duration | Example Reference |
|---|---|---|---|
| Success | Rising pitch, major chord | 100-300ms | iOS payment success chime |
| Error | Low buzz or discordant tone | 100-200ms | macOS alert sound |
| Notification | Gentle chime, mid-range | 200-500ms | Slack notification ding |
| Completion | Satisfying click or chime | 100-200ms | Camera shutter sound |
| Typing | Soft click per keystroke | 20-50ms | iPhone keyboard clicks |
| Delete/Trash | Crumple or whoosh | 200-400ms | macOS trash sound |
---
Haptic Feedback
Haptic feedback uses vibration or force feedback to communicate through touch. It is available on mobile devices and some game controllers, laptops, and wearables.
Haptic Feedback Patterns
| Pattern | iOS API | Android API | When to Use |
|---|---|---|---|
| Light tap | .light impact | HapticFeedbackConstants.CLOCK_TICK | Toggle, checkbox, minor selection |
| Medium tap | .medium impact | HapticFeedbackConstants.CONTEXT_CLICK | Button press, drag snap |
| Heavy tap | .heavy impact | HapticFeedbackConstants.LONG_PRESS | Confirmation of significant action |
| Success | .success notification | Custom pattern: short-pause-long | Action completed successfully |
| Warning | .warning notification | Custom pattern: two short bursts | Approaching limit, caution needed |
| Error | .error notification | Custom pattern: three rapid bursts | Action failed, attention needed |
| Selection tick | .selection changed | HapticFeedbackConstants.KEYBOARD_TAP | Scrolling through picker values |
Haptic Design Rules
1. Pair with visual. Haptic feedback should always accompany visual feedback, never replace it. Some devices have haptics disabled, and users with motor impairments may not feel vibrations.
2. Match intensity to significance. Light tap for toggles. Medium for confirmations. Heavy for warnings. Never heavy for routine actions.
3. Use sparingly. Constant vibration is annoying and drains battery. Reserve haptics for moments where tactile confirmation adds genuine value.
4. Respect system settings. Always check if the user has disabled haptic feedback at the system level. Never override this preference.
---
Feedback Timing
When feedback occurs is as important as what feedback occurs. The human perception system has specific thresholds that determine whether feedback feels instant, delayed, or broken.
Perception Thresholds
| Delay | User Perception | Required Feedback |
|---|---|---|
| 0-100ms | Instantaneous -- feels like direct manipulation | Visual state change (color, position) |
| 100-300ms | Slight lag but still responsive | Transition animation, inline spinner |
| 300ms-1s | Noticeable delay | Loading indicator, cursor change |
| 1-5s | Waiting | Spinner, skeleton screen, "Loading..." |
| 5-10s | Attention wanders | Progress bar with estimate |
| 10-30s | Impatient | Progress bar + percentage + "X seconds remaining" |
| 30s+ | Will leave or switch tasks | Progress bar + allow backgrounding + notification on completion |
Optimistic UI Pattern
Show the result immediately and correct later if the action fails. This makes the interface feel instant even when the server takes time.
| Step | What Happens | Example |
|---|---|---|
| 1. User triggers | Show success state immediately | Heart fills red instantly on like |
| 2. Send request | API call fires in background | POST /like runs asynchronously |
| 3a. Server confirms | Nothing changes (already showing success) | Response 200: no visual change |
| 3b. Server fails | Revert to previous state with error | Heart unfills; toast: "Could not save like" |
When to use optimistic UI:
- Action is very likely to succeed (> 99%)
- Reverting is possible and not confusing
- The action is low-stakes (not a payment or deletion)
When NOT to use optimistic UI:
- Action has a significant failure rate
- Action is irreversible
- Reverting would be confusing (e.g., message appears then disappears)
---
Progressive Disclosure in Feedback
Not all feedback needs to appear at once. Progressive disclosure reveals information in layers, starting with the most important.
Feedback Layering
| Layer | What It Shows | When | Example |
|---|---|---|---|
| Immediate | "Your action was received" | 0-100ms | Button changes state |
| Status | "Here's what's happening" | 100ms-3s | Spinner, progress bar |
| Result | "Here's the outcome" | On completion | Success message, error details |
| Detail | "Here's the specifics" | On demand (hover, click) | Tooltip with timestamp, expandable error log |
Progressive Error Disclosure
| Level | What to Show | Example |
|---|---|---|
| Summary | One-line human-readable error | "Upload failed" |
| Explanation | Why it happened | "The file is too large (12MB). Maximum size is 10MB." |
| Resolution | How to fix it | "Try compressing the image or choosing a smaller file." |
| Technical detail | For developers or support | Expandable: "Error 413: Request Entity Too Large. Request ID: abc123" |
---
Preventing Feedback Overload
Too much feedback is as bad as too little. When every action triggers a toast notification, animation, and sound, users become desensitized and miss the feedback that actually matters.
Signs of Feedback Overload
| Symptom | Cause | Fix |
|---|---|---|
| Users ignore toast notifications | Too many toasts for minor events | Reserve toasts for actions user may want to undo |
| Interface feels "jittery" | Too many animations on trivial events | Remove animation from hover/focus; keep for state changes |
| Users disable notifications | Every event sends a push notification | Tier notifications; only push for high-priority events |
| Sound becomes annoying | Every click has an audio cue | Remove audio from routine actions; keep for confirmations |
| Screen reader users overwhelmed | Too many aria-live announcements | Announce only meaningful state changes |
Feedback Reduction Strategies
1. Consolidate. Instead of four separate toast messages for four file uploads, show one: "4 files uploaded successfully."
2. Delay and batch. Accumulate minor events and present them as a summary: "While you were away: 3 likes, 2 comments, 1 share."
3. Tier by priority. Define three tiers of feedback intensity and assign every event type to a tier:
| Tier | Intensity | Feedback Type | Events |
|---|---|---|---|
| 1 (High) | Multi-signal, persistent | Banner + sound + haptic | Errors, destructive confirmations, payment success |
| 2 (Medium) | Single signal, temporary | Toast or inline text | Save success, status change, minor warning |
| 3 (Low) | Minimal, passive | Visual state change only | Hover, focus, toggle, minor selection |
4. Respect context. Reduce feedback when:
- User is performing rapid sequential actions (bulk editing)
- System is in background/minimized
- User has indicated preference for fewer notifications
---
Feedback Accessibility
Feedback must work for all users, including those who cannot see animations, hear sounds, or feel vibrations.
Accessibility Requirements
| User Group | Feedback Adaptation |
|---|---|
| Screen reader users | Use aria-live regions (polite for status, assertive for errors) to announce state changes |
| Low vision users | Ensure color changes have sufficient contrast (3:1 minimum for state changes); do not rely on color alone |
| Motion-sensitive users | Respect prefers-reduced-motion; replace animations with instant state changes |
| Deaf/hard of hearing users | Never rely on audio as sole feedback channel; always pair with visual |
| Keyboard-only users | Focus indicators must be visible on all interactive elements; state changes near focus |
Accessibility Feedback Checklist
- [ ] Can every state change be perceived without color alone (shape, text, or icon accompanies color)?
- [ ] Are error messages announced to screen readers via aria-live="assertive"?
- [ ] Are success messages announced via aria-live="polite"?
- [ ] Do animations respect prefers-reduced-motion media query?
- [ ] Is all audio feedback accompanied by a visual equivalent?
- [ ] Can keyboard users perceive which element has focus?
- [ ] Do loading states have an accessible label ("Loading...", role="status")?
- [ ] Are progress bars accessible (role="progressbar", aria-valuenow, aria-valuemin, aria-valuemax)?
---
Feedback Design Checklist
- [ ] Does every interactive element provide immediate visual feedback on activation?
- [ ] Is feedback proportional to event significance (small action = small feedback)?
- [ ] For operations > 300ms, is there a loading indicator?
- [ ] For operations > 10 seconds, is there a progress bar?
- [ ] Do error messages explain what happened and how to fix it?
- [ ] Is success feedback brief and non-blocking (does not require dismissal)?
- [ ] Are animations under 500ms and interruptible?
- [ ] Is audio feedback optional and disabled by default (except essential alerts)?
- [ ] Does haptic feedback match system settings?
- [ ] Are all feedback channels accessible (visual + ARIA + reduced-motion support)?
Loops and Modes in Microinteractions
Loops and modes are the long-term behavior of microinteractions. While triggers, rules, and feedback handle the moment-to-moment experience, loops and modes determine how an interaction evolves over time and how it adapts to different contexts. They are the mechanism for making microinteractions feel alive -- growing with the user, adapting to behavior, and avoiding stagnation.
Understanding Loops
A loop is a cycle that a microinteraction goes through repeatedly. The key question is: what happens when the microinteraction is triggered again? Does it behave the same way? Does it adapt? Does it expire?
Open Loops vs. Closed Loops
| Type | Behavior | Ends When | Example |
|---|---|---|---|
| Open loop | Repeats indefinitely until manually stopped | User or system explicitly stops it | Repeating alarm clock, auto-save every 5 minutes |
| Closed loop | Runs a fixed number of times or for a fixed duration | Completion condition is met | Countdown timer (reaches zero), 3-retry limit |
Designing Open Loops
Open loops run continuously and need careful management to avoid becoming annoying or resource-wasteful.
Design considerations:
| Consideration | Guideline | Example |
|---|---|---|
| Frequency | Match repetition rate to user need | Auto-save: every 30 seconds, not every second |
| Visibility | Show loop status without being intrusive | Small "Last saved: 2 min ago" text in footer |
| Control | Let users adjust or stop the loop | Toggle to enable/disable auto-save; frequency setting |
| Resource impact | Minimize battery, network, and CPU usage | Poll for updates every 60s, not every second; use WebSockets when available |
| Failure handling | Degrade gracefully if a cycle fails | Skip failed auto-save; retry next cycle; show warning after 3 failures |
Designing Closed Loops
Closed loops have a natural endpoint. The design challenge is communicating progress and handling completion.
Design considerations:
| Consideration | Guideline | Example |
|---|---|---|
| Progress | Show how far along the loop is | "Attempt 2 of 3" or progress ring |
| Completion | Clear signal when loop ends | Timer reaches 00:00 with sound/vibration |
| Early exit | Allow cancellation before completion | "Cancel" button on countdown timer |
| End state | Define what happens after the last cycle | Timer shows "Done!" with dismiss action |
| Failure to complete | Handle cases where loop cannot finish | "Max retries reached. Try again manually." |
---
Long Loops: Behavior Over Time
Long loops are the most powerful -- and most neglected -- aspect of microinteraction design. A long loop asks: how should this microinteraction behave differently the 100th time compared to the first time?
Progressive Reduction
Progressive reduction means removing scaffolding as users demonstrate mastery. The microinteraction starts helpful and becomes streamlined.
| Use Count | Behavior | Rationale |
|---|---|---|
| 1-3 uses | Full labels, tooltips, coaching marks | User is learning |
| 4-10 uses | Labels remain, tooltips disappear | User recognizes patterns |
| 11-50 uses | Labels shrink to icons, hints removed | User knows the interface |
| 50+ uses | Icons only, keyboard shortcuts promoted | User is an expert |
Implementation strategies:
| Strategy | Mechanism | Example |
|---|---|---|
| Use counter | Track trigger count per user | After 5 uses, hide "swipe to delete" tooltip |
| Time-based | Track days since first use | After 7 days, collapse onboarding sidebar |
| Behavior-based | Detect user competence from actions | If user uses keyboard shortcut 3 times, hide toolbar button label |
| Explicit | Let user dismiss scaffolding | "Got it, don't show again" link on tooltip |
Adaptive Long Loops
Adaptive loops change the microinteraction based on accumulated user behavior patterns.
| Adaptation | What Changes | Example |
|---|---|---|
| Smart defaults | Default values shift to match user's typical input | Email compose defaults to the team the user writes to most |
| Frequency adjustment | How often the interaction triggers or repeats | Notification frequency decreases if user ignores 5 in a row |
| Content personalization | What content appears in the interaction | Search autocomplete prioritizes user's past searches |
| Complexity scaling | Simpler version for new users, richer for experts | Photo editor shows basic controls by default, reveals advanced on demand |
| Suggestion refinement | Predictions improve with use | Keyboard autocorrect learns from user's vocabulary |
Long Loop Design Principles
1. Never degrade core functionality. Progressive reduction should remove scaffolding, not features. The base action must always work.
2. Provide a way back. If a tooltip was hidden after 10 uses, provide a "?" icon or help menu to resurface it.
3. Track per-feature, not globally. A user who is expert at one feature may be a beginner at another. Track usage at the microinteraction level.
4. Avoid the uncanny valley. If the system adapts based on behavior, the changes should either be invisible (smart defaults) or transparent (explicit recommendations). Half-visible adaptation feels creepy.
5. Test the 100th use. Most designers test the first use. Few test the 100th. Run the complete interaction 100 times and evaluate: does it still feel right? Is there unnecessary friction for an expert?
---
Understanding Modes
A mode is a temporary state where the same trigger produces a different result. In edit mode, clicking a paragraph selects it for editing. In view mode, clicking the same paragraph does nothing (or follows a link). Modes are powerful but dangerous.
Why Modes Are Dangerous
| Problem | Description | Real-World Example |
|---|---|---|
| Mode error | User performs the right action in the wrong mode | Typing when Caps Lock is on; drawing when in eraser mode |
| Mode confusion | User does not know which mode they are in | Editing a live document thinking it is a draft |
| Mode amnesia | User forgets they entered a mode | Left phone in Do Not Disturb; missed urgent calls |
| Action inconsistency | Same trigger does different things | Click selects text in edit mode, follows link in view mode |
When Modes Are Justified
Despite their dangers, modes are sometimes the right design choice:
| Justification | Why It Works | Example |
|---|---|---|
| Physical constraints | Limited input controls must serve multiple functions | Caps Lock/Shift on keyboard (limited key count) |
| Separation of concerns | Editing and viewing are fundamentally different activities | Google Docs edit mode vs. suggestion mode vs. view mode |
| Safety | Prevent accidental destructive actions in normal use | "Edit mode" in CMS protects published content |
| Complexity management | Different tasks need different tool sets | Photoshop tools: brush, eraser, selection, text |
Mode Design Guidelines
1. Make the current mode unmistakably visible.
| Method | Where to Apply | Example |
|---|---|---|
| Color-coded background | Entire screen or workspace | Yellow tint in edit mode |
| Persistent banner | Top of screen | "You are editing this page" banner |
| Tool indicator | Near cursor or toolbar | Active tool highlighted in toolbar; cursor changes shape |
| Mode label | Status bar or header | "DRAFT" / "PUBLISHED" / "EDITING" label |
2. Make mode transitions deliberate. Entering and exiting a mode should require a conscious action (button click, keyboard shortcut), not happen accidentally (hover, proximity).
3. Minimize the number of modes. Every mode doubles the testing surface. Two modes mean 2x testing. Five modes mean 5x.
| Number of Modes | Complexity | Guidance |
|---|---|---|
| 1 (no modes) | Low | Ideal -- same action always produces same result |
| 2 | Moderate | Acceptable for clear binary states (edit/view) |
| 3 | High | Reconsider -- can you merge or eliminate one? |
| 4+ | Very high | Almost certainly too many; redesign with fewer modes |
4. Provide mode escape. Users must always have a clear, obvious way to exit a mode. The escape route should be visible at all times while in the mode.
| Escape Method | Implementation | Example |
|---|---|---|
| Explicit button | "Done," "Exit," "Close" button visible in mode | "Done Editing" button in top-right |
| Keyboard shortcut | Escape key exits mode | Esc exits full-screen mode |
| Timeout | Mode auto-exits after inactivity | Edit mode locks after 15 minutes idle |
| Gesture | Swipe down or pinch to dismiss | Swipe down exits full-screen image view |
---
Avoiding Mode Errors
Mode errors occur when users perform the correct action in the wrong mode. They are one of the most frustrating user experiences because users did the right thing -- the system responded wrong.
Prevention Strategies
| Strategy | How It Works | Example |
|---|---|---|
| Spring-loaded modes | Mode exists only while holding trigger | Caps Lock as long as Shift is held (not toggled) |
| Undo on mode exit | Offer to undo all actions on mode exit | "Discard changes?" dialog when exiting edit mode |
| Mode confirmation | Show a brief confirmation when entering mode | "Edit mode" banner flashes for 2 seconds on entry |
| Preemptive warning | Warn before an action that depends on mode | "You are in eraser mode. Switch to pen to draw." |
| Eliminate the mode | Use a different UI pattern instead | Instead of "edit mode," use inline editing with pencil icon per field |
Spring-Loaded Modes
Spring-loaded modes (also called quasi-modes) are temporary: they exist only while the user holds a trigger. When the trigger is released, the mode exits automatically. This eliminates mode amnesia because the user is physically reminded of the mode through the held action.
| Spring-Loaded Mode | Trigger | Exits When | Example |
|---|---|---|---|
| Shift for uppercase | Hold Shift key | Release Shift | Typing uppercase letters |
| Space for preview | Hold Space bar | Release Space | macOS Quick Look preview |
| Drag for reorder | Hold and drag | Release finger/mouse | iOS home screen icon reordering |
| Alt for alternate | Hold Alt/Option key | Release Alt | Alternate toolbar functions |
---
Loop and Mode Combinations
Loops and modes can interact. A mode might change the loop behavior, or a loop might trigger a mode transition.
Common Combinations
| Pattern | How It Works | Example |
|---|---|---|
| Mode-specific loop | Loop behavior differs by mode | Do Not Disturb mode: notification loop suppressed |
| Loop triggers mode | After N repetitions, mode changes | After 3 failed login attempts, account enters "locked" mode |
| Mode affects loop frequency | Mode changes loop timing | "Focus mode" reduces notification frequency from real-time to hourly |
| Loop exits mode | After timeout, mode reverts | Screen dims to sleep mode after inactivity loop |
---
Real-World Loop and Mode Examples
Alarm Clock
| Aspect | Design |
|---|---|
| Loop type | Open loop: repeats at same time until disabled |
| Long loop | After 3 snoozes, snooze interval shortens (2nd: 9 min, 3rd: 5 min) |
| Mode | Snooze mode: alarm is temporarily silenced |
| Mode indicator | "Snoozing until 7:09 AM" displayed on screen |
| Mode escape | "Stop" button always visible alongside "Snooze" |
Text Editor (Google Docs)
| Aspect | Design |
|---|---|
| Loop type | Auto-save open loop: saves every few seconds while editing |
| Long loop | Saves become less frequent during periods of no edits |
| Modes | Editing, Suggesting, Viewing |
| Mode indicator | Mode selector dropdown + colored cursor (blue = editing, green = suggesting) |
| Mode escape | Mode selector always visible in toolbar |
Smart Thermostat (Nest)
| Aspect | Design |
|---|---|
| Loop type | Temperature check loop: every 5 minutes |
| Long loop | Learns schedule over 2 weeks; adapts set-points automatically |
| Modes | Home, Away, Eco, Manual override |
| Mode indicator | Leaf icon (eco), "Away" text, temperature display |
| Mode escape | Manual adjustment exits Away/Eco mode immediately |
Notification System
| Aspect | Design |
|---|---|
| Loop type | Open loop: checks for new notifications at interval |
| Long loop | Reduces frequency if user ignores notifications consistently |
| Modes | Normal, Do Not Disturb, Focus |
| Mode indicator | DND icon in status bar, banner at top of notification panel |
| Mode escape | Toggle in control center; scheduled auto-exit |
---
Loop and Mode Checklist
Loops
- [ ] Is this an open or closed loop? Is that the right choice?
- [ ] For open loops: can users stop or adjust the loop?
- [ ] For closed loops: is progress shown? What happens at completion?
- [ ] Have you designed the long loop (behavior at 1st, 10th, 100th use)?
- [ ] Does the interaction use progressive reduction for experienced users?
- [ ] Can users resurface removed scaffolding if they need help?
- [ ] Is loop frequency appropriate for user need and system resources?
Modes
- [ ] Is a mode necessary, or can you avoid it entirely?
- [ ] Is the current mode visible at all times?
- [ ] Is mode entry deliberate (not accidental)?
- [ ] Is there an obvious, always-visible escape from every mode?
- [ ] Have you tested for mode errors (right action, wrong mode)?
- [ ] Could you use a spring-loaded mode instead of a toggle mode?
- [ ] Is the total number of modes three or fewer?
Rules and State in Microinteractions
Rules are the invisible engine of a microinteraction. Once a trigger fires, rules determine what happens: what changes, in what order, with what constraints, and when the interaction ends. Users never see rules directly -- they experience their effects through feedback. But when rules are poorly designed, users feel it immediately: the toggle that does not remember its position, the slider that jumps to unexpected values, the form that erases their input on error.
What Rules Define
Every microinteraction's rules answer these questions:
| Question | What It Determines | Example |
|---|---|---|
| What happens first? | The initial response to the trigger | Button text changes to "Saving..." |
| What sequence follows? | Steps that occur in order | Validate input, send request, show result |
| What can the user do during? | Available actions while processing | Cancel button appears during upload |
| What can the user NOT do? | Constraints that prevent errors | Cannot submit form with empty required fields |
| What are the boundaries? | Minimum, maximum, and default values | Character limit: 280; volume: 0-100%; quantity: 1-99 |
| When does it end? | Completion condition | Request returns success; timer reaches zero |
| What if it fails? | Error handling behavior | Show error message, preserve input, suggest fix |
---
Defining Rules: The Goal-First Method
Start with the goal, not the interface. What is the user trying to accomplish? Derive every rule from that goal.
Process
1. State the goal in one sentence: "The user wants to set their alarm time." 2. Identify the minimum inputs: Time (hour, minute), AM/PM, days of week. 3. Define the simplest path: Tap time, scroll to desired hour/minute, toggle AM/PM, select days, confirm. 4. Add constraints: Cannot set alarm in the past (today). Maximum 20 alarms. Minimum interval between alarms: 1 minute. 5. Handle failures: If alarm cannot be set (permission denied), show error with action to fix it. 6. Define the end state: Alarm is set, confirmation shown, alarm appears in list.
Rule Complexity vs. Frequency
| Usage Frequency | Rule Complexity | Rationale | Example |
|---|---|---|---|
| Many times per day | Minimal rules, zero configuration | Must be instant and frictionless | Liking a post: one tap, done |
| Once per day | Simple rules, smart defaults | Allow some configuration | Setting an alarm: time + days |
| Once per week | Moderate rules, options available | Users can invest time | Scheduling a meeting: time, attendees, recurrence |
| Once ever | Full rule set, onboarding acceptable | First-time setup | Account creation: email, password, preferences |
---
State Management Within Microinteractions
Every microinteraction has state -- the current condition of the interaction at any given moment. Managing state well means users always know where they are, what happened, and what they can do next.
Core States of a Microinteraction
| State | Description | Visual Indicator | User Can... |
|---|---|---|---|
| Idle | Ready and waiting for trigger | Default appearance | Initiate the interaction |
| Active/In Progress | Processing or awaiting input | Loading spinner, active color | Cancel, wait, or provide input |
| Success | Completed successfully | Green checkmark, confirmation text | Move on, undo (if available) |
| Error | Failed to complete | Red indicator, error message | Retry, correct input, dismiss |
| Partial | Partially complete or partially loaded | Partial progress, skeleton | Continue, wait for more |
| Disabled | Cannot be initiated | Grayed out, reduced opacity | Nothing (show reason on hover/focus) |
State Transition Map
Map every possible transition between states to ensure no combination is overlooked:
┌─────────┐
trigger │ IDLE │ reset
┌─────────→│ │←──────────┐
│ └────┬────┘ │
│ │ trigger │
│ ▼ │
│ ┌──────────┐ │
│ │ ACTIVE │───────────┤
│ │ │ cancel │
│ └────┬─────┘ │
│ ┌──┴──┐ │
│ │ │ │
│ success fail │
│ │ │ │
│ ▼ ▼ │
│ ┌────────┐ ┌───────┐ │
│ │SUCCESS │ │ ERROR │ │
│ │ │ │ │──retry─┘
│ └───┬────┘ └───────┘
│ │ timeout/dismiss
└─────────┘State Persistence
| Persistence Type | When to Use | Storage Method | Example |
|---|---|---|---|
| Ephemeral | Within a single session | Component state (React state, SwiftUI @State) | Hover state, dropdown open/closed |
| Session | Across page navigations, lost on close | Session storage, navigation state | Form progress, scroll position |
| Persistent | Across sessions, survives app close | Local storage, database, user preferences | Theme setting, notification preferences |
| Synced | Across devices | Cloud database, account-linked storage | Read/unread status, bookmarks |
---
Constraints and Limitations
Constraints are rules that prevent errors by limiting what users can do. Well-designed constraints feel natural -- users do not notice them because the wrong action was never possible.
Types of Constraints in Microinteractions
| Constraint Type | Mechanism | Example |
|---|---|---|
| Range | Limit input to min/max values | Volume slider: 0-100%, cannot exceed |
| Format | Enforce specific input patterns | Phone field: auto-formats as (555) 123-4567 |
| Type | Restrict input to valid characters | Numeric field: keyboard shows numbers only |
| Sequence | Enforce step order | Payment flow: shipping before payment before confirm |
| Dependency | One option enables/disables others | "Ship to different address" checkbox reveals address form |
| Capacity | Limit quantity or selection count | File upload: maximum 5 files, 10MB each |
| Temporal | Restrict timing of actions | "Undo send": available for 30 seconds only |
Implementing Constraints Gracefully
Prevent rather than punish. The best constraint is one users never encounter because the wrong action was impossible:
| Punishing (bad) | Preventing (good) |
|---|---|
| "Invalid date format" error after typing | Date picker control that only allows valid dates |
| "That username is taken" after submitting form | Real-time availability check as user types |
| "File too large" error after waiting for upload | Show size limit upfront; disable upload for oversized files |
| "Cannot select past dates" error message | Gray out and disable past dates in calendar |
Communicating Constraints
| Method | When to Use | Example |
|---|---|---|
| Disabled state | Action not available yet | Submit button grayed until form is valid |
| Counter | Approaching a limit | "23/280 characters" or "3 of 5 files uploaded" |
| Visual boundary | Range limits | Slider track shows min/max; cursor stops at edges |
| Inline hint | Format requirements | "Must be 8+ characters with one number" below password field |
| Progressive disclosure | Complex constraints | Advanced options hidden behind "Show more" |
---
Error States
Error states are what happens when rules are violated or when the system fails. Error handling is where most microinteractions fall apart -- and where thoughtful design has the most impact on user trust.
Error State Principles
1. Preserve the user's work. Never erase input on error. If a form fails validation, keep everything the user typed.
2. Explain in human language. Not "Error 422: Unprocessable Entity" but "That email address looks incomplete. Did you forget the domain (e.g., @gmail.com)?"
3. Point to the problem. Show the error next to the field that caused it, not in a banner at the top of the page.
4. Offer a path forward. Every error message should suggest a fix or offer an alternative.
5. Time it right. Validate on blur (when the user leaves the field) for format errors; validate on submit for cross-field errors.
Error State Taxonomy
| Error Type | Cause | Detection Timing | Display Strategy |
|---|---|---|---|
| Format error | Wrong input pattern (email, phone) | On blur or real-time | Inline message below field |
| Missing required | Required field left empty | On submit | Highlight field, inline message |
| Range error | Value outside allowed range | Real-time or on blur | Inline message with valid range |
| Conflict error | Input conflicts with existing data | On submit (requires server check) | Inline with suggestion |
| System error | Server failure, network issue | On submit | Banner or modal with retry option |
| Permission error | User lacks authorization | On trigger | Disable trigger or show explanation |
| Timeout error | Operation took too long | After threshold | Message with retry; preserve input |
Error Recovery Patterns
| Pattern | How It Works | Example |
|---|---|---|
| Inline correction | User fixes error in place | Red-bordered field; user retypes; border turns green |
| Undo | Reverse the action that caused the error | "Undo" link in error toast message |
| Retry | Attempt the same action again | "Retry" button after network timeout |
| Suggestion | System proposes a valid alternative | "Did you mean john@gmail.com?" |
| Fallback | System provides an alternative path | "Upload failed. Try a smaller file or paste a URL instead." |
| Graceful degradation | System completes partial operation | "3 of 5 files uploaded. Retry remaining?" |
---
Edge Cases
Edge cases are the boundary conditions where microinteractions often break. Designing for edge cases means asking "What happens when...?" for every unusual situation.
Essential Edge Cases to Design For
| Edge Case | Question | Design Response |
|---|---|---|
| Empty state | What if there is no data? | Show helpful empty state with CTA |
| Zero value | What if the count is zero? | "No notifications" not "Notifications (0)" |
| Maximum value | What if the limit is reached? | Disable further input; show "Maximum reached" |
| Rapid repeated trigger | What if user clicks 10 times fast? | Debounce; disable trigger during processing |
| Interruption | What if user navigates away mid-action? | Save progress or warn before leaving |
| Slow connection | What if the request takes 30 seconds? | Show progress; allow cancel |
| No connection | What if the user is offline? | Queue action; show "Will send when online" |
| Concurrent edit | What if two users edit the same thing? | Detect conflict; show merge options |
| Very long input | What if the user enters 10,000 characters? | Truncate display; show full on expand |
| Special characters | What if input contains emoji, HTML, or Unicode? | Sanitize and display correctly |
| Screen reader | What if the user cannot see the visual feedback? | Announce state changes via aria-live regions |
| Keyboard only | What if the user cannot use a mouse? | Ensure all triggers are focusable and operable via keyboard |
Edge Case Testing Methodology
1. Boundary values: Test at 0, 1, max-1, max, and max+1 for any numeric input. 2. Empty/full: Test with no data and with maximum data. 3. Speed: Test with instant response, 3-second delay, and 30-second delay. 4. Interruption: Test what happens when the user closes the browser, loses connection, or switches apps mid-action. 5. Repetition: Test triggering the same action 10 times rapidly. 6. Platform variety: Test on the slowest supported device and smallest supported screen.
---
What NOT to Allow
Deciding what NOT to allow is as important as deciding what to allow. Good rules prevent harmful, confusing, or destructive actions.
Actions to Prevent
| Action to Prevent | Why | How to Prevent |
|---|---|---|
| Double submission | Duplicates orders, messages, payments | Disable trigger on first click; debounce |
| Deleting without confirmation | Irreversible data loss | Confirmation dialog for destructive actions |
| Submitting invalid data | Creates bad records, user confusion | Client-side validation before submission |
| Exceeding rate limits | Overloads system, degrades experience | Throttle triggers; show "Try again in X seconds" |
| Conflicting selections | Logical impossibility (depart after arrive) | Disable impossible options based on other selections |
| Accidental mode entry | User does not realize they changed context | Require deliberate action (not hover) to enter modes |
The "Nothing Should Happen" Cases
Some trigger activations should produce no result -- and that is a deliberate rule:
| Situation | Rule | Feedback |
|---|---|---|
| Clicking a disabled button | No action | Show tooltip explaining why it is disabled |
| Submitting an empty required field | No submission | Highlight field; show "Required" |
| Dragging a non-draggable item | No movement | No cursor change; no visual response |
| Pressing a key outside valid range | No input | No character appears; optionally shake field |
| Tapping outside a modal | Close modal (if non-critical) or no action (if critical) | Modal dismisses or overlay flashes briefly |
---
State Design Checklist
- [ ] Have you defined every possible state (idle, active, success, error, disabled, partial)?
- [ ] Can users always tell which state the interaction is in?
- [ ] Have you mapped every state transition?
- [ ] Have you defined what is NOT allowed?
- [ ] Do constraints prevent errors instead of punishing them?
- [ ] Are error messages human-readable, specific, and actionable?
- [ ] Is user input preserved on error?
- [ ] Have you tested all edge cases (empty, max, rapid, offline, interrupted)?
- [ ] Is state persistence appropriate (ephemeral vs. session vs. permanent)?
- [ ] Can screen reader users perceive state changes?
Signature Moments in Microinteractions
A signature moment is a microinteraction so distinctive, so perfectly crafted, that it becomes inseparable from the product's identity. When someone describes Slack to a friend, they might mention the loading messages. When they think of the iPhone, they think of slide-to-unlock. When they use Stripe, they remember the animated checkmark on payment success. These are not features -- they are feelings, encoded in tiny interactive moments.
What Makes a Moment "Signature"
Not every polished microinteraction is a signature moment. Signature moments have specific characteristics that elevate them beyond mere polish.
Signature Moment Criteria
| Criteria | Definition | Test |
|---|---|---|
| Memorable | Users remember and can describe the moment to others | Ask users to describe your product; does this detail come up? |
| Frequent | Occurs often enough to become associated with the product | Does the user encounter this at least weekly? |
| Distinctive | No other product does it the same way | Would users recognize the product from this moment alone? |
| Functional | Serves a genuine purpose (not pure decoration) | Remove it -- does the experience become worse or just plainer? |
| Brand-aligned | Reflects the product's personality and values | Does this moment feel consistent with the brand voice? |
| Effortless | Adds delight without adding friction or cognitive load | Does it slow the user down or require attention? |
The Signature Moment Spectrum
| Level | Description | Example |
|---|---|---|
| Functional only | Works correctly, no distinctive personality | Standard progress bar |
| Polished | Well-designed, pleasant, but generic | Smooth animation on button press |
| Distinctive | Noticeably different from competitors | Stripe's animated gradient on payment processing |
| Signature | Iconic, inseparable from product identity | Facebook Like animation, Slack loading messages |
---
Iconic Signature Moments: Detailed Analysis
Facebook Like (Reactions)
| Aspect | Design Decision | Why It Works |
|---|---|---|
| Trigger | Long-press on Like button | Discoverable but not obtrusive; power users find it |
| Animation | Emoji reactions float up with spring physics | Physics makes them feel tangible and playful |
| Sound | Subtle pop sound on selection | Tactile confirmation without being annoying |
| Feedback | Selected reaction replaces Like text with colored label | Persistent reminder of your choice |
| Personality | Each reaction has unique animation (Love floats, Angry shakes) | Individual character creates emotional connection |
| Brand alignment | Playful, expressive, social -- matches Facebook's social identity | Feels like Facebook, not like enterprise software |
iPhone Slide-to-Unlock (Original)
| Aspect | Design Decision | Why It Works |
|---|---|---|
| Trigger | Slide gesture on text "Slide to unlock" | Clear affordance; text itself explains the action |
| Animation | Shimmer effect on text, slider follows finger precisely | Direct manipulation creates physical connection |
| Constraint | Must slide fully to unlock; partial slide springs back | Prevents accidental unlocks in pocket |
| Feedback | Smooth resistance; screen reveals behind slider | Continuous feedback throughout the action |
| Brand alignment | Elegant, minimal, tactile -- matched Apple's design ethos | Felt like no other phone at the time |
Slack Loading Messages
| Aspect | Design Decision | Why It Works |
|---|---|---|
| Context | Application startup, a normally frustrating wait | Transforms dead time into brand moment |
| Content | Rotating humorous/inspirational quotes | Variable content prevents staleness; creates anticipation |
| Personality | Quirky, warm, self-aware humor | Matches Slack's friendly, informal brand voice |
| Long loop | Different message each load; users see hundreds over time | Infinite variability keeps it fresh |
| Utility | Makes loading feel shorter through engagement | Perceived wait time decreases when users are reading |
Stripe Payment Success
| Aspect | Design Decision | Why It Works |
|---|---|---|
| Context | Payment completion -- a moment of anxiety | Transforms worry into relief and satisfaction |
| Animation | Animated checkmark draws itself; confetti particles | Celebratory without being excessive |
| Timing | Appears after brief deliberate pause | Pause creates anticipation; arrival creates reward |
| Color | Green on white with subtle gradient | Clean, trustworthy, reassuring |
| Brand alignment | Professional, polished, detail-oriented | Communicates Stripe's reliability and craft |
GitHub 404 Page
| Aspect | Design Decision | Why It Works |
|---|---|---|
| Context | Error state -- normally frustrating and forgettable | Transforms error into a brand moment |
| Design | Parallax Octocat illustration that responds to mouse movement | Interactive and surprising |
| Personality | Playful but not dismissive of the error | Acknowledges the problem while lightening the mood |
| Discovery | Users share the 404 page on social media | Error page becomes marketing through delight |
| Utility | Still provides navigation and search to find what they wanted | Function preserved alongside delight |
---
Where to Create Signature Moments
Not every microinteraction can or should be a signature moment. Focus signature investment on the right locations.
High-Opportunity Locations
| Location | Why It Works | Risk Level | Example |
|---|---|---|---|
| Loading/waiting states | Users are idle and receptive; transforms negative time | Low (does not affect core task) | Slack loading messages, branded spinners |
| Success confirmations | Emotional peak after completing a task | Low (celebration after success) | Stripe checkmark, Mailchimp high-five |
| Onboarding first action | First impression shapes perception | Medium (must not confuse) | Duolingo's first lesson completion animation |
| Empty states | Opportunity to show personality and guide next action | Low (no data at risk) | Dropbox illustrated empty states |
| Primary product action | The thing users do most often | High (must not add friction) | Twitter/X pull-to-refresh, Instagram double-tap |
| Error states | Opportunity to show grace and personality | Medium (must still communicate error) | GitHub 404, Tumblr "Nothing here" illustrations |
Low-Opportunity Locations (Avoid Signature Investment)
| Location | Why to Avoid | What to Do Instead |
|---|---|---|
| Settings pages | Infrequent, utilitarian | Standard controls, focus on clarity |
| Forms and data entry | Users want speed, not delight | Focus on reducing friction and clear validation |
| Administrative actions | Users are in task mode | Standard feedback, no surprises |
| Error recovery flows | Users are frustrated | Clear guidance, minimal decoration |
| Background processes | Users are not watching | Standard notifications on completion |
---
Creating Your Own Signature Moments
The Signature Moment Design Process
Step 1: Identify candidate moments
Map every microinteraction in your product and score each on two axes:
| Low Emotional Charge | High Emotional Charge | |
|---|---|---|
| High Frequency | Routine -- polish but do not over-invest | Prime candidate for signature moment |
| Low Frequency | Ignore -- standard treatment | Secondary candidate -- invest if resources allow |
Step 2: Match to brand personality
Define your brand's personality in three adjectives and filter every signature moment decision through them.
| Brand Personality | Signature Style | Avoid |
|---|---|---|
| Playful, warm, approachable | Animated illustrations, humor, casual copy | Corporate formality, stiff animations |
| Professional, trustworthy, precise | Clean animations, subtle transitions, elegant typography | Whimsy, cartoon illustrations, slang |
| Bold, rebellious, energetic | Dramatic transitions, strong colors, unexpected interactions | Subtle anything -- go big or skip it |
| Calm, minimal, thoughtful | Slow transitions, generous spacing, quiet moments | Flashy animations, sound effects, confetti |
Step 3: Choose the medium
| Medium | Best For | Considerations |
|---|---|---|
| Animation | Visual polish, state transitions | Performance cost; must be interruptible |
| Copy/microcopy | Personality, humor, tone | Must be translatable; cultural sensitivity |
| Sound | Confirmation, identity | Must be optional; battery impact on mobile |
| Illustration | Empty states, errors, onboarding | Asset production cost; must match brand style |
| Haptics | Physical confirmation, mobile delight | Platform-dependent; must be subtle |
Step 4: Prototype and test
| Test | What to Observe | Pass Criteria |
|---|---|---|
| First use | Does the user notice? Do they smile? | Positive reaction without confusion |
| 10th use | Does it still delight or has it become annoying? | Neutral to positive (not irritating) |
| 100th use | Does it add friction? Do power users wish it were gone? | Invisible or still pleasant; never blocking |
| Remove it | Does anyone notice or care? | Users mention its absence unprompted |
---
Making Mundane Interactions Delightful
You do not need a grand gesture to create delight. Small touches on mundane interactions can accumulate into a product that just "feels right."
Delight Techniques for Everyday Microinteractions
| Technique | How It Works | Example |
|---|---|---|
| Personality in copy | Replace generic text with human text | "No results" becomes "We looked everywhere but came up empty" |
| Physics-based animation | Use spring physics instead of linear easing | Toggle bounces slightly at the end of its travel |
| Contextual response | Interaction varies based on context | Weather app animation matches current conditions |
| Progressive reveal | Reward exploration with hidden details | Hover over avatar reveals a personalized greeting |
| Meaningful transition | Connect two states with a transition that shows relationship | New item slides into list from the "Add" button position |
| Intentional sound | One signature sound for one signature action | Slack's "knock brush" notification sound |
Delight vs. Distraction Checklist
Before adding delight, verify it is not distraction:
- [ ] Does this add friction to the interaction? (If yes, reconsider)
- [ ] Will this become annoying after 100 uses? (If yes, tone it down)
- [ ] Does this delay the user from completing their task? (If yes, remove it)
- [ ] Does this work on slow devices and connections? (If no, make it progressive)
- [ ] Does this respect user accessibility settings? (If no, fix it)
- [ ] Could a user with no cultural context understand it? (If no, simplify it)
---
When to Invest in Signature Moments
Signature moments cost design and engineering time. Not every product stage justifies the investment.
Investment Timing
| Product Stage | Signature Moment Investment | Rationale |
|---|---|---|
| MVP / Early startup | Near zero -- focus on core function | Get the basics right first; premature polish is waste |
| Product-market fit achieved | Begin experimenting with 1-2 candidates | You know which interactions matter; invest there |
| Growing product | Invest in 2-3 true signature moments | Differentiation and brand memory become important |
| Mature product | Maintain and refresh existing signature moments | Prevent staleness; keep moments feeling fresh |
The "Would They Miss It" Test
The ultimate test of a signature moment: remove it and see if users notice and complain. If they do, it is truly signature. If they do not, it was decoration.
| User Response to Removal | Verdict | Action |
|---|---|---|
| "Where did the [thing] go? Bring it back!" | True signature moment | Restore and protect it |
| "Something feels different but I cannot say what" | Polished detail, not signature | Keep it but do not over-invest |
| No reaction | Decoration | Consider removing to simplify codebase |
---
Signature Moment Pitfalls
| Pitfall | Why It Happens | Prevention |
|---|---|---|
| Delight that delays | Animation or sound adds time to critical path | Ensure signature moment does not extend interaction time |
| Trying too hard | Every interaction is "delightful" resulting in sensory overload | Limit to 2-3 signature moments in the entire product |
| Cultural blind spots | Humor or imagery that does not translate | Test with diverse user groups; avoid culturally specific references |
| Forgetting accessibility | Signature moment relies on vision, motion, or hearing | Ensure core function works without the signature layer |
| Stale moments | Same animation/copy for years becomes invisible | Rotate variable content (like Slack messages); refresh periodically |
| Copy without context | Copying another product's signature moment | Signature moments must grow from your own brand personality |
---
Signature Moment Audit
Evaluate your product's signature moments:
- [ ] Can you identify 1-3 moments that define your product's personality?
- [ ] Do these moments occur on frequent, high-visibility interactions?
- [ ] Are they functional first, delightful second?
- [ ] Do they match your brand personality?
- [ ] Have you tested them at 1st, 10th, and 100th use?
- [ ] Do they work for all users (including those with accessibility needs)?
- [ ] Would users notice and complain if you removed them?
- [ ] Are you maintaining and refreshing them over time?
Trigger Design for Microinteractions
A trigger is what initiates a microinteraction. It is the entry point -- the doorknob, the button, the notification badge. Triggers come in two fundamental types: manual triggers that users consciously activate, and system triggers that fire automatically when conditions are met. Every microinteraction begins with one of these, and the quality of the trigger determines whether users can discover, understand, and initiate the interaction at all.
Manual Triggers
Manual triggers require a deliberate user action. They live inside UI controls -- buttons, switches, icons, form fields, gestures, voice commands. The user must perceive the trigger, understand what it does, and act on it.
Types of Manual Triggers
| Trigger Type | Mechanism | Best For | Example |
|---|---|---|---|
| Tap/Click | Single press on a target | Most common actions | Submit button, checkbox, link |
| Long press | Press and hold | Secondary actions, previews | iOS Haptic Touch preview, Android context menu |
| Swipe | Horizontal or vertical drag | Spatial navigation, destructive actions | Swipe to delete, swipe between pages |
| Drag | Press, hold, and move | Reordering, adjusting values | Slider thumb, list reordering |
| Pinch/Spread | Two-finger scale gesture | Zoom, resize | Map zoom, photo zoom |
| Double-tap | Two rapid taps | Quick positive action | Instagram double-tap to like |
| Voice | Spoken command | Hands-free contexts | "Hey Siri, set a timer" |
| Type | Keyboard input | Search, data entry | Search-as-you-type, password field |
Manual Trigger Design Principles
1. Affordance clarity: The trigger must look like what it does. A toggle should look slideable. A button should look pressable. A drag handle should look grabbable.
2. Action labeling: Whenever possible, label the trigger with a verb that describes the outcome: "Save," "Send," "Delete." Avoid vague labels like "Submit," "OK," or "Continue."
3. Size and touch targets: Touch triggers must be at least 44x44 points (Apple HIG) or 48x48dp (Material Design). Desktop triggers should be at least 24x24 pixels with generous click padding.
4. Placement convention: Triggers should appear where users expect them based on platform conventions:
| Action Type | Expected Position | Platform Convention |
|---|---|---|
| Primary action | Bottom-right (mobile), top-right (desktop) | FAB on Android, toolbar on macOS |
| Cancel/Back | Top-left (mobile), bottom-left (dialogs) | Back chevron on iOS, Escape key on desktop |
| Destructive | Bottom of menu, separated from safe actions | Red text, separated by divider |
| Settings | Top-right corner or hamburger menu | Gear icon, three dots |
| Search | Top of screen, center or right | Magnifying glass icon |
5. Discoverability hierarchy:
| Visibility Level | When to Use | Example |
|---|---|---|
| Always visible | Primary actions, frequent use | Send button in messaging app |
| Visible on hover/focus | Secondary actions, contextual | Edit icon appears on card hover |
| Visible on gesture | Tertiary actions, power users | Swipe to reveal archive/delete |
| Hidden (keyboard shortcut) | Expert acceleration | Cmd+K for command palette |
---
System Triggers
System triggers fire automatically when predefined conditions are met. The user does not initiate them -- the system detects a change in state and responds.
Types of System Triggers
| Trigger Condition | How It Works | Example |
|---|---|---|
| Time-based | Fires at a specific time or after a duration | Alarm at 7am, session timeout at 30 minutes |
| Threshold-based | Fires when a value crosses a limit | Low battery at 20%, storage full at 95% |
| Data-based | Fires when new data arrives | New email, incoming message, price change |
| Location-based | Fires when user enters or exits a geofence | "You're near a store" reminder, weather alerts |
| State-change | Fires when system state changes | Connection lost, sync complete, download finished |
| Error-based | Fires when an error condition is detected | Form validation failure, payment declined |
| Inactivity | Fires after a period of no user input | Screen dims after 30 seconds, "Are you still watching?" |
System Trigger Design Principles
1. Relevance over frequency: A system trigger should fire only when the information is genuinely useful at that moment. Every unnecessary notification erodes trust and trains users to ignore triggers.
2. Threshold calibration: Set thresholds that balance urgency with usefulness:
| Too Early | Right Threshold | Too Late |
|---|---|---|
| Battery warning at 50% | Battery warning at 20% | Battery warning at 2% |
| Disk full warning at 50% | Disk full warning at 90% | Disk full warning at 99% |
| Inactivity timeout at 1 min | Inactivity timeout at 15 min | Inactivity timeout at 2 hours |
3. Escalation: Important system triggers should escalate if ignored:
Passive indicator → Active notification → Blocking alert
(badge count) (banner/toast) (modal dialog)4. Silencing rules: Users must be able to silence system triggers. Provide:
- Global mute (Do Not Disturb)
- Per-category control (mute marketing, keep security)
- Scheduled quiet hours
---
Trigger States
Every manual trigger exists in multiple states. Users must be able to distinguish each state at a glance.
The Five Essential Trigger States
| State | Visual Treatment | Purpose | Example |
|---|---|---|---|
| Default | Normal appearance, ready for interaction | Shows availability | Blue button with white text |
| Hover | Subtle change on cursor proximity | Confirms interactivity (desktop only) | Background darkens slightly |
| Active/Pressed | Visual depression or color shift | Confirms action registration | Button scales down 2%, color deepens |
| Disabled | Reduced opacity, no cursor change | Prevents action, shows unavailability | 40% opacity, cursor: not-allowed |
| Loading | Spinner or animation replaces label | Shows processing in progress | Spinner replaces "Save" text |
Additional States for Complex Triggers
| State | When Used | Visual Treatment | Example |
|---|---|---|---|
| Focus | Keyboard navigation | Focus ring or outline | Blue 2px outline on Tab focus |
| Selected/On | Toggle or checkbox in active state | Filled, checked, or colored | Toggle thumb slides right, track turns green |
| Error | Associated input has validation error | Red border, error icon | Red outline on text field |
| Success | Action completed successfully | Green checkmark, brief animation | Checkmark replaces spinner for 1.5s |
State Transition Timing
| Transition | Duration | Easing | Why |
|---|---|---|---|
| Default to Hover | Instant or 50ms | ease-out | Must feel responsive to cursor |
| Default to Active | Instant | none | Must feel like physical press |
| Active to Loading | Instant | none | Immediate acknowledgment |
| Loading to Success | 200-400ms | ease-in-out | Smooth enough to notice |
| Loading to Error | 200-400ms | ease-in-out | Smooth enough to notice |
| Any to Disabled | 150ms | ease-out | Gentle enough not to flash |
---
Designing Invisible Triggers
Some triggers have no visible control -- they rely on gestures, sensor input, or spatial awareness. These are powerful but dangerous because they have zero discoverability.
When Invisible Triggers Are Appropriate
| Appropriate | Inappropriate |
|---|---|
| Shortcut for an action also available through a visible trigger | Only way to access a feature |
| Power-user acceleration | First-time user critical path |
| Delight/easter egg with no functional consequence | Destructive or irreversible action |
| Platform-standard gesture (pinch to zoom) | Novel gesture with no convention |
Making Invisible Triggers Learnable
1. One-time coaching: Show a brief animation or tooltip on first use demonstrating the gesture.
2. Partial reveal: Show just enough to hint at the interaction. For swipe-to-delete, show the edge of the red "Delete" background peeking out slightly.
3. Contextual hint: When the user appears stuck (long pause, repeated taps), show a tooltip: "Try swiping left to delete."
4. Progressive discovery: Let users stumble onto the trigger through natural exploration, then reinforce it. Pull-to-refresh was initially invisible but became a platform convention through consistent implementation.
Invisible Trigger Checklist
- [ ] Is there a visible alternative for the same action?
- [ ] Is the gesture a platform convention (not a custom invention)?
- [ ] Do you provide coaching for first-time users?
- [ ] Does the trigger work reliably (no accidental fires)?
- [ ] Can users undo the result if they trigger it accidentally?
---
Trigger Placement and Visibility
Where a trigger lives on screen determines whether users find it. Placement follows predictable patterns based on reading order, platform convention, and visual hierarchy.
Visibility Priority Framework
| Priority | Screen Position | What Goes Here |
|---|---|---|
| 1 (highest) | Center of viewport | Primary CTA, hero action, onboarding step |
| 2 | Top-right (desktop) or bottom-center (mobile) | Primary persistent action (FAB, "New" button) |
| 3 | Inline with content | Contextual actions (edit, delete, reply) |
| 4 | Navigation bar / toolbar | Frequent global actions (search, settings) |
| 5 (lowest) | Overflow menu, long-press, swipe | Secondary and tertiary actions |
Fitts's Law Application
Fitts's Law states that the time to reach a target is proportional to the distance and inversely proportional to the target size. Practical implications:
- Corners and edges are easy targets on desktop (cursor stops at screen edge). Place primary actions near edges.
- Bottom of screen is easy to reach on mobile (thumb zone). Place primary actions in the bottom third.
- Larger triggers are faster to hit. Primary actions should be physically larger than secondary ones.
- Distance matters. Group related triggers together to reduce travel between sequential actions.
Trigger Grouping Patterns
| Pattern | When to Use | Example |
|---|---|---|
| Toolbar | Multiple peer-level actions | Text formatting: Bold, Italic, Underline |
| Action group | Primary + secondary actions | "Save" (primary) + "Save as Draft" (secondary) |
| Contextual menu | Many actions on a single object | Right-click: Copy, Paste, Delete, Rename |
| FAB with expansion | Primary action with variants | "+" FAB expands to: New Message, New Group, New Channel |
| Inline actions | Actions tied to specific content | Reply, Like, Share below a social post |
---
Trigger Audit Checklist
Use this checklist to evaluate triggers across an interface.
Discoverability
- [ ] Can a first-time user find the trigger within 5 seconds?
- [ ] Is the trigger labeled with a clear verb (not "Submit" or "OK")?
- [ ] Does the trigger look interactive (distinct from static elements)?
- [ ] Is the trigger large enough for its input method (touch: 44pt+, mouse: 24px+)?
State Communication
- [ ] Can users distinguish default, hover, active, disabled, and loading states?
- [ ] Does the disabled state explain why it is disabled (tooltip or nearby text)?
- [ ] Does the loading state indicate progress or at least activity?
- [ ] Is the success/error state visible for long enough to register?
Placement
- [ ] Is the trigger where platform conventions suggest?
- [ ] Is the primary action more visually prominent than secondary actions?
- [ ] Are related triggers grouped together?
- [ ] Is the trigger reachable with one hand on mobile (bottom two-thirds of screen)?
Edge Cases
- [ ] What happens on double-tap/double-click? (Prevent duplicate submissions)
- [ ] What happens if the trigger is activated during loading? (Disable or queue)
- [ ] What happens on very slow connections? (Show loading state immediately)
- [ ] What if the user activates the trigger and navigates away? (Handle gracefully)