Precise interactions: navigation, gestures, feedback, motion. Tokens/motion from
00-shared/08 (m-fast/m-base), a11y baseline from 00-shared/09, API conventions
from 00-shared/07.
Mark as read: filled button; on tap → optimistic checkmark + POST /announcements/:id/read (announcement.repository.ts:20-33); success → snackbar
(suppressed if silent preference (proposed)); 404 → snackbar + pop
(announcement.service.ts:100).
Auto-read on open:(proposed) toggle in settings; default off until product
decision (06 §8 OQ-2).
Attachments: tap → external browser (list is URL strings,
create-announcement.dto.ts:45-49); no in-app viewer.
Audience line: pure metadata display; no drill-down (no audience API).
Field focus flow: title → body → audience; TextInputAction.next chain; body
multiline with toolbar.
Audience change: selecting a type re-renders value control; picking all clears
value; custom picker is search-as-you-type over users (user search API needed —
(planned)).
Recipient preview:(planned) — count chip below audience ("120 people will
see this"); computed client-side only when custom (targetUserIds known); otherwise
(planned) server estimate.
Dirty-guard: leaving composer with edits → confirm dialog "Discard draft?".