···2323function toggleExplorer(this: HTMLElement) {
2424 const nearestExplorer = this.closest(".explorer") as HTMLElement
2525 if (!nearestExplorer) return
2626- nearestExplorer.classList.toggle("collapsed")
2626+ const explorerCollapsed = nearestExplorer.classList.toggle("collapsed")
2727 nearestExplorer.setAttribute(
2828 "aria-expanded",
2929 nearestExplorer.getAttribute("aria-expanded") === "true" ? "false" : "true",
3030 )
3131+3232+ if (!explorerCollapsed) {
3333+ // Stop <html> from being scrollable when mobile explorer is open
3434+ document.documentElement.classList.add("mobile-no-scroll")
3535+ } else {
3636+ document.documentElement.classList.remove("mobile-no-scroll")
3737+ }
3138}
32393340function toggleFolder(evt: MouseEvent) {
···270277 if (mobileExplorer.checkVisibility()) {
271278 explorer.classList.add("collapsed")
272279 explorer.setAttribute("aria-expanded", "false")
280280+281281+ // Allow <html> to be scrollable when mobile explorer is collapsed
282282+ document.documentElement.classList.remove("mobile-no-scroll")
273283 }
274284275285 mobileExplorer.classList.remove("hide-until-loaded")
286286+ }
287287+})
288288+289289+window.addEventListener("resize", function () {
290290+ // Desktop explorer opens by default, and it stays open when the window is resized
291291+ // to mobile screen size. Applies `no-scroll` to <html> in this edge case.
292292+ const explorer = document.querySelector(".explorer")
293293+ if (explorer && !explorer.classList.contains("collapsed")) {
294294+ document.documentElement.classList.add("mobile-no-scroll")
295295+ return
276296 }
277297})
278298
+3-17
quartz/components/styles/explorer.scss
···263263 }
264264}
265265266266-.no-scroll {
267267- opacity: 0;
268268- overflow: hidden;
269269-}
270270-271271-html:has(.no-scroll) {
272272- overflow: hidden;
273273-}
274274-275275-@media all and not ($mobile) {
276276- .no-scroll {
277277- opacity: 1 !important;
278278- overflow: auto !important;
279279- }
280280-281281- html:has(.no-scroll) {
282282- overflow: auto !important;
266266+.mobile-no-scroll {
267267+ @media all and ($mobile) {
268268+ overflow: hidden;
283269 }
284270}