* Add Ambient Weather personal station integration
Fetches live data from the user's Ambient Weather station via their
REST API and displays it as a "My Station" card in the conditions tab.
- server.js: add /api/ambient endpoint with 60s cache using
AMBIENT_API_KEY and AMBIENT_APP_KEY env vars
- docker-compose.yml: expose AMBIENT_API_KEY/AMBIENT_APP_KEY env vars
- index.html: add collapsible "My Station" drawer to conditions tab
showing temp, humidity, wind, gusts, daily rain, pressure, UV,
solar radiation, and indoor readings
- app.js: add fetchAmbientStation() and renderAmbientStation(),
auto-refresh every 60s, peek text summary in drawer header
- style.css: station drawer styles
- .gitignore: add .env so API keys stay off git
Co-Authored-By: Claude <noreply@anthropic.com>
* Move Ambient Weather keys to Settings panel
Users can now enter their API Key and Application Key directly in the
Settings tab under "Ambient Weather Station". Keys are saved to
localStorage and sent per-request to the server proxy.
- index.html: add API Key + Application Key inputs with Save button
- app.js: persist keys in localStorage, populate inputs on load,
wire Save button (validates by testing the connection), pass keys
as query params in fetchAmbientStation and its auto-refresh loop
- server.js: accept apiKey/appKey from query params with env var
fallback; cache keyed per-user so multiple callers don't collide
---------
Co-authored-by: Claude <noreply@anthropic.com>
- Add fullscreen toggle button (⛶/✕) to Map tab controls row
- CSS class `map-fs` hides header/nav and expands map to fill screen
- Drop unreliable requestFullscreen() API (blocked on iOS/PWA) in favor of pure CSS approach
- Fix button state desync: syncBtn() runs on init so stale ✕ state can't persist across reloads
- Shrink embedded radar height on mobile (220px) and tune dvh calculations for safe-area insets
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Persist alertIdsSeen to localStorage so already-seen alerts don't
re-notify every time the PWA is opened; cap stored IDs at 200 entries
- Use serviceWorker.showNotification() for alert notifications so they
work when the app is backgrounded, with fallback to new Notification()
- Add ⛶ fullscreen button to radar embed; uses Fullscreen API and
resizes the MapLibre canvas after toggle
- Fix swipe-to-change-tab: block gesture when touch starts on a map,
hourly scroll row, or radar timeline; also require the gesture to be
more horizontal than vertical (dx > dy*1.5) to avoid conflict with
vertical scrolling
- Replace Leaflet with MapLibre GL JS v4.7.1 across all map instances
- CARTO dark/light and Esri satellite raster basemaps (no API key)
- All overlays (hurricane, wildfire, SPC, wind arrows) ported to GeoJSON sources/layers
- AQI, alert, temp, sun/moon markers via maplibregl.Marker with custom HTML
- Radar animation pre-loads all frames on load for smoother playback
- Compact loc-header: tighter padding and font sizes, all info preserved
- Search bar moved from header to Settings tab under Location section
- Service worker bumped to weather-v7
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>