ThreadPanel
Main feed area — drag the panel's left edge to resize.
Reference resize contract: the caller owns sizing via style={{ flex: "0 0 Npx", width: N }}. Handle's onPointerDown starts window pointermove tracking that writes flex-basis/width straight to the ref'd panel element inside requestAnimationFrame; `resizing` stays true for the drag, dropping the panel's width transition and text selection, and pointerup commits the final width back to state. The composer input grows with content; once it hits the 140px cap the caller flips atCap to re-enable inner scroll. Second panel: Empty (hasParent variant) under the parent message.