Mic button placement — two options
OPTION A — Global FAB Recommended
Bottom-center global button
9:41
1
kpmg/arena
$ git status
On branch main
2
vs-code-custom

Scope: injects into focused pane. One button, always accessible. Works regardless of which pane is focused.

Position: bottom-center, 16dp from bottom edge. Sits above keybar when terminal pane is active. 40dp hit target.
OPTION B — Per-pane header
Mic in the pane header bar
9:41
1
kpmg/arena
2
vs-code-custom

Per-pane scope is explicit. But header is already crowded at 3+ panes and this adds another icon to every pane.

Problem: at 4 panes on 320dp drawer width, the header has 5 icons crammed into ~80px. Header density spec says no more than 4 controls.
Voice input — 4 visual states
State 1 — Off
Voice input off

Icon dim. No ring. Tapping starts recognition. FAB sits at 0.6 opacity when voice is unused for 30s.

opacity: 0.6 bg: --panel
State 2 — Listening recording
Listening… tap to stop

Red FAB with 14dp pulsing ring. Waveform in transcript bar.

bg: #F44747 pulse: 1400ms ring: 14dp
State 3 — Transcribing processing
Processing…

Fires after 2s silence. FAB turns orange (brand accent), spins slowly. Text injection happens on transition back to idle.

bg: #C15F3C rotation: 2s linear
State 4 — Ready armed
Ready — tap mic to speak

Permission granted, mic ready. Fully opaque, border slightly brightened. This is the "hover/focused" pre-recording state.

opacity: 1.0 border: --muted
Live transcript overlay
During active listening
$ git log --oneline -5
a1b2c3d feat: add bearer token auth
e4f5g6h fix: keybar button margins
i7j8k9l chore: bump version to v0.8.0
Listening
git diff HEAD~3 -- src/main/kotlin/ActivityMain

80dp tall overlay. 95% opacity dark bg with blur. Shows last spoken phrase. Auto-scrolls. Tapping the overlay does nothing — all interaction is via the FAB.

Typography: font-mono 13sp, color --text. Header row shows "🎤 Listening" + waveform. Overlay slides up from bottom (240ms ease-out) when recording starts.
After injection — confirmation
✓ Injected into pane 1
Tap mic to dictate again

Confirmation flash: green overlay for 1.5s, then fades. No modal, no interruption.

Permission denied
Microphone access needed
Voice input requires the microphone permission. Open Settings to enable.

Permission snackbar (not modal) on first deny. On second deny, shows inline empty state in the overlay area with Settings deep-link button.

Terminal pane — voice + keybar stacking
Voice FAB sits above keybar
jonathan@argus:~/kpmg$ _
ESC
TAB
CTRL
···
FAB position: bottom-right corner when keybar is visible, 8dp above the keybar top edge. Shifts to bottom-center when keybar hidden (code-server panes).

Right-anchored in terminal context so it doesn't obscure the left-scrolling keybar. 36dp FAB (reduced from 48dp) to avoid crowding.

Design decision summary
Placement
Global FAB, bottom-center (code-server) or bottom-right above keybar (terminal). One mic button, always reachable.
Listening visual
Red FAB + 14dp pulsing ring (1400ms). Waveform bars in transcript overlay header.
Transcribing visual
Orange FAB (brand accent), 2s slow rotation. Fires 2s after silence. Short duration — usually <500ms.
Transcript overlay
Slides up from bottom, 80dp, 95% dark bg + blur. Auto-dismisses 1.5s after injection with green confirmation flash.
Permission denied
Snackbar on first deny. Inline overlay state with Settings deep-link button on second deny.