5 Commits

Author SHA1 Message Date
36d3625d61 Make tabs hash-routable
- New src/lib/router.js: parseHash/ viewToHash for the 5 tab views, with a
  default fallback for empty/unknown hashes.
- App.svelte: initialize viewMode from location.hash, setView() updates both
  state and the URL hash, and a guarded hashchange listener syncs back/forward
  and manual URL edits. All tab onclicks route through setView().
- Tests for parse/viewToHash round-trips and fallback. 76 total pass.
2026-08-27 00:41:05 +00:00
7e06c17bfa Use light-drizzle icon for WMO 61 (light rain) and 80 (light showers)
Both codes now render 🌦️ instead of 🌧️ in the CODE_MAP. Updated the
weather-codes tests accordingly.
2026-08-27 00:35:29 +00:00
ff73e58d31 Add toggleable lightning strike layer to the radar map
- Lightning layer on PrecipitationRadar: toggleable  button (persisted via
  showLightning setting). When on, fetches recent strikes from the planned CORS
  relay and renders them as markers that pan/zoom with the slippy map.
- New src/lib/api/lightning.js: fetchLightningStrikes() reads
  https://cors.thecookiejar.me/lightning?lat&lon&radiusKm&limit (relay NOT
  deployed yet) with an 8s abort timeout and graceful failure - never blocks or
  crashes the map, shows an unavailable banner instead. Exports pure
  projectStrikeToLayer() for Mercator tile-layer marker projection.
- showLightning setting added to DEFAULT_SETTINGS + app store; toggle persists.
- Tests: fetch URL/parsing/error handling + layer projection. 71 total pass.
2026-08-27 00:30:25 +00:00
3635937085 Remove location label badge from radar pin 2026-08-24 15:46:36 +00:00
0e2a15dd28 Show today's daily high/low on the Now tab 2026-08-23 13:19:03 +00:00