Ctrl+Shift+C Copy Fix

Override Ctrl+Shift+C to copy selected text instead of opening console

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Ctrl+Shift+C Copy Fix
// @namespace    http://tampermonkey.net/
// @version      1.4
// @description  Override Ctrl+Shift+C to copy selected text instead of opening console
// @author       You
// @match        *://*/*
// @grant        none
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    document.addEventListener('keydown', function(e) {
        // Check if Ctrl+Shift+C is pressed
        if (e.ctrlKey && e.shiftKey && e.key === 'C') {
            // Prevent the default behavior (opening console)
            e.preventDefault();
            e.stopPropagation();

            // Get selected text
            const selectedText = window.getSelection().toString().trim();

            if (selectedText) {
                // Use Clipboard API to copy text
                navigator.clipboard.writeText(selectedText).then(function() {
                    console.log('Text copied to clipboard');
                    showCopyNotification('✓ Copied!');
                }).catch(function(err) {
                    console.error('Failed to copy text: ', err);

                    // Fallback for older browsers
                    fallbackCopyText(selectedText);
                });
            } else {
                console.log('No text selected to copy');
                showCopyNotification('📋 No text selected');
            }
        }
    }, true);

    // Also show notification for regular Ctrl+C copy
    document.addEventListener('keydown', function(e) {
        if (e.ctrlKey && !e.shiftKey && e.key === 'c') {
            // Small delay to ensure copy happens first
            setTimeout(() => {
                const selectedText = window.getSelection().toString().trim();
                if (selectedText) {
                    showCopyNotification('✓ Copied!');
                }
            }, 100);
        }
    }, true);

    // Fallback method for copying text
    function fallbackCopyText(text) {
        const textArea = document.createElement('textarea');
        textArea.value = text;
        textArea.style.position = 'fixed';
        textArea.style.left = '-999999px';
        textArea.style.top = '-999999px';
        document.body.appendChild(textArea);
        textArea.focus();
        textArea.select();

        try {
            const successful = document.execCommand('copy');
            if (successful) {
                console.log('Text copied using fallback method');
                showCopyNotification('✓ Copied!');
            } else {
                console.error('Fallback copy method failed');
                showCopyNotification('❌ Copy failed');
            }
        } catch (err) {
            console.error('Fallback copy error: ', err);
            showCopyNotification('❌ Copy failed');
        }

        document.body.removeChild(textArea);
    }

    // Function to show a temporary notification with enhanced animations
    function showCopyNotification(message) {
        // Remove existing notification if any
        const existingNotification = document.getElementById('copy-notification');
        if (existingNotification) {
            // Quick disappear animation for existing notification
            existingNotification.style.transition = 'all 0.3s ease-out';
            existingNotification.style.transform = 'translateX(-50%) translateY(20px)';
            existingNotification.style.opacity = '0';
            setTimeout(() => {
                if (existingNotification.parentNode) {
                    existingNotification.parentNode.removeChild(existingNotification);
                }
            }, 300);
        }

        // Create new notification
        const notification = document.createElement('div');
        notification.id = 'copy-notification';
        notification.textContent = message;

        // Initial styles - starting state for appear animation
        notification.style.cssText = `
            position: fixed;
            bottom: 20px;
            left: 50%;
            transform: translateX(-50%) translateY(100px);
            background: #6B7280;
            color: white;
            padding: 16px 32px;
            border-radius: 25px;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            font-size: 14px;
            font-weight: 500;
            z-index: 10000;
            box-shadow: 0 8px 35px rgba(0,0,0,0.3);
            backdrop-filter: blur(15px);
            border: 1px solid rgba(255,255,255,0.15);
            min-width: 120px;
            text-align: center;
            transition: all 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);
            opacity: 0;
            cursor: pointer;
            will-change: transform, opacity;
        `;

        document.body.appendChild(notification);

        // Trigger appear animation after a small delay to ensure CSS is applied
        setTimeout(() => {
            notification.style.transform = 'translateX(-50%) translateY(0)';
            notification.style.opacity = '1';
        }, 10);

        // Auto remove after 2 seconds with disappear animation
        let removeTimeout = setTimeout(() => {
            startDisappearAnimation(notification);
        }, 2000);

        // Click to dismiss with animation
        notification.addEventListener('click', () => {
            clearTimeout(removeTimeout);
            startDisappearAnimation(notification);
        });

        // Enhanced disappear animation function
        function startDisappearAnimation(element) {
            element.style.transition = 'all 0.4s cubic-bezier(0.4, 0, 0.2, 1)';
            element.style.transform = 'translateX(-50%) translateY(100px)';
            element.style.opacity = '0';

            setTimeout(() => {
                if (element.parentNode) {
                    element.parentNode.removeChild(element);
                }
            }, 400);
        }

        // Add hover effect for better interactivity
        notification.addEventListener('mouseenter', () => {
            notification.style.transform = 'translateX(-50%) translateY(0) scale(1.05)';
            notification.style.background = '#7E858F';
            notification.style.boxShadow = '0 12px 40px rgba(0,0,0,0.4)';
        });

        notification.addEventListener('mouseleave', () => {
            notification.style.transform = 'translateX(-50%) translateY(0) scale(1)';
            notification.style.background = '#6B7280';
            notification.style.boxShadow = '0 8px 35px rgba(0,0,0,0.3)';
        });
    }
})();