From ec47b42d3040a89c89ed41997888ea5fcfa952ee Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 7 May 2026 00:09:33 +0100 Subject: [PATCH] docs: preserve docs sidebar scroll --- scripts/build-docs-site.mjs | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/scripts/build-docs-site.mjs b/scripts/build-docs-site.mjs index 8130a4e..c5cd5dd 100644 --- a/scripts/build-docs-site.mjs +++ b/scripts/build-docs-site.mjs @@ -505,6 +505,26 @@ const sidebar=document.querySelector('.sidebar'); const toggle=document.querySelector('.nav-toggle'); const mobileNav=window.matchMedia('(max-width: 900px)'); const sidebarFocusable='a[href],button,input,select,textarea,[tabindex]'; +const sidebarScrollKey='crabbox.docs.sidebar.scrollTop'; +let sidebarScrollSaveTimer=0; +function readSidebarScroll(){ + try{ + const raw=sessionStorage.getItem(sidebarScrollKey); + const value=raw===null?NaN:Number(raw); + return Number.isFinite(value)?Math.max(0,value):0; + }catch{ + return 0; + } +} +function saveSidebarScroll(){ + if(!sidebar)return; + try{sessionStorage.setItem(sidebarScrollKey,String(Math.round(sidebar.scrollTop)))}catch{} +} +function scheduleSidebarScrollSave(){ + if(sidebarScrollSaveTimer)return; + sidebarScrollSaveTimer=window.setTimeout(()=>{sidebarScrollSaveTimer=0;saveSidebarScroll()},120); +} +if(sidebar)sidebar.scrollTop=readSidebarScroll(); function setSidebarFocusable(enabled){ sidebar?.querySelectorAll(sidebarFocusable).forEach((el)=>{ if(enabled){ @@ -535,6 +555,12 @@ function setSidebarOpen(open){ } } setSidebarOpen(false); +sidebar?.addEventListener('scroll',scheduleSidebarScrollSave,{passive:true}); +sidebar?.addEventListener('click',(e)=>{ + const link=e.target.closest?.('a[href]'); + if(link)saveSidebarScroll(); +}); +window.addEventListener('pagehide',saveSidebarScroll); toggle?.addEventListener('click',()=>setSidebarOpen(!sidebar?.classList.contains('open'))); document.addEventListener('click',(e)=>{if(!sidebar?.classList.contains('open'))return;if(sidebar.contains(e.target)||toggle?.contains(e.target))return;setSidebarOpen(false)}); document.addEventListener('keydown',(e)=>{if(e.key==='Escape')setSidebarOpen(false)});