From fc6db82c858439df71fa735ed15782c86ec0d161 Mon Sep 17 00:00:00 2001 From: Jesse Haigh Date: Tue, 29 Jul 2025 17:12:40 -0600 Subject: [PATCH] add copy-to-clipboard button on code listings with success/failure UI - Show copy-to-clipboard button on hover for devices that support it - Persistently display button on non-hover devices - Add copyCodeToClipboard function to write code block text to clipboard - Add Copy/Checkmark/Cross icons with CopyState for state-specific styling --- src/components/ContentNode.vue | 1 + src/components/ContentNode/CodeListing.vue | 112 +++++++++++++++++- src/components/Icons/CheckmarkIcon.vue | 35 ++++++ src/components/Icons/CopyIcon.vue | 37 ++++++ src/components/Icons/CrossIcon.vue | 37 ++++++ src/lang/locales/en-US.json | 3 +- tests/unit/components/ContentNode.spec.js | 25 ++++ .../ContentNode/CodeListing.spec.js | 26 ++++ 8 files changed, 273 insertions(+), 3 deletions(-) create mode 100644 src/components/Icons/CheckmarkIcon.vue create mode 100644 src/components/Icons/CopyIcon.vue create mode 100644 src/components/Icons/CrossIcon.vue diff --git a/src/components/ContentNode.vue b/src/components/ContentNode.vue index ff8fd5175..3178b919f 100644 --- a/src/components/ContentNode.vue +++ b/src/components/ContentNode.vue @@ -274,6 +274,7 @@ function renderNode(createElement, references) { fileType: node.fileType, content: node.code, showLineNumbers: node.showLineNumbers, + copyToClipboard: node.copyToClipboard ?? false, }; return createElement(CodeListing, { props }); } diff --git a/src/components/ContentNode/CodeListing.vue b/src/components/ContentNode/CodeListing.vue index 8f1524fc8..24623ead2 100644 --- a/src/components/ContentNode/CodeListing.vue +++ b/src/components/ContentNode/CodeListing.vue @@ -1,7 +1,7 @@