// ==UserScript== // @name 夜间护眼助手(123云盘+影视反色优化版)- 完整主题修复 // @namespace Local // @version 5.6.15 // @description 全网通用夜间护眼助手,深度优化123云盘夜间模式,新增影视反色模式 // @match *://*/* // @run-at document-start // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand // @grant GM_unregisterMenuCommand // @icon data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMzIiIGZpbGw9IiMyRDM2NDQiLz4KPGNpcmNsZSBjeD0iNjQiIGN5PSI2NCIgcj0iMjgiIGZpbGw9IiM0NzUwNjAiLz4KPHBhdGggZD0iTTg0IDU5Qzg0IDcxLjE1MDMgNzQuMTUwMyA4MSA2MiA4MUM0OS44NDk3IDgxIDQwIDcxLjE1MDMgNDAgNTlDNDAgNDYuODQ5NyA0OS44NDk3IDM3IDYyIDM3Qzc0LjE1MDMgMzcgODQgNDYuODQ5NyA4NCA1OVoiIGZpbGw9IiNGRkZGRkYiIGZpbGwtb3BhY2l0eT0iMC45Ii8+CjxwYXRoIGQ9Ik02MiA3MEM2Ni40MTgzIDcwIDcwIDY2LjQxODMgNzAgNjJDNzAgNTcuNTgxNyA2Ni40MTgzIDU0IDYyIDU0QzU3LjU4MTcgNTQgNTQgNTcuNTgxNyA1NCA2MkM1NCA2Ni40MTgzIDU3LjU4MTcgNzAgNjIgNzBaIiBmaWxsPSIjMkQzNjQ0Ii8+CjxwYXRoIGQ9Ik00NSA3OEM0OC44NjYgNzggNTIgNzQuODY2IDUyIDcxVjUzQzUyIDQ5LjEzNCA0OC44NjYgNDYgNDUgNDZDNTEuMTM0IDQ2IDM4IDQ5LjEzNCAzOCA1M1Y3MUMzOCA3NC44NjYgNDEuMTM0IDc4IDQ1IDc4WiIgZmlsbD0iI0ZGRkZGRiIvPgo8cGF0aCBkPSJNODAgNzZDNzkuMjczIDc2IDc4LjU0NiA3NS44MjcgNzcuODk5IDc1LjQ5M0w2Ny42NzcgNjkuNzI3QzY2LjM2MyA2OC45NzcgNjQuNjM3IDY4Ljk3NyA2My4zMjMgNjkuNzI3TDUzLjEwMSA3NS40OTNDNTEuNzg3IDc2LjI0MyA1MC4yMTMgNzYuMjQzIDQ4Ljg5OSA3NS40OTNMMzguNjc3IDY5LjcyN0MzNy4zNjMgNjguOTc3IDM1LjYzNyA2OC45NzcgMzQuMzIzIDY5LjcyN0wyNCA3NS41VjY0TDMyLjMyMyA1OS43MjdDMzMuNjM3IDU4Ljk3NyAzNS4zNjMgNTguOTc3IDM2LjY3NyA1OS43MjdsMTAuMjIyIDUuNzY2QzQ4LjIxMyA2Ni4yNDMgNDkuNzg3IDY2LjI0MyA1MS4xMDEgNjUuNDkzTDYxLjMyMyA1OS43MjdDNjIuNjM3IDU4Ljk3NyA2NC4zNjMgNTguOTc3IDY1LjY3NyA1OS43MjdsMTAuMjIyIDUuNzY2QzY3LjIxMyA2Ni4yNDMgNjguNzg3IDY2LjI0MyA3MC4xMDEgNjUuNDkzbDEwLjIyMi01Ljc2N0M4MS42MzcgNTguOTc3IDgzLjM2MyA1OC45NzcgODQuNjc3IDU5LjcyN0w5MyA2NFY3NS41TDgyLjg5OSA2OS40OTNDODIuMjUyIDc1LjgyNyA4MC43MjcgNzYgODAgNzZaIiBmaWxsPSIjMTg5MUZGIi8+CjxjaXJjbGUgY3g9IjYyIiBjeT0iNjIiIHI9IjQiIGZpbGw9IiNGRkZGRkYiLz4KPC9zdmc+Cg== // ==/UserScript== ;(function () { 'use strict'; // 存储所有菜单命令ID let menuCommands = []; let EyeProtect = { // 当前模式存储 currentMode: null, // 默认配置 defaults: { globalEnable: false, // 全局开关 enableList: [], // 启用列表(白名单) blacklist: [], // 禁用列表(黑名单) autoExclude: true, // 智能排除 forcedEnableList: [], // 强制启用列表 originThemeColor: '#ffffff', // 原始主题色 runDuringDay: true, // 白天保持开启 darkAuto: false, // 跟随浏览器暗色模式 customDayNight: '6:00|18:00', // 自定义昼夜时间 autoSwitch: '', // 自动切换模式 customDark1: '60|50', // 亮度模式设置 customDark2: '60|40|50|50', // 暖色模式设置 customDark3: '90', // 反色强度设置 dark3Exclude: 'img, .img, video, [style*="background"][style*="url"], svg, .video-player, .player, [class*="player"], [class*="Player"], [id*="player"], [id*="Player"], .plyr, .jw-player, .video-js', // 排除元素 inkModeConfig: '#343c3e|#ffffff|#4a5457|#5d696c|#009688|#26a69a', filterExcludeList: ['youku.com', 'v.youku.com', 'www.douyu.com', 'www.iqiyi.com', 'vip.iqiyi.com', 'mail.qq.com', 'live.kuaishou.com'], // 滤镜模式排除列表 siteSpecificModes: '{}' // 网站专用模式 }, // 初始化 init() { this.initConfig(); // 获取当前模式,修复可能的模式错误 this.fixModeIssue(); // 立即应用基础样式(不等待DOM加载) this.applyImmediateMode(); // 延迟保存原始主题色 setTimeout(() => this.saveOriginThemeColor(), 1000); this.initMenu(); // 监听系统主题变化 if (window.matchMedia) { window.matchMedia('(prefers-color-scheme: dark)').addListener(() => { this.applyMode(); this.refreshMenu(); }); } // 监听全屏变化(用于滤镜模式) document.addEventListener("fullscreenchange", () => this.handleFullscreenChange()); document.addEventListener("webkitfullscreenchange", () => this.handleFullscreenChange()); document.addEventListener("mozfullscreenchange", () => this.handleFullscreenChange()); // 等待DOM加载完成后应用完整模式 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { setTimeout(() => { this.applyMode(); // 监听页面动态加载 this.observeDOMChanges(); }, 100); }); } else { setTimeout(() => { this.applyMode(); this.observeDOMChanges(); }, 100); } }, // 处理全屏变化 handleFullscreenChange() { if (this.isFullscreen()) { // 进入全屏时禁用滤镜模式 if (this.currentMode === 'filter') { this.disableFilterMode(); } } else { // 退出全屏时恢复滤镜模式 if (this.currentMode === 'filter' && this.shouldApplyMode()) { setTimeout(() => this.applyFilterMode(), 100); } } }, // 判断是否全屏 isFullscreen() { return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement; }, // 立即应用基础模式(在DOM加载前执行) applyImmediateMode() { // 检查是否应该应用模式 if (this.shouldApplyMode()) { // 创建通用的立即样式 let style = document.createElement('style'); style.id = 'eye-protect-immediate'; style.innerHTML = ` /* 立即模式 - 防止页面闪烁 */ html, body { transition: none !important; } `; // 立即插入到head中 if (document.head) { document.head.appendChild(style); } else { // 如果head不存在,直接插入到document document.documentElement.appendChild(style); } } }, // 修复模式问题:确保模式正确 fixModeIssue() { let storedMode = this.getConfig('currentMode'); // 全局切换中只包含light, dark两种模式(去掉ink和video) const validGlobalModes = ['light', 'dark']; // 如果存储的模式不是有效模式,重置为light if (!validGlobalModes.includes(storedMode)) { this.setConfig('currentMode', 'light'); this.currentMode = 'light'; } else { this.currentMode = storedMode; } }, // 初始化配置 initConfig() { for (let key in this.defaults) { let value = GM_getValue(key); if (value === undefined) { GM_setValue(key, this.defaults[key]); } } // 初始化当前模式 if (GM_getValue('currentMode') === undefined) { GM_setValue('currentMode', 'light'); this.currentMode = 'light'; } }, // 获取配置值 getConfig(key) { return GM_getValue(key); }, // 设置配置值 setConfig(key, value) { GM_setValue(key, value); }, // 保存原始主题色 saveOriginThemeColor() { let meta = document.querySelector('meta[name="theme-color"]'); if (meta && meta.content) { this.setConfig('originThemeColor', meta.content); } }, // 监听DOM变化(用于动态加载的页面) observeDOMChanges() { const observer = new MutationObserver((mutations) => { // 检查是否需要重新应用模式 let style = document.querySelector('style[id^="eye-protect-"]'); if (!style && this.shouldApplyMode()) { setTimeout(() => this.applyMode(), 100); } }); // 监听整个文档树的变化 observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, attributeFilter: ['class', 'style', 'id'] }); }, // 判断是否为白天 isDaytime() { let time = this.getConfig('customDayNight').split('|'); let now = new Date(); let currentTime = now.getHours() * 60 + now.getMinutes(); let dayStart = this.timeToMinutes(time[0]); let dayEnd = this.timeToMinutes(time[1]); if (dayStart < dayEnd) { return currentTime >= dayStart && currentTime < dayEnd; } else { return currentTime >= dayStart || currentTime < dayEnd; } }, timeToMinutes(timeStr) { let parts = timeStr.split(':'); return parseInt(parts[0]) * 60 + parseInt(parts[1] || 0); }, // 获取当前应该应用的模式 getCurrentMode() { // 首先检查网站专用模式(最高优先级) let siteSpecificMode = this.getSiteSpecificMode(); if (siteSpecificMode && siteSpecificMode !== 'default') { return siteSpecificMode; } // 确保只有有效模式 let mode = this.currentMode || this.getConfig('currentMode'); // 全局切换中只包含light, dark两种模式(去掉了ink和video) const validGlobalModes = ['light', 'dark']; if (!validGlobalModes.includes(mode)) { mode = 'light'; this.setConfig('currentMode', 'light'); } // 如果启用了自动切换 if (this.getConfig('autoSwitch')) { let modes = this.getConfig('autoSwitch').split('|'); if (modes.length === 2) { if (this.isDaytime()) { // 自动切换中,值1=dark,其他值=light mode = modes[0] === '1' ? 'dark' : 'light'; } else { mode = modes[1] === '1' ? 'dark' : 'light'; } } } // 如果跟随浏览器暗色模式 if (this.getConfig('darkAuto') && window.matchMedia) { let prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; if (prefersDark && mode === 'light') { mode = 'dark'; } } return mode; }, // 彻底清理所有样式和修改 cleanupAllStyles() { // 1. 移除所有样式标签 let styles = document.querySelectorAll('style[id^="eye-protect-"]'); styles.forEach(style => { style.remove(); }); // 2. 移除滤镜模式的SVG let svg = document.getElementById('eye-protect-filter-svg'); if (svg) svg.remove(); // 3. 恢复原始主题色 let meta = document.querySelector('meta[name="theme-color"]'); if (meta) { meta.content = this.getConfig('originThemeColor'); } // 4. 移除动态添加的内联样式 let elements = document.querySelectorAll('[data-eye-protect]'); elements.forEach(element => { element.removeAttribute('data-eye-protect'); element.removeAttribute('style'); }); // 5. 移除滤镜模式特定样式 let filterStyle = document.getElementById('eye-protect-filter-style'); if (filterStyle) filterStyle.remove(); }, // 应用样式(带模式标识) applyStyle(css, modeId) { // 移除所有之前可能存在的样式 this.cleanupAllStyles(); let style = document.createElement('style'); style.id = 'eye-protect-' + modeId; style.setAttribute('data-eye-protect-mode', modeId); style.innerHTML = css; // 确保文档已准备好 if (document.head) { document.head.appendChild(style); } else { // 如果head不存在,等待它加载 const waitForHead = () => { if (document.head) { document.head.appendChild(style); } else { requestAnimationFrame(waitForHead); } }; waitForHead(); } // 标记body,方便调试 if (document.body) { document.body.setAttribute('data-eye-protect', 'enabled'); document.body.setAttribute('data-eye-mode', modeId); } }, // 获取网站专用模式 getSiteSpecificMode() { try { let host = location.host; let siteModesStr = this.getConfig('siteSpecificModes') || '{}'; let siteModes = {}; siteModes = JSON.parse(siteModesStr); return siteModes[host] || null; } catch (e) { return null; } }, // 设置网站专用模式 setSiteSpecificMode(mode) { try { let host = location.host; let siteModesStr = this.getConfig('siteSpecificModes') || '{}'; let siteModes = {}; siteModes = JSON.parse(siteModesStr); if (mode === 'default' || mode === null) { delete siteModes[host]; } else { siteModes[host] = mode; } this.setConfig('siteSpecificModes', JSON.stringify(siteModes)); } catch (e) { console.error('设置网站专用模式出错:', e); } }, // 应用通用夜间模式 applyOriginalDarkMode() { let style_30 = this.getConfig('customDark3') || '90'; let dark3Exclude = this.getConfig('dark3Exclude'); let style_31 = ` html { filter: invert(${style_30}%) !important; text-shadow: 0 0 0 !important; } ${dark3Exclude} { filter: invert(1) !important; } img[alt="[公式]"] { filter: none !important; } /* 滚动条样式 */ ::-webkit-scrollbar { height: 12px !important; width: 12px !important; } ::-webkit-scrollbar-thumb { border-radius: 0; border-color: transparent; border-style: dashed; background-color: #3f4752 !important; background-clip: padding-box; transition: background-color .32s ease-in-out; } ::-webkit-scrollbar-corner { background: #202020 !important; } ::-webkit-scrollbar-track { background-color: #22272e !important; } ::-webkit-scrollbar-thumb:hover { background: #3f4752 !important; } `; if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1) { style_31 = ` html { filter: invert(${style_30}%) !important; background-image: url(); text-shadow: 0 0 0 !important; } ${dark3Exclude} { filter: invert(1) !important; } img[alt="[公式]"] { filter: none !important; } `; } this.applyStyle(style_31, 'dark-mode-original'); }, // 判断是否为Firefox浏览器 isFirefox() { return /Firefox/i.test(navigator.userAgent); }, // 应用滤镜模式 applyFilterMode() { // 首先检查是否应该排除当前网站 let filterExcludeList = this.getConfig('filterExcludeList'); let host = location.host; if (filterExcludeList.includes(host)) { this.cleanupAllStyles(); return; } // 彻底清理所有样式 this.cleanupAllStyles(); // 创建SVG滤镜(非Firefox浏览器) if (!this.isFirefox() && !document.getElementById('eye-protect-filter-svg')) { this.createFilterSvg(); } // 创建滤镜样式 this.createFilterStyle(); // 设置深色主题色 this.applyThemeColor('#131313'); }, // 创建SVG滤镜 createFilterSvg() { let svgDom = ''; let div = document.createElementNS('http://www.w3.org/2000/svg', 'div'); div.innerHTML = svgDom; let frag = document.createDocumentFragment(); while (div.firstChild) frag.appendChild(div.firstChild); document.head.appendChild(frag); }, // 创建滤镜样式 createFilterStyle() { let filter = this.isFirefox() ? `filter: url('data:image/svg+xml;utf8,#eye-protect-filter') !important;` : '-webkit-filter: url(#eye-protect-filter) !important; filter: url(#eye-protect-filter) !important;'; let reverseFilter = this.isFirefox() ? `filter: url('data:image/svg+xml;utf8,#eye-protect-filter-reverse') !important;` : '-webkit-filter: url(#eye-protect-filter-reverse) !important; filter: url(#eye-protect-filter-reverse) !important;'; let css = ` @media screen { html { ${filter} scrollbar-color: #454a4d #202324; } /* Default Reverse rule */ img, video, iframe, canvas, :not(object):not(body) > embed, object, svg image, [style*="background:url"], [style*="background-image:url"], [style*="background: url"], [style*="background-image: url"], [background], twitterwidget, .sr-reader, .no-dark-mode, .sr-backdrop { ${reverseFilter} } [style*="background:url"] *, [style*="background-image:url"] *, [style*="background: url"] *, [style*="background-image: url"] *, input, [background] *, img[src^="https://s0.wp.com/latex.php"], twitterwidget .NaturalImage-image { -webkit-filter: none !important; filter: none !important; } /* Text contrast */ html { text-shadow: 0 0 0 !important; } /* Full screen */ .no-filter, :-webkit-full-screen, :-webkit-full-screen *, :-moz-full-screen, :-moz-full-screen *, :fullscreen, :fullscreen * { -webkit-filter: none !important; filter: none !important; } ::-webkit-scrollbar { background-color: #202324; color: #aba499; } ::-webkit-scrollbar-thumb { background-color: #454a4d; } ::-webkit-scrollbar-thumb:hover { background-color: #575e62; } ::-webkit-scrollbar-thumb:active { background-color: #484e51; } ::-webkit-scrollbar-corner { background-color: #181a1b; } /* Page background */ html { background: #fff !important; } } `; let style = document.createElement('style'); style.id = 'eye-protect-filter-style'; style.innerHTML = css; document.head.appendChild(style); }, // 禁用滤镜模式 disableFilterMode() { let style = document.getElementById('eye-protect-filter-style'); if (style) style.remove(); let svg = document.getElementById('eye-protect-filter-svg'); if (svg) svg.remove(); // 恢复原始主题色 this.applyThemeColor(this.getConfig('originThemeColor') || '#ffffff'); }, // 应用夜间模式 applyDarkMode() { // 彻底清理所有样式 this.cleanupAllStyles(); // 根据域名使用不同的处理逻辑 let hostname = window.location.hostname; let pathname = window.location.pathname; // 检查网站专用模式 let siteSpecificMode = this.getSiteSpecificMode(); if (siteSpecificMode === 'light') { // 如果网站专用模式是白天模式,清理样式 this.cleanupAllStyles(); return; } else if (hostname.includes('123pan.com') || hostname.includes('123865.com') || hostname.includes('123pan.cn') || hostname.includes('123-pan.com')) { this.apply123PanDarkMode(); } else if (hostname.includes('bilivod.com')) { this.applyBilivodDarkMode(); } else if (hostname.includes('lanzou')) { this.applyLanzouDarkMode(); } else if (hostname.includes('scriptcat.org') && pathname.includes('/code/')) { this.applyScriptCatCodeMode(); } else { // 对于所有其他网站,都使用移植的通用夜间模式 this.applyOriginalDarkMode(); } // 设置主题色为深色 this.applyThemeColor('#131313'); }, // 应用主题色 applyThemeColor(color) { setTimeout(() => { let meta = document.querySelector('meta[name="theme-color"]'); if (meta) { meta.content = color; } else { let metaEle = document.createElement('meta'); metaEle.name = 'theme-color'; metaEle.content = color; if (document.head) { document.head.appendChild(metaEle); } } }, 100); }, // ScriptCat脚本代码页面专用夜间模式 applyScriptCatCodeMode() { let style_30 = this.getConfig('customDark3') || '90'; let css = ` /* ScriptCat脚本代码页面专用夜间模式 */ html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-color: #0d1117 !important; text-shadow: 0 0 0 !important; } /* 排除需要保持原始颜色的元素 */ img, svg, canvas, iframe, .icon, .logo, .avatar, [class*="icon"], [class*="Icon"], [src*=".svg"], [src*=".png"], [src*=".jpg"], [src*=".jpeg"], [src*=".gif"], [src*=".webp"], .code-preview img, .avatar img { filter: invert(1) hue-rotate(180deg) !important; } body, html { background-color: #0d1117 !important; color: #c9d1d9 !important; } /* 代码查看器主区域 */ .container, .main-container, .wrapper, .content, .code-container, .script-container, .page-content, .main-content { background-color: #0d1117 !important; color: #c9d1d9 !important; } /* 代码查看器头部 */ .header, .script-header, .page-header, .navbar, .nav, .top-bar, [class*="header"], [class*="Header"], .breadcrumb, .nav-bar { background-color: #161b22 !important; border-color: #30363d !important; color: #c9d1d9 !important; } /* 代码高亮区域 */ .code-viewer, .code-area, .editor-container, pre, code, .hljs, .prismjs, [class*="language-"], [class*="syntax-"], .CodeMirror, .cm-s-default, .code-mirror, .code-editor, .editor, .viewer { background-color: #0d1117 !important; color: #c9d1d9 !important; } /* 滚动条优化 */ ::-webkit-scrollbar { width: 12px !important; height: 12px !important; background-color: #0d1117 !important; } ::-webkit-scrollbar-thumb { background-color: #30363d !important; border: 2px solid #0d1117 !important; } /* Firefox兼容性 */ @-moz-document url-prefix() { html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-image: url() !important; background-color: #0d1117 !important; } } `; this.applyStyle(css, 'dark-mode-scriptcat-code'); }, // 123云盘专用夜间模式 - 影视反色技术优化版 apply123PanDarkMode() { let style_30 = this.getConfig('customDark3') || '90'; let css = ` /* ====== 123云盘专用夜间模式(影视反色技术优化版) ====== */ /* 核心:采用影视反色模式的 filter:invert + hue-rotate 方案优化色彩 */ /* 全局基础 - 应用影视反色技术 */ html, body { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-color: #0f1115 !important; color: #e1e4e8 !important; } /* ====== 重点修复:顶部白色区域 ====== */ /* 顶部导航栏区域 - 强制深色背景,不受反色影响 */ header, .header, .top-header, .navbar, .ant-layout-header, .layout-header, .main-header, .page-header, [class*="header"], [class*="Header"], .nav-bar, .top-bar, .app-bar, .sticky-header, .fixed-header { filter: invert(1) hue-rotate(180deg) !important; background-color: #12141a !important; border-bottom-color: #2d333b !important; color: #ffffff !important; } /* 顶部导航栏内部元素 */ .header *, .navbar *, .top-header *, .ant-layout-header * { color: #ffffff !important; background-color: transparent !important; } /* 搜索框区域优化 */ .search-box, .search-container, .ant-input-search, .el-input, input[type="search"], input[type="text"], [class*="search"], [class*="Search"] { background-color: #272c36 !important; border-color: #444c56 !important; color: #e1e4e8 !important; } .ant-input::placeholder, input::placeholder, [placeholder] { color: #768390 !important; } /* ====== 核心优化:恢复蓝色元素(采用影视反色方案) ====== */ /* 蓝色按钮 - 通过反色恢复原始蓝色 */ .ant-btn-primary, .el-button--primary, .btn-primary, .primary-btn, button[type="primary"], [class*="primary"], [class*="Primary"], .ant-btn[type="primary"], .download-btn, .save-btn, button:contains("下载"), button:contains("分享"), button:contains("上传"), button:contains("新建") { filter: invert(1) hue-rotate(180deg) !important; background-color: #1890ff !important; border-color: #1890ff !important; color: #ffffff !important; } /* 蓝色链接和文字 */ a, a:link, a:visited, .ant-typography a, .link, .external-link, [href], [class*="link"], [class*="Link"] { filter: invert(1) hue-rotate(180deg) !important; color: #1890ff !important; } /* 蓝色图标和强调色 */ .blue-icon, .blue-text, [class*="blue"], [class*="Blue"], [style*="color: #1890ff"], [style*="color:#1890ff"], [style*="color: #1a7dff"] { filter: invert(1) hue-rotate(180deg) !important; color: #1890ff !important; } /* 蓝色背景区域 */ .blue-bg, .blue-area, [style*="background-color: #1890ff"], [style*="background-color:#1890ff"], [style*="background: #1890ff"], [style*="background:#1890ff"] { filter: invert(1) hue-rotate(180deg) !important; background-color: #1890ff !important; color: #ffffff !important; } /* ====== 文件列表区域 ====== */ /* 文件列表容器 */ .file-list, .list-container, .ant-list, .ant-table-wrapper, .list-wrapper, .file-container, .file-content, .file-area { background-color: #1a1d23 !important; } /* 文件项目 */ .file-item, .list-item, .ant-list-item, .ant-table-row, .file-row, .list-row { background-color: #20242c !important; border-color: #2d333b !important; color: #e1e4e8 !important; } /* 文件项目悬停效果 */ .file-item:hover, .ant-list-item:hover, .ant-table-row:hover { background-color: #272c36 !important; } /* 文件名称 */ .file-name, .item-name, .ant-list-item-meta-title, .ant-table-cell { color: #e1e4e8 !important; } /* 文件大小和日期 */ .file-size, .file-date, .file-meta, .ant-list-item-meta-description, .size, .date, .time, [class*="size"], [class*="date"], [class*="time"] { color: #adbac7 !important; } /* ====== 按钮和操作区域 ====== */ /* 普通按钮 */ .ant-btn, .el-button, button, .btn, .button, [class*="btn"], [class*="Button"] { background-color: #373e47 !important; border-color: #444c56 !important; color: #adbac7 !important; } .ant-btn:hover, .el-button:hover, button:hover, .btn:hover { background-color: #444c56 !important; border-color: #768390 !important; color: #cdd9e5 !important; } /* 次要按钮(灰色) */ .ant-btn-default, .el-button--default, .btn-default, .default-btn { background-color: #2d333b !important; border-color: #444c56 !important; color: #adbac7 !important; } /* 危险按钮(红色) */ .ant-btn-danger, .el-button--danger, .btn-danger, .danger-btn, button:contains("删除"), button:contains("移除") { filter: invert(1) hue-rotate(180deg) !important; background-color: #ff4d4f !important; border-color: #ff4d4f !important; color: #ffffff !important; } /* ====== 输入框和表单 ====== */ .ant-input, .ant-input-search, input, textarea, select, [class*="input"], [class*="Input"] { background-color: #272c36 !important; border-color: #444c56 !important; color: #e1e4e8 !important; } /* ====== 排除不需要反色的元素 ====== */ img, svg, video, canvas, iframe, .icon, .logo, .anticon, .qrcode, .code-img, .verify-img, .file-icon, .ant-avatar, .file-thumbnail, .preview-image, .ant-image-img, .ant-image-preview-img, .ad-container, .banner, [class*="icon"], [class*="Icon"], [src*=".svg"], [src*=".png"], [src*=".jpg"], [src*=".jpeg"], [src*=".gif"], [src*=".webp"] { filter: invert(1) hue-rotate(180deg) !important; } /* ====== 滚动条优化 ====== */ ::-webkit-scrollbar { width: 12px !important; height: 12px !important; background-color: #0f1115 !important; } ::-webkit-scrollbar-thumb { background-color: #373e47 !important; border: 2px solid #0f1115 !important; border-radius: 6px !important; } ::-webkit-scrollbar-thumb:hover { background-color: #444c56 !important; } ::-webkit-scrollbar-track { background-color: #1a1d23 !important; } ::-webkit-scrollbar-corner { background-color: #0f1115 !important; } /* ====== Firefox兼容性 ====== */ @-moz-document url-prefix() { html, body { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-image: url() !important; background-color: #0f1115 !important; } /* Firefox滚动条 */ * { scrollbar-color: #373e47 #0f1115 !important; scrollbar-width: thin !important; } } /* ====== 通用背景色设置 ====== */ /* 主要背景色 */ html, body { background-color: #0f1115 !important; } div, section, main, article, nav, footer, aside, .app-container, .main-container, .container, .wrapper, .content, .main-content, .page-container, .root-container, body > div, [class*="container"], [class*="Container"] { background-color: #1a1d23 !important; } /* 侧边栏和菜单 */ .sidebar, .side-nav, .menu-container, .ant-layout-sider, .sider, .left-nav, [class*="sidebar"], [class*="Sidebar"], [class*="menu"], [class*="Menu"] { background-color: #16181f !important; border-right-color: #2d333b !important; } /* 卡片和面板 */ .card, .panel, .box, .block, [class*="card"], [class*="Card"], [class*="panel"], [class*="Panel"] { background-color: #20242c !important; border-color: #2d333b !important; color: #e1e4e8 !important; } /* 表格 */ table, .ant-table, [class*="table"], [class*="Table"] { background-color: #1a1d23 !important; color: #e1e4e8 !important; border-color: #2d333b !important; } th, .ant-table-thead > tr > th { background-color: #16181f !important; color: #e1e4e8 !important; border-color: #2d333b !important; } td, .ant-table-tbody > tr > td { background-color: #20242c !important; color: #e1e4e8 !important; border-color: #2d333b !important; } tr:hover td { background-color: #272c36 !important; } /* 文字颜色优化 */ p, span, div, h1, h2, h3, h4, h5, h6, li, label, strong, em, i, b, u, .text, .title, .name, .info, .desc, .content, .label, .tip, .hint, .help, .ant-typography, .ant-text, [class*="text"], [class*="Text"], [class*="title"], [class*="Title"], [class*="name"], [class*="Name"], [class*="label"], [class*="Label"], [class*="desc"], [class*="Desc"], [class*="info"], [class*="Info"], [class*="content"], [class*="Content"], [class*="tip"], [class*="Tip"], [class*="hint"], [class*="Hint"], [class*="help"], [class*="Help"] { color: #e1e4e8 !important; } `; this.applyStyle(css, 'dark-mode-123pan'); }, // bilivod.com专用夜间模式 applyBilivodDarkMode() { let style_30 = this.getConfig('customDark3') || '90'; let css = ` /* bilivod.com专用夜间模式 */ html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-color: #1a1a1a !important; text-shadow: 0 0 0 !important; } /* 排除不需要反色的元素 */ img, svg, video, canvas, iframe, .icon, .logo, .thumbnail, .avatar, [class*="icon"], [class*="Icon"], [src*=".svg"], [src*=".png"], [src*=".jpg"], [src*=".jpeg"], [src*=".gif"], [src*=".webp"], .video-player, .player, [class*="player"], [class*="Player"] { filter: invert(1) hue-rotate(180deg) !important; } body { background-color: #1a1a1a !important; } /* bilivod.com特定优化 */ body, div, section, main, article, nav, header, footer, aside, .container, .wrapper, .content, .main-content, .panel, .card, .box, .block, .list, .item, .entry, .video-list, .video-item, .vod-item { background-color: #1a1a1a !important; color: #d0d0d0 !important; border-color: #333 !important; } /* 强力覆盖所有内联白色背景 */ [style*="background-color: white"], [style*="background: white"], [style*="background:#fff"], [style*="background-color:#fff"], [style*="background-color: #fff"], [style*="background-color: #ffffff"] { background-color: #1a1a1a !important; } /* 导航栏和头部 */ .header, .navbar, .nav, .top-bar, .menu, .toolbar, .bar { background-color: #222 !important; } /* 按钮和表单 */ button, .btn, .button, input, textarea, select { background-color: #2a2a2a !important; color: #e0e0e0 !important; border-color: #444 !important; } /* 链接和蓝色区域 */ a, a:link, a:visited { color: #ff7700 !important; } a:hover { color: #ff9933 !important; } .btn-primary, .primary, .blue { background-color: #ff7700 !important; } /* 滚动条 */ ::-webkit-scrollbar { background-color: #1a1a1a !important; } ::-webkit-scrollbar-thumb { background-color: #444 !important; } ::-webkit-scrollbar-thumb:hover { background-color: #555 !important; } ::-webkit-scrollbar-track { background-color: #222 !important; } /* Firefox兼容性 */ @-moz-document url-prefix() { html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-image: url() !important; background-color: #1a1a1a !important; } } `; this.applyStyle(css, 'dark-mode-bilivod'); }, // 蓝奏云优化的反色模式 applyLanzouDarkMode() { let style_30 = this.getConfig('customDark3') || '90'; let css = ` /* 蓝奏云夜间模式优化版 */ html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-color: #1a1a1a !important; text-shadow: 0 0 0 !important; } img, svg, video, canvas, iframe, .icon, .logo, .qrcode, .code-img { filter: invert(1) hue-rotate(180deg) !important; } body, html { background-color: #1a1a1a !important; color: #e0e0e0 !important; } div, section, main, article, nav, header, footer, aside, .container, .wrapper, .content, .main, .panel, .box { background-color: #1a1a1a !important; color: #e0e0e0 !important; } .file-list, .folder-list, .data-list, .table, .list-container, .list-box { background-color: #222 !important; border: 1px solid #333 !important; } .file-item, .folder-item, .list-item, tr, .data-item, .list-row { background-color: #2a2a2a !important; color: #e0e0e0 !important; border-color: #333 !important; } button, .btn, input[type="button"], input[type="submit"], .download-btn { background-color: #0066cc !important; color: white !important; border: 1px solid #0066cc !important; } button:hover, .btn:hover, .download-btn:hover { background-color: #0080ff !important; border-color: #0080ff !important; } input, textarea, select, .form-control { background-color: #2a2a2a !important; color: #e0e0e0 !important; border: 1px solid #444 !important; } a, a:link, a:visited { color: #66aaff !important; } a:hover, a:active { color: #88ccff !important; } ::-webkit-scrollbar { width: 12px !important; height: 12px !important; background-color: #222 !important; } ::-webkit-scrollbar-thumb { background-color: #444 !important; border-radius: 6px !important; } @-moz-document url-prefix() { html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-image: url() !important; background-color: #1a1a1a !important; } } `; this.applyStyle(css, 'dark-mode-lanzou'); }, // 应用墨黑模式 applyInkMode() { this.cleanupAllStyles(); let config = this.getConfig('inkModeConfig').split('|'); let backgroundColor = config[0] || '#343c3e'; let textColor = config[1] || '#ffffff'; let secondaryBg = config[2] || '#4a5457'; let borderColor = config[3] || '#5d696c'; let primaryColor = config[4] || '#009688'; let hoverColor = config[5] || '#26a69a'; let css = this.generateInkModeCSS(backgroundColor, textColor, secondaryBg, borderColor, primaryColor, hoverColor); this.applyStyle(css, 'ink-mode'); this.applyThemeColor(backgroundColor); }, // 应用影视反色模式(通用bilivod.com技术) applyVideoInvertMode() { let style_30 = this.getConfig('customDark3') || '90'; let css = ` /* ====== 影视反色模式(基于bilivod.com技术) ====== */ /* 特色:通过反色+hue旋转创造柔和影视色调,适合视频类网站 */ /* 核心滤镜:反色+色调旋转 */ html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-color: #0a0a0a !important; text-shadow: 0 0 0 !important; } /* 恢复媒体元素原始色彩 */ img, svg, video, canvas, iframe, .icon, .logo, .thumbnail, .avatar, [class*="icon"], [class*="Icon"], [src*=".svg"], [src*=".png"], [src*=".jpg"], [src*=".jpeg"], [src*=".gif"], [src*=".webp"], .video-player, .player, [class*="player"], [class*="Player"], [id*="player"], [id*="Player"], .plyr, .jw-player, .video-js, .ad-container, .banner, .qrcode, .code-img, .preview-image, .cover-image { filter: invert(1) hue-rotate(180deg) !important; } /* 基础背景色 */ body, html { background-color: #0a0a0a !important; color: #cccccc !important; } /* 通用容器深色背景 */ body, div, section, main, article, nav, header, footer, aside, .container, .wrapper, .content, .main-content, .panel, .card, .box, .block, .list, .item, .entry, .video-list, .video-item, .vod-item, .movie-list, .film-list, .tv-list, [class*="container"], [class*="Container"], [class*="wrapper"], [class*="Wrapper"], [class*="content"], [class*="Content"] { background-color: #0a0a0a !important; color: #cccccc !important; border-color: #333333 !important; } /* 强力覆盖白色内联背景 */ [style*="background-color: white"], [style*="background: white"], [style*="background:#fff"], [style*="background-color:#fff"], [style*="background-color: #fff"], [style*="background-color: #ffffff"], [style*="background: #fff"], [style*="background: #ffffff"] { background-color: #0a0a0a !important !important; } /* 导航栏和头部区域 */ .header, .navbar, .nav, .top-bar, .menu, .toolbar, .bar, [class*="header"], [class*="Header"], [class*="navbar"], [class*="Navbar"], [class*="nav"], [class*="Nav"] { background-color: #121212 !important; border-color: #333333 !important; } /* 按钮和表单元素 */ button, .btn, .button, input, textarea, select, [class*="btn"], [class*="Button"], [class*="input"], [class*="Input"] { background-color: #1a1a1a !important; color: #e0e0e0 !important; border-color: #444444 !important; } /* 链接颜色优化 */ a, a:link, a:visited { color: #ff6600 !important; } a:hover, a:active { color: #ff8833 !important; } /* 主要按钮(橙色主题) */ .btn-primary, .primary, .blue, button:contains("播放"), button:contains("观看"), button:contains("下载"), button:contains("收藏") { filter: invert(1) hue-rotate(180deg) !important; background-color: #ff6600 !important; border-color: #ff6600 !important; color: #ffffff !important; } /* 滚动条优化 */ ::-webkit-scrollbar { width: 12px !important; height: 12px !important; background-color: #0a0a0a !important; } ::-webkit-scrollbar-thumb { background-color: #333333 !important; border-radius: 6px !important; } ::-webkit-scrollbar-thumb:hover { background-color: #444444 !important; } ::-webkit-scrollbar-track { background-color: #121212 !important; } ::-webkit-scrollbar-corner { background-color: #0a0a0a !important; } /* 列表和表格 */ table, .table, .list, .data-table, [class*="table"], [class*="Table"], [class*="list"], [class*="List"] { background-color: #0a0a0a !important; color: #cccccc !important; border-color: #333333 !important; } th, .table-header, thead th { background-color: #121212 !important; color: #cccccc !important; } td, .table-cell, tbody td { background-color: #0a0a0a !important; color: #cccccc !important; } tr:hover td, .table-row:hover { background-color: #1a1a1a !important; } /* 卡片和面板 */ .card, .panel, .box, [class*="card"], [class*="Card"], [class*="panel"], [class*="Panel"] { background-color: #121212 !important; color: #cccccc !important; border-color: #333333 !important; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3) !important; } /* 文字颜色通用设置 */ p, span, div, h1, h2, h3, h4, h5, h6, li, label, strong, em, i, b, u, .text, .title, .name, .info, .desc, .content, .label, .tip, .hint, .help, .ant-typography, .ant-text, [class*="text"], [class*="Text"], [class*="title"], [class*="Title"], [class*="name"], [class*="Name"], [class*="label"], [class*="Label"], [class*="desc"], [class*="Desc"], [class*="info"], [class*="Info"], [class*="content"], [class*="Content"], [class*="tip"], [class*="Tip"], [class*="hint"], [class*="Hint"], [class*="help"], [class*="Help"] { color: #cccccc !important; } /* 输入框占位符 */ ::placeholder, .ant-input::placeholder, input::placeholder, textarea::placeholder { color: #888888 !important; } /* Firefox兼容性 */ @-moz-document url-prefix() { html { filter: invert(${style_30}%) hue-rotate(180deg) !important; background-image: url() !important; background-color: #0a0a0a !important; } /* Firefox滚动条 */ * { scrollbar-color: #333333 #0a0a0a !important; scrollbar-width: thin !important; } } /* 深色主题色 */ meta[name="theme-color"] { content: "#0a0a0a" !important; } `; this.applyStyle(css, 'video-invert-mode'); this.applyThemeColor('#0a0a0a'); }, // 生成墨黑模式CSS generateInkModeCSS(bgColor, textColor, secondaryBg, borderColor, primaryColor, hoverColor) { return ` /* 墨黑模式 */ html, body { background-color: ${bgColor} !important; color: ${textColor} !important; } div, section, main, article, nav, header, footer, aside, .container, .wrapper, .content, .card, .box { background-color: ${bgColor} !important; color: ${textColor} !important; border-color: ${borderColor} !important; } p, span, h1, h2, h3, h4, h5, h6 { color: ${textColor} !important; } a, a:link, a:visited { color: ${primaryColor} !important; } a:hover, a:active { color: ${hoverColor} !important; } button, .btn, input[type="button"], input[type="submit"] { background-color: ${secondaryBg} !important; color: ${textColor} !important; border-color: ${borderColor} !important; } button:hover, .btn:hover { background-color: ${primaryColor} !important; border-color: ${primaryColor} !important; } input, textarea, select { background-color: ${secondaryBg} !important; color: ${textColor} !important; border-color: ${borderColor} !important; } input:focus, textarea:focus { border-color: ${primaryColor} !important; } table, tr, th, td { background-color: ${bgColor} !important; color: ${textColor} !important; border-color: ${borderColor} !important; } th { background-color: ${secondaryBg} !important; } tr:nth-child(even) { background-color: ${secondaryBg} !important; } ::-webkit-scrollbar { width: 12px !important; height: 12px !important; background-color: ${secondaryBg} !important; } ::-webkit-scrollbar-thumb { background-color: ${borderColor} !important; } ::-webkit-scrollbar-thumb:hover { background-color: ${primaryColor} !important; } `; }, // 是否应该排除当前网站 shouldExcludeSite() { let hostname = window.location.hostname; // 对于特定网站,我们使用专门的处理逻辑 if (hostname.includes('bilivod.com') || hostname.includes('lanzou') || hostname.includes('scriptcat.org')) { return false; } let forcedList = this.getConfig('forcedEnableList'); if (forcedList.includes(location.host)) { return false; } // 通用排除逻辑 let html = document.documentElement; let body = document.body; if (document.querySelector('head>meta[name="color-scheme"],head>link[href^="resource:"]')) { return true; } if (html.className && (html.className.includes('dark') || body.className && body.className.includes('dark'))) { return true; } if (html.getAttribute('data-theme') && html.getAttribute('data-theme').includes('dark')) { return true; } if (html.getAttribute('data-color-mode') && html.getAttribute('data-color-mode').includes('dark')) { return true; } return false; }, // 是否应该应用模式 shouldApplyMode() { let globalEnable = this.getConfig('globalEnable'); let enableList = this.getConfig('enableList'); let blacklist = this.getConfig('blacklist'); let forcedList = this.getConfig('forcedEnableList'); let host = location.host; // 第一步:检查黑名单(最高优先级) if (blacklist.includes(host)) { return false; } // 第二步:检查强制启用列表(修改:受全局开关和白名单影响) if (forcedList.includes(host)) { // 强制启用需要满足:全局开关开启 或 该网站在白名单中 if (globalEnable || enableList.includes(host)) { return true; } return false; } // 第三步:检查全局开关 if (globalEnable) { return true; } // 第四步:检查白名单 if (enableList.includes(host)) { return true; } // 都不满足,不应用模式 return false; }, // 切换黑名单状态 toggleBlacklist() { let blacklist = this.getConfig('blacklist'); let host = location.host; if (blacklist.includes(host)) { blacklist = blacklist.filter(domain => domain !== host); this.setConfig('blacklist', blacklist); this.showNotification('已将当前网站从黑名单中移除'); if (this.shouldApplyMode()) { this.applyMode(); } } else { blacklist.push(host); this.setConfig('blacklist', blacklist); this.showNotification('已将当前网站添加到黑名单'); this.cleanupAllStyles(); } this.refreshMenu(); }, // 清空黑名单 clearBlacklist() { if (confirm('确定要清空黑名单吗?这将移除所有在黑名单中的网站。')) { this.setConfig('blacklist', []); this.showNotification('已清空黑名单'); this.refreshMenu(); } }, // 清空强制启用列表 clearForcedList() { if (confirm('确定要清空强制启用列表吗?这将移除所有强制启用的网站。')) { this.setConfig('forcedEnableList', []); this.showNotification('已清空强制启用列表'); this.applyMode(); this.refreshMenu(); } }, // 应用模式 applyMode() { if (!this.shouldApplyMode()) { this.cleanupAllStyles(); return; } if (this.getConfig('autoExclude') && this.shouldExcludeSite()) { this.cleanupAllStyles(); return; } let siteSpecificMode = this.getSiteSpecificMode(); if (siteSpecificMode && siteSpecificMode !== 'default') { switch(siteSpecificMode) { case 'light': this.cleanupAllStyles(); break; case 'dark': this.applyDarkMode(); break; case 'ink': this.applyInkMode(); break; case 'filter': this.applyFilterMode(); break; case 'video': // 新增影视反色模式 this.applyVideoInvertMode(); break; } } else { let mode = this.getCurrentMode(); switch(mode) { case 'dark': this.applyDarkMode(); break; case 'light': default: this.cleanupAllStyles(); break; } } }, // 切换模式(只包含light和dark,去掉了ink和video) switchMode() { let siteSpecificMode = this.getSiteSpecificMode(); if (siteSpecificMode && siteSpecificMode !== 'default') { this.showNotification('当前网站使用专用模式,请在设置面板中修改'); setTimeout(() => this.showSettings(), 100); return; } let currentMode = this.currentMode || this.getConfig('currentMode') || 'light'; // 全局切换中只包含light, dark两种模式(去掉了ink和video) let nextMode = currentMode === 'light' ? 'dark' : 'light'; this.currentMode = nextMode; this.setConfig('currentMode', nextMode); this.showNotification(`正在切换到 ${this.getModeName(nextMode)}`); setTimeout(() => { this.applyMode(); this.refreshMenu(); this.showNotification(`已切换到 ${this.getModeName(nextMode)}`); }, 100); }, // 获取模式名称 getModeName(mode) { switch(mode) { case 'light': return '白天模式'; case 'dark': return '夜间模式'; case 'ink': return '墨黑模式'; case 'filter': return '滤镜模式'; case 'video': // 新增影视反色模式 return '影视反色模式'; default: return '白天模式'; } }, // 获取网站模式名称 getSiteModeName(mode) { switch(mode) { case 'light': return '白天模式'; case 'dark': return '夜间模式'; case 'ink': return '墨黑模式'; case 'filter': return '滤镜模式'; case 'video': return '🎬 影视反色模式'; // 新增影视反色模式 default: return '默认'; } }, // 切换全局开关 toggleGlobal() { let current = this.getConfig('globalEnable'); this.setConfig('globalEnable', !current); this.applyMode(); this.refreshMenu(); this.showNotification(!current ? '已开启全局模式' : '已关闭全局模式'); }, // 切换当前网站开关(白名单管理) toggleCurrentSite() { let enableList = this.getConfig('enableList'); let host = location.host; if (enableList.includes(host)) { enableList = enableList.filter(domain => domain !== host); this.cleanupAllStyles(); this.setConfig('enableList', enableList); this.showNotification('已在当前网站禁用护眼模式'); } else { enableList.push(host); this.setConfig('enableList', enableList); this.applyMode(); this.showNotification('已在当前网站启用护眼模式'); } this.refreshMenu(); }, // 切换强制启用 toggleForceEnable() { let forcedList = this.getConfig('forcedEnableList'); let host = location.host; if (forcedList.includes(host)) { forcedList = forcedList.filter(domain => domain !== host); this.showNotification('已取消强制启用当前网站'); } else { forcedList.push(host); this.showNotification('已强制启用当前网站'); } this.setConfig('forcedEnableList', forcedList); this.applyMode(); this.refreshMenu(); }, // 显示通知 showNotification(message) { let oldNotifications = document.querySelectorAll('.eye-protect-notification'); oldNotifications.forEach(notification => { notification.remove(); }); let notification = document.createElement('div'); notification.className = 'eye-protect-notification'; notification.style.cssText = ` position: fixed; top: 20px; right: 20px; background: rgba(0, 0, 0, 0.8); color: white; padding: 10px 20px; border-radius: 5px; z-index: 999999; font-size: 14px; box-shadow: 0 2px 5px rgba(0,0,0,0.2); opacity: 1; transition: opacity 0.5s; max-width: 300px; word-wrap: break-word; `; notification.textContent = message; if (document.body) { document.body.appendChild(notification); setTimeout(() => { notification.style.opacity = '0'; setTimeout(() => notification.remove(), 500); }, 2000); } }, // 显示设置面板 showSettings() { // 移除现有的设置面板 let existingPanel = document.querySelector('.eye-protect-settings-panel'); if (existingPanel) { existingPanel.remove(); return; } // 获取当前配置 let currentMode = this.getCurrentMode(); let globalEnable = this.getConfig('globalEnable'); let enableList = this.getConfig('enableList'); let blacklist = this.getConfig('blacklist'); let autoExclude = this.getConfig('autoExclude'); let forcedList = this.getConfig('forcedEnableList'); let runDuringDay = this.getConfig('runDuringDay'); let darkAuto = this.getConfig('darkAuto'); let inkConfig = this.getConfig('inkModeConfig'); let autoSwitch = this.getConfig('autoSwitch'); let customDayNight = this.getConfig('customDayNight'); let customDark3 = this.getConfig('customDark3'); let host = location.host; let siteEnabled = enableList.includes(host); let isForced = forcedList.includes(host); let isBlacklisted = blacklist.includes(host); let blacklistCount = blacklist.length; // 获取当前网站的专用模式 let siteSpecificMode = this.getSiteSpecificMode(); // 创建设置面板 let panel = document.createElement('div'); panel.className = 'eye-protect-settings-panel'; // 使用亮色主题样式,不受当前模式影响 panel.style.cssText = ` position: fixed !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; width: 550px !important; max-width: 90% !important; max-height: 85vh !important; background: #ffffff !important; color: #333333 !important; border-radius: 10px !important; box-shadow: 0 5px 20px rgba(0,0,0,0.2) !important; z-index: 1000000 !important; overflow: hidden !important; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important; border: 1px solid #e0e0e0 !important; `; // 面板内容 - 使用亮色主题(恢复完整的设置选项) panel.innerHTML = `
🛡️ 夜间护眼助手设置 v5.6.14

📱 当前状态

当前模式: ${currentMode === 'light' ? '☀️ 白天模式' : '🌙 夜间模式'}
当前网站: ${host}
全局开关: ${globalEnable ? '✅ 已开启' : '❌ 已关闭'}
白名单状态: ${siteEnabled ? '✅ 已启用' : '❌ 未启用'}
黑名单状态: ${isBlacklisted ? '⛔ 已禁用' : '❌ 未禁用'}
强制启用: ${isForced ? '⚡ 已强制启用' : '🚫 未强制启用'}
网站专用模式: ${siteSpecificMode ? this.getSiteModeName(siteSpecificMode) : '默认'}

🌐 网站专用模式设置

为当前网站设置专用模式,此设置仅在白名单或全局开启时生效
当前设置:${siteSpecificMode ? this.getSiteModeName(siteSpecificMode) : '默认'}
影视反色模式说明:
• 采用 bilivod.com 色彩处理技术
• 反色+色调旋转创造柔和影视色调
• 特别适合视频类网站
• 恢复媒体元素原始色彩
• 橙色主题按钮和链接

⚡ 强制启用管理

新规则:强制启用列表中的网站需要满足以下条件之一才会生效:
1. 全局开关开启
2. 该网站在白名单中
注意:强制启用仍然不受黑名单影响
强制启用状态:
${host}:${isForced ? '已强制启用' : '未强制启用'}
当前生效条件:
• 全局开关:${globalEnable ? '✅ 已开启' : '❌ 已关闭'}
• 白名单:${siteEnabled ? '✅ 已启用' : '❌ 未启用'}
强制启用生效: ${isForced && (globalEnable || siteEnabled) ? '✅ 是' : '❌ 否'}

⛔ 黑名单管理

黑名单中的网站将始终禁用护眼模式,优先级最高(强制启用也受黑名单影响)
当前黑名单状态:${blacklistCount} 个网站
${host}:${isBlacklisted ? '⛔ 已禁用' : '❌ 未禁用'}
优先级顺序:
1. 黑名单(最高优先级)
2. 强制启用(需要全局或白名单开启)
3. 全局开关
4. 白名单
${blacklistCount > 0 ? `
当前黑名单网站:
${blacklist.map(site => `
${site}
`).join('')}
` : ''}

⚙️ 全局设置

全局开关:
智能排除:
白天开启:
跟随系统:

🕐 时间设置

格式:白天开始时间|白天结束时间,如6:00|18:00
格式:白天模式|夜间模式,0=白天 1=夜间(墨黑模式和影视反色模式仅限网站专用模式)
夜间模式和影视反色模式的反色强度,默认90(0-100)
格式:背景色|文字色|次要背景色|边框色|主色调|悬停色(墨黑模式仅限网站专用模式)
`; // 添加到页面 document.body.appendChild(panel); // 添加设置面板专用CSS,确保其不受任何模式影响 let panelStyle = document.createElement('style'); panelStyle.textContent = ` /* 设置面板专用样式 - 强制亮色主题,不受任何模式影响 */ .eye-protect-settings-panel { filter: none !important; background: #ffffff !important; color: #333333 !important; border-color: #e0e0e0 !important; } .eye-protect-settings-panel * { filter: none !important; background: inherit !important; color: inherit !important; } /* 切换开关样式 */ .toggle-switch input:checked + .toggle-slider::before { transform: translateX(26px) !important; } .toggle-switch input:checked + .toggle-slider { background-color: #007bff !important; } .toggle-switch .toggle-slider::before { content: "" !important; position: absolute !important; height: 16px !important; width: 16px !important; left: 4px !important; bottom: 4px !important; background-color: white !important; border-radius: 50% !important; transition: .4s !important; } `; document.head.appendChild(panelStyle); // 事件绑定 setTimeout(() => { // 关闭按钮事件 panel.querySelector('#closeBtn').addEventListener('click', (e) => { e.stopPropagation(); panel.remove(); }); // 网站专用模式相关事件 panel.querySelector('#applySiteMode').addEventListener('click', () => { let select = panel.querySelector('#siteSpecificMode'); let mode = select.value; if (mode === 'default') { this.setSiteSpecificMode(null); this.showNotification('已重置当前网站的专用模式为默认'); } else { this.setSiteSpecificMode(mode); this.showNotification(`已为当前网站设置专用模式:${this.getSiteModeName(mode)}`); } this.applyMode(); this.refreshMenu(); panel.remove(); }); panel.querySelector('#resetSiteMode').addEventListener('click', () => { this.setSiteSpecificMode(null); this.showNotification('已重置当前网站的专用模式为默认'); this.applyMode(); this.refreshMenu(); panel.remove(); }); // 强制启用相关事件 panel.querySelector('#toggleForceEnable').addEventListener('click', () => { this.toggleForceEnable(); panel.remove(); }); panel.querySelector('#clearForcedList').addEventListener('click', () => { this.clearForcedList(); }); // 黑名单相关事件 panel.querySelector('#toggleBlacklist').addEventListener('click', () => { this.toggleBlacklist(); panel.remove(); }); panel.querySelector('#clearBlacklist').addEventListener('click', () => { this.clearBlacklist(); }); // 功能按钮事件 panel.querySelector('#toggleMode').addEventListener('click', () => { this.switchMode(); panel.remove(); }); panel.querySelector('#toggleSite').addEventListener('click', () => { this.toggleCurrentSite(); panel.remove(); }); panel.querySelector('#saveSettings').addEventListener('click', () => { // 保存所有设置 this.setConfig('globalEnable', panel.querySelector('#globalEnable').checked); this.setConfig('autoExclude', panel.querySelector('#autoExclude').checked); this.setConfig('runDuringDay', panel.querySelector('#runDuringDay').checked); this.setConfig('darkAuto', panel.querySelector('#darkAuto').checked); let dayNight = panel.querySelector('#customDayNight').value; if (dayNight) this.setConfig('customDayNight', dayNight); let autoSwitchVal = panel.querySelector('#autoSwitch').value; this.setConfig('autoSwitch', autoSwitchVal); let dark3Val = panel.querySelector('#customDark3').value; if (dark3Val) this.setConfig('customDark3', dark3Val); let inkConfigVal = panel.querySelector('#inkModeConfig').value; if (inkConfigVal) { this.setConfig('inkModeConfig', inkConfigVal); if (this.getCurrentMode() === 'ink') this.applyInkMode(); } this.applyMode(); this.refreshMenu(); this.showNotification('✅ 设置已保存'); panel.remove(); }); panel.querySelector('#resetSettings').addEventListener('click', () => { if (confirm('确定要恢复所有默认设置吗?')) { for (let key in this.defaults) { this.setConfig(key, this.defaults[key]); } this.setConfig('currentMode', 'light'); this.currentMode = 'light'; this.applyMode(); this.refreshMenu(); this.showNotification('✅ 已恢复默认设置'); panel.remove(); } }); // ESC键关闭 const handleEscKey = (e) => { if (e.key === 'Escape' && panel && panel.parentNode) { panel.remove(); document.removeEventListener('keydown', handleEscKey); } }; document.addEventListener('keydown', handleEscKey); }, 0); }, // 清除所有菜单 clearMenu() { menuCommands.forEach(cmd => { try { GM_unregisterMenuCommand(cmd); } catch (e) { // 忽略错误 } }); menuCommands = []; }, // 刷新菜单 refreshMenu() { this.clearMenu(); this.initMenu(); }, // 初始化菜单 initMenu() { let currentMode = this.getCurrentMode(); let globalEnable = this.getConfig('globalEnable'); let enableList = this.getConfig('enableList'); let host = location.host; let siteEnabled = enableList.includes(host); let siteSpecificMode = this.getSiteSpecificMode(); let modeIcon = currentMode === 'light' ? '☀️' : '🌙'; let siteModeText = siteSpecificMode ? ` [${this.getSiteModeName(siteSpecificMode)}]` : ''; menuCommands.push(GM_registerMenuCommand(`${modeIcon} ${this.getModeName(currentMode)}${siteModeText}`, () => { this.switchMode(); })); menuCommands.push(GM_registerMenuCommand(globalEnable ? '🌍 全局: 开启 (点击关闭)' : '🌍 全局: 关闭 (点击开启)', () => { this.toggleGlobal(); })); menuCommands.push(GM_registerMenuCommand(siteEnabled ? '✅ 本站: 启用 (点击禁用)' : '❌ 本站: 禁用 (点击启用)', () => { this.toggleCurrentSite(); })); menuCommands.push(GM_registerMenuCommand('⚙️ 设置面板', () => { this.showSettings(); })); } }; // 立即初始化 EyeProtect.init(); })();