From fb8fc419942ca52e7c55b37ddc2dace3b5e1e706 Mon Sep 17 00:00:00 2001 From: Richard R Date: Sun, 25 Jan 2026 14:55:45 -0700 Subject: [PATCH] fix(ui): adjust dropdown positioning and scrolling in voices control and improve the ui label for speed controls --- src/components/player/SpeedControl.tsx | 34 +++++++++++++++++++-- src/components/player/VoicesControlBase.tsx | 4 +-- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/components/player/SpeedControl.tsx b/src/components/player/SpeedControl.tsx index eafe41a..768effd 100644 --- a/src/components/player/SpeedControl.tsx +++ b/src/components/player/SpeedControl.tsx @@ -45,7 +45,36 @@ export const SpeedControl = ({ } }, [localAudioSpeed, audioPlayerSpeed, setAudioPlayerSpeedAndRestart]); - const displaySpeed = useMemo(() => (localAudioSpeed !== 1.0 ? localAudioSpeed : localVoiceSpeed), [localAudioSpeed, localVoiceSpeed]); + const formatSpeed = useCallback((speed: number, maxDecimals: number) => { + const rounded = Number(speed.toFixed(maxDecimals)); + return rounded.toString(); + }, []); + + const triggerLabel = useMemo( + () => { + const parts: string[] = []; + if (localVoiceSpeed !== 1.0) parts.push(`${formatSpeed(localVoiceSpeed, 1)}x`); + if (localAudioSpeed !== 1.0) parts.push(`${formatSpeed(localAudioSpeed, 1)}x`); + return parts.length > 0 ? parts.join(' • ') : '1x'; + }, + [formatSpeed, localVoiceSpeed, localAudioSpeed] + ); + + const compactTriggerLabel = useMemo(() => { + const voiceIsDefault = localVoiceSpeed === 1.0; + const audioIsDefault = localAudioSpeed === 1.0; + + let combined = 1.0; + if (!voiceIsDefault && !audioIsDefault) { + combined = (localVoiceSpeed + localAudioSpeed) / 2; + } else if (!voiceIsDefault) { + combined = localVoiceSpeed; + } else if (!audioIsDefault) { + combined = localAudioSpeed; + } + + return `${formatSpeed(combined, 2)}x`; + }, [formatSpeed, localVoiceSpeed, localAudioSpeed]); const min = 0.5; const max = 3; @@ -55,7 +84,8 @@ export const SpeedControl = ({ - {Number.isInteger(displaySpeed) ? displaySpeed.toString() : displaySpeed.toFixed(1)}x + {compactTriggerLabel} + {triggerLabel} diff --git a/src/components/player/VoicesControlBase.tsx b/src/components/player/VoicesControlBase.tsx index 1501586..92d7b87 100644 --- a/src/components/player/VoicesControlBase.tsx +++ b/src/components/player/VoicesControlBase.tsx @@ -96,7 +96,7 @@ export function VoicesControlBase({ {selectedVoices.length > 1 ? selectedVoices.join(' + ') : selectedVoices[0] || currentVoice} - + {availableVoices.map((voiceId) => ( {currentVoice} - + {availableVoices.map((voiceId) => (