summaryrefslogtreecommitdiff
path: root/src/components/jet/action/ShelfBasedPageScrollAction.svelte
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/jet/action/ShelfBasedPageScrollAction.svelte')
-rw-r--r--src/components/jet/action/ShelfBasedPageScrollAction.svelte51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/components/jet/action/ShelfBasedPageScrollAction.svelte b/src/components/jet/action/ShelfBasedPageScrollAction.svelte
new file mode 100644
index 0000000..9c1c13e
--- /dev/null
+++ b/src/components/jet/action/ShelfBasedPageScrollAction.svelte
@@ -0,0 +1,51 @@
+<script lang="ts" context="module">
+ import type {
+ Action,
+ ShelfBasedPageScrollAction,
+ } from '@jet-app/app-store/api/models';
+
+ export function isShelfBasedPageScrollAction(
+ action: Action,
+ ): action is ShelfBasedPageScrollAction {
+ return (
+ action.$kind === 'ShelfBasedPageScrollAction' && 'shelfId' in action
+ );
+ }
+</script>
+
+<script lang="ts">
+ import type { HTMLAnchorAttributes } from 'svelte/elements';
+
+ interface $$Props extends HTMLAnchorAttributes {
+ destination: ShelfBasedPageScrollAction;
+ }
+
+ export let destination: ShelfBasedPageScrollAction;
+
+ function handleLinkClick(e: Event) {
+ const anchorElement = e.currentTarget as HTMLAnchorElement;
+ const hash = anchorElement.hash;
+ const elementToScrollTo = document.querySelector(hash);
+ if (!elementToScrollTo) {
+ return;
+ }
+ elementToScrollTo.scrollIntoView({
+ behavior: 'smooth',
+ block: 'start',
+ });
+ history.replaceState(null, '', hash);
+ }
+</script>
+
+{#if destination.shelfId}
+ <a
+ {...$$restProps}
+ data-test-id="scroll-link"
+ href={`#${destination.shelfId}`}
+ on:click|preventDefault|stopPropagation={handleLinkClick}
+ >
+ <slot />
+ </a>
+{:else}
+ <slot />
+{/if}