- Convert demo page from static server component to interactive client
component with live data fetching and graceful static fallbacks
- Add /api/trips/by-slug/[slug] for slug-based trip lookup
- Add /api/trips/[id]/packing/[itemId] PATCH for toggling packed status
- Add proxy routes for rNotes, rVote, rCart (server-side, no CORS needed)
- Add demo trip seed script (prisma/seed-demo.ts)
- Packing checkboxes are now interactive with optimistic updates
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace minimal footer with full 10-app ecosystem footer on landing page.
Update demo footer: rename rStack to r* Ecosystem, add rNetwork, fix emoji order.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- POST /api/trips/[id]/canvas: auto-creates rspace community, populates
with trip shapes (itinerary, destinations, bookings, budget, packing)
- POST /api/trips/[id]/sync: receives shape updates from canvas postMessage
bridge, updates corresponding DB records
- Trip dashboard: wires up onShapeUpdate callback, adds "Create Canvas" button
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PostMessage listener in CanvasEmbed receives shape updates from
the embedded rspace canvas iframe. Canvas-sync utility provides
type guards and API helpers for pushing shapes to rspace.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>