Description
All timestamps in the app are displayed as UTC ISO strings that users must mentally convert to their local time, making it difficult to gauge how recent activity is or when a deadline falls. A consistent relative timestamp display using the user's local timezone must be applied globally.
Technical Context
src/components/ui/RelativeTime.tsx (new) wraps the Intl.RelativeTimeFormat API to render strings like "3 minutes ago" or "in 2 days". For timestamps older than 7 days it falls back to Intl.DateTimeFormat with { dateStyle: 'medium', timeStyle: 'short' } in the user's detected locale. The component accepts an iso prop and updates its display every 60 seconds via useEffect. A <time dateTime={iso}> element wraps the display text for semantic correctness.
Acceptance Criteria
Description
All timestamps in the app are displayed as UTC ISO strings that users must mentally convert to their local time, making it difficult to gauge how recent activity is or when a deadline falls. A consistent relative timestamp display using the user's local timezone must be applied globally.
Technical Context
src/components/ui/RelativeTime.tsx(new) wraps theIntl.RelativeTimeFormatAPI to render strings like "3 minutes ago" or "in 2 days". For timestamps older than 7 days it falls back toIntl.DateTimeFormatwith{ dateStyle: 'medium', timeStyle: 'short' }in the user's detected locale. The component accepts anisoprop and updates its display every 60 seconds viauseEffect. A<time dateTime={iso}>element wraps the display text for semantic correctness.Acceptance Criteria
RelativeTimerather than raw ISO strings