|
1 | 1 | (() => { |
2 | 2 | const storageKey = 'sl-sidebar-state'; |
| 3 | + const desktopQuery = '(min-width: 50em)'; |
| 4 | + |
| 5 | + const isDesktopSidebar = () => matchMedia(desktopQuery).matches; |
3 | 6 |
|
4 | 7 | const shouldRestoreFromStorage = (sidebar) => { |
5 | 8 | const persistTarget = sidebar.querySelector('sl-sidebar-state-persist'); |
|
13 | 16 | } |
14 | 17 | }; |
15 | 18 |
|
16 | | - const scrollCurrentSidebarLinkIntoView = () => { |
| 19 | + const centerLinkInSidebar = () => { |
17 | 20 | const sidebar = document.getElementById('starlight__sidebar'); |
18 | | - if (!sidebar || shouldRestoreFromStorage(sidebar)) return; |
| 21 | + if (!sidebar || !isDesktopSidebar() || shouldRestoreFromStorage(sidebar)) return true; |
19 | 22 |
|
20 | 23 | const activeLink = sidebar.querySelector("a[aria-current='page']"); |
21 | | - if (!activeLink) return; |
| 24 | + if (!activeLink) return false; |
22 | 25 |
|
23 | 26 | const sidebarRect = sidebar.getBoundingClientRect(); |
24 | 27 | const linkRect = activeLink.getBoundingClientRect(); |
25 | 28 | const linkOffset = linkRect.top - sidebarRect.top + sidebar.scrollTop; |
26 | 29 | const targetTop = Math.max(linkOffset - sidebar.clientHeight / 2 + linkRect.height / 2, 0); |
27 | 30 |
|
28 | 31 | sidebar.scrollTo({ top: targetTop, behavior: 'auto' }); |
| 32 | + return true; |
| 33 | + }; |
| 34 | + |
| 35 | + const scheduleScroll = () => { |
| 36 | + if (document.readyState === 'complete' || document.readyState === 'interactive') { |
| 37 | + requestAnimationFrame(() => { |
| 38 | + if (!centerLinkInSidebar()) { |
| 39 | + const sidebar = document.getElementById('starlight__sidebar') || document.body; |
| 40 | + const observer = new MutationObserver(() => { |
| 41 | + if (centerLinkInSidebar()) observer.disconnect(); |
| 42 | + }); |
| 43 | + observer.observe(sidebar, { childList: true, subtree: true }); |
| 44 | + } |
| 45 | + }); |
| 46 | + } else { |
| 47 | + window.addEventListener('DOMContentLoaded', scheduleScroll, { once: true }); |
| 48 | + } |
29 | 49 | }; |
30 | 50 |
|
31 | | - if (document.readyState === 'complete' || document.readyState === 'interactive') { |
32 | | - scrollCurrentSidebarLinkIntoView(); |
33 | | - } else { |
34 | | - window.addEventListener('DOMContentLoaded', scrollCurrentSidebarLinkIntoView, { once: true }); |
35 | | - } |
| 51 | + scheduleScroll(); |
36 | 52 | })(); |
0 commit comments