# Mobile Builder Agent Memory ## Design System - Shimmer Primitives - Shimmer widgets are in `packages/design_system/lib/src/widgets/shimmer/` - Available: `UiShimmer`, `UiShimmerBox`, `UiShimmerCircle`, `UiShimmerLine`, `UiShimmerListItem`, `UiShimmerStatsCard`, `UiShimmerSectionHeader`, `UiShimmerList` - `UiShimmerList.itemBuilder` takes `(int index)` -- single parameter, not `(BuildContext, int)` - `UiShimmerBox.borderRadius` accepts `BorderRadius?` (nullable), uses `UiConstants.radiusMd` as default - All shimmer shapes render as solid white containers; the parent `UiShimmer` applies the animated gradient - Exported via `design_system.dart` barrel ## Staff App Feature Locations - Shifts: `packages/features/staff/shifts/` -- has ShiftsPage (tabbed: MyShifts/Find/History) + ShiftDetailsPage - Home: `packages/features/staff/home/` -- WorkerHomePage with sections (TodaysShifts, TomorrowsShifts, Recommended, Benefits, QuickActions) - Payments: `packages/features/staff/payments/` -- PaymentsPage with gradient header + stats + payment history - Home cubit: `HomeStatus` enum (initial, loading, loaded, error) - Shifts bloc: `ShiftsStatus` enum + sub-loading flags (`availableLoading`, `historyLoading`) - Payments bloc: uses sealed state classes (`PaymentsLoading`, `PaymentsLoaded`, `PaymentsError`) ## UiConstants Spacing Tokens - Use `UiConstants.space1` through `UiConstants.space24` for spacing - Radius: `UiConstants.radiusSm`, `radiusMd`, `radiusLg`, `radiusFull`, `radiusBase`, `radiusMdValue` (double) - `UiConstants.radiusFull` is a `BorderRadius`, `UiConstants.radiusMdValue` is a `double` ## Barrel Files (Staff Features) - Shifts: `lib/staff_shifts.dart` exports modules only - Payments: `lib/staff_payements.dart` (note: typo in filename) exports module only - Home: `lib/staff_home.dart` exports module only - These barrel files only export modules, not individual widgets -- skeleton widgets don't need to be added ## Client App Feature Locations - Coverage: `packages/features/client/client_coverage/` - Home: `packages/features/client/home/` (no loading spinner -- renders default data during load) - Billing: `packages/features/client/billing/` (billing_page, pending_invoices_page, invoice_ready_page) - Reports: `packages/features/client/reports/` (reports_page with metrics_grid, plus 6 sub-report pages) - Reports barrel: `widgets/reports_page/index.dart` - Hubs: `packages/features/client/hubs/` (client_hubs_page + hub_details_page + edit_hub_page) ## Staff Profile Sections (shimmer done) - Compliance: certificates, documents, tax_forms -- all have shimmer skeletons - Finances: staff_bank_account, time_card -- all have shimmer skeletons - Onboarding: attire, profile_info (personal_info_page only) -- have shimmer skeletons - Support: faqs, privacy_security (including legal sub-pages) -- have shimmer skeletons - Pages that intentionally keep CircularProgressIndicator (action/submit spinners): - form_i9_page, form_w4_page (submit button spinners) - experience_page (save button spinner) - preferred_locations_page (save button + overlay spinner) - certificate_upload_page, document_upload_page, attire_capture_page (form/upload pages, no initial load) - language_selection_page (no loading state, static list) - LegalDocumentSkeleton is shared between PrivacyPolicyPage and TermsOfServicePage ## Key Patterns Observed - BenefitsOverviewPage also has CircularProgressIndicator (not shimmer-ified yet) - ShiftDetailsPage has a dialog-level spinner in the "applying" dialog -- this is intentional, not a page loading state - Hub details/edit pages use CircularProgressIndicator as action overlays (save/delete) -- keep as-is, not initial load - Client home page has no loading spinner; it renders with default empty dashboard data