🚧 feat: add basic copy button to codeblocks

main
welpo 2 years ago
parent 700037afe5
commit 8e1473bba9
No known key found for this signature in database
GPG Key ID: A2F978CF4EC1F5A6

@ -6,6 +6,7 @@ code {
}
pre {
display: block;
line-height: 1.4;
overflow-x: auto;
padding: 2rem 1rem 1rem;
@ -31,7 +32,7 @@ pre code[class*="language-"]::before {
display: block;
background-color: var(--primary-color);
color: var(--hover-color);
padding: 0.2rem;
padding: 0.3rem;
padding-left: 1rem;
font-family: var(--code-font);
width: 100%;
@ -43,3 +44,26 @@ pre code[class*="language-"]::before {
top: 0;
left: 0;
}
.copy-code {
z-index: 1;
-webkit-mask: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPjxwYXRoIGQ9Ik0yMTcuMDAyLTY3LjY5NHEtMzcuNzMyIDAtNjQuMDItMjYuMjg4LTI2LjI4Ny0yNi4yODctMjYuMjg3LTY0LjAxOVYtNzA3LjY5aDc3Ljk5OXY1NDkuNjg5cTAgNC42MTUgMy44NDYgOC40NjIgMy44NDYgMy44NDYgOC40NjIgMy44NDZoNDUxLjY4OXY3Ny45OTlIMjE3LjAwMlptMTc1Ljk5OS0xNzUuOTk5cS0zNy43MzMgMC02NC4wMi0yNi4yODdUMzAyLjY5NC0zMzR2LTQ2My4zODNxMC0zNy43MzIgMjYuMjg3LTY0LjAyIDI2LjI4Ny0yNi4yODcgNjQuMDItMjYuMjg3aDM2NS4zODNxMzcuNzMyIDAgNjQuMDE5IDI2LjI4NyAyNi4yODggMjYuMjg4IDI2LjI4OCA2NC4wMlYtMzM0cTAgMzcuNzMzLTI2LjI4OCA2NC4wMi0yNi4yODcgMjYuMjg3LTY0LjAxOSAyNi4yODdIMzkzLjAwMVptMC03Ny45OThoMzY1LjM4M3E0LjYxNSAwIDguNDYyLTMuODQ3IDMuODQ2LTMuODQ2IDMuODQ2LTguNDYydi00NjMuMzgzcTAtNC42MTYtMy44NDYtOC40NjItMy44NDctMy44NDYtOC40NjItMy44NDZIMzkzLjAwMXEtNC42MTYgMC04LjQ2MiAzLjg0Ni0zLjg0NyAzLjg0Ni0zLjg0NyA4LjQ2MlYtMzM0cTAgNC42MTYgMy44NDcgOC40NjIgMy44NDYgMy44NDcgOC40NjIgMy44NDdabS0xMi4zMDkgMHYtNDg4Vi0zMjEuNjkxWiIvPjwvc3ZnPg==);
// -webkit-mask: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPjxwYXRoIGQ9Ik0yMjIuNzgzLTEyNC43ODJxLTQwLjQyNiAwLTY5LjIxMy0yOC43ODgtMjguNzg4LTI4Ljc4Ny0yOC43ODgtNjkuMjEzdi01MTQuNDM0cTAtNDAuNDI2IDI4Ljc4OC02OS4yMTMgMjguNzg3LTI4Ljc4OCA2OS4yMTMtMjguNzg4aDE0OS41MjFxMTEuMzkxLTMyLjY5NiA0MC40MzgtNTMuNzYxIDI5LjA0Ni0yMS4wNjYgNjcuMjU4LTIxLjA2NiAzNi44MjYgMCA2Ni4yODMgMjEuMDY2IDI5LjQ1NyAyMS4wNjUgNDEuNDEzIDUzLjc2MWgxNDkuNTIxcTQwLjQyNiAwIDY5LjIxMyAyOC43ODggMjguNzg4IDI4Ljc4NyAyOC43ODggNjkuMjEzdjUxNC40MzRxMCA0MC40MjYtMjguNzg4IDY5LjIxMy0yOC43ODcgMjguNzg4LTY5LjIxMyAyOC43ODhIMjIyLjc4M1ptMC05OC4wMDFoNTE0LjQzNHYtNTE0LjQzNGgtNjguMDQzdjEyOS4wNDRIMjkwLjgyNnYtMTI5LjA0NGgtNjguMDQzdjUxNC40MzRabTI1Ny4wMDYtNTIyLjkxM3ExNS4yMTEgMCAyNS43MTEtMTAuMjg5IDEwLjUtMTAuMjkgMTAuNS0yNS41IDAtMTUuMjExLTEwLjI4OS0yNS43MTEtMTAuMjktMTAuNS0yNS41LTEwLjUtMTUuMjExIDAtMjUuNzExIDEwLjI5LTEwLjUgMTAuMjg5LTEwLjUgMjUuNSAwIDE1LjIxIDEwLjI4OSAyNS43MSAxMC4yOSAxMC41IDI1LjUgMTAuNVoiLz48L3N2Zz4);
background: var(--hover-color);
cursor: pointer;
display: inline-block;
position: absolute;
height: 20px;
width: 20px;
color: white;
right: 0.5rem;
top: 0.2rem;
}
.copy-code.checked {
-webkit-mask: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPjxwYXRoIGQ9Ik0zOTUtMjUzIDE5NC00NTVsODMtODMgMTE4IDExNyAyODgtMjg3IDgzIDg0LTM3MSAzNzFaIi8+PC9zdmc+);
}
.copy-code.error {
-webkit-mask: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPjxwYXRoIGQ9Ik00NzkuMzg2LTI0OFE1MDktMjQ4IDUyOS0yNjcuMzg2cTIwLTE5LjM4NiAyMC00OVQ1MjkuNjE0LTM2Ni41cS0xOS4zODYtMjAuNS00OS0yMC41VDQzMS0zNjYuODg2cS0yMCAyMC4xMTQtMjAgNDkuNzI4dDE5LjM4NiA0OS4zODZxMTkuMzg2IDE5Ljc3MiA0OSAxOS43NzJaTTQxNi00MzFoMTI4di0yNjVINDE2djI2NVptNjQuMjc2IDM4MXEtODguOTE2IDAtMTY3Ljc0My0zMy4xMDQtNzguODI4LTMzLjEwMy0xMzcuNTc3LTkxLjg1Mi01OC43NDktNTguNzQ5LTkxLjg1Mi0xMzcuNTM1UTUwLTM5MS4yNzcgNTAtNDgwLjQ1OHEwLTg5LjQzOCAzMy4xNjItMTY3LjQ5MSAzMy4xNjMtNzguMDUzIDkyLjE3NS0xMzYuOTQyIDU5LjAxMS01OC44ODkgMTM3LjUzMy05MS45OTlRMzkxLjM5My05MTAgNDgwLjQ1OC05MTBxODkuNDI4IDAgMTY3LjUxOCAzMy4wOTNUNzg0Ljk0LTc4NC45NHE1OC44NzQgNTguODc0IDkxLjk2NyAxMzcuMjE1UTkxMC01NjkuMzg1IDkxMC00ODAuMTkycTAgODkuMTkyLTMzLjExIDE2Ny41MTgtMzMuMTEgNzguMzI2LTkxLjk5OSAxMzcuMzM3LTU4Ljg4OSA1OS4wMTItMTM3LjE2NyA5Mi4xNzRRNTY5LjQ0Ny01MCA0ODAuMjc2LTUwWiIvPjwvc3ZnPg==);
}

@ -0,0 +1,19 @@
function changeIcon(copyDiv, className) {
copyDiv.classList.add(className);
setTimeout(() => copyDiv.classList.remove(className), 2500);
}
document.querySelectorAll("pre").forEach((block) => {
const copyDiv = document.createElement("div");
copyDiv.className = "copy-code";
block.prepend(copyDiv);
copyDiv.addEventListener("click", function () {
const code = block.innerText;
navigator.clipboard.writeText(code).then(() => {
changeIcon(copyDiv, "checked");
}, () => {
changeIcon(copyDiv, "error");
});
});
});
Loading…
Cancel
Save