feat(layout): add the language and a button to copy code blocks
This commit is contained in:
parent
7c3facdd0f
commit
7b84496201
3 changed files with 124 additions and 12 deletions
|
@ -2,21 +2,68 @@
|
|||
|
||||
// Listens for clicks on the mobile menu toggle and the main menu close toggle.
|
||||
window.addEventListener('click', function(e) {
|
||||
if (e.target.matches('#menu-toggle, #menu-toggle i')) {
|
||||
openMenu();
|
||||
} else if (e.target.matches('#menu-close, #menu-close i')) {
|
||||
closeMenu();
|
||||
} else if (e.target.matches('[data-action="copy"]')) {
|
||||
copyCodeToClipboard(e);
|
||||
}
|
||||
});
|
||||
|
||||
function openMenu() {
|
||||
const menu = document.getElementById('menu'),
|
||||
menuToggle = document.getElementById('menu-toggle'),
|
||||
body = document.body;
|
||||
|
||||
if (e.target.matches('#menu-toggle, #menu-toggle i')) {
|
||||
menu.classList.toggle('active');
|
||||
menu.ariaHidden = false;
|
||||
menuToggle.ariaExpanded = true;
|
||||
body.style.overflow = 'hidden';
|
||||
menu.classList.toggle('active');
|
||||
menu.ariaHidden = false;
|
||||
menuToggle.ariaExpanded = true;
|
||||
body.style.overflow = 'hidden';
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
const menu = document.getElementById('menu'),
|
||||
menuToggle = document.getElementById('menu-toggle'),
|
||||
body = document.body;
|
||||
|
||||
menu.classList.remove('active');
|
||||
menu.ariaHidden = true;
|
||||
menuToggle.ariaExpanded = false;
|
||||
body.style.overflow = 'auto';
|
||||
}
|
||||
|
||||
function copyCodeToClipboard(e) {
|
||||
const codeTag = e.target.closest('.highlight').querySelector("code");
|
||||
|
||||
if (!codeTag) return;
|
||||
|
||||
const tw = document.createTreeWalker(
|
||||
codeTag,
|
||||
NodeFilter.SHOW_TEXT,
|
||||
(node) => {
|
||||
if (node.parentElement.matches(".ln")) {
|
||||
return NodeFilter.FILTER_REJECT;
|
||||
}
|
||||
|
||||
return NodeFilter.FILTER_ACCEPT;
|
||||
},
|
||||
);
|
||||
|
||||
let acc = "";
|
||||
while (tw.nextNode()) {
|
||||
acc += tw.currentNode.textContent;
|
||||
}
|
||||
|
||||
if (e.target.matches('#menu-close, #menu-close i')) {
|
||||
menu.classList.remove('active');
|
||||
menu.ariaHidden = true;
|
||||
menuToggle.ariaExpanded = false;
|
||||
body.style.overflow = 'auto';
|
||||
}
|
||||
});
|
||||
navigator.clipboard.writeText(acc)
|
||||
.then(() => {
|
||||
e.target.classList.add('copied');
|
||||
|
||||
setTimeout(() => {
|
||||
e.target.classList.remove('copied');
|
||||
}, 5000);
|
||||
})
|
||||
.catch(() => {
|
||||
e.target.classList.add('not-copied');
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue