Spaces:
Sleeping
fix(voice): KI-029 — make push-to-talk button visibly findable
Browse filesUser report: screenshot of the live toolbar with Voice off (red dot) →
"no push to talk button". Root cause: the mic was a 40×40 icon-only
button immediately adjacent to the also-icon-only upload button. With
Grammarly's browser-extension icons overlapping the input area, the user
genuinely couldn't tell which button was which.
Changes:
• Mic button now shows the icon AND a "Push-to-talk" label (visible
on sm+ breakpoints; icon-only on mobile to save horizontal space).
• When Voice is OFF (red pill), the mic button is highlighted in
emerald with a soft outer ring and shadow — eye-catching call to
action that says "use this instead". When Voice is ON, the mic
stays neutral grey (since Live is the primary path).
• While recording, the button turns rose/red with a "Stop" label.
• Tooltips updated to spell out the consequence of each state — in
particular, "Voice will stay off until you click the red dot"
when PTT is used while Voice is off, so the user knows their
earlier off-toggle is preserved.
No behavioral changes; pure findability + clarity fix.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- frontend/src/app/page.tsx +18 -4
|
@@ -740,18 +740,32 @@ export default function Page() {
|
|
| 740 |
>
|
| 741 |
<UploadIcon />
|
| 742 |
</button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 743 |
<button
|
| 744 |
type="button"
|
| 745 |
onClick={recording ? stopRecording : startRecording}
|
| 746 |
disabled={busy && !recording}
|
| 747 |
-
className={`shrink-0
|
| 748 |
-
recording
|
|
|
|
|
|
|
|
|
|
|
|
|
| 749 |
} disabled:opacity-40`}
|
| 750 |
title={recording
|
| 751 |
-
? "
|
| 752 |
-
:
|
|
|
|
|
|
|
| 753 |
>
|
| 754 |
{recording ? <StopIcon /> : <MicIcon />}
|
|
|
|
|
|
|
|
|
|
| 755 |
</button>
|
| 756 |
<button
|
| 757 |
type="button"
|
|
|
|
| 740 |
>
|
| 741 |
<UploadIcon />
|
| 742 |
</button>
|
| 743 |
+
{/* KI-029 (2026-05-14) — push-to-talk button is now LABELED and
|
| 744 |
+
visually highlighted when Voice is OFF, so the user can find
|
| 745 |
+
it. Was just a 40px icon indistinguishable from the upload
|
| 746 |
+
icon; user reported "no push to talk button" despite it
|
| 747 |
+
technically existing. */}
|
| 748 |
<button
|
| 749 |
type="button"
|
| 750 |
onClick={recording ? stopRecording : startRecording}
|
| 751 |
disabled={busy && !recording}
|
| 752 |
+
className={`shrink-0 h-11 px-3 rounded-xl flex items-center gap-1.5 transition-all text-sm font-medium ${
|
| 753 |
+
recording
|
| 754 |
+
? "bg-[var(--error)] text-white animate-record-pulse"
|
| 755 |
+
: userPrefersLive
|
| 756 |
+
? "bg-[var(--muted)] hover:bg-[var(--border)] text-[var(--foreground)]"
|
| 757 |
+
: "bg-emerald-600 hover:bg-emerald-700 text-white shadow-md ring-2 ring-emerald-300 dark:ring-emerald-700"
|
| 758 |
} disabled:opacity-40`}
|
| 759 |
title={recording
|
| 760 |
+
? "Recording… click to stop, or stay silent for 2s"
|
| 761 |
+
: userPrefersLive
|
| 762 |
+
? "Push-to-talk (one turn — Live resumes after)"
|
| 763 |
+
: "Push-to-talk — click and speak; Voice will stay off until you click the red dot"}
|
| 764 |
>
|
| 765 |
{recording ? <StopIcon /> : <MicIcon />}
|
| 766 |
+
<span className="hidden sm:inline">
|
| 767 |
+
{recording ? "Stop" : "Push-to-talk"}
|
| 768 |
+
</span>
|
| 769 |
</button>
|
| 770 |
<button
|
| 771 |
type="button"
|