fix(nav): Scroll-Position bei Browser-Back robust wiederherstellen
All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 2m44s
All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 2m44s
Pages, die ihre Daten in onMount per fetch laden (Home, Wunschliste, Einkaufsliste), waren bei popstate-Navigation kaputt: SvelteKit ruft scrollTo() synchron nach Mount, aber die Listen sind dann noch leer und das Dokument zu kurz — der Browser clamped auf 0. Neuer Helper src/lib/client/scroll-restore.ts merkt scrollY pro URL in sessionStorage (beforeNavigate) und stellt sie bei popstate per rAF- Polling wieder her, sobald document.scrollHeight gross genug ist (Hard-Budget 1.5s, danach best-effort scrollTo). Layout ruft die zwei Helper im beforeNavigate / afterNavigate. Pages mit SSR-Daten (z. B. /recipes) bleiben unbeeinflusst — dort matcht unser Wert SvelteKits eigenen scrollTo bereits beim ersten Frame. Tests: 7 neue Unit-Tests in tests/unit/scroll-restore.test.ts decken Recording, Pro-URL-Trennung, Skip fuer Forward-Nav, sofortiges und verzoegertes Restore ab. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { onMount } from 'svelte';
|
||||
import { page } from '$app/stores';
|
||||
import { goto, afterNavigate } from '$app/navigation';
|
||||
import { goto, afterNavigate, beforeNavigate } from '$app/navigation';
|
||||
import {
|
||||
Settings,
|
||||
CookingPot,
|
||||
@@ -28,6 +28,7 @@
|
||||
import { installPrompt } from '$lib/client/install-prompt.svelte';
|
||||
import { registerServiceWorker } from '$lib/client/sw-register';
|
||||
import { SearchStore } from '$lib/client/search.svelte';
|
||||
import { recordScroll, restoreScroll } from '$lib/client/scroll-restore';
|
||||
|
||||
let { data, children } = $props();
|
||||
|
||||
@@ -97,7 +98,11 @@
|
||||
}
|
||||
}
|
||||
|
||||
afterNavigate(() => {
|
||||
beforeNavigate(() => {
|
||||
recordScroll();
|
||||
});
|
||||
|
||||
afterNavigate((nav) => {
|
||||
navStore.reset();
|
||||
navOpen = false;
|
||||
menuOpen = false;
|
||||
@@ -107,6 +112,7 @@
|
||||
// wurde.
|
||||
void wishlistStore.refresh();
|
||||
void shoppingCartStore.refresh();
|
||||
restoreScroll(nav.type);
|
||||
});
|
||||
|
||||
onMount(() => {
|
||||
|
||||
Reference in New Issue
Block a user