Context
Background
Show sync state inline on the home screen using values already stored
in MMKV. No new API calls or SQLite reads needed — purely UI.
UI spec
A single row sits between the "fluent" header and the Projects button.
It shows the current sync state on the left and a ↻ tap target on the right.
The row changes appearance based on state — no separate components needed.
States
Normal
- Background: default surface
- Left: "Last synced: X mins ago" in muted text
- Right: ↻ in muted text
Syncing
- Background: blue tint (
#e6f1fb, border #b5d4f4)
- Left: "Syncing..." in blue
- Right: ⟳ in blue
Never synced
- Background: default surface
- Left: "Never synced" in muted text
- Right: ↻ in muted text
Error
- Background: red tint (
#fcebeb, border #f7c1c1)
- Left: "Sync failed: " in red
- Right: ↻ in red
Tasks
Acceptance criteria
Context
Background
Show sync state inline on the home screen using values already stored
in MMKV. No new API calls or SQLite reads needed — purely UI.
UI spec
A single row sits between the "fluent" header and the Projects button.
It shows the current sync state on the left and a ↻ tap target on the right.
The row changes appearance based on state — no separate components needed.
States
Normal
Syncing
#e6f1fb, border#b5d4f4)Never synced
Error
#fcebeb, border#f7c1c1)Tasks
last_synced_atfrom MMKV and compute relative timee.g. "5 mins ago", "2 hours ago"
last_synced_atis not setsync_error_<step>keys in MMKV — if any exist,show the error state with the step name
Acceptance criteria