Upgrade live timing page for race weekends

- Track status flag banner (green/yellow/SC/VSC/red, defensive mapping)
- Weather strip: air/track temp, humidity, wind with compass, rain badge
- Gap trend sparklines from a per-driver interval ring buffer
- Battle detection: consecutive cars within 1.0s chained and highlighted
- Stint history column with compound sequence per driver
- Pinnable drivers (max 3) with focus cards, persisted to localStorage

Pure logic lives in lib/gapHistory.ts and lib/battles.ts with unit
tests; 137 frontend tests passing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-03 00:21:23 -04:00
parent 7a5e0a323d
commit c708b6697d
17 changed files with 1342 additions and 31 deletions

View File

@@ -0,0 +1,21 @@
import type { Battle } from '../../lib/battles'
import { battleLabel } from '../../lib/battles'
interface Props {
battles: Battle[]
}
export function BattleChips({ battles }: Props) {
if (battles.length === 0) return null
return (
<div className="battle-chips" data-testid="battle-chips">
<span className="battle-chips-label">Battles</span>
{battles.map((battle) => (
<span className="battle-chip mono" key={battle.drivers.map((d) => d.racingNumber).join('-')}>
{battleLabel(battle)}
</span>
))}
</div>
)
}