UX Feedback Patterns
Purpose
Ensure users never wonder "What's happening?" or "Did that work?" through clear, consistent feedback patterns.
Core Principle
Users must receive feedback for EVERY interaction.
Every user action needs feedback in one or more states:
- Loading/Processing
- Success
- Error
- Empty
Loading States
When to Show Loading
Timing thresholds (adjust to your context):
- < 100ms: Perceived as instant, no feedback needed
- 100-300ms: Optional subtle indicator
- 300ms-1s: Show spinner or skeleton
- 1-5s: Spinner + explanatory text
- 5-10s: Progress bar with percentage
- 10s+: Progress bar + explanation + cancel option
Loading Patterns
Button Loading:
- Disable button to prevent double-submission
- Show spinner inside button or change text
- Keep button in place (don't shift layout)
Content Loading:
- Prefer skeleton screens over spinners
- Match skeleton structure to actual content
- Maintain layout space (prevent content jump)
Progress Indicators:
- Use for file uploads, large operations
- Show percentage when determinable
- Provide cancel option for long operations
Success States
When to Show Success
Always show for:
- Form submissions
- Data mutations (create, update, delete)
- File uploads
- Account changes
Skip for:
- Very quick actions (near-instant completion)
- Continuous interactions (likes, toggles) - use optimistic updates
- Actions where feedback is inherent in result
Success Patterns
Toast Notifications:
- Auto-dismiss after 3-5 seconds
- Position: top-right or top-center (consistent)
- Specific message, not generic "Success"
Inline Messages:
- For form submissions: show below form
- Less intrusive than toasts
- Can stay visible longer
Visual Confirmation:
- Button state change (e.g., "Save" → "Saved ✓")
- Brief color change (green tint)
- Return to normal after 2-3 seconds
Error States
Error Message Principles
Be Specific:
- ❌ "Error occurred"
- ✅ "Email already exists. Try logging in instead."
Be Helpful:
- Explain what happened
- Suggest what to do next
- Provide recovery action when possible
Be Human:
- Natural language, avoid technical jargon
- Don't blame user
- Empathetic tone for serious errors
Severity Levels:
- Critical: System failure, data loss - modal, manual dismiss
- High: Form validation, API errors - prominent, actionable
- Medium: Warnings, non-blocking - dismissible notices
- Low: Helper text, suggestions - subtle, informative
Error Patterns
Form Field Errors:
- Show inline, next to/below field
- Trigger on blur (not every keystroke)
- Include error icon for visibility
- Keep visible until corrected
Global Errors:
- Prominent alert at top or modal
- Include error icon and title
- Explain what failed and why
- Provide action: Retry, Contact support, Learn more
- Manual dismiss (don't auto-hide critical errors)
Error Recovery:
- Always provide a path forward
- "Try Again" button for transient errors
- Link to help/support for persistent issues
- Save user's work when possible
Empty States
Never Show Blank Screens
Empty state must include:
- Icon/Illustration: Visual context
- Title: "No [items] yet"
- Description: Brief explanation
- Action (when possible): CTA to create first item
Empty State Types
First-Time Empty:
- Welcoming, encouraging tone
- Clear next step to get started
Search No Results:
- Acknowledge the query
- Suggest alternatives (check spelling, try different terms)
- Provide way to clear/modify search
Filtered Empty:
- Explain filters are active
- Show way to clear filters
Interaction Patterns
Form Validation
Validation Timing:
- On blur: Validate individual field
- On submit: Validate entire form
- On change: Only for real-time feedback (password strength, username availability)
Success Indicators:
- Optional: show checkmark for valid fields
- Only after field touched
- Subtle, not distracting
Button States
Required states:
- Default: Normal appearance
- Hover: Visual feedback
- Active/Pressed: Depressed appearance
- Loading: Spinner + disabled
- Disabled: Grayed out + tooltip/explanation
- Success: Brief confirmation (2-3s)
Optimistic Updates
Pattern: Update UI immediately, rollback on error
Best for:
- Fast, reliable operations (likes, favorites)
- Low-stakes actions
- When instant feedback improves perceived performance
How it works:
- Update UI immediately (assume success)
- Send API request
- If success: nothing (already updated)
- If error: rollback + show error
When NOT to use:
- Destructive actions (delete)
- Complex validations
- Critical operations (payments)
Destructive Actions
Always confirm before:
- Deleting items
- Permanent changes
- Bulk actions
Confirmation pattern:
- Modal dialog with clear title
- Explain consequences: "This cannot be undone"
- Primary action labeled clearly ("Delete", not "Yes")
- Use danger color (red) for destructive button
- Provide "Cancel" as escape hatch
Best Practices
Timing
- Feedback should feel immediate (instant perceived response)
- Success messages: auto-dismiss after 3-5 seconds
- Error messages: manual dismiss or longer timeout
- Loading threshold: Show indicators after ~300ms
Tone
- Be specific, not vague
- Be helpful, suggest next steps
- Be human, avoid technical jargon
- Don't blame user
Consistency
- Same pattern for same action across app
- Predictable feedback locations
- Consistent timing and animations
- Unified messaging tone
Common Mistakes
- Silent failures - Action fails with no feedback
- Vague errors - "Error" tells nothing useful
- No loading state - User clicks repeatedly
- Blank screens - Empty state without explanation
- Disabled without reason - No tooltip explaining why
- Flickering loaders - Show only for operations with noticeable delay
- Success overload - Toast for every tiny action
- Technical error codes - Show user-friendly messages
- No recovery path - Error with no next step
- Blocking entire UI - Use local loading when possible
Validation Checklist
For every interactive feature:
Key Takeaway
Never leave users guessing. Clear, timely feedback is the difference between a frustrating experience and a delightful one.
Timing guidelines are based on UX research but should be adjusted to your context. When in doubt, over-communicate rather than under-communicate.
1---2name: ux-feedback-patterns3description: User feedback patterns: loading states, success/error messages, form validation, empty states. Use when: form submissions, async loading indicators, error handling flows, empty state designs. Keywords: loading, success, error, form, validation, async, feedback, toast, empty state, API call Do NOT use for: visual styling, responsive layout, Figma extraction, accessibility-only.4---56# UX Feedback Patterns78## Purpose9Ensure users never wonder "What's happening?" or "Did that work?" through clear, consistent feedback patterns.1011---1213## Core Principle1415**Users must receive feedback for EVERY interaction.**1617Every user action needs feedback in one or more states:181. Loading/Processing192. Success203. Error214. Empty2223---2425## Loading States2627### When to Show Loading2829**Timing thresholds (adjust to your context):**30- **< 100ms**: Perceived as instant, no feedback needed31- **100-300ms**: Optional subtle indicator32- **300ms-1s**: Show spinner or skeleton33- **1-5s**: Spinner + explanatory text34- **5-10s**: Progress bar with percentage35- **10s+**: Progress bar + explanation + cancel option3637### Loading Patterns3839**Button Loading:**40- Disable button to prevent double-submission41- Show spinner inside button or change text42- Keep button in place (don't shift layout)4344**Content Loading:**45- Prefer skeleton screens over spinners46- Match skeleton structure to actual content47- Maintain layout space (prevent content jump)4849**Progress Indicators:**50- Use for file uploads, large operations51- Show percentage when determinable52- Provide cancel option for long operations5354---5556## Success States5758### When to Show Success5960**Always show for:**61- Form submissions62- Data mutations (create, update, delete)63- File uploads64- Account changes6566**Skip for:**67- Very quick actions (near-instant completion)68- Continuous interactions (likes, toggles) - use optimistic updates69- Actions where feedback is inherent in result7071### Success Patterns7273**Toast Notifications:**74- Auto-dismiss after 3-5 seconds75- Position: top-right or top-center (consistent)76- Specific message, not generic "Success"7778**Inline Messages:**79- For form submissions: show below form80- Less intrusive than toasts81- Can stay visible longer8283**Visual Confirmation:**84- Button state change (e.g., "Save" → "Saved ✓")85- Brief color change (green tint)86- Return to normal after 2-3 seconds8788---8990## Error States9192### Error Message Principles9394**Be Specific:**95- ❌ "Error occurred"96- ✅ "Email already exists. Try logging in instead."9798**Be Helpful:**99- Explain what happened100- Suggest what to do next101- Provide recovery action when possible102103**Be Human:**104- Natural language, avoid technical jargon105- Don't blame user106- Empathetic tone for serious errors107108**Severity Levels:**109- **Critical**: System failure, data loss - modal, manual dismiss110- **High**: Form validation, API errors - prominent, actionable111- **Medium**: Warnings, non-blocking - dismissible notices112- **Low**: Helper text, suggestions - subtle, informative113114### Error Patterns115116**Form Field Errors:**117- Show inline, next to/below field118- Trigger on blur (not every keystroke)119- Include error icon for visibility120- Keep visible until corrected121122**Global Errors:**123- Prominent alert at top or modal124- Include error icon and title125- Explain what failed and why126- Provide action: Retry, Contact support, Learn more127- Manual dismiss (don't auto-hide critical errors)128129**Error Recovery:**130- Always provide a path forward131- "Try Again" button for transient errors132- Link to help/support for persistent issues133- Save user's work when possible134135---136137## Empty States138139### Never Show Blank Screens140141**Empty state must include:**1421. **Icon/Illustration**: Visual context1432. **Title**: "No [items] yet"1443. **Description**: Brief explanation1454. **Action** (when possible): CTA to create first item146147### Empty State Types148149**First-Time Empty:**150- Welcoming, encouraging tone151- Clear next step to get started152153**Search No Results:**154- Acknowledge the query155- Suggest alternatives (check spelling, try different terms)156- Provide way to clear/modify search157158**Filtered Empty:**159- Explain filters are active160- Show way to clear filters161162---163164## Interaction Patterns165166### Form Validation167168**Validation Timing:**169- On blur: Validate individual field170- On submit: Validate entire form171- On change: Only for real-time feedback (password strength, username availability)172173**Success Indicators:**174- Optional: show checkmark for valid fields175- Only after field touched176- Subtle, not distracting177178### Button States179180**Required states:**181- Default: Normal appearance182- Hover: Visual feedback183- Active/Pressed: Depressed appearance184- Loading: Spinner + disabled185- Disabled: Grayed out + tooltip/explanation186- Success: Brief confirmation (2-3s)187188### Optimistic Updates189190**Pattern:** Update UI immediately, rollback on error191192**Best for:**193- Fast, reliable operations (likes, favorites)194- Low-stakes actions195- When instant feedback improves perceived performance196197**How it works:**1981. Update UI immediately (assume success)1992. Send API request2003. If success: nothing (already updated)2014. If error: rollback + show error202203**When NOT to use:**204- Destructive actions (delete)205- Complex validations206- Critical operations (payments)207208### Destructive Actions209210**Always confirm before:**211- Deleting items212- Permanent changes213- Bulk actions214215**Confirmation pattern:**216- Modal dialog with clear title217- Explain consequences: "This cannot be undone"218- Primary action labeled clearly ("Delete", not "Yes")219- Use danger color (red) for destructive button220- Provide "Cancel" as escape hatch221222---223224## Best Practices225226### Timing227- Feedback should feel immediate (instant perceived response)228- Success messages: auto-dismiss after 3-5 seconds229- Error messages: manual dismiss or longer timeout230- Loading threshold: Show indicators after ~300ms231232### Tone233- Be specific, not vague234- Be helpful, suggest next steps235- Be human, avoid technical jargon236- Don't blame user237238### Consistency239- Same pattern for same action across app240- Predictable feedback locations241- Consistent timing and animations242- Unified messaging tone243244---245246## Common Mistakes2472481. **Silent failures** - Action fails with no feedback2492. **Vague errors** - "Error" tells nothing useful2503. **No loading state** - User clicks repeatedly2514. **Blank screens** - Empty state without explanation2525. **Disabled without reason** - No tooltip explaining why2536. **Flickering loaders** - Show only for operations with noticeable delay2547. **Success overload** - Toast for every tiny action2558. **Technical error codes** - Show user-friendly messages2569. **No recovery path** - Error with no next step25710. **Blocking entire UI** - Use local loading when possible258259---260261## Validation Checklist262263For every interactive feature:264- [ ] Loading state for async operations with noticeable delay265- [ ] Success feedback (toast, inline, or visual confirmation)266- [ ] Error messages specific and actionable267- [ ] Empty states have helpful messaging + action268- [ ] Optimistic updates rollback on failure269- [ ] Destructive actions require confirmation270- [ ] All feedback is accessible (ARIA, alt text)271- [ ] States are visually distinct and clear272- [ ] No silent failures273- [ ] Consistent patterns across application274275---276277## Key Takeaway278279**Never leave users guessing.** Clear, timely feedback is the difference between a frustrating experience and a delightful one.280281Timing guidelines are based on UX research but should be adjusted to your context. When in doubt, over-communicate rather than under-communicate.