Stephen Tse
2025-04-26 2acdec323fe37c4d3675ada7d14832fe9d90954b
fix(explorer): Prevent html from being scrollable when mobile explorer is open (#1895)

* Fixed html page being scrollable when mobile explorer is open

* Prettier code

* Addressed comment
2 files modified
40 ■■■■■ changed files
quartz/components/scripts/explorer.inline.ts 22 ●●●●● patch | view | raw | blame | history
quartz/components/styles/explorer.scss 18 ●●●● patch | view | raw | blame | history
quartz/components/scripts/explorer.inline.ts
@@ -23,11 +23,18 @@
function toggleExplorer(this: HTMLElement) {
  const nearestExplorer = this.closest(".explorer") as HTMLElement
  if (!nearestExplorer) return
  nearestExplorer.classList.toggle("collapsed")
  const explorerCollapsed = nearestExplorer.classList.toggle("collapsed")
  nearestExplorer.setAttribute(
    "aria-expanded",
    nearestExplorer.getAttribute("aria-expanded") === "true" ? "false" : "true",
  )
  if (!explorerCollapsed) {
    // Stop <html> from being scrollable when mobile explorer is open
    document.documentElement.classList.add("mobile-no-scroll")
  } else {
    document.documentElement.classList.remove("mobile-no-scroll")
  }
}
function toggleFolder(evt: MouseEvent) {
@@ -270,12 +277,25 @@
    if (mobileExplorer.checkVisibility()) {
      explorer.classList.add("collapsed")
      explorer.setAttribute("aria-expanded", "false")
      // Allow <html> to be scrollable when mobile explorer is collapsed
      document.documentElement.classList.remove("mobile-no-scroll")
    }
    mobileExplorer.classList.remove("hide-until-loaded")
  }
})
window.addEventListener("resize", function () {
  // Desktop explorer opens by default, and it stays open when the window is resized
  // to mobile screen size. Applies `no-scroll` to <html> in this edge case.
  const explorer = document.querySelector(".explorer")
  if (explorer && !explorer.classList.contains("collapsed")) {
    document.documentElement.classList.add("mobile-no-scroll")
    return
  }
})
function setFolderState(folderElement: HTMLElement, collapsed: boolean) {
  return collapsed ? folderElement.classList.remove("open") : folderElement.classList.add("open")
}
quartz/components/styles/explorer.scss
@@ -263,22 +263,8 @@
  }
}
.no-scroll {
  opacity: 0;
.mobile-no-scroll {
  @media all and ($mobile) {
  overflow: hidden;
}
html:has(.no-scroll) {
  overflow: hidden;
}
@media all and not ($mobile) {
  .no-scroll {
    opacity: 1 !important;
    overflow: auto !important;
  }
  html:has(.no-scroll) {
    overflow: auto !important;
  }
}