Skip to content

Commit 1a1f7e6

Browse files
committed
scroll state
1 parent 34a6f60 commit 1a1f7e6

File tree

1 file changed

+24
-8
lines changed

1 file changed

+24
-8
lines changed

public/sidebar-scroll.js

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
(() => {
22
const storageKey = 'sl-sidebar-state';
3+
const desktopQuery = '(min-width: 50em)';
4+
5+
const isDesktopSidebar = () => matchMedia(desktopQuery).matches;
36

47
const shouldRestoreFromStorage = (sidebar) => {
58
const persistTarget = sidebar.querySelector('sl-sidebar-state-persist');
@@ -13,24 +16,37 @@
1316
}
1417
};
1518

16-
const scrollCurrentSidebarLinkIntoView = () => {
19+
const centerLinkInSidebar = () => {
1720
const sidebar = document.getElementById('starlight__sidebar');
18-
if (!sidebar || shouldRestoreFromStorage(sidebar)) return;
21+
if (!sidebar || !isDesktopSidebar() || shouldRestoreFromStorage(sidebar)) return true;
1922

2023
const activeLink = sidebar.querySelector("a[aria-current='page']");
21-
if (!activeLink) return;
24+
if (!activeLink) return false;
2225

2326
const sidebarRect = sidebar.getBoundingClientRect();
2427
const linkRect = activeLink.getBoundingClientRect();
2528
const linkOffset = linkRect.top - sidebarRect.top + sidebar.scrollTop;
2629
const targetTop = Math.max(linkOffset - sidebar.clientHeight / 2 + linkRect.height / 2, 0);
2730

2831
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+
}
2949
};
3050

31-
if (document.readyState === 'complete' || document.readyState === 'interactive') {
32-
scrollCurrentSidebarLinkIntoView();
33-
} else {
34-
window.addEventListener('DOMContentLoaded', scrollCurrentSidebarLinkIntoView, { once: true });
35-
}
51+
scheduleScroll();
3652
})();

0 commit comments

Comments
 (0)