Adam Laycock
2025-11-27 87f7f4804ef4e3e2eba908109953724c5e411c87
quartz/components/scripts/spa.inline.ts
@@ -56,8 +56,10 @@
  }, 100)
}
let isNavigating = false
let p: DOMParser
async function navigate(url: URL, isBack: boolean = false) {
async function _navigate(url: URL, isBack: boolean = false) {
  isNavigating = true
  startLoading()
  p = p || new DOMParser()
  const contents = await fetchCanonical(url)
@@ -113,9 +115,9 @@
  }
  // now, patch head, re-executing scripts
  const elementsToRemove = document.head.querySelectorAll(":not([spa-preserve])")
  const elementsToRemove = document.head.querySelectorAll(":not([data-persist])")
  elementsToRemove.forEach((el) => el.remove())
  const elementsToAdd = html.head.querySelectorAll(":not([spa-preserve])")
  const elementsToAdd = html.head.querySelectorAll(":not([data-persist])")
  elementsToAdd.forEach((el) => document.head.appendChild(el))
  // delay setting the url until now
@@ -128,6 +130,19 @@
  delete announcer.dataset.persist
}
async function navigate(url: URL, isBack: boolean = false) {
  if (isNavigating) return
  isNavigating = true
  try {
    await _navigate(url, isBack)
  } catch (e) {
    console.error(e)
    window.location.assign(url)
  } finally {
    isNavigating = false
  }
}
window.spaNavigate = navigate
function createRouter() {
@@ -145,21 +160,13 @@
        return
      }
      try {
        navigate(url, false)
      } catch (e) {
        window.location.assign(url)
      }
      navigate(url, false)
    })
    window.addEventListener("popstate", (event) => {
      const { url } = getOpts(event) ?? {}
      if (window.location.hash && window.location.pathname === url?.pathname) return
      try {
        navigate(new URL(window.location.toString()), true)
      } catch (e) {
        window.location.reload()
      }
      navigate(new URL(window.location.toString()), true)
      return
    })
  }