- Transport entries carry an optional ordered waypoints array of
lat/lng/name points; /route attaches them to the ground leg the
transport bridges, and /api/directions accepts a via param so the
drawn road route detours through them
- Day editor gains a geocoded "Scenic waypoints" list on transport
entries; the map draws leg-coloured waypoint dots
- Escape waypoint names in the Leaflet tooltip (stored-XSS fix flagged
by security review: names are user-typed and Leaflet renders string
tooltips as HTML)
Legs cycle through the shared 8-hue palette by index: polylines (air
stays dashed), km-label accents, and the Legs-list number badges all
match, so multiple car routes are distinguishable. Badges use dark text
after a contrast check ruled out white on these hues.
- Auto-created transports carry auto_ref {from,to} stay ids; new
POST /api/trips/:id/transports/regenerate reconciles them against the
current stay order (re-date/re-title kept bridges preserving mode and
price, delete orphans, create missing) without touching manual
transports or flight-covered gaps
- Sync transports button in the calendar header with result toast
- The week band strip is now a drop target resolving the day from the
pointer position, so stays can be dropped onto spots covered by other
stays; overlapping stays stack in band lanes
Dragging any week-segment of a stay band onto an in-range day moves the
whole stay there, preserving its length (same one-PATCH date+end_date
shift the multi-day chips use). Clicking a band still opens the editor.
- trip_members.sort_order (per-user, migrated) drives GET /api/trips order
- PATCH /api/trips/:id/order updates only the caller's membership row
- Trip cards get a drag handle reusing the generalized row-reorder helper;
clicking the card still navigates
Calendar chips can be dragged onto another in-range day (multi-day entries shift end_date by the same delta in one PATCH); day-editor rows get a drag handle to reorder within a day, patching sort_order only for changed positions. Continues/dropoff ghost chips and stay bands are not draggable; touch devices fall back to the existing click/edit flow. Each stay band now gets a deterministic colour from an 8-hue palette by chronological index, mirrored as dots in the summary Areas list.
Grid items default to min-width:auto, so a long unbreakable chip (multi-leg flight code chains) forced its day column wider and deformed the week grid. Allow day cells and chips to shrink (min-width: 0) so the existing ellipsis rules apply, and pin the price badge so it never truncates.
The stay-bands restructure changed the calendar markup to per-week rows (.cal-weekdays / .cal-week / .cal-week-days / .cal-week-bands) but styles.css still only styled the old flat .calendar-grid, so day cells stacked vertically. Adds the 7-column grid layout for the new structure plus the missing stay-band styles (lanes, rounded ends, hover), and updates the narrow-screen rules.
Entries gain an optional inclusive end_date (backfilled via migration): flights and travel longer than 24h show a continuation marker on following days, and a new stay entry type marks a time frame in one area (e.g. 3 days Venice) rendered as continuous bands across the calendar weeks. Stays feed the map route as stops; the route summary gains stays count and a chronological areas list with day spans. 49 API tests.