[READ-ONLY] Mirror of https://github.com/flo-bit/dogumentation. Simple, minimalistic documentation template using astro flo-bit.dev/dogumentation/
0

Configure Feed

Select the types of activity you want to include in your feed.

dogumentation / src / components / CodeCopyButton.astro
2.0 kB 52 lines
1<script is:inline> 2 document.addEventListener("DOMContentLoaded", () => { 3 let copyButtonLabel = "copy"; 4 let codeBlocks = Array.from(document.querySelectorAll("pre")); 5 for (let codeBlock of codeBlocks) { 6 let wrapper = document.createElement("div"); 7 wrapper.style.position = "relative"; 8 9 let copyButton = document.createElement("button"); 10 copyButton.className = 11 "opacity-0 focus:opacity-100 focus:outline-base-600 dark:focus:outline-base-400 group-hover:opacity-100 w-16 transition-opacity duration-500 absolute top-3 right-3 text-xs bg-base-200 dark:bg-base-800 outline outline-base-400 dark:outline-base-800 py-1 px-2 rounded-xl dark:hover:bg-base-700 hover:bg-base-300"; 12 copyButton.innerHTML = copyButtonLabel; 13 14 // Add class 'group' to codeBlock 15 codeBlock.classList.add("group"); 16 17 codeBlock.setAttribute("tabindex", "0"); 18 codeBlock.appendChild(copyButton); 19 20 // Wrap the codeBlock with the wrapper div 21 let parent = codeBlock.parentNode; 22 if (parent) { 23 parent.insertBefore(wrapper, codeBlock); 24 wrapper.appendChild(codeBlock); 25 } 26 27 copyButton.addEventListener("click", async () => { 28 await copyCode(codeBlock, copyButton); 29 }); 30 } 31 32 async function copyCode(block, button) { 33 let code = block.querySelector("code"); 34 if (!code) return; 35 36 let text = code.innerText; 37 38 await navigator.clipboard.writeText(text); 39 40 let oldLabel = button.innerText; 41 let oldClassName = button.className; 42 button.className = 43 "opacity-100 transition-opacity duration-500 w-16 absolute top-3 right-3 text-xs bg-green-200 dark:bg-green-900 outline outline-green-300 dark:outline-green-700 text-green-800 dark:text-green-300 py-1 px-2 rounded-xl"; 44 button.innerText = "copied"; 45 46 setTimeout(() => { 47 button.innerText = oldLabel; 48 button.className = oldClassName; 49 }, 2000); 50 } 51 }); 52</script>