diff --git a/web/components/confirm-dialog.tsx b/web/components/confirm-dialog.tsx index 688a936..0034e13 100644 --- a/web/components/confirm-dialog.tsx +++ b/web/components/confirm-dialog.tsx @@ -41,6 +41,19 @@ export default function ConfirmDialog({ } }, [open]); + // Lock body scroll while open. Native doesn't do this in all + // browsers (notably iOS Safari), so background scroll can leak through + // when scrolling on the dialog content. We restore the previous value + // on close so other modals stacking later don't regress this. + useEffect(() => { + if (!open) return; + const previous = document.body.style.overflow; + document.body.style.overflow = "hidden"; + return () => { + document.body.style.overflow = previous; + }; + }, [open]); + return ( doesn't on iOS Safari). + useEffect(() => { + if (!open) return; + const previous = document.body.style.overflow; + document.body.style.overflow = "hidden"; + return () => { + document.body.style.overflow = previous; + }; + }, [open]); + return (