diff --git a/sass/parts/_code.scss b/sass/parts/_code.scss index d106877..d68d207 100644 --- a/sass/parts/_code.scss +++ b/sass/parts/_code.scss @@ -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==); +} diff --git a/static/js/copy_button.js b/static/js/copy_button.js new file mode 100644 index 0000000..712f7a4 --- /dev/null +++ b/static/js/copy_button.js @@ -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"); + }); + }); +});