Bordered box that owns the chat composer size.
Sizing is either automatic (content-driven, the default) or manual, and
_requested_height is the discriminator: None means automatic.
A manual size separates intent from what is rendered. The requested
height is what the user dragged to and is preserved verbatim; the applied
height is re-derived on every relayout by fitting that request between a
content floor and whichever ceiling is currently tightest. So a completion
popup can transiently squeeze the composer and it springs back when the
popup closes, and a terminal shrink does not destroy the request.
ChatInput composes the children and drives this box through
set_manual_height, toggle_expanded, and refresh_content_height.