@@ -520,6 +520,8 @@ const state = {
520520
521521const els = {
522522 body : document . body ,
523+ topbar : document . querySelector ( ".topbar" ) ,
524+ sidebar : document . querySelector ( ".sidebar" ) ,
523525 brandLine : document . querySelector ( "#brand-line" ) ,
524526 plannerModeLabel : document . querySelector ( "#planner-mode-label" ) ,
525527 scheduleModeLabel : document . querySelector ( "#schedule-mode-label" ) ,
@@ -842,6 +844,8 @@ function setLanguageChrome(lang) {
842844 button . classList . toggle ( "is-active" , isActive ) ;
843845 button . setAttribute ( "aria-pressed" , String ( isActive ) ) ;
844846 } ) ;
847+
848+ updateFixedChromeMetrics ( ) ;
845849}
846850
847851function setMode ( mode , shouldUpdateUrl = true ) {
@@ -863,6 +867,23 @@ function setMode(mode, shouldUpdateUrl = true) {
863867 if ( shouldUpdateUrl ) updateUrl ( ) ;
864868 updateReadingProgress ( ) ;
865869 window . lucide ?. createIcons ( ) ;
870+ updateFixedChromeMetrics ( ) ;
871+ }
872+
873+ function updateFixedChromeMetrics ( ) {
874+ window . requestAnimationFrame ( ( ) => {
875+ const topbarHeight = Math . ceil ( els . topbar ?. getBoundingClientRect ( ) . height || 0 ) ;
876+ const sidebarHeight = window . matchMedia ( "(max-width: 920px)" ) . matches
877+ ? Math . ceil ( els . sidebar ?. getBoundingClientRect ( ) . height || 0 )
878+ : 0 ;
879+
880+ if ( topbarHeight > 0 ) {
881+ document . documentElement . style . setProperty ( "--topbar-offset" , `${ topbarHeight } px` ) ;
882+ }
883+ if ( sidebarHeight > 0 ) {
884+ document . documentElement . style . setProperty ( "--sidebar-offset" , `${ sidebarHeight } px` ) ;
885+ }
886+ } ) ;
866887}
867888
868889function updateUrl ( ) {
@@ -1747,7 +1768,16 @@ els.resetMatrix.addEventListener("click", resetMatrixProgress);
17471768els . search . addEventListener ( "input" , renderToc ) ;
17481769els . top . addEventListener ( "click" , ( ) => window . scrollTo ( { top : 0 , behavior : "smooth" } ) ) ;
17491770window . addEventListener ( "scroll" , updateReadingProgress , { passive : true } ) ;
1750- window . addEventListener ( "resize" , updateReadingProgress ) ;
1771+ window . addEventListener ( "resize" , ( ) => {
1772+ updateFixedChromeMetrics ( ) ;
1773+ updateReadingProgress ( ) ;
1774+ } ) ;
1775+ window . visualViewport ?. addEventListener ( "resize" , updateFixedChromeMetrics ) ;
1776+
1777+ if ( window . ResizeObserver ) {
1778+ const fixedChromeObserver = new ResizeObserver ( updateFixedChromeMetrics ) ;
1779+ [ els . topbar , els . sidebar ] . filter ( Boolean ) . forEach ( ( node ) => fixedChromeObserver . observe ( node ) ) ;
1780+ }
17511781
17521782state . lang = preferredLanguage ( ) ;
17531783state . mode = preferredMode ( ) ;
0 commit comments