@@ -78,10 +78,6 @@ window.customElements.define('mdbook-sidebar-scrollbox', MDBookSidebarScrollbox)
7878// ---------------------------------------------------------------------------
7979// Support for dynamically adding headers to the sidebar.
8080
81- // This is a debugging tool for the threshold which you can enable in the console.
82- // eslint-disable-next-line prefer-const
83- let mdbookThresholdDebug = false;
84-
8581(function() {
8682 // This is used to detect which direction the page has scrolled since the
8783 // last scroll event.
@@ -108,47 +104,27 @@ let mdbookThresholdDebug = false;
108104 // I'm not sure why eslint seems to have a false positive here.
109105 // eslint-disable-next-line prefer-const
110106 let headerToggles = [];
111-
112- function drawDebugLine() {
113- if (!document.body) {
114- return;
115- }
116- const id = 'mdbook-threshold-debug-line';
117- const existingLine = document.getElementById(id);
118- if (existingLine) {
119- existingLine.remove();
120- }
121- const line = document.createElement('div');
122- line.id = id;
123- line.style.cssText = `
124- position : fixed;
125- top : ${threshold}px;
126- left : 0;
127- width : 100vw;
128- height : 2px;
129- background-color : red;
130- z-index : 9999;
131- pointer-events : none;
132- ` ;
133- document.body.appendChild(line);
134- }
107+ // This is a debugging tool for the threshold which you can enable in the console.
108+ let thresholdDebug = false;
135109
136110 // Updates the threshold based on the scroll position.
137111 function updateThreshold() {
138112 const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
139113 const windowHeight = window.innerHeight;
140114 const documentHeight = document.documentElement.scrollHeight;
115+
141116 // The number of pixels below the viewport, at most documentHeight.
142117 // This is used to push the threshold down to the bottom of the page
143118 // as the user scrolls towards the bottom.
144119 const pixelsBelow = Math.max(0, documentHeight - (scrollTop + windowHeight));
145- // The number of pixels above the viewport, at most defaultDownThreshold.
120+ // The number of pixels above the viewport, at least defaultDownThreshold.
146121 // Similar to pixelsBelow, this is used to push the threshold back towards
147122 // the top when reaching the top of the page.
148123 const pixelsAbove = Math.max(0, defaultDownThreshold - scrollTop);
149124 // How much the threshold should be offset once it gets close to the
150125 // bottom of the page.
151- let bottomAdd = Math.max(0, windowHeight - pixelsBelow - defaultDownThreshold);
126+ const bottomAdd = Math.max(0, windowHeight - pixelsBelow - defaultDownThreshold);
127+ let adjustedBottomAdd = bottomAdd;
152128
153129 // Adjusts bottomAdd for a small document. The calculation above
154130 // assumes the document is at least twice the windowheight in size. If
@@ -158,7 +134,7 @@ let mdbookThresholdDebug = false;
158134 const maxPixelsBelow = documentHeight - windowHeight;
159135 const t = 1 - pixelsBelow / maxPixelsBelow;
160136 const clamp = Math.max(0, Math.min(1, t));
161- bottomAdd *= clamp;
137+ adjustedBottomAdd *= clamp;
162138 }
163139
164140 let scrollingDown = true;
@@ -169,10 +145,10 @@ let mdbookThresholdDebug = false;
169145 if (scrollingDown) {
170146 // When scrolling down, move the threshold up towards the default
171147 // downwards threshold position. If near the bottom of the page,
172- // bottomAdd will offset the threshold towards the bottom of the
173- // page.
148+ // adjustedBottomAdd will offset the threshold towards the bottom
149+ // of the page.
174150 const amountScrolledDown = scrollTop - lastKnownScrollPosition;
175- const adjustedDefault = defaultDownThreshold + bottomAdd ;
151+ const adjustedDefault = defaultDownThreshold + adjustedBottomAdd ;
176152 threshold = Math.max(adjustedDefault, threshold - amountScrolledDown);
177153 } else {
178154 // When scrolling up, move the threshold down towards the default
@@ -181,12 +157,81 @@ let mdbookThresholdDebug = false;
181157 // belongs.
182158 const amountScrolledUp = lastKnownScrollPosition - scrollTop;
183159 const adjustedDefault = defaultUpThreshold - pixelsAbove
184- + Math.max(0, bottomAdd - defaultDownThreshold);
160+ + Math.max(0, adjustedBottomAdd - defaultDownThreshold);
185161 threshold = Math.min(adjustedDefault, threshold + amountScrolledUp);
186162 }
163+
164+ if (documentHeight <= windowHeight) {
165+ threshold = 0;
166+ }
167+
168+ if (thresholdDebug) {
169+ const id = 'mdbook-threshold-debug-data';
170+ let data = document.getElementById(id);
171+ if (data === null) {
172+ data = document.createElement('div');
173+ data.id = id;
174+ data.style.cssText = `
175+ position : fixed;
176+ top : 50px;
177+ right : 10px;
178+ background-color : 0xeeeeee;
179+ z-index : 9999;
180+ pointer-events : none;
181+ ` ;
182+ document.body.appendChild(data);
183+ }
184+ data.innerHTML = `
185+ <table>
186+ <tr><td>documentHeight</td><td>${documentHeight.toFixed(1)}</td></tr>
187+ <tr><td>windowHeight</td><td>${windowHeight.toFixed(1)}</td></tr>
188+ <tr><td>scrollTop</td><td>${scrollTop.toFixed(1)}</td></tr>
189+ <tr><td>pixelsAbove</td><td>${pixelsAbove.toFixed(1)}</td></tr>
190+ <tr><td>pixelsBelow</td><td>${pixelsBelow.toFixed(1)}</td></tr>
191+ <tr><td>bottomAdd</td><td>${bottomAdd.toFixed(1)}</td></tr>
192+ <tr><td>adjustedBottomAdd</td><td>${adjustedBottomAdd.toFixed(1)}</td></tr>
193+ <tr><td>scrollingDown</td><td>${scrollingDown}</td></tr>
194+ <tr><td>threshold</td><td>${threshold.toFixed(1)}</td></tr>
195+ </table>
196+ ` ;
197+ drawDebugLine();
198+ }
199+
187200 lastKnownScrollPosition = scrollTop;
188201 }
189202
203+ function drawDebugLine() {
204+ if (!document.body) {
205+ return;
206+ }
207+ const id = 'mdbook-threshold-debug-line';
208+ const existingLine = document.getElementById(id);
209+ if (existingLine) {
210+ existingLine.remove();
211+ }
212+ const line = document.createElement('div');
213+ line.id = id;
214+ line.style.cssText = `
215+ position : fixed;
216+ top : ${threshold}px;
217+ left : 0;
218+ width : 100vw;
219+ height : 2px;
220+ background-color : red;
221+ z-index : 9999;
222+ pointer-events : none;
223+ ` ;
224+ document.body.appendChild(line);
225+ }
226+
227+ function mdbookEnableThresholdDebug() {
228+ thresholdDebug = true;
229+ updateThreshold();
230+ drawDebugLine();
231+ }
232+
233+ window.mdbookEnableThresholdDebug = mdbookEnableThresholdDebug;
234+
190235 // Updates which headers in the sidebar should be expanded. If the current
191236 // header is inside a collapsed group, then it, and all its parents should
192237 // be expanded.
@@ -210,9 +255,6 @@ let mdbookThresholdDebug = false;
210255 // This is done with a virtual Y threshold, where headers at or below
211256 // that line will be considered the current one.
212257 function updateCurrentHeader() {
213- if (mdbookThresholdDebug) {
214- drawDebugLine();
215- }
216258 if (!headers || !headers.length) {
217259 return;
218260 }
0 commit comments