From 95a17889b98a8a394777daecedf3406ee52b4099 Mon Sep 17 00:00:00 2001 From: Fran Fitzpatrick Date: Mon, 5 Jan 2026 16:55:15 -0600 Subject: [PATCH] feat: click timestamp to seek in Timeline View MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add click-to-seek functionality on the timestamp/speaker area in Timeline View. Clicking the timestamp or speaker name now jumps the audio to that point. Changes: - Add handleSegmentSeek callback - Make timestamp/speaker div clickable with hover styles - Add keyboard accessibility (Enter/Space to activate) - Add tooltip "Click to jump to this point" 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../components/transcript/TranscriptView.tsx | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/web/frontend/src/components/transcript/TranscriptView.tsx b/web/frontend/src/components/transcript/TranscriptView.tsx index 1722cba5..a55c8ec7 100644 --- a/web/frontend/src/components/transcript/TranscriptView.tsx +++ b/web/frontend/src/components/transcript/TranscriptView.tsx @@ -70,6 +70,11 @@ export const TranscriptView = forwardRef(({ return speakerMappings[originalSpeaker] || originalSpeaker; }; + // Click-to-seek handler for timestamp/speaker area in expanded view + const handleSegmentSeek = useCallback((segmentStart: number) => { + onSeek(segmentStart); + }, [onSeek]); + const containerRef = useRef(null); const [isModifierPressed, setIsModifierPressed] = useState(false); const isDesktop = useIsDesktop(); @@ -263,15 +268,26 @@ export const TranscriptView = forwardRef(({
{/* Reduced spacing from space-y-6 */} {expandedData.map((segment, i) => (
- {/* Timestamp & Speaker */} -
+ {/* Timestamp & Speaker - Clickable to seek */} +
handleSegmentSeek(segment.start)} + role="button" + tabIndex={0} + onKeyDown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + handleSegmentSeek(segment.start); + } + }} + title="Click to jump to this point" + > {new Date(segment.start * 1000).toISOString().substr(11, 8)} {segment.speaker && ( {getDisplaySpeakerName(segment.speaker)}