19194f0cee668c60763eeb8e8bff2b2764f07a55
Foundation for user avatars (W4). Every participant now shows a circular monogram avatar: their initial(s) on a colour deterministically derived from a stable key (node id, or name where no id is available). This is also the universal fallback for the later preset/upload phases. - New pure `avatar` module: `initials`, `color_for_key` (FNV-1a → 12-colour palette), `use_dark_text_on` (contrast). +5 unit tests. Dependency-free. - `avatar_badge` view helper: a radius-capped coloured container + centred initials (plain iced widgets, no canvas/image needed). - Wired into the self card, each peer row (left of the name — pairs with the A10 fixed-width row), and each chat line. - Threaded the chat sender's node id end to end (RoomEvent → UiEvent::ChatMessage gains `from`, ChatEntry gains `from`) so chat avatars are id-keyed and ready for the Phase 2/3 per-peer avatar lookup. Build + clippy clean, 219 lib tests green. Visual confirm: join/create a room. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>