From c538c151c7462ad0395ff2c15c5e11e89e362aa8 Mon Sep 17 00:00:00 2001
From: Striven <sg.striven@cutecat.club>
Date: Sat, 04 Apr 2026 19:47:16 +0000
Subject: [PATCH] Initial commit
---
quartz/components/scripts/spa.inline.ts | 35 +++++++++++++++++++++--------------
1 files changed, 21 insertions(+), 14 deletions(-)
diff --git a/quartz/components/scripts/spa.inline.ts b/quartz/components/scripts/spa.inline.ts
index 77900a6..465e793 100644
--- a/quartz/components/scripts/spa.inline.ts
+++ b/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)
@@ -100,7 +102,7 @@
html.body.appendChild(announcer)
// morph body
- micromorph(document.body, html.body)
+ await micromorph(document.body, html.body)
// scroll into place and add history
if (!isBack) {
@@ -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
})
}
--
Gitblit v1.10.0