Loading States
Loading states should be subtle and calm, indicating progress without creating anxiety or distraction.
Loading Indicators
Circular Progress Indicator
Use for:
- Full-page loads
- Modal/overlay loads
- Button states during async actions
Specifications:
- Size: 24–32 pt for inline, 40–48 pt for full-page
- Color: Teal Edge (
#4BB4C8) or Amber Star (#FFC857) - Style: Indeterminate (spinning) for unknown duration
- Center in available space
Linear Progress Indicator
Use for:
- File uploads
- Multi-step processes
- Known progress percentages
Specifications:
- Height: 4 pt
- Color: Teal Edge (
#4BB4C8) - Background: Border color (
#E0D7C8) - Full width of container
Skeleton Screens
For content-heavy pages, use skeleton screens instead of spinners:
Card Skeletons
Mimic the layout of actual cards with placeholder shapes:
- Container: Same dimensions as real card (white background, 12pt radius)
- Shapes: Gray rectangles representing text lines and images
- Color: Light gray (
#E8E8E8) with subtle shimmer animation - Spacing: Match real card spacing
Book List Skeleton
- Book cover placeholder: Rectangle with aspect ratio of book cover
- Title placeholder: 2 lines of varying widths
- Author placeholder: 1 line, narrower than title
- Spacing matches real book list tiles
Feed Skeleton
- User avatar placeholder: Circle
- Name/heading placeholder: 1–2 lines
- Body text placeholder: 3–4 lines
- Spacing matches real feed cards
Animation
Shimmer Effect
- Subtle left-to-right shimmer on skeleton shapes
- Duration: 1.5–2 seconds per cycle
- Gradient: Light gray to slightly lighter gray
- Continuous loop
Fade-In
When real content loads:
- Fade out skeleton
- Fade in real content
- Duration: 200–300ms
- Smooth transition to avoid jarring changes
Button Loading States
When a button triggers an async action:
Option 1: Disabled with Spinner
- Disable button (reduce opacity to 60%)
- Replace text with small circular spinner
- Same size and color as original button
Option 2: Inline Spinner
- Keep button text visible
- Add small spinner to left or right of text
- Maintain button dimensions
Error States
If loading fails:
- Replace loading indicator with error message
- Use Error color (
#C44545) for icon/text - Provide retry action when appropriate
- Keep error messages concise and helpful
Guidelines
- Prefer skeleton screens for content-heavy pages (lists, feeds)
- Use simple spinners for quick operations (under 2 seconds)
- Avoid multiple simultaneous loading indicators
- Match skeleton layout to actual content layout
- Keep animations subtle and calm
- No emoji in loading or error messages
Implementation Notes
- Use platform-native progress indicators when possible
- Ensure loading states are accessible (announce to screen readers)
- Consider using shimmer package for skeleton screens in Flutter