Add copy button to code blocks in documentation (#9830)

* Add copy button to code blocks for improved documentation usability

* Add copy button to code blocks for improved documentation usability

* Add copy button to code blocks for improved documentation usability

* Make "Copy" button smaller

---------

Co-authored-by: Bruno Alla <alla.brunoo@gmail.com>
This commit is contained in:
Shrikant Sudam Giri 2025-12-15 21:31:37 +05:30 committed by GitHub
parent d0a5d5e7ca
commit 055c422b34
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 63 additions and 0 deletions

View File

@ -0,0 +1,30 @@
.copy-block-button {
position: absolute;
top: 6px;
right: 6px;
z-index: 10;
white-space: nowrap; /* Prevent text wrap */
}
/* Ensure the PRE container provides positioning context */
pre {
position: relative;
padding-top: 35px; /* Room for the button */
overflow-x: auto; /* Allow horizontal scrolling */
}
/* Code block scrollable */
pre code {
display: block;
overflow-x: auto;
}
/*
The MkDocs/DRF theme injects a <span> inside buttons and applies
a text color that overrides btn-inverse defaults.
This override is intentionally scoped and limited to color only.
*/
.copy-block-button,
.copy-block-button span {
color: #ffffff !important;
}

View File

@ -0,0 +1,24 @@
document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll("pre > code").forEach(function (codeBlock) {
const button = document.createElement("button");
button.className = "copy-block-button btn btn-inverse btn-mini";
button.type = "button";
button.textContent = "Copy";
button.addEventListener("click", function () {
navigator.clipboard.writeText(codeBlock.textContent)
.then(() => {
button.textContent = "Copied!";
setTimeout(() => button.textContent = "Copy", 1200);
})
.catch(() => {
button.textContent = "Failed";
setTimeout(() => button.textContent = "Copy", 1200);
});
});
const pre = codeBlock.parentNode;
pre.style.position = "relative";
pre.appendChild(button);
});
});

View File

@ -16,6 +16,9 @@
<link href="{{ 'css/bootstrap.css'|url }}" rel="stylesheet"> <link href="{{ 'css/bootstrap.css'|url }}" rel="stylesheet">
<link href="{{ 'css/bootstrap-responsive.css'|url }}" rel="stylesheet"> <link href="{{ 'css/bootstrap-responsive.css'|url }}" rel="stylesheet">
<link href="{{ 'css/default.css'|url }}" rel="stylesheet"> <link href="{{ 'css/default.css'|url }}" rel="stylesheet">
{% for path in config.extra_css %}
<link href="{{ path|url }}" rel="stylesheet">
{% endfor %}
<script type="text/javascript"> <script type="text/javascript">

View File

@ -86,3 +86,9 @@ nav:
- 'Kickstarter Announcement': 'community/kickstarter-announcement.md' - 'Kickstarter Announcement': 'community/kickstarter-announcement.md'
- 'Mozilla Grant': 'community/mozilla-grant.md' - 'Mozilla Grant': 'community/mozilla-grant.md'
- 'Jobs': 'community/jobs.md' - 'Jobs': 'community/jobs.md'
extra_css:
- css/copy-button.css
extra_javascript:
- js/copy-button.js