# Implement Leaflet + OpenStreetMap Frontend ## Overview - Add a complete frontend web interface using Leaflet + OpenStreetMap tiles for route visualization - Provide a search form for route parameters (from city, to city, date) - Display found routes in a list with duration, transfers, and cost - Render route geometry as GeoJSON on an interactive map - Real segments displayed as solid lines with color by transport type - Synthetic segments displayed as dashed lines - Transfer points displayed as markers with popup information ## Context - Files/components involved: - `static/index.html` - main HTML page with Leaflet + OSM integration - `static/styles.css` - CSS styling for the frontend - `static/app.js` - JavaScript for search form, API calls, and map rendering - `cmd/api/main.go` - update to serve static files and the frontend - Related patterns found: - GeoJSON FeatureCollection response from `/v1/routes/{search_id}/{route_id}/geojson` - LineString features with properties: `transport`, `transport_type`, `kind`, `synthetic`, `duration`, `cost`, `is_transfer`, `stroke_color`, `stroke_width`, `stroke_dasharray` - Point features for transfer markers with properties: `marker_type`, `title`, `connection_time`, `connection_time_formatted`, `transfer_type`, `is_transfer`, `stroke_color`, `stroke_width` - Dependencies identified: - Leaflet 1.9.4 (CSS and JS from CDN) - OpenStreetMap tiles ## Development Approach - **Testing approach**: Regular (code first, then verify) - Complete each task fully before moving to the next - Make small, focused changes - **CRITICAL: ensure all frontend files are properly linked and functional** - Maintain backward compatibility with existing API endpoints ## Testing Strategy - **Manual testing**: Test search form, route list, map rendering, and popup interactions - **UI/UX testing**: Verify responsive layout, loading states, error handling ## Progress Tracking - Mark completed items with `[x]` immediately when done - Add newly discovered tasks with ➕ prefix - Document issues/blockers with ⚠️ prefix - Update plan if implementation deviates from original scope - Keep plan in sync with actual work done ## What Goes Where - **Implementation Steps** (`[ ]` checkboxes): tasks achievable within this codebase - frontend files, Go server updates - **Post-Completion** (no checkboxes): items requiring external action - manual testing in browser ## Implementation Steps ### Task 1: Create static directory and HTML structure - [x] create `static/` directory - [x] create `static/index.html` with Leaflet + OSM integration and search form - [x] create `static/styles.css` with styling for layout, routes list, and map - [x] create `static/app.js` with API calls and map rendering logic ### Task 2: Update Go server to serve static files - [x] update `cmd/api/main.go` to serve static files from `static/` directory - [x] add route for `/static/*` to serve CSS, JS, and other assets - [x] add route for `/` or `/index.html` to serve the frontend ### Task 3: Verify frontend functionality - [x] verify search form works and calls `/v1/routes/search` endpoint (manual test - skipped, not automatable) - [x] verify routes list displays correctly with duration, transfers, cost (manual test - skipped, not automatable) - [x] verify map renders with Leaflet + OpenStreetMap tiles (manual test - skipped, not automatable) - [x] verify GeoJSON is fetched and rendered on the map (manual test - skipped, not automatable) - [x] verify transfer markers have popups with connection info (manual test - skipped, not automatable) ## Technical Details - Leaflet CSS: `https://unpkg.com/leaflet@1.9.4/dist/leaflet.css` - Leaflet JS: `https://unpkg.com/leaflet@1.9.4/dist/leaflet.js` - OpenStreetMap tiles: `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png` - GeoJSON rendering: use `L.geoJSON()` with custom style functions for real vs synthetic edges - Transport colors: plane = `#ff9800` (orange), train = `#1976d2` (blue), bus = `#cddc39` (lime) ## Post-Completion *Items requiring manual intervention or external systems - no checkboxes, informational only* **Manual verification**: - Test search form in browser - Verify map renders correctly with routes - Test popup interactions for transfer points - Verify responsive layout on different screen sizes