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: |4 User feedback patterns: loading states, success/error messages, form validation, empty states.5 Use when: form submissions, async loading indicators, error handling flows, empty state designs.6 Keywords: loading, success, error, form, validation, async, feedback, toast, empty state, API call7 Do NOT use for: visual styling, responsive layout, Figma extraction, accessibility-only.8---910# UX Feedback Patterns1112## Purpose13Ensure users never wonder "What's happening?" or "Did that work?" through clear, consistent feedback patterns.1415---1617## Core Principle1819**Users must receive feedback for EVERY interaction.**2021Every user action needs feedback in one or more states:221. Loading/Processing232. Success243. Error254. Empty2627---2829## Loading States3031### When to Show Loading3233**Timing thresholds (adjust to your context):**34- **< 100ms**: Perceived as instant, no feedback needed35- **100-300ms**: Optional subtle indicator36- **300ms-1s**: Show spinner or skeleton37- **1-5s**: Spinner + explanatory text38- **5-10s**: Progress bar with percentage39- **10s+**: Progress bar + explanation + cancel option4041### Loading Patterns4243**Button Loading:**44- Disable button to prevent double-submission45- Show spinner inside button or change text46- Keep button in place (don't shift layout)4748**Content Loading:**49- Prefer skeleton screens over spinners50- Match skeleton structure to actual content51- Maintain layout space (prevent content jump)5253**Progress Indicators:**54- Use for file uploads, large operations55- Show percentage when determinable56- Provide cancel option for long operations5758---5960## Success States6162### When to Show Success6364**Always show for:**65- Form submissions66- Data mutations (create, update, delete)67- File uploads68- Account changes6970**Skip for:**71- Very quick actions (near-instant completion)72- Continuous interactions (likes, toggles) - use optimistic updates73- Actions where feedback is inherent in result7475### Success Patterns7677**Toast Notifications:**78- Auto-dismiss after 3-5 seconds79- Position: top-right or top-center (consistent)80- Specific message, not generic "Success"8182**Inline Messages:**83- For form submissions: show below form84- Less intrusive than toasts85- Can stay visible longer8687**Visual Confirmation:**88- Button state change (e.g., "Save" → "Saved ✓")89- Brief color change (green tint)90- Return to normal after 2-3 seconds9192---9394## Error States9596### Error Message Principles9798**Be Specific:**99- ❌ "Error occurred"100- ✅ "Email already exists. Try logging in instead."101102**Be Helpful:**103- Explain what happened104- Suggest what to do next105- Provide recovery action when possible106107**Be Human:**108- Natural language, avoid technical jargon109- Don't blame user110- Empathetic tone for serious errors111112**Severity Levels:**113- **Critical**: System failure, data loss - modal, manual dismiss114- **High**: Form validation, API errors - prominent, actionable115- **Medium**: Warnings, non-blocking - dismissible notices116- **Low**: Helper text, suggestions - subtle, informative117118### Error Patterns119120**Form Field Errors:**121- Show inline, next to/below field122- Trigger on blur (not every keystroke)123- Include error icon for visibility124- Keep visible until corrected125126**Global Errors:**127- Prominent alert at top or modal128- Include error icon and title129- Explain what failed and why130- Provide action: Retry, Contact support, Learn more131- Manual dismiss (don't auto-hide critical errors)132133**Error Recovery:**134- Always provide a path forward135- "Try Again" button for transient errors136- Link to help/support for persistent issues137- Save user's work when possible138139---140141## Empty States142143### Never Show Blank Screens144145**Empty state must include:**1461. **Icon/Illustration**: Visual context1472. **Title**: "No [items] yet"1483. **Description**: Brief explanation1494. **Action** (when possible): CTA to create first item150151### Empty State Types152153**First-Time Empty:**154- Welcoming, encouraging tone155- Clear next step to get started156157**Search No Results:**158- Acknowledge the query159- Suggest alternatives (check spelling, try different terms)160- Provide way to clear/modify search161162**Filtered Empty:**163- Explain filters are active164- Show way to clear filters165166---167168## Interaction Patterns169170### Form Validation171172**Validation Timing:**173- On blur: Validate individual field174- On submit: Validate entire form175- On change: Only for real-time feedback (password strength, username availability)176177**Success Indicators:**178- Optional: show checkmark for valid fields179- Only after field touched180- Subtle, not distracting181182### Button States183184**Required states:**185- Default: Normal appearance186- Hover: Visual feedback187- Active/Pressed: Depressed appearance188- Loading: Spinner + disabled189- Disabled: Grayed out + tooltip/explanation190- Success: Brief confirmation (2-3s)191192### Optimistic Updates193194**Pattern:** Update UI immediately, rollback on error195196**Best for:**197- Fast, reliable operations (likes, favorites)198- Low-stakes actions199- When instant feedback improves perceived performance200201**How it works:**2021. Update UI immediately (assume success)2032. Send API request2043. If success: nothing (already updated)2054. If error: rollback + show error206207**When NOT to use:**208- Destructive actions (delete)209- Complex validations210- Critical operations (payments)211212### Destructive Actions213214**Always confirm before:**215- Deleting items216- Permanent changes217- Bulk actions218219**Confirmation pattern:**220- Modal dialog with clear title221- Explain consequences: "This cannot be undone"222- Primary action labeled clearly ("Delete", not "Yes")223- Use danger color (red) for destructive button224- Provide "Cancel" as escape hatch225226---227228## Best Practices229230### Timing231- Feedback should feel immediate (instant perceived response)232- Success messages: auto-dismiss after 3-5 seconds233- Error messages: manual dismiss or longer timeout234- Loading threshold: Show indicators after ~300ms235236### Tone237- Be specific, not vague238- Be helpful, suggest next steps239- Be human, avoid technical jargon240- Don't blame user241242### Consistency243- Same pattern for same action across app244- Predictable feedback locations245- Consistent timing and animations246- Unified messaging tone247248---249250## Common Mistakes2512521. **Silent failures** - Action fails with no feedback2532. **Vague errors** - "Error" tells nothing useful2543. **No loading state** - User clicks repeatedly2554. **Blank screens** - Empty state without explanation2565. **Disabled without reason** - No tooltip explaining why2576. **Flickering loaders** - Show only for operations with noticeable delay2587. **Success overload** - Toast for every tiny action2598. **Technical error codes** - Show user-friendly messages2609. **No recovery path** - Error with no next step26110. **Blocking entire UI** - Use local loading when possible262263---264265## Validation Checklist266267For every interactive feature:268- [ ] Loading state for async operations with noticeable delay269- [ ] Success feedback (toast, inline, or visual confirmation)270- [ ] Error messages specific and actionable271- [ ] Empty states have helpful messaging + action272- [ ] Optimistic updates rollback on failure273- [ ] Destructive actions require confirmation274- [ ] All feedback is accessible (ARIA, alt text)275- [ ] States are visually distinct and clear276- [ ] No silent failures277- [ ] Consistent patterns across application278279---280281## Key Takeaway282283**Never leave users guessing.** Clear, timely feedback is the difference between a frustrating experience and a delightful one.284285Timing guidelines are based on UX research but should be adjusted to your context. When in doubt, over-communicate rather than under-communicate.