Skip to content

Commit 9148411

Browse files
Add toggle mechanism for docs.rs source sidebar
1 parent 6c9c2f4 commit 9148411

File tree

5 files changed

+112
-6
lines changed

5 files changed

+112
-6
lines changed

src/web/metrics.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ mod tests {
121121
("/-/static/index.js", "static resource"),
122122
("/-/static/menu.js", "static resource"),
123123
("/-/static/keyboard.js", "static resource"),
124+
("/-/static/source.js", "static resource"),
124125
("/-/static/opensearch.xml", "static resource"),
125126
("/releases", "/releases"),
126127
("/releases/feed", "static resource"),

src/web/statics.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,24 @@ mod tests {
228228
});
229229
}
230230

231+
#[test]
232+
fn source_js() {
233+
wrapper(|env| {
234+
let web = env.frontend();
235+
236+
let resp = web.get("/-/static/source.js").send()?;
237+
assert!(resp.status().is_success());
238+
assert_eq!(
239+
resp.headers().get("Content-Type"),
240+
Some(&"application/javascript".parse().unwrap()),
241+
);
242+
assert!(resp.content_length().unwrap() > 10);
243+
assert!(resp.text()?.contains("toggleSource"));
244+
245+
Ok(())
246+
});
247+
}
248+
231249
#[test]
232250
fn static_files() {
233251
wrapper(|env| {

static/source.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
(function() {
2+
var oldLabel;
3+
4+
function showSourceFiles(button, sideMenu, sourceCode) {
5+
button.getElementsByClassName("pure-menu-link")[0].childNodes[0].textContent = "< ";
6+
button.title = oldLabel;
7+
button.setAttribute("aria-label", button.title);
8+
button.setAttribute("aria-expanded", "true");
9+
10+
sideMenu.classList.remove("collapsed");
11+
sourceCode.classList.remove("expanded");
12+
}
13+
14+
function hideSourceFiles(button, sideMenu, sourceCode) {
15+
button.getElementsByClassName("pure-menu-link")[0].childNodes[0].textContent = "> ";
16+
button.title = "Show source sidebar";
17+
button.setAttribute("aria-label", button.title);
18+
button.setAttribute("aria-expanded", "false");
19+
20+
sideMenu.classList.add("collapsed");
21+
sourceCode.classList.add("expanded");
22+
}
23+
24+
function toggleSource(button) {
25+
var sideMenu = document.getElementById("side-menu");
26+
var sourceCode = document.getElementById("source-code");
27+
28+
if (sideMenu.classList.contains("collapsed")) {
29+
showSourceFiles(button, sideMenu, sourceCode);
30+
} else {
31+
hideSourceFiles(button, sideMenu, sourceCode);
32+
}
33+
}
34+
35+
document.addEventListener("DOMContentLoaded", function(event) {
36+
var toggleSourceButton = document.querySelector("li.toggle-source");
37+
oldLabel = toggleSourceButton.getAttribute("aria-label");
38+
39+
toggleSourceButton.addEventListener("click", function() {
40+
toggleSource(toggleSourceButton);
41+
});
42+
});
43+
})();

templates/crate/source.html

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,18 @@
2424
{%- block body -%}
2525
<div class="container package-page-container">
2626
<div class="pure-g">
27-
<div class="pure-u-1 {% if file_content %}pure-u-sm-7-24 pure-u-md-5-24{% endif %}">
27+
<div id="side-menu" class="pure-u-1 {% if file_content %}pure-u-sm-7-24 pure-u-md-5-24{% endif %}">
2828
<div class="pure-menu package-menu">
2929
<ul class="pure-menu-list">
30+
{% if file_content %}
31+
<li class="pure-menu-item toggle-source" aria-label="Collapse source sidebar" title="collapse source sidebar" aria-expanded="true">
32+
<span class="pure-menu-link">&lt; <span class="text">Hide files</span></span>
33+
</li>
34+
{% endif %}
3035
{# If this isn't the root folder, show a 'back' button #}
3136
{%- if show_parent_link -%}
3237
<li class="pure-menu-item">
33-
<a href="../" class="pure-menu-link">{{ "folder-open" | far(fw=true) }} ..</a>
38+
<a href="../" class="pure-menu-link">{{ "folder-open" | far(fw=true) }} <span class="text">..</span></a>
3439
</li>
3540
{%- endif -%}
3641

@@ -88,7 +93,7 @@
8893
{{ "file-archive" | far(fw=true) }}
8994
{%- endif -%}
9095

91-
{{ file.name }}
96+
<span class="text">{{ file.name }}</span>
9297
</a>
9398
</li>
9499
{%- endfor -%}
@@ -98,7 +103,7 @@
98103

99104
{# If the file has content, then display it in a codeblock #}
100105
{%- if file_content -%}
101-
<div class="pure-u-1 pure-u-sm-17-24 pure-u-md-19-24">
106+
<div id="source-code" class="pure-u-1 pure-u-sm-17-24 pure-u-md-19-24">
102107
<pre><code>{{ file_content }}</code></pre>
103108
</div>
104109
{%- endif -%}
@@ -114,4 +119,7 @@
114119
{%- block javascript -%}
115120
{# Highlight.js JavaScript #}
116121
{{ macros::highlight_js(languages=["rust", "ini", "markdown"]) }}
122+
{% if file_content %}
123+
<script nonce="{{ csp_nonce }}" type="text/javascript" src="/-/static/source.js?{{ docsrs_version() | slugify }}"></script>
124+
{% endif %}
117125
{%- endblock javascript -%}

templates/style/base.scss

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ div.package-page-container {
438438
margin-top: 0;
439439
}
440440

441-
a.pure-menu-link {
441+
.pure-menu-link {
442442
font-size: 14px;
443443
color: var(--color-standard);
444444
white-space: nowrap;
@@ -447,7 +447,7 @@ div.package-page-container {
447447
padding: 7px 8px;
448448
}
449449

450-
a.pure-menu-link:hover {
450+
.pure-menu-link:hover {
451451
background-color: var(--color-background-code);
452452
}
453453

@@ -759,3 +759,39 @@ h3 > code,
759759
h4 > code {
760760
display: inline-block;
761761
}
762+
763+
ul.pure-menu-list {
764+
li.toggle-source {
765+
cursor: pointer;
766+
border: 1px solid var(--color-border);
767+
display: none;
768+
}
769+
}
770+
771+
@media screen and (min-width: 35.5em) {
772+
ul.pure-menu-list {
773+
li.toggle-source {
774+
display: list-item;
775+
}
776+
}
777+
778+
#side-menu.collapsed {
779+
max-width: 46px;
780+
781+
ul {
782+
li:not(.toggle-source), .text {
783+
display: none;
784+
}
785+
}
786+
}
787+
788+
#source-code {
789+
pre {
790+
margin-top: 0;
791+
}
792+
793+
&.expanded {
794+
width: calc(100% - 46px);
795+
}
796+
}
797+
}

0 commit comments

Comments
 (0)