Commit graph

5 commits

Author SHA1 Message Date
ceea5706b3 Fix mobile panel visibility with floating button and iOS CSS fixes
Replace the unreliable peek-strip approach with a floating '☰ Controls'
button on the map. The button is always clearly visible, hides when the
panel is open, and reappears when the panel closes.

Also fix two iOS Safari issues that were hiding the sidebar entirely:
- overflow:hidden on body clips position:fixed elements in mobile Safari;
  reset to overflow:visible in the mobile media query
- Add viewport-fit=cover and env(safe-area-inset-bottom) padding so the
  sidebar clears the home indicator / browser toolbar
- Use 100dvh instead of 100vh to avoid iOS address-bar overflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 10:22:53 +00:00
6927efca54 Add mobile bottom-sheet layout
On narrow screens the sidebar collapses to a 48px handle strip at the
bottom of the screen. Tapping the handle slides the panel up to 65vh,
revealing the full stop list and controls. The map takes the full
viewport width when the panel is closed or peek-visible.

The handle label updates dynamically to show the loaded route name.
The panel auto-opens when a route or route_master finishes loading.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-28 10:02:14 +00:00
f2989caaec Fix sidebar scroll not reaching last stop
Two issues:
1. Flex items default to min-height:auto, which allows them to grow
   beyond the flex container instead of being constrained and scrolling.
   Add min-height:0 to #sidebar so overflow-y:auto works correctly.
2. WebKit ignores padding-bottom on overflow containers entirely.
   Remove it from #sidebar and increase padding-bottom on #stop-list
   and #route-master-list (children inside the scroll container, where
   padding-bottom is respected) from 1rem to 2rem.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 20:57:16 +00:00
6424992264 Fix stop list cut off at bottom of sidebar
WebKit/Chrome ignores padding-bottom on overflow-y:auto containers,
so the sidebar's padding: 1rem wasn't creating scroll space below the
last stop. Fix by adding padding-bottom directly to #stop-list and
#route-master-list, which are inside the scrollable container.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 20:53:09 +00:00
e0ade9e5ab Add web frontend and refactor core to use OsmError
- Refactor core.py: replace sys.exit() calls with OsmError exceptions
  so the library is safe to use from Flask and other callers
- Add fetch_sibling_routes and fetch_route_master_routes to core.py
- Add Flask web frontend (web/app.py, templates, static assets):
  - Map view with Leaflet; full route drawn in grey on load
  - Sidebar stop list; active-slot UX for From/To selection
  - Segment preview and download (full route or selected segment)
  - Include-stops toggle applied client-side
  - Bookmarkable URLs: GET /<relation_id>
  - Clear selection button
  - Other directions panel (sibling routes from same route_master)
  - route_master handling: draws all member routes in colour on map
    with links to each individual direction
- Add SVG favicon
- Add py.typed marker; add .gitignore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 18:59:21 +00:00