Skip to content

Commit b7e1eea

Browse files
authored
Merge pull request #1394 from notriddle/rustdoc-clipboard-icon
Use the same icon for clipboard button that crates.io itself uses
2 parents 0236fab + 8f60d6c commit b7e1eea

File tree

5 files changed

+40
-21
lines changed

5 files changed

+40
-21
lines changed

static/index.js

+33-19
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,41 @@ function formatCrateName(crateTitleAndVersion) {
33
return stringParts[0] + ' = "' + stringParts[1] + '"';
44
}
55

6-
function copyTextHandler() {
7-
const crateTitleAndVersion = document.getElementById("crate-title");
8-
// On rustdoc pages, we use `textTransform: uppercase`, which copies as uppercase.
9-
// To avoid that, reset the styles temporarily.
10-
const oldTransform = crateTitleAndVersion.style.textTransform;
11-
crateTitleAndVersion.style.textTransform = "none";
12-
const temporaryInput = document.createElement("input");
13-
14-
temporaryInput.type = "text";
15-
temporaryInput.value = formatCrateName(crateTitleAndVersion.innerText);
16-
17-
document.body.append(temporaryInput);
18-
temporaryInput.select();
19-
document.execCommand("copy");
20-
21-
temporaryInput.remove();
22-
crateTitleAndVersion.style.textTransform = oldTransform;
23-
}
24-
256
(function() {
267
const clipboard = document.getElementById("clipboard");
8+
let resetClipboardTimeout = null;
9+
let resetClipboardIcon = clipboard.innerHTML;
10+
11+
function resetClipboard() {
12+
resetClipboardTimeout = null;
13+
clipboard.innerHTML = resetClipboardIcon;
14+
}
15+
16+
function copyTextHandler() {
17+
const crateTitleAndVersion = document.getElementById("crate-title");
18+
// On rustdoc pages, we use `textTransform: uppercase`, which copies as uppercase.
19+
// To avoid that, reset the styles temporarily.
20+
const oldTransform = crateTitleAndVersion.style.textTransform;
21+
crateTitleAndVersion.style.textTransform = "none";
22+
const temporaryInput = document.createElement("input");
23+
24+
temporaryInput.type = "text";
25+
temporaryInput.value = formatCrateName(crateTitleAndVersion.innerText);
26+
27+
document.body.append(temporaryInput);
28+
temporaryInput.select();
29+
document.execCommand("copy");
30+
31+
temporaryInput.remove();
32+
crateTitleAndVersion.style.textTransform = oldTransform;
33+
34+
clipboard.textContent = "✓";
35+
if (resetClipboardTimeout !== null) {
36+
clearTimeout(resetClipboardTimeout);
37+
}
38+
resetClipboardTimeout = setTimeout(resetClipboard, 1000);
39+
}
40+
2741
if (clipboard != null) clipboard.addEventListener("click", copyTextHandler);
2842
for (const e of document.querySelectorAll('a[data-fragment="retain"]')) {
2943
e.addEventListener('mouseover', () => e.hash = document.location.hash);

templates/clipboard.svg

+1
Loading

templates/header/package_navigation.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ <h1 id="crate-title">
2727
{{ title }}
2828
{%- else -%}
2929
{{ metadata.name }} {{ metadata.version }}
30-
{{ "copy" | far(id="clipboard", aria_label="Copy crate name and version information", fa=true) }}
30+
<span id="clipboard" class="fa-svg fa-svg-fw" title="Copy crate name and version information">{%- include "clipboard.svg" -%}</span>
3131
{%- endif -%}
3232
</h1>
3333

templates/rustdoc/topbar.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<ul class="pure-menu-list menu-item-divided">
2020
<li class="pure-menu-heading" id="crate-title">
2121
{{ krate.name }} {{ krate.version }}
22-
{{ "copy" | far(id="clipboard", aria_label="Copy crate name and version information", fw=true) }}
22+
<span id="clipboard" class="fa-svg fa-svg-fw" title="Copy crate name and version information">{%- include "clipboard.svg" -%}</span>
2323
</li>
2424

2525
<li class="pure-menu-item">

templates/style/rustdoc.scss

+4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
min-height: calc(100vh - #{$top-navbar-height + $footer-height + 2});
77
}
88

9+
#clipboard {
10+
cursor: pointer;
11+
}
12+
913
// Force the navbar to be left-aligned on rustdoc pages
1014
body.rustdoc-page > .nav-container > .container {
1115
margin-left: 0;

0 commit comments

Comments
 (0)