A mobile-first web app that helps you navigate Disneyland Paris — just like Google Maps, but tailored to your family and the live crowds.
- 🗺️ Dark map (CARTO dark tiles) centered on the park, with a pin per attraction.
- ⏱️ Live wait times via the ThemeParks.wiki API (free, CORS-enabled, no key required). Refreshes every 5 minutes.
- 👨👩👧 Family profile: age, height, sensitivity to dark/drops, stroller mode, max wait time. Stored in
localStorage. - 🧭 Route planning: greedy algorithm (walking distance + wait time) that accounts for family fit and closed attractions.
- 📍 Live location (optional) via
navigator.geolocationwith a blue "you are here" pin. - 🏰🎬 Park/Studios switch (Disneyland Park ↔ Walt Disney Studios / Adventure World).
| Layer | Choice |
|---|---|
| Build | Vite 5 + TypeScript 5 strict |
| UI | React 18 + Tailwind CSS 3 |
| Map | Leaflet 1.9 + react-leaflet 4 |
| Tiles | CARTO Dark Matter (OSM data) |
| Live data | ThemeParks.wiki v1 (/entity/{id}/live) |
| Storage | localStorage (family profile) |
npm install
npm run dev # http://localhost:5173
npm run build # production build in dist/
npm run preview # preview of dist/
npm test # vitest run
npm run sync:ids # match live UUIDs against ThemeParks.wikiThe project is Vercel-ready (vercel.json is set up with framework=vite + SPA rewrites + cache headers). Two options:
One-click via the dashboard:
- Go to https://vercel.com/new
- "Import Git Repository" → pick
sydneyvb-nl/Disneynav- - The framework is auto-detected as Vite — click Deploy
- Done; every
git pushtomaindeploys automatically
CLI (if you have a Vercel account):
npm i -g vercel
vercel link # link this project
vercel --prod # deployNo environment variables are required. The app talks directly to api.themeparks.wiki from the browser (CORS-enabled).
src/
├─ App.tsx Root: park selection, state, routing
├─ main.tsx React entry
├─ styles.css Tailwind + Leaflet theming
├─ types.ts FamilyProfile, LiveWait, Scored
├─ components/
│ ├─ TopBar.tsx Header with park switch + "I'm here"
│ ├─ MapView.tsx Leaflet map with pins + route line
│ ├─ BottomSheet.tsx Nearby / Route / All, crowd badges
│ └─ FamilySheet.tsx Modal for family composition
├─ data/
│ └─ attractions.ts ~25 curated attractions + coords + requirements
├─ hooks/
│ ├─ useLiveWaits.ts Polling of /entity/dlp/live
│ └─ useGeolocation.ts watchPosition wrapper
└─ lib/
├─ api.ts Mapping API → LiveWait
├─ geo.ts Haversine + walking time
├─ scoring.ts Eligibility + greedy route planner
└─ storage.ts localStorage helpers
ThemeParks.wiki is a community API, not officially from Disney. Use it respectfully (no high refresh rates). For production, consider setting up your own cache/proxy. See ROADMAP.md for next steps and MODEL_HANDOFF.md for the technical status.
Licensed under the Apache License 2.0.