diff --git a/hdyc-svelte/src/routes/+layout.svelte b/hdyc-svelte/src/routes/+layout.svelte
index 2f07863..74404c6 100644
--- a/hdyc-svelte/src/routes/+layout.svelte
+++ b/hdyc-svelte/src/routes/+layout.svelte
@@ -265,6 +265,7 @@
let isMobileHeader = false;
let theme: ThemeMode = 'dark';
let selectedPaletteIndex = 0;
+ let savedScrollRestoration: ScrollRestoration | null = null;
$: isHomepage = $page.url.pathname === '/';
$: if (isHomepage && (sidebarOpen || headerSearchOpen)) {
sidebarOpen = false;
@@ -326,14 +327,30 @@
document.head.appendChild(script);
};
- afterNavigate(() => {
+ const scrollToTop = () => {
+ if (!browser) return;
+ window.scrollTo({ top: 0, behavior: 'auto' });
+ };
+
+ afterNavigate(({ from, to, type }) => {
sidebarOpen = false;
headerSearchOpen = false;
+
+ if (!browser) return;
+ if (type === 'popstate') return;
+ if (!from || !to) return;
+ if (from.url.pathname === to.url.pathname) return;
+
+ scrollToTop();
});
onMount(() => {
if (!browser) return;
const appWindow = window as WindowWithAnalytics;
+ if ('scrollRestoration' in window.history) {
+ savedScrollRestoration = window.history.scrollRestoration;
+ window.history.scrollRestoration = 'manual';
+ }
let idleCallbackId: number | null = null;
let fallbackTimeoutId: number | null = null;
@@ -411,6 +428,9 @@
window.clearTimeout(fallbackTimeoutId);
}
window.removeEventListener('keydown', handleEscape);
+ if (savedScrollRestoration !== null) {
+ window.history.scrollRestoration = savedScrollRestoration;
+ }
};
if ('addEventListener' in mediaQuery) {
diff --git a/hdyc-svelte/src/routes/[slug]/+page.svelte b/hdyc-svelte/src/routes/[slug]/+page.svelte
index 1a83dd3..86235f4 100644
--- a/hdyc-svelte/src/routes/[slug]/+page.svelte
+++ b/hdyc-svelte/src/routes/[slug]/+page.svelte
@@ -1,8 +1,5 @@