Chat Composer
The box someone types a message into: text, files, and the two keys that send it. Paste a screenshot, drop a file, Enter to send and Shift+Enter for a newline. It knows nothing about where a message goes or what a reply looks like.
Default
Two v-models: the draft and the queued files. `submit` gives you the trimmed text; the files are already in the array you own.
Paste and drop
Every route to a file ends in the same place. Paste a screenshot from the clipboard, drag one onto the box, or use the + menu. A file the receiver cannot read is refused through `reject` rather than disappearing, and the drop overlay inherits the box's own radius so it fits whichever Style is active.
Paste a screenshot, drag a file onto the box, or use the + menu. A .txt is refused, because the default list is images and PDF.
Busy and read-only
`busy` turns Send into Stop and keeps Enter from sending on top of an answer that is still arriving. `disabled` locks the whole box for a surface someone may read but not write to; say why in the placeholder rather than leaving them guessing.
Limits
Mirror whatever the receiving endpoint enforces. The counter appears in the last tenth of `maxLength`, and the file rules are checked here so the reader learns about a refusal before a round trip rather than after one.
120 characters, two files, 1 MB each, images only. The counter appears in the last tenth; the file rules answer before a round trip rather than after.