Single π attach button β dropdown menu with Camera / Image / File
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)
| Option | Launcher | MIME |
|---|---|---|
| π· Camera | TakePicture β temp FileProvider URI |
image/jpeg |
| πΌοΈ Image | GetContent("image/*") |
image/* (gallery picker) |
| π File | GetContent("*/*") |
*/* (system file picker) |