Greasy Fork

Greasy Fork is available in English.

[MWI]Marketplace Panel Button Disabler

Disable and gray out buttons in marketplace panels using pure CSS with configurable panel class names

当前为 2025-05-12 提交的版本,查看 最新版本

// ==UserScript==
// @name         [MWI]Marketplace Panel Button Disabler
// @name:zh-CN   [银河奶牛]市场面板按钮禁用器
// @namespace    https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-orderbook-button-disabler
// @version      3.0.1
// @description  Disable and gray out buttons in marketplace panels using pure CSS with configurable panel class names
// @description:zh-CN  使用纯CSS和可配置的面板类名禁用并灰化市场面板中的按钮
// @author       shenhuanjie
// @license      MIT
// @match        https://www.milkywayidle.com/game*
// @icon         https://www.milkywayidle.com/favicon.svg
// @grant        none
// @homepage     https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-orderbook-button-disabler
// @supportURL   https://cnb.cool/shenhuanjie/skyner-cn/tamper-monkey-script/mwi-orderbook-button-disabler
// @run-at       document-start
// ==/UserScript==

(function() {
    'use strict';

    // 配置对象,包含需要禁用按钮的面板类名和按钮白名单
    const config = {
        panelClassNames: [
            "MarketplacePanel_orderBook",
            "MarketplacePanel_itemSummary"
        ],
        // 按钮白名单规则:基于类名前缀的模糊匹配
        buttonWhitelist: [
            // 模糊匹配层级关系
            "MarketplacePanel_viewAll > button", // 匹配任何类名前缀包含MarketplacePanel_viewAll的父元素下的button
            "MarketplacePanel_viewAll > Button_button" // 匹配特定按钮类名前缀
        ],
        // 可以在此处添加更多配置项
    };

    // 生成CSS选择器的函数
    function generateCSS(classNames) {
        // 生成基本选择器
        const baseSelectors = classNames.map(className => 
            `div[class*="${className}"] button`
        ).join(',\n        ');
        
        // 生成白名单选择器(基于类名前缀模糊匹配)
        const whitelistSelectors = config.buttonWhitelist.map(rule => {
            const parts = rule.split(/\s*>\s*/).map(part => part.trim());
            
            // 处理层级选择器规则
            if (parts.length > 1) {
                const parentClass = parts[0];
                const childElement = parts[1];
                
                // 如果是特定按钮类名前缀匹配
                if (childElement.includes('_')) {
                    return `[class*="${parentClass}"] > [class*="${childElement}"]`;
                }
                // 普通元素匹配
                return `[class*="${parentClass}"] > ${childElement}`;
            }
            
            // 处理简单按钮类名前缀匹配
            return `[class*="${parts[0]}"]`;
        }).join(',\n        ');
        
        // 生成hover、active和focus状态的选择器
        const stateSelectors = classNames.flatMap(className => [
            `div[class*="${className}"] button:hover`,
            `div[class*="${className}"] button:active`,
            `div[class*="${className}"] button:focus`
        ]).join(',\n        ');
        
        // 返回完整的CSS
        return `
        /* 移除购买按钮中的上箭头图标 */
        div[class*="MarketplacePanel_actionButtonText"] svg[aria-label="Up Arrow"] {
            display: none !important;
        }
        
        /* 样式规则:应用于所有匹配的按钮(包括白名单中的按钮) */
        ${baseSelectors} {
            opacity: 0.5 !important;
            background-color: #e0e0e0 !important;
            color: #888 !important;
            border-color: #ccc !important;
            filter: grayscale(100%) !important;
            transition: all 0.3s ease !important;
        }
        
        /* 交互规则:只应用于非白名单的按钮 */
        ${baseSelectors}:not(${whitelistSelectors}) {
            cursor: not-allowed !important;
            pointer-events: none !important;
        }
        
        /* 确保禁用状态不会被其他样式覆盖 */
        ${stateSelectors} {
            opacity: 0.5 !important;
            background-color: #e0e0e0 !important;
            color: #888 !important;
            border-color: #ccc !important;
            filter: grayscale(100%) !important;
            box-shadow: none !important;
            transform: none !important;
        }
        
        /* 白名单按钮的交互状态 */
        ${whitelistSelectors},
        ${whitelistSelectors}:hover,
        ${whitelistSelectors}:active,
        ${whitelistSelectors}:focus {
            cursor: pointer !important;
            pointer-events: auto !important;
        }
        
        /* 特殊处理层级选择器规则的交互状态 */
        ${config.buttonWhitelist
            .filter(rule => rule.includes('>'))
            .map(rule => {
                const parts = rule.split(/\s*>\s*/);
                const parentSelector = parts[0].includes('__') ? 
                    `[class*="${parts[0]}"]` : `.${parts[0]}`;
                const childSelector = parts[1];
                return `${parentSelector} > ${childSelector}:hover,
                ${parentSelector} > ${childSelector}:active,
                ${parentSelector} > ${childSelector}:focus`;
            })
            .join(',\n        ')} {
            cursor: pointer !important;
            pointer-events: auto !important;
        }`;
    }

    // 添加纯CSS实现
    const style = document.createElement('style');
    style.textContent = generateCSS(config.panelClassNames);
    document.head.appendChild(style);
    
    console.log(`[MarketplacePanelDisabler] 已应用CSS规则:
    面板类名: ${config.panelClassNames.join(', ')}
    白名单按钮: ${config.buttonWhitelist.join(', ')}
    特殊规则: 移除购买按钮中的上箭头图标`);
})();