5279a53400c8e42092e50f2d30f592c99101ee55
Add a reusable Divider canvas widget and place two in the room screen: a vertical divider between the Participants and Controls panels (drag to resize the Participants width) and a horizontal divider between the main row and the Chat dock (drag to resize the dock height). The Participants panel and Chat dock size from persisted config values; the Controls panel and main row fill the rest. The widget reports drag motion as a pixel delta along its axis (mirroring the GateMeter drag handling, so a drag continues past the thin strip). update() applies the delta and clamps it: clamp_participants_width / clamp_chat_height keep both sides of each divider above a minimum. Sizes are re-clamped on window resize (window size tracked from window::Event::Resized) and clamped again on load (a size saved under a different window could be out of range). Persistence: participants_width / chat_height are new serde-default AppConfig fields; the divider publishes PersistConfig on drag release so the final position is written once (not per pixel). 3 clamp unit tests (incl. a tiny-window degenerate case) + config backward-compat assertions for the new fields. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>