27
27
28
28
const initialiseSidebar = () => {
29
29
// global elements used by the functions.
30
- const bodyWrapper = document.getElementsByClassName(" bodywrapper")[0]
31
- const sidebar = document.getElementsByClassName(" sphinxsidebar")[0]
32
- const sidebarWrapper = document.getElementsByClassName(" sphinxsidebarwrapper")[0]
30
+ const bodyWrapper = document.querySelector(". bodywrapper")
31
+ const sidebar = document.querySelector(". sphinxsidebar")
32
+ const sidebarWrapper = document.querySelector(". sphinxsidebarwrapper")
33
33
34
34
// exit early if the document has no sidebar for some reason
35
- if (typeof sidebar === "undefined" ) {
35
+ if (! sidebar) {
36
36
return
37
37
}
38
38
@@ -44,46 +44,43 @@ const initialiseSidebar = () => {
44
44
#}
45
45
{% if sphinx_version_tuple is defined and sphinx_version_tuple[0] >= 5 %}
46
46
const sidebarButton = document.getElementById("sidebarbutton")
47
- const sidebarArrow = sidebarButton.querySelector('span')
48
47
{% else %}
49
48
// create the sidebar button element
50
49
const sidebarButton = document.createElement("div")
51
50
sidebarButton.id = "sidebarbutton"
52
- // create the sidebar button arrow element
53
- const sidebarArrow = document.createElement("span")
54
- sidebarArrow.innerText = "«"
55
- sidebarButton.appendChild(sidebarArrow)
56
- sidebar.appendChild(sidebarButton)
57
51
{% endif %}
52
+ sidebarbutton.innerHTML = ""
53
+ sidebarbutton.tabindex = "0" // make it focusable
54
+ sidebarbutton.role = "slider"
55
+ sidebarbutton.title = _("Resize sidebar")
56
+ sidebarbutton.setAttribute("aria-label", _("Resize sidebar by dragging"))
57
+ sidebarbutton.setAttribute("aria-valuetext", _("Sidebar width XXX pixels"))
58
+ let clientX;
58
59
59
- const collapse_sidebar = () => {
60
- bodyWrapper.style.marginLeft = ".8em"
61
- sidebar.style.width = ".8em"
62
- sidebarWrapper.style.display = "none"
63
- sidebarArrow.innerText = "»"
64
- sidebarButton.title = _("Expand sidebar")
65
- window.localStorage.setItem("sidebar", "collapsed")
60
+ function onMouseMove(e) {
61
+ e.preventDefault()
62
+ const sidebarWidth = sidebar.offsetWidth
63
+ const newWidth = Math.max(0, Math.min(window.innerWidth, sidebarWidth + e.clientX - clientX))
64
+ clientX = e.clientX
65
+ sidebar.style.width = `${newWidth}px`
66
+ bodyWrapper.style.marginLeft = `${newWidth}px`
67
+ window.localStorage.setItem("sidebar-width", newWidth)
66
68
}
67
69
68
- const expand_sidebar = () => {
69
- bodyWrapper.style.marginLeft = ""
70
- sidebar.style.removeProperty("width")
71
- sidebarWrapper.style.display = ""
72
- sidebarArrow.innerText = "«"
73
- sidebarButton.title = _("Collapse sidebar")
74
- window.localStorage.setItem("sidebar", "expanded")
75
- }
76
-
77
- sidebarButton.addEventListener("click", () => {
78
- (sidebarWrapper.style.display === "none") ? expand_sidebar() : collapse_sidebar()
70
+ sidebarButton.addEventListener("mousedown", e => {
71
+ e.preventDefault()
72
+ clientX = e.clientX
73
+ document.addEventListener("mousemove", onMouseMove)
74
+ document.addEventListener("mouseup", () => {
75
+ document.removeEventListener("mousemove", onMouseMove)
76
+ sidebarbutton.setAttribute("aria-valuetext", _("Sidebar width XXX pixels"))
77
+ })
79
78
})
80
79
81
- const sidebar_state = window.localStorage.getItem("sidebar")
82
- if (sidebar_state === "collapsed") {
83
- collapse_sidebar()
84
- }
85
- else if (sidebar_state === "expanded") {
86
- expand_sidebar()
80
+ const sidebarWidth = parseInt(window.localStorage.getItem("sidebar-width"), 10)
81
+ if(Number.isFinite(sidebarWidth)) {
82
+ sidebar.style.width = `${sidebarWidth}px`
83
+ bodyWrapper.style.marginLeft = `${sidebarWidth}px`
87
84
}
88
85
}
89
86
0 commit comments