diff --git a/.changeset/itchy-icons-destroy.md b/.changeset/itchy-icons-destroy.md
new file mode 100644
index 00000000000..02ca92ba057
--- /dev/null
+++ b/.changeset/itchy-icons-destroy.md
@@ -0,0 +1,5 @@
+---
+"@clerk/astro": patch
+---
+
+Fix an issue where custom client-side routing breaks when `` is disabled
diff --git a/packages/astro/src/integration/create-integration.ts b/packages/astro/src/integration/create-integration.ts
index 4505b0d939d..3880d132c9e 100644
--- a/packages/astro/src/integration/create-integration.ts
+++ b/packages/astro/src/integration/create-integration.ts
@@ -110,9 +110,17 @@ function createIntegration()
`
${command === 'dev' ? `console.log("${packageName}","Initialize Clerk: page")` : ''}
import { runInjectionScript, swapDocument } from "${buildImportPath}";
- import { navigate, transitionEnabledOnThisPage } from "astro:transitions/client";
+
+ // Taken from https://github.com/withastro/astro/blob/e10b03e88c22592fbb42d7245b65c4f486ab736d/packages/astro/src/transitions/router.ts#L39.
+ // Importing it directly from astro:transitions/client breaks custom client-side routing
+ // even when View Transitions is disabled.
+ const transitionEnabledOnThisPage = () => {
+ return !!document.querySelector('[name="astro-view-transitions-enabled"]');
+ }
if (transitionEnabledOnThisPage()) {
+ const { navigate, swapFunctions } = await import('astro:transitions/client');
+
document.addEventListener('astro:before-swap', (e) => {
const clerkComponents = document.querySelector('#clerk-components');
// Keep the div element added by Clerk
@@ -121,7 +129,7 @@ function createIntegration()
e.newDocument.body.appendChild(clonedEl);
}
- e.swap = () => swapDocument(e.newDocument);
+ e.swap = () => swapDocument(swapFunctions, e.newDocument);
});
document.addEventListener('astro:page-load', async (e) => {
diff --git a/packages/astro/src/internal/swap-document.ts b/packages/astro/src/internal/swap-document.ts
index 0bf08713baa..d6cccafa6a0 100644
--- a/packages/astro/src/internal/swap-document.ts
+++ b/packages/astro/src/internal/swap-document.ts
@@ -1,9 +1,9 @@
-// eslint-disable-next-line import/no-unresolved
-import { swapFunctions } from 'astro:transitions/client';
-
const PERSIST_ATTR = 'data-astro-transition-persist';
const EMOTION_ATTR = 'data-emotion';
+// eslint-disable-next-line @typescript-eslint/consistent-type-imports
+type SwapFunctions = typeof import('astro:transitions/client').swapFunctions;
+
/**
* @internal
* Custom swap function to make mounting and styling
@@ -11,7 +11,7 @@ const EMOTION_ATTR = 'data-emotion';
*
* See https://docs.astro.build/en/guides/view-transitions/#building-a-custom-swap-function
*/
-export function swapDocument(doc: Document) {
+export function swapDocument(swapFunctions: SwapFunctions, doc: Document) {
swapFunctions.deselectScripts(doc);
swapFunctions.swapRootAttributes(doc);