Universal Text Force-Select

Completely overrides selection blocks and link-dragging to allow text selection everywhere.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name        Universal Text Force-Select
// @version     2.1
// @author      Dunamis
// @namespace   https://dunamiss.xyz
// @license     MIT
// @description Completely overrides selection blocks and link-dragging to allow text selection everywhere.
// @match       *://*/*
// @grant       GM_addStyle
// @run-at      document-start
// ==/UserScript==

(function() {
    'use strict';

    // Force the browser to treat all text as selectable via CSS
    const css = `
        * {
            -webkit-user-select: text !important;
            -moz-user-select: text !important;
            -ms-user-select: text !important;
            user-select: text !important;
        }
        a {
            cursor: text !important;
        }
    `;

    // Inject CSS as early as possible
    if (typeof GM_addStyle !== 'undefined') {
        GM_addStyle(css);
    } else {
        const style = document.createElement('style');
        style.textContent = css;
        document.head.appendChild(style);
    }

    let isSelecting = false;
    let startX, startY;

    // Stop sites from "grabbing" the link to drag it as an icon
    document.addEventListener('dragstart', (e) => {
        e.preventDefault();
        return false;
    }, true);

    document.addEventListener('mousedown', (e) => {
        if (e.button === 0) { // Left click only
            startX = e.pageX;
            startY = e.pageY;
            isSelecting = false;
        }
    }, true);

    document.addEventListener('mousemove', (e) => {
        if (startX !== undefined) {
            const moveX = Math.abs(e.pageX - startX);
            const moveY = Math.abs(e.pageY - startY);
            if (moveX > 4 || moveY > 4) {
                isSelecting = true;
            }
        }
    }, true);

    document.addEventListener('click', (e) => {
        if (isSelecting) {
            // If the user was highlighting text, don't follow the link
            const target = e.target.closest('a');
            if (target) {
                e.preventDefault();
                e.stopImmediatePropagation();
            }
        }
        // Reset for next click
        startX = undefined;
        isSelecting = false;
    }, true);

})();