Cookie Manager (Cross-Browser + Movable UI)

Powerful cookie management tool with movable, glassmorphic UI for all browsers

Από την 29/10/2025. Δείτε την τελευταία έκδοση.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey, το Greasemonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Violentmonkey για να εγκαταστήσετε αυτόν τον κώδικα.

θα χρειαστεί να εγκαταστήσετε μια επέκταση όπως το Tampermonkey ή το Userscripts για να εγκαταστήσετε αυτόν τον κώδικα.

You will need to install an extension such as Tampermonkey to install this script.

Θα χρειαστεί να εγκαταστήσετε μια επέκταση διαχείρισης κώδικα χρήστη για να εγκαταστήσετε αυτόν τον κώδικα.

(Έχω ήδη έναν διαχειριστή κώδικα χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(Έχω ήδη έναν διαχειριστή στυλ χρήστη, επιτρέψτε μου να τον εγκαταστήσω!)

// ==UserScript==
// @name         Cookie Manager (Cross-Browser + Movable UI)
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Powerful cookie management tool with movable, glassmorphic UI for all browsers
// @author       Balta zar
// @match        *://*/*
// @grant        none
// @run-at       document-end
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    function domReady(callback) {
        if (document.readyState === 'complete' || document.readyState === 'interactive') callback();
        else document.addEventListener('DOMContentLoaded', callback);
    }

    domReady(() => {
        class CookieManager {
            constructor() {
                this.currentDomain = window.location.hostname;
                this.cookies = [];
                this.filteredCookies = [];
                this.blurSupported = CSS.supports('backdrop-filter: blur(5px)');
                this.isDragging = false;
                this.offsetX = 0;
                this.offsetY = 0;
                this.init();
            }

            init() {
                this.loadCookies();
                this.createUI();
                this.bindEvents();
            }

            loadCookies() {
                this.cookies = [];
                const cookieString = document.cookie;
                if (!cookieString) return;
                cookieString.split(';').forEach(pair => {
                    const [name, ...val] = pair.trim().split('=');
                    if (!name) return;
                    this.cookies.push({
                        name: decodeURIComponent(name),
                        value: decodeURIComponent(val.join('=')),
                        domain: this.currentDomain,
                        path: '/',
                        secure: location.protocol === 'https:'
                    });
                });
                this.filteredCookies = [...this.cookies];
            }

            createUI() {
                if (document.getElementById('cookieToggleBtn')) return;

                const style = document.createElement('style');
                style.textContent = `
                    .cookie-toggle-btn {
                        position: fixed; top: 20px; right: 20px;
                        background: rgba(103,58,183,0.8);
                        color: white; border: none; border-radius: 50%;
                        width: 60px; height: 60px; font-size: 24px;
                        cursor: pointer; z-index: 9999;
                        ${this.blurSupported ? 'backdrop-filter: blur(10px);' : ''}
                        box-shadow: 0 4px 15px rgba(0,0,0,0.3);
                    }
                    .cookie-manager-container {
                        position: fixed;
                        top: 50%; left: 50%;
                        transform: translate(-50%, -50%);
                        width: 90%; max-width: 900px;
                        background: rgba(30,30,46,0.9);
                        color: white; border-radius: 20px;
                        z-index: 10000; padding: 20px;
                        display: none; font-family: sans-serif;
                        ${this.blurSupported ? 'backdrop-filter: blur(10px);' : ''}
                        box-shadow: 0 8px 25px rgba(0,0,0,0.4);
                    }
                    .cookie-header {
                        cursor: move;
                        background: rgba(255,255,255,0.1);
                        padding: 10px;
                        border-radius: 10px;
                        text-align: center;
                        user-select: none;
                    }
                    table { width: 100%; border-collapse: collapse; margin-top: 15px; }
                    th, td { border-bottom: 1px solid rgba(255,255,255,0.2); padding: 8px 10px; text-align: left; }
                    tr:hover { background: rgba(255,255,255,0.05); }
                    .cookie-btn {
                        background: rgba(255,255,255,0.15);
                        border: none; padding: 8px 12px; border-radius: 6px;
                        color: white; cursor: pointer; margin-left: 5px;
                    }
                    .cookie-btn:hover { background: rgba(255,255,255,0.25); }
                    .cookie-input {
                        background: rgba(255,255,255,0.1);
                        border: 1px solid rgba(255,255,255,0.3);
                        color: white; padding: 8px; border-radius: 6px; width: 100%;
                    }
                `;
                document.head.appendChild(style);

                this.toggleBtn = document.createElement('button');
                this.toggleBtn.id = 'cookieToggleBtn';
                this.toggleBtn.className = 'cookie-toggle-btn';
                this.toggleBtn.textContent = '🍪';
                document.body.appendChild(this.toggleBtn);

                this.container = document.createElement('div');
                this.container.className = 'cookie-manager-container';
                this.container.innerHTML = `
                    <div class="cookie-header"><h2 style="margin:0;">Cookie Manager</h2></div>
                    <div>
                        <input id="cookieSearchInput" class="cookie-input" placeholder="Search cookies...">
                        <button id="cookieAddBtn" class="cookie-btn">Add</button>
                        <button id="cookieRefreshBtn" class="cookie-btn">Refresh</button>
                        <button id="cookieDeleteAllBtn" class="cookie-btn">Delete All</button>
                    </div>
                    <table>
                        <thead><tr><th>Name</th><th>Value</th><th>Actions</th></tr></thead>
                        <tbody id="cookieListBody"></tbody>
                    </table>
                `;
                document.body.appendChild(this.container);
                this.makeMovable(this.container.querySelector('.cookie-header'));
            }

            makeMovable(header) {
                header.addEventListener('mousedown', (e) => this.startDrag(e));
                header.addEventListener('touchstart', (e) => this.startDrag(e.touches[0]));
                document.addEventListener('mousemove', (e) => this.onDrag(e));
                document.addEventListener('touchmove', (e) => this.onDrag(e.touches[0]));
                document.addEventListener('mouseup', () => this.endDrag());
                document.addEventListener('touchend', () => this.endDrag());
            }

            startDrag(e) {
                e.preventDefault();
                this.isDragging = true;
                const rect = this.container.getBoundingClientRect();
                this.offsetX = e.clientX - rect.left;
                this.offsetY = e.clientY - rect.top;
            }

            onDrag(e) {
                if (!this.isDragging) return;
                const x = e.clientX - this.offsetX;
                const y = e.clientY - this.offsetY;
                this.container.style.left = `${x}px`;
                this.container.style.top = `${y}px`;
                this.container.style.transform = `translate(0,0)`; // cancel center transform
            }

            endDrag() {
                this.isDragging = false;
            }

            bindEvents() {
                this.toggleBtn.onclick = () => this.toggleManager();
                document.getElementById('cookieAddBtn').onclick = () => this.addCookiePrompt();
                document.getElementById('cookieRefreshBtn').onclick = () => this.refreshCookies();
                document.getElementById('cookieDeleteAllBtn').onclick = () => this.deleteAllCookies();
                document.getElementById('cookieSearchInput').oninput = () => this.filterCookies();
            }

            toggleManager() {
                const visible = this.container.style.display === 'block';
                this.container.style.display = visible ? 'none' : 'block';
                if (!visible) this.refreshCookies();
            }

            refreshCookies() {
                this.loadCookies();
                this.renderCookies();
            }

            filterCookies() {
                const query = document.getElementById('cookieSearchInput').value.toLowerCase();
                this.filteredCookies = this.cookies.filter(c =>
                    c.name.toLowerCase().includes(query) || c.value.toLowerCase().includes(query)
                );
                this.renderCookies();
            }

            renderCookies() {
                const tbody = document.getElementById('cookieListBody');
                tbody.innerHTML = '';
                if (this.filteredCookies.length === 0) {
                    tbody.innerHTML = `<tr><td colspan="3" style="text-align:center;">No cookies found</td></tr>`;
                    return;
                }

                this.filteredCookies.forEach((cookie, i) => {
                    const tr = document.createElement('tr');
                    tr.innerHTML = `
                        <td>${this.escape(cookie.name)}</td>
                        <td title="${this.escape(cookie.value)}">${this.escape(cookie.value).slice(0, 40)}${cookie.value.length > 40 ? '…' : ''}</td>
                        <td>
                            <button class="cookie-btn" data-i="${i}" data-action="edit">✎</button>
                            <button class="cookie-btn" data-i="${i}" data-action="del">×</button>
                        </td>
                    `;
                    tbody.appendChild(tr);
                });

                tbody.querySelectorAll('button').forEach(btn =>
                    btn.onclick = () => {
                        const idx = +btn.dataset.i;
                        const action = btn.dataset.action;
                        if (action === 'del') this.deleteCookie(this.filteredCookies[idx].name);
                        if (action === 'edit') this.editCookiePrompt(this.filteredCookies[idx]);
                    }
                );
            }

            addCookiePrompt() {
                const name = prompt('Cookie name:');
                if (!name) return;
                const value = prompt('Cookie value:') || '';
                document.cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}; path=/`;
                this.refreshCookies();
            }

            editCookiePrompt(cookie) {
                const newVal = prompt(`Edit value for ${cookie.name}:`, cookie.value);
                if (newVal === null) return;
                document.cookie = `${encodeURIComponent(cookie.name)}=${encodeURIComponent(newVal)}; path=/`;
                this.refreshCookies();
            }

            deleteCookie(name) {
                document.cookie = `${encodeURIComponent(name)}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`;
                this.refreshCookies();
            }

            deleteAllCookies() {
                this.cookies.forEach(c => this.deleteCookie(c.name));
            }

            escape(str) {
                return str.replace(/[&<>"']/g, m => ({
                    '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;'
                }[m]));
            }
        }

        new CookieManager();
    });
})();