- EmptyState: render <Link> as the button (a <button> inside <Link> was invalid
and double-focusable); AboutPage <a href> -> <Link> (no full reload)
- aria-label on icon-only controls: settings Back, conversation Refresh/Send,
crew chat Send
- Crew invite Accept/Decline raised to 44px touch targets
- Light-mode --accent-foreground changed from white (2.35:1, fails WCAG AA)
to near-black 0 0% 10% (~9.5:1) so filled lime CTAs/badges are readable.
- Add src/components/EmptyState.tsx: a single reusable empty-state with
icon/emoji, title, hint, action slot(s) and optional footer link, to
consolidate the ~39 ad-hoc empty states over time. Action slot turns
dead-ends into loops (e.g. "No crews nearby → Create one").
Co-authored-by: shakespeare.diy <assistant@shakespeare.diy>