fix: move scroll lock to afterUpdate to avoid SSR document access

The $: reactive block runs during SSR component init. Use afterUpdate
with a mounted guard instead so document is only accessed client-side.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 16:30:20 +01:00
parent f5a5323c15
commit 4b35753fc7
@@ -1,6 +1,5 @@
<script> <script>
import { onMount, onDestroy } from 'svelte'; import { onMount, onDestroy, afterUpdate } from 'svelte';
import { browser } from '$app/environment';
/** @type {boolean} */ /** @type {boolean} */
export let open = false; export let open = false;
@@ -11,6 +10,7 @@
let dragOffset = 0; let dragOffset = 0;
let dragging = false; let dragging = false;
let locked = false; let locked = false;
let mounted = false;
/** @type {number|null} */ /** @type {number|null} */
let startY = null; let startY = null;
@@ -29,8 +29,9 @@
/** @type {HTMLDivElement|null} */ /** @type {HTMLDivElement|null} */
let sheetEl = null; let sheetEl = null;
// Body scroll lock // Body scroll lock — managed in afterUpdate to avoid SSR document access
$: if (browser) { afterUpdate(() => {
if (!mounted) return;
if (open) { if (open) {
document.documentElement.style.overflow = 'hidden'; document.documentElement.style.overflow = 'hidden';
} else { } else {
@@ -39,7 +40,7 @@
dragging = false; dragging = false;
locked = false; locked = false;
} }
} });
/** /**
* @param {KeyboardEvent} e * @param {KeyboardEvent} e
@@ -69,6 +70,7 @@
} }
onMount(() => { onMount(() => {
mounted = true;
document.addEventListener('keydown', handleKeydown); document.addEventListener('keydown', handleKeydown);
}); });