// ==UserScript== // @name KnowledgeHub - Remove no-copy class // @namespace https://github.com/yourname/ // @version 1.0 // @description Removes the "no-copy" class from body to allow text selection and copying // @author You // @match https://www.knowledgehub.com/* // @grant none // @run-at document-start // ==/UserScript== document.addEventListener('contextmenu', e => e.stopPropagation(), true); // Prevent text selection blocking document.addEventListener('selectstart', e => e.stopPropagation(), true); // Prevent dragstart blocking document.addEventListener('dragstart', e => e.stopPropagation(), true); // Stop blocking copy and cut events document.addEventListener('copy', e => e.stopPropagation(), true); document.addEventListener('cut', e => e.stopPropagation(), true); // Prevent scripts from blocking pasting document.addEventListener('paste', e => e.stopPropagation(), true); (function() { 'use strict'; function removeNoCopyClass() { if (document.body) { document.body.classList.remove('no-copy'); // Optional: completely clear the class attribute if it only had "no-copy" // document.body.className = document.body.className.replace(/\bno-copy\b/g, '').trim(); } } // Run as early as possible if (document.body) { removeNoCopyClass(); } else { // Fallback: wait for body to be available const observer = new MutationObserver(() => { if (document.body) { removeNoCopyClass(); observer.disconnect(); } }); observer.observe(document.documentElement, { childList: true }); } // Also run again after page is fully loaded (in case the site re-adds the class) window.addEventListener('load', removeNoCopyClass); // Optional: re-run every time the class changes (very aggressive) // const classObserver = new MutationObserver(removeNoCopyClass); // if (document.body) classObserver.observe(document.body, { attributes: true, attributeFilter: ['class'] }); })();