From 74f2d92c69f14c07e41742cf3bd8bcbf44317f40 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 21 Jan 2025 14:50:23 +0800 Subject: [PATCH 1/3] fix --- packages/kit/src/runtime/client/utils.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 28a06d862489..3e121a75e47a 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -130,6 +130,12 @@ export function get_link_info(a, base, uses_hash_router) { try { url = new URL(a instanceof SVGAElement ? a.href.baseVal : a.href, document.baseURI); + + // if the hash doesn't start with `#/` then it's probably linking to an id on the current page + if (uses_hash_router && url.hash.match(/^#[^/]/)) { + const route = location.hash.split('#')[1] || '/'; + url.hash = `#${route}${url.hash}`; + } } catch {} const target = a instanceof SVGAElement ? a.target.baseVal : a.target; From 0bdc243db26edcbfde21e46f5856f97303ba6363 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 21 Jan 2025 14:50:25 +0800 Subject: [PATCH 2/3] test --- .../hash-based-routing/src/routes/anchor/+page.svelte | 3 +++ packages/kit/test/apps/hash-based-routing/test/test.js | 9 +++++++++ 2 files changed, 12 insertions(+) create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte new file mode 100644 index 000000000000..3be87857c826 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte @@ -0,0 +1,3 @@ +go to #test + +

#test

diff --git a/packages/kit/test/apps/hash-based-routing/test/test.js b/packages/kit/test/apps/hash-based-routing/test/test.js index 23666ed5e562..d7962d380ea4 100644 --- a/packages/kit/test/apps/hash-based-routing/test/test.js +++ b/packages/kit/test/apps/hash-based-routing/test/test.js @@ -89,4 +89,13 @@ test.describe('hash based navigation', () => { url = new URL(page.url()); expect(url.hash).toBe('#/reroute-b'); }); + + test('relative anchor works', async ({ page }) => { + await page.goto('/#/anchor'); + + await page.locator('a[href="#test"]').click(); + await expect(page.locator('#test')).toHaveText('#test'); + const url = new URL(page.url()); + expect(url.hash).toBe('#/anchor#test'); + }); }); From 0706244f2df387176b1e65d79a8e4e8be88e1d77 Mon Sep 17 00:00:00 2001 From: Chew Tee Ming Date: Tue, 21 Jan 2025 14:52:23 +0800 Subject: [PATCH 3/3] changeset --- .changeset/forty-houses-collect.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/forty-houses-collect.md diff --git a/.changeset/forty-houses-collect.md b/.changeset/forty-houses-collect.md new file mode 100644 index 000000000000..6a48772b3742 --- /dev/null +++ b/.changeset/forty-houses-collect.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly handle relative anchors when using the hash router