// ==UserScript==
// @name QQ邮箱换肤助手
// @namespace http://tampermonkey.net/
// @version 2026.8.29.1
// @description 【重要更新】1、换肤面板增加Bing每日壁纸和自定义壁纸 2、样式面板可分别调节顶部栏、侧边栏、正文区的不透明度和背景模糊
// @author AN drew
// @match https://*.mail.qq.com/*
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant unsafeWindow
// @connect bing.com
// ==/UserScript==
(function() {
'use strict';
// ---------- 皮肤配置(包含背景图)----------
const SKINS = [
{
name: '默认',
bodyClass: '',
previewClass: 'setting-theme-default',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_default.2x.1cab96d.png)'
},
{
name: 'Bing每日壁纸',
bodyClass: 'page-theme-bing',
previewClass: 'setting-theme-bing',
bgImage: 'url(data:image/png;base64,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)'
},
{
name: '自定义壁纸',
bodyClass: 'page-theme-custom',
previewClass: 'setting-theme-custom',
bgImage: 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAawAAADSCAYAAAAWl/SpAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABElSURBVHhe7dwvu+40t8Xh802RSCQW9TokBoVDYDAYHJ7vtN8zONc8O1cYmUmfJl3P3PsnbrOatGnTZPTfev7n77///gQAwLsjsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUAKIHAAgCUQGABAEogsAAAJRBYAIASCCwAQAkEFgCgBAILAFACgQUYf/7556e//vrLLsO6P/74w/59F/WT+zu+TARWQb///vuQK/8ONLG49oZ3m3h++umnT998882nH3744dPPP//8TxtduYwm634/w+mJ/GkKd+2XjtWPP/74z3HT8ZPffvvN1tlB2/nuu+/+2e47nUME6RkE1mEnrtJjInBc+XegCcW1N2i5q/dRvv/++3+18dtvv/30n//8Z7lPVb5fRzi9v31A3jWbgLP+1TFzde5Sm9y2Tgak04a1AjT6ndDaj8A6RCerBo9O3t1X0/0gbbny76BSYGkCcm0UXc27Oj31uasfNMG5eru4bd4x6x8XHq0TF25xF+z88ssvts5d6rdff/31/8NJ54Pbvqh9bh14HYG1mQZmPznran3ngG3X3XPl30GlwNKE5Nooetzl6vSydYirs5Pb5h3RP3HH5bSPAXuq7+qEV8bH6A529aLCUTvUHt2lqc3xeDMLphG170RQf80IrI00SY1ObDfRxeC4yq0/uPIr+rbtVimw1FeujbJ6rLJ1aAJ0dXZy270j+sct2+Hq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)'
},
{
name: '晴空',
bodyClass: 'page-theme-sky',
previewClass: 'setting-theme-sky',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_sky.44bff10.svg)'
},
{
name: '青竹',
bodyClass: 'page-theme-bamboo',
previewClass: 'setting-theme-bamboo',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_bamboo.c6be1ed.svg)'
},
{
name: '松石',
bodyClass: 'page-theme-turquoise',
previewClass: 'setting-theme-turquoise',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_turquoise.f10f940.svg)'
},
{
name: '花火',
bodyClass: 'page-theme-firework',
previewClass: 'setting-theme-firework',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_fireworks.727f25b.svg)'
},
{
name: '沉墨',
bodyClass: 'page-theme-ink',
previewClass: 'setting-theme-ink',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_ink.ab3a2fe.svg)'
},
{
name: '菖蒲',
bodyClass: 'page-theme-calamus',
previewClass: 'setting-theme-calamus',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_calamus.c93ef81.svg)'
},
{
name: '水的旅程',
bodyClass: 'page-theme-waterjourney',
previewClass: 'setting-theme-waterjourney',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_waterjourney.2x.667be27.png)'
},
{
name: '东方青绿',
bodyClass: 'page-theme-orientalgreen page-color-theme',
previewClass: 'setting-theme-orientalgreen',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_orientalgreen.2x.c0bc943.png)'
},
{
name: '竹林情风',
bodyClass: 'page-theme-bambooforest',
previewClass: 'setting-theme-bambooforest',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme_bambooforest.2x.b8cc170.png)'
},
{
name: '桃花微雨',
bodyClass: 'page-theme-blossomrain',
previewClass: 'setting-theme-blossomrain',
bgImage: 'url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/theme-blossomrain.2x.2040932.png)'
}
];
// 所有可能的 body 皮肤类(用于清除)
const ALL_BODY_CLASSES = [
'page-theme-default',
'page-theme-bing',
'page-theme-custom',
'page-theme-sky',
'page-theme-bamboo',
'page-theme-turquoise',
'page-theme-firework',
'page-theme-ink',
'page-theme-calamus',
'page-theme-waterjourney',
'page-theme-bambooforest',
'page-theme-blossomrain',
'page-theme-orientalgreen',
'page-color-theme',
];
const SKIN_CLASSES_KEY = 'qqmail_skin_classes';
const STYLE_SETTINGS_KEY = 'qqmail_style_settings';
const DEFAULT_STYLE_SETTINGS = {
header: {
opacity: 0.35,
blur: 0,
opacityEnabled: false,
blurEnabled: false
},
sidebar: {
opacity: 0.35,
blur: 0,
opacityEnabled: false,
blurEnabled: false
},
route: {
opacity: 0.85,
blur: 5,
opacityEnabled: false,
blurEnabled: false
}
};
// ===== Bing每日壁纸 =====
const BING_STORAGE_KEY_IMAGE = 'bing_bg_image_base64';
const BING_STORAGE_KEY_DATE = 'bing_bg_image_date';
const BING_API_URL = 'https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1';
// ===== Bing 预览翻转持久化:0=不持久化,1=持久化 ----
const BING_FLIP_PERSIST = 0; // 1 开启持久化,0 关闭
const BING_FLIP_STATE_KEY = 'bing_flip_state'; // 存储值:'real' 或 'placeholder'
// ===== 自定义壁纸 =====
const CUSTOM_WALLPAPER_KEY = 'custom_wallpaper_base64';
// ===== 壁纸锁定状态 =====
const BING_LOCKED_KEY = 'bing_locked';
const CUSTOM_LOCKED_KEY = 'custom_locked';
// ---- 锁定样式配置:1=黄锁图标,2=黄黑条纹 ----
const LOCK_STYLE = 1; // 默认黄锁图标,若想切换黄黑条纹则改为 2
// 自定义壁纸平铺模式(上传后使用 repeat)
const CUSTOM_WALLPAPER_MODE_KEY = 'custom_wallpaper_mode'; // 'cover' 或 'repeat'
// ---------- 使用 GM_addStyle 注入动态生成的 CSS ----------
function injectStyles() {
let cssRules = '';
// 基础样式
cssRules += `
/* ---- 弹窗遮罩 ---- */
.skin-panel-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.3);
z-index: 2147483647;
align-items: center;
justify-content: center;
backdrop-filter: blur(2px);
/* display 由 JS 控制 flex/none */
}
/* ---- 弹窗容器 ---- */
.skin-panel-container {
background: #ffffff;
border-radius: 16px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
padding: 20px 24px;
width: 840px;
max-width: 90vw;
max-height: 80vh;
overflow-y: auto;
pointer-events: auto;
}
/* ---- 弹窗头部 ---- */
.skin-panel-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
font-size: 16px;
font-weight: 500;
color: #1f1f1f;
}
.skin-panel-title {
font-weight: bold;
font-size: 19px;
}
/* ---- 卡片容器 ---- */
.skin-cards-wrapper {
display: flex;
flex-direction: column;
gap: 12px;
margin-top: 0;
}
.skin-cards-group {
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-items: center;
gap: 12px;
}
.skin-cards-divider {
width: 100%;
height: 1px;
background: #e0e0e0;
margin: 4px 0;
}
/* ---- 单个卡片 ---- */
.skin-card {
width: 160px;
cursor: pointer;
border-radius: 12px;
overflow: hidden;
border: 2px solid transparent;
transition: border-color 0.2s, box-shadow 0.2s;
background: #fff;
}
.skin-card-hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.skin-card-selected {
border-color: #0066ff;
box-shadow: 0 4px 12px rgba(0, 102, 255, 0.2);
}
/* ---- 卡片预览区 ---- */
.skin-card-preview {
height: 90px;
border-radius: 8px 8px 0 0;
overflow: hidden;
position: relative; /* 新增,使内部绝对定位按钮相对于此定位 */
}
.skin-card-preview-inner {
width: 100%;
height: 100%;
/* 背景图片由皮肤类单独定义 */
}
.skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner {
position: relative;
display: flex;
align-items: center;
height: 100%;
overflow: hidden;
background-repeat: no-repeat;
background-size: cover;
background-position: center;
}
/* ---- 卡片底部单选区 ---- */
.skin-card-radio {
display: flex;
align-items: center;
padding: 8px 10px;
background: #fafafa;
border-radius: 0 0 8px 8px;
}
.skin-card-radio-icon {
width: 16px;
height: 16px;
border-radius: 50%;
border: 2px solid #d9d9d9;
margin-right: 8px;
transition: all 0.2s;
flex-shrink: 0;
}
.skin-card-radio-icon.selected {
border-color: #0066ff;
background-color: #0066ff;
box-shadow: inset 0 0 0 3px white;
}
.skin-card-radio-text {
flex: 1;
font-size: 14px;
color: #333;
}
/* ---- 换肤按钮 ---- */
.skin-switch-btn {
display: inline-flex;
align-items: center;
margin-right: 8px;
cursor: pointer;
}
.skin-switch-btn .skin-icon {
width: 20px;
height: 20px;
margin-right: 4px;
}
.skin-switch-btn:hover {
color: #0066ff;
}
.frame-header-setting-btn:hover{
color: #0066ff;
}
/* ---- 自定义壁纸上传按钮(预留) ---- */
.skin-card-upload-btn {
position: absolute;
top: 6px;
right: 6px;
width: 28px;
height: 28px;
border-radius: 50%;
background: rgba(0, 0, 0, 0.5);
color: #fff;
font-size: 20px;
line-height: 28px;
text-align: center;
cursor: pointer;
z-index: 2;
border: none;
display: none; /* 默认隐藏,自定义卡片时显示 */
}
.skin-card-upload-btn:hover {
background: rgba(0, 0, 0, 0.7);
}
.skin-card-upload-btn.show {
display: block;
}
`;
// 根据 SKINS 生成每个预览类的背景图
SKINS.forEach(skin => {
cssRules += `
.skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner.${skin.previewClass} {
background-image: ${skin.bgImage};
}
`;
});
// 其他辅助样式(红点、NEW标签等,保持精简)
cssRules += `
.skin-panel-overlay .skin-panel-container .setting-theme-red-dot {
width: 16px;
height: 16px;
background-size: 100% 100%;
background-image: url(https://res.wx.qq.com/t/webmail/webmail/res/static/images/mail/projects/web/containers/Setting/GeneralTab/UI/Themes/red-dot.2d1631b.svg);
margin: 2px 0 0 4px;
}
.skin-panel-overlay .skin-panel-container .setting-theme-card-group-title {
font-size: 14px;
line-height: 20px;
font-weight: initial;
display: flex;
align-items: center;
color: var(--base_gray_100, #1f1f1f);
}
.skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner .setting-theme-new-tag {
font-size: 10px;
line-height: 14px;
font-weight: 700;
position: absolute;
top: 0;
right: 0;
display: flex;
align-items: center;
height: 16px;
color: #fff;
padding: 0 4px;
box-sizing: border-box;
background: #e54545;
border-bottom-left-radius: 5px;
}
.skin-panel-overlay .skin-panel-container .skin-cards-wrapper .skin-card-preview-inner .setting-theme-new-tag::before {
content: 'NEW';
}
.skin-panel-overlay .skin-panel-container .setting-theme-count-down-text {
font-size: 13px;
line-height: 18px;
font-weight: 700;
color: #d4a56a;
font-family: "Microsoft Yahei UI", "Segoe UI", "Helvetica Neue", -apple-system, "system-ui", sans-serif, Roboto;
padding: 0 4px;
box-sizing: border-box;
background: transparent;
}
`;
// 列表邮件区域半透明
cssRules += `
/* 邮件列表工具栏背景透明 */
.mail-list-page-toolbar {
background: transparent !important;
}
/* 让邮件列表区域子项背景透明,以显示父级半透明背景 */
.mail-list-page-items,
.mail-list-page-reader,
.mail-list-body {
background: transparent !important;
}
/* 邮件正文翻译提示背景透明 */
.mail-detail-alert-bar {
background: transparent !important;
}
/* 邮件正文区域背景透明 */
.qmbox table {
background: transparent !important;
}
.qmbox table tr{
background: transparent !important;
}
.qmbox table td{
background: transparent !important;
}
.qmbox div {
background: transparent !important;
}
`;
// 样式面板
cssRules += `
/* ---- 样式面板 ---- */
.style-panel-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.2);
z-index: 2147483646; /* 略低于换肤弹窗(2147483647),避免遮挡 */
display: none;
align-items: center;
justify-content: center;
}
.style-panel-container {
background: #ffffff;
border-radius: 16px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
padding: 20px 24px;
width: 420px;
max-width: 90vw;
max-height: 80vh;
overflow-y: auto;
pointer-events: auto;
}
.style-panel-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
}
.style-panel-title {
font-size: 19px;
font-weight: bold;
color: #1f1f1f;
}
.style-panel-title .badge {
background: #e8f5e9;
color: #2e7d32;
padding: 2px 10px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
margin-left: 8px;
vertical-align: top;
border: 1px solid #a5d6a7;
}
.style-group {
margin-bottom: 16px;
border-bottom: 1px solid #e8e8e8;
padding-bottom: 12px;
}
.style-group:last-child {
border-bottom: none;
margin-bottom: 0;
}
.style-group-label {
font-weight: 600;
margin-bottom: 8px;
font-size: 14px;
color: #1f1f1f;
}
.style-row {
display: flex;
align-items: center;
gap: 10px;
margin-top: 6px;
}
.style-row input[type="checkbox"] {
margin: 0;
flex-shrink: 0;
width: 16px;
height: 16px;
cursor: pointer;
}
.style-row input[type="range"] {
flex: 1;
min-width: 60px;
cursor: pointer;
}
/* ---- 滑块状态 ---- */
.style-row input[type="range"] {
flex: 1;
min-width: 60px;
cursor: pointer;
transition: opacity 0.2s;
}
/* 未激活(checkbox未勾选):滑块变灰 */
.style-row input[type="range"].slider-inactive {
opacity: 0.4;
cursor: pointer;
}
/* 激活(checkbox已勾选):正常颜色 */
.style-row input[type="range"].slider-active {
opacity: 1;
cursor: pointer;
}
/* ---- checkbox 未勾选时稍微变灰 ---- */
.style-row input[type="checkbox"]:not(:checked) {
opacity: 0.5;
}
.style-row input[type="checkbox"]:checked {
opacity: 1;
}
.style-value {
min-width: 42px;
font-size: 12px;
color: #666;
text-align: right;
font-variant-numeric: tabular-nums;
}
/* ---- 样式按钮 ---- */
.style-switch-btn {
display: inline-flex;
align-items: center;
gap: 4px;
}
.style-switch-btn .style-icon {
display: inline-flex;
align-items: center;
line-height: 1;
}
.style-switch-btn .style-icon svg {
display: block;
}
/* ---- 统一 hover 颜色(与设置按钮一致) ---- */
.frame-header-setting-btn:hover,
.style-switch-btn:hover,
.skin-switch-btn:hover {
color: #0066ff;
}
/* ---- 底部按钮:确定 + 恢复默认 ---- */
.style-panel-footer {
display: flex;
justify-content: center;
align-items: center;
gap: 50px;
margin-top: 16px;
padding-top: 12px;
border-top: 1px solid #e8e8e8;
}
/* 按钮本身的尺寸保持一致(可选,但建议统一) */
.style-panel-confirm-btn,
.style-panel-reset-btn{
padding: 6px 20px;
border-radius: 6px;
border: none;
font-size: 14px;
cursor: pointer;
transition: background 0.2s;
min-width: 80px; /* 两个按钮宽度一致,视觉更平衡 */
}
.style-panel-confirm-btn {
background: #0066ff;
color: #fff;
}
.style-panel-confirm-btn:hover {
background: #0052cc;
}
.style-panel-reset-btn {
background: #f5f5f5;
border: 1px solid #d9d9d9;
color: #333;
}
.style-panel-reset-btn:hover {
background: #e8e8e8;
}
`;
// 面板关闭按钮
cssRules += `
/* ---- 关闭按钮(换肤 & 样式面板统一) ---- */
.skin-panel-close,
.style-panel-close {
width: 32px;
height: 32px;
border-radius: 50%;
background: #e54545; /* 醒目红色 */
color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
font-weight: 700;
border: none;
cursor: pointer;
transition: background 0.2s, transform 0.15s;
line-height: 1;
flex-shrink: 0;
/* 去掉之前可能存在的内联样式干扰 */
padding: 0;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.skin-panel-close:hover,
.style-panel-close:hover {
background: #c0392b; /* 悬停变暗 */
transform: scale(1.05);
}
.skin-panel-close:active,
.style-panel-close:active {
transform: scale(0.95);
}
`;
// 确认框
cssRules += `
/* ---- 自定义确认对话框 ---- */
.confirm-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.3);
z-index: 2147483647; /* 与换肤弹窗同级 */
display: none;
align-items: center;
justify-content: center;
backdrop-filter: blur(2px);
}
.confirm-container {
background: #ffffff;
border-radius: 16px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
padding: 24px 28px;
width: 400px;
max-width: 90vw;
pointer-events: auto;
}
.confirm-title {
font-size: 18px;
font-weight: 700;
color: #1f1f1f;
margin-bottom: 8px;
}
.confirm-message {
font-size: 14px;
color: #555;
line-height: 1.6;
margin-bottom: 20px;
}
.confirm-actions {
display: flex;
justify-content: center;
align-items: center;
gap: 50px;
}
.confirm-actions button {
padding: 6px 20px;
border-radius: 6px;
border: none;
font-size: 14px;
cursor: pointer;
transition: background 0.2s;
min-width: 80px; /* 两个按钮宽度一致,视觉更平衡 */
}
.confirm-actions .confirm-btn-primary {
background: #0066ff;
color: #fff;
}
.confirm-actions .confirm-btn-primary:hover {
background: #0052cc;
}
.confirm-actions .confirm-btn-secondary {
background: #f5f5f5;
border: 1px solid #d9d9d9;
color: #333;
}
.confirm-actions .confirm-btn-secondary:hover {
background: #e8e8e8;
}
`;
// Toast提示
cssRules += `
/* ---- Toast 提示(绿底白字对勾 + 上滑/下滑动画) ---- */
.style-toast {
position: fixed;
bottom: -60px; /* 初始在屏幕外(下方) */
left: 50%;
transform: translateX(-50%);
background: #4caf50; /* 绿色背景 */
color: #fff;
padding: 12px 24px;
border-radius: 20px;
font-size: 18px;
font-weight: 600;
z-index: 2147483647 !important;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
display: flex;
align-items: center;
gap: 8px;
opacity: 0;
transition: opacity 0.3s ease, bottom 0.4s cubic-bezier(0.22, 1, 0.36, 1);
pointer-events: none;
white-space: nowrap;
}
.style-toast.show {
opacity: 1;
bottom: 100px; /* 上滑到可见位置 */
}
.style-toast svg {
flex-shrink: 0; /* 防止图标被压缩 */
}
`;
// 卡片操作按钮组
cssRules += `
/* ---- 卡片操作按钮组 ---- */
.skin-card-actions {
position: absolute;
bottom: 0px;
left: 0;
right: 0;
display: flex;
justify-content: center;
gap: 6px;
background: rgba(0, 0, 0, 0.7); /* 统一深色 */
padding: 5px 6px;
border-radius: 0 0 8px 8px;
backdrop-filter: blur(4px); /* 加强模糊,增加层次感 */
opacity: 0;
transition: opacity 0.2s;
z-index: 2; /* 新增:确保位于锁定遮罩之上 */
}
.skin-card:hover .skin-card-actions {
opacity: 1;
}
.skin-card-action-btn {
background: rgba(255, 255, 255, 0.2); /* 更明显 */
border: 1px solid rgba(255, 255, 255, 0.2); /* 加边框 */
color: #fff;
padding: 2px 8px; /* 稍微增加内边距 */
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
gap: 4px;
font-size: 11px; /* 略大一点 */
font-weight: 500; /* 加粗 */
line-height: 1.4;
transition: background 0.2s, border-color 0.2s;
white-space: nowrap;
}
.skin-card-action-btn:hover {
background: rgba(255, 255, 255, 0.4);
border-color: rgba(255, 255, 255, 0.4);
}
.skin-card-action-btn svg {
display: block;
width: 14px;
height: 14px;
stroke: white;
}
.skin-card-action-btn span {
font-weight: 500;
color: white;
text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
`;
if (LOCK_STYLE === 1)
{
// 卡片锁定警示效果1(黄锁图标)
cssRules += `
/* ---- 卡片锁定警示效果(仅作用于 Bing 和自定义壁纸卡片) ---- */
.skin-card.skin-card-locked {
position: relative;
}
/* 半透明遮罩覆盖整个预览区(不含底部 radio 区域) */
.skin-card.skin-card-locked .skin-card-preview::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
border-radius: 8px 8px 0 0;
z-index: 1;
pointer-events: none;
}
/* 锁图标由 JS 动态添加,这里只控制样式 */
.skin-card.skin-card-locked .lock-icon {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 2;
pointer-events: none;
color: #ffcc00;
font-size: 28px;
filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.6));
}
/* 底部 radio 区域轻微变暗,保持视觉连贯 */
.skin-card.skin-card-locked .skin-card-radio {
background: rgba(250, 250, 250, 0.7);
}
`;
}
if (LOCK_STYLE === 2)
{
// 卡片锁定警示效果2(黄黑条纹)
cssRules += `
/* ---- 卡片锁定警示效果 ---- */
.skin-card.skin-card-locked {
position: relative;
}
.skin-card.skin-card-locked .skin-card-preview::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none; /* 不阻挡点击 */
z-index: 1;
/* 黄黑斜条纹,半透明 */
background: repeating-linear-gradient(
45deg,
rgba(255, 204, 0, 0.4) 0px,
rgba(255, 204, 0, 0.4) 8px,
rgba(0, 0, 0, 0.25) 8px,
rgba(0, 0, 0, 0.25) 16px
);
border-radius: 8px 8px 0 0;
/* 增加边框效果增强视觉提示 */
box-shadow: inset 0 0 0 2px rgba(255, 204, 0, 0.4);
}
/* 确保卡片底部 radio 区域也被覆盖 */
.skin-card.skin-card-locked .skin-card-radio {
/* 保持背景半透明以显示条纹,但为了不影响文字,保留背景透明 */
background: rgba(250, 250, 250, 0.6);
}
`;
}
// 上传按钮
cssRules += `
/* ---- 自定义壁纸上传遮罩 ---- */
.custom-upload-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 30px; /* 预留底部按钮区域 */
visibility: hidden; /* 隐藏但占位 */
opacity: 0; /* 透明 */
align-items: flex-start; /* 靠上对齐 */
justify-content: center;
padding-top: 12px; /* 调整垂直位置 */
background: rgba(0, 0, 0, 0.6); /* 更深半透明,确保图标清晰 */
border-radius: 8px 8px 0 0; /* 保持顶部圆角 */
z-index: 2;
cursor: pointer;
pointer-events: none; /* 隐藏时不可点击 */
transition: background 0.2s;
}
/* 激活状态 */
.skin-card:not(.skin-card-locked) .custom-upload-overlay.active {
visibility: visible;
opacity: 1;
pointer-events: auto;
}
.custom-upload-overlay svg {
display: block;
width: 40px;
height: 40px;
color: #5b9bd5;
filter: drop-shadow(0 2px 4px rgba(0,0,0,0.1));
}
/* 当卡片未被锁定且鼠标悬浮时显示遮罩(由 JS 控制类名) */
.skin-card:not(.skin-card-locked) .custom-upload-overlay.active {
display: flex;
}`;
//Bing预览图翻转按钮
cssRules += `
/* ---- Bing 翻转按钮(预览图右上角,hover 显示) ---- */
.bing-flip-btn {
position: absolute;
top: 6px;
right: 6px;
width: 20px;
height: 20px;
border-radius: 4px;
background: rgba(0, 0, 0, 0.5); /* 深色半透明,确保可见 */
border: 1px solid rgba(255, 255, 255, 0.3);
color: #fff;
cursor: pointer;
z-index: 3;
transition: background 0.2s, transform 0.2s;
backdrop-filter: blur(2px);
display: none; /* 默认隐藏 */
align-items: center;
justify-content: center;
user-select: none;
}
.skin-card:hover .bing-flip-btn {
display: flex; /* 卡片悬停时显示 */
}
.bing-flip-btn:hover {
background: rgba(0, 0, 0, 0.7); /* 悬停加深,与白色按钮变亮形成对称 */
}
.bing-flip-btn svg {
display: block;
width: 14px;
height: 14px;
fill: currentColor;
stroke: none;
}
/* ---- 翻转动画(点击时触发,水平镜像翻转) ---- */
.bing-flip-btn.flipping svg{
animation: flipHorizontal 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
}
@keyframes flipHorizontal {
0% { transform: scaleX(1); }
50% { transform: scaleX(0); }
100% { transform: scaleX(1); }
}
`;
//自定义壁纸(适应/平铺)切换按钮
cssRules += `
/* ---- 自定义壁纸模式切换按钮(右上角,hover 显示) ---- */
.custom-mode-toggle-btn {
position: absolute;
top: 6px;
right: 6px;
width: 20px;
height: 20px;
border-radius: 4px;
background: rgba(0, 0, 0, 0.5);
border: 1px solid rgba(255, 255, 255, 0.3);
color: #fff;
cursor: pointer;
z-index: 3;
display: none; /* 默认隐藏 */
align-items: center;
justify-content: center;
backdrop-filter: blur(2px);
transition: background 0.2s, transform 0.2s;
user-select: none;
}
.skin-card:hover .custom-mode-toggle-btn {
display: flex; /* 卡片悬停时显示 */
}
.custom-mode-toggle-btn:hover {
background: rgba(0, 0, 0, 0.7);
}
.custom-mode-toggle-btn svg {
display: block;
width: 14px;
height: 14px;
fill: currentColor;
stroke: none;
}
`;
GM_addStyle(cssRules);
}
// 立即注入样式
injectStyles();
// ---------- Bing 背景功能 ----------
function getToday() {
const now = new Date();
return now.getFullYear() + '-' +
String(now.getMonth() + 1).padStart(2, '0') + '-' +
String(now.getDate()).padStart(2, '0');
}
function setBingBackgroundStyle(base64) {
// 移除旧的 Bing 样式
const oldStyle = document.getElementById('bing-bg-style');
if (oldStyle) oldStyle.remove();
const style = document.createElement('style');
style.id = 'bing-bg-style';
style.textContent = `
/* ---- 背景图片 ---- */
html, body {
background: url("${base64}") center / cover no-repeat fixed !important;
background-color: transparent !important;
min-height: 100vh !important;
}
`;
document.head.appendChild(style);
}
function fetchBingImageBase64() {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: 'GET',
url: BING_API_URL,
onload: function(res) {
try {
const data = JSON.parse(res.responseText);
if (!data.images || data.images.length === 0) {
reject('未获取到图片信息');
return;
}
const imageUrl = 'https://www.bing.com' + data.images[0].url;
GM_xmlhttpRequest({
method: 'GET',
url: imageUrl,
responseType: 'blob',
onload: function(imgRes) {
const blob = imgRes.response;
const reader = new FileReader();
reader.onload = function() {
resolve(reader.result);
};
reader.onerror = function() {
reject('Base64 转换失败');
};
reader.readAsDataURL(blob);
},
onerror: function() {
reject('图片下载失败');
}
});
} catch (e) {
reject('解析图片信息失败: ' + e.message);
}
},
onerror: function() {
reject('请求图片信息失败(网络或跨域)');
}
});
});
}
function applyBingSkin() {
// 检查锁定状态
const locked = GM_getValue(BING_LOCKED_KEY, false);
if (locked) {
console.log('[Bing皮肤] 已锁定,不更新壁纸');
// 但仍然要确保背景显示(可能缓存存在)
const cachedImage = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
if (cachedImage) {
setBingBackgroundStyle(cachedImage);
}
return;
}
const today = getToday();
const cachedDate = GM_getValue(BING_STORAGE_KEY_DATE, null);
const cachedImage = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
// 有缓存立即显示
if (cachedImage) {
setBingBackgroundStyle(cachedImage);
}
// 如果缓存过期或无缓存,异步获取最新
if (cachedDate !== today || !cachedImage) {
console.log('[Bing皮肤] 正在获取今日图片...');
fetchBingImageBase64().then(base64 => {
GM_setValue(BING_STORAGE_KEY_IMAGE, base64);
GM_setValue(BING_STORAGE_KEY_DATE, today);
setBingBackgroundStyle(base64);
}).catch(err => {
console.warn('[Bing皮肤] 获取失败,使用缓存(如有)', err);
});
}
}
function getCustomWallpaper() {
return GM_getValue(CUSTOM_WALLPAPER_KEY, null);
}
function setCustomWallpaper(base64) {
GM_setValue(CUSTOM_WALLPAPER_KEY, base64);
}
function applyCustomWallpaper() {
const base64 = getCustomWallpaper();
if (!base64) return false;
// 读取模式,默认为 cover
const mode = GM_getValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover');
// 移除 Bing 样式
const bingStyle = document.getElementById('bing-bg-style');
if (bingStyle) bingStyle.remove();
let style = document.getElementById('custom-bg-style');
if (!style) {
style = document.createElement('style');
style.id = 'custom-bg-style';
document.head.appendChild(style);
}
// 根据模式设置背景
if (mode === 'repeat') {
style.textContent = `
html, body {
background: url("${base64}") repeat !important;
background-size: auto !important;
background-color: transparent !important;
min-height: 100vh !important;
}
`;
} else {
style.textContent = `
html, body {
background: url("${base64}") center / cover no-repeat fixed !important;
background-color: transparent !important;
min-height: 100vh !important;
}
`;
}
return true;
}
//更新自定义壁纸预览图
function updateCustomCardPreviews() {
const base64 = getCustomWallpaper();
if (!base64) return;
// 查找所有自定义壁纸卡片的预览内层
const previews = document.querySelectorAll('.skin-card[data-skin-class="page-theme-custom"] .skin-card-preview-inner');
previews.forEach(preview => {
preview.style.backgroundImage = `url(${base64})`;
preview.style.backgroundSize = 'cover';
preview.style.backgroundRepeat = 'no-repeat';
});
}
function removeCustomWallpaper() {
const style = document.getElementById('custom-bg-style');
if (style) style.remove();
}
// 下载 base64 为图片文件
function downloadBase64(base64, filename = 'wallpaper.png') {
const link = document.createElement('a');
link.href = base64;
link.download = filename;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
// 获取当前壁纸数据(根据当前皮肤)
function getCurrentWallpaperData() {
const currentSkin = getCurrentSkinValue();
if (currentSkin.includes('page-theme-bing')) {
const base64 = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
return { base64, type: 'bing' };
} else if (currentSkin.includes('page-theme-custom')) {
const base64 = getCustomWallpaper();
return { base64, type: 'custom' };
}
return null;
}
// 切换锁定状态(Bing 或 Custom)
function toggleLock(type) {
const key = type === 'bing' ? BING_LOCKED_KEY : CUSTOM_LOCKED_KEY;
const current = GM_getValue(key, false);
const newState = !current;
GM_setValue(key, newState);
// 仅当解锁 Bing 且当前皮肤正是 Bing 时,才刷新壁纸(获取今日图片)
if (type === 'bing' && !newState && document.body.classList.contains('page-theme-bing')) {
applyBingSkin();
}
// 刷新面板以更新按钮状态
updateSelectedCardInSkinPanel();
return newState;
}
// ---------- 应用皮肤 ----------
function applySkin(bodyClassValue) {
const body = document.body;
ALL_BODY_CLASSES.forEach(cls => body.classList.remove(cls));
if (bodyClassValue && bodyClassValue.trim()) {
const classArray = bodyClassValue.trim().split(/\s+/);
classArray.forEach(cls => body.classList.add(cls));
}
GM_setValue(SKIN_CLASSES_KEY, bodyClassValue || '');
console.log('[换肤助手] 皮肤已切换:', bodyClassValue || '默认');
updateSelectedCardInSkinPanel();
// ===== 背景皮肤处理:Bing 或自定义壁纸 =====
if (bodyClassValue && bodyClassValue.includes('page-theme-bing')) {
applyBingSkin();
removeCustomWallpaper(); // 切换到 Bing 时移除自定义背景
} else if (bodyClassValue && bodyClassValue.includes('page-theme-custom')) {
const hasCustom = applyCustomWallpaper();
if (!hasCustom) {
// 无缓存,提示并切换回默认皮肤
showToast('请先上传一张壁纸', '#ff9800');
// 为了避免循环,直接操作 body 类,不触发 applySkin
document.body.classList.remove('page-theme-custom');
GM_setValue(SKIN_CLASSES_KEY, '');
console.log('[换肤助手] 无自定义壁纸,已切换回默认');
return; // 退出 applySkin,避免后续 save 覆盖
}
// 移除 Bing 样式(如果有)
const bingStyle = document.getElementById('bing-bg-style');
if (bingStyle) bingStyle.remove();
// ---- 新增:更新卡片预览图 ----
updateCustomCardPreviews();
} else {
// 其他皮肤:移除 Bing 和自定义背景
const bingStyle = document.getElementById('bing-bg-style');
if (bingStyle) bingStyle.remove();
removeCustomWallpaper();
}
// ===== 应用样式面板设置(统一控制透明度/模糊) =====
applyStyleOverrides(); // 新增
}
function restoreSkin() {
const saved = GM_getValue(SKIN_CLASSES_KEY, null);
if (saved !== null) applySkin(saved);
}
function getCurrentSkinValue() {
return GM_getValue(SKIN_CLASSES_KEY, '');
}
// ---------- UI 元素 ----------
// 换肤面板相关变量
let skinBtn = null;
let skinPanelOverlay = null;
let skinPanelContainer = null;
// 样式面板相关变量
let styleBtn = null;
let stylePanelOverlay = null;
let stylePanelContainer = null;
// 等待元素
function waitForElement(selector, timeout = 10000) {
return new Promise((resolve, reject) => {
const start = Date.now();
const check = () => {
const el = document.querySelector(selector);
if (el) resolve(el);
else if (Date.now() - start > timeout) reject(new Error(`等待超时: ${selector}`));
else setTimeout(check, 200);
};
check();
});
}
// 创建皮肤弹窗
function createSkinPanel() {
if (skinPanelOverlay) return;
// 弹窗遮罩
skinPanelOverlay = document.createElement('div');
skinPanelOverlay.className = 'skin-panel-overlay';
/*
skinPanelOverlay.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.3);
z-index: 2147483647;
display: flex;
align-items: center;
justify-content: center;
backdrop-filter: blur(2px);
`;
*/
// 弹窗容器
skinPanelContainer = document.createElement('div');
skinPanelContainer.className = 'skin-panel-container';
/*
skinPanelContainer.style.cssText = `
background: #ffffff;
border-radius: 16px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
padding: 20px 24px;
width: 840px;
max-width: 90vw;
max-height: 80vh;
overflow-y: auto;
pointer-events: auto;
`;
*/
// 弹窗头部
const header = document.createElement('div');
header.className = 'skin-panel-header';
/*
header.style.cssText = `
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 20px;
font-size: 16px;
font-weight: 500;
color: #1f1f1f;
`;
*/
// 弹窗标题
const title = document.createElement('span');
title.className = 'skin-panel-title';
title.textContent = '选择皮肤';
/*
title.style.cssText = 'font-weight:bold; font-size:19px';
*/
// 关闭按钮
const closeBtn = document.createElement('div');
closeBtn.className = 'skin-panel-close';
closeBtn.innerHTML = `
`;
closeBtn.addEventListener('click', hideSkinPanel);
/*
closeBtn.style.cssText = 'cursor: pointer; color: #8c8c8c; display: flex; align-items: center;';
*/
header.appendChild(title);
header.appendChild(closeBtn);
skinPanelContainer.appendChild(header);
// 卡片容器 - 改用两组+分隔线
const cardsWrapper = document.createElement('div');
cardsWrapper.className = 'skin-cards-wrapper';
/*
cardsWrapper.style.cssText = `
display: flex;
flex-direction: column;
gap: 12px;
margin-top: 0;
`;
*/
// 固定卡片组 (前三个)
const fixedGroup = document.createElement('div');
fixedGroup.className = 'skin-cards-group';
/*
fixedGroup.style.cssText = `
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-items: center;
gap: 12px;
`;
*/
// 剩余卡片组
const restGroup = document.createElement('div');
restGroup.className = 'skin-cards-group';
/*
restGroup.style.cssText = `
display: grid;
grid-template-columns: repeat(3, 1fr);
justify-items: center;
gap: 12px;
`;
*/
// 分隔线
const divider = document.createElement('div');
divider.className = 'skin-cards-divider';
/*
divider.style.cssText = `
width: 100%;
height: 1px;
background: #e0e0e0;
margin: 4px 0;
`;
*/
SKINS.forEach((skin, index) => {
const card = createSkinCard(skin);
if (index < 3) {
fixedGroup.appendChild(card);
} else {
restGroup.appendChild(card);
}
});
cardsWrapper.appendChild(fixedGroup);
cardsWrapper.appendChild(divider);
cardsWrapper.appendChild(restGroup);
skinPanelContainer.appendChild(cardsWrapper);
skinPanelOverlay.appendChild(skinPanelContainer);
document.body.appendChild(skinPanelOverlay);
skinPanelOverlay.addEventListener('click', (e) => {
if (e.target === skinPanelOverlay) hideSkinPanel();
});
updateSelectedCardInSkinPanel();
}
function triggerCustomUpload(card) {
// 检查锁定(调用前已判断,但再加一次)
if (GM_getValue(CUSTOM_LOCKED_KEY, false)) {
showToast('壁纸已锁定,请先解锁', '#ff9800', 'wrong');
return;
}
const input = document.createElement('input');
input.type = 'file';
input.accept = 'image/*';
input.style.display = 'none';
document.body.appendChild(input);
input.click();
input.addEventListener('change', function() {
const file = this.files[0];
if (!file) return;
const reader = new FileReader();
reader.onload = function(ev) {
const base64 = ev.target.result;
GM_setValue(CUSTOM_WALLPAPER_KEY, base64);
GM_setValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover'); //默认适应屏幕
// ---- 新增:更新当前卡片上的模式切换按钮 ----
const modeBtn = card.querySelector('.custom-mode-toggle-btn');
if (modeBtn) {
updateCustomModeBtn(modeBtn, card);
}
// 更新所有自定义卡片预览
updateCustomCardPreviews();
applySkin('page-theme-custom');
showToast('壁纸上传成功(适应模式)', '#4caf50', 'right');
};
reader.readAsDataURL(file);
this.remove();
});
input.addEventListener('cancel', function() { this.remove(); });
}
// 更新自定义壁纸模式切换按钮的图标和标题
function updateCustomModeBtn(btn, card) {
const mode = GM_getValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover');
if (mode === 'cover') {
btn.innerHTML = `
`;
btn.setAttribute('title', '当前:适应,点击切换为平铺');
} else {
btn.innerHTML = `
`;
btn.setAttribute('title', '当前:平铺,点击切换为适应');
}
}
// 切换自定义壁纸模式
function toggleCustomMode(btn) {
const card = btn.closest('.skin-card');
if (!card) return;
// 如果有自定义壁纸缓存
const base64 = GM_getValue(CUSTOM_WALLPAPER_KEY, null);
if (!base64) {
showToast('请先上传一张壁纸', '#ff9800', 'wrong');
return;
}
const current = GM_getValue(CUSTOM_WALLPAPER_MODE_KEY, 'cover');
const newMode = current === 'cover' ? 'repeat' : 'cover';
GM_setValue(CUSTOM_WALLPAPER_MODE_KEY, newMode);
// 更新按钮显示
updateCustomModeBtn(btn, card);
// 如果当前皮肤正是自定义壁纸,立即应用新模式
if (getCurrentSkinValue().includes('page-theme-custom')) {
applySkin('page-theme-custom');
} else {
// 否则只更新卡片预览效果(方便用户预览)
updateCustomCardPreviews();
}
showToast(`壁纸已切换为:${newMode === 'cover' ? '适应模式' : '平铺模式'}`, '#4caf50');
}
// 更新翻转按钮的 title
function updateFlipBtnTitle(flipBtn, card) {
const state = card.dataset.bingState || 'placeholder';
if (state === 'real') {
flipBtn.setAttribute('title', '当前显示:实际壁纸,点击切换为占位图');
} else {
flipBtn.setAttribute('title', '当前显示:占位图,点击切换为实际壁纸');
}
}
// 切换 Bing 卡片的预览图(占位图 ↔ 实际壁纸)
function toggleBingPreview(flipBtn) {
// ---- 强制重新触发动画(解决动画中断残留问题) ----
flipBtn.classList.remove('flipping');
// 强制回流,确保移除生效
void flipBtn.offsetWidth;
flipBtn.classList.add('flipping');
// 移除旧的 animationend 监听(避免重复绑定)
const oldHandler = flipBtn._animEndHandler;
if (oldHandler) {
flipBtn.removeEventListener('animationend', oldHandler);
delete flipBtn._animEndHandler;
}
// 清除之前的后备定时器
if (flipBtn._animTimeout) {
clearTimeout(flipBtn._animTimeout);
delete flipBtn._animTimeout;
}
// 动画结束后移除类,避免残留
// 动画结束后清除类
const handler = function() {
flipBtn.classList.remove('flipping');
flipBtn.removeEventListener('animationend', handler);
if (flipBtn._animTimeout) {
clearTimeout(flipBtn._animTimeout);
delete flipBtn._animTimeout;
}
delete flipBtn._animEndHandler;
};
flipBtn.addEventListener('animationend', handler);
flipBtn._animEndHandler = handler;
// 后备定时器:如果 animationend 未触发(如元素隐藏),400ms 后强制清除
flipBtn._animTimeout = setTimeout(() => {
flipBtn.classList.remove('flipping');
if (flipBtn._animEndHandler) {
flipBtn.removeEventListener('animationend', flipBtn._animEndHandler);
delete flipBtn._animEndHandler;
}
delete flipBtn._animTimeout;
}, 400);
const card = flipBtn.closest('.skin-card');
if (!card) return;
const previewInner = card.querySelector('.skin-card-preview-inner');
if (!previewInner) return;
const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
if (!cached) {
showToast('今日壁纸尚未加载,请先选择 Bing每日壁纸 卡片以获取', '#ff9800', 'wrong');
return;
}
// 获取当前状态('placeholder' 或 'real')
const currentState = card.dataset.bingState || 'placeholder';
let newState;
if (currentState === 'placeholder') {
// 切换到实际壁纸
previewInner.style.backgroundImage = `url("${cached}")`;
newState = 'real';
} else {
// 切回占位图(清空内联样式,让 CSS 背景生效)
previewInner.style.backgroundImage = '';
newState = 'placeholder';
}
// 更新 dataset
card.dataset.bingState = newState;
// 更新按钮的 title
updateFlipBtnTitle(flipBtn, card);
// 如果开启了持久化,保存状态
if (BING_FLIP_PERSIST === 1) {
GM_setValue(BING_FLIP_STATE_KEY, newState);
}
// ---- 新增 Toast 提示 ----
if (newState === 'real') {
showToast('预览图已切换为:实际壁纸', '#4caf50');
} else {
showToast('预览图已切换为:占位图', '#4caf50');
}
}
/**
* 统一处理锁定/解锁的 UI 更新和 Toast 提示
* @param {string} type - 'bing' 或 'custom'
* @param {HTMLElement} btn - 锁定按钮元素
* @param {HTMLElement} card - 卡片元素
*/
function handleLockToggle(type, btn, card) {
const newState = toggleLock(type); // 切换存储状态,返回新状态
// 1. 更新按钮图标和文字
btn.innerHTML = newState
? `已锁定`
: `未锁定`;
// 2. 更新按钮 title(根据类型区分说明)
if (type === 'bing') {
btn.title = newState
? '已锁定(点击后解锁,立即更新为今日壁纸)'
: '未锁定(点击后锁定,不再更新壁纸)';
} else {
btn.title = newState
? '已锁定(点击后解锁,可以上传新壁纸)'
: '未锁定(点击后锁定,无法上传新壁纸)';
}
// 3. 切换卡片锁定类(影响遮罩/条纹显示)
card.classList.toggle('skin-card-locked', newState);
// 4. 同步锁图标(LOCK_STYLE=1 时存在)
if (card._lockIcon) {
card._lockIcon.style.display = newState ? 'block' : 'none';
}
// 5. 自定义壁纸特殊:控制上传遮罩的显示
if (type === 'custom') {
const overlay = card.querySelector('.custom-upload-overlay');
if (overlay) {
if (newState) {
overlay.classList.remove('active'); // 锁定强制隐藏
} else if (card.matches(':hover')) {
overlay.classList.add('active'); // 解锁且悬停时显示
}
}
}
// 6. 如果解锁的是 Bing 且当前皮肤正是 Bing,立即刷新壁纸
if (type === 'bing' && !newState && getCurrentSkinValue().includes('page-theme-bing')) {
applyBingSkin();
}
// 7. 显示 Toast(锁定用橙色,解锁用绿色)
if (type === 'bing') {
showToast(
newState ? '已锁定今日壁纸,将不再自动更新' : '已解锁,正在更新今日壁纸',
newState ? '#ff9800' : '#4caf50'
);
} else {
showToast(
newState ? '自定义壁纸已锁定,无法上传新壁纸' : '自定义壁纸已解锁,可以上传新壁纸',
newState ? '#ff9800' : '#4caf50'
);
}
// 8. 刷新面板选中状态(保证其他卡片同步)
updateSelectedCardInSkinPanel();
}
function createSkinCard(skin) {
const card = document.createElement('div');
card.className = 'skin-card';
card.dataset.skinClass = skin.bodyClass;
/*
card.style.cssText = `
width: 160px;
cursor: pointer;
border-radius: 12px;
overflow: hidden;
border: 2px solid transparent;
transition: border-color 0.2s, box-shadow 0.2s;
background: #fff;
`;
*/
// 根据锁定状态添加警示类(仅 Bing 和自定义壁纸支持锁定)
let lockedKey = null;
if (skin.name === 'Bing每日壁纸') {
lockedKey = BING_LOCKED_KEY;
} else if (skin.name === '自定义壁纸') {
lockedKey = CUSTOM_LOCKED_KEY;
}
const isLocked = lockedKey ? GM_getValue(lockedKey, false) : false;
if (isLocked) {
card.classList.add('skin-card-locked');
}
card.addEventListener('mouseenter', () => {
card.classList.add('skin-card-hover');
});
card.addEventListener('mouseleave', () => {
card.classList.remove('skin-card-hover');
});
// ---- 新增:清理翻转按钮动画状态(仅针对 Bing 卡片) ----
card.addEventListener('mouseleave', function() {
const flipBtn = this.querySelector('.bing-flip-btn');
if (flipBtn) {
flipBtn.classList.remove('flipping');
// 清除可能残留的内联 transform,确保下次显示初始状态
flipBtn.style.transform = '';
}
});
card.addEventListener('click', function(e) {
// 如果点击的是上传按钮,已经阻止冒泡,所以不会触发这里
if (skin.name === '自定义壁纸') {
const cached = getCustomWallpaper();
if (cached) {
applySkin('page-theme-custom');
setTimeout(hideSkinPanel, 150);
} else {
showToast('请先上传一张壁纸', '#ff9800');
}
} else {
applySkin(skin.bodyClass);
setTimeout(hideSkinPanel, 150);
}
});
const previewContent = document.createElement('div');
previewContent.className = 'skin-card-preview';
/*
previewContent.style.cssText = `
height: 90px;
border-radius: 8px 8px 0 0;
overflow: hidden;
`;
*/
const previewInner = document.createElement('div');
previewInner.className = 'skin-card-preview-inner ' + skin.previewClass;
/*
previewInner.style.cssText = `
width: 100%;
height: 100%;
`;
*/
previewContent.appendChild(previewInner);
// 如果是自定义壁纸卡片且存在缓存,立即设置预览
if (skin.name === '自定义壁纸') {
const cached = getCustomWallpaper();
if (cached) {
previewInner.style.backgroundImage = `url(${cached})`;
previewInner.style.backgroundSize = 'cover';
previewInner.style.backgroundRepeat = 'no-repeat';
}
}
// ---- 为 Bing 卡片添加翻转按钮(预览图右上角) ----
if (skin.name === 'Bing每日壁纸') {
// 确定初始状态
let initialIsReal = false;
if (BING_FLIP_PERSIST === 1) {
const savedState = GM_getValue(BING_FLIP_STATE_KEY, 'placeholder');
initialIsReal = (savedState === 'real');
}
const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
// 根据状态设置预览背景
if (initialIsReal && cached) {
previewInner.style.backgroundImage = `url("${cached}")`;
card.dataset.bingState = 'real';
} else {
// 占位图(清空内联,让 CSS 背景生效)
previewInner.style.backgroundImage = '';
card.dataset.bingState = 'placeholder';
}
// 创建翻转按钮
const flipBtn = document.createElement('div');
flipBtn.className = 'bing-flip-btn';
flipBtn.innerHTML = `
`;
// 设置初始 title
updateFlipBtnTitle(flipBtn, card);
flipBtn.addEventListener('click', function(e) {
e.stopPropagation();
toggleBingPreview(this); // 传递按钮自身
});
previewContent.style.position = 'relative';
previewContent.appendChild(flipBtn);
}
// ---- 仅当配置为黄锁时,才创建锁图标 ----
if (LOCK_STYLE === 1 && lockedKey) {
const lockIcon = document.createElement('div');
lockIcon.className = 'lock-icon';
// 默认根据锁定状态决定显示/隐藏
lockIcon.style.display = isLocked ? 'block' : 'none';
// 使用 SVG 锁图标(黄色)
lockIcon.innerHTML = `
`;
// 将锁图标添加到 previewContent(预览区容器)
previewContent.style.position = 'relative';
previewContent.appendChild(lockIcon);
// 保存引用到卡片对象,供锁定切换时使用
card._lockIcon = lockIcon;
}
// ---- 为 Bing 和自定义壁纸添加操作按钮 ----
if (skin.name === 'Bing每日壁纸' || skin.name === '自定义壁纸') {
const actionsDiv = document.createElement('div');
actionsDiv.className = 'skin-card-actions';
// 按钮组样式(通过CSS控制)
// ----- 锁定/解锁按钮 -----
const lockBtn = document.createElement('button');
lockBtn.className = 'skin-card-action-btn';
// 初始状态
const isLocked = GM_getValue(
skin.name === 'Bing每日壁纸' ? BING_LOCKED_KEY : CUSTOM_LOCKED_KEY,
false
);
// 修正后:锁定显示带钥匙孔,未锁定显示不带
lockBtn.innerHTML = isLocked
? `已锁定`
: `未锁定`;
// ---- 这里根据皮肤设置不同的 title ----
let lockTitle;
if (skin.name === 'Bing每日壁纸') {
lockTitle = isLocked ? '已锁定(点击后解锁,立即更新为今日壁纸)' : '未锁定(点击后锁定,不再更新壁纸)';
} else {
lockTitle = isLocked ? '已锁定(点击后解锁,可以上传新壁纸)' : '未锁定(点击后锁定,无法上传新壁纸)';
}
lockBtn.title = lockTitle;
lockBtn.addEventListener('click', function(e) {
e.stopPropagation();
const type = skin.name === 'Bing每日壁纸' ? 'bing' : 'custom';
// --- 前置条件检查 ---
if (type === 'custom' && !getCustomWallpaper()) {
showToast('请先上传一张壁纸', '#ff9800', 'wrong');
return;
}
if (type === 'bing') {
const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
if (!cached) {
showToast('今日壁纸尚未加载,请先选择 Bing每日壁纸 卡片以获取', '#ff9800', 'wrong');
return;
}
}
// 调用统一处理函数
handleLockToggle(type, this, card);
});
actionsDiv.appendChild(lockBtn);
// ----- 下载按钮 -----
const downloadBtn = document.createElement('button');
downloadBtn.className = 'skin-card-action-btn';
downloadBtn.innerHTML = `下载`;
if (skin.name === 'Bing每日壁纸') {
downloadBtn.title = '下载今日壁纸';
} else {
downloadBtn.title = '下载当前自定义壁纸';
}
downloadBtn.addEventListener('click', function(e) {
e.stopPropagation();
// 如果是自定义壁纸卡片,且没有缓存壁纸,则提示并返回
if (skin.name === '自定义壁纸' && !getCustomWallpaper()) {
showToast('请先上传一张壁纸', '#ff9800', 'wrong');
return;
}
// ---- 新增:针对 Bing 壁纸的缓存检查 ----
if (skin.name === 'Bing每日壁纸') {
const cached = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
if (!cached) {
showToast('今日壁纸尚未加载,请先选择 Bing每日壁纸 卡片以获取', '#ff9800', 'wrong');
return;
}
}
let data = null;
// 直接根据当前卡片的皮肤类型获取数据
if (skin.name === 'Bing每日壁纸') {
const base64 = GM_getValue(BING_STORAGE_KEY_IMAGE, null);
if (base64) data = { base64, type: 'bing' };
} else if (skin.name === '自定义壁纸') {
const base64 = getCustomWallpaper();
if (base64) data = { base64, type: 'custom' };
}
if (!data || !data.base64) {
showToast('没有可下载的壁纸', '#ff9800', 'wrong', 2000);
return;
}
// 提取扩展名
const mimeMatch = data.base64.match(/^data:image\/(\w+);base64,/);
const ext = mimeMatch ? mimeMatch[1] : 'png';
const filename = `wallpaper_${Date.now()}.${ext}`;
downloadBase64(data.base64, filename);
showToast('壁纸已下载', '#4caf50', 'right');
});
actionsDiv.appendChild(downloadBtn);
// ----- 上传按钮(仅自定义壁纸) -----
if (skin.name === '自定义壁纸') {
// ---- 1. 创建上传遮罩(独立于底部 actions) ----
const uploadOverlay = document.createElement('div');
uploadOverlay.className = 'custom-upload-overlay';
uploadOverlay.innerHTML = `
`;
// 点击触发上传
uploadOverlay.addEventListener('click', function(e) {
e.stopPropagation();
// 检查锁定状态(双重保险)
if (GM_getValue(CUSTOM_LOCKED_KEY, false)) {
showToast('壁纸已锁定,请先解锁', '#ff9800', 'wrong');
return;
}
// 调用独立的上传函数(见下文)
const currentCard = this.closest('.skin-card'); // 保存卡片
triggerCustomUpload(currentCard); // 传入卡片
});
// ----- 自定义壁纸模式切换按钮(右上角) -----
const modeToggleBtn = document.createElement('div');
modeToggleBtn.className = 'custom-mode-toggle-btn';
// 初始化图标和标题
updateCustomModeBtn(modeToggleBtn, card);
modeToggleBtn.addEventListener('click', function(e) {
e.stopPropagation(); // 防止触发卡片点击
toggleCustomMode(this);
});
// 将按钮添加到 previewContent(预览区容器)
previewContent.style.position = 'relative';
previewContent.appendChild(modeToggleBtn);
// 将遮罩添加到预览区(注意 previewContent 已定义)
previewContent.style.position = 'relative'; // 确保遮罩基于此定位
previewContent.appendChild(uploadOverlay);
// ---- 2. 控制 hover 显示(利用卡片 mouseenter/mouseleave) ----
card.addEventListener('mouseenter', function() {
const locked = GM_getValue(CUSTOM_LOCKED_KEY, false);
if (!locked) {
uploadOverlay.classList.add('active');
} else {
uploadOverlay.classList.remove('active');
}
});
card.addEventListener('mouseleave', function() {
uploadOverlay.classList.remove('active');
});
// ---- 3. 当锁定状态切换时,同步刷新(如果在锁定期间鼠标仍悬停) ----
// 这部分我们放在锁定按钮的点击回调里做,见下文
}
previewContent.appendChild(actionsDiv);
}
const radioDiv = document.createElement('div');
radioDiv.className = 'skin-card-radio';
/*
radioDiv.style.cssText = `
display: flex;
align-items: center;
padding: 8px 10px;
background: #fafafa;
border-radius: 0 0 8px 8px;
`;
*/
const radioIcon = document.createElement('div');
radioIcon.className = 'skin-card-radio-icon';
/*
radioIcon.style.cssText = `
width: 16px;
height: 16px;
border-radius: 50%;
border: 2px solid #d9d9d9;
margin-right: 8px;
transition: all 0.2s;
`;
*/
const radioText = document.createElement('div');
radioText.className = 'skin-card-radio-text';
radioText.textContent = skin.name;
/*
radioText.style.cssText = `
flex: 1;
font-size: 14px;
color: #333;
`;
*/
radioDiv.appendChild(radioIcon);
radioDiv.appendChild(radioText);
card.appendChild(previewContent);
card.appendChild(radioDiv);
return card;
}
function updateSelectedCardInSkinPanel() {
if (!skinPanelContainer) return;
const currentClass = getCurrentSkinValue();
const cards = skinPanelContainer.querySelectorAll('.skin-card');
cards.forEach(card => {
const cardClass = card.dataset.skinClass;
const radioIcon = card.querySelector('.skin-card-radio-icon');
const isSelected = (cardClass === currentClass);
card.classList.toggle('skin-card-selected', isSelected);
if (radioIcon) {
radioIcon.classList.toggle('selected', isSelected);
}
});
}
function showSkinPanel() {
if (!skinPanelOverlay) createSkinPanel();
/*
// ---- 如果关闭持久化,每次打开弹窗重置 Bing 卡片为占位图 ----
if (BING_FLIP_PERSIST === 0) {
const bingCards = skinPanelContainer.querySelectorAll('.skin-card[data-skin-class="page-theme-bing"]');
bingCards.forEach(card => {
const previewInner = card.querySelector('.skin-card-preview-inner');
const flipBtn = card.querySelector('.bing-flip-btn');
if (previewInner) {
// 清空内联样式,让 CSS 背景(占位图)生效
previewInner.style.backgroundImage = '';
}
// 重置状态标记
card.dataset.bingState = 'placeholder';
if (flipBtn) {
updateFlipBtnTitle(flipBtn, card);
}
});
}
*/
skinPanelOverlay.style.display = 'flex';
updateSelectedCardInSkinPanel();
updateCustomCardPreviews(); // 新增
console.log('[换肤助手] 弹窗已显示');
}
function hideSkinPanel() {
if (skinPanelOverlay) {
skinPanelOverlay.style.display = 'none';
console.log('[换肤助手] 弹窗已关闭');
}
}
function toggleSkinPanel(e) {
e.stopPropagation();
if (skinPanelOverlay && skinPanelOverlay.style.display === 'flex') {
hideSkinPanel();
} else {
showSkinPanel();
}
}
// 创建换肤按钮
function createSkinButton() {
const btn = document.createElement('div');
btn.className = 'frame-header-setting-btn skin-switch-btn';
btn.setAttribute('title', '切换皮肤');
/*
btn.style.cssText = `
display: inline-flex;
align-items: center;
margin-right: 8px;
cursor: pointer;
`;
*/
const iconDiv = document.createElement('div');
iconDiv.className = 'skin-icon';
/*
iconDiv.style.cssText = 'width: 20px; height: 20px; margin-right: 4px;';
*/
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
svg.setAttribute('viewBox', '0 0 1246 1024');
svg.setAttribute('width', '20');
svg.setAttribute('height', '20');
svg.setAttribute('fill', 'currentColor');
const path = document.createElementNS(svgNS, 'path');
path.setAttribute('d', 'M958.769399 0.006678v78.802965l209.918631 198.877311-117.314017 112.194051a83.299631 83.299631 0 0 0-55.562768-19.67848c-47.3263 0-84.368145 35.483595-84.368146 80.761908v415.518681c0 43.31937-37.041845 78.758443-82.36468 78.758443H417.522147c-45.278313 0-82.320159-35.439073-82.320159-78.802964V451.008954c0-45.278313-37.041845-80.761908-84.368146-80.761908-20.568909 0-41.18234 7.880296-55.562768 19.723002L77.912535 277.686954l207.870645-198.921833h51.466794l2.047987 1.958944C396.908716 163.444917 505.986265 216.603526 623.300283 216.603526c117.314018 0 226.391567-51.199666 284.046843-135.879461 0-1.958944 2.003465-1.958944 2.003465-1.958944h49.418808V0.006678M341.256905 0.006678h-44.966663c-28.58277 0-48.973594 7.880296-63.309501 23.596368L24.486797 222.569401c-32.723265 31.521186-32.723265 80.761908 0 110.279628l120.564083 116.200982c14.291385 13.801649 34.72673 21.637424 53.114088 21.637424 18.43188 0 38.867225-7.880296 53.15861-21.637424h2.047987c2.047987 0 2.047987 0 2.047987 1.958943v415.518682C255.464073 953.121854 329.013506 1024 418.946833 1024h408.7069c89.933327 0 163.48276-70.878146 163.48276-157.516886v-415.518681c0-1.958944 0-1.958944 2.047986-1.958944h2.047987c14.291385 13.801649 34.72673 21.637424 53.15861 21.637424 20.435345 0 38.822703-7.880296 53.114088-21.637424l120.564083-116.200981c32.723265-31.521186 32.723265-80.717387 0-110.279629L1015.667811 23.647568A83.433195 83.433195 0 0 0 956.409763 0.006678h-51.110624c-28.58277 0-53.114088 13.801649-69.45346 37.398017-42.918677 61.083428-122.61207 100.440388-214.593383 100.440389-91.936792 0-171.674706-41.360426-214.593383-100.440389C394.460036 13.808327 367.83621 0.006678 341.301426 0.006678z');
svg.appendChild(path);
iconDiv.appendChild(svg);
const textSpan = document.createElement('span');
textSpan.textContent = '换肤';
btn.appendChild(iconDiv);
btn.appendChild(textSpan);
btn.addEventListener('click', toggleSkinPanel);
return btn;
}
/**
* 读取样式设置,若存储不存在或结构不完整则返回默认值
*/
function getStyleSettings() {
const saved = GM_getValue(STYLE_SETTINGS_KEY, null);
if (saved) {
try {
const parsed = JSON.parse(saved);
const defaults = JSON.parse(JSON.stringify(DEFAULT_STYLE_SETTINGS));
for (const group of ['header', 'sidebar', 'route']) {
if (!parsed[group]) parsed[group] = {};
for (const key of ['opacity', 'blur', 'opacityEnabled', 'blurEnabled']) {
if (parsed[group][key] === undefined) {
parsed[group][key] = defaults[group][key];
}
}
}
return parsed;
} catch (e) {
console.warn('[样式面板] 读取存储失败,使用默认值', e);
}
}
// ---- 首次使用:根据默认值自动启用 checkbox ----
const defaultSettings = JSON.parse(JSON.stringify(DEFAULT_STYLE_SETTINGS));
for (const group of ['header', 'sidebar', 'route']) {
if (defaultSettings[group].opacity !== 1) {
defaultSettings[group].opacityEnabled = true;
}
if (defaultSettings[group].blur !== 0) {
defaultSettings[group].blurEnabled = true;
}
}
// 保存到存储,避免每次刷新都重新初始化
saveStyleSettings(defaultSettings);
return defaultSettings;
}
/**
* 保存样式设置
*/
function saveStyleSettings(settings) {
GM_setValue(STYLE_SETTINGS_KEY, JSON.stringify(settings));
}
/**
* 根据当前设置生成并注入 CSS 覆盖规则
* 仅当复选框启用时才输出对应的属性
*/
/**
* 根据当前设置生成并注入 CSS 覆盖规则
* 仅当复选框启用时才输出对应的属性
* 当复选框未启用时,主动清除原生样式(如 blur),确保面板设置完全生效
*/
function applyStyleOverrides() {
const settings = getStyleSettings();
const rules = [];
// ---- 顶部栏 ----
if (settings.header.opacityEnabled) {
rules.push(`.frame-header { background: rgba(255, 255, 255, ${settings.header.opacity}) !important; }`);
}
if (settings.header.blurEnabled) {
rules.push(
`.frame-header { ` +
`backdrop-filter: blur(${settings.header.blur}px) !important; ` +
`-webkit-backdrop-filter: blur(${settings.header.blur}px) !important; ` +
`}`
);
} else {
// 清除可能存在的原生模糊
rules.push(
`.frame-header { ` +
`backdrop-filter: none !important; ` +
`-webkit-backdrop-filter: none !important; ` +
`}`
);
}
// ---- 侧边栏 ----
if (settings.sidebar.opacityEnabled) {
rules.push(`.frame-sidebar { background: rgba(255, 255, 255, ${settings.sidebar.opacity}) !important; }`);
// 子元素背景透明,让父级半透明白色背景显示
rules.push(
`.frame-sidebar .sidebar-header { background: transparent !important; }`,
`.frame-sidebar .sidebar-menus { background: transparent !important; }`
);
}
if (settings.sidebar.blurEnabled) {
rules.push(
`.frame-sidebar { ` +
`backdrop-filter: blur(${settings.sidebar.blur}px) !important; ` +
`-webkit-backdrop-filter: blur(${settings.sidebar.blur}px) !important; ` +
`}`
);
} else {
// 清除可能存在的原生模糊
rules.push(
`.frame-sidebar { ` +
`backdrop-filter: none !important; ` +
`-webkit-backdrop-filter: none !important; ` +
`}`
);
}
// ---- 正文区 ----
if (settings.route.opacityEnabled) {
rules.push(`.frame-route-wrap { background: rgba(255, 255, 255, ${settings.route.opacity}) !important; }`);
}
if (settings.route.blurEnabled) {
rules.push(
`.frame-route-wrap::before { ` +
`backdrop-filter: blur(${settings.route.blur}px) !important; ` +
`-webkit-backdrop-filter: blur(${settings.route.blur}px) !important; ` +
`}`
);
} else {
// 清除原生模糊(东方青绿等皮肤自带 blur)
rules.push(
`.frame-route-wrap::before { ` +
`backdrop-filter: none !important; ` +
`-webkit-backdrop-filter: none !important; ` +
`}`
);
}
// 仅当启用不透明度时,才将 ::before 背景设为透明,让父级背景显示
if (settings.route.opacityEnabled) {
rules.push(`.frame-route-wrap::before { background: transparent !important; }`);
}
// 注意:如果两者都未启用,则不添加 background 规则,让原生 ::before 背景恢复(如东方青绿的半透明白色)
// ---- 注入或更新样式 ----
let style = document.getElementById('qqmail-style-override');
if (!style) {
style = document.createElement('style');
style.id = 'qqmail-style-override';
document.head.appendChild(style);
}
style.textContent = rules.join('\n');
}
function createStyleButton() {
const btn = document.createElement('div');
btn.className = 'frame-header-setting-btn style-switch-btn';
btn.setAttribute('title', '样式设置');
// 图标:使用 SVG 调色板,与换肤按钮风格统一
const iconSpan = document.createElement('span');
iconSpan.className = 'style-icon';
iconSpan.innerHTML = `
`;
const textSpan = document.createElement('span');
textSpan.textContent = '样式';
btn.appendChild(iconSpan);
btn.appendChild(textSpan);
btn.addEventListener('click', toggleStylePanel);
return btn;
}
function createStylePanel() {
if (stylePanelOverlay) return;
// ---- 遮罩 ----
stylePanelOverlay = document.createElement('div');
stylePanelOverlay.className = 'style-panel-overlay';
stylePanelOverlay.addEventListener('click', (e) => {
if (e.target === stylePanelOverlay) hideStylePanel();
});
// ---- 面板容器 ----
stylePanelContainer = document.createElement('div');
stylePanelContainer.className = 'style-panel-container';
// ---- 标题栏 ----
const header = document.createElement('div');
header.className = 'style-panel-header';
const title = document.createElement('span');
title.className = 'style-panel-title';
title.innerHTML = `样式自定义实时响应`;
const closeBtn = document.createElement('div');
closeBtn.className = 'style-panel-close';
closeBtn.innerHTML = `
`;
closeBtn.addEventListener('click', hideStylePanel);
header.appendChild(title);
header.appendChild(closeBtn);
stylePanelContainer.appendChild(header);
// ---- 三组控件 ----
const groups = ['header', 'sidebar', 'route'];
const groupLabels = {
header: '顶部栏',
sidebar: '侧边栏',
route: '正文区'
};
const settings = getStyleSettings();
groups.forEach(group => {
const groupDiv = document.createElement('div');
groupDiv.className = 'style-group';
groupDiv.dataset.group = group; // 用于 showStylePanel 定位
// 组标题
const label = document.createElement('div');
label.className = 'style-group-label';
label.textContent = groupLabels[group];
groupDiv.appendChild(label);
// ---- 不透明度行 ----
const opacityRow = document.createElement('div');
opacityRow.className = 'style-row';
const opacityCheck = document.createElement('input');
opacityCheck.type = 'checkbox';
opacityCheck.checked = settings[group].opacityEnabled;
const opacitySlider = document.createElement('input');
opacitySlider.type = 'range';
opacitySlider.min = 0;
opacitySlider.max = 1;
opacitySlider.step = 0.05;
opacitySlider.value = settings[group].opacity;
// 根据 checkbox 状态设置初始 class
opacitySlider.className = settings[group].opacityEnabled ? 'slider-active' : 'slider-inactive';
// 滑块始终可拖动,不再受复选框禁用
//opacitySlider.disabled = !settings[group].opacityEnabled;
const opacityValue = document.createElement('span');
opacityValue.className = 'style-value';
opacityValue.textContent = settings[group].opacity.toFixed(2);
opacityRow.appendChild(opacityCheck);
opacityRow.appendChild(document.createTextNode('不透明度'));
opacityRow.appendChild(opacitySlider);
opacityRow.appendChild(opacityValue);
groupDiv.appendChild(opacityRow);
// ---- 背景模糊行 ----
const blurRow = document.createElement('div');
blurRow.className = 'style-row';
const blurCheck = document.createElement('input');
blurCheck.type = 'checkbox';
blurCheck.checked = settings[group].blurEnabled;
const blurSlider = document.createElement('input');
blurSlider.type = 'range';
blurSlider.min = 0;
blurSlider.max = 30;
blurSlider.step = 1;
blurSlider.value = settings[group].blur;
blurSlider.className = settings[group].blurEnabled ? 'slider-active' : 'slider-inactive';
// 滑块始终可拖动,不再受复选框禁用
//blurSlider.disabled = !settings[group].blurEnabled;
const blurValue = document.createElement('span');
blurValue.className = 'style-value';
blurValue.textContent = settings[group].blur + 'px';
blurRow.appendChild(blurCheck);
blurRow.appendChild(document.createTextNode('背景模糊'));
blurRow.appendChild(blurSlider);
blurRow.appendChild(blurValue);
groupDiv.appendChild(blurRow);
// ---- 事件绑定 ----
// 不透明度复选框:控制滑块启用/禁用,保存状态,应用样式
opacityCheck.addEventListener('change', () => {
//opacitySlider.disabled = !opacityCheck.checked;
const s = getStyleSettings();
s[group].opacityEnabled = opacityCheck.checked;
saveStyleSettings(s);
// 更新滑块 class
if (opacityCheck.checked) {
opacitySlider.className = 'slider-active';
} else {
opacitySlider.className = 'slider-inactive';
}
applyStyleOverrides();
});
// 背景模糊复选框:同上
blurCheck.addEventListener('change', () => {
//blurSlider.disabled = !blurCheck.checked;
const s = getStyleSettings();
s[group].blurEnabled = blurCheck.checked;
saveStyleSettings(s);
// 更新滑块 class
if (blurCheck.checked) {
blurSlider.className = 'slider-active';
} else {
blurSlider.className = 'slider-inactive';
}
applyStyleOverrides();
});
// 不透明度滑块:实时更新显示值,保存,应用样式
opacitySlider.addEventListener('input', () => {
// 如果复选框未勾选,自动勾选并保存状态
if (!opacityCheck.checked) {
opacityCheck.checked = true;
opacitySlider.className = 'slider-active';
const s = getStyleSettings();
s[group].opacityEnabled = true;
saveStyleSettings(s);
}
// 更新值并应用
const val = parseFloat(opacitySlider.value);
opacityValue.textContent = val.toFixed(2);
const s = getStyleSettings();
s[group].opacity = val;
saveStyleSettings(s);
applyStyleOverrides();
});
// 背景模糊滑块:同上
blurSlider.addEventListener('input', () => {
// 如果复选框未勾选,自动勾选并保存状态
if (!blurCheck.checked) {
blurCheck.checked = true;
blurSlider.className = 'slider-active';
const s = getStyleSettings();
s[group].blurEnabled = true;
saveStyleSettings(s);
}
// 更新值并应用
const val = parseInt(blurSlider.value, 10);
blurValue.textContent = val + 'px';
const s = getStyleSettings();
s[group].blur = val;
saveStyleSettings(s);
applyStyleOverrides();
});
stylePanelContainer.appendChild(groupDiv);
});
// ---- 底部按钮:确定(左) + 恢复默认(右) ----
const footerDiv = document.createElement('div');
footerDiv.className = 'style-panel-footer';
// 确定按钮(左)
const confirmBtn = document.createElement('button');
confirmBtn.className = 'style-panel-confirm-btn';
confirmBtn.textContent = '确定';
confirmBtn.addEventListener('click', hideStylePanel);
// 恢复默认按钮(右)
const resetBtn = document.createElement('button');
resetBtn.className = 'style-panel-reset-btn';
resetBtn.textContent = '恢复默认';
resetBtn.addEventListener('click', function() {
showConfirmDialog(
'恢复默认设置',
'确定要恢复所有样式设置为默认值吗?',
function() {
const defaultSettings = JSON.parse(JSON.stringify(DEFAULT_STYLE_SETTINGS));
for (const group of ['header', 'sidebar', 'route']) {
if (defaultSettings[group].opacity !== 1) {
defaultSettings[group].opacityEnabled = true;
}
if (defaultSettings[group].blur !== 0) {
defaultSettings[group].blurEnabled = true;
}
}
saveStyleSettings(defaultSettings);
applyStyleOverrides();
updateStylePanelControls();
showToast('已恢复默认设置', '#4caf50', 'right');
console.log('[样式面板] 已恢复默认设置');
}
);
});
footerDiv.appendChild(confirmBtn);
footerDiv.appendChild(resetBtn);
stylePanelContainer.appendChild(footerDiv);
stylePanelOverlay.appendChild(stylePanelContainer);
document.body.appendChild(stylePanelOverlay);
}
function showToast(message, color = '#4caf50', icon = null, duration = 3500) {
// 移除已有 toast
const old = document.querySelector('.style-toast');
if (old) old.remove();
const toast = document.createElement('div');
toast.className = 'style-toast';
toast.style.background = color; // 动态背景色
// ---- 创建图标 ----
const iconContainer = document.createElement('span');
iconContainer.style.cssText = 'display:inline-flex; align-items:center; justify-content:center; flex-shrink:0;';
if (icon === 'right') {
// 对勾 SVG(白色)
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
svg.setAttribute('viewBox', '0 0 24 24');
svg.setAttribute('width', '20');
svg.setAttribute('height', '20');
svg.setAttribute('fill', 'none');
svg.setAttribute('stroke', 'white');
svg.setAttribute('stroke-width', '3');
svg.setAttribute('stroke-linecap', 'round');
svg.setAttribute('stroke-linejoin', 'round');
const polyline = document.createElementNS(svgNS, 'polyline');
polyline.setAttribute('points', '20 6 9 17 4 12');
svg.appendChild(polyline);
iconContainer.appendChild(svg);
} else if (icon === 'wrong') {
// 错误 X SVG(白色)
const svgNS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(svgNS, 'svg');
svg.setAttribute('viewBox', '0 0 24 24');
svg.setAttribute('width', '20');
svg.setAttribute('height', '20');
svg.setAttribute('fill', 'none');
svg.setAttribute('stroke', 'white');
svg.setAttribute('stroke-width', '3');
svg.setAttribute('stroke-linecap', 'round');
svg.setAttribute('stroke-linejoin', 'round');
const line1 = document.createElementNS(svgNS, 'line');
line1.setAttribute('x1', '18');
line1.setAttribute('y1', '6');
line1.setAttribute('x2', '6');
line1.setAttribute('y2', '18');
const line2 = document.createElementNS(svgNS, 'line');
line2.setAttribute('x1', '6');
line2.setAttribute('y1', '6');
line2.setAttribute('x2', '18');
line2.setAttribute('y2', '18');
svg.appendChild(line1);
svg.appendChild(line2);
iconContainer.appendChild(svg);
} else if (icon && typeof icon === 'string' && icon.startsWith('