Adds copy functionality to pasted content on Claude.ai
// ==UserScript== // @name Claude Pasted Content Copier // @description Adds copy functionality to pasted content on Claude.ai // @icon https://claude.ai/favicon.ico // @version 1.2 // @author afkarxyz // @namespace https://github.com/afkarxyz/misc-scripts/ // @supportURL https://github.com/afkarxyz/misc-scripts/issues // @license MIT // @match *://claude.ai/* // @grant none // ==/UserScript== (function() { 'use strict'; function addCopyButton() { const targetHeading = document.querySelector('h2.font-styrene-display.flex-1.truncate.text-lg.font-medium'); if (targetHeading && !targetHeading.querySelector('.copy-button')) { targetHeading.textContent = 'Pasted content'; const copyButton = document.createElement('button'); copyButton.className = `copy-button inline-flex items-center justify-center relative shrink-0 ring-offset-2 ring-offset-bg-300 ring-accent-main-100 focus-visible:outline-none focus-visible:ring-1 disabled:pointer-events-none disabled:opacity-50 disabled:shadow-none disabled:drop-shadow-none text-text-200 transition-all font-styrene active:bg-bg-400 hover:bg-bg-500/40 hover:text-text-100 h-8 w-8 rounded-md active:scale-95 ml-2`; copyButton.setAttribute('data-state', 'closed'); copyButton.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 256 256"> <path d="M200,32H163.74a47.92,47.92,0,0,0-71.48,0H56A16,16,0,0,0,40,48V216a16,16,0,0,0,16,16H200a16,16,0,0,0,16-16V48A16,16,0,0,0,200,32Zm-72,0a32,32,0,0,1,32,32H96A32,32,0,0,1,128,32Zm72,184H56V48H82.75A47.93,47.93,0,0,0,80,64v8a8,8,0,0,0,8,8h80a8,8,0,0,0,8-8V64a47.93,47.93,0,0,0-2.75-16H200Z"></path> </svg> `; copyButton.addEventListener('click', copyText); targetHeading.style.display = 'flex'; targetHeading.style.alignItems = 'center'; targetHeading.appendChild(copyButton); } } function copyText() { const textElement = document.querySelector('div.-m-1.mt-0.min-h-0.flex-1.whitespace-pre-wrap.break-all.text-xs.p-4.bg-bg-000.rounded-lg.border-0\\.5.border-border-300.overflow-y-auto.font-mono.shadow-sm'); if (textElement) { navigator.clipboard.writeText(textElement.textContent).then(() => { const copyButton = document.querySelector('.copy-button'); if (copyButton) { const originalHTML = copyButton.innerHTML; copyButton.innerHTML = ` <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 256 256"><path d="M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z"></path></svg> `; setTimeout(() => { copyButton.innerHTML = originalHTML; }, 1000); } }); } } function init() { addCopyButton(); const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === 'childList') { addCopyButton(); } }); }); observer.observe(document.body, { childList: true, subtree: true }); } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } })();