BGA Modern

Add a clean slider to #upperrightmenu to scale #left-side-wrapper

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey, Greasemonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Violentmonkey.

Voor het installeren van scripts heb je een extensie nodig, zoals Tampermonkey of Userscripts.

Voor het installeren van scripts heb je een extensie nodig, zoals {tampermonkey_link:Tampermonkey}.

Voor het installeren van scripts heb je een gebruikersscriptbeheerder nodig.

(Ik heb al een user script manager, laat me het downloaden!)

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een extensie nodig, zoals {stylus_link:Stylus}.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

Voor het installeren van gebruikersstijlen heb je een gebruikersstijlbeheerder nodig.

(Ik heb al een beheerder - laat me doorgaan met de installatie!)

// ==UserScript==
// @name         BGA Modern
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Add a clean slider to #upperrightmenu to scale #left-side-wrapper
// @author       Gemini
// @match        https://boardgamearena.com/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=boardgamearena.com
// @grant        GM_addStyle
// // @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 配置参数
    const CONFIG = {
        targetId: '#left-side-wrapper',
        parentId: '#upperrightmenu', // 目标父容器
        sliderId: 'bga-custom-scale-slider-container',
        minScale: 0.5,
        maxScale: 1.0,
        defaultScale: 1.0,
        step: 0.05 // 步长改为 0.01
    };

    // 注入自定义 CSS (为了美化滑块,让它在白色顶栏看不突兀)
    const style = document.createElement('style');
    style.innerHTML = `
        /* 滑块容器 */
        #${CONFIG.sliderId} {
            display: inline-flex;
            align-items: center;
            justify-content: center;
            height: 100%;
            margin-right: 15px; /* 与右侧原有图标的间距 */
            vertical-align: middle;
        }

        /* 移除浏览器默认样式 */
        input[type=range].bga-scale-range {
            -webkit-appearance: none;
            width: 120px !important;
            height: 4px;
            background: #e0e0e0 !important;
            border-radius: 2px;
            outline: none;
            cursor: pointer;
            padding: unset !important;
            border: unset !important;
        }

        /* 滑块圆点 (Chrome/Safari/Edge) */
        .bga-scale-range::-webkit-slider-thumb {
            -webkit-appearance: none;
            appearance: none;
            width: 14px;
            height: 14px;
            border-radius: 50%;
            background: #2c3e50; /* 深色圆点,符合BGA风格 */
            cursor: pointer;
            transition: background .15s ease-in-out;
            border: 2px solid #fff; /* 白色描边增加层次感 */
            box-shadow: 0 1px 3px rgba(0,0,0,0.3);
        }

        /* 鼠标悬停变色 */
        .bga-scale-range::-webkit-slider-thumb:hover {
            background: #4a90e2; /* BGA蓝 */
            transform: scale(1.1);
        }

        /* Firefox 兼容 */
        .bga-scale-range::-moz-range-thumb {
            width: 14px;
            height: 14px;
            border: 2px solid #fff;
            border-radius: 50%;
            background: #2c3e50;
            cursor: pointer;
            box-shadow: 0 1px 3px rgba(0,0,0,0.3);
        }
    `;
    document.head.appendChild(style);

    // 初始化滑块
    function initSlider(targetElement, parentElement) {
        if (document.getElementById(CONFIG.sliderId)) return;

        // 1. 设置目标的 transform-origin
        targetElement.style.transformOrigin = 'top center';
        targetElement.style.transition = 'transform 0.1s linear'; // 响应更快一点

        // 2. 创建容器
        const container = document.createElement('div');
        container.id = CONFIG.sliderId;

        // 3. 创建滑块
        const rangeInput = document.createElement('input');
        rangeInput.type = 'range';
        rangeInput.className = 'bga-scale-range'; // 应用上面定义的CSS类
        rangeInput.min = CONFIG.minScale;
        rangeInput.max = CONFIG.maxScale;
        rangeInput.step = CONFIG.step;
        rangeInput.value = CONFIG.defaultScale;
        rangeInput.title = `缩放左侧面板 (双击复原)`; // 鼠标悬停提示

        // 4. 事件绑定
        rangeInput.addEventListener('input', function(e) {
            targetElement.style.transform = `scale(${e.target.value})`;
        });

        // 双击复原
        rangeInput.addEventListener('dblclick', function() {
            rangeInput.value = 1.0;
            targetElement.style.transform = `scale(1)`;
        });

        // 5. 插入到 #upperrightmenu 的第一个位置
        container.appendChild(rangeInput);
        parentElement.prepend(container);
    }

    // 定时检查器
    const checkInterval = setInterval(() => {
        const target = document.querySelector(CONFIG.targetId); // 左侧面板
        const parent = document.querySelector(CONFIG.parentId); // 顶部菜单
        const sliderContainer = document.getElementById(CONFIG.sliderId);

        // 只有当 左侧面板 和 顶部菜单 同时存在时,才显示滑块
        if (target && parent) {
            // 确保样式始终生效
            if (target.style.transformOrigin !== 'top center') {
                target.style.transformOrigin = 'top center';
            }

            if (!sliderContainer) {
                initSlider(target, parent);
            }
        } else {
            // 如果离开了游戏页面(左侧面板消失),则移除顶部的滑块,保持界面整洁
            if (sliderContainer) {
                sliderContainer.remove();
            }
        }
    }, 1000);

      const myCustomStyle = `
.bga-item-shadow-medium,
.bga-page-section-shadow,
.bga-button-holder,
.game_interface #page-title,
.player_board_inner,
.bga-omni-bar:after {
	box-shadow: unset !important;
}

.bga-page-section .bga-page-section__content {
	background-image: unset;
}

.bga-omni-bar input {
	background: unset !important;
	border-bottom-right-radius: 0;
	border-top-right-radius: 0;
}

.bga-menu-bar {
	background: white;
}

.bgabutton_grey,
.bgabutton_gray {
	background: white !important;
	border: 0.4px solid #ffffff !important;
	color: #333;
}

#upperrightmenu {
	display: flex;
	align-items: center;
	margin-right: 12px;
}

/* 遥远之地bug */
.fa_zone_desc {
    width: unset !important;
}
    `;

    /**
     * 注入样式函数
     * 优先使用 GM_addStyle (油猴内置),如果不可用则回退到原生 JS 注入
     */
    function injectStyle(css) {
        if (typeof GM_addStyle !== 'undefined') {
            GM_addStyle(css);
        } else {
            const style = document.createElement('style');
            style.textContent = css;
            document.head.appendChild(style);
        }
    }

    // 执行注入
    injectStyle(myCustomStyle);

    // 如果某些样式在页面完全加载后被原站脚本覆盖,可以尝试在 window.onload 时再次注入
    window.addEventListener('load', () => {
        injectStyle(myCustomStyle);
    }, false);

})();