From 6e38b1b8aa138b78f46f1bffabeba257a7d38f84 Mon Sep 17 00:00:00 2001 From: Yifan Jiang <55911052+YifanJiang233@users.noreply.github.com> Date: Tue, 25 Apr 2023 15:37:09 +0100 Subject: [PATCH] Fix copy code button position (#1348) Fix issue #1303 by adding a code wrapper outside the code block. Ref: https://stackoverflow.com/questions/60771472/position-a-button-such-that-it-wont-scroll-with-contents --- _sass/_base.scss | 20 ++++++-------------- assets/js/copy_code.js | 12 +++++++++++- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/_sass/_base.scss b/_sass/_base.scss index b65b11c..fac1378 100644 --- a/_sass/_base.scss +++ b/_sass/_base.scss @@ -826,31 +826,23 @@ progress::-moz-progress-bar { height: inherit; } -pre { - padding: 8px 12px; +/* Copy button */ +.code-display-wrapper { position: relative; - /* Copy code to clipboard button */ .copy { background: var(--global-card-bg-color); border-color: var(--global-bg-color); border-radius: .3rem; - border-style: solid; + border-style: none; color: var(--global-text-color); font-size: medium; opacity: 0; position: absolute; - right: .25rem; - top: .25rem; - - &:active, - &:focus, - &:hover { - color: var(--global-hover-color); - opacity: 1; - } + right: .15rem; + top: .15rem; } - + &:active .copy, &:focus .copy, &:hover .copy { diff --git a/assets/js/copy_code.js b/assets/js/copy_code.js index b12af53..4018916 100644 --- a/assets/js/copy_code.js +++ b/assets/js/copy_code.js @@ -2,13 +2,13 @@ var codeBlocks = document.querySelectorAll('pre'); codeBlocks.forEach(function (codeBlock) { if (codeBlock.querySelector('pre:not(.lineno)') || codeBlock.querySelector('code')) { + // create copy button var copyButton = document.createElement('button'); copyButton.className = 'copy'; copyButton.type = 'button'; copyButton.ariaLabel = 'Copy code to clipboard'; copyButton.innerText = 'Copy'; copyButton.innerHTML = ''; - codeBlock.append(copyButton); // get code from code block and copy to clipboard copyButton.addEventListener('click', function () { @@ -32,5 +32,15 @@ codeBlocks.forEach(function (codeBlock) { copyButton.innerHTML = ''; }, waitFor); }); + + // create wrapper div + var wrapper = document.createElement('div'); + wrapper.className = 'code-display-wrapper'; + + // add copy button and code block to wrapper div + const parent = codeBlock.parentElement; + parent.insertBefore(wrapper, codeBlock); + wrapper.append(codeBlock); + wrapper.append(copyButton); } });