Greasy Fork

Greasy Fork is available in English.

网页背景调节器(Webpage Background Adjuster)

调整网页下方背景的透明度、颜色遮罩、模糊度,并支持上传本地图片作为背景。/n Adjust the transparency, color overlay, and blur of the webpage's lower background, and support uploading local images as the background.

当前为 2025-03-06 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         网页背景调节器(Webpage Background Adjuster)
// @namespace    http://tampermonkey.net/
// @version      1.62
// @description  调整网页下方背景的透明度、颜色遮罩、模糊度,并支持上传本地图片作为背景。/n Adjust the transparency, color overlay, and blur of the webpage's lower background, and support uploading local images as the background.
// @author       Grey333
// @match        *://*/*
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// @grant        GM_registerMenuCommand
// ==/UserScript==


(function() {
    'use strict';

    // 原始默认设置
    const defaultSettings = {
        transparency: 1,
        blur: 0,
        overlayColor: 'transparent',
        overlayOpacity: 0,
        forceMode: false,
        disableOnThisPage: false,
        backgroundImage: null,
        theme: 'light',
        language: 'zh' // 默认中文
    };

    // 按域名加载当前页面设置
    const domainKey = `settings_${location.hostname}`;
    let settings = JSON.parse(GM_getValue(domainKey, JSON.stringify(defaultSettings)));
    // 确保 language 属性存在
    if (!settings.language) settings.language = 'zh';

    // 全局存储自定义默认配置
    const customDefaultKey = 'customDefaultSettings';
    let customDefaultSettings = JSON.parse(GM_getValue(customDefaultKey, null));
    if (!customDefaultSettings) {
        customDefaultSettings = { ...defaultSettings };
        GM_setValue(customDefaultKey, JSON.stringify(customDefaultSettings));
    }

    // 如果该页面不生效,直接返回
    GM_registerMenuCommand(settings.disableOnThisPage ? '此页面生效/enable in this page' : '此页面禁用/disable in this page', () => {
        settings.disableOnThisPage = !settings.disableOnThisPage;
        GM_setValue(domainKey, JSON.stringify(settings));
        location.reload();
    });

    GM_registerMenuCommand('设置/setting', () => {
        if (!settings.disableOnThisPage) {
            panel.style.display = 'block';
        }
    });

    if (settings.disableOnThisPage) {
        return;
    }

    // 创建样式元素
    const style = document.createElement('style');
    style.id = 'background-adjuster-style';
    document.head.appendChild(style);

    // 设置初始 CSS 变量
    function applySettings() {
        document.body.style.setProperty('--base-transparency', 1 - settings.transparency);
        document.body.style.setProperty('--base-blur', settings.blur === 0 ? 'none' : `blur(${settings.blur}px)`);
        document.body.style.setProperty('--overlay-color', settings.overlayColor);
        document.body.style.setProperty('--overlay-opacity', 1 - settings.overlayOpacity);
    }

    // 添加默认背景层
    const bgLayer = document.createElement('div');
    bgLayer.id = 'background-layer';
    bgLayer.style.cssText = `
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        z-index: -2;
        background: ${settings.theme === 'dark' ? '#000000' : '#ffffff'};
        opacity: var(--base-transparency);
        filter: var(--base-blur);
        pointer-events: none;
    `;
    document.body.insertBefore(bgLayer, document.body.firstChild);

    // 添加颜色遮罩层
    const overlayLayer = document.createElement('div');
    overlayLayer.id = 'overlay-layer';
    overlayLayer.style.cssText = `
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        z-index: -1;
        background: var(--overlay-color);
        opacity: var(--overlay-opacity);
        pointer-events: none;
    `;
    document.body.insertBefore(overlayLayer, document.body.firstChild.nextSibling);

    // 中英文文本映射表
    const textMap = {
        zh: {
            title: '背景调节器',
            transparency: '透明度',
            blur: '模糊度',
            overlayColor: '颜色遮罩',
            overlayOpacity: '遮罩透明度',
            backgroundImage: '背景图片',
            forceMode: '强制模式',
            theme: '主题',
            language: '语言',
            saveDefault: '保存为默认配置',
            applyDefault: '应用默认配置',
            reset: '重置',
            close: '关闭'
        },
        en: {
            title: 'Background Adjuster',
            transparency: 'Transparency',
            blur: 'Blur',
            overlayColor: 'Overlay Color',
            overlayOpacity: 'Overlay Opacity',
            backgroundImage: 'Background Image',
            forceMode: 'Force Mode',
            theme: 'Theme',
            language: 'Language',
            saveDefault: 'Save as Default',
            applyDefault: 'Apply Default',
            reset: 'Reset',
            close: 'Close'
        }
    };

    // 添加优化后的 CSS 样式
    style.textContent = `
        body {
            position: relative;
            background: transparent !important;
        }
        #background-layer {
            position: fixed;
            top: 0;
            left: 0;
            width: 100vw;
            height: 100vh;
            z-index: -2;
            opacity: var(--base-transparency);
            filter: var(--base-blur);
            pointer-events: none;
        }
        #overlay-layer {
            position: fixed;
            top: 0;
            left: 0;
            width: 100vw;
            height: 100vh;
            z-index: -1;
            background: var(--overlay-color);
            opacity: var(--overlay-opacity);
            pointer-events: none;
        }
        body > *:not(#background-layer):not(#overlay-layer):not(#bg-adjuster-panel) {
            position: relative;
            z-index: 0;
        }
        #bg-adjuster-panel {
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background: ${settings.theme === 'dark' ? '#000000' : '#fafafa'};
            border: none;
            padding: 25px;
            border-radius: 15px;
            box-shadow: 0 8px 25px rgba(0,0,0,0.2);
            z-index: 10000;
            display: none;
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
            width: 300px;
            max-height: 85vh;
            overflow-y: auto;
            color: ${settings.theme === 'dark' ? '#ffffff' : '#333'};
        }
        #bg-adjuster-panel label {
            display: flex;
            align-items: center;
            margin: 15px 0;
            font-size: 14px;
            color: ${settings.theme === 'dark' ? '#ffffff' : '#333'};
        }
        #bg-adjuster-panel input[type="range"] {
            flex: 1;
            margin: 0 10px;
            height: 10px;
            border-radius: 8px;
            position: relative;
            outline: none;
            cursor: pointer;
            appearance: none;
        }
        #bg-adjuster-panel input[type="range"]::-webkit-slider-runnable-track {
            height: 10px;
            border-radius: 8px;
        }
        #bg-adjuster-panel input[type="range"]::-moz-range-track {
            height: 10px;
            border-radius: 8px;
        }
        #bg-adjuster-panel input[type="range"]::-webkit-slider-thumb {
            appearance: none;
            width: 20px;
            height: 20px;
            border-radius: 50%;
            border: 2px solid ${settings.theme === 'dark' ? '#000000' : '#fff'};
            cursor: pointer;
            box-shadow: 0 3px 8px rgba(0,0,0,0.2);
            margin-top: -5px;
            background: ${settings.theme === 'dark' ? '#ffffff' : '#4a90e2'};
        }
        #bg-adjuster-panel input[type="range"]::-moz-range-thumb {
            width: 20px;
            height: 20px;
            border-radius: 50%;
            border: 2px solid ${settings.theme === 'dark' ? '#000000' : '#fff'};
            cursor: pointer;
            box-shadow: 0 3px 8px rgba(0,0,0,0.2);
            background: ${settings.theme === 'dark' ? '#ffffff' : '#4a90e2'};
        }
        #bg-adjuster-panel .percentage {
            width: 40px;
            text-align: right;
            font-size: 12px;
            color: ${settings.theme === 'dark' ? '#cccccc' : '#666'};
        }
        #bg-adjuster-panel .color-btn {
            width: 26px;
            height: 26px;
            border-radius: 50%;
            border: 2px solid ${settings.theme === 'dark' ? '#ffffff' : '#ddd'};
            cursor: pointer;
            margin-right: 10px;
            transition: transform 0.2s, box-shadow 0.2s;
        }
        #bg-adjuster-panel .color-btn:hover {
            transform: scale(1.15);
            box-shadow: 0 0 6px rgba(0,0,0,0.3);
        }
        #bg-adjuster-panel .color-btn:active {
            transform: scale(1.05);
            box-shadow: 0 0 8px rgba(0,0,0,0.4);
        }
        #bg-adjuster-panel #custom-color {
            width: 40px;
            height: 40px;
            padding: 0;
            border: 2px solid ${settings.theme === 'dark' ? '#ffffff' : '#ddd'};
            border-radius: 12px;
            cursor: pointer;
            margin-left: auto;
            box-shadow: 0 2px 6px rgba(0,0,0,0.1);
        }
        #bg-adjuster-panel button {
            padding: 8px 14px;
            cursor: pointer;
            border-radius: 10px;
            border: none;
            font-size: 14px;
            transition: background 0.2s;
        }
        #bg-image-label {
            display: block;
            margin: 15px 0;
            font-size: 14px;
        }
        #bg-image-label input[type="file"] {
            width: 100%;
            font-size: 12px;
            margin-top: 8px;
            padding: 6px;
            border: 1px solid ${settings.theme === 'dark' ? '#ffffff' : '#ddd'};
            border-radius: 8px;
            background: ${settings.theme === 'dark' ? '#333333' : '#fff'};
            color: ${settings.theme === 'dark' ? '#ffffff' : '#333'};
        }
        #overlay-opacity-section {
            display: none;
        }
        #force-mode-label, #theme-label, #language-label {
            font-size: 12px;
            color: ${settings.theme === 'dark' ? '#ffffff' : '#333'};
        }
        #theme-container {
            position: absolute;
            top: 10px;
            left: 10px;
            display: flex;
            align-items: center;
        }
        #language-container {
            position: absolute;
            top: 10px;
            right: 10px;
            display: flex;
            align-items: center;
        }
        #theme-select, #language-select {
            margin-left: 5px;
            padding: 3px;
            border-radius: 5px;
            font-size: 12px;
            background: ${settings.theme === 'dark' ? '#333333' : '#fff'};
            color: ${settings.theme === 'dark' ? '#ffffff' : '#333'};
            border: 1px solid ${settings.theme === 'dark' ? '#ffffff' : '#ddd'};
        }
    `;

    // 创建 UI 面板
    const panel = document.createElement('div');
    panel.id = 'bg-adjuster-panel';
    document.body.appendChild(panel);

    // UI 面板初始内容(静态,避免依赖 textMap)
    panel.innerHTML = `
        <div id="theme-container">
            <label id="theme-label">主题:
                <select id="theme-select">
                    <option value="light" ${settings.theme === 'light' ? 'selected' : ''}>Light</option>
                    <option value="dark" ${settings.theme === 'dark' ? 'selected' : ''}>Dark</option>
                </select>
            </label>
        </div>
        <div id="language-container">
            <label id="language-label">语言:
                <select id="language-select">
                    <option value="zh" ${settings.language === 'zh' ? 'selected' : ''}>中文</option>
                    <option value="en" ${settings.language === 'en' ? 'selected' : ''}>English</option>
                </select>
            </label>
        </div>
        <h3 style="margin: 20px 0; font-size: 16px; text-align: center; color: ${settings.theme === 'dark' ? '#ffffff' : '#333'};">背景调节器</h3>
        <label id="transparency-label">透明度: <input type="range" min="0" max="1" step="0.01" id="transparency-slider" value="${settings.transparency}"><span class="percentage">${Math.round(settings.transparency * 100)}%</span></label>
        <label id="blur-label">模糊度: <input type="range" min="0" max="20" step="1" id="blur-slider" value="${settings.blur}"><span class="percentage">${Math.round((settings.blur / 20) * 100)}%</span></label>
        <div id="color-overlay-section">
            <label id="overlay-color-label" style="display: flex; align-items: center;">颜色遮罩:
                <button class="color-btn" id="none-btn" title="无"></button>
                <button class="color-btn" id="yellow-btn" title="黄色"></button>
                <button class="color-btn" id="green-btn" title="绿色"></button>
                <input type="color" id="custom-color" value="${settings.overlayColor === 'transparent' ? '#ffffff' : settings.overlayColor}" title="自定义颜色">
            </label>
        </div>
        <div id="overlay-opacity-section">
            <label id="overlay-opacity-label">遮罩透明度: <input type="range" min="0" max="1" step="0.01" id="overlay-opacity" value="${settings.overlayOpacity}"><span class="percentage">${Math.round(settings.overlayOpacity * 100)}%</span></label>
        </div>
        <label id="bg-image-label">背景图片:<input type="file" id="bg-image-input" accept="image/*"></label>
        <label id="force-mode-label" style="display: flex; align-items: center;">强制模式:
            <input type="checkbox" id="force-mode-switch" ${settings.forceMode ? 'checked' : ''}>
        </label>
        <button id="save-default-btn" style="width: 100%; margin-top: 15px; background: #28a745; color: white;">保存为默认配置</button>
        <button id="apply-default-btn" style="width: 100%; margin-top: 10px; background: #17a2b8; color: white;">应用默认配置</button>
        <button id="reset-btn" style="width: 100%; margin-top: 10px;">重置</button>
        <button id="close-btn" style="width: 100%; margin-top: 10px;">关闭</button>
    `;

    // 获取 UI 元素
    const transparencySlider = document.getElementById('transparency-slider');
    const blurSlider = document.getElementById('blur-slider');
    const noneBtn = document.getElementById('none-btn');
    const yellowBtn = document.getElementById('yellow-btn');
    const greenBtn = document.getElementById('green-btn');
    const customColor = document.getElementById('custom-color');
    const overlayOpacity = document.getElementById('overlay-opacity');
    const overlayOpacitySection = document.getElementById('overlay-opacity-section');
    const bgImageInput = document.getElementById('bg-image-input');
    const saveDefaultBtn = document.getElementById('save-default-btn');
    const applyDefaultBtn = document.getElementById('apply-default-btn');
    const resetBtn = document.getElementById('reset-btn');
    const closeBtn = document.getElementById('close-btn');
    const forceModeSwitch = document.getElementById('force-mode-switch');
    const themeSelect = document.getElementById('theme-select');
    const languageSelect = document.getElementById('language-select');
    const backgroundLayer = document.getElementById('background-layer');
    const overlayLayerElement = document.getElementById('overlay-layer');
    const transparencyPercentage = transparencySlider.nextElementSibling;
    const blurPercentage = blurSlider.nextElementSibling;
    const overlayOpacityPercentage = overlayOpacity.nextElementSibling;

    // 更新设置和 UI
    function updateSettings() {
        settings.transparency = parseFloat(transparencySlider.value);
        settings.blur = parseInt(blurSlider.value);
        settings.overlayColor = customColor.value === '#ffffff' && overlayOpacity.value == 0 ? 'transparent' : customColor.value;
        settings.overlayOpacity = parseFloat(overlayOpacity.value);
        settings.forceMode = forceModeSwitch.checked;
        settings.theme = themeSelect.value;
        settings.language = languageSelect.value;

        applySettings();
        backgroundLayer.style.display = 'block';
        overlayLayerElement.style.display = 'block';
        document.body.style.setProperty('background', 'transparent', 'important');

        // 更新背景层颜色或图片
        if (settings.backgroundImage) {
            backgroundLayer.style.backgroundImage = `url(${settings.backgroundImage})`;
            backgroundLayer.style.backgroundSize = 'cover';
            backgroundLayer.style.backgroundRepeat = 'no-repeat';
            backgroundLayer.style.backgroundColor = 'transparent';
        } else {
            backgroundLayer.style.backgroundImage = 'none';
            backgroundLayer.style.backgroundColor = settings.theme === 'dark' ? '#000000' : '#ffffff';
        }

        // 更新面板背景和文字颜色
        panel.style.background = settings.theme === 'dark' ? '#000000' : '#fafafa';
        panel.style.color = settings.theme === 'dark' ? '#ffffff' : '#333';
        const labels = panel.querySelectorAll('label');
        labels.forEach(label => label.style.color = settings.theme === 'dark' ? '#ffffff' : '#333');
        const h3 = panel.querySelector('h3');
        h3.style.color = settings.theme === 'dark' ? '#ffffff' : '#333';
        const percentages = panel.querySelectorAll('.percentage');
        percentages.forEach(p => p.style.color = settings.theme === 'dark' ? '#cccccc' : '#666');
        bgImageInput.style.background = settings.theme === 'dark' ? '#333333' : '#fff';
        bgImageInput.style.color = settings.theme === 'dark' ? '#ffffff' : '#333';
        bgImageInput.style.borderColor = settings.theme === 'dark' ? '#ffffff' : '#ddd';
        themeSelect.style.background = settings.theme === 'dark' ? '#333333' : '#fff';
        themeSelect.style.color = settings.theme === 'dark' ? '#ffffff' : '#333';
        themeSelect.style.borderColor = settings.theme === 'dark' ? '#ffffff' : '#ddd';
        languageSelect.style.background = settings.theme === 'dark' ? '#333333' : '#fff';
        languageSelect.style.color = settings.theme === 'dark' ? '#ffffff' : '#333';
        languageSelect.style.borderColor = settings.theme === 'dark' ? '#ffffff' : '#ddd';

        // 更新面板文字
        const lang = settings.language || 'zh'; // 确保 language 有效
        h3.textContent = textMap[lang].title;
        document.getElementById('transparency-label').childNodes[0].textContent = `${textMap[lang].transparency}: `;
        document.getElementById('blur-label').childNodes[0].textContent = `${textMap[lang].blur}: `;
        document.getElementById('overlay-color-label').childNodes[0].textContent = `${textMap[lang].overlayColor}: `;
        document.getElementById('overlay-opacity-label').childNodes[0].textContent = `${textMap[lang].overlayOpacity}: `;
        document.getElementById('bg-image-label').childNodes[0].textContent = `${textMap[lang].backgroundImage}: `;
        document.getElementById('force-mode-label').childNodes[0].textContent = `${textMap[lang].forceMode}: `;
        document.getElementById('theme-label').childNodes[0].textContent = `${textMap[lang].theme}: `;
        document.getElementById('language-label').childNodes[0].textContent = `${textMap[lang].language}: `;
        saveDefaultBtn.textContent = textMap[lang].saveDefault;
        applyDefaultBtn.textContent = textMap[lang].applyDefault;
        resetBtn.textContent = textMap[lang].reset;
        closeBtn.textContent = textMap[lang].close;
        noneBtn.title = textMap[lang].language === '中文' ? '无' : 'None';
        yellowBtn.title = textMap[lang].language === '中文' ? '黄色' : 'Yellow';
        greenBtn.title = textMap[lang].language === '中文' ? '绿色' : 'Green';
        customColor.title = textMap[lang].language === '中文' ? '自定义颜色' : 'Custom Color';

        if (settings.forceMode) {
            forceModeSwitch.style.setProperty('background', forceModeSwitch.checked ? '#4a90e2' : '#999', 'important');
            noneBtn.style.setProperty('background', 'transparent', 'important');
            noneBtn.style.setProperty('border', `2px dashed ${settings.theme === 'dark' ? '#ffffff' : '#ccc'}`, 'important');
            yellowBtn.style.setProperty('background', '#ffff00', 'important');
            greenBtn.style.setProperty('background', '#00ff00', 'important');
            resetBtn.style.setProperty('background', '#ff3b30', 'important');
            resetBtn.style.setProperty('color', 'white', 'important');
            applyDefaultBtn.style.setProperty('background', '#17a2b8', 'important');
            applyDefaultBtn.style.setProperty('color', 'white', 'important');
            saveDefaultBtn.style.setProperty('background', '#28a745', 'important');
            saveDefaultBtn.style.setProperty('color', 'white', 'important');
            closeBtn.style.setProperty('background', '#4a90e2', 'important');
            closeBtn.style.setProperty('color', 'white', 'important');
            transparencySlider.style.setProperty('background', `linear-gradient(to right, #4a90e2 ${settings.transparency * 100}%, #e0e0e0 ${settings.transparency * 100}%)`, 'important');
            blurSlider.style.setProperty('background', `linear-gradient(to right, #4a90e2 ${(settings.blur / 20) * 100}%, #e0e0e0 ${(settings.blur / 20) * 100}%)`, 'important');
            overlayOpacity.style.setProperty('background', `linear-gradient(to right, #4a90e2 ${settings.overlayOpacity * 100}%, #e0e0e0 ${settings.overlayOpacity * 100}%)`, 'important');

            style.textContent += `
                body *:not(#bg-adjuster-panel):not(#background-layer):not(#overlay-layer):not(input):not(button):not(select):not(textarea):not(a) {
                    background-color: transparent !important;
                    background-image: none !important;
                }
            `;
        } else {
            forceModeSwitch.style.setProperty('background', forceModeSwitch.checked ? '#4a90e2' : '#999', 'important');
            noneBtn.style.setProperty('background', 'transparent', 'important');
            noneBtn.style.setProperty('border', `2px dashed ${settings.theme === 'dark' ? '#ffffff' : '#ccc'}`, 'important');
            yellowBtn.style.setProperty('background', '#ffff00', 'important');
            greenBtn.style.setProperty('background', '#00ff00', 'important');
            resetBtn.style.setProperty('background', '#ff3b30', 'important');
            resetBtn.style.setProperty('color', 'white', 'important');
            applyDefaultBtn.style.setProperty('background', '#17a2b8', 'important');
            applyDefaultBtn.style.setProperty('color', 'white', 'important');
            saveDefaultBtn.style.setProperty('background', '#28a745', 'important');
            saveDefaultBtn.style.setProperty('color', 'white', 'important');
            closeBtn.style.setProperty('background', '#4a90e2', 'important');
            closeBtn.style.setProperty('color', 'white', 'important');
            transparencySlider.style.setProperty('background', `linear-gradient(to right, #4a90e2 ${settings.transparency * 100}%, #e0e0e0 ${settings.transparency * 100}%)`, 'important');
            blurSlider.style.setProperty('background', `linear-gradient(to right, #4a90e2 ${(settings.blur / 20) * 100}%, #e0e0e0 ${(settings.blur / 20) * 100}%)`, 'important');
            overlayOpacity.style.setProperty('background', `linear-gradient(to right, #4a90e2 ${settings.overlayOpacity * 100}%, #e0e0e0 ${settings.overlayOpacity * 100}%)`, 'important');

            style.textContent = style.textContent.replace(/body \*:not\(#bg-adjuster-panel\):not\(#background-layer\):not\(#overlay-layer\):not\(input\):not\(button\):not\(select\):not\(textarea\):not\(a\) {[^}]*}/g, '');
        }

        overlayOpacitySection.style.display = settings.overlayColor === 'transparent' ? 'none' : 'block';

        GM_setValue(domainKey, JSON.stringify(settings));
    }

    // 为开关和滑块添加事件监听
    forceModeSwitch.addEventListener('change', updateSettings);
    themeSelect.addEventListener('change', updateSettings);
    languageSelect.addEventListener('change', updateSettings);
    transparencySlider.addEventListener('input', updateSettings);
    blurSlider.addEventListener('input', updateSettings);
    overlayOpacity.addEventListener('input', updateSettings);
    customColor.addEventListener('change', updateSettings);

    // 为颜色按钮添加事件监听
    noneBtn.addEventListener('click', () => {
        customColor.value = '#ffffff';
        overlayOpacity.value = 0;
        updateSettings();
    });
    yellowBtn.addEventListener('click', () => {
        customColor.value = '#ffff00';
        if (settings.overlayOpacity === 0) overlayOpacity.value = 0;
        updateSettings();
    });
    greenBtn.addEventListener('click', () => {
        customColor.value = '#00ff00';
        if (settings.overlayOpacity === 0) overlayOpacity.value = 0;
        updateSettings();
    });

    // 处理背景图片上传
    bgImageInput.addEventListener('change', function() {
        const file = this.files[0];
        if (file) {
            const reader = new FileReader();
            reader.onload = function(e) {
                settings.backgroundImage = e.target.result;
                backgroundLayer.style.backgroundImage = `url(${settings.backgroundImage})`;
                backgroundLayer.style.backgroundSize = 'cover';
                backgroundLayer.style.backgroundRepeat = 'no-repeat';
                backgroundLayer.style.backgroundColor = 'transparent';
                updateSettings();
            };
            reader.readAsDataURL(file);
        }
    });

    // 保存为默认配置按钮功能
    saveDefaultBtn.addEventListener('click', () => {
        customDefaultSettings = { ...settings };
        GM_setValue(customDefaultKey, JSON.stringify(customDefaultSettings));
        alert(settings.language === 'zh' ? '已保存当前设置为默认配置!' : 'Current settings saved as default!');
    });

    // 应用默认配置按钮功能
    applyDefaultBtn.addEventListener('click', () => {
        settings.transparency = customDefaultSettings.transparency;
        settings.blur = customDefaultSettings.blur;
        settings.overlayColor = customDefaultSettings.overlayColor;
        settings.overlayOpacity = customDefaultSettings.overlayOpacity;
        settings.backgroundImage = customDefaultSettings.backgroundImage;
        settings.theme = customDefaultSettings.theme;
        settings.language = customDefaultSettings.language;

        transparencySlider.value = settings.transparency;
        blurSlider.value = settings.blur;
        customColor.value = settings.overlayColor === 'transparent' ? '#ffffff' : settings.overlayColor;
        overlayOpacity.value = settings.overlayOpacity;
        themeSelect.value = settings.theme;
        languageSelect.value = settings.language;

        if (settings.backgroundImage) {
            backgroundLayer.style.backgroundImage = `url(${settings.backgroundImage})`;
            backgroundLayer.style.backgroundSize = 'cover';
            backgroundLayer.style.backgroundRepeat = 'no-repeat';
            backgroundLayer.style.backgroundColor = 'transparent';
        } else {
            backgroundLayer.style.backgroundImage = 'none';
            backgroundLayer.style.backgroundColor = settings.theme === 'dark' ? '#000000' : '#ffffff';
        }

        GM_setValue(domainKey, JSON.stringify(settings));
        transparencyPercentage.textContent = `${Math.round(settings.transparency * 100)}%`;
        blurPercentage.textContent = `${Math.round((settings.blur / 20) * 100)}%`;
        overlayOpacityPercentage.textContent = `${Math.round(settings.overlayOpacity * 100)}%`;
        updateSettings();
    });

    // 重置按钮功能(恢复页面原始状态)
    resetBtn.addEventListener('click', () => {
        backgroundLayer.style.display = 'none';
        overlayLayerElement.style.display = 'none';
        document.body.style.removeProperty('background');
        style.textContent = style.textContent.replace(/body \*:not\(#bg-adjuster-panel\):not\(#background-layer\):not\(#overlay-layer\):not\(input\):not\(button\):not\(select\):not\(textarea\):not\(a\) {[^}]*}/g, '');

        transparencySlider.value = 1;
        blurSlider.value = 0;
        customColor.value = '#ffffff';
        overlayOpacity.value = 0;
        forceModeSwitch.checked = false;
        themeSelect.value = 'light';
        languageSelect.value = settings.language;

        settings.transparency = 1;
        settings.blur = 0;
        settings.overlayColor = 'transparent';
        settings.overlayOpacity = 0;
        settings.forceMode = false;
        settings.backgroundImage = null;
        settings.theme = 'light';

        GM_setValue(domainKey, JSON.stringify(settings));
        transparencyPercentage.textContent = '100%';
        blurPercentage.textContent = '0%';
        overlayOpacityPercentage.textContent = '0%';

        forceModeSwitch.style.removeProperty('background');
        noneBtn.style.removeProperty('background');
        noneBtn.style.removeProperty('border');
        yellowBtn.style.removeProperty('background');
        greenBtn.style.removeProperty('background');
        resetBtn.style.removeProperty('background');
        resetBtn.style.removeProperty('color');
        applyDefaultBtn.style.removeProperty('background');
        applyDefaultBtn.style.removeProperty('color');
        saveDefaultBtn.style.removeProperty('background');
        saveDefaultBtn.style.removeProperty('color');
        closeBtn.style.removeProperty('background');
        closeBtn.style.removeProperty('color');
        transparencySlider.style.removeProperty('background');
        blurSlider.style.removeProperty('background');
        overlayOpacity.style.removeProperty('background');
    });

    // 关闭面板
    closeBtn.addEventListener('click', () => {
        panel.style.display = 'none';
    });

    // 点击面板外关闭
    document.addEventListener('click', (e) => {
        if (!panel.contains(e.target) && panel.style.display === 'block') {
            panel.style.display = 'none';
        }
    });

    // 防止面板内部点击冒泡到外部关闭
    panel.addEventListener('click', (e) => {
        e.stopPropagation();
    });

    // 初始化设置
    updateSettings();
})();