Ctrl+Shift+C Copy Fix

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

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==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)';
        });
    }
})();