πŸ“± ChatInputBar (v2)

Single πŸ“Ž attach button β†’ dropdown menu with Camera / Image / File

1. Empty β€” mic visible, dropdown open
πŸ“Ž button opens a Material 3 DropdownMenu with three options. Selecting one fires the launcher and closes the menu.
2. Empty β€” normal state
Default look β€” single πŸ“Ž, no clutter. Mic visible when input is blank & no attachments.
3. Typing β€” send shown
Mic β†’ Send (blue) when text or attachments present.
4. With attachments β€” preview chips
πŸ“· photo_20260629.jpg
πŸ“„ config.yaml
πŸ“· screenshot.png
Image chips β†’ AsyncImage thumbnail. File chips β†’ file icon. Close βœ• removes.
5. Listening β€” stop shown
While listening, input + attach disabled. Red Stop replaces Mic.
6. Disconnected β€” everything disabled
Everything dimmed, placeholder "Not connected".

πŸ“ Structural hierarchy

Card (roundedCornerShape(24dp), surface alpha 0.85)
 β”” Column
    β”œ [conditional] Slash command suggestions
    β”‚  β”” LazyColumn (maxHeight 200dp)
    β”œ [conditional] Attachment preview chips
    β”‚  β”” Row
    β”‚     β”” AttachmentChip Γ— N
    β”‚        β”” Surface (roundedCorner 16dp)
    β”‚           β”œ [if image] AsyncImage(20dp)
    β”‚           β”œ [else]      Icon(InsertDriveFile, 16dp)
    β”‚           β”” name + Close IconButton(18dp)
    β”” Row (main input area)
       β”œ Box (positioned for dropdown)
       β”‚  β”œ IconButton πŸ“Ž AttachFile (36dp)
       β”‚  β”” DropdownMenu (expanded = showAttachmentMenu)
       β”‚     β”œ DropdownMenuItem: πŸ“· Camera   β†’ onCameraTap()
       β”‚     β”œ DropdownMenuItem: πŸ–ΌοΈ Image    β†’ onImageTap()  β†’ launch("image/*")
       β”‚     β”” DropdownMenuItem: πŸ“„ File     β†’ onFileTap()   β†’ launch("*/*")
       β”œ OutlinedTextField (weight=1f, maxLines=4, rounded 20dp)
       β”œ Spacer(4dp)
       β”” AnimatedContent (mic ↔ send ↔ listening)
          β”œ mic:        FilledTonalButton(Mic icon, 40dp, circle)
          β”œ send:       FilledTonalButton(Send icon, 40dp, circle, blue)
          β”” listening:  FilledTonalButton(Stop icon, 40dp, circle, red)

🎯 What each dropdown option does

Option Launcher MIME
πŸ“· Camera TakePicture β†’ temp FileProvider URI image/jpeg
πŸ–ΌοΈ Image GetContent("image/*") image/* (gallery picker)
πŸ“„ File GetContent("*/*") */* (system file picker)