Misskey服务器跳转

Misskey增强工具,支持自定义服务器跳转、按钮颜色自定义(默认自动识别主题色),自带设置菜单,更多设置项请查看源码(有中文标注)

// ==UserScript==
// @name         Misskey服务器跳转
// @namespace    https://github.com/YFTree
// @version      1.0
// @description  Misskey增强工具,支持自定义服务器跳转、按钮颜色自定义(默认自动识别主题色),自带设置菜单,更多设置项请查看源码(有中文标注)
// @author       YFTree
// @match        *misskey.io/*
// @match        *nya.one/*
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @grant        GM_addStyle
// @license      MIT
// @compatible    edge
// @compatible    chrome
// ==/UserScript==

(function () {
    'use strict';

    // 添加全局样式
    GM_addStyle(`
        /* 基础按钮样式 */
        .modern-button {
            padding: 12px 24px;
            border: none;
            border-radius: 8px;
            cursor: pointer;
            font-weight: 500;
            transition: all 0.2s ease;
            display: inline-flex;
            align-items: center;
            gap: 8px;
            box-shadow: 1px 2px 4px rgba(0,0,0,0.1);
            font-family: system-ui, -apple-system, sans-serif;
            color: black;
        }

        /* 设置面板样式 */
        .settings-panel {
            position: fixed;
            top: 50%;  /* 设置面板默认顶部距离 */
            left: 50%;  /* 设置面板默认左边距离 */
            transform: translate(-50%, -50%);
            padding: 24px;
            border: 1px solid var(--border-color);
            border-radius: 12px;
            box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
            z-index: 99999; /* 设置面板默认堆叠顺序 */
            display: none;
            width: min(80vw, 300px);
            background: var(--bg-color);
            color: var(--text-color);
        }

        /* 设置项网格布局 */
        .settings-grid {
            display: grid;
            grid-template-columns: repeat(2, 1fr);
            gap: 16px;
            margin: 16px 0;
        }

        /* 输入组样式 */
        .settings-input-group label {
            display: block;
            margin-bottom: 6px;
            font-size: 0.9em;
            color: var(--text-secondary);
        }

        /* 输入框基础样式 */
        .settings-input {
            width: 100%;
            padding: 8px 12px;
            border-radius: 6px;
            border: 1px solid var(--border-color);
            background: var(--input-bg);
            color: var(--text-color);
            transition: all 0.2s ease;
            box-sizing: border-box;
        }

        /* 输入框聚焦状态 */
        .settings-input:focus {
            outline: none;
            border-color: var(--accent-color);
            box-shadow: 0 0 0 2px var(--accent-color-20);
        }

        /* 保存按钮样式 */
        .save-button {
            background: linear-gradient(135deg, #4CAF50, #66BB6A);
            color: white;
        }

        /* 重置按钮样式 */
        .reset-button {
            background: linear-gradient(135deg, #6b6bff, #8787ff);
            color: white;
        }

        /* 二级菜单样式 */
        .submenu {
            display: none;
            margin-top: 10px;
        }

        /* 二级菜单标题样式 */
        .submenu-title {
            font-size: 1em;
            font-weight: bold;
            margin-bottom: 10px;
            cursor: pointer;
            color: var(--text-color);
        }

        /* 居中按钮容器 */
        .button-container {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin-top: 20px;
        }
    `);

    // 配置存储结构
    const defaultConfig = {
        position: {
            bottom: 60, // 默认底部距离
            right: 94,  // 默认右边距离
            unit: '%'  // 默认位置单位
        },

        size: {
            width: 24,  // 默认按钮宽度
            height: 100, // 默认按钮长度
            fontSize: 10 // 默认按钮文本大小
        },

        colorMode: 'auto', // 默认按钮颜色模式
        customColor: '', // 默认自定义按钮颜色
        colorType: 'hex', // 默认按钮颜色类型
        openInNewTab: true, // 默认新窗口打开设置
        jumpDomain: 'nya.one', // 默认跳转服务器域名
        textColorMode: 'dark', // 默认文本颜色模式设置
        customTextColor: '', // 默认自定义文本颜色
        textColorType: 'hex' // 默认文本颜色类型
    };

    // 初始化配置
    let config = JSON.parse(GM_getValue('buttonConfig', JSON.stringify(defaultConfig)));

    // 创建设置面板
    const settingsPanel = createSettingsPanel();
    document.body.appendChild(settingsPanel);

    // 创建主按钮
    const mainButton = createMainButton();
    document.body.appendChild(mainButton);

    // 注册菜单命令
    GM_registerMenuCommand('⚙️ 调整按钮设置', () => toggleSettingsPanel());

    // 绑定主按钮点击事件
    mainButton.addEventListener('click', handleMainButtonClick);

    // 初始化主题系统
    initThemeSystem();

    // 创建主按钮
    function createMainButton() {
        const btn = document.createElement('button');
        btn.textContent = '打开用户页面'; // 默认按钮显示文本
        Object.assign(btn.style, {
            position: 'fixed',
            zIndex: '999999', // 默认按钮堆叠顺序(越大覆盖的页面越多)
            cursor: 'pointer',
            borderRadius: '40px', // 默认按钮圆角
            boxShadow: '0 4px 12px rgba(0,0,0,0.15)',
            transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'
        });
        updateButtonStyles(btn);
        return btn;
    }

    // 创建设置面板
   function createSettingsPanel() {
    const panel = document.createElement('div');
    panel.className = 'settings-panel';
    panel.innerHTML = `
        <h3 style="margin:0 0 20px; font-size:1.1em">按钮设置</h3>
        <div class="submenu-title" id="positionSizeMenu">位置与大小设置</div>
        <div class="submenu" id="positionSizeSubmenu">
            <div class="settings-grid">
                <!-- 位置设置 -->
                <div class="settings-input-group">
                    <label>底部距离</label>
                    <input type="number" class="settings-input" id="bottom" value="${config.position.bottom}">
                </div>
                <div class="settings-input-group">
                    <label>右侧距离</label>
                    <input type="number" class="settings-input" id="right" value="${config.position.right}">
                </div>
                <!-- 尺寸设置 -->
                <div class="settings-input-group">
                    <label>宽度 (px)</label>
                    <input type="number" class="settings-input" id="width" value="${config.size.width}">
                </div>
                <div class="settings-input-group">
                    <label>高度 (px)</label>
                    <input type="number" class="settings-input" id="height" value="${config.size.height}">
                </div>
                <div class="settings-input-group">
                    <label>文字大小 (px)</label>
                    <input type="number" class="settings-input" id="fontSize" value="${config.size.fontSize}">
                </div>
                <!-- 单位选择 -->
                <div class="settings-input-group">
                    <label>按钮位置单位类型</label>
                    <select class="settings-input" id="unit">
                        <option value="px" ${config.position.unit === 'px' ? 'selected' : ''}>像素(px)</option>
                        <option value="%" ${config.position.unit === '%' ? 'selected' : ''}>百分比(%)</option>
                    </select>
                </div>
            </div>
        </div>
        <div class="submenu-title" id="colorMenu">颜色设置</div>
        <div class="submenu" id="colorSubmenu">
            <div class="settings-grid">
    <!-- 按钮颜色模式(1) -->
    <div class="settings-input-group">
        <label>按钮颜色模式</label>
        <select class="settings-input" id="colorMode">
            <option value="auto" ${config.colorMode === 'auto' ? 'selected' : ''}>自动</option>
            <option value="light" ${config.colorMode === 'light' ? 'selected' : ''}>浅色主题色</option>
            <option value="dark" ${config.colorMode === 'dark' ? 'selected' : ''}>深色主题色</option>
            <option value="custom" ${config.colorMode === 'custom' ? 'selected' : ''}>自定义颜色</option>
        </select>
    </div>

    <!-- 文本颜色模式(2) -->
    <div class="settings-input-group">
        <label>文本颜色模式</label>
        <select class="settings-input" id="textColorMode">
            <option value="auto" ${config.textColorMode === 'auto' ? 'selected' : ''}>自动</option>
            <option value="light" ${config.textColorMode === 'light' ? 'selected' : ''}>浅色</option>
            <option value="dark" ${config.textColorMode === 'dark' ? 'selected' : ''}>深色</option>
            <option value="custom" ${config.textColorMode === 'custom' ? 'selected' : ''}>自定义颜色</option>
        </select>
    </div>

    <!-- 自定义按钮颜色(3) -->
    <div class="settings-input-group" id="customColorGroup" style="display: ${config.colorMode === 'custom' ? 'block' : 'none'}">
        <label>自定义按钮颜色</label>
        <select class="settings-input" id="colorType">
            <option value="hex" ${config.colorType === 'hex' ? 'selected' : ''}>#RRGGBB</option>
            <option value="shortHex" ${config.colorType === 'shortHex' ? 'selected' : ''}>#RGB</option>
            <option value="rgb" ${config.colorType === 'rgb' ? 'selected' : ''}>RGB(RRR,GGG,BBB)</option>
        </select>
        <input type="text" class="settings-input" id="customColor" value="${config.customColor.replace(/^#|^rgb\(|\)$/g, '')}">
    </div>

    <!-- 自定义文本颜色(4) -->
    <div class="settings-input-group" id="customTextColorGroup" style="display: ${config.textColorMode === 'custom' ? 'block' : 'none'}">
        <label>自定义文本颜色</label>
        <select class="settings-input" id="textColorType">
            <option value="hex" ${config.textColorType === 'hex' ? 'selected' : ''}>#RRGGBB</option>
            <option value="shortHex" ${config.textColorType === 'shortHex' ? 'selected' : ''}>#RGB</option>
            <option value="rgb" ${config.textColorType === 'rgb' ? 'selected' : ''}>RGB(RRR,GGG,BBB)</option>
        </select>
        <input type="text" class="settings-input" id="customTextColor" value="${config.customTextColor.replace(/^#|^rgb\(|\)$/g, '')}">
    </div>
</div>
        </div>
        <div class="submenu-title" id="openJumpMenu">打开和跳转设置</div>
        <div class="submenu" id="openJumpSubmenu">
            <div class="settings-grid">
                <!-- 打开方式设置 -->
                <div class="settings-input-group">
                    <label>打开方式</label>
                    <select class="settings-input" id="openInNewTab">
                        <option value="false" ${!config.openInNewTab ? 'selected' : ''}>当前标签页</option>
                        <option value="true" ${config.openInNewTab ? 'selected' : ''}>新标签页</option>
                    </select>
                </div>
                <!-- 跳转域名设置 -->
                <div class="settings-input-group">
                    <label>跳转域名</label>
                    <input type="text" class="settings-input" id="jumpDomain" value="${config.jumpDomain}">
                </div>
            </div>
        </div>
        <!-- 操作按钮 -->
        <div class="button-container">
            <button class="modern-button reset-button" id="resetSettings">
                <svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M12 20q-3.35 0-5.675-2.325T4 12q0-3.35 2.325-5.675T12 4q1.725 0 3.3.713T18 6.75V4h2v7h-7V9h4.2q-.8-1.4-2.188-2.2T12 6Q9.5 6 7.75 7.75T6 12q0 2.5 1.75 4.25T12 18q1.7 0 3.113-.862t2.187-2.313l1.8.75Q17.2 17.725 15.4 18.862T12 20Z"/></svg>
                重置
            </button>
            <button class="modern-button save-button" id="saveSettings">
                <svg width="16" height="16" viewBox="0 0 24 24"><path fill="currentColor" d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></svg>
                保存
            </button>
        </div>
    `;

    // 为所有输入项添加事件监听
    const inputs = panel.querySelectorAll('input, select');
    inputs.forEach(input => {
        input.addEventListener('input', () => updatePreview());
    });

    // 绑定重置和保存按钮事件
    panel.querySelector('#resetSettings').addEventListener('click', resetSettings);
    panel.querySelector('#saveSettings').addEventListener('click', saveSettings);

    // 绑定按钮颜色模式更改事件
    panel.querySelector('#colorMode').addEventListener('change', () => {
        const customColorGroup = panel.querySelector('#customColorGroup');
        customColorGroup.style.display = panel.querySelector('#colorMode').value === 'custom' ? 'block' : 'none';
        saveColorSettings();
        updateButtonColor(mainButton);
        updateCustomColorInput();
    });

    // 绑定按钮颜色类型更改事件
    panel.querySelector('#colorType').addEventListener('change', () => {
        updateButtonColor(mainButton);
        updateCustomColorInput();
    });

    // 绑定按钮颜色值输入事件
    panel.querySelector('#customColor').addEventListener('input', () => {
        updateButtonColor(mainButton);
    });

    // 绑定文本颜色模式更改事件
    panel.querySelector('#textColorMode').addEventListener('change', () => {
        const customTextColorGroup = panel.querySelector('#customTextColorGroup');
        customTextColorGroup.style.display = panel.querySelector('#textColorMode').value === 'custom' ? 'block' : 'none';
        saveColorSettings();
        updateButtonTextColor(mainButton);
        updateCustomTextColorInput(mainButton);
    });

    // 绑定文本颜色类型更改事件
    panel.querySelector('#textColorType').addEventListener('change', () => {
        updateButtonTextColor(mainButton);
        updateCustomTextColorInput();
    });

    // 绑定文本颜色值输入事件
    panel.querySelector('#customTextColor').addEventListener('input', () => {
        updateButtonTextColor(mainButton);
        updateCustomTextColorInput(mainButton);
    });

    // 绑定二级菜单点击事件
    panel.querySelectorAll('.submenu-title').forEach(title => {
        title.addEventListener('click', () => {
            const submenu = title.nextElementSibling;
            toggleSubmenu(submenu);
        });
    });
    return panel;
}

    // 更新预览效果
    function updatePreview() {
        const formData = getFormData();
        mainButton.style.bottom = `${formData.position.bottom}${formData.position.unit}`;
        mainButton.style.right = `${formData.position.right}${formData.position.unit}`;
        mainButton.style.width = `${formData.size.width}px`;
        mainButton.style.height = `${formData.size.height}px`;
        mainButton.style.fontSize = `${formData.size.fontSize}px`;
        updateButtonColor(mainButton);
        updateButtonTextColor(mainButton);
    }

    // 保存设置
    function saveSettings() {
        const formData = getFormData();
        if (formData.colorMode === 'custom' && !isValidColor(formData.customColor)) {
            alert('自定义颜色格式错误,请输入有效的颜色值(如 #RGB、#RRGGBB 或 rgb() 等格式)');
            return;
        }

        if (formData.textColorMode === 'custom' && !isValidColor(formData.customTextColor)) {
            alert('自定义文本颜色格式错误,请输入有效的颜色值(如 #RGB、#RRGGBB 或 rgb() 等格式)');
            return;
        }

        config = formData;
        GM_setValue('buttonConfig', JSON.stringify(config));
        settingsPanel.style.display = 'none';
        updateButtonStyles(mainButton);
    }

    // 重置设置
    function resetSettings() {
        config = JSON.parse(JSON.stringify(defaultConfig));
        updateFormData(config);
        updatePreview();
    }

    // 获取表单数据
    function getFormData() {
        const colorType = settingsPanel.querySelector('#colorType').value;
        let customColor = settingsPanel.querySelector('#customColor').value;
        if (customColor) {
            if (colorType === 'hex') {
                customColor = `#${customColor}`;
            } else if (colorType === 'shortHex') {
                if (customColor.length === 3) {
                    customColor = `#${customColor[0]}${customColor[0]}${customColor[1]}${customColor[1]}${customColor[2]}${customColor[2]}`;
                } else {
                    customColor = `#${customColor}`;
                }
            } else if (colorType === 'rgb') {
                customColor = `rgb(${customColor})`;
            }
        }

        const textColorType = settingsPanel.querySelector('#textColorType').value;
        let customTextColor = settingsPanel.querySelector('#customTextColor').value;
        if (customTextColor) {
            if (textColorType === 'hex') {
                customTextColor = `#${customTextColor}`;
            } else if (textColorType === 'shortHex') {
                if (customTextColor.length === 3) {
                    customTextColor = `#${customTextColor[0]}${customTextColor[0]}${customTextColor[1]}${customTextColor[1]}${customTextColor[2]}${customTextColor[2]}`;
                } else {
                    customTextColor = `#${customTextColor}`;
                }
            } else if (textColorType === 'rgb') {
                customTextColor = `rgb(${customTextColor})`;
            }
        }
        return {
            position: {
                bottom: parseInt(settingsPanel.querySelector('#bottom').value) || 60,
                right: parseInt(settingsPanel.querySelector('#right').value) || 90,
                unit: settingsPanel.querySelector('#unit').value
            },
            size: {
                width: settingsPanel.querySelector('#width').value,
                height: parseInt(settingsPanel.querySelector('#height').value) || 40,
                fontSize: parseInt(settingsPanel.querySelector('#fontSize').value) || 14
            },
            colorMode: settingsPanel.querySelector('#colorMode').value,
            customColor: customColor,
            colorType: colorType,
            openInNewTab: settingsPanel.querySelector('#openInNewTab').value === 'true',
            jumpDomain: settingsPanel.querySelector('#jumpDomain').value || 'nya.one',
            textColorMode: settingsPanel.querySelector('#textColorMode').value,
            customTextColor: customTextColor,
            textColorType: textColorType
        };
    }

    // 更新表单数据
    function updateFormData(data) {
        settingsPanel.querySelector('#bottom').value = data.position.bottom;
        settingsPanel.querySelector('#right').value = data.position.right;
        settingsPanel.querySelector('#unit').value = data.position.unit;
        settingsPanel.querySelector('#width').value = data.size.width;
        settingsPanel.querySelector('#height').value = data.size.height;
        settingsPanel.querySelector('#fontSize').value = data.size.fontSize;
        settingsPanel.querySelector('#colorMode').value = data.colorMode;
        settingsPanel.querySelector('#colorType').value = data.colorType;

        if (settingsPanel.querySelector('#customColor')) {
            let customColor = data.customColor || '';
            if (data.colorType === 'hex' && customColor.startsWith('#')) {
                customColor = customColor.slice(1);
            } else if (data.colorType === 'rgb' && customColor.startsWith('rgb(')) {
                customColor = customColor.slice(4, -1);
            }
            settingsPanel.querySelector('#customColor').value = customColor;
        }
        settingsPanel.querySelector('#openInNewTab').value = data.openInNewTab ? 'true' : 'false';
        settingsPanel.querySelector('#jumpDomain').value = data.jumpDomain;
        settingsPanel.querySelector('#textColorMode').value = data.textColorMode;
        settingsPanel.querySelector('#textColorType').value = data.textColorType;

        if (settingsPanel.querySelector('#customTextColor')) {
            let customTextColor = data.customTextColor || '';
            if (data.textColorType === 'hex' && customTextColor.startsWith('#')) {
                customTextColor = customTextColor.slice(1);
            } else if (data.textColorType === 'rgb' && customTextColor.startsWith('rgb(')) {
                customTextColor = customTextColor.slice(4, -1);
            }
            settingsPanel.querySelector('#customTextColor').value = customTextColor;
        }

        // 重置后更新自定义颜色输入框的显示状态
        const customColorGroup = settingsPanel.querySelector('#customColorGroup');
        customColorGroup.style.display = data.colorMode === 'custom' ? 'block' : 'none';
        const customTextColorGroup = settingsPanel.querySelector('#customTextColorGroup');
        customTextColorGroup.style.display = data.textColorMode === 'custom' ? 'block' : 'none';
    }

    // 更新按钮样式
    function updateButtonStyles(btn) {
        btn.style.bottom = `${config.position.bottom}${config.position.unit}`;
        btn.style.right = `${config.position.right}${config.position.unit}`;
        btn.style.width = `${config.size.width}px`;
        btn.style.height = `${config.size.height}px`;
        btn.style.fontSize = `${config.size.fontSize}px`;
        updateButtonColor(btn);
        updateButtonTextColor(btn);
    }

    // 更新按钮文本颜色
function updateButtonTextColor(btn) {
    let textColor = '#000000'; // 默认文本颜色
    switch (config.textColorMode) {
        case 'auto':
            textColor = getComputedStyle(document.documentElement).getPropertyValue('--text-color').trim();
            break;
        case 'light':
            textColor = '#ffffff';
            break;
        case 'dark':
            textColor = '#000000';
            break;
        case 'custom':
            const textColorType = settingsPanel.querySelector('#textColorType').value;
            let customTextColor = settingsPanel.querySelector('#customTextColor').value;

            if (customTextColor) {
                if (textColorType === 'hex') {
                    customTextColor = `#${customTextColor}`;
                } else if (textColorType === 'shortHex') {
                    if (customTextColor.length === 3) {
                        customTextColor = `#${customTextColor[0]}${customTextColor[0]}${customTextColor[1]}${customTextColor[1]}${customTextColor[2]}${customTextColor[2]}`;
                    } else {
                        customTextColor = `#${customTextColor}`;
                    }
                } else if (textColorType === 'rgb') {
                    customTextColor = `rgb(${customTextColor})`;
                }
                if (isValidColor(customTextColor)) {
                    textColor = customTextColor;
                } else {
                    textColor = '#000000';
                }
            }
            break;
    }
    btn.style.color = textColor;
}

    // 初始化主题系统
    function initThemeSystem() {
        const darkModeMedia = window.matchMedia('(prefers-color-scheme: dark)');
        const updateTheme = () => {
            const isDark = darkModeMedia.matches;
            document.documentElement.style.setProperty('--bg-color', isDark ? '#2d2d2d' : '#ffffff');
            document.documentElement.style.setProperty('--text-color', isDark ? 'rgba(255,255,255,.85)' : '#333333');
            document.documentElement.style.setProperty('--text-secondary', isDark ? '#aaaaaa' : '#666666');
            document.documentElement.style.setProperty('--border-color', isDark ? '#444444' : '#dddddd');
            document.documentElement.style.setProperty('--input-bg', isDark ? '#383838' : '#f5f5f5');
            document.documentElement.style.setProperty('--accent-color', getThemeColor('accentLighten'));
            document.documentElement.style.setProperty('--accent-color-20', `${getThemeColor('accentLighten')}33`);
        };
        darkModeMedia.addEventListener('change', updateTheme);
        updateTheme();
    }

    // 获取主题颜色
    function getThemeColor() {
        try {
            let themeAccentColor = getComputedStyle(document.documentElement).getPropertyValue('--MI_THEME-accent').trim();
            if (!themeAccentColor || !isValidColor(themeAccentColor)) {
                themeAccentColor = getComputedStyle(document.documentElement).getPropertyValue('--accent').trim();
            }
            if (!themeAccentColor || !isValidColor(themeAccentColor)) {
                themeAccentColor = '#9ab3da';
            }
            return themeAccentColor;
        } catch (error) {
            console.error('获取主题颜色时出错:', error);
            return '#9ab3da';
        }
    }

    // 更新按钮颜色
    function updateButtonColor(btn = mainButton) {
        try {
            let color = '#9ab3da';
            switch (config.colorMode) {
                case 'auto':
                    color = getThemeColor();
                    break;
                case 'light':
                    color = '#ffffff';
                    break;
                case 'dark':
                    color = '#2d2d2d';
                    break;
                case 'custom':
                    const colorType = settingsPanel.querySelector('#colorType').value;
                    let customColor = settingsPanel.querySelector('#customColor').value;
                    if (customColor) {
                        if (colorType === 'hex') {
                            customColor = `#${customColor}`;
                        } else if (colorType === 'shortHex') {
                            if (customColor.length === 3) {
                                customColor = `#${customColor[0]}${customColor[0]}${customColor[1]}${customColor[1]}${customColor[2]}${customColor[2]}`;
                            } else {
                                customColor = `#${customColor}`;
                            }
                        } else if (colorType === 'rgb') {
                            customColor = `rgb(${customColor})`;
                        }
                        if (isValidColor(customColor)) {
                            color = customColor;
                        } else {
                            color = '#9ab3da';
                        }
                    }
                    break;
            }
            btn.style.backgroundColor = color;
            btn.style.boxShadow = `0 4px 12px ${color}33`;
        } catch (error) {
            console.error('更新按钮颜色错误:', error);
        }
    }

    // 保存颜色相关设置
    function saveColorSettings() {
        const formData = getFormData();
        config.colorMode = formData.colorMode;
        config.customColor = formData.customColor;
        config.colorType = formData.colorType;
        config.textColorMode = formData.textColorMode;
        config.customTextColor = formData.customTextColor;
        config.textColorType = formData.textColorType;
        GM_setValue('buttonConfig', JSON.stringify(config));
    }

    // 切换设置面板显示状态
    function toggleSettingsPanel() {
    if (settingsPanel.style.display === 'none' || settingsPanel.style.display === '') {
        // 显示设置面板
        settingsPanel.style.display = 'block';
        // 更新颜色输入框的值
        updateCustomColorInput();
        updateCustomTextColorInput();
        // 更新自定义颜色输入框的显示状态
        const customColorGroup = settingsPanel.querySelector('#customColorGroup');
        customColorGroup.style.display = config.colorMode === 'custom' ? 'block' : 'none';
        const customTextColorGroup = settingsPanel.querySelector('#customTextColorGroup');
        customTextColorGroup.style.display = config.textColorMode === 'custom' ? 'block' : 'none';
    } else {
        // 隐藏设置面板
        settingsPanel.style.display = 'none';
    }
}

    // 切换二级菜单显示状态
    function toggleSubmenu(submenu) {
        if (submenu.style.display === 'none' || submenu.style.display === '') {
            submenu.style.display = 'block';
        } else {
            submenu.style.display = 'none';
        }
    }
    // 验证颜色格式
    function isValidColor(color) {
        return /^(#([0-9A-Fa-f]{3,4}){1,2}|rgb\((\d{1,3},\s*){2}\d{1,3}\)|rgba\((\d{1,3},\s*){3}\d*\.?\d+\))$/.test(color);
    }

    // 更新输入框中的颜色值
    function updateCustomColorInput() {
        const colorType = settingsPanel.querySelector('#colorType').value;
        let customColor = settingsPanel.querySelector('#customColor').value;
        if (colorType === 'hex' && customColor.startsWith('#')) {
            customColor = customColor.slice(1);
        } else if (colorType === 'rgb' && customColor.startsWith('rgb(')) {
            customColor = customColor.slice(4, -1);
        }
        settingsPanel.querySelector('#customColor').value = customColor;
    }

    // 更新输入框中的文本颜色值
    function updateCustomTextColorInput() {
        const textColorType = settingsPanel.querySelector('#textColorType').value;
        let customTextColor = settingsPanel.querySelector('#customTextColor').value;

        if (textColorType === 'hex' && customTextColor.startsWith('#')) {
            customTextColor = customTextColor.slice(1);
        } else if (textColorType === 'rgb' && customTextColor.startsWith('rgb(')) {
            customTextColor = customTextColor.slice(4, -1);
        }
        settingsPanel.querySelector('#customTextColor').value = customTextColor;
    }

    // 处理主按钮点击事件
    function handleMainButtonClick() {
    const spans = document.querySelectorAll('span');
    let username = null;
    for (const span of spans) {
        if (span.textContent && span.textContent.startsWith('@')) {
            username = span.textContent.trim();
            break;
        }
    }
    const fullUrl = window.location.href;
    const server = window.location.hostname;
    const keywords = ['/@', '/notes/']; // 自定义关键词以启用链接跳转功能
    const containsKeywords = keywords.some(keyword => fullUrl.includes(keyword));
    if (containsKeywords) {
        if (username && server) {
            const cleanUsername = (username.match(/@/g) && username.match(/@/g).length === 2) ? username : `${username}@${server}`;
            const url = `https://${config.jumpDomain}/${cleanUsername}`;
            if (config.openInNewTab) {
                window.open(url, '_blank');
            } else {
                window.location.href = url;
            }
        } else {
                alert('无法解析用户名或服务器信息');
            }
        }
        }
})();