Skip to content

Commit 4095fbd

Browse files
committed
rustdoc: allow resizing the sidebar
1 parent feb0673 commit 4095fbd

File tree

7 files changed

+204
-10
lines changed

7 files changed

+204
-10
lines changed

src/librustdoc/html/static/css/rustdoc.css

+58-3
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ img {
383383

384384
.sidebar {
385385
font-size: 0.875rem;
386-
flex: 0 0 200px;
386+
flex: 0 0 var(--desktop-sidebar-width, 200px);
387387
overflow-y: scroll;
388388
overscroll-behavior: contain;
389389
position: sticky;
@@ -401,6 +401,56 @@ img {
401401
z-index: 1;
402402
}
403403

404+
.hide-sidebar .sidebar,
405+
.hide-sidebar .sidebar-resizer {
406+
display: none;
407+
}
408+
409+
.sidebar-resizer {
410+
width: 3px;
411+
margin: 0 3px;
412+
cursor: col-resize;
413+
z-index: 10;
414+
position: absolute;
415+
height: 100%;
416+
left: var(--desktop-sidebar-width, 200px);
417+
}
418+
419+
.rustdoc.src .sidebar-resizer {
420+
left: 50px;
421+
width: 6px;
422+
margin: 0 3px 0 0;
423+
}
424+
425+
.src-sidebar-expanded .rustdoc.src .sidebar-resizer {
426+
left: var(--src-sidebar-width, 300px);
427+
}
428+
429+
.sidebar-resizing {
430+
-moz-user-select: none;
431+
-webkit-user-select: none;
432+
-ms-user-select: none;
433+
user-select: none;
434+
}
435+
436+
.sidebar-resizing * {
437+
cursor: col-resize !important;
438+
}
439+
440+
.sidebar-resizer:hover,
441+
.sidebar-resizer:active,
442+
.sidebar-resizer:focus {
443+
width: 9px;
444+
margin: 0;
445+
}
446+
447+
.sidebar-resizer.active {
448+
/* when dragging the sidebar into nothing, make sure the items inside
449+
don't get hovered over */
450+
width: 141px;
451+
margin: 0 -66px;
452+
}
453+
404454
.sidebar, .mobile-topbar, .sidebar-menu-toggle,
405455
#src-sidebar-toggle, #src-sidebar {
406456
background-color: var(--sidebar-background-color);
@@ -416,7 +466,7 @@ img {
416466

417467
.src-sidebar-expanded .src .sidebar {
418468
overflow-y: auto;
419-
flex-basis: 300px;
469+
flex-basis: var(--src-sidebar-width, 300px);
420470
}
421471

422472
.src-sidebar-expanded .src .sidebar > *:not(#src-sidebar-toggle) {
@@ -1615,7 +1665,8 @@ in src-script.js
16151665
/* Hide the logo and item name from the sidebar. Those are displayed
16161666
in the mobile-topbar instead. */
16171667
.sidebar .logo-container,
1618-
.sidebar .location {
1668+
.sidebar .location,
1669+
.sidebar-resizer {
16191670
display: none;
16201671
}
16211672

@@ -1692,6 +1743,10 @@ in src-script.js
16921743
color: var(--main-color);
16931744
}
16941745

1746+
.hide-sidebar .sidebar-menu-toggle {
1747+
display: none;
1748+
}
1749+
16951750
.sidebar-elems {
16961751
margin-top: 1em;
16971752
}

src/librustdoc/html/static/js/main.js

+66-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Local js definitions:
2-
/* global addClass, getSettingValue, hasClass, searchState */
2+
/* global addClass, getSettingValue, hasClass, searchState, updateLocalStorage */
33
/* global onEach, onEachLazy, removeClass, getVar */
44

55
"use strict";
@@ -1230,6 +1230,71 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/how-to-read-rustdoc.html\
12301230
searchState.setup();
12311231
}());
12321232

1233+
(function() {
1234+
const resizer = document.getElementsByClassName("sidebar-resizer")[0];
1235+
const sidebar = document.getElementsByClassName("sidebar")[0];
1236+
if (!resizer || !sidebar) {
1237+
return;
1238+
}
1239+
const isSrcPage = hasClass(document.body, "src");
1240+
const hideSidebar = () => {
1241+
if (isSrcPage) {
1242+
window.rustdocCloseSourceSidebar();
1243+
} else {
1244+
addClass(document.documentElement, "hide-sidebar");
1245+
updateLocalStorage("hide-sidebar", "true");
1246+
}
1247+
};
1248+
const showSidebar = () => {
1249+
if (isSrcPage) {
1250+
window.rustdocShowSourceSidebar();
1251+
} else {
1252+
removeClass(document.documentElement, "hide-sidebar");
1253+
updateLocalStorage("hide-sidebar", "false");
1254+
}
1255+
};
1256+
const changeSidebarSize = size => {
1257+
if (isSrcPage) {
1258+
updateLocalStorage("src-sidebar-width", size);
1259+
document.documentElement.style.setProperty("--src-sidebar-width", size + "px");
1260+
} else {
1261+
updateLocalStorage("desktop-sidebar-width", size);
1262+
document.documentElement.style.setProperty("--desktop-sidebar-width", size + "px");
1263+
}
1264+
};
1265+
const isSidebarHidden = () => {
1266+
return isSrcPage ?
1267+
!hasClass(document.documentElement, "src-sidebar-expanded") :
1268+
hasClass(document.documentElement, "hide-sidebar");
1269+
};
1270+
const resize = e => {
1271+
const pos = e.clientX - sidebar.offsetLeft - 3;
1272+
if (pos < 50) {
1273+
hideSidebar();
1274+
} else if (pos >= 100) {
1275+
// 100 is the size of the logo
1276+
// don't let it get smaller, or it'll get squished
1277+
if (isSidebarHidden()) {
1278+
showSidebar();
1279+
}
1280+
changeSidebarSize(Math.min(pos, window.innerWidth - 100));
1281+
}
1282+
};
1283+
const stopResize = () => {
1284+
removeClass(resizer, "active");
1285+
window.removeEventListener("mousemove", resize, false);
1286+
window.removeEventListener("mouseup", stopResize, false);
1287+
removeClass(document.documentElement, "sidebar-resizing");
1288+
};
1289+
const initResize = () => {
1290+
window.addEventListener("mousemove", resize, false);
1291+
window.addEventListener("mouseup", stopResize, false);
1292+
addClass(resizer, "active");
1293+
addClass(document.documentElement, "sidebar-resizing");
1294+
};
1295+
resizer.addEventListener("mousedown", initResize, false);
1296+
}());
1297+
12331298
(function() {
12341299
let reset_button_timeout = null;
12351300

src/librustdoc/html/static/js/settings.js

+19
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,13 @@
2929
window.rustdoc_remove_line_numbers_from_examples();
3030
}
3131
break;
32+
case "hide-sidebar":
33+
if (value === true) {
34+
addClass(document.documentElement, "hide-sidebar");
35+
} else {
36+
removeClass(document.documentElement, "hide-sidebar");
37+
}
38+
break;
3239
}
3340
}
3441

@@ -186,6 +193,11 @@
186193
"js_name": "line-numbers",
187194
"default": false,
188195
},
196+
{
197+
"name": "Hide navigation sidebar",
198+
"js_name": "hide-sidebar",
199+
"default": false,
200+
},
189201
{
190202
"name": "Disable keyboard shortcuts",
191203
"js_name": "disable-shortcuts",
@@ -216,6 +228,13 @@
216228

217229
function displaySettings() {
218230
settingsMenu.style.display = "";
231+
onEachLazy(settingsMenu.querySelectorAll("input[type='checkbox']"), el => {
232+
const val = getSettingValue(el.id);
233+
const checked = val === "true";
234+
if (checked !== el.checked && val !== null) {
235+
el.checked = checked;
236+
}
237+
});
219238
}
220239

221240
function settingsBlurHandler(event) {

src/librustdoc/html/static/js/src-script.js

+16-6
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,26 @@ function createDirEntry(elem, parent, fullPath, hasFoundFile) {
7171
return hasFoundFile;
7272
}
7373

74+
window.rustdocCloseSourceSidebar = () => {
75+
const toggleLabel = document.querySelector("#src-sidebar-toggle button");
76+
removeClass(document.documentElement, "src-sidebar-expanded");
77+
toggleLabel.innerText = ">";
78+
updateLocalStorage("source-sidebar-show", "false");
79+
};
80+
81+
window.rustdocShowSourceSidebar = () => {
82+
const toggleLabel = document.querySelector("#src-sidebar-toggle button");
83+
addClass(document.documentElement, "src-sidebar-expanded");
84+
toggleLabel.innerText = "<";
85+
updateLocalStorage("source-sidebar-show", "true");
86+
};
87+
7488
function toggleSidebar() {
7589
const child = this.parentNode.children[0];
7690
if (child.innerText === ">") {
77-
addClass(document.documentElement, "src-sidebar-expanded");
78-
child.innerText = "<";
79-
updateLocalStorage("source-sidebar-show", "true");
91+
window.rustdocShowSourceSidebar();
8092
} else {
81-
removeClass(document.documentElement, "src-sidebar-expanded");
82-
child.innerText = ">";
83-
updateLocalStorage("source-sidebar-show", "false");
93+
window.rustdocCloseSourceSidebar();
8494
}
8595
}
8696

src/librustdoc/html/static/js/storage.js

+23
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,29 @@ if (getSettingValue("source-sidebar-show") === "true") {
188188
addClass(document.documentElement, "src-sidebar-expanded");
189189
}
190190

191+
if (getSettingValue("hide-sidebar") === "true") {
192+
// At this point in page load, `document.body` is not available yet.
193+
// Set a class on the `<html>` element instead.
194+
addClass(document.documentElement, "hide-sidebar");
195+
}
196+
197+
(function() {
198+
const desktopSidebarWidth = getSettingValue("desktop-sidebar-width");
199+
if (desktopSidebarWidth) {
200+
document.documentElement.style.setProperty(
201+
"--desktop-sidebar-width",
202+
desktopSidebarWidth + "px"
203+
);
204+
}
205+
const srcSidebarWidth = getSettingValue("src-sidebar-width");
206+
if (srcSidebarWidth) {
207+
document.documentElement.style.setProperty(
208+
"--src-sidebar-width",
209+
srcSidebarWidth + "px"
210+
);
211+
}
212+
}());
213+
191214
// If we navigate away (for example to a settings page), and then use the back or
192215
// forward button to get back to a page, the theme may have changed in the meantime.
193216
// But scripts may not be re-loaded in such a case due to the bfcache

src/librustdoc/html/templates/page.html

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ <h2></h2> {# #}
110110
{% endif %}
111111
{{ sidebar|safe }}
112112
</nav> {# #}
113+
<div class="sidebar-resizer"></div>
113114
<main> {# #}
114115
{% if page.css_class != "src" %}<div class="width-limiter">{% endif %}
115116
<nav class="sub"> {# #}

tests/rustdoc-gui/sidebar-resize.goml

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Checks sidebar resizing
2+
go-to: "file://" + |DOC_PATH| + "/test_docs/index.html"
3+
assert-property: (".sidebar", {"clientWidth": "200"})
4+
show-text: true
5+
drag-and-drop: ((205, 100), (185, 100))
6+
assert-property: (".sidebar", {"clientWidth": "182"})
7+
drag-and-drop: ((185, 100), (5, 100))
8+
assert-property: (".sidebar", {"clientWidth": "0"})
9+
assert-css: (".sidebar", {"display": "none"})
10+
assert-local-storage: {"rustdoc-hide-sidebar": "true"}
11+
set-local-storage: {"rustdoc-hide-sidebar": "false"}
12+
13+
// Now same thing, but for source code
14+
go-to: "file://" + |DOC_PATH| + "/src/test_docs/lib.rs.html"
15+
assert-property: (".sidebar", {"clientWidth": "49"})
16+
drag-and-drop: ((52, 100), (185, 100))
17+
assert-property: (".sidebar", {"clientWidth": "181"})
18+
drag-and-drop: ((185, 100), (5, 100))
19+
// instead of hiding the sidebar entirely, this
20+
// will switch to the toggle mode
21+
assert-property: (".sidebar", {"clientWidth": "49"})

0 commit comments

Comments
 (0)