Trips
What you're booked on
Overview
Three vertically-stacked sections with mono uppercase eyebrows — TODAY, UPCOMING, PAST. Each section is a list of TripRow cards. A row contains the route name in Instrument Serif, the formatted date below, the party size and any reservation notes, and a status pill on the right (CONFIRMED, PENDING, CANCELLED). The PAST section is faded slightly — the rows still link, but they read as memory rather than action.
How it works
`GET /api/passenger/reservations` returns all reservations for the current user, including the joined route record. The client splits the array on the server-formatted dateISO field.
Status pills use the design system tokens — confirmed is sage (#8AAA72), pending is wheat (#A7A36B), cancelled is cabernet (#7E3A3A). Each pill is a mono uppercase label inside a 999px-radius border in the same color.
Tap routing: today's trip pushes to Today tab; upcoming trips push to a read-only `/(passenger)/trip/[id]` route with the route preview; past trips push to a log-style summary of stops visited and any driver notes.
If a section is empty, the empty state uses the same paper-card chrome as the other empty states in the app — consistency over per-screen flair.
Key decisions
Three buckets, not one continuous list
The 'rider has booked 4 trips' use case is the most common, and a single chronological list buries today behind two-week-old reservations. Splitting into TODAY / UPCOMING / PAST puts the actionable trip at the top and lets the past fade.
No filtering, no search
If a rider has more than 20 trips, search would help. But the use case at launch is 'I have a trip today and another next month' — that's six or seven rows tops. We will add filters when usage warrants them. Until then, the list is short enough to scan.
