medium priority low complexity frontend pending frontend specialist Tier 0

Acceptance Criteria

Widget accepts a required AssignmentStatus enum parameter with values: assigned, unassigned, waitingList
Each status renders a distinct visual indicator using design token colors (no hardcoded hex values)
Widget includes a Semantics widget wrapping with a descriptive label readable by VoiceOver/TalkBack (e.g., 'Status: Active assignment')
Widget renders correctly in both light and dark themes — colors sourced from design token system that responds to ThemeData.brightness
Widget is StatelessWidget — no local state, no BLoC dependency
An optional label parameter allows toggling text display alongside the indicator icon/dot
Indicator has a minimum tap/focus target of 44x44 logical pixels (WCAG 2.2 AA touch target)
Widget does not overflow in compact layouts — uses intrinsic sizing
A golden test screenshot matches the approved design for all three status states in both light and dark themes

Technical Requirements

frameworks
Flutter
design token system (AppColors, AppTypography, AppSpacing)
data models
AssignmentStatus (enum)
performance requirements
Widget builds in a single frame — no async operations
No rebuilds triggered internally — purely reactive to parent state
ui components
Semantics
Container/DecoratedBox (status dot)
Row
Text (optional label)

Execution Context

Execution Tier
Tier 0

Tier 0 - 440 tasks

Implementation Notes

Define the AssignmentStatus enum in a shared types file (e.g., lib/domain/enums/assignment_status.dart) so it can be reused across contact list and detail contexts. Map each status to a design token in a private extension method on the enum (e.g., AssignmentStatus.assigned.color(context)) to avoid a switch statement inside the widget's build method. Use Theme.of(context).brightness to select the appropriate token variant rather than MediaQuery. For the dot indicator, use a Container with BoxDecoration(shape: BoxShape.circle) — simpler than Icon and more flexible for sizing.

Wrap the entire widget in a Semantics widget with label set to the localized status string. Do not use AnimatedContainer or any animation — keep it purely presentational for maximum reusability.

Testing Requirements

Widget tests using flutter_test for all three AssignmentStatus values verifying: correct Semantics label text, correct design token color applied (verify ColoredBox or decoration color matches token value), no overflow in 200px wide constrained box. Golden tests for all three statuses in both light and dark theme (6 golden images total). Accessibility test using flutter_test's SemanticsHandle to verify each widget is announced correctly by screen reader.

Component
Contact Detail Screen
ui medium
Epic Risks (2)
low impact medium prob dependency

The Peer Mentor Profile tab on the contact detail screen depends on the peer-mentor-detail-screen-widget being delivered by the separate Peer Mentor Detail feature. If that feature is delayed, the navigation affordance will be present but lead to a stub screen, which may confuse coordinators in the TestFlight pilot.

Mitigation & Contingency

Mitigation: Implement the peer mentor tab with a feature flag guard. When the Peer Mentor Detail feature is incomplete, the flag disables the tab. Coordinate delivery timelines with the team responsible for Peer Mentor Detail to align TestFlight releases.

Contingency: If the Peer Mentor Detail feature is significantly delayed, ship the contact detail screen without the peer mentor tab in the first TestFlight build and add it as an incremental update once the dependent screen is ready.

medium impact medium prob technical

The contact detail screen must adapt its layout significantly based on organisation context: NHF shows affiliation chips, Blindeforbundet shows encrypted fields and assignment status, standard contacts show neither. Managing this conditional rendering without introducing bugs in each variant is complex and increases the risk of organisation-specific regressions.

Mitigation & Contingency

Mitigation: Define a ContactDetailViewModel that resolves all org-specific flags (showEncryptedFields, showAssignmentStatus, showMultiChapterChips) from the organisation config before the widget tree renders. Widget tests must cover all three organisation variants as separate test cases to catch regressions.

Contingency: If conditional rendering logic grows unwieldy, refactor into separate composable section widgets (ProfileHeaderSection, AffiliationSection, EncryptedFieldsSection) that are conditionally included by the parent screen, isolating org-specific logic to individual components.