From 051d5a0934962b23ccb030dccd7c29ba1f566097 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Thu, 27 Mar 2025 17:30:29 +0000 Subject: [PATCH 1/3] feat(clipboard): clicking heading anchors copies link to clipboard --- quartz/components/scripts/clipboard.inline.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/quartz/components/scripts/clipboard.inline.ts b/quartz/components/scripts/clipboard.inline.ts index e16c11299..7a29259f7 100644 --- a/quartz/components/scripts/clipboard.inline.ts +++ b/quartz/components/scripts/clipboard.inline.ts @@ -3,6 +3,7 @@ const svgCopy = const svgCheck = '' +// Code block copy button document.addEventListener("nav", () => { const els = document.getElementsByTagName("pre") for (let i = 0; i < els.length; i++) { @@ -35,3 +36,27 @@ document.addEventListener("nav", () => { } } }) + +// Header anchor copy button +document.addEventListener("nav", () => { + const els = document.querySelectorAll("a[role=anchor]") + for (let i = 0; i < els.length; i++) { + const anchorLink = `${window.location.href}${els[i].getAttribute("href")}` + if (els[i].getAttribute("href")) { + const svgAnchor = els[i].innerHTML + function onClick() { + navigator.clipboard.writeText(anchorLink).then( + () => { + els[i].innerHTML = svgCheck + setTimeout(() => { + els[i].innerHTML = svgAnchor + }, 2000) + }, + (error) => console.error(error), + ) + } + els[i].addEventListener("click", onClick) + window.addCleanup(() => els[i].removeEventListener("click", onClick)) + } + } +}) From 4cff7055482510617e8b8fc6f7e9e467550548eb Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Thu, 27 Mar 2025 17:51:03 +0000 Subject: [PATCH 2/3] Move const assignment --- quartz/components/scripts/clipboard.inline.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quartz/components/scripts/clipboard.inline.ts b/quartz/components/scripts/clipboard.inline.ts index 7a29259f7..61100dbef 100644 --- a/quartz/components/scripts/clipboard.inline.ts +++ b/quartz/components/scripts/clipboard.inline.ts @@ -41,8 +41,8 @@ document.addEventListener("nav", () => { document.addEventListener("nav", () => { const els = document.querySelectorAll("a[role=anchor]") for (let i = 0; i < els.length; i++) { - const anchorLink = `${window.location.href}${els[i].getAttribute("href")}` if (els[i].getAttribute("href")) { + const anchorLink = `${window.location.href}${els[i].getAttribute("href")}` const svgAnchor = els[i].innerHTML function onClick() { navigator.clipboard.writeText(anchorLink).then( From fc3df9aa01e796aed800b11d340383624af28aa0 Mon Sep 17 00:00:00 2001 From: Emile Bangma Date: Thu, 27 Mar 2025 18:56:59 +0100 Subject: [PATCH 3/3] Refactor anchor link generation logic --- quartz/components/scripts/clipboard.inline.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/quartz/components/scripts/clipboard.inline.ts b/quartz/components/scripts/clipboard.inline.ts index 61100dbef..56a60ef38 100644 --- a/quartz/components/scripts/clipboard.inline.ts +++ b/quartz/components/scripts/clipboard.inline.ts @@ -41,8 +41,9 @@ document.addEventListener("nav", () => { document.addEventListener("nav", () => { const els = document.querySelectorAll("a[role=anchor]") for (let i = 0; i < els.length; i++) { - if (els[i].getAttribute("href")) { - const anchorLink = `${window.location.href}${els[i].getAttribute("href")}` + const href = els[i].getAttribute("href") + if (href) { + const anchorLink = new URL(href, window.location.href).toString() const svgAnchor = els[i].innerHTML function onClick() { navigator.clipboard.writeText(anchorLink).then(