Summary
Combined-event pages and single-event pages diverged in #99 and have been drifting since. The combined page still renders the pre-#99 client-side filter UI, and the two paths share almost none of their presentation code.
Noticed by BJ: "the results table from combined events looks slightly different than the event pages for single events… it's like it's still using the old code."
It is, literally.
What happened
#99 replaced the single-event page's client-side class-filter chip row with route-based per-class pages (EventClassNav). It did not touch /events/combined/[date], so that page kept the old UI.
combined-table.tsx:400-427 still renders the "Filter class" chip strip — same wrapper classes (bg-muted/40 px-4 py-3 border-b border-border/60), same "N of M" counter — that #99 deleted from single-event pages.
(#133 removes the single-event copy of that chip row, which had become unreachable dead code. The combined copy is still live.)
Visible differences
|
Single event |
Combined event |
| Class selection |
Route-based nav pills |
Client-side chip strip |
| Overview / All PAX / All Raw views |
Yes |
None — no PAX view at all |
| Header |
Title + class suffix, entry-count badge |
Eyebrow + title + ranking explanation + session cross-links |
| Unranked (forfeited) drivers |
n/a |
Dedicated list |
| Per-session time columns |
n/a |
Yes |
Note the header column: the combined header is the better one. It explains how the view is ranked and links to its siblings — exactly what the single-event views lack, and what would make "All Raw" vs "All PAX" self-describing.
Duplicated code (~950 lines across the two paths)
| Piece |
Status |
SortHeader |
Near-identical; differs only by an added title prop |
ClassChip |
Duplicated — #133 deletes the single-event copy, this one survives |
DriverCard |
Parallel mobile-card implementations |
| Row type + builder |
CombinedResultRow/buildCombinedResults vs LeaderboardRow/buildLeaderboard |
Proposed fix
Converge up to the combined header, not down to the single-event one.
- Shared
EventHeader — the combined header generalized: date · view type · N entries eyebrow, accent bar, title, a one-line explanation of how that view ranks, links row, Photos slot.
- Per-view explanation copy, e.g. All Raw → "Every entry at this event, ranked on raw corrected time, regardless of class."
- Route-based nav on combined —
/events/combined/[date]/[class], plus Overview and All Raw — retiring the chip strip.
- One shared results table, with per-session columns and the Unranked list as combined-only options; delete the duplicated
SortHeader / ClassChip / DriverCard.
To be explicit about scope: the separate route is legitimate — a combined event is a date-group, not an event, so /events/combined/[date] is the right address. What is not defensible is the separate table and presentation layer.
Sequencing
Depends on #133, which adds resolveEventView and the raw view and removes the chip row from leaderboard-table.tsx. Building this off develop instead would conflict heavily in exactly those files. Land #133 (and #134) first, then stack this.
Deferred deliberately — this touches every event results page, so it wants its own PR and its own review rather than riding along with a bug fix.
Summary
Combined-event pages and single-event pages diverged in #99 and have been drifting since. The combined page still renders the pre-#99 client-side filter UI, and the two paths share almost none of their presentation code.
Noticed by BJ: "the results table from combined events looks slightly different than the event pages for single events… it's like it's still using the old code."
It is, literally.
What happened
#99 replaced the single-event page's client-side class-filter chip row with route-based per-class pages (
EventClassNav). It did not touch/events/combined/[date], so that page kept the old UI.combined-table.tsx:400-427still renders the "Filter class" chip strip — same wrapper classes (bg-muted/40 px-4 py-3 border-b border-border/60), same "N of M" counter — that #99 deleted from single-event pages.(#133 removes the single-event copy of that chip row, which had become unreachable dead code. The combined copy is still live.)
Visible differences
Note the header column: the combined header is the better one. It explains how the view is ranked and links to its siblings — exactly what the single-event views lack, and what would make "All Raw" vs "All PAX" self-describing.
Duplicated code (~950 lines across the two paths)
SortHeadertitlepropClassChipDriverCardCombinedResultRow/buildCombinedResultsvsLeaderboardRow/buildLeaderboardProposed fix
Converge up to the combined header, not down to the single-event one.
EventHeader— the combined header generalized:date · view type · N entrieseyebrow, accent bar, title, a one-line explanation of how that view ranks, links row, Photos slot./events/combined/[date]/[class], plus Overview and All Raw — retiring the chip strip.SortHeader/ClassChip/DriverCard.To be explicit about scope: the separate route is legitimate — a combined event is a date-group, not an event, so
/events/combined/[date]is the right address. What is not defensible is the separate table and presentation layer.Sequencing
Depends on #133, which adds
resolveEventViewand the raw view and removes the chip row fromleaderboard-table.tsx. Building this offdevelopinstead would conflict heavily in exactly those files. Land #133 (and #134) first, then stack this.Deferred deliberately — this touches every event results page, so it wants its own PR and its own review rather than riding along with a bug fix.