mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-12-23 18:12:54 +03:00
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:
parent
d0a5d5e7ca
commit
055c422b34
30
docs_theme/css/copy-button.css
Normal file
30
docs_theme/css/copy-button.css
Normal 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;
|
||||||
|
}
|
||||||
24
docs_theme/js/copy-button.js
Normal file
24
docs_theme/js/copy-button.js
Normal 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);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user