From 99d9943e267041f2effa2833d29f63929c163b45 Mon Sep 17 00:00:00 2001 From: buttercat1791 Date: Fri, 12 Jul 2024 09:21:41 -0500 Subject: [PATCH] Handle in-article hash path navigation --- src/lib/Article.svelte | 79 ++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/src/lib/Article.svelte b/src/lib/Article.svelte index 55839f8..f0548d5 100644 --- a/src/lib/Article.svelte +++ b/src/lib/Article.svelte @@ -16,25 +16,41 @@ return events.filter((event) => event != null); } - const converter = new showdown.Converter(); + function normalizeHashPath(str: string): string { + return str + .toLowerCase() + .replace(/\s+/g, '-') + .replace(/[^\w-]/g, ''); + } - const transitionParams = { - x: -320, - duration: 200, - easing: sineIn - }; + function scrollToElementWithOffset() { + const hash = window.location.hash; + if (hash) { + const targetElement = document.querySelector(hash); + if (targetElement) { + const headerOffset = 80; + const elementPosition = targetElement.getBoundingClientRect().top; + const offsetPosition = elementPosition + window.scrollY - headerOffset; + + window.scrollTo({ + top: offsetPosition, + behavior: 'auto', + }); + } + } + } - let width: number; - let breakpoint: number = 768; // Tailwind md breakpoint - let drawerHidden: boolean = false; - $: width >= breakpoint - ? drawerHidden = false - : drawerHidden = true; onMount(() => { - width >= breakpoint - ? drawerHidden = false - : drawerHidden = true; + window.addEventListener('hashchange', scrollToElementWithOffset); + // Also handle the case where the user lands on the page with a hash in the URL + scrollToElementWithOffset(); + + return () => { + window.removeEventListener('hashchange', scrollToElementWithOffset); + }; }); + + const converter = new showdown.Converter(); {#await getEvents()} @@ -49,12 +65,12 @@ - + {#each events as event} {/each} @@ -63,7 +79,13 @@
{#each events as event}
- {event.getMatchingTags('title')[0][1]} + + {event.getMatchingTags('title')[0][1]} + {@html converter.makeHtml(event.content)}
{/each} @@ -71,24 +93,7 @@ {/await}