Description
While the invoice list fetches data, users see a blank white region with no indication of progress, which feels like a broken page. Animated skeleton placeholders matching the shape of real invoice cards should occupy the list until data arrives.
Technical Context
src/components/invoice/InvoiceCardSkeleton.tsx (new) renders a gray animated placeholder using Tailwind's animate-pulse class for the title, amount, status badge, and recipient count areas. src/components/invoice/InvoiceList.tsx conditionally renders an array of eight skeleton cards when isLoading from src/hooks/useInvoices.ts is true. src/components/ui/Skeleton.tsx provides the base pulsing rectangle primitive used throughout the app.
Acceptance Criteria
Description
While the invoice list fetches data, users see a blank white region with no indication of progress, which feels like a broken page. Animated skeleton placeholders matching the shape of real invoice cards should occupy the list until data arrives.
Technical Context
src/components/invoice/InvoiceCardSkeleton.tsx(new) renders a gray animated placeholder using Tailwind'sanimate-pulseclass for the title, amount, status badge, and recipient count areas.src/components/invoice/InvoiceList.tsxconditionally renders an array of eight skeleton cards whenisLoadingfromsrc/hooks/useInvoices.tsis true.src/components/ui/Skeleton.tsxprovides the base pulsing rectangle primitive used throughout the app.Acceptance Criteria