Skip to content

Commit 6a1de81

Browse files
committed
add collapsing api docs
1 parent b8e1b63 commit 6a1de81

3 files changed

Lines changed: 113 additions & 0 deletions

File tree

api-docs/source/_static/css/other.css

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,47 @@
1414
.colon {
1515
display: none !important;
1616
}
17+
18+
/* Desktop only; mobile keeps the theme's slide-in nav and top-bar hamburger. */
19+
@media screen and (min-width: 769px) {
20+
/* Toggled by js/sidebar_toggle.js; reuses the theme's off-screen nav. */
21+
#bn-sidebar-toggle {
22+
position: fixed;
23+
top: 12px;
24+
left: 312px;
25+
z-index: 10000;
26+
width: 36px;
27+
height: 36px;
28+
display: inline-flex;
29+
align-items: center;
30+
justify-content: center;
31+
border: none;
32+
background: #fff;
33+
color: #111;
34+
font-size: 18px;
35+
cursor: pointer;
36+
opacity: 0.85;
37+
}
38+
39+
#bn-sidebar-toggle:hover {
40+
opacity: 1;
41+
}
42+
43+
html.bn-sidebar-collapsed #bn-sidebar-toggle {
44+
left: 12px;
45+
}
46+
47+
html.bn-sidebar-collapsed .wy-nav-side {
48+
left: -300px;
49+
}
50+
51+
html.bn-sidebar-collapsed .wy-nav-content-wrap {
52+
margin-left: 0;
53+
}
54+
}
55+
56+
@media screen and (max-width: 768px) {
57+
#bn-sidebar-toggle {
58+
display: none;
59+
}
60+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Collapsible navigation sidebar for the API docs (issue #7867).
2+
(() => {
3+
const KEY = "bn_api_sidebar_collapsed";
4+
const CLS = "bn-sidebar-collapsed";
5+
const root = document.documentElement;
6+
// Collapse is desktop only; on mobile the theme's hamburger owns the nav.
7+
const desktop = window.matchMedia("(min-width: 769px)");
8+
9+
const save = (v) => { try { localStorage.setItem(KEY, v); } catch (e) {} };
10+
const load = () => { try { return localStorage.getItem(KEY); } catch (e) { return null; } };
11+
12+
let collapsed = load() === "1";
13+
14+
// Apply saved state before first paint to avoid a layout flash.
15+
root.classList.toggle(CLS, collapsed);
16+
17+
const sync = () => {
18+
const btn = document.getElementById("bn-sidebar-toggle");
19+
const nav = document.querySelector(".wy-nav-side");
20+
// Only hide the nav from AT when it is actually offscreen.
21+
const hidden = collapsed && desktop.matches;
22+
if (btn) {
23+
btn.setAttribute("aria-pressed", collapsed ? "true" : "false");
24+
btn.title = collapsed ? "Show navigation" : "Hide navigation";
25+
}
26+
if (nav) {
27+
if (hidden) {
28+
nav.setAttribute("aria-hidden", "true");
29+
nav.setAttribute("inert", "");
30+
} else {
31+
nav.removeAttribute("aria-hidden");
32+
nav.removeAttribute("inert");
33+
}
34+
}
35+
};
36+
37+
const setCollapsed = (v) => {
38+
collapsed = v;
39+
root.classList.toggle(CLS, collapsed);
40+
save(collapsed ? "1" : "0");
41+
sync();
42+
};
43+
44+
const addButton = () => {
45+
const nav = document.querySelector(".wy-nav-side");
46+
if (nav && !nav.id) nav.id = "bn-nav-side";
47+
48+
const btn = document.createElement("button");
49+
btn.id = "bn-sidebar-toggle";
50+
btn.type = "button";
51+
btn.setAttribute("aria-label", "Toggle navigation");
52+
if (nav) btn.setAttribute("aria-controls", nav.id);
53+
btn.textContent = "☰";
54+
btn.addEventListener("click", () => setCollapsed(!collapsed));
55+
document.body.appendChild(btn);
56+
sync();
57+
};
58+
59+
// addListener fallback for older Safari/WebKit without addEventListener.
60+
if (desktop.addEventListener) desktop.addEventListener("change", sync);
61+
else desktop.addListener(sync);
62+
63+
if (document.readyState === "loading") {
64+
document.addEventListener("DOMContentLoaded", addButton);
65+
} else {
66+
addButton();
67+
}
68+
})();

api-docs/source/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ def write_summary_table(output, header, members):
197197

198198
def setup(app):
199199
app.add_css_file('css/other.css')
200+
app.add_js_file('js/sidebar_toggle.js')
200201
app.is_parallel_allowed('write')
201202

202203
def generaterst():

0 commit comments

Comments
 (0)