f567c0be48
Two parity gaps from the VanillaJS → Svelte migration (issue #500): 1. URL anchor when viewing a file. Opening a file now writes `?file=<id>` to the URL, so a preview is bookmarkable, reload-restorable, and Back/Forward open/close it. The viewer is driven from the URL via two effects (URL→viewer with `untrack` so a user close can't be re-opened; viewer→URL to drop the param on close with replaceState). Replaces the write-less, load-only `maybeOpenDeepLink` (the `?file` reader that was effectively dead because nothing ever set the param). 2. Multi-selection drag ghost. Dragging more than one item now sets a custom drag image: a stack of the first few rows plus a count badge, reusing the already-ported but orphaned `.drag-preview`/`.dragged-items`/ `.dragged-items-badge` styles. Previously a multi-item drag showed only the browser's default single-row ghost with no count. Also adds `static/geo/` to .prettierignore (the bundled minified world basemap from #499 is a data asset and must stay byte-faithful — it was failing `prettier --check`, blocking the gate). Frontend gate green: svelte-check 0/0, eslint, stylelint, prettier, 47 Vitest. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>