From 02a84f67b47d03f6ca99d50fb6723e6224d50f67 Mon Sep 17 00:00:00 2001 From: AmanTahiliani Date: Sun, 12 Jul 2026 13:23:07 -0400 Subject: [PATCH 1/2] feat(race-story): polish chapter strip, controls, graph, and map UX (#68) Consolidate the Race Story section into a cohesive timeline surface: custom chapter-strip scrolling with active-card sync, unified segmented playback controls, chapter bands on the position graph with decimated axes and de-collided labels, map toggle gated by an on-mount replay/outline probe, and shared empty-state cards. Adds vitest coverage and visual snapshots. Note: replay/outline queries now probe on mount (not only when Map opens) so the toggle can be hidden before users hit a dead panel. Co-authored-by: Cursor --- frontend/src/components/ChapterStrip.tsx | 86 ++++-- frontend/src/components/EmptyStateCard.tsx | 20 ++ frontend/src/components/RaceStoryCanvas.tsx | 290 ++++++++++++------ frontend/src/components/ReplayTrackMap.tsx | 34 +- frontend/src/lib/chapters.ts | 49 +++ frontend/src/lib/replayMap.ts | 14 + frontend/src/styles/app.css | 11 + frontend/src/styles/chapters.css | 63 +++- frontend/src/styles/race-story.css | 146 +++++++++ frontend/src/styles/replay-map.css | 87 +----- frontend/src/test/ChapterStrip.test.tsx | 19 ++ frontend/src/test/RaceStoryCanvas.test.tsx | 83 ++++- frontend/src/test/ReplayTrackMap.test.tsx | 5 +- frontend/src/test/chapters.test.ts | 26 ++ frontend/src/test/replayMap.test.ts | 33 ++ .../__snapshots__/desktop/race-story.png | Bin 0 -> 59502 bytes .../__snapshots__/mobile/race-story.png | Bin 0 -> 44053 bytes .../__snapshots__/tablet/race-story.png | Bin 0 -> 53674 bytes tests/visual/helpers.ts | 8 + tests/visual/race-story.spec.ts | 9 + 20 files changed, 759 insertions(+), 224 deletions(-) create mode 100644 frontend/src/components/EmptyStateCard.tsx create mode 100644 frontend/src/lib/replayMap.ts create mode 100644 frontend/src/styles/race-story.css create mode 100644 frontend/src/test/replayMap.test.ts create mode 100644 tests/visual/__snapshots__/desktop/race-story.png create mode 100644 tests/visual/__snapshots__/mobile/race-story.png create mode 100644 tests/visual/__snapshots__/tablet/race-story.png create mode 100644 tests/visual/race-story.spec.ts diff --git a/frontend/src/components/ChapterStrip.tsx b/frontend/src/components/ChapterStrip.tsx index 13b504e..1a3b801 100644 --- a/frontend/src/components/ChapterStrip.tsx +++ b/frontend/src/components/ChapterStrip.tsx @@ -1,3 +1,5 @@ +import { useEffect, useRef } from 'react' +import { BookOpen } from 'lucide-react' import type { Chapter } from '../types' import { activeChapterIndex, @@ -5,6 +7,7 @@ import { chapterLapRange, chapterStartScrub, } from '../lib/chapters' +import { EmptyStateCard } from './EmptyStateCard' import '../styles/chapters.css' interface Props { @@ -28,16 +31,32 @@ export function ChapterStrip({ onChapterClick, onTourToggle, }: Props) { + const scrollRef = useRef(null) + const activeIndex = activeChapterIndex(chapters, scrubTime, tMin, tRange) + const highlightedIndex = tourActive ? tourChapterIndex : activeIndex + + useEffect(() => { + if (highlightedIndex === null || !scrollRef.current) return + const card = scrollRef.current.querySelector( + `[data-testid="chapter-card-${highlightedIndex}"]`, + ) + card?.scrollIntoView?.({ behavior: 'smooth', inline: 'center', block: 'nearest' }) + }, [highlightedIndex]) + if (chapters.length === 0) { return (
-

No story chapters for this session.

+
) } - const activeIndex = activeChapterIndex(chapters, scrubTime, tMin, tRange) - return (
@@ -53,34 +72,41 @@ export function ChapterStrip({
-
- {chapters.map((chapter, index) => { - const scrub = chapterStartScrub(chapter, tMin, tRange) ?? index / Math.max(chapters.length - 1, 1) - const isActive = tourActive - ? tourChapterIndex === index - : activeIndex === index - const headline = chapter.headline || chapter.title +
+
+ {chapters.map((chapter, index) => { + const scrub = chapterStartScrub(chapter, tMin, tRange) ?? index / Math.max(chapters.length - 1, 1) + const isActive = tourActive + ? tourChapterIndex === index + : activeIndex === index + const headline = chapter.headline || chapter.title - return ( - - ) - })} + return ( + + ) + })} +
) diff --git a/frontend/src/components/EmptyStateCard.tsx b/frontend/src/components/EmptyStateCard.tsx new file mode 100644 index 0000000..30607e9 --- /dev/null +++ b/frontend/src/components/EmptyStateCard.tsx @@ -0,0 +1,20 @@ +import type { LucideIcon } from 'lucide-react' +import type { ReactNode } from 'react' + +interface Props { + icon: LucideIcon + title: string + hint: ReactNode + testId?: string + className?: string +} + +export function EmptyStateCard({ icon: Icon, title, hint, testId, className = '' }: Props) { + return ( +
+ +
{title}
+
{hint}
+
+ ) +} diff --git a/frontend/src/components/RaceStoryCanvas.tsx b/frontend/src/components/RaceStoryCanvas.tsx index df54579..0e12ec2 100644 --- a/frontend/src/components/RaceStoryCanvas.tsx +++ b/frontend/src/components/RaceStoryCanvas.tsx @@ -1,13 +1,30 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { useQuery } from '@tanstack/react-query' +import { LineChart } from 'lucide-react' import type { Driver, EnrichedResult, EnrichedGrid, PositionSample, Lap, Meeting, Session, Chapter } from '../types' import { fetchReplayFrames, fetchTrackOutline } from '../api' import { ReplayTrackMap } from './ReplayTrackMap' import { ChapterStrip } from './ChapterStrip' +import { EmptyStateCard } from './EmptyStateCard' import { gridDelta, gridDeltaClass, formatDuration, formatGap } from '../utils' -import { chapterEndScrub, chapterStartScrub, chapterTourDurations } from '../lib/chapters' +import { + chapterBandFill, + chapterEndScrub, + chapterStartScrub, + chapterTourDurations, + deCollideYPositions, + decimatedPositionLabels, +} from '../lib/chapters' +import { isReplayMapAvailable } from '../lib/replayMap' +import '../styles/race-story.css' const CHAPTER_TOUR_MS = 90_000 +const CHART_W = 640 +const CHART_H = 180 +const CHART_PL = 40 +const CHART_PR = 48 +const CHART_PT = 8 +const CHART_PB = 20 interface Props { data: { @@ -51,7 +68,6 @@ export function RaceStoryCanvas({ data }: Props) { const svgRef = useRef(null) const tourRef = useRef({ chapterIndex: 0, startedAt: 0, durationMs: 0, startScrub: 0, endScrub: 0 }) - // Position Evolution Chart Logic const allTimes = useMemo(() => [...new Set(positions.map((p) => p.date))].sort(), [positions]) const hasChartData = hasPositions && allTimes.length > 0 const chartTiming = useMemo(() => { @@ -62,18 +78,38 @@ export function RaceStoryCanvas({ data }: Props) { }, [allTimes, hasChartData]) const circuitKey = session?.circuit_key ?? meeting?.circuit_key ?? 0 const outlineYear = meeting?.year ?? (session?.date_start ? new Date(session.date_start).getFullYear() : 0) + const canProbeMap = Boolean(session?.session_key) && circuitKey > 0 && outlineYear > 0 const replayQuery = useQuery({ queryKey: ['replay-frames', session?.session_key, 5000], queryFn: () => fetchReplayFrames(session!.session_key, 5000), - enabled: mapOpen && Boolean(session?.session_key), + enabled: canProbeMap, }) const outlineQuery = useQuery({ queryKey: ['track-outline', circuitKey, outlineYear], queryFn: () => fetchTrackOutline(circuitKey, outlineYear), - enabled: mapOpen && circuitKey > 0 && outlineYear > 0, + enabled: canProbeMap, }) + const mapProbeSettled = !canProbeMap || (!replayQuery.isLoading && !outlineQuery.isLoading) + const mapAvailable = useMemo( + () => + canProbeMap && + isReplayMapAvailable( + replayQuery.data, + outlineQuery.data, + replayQuery.isError || outlineQuery.isError, + ), + [canProbeMap, outlineQuery.data, outlineQuery.isError, replayQuery.data, replayQuery.isError], + ) + const showMapPanel = mapOpen && mapAvailable + + useEffect(() => { + if (!mapAvailable && mapOpen) { + setMapOpen(false) + } + }, [mapAvailable, mapOpen]) + useEffect(() => { if (!isPlaying || !chartTiming) return @@ -203,7 +239,7 @@ export function RaceStoryCanvas({ data }: Props) { pos: p.position, }) } - const dnfSet = new Set(results.filter(r => r.dnf || r.dns || r.dsq).map(r => r.driver_number)) + const dnfSet = new Set(results.filter((r) => r.dnf || r.dns || r.dsq).map((r) => r.driver_number)) for (const [dNum, samples] of byDriver.entries()) { samples.sort((a, b) => a.t - b.t) if (samples.length > 0 && !dnfSet.has(dNum)) { @@ -211,16 +247,16 @@ export function RaceStoryCanvas({ data }: Props) { } } - const getInterpPos = (samples: {t: number, pos: number}[], t: number) => { + const getInterpPos = (samples: { t: number; pos: number }[], t: number) => { if (!samples || samples.length === 0) return null if (t <= samples[0].t) return samples[0].pos if (t >= samples[samples.length - 1].t) return samples[samples.length - 1].pos for (let i = 0; i < samples.length - 1; i++) { - if (samples[i].t <= t && samples[i+1].t >= t) { - const dt = samples[i+1].t - samples[i].t + if (samples[i].t <= t && samples[i + 1].t >= t) { + const dt = samples[i + 1].t - samples[i].t if (dt === 0) return samples[i].pos const frac = (t - samples[i].t) / dt - return samples[i].pos + (samples[i+1].pos - samples[i].pos) * frac + return samples[i].pos + (samples[i + 1].pos - samples[i].pos) * frac } } return null @@ -244,24 +280,25 @@ export function RaceStoryCanvas({ data }: Props) { const maxPos = Math.max(...positions.map((p) => p.position), results.length, 2) const colorByDriver = new Map(results.map((r) => [r.driver_number, r.team_colour])) const acronymByDriver = new Map(results.map((r) => [r.driver_number, r.name_acronym])) + const positionLabels = decimatedPositionLabels(maxPos) - const W = 640 - const H = 180 - const PL = 40 - const PR = 48 - const PT = 8 - const PB = 20 + const W = CHART_W + const H = CHART_H + const PL = CHART_PL + const PR = CHART_PR + const PT = CHART_PT + const PB = CHART_PB const plotW = W - PL - PR const plotH = H - PT - PB const toX = (t: number) => PL + t * plotW const toY = (pos: number) => PT + ((pos - 1) / Math.max(maxPos - 1, 1)) * plotH - const winner = results.find(r => r.position === 1) - const winnerLaps = winner ? laps.filter(l => l.driver_number === winner.driver_number) : [] - const lapTicks: { lap: number, t: number }[] = [] + const winner = results.find((r) => r.position === 1) + const winnerLaps = winner ? laps.filter((l) => l.driver_number === winner.driver_number) : [] + const lapTicks: { lap: number; t: number }[] = [] const lapInterval = winnerLaps.length < 30 ? 5 : 10 - + for (const lap of winnerLaps) { if (lap.lap_number > 0 && lap.lap_number % lapInterval === 0) { const t = (new Date(lap.date_start).getTime() - tMin) / tRange @@ -271,16 +308,15 @@ export function RaceStoryCanvas({ data }: Props) { } } - // Safety Car / VSC periods const scPeriods: { start: number; end: number | null; type: 'SC' | 'VSC' }[] = [] let activeSC: { start: number; type: 'SC' | 'VSC' } | null = null const rc = [...race_control].sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()) - + for (const msg of rc) { const t = new Date(msg.date).getTime() const m = msg.message?.toUpperCase() || '' const cat = msg.category?.toUpperCase() || '' - + if (m.includes('VIRTUAL SAFETY CAR DEPLOYED') || cat === 'VIRTUALSAFETYCAR') { if (!activeSC) activeSC = { start: t, type: 'VSC' } } else if (m.includes('SAFETY CAR DEPLOYED') || cat === 'SAFETYCAR') { @@ -296,6 +332,30 @@ export function RaceStoryCanvas({ data }: Props) { scPeriods.push({ start: activeSC.start, end: null, type: activeSC.type }) } + const chapterBands = chapters + .map((chapter, index) => { + const startT = chapterStartScrub(chapter, tMin, tRange) + const endT = chapterEndScrub(chapter, tMin, tRange) + if (startT === null) return null + const end = endT ?? startT + return { + key: `${chapter.kind}-${index}`, + start: Math.min(startT, end), + end: Math.max(startT, end), + fill: chapterBandFill(chapter.kind), + } + }) + .filter((band): band is NonNullable => band !== null) + + const labelCandidates = Array.from(byDriver.entries()) + .map(([dNum, samples]) => { + const last = samples[samples.length - 1] + if (!last) return null + return { key: dNum, y: toY(last.pos) } + }) + .filter((item): item is { key: number; y: number } => item !== null) + const labelYByDriver = deCollideYPositions(labelCandidates, 12) + const handlePointerMove = (e: React.PointerEvent) => { setIsPlaying(false) stopChapterTour() @@ -307,14 +367,34 @@ export function RaceStoryCanvas({ data }: Props) { } chartContent = ( -
+
+ {chapterBands.map((band) => { + const x1 = toX(Math.max(0, band.start)) + const x2 = toX(Math.min(1, band.end)) + if (x2 <= PL || x1 >= W - PR) return null + return ( + + ) + })} + {scPeriods.map((sc, i) => { const startT = (sc.start - tMin) / tRange const endT = sc.end ? (sc.end - tMin) / tRange : 1 @@ -333,33 +413,41 @@ export function RaceStoryCanvas({ data }: Props) { ) })} - {Array.from({ length: maxPos }, (_, i) => i + 1).map((pos) => ( + {positionLabels.map((pos) => ( P{pos} ))} - {lapTicks.map(tick => ( + {lapTicks.map((tick) => ( - - + + L{tick.lap} @@ -372,11 +460,12 @@ export function RaceStoryCanvas({ data }: Props) { const last = samples[samples.length - 1] const isHovered = hoverDriver === dNum const isFaded = hoverDriver !== null && !isHovered + const labelY = last ? (labelYByDriver.get(dNum) ?? toY(last.pos)) : 0 - const driverPits = pit_stops.filter(p => p.driver_number === dNum) + const driverPits = pit_stops.filter((p) => p.driver_number === dNum) return ( - setHoverDriver(dNum)} @@ -392,30 +481,30 @@ export function RaceStoryCanvas({ data }: Props) { className="rs-driver-line" pathLength={1} /> - + {driverPits.map((p, i) => { const t = (new Date(p.date).getTime() - tMin) / tRange if (t < 0 || t > 1) return null const pos = getInterpPos(samples, t) if (pos === null) return null return ( - ) })} - + {last && ( -
+
-
- {[1, 10, 30].map((speed) => ( + + {[1, 10, 30].map((speed) => ( + + ))} + {mapProbeSettled && mapAvailable && ( + <> + - ))} -
- + + )}
) @@ -506,32 +603,36 @@ export function RaceStoryCanvas({ data }: Props) { onTourToggle={toggleChapterTour} /> )} -
+
{hasChartData ? ( chartContent ) : ( -
- Lap-by-lap positions not available. This session does not - have ingested position samples in /api/v1/race-hub. -
+ + This session does not have ingested position samples in{' '} + /api/v1/race-hub. + + } + testId="race-story-no-positions" + className="race-story-empty-card" + /> )}
- {mapOpen && ( -
- {circuitKey > 0 && outlineYear > 0 ? ( - - ) : ( -
track identity unavailable for replay map
- )} + {showMapPanel && ( +
+
)}
@@ -542,30 +643,29 @@ export function RaceStoryCanvas({ data }: Props) { const gridPos = grid.find((g) => g.driver_number === r.driver_number)?.position ?? 0 const currentPos = scrubTime !== null ? i + 1 : r.position const isWinner = i === 0 && r.position === 1 - const pClass = currentPos === 1 ? 'rs-pos-p1' : currentPos === 2 ? 'rs-pos-p2' : currentPos === 3 ? 'rs-pos-p3' : '' - + const pClass = + currentPos === 1 ? 'rs-pos-p1' : currentPos === 2 ? 'rs-pos-p2' : currentPos === 3 ? 'rs-pos-p3' : '' + let currentPoints: number | string = r.points if (scrubTime !== null) { const isSprint = data.session?.session_type?.toLowerCase().includes('sprint') const ptsArray = isSprint ? [8, 7, 6, 5, 4, 3, 2, 1] : [25, 18, 15, 12, 10, 8, 6, 4, 2, 1] currentPoints = currentPos <= ptsArray.length ? ptsArray[currentPos - 1] : 0 } - + return ( -
setHoverDriver(r.driver_number)} onMouseLeave={() => setHoverDriver(null)} >
-
- {currentPos} -
+
{currentPos}
-
{r.name_acronym || r.driver_number} @@ -583,12 +683,12 @@ export function RaceStoryCanvas({ data }: Props) { Grid
- +
{isWinner ? formatDuration(r.duration) : formatGap(r.gap_to_leader)} {isWinner ? 'Time' : 'Gap'}
- +
0 ? 'var(--text)' : 'var(--text-3)' }}> {currentPoints} diff --git a/frontend/src/components/ReplayTrackMap.tsx b/frontend/src/components/ReplayTrackMap.tsx index d3ec274..51be4c4 100644 --- a/frontend/src/components/ReplayTrackMap.tsx +++ b/frontend/src/components/ReplayTrackMap.tsx @@ -1,7 +1,9 @@ import { useMemo, useState } from 'react' +import { Loader2, MapPin, Satellite } from 'lucide-react' import type { Driver, EnrichedResult, ReplayFramesResponse, TrackOutline } from '../types' import { buildOutlinePath } from '../lib/trackmap' import { interpolateReplayCars, replayCarToSvg } from '../lib/replay' +import { EmptyStateCard } from './EmptyStateCard' import '../styles/replay-map.css' interface Props { @@ -60,7 +62,13 @@ export function ReplayTrackMap({ if (loading) { return (
-
loading replay GPS...
+
) } @@ -68,7 +76,13 @@ export function ReplayTrackMap({ if (error) { return (
-
replay GPS unavailable for this session
+
) } @@ -76,7 +90,13 @@ export function ReplayTrackMap({ if (!outline || !outlinePath) { return (
-
track outline unavailable for this session
+
) } @@ -84,7 +104,13 @@ export function ReplayTrackMap({ if (!replay?.frames?.length || cars.length === 0) { return (
-
historical GPS unavailable for this session
+
) } diff --git a/frontend/src/lib/chapters.ts b/frontend/src/lib/chapters.ts index 2ced668..c8f45c5 100644 --- a/frontend/src/lib/chapters.ts +++ b/frontend/src/lib/chapters.ts @@ -80,3 +80,52 @@ export function chapterTourDurations(chapters: Chapter[], totalMs = 90_000): num const perChapter = totalMs / chapters.length return chapters.map(() => perChapter) } + +/** Decimated position axis labels, e.g. P1, P5, P10, P15, P20. */ +export function decimatedPositionLabels(maxPos: number): number[] { + if (maxPos <= 1) return [1] + const labels = new Set([1]) + for (let pos = 5; pos < maxPos; pos += 5) { + labels.add(pos) + } + labels.add(maxPos) + return [...labels].sort((a, b) => a - b) +} + +/** Subtle background fill for chapter time-bands on the position graph. */ +export function chapterBandFill(kind: string): string { + switch (kind) { + case 'safety_car': + return 'rgba(255, 153, 0, 0.14)' + case 'virtual_safety_car': + return 'rgba(255, 204, 0, 0.12)' + case 'red_flag': + return 'rgba(230, 36, 41, 0.12)' + case 'pit_phase': + return 'rgba(96, 165, 250, 0.08)' + case 'decisive_swing': + return 'rgba(34, 197, 94, 0.08)' + case 'finish': + return 'rgba(255, 204, 0, 0.06)' + default: + return 'rgba(255, 255, 255, 0.03)' + } +} + +/** Minimum vertical spacing between colliding labels (SVG units). */ +export function deCollideYPositions( + items: ReadonlyArray<{ key: string | number; y: number }>, + minGap = 12, +): Map { + if (items.length === 0) return new Map() + const sorted = [...items].sort((a, b) => a.y - b.y) + const adjusted = sorted.map((item) => ({ ...item })) + for (let i = 1; i < adjusted.length; i++) { + const prev = adjusted[i - 1] + const curr = adjusted[i] + if (curr.y - prev.y < minGap) { + curr.y = prev.y + minGap + } + } + return new Map(adjusted.map((item) => [item.key, item.y])) +} diff --git a/frontend/src/lib/replayMap.ts b/frontend/src/lib/replayMap.ts new file mode 100644 index 0000000..63a9f8b --- /dev/null +++ b/frontend/src/lib/replayMap.ts @@ -0,0 +1,14 @@ +import type { ReplayFramesResponse, TrackOutline } from '../types' + +/** Whether replay map can render (probe uses existing frames + outline queries). */ +export function isReplayMapAvailable( + replay: ReplayFramesResponse | null | undefined, + outline: TrackOutline | null | undefined, + hasError: boolean, +): boolean { + if (hasError) return false + const frames = replay?.frames ?? [] + if (frames.length < 2) return false + if (!outline?.points?.length) return false + return true +} diff --git a/frontend/src/styles/app.css b/frontend/src/styles/app.css index 797c6c0..32e0005 100644 --- a/frontend/src/styles/app.css +++ b/frontend/src/styles/app.css @@ -520,6 +520,17 @@ a { color: inherit; text-decoration: none; } color: var(--text-3); } +.empty-state-icon { + display: block; + margin: 0 auto var(--s3); + color: var(--text-3); +} + +.race-story-empty-card { + padding: var(--s6) var(--s5); + margin: 0; +} + .loading-state { padding: var(--s7) 0; text-align: center; diff --git a/frontend/src/styles/chapters.css b/frontend/src/styles/chapters.css index f841341..f131c36 100644 --- a/frontend/src/styles/chapters.css +++ b/frontend/src/styles/chapters.css @@ -9,6 +9,7 @@ align-items: center; justify-content: space-between; gap: var(--s4); + flex-wrap: wrap; } .chapter-strip-title { @@ -44,6 +45,31 @@ color: var(--text); } +.chapter-strip-scroll-wrap { + position: relative; +} + +.chapter-strip-scroll-wrap::before, +.chapter-strip-scroll-wrap::after { + content: ''; + position: absolute; + top: 0; + bottom: var(--s2); + width: 28px; + pointer-events: none; + z-index: 1; +} + +.chapter-strip-scroll-wrap::before { + left: 0; + background: linear-gradient(to right, var(--bg), transparent); +} + +.chapter-strip-scroll-wrap::after { + right: 0; + background: linear-gradient(to left, var(--bg), transparent); +} + .chapter-strip-scroll { display: flex; gap: var(--s3); @@ -51,10 +77,26 @@ padding-bottom: var(--s2); scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; + scrollbar-width: thin; + scrollbar-color: var(--border-2) transparent; +} + +.chapter-strip-scroll::-webkit-scrollbar { + height: 4px; +} + +.chapter-strip-scroll::-webkit-scrollbar-track { + background: transparent; +} + +.chapter-strip-scroll::-webkit-scrollbar-thumb { + background: var(--border-2); + border-radius: 999px; } .chapter-card { flex: 0 0 min(240px, 72vw); + min-height: 88px; display: flex; flex-direction: column; gap: var(--s2); @@ -64,7 +106,7 @@ background: var(--surface); text-align: left; cursor: pointer; - scroll-snap-align: start; + scroll-snap-align: center; transition: border-color 0.15s, background 0.15s, box-shadow 0.15s; } @@ -145,10 +187,21 @@ -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; + flex: 1; } -.chapter-strip-empty { - font-size: 12px; - color: var(--text-3); - padding: var(--s3) 0; +.chapter-strip-empty-card { + padding: var(--s6) var(--s5); + margin: 0; +} + +.chapter-strip-empty-card .empty-state-icon { + margin: 0 auto var(--s3); + color: var(--text-3); +} + +@media (max-width: 900px) { + .chapter-strip-header { + align-items: flex-start; + } } diff --git a/frontend/src/styles/race-story.css b/frontend/src/styles/race-story.css new file mode 100644 index 0000000..e151b7a --- /dev/null +++ b/frontend/src/styles/race-story.css @@ -0,0 +1,146 @@ +.rs-replay-shell { + display: grid; + grid-template-columns: 1fr; + gap: var(--s5); + align-items: stretch; +} + +.rs-replay-shell--split { + grid-template-columns: minmax(0, 1.4fr) minmax(260px, 0.8fr); +} + +.rs-replay-main { + min-width: 0; +} + +.rs-chart-container { + --rs-chart-max-width: 100%; +} + +.rs-chart-container--full { + --rs-chart-max-width: 100%; +} + +.rs-segmented-control { + display: inline-flex; + align-items: stretch; + flex-wrap: wrap; + gap: 0; + margin-top: var(--s3); + border: 1px solid var(--border-2); + border-radius: var(--s1); + background: var(--surface); + overflow: hidden; +} + +.rs-segment { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 30px; + padding: 0 var(--s4); + font-family: var(--f-mono); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.04em; + color: var(--text-3); + background: transparent; + border: none; + border-right: 1px solid var(--border); + cursor: pointer; + transition: background 0.12s, color 0.12s; +} + +.rs-segment:last-child { + border-right: none; +} + +.rs-segment:hover:not(:disabled) { + color: var(--text); + background: var(--surface-h); +} + +.rs-segment:focus-visible { + outline: 2px solid var(--red); + outline-offset: -2px; + z-index: 1; +} + +.rs-segment.active { + color: var(--text); + background: rgba(230, 36, 41, 0.12); + box-shadow: inset 0 -2px 0 var(--red); +} + +.rs-segment:disabled { + opacity: 0.45; + cursor: not-allowed; +} + +.rs-segment-divider { + width: 1px; + align-self: stretch; + background: var(--border); + flex-shrink: 0; +} + +.rs-replay-map-slot { + min-width: 0; +} + +.rs-position-chart-svg { + width: 100%; + min-width: 280px; + max-width: var(--rs-chart-max-width, 640px); + display: block; +} + +.rs-chart-axis-label { + fill: var(--text-3); + font-family: var(--f-mono); + font-size: 9px; +} + +.rs-chart-grid-line { + stroke: var(--border); + stroke-width: 0.5; +} + +.rs-chart-lap-tick { + stroke: var(--border); + stroke-width: 1; +} + +@media (max-width: 900px) { + .rs-replay-shell--split { + grid-template-columns: 1fr; + } + + .rs-segmented-control { + width: 100%; + } + + .rs-segment { + flex: 1 1 auto; + } +} + +@media (max-width: 560px) { + .rs-segmented-control { + flex-direction: column; + align-items: stretch; + } + + .rs-segment { + border-right: none; + border-bottom: 1px solid var(--border); + } + + .rs-segment:last-child { + border-bottom: none; + } + + .rs-segment-divider { + display: none; + } +} diff --git a/frontend/src/styles/replay-map.css b/frontend/src/styles/replay-map.css index 3915e6b..29f5ebd 100644 --- a/frontend/src/styles/replay-map.css +++ b/frontend/src/styles/replay-map.css @@ -1,76 +1,9 @@ -.rs-replay-shell { - display: grid; - grid-template-columns: minmax(0, 1.4fr) minmax(260px, 0.8fr); - gap: var(--s5); - align-items: stretch; -} - -.rs-replay-main { - min-width: 0; -} - -.rs-replay-tools { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: var(--s3); - margin-top: var(--s3); -} - -.rs-tool-btn, -.rs-speed-btn { - height: 28px; - padding: 0 var(--s4); - font-family: var(--f-mono); - font-size: 10px; - font-weight: 700; - color: var(--text-2); - background: var(--surface); - border: 1px solid var(--border-2); - border-radius: 2px; - cursor: pointer; -} - -.rs-tool-btn:hover, -.rs-speed-btn:hover { - color: var(--text); - border-color: var(--text-3); -} - -.rs-tool-btn.active, -.rs-speed-btn.active { - color: var(--text); - border-color: var(--red); - background: rgba(230, 36, 41, 0.12); -} - -.rs-speed-group { - display: inline-flex; - gap: 2px; -} - -.rs-replay-map-slot { - min-width: 0; -} - -.rs-replay-map-placeholder { - min-height: 244px; - display: grid; - place-items: center; - padding: var(--s5); - color: var(--text-3); - font-family: var(--f-mono); - font-size: 11px; - text-align: center; - border: 1px dashed var(--border-2); - background: var(--surface); -} - .replay-map-panel { min-height: 244px; height: 100%; border: 1px solid var(--border); background: var(--surface); + border-radius: var(--s2); } .replay-map-stage { @@ -143,19 +76,15 @@ stroke-width: 1.2; } -.replay-map-empty { +.replay-map-empty-card { min-height: 244px; display: grid; - place-items: center; - padding: var(--s5); - color: var(--text-3); - font-family: var(--f-mono); - font-size: 11px; - text-align: center; + place-content: center; + padding: var(--s6); + margin: 0; } -@media (max-width: 860px) { - .rs-replay-shell { - grid-template-columns: 1fr; - } +.replay-map-empty-card .empty-state-icon { + margin: 0 auto var(--s3); + color: var(--text-3); } diff --git a/frontend/src/test/ChapterStrip.test.tsx b/frontend/src/test/ChapterStrip.test.tsx index bbd5907..c3cc5a7 100644 --- a/frontend/src/test/ChapterStrip.test.tsx +++ b/frontend/src/test/ChapterStrip.test.tsx @@ -68,6 +68,25 @@ describe('ChapterStrip', () => { expect(screen.getByText('L12–L15')).toBeInTheDocument() }) + it('renders an empty-state card when there are no chapters', () => { + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + render( + + + , + ) + expect(screen.getByTestId('chapter-strip-empty')).toBeInTheDocument() + }) + it('highlights the active chapter from scrub time', () => { const scrub = (new Date('2025-05-25T13:13:00Z').getTime() - tMin) / tRange renderStrip({ scrubTime: scrub }) diff --git a/frontend/src/test/RaceStoryCanvas.test.tsx b/frontend/src/test/RaceStoryCanvas.test.tsx index 161cf56..7de9ef5 100644 --- a/frontend/src/test/RaceStoryCanvas.test.tsx +++ b/frontend/src/test/RaceStoryCanvas.test.tsx @@ -2,7 +2,7 @@ import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { fireEvent, render, screen, waitFor } from '@testing-library/react' import { beforeEach, describe, expect, it, vi } from 'vitest' import { RaceStoryCanvas } from '../components/RaceStoryCanvas' -import type { RaceHub, ReplayFramesResponse, TrackOutline } from '../types' +import type { Chapter, RaceHub, ReplayFramesResponse, TrackOutline } from '../types' vi.mock('../api', () => ({ fetchReplayFrames: vi.fn(), @@ -28,9 +28,35 @@ const replay: ReplayFramesResponse = { session_key: 99, interval_ms: 5000, start_time: '2025-05-25T13:00:00Z', - frames: [{ t: 0, cars: { '1': { x: 10, y: 20 } } }], + frames: [ + { t: 0, cars: { '1': { x: 10, y: 20 } } }, + { t: 5000, cars: { '1': { x: 50, y: 50 } } }, + ], } +const chapters: Chapter[] = [ + { + kind: 'start', + title: 'Start', + headline: 'Lights out', + start_lap: 1, + end_lap: 1, + start_time: '2025-05-25T13:00:00Z', + end_time: '2025-05-25T13:01:00Z', + driver_numbers: [], + }, + { + kind: 'safety_car', + title: 'Safety Car', + headline: 'Incident brings out the Safety Car', + start_lap: 2, + end_lap: 2, + start_time: '2025-05-25T13:05:00Z', + end_time: '2025-05-25T13:05:00Z', + driver_numbers: [], + }, +] + const raceHub: RaceHub = { source: 'local', session_key: 99, @@ -103,14 +129,14 @@ const raceHub: RaceHub = { race_control: [], weather: [], laps: [], - chapters: [], + chapters, } -function renderCanvas() { +function renderCanvas(overrides: Partial = {}) { const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }) return render( - + , ) } @@ -122,14 +148,53 @@ describe('RaceStoryCanvas replay map', () => { mockFetchTrackOutline.mockResolvedValue(outline) }) - it('fetches replay frames lazily when the map panel opens', async () => { + it('probes replay frames on mount and opens the map when data is available', async () => { renderCanvas() - expect(mockFetchReplayFrames).not.toHaveBeenCalled() - fireEvent.click(screen.getByRole('button', { name: 'Map' })) - await waitFor(() => expect(mockFetchReplayFrames).toHaveBeenCalledWith(99, 5000)) expect(mockFetchTrackOutline).toHaveBeenCalledWith(1, 2025) + + const mapToggle = await screen.findByTestId('replay-map-toggle') + fireEvent.click(mapToggle) + expect(await screen.findByTestId('replay-track-map')).toBeInTheDocument() + expect(screen.getByTestId('replay-map-slot')).toBeInTheDocument() + }) + + it('hides the map toggle when replay frames are unavailable', async () => { + mockFetchReplayFrames.mockResolvedValue({ ...replay, frames: [] }) + renderCanvas() + + await waitFor(() => expect(mockFetchReplayFrames).toHaveBeenCalled()) + await waitFor(() => expect(screen.queryByTestId('replay-map-toggle')).not.toBeInTheDocument()) + }) + + it('uses full-width chart layout when the map is closed', async () => { + renderCanvas() + + await waitFor(() => expect(mockFetchReplayFrames).toHaveBeenCalled()) + const chart = screen.getByTestId('position-chart') + expect(chart).toHaveClass('rs-chart-container--full') + expect(screen.queryByTestId('replay-map-slot')).not.toBeInTheDocument() + expect(document.querySelector('.rs-replay-shell--split')).not.toBeInTheDocument() + }) + + it('syncs active chapter highlight when a chapter card is clicked', async () => { + renderCanvas() + + fireEvent.click(screen.getByTestId('chapter-card-1')) + await waitFor(() => expect(screen.getByTestId('chapter-card-1')).toHaveClass('active')) + expect(screen.getByTestId('chapter-card-0')).not.toHaveClass('active') + }) + + it('renders the empty-state card when positions are unavailable', () => { + renderCanvas({ + datasets: { positions: { status: 'missing', source: 'local', count: 0 } }, + positions: [], + chapters: [], + }) + + expect(screen.getByTestId('race-story-no-positions')).toBeInTheDocument() + expect(screen.getByText('Lap-by-lap positions not available')).toBeInTheDocument() }) }) diff --git a/frontend/src/test/ReplayTrackMap.test.tsx b/frontend/src/test/ReplayTrackMap.test.tsx index 2aa46bf..bed53c3 100644 --- a/frontend/src/test/ReplayTrackMap.test.tsx +++ b/frontend/src/test/ReplayTrackMap.test.tsx @@ -44,9 +44,10 @@ const results: EnrichedResult[] = [ ] describe('ReplayTrackMap', () => { - it('renders an empty state when replay frames are missing', () => { + it('renders an empty-state card when replay frames are missing', () => { render() - expect(screen.getByTestId('replay-track-map')).toHaveTextContent(/historical GPS unavailable/i) + expect(screen.getByTestId('replay-map-no-frames')).toBeInTheDocument() + expect(screen.getByText('Historical GPS unavailable')).toBeInTheDocument() }) it('renders car labels from result metadata', () => { diff --git a/frontend/src/test/chapters.test.ts b/frontend/src/test/chapters.test.ts index 4fb0ed6..290d936 100644 --- a/frontend/src/test/chapters.test.ts +++ b/frontend/src/test/chapters.test.ts @@ -1,10 +1,13 @@ import { describe, expect, it } from 'vitest' import { activeChapterIndex, + chapterBandFill, chapterKindLabel, chapterLapRange, chapterStartScrub, chapterTourDurations, + deCollideYPositions, + decimatedPositionLabels, } from '../lib/chapters' import type { Chapter } from '../types' @@ -60,4 +63,27 @@ describe('chapters lib', () => { it('splits 90s evenly across chapters', () => { expect(chapterTourDurations(sampleChapters)).toEqual([45_000, 45_000]) }) + + it('decimates position axis labels', () => { + expect(decimatedPositionLabels(22)).toEqual([1, 5, 10, 15, 20, 22]) + }) + + it('returns chapter band fills by kind', () => { + expect(chapterBandFill('safety_car')).toContain('rgba') + expect(chapterBandFill('virtual_safety_car')).toContain('rgba') + }) + + it('de-collides overlapping label y positions', () => { + const adjusted = deCollideYPositions( + [ + { key: 'a', y: 10 }, + { key: 'b', y: 12 }, + { key: 'c', y: 30 }, + ], + 12, + ) + expect(adjusted.get('a')).toBe(10) + expect(adjusted.get('b')).toBe(22) + expect(adjusted.get('c')).toBe(34) + }) }) diff --git a/frontend/src/test/replayMap.test.ts b/frontend/src/test/replayMap.test.ts new file mode 100644 index 0000000..14545ed --- /dev/null +++ b/frontend/src/test/replayMap.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it } from 'vitest' +import { isReplayMapAvailable } from '../lib/replayMap' +import type { ReplayFramesResponse, TrackOutline } from '../types' + +const outline: TrackOutline = { + circuit_key: 1, + bounds: { minX: 0, maxX: 100, minY: 0, maxY: 100 }, + points: [{ x: 0, y: 0 }], +} + +const replay: ReplayFramesResponse = { + session_key: 1, + interval_ms: 5000, + start_time: '2025-05-25T13:00:00Z', + frames: [ + { t: 0, cars: {} }, + { t: 5000, cars: {} }, + ], +} + +describe('isReplayMapAvailable', () => { + it('returns true when frames and outline are present', () => { + expect(isReplayMapAvailable(replay, outline, false)).toBe(true) + }) + + it('returns false when frames are sparse', () => { + expect(isReplayMapAvailable({ ...replay, frames: [{ t: 0, cars: {} }] }, outline, false)).toBe(false) + }) + + it('returns false on query error', () => { + expect(isReplayMapAvailable(replay, outline, true)).toBe(false) + }) +}) diff --git a/tests/visual/__snapshots__/desktop/race-story.png b/tests/visual/__snapshots__/desktop/race-story.png new file mode 100644 index 0000000000000000000000000000000000000000..37f8b190d356c031488fbcd35afead8fe5e36978 GIT binary patch literal 59502 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�wK-I=PlqkYV?wIFhj+x83Jo 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

XTI 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 literal 0 HcmV?d00001 diff --git a/tests/visual/__snapshots__/mobile/race-story.png b/tests/visual/__snapshots__/mobile/race-story.png new file mode 100644 index 0000000000000000000000000000000000000000..551f7a1ea31e7f24c196e9a5fe2be95cc40fe4b4 GIT binary patch literal 44053 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 e3k!j+S2J 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 Be;fb+ literal 0 HcmV?d00001 diff --git a/tests/visual/helpers.ts b/tests/visual/helpers.ts index 931fc94..fe66d1e 100644 --- a/tests/visual/helpers.ts +++ b/tests/visual/helpers.ts @@ -36,6 +36,14 @@ export async function gotoRaceHubReady(page: Page, sessionKey = FULL_SESSION): P await waitForScreenshotReady(page) } +export async function gotoRaceStoryReady(page: Page, sessionKey = FULL_SESSION): Promise { + await page.goto(`/race-hub?session_key=${sessionKey}`) + await expect(page.getByTestId('race-hub')).toBeVisible() + await page.getByRole('tab', { name: 'Race Story' }).click() + await expect(page.getByTestId('position-chart')).toBeVisible() + await waitForScreenshotReady(page) +} + export async function gotoDataLibraryReady(page: Page): Promise { await page.goto('/admin') await expect(page.getByTestId('data-library')).toBeVisible() diff --git a/tests/visual/race-story.spec.ts b/tests/visual/race-story.spec.ts new file mode 100644 index 0000000..6332da2 --- /dev/null +++ b/tests/visual/race-story.spec.ts @@ -0,0 +1,9 @@ +import { test } from '@playwright/test' +import { gotoRaceStoryReady, screenshotPage } from './helpers' + +test.describe('Race Story visual regression', () => { + test('race-story', async ({ page }) => { + await gotoRaceStoryReady(page) + await screenshotPage(page, 'race-story') + }) +}) From 1dac73cdc5308385ca1d2c976a2fd546417d167e Mon Sep 17 00:00:00 2001 From: AmanTahiliani Date: Sun, 12 Jul 2026 13:40:21 -0400 Subject: [PATCH 2/2] fix(race-story): sync chapter highlight and empty-state E2E (#68) Clamp active-chapter detection to the same scrub bounds as chapter clicks, keep an explicit selection on click for out-of-window timestamps, point E2E at the empty-state card, and move Race Story empty-state styles out of app.css. Co-authored-by: Cursor --- frontend/src/components/ChapterStrip.tsx | 11 +++--- frontend/src/components/RaceStoryCanvas.tsx | 15 +++++++- frontend/src/lib/chapters.ts | 19 +++++----- frontend/src/styles/app.css | 11 ------ frontend/src/styles/chapters.css | 1 + frontend/src/styles/race-story.css | 11 ++++++ frontend/src/styles/replay-map.css | 1 + frontend/src/test/ChapterStrip.test.tsx | 22 ++++++++++++ frontend/src/test/RaceStoryCanvas.test.tsx | 40 +++++++++++++++++++++ frontend/src/test/chapters.test.ts | 35 ++++++++++++++++++ tests/race-hub.spec.ts | 18 ++++++++-- 11 files changed, 156 insertions(+), 28 deletions(-) diff --git a/frontend/src/components/ChapterStrip.tsx b/frontend/src/components/ChapterStrip.tsx index 1a3b801..f76346f 100644 --- a/frontend/src/components/ChapterStrip.tsx +++ b/frontend/src/components/ChapterStrip.tsx @@ -17,6 +17,8 @@ interface Props { tRange: number tourActive: boolean tourChapterIndex: number | null + /** Explicit selection from a chapter click; wins over scrub-derived active. */ + selectedChapterIndex?: number | null onChapterClick: (index: number, scrub: number) => void onTourToggle: () => void } @@ -28,12 +30,15 @@ export function ChapterStrip({ tRange, tourActive, tourChapterIndex, + selectedChapterIndex = null, onChapterClick, onTourToggle, }: Props) { const scrollRef = useRef(null) const activeIndex = activeChapterIndex(chapters, scrubTime, tMin, tRange) - const highlightedIndex = tourActive ? tourChapterIndex : activeIndex + const highlightedIndex = tourActive + ? tourChapterIndex + : (selectedChapterIndex ?? activeIndex) useEffect(() => { if (highlightedIndex === null || !scrollRef.current) return @@ -81,9 +86,7 @@ export function ChapterStrip({ > {chapters.map((chapter, index) => { const scrub = chapterStartScrub(chapter, tMin, tRange) ?? index / Math.max(chapters.length - 1, 1) - const isActive = tourActive - ? tourChapterIndex === index - : activeIndex === index + const isActive = highlightedIndex === index const headline = chapter.headline || chapter.title return ( diff --git a/frontend/src/components/RaceStoryCanvas.tsx b/frontend/src/components/RaceStoryCanvas.tsx index 0e12ec2..dd646ef 100644 --- a/frontend/src/components/RaceStoryCanvas.tsx +++ b/frontend/src/components/RaceStoryCanvas.tsx @@ -65,6 +65,7 @@ export function RaceStoryCanvas({ data }: Props) { const [playbackSpeed, setPlaybackSpeed] = useState(10) const [chapterTourActive, setChapterTourActive] = useState(false) const [tourChapterIndex, setTourChapterIndex] = useState(null) + const [selectedChapterIndex, setSelectedChapterIndex] = useState(null) const svgRef = useRef(null) const tourRef = useRef({ chapterIndex: 0, startedAt: 0, durationMs: 0, startScrub: 0, endScrub: 0 }) @@ -140,9 +141,14 @@ export function RaceStoryCanvas({ data }: Props) { const jumpToChapter = (index: number, scrub: number) => { setIsPlaying(false) stopChapterTour() + setSelectedChapterIndex(index) setScrubTime(scrub) } + const clearChapterSelection = () => { + setSelectedChapterIndex(null) + } + const toggleChapterTour = () => { if (chapterTourActive) { stopChapterTour() @@ -150,6 +156,7 @@ export function RaceStoryCanvas({ data }: Props) { } if (!chartTiming || chapters.length === 0) return setIsPlaying(false) + setSelectedChapterIndex(null) setChapterTourActive(true) setTourChapterIndex(0) const startScrub = chapterStartScrub(chapters[0], chartTiming.tMin, chartTiming.tRange) ?? 0 @@ -359,6 +366,7 @@ export function RaceStoryCanvas({ data }: Props) { const handlePointerMove = (e: React.PointerEvent) => { setIsPlaying(false) stopChapterTour() + clearChapterSelection() if (!svgRef.current) return const rect = svgRef.current.getBoundingClientRect() const x = e.clientX - rect.left @@ -540,7 +548,10 @@ export function RaceStoryCanvas({ data }: Props) { fill="transparent" onPointerMove={handlePointerMove} onPointerLeave={() => { - if (!isPlaying) setScrubTime(null) + if (!isPlaying) { + clearChapterSelection() + setScrubTime(null) + } }} style={{ cursor: 'crosshair', touchAction: 'none' }} /> @@ -552,6 +563,7 @@ export function RaceStoryCanvas({ data }: Props) { onClick={() => { setScrubTime((current) => current ?? 0) stopChapterTour() + clearChapterSelection() setIsPlaying((current) => !current) }} aria-pressed={isPlaying} @@ -599,6 +611,7 @@ export function RaceStoryCanvas({ data }: Props) { tRange={chartTiming.tRange} tourActive={chapterTourActive} tourChapterIndex={tourChapterIndex} + selectedChapterIndex={selectedChapterIndex} onChapterClick={jumpToChapter} onTourToggle={toggleChapterTour} /> diff --git a/frontend/src/lib/chapters.ts b/frontend/src/lib/chapters.ts index c8f45c5..694962c 100644 --- a/frontend/src/lib/chapters.ts +++ b/frontend/src/lib/chapters.ts @@ -53,7 +53,10 @@ export function chapterEndScrub( return Math.max(0, Math.min(1, (ms - tMin) / tRange)) } -/** Index of the chapter containing the current scrub position, if any. */ +/** Index of the chapter containing the current scrub position, if any. + * Uses the same 0–1 clamped bounds as chapterStartScrub/chapterEndScrub so + * chapters whose timestamps fall outside the position-sample window still + * activate when the scrubber is parked at the clamped edge. */ export function activeChapterIndex( chapters: Chapter[], scrubTime: number | null, @@ -61,15 +64,13 @@ export function activeChapterIndex( tRange: number, ): number | null { if (scrubTime === null || chapters.length === 0 || tRange <= 0) return null - const chartMs = tMin + scrubTime * tRange for (let i = 0; i < chapters.length; i++) { - const ch = chapters[i] - const startMs = ch.start_time ? new Date(ch.start_time).getTime() : NaN - const endRaw = ch.end_time ?? ch.start_time - const endMs = endRaw ? new Date(endRaw).getTime() : NaN - if (!Number.isNaN(startMs) && !Number.isNaN(endMs) && chartMs >= startMs && chartMs <= endMs) { - return i - } + const start = chapterStartScrub(chapters[i], tMin, tRange) + const end = chapterEndScrub(chapters[i], tMin, tRange) + if (start === null || end === null) continue + const lo = Math.min(start, end) + const hi = Math.max(start, end) + if (scrubTime >= lo && scrubTime <= hi) return i } return null } diff --git a/frontend/src/styles/app.css b/frontend/src/styles/app.css index 32e0005..797c6c0 100644 --- a/frontend/src/styles/app.css +++ b/frontend/src/styles/app.css @@ -520,17 +520,6 @@ a { color: inherit; text-decoration: none; } color: var(--text-3); } -.empty-state-icon { - display: block; - margin: 0 auto var(--s3); - color: var(--text-3); -} - -.race-story-empty-card { - padding: var(--s6) var(--s5); - margin: 0; -} - .loading-state { padding: var(--s7) 0; text-align: center; diff --git a/frontend/src/styles/chapters.css b/frontend/src/styles/chapters.css index f131c36..9cc6007 100644 --- a/frontend/src/styles/chapters.css +++ b/frontend/src/styles/chapters.css @@ -196,6 +196,7 @@ } .chapter-strip-empty-card .empty-state-icon { + display: block; margin: 0 auto var(--s3); color: var(--text-3); } diff --git a/frontend/src/styles/race-story.css b/frontend/src/styles/race-story.css index e151b7a..5fd1704 100644 --- a/frontend/src/styles/race-story.css +++ b/frontend/src/styles/race-story.css @@ -1,3 +1,14 @@ +.race-story-empty-card { + padding: var(--s6) var(--s5); + margin: 0; +} + +.race-story-empty-card .empty-state-icon { + display: block; + margin: 0 auto var(--s3); + color: var(--text-3); +} + .rs-replay-shell { display: grid; grid-template-columns: 1fr; diff --git a/frontend/src/styles/replay-map.css b/frontend/src/styles/replay-map.css index 29f5ebd..ca7e5c0 100644 --- a/frontend/src/styles/replay-map.css +++ b/frontend/src/styles/replay-map.css @@ -85,6 +85,7 @@ } .replay-map-empty-card .empty-state-icon { + display: block; margin: 0 auto var(--s3); color: var(--text-3); } diff --git a/frontend/src/test/ChapterStrip.test.tsx b/frontend/src/test/ChapterStrip.test.tsx index c3cc5a7..636adb9 100644 --- a/frontend/src/test/ChapterStrip.test.tsx +++ b/frontend/src/test/ChapterStrip.test.tsx @@ -103,4 +103,26 @@ describe('ChapterStrip', () => { expect(index).toBe(1) expect(scrub).toBeCloseTo(0.6, 2) }) + + it('highlights an explicitly selected chapter even when scrub is outside its raw window', () => { + // Scrub parked at chart start; chapter 1's raw times are mid-race, but selection wins. + const queryClient = new QueryClient({ defaultOptions: { queries: { retry: false } } }) + render( + + + , + ) + expect(screen.getByTestId('chapter-card-1')).toHaveClass('active') + expect(screen.getByTestId('chapter-card-0')).not.toHaveClass('active') + }) }) diff --git a/frontend/src/test/RaceStoryCanvas.test.tsx b/frontend/src/test/RaceStoryCanvas.test.tsx index 7de9ef5..2b0ce1d 100644 --- a/frontend/src/test/RaceStoryCanvas.test.tsx +++ b/frontend/src/test/RaceStoryCanvas.test.tsx @@ -187,6 +187,46 @@ describe('RaceStoryCanvas replay map', () => { expect(screen.getByTestId('chapter-card-0')).not.toHaveClass('active') }) + it('highlights out-of-window chapters after click (clamped scrub + selection)', async () => { + // Position samples start at 13:05; start chapter ends at 13:01 — outside the window. + renderCanvas({ + positions: [ + { session_key: 99, driver_number: 1, meeting_key: 1, date: '2025-05-25T13:05:00Z', position: 1 }, + { session_key: 99, driver_number: 1, meeting_key: 1, date: '2025-05-25T13:10:00Z', position: 1 }, + ], + chapters: [ + { + kind: 'start', + title: 'Start', + headline: 'Lights out before samples', + start_lap: 1, + end_lap: 1, + start_time: '2025-05-25T13:00:00Z', + end_time: '2025-05-25T13:01:00Z', + driver_numbers: [], + }, + { + kind: 'finish', + title: 'Finish', + headline: 'Flag after samples', + start_lap: 78, + end_lap: 78, + start_time: '2025-05-25T13:20:00Z', + end_time: '2025-05-25T13:21:00Z', + driver_numbers: [], + }, + ], + }) + + fireEvent.click(screen.getByTestId('chapter-card-0')) + await waitFor(() => expect(screen.getByTestId('chapter-card-0')).toHaveClass('active')) + expect(screen.getByTestId('chapter-card-1')).not.toHaveClass('active') + + fireEvent.click(screen.getByTestId('chapter-card-1')) + await waitFor(() => expect(screen.getByTestId('chapter-card-1')).toHaveClass('active')) + expect(screen.getByTestId('chapter-card-0')).not.toHaveClass('active') + }) + it('renders the empty-state card when positions are unavailable', () => { renderCanvas({ datasets: { positions: { status: 'missing', source: 'local', count: 0 } }, diff --git a/frontend/src/test/chapters.test.ts b/frontend/src/test/chapters.test.ts index 290d936..3e16d50 100644 --- a/frontend/src/test/chapters.test.ts +++ b/frontend/src/test/chapters.test.ts @@ -60,6 +60,41 @@ describe('chapters lib', () => { expect(activeChapterIndex(sampleChapters, scrub, tMin, tRange)).toBe(1) }) + it('activates chapters whose timestamps clamp outside the position window', () => { + // Position samples only cover 13:05–13:10; chapters sit before/after that window. + const tMin = new Date('2025-05-25T13:05:00Z').getTime() + const tMax = new Date('2025-05-25T13:10:00Z').getTime() + const tRange = tMax - tMin + const outOfWindow: Chapter[] = [ + { + kind: 'start', + title: 'Start', + headline: 'Lights out', + start_lap: 1, + end_lap: 1, + start_time: '2025-05-25T13:00:00Z', + end_time: '2025-05-25T13:01:00Z', + driver_numbers: [], + }, + { + kind: 'finish', + title: 'Finish', + headline: 'Chequered flag', + start_lap: 78, + end_lap: 78, + start_time: '2025-05-25T13:20:00Z', + end_time: '2025-05-25T13:21:00Z', + driver_numbers: [], + }, + ] + + expect(chapterStartScrub(outOfWindow[0], tMin, tRange)).toBe(0) + expect(chapterStartScrub(outOfWindow[1], tMin, tRange)).toBe(1) + expect(activeChapterIndex(outOfWindow, 0, tMin, tRange)).toBe(0) + expect(activeChapterIndex(outOfWindow, 1, tMin, tRange)).toBe(1) + expect(activeChapterIndex(outOfWindow, 0.5, tMin, tRange)).toBeNull() + }) + it('splits 90s evenly across chapters', () => { expect(chapterTourDurations(sampleChapters)).toEqual([45_000, 45_000]) }) diff --git a/tests/race-hub.spec.ts b/tests/race-hub.spec.ts index 54e9cf3..66b0b43 100644 --- a/tests/race-hub.spec.ts +++ b/tests/race-hub.spec.ts @@ -39,7 +39,17 @@ test.describe('Race Hub Weekend Workspace', () => { await expect( page.getByRole('img', { name: 'Position evolution chart' }), ).toBeVisible() - await expect(page.getByText('Lap-by-lap positions not available.')).not.toBeVisible() + await expect(page.getByTestId('race-story-no-positions')).not.toBeVisible() + }) + + test('Race Story highlights a chapter card when clicked', async ({ page }) => { + await page.goto(`/race-hub?session_key=${FULL_SESSION}`) + await page.getByRole('tab', { name: 'Race Story' }).click() + + const firstCard = page.getByTestId('chapter-card-0') + await expect(firstCard).toBeVisible() + await firstCard.click() + await expect(firstCard).toHaveClass(/active/) }) test('strategy tab renders stint chart when stints are available', async ({ page }) => { @@ -58,13 +68,15 @@ test.describe('Race Hub Weekend Workspace', () => { await expect(page.locator('[data-testid="strategy-chart"]')).not.toBeVisible() }) - test('Race Story shows missing notice when positions are unavailable', async ({ + test('Race Story shows empty-state card when positions are unavailable', async ({ page, }) => { await page.goto(`/race-hub?session_key=${CORE_ONLY_SESSION}`) await page.getByRole('tab', { name: 'Race Story' }).click() - await expect(page.getByText('Lap-by-lap positions not available.')).toBeVisible() + const empty = page.getByTestId('race-story-no-positions') + await expect(empty).toBeVisible() + await expect(empty.getByText('Lap-by-lap positions not available')).toBeVisible() await expect(page.locator('[data-testid="position-chart"]')).not.toBeVisible() })