X.com Verified Accounts Customizer

Customize the appearance of verified accounts on X.com with adjustable settings

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @name         X.com Verified Accounts Customizer
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Customize the appearance of verified accounts on X.com with adjustable settings
// @author       dursunator
// @match        *://*.x.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=x.com
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// ==/UserScript==

(function() {
    'use strict';

    const defaultSettings = {
        opacity: 0.5,
        zoom: 0.75,
        enabled: true
    };

    let settings = GM_getValue('verifiedAccountSettings', defaultSettings);

    applySettings();

    GM_registerMenuCommand('Edit Settings', showSettingsPanel);

    function applySettings() {
        const oldStyle = document.getElementById('x-verified-customizer');
        if (oldStyle) {
            oldStyle.remove();
        }

        if (!settings.enabled) return;

        const styleElement = document.createElement('style');
        styleElement.id = 'x-verified-customizer';
        styleElement.innerHTML = `
            article[data-testid="tweet"]:has([data-testid="icon-verified"]) {
                opacity: ${settings.opacity};
                zoom: ${settings.zoom};
            }
        `;
        document.querySelector("head").appendChild(styleElement);
    }

    function showSettingsPanel() {
        if (document.getElementById('x-settings-panel')) return;

        const panel = document.createElement('div');
        panel.id = 'x-settings-panel';
        panel.style.cssText = `
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background-color: #15202B;
            color: #E7E9EA;
            border-radius: 12px;
            padding: 24px;
            z-index: 10000;
            box-shadow: 0 0 20px rgba(0,0,0,0.7);
            min-width: 320px;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
        `;

        const heading = document.createElement('h2');
        heading.textContent = 'Verified Account Settings';
        heading.style.cssText = `
            margin-top: 0;
            color: #1D9BF0;
            border-bottom: 1px solid #38444D;
            padding-bottom: 12px;
            font-size: 20px;
        `;
        panel.appendChild(heading);

        const enabledDiv = document.createElement('div');
        enabledDiv.style.margin = '16px 0';
        enabledDiv.style.display = 'flex';
        enabledDiv.style.alignItems = 'center';
        enabledDiv.style.justifyContent = 'space-between';

        const enabledLabel = document.createElement('label');
        enabledLabel.textContent = 'Enable Feature: ';
        enabledLabel.style.fontWeight = '500';

        const enabledCheckbox = document.createElement('input');
        enabledCheckbox.type = 'checkbox';
        enabledCheckbox.checked = settings.enabled;
        enabledCheckbox.id = 'x-enabled';
        enabledCheckbox.style.transform = 'scale(1.2)';
        enabledCheckbox.style.accentColor = '#1D9BF0';

        enabledDiv.appendChild(enabledLabel);
        enabledDiv.appendChild(enabledCheckbox);
        panel.appendChild(enabledDiv);

        const opacityDiv = document.createElement('div');
        opacityDiv.style.margin = '16px 0';

        const opacityLabel = document.createElement('label');
        opacityLabel.textContent = 'Opacity (0.1 - 1.0): ';
        opacityLabel.style.display = 'block';
        opacityLabel.style.marginBottom = '8px';
        opacityLabel.style.fontWeight = '500';

        const opacitySliderContainer = document.createElement('div');
        opacitySliderContainer.style.display = 'flex';
        opacitySliderContainer.style.alignItems = 'center';

        const opacityInput = document.createElement('input');
        opacityInput.type = 'range';
        opacityInput.min = '0.1';
        opacityInput.max = '1.0';
        opacityInput.step = '0.1';
        opacityInput.value = settings.opacity;
        opacityInput.id = 'x-opacity';
        opacityInput.style.flex = '1';
        opacityInput.style.accentColor = '#1D9BF0';

        const opacityValue = document.createElement('span');
        opacityValue.textContent = settings.opacity;
        opacityValue.style.marginLeft = '10px';
        opacityValue.style.backgroundColor = '#253341';
        opacityValue.style.padding = '4px 8px';
        opacityValue.style.borderRadius = '4px';
        opacityValue.style.minWidth = '36px';
        opacityValue.style.textAlign = 'center';

        opacityInput.addEventListener('input', () => {
            opacityValue.textContent = opacityInput.value;
        });

        opacitySliderContainer.appendChild(opacityInput);
        opacitySliderContainer.appendChild(opacityValue);

        opacityDiv.appendChild(opacityLabel);
        opacityDiv.appendChild(opacitySliderContainer);
        panel.appendChild(opacityDiv);

        const zoomDiv = document.createElement('div');
        zoomDiv.style.margin = '16px 0';

        const zoomLabel = document.createElement('label');
        zoomLabel.textContent = 'Size Ratio (0.5 - 1.0): ';
        zoomLabel.style.display = 'block';
        zoomLabel.style.marginBottom = '8px';
        zoomLabel.style.fontWeight = '500';

        const zoomSliderContainer = document.createElement('div');
        zoomSliderContainer.style.display = 'flex';
        zoomSliderContainer.style.alignItems = 'center';

        const zoomInput = document.createElement('input');
        zoomInput.type = 'range';
        zoomInput.min = '0.5';
        zoomInput.max = '1.0';
        zoomInput.step = '0.05';
        zoomInput.value = settings.zoom;
        zoomInput.id = 'x-zoom';
        zoomInput.style.flex = '1';
        zoomInput.style.accentColor = '#1D9BF0';

        const zoomValue = document.createElement('span');
        zoomValue.textContent = settings.zoom;
        zoomValue.style.marginLeft = '10px';
        zoomValue.style.backgroundColor = '#253341';
        zoomValue.style.padding = '4px 8px';
        zoomValue.style.borderRadius = '4px';
        zoomValue.style.minWidth = '36px';
        zoomValue.style.textAlign = 'center';

        zoomInput.addEventListener('input', () => {
            zoomValue.textContent = zoomInput.value;
        });

        zoomSliderContainer.appendChild(zoomInput);
        zoomSliderContainer.appendChild(zoomValue);

        zoomDiv.appendChild(zoomLabel);
        zoomDiv.appendChild(zoomSliderContainer);
        panel.appendChild(zoomDiv);

        const buttonsDiv = document.createElement('div');
        buttonsDiv.style.cssText = `
            display: flex;
            justify-content: space-between;
            margin-top: 24px;
        `;

        const saveButton = document.createElement('button');
        saveButton.textContent = 'Save';
        saveButton.style.cssText = `
            background-color: #1D9BF0;
            color: white;
            border: none;
            padding: 10px 18px;
            border-radius: 20px;
            cursor: pointer;
            font-weight: bold;
            transition: background-color 0.2s;
        `;
        saveButton.addEventListener('mouseover', () => {
            saveButton.style.backgroundColor = '#1A8CD8';
        });
        saveButton.addEventListener('mouseout', () => {
            saveButton.style.backgroundColor = '#1D9BF0';
        });

        const cancelButton = document.createElement('button');
        cancelButton.textContent = 'Cancel';
        cancelButton.style.cssText = `
            background-color: #273340;
            color: #E7E9EA;
            border: none;
            padding: 10px 18px;
            border-radius: 20px;
            cursor: pointer;
            font-weight: bold;
            transition: background-color 0.2s;
        `;
        cancelButton.addEventListener('mouseover', () => {
            cancelButton.style.backgroundColor = '#323F4D';
        });
        cancelButton.addEventListener('mouseout', () => {
            cancelButton.style.backgroundColor = '#273340';
        });

        const resetButton = document.createElement('button');
        resetButton.textContent = 'Reset';
        resetButton.style.cssText = `
            background-color: #F4212E;
            color: white;
            border: none;
            padding: 10px 18px;
            border-radius: 20px;
            cursor: pointer;
            font-weight: bold;
            transition: background-color 0.2s;
        `;
        resetButton.addEventListener('mouseover', () => {
            resetButton.style.backgroundColor = '#E0202B';
        });
        resetButton.addEventListener('mouseout', () => {
            resetButton.style.backgroundColor = '#F4212E';
        });

        buttonsDiv.appendChild(resetButton);
        buttonsDiv.appendChild(cancelButton);
        buttonsDiv.appendChild(saveButton);
        panel.appendChild(buttonsDiv);

        const overlay = document.createElement('div');
        overlay.style.cssText = `
            position: fixed;
            top: 0;
            left: 0;
            right: 0;
            bottom: 0;
            background-color: rgba(0,0,0,0.7);
            z-index: 9999;
        `;

        saveButton.addEventListener('click', () => {
            settings = {
                opacity: parseFloat(opacityInput.value),
                zoom: parseFloat(zoomInput.value),
                enabled: enabledCheckbox.checked
            };

            GM_setValue('verifiedAccountSettings', settings);
            applySettings();

            overlay.remove();
            panel.remove();
        });

        cancelButton.addEventListener('click', () => {
            overlay.remove();
            panel.remove();
        });

        resetButton.addEventListener('click', () => {
            opacityInput.value = defaultSettings.opacity;
            opacityValue.textContent = defaultSettings.opacity;

            zoomInput.value = defaultSettings.zoom;
            zoomValue.textContent = defaultSettings.zoom;

            enabledCheckbox.checked = defaultSettings.enabled;
        });

        document.body.appendChild(overlay);
        document.body.appendChild(panel);
    }

    const observer = new MutationObserver(() => {
        applySettings();
    });

    observer.observe(document.body, {
        childList: true,
        subtree: true
    });
})();