


前 * 页面主题面板切换时调用 window.SysTheme.set('day'|'night') * ============================================================ */ (function () { 'use strict'; if (window.SysTheme) return; var NIGHT_VARS = { '--sys-bg': '#0e1320', '--sys-surface': 'rgba(24,31,48,.92)', '--sys-surface-2': 'rgba(31,40,60,.92)', '--sys-surface-3': 'rgba(18,24,38,.96)', '--sys-line': 'rgba(255,255,255,.10)', '--sys-line-2': 'rgba(255,255,255,.06)', '--sys-txt': '#e6edf8', '--sys-txt-2': '#b9c6da', '--sys-txt-3': '#8b9bb4', '--sys-hover': 'rgba(255,255,255,.07)' }; var DAY_VARS = { '--sys-bg': '#f2f5fa', '--sys-surface': 'rgba(255,255,255,.92)', '--sys-surface-2': 'rgba(255,255,255,.96)', '--sys-surface-3': 'rgba(255,255,255,.98)', '--sys-line': 'rgba(24,42,78,.12)', '--sys-line-2': 'rgba(24,42,78,.08)', '--sys-txt': '#1b2436', '--sys-txt-2': '#3a4763', '--sys-txt-3': '#6b7a94', '--sys-hover': 'rgba(24,42,78,.06)' }; var CSS = [ /* ---------- 夜间:把浅色表面翻成深色 ---------- */ 'html[data-systheme="night"]{color-scheme:dark}', 'html[data-systheme="night"] body{', ' background-color:#0e1320 !important;color:#e6edf8 !important}', /* 半透明白/浅色背景的通用容器 → 深色。 用 [class*=..] 粗粒度匹配 + background-color 覆盖, 不碰 background-image(保留渐变/图标等视觉基因)。 */ 'html[data-systheme="night"] .card,', 'html[data-systheme="night"] .panel,', 'html[data-systheme="night"] .box,', 'html[data-systheme="night"] .tile,', 'html[data-systheme="night"] .item,', 'html[data-systheme="night"] .stat,', 'html[data-systheme="night"] .modal,', 'html[data-systheme="night"] .dialog,', 'html[data-systheme="night"] .popup,', 'html[data-systheme="night"] .dropdown,', 'html[data-systheme="night"] .menu,', 'html[data-systheme="night"] .sheet,', 'html[data-systheme="night"] .topbar,', 'html[data-systheme="night"] .navbar,', 'html[data-systheme="night"] .header,', 'html[data-systheme="night"] .sidebar,', 'html[data-systheme="night"] .footer,', 'html[data-systheme="night"] .wrap-card,', 'html[data-systheme="night"] [class*="-card"],', 'html[data-systheme="night"] [class*="-panel"],', 'html[data-systheme="night"] [class*="-box"]{', ' background-color:rgba(24,31,48,.90) !important;', ' border-color:rgba(255,255,255,.10) !important}', /* 文字色兜底 */ 'html[data-systheme="night"] h1,html[data-systheme="night"] h2,', 'html[data-systheme="night"] h3,html[data-systheme="night"] h4{color:#eaf1fb !important}', 'html[data-systheme="night"] .card,html[data-systheme="night"] .panel,', 'html[data-systheme="night"] [class*="-card"]{color:#dfe8f5 !important}', /* 输入控件 */ 'html[data-systheme="night"] input,html[data-systheme="night"] select,', 'html[data-systheme="night"] textarea{', ' background-color:rgba(15,20,33,.92) !important;', ' color:#e6edf8 !important;border-color:rgba(255,255,255,.14) !important}', 'html[data-systheme="night"] input::placeholder,', 'html[data-systheme="night"] textarea::placeholder{color:#7b8aa3 !important}', /* 按钮:只改"浅底深字"的按钮,保留彩色主按钮 */ 'html[data-systheme="night"] button:not([class*="primary"]):not([class*="pri"]),', 'html[data-systheme="night"] .btn:not([class*="primary"]):not([class*="pri"]){', ' background-color:rgba(31,40,60,.92) !important;', ' color:#dbe6f5 !important;border-color:rgba(255,255,255,.14) !important}', /* 表格 */ 'html[data-systheme="night"] th{background-color:rgba(31,40,60,.95) !important;color:#cfdcef !important}', 'html[data-systheme="night"] td{border-color:rgba(255,255,255,.08) !important;color:#dbe6f5 !important}', 'html[data-systheme="night"] tr{background-color:transparent !important}', /* 浅色"标签/徽章" → 深色底亮字(保留彩色调,只压暗底) */ 'html[data-systheme="night"] .tag,html[data-systheme="night"] .badge,', 'html[data-systheme="night"] .chip,html[data-systheme="night"] .pill,', 'html[data-systheme="night"] [class*="-tag"],html[data-systheme="night"] [class*="-badge"]{', ' background-color:rgba(255,255,255,.10) !important}', /* 提示条 */ 'html[data-systheme="night"] .tip,html[data-systheme="night"] .hint,', 'html[data-systheme="night"] .alert,html[data-systheme="night"] .notice{', ' background-color:rgba(31,40,60,.92) !important;', ' color:#dbe6f5 !important;border-color:rgba(255,255,255,.12) !important}', /* 分隔线 */ 'html[data-systheme="night"] hr{border-color:rgba(255,255,255,.10) !important}', /* ---------- 兜底①:语义标签 ---------- */ 'html[data-systheme="night"] .list,html[data-systheme="night"] .row,', 'html[data-systheme="night"] .stats,html[data-systheme="night"] .grid,', 'html[data-systheme="night"] .cols,html[data-systheme="night"] .main,', 'html[data-systheme="night"] .content,html[data-systheme="night"] .body,', 'html[data-systheme="night"] .container,html[data-systheme="night"] .wrapper,', 'html[data-systheme="night"] .section,html[data-systheme="night"] .block,', 'html[data-systheme="night"] .entry,html[data-systheme="night"] .line,', 'html[data-systheme="night"] .row1,html[data-systheme="night"] .item-wrap{', ' background-color:transparent !important}', /* ---------- 兜底②:任何显式浅底(白/近白)元素一律翻深 ---------- 用属性选择器匹配 style 内联与常见浅色值,避免"简约页面类名不匹配"漏网 */ 'html[data-systheme="night"] [style*="background:#fff"],', 'html[data-systheme="night"] [style*="background: #fff"],', 'html[data-systheme="night"] [style*="background:#ffffff"],', 'html[data-systheme="night"] [style*="background:white"],', 'html[data-systheme="night"] [style*="background: white"],', 'html[data-systheme="night"] [style*="background-color:#fff"],', 'html[data-systheme="night"] [style*="background-color: #fff"],', 'html[data-systheme="night"] [style*="background-color:#ffffff"],', 'html[data-systheme="night"] [style*="background:#f"],', 'html[data-systheme="night"] [style*="background: #f"],', 'html[data-systheme="night"] [style*="background-color:#f"],', 'html[data-systheme="night"] [style*="background-color: #f"]{', ' background-color:#1a2133 !important}', /* ---------- 兜底③:全局"浅色文字"校正(避免深色字留在深底上) ---------- */ 'html[data-systheme="night"] [style*="color:#1"],', 'html[data-systheme="night"] [style*="color: #1"],', 'html[data-systheme="night"] [style*="color:#2"],', 'html[data-systheme="night"] [style*="color: #2"],', 'html[data-systheme="night"] [style*="color:#3"],', 'html[data-systheme="night"] [style*="color: #3"],', 'html[data-systheme="night"] [style*="color:#4"],', 'html[data-systheme="night"] [style*="color: #4"],', 'html[data-systheme="night"] [style*="color:#5"],', 'html[data-systheme="night"] [style*="color: #5"]{', ' color:#e6edf8 !important}', /* 滚动条 */ 'html[data-systheme="night"] ::-webkit-scrollbar-track{background:#121828 !important}', 'html[data-systheme="night"] ::-webkit-scrollbar-thumb{background:#2a3550 !important}', /* ---------- 白天:把"纯暗色设计"的页面翻成白底暗字 ---------- */ 'html[data-systheme="day"]{color-scheme:light}', 'html[data-systheme="day"] body{', ' background:#f2f5fa !important;background-image:none !important;', ' color:#1b2436 !important}', /* 白天:隐藏页面自带的暗色亮度遮罩(bgDim),避免白底被压暗 */ 'html[data-systheme="day"] #bgDim{background:transparent !important}', /* 深色容器 → 白/浅色(覆盖纯暗色页面:日志页/移动页等) */ 'html[data-systheme="day"] .card,', 'html[data-systheme="day"] .panel,', 'html[data-systheme="day"] .box,', 'html[data-systheme="day"] .tile,', 'html[data-systheme="day"] .item,', 'html[data-systheme="day"] .stat,', 'html[data-systheme="day"] .modal,', 'html[data-systheme="day"] .dialog,', 'html[data-systheme="day"] .popup,', 'html[data-systheme="day"] .dropdown,', 'html[data-systheme="day"] .menu,', 'html[data-systheme="day"] .sheet,', 'html[data-systheme="day"] .hd,', 'html[data-systheme="day"] .lg,', 'html[data-systheme="day"] .grp,', 'html[data-systheme="day"] .topbar,', 'html[data-systheme="day"] .navbar,', 'html[data-systheme="day"] .header,', 'html[data-systheme="day"] .sidebar,', 'html[data-systheme="day"] .footer,', 'html[data-systheme="day"] [class*="-card"],', 'html[data-systheme="day"] [class*="-panel"],', 'html[data-systheme="day"] [class*="-box"]{', ' background-color:rgba(255,255,255,.94) !important;', ' background-image:none !important;', ' border-color:rgba(24,42,78,.12) !important;', ' color:#1b2436 !important}', /* 白天:深色文字色一律翻深 */ 'html[data-systheme="day"] h1,html[data-systheme="day"] h2,', 'html[data-systheme="day"] h3,html[data-systheme="day"] h4{color:#101827 !important}', 'html[data-systheme="day"] .card,html[data-systheme="day"] .panel,', 'html[data-systheme="day"] .stat,html[data-systheme="day"] .lg,', 'html[data-systheme="day"] [class*="-card"]{color:#2b3648 !important}', /* 白天:浅灰小字翻深,保证可读 */ 'html[data-systheme="day"] .sub,html[data-systheme="day"] .hint,', 'html[data-systheme="day"] .meta,html[data-systheme="day"] .dt,', 'html[data-systheme="day"] .l,html[data-systheme="day"] .t,', 'html[data-systheme="day"] .lb{color:#5a6982 !important}', /* 白天:输入控件 */ 'html[data-systheme="day"] input,html[data-systheme="day"] select,', 'html[data-systheme="day"] textarea{', ' background-color:#fff !important;color:#1b2436 !important;', ' border-color:rgba(24,42,78,.18) !important}', 'html[data-systheme="day"] input::placeholder,', 'html[data-systheme="day"] textarea::placeholder{color:#94a3b8 !important}', /* 白天:按钮 */ 'html[data-systheme="day"] button:not([class*="primary"]):not([class*="pri"]),', 'html[data-systheme="day"] .btn:not([class*="primary"]):not([class*="pri"]){', ' background-color:#fff !important;color:#2b3648 !important;', ' border-color:rgba(24,42,78,.18) !important}', /* 白天:表格 */ 'html[data-systheme="day"] th{background-color:#eef3fa !important;color:#2b3648 !important}', 'html[data-systheme="day"] td{border-color:rgba(24,42,78,.10) !important;color:#2b3648 !important}', /* 白天:徽章/标签(深底 → 浅底) */ 'html[data-systheme="day"] .tag,html[data-systheme="day"] .badge,', 'html[data-systheme="day"] .chip,html[data-systheme="day"] .pill,', 'html[data-systheme="day"] [class*="-tag"],html[data-systheme="day"] [class*="-badge"]{', ' background-color:rgba(24,42,78,.07) !important;color:#3a4763 !important;', ' border-color:rgba(24,42,78,.14) !important}', /* 白天:内联深色底/亮字 反翻 */ 'html[data-systheme="day"] [style*="background:#0"],', 'html[data-systheme="day"] [style*="background: #0"],', 'html[data-systheme="day"] [style*="background-color:#0"],', 'html[data-systheme="day"] [style*="background-color: #0"],', 'html[data-systheme="day"] [style*="background:#1"],', 'html[data-systheme="day"] [style*="background: #1"],', 'html[data-systheme="day"] [style*="background-color:#1"],', 'html[data-systheme="day"] [style*="background-color: #1"],', 'html[data-systheme="day"] [style*="background:#2"],', 'html[data-systheme="day"] [style*="background: #2"],', 'html[data-systheme="day"] [style*="background-color:#2"],', 'html[data-systheme="day"] [style*="background-color: #2"]{', ' background-color:#ffffff !important}', 'html[data-systheme="day"] [style*="color:#e"],', 'html[data-systheme="day"] [style*="color: #e"],', 'html[data-systheme="day"] [style*="color:#d"],', 'html[data-systheme="day"] [style*="color: #d"],', 'html[data-systheme="day"] [style*="color:#c"],', 'html[data-systheme="day"] [style*="color: #c"],', 'html[data-systheme="day"] [style*="color:#b"],', 'html[data-systheme="day"] [style*="color: #b"],', 'html[data-systheme="day"] [style*="color:#a"],', 'html[data-systheme="day"] [style*="color: #a"],', 'html[data-systheme="day"] [style*="color:#f"],', 'html[data-systheme="day"] [style*="color: #f"]{', ' color:#243149 !important}', /* 白天:滚动条 */ 'html[data-systheme="day"] ::-webkit-scrollbar-track{background:#eef1f6 !important}', 'html[data-systheme="day"] ::-webkit-scrollbar-thumb{background:#c4cfdd !important}' ].join('\n'); function inject() { if (document.getElementById('sysThemePatchCss')) return; var st = document.createElement('style'); st.id = 'sysThemePatchCss'; st.textContent = CSS; (document.head || document.documentElement).appendChild(st); } var KEY = 'sys_theme_v1'; var current = null; function varsFor(name) { return name === 'day' ? DAY_VARS : NIGHT_VARS; } function applyVars(name) { var v = varsFor(name), root = document.documentElement; for (var k in v) { if (Object.prototype.hasOwnProperty.call(v, k)) root.style.setProperty(k, v[k]); } } function set(name, opt) { opt = opt || {}; name = (name === 'day' || name === 'light') ? 'day' : 'night'; inject(); document.documentElement.setAttribute('data-systheme', name); applyVars(name); current = name; if (!opt.silent) { try { localStorage.setItem(KEY, name); } catch (e) {} } /* 同步状态给页面(若页面有自己的按钮高亮逻辑) */ try { window.dispatchEvent(new CustomEvent('systhemechange', { detail: { theme: name } })); } catch (e) {} return name; } function get() { return current; } function toggle() { return set(current === 'day' ? 'night' : 'day'); } /* 读取页面已存的旧主题键(各系统历史 KEY 不同),尽量继承用户选择 */ var LEGACY_KEYS = ['xyt_theme_v1', 'zsz_theme_v1', 'wms_theme_v1', 'core_theme_v1', 'relay_theme_v1', 'tv_theme_v1', 'qf_theme_v1', 'qv_theme_v1', 'melody_theme_v1', 'tools_theme_v1', 'ecom_theme_v1', 'link_theme_v1', 'monitor_theme_v1', 'theme_v1']; function initial() { var n = null; /* URL hash 强制指定主题(调试用):#theme=day 或 #theme=night */ try { var hm = (location.hash || '').match(/theme=(day|night|light|dark)/i); if (hm) n = /light|^day$/i.test(hm[1]) ? 'day' : 'night'; } catch (e) {} if (!n) { try { n = localStorage.getItem(KEY); } catch (e) {} } if (!n) { for (var i = 0; i < LEGACY_KEYS.length; i++) { var raw = null; try { raw = localStorage.getItem(LEGACY_KEYS[i]); } catch (e) { continue; } if (!raw) continue; try { var o = JSON.parse(raw); if (o && o.name) { n = o.name; break; } } catch (e) { if (raw === 'day' || raw === 'night' || raw === 'light' || raw === 'dark') { n = raw; break; } } } } if (!n) { try { n = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'night' : 'day'; } catch (e) { n = 'night'; } } set(n, { silent: true }); } /* 页面 ready 之前就注入 CSS,避免闪白/闪黑 */ inject(); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initial); } else { initial(); } window.SysTheme = { set: set, get: get, toggle: toggle, KEY: KEY }; })();