Touch swipe on the content area moves between tabs (left = next, right =
previous), gated to non-radar views so map pan gestures keep working.
Vertical scroll with |dx|<|dy| is untouched; 60px horizontal threshold.
- 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.