diff --git a/static/index.js b/static/index.js index d7a612eef..da87e4433 100644 --- a/static/index.js +++ b/static/index.js @@ -3,27 +3,41 @@ function formatCrateName(crateTitleAndVersion) { return stringParts[0] + ' = "' + stringParts[1] + '"'; } -function copyTextHandler() { - const crateTitleAndVersion = document.getElementById("crate-title"); - // On rustdoc pages, we use `textTransform: uppercase`, which copies as uppercase. - // To avoid that, reset the styles temporarily. - const oldTransform = crateTitleAndVersion.style.textTransform; - crateTitleAndVersion.style.textTransform = "none"; - const temporaryInput = document.createElement("input"); - - temporaryInput.type = "text"; - temporaryInput.value = formatCrateName(crateTitleAndVersion.innerText); - - document.body.append(temporaryInput); - temporaryInput.select(); - document.execCommand("copy"); - - temporaryInput.remove(); - crateTitleAndVersion.style.textTransform = oldTransform; -} - (function() { const clipboard = document.getElementById("clipboard"); + let resetClipboardTimeout = null; + let resetClipboardIcon = clipboard.innerHTML; + + function resetClipboard() { + resetClipboardTimeout = null; + clipboard.innerHTML = resetClipboardIcon; + } + + function copyTextHandler() { + const crateTitleAndVersion = document.getElementById("crate-title"); + // On rustdoc pages, we use `textTransform: uppercase`, which copies as uppercase. + // To avoid that, reset the styles temporarily. + const oldTransform = crateTitleAndVersion.style.textTransform; + crateTitleAndVersion.style.textTransform = "none"; + const temporaryInput = document.createElement("input"); + + temporaryInput.type = "text"; + temporaryInput.value = formatCrateName(crateTitleAndVersion.innerText); + + document.body.append(temporaryInput); + temporaryInput.select(); + document.execCommand("copy"); + + temporaryInput.remove(); + crateTitleAndVersion.style.textTransform = oldTransform; + + clipboard.textContent = "✓"; + if (resetClipboardTimeout !== null) { + clearTimeout(resetClipboardTimeout); + } + resetClipboardTimeout = setTimeout(resetClipboard, 1000); + } + if (clipboard != null) clipboard.addEventListener("click", copyTextHandler); for (const e of document.querySelectorAll('a[data-fragment="retain"]')) { e.addEventListener('mouseover', () => e.hash = document.location.hash); diff --git a/templates/clipboard.svg b/templates/clipboard.svg new file mode 100644 index 000000000..93c03391c --- /dev/null +++ b/templates/clipboard.svg @@ -0,0 +1 @@ +{# This icon is copied from crates.io #} \ No newline at end of file diff --git a/templates/header/package_navigation.html b/templates/header/package_navigation.html index a4f65f0b5..71b28b337 100644 --- a/templates/header/package_navigation.html +++ b/templates/header/package_navigation.html @@ -27,7 +27,7 @@

{{ title }} {%- else -%} {{ metadata.name }} {{ metadata.version }} - {{ "copy" | far(id="clipboard", aria_label="Copy crate name and version information", fa=true) }} + {%- include "clipboard.svg" -%} {%- endif -%}

diff --git a/templates/rustdoc/topbar.html b/templates/rustdoc/topbar.html index 12cae107e..5a99abdd2 100644 --- a/templates/rustdoc/topbar.html +++ b/templates/rustdoc/topbar.html @@ -19,7 +19,7 @@