|
1 | 1 | <script lang="ts"> |
2 | | - import { onMount } from 'svelte'; // ✨ Import Svelte onMount |
3 | 2 | import Tree from './Tree.svelte'; |
4 | 3 | import { createTableOfContents } from '@melt-ui/svelte'; |
5 | 4 | import { pushState } from '$app/navigation'; |
6 | 5 |
|
7 | | - let isMobileScreen = false; |
8 | | -
|
9 | | - onMount(() => { |
10 | | - isMobileScreen = window.innerWidth <= 1200; |
11 | | -
|
12 | | - const handleResize = () => { |
13 | | - isMobileScreen = window.innerWidth <= 1024; |
14 | | - }; |
15 | | - window.addEventListener('resize', handleResize); |
16 | | - return () => window.removeEventListener('resize', handleResize); // ✨ Clean up |
17 | | - }); |
| 6 | + let classes: string; |
| 7 | + export { classes as class }; |
| 8 | + export let selector = '#toc-contents'; |
18 | 9 |
|
19 | 10 | const { |
20 | 11 | elements: { item }, |
21 | 12 | states: { activeHeadingIdxs, headingsTree } |
22 | 13 | } = createTableOfContents({ |
23 | | - selector: '#toc-builder-preview', |
| 14 | + selector, |
24 | 15 | exclude: [], |
25 | 16 | activeType: 'highest', |
26 | 17 | pushStateFn: pushState, |
27 | 18 | headingFilterFn: (heading) => !heading.hasAttribute('data-toc-ignore'), |
28 | 19 |
|
29 | 20 | scrollFn: (id) => { |
30 | | - const container = document.getElementById('toc-builder-preview'); |
31 | 21 | const element = document.getElementById(id); |
32 | 22 |
|
33 | | - if (container && element) { |
34 | | - const containerTopOffset = container.offsetTop; |
35 | | - const elementTopOffset = element.offsetTop; |
36 | | -
|
37 | | - if (isMobileScreen) { |
38 | | - element.scrollIntoView({ |
39 | | - behavior: 'smooth', |
40 | | - block: 'start' |
41 | | - }); |
42 | | - } else { |
43 | | - container.scrollTo({ |
44 | | - top: elementTopOffset - containerTopOffset, |
45 | | - behavior: 'smooth' |
46 | | - }); |
47 | | - } |
48 | | - } |
| 23 | + if (!element) return; |
| 24 | + const prevScrollMargin = element.style.scrollMarginTop; |
| 25 | + element.style.scrollMarginTop = '16px'; |
| 26 | +
|
| 27 | + // trigger reflow |
| 28 | + getComputedStyle(element); |
| 29 | + element?.scrollIntoView({ |
| 30 | + behavior: 'smooth', |
| 31 | + block: 'start' |
| 32 | + }); |
| 33 | + element.style.scrollMarginTop = prevScrollMargin; |
49 | 34 | } |
50 | 35 | }); |
51 | 36 | </script> |
52 | 37 |
|
53 | | -<div> |
| 38 | +<div class="lg:overflow-y-auto rounded-lg text-white {classes}"> |
54 | 39 | <nav> |
55 | 40 | {#key $headingsTree} |
56 | 41 | <Tree tree={$headingsTree} activeHeadingIdxs={$activeHeadingIdxs} {item} /> |
|
0 commit comments