Slice 5 Verification Checklist β
Use this checklist before moving to Phase 8
This is your final quality check for app polish and UX. Work through each section carefully. This determines whether your app feels professional or like a student project.
Quick Links β
If you find issues, these steps can help:
- Step 1: Understanding UX β UX concepts
- Step 2: Create Spinner β Loading indicator
- Step 3: Add Loading States β Loading UX
- Step 4: Understanding Feedback β User feedback concepts
- Step 5: Create Toast System β Toast notifications
- Step 6: Add Success Feedback β Success messages
- Step 7: Improve Error Messages β Friendly errors
- Step 8: Add Confirmation Dialog β Delete confirmation
- Step 9: Improve Visual Design β Styling and responsiveness
- Step 10: Add Accessibility β A11y features
1. File Structure β
src/
βββ components/
β βββ Spinner.tsx
β βββ Toast.tsx
β βββ ConfirmDialog.tsx
βββ contexts/
β βββ ToastContext.tsx
βββ hooks/
β βββ useToast.ts
βββ utils/
β βββ errorMessages.ts
βββ (existing files)Verify:
- [ ] Spinner component exists
- [ ] Toast components exist (Toast.tsx, ToastContext.tsx)
- [ ] ConfirmDialog component exists
- [ ] useToast hook exists
- [ ] errorMessages helper exists
2. Spinner Component β
Check Spinner.tsx:
- [ ] Component accepts size and color props
- [ ] Uses CSS animation for rotation
- [ ] Default size is ~20px
- [ ] Works inline (doesn't take full width)
Test spinner:
npm run devVerify:
- [ ] Spinner appears and rotates smoothly
- [ ] Can use in buttons:
<button><Spinner /> Loading...</button> - [ ] Animation is smooth (not choppy)
- [ ] No console errors
3. Loading States β
List Loading β
- Go to
/todos - Refresh page
Verify:
- [ ] Spinner appears immediately
- [ ] "Loading todos..." text shows
- [ ] Then todos list appears
- [ ] No flicker or layout shift
- [ ] No errors in console
Create Form Loading β
- Go to
/todos/new - Fill form
- Click submit
Verify:
- [ ] Button shows spinner + "Creating..."
- [ ] Button disabled (can't click again)
- [ ] Form inputs disabled
- [ ] After success: redirects to list
- [ ] No double-submission possible
Update Form Loading β
- Edit a todo
- Change title
- Click save
Verify:
- [ ] Button shows spinner + "Saving..."
- [ ] Button and inputs disabled
- [ ] After success: redirects to list
- [ ] Changes saved correctly
4. Toast Notification System β
Component Check β
Verify ToastContext.tsx:
- [ ] Creates React Context
- [ ] ToastProvider wraps app
- [ ] Manages toast state (array)
- [ ] showToast function adds toast
- [ ] dismissToast function removes toast
- [ ] Auto-dismiss after 3-5 seconds
Verify Toast.tsx:
- [ ] ToastContainer renders all toasts
- [ ] Each toast has icon, message
- [ ] Different colors for success/error/info
- [ ] Click to dismiss
- [ ] Positioned top-right or top-center
Verify useToast.ts:
- [ ] Hook provides showToast and dismissToast
- [ ] Throws error if used outside ToastProvider
Visual Check β
Open your app:
- [ ] ToastProvider wraps entire app in App.tsx/main.tsx
- [ ] ToastContainer rendered inside provider
- [ ] Toasts positioned correctly (top-right or top-center)
Functional Test β
Test success toast:
- Create a todo
- Verify:
- [ ] Green toast appears
- [ ] Shows β icon
- [ ] Message: "Todo created!"
- [ ] Auto-dismisses after ~3 seconds
- [ ] Can click to dismiss early
Test error toast:
- Turn off internet
- Try to create todo
- Verify:
- [ ] Red toast appears
- [ ] Shows β icon
- [ ] Message is user-friendly
- [ ] Auto-dismisses after ~5 seconds
Test multiple toasts:
- Trigger 3-4 toasts quickly
- Verify:
- [ ] All appear
- [ ] Stack vertically
- [ ] Don't overlap
- [ ] Dismiss in order
5. Success Feedback β
Test all CRUD operations:
Create β
- Create a new todo
- Verify:
- [ ] Loading state shows
- [ ] Green toast: "Todo created!"
- [ ] Redirects to list
- [ ] New todo appears
Update β
- Edit a todo
- Save changes
- Verify:
- [ ] Loading state shows
- [ ] Green toast: "Changes saved!"
- [ ] Redirects to list
- [ ] Changes visible
Delete β
- Delete a todo
- Confirm deletion
- Verify:
- [ ] Green toast: "Todo deleted!"
- [ ] Todo removed from list
- [ ] No errors
6. Error Messages β
Check errorMessages.ts:
- [ ] File exists in src/utils/
- [ ] Exports getFriendlyErrorMessage function
- [ ] Maps Firebase errors to friendly messages
- [ ] Handles permission-denied, not-found, network errors
- [ ] Handles Auth errors (invalid-email, wrong-password, etc.)
- [ ] Has default fallback message
Test Friendly Errors β
Validation error:
- Submit form with empty title
- Verify:
- [ ] Error: "Title is required" (not technical)
Network error:
- Turn off internet
- Try to create todo
- Verify:
- [ ] Error: "Network error. Please check your internet connection."
- [ ] NOT: "Failed to fetch" or error code
General errors:
- [ ] All errors shown in toasts
- [ ] All errors user-friendly
- [ ] No technical jargon shown to users
- [ ] Technical details only in console.error
7. Confirmation Dialog β
Check ConfirmDialog.tsx:
- [ ] Component exists
- [ ] Shows modal with backdrop
- [ ] Has title, message, two buttons
- [ ] Escape key closes dialog
- [ ] Backdrop click closes dialog
- [ ] Click inside dialog keeps it open
Functional Test β
Test dialog appearance:
- Click "Delete" on a todo
- Verify:
- [ ] Dialog appears
- [ ] Dark backdrop behind it
- [ ] Title: "Delete Todo"
- [ ] Clear message
- [ ] Cancel button (gray)
- [ ] Delete button (red)
Test cancel (button):
- Open dialog
- Click "Cancel"
- Verify:
- [ ] Dialog closes
- [ ] Todo NOT deleted
Test cancel (backdrop):
- Open dialog
- Click outside dialog (on backdrop)
- Verify:
- [ ] Dialog closes
- [ ] Todo NOT deleted
Test cancel (Escape):
- Open dialog
- Press Escape key
- Verify:
- [ ] Dialog closes
- [ ] Todo NOT deleted
Test confirm:
- Open dialog
- Click "Delete"
- Verify:
- [ ] Dialog closes
- [ ] Todo deleted
- [ ] Success toast appears
8. Visual Design β
Spacing β
Check your app layout:
- [ ] Consistent spacing between elements
- [ ] Forms have even gaps
- [ ] Cards have consistent padding
- [ ] Page margins look professional
- [ ] No cramped or overly-spaced areas
Hover States β
Test buttons:
- Hover over buttons
- Verify:
- [ ] Button lifts slightly (translateY)
- [ ] Shadow appears or darkens
- [ ] Color changes
- [ ] Smooth transition (~0.2s)
Test links:
- Hover over links
- Verify:
- [ ] Color changes
- [ ] Underline appears
- [ ] Smooth transition
Test cards:
- Hover over todo cards
- Verify:
- [ ] Shadow appears
- [ ] Border color changes
- [ ] Smooth transition
Shadows β
Check cards, buttons, modals:
- [ ] Subtle shadows visible
- [ ] Not too harsh or dark
- [ ] Creates sense of depth
- [ ] Shadows darken on hover (for interactive elements)
Typography β
Check text throughout app:
- [ ] Headings have clear hierarchy (h1 > h2 > h3)
- [ ] Body text readable (14-16px)
- [ ] Line height comfortable (not cramped)
- [ ] Font family is professional
- [ ] Text colors have good contrast
9. Mobile Responsiveness β
Open DevTools (F12) β Toggle device toolbar (Ctrl/Cmd+Shift+M)
iPhone SE (375px width) β
- Set viewport to iPhone SE
- Verify:
- [ ] No horizontal scroll
- [ ] All content visible
- [ ] Buttons stack vertically (if multi-button forms)
- [ ] Text readable (not too small)
- [ ] Touch targets β₯ 44px
- [ ] Form inputs full width
- [ ] Spacing appropriate (not too cramped)
- [ ] Toast notifications fit screen
iPad (768px width) β
- Set viewport to iPad
- Verify:
- [ ] Layout adapts nicely
- [ ] Content not too stretched
- [ ] Spacing looks good
Desktop (1920px width) β
- Set viewport to desktop
- Verify:
- [ ] Content centered (max-width applied)
- [ ] Not stretched to edges
- [ ] Looks professional
Rotate (Portrait β Landscape) β
- Test both orientations
- Verify:
- [ ] Layout adapts
- [ ] No broken layouts
- [ ] No overflow
10. Accessibility β
Keyboard Navigation β
Close mouse/trackpad, use only keyboard:
- Press Tab to navigate
- Verify:
- [ ] Can Tab to all interactive elements
- [ ] Tab order logical (topβbottom, leftβright)
- [ ] Current focus visible (blue outline)
- [ ] Enter activates buttons
- [ ] Escape closes modals
- [ ] Can navigate entire app without mouse
Form Labels β
Check all forms:
- [ ] All inputs have
<label>elements - [ ] Labels use htmlFor/id to connect to inputs
- [ ] Click label focuses input
- [ ] Labels are descriptive
ARIA Labels β
Check icon buttons:
- [ ] Delete button has aria-label="Delete todo"
- [ ] Edit button has aria-label="Edit todo"
- [ ] Close buttons have aria-label="Close"
- [ ] All icon-only buttons have descriptive labels
Modal Focus β
Test ConfirmDialog:
- Open delete dialog
- Verify:
- [ ] Focus moves to dialog
- [ ] Tab cycles through dialog buttons
- [ ] Can't Tab outside dialog while open
- [ ] Escape closes dialog
- [ ] Focus returns to trigger button after close
Toast Accessibility β
Check ToastContainer:
- [ ] Has aria-live="polite" or "assertive"
- [ ] Has role="status" or "alert"
- [ ] Icons have aria-hidden="true"
- [ ] Messages announced by screen readers
Semantic HTML β
Check page structure:
- [ ] Uses
<main>for main content - [ ] Uses
<header>for page/section headers - [ ] Uses
<section>for thematic grouping - [ ] Uses
<button>not<div onClick> - [ ] Uses
<a>for links,<button>for actions
Heading Hierarchy β
Check headings:
- [ ] h1 for page title
- [ ] h2 for major sections
- [ ] h3 for subsections
- [ ] No skipped levels (h1 β h3)
- [ ] Logical document outline
11. Browser Console β
Open DevTools Console (F12):
- [ ] No red errors
- [ ] No yellow warnings (or only expected ones)
- [ ] No "Failed to fetch" during normal operation
- [ ] No "Permission denied" errors
- [ ] No React warnings about keys or props
12. Code Quality β
Lint β
npm run lintVerify:
- [ ] No errors
- [ ] No serious warnings
- [ ] Code formatted consistently
TypeScript β
npx tsc --noEmitVerify:
- [ ] No type errors
- [ ] All imports resolve correctly
- [ ] No
anytypes (unless necessary)
13. Understanding Check β
Before moving on, make sure you understand:
- [ ] Why loading states matter? (Prevent confusion, double-submissions)
- [ ] What are toast notifications? (Non-blocking, temporary feedback)
- [ ] Why friendly error messages? (Users don't understand technical jargon)
- [ ] Why confirmation dialogs? (Prevent accidental destructive actions)
- [ ] What makes design responsive? (Works on all screen sizes)
- [ ] Why accessibility matters? (Everyone should be able to use your app)
- [ ] What is keyboard navigation? (Using app without mouse)
- [ ] Why use semantic HTML? (Provides meaning for screen readers)
If you can't answer these, review:
- Concepts β UX and polish explained
- Step 1: Understanding UX
- Step 4: Understanding Feedback
14. Git Commit β
Before committing:
- [ ] All checks above pass
- [ ] App works as expected
- [ ] No console errors
- [ ] Looks professional
- [ ] Mobile responsive
- [ ] Accessible
Check status:
git statusStage all changes:
git add -ACommit:
git commit -m "Add polish and UX improvements to todo app
- Create Spinner component for loading states
- Add loading states to all async operations
- Implement toast notification system
- Add success feedback for all CRUD operations
- Create error message helper for user-friendly errors
- Add ConfirmDialog component for delete confirmations
- Improve visual design (spacing, hover states, shadows)
- Add mobile responsive layout
- Implement accessibility features (ARIA, keyboard nav, focus management)
- Ensure semantic HTML and heading hierarchy
UX improvements:
- Users always know when app is processing
- Users get confirmation for all actions
- Users see friendly errors (not technical jargon)
- Users can't accidentally delete
- App works on all screen sizes
- App is keyboard accessible
- Professional visual design"Verify commit:
git log -115. Final Checks β
You're ready for Phase 8 if:
- [ ] β Spinner component working
- [ ] β Loading states on all async operations
- [ ] β Toast notification system implemented
- [ ] β Success feedback for all actions
- [ ] β User-friendly error messages
- [ ] β Confirmation dialog before delete
- [ ] β Professional visual design
- [ ] β Consistent spacing and hover states
- [ ] β Subtle shadows for depth
- [ ] β Mobile responsive (works on phones and tablets)
- [ ] β Keyboard navigation works
- [ ] β ARIA labels on all interactive elements
- [ ] β Focus management in modals
- [ ] β Semantic HTML throughout
- [ ] β No console errors
- [ ] β All code committed to Git
- [ ] β You understand the polish concepts
π Phase 7 Complete! π β
Congratulations! You've completed all 5 slices of Phase 7: Building the App!
What You Built β
Your app now has:
- β Complete authentication system
- β Full CRUD operations
- β Firestore security rules
- β Professional UX with loading states
- β Toast notifications
- β User-friendly error handling
- β Confirmation dialogs
- β Beautiful visual design
- β Mobile responsiveness
- β Accessibility features
This is a production-ready web application!
Skills Mastered β
- React components and hooks
- TypeScript
- Firebase Authentication & Firestore
- Security rules
- Context API
- Custom hooks
- Error handling
- User experience design
- Responsive design
- Accessibility
What's Next? β
Phase 8: Testing & Deploy
Time to take your app live! You'll:
- Test thoroughly
- Deploy to Firebase Hosting
- Get a live URL
- Share with the world
Time: ~25 minutes
Continue to Phase 8: Testing & Deploy β
Troubleshooting β
Spinner Not Rotating β
Problem: CSS animation not applied.
Fix:
.spinner {
animation: spin 0.8s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}Toasts Not Showing β
Problem: ToastProvider not wrapping app or ToastContainer not rendered.
Fix:
<ToastProvider>
<App />
<ToastContainer />
</ToastProvider>"useToast must be used within ToastProvider" β
Problem: Component using useToast is outside ToastProvider.
Fix: Make sure ToastProvider is at the root level, wrapping your entire app.
Dialog Backdrop Click Closes Dialog Content Too β
Problem: Missing stopPropagation().
Fix:
<div className="modal-dialog" onClick={(e) => e.stopPropagation()}>Mobile Layout Broken β
Problem: Missing viewport meta tag or max-width.
Fix:
- Add to HTML:
<meta name="viewport" content="width=device-width, initial-scale=1.0" />- Add to CSS:
.container {
max-width: 100%;
}Focus Outline Not Visible β
Problem: Using :focus instead of :focus-visible.
Fix:
*:focus-visible {
outline: 2px solid var(--color-primary);
outline-offset: 2px;
}Ready for Deployment! β
Your app is polished and ready to go live.