| name | ux-feedback-patterns |
| description | User feedback patterns for interactions - loading states, success/error messages, form validation, empty states. Ensures users understand system state and next steps. Use when implementing user-facing state changes and interactions: - Form submissions with validation feedback, success/error messages - Async operations needing loading indicators (API calls, data fetching) - Error handling flows with clear recovery paths and retry options - Empty state designs with helpful messaging (no data, no results) - User mentions "form", "loading", "error", "validation", "async", "API call" Keywords: loading, success, error, form, validation, async, feedback, toast, empty state Focus on WHEN to show feedback, WHAT type (toast/inline/modal), HOW LONG (timing). |
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
Accessibility
- Use ARIA live regions for dynamic messages
- Associate errors with form fields
- Provide text alternatives for visual indicators
- Don't rely on color alone
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:
- Loading state for async operations with noticeable delay
- Success feedback (toast, inline, or visual confirmation)
- Error messages specific and actionable
- Empty states have helpful messaging + action
- Optimistic updates rollback on failure
- Destructive actions require confirmation
- All feedback is accessible (ARIA, alt text)
- States are visually distinct and clear
- No silent failures
- Consistent patterns across application
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.