Skip to content

Commit f02fbe4

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

File tree

5 files changed

+107
-7
lines changed

5 files changed

+107
-7
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: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
(function() {
2+
function showSourceFiles(button, sideMenu, sourceCode) {
3+
button.getElementsByClassName("pure-menu-link")[0].childNodes[0].textContent = "< ";
4+
5+
sideMenu.classList.remove("collapsed");
6+
sourceCode.classList.remove("expanded");
7+
}
8+
9+
function hideSourceFiles(button, sideMenu, sourceCode) {
10+
button.getElementsByClassName("pure-menu-link")[0].childNodes[0].textContent = "> ";
11+
12+
sideMenu.classList.add("collapsed");
13+
sourceCode.classList.add("expanded");
14+
}
15+
16+
function toggleSource(button) {
17+
var sideMenu = document.getElementById("side-menu");
18+
var sourceCode = document.getElementById("source-code");
19+
20+
if (sideMenu.classList.contains("collapsed")) {
21+
showSourceFiles(button, sideMenu, sourceCode);
22+
} else {
23+
hideSourceFiles(button, sideMenu, sourceCode);
24+
}
25+
}
26+
27+
document.addEventListener("DOMContentLoaded", function(event) {
28+
var toggleSourceButton = document.querySelector("li.toggle-source");
29+
30+
toggleSourceButton.addEventListener("click", function() {
31+
toggleSource(toggleSourceButton);
32+
});
33+
});
34+
})();

templates/crate/source.html

Lines changed: 13 additions & 5 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">
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 -%}
32-
<li class="pure-menu-item">
33-
<a href="../" class="pure-menu-link">{{ "folder-open" | far(fw=true) }} ..</a>
37+
<li id="toggle-source" class="pure-menu-item">
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: 41 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,42 @@ 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-standard);
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) .pure-menu-link {
783+
padding-left: 4px;
784+
}
785+
span.text {
786+
display: none;
787+
}
788+
}
789+
}
790+
791+
#source-code {
792+
pre {
793+
margin-top: 0;
794+
}
795+
796+
&.expanded {
797+
width: calc(100% - 46px);
798+
}
799+
}
800+
}

0 commit comments

Comments
 (0)