Plain <a href="/..."> links to in-app routes were causing full page
reloads. The DEK lives only in memory (session.svelte.ts), so every
reload drops it and private rows can't decrypt until the user signs
in again. Earlier fix (03ac99e) made the post-reload state usable;
this one removes the reload in the first place.
New helper lib/navigate.ts:
- navigate(path): pushState + dispatch synthetic popstate so the
existing window popstate listener in App.svelte re-parses and
applies the route. SPA state (DEK, decrypted activities, scroll
position) is preserved.
- onSpaLink(event, path): swallow plain left-click only. Modified
clicks (Cmd/Ctrl/Shift/Alt, middle-click, right-click) fall
through to the browser so "open in new tab", copy-link-address,
and screen-reader behaviour all still work.
Applied to the five internal anchors in ActivityRow.svelte:
permalink title (private + non-private), tag chips (private +
non-private), and the owner attribution link to /<user>/liste.
Verified in the browser: clicking a permalink now preserves a
window.__spaProbe marker; back-button likewise stays in-app.