Build home screen digest card UI layout
epic-periodic-summaries-ui-task-004 — Implement the visual layout of the PeriodicSummaryCard widget shown on the peer mentor home screen during active summary periods. Card must display summary period label, key stats (sessions, hours, contacts), a mini period comparison row using the PeriodComparisonWidget, a dismiss button, and a tap target navigating to the full mentor profile summary. Apply design token colors, spacing, and typography.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 2 - 518 tasks
Can start after Tier 1 completes
Implementation Notes
Build the card as a `BlocBuilder
Use `ShimmerLoading` (or a simple `DecoratedBox` with animated opacity) for the skeleton — do not use a third-party shimmer package unless it is already a project dependency. All spacing and typography must come from the project's design token system.
Testing Requirements
Widget tests with flutter_test: (1) BlocProvider wrapping the card in Loaded state renders all expected child widgets (period label, 3 stat chips, comparison widget, dismiss button), (2) Loading state renders skeleton placeholder and no stat chips, (3) Error state renders error message and retry button, (4) Dismissed state renders SizedBox.shrink(), (5) Tapping dismiss button dispatches DismissPeriodicSummaryCard event to BLoC. Golden tests for each state. Accessibility audit using flutter_test's `SemanticsHandle` to confirm all interactive elements have semantic labels.
If the cached summary is from a prior period (e.g., previous quarter's card is still cached), the digest card could appear on the home screen with outdated numbers after a new period begins, confusing users who have already seen that data.
Mitigation & Contingency
Mitigation: In the SummaryCacheRepository, store the period_start and period_end alongside cached data. In the PeriodicSummaryCard BLoC, compare the cached record's period against the current date using PeriodCalculatorService. Only render the card if the cached summary belongs to the active period.
Contingency: If stale cards appear in production, push a hotfix that adds the period validity check to the BLoC and clears all cached summaries older than the current period boundary via a forced cache flush on next app launch.
Using colour alone to distinguish underactive from overloaded mentors in the coordinator view would fail WCAG 1.4.1 (use of colour). This is especially critical for organisations serving users with colour vision deficiency.
Mitigation & Contingency
Mitigation: Always pair colour indicators with a text label or icon (e.g., a downward arrow + 'Underactive' text alongside the amber colour). Use the contrast-safe-color-palette design tokens throughout. Run the contrast-ratio-validator on all new colour combinations in CI.
Contingency: If an accessibility audit flags colour-only indicators post-launch, introduce icon-based indicators as a patch release and update the design token definitions to enforce the paired-indicator pattern going forward.
Inserting a new card into the role-based home screen requires changes to shared home screen widget composition, which may conflict with parallel feature branches also modifying the home screen layout, causing merge conflicts and integration delays.
Mitigation & Contingency
Mitigation: Implement the PeriodicSummaryCard as a fully self-contained widget that the home screen conditionally renders based on a BLoC state flag. Minimise changes to the home screen itself to a single conditional insertion point, reducing the surface area for merge conflicts.
Contingency: If integration conflicts block the PR, isolate the card behind the organisation-scoped feature flag so it can be toggled independently and merged without affecting other home screen changes.