Composer
Spark-style composer shells with attachments and action chrome.
The composer surface now follows Spark’s structure more closely: draft attachments live inside the shell, the leading control opens an attachment menu, and multiline growth stays predictable.
Draft states
The same shell handles a default attached draft and a multiline note without changing the component contract.
Attached draft
Ready attachments render above the field while the shell stays compact and send-ready.
Ready attachments render above the field while the shell stays compact and send-ready.
Expanded draft
When the textarea grows, the action row drops below the field instead of stretching the shell.
When the textarea grows, the action row drops below the field instead of stretching the shell.
Runtime states
Upload feedback and compact in-flight states stay within the same public component.
Upload feedback
Uploading and failed attachments keep retry and remove affordances inside the shell.
Uploading and failed attachments keep retry and remove affordances inside the shell.
Compact spinner shell
The send control can collapse into a small in-flight affordance while the request is running.
The send control can collapse into a small in-flight affordance while the request is running.