☰

Southplus Plus

南+(South Plus)论坛的重度美化+功能插件,或许可以带来意外的惊吓:换肤与卡片化、预加载一体流、黑夜模式、图墙、无刷新购买、编辑器增强。设置见菜单「⚙ 脚本设置」。

スクリプトをインストールするには、Tampermonkey, Greasemonkey や Violentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、 Tampermonkey や Violentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、Tampermonkey や Violentmonkey のような拡張機能のインストールが必要です。

スクリプトをインストールするには、Tampermonkey や Userscripts のような拡張機能のインストールが必要です。

このスクリプトをインストールするには、Tampermonkeyなどの拡張機能をインストールする必要があります。

このスクリプトをインストールするには、ユーザースクリプト管理ツールの拡張機能をインストールする必要があります。

(ユーザースクリプト管理ツールは設定済みなのでインストール!)

このスタイルをインストールするには、Stylusなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus などの拡張機能をインストールする必要があります。

このスタイルをインストールするには、Stylus tなどの拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

このスタイルをインストールするには、ユーザースタイル管理用の拡張機能をインストールする必要があります。

(ユーザースタイル管理ツールは設定済みなのでインストール!)

このスクリプトの質問や評価の投稿はこちら、通報はこちらへお寄せください
// ==UserScript==
// @name         Southplus Plus
// @namespace    https://blue-plus.net/
// @icon         data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4IiB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSLljZcrIOaYn+WNsCI+PHRpdGxlPuWNlysg5pif5Y2w77yIc2VhbO+8iTwvdGl0bGU+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhLWJnIiB4MT0iMCIgeTE9IjAiIHgyPSIwLjkiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiMxNDIyMzgiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwQTExMjAiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD0iYS1zdGFyIiB4MT0iMCIgeTE9IjAiIHgyPSIwLjQiIHkyPSIxIj48c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3I9IiM4RkRDQ0UiLz48c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyRjZGNjgiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgcng9IjMwIiBmaWxsPSJ1cmwoI2EtYmcpIi8+PGNpcmNsZSBjeD0iNjQiIGN5PSI2NCIgcj0iNDYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzhGRENDRSIgc3Ryb2tlLW9wYWNpdHk9IjAuMTYiIHN0cm9rZS13aWR0aD0iMS41Ii8+PGNpcmNsZSBjeD0iNjQiIGN5PSI2NCIgcj0iMzciIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzhGRENDRSIgc3Ryb2tlLW9wYWNpdHk9IjAuMDkiIHN0cm9rZS13aWR0aD0iMSIvPjxwYXRoIGQ9Ik02NCAyMCBMNzMuNSA1NC41IEwxMDggNjQgTDczLjUgNzMuNSBMNjQgMTA4IEw1NC41IDczLjUgTDIwIDY0IEw1NC41IDU0LjUgWiIgZmlsbD0idXJsKCNhLXN0YXIpIi8+PHBhdGggZD0iTTY0IDY0IEw3My41IDczLjUgTDY0IDEwOCBMNTQuNSA3My41IFoiIGZpbGw9IiNFMDhBNUYiLz48ZyBmaWxsPSIjRUFGNEZGIj48Y2lyY2xlIGN4PSIzMSIgY3k9IjM1IiByPSIyLjEiIG9wYWNpdHk9IjAuOTUiLz48Y2lyY2xlIGN4PSI5OSIgY3k9IjQxIiByPSIxLjUiIG9wYWNpdHk9IjAuNyIvPjxjaXJjbGUgY3g9Ijk1IiBjeT0iOTciIHI9IjIuMiIgb3BhY2l0eT0iMC44NSIvPjxjaXJjbGUgY3g9IjMzIiBjeT0iOTQiIHI9IjEuMyIgb3BhY2l0eT0iMC41NSIvPjwvZz48L3N2Zz4=
// @version      3.13
// @description  南+(South Plus)论坛的重度美化+功能插件,或许可以带来意外的惊吓:换肤与卡片化、预加载一体流、黑夜模式、图墙、无刷新购买、编辑器增强。设置见菜单「⚙ 脚本设置」。
// @author       Auto
// @match        *://*.blue-plus.net/*
// @match        *://*.south-plus.net/*
// @match        *://*.south-plus.org/*
// @match        *://*.north-plus.net/*
// @match        *://*.east-plus.net/*
// @match        *://*.white-plus.net/*
// @match        *://*.level-plus.net/*
// @match        *://*.spring-plus.net/*
// @match        *://*.summer-plus.net/*
// @match        *://*.snow-plus.net/*
// @match        *://*.soul-plus.net/*
// @match        *://*.imoutolove.me/*
// @run-at       document-start
// @grant        GM_addStyle
// @grant        unsafeWindow
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_registerMenuCommand
// @grant        GM_xmlhttpRequest
// @grant        GM_download
// @connect      *
// @license      GPL-3.0
// ==/UserScript==
(function () {
'use strict';
window.__SPP_VERSION = '3.13';
try {
if (typeof GM_info !== 'undefined' && GM_info && GM_info.script && GM_info.script.version) {
window.__SPP_VERSION = String(GM_info.script.version);
}
} catch (e) {  }
try {
const pinVersion = function () {
try { document.documentElement.setAttribute('data-spp-version', String(window.__SPP_VERSION)); } catch (e2) {}
};
if (document.documentElement) pinVersion();
else document.addEventListener('DOMContentLoaded', pinVersion, { once: true });
} catch (e) {  }
const PATH = location.pathname;
const SEARCH = location.search;
const FILE = (PATH.split('/').pop() || '').toLowerCase();
const PAGE = {
file:    FILE,
home:    FILE === '' || FILE === 'index.php',
board:   FILE === 'thread.php' || FILE === 'thread_new.php',
read:    FILE === 'read.php',
post:    FILE === 'post.php' || SEARCH.includes('action-quote') || SEARCH.includes('action-modify'),
search:  FILE === 'search.php',
trade:   FILE === 'job.php' && SEARCH.includes('action-trade'),
profile: FILE === 'profile.php',
task:    /^\/plugin\.php$/i.test(PATH) && /[?&]H_name[=-]tasks/i.test(SEARCH)
};
const WANTS = {
crumbPanel: PAGE.read || PAGE.post,
editorUi:   PAGE.read || PAGE.post,
readOnly:   PAGE.read,
homeNav:    PAGE.read || PAGE.board
};
(function sppProfileSetInit() {
try {
const root = document.documentElement;
if (root && PAGE.profile && !root.id) root.id = 'spp-profile-set';
} catch (e) { }
const verify = function () {
try {
const root = document.documentElement;
const hasSetWrap = !!document.getElementById('set-wrap');
const onHtml = root && root.id === 'spp-profile-set';
if (hasSetWrap && !onHtml && root && !root.id) root.id = 'spp-profile-set';
if (!hasSetWrap && onHtml) root.id = '';
} catch (e) { }
};
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', verify, { once: true });
else verify();
})();
function isTeaFid() {
return /fid[-=]9(?!\w)/.test(location.href);
}
function sppFidNum() {
const m = String(location.href).match(/fid[-=]([0-9]+)/);
return m ? Number(m[1]) : 0;
}
const SPP_PANE_DEFAULT = { 13: 'subs', 43: 'subs', 170: 'subs' };
function isAskFid() {
return /fid[-=]48(?!\w)/.test(location.href);
}
const CARD_HIDE_SHAPES = [
{ key: 'spp_card_hz', cls: 'spp-card-hz' },   
{ key: 'spp_card_vt', cls: 'spp-card-vt' },   
{ key: 'spp_card_ni', cls: 'spp-card-ni' }    
];
const CARD_HIDE_ITEMS = [
['_av',   '-noav'],     
['_nm',   '-nonm'],     
['_dt',   '-nodt'],     
['_fav',  '-nofav'],    
['_glow', '-noglow']    
];
function sppStampCardHideFlags() {
const root = document.documentElement.classList;
CARD_HIDE_SHAPES.forEach(function (sh) {
const on = {};
CARD_HIDE_ITEMS.forEach(function (it) {
const raw = GM_getValue(sh.key + it[0], null);
const v = (raw === null || raw === undefined || raw === '') ? false
: (typeof raw === 'string' ? raw.toLowerCase() !== 'false' : !!raw);
on[it[0]] = v;
if (v) root.add(sh.cls + it[1]);
});
if (on._av && on._nm) root.add(sh.cls + '-noavnm');
if (on._av && on._nm && on._dt) root.add(sh.cls + '-nometa');
});
}
const SPP_FAV_UI_ALLOWED = ['1', '2', '6'];
const SPP_FAV_UI_DEF = '6';
const SPP_FAV_UI_LABEL = { '1': '加入星图', '2': 'BOOKMARK', '6': '夜阑珍藏' };
function sppFavUiId() {
const raw = GM_getValue('spp_fav_ui', null);
const v = (raw === null || raw === undefined || raw === '') ? SPP_FAV_UI_DEF : String(raw);
return SPP_FAV_UI_ALLOWED.indexOf(v) >= 0 ? v : SPP_FAV_UI_DEF;
}
function sppStampFavUi() {
const id = sppFavUiId();
document.documentElement.classList.add('spp-fav-ui');
document.documentElement.classList.add('spp-fav-ui-' + id);
}
if (PATH.includes('thread_new.php') || PATH.includes('thread.php')) {
document.documentElement.classList.add('spp-board-skin');
sppStampCardHideFlags();
sppStampFavUi();
}
function getImgSrc(img) {
return img.getAttribute('data-src')
|| img.getAttribute('data-original')
|| img.getAttribute('data-lazy-src')
|| img.getAttribute('file')
|| img.src || '';
}
function isContentImage(img) {
const src = getImgSrc(img);
if (!src || src === 'about:blank' || src.startsWith('data:')) return false;
if (src.includes('/images/post/smile/')) return false;
if (src.includes('/images/colorImagination/')) return false;
if (src.includes('noimageavailble')) return false;
if (img.naturalWidth > 0 && img.naturalWidth < 80 && img.naturalHeight > 0 && img.naturalHeight < 80) return false;
return true;
}
let domReadySeq = 0;
function onDomReady(fn) {
const seq = ++domReadySeq;
const run = function () {
try {
fn();
} catch (e) {
SPP_INIT.fail.push('DOMReady#' + seq + ' ⇒ ' + errBrief(e));
console.error('[SPP] DOMReady 回调#' + seq + ' 初始化失败', e);
}
};
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', run);
} else {
run();
}
}
function appendToHeadSafe(el) {
const parent = document.head || document.documentElement || document.body;
if (parent) {
parent.appendChild(el);
} else {
document.addEventListener('DOMContentLoaded', () => {
(document.head || document.documentElement || document.body).appendChild(el);
}, { once: true });
}
}
function ensureStyle(id, css) {
if (document.getElementById(id)) return;
const st = document.createElement('style');
st.id = id;
st.textContent = css;
appendToHeadSafe(st);
}
function waitForElement(selector, maxRetries, interval) {
maxRetries = maxRetries || 30;
interval = interval || 500;
return new Promise(function (resolve) {
var tries = 0;
(function check() {
var el = document.querySelector(selector);
if (el) { resolve(el); return; }
if (++tries >= maxRetries) { resolve(null); return; }
setTimeout(check, interval);
})();
});
}
function getReplyColor(count) {
if (isTeaFid()) {
if (count <= 20) return '#9AA5BB';
if (count <= 50) return '#67C23A';
if (count <= 80) return '#E6A23C';
return '#F56C6C';
}
if (count <= 50) return '#9AA5BB';
if (count <= 100) return '#E6A23C';
return '#F56C6C';
}
function appendToBodySafe(el, maxRetries) {
maxRetries = maxRetries || 100;
(function tryAppend(tries) {
if (document.body) { document.body.appendChild(el); return; }
if (tries < maxRetries) setTimeout(function () { tryAppend(tries + 1); }, 50);
})(0);
}
const SPP_INIT = { ok: [], fail: [] };
function errBrief(e) {
return (e && e.name ? e.name : 'Error') + ': ' + (e && e.message ? e.message : String(e));
}
function publishInitReport() {
try {
document.documentElement.setAttribute('data-spp-init',
'ok' + SPP_INIT.ok.length + '/fail' + SPP_INIT.fail.length +
(SPP_INIT.fail.length ? ' ⇒ ' + SPP_INIT.fail.join(' ; ') : ''));
} catch (e) {  }
window.__SPP_INIT = SPP_INIT;
}
function safeInit(name, fn) {
try {
fn();
SPP_INIT.ok.push(name);
} catch (e) {
SPP_INIT.fail.push(name + ' ⇒ ' + errBrief(e));
console.error('[SPP] ' + name + ' 初始化失败', e);
}
}
const SPP_DESIGN_VARS = ':root{--spu-bg:#f4f6f8;--spu-surface:#ffffff;--spu-overlay:#eef2f5;--spu-text:#1f2937;--spu-secondary:#475569;--spu-muted:#6b7280;--spu-border:#d8dee7;--spu-accent:#2f6f68;--spu-accent-dim:#255a55;--spu-radius:7px;--spu-shadow-sm:0 1px 2px rgba(15,23,42,0.04);--spu-shadow-md:0 1px 2px rgba(15,23,42,0.04),0 10px 28px rgba(15,23,42,0.06);}';
(function injectDesignVars() {
const el = document.createElement('style');
el.id = 'spp-design-vars';
el.textContent = SPP_DESIGN_VARS;
appendToHeadSafe(el);
})();
const IMG_DEFAULTS = { maxImgHeight: 80, maxImgWidth: 100, vertImgHeight: 80, vertImgWidth: 100, thumbSize: 64, centerImg: true, wheelAction: 'switch' };
const IMG_SETTINGS_KEY = 'spp_img_settings';
const IMG_SLIDER_UNITS = { maxImgHeight: 'vh', maxImgWidth: '%', vertImgHeight: 'vh', vertImgWidth: '%', thumbSize: 'px' };
const HEAT_STYLE_KEY = 'spp_heat_style';
const HEAT_STYLE_MAX = 9999999;
const HEAT_COLOR_RE = /^#(?:[0-9a-f]{3}|[0-9a-f]{6})$/i;
const HEAT_STYLE_DEFAULTS = {
tCold: 1000, tWarm: 5000, tHot: 20000,
cCold: '#00EEFF', cWarm: '#AA00FF', cHot: '#FF0096', cPeak: '#FF4D00'
};
const HEAT_SCOPE_KEY = 'spp_heat_scope';
const HEAT_SCOPE_LEGACY_KEY = 'spp_title_heat';
const HEAT_SCOPE_ALLOWED = ['flame', 'flame_title', 'off'];
const HEAT_SCOPE_DEFAULT = 'flame';
const HEAT_ZONE_KEYS = ['tea', 'ask', 'chat', 'free', 'money', 'comic', 'other'];
const HEAT_ZONE_LABEL = { tea: '茶馆', ask: '求物区', chat: '交流区',
free: '免空区', money: '网赚区', comic: '漫区', other: '其他' };
const HEAT_SUB_ZONES = ['chat', 'free', 'money'];
const HEAT_SUB_LIST = {
chat: ['8', '12', '17', '195', '208', '83'],
free: ['14', '128', '4', '73', '5', '109', '6', '201', '221'],
money: ['171', '172', '173', '174']
};
const HEAT_ZONE_SELF = { free: '13', money: '170' };
const HEAT_TARGET_ZONE_KEY = 'spp_heat_target_zone';
const HEAT_TARGET_BOARD_KEY = 'spp_heat_target_board';
const HEAT_BOARD_LABEL = { '8': 'ACG交流', '12': '轻小说', '17': '原创绘画',
'195': '原创小说区', '208': 'AI交流 (beta)',
'171': 'CG资源', '172': '实用动画',
'173': '实用漫画', '174': '游戏资源',
'83': '轻小说(列表)', '170': '网赚资源区',
'14': 'CG资源', '128': '同人音声', '4': '实用动画',
'73': '高清里番', '5': '实用漫画', '109': '图墙模式',
'6': '游戏资源', '201': 'COSPLAY',
'221': 'GALGAME汉化区', '222': 'GALGAME汉化区(图墙)' };
const heatStyleCache = Object.create(null);
function heatBoardLabel(fid) {
return HEAT_BOARD_LABEL[String(fid)] || ('版块 ' + String(fid));
}
function heatBoardOptions(zone, cur) {
if (HEAT_SUB_ZONES.indexOf(zone) < 0) return '';
let out = '<option value=""' + (cur ? '' : ' selected') + '>整个大区(统一)</option>';
(HEAT_SUB_LIST[zone] || []).forEach(function (fid) {
if (HEAT_ZONE_SELF[zone] === String(fid)) return;
out += '<option value="' + fid + '"' + (String(cur) === String(fid) ? ' selected' : '') + '>' + heatBoardLabel(fid) + '</option>';
});
return out;
}
function heatTargetKeysFromPanel(overlay) {
const zr = overlay.querySelector('.spp-gs-row[data-key="' + HEAT_TARGET_ZONE_KEY + '"] select');
const z = zr ? String(zr.value || 'all') : 'all';
const br = overlay.querySelector('.spp-gs-row[data-key="' + HEAT_TARGET_BOARD_KEY + '"] select');
const b = br ? String(br.value || '') : '';
if (z === 'all') return { style: HEAT_STYLE_KEY, scope: HEAT_SCOPE_KEY };
if (z !== 'all' && b) {
return { style: 'spp_heat_style_b' + b, scope: 'spp_heat_scope_b' + b };
}
return { style: 'spp_heat_style_' + z, scope: 'spp_heat_scope_' + z };
}
function heatApplyTarget(overlay) {
if (!overlay) return;
const keys = heatTargetKeysFromPanel(overlay);
const heatNow = SPP_CONFIG.heatStyleOf(keys.style);
overlay.querySelectorAll('.spp-gs-row[data-type="heat_json"]').forEach(function (row) {
row.dataset.key = keys.style;
row.querySelectorAll('input[data-field]').forEach(function (inp) {
const v = heatNow[inp.dataset.field];
if (v !== undefined) inp.value = v;
});
});
const scRow = overlay.querySelector('.spp-gs-row[data-key="' + HEAT_SCOPE_KEY + '"]');
if (scRow) {
scRow.dataset.key = keys.scope;
const sel = scRow.querySelector('select');
if (sel) sel.value = SPP_CONFIG.heatScopeOf(keys.scope);
}
}
const CARDINFO_VIEW_KEY = 'spp_cardinfo_view';
const CARDINFO_VIEWS = [['hz', '横屏'], ['vt', '竖屏'], ['ni', '无图']];
function cardinfoViewApply(overlay) {
if (!overlay) return;
const sel = overlay.querySelector('.spp-gs-row[data-key="' + CARDINFO_VIEW_KEY + '"] select');
const rawView = sel ? String(sel.value || '') : String(GM_getValue(CARDINFO_VIEW_KEY, '') || '');
const cur = CARDINFO_VIEWS.some(function (p) { return p[0] === rawView; }) ? rawView : 'hz';
CARDINFO_VIEWS.forEach(function (pair) {
const on = pair[0] === cur;
overlay.querySelectorAll('.spp-gs-row[data-key^="spp_card_' + pair[0] + '_"]').forEach(function (r) {
r.style.display = on ? '' : 'none';
});
const g = Array.from(overlay.querySelectorAll('.spp-gs-group')).find(function (x) {
const t = x.querySelector('.spp-gs-group-title');
return t && (t.textContent || '').indexOf('卡片信息显隐 (' + pair[1] + ')') >= 0;
});
if (g) g.style.display = on ? '' : 'none';
});
}
function bindCardinfoView(overlay) {
if (!overlay || overlay.dataset.sppCardinfoBound === '1') return;
overlay.dataset.sppCardinfoBound = '1';
const sel = overlay.querySelector('.spp-gs-row[data-key="' + CARDINFO_VIEW_KEY + '"] select');
if (sel) sel.addEventListener('change', function () { cardinfoViewApply(overlay); });
}
function bindHeatTargetPickers(overlay) {
if (!overlay || overlay.dataset.sppHeatBound === '1') return;
overlay.dataset.sppHeatBound = '1';
const zr = overlay.querySelector('.spp-gs-row[data-key="' + HEAT_TARGET_ZONE_KEY + '"] select');
const brRow = overlay.querySelector('.spp-gs-row[data-key="' + HEAT_TARGET_BOARD_KEY + '"]');
if (zr) zr.addEventListener('change', function () {
if (brRow) {
const cur = brRow.querySelector('select');
const opts = heatBoardOptions(zr.value, '');
if (opts) {
brRow.style.display = '';
if (cur) cur.innerHTML = opts;
} else {
brRow.style.display = 'none';
if (cur) cur.innerHTML = '<option value="">整个大区(统一)</option>';
}
}
heatApplyTarget(overlay);
});
if (brRow) {
const br = brRow.querySelector('select');
if (br) br.addEventListener('change', function () { heatApplyTarget(overlay); });
}
}
const HEAT_SCOPE_HINT = '热度颜色上到哪几层:火焰 + 回复 = 只给火焰图标与「回复 / 热度」两枚按钮上色、标题保持纯白;火焰 + 标题颜色 = 卡片标题也跟着上同一档色;颜色设置不生效 = 四处都不上色。默认「火焰 + 回复」';
const HEAT_HINT = '全站版块页卡片的标题与「回复 / 热度」数字按热度分档上色;三档边界填 0-9999999,四枚取色器依次对应这四档,色值只认 #rgb 或 #rrggbb。默认 1000 / 5000 / 20000 与赛博青 / 霓虹紫 / 荧光粉 / 炽焰橙';
function cfgJsonNum(raw, field) {
if (raw === null || raw === undefined || raw === '') return null;
try {
const o = JSON.parse(String(raw));
if (!o || typeof o !== 'object') return null;
const v = Number(o[field]);
return isFinite(v) ? v : null;
} catch (_) { return null; }
}
function cfgFit(v, min, max, zeroAsMissing) {
if (v === null || v === undefined || v === '') return null;
const n = Number(v);
if (!isFinite(n)) return null;
if (zeroAsMissing && n === 0) return null;
if (n < min) return min;
if (n > max) return max;
return n;
}
const BOARD_PL_MAX = 10;
const SPP_PANEL_DEFS = [
{
group: '横屏图片 (仅帖子页)', kind: 'img_json',
fields: [
{ key: 'maxImgHeight', label: '横屏图片最大高度', type: 'img_json', def: 80, min: 30, max: 100, unit: 'vh', hint: '横屏图片(宽不小于高)的最大显示高度,可填 30-100(单位 vh)。默认 80' },
{ key: 'maxImgWidth',  label: '横屏图片最大宽度', type: 'img_json', def: 100, min: 20, max: 100, unit: '%', hint: '横屏图片(宽不小于高)的最大显示宽度,可填 20-100(单位 %)。默认 100' }
]
},
{
group: '竖屏图片 (仅帖子页)', kind: 'img_json',
fields: [
{ key: 'vertImgHeight', label: '竖屏图片最大高度', type: 'img_json', def: 80, min: 30, max: 100, unit: 'vh', hint: '竖屏图片(高大于宽)的最大显示高度,可填 30-100(单位 vh)。默认 80' },
{ key: 'vertImgWidth',  label: '竖屏图片最大宽度', type: 'img_json', def: 100, min: 20, max: 100, unit: '%', hint: '竖屏图片(高大于宽)的最大显示宽度,可填 20-100(单位 %)。默认 100' }
]
},
{
group: '图片设置 (仅帖子页)', kind: 'img_json',
fields: [
{ key: 'centerImg',    label: '图片居中显示', type: 'img_json', def: true },
{ key: 'wheelAction',  label: '灯箱滚轮行为', type: 'img_json', def: 'switch', values: ['switch', 'zoom'] }
]
},
{
group: '附件图 (仅帖子页)', kind: 'bool',
fields: [
{ key: 'spp_att_inline', label: '附件图原地显示', type: 'bool', def: true,
hint: '有些版块的帖子把上传的图片附件只渲染成一个空的「图片:」占位,正文里看不到图(但文件在服务器上)。勾选 = 按附件号把图取回来、原地显示在帖子里;不勾选 = 保持站点原样的空占位。默认开启' }
]
},
{
group: '板块条样式 (首页)', kind: 'select',
fields: [
{ key: 'spp_secbar_cm', label: '漫区特设 · 板块条样式', type: 'select', def: 'mecha',
options: [{ v: 'mecha', t: '赛博机能切角(默认)' }],
hint: '首页「漫区特设」那一条的样式(固定为「赛博机能切角」):洋红切角外框、两枚机能铭牌、方块 M 徽标' },
{ key: 'spp_secbar_hj', label: '综合交流 · 板块条样式', type: 'select', def: 'pulse',
options: [{ v: 'pulse', t: '赛博脉冲(默认)' }],
hint: '首页「综合交流」那一条的样式(固定为「赛博脉冲」):青色网格底、呼吸辉光' }
]
},
{
group: '热度配色(全站默认 · 七个大区 · 子板块)', kind: 'heat_json',
fields: [
{ key: 'spp_heat_style', label: '热度分档与配色', type: 'heat_json', hint: HEAT_HINT },
{ key: 'spp_heat_target_zone', label: '配色配置目标', type: 'select', def: 'all',
options: [],
hint: '改哪个大区先在这里选,下面那格显示与写入的就是它;三层回落:子板块 > 大区 > 全站默认。选「整个大区(统一)」保存会同时清掉本区所有子板块的单独设置。默认「全站默认」' },
{ key: 'spp_heat_target_board', label: '细分到子板块', type: 'select', def: '',
options: [],
hint: '只有交流区 / 免空区 / 网赚区有子板块;其余大区是整块,保持「整个大区(统一)」即可。子板块优先于所属大区' },
{ key: 'spp_heat_scope', label: '热度颜色的作用范围', type: 'select', def: 'flame',
options: [{ v: 'flame', t: '火焰' }, { v: 'flame_title', t: '火焰 + 标题颜色' },
{ v: 'off', t: '颜色设置不生效' }],
hint: HEAT_SCOPE_HINT }
]
},,
{
group: '卡片信息显隐 (横屏)', kind: 'bool',
fields: [
{ key: 'spp_cardinfo_view', label: '要调哪一套(卡型)', type: 'select', def: 'hz', options: [{ v: 'hz', t: '横屏' }, { v: 'vt', t: '竖屏' }, { v: 'ni', t: '无图' }],
hint: '横屏 / 竖屏 / 无图 三种卡型的信息显隐项完全相同,这里选一个,下面就只显示那一套。默认「横屏」' },
{ key: 'spp_card_hz_nm', label: '不显示用户名', type: 'bool', def: false,
hint: '作者名那一串文字。勾选 = 不显示(点作者主页的链接一并收起);不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_hz_dt', label: '不显示时间', type: 'bool', def: false,
hint: '发布日期那一枚小字。勾选 = 不显示;不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_hz_fav', label: '不显示收藏', type: 'bool', def: false,
hint: '数据行那一枚收藏按钮。勾选 = 不显示;不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_hz_glow', label: '不显示鼠标经过时的边缘光效', type: 'bool', def: false,
hint: '鼠标移到卡片上时那圈霓虹描边与内侧辉光。勾选 = 收掉光效、卡片照旧微微上浮;不勾选 = 照常发光。默认关闭' }
]
},
{
group: '卡片信息显隐 (竖屏)', kind: 'bool',
fields: [
{ key: 'spp_card_vt_nm', label: '不显示用户名', type: 'bool', def: false,
hint: '作者名那一串文字。勾选 = 不显示(点作者主页的链接一并收起);不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_vt_dt', label: '不显示时间', type: 'bool', def: false,
hint: '发布日期那一枚小字。勾选 = 不显示;不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_vt_fav', label: '不显示收藏', type: 'bool', def: false,
hint: '数据行那一枚收藏按钮。勾选 = 不显示;不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_vt_glow', label: '不显示鼠标经过时的边缘光效', type: 'bool', def: false,
hint: '鼠标移到卡片上时那圈霓虹描边与内侧辉光。勾选 = 收掉光效、卡片照旧微微上浮;不勾选 = 照常发光。默认关闭' }
]
},
{
group: '卡片信息显隐 (无图)', kind: 'bool',
fields: [
{ key: 'spp_card_ni_nm', label: '不显示用户名', type: 'bool', def: false,
hint: '作者名那一串文字。勾选 = 不显示(点作者主页的链接一并收起);不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_ni_dt', label: '不显示时间', type: 'bool', def: false,
hint: '发布日期那一枚小字。勾选 = 不显示;不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_ni_fav', label: '不显示收藏', type: 'bool', def: false,
hint: '数据行那一枚收藏按钮。勾选 = 不显示;不勾选 = 照常显示。默认关闭' },
{ key: 'spp_card_ni_glow', label: '不显示鼠标经过时的边缘光效', type: 'bool', def: false,
hint: '鼠标移到卡片上时那圈霓虹描边与内侧辉光。勾选 = 收掉光效、卡片照旧微微上浮;不勾选 = 照常发光。默认关闭' }
]
},
{
group: '收藏按钮 UI', kind: 'select',
fields: [
{ key: 'spp_fav_ui', label: '收藏按钮外观', type: 'select', def: '6',
options: [{ v: '1', t: '璀璨星河脉冲' }, { v: '2', t: '暗夜霓虹电弧' },
{ v: '6', t: '伴月夜阑(默认)' }],
hint: '版块页(横屏 / 竖屏 / 无图三类卡都算)底部那一枚收藏按钮的外观,三选一。默认「伴月夜阑」' }
]
},
{
group: '功能开关', kind: 'bool',
fields: [
{ key: 'spp_auto_expand_hidden', label: '自动展开隐藏楼层', type: 'bool', def: true,
hint: '被站点折叠的楼层内容(纯 mark 水帖这类)是否直接展开。勾选 = 直接展开、不留「▼展开」按钮;不勾选 = 照旧要手点。默认开启' },
{ key: 'spp_hide_smileonly', label: '隐藏纯表情楼', type: 'bool', def: false,
hint: '帖子里只有论坛默认表情的楼层整层不显示。勾选 = 藏起来(楼主那层与引用 / 带图 / 带附件 / 售价楼不动);不勾选 = 照常显示。默认关闭' },
{ key: 'spp_hide_words_any', label: '楼层正文屏蔽词 · 左栏(包含)', type: 'packs', def: '',
hint: '只对<b>帖子楼层的正文</b>生效:正文里<b>出现</b>这个词就整层不显示(左栏 = 包含)。# 开头的行当注释;想让词本身以 # 或 \\ 开头,就在开头多写一个 \\(\\#测试 表示词 #测试)。只对没有附件 / 外链图的楼层生效,楼主那层不屏蔽。留空 = 不生效' },
{ key: 'spp_hide_words_exact', label: '楼层正文屏蔽词 · 右栏(整段完全匹配)', type: 'packs', def: '',
hint: '只对<b>帖子楼层的正文</b>生效:整段正文(去掉全部空白与图片后)与这个词<b>逐字相等</b>才整层不显示(右栏 = 完全匹配,不是"含这个词")。# 开头的行当注释;想让词本身以 # 或 \\ 开头,就在开头多写一个 \\。与左栏互相独立、同时生效。留空 = 不生效' },
{ key: 'spp_wordpack', label: '常用精确匹配词库(内部承载,不在此编辑)', type: 'packs', def: '',
hint: '常用词库的实际内容(每行一词,只进"整段完全匹配"集合)。这一行在面板里不可见:请用右栏那一行里的「一键导入常用词库」按钮导入,导入后点「保存并刷新」才落盘' },
{ key: 'spp_wordpack_on', label: '启用常用词库', type: 'bool', def: false,
hint: '勾选 = 已导入的常用词库参与"整段完全匹配"过滤(与左右两栏自定义词同时生效);不勾选 = 只跳过词库这一路,自定义两栏照旧。默认关闭' },
{ key: 'spp_wordpack_show', label: '显示常用词(右栏只读预览)', type: 'bool', def: false,
hint: '勾选 = 右栏变成只读预览:上面是你自己的自定义词、分隔线下面是常用词库的词(可框选复制);不勾选 = 右栏只显示你自己的自定义词、可编辑。这个开关只影响显示,不影响过滤效果。默认关闭' },
{ key: 'spp_hide_default_avatar', label: '用户名 + 彩色背景头像', type: 'bool', def: false,
hint: '没有图床(或头像链接已失效)的用户,用「用户名 + 彩色渐变块」替换站点默认头像。勾选 = 替换;不勾选 = 用站点默认头像。默认关闭' },
{ key: 'spp_imgidx_show', label: '含图楼层悬浮窗', type: 'bool', def: false,
hint: '含图 / 链接那块悬浮面板的显示方式。勾选 = 常显;不勾选 = 收起成侧边一条、只留当前页签(鼠标移上去滑回来)。默认关闭' },
{ key: 'spp_idx_auto', label: '打开帖子自动索引全贴(含图 / 链接跨页定位)', type: 'bool', def: false,
hint: '打开帖子时是否自动开始全贴索引并切到全贴视图。勾选 = 自动开始,抓的过程可随时停;不勾选 = 点面板底部「全贴索引」才开始。默认关闭' },
{ key: 'spp_fix_white_text', label: '白底白字转加粗深色', type: 'bool', def: true,
hint: '白底正文上完全看不见的白色字自动转成加粗深色。勾选 = 转换;不勾选 = 保持原样。默认开启' },
{ key: 'spp_autobuy_free', label: '免费帖自动购买', type: 'bool', def: true,
hint: '打开还没买过、售价为 0 SP币 的帖子时自动买下(页面不跳转)。勾选 = 自动买;不勾选 = 手动买。收费帖一律手动。默认开启' },
{ key: 'spp_buy_lift', label: '提亮已购正文', type: 'bool', def: true,
hint: '买下后解锁的正文按正常正文显示(深灰、不再缩成引用块那样)。勾选 = 提亮;不勾选 = 站点原样。默认开启' },
{ key: 'spp_floor_hover', label: '悬停高亮', type: 'bool', def: false,
hint: '鼠标停在楼层或表格行上时整行刷一层淡底。勾选 = 划过上色;不勾选 = 不上色。默认关闭' },
{ key: 'spp_read_dark', label: '黑夜模式', type: 'bool', def: false,
hint: '帖子页正文区改用反光黑玻璃底色。勾选 = 进黑夜模式;不勾选 = 原来的浅色。默认关闭' },
{ key: 'spp_star_motion', label: '星空缓慢流动(关=静态,更省电)', type: 'bool', def: false,
hint: '关 = 星点静止、最省电(默认);开 = 恢复原来缓慢上升的观感(50 秒一轮、三层各 50/100/150 秒)。改完点「保存并刷新」生效' },
{ key: 'spp_fx_loop', label: '装饰动效循环播放', type: 'bool', def: true,
hint: '脚本自身的装饰动画(顶栏状态灯、用户卡渐变/光环/头像、右侧导航点呼吸)是否一直循环播放。勾选(默认)= 与现在完全一样;取消 = 这些动画静止不动(外观仍是"静止但正常",不会透明也不会变形),空闲时更省电。改完点「保存并刷新」生效' },
{ key: 'spp_glass', label: '毛玻璃', type: 'bool', def: false,
hint: '脚本 UI(右侧导航面板、顶栏 HUD、悬浮提示、预览浮层、弹窗等)是否使用背景模糊(毛玻璃)。默认关闭 = 摘掉毛玻璃(背景改为接近不透明,文字照样清楚,空闲时少一层重绘);勾选 = 恢复原来的毛玻璃观感。改完点「保存并刷新」立刻生效' },
{ key: 'spp_gray_flip', label: '灰字翻色', type: 'bool', def: true,
hint: '正文里发灰的字在暗底看不清时,自动提亮成主题的次亮色。只认「灰字 + 暗底 + 对比度不够」三条同时成立;白字、彩字一律不碰。勾选 = 翻色;不勾选 = 保留原色。默认开启' },
{ key: 'spp_nav_edge', label: '翻页悬浮框靠边自动隐藏', type: 'bool', def: false,
hint: '右侧翻页悬浮框贴到屏幕右缘时自动缩进去、只留一条窄边,鼠标移上去滑回来。勾选 = 靠边自动隐藏;不勾选 = 一直展开。默认关闭' },
{ key: 'spp_nav_autohide', label: '翻页悬浮框自动隐藏', type: 'select', def: 'off',
options: [{ v: 'off', t: '关闭(默认)' }, { v: 'hover', t: '鼠标经过弹出' }, { v: 'always', t: '一直隐藏' }],
hint: '默认关闭;选「一直隐藏」后,可从油猴菜单「打开设置面板」改回' },
{ key: 'spp_ajax_page', label: '无刷新翻页', type: 'bool', def: true,
hint: '翻页时后台换页、不整页刷新;块页码条随预加载档走。默认开启' },
{ key: 'spp_preload_pages', label: '预加载 N 页合并整页', type: 'number', def: 5, min: 1, max: 30,
hint: '翻页时预取后续 N 页、合并成一页。可填 1-30。默认 5' },
{ key: 'spp_nest_on', label: 'Reddit 式楼层排版', type: 'bool', def: true,
hint: 'Reddit 化楼层排版开关;关 = 回脚本美化版。默认开启' },
{ key: 'spp_act_style', label: '楼层底栏按钮显示方式', type: 'select', def: 'both',
options: [{ v: 'both', t: '图标 + 文字(默认)' }, { v: 'icon', t: '纯图标' }, { v: 'text', t: '纯文字' }],
hint: '楼层底部那排动作(回复 / 只看该作者 / 屏蔽 / 引用)的显示方式。图标为「精致实心微标」那套,跟随文字颜色。默认图标 + 文字' },
{ key: 'spp_topkey_remember', label: '进入页面自动收起顶部信息板', type: 'bool', def: false,
hint: '由顶栏那枚箭头按钮控制的开关。勾选 = 每次打开 / 刷新页面都自动收起顶部信息板(当页仍可用箭头随时手动展开或再收起,不会被强行改回);不勾选 = 每次打开页面默认展开。默认关闭' },
{ key: 'spp_pg_ends', label: '翻页双箭头(首页 / 末页)', type: 'bool', def: true,
hint: '翻页条两端各补一枚双箭头,点一下到第 1 页 / 最后一页。勾选 = 有双箭头;不勾选 = 只剩上一页 / 下一页。默认开启' },
{ key: 'spp_pager_nums', label: '页码按钮最少枚数', type: 'number', def: 5, min: 1, max: 15,
hint: '版块页 / 搜索页翻页条里数字页码最少露出几枚,可填 1-15。只补不收:站点给得更多就不动。默认 5' },
{ key: 'spp_pager_nums_read', label: '页码按钮最少枚数(帖子页)', type: 'number', def: 5, min: 1, max: 10,
hint: '帖子页翻页条里数字页码最少露出几枚,可填 1-10。只补不收:站点给得更多就不动。默认 5' },
{ key: 'spp_board_pl', label: '板块列表预加载页数', type: 'number', def: 0, min: 0, max: 10,
hint: '0 = 关闭(默认)。1-10 = 进板块页后把后续这么多页接在当前页后面(串行抓取、页间等 400-500 ms、失败即停),上限 10。这些页同时也是页内/悬浮翻页「一步」的步长。建议先用 3' },
{ key: 'spp_search_order', label: '搜索结果排序方式', type: 'select', def: 'hits',
options: [{ v: 'hits', t: '人气' }, { v: 'replies', t: '回复' },
{ v: 'postdate', t: '发帖时间' }, { v: 'lastpost', t: '最后回复' }],
hint: '搜索表单「排序方式」的默认选中项,只改表单默认值、不动地址上已写明的那一种。默认「人气」' },
{ key: 'spp_preview_live', label: '编辑器实时预览', type: 'bool', def: true,
hint: '输入框下方常驻一块预览,边打边渲染(图片 / 表情 / 引用块都算)。勾选 = 实时渲染;不勾选 = 点一次「预览」渲染一次。默认开启' },
{ key: 'spp_brand_bar', label: '南+ 品牌条', type: 'bool', def: true,
hint: '页眉那两块广告图重排成一条品牌条(两图分列左右、中间一行站名)。勾选 = 用品牌条;不勾选 = 页眉那条广告整条消失、也不占位置。默认开启' },
{ key: 'spp_brand_slide', label: '品牌条右侧图自动轮播', type: 'bool', def: true,
hint: '品牌条右侧那一格自动轮播站点那几张广告素材(等比缩放进格子、不裁不拉)。勾选 = 轮播;不勾选 = 只放原来那张静态图。默认开启' },
{ key: 'spp_brand_slide_sec', label: '轮播间隔 (秒)', type: 'number', def: 3, min: 1, max: 60,
hint: '品牌条右侧每张素材的切换间隔,可填 1-60(秒);鼠标停上去或页面切到后台时自动暂停。默认 3' },
{ key: 'spp_host_mark', label: '链接自动标注', type: 'bool', def: false,
hint: '输入框里的超链接自动按图床格式标注。勾选 = 自动标注;不勾选 = 不标。默认关闭' },
{ key: 'spp_sticker_center', label: '贴纸居中显示', type: 'bool', def: false,
hint: '脚本贴进帖子里的表情 / 贴纸是否居中。勾选 = 居中;不勾选 = 保持行内原样。默认关闭' },
{ key: 'spp_task_autoclaim', label: '社区论坛任务自动领取', type: 'bool', def: true,
hint: '打开任意南+页面时,在后台把社区任务里「可领取」的奖励领掉(先申请再领取,页面不跳转),同一任务 24 小时内只领一次。勾选 = 自动领;不勾选 = 手动领。默认开启' },
{ key: 'spp_bounty_badge', label: '求物区悬赏徽章', type: 'bool', def: true,
hint: '求物区卡片上那枚「悬赏中 / 已解决 / 已结束」徽章。勾选 = 显示(要反查帖子页);不勾选 = 不显示,也不发探测请求。默认开启' },
{ key: 'spp_cat_memory', label: '记住上次选的表情分类', type: 'bool', def: true,
hint: '表情栏两页各自记住上次点过的分类胶囊,下次打开直接落在那类上。勾选 = 记住;不勾选 = 每次都从默认类开始。默认开启' },
{ key: 'spp_hover_preview', label: '贴纸悬停预览大图', type: 'bool', def: true,
hint: '鼠标停在贴纸格子上时,除名字外再给一张大图预览(动图照旧会动;只在贴纸页生效)。勾选 = 给大图;不勾选 = 只留名字卡。默认开启' },
{ key: 'spp_hover_preview_size', label: '悬停预览尺寸 (px)', type: 'number', def: 128, min: 64, max: 320,
hint: '悬停预览那张大图的边长,可填 64-320。盒子是正方形、图按原比例内缩放。默认 128' },
{ key: 'spp_name_ui', label: '名字框样式', type: 'select', def: 'sweep',
options: [{ v: 'sweep', t: '浮光掠影' }, { v: 'neon', t: '霓虹呼吸' },
{ v: 'holo', t: '幻境底色' }, { v: 'code', t: '视界代码' },
{ v: 'line', t: '极简底线' }],
hint: '作者名字外面那只胶囊走哪一套,五套都是常态可见、悬停加特效。默认「浮光掠影」' },
{ key: 'spp_read_ui', label: '已读标记样式', type: 'select', def: 'stamp',
options: [{ v: 'stamp', t: '纸感钢印' }, { v: 'fluid', t: '能量波纹' },
{ v: 'spine', t: '冷光脊柱' }],
},
{ key: 'spp_read_dim', label: '已读时标题变暗', type: 'bool', def: false,
hint: '已读主题的标题文字压暗一档。勾选 = 压暗;不勾选 = 与未读一样亮。默认关闭' },
{ key: 'spp_read_zone_tea', label: '已读:茶馆', type: 'bool', def: true, hint: '茶馆大区的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启' },
{ key: 'spp_read_zone_ask', label: '已读:求物区', type: 'bool', def: true, hint: '询问&求物大区的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启' },
{ key: 'spp_read_zone_res', label: '已读:资源区', type: 'bool', def: true, hint: '资源区(含免空区、漫区、网赚区)的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启' },
{ key: 'spp_read_zone_chat', label: '已读:交流区', type: 'bool', def: true, hint: '交流区(ACG交流 / 轻小说 / 原创绘画 / 原创小说区 / AI交流,与「热度」那栏同一批板块)的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启' },
{ key: 'spp_read_zone_other', label: '已读:其他', type: 'bool', def: true, hint: '不在上面几个大区里的版块的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启' },
{ key: 'spp_bounty_ui', label: '悬赏框样式', type: 'select', def: 's1',
options: [{ v: 's1', t: '精工切角' }, { v: 's2', t: '模块拼接' },
{ v: 's3', t: '全息玻璃' }, { v: 's4', t: '暗星微光' },
{ v: 's5', t: '机能视窗' }],
hint: '悬赏徽章走哪一套,五套都是机甲 / 仪表风。默认「精工切角」' },
{ key: 'spp_bounty_show_state', label: '悬赏显示状态', type: 'bool', def: true,
hint: '徽章里「悬赏中 / 已解决 / 悬赏已结束」那一段(含状态圆点)。勾选 = 显示;不勾选 = 不显示。默认开启' },
{ key: 'spp_bounty_show_sp', label: '悬赏显示悬赏 SP', type: 'bool', def: true,
hint: '徽章里「xx SP」那一段。勾选 = 显示;不勾选 = 不显示。默认开启' },
{ key: 'spp_bounty_time', label: '悬赏显示剩余时间', type: 'bool', def: false,
hint: '徽章里「剩 xxh」那一段(只有悬赏中才有)。勾选 = 显示;不勾选 = 不显示。默认关闭' },
{ key: 'spp_bounty_filter', label: '求物区悬赏状态筛选', type: 'select', def: 'all',
options: [{ v: 'all', t: '显示全部(默认)' }, { v: 'open', t: '只显示悬赏中' },
{ v: 'done', t: '只显示已完成' }],
hint: '只对求物区按悬赏状态筛选,默认显示全部=本版之前' },
{ key: 'spp_date_ui', label: '日期框样式', type: 'select', def: 'orbit',
options: [{ v: 'sweep', t: '流光微刻' }, { v: 'neon', t: '赛博霓虹' },
{ v: 'glass', t: '幻彩琉璃' }, { v: 'neu', t: '拟物压感' },
{ v: 'orbit', t: '星轨流转' }],
hint: '作者行里那枚日期走哪一套,五套都是常态可见、悬停加特效。默认「星轨流转」' },                { key: 'spp_cat_scroll', label: '分类栏滚轮方向', type: 'select', def: 'h',
options: [{ v: 'h', t: '水平翻页(默认)' }, { v: 'v', t: '上下(换行铺开)' }],
hint: '鼠标停在分类胶囊栏上滚轮时:水平 = 那一栏排成一行、滚轮左右翻页;上下 = 保持换行铺开、滚轮照旧滚页面。默认「水平翻页」' },                { key: 'spp_sticker_autobr', label: '贴纸自动换行', type: 'bool', def: true,
hint: '往输入框贴表情 / 贴纸时先补一个换行把它推到下一行,连续贴的几枚之间不加空行。勾选 = 自动换行;不勾选 = 就地插入。默认开启' },
{ key: 'spp_editor_blockpick', label: '输入框双击选块', type: 'bool', def: true,
hint: '在输入框里双击选中一整个 BBCode 单元(含标签本身),而不是浏览器默认的那个「词」。勾选 = 按单元选;不勾选 = 按浏览器默认选词。单击 / 拖选 / 三击不变。默认开启' },
{ key: 'spp_tea_filter_memory', label: '茶馆继承上一次的筛选', type: 'bool', def: true,
hint: '下次进茶馆时自动套用上一次用过的筛选(时间范围、排序、精华分类)。勾选 = 套用;不勾选 = 每次都从默认开始。想回到全部,在分类子板块那一格点「全部」。默认开启' },
{ key: 'spp_cover_probe', label: '封面图床失效检测', type: 'bool', def: true,
hint: '检测版块页卡片封面的图床是否已失效,失效的卡片改用无图卡片显示。勾选 = 检测;不勾选 = 照旧显示封面。默认开启' }
]
},
{
group: '数值设置', kind: 'number',
fields: [
{ key: 'spp_page_width', label: '页面宽度 (px)', type: 'number', def: 1400, min: 1200, max: 1600,
hint: '整页容器宽度,可填 1200-1600。默认 1400' },
{ key: 'spp_nav_step', label: '翻页步长', type: 'number', def: 1, min: 1, max: 50,
hint: '悬浮按钮每次点击翻几页,可填 1-50(1 = 逐页翻)。默认 1' },
{ key: 'spp_font_size', label: '正文文字大小 (px)', type: 'number', def: 14, min: 12, max: 18,
hint: '帖子正文文字大小,可填 12-18(12 = 小、14 = 中、18 = 大)。改完刷新后所有楼层一起变。默认 14' },
{ key: 'spp_card_title_lines', label: '卡片标题最大行数', type: 'select', def: '2',
options: [{ v: '2', t: '2 行(默认)' }, { v: '3', t: '3 行' }, { v: '4', t: '4 行' },
{ v: '5', t: '5 行' }, { v: '6', t: '6 行' }],
hint: '版块页卡片标题最多折几行,长标题选大一点更完整;只改折行上限、不动字号。默认「2 行」' },
{ key: 'spp_card_words_chat', label: '卡片标题屏蔽词(茶馆)', type: 'packs', def: '',
hint: '只对茶馆图墙里的卡片生效:一行一个词,# 开头的行当注释,标题里含这个词的卡片整张不显示。留空 = 不生效' },
{ key: 'spp_card_words_other', label: '卡片标题屏蔽词(其他板块)', type: 'packs', def: '',
hint: '只对茶馆以外的板块生效,与上面茶馆那条互相独立:一行一个词、# 开头的行当注释,标题里含这个词的卡片整张不显示。留空 = 不生效' },
{ key: 'spp_card_words_ask', label: '卡片标题屏蔽词(求物区)', type: 'packs', def: '',
hint: '只对求物区(fid 48)图墙里的卡片生效,与茶馆、其他板块两条互相独立:一行一个词,# 开头的行当注释,标题里含这个词的卡片整张不显示。留空 = 不生效' },
{ key: 'spp_card_title_size', label: '卡片标题字号', type: 'select', def: '18',
options: [{ v: '14', t: '14 px' }, { v: '15', t: '15 px' }, { v: '16', t: '16 px' },
{ v: '17', t: '17 px' }, { v: '18', t: '18 px(默认,当前字号)' }],
hint: '版块页卡片标题的字号,调小能把同一段标题挤进更少的行里。默认 18 px(当前字号)' },
{ key: 'spp_pin_domain', label: '锚定域名', type: 'select', def: 'off',
options: [{ v: 'off', t: '关闭(默认)' }, { v: 'soul-plus.net', t: '魂+ soul-plus.net' },
{ v: 'north-plus.net', t: '北+ north-plus.net' }, { v: 'south-plus.net', t: '南+ south-plus.net' },
{ v: 'white-plus.net', t: '白+ white-plus.net' }, { v: 'level-plus.net', t: 'Lv+ level-plus.net' },
{ v: 'summer-plus.net', t: '夏+ summer-plus.net' }, { v: 'spring-plus.net', t: '春+ spring-plus.net' },
{ v: 'snow-plus.net', t: '雪+ snow-plus.net' }, { v: 'east-plus.net', t: '东+ east-plus.net' },
{ v: 'blue-plus.net', t: '蓝+ blue-plus.net' }],
hint: '选定后打开任意镜像域名会自动跳到这一家(同一页)。登录态按主机名分开 ⇒ 锚到别家可能变成游客。默认「关闭」' },
{ key: 'spp_idx_per', label: '索引面板每页行数', type: 'number', def: 15, min: 5, max: 60,
hint: '含图 / 链接两栏每页显示多少行,可填 5-60;超过一页时面板底部出现翻页条。默认 15' },
{ key: 'spp_avatar_spin', label: '头像自转周期 (秒/圈)', type: 'number', def: 8, min: 0, max: 60,
hint: '用户卡上那枚圆形头像每多少秒转一圈,可填 0-60(0 = 不转)。默认 8' },
{ key: 'spp_avatar_spin_dir', label: '头像自转方向', type: 'select', def: 'cw',
options: [{ v: 'cw', t: '顺时针' }, { v: 'ccw', t: '逆时针' }],
hint: '头像自转的方向;上一个参数填 0(不转)时不起作用。默认「顺时针」' }
]
},
{
group: '已读标记(按大区)', kind: 'bool',
fields: [
{ key: 'spp_read_mark', label: '资源区已读标记', type: 'bool', def: true,
hint: '打开资源区的帖子并停留够指定的秒数,那帖的卡片就挂上一枚「已读」标识。勾选 = 标记;不勾选 = 不标记。默认开启' },
{ key: 'spp_read_dwell', label: '判定已读的停留秒数', type: 'number', def: 5, min: 0, max: 600,
hint: '帖子页实际停留多久才算「已读」(只算页面可见的时间),可填 0-600(0 = 打开即算)。默认 5' },
{ key: 'spp_read_purge', label: '清除早于 (小时 / 天)', type: 'number', def: 24, min: 1, max: 100000,
hint: '「清除记录」清理早于这个时间的已读记录,可填 1-100000。默认 24' },
{ key: 'spp_read_purge_unit', label: '清除的时间单位', type: 'select', def: 'hour',
options: [{ v: 'hour', t: '小时' }, { v: 'day', t: '天' }],
hint: '清除阈值的时间单位(小时 / 天)。默认「小时」' }
]
},
{
group: '自备表情 / 贴纸 · 自定义图床', kind: 'packs',
fields: [
{ key: 'spp_custom_emoji', label: '自备 Emoji(进 emoji 页)', type: 'packs', def: '',
hint: '一行套系名 + 若干行图片直链,套系之间空一行;地址后接一段文本当那一张的悬停提示。留空 = 不生效' },
{ key: 'spp_custom_sticker', label: '自备贴纸(进贴纸页)', type: 'packs', def: '',
hint: '一行套系名 + 若干行图片直链,套系之间空一行;地址后接一段文本当那一张的悬停提示。留空 = 不生效' },
{ key: 'spp_host_extra', label: '自定义图床(粘贴区)', type: 'packs', def: '',
hint: '一行一个图床,写成「名称 首页地址 认链域名」;名称进标注的【名称】、首页地址进「图床 ▾」下拉。留空 = 不生效' }
]
}
];
const SPP_HIDDEN_SWITCHES = [
{ key: 'spp_hide_bottom',        label: '屏蔽底部图例条与页脚' },
{ key: 'spp_hide_forumrel',      label: '屏蔽「论坛相关」白底面板' },
{ key: 'spp_hide_toptool',       label: '屏蔽顶部空白工具条' },
{ key: 'spp_nav_search_first',   label: '导航「搜索」提为主行动项' },
{ key: 'spp_home_starfield',     label: '星空背景(全站)' },
{ key: 'spp_home_star_glass',    label: '星空背景的玻璃卡效果' }
];
let heatStyleMemo = null;
var SPP_FLOW_SYNC = { pages: [], here: 0, sig: '', at: 0, onPush: null };
const SPP_CONFIG = {
bool(key, dflt) {
const raw = GM_getValue(key, null);
if (raw === null || raw === undefined || raw === '') return dflt;
return typeof raw === 'string' ? raw.toLowerCase() !== 'false' : !!raw;
},
num(key, dflt, min, max) {
const stored = cfgFit(GM_getValue(key, null), min, max, min > 0);
if (stored !== null) return stored;
const d = Number(dflt);
if (isFinite(d) && d >= min && d <= max) return d;
return min;
},
pick(key, dflt, allowed) {
const stored = String(GM_getValue(key, null) || '');
if (stored && allowed.indexOf(stored) >= 0) return stored;
return allowed.indexOf(dflt) >= 0 ? dflt : allowed[0];
},
text(key, dflt) {
const raw = GM_getValue(key, null);
if (raw === null || raw === undefined) return dflt;
return typeof raw === 'string' ? raw : String(raw);
},
imgNumber(field, min, max) {
const stored = cfgFit(cfgJsonNum(GM_getValue(IMG_SETTINGS_KEY, null), field), min, max, true);
if (stored !== null) return stored;
const d = Number(IMG_DEFAULTS[field]);
return isFinite(d) ? d : min;
},
imgBool(field) {
let raw = null;
try {
const s = GM_getValue(IMG_SETTINGS_KEY, null);
if (s) {
const o = JSON.parse(s);
if (o && typeof o === 'object' && o[field] !== undefined && o[field] !== null) raw = o[field];
}
} catch (_) { raw = null; }
if (raw !== null) return typeof raw === 'string' ? raw.toLowerCase() !== 'false' : !!raw;
return !!IMG_DEFAULTS[field];
},
imgString(field, allowed) {
let raw = null;
try {
const s = GM_getValue(IMG_SETTINGS_KEY, null);
if (s) { const o = JSON.parse(s); if (o && typeof o === 'object') raw = o[field]; }
} catch (_) { raw = null; }
const v = raw === null || raw === undefined ? '' : String(raw);
if (v && allowed.indexOf(v) >= 0) return v;
const d = String(IMG_DEFAULTS[field]);
return allowed.indexOf(d) >= 0 ? d : allowed[0];
},
imgSettings() {
return {
maxImgHeight: this.imgNumber('maxImgHeight', 30, 100),
maxImgWidth:  this.imgNumber('maxImgWidth', 20, 100),
vertImgHeight: this.imgNumber('vertImgHeight', 30, 100),
vertImgWidth:  this.imgNumber('vertImgWidth', 20, 100),
thumbSize:    this.imgNumber('thumbSize', 32, 128),
centerImg:    this.imgBool('centerImg'),
wheelAction:  this.imgString('wheelAction', ['switch', 'zoom'])
};
},
heatStyleOf(key) {
if (key === HEAT_STYLE_KEY && heatStyleMemo) return heatStyleMemo;
if (heatStyleCache[key]) return heatStyleCache[key];
let raw = null;
try {
const stored = GM_getValue(key, null);
if (stored) {
const o = JSON.parse(stored);
if (o && typeof o === 'object') raw = o;
}
} catch (_) { raw = null; }
const heatIsBoardKey = key.indexOf('spp_heat_style_b') === 0;
const base = (key === HEAT_STYLE_KEY) ? HEAT_STYLE_DEFAULTS
: (heatIsBoardKey ? SPP_CONFIG.heatStyleOf('spp_heat_style_' + heatZoneOf(key.slice('spp_heat_style_b'.length)))
: SPP_CONFIG.heatStyleOf(HEAT_STYLE_KEY));
const pickColor = (k) => {
const v = (raw && typeof raw[k] === 'string') ? raw[k].trim() : '';
return HEAT_COLOR_RE.test(v) ? v : base[k];
};
const bounds = ['tCold', 'tWarm', 'tHot'].map((k) => {
const v = cfgFit(raw ? raw[k] : null, 0, HEAT_STYLE_MAX, false);
return v === null ? base[k] : v;
}).sort((a, b) => a - b);
const out = {
tCold: bounds[0], tWarm: bounds[1], tHot: bounds[2],
cCold: pickColor('cCold'), cWarm: pickColor('cWarm'),
cHot: pickColor('cHot'), cPeak: pickColor('cPeak')
};
heatStyleCache[key] = out;
if (key === HEAT_STYLE_KEY) heatStyleMemo = out;
return out;
},
heatStyle() {
return SPP_CONFIG.heatStyleOf(heatKeysForPage().style);
},
heatScopeOf(key) {
const stored = String(GM_getValue(key, null) || '');
if (HEAT_SCOPE_ALLOWED.indexOf(stored) >= 0) return stored;
if (key !== HEAT_SCOPE_KEY) return SPP_CONFIG.heatScopeOf(HEAT_SCOPE_KEY);
return SPP_CONFIG.bool(HEAT_SCOPE_LEGACY_KEY, false) ? 'flame_title' : HEAT_SCOPE_DEFAULT;
},
heatScope() {
return SPP_CONFIG.heatScopeOf(heatKeysForPage().scope);
}
};
const SEARCH_ORDER_ALLOWED = ['hits', 'replies', 'postdate', 'lastpost'];
const SEARCH_ORDER_LABEL = { hits: '人气', replies: '回复', postdate: '发帖时间', lastpost: '最后回复' };
function searchOrder() {
return SPP_CONFIG.pick('spp_search_order', 'hits', SEARCH_ORDER_ALLOWED);
}
const AV_SPIN_DIRS = ['cw', 'ccw'];
const TITLE_LINES_ALLOWED = ['2', '3', '4', '5', '6'];
const TITLE_SIZES_ALLOWED = ['14', '15', '16', '17', '18'];
const TITLE_LINES_DEF = '2';
const TITLE_SIZE_DEF = '18';
function cardTitleLines() {
return SPP_CONFIG.pick('spp_card_title_lines', TITLE_LINES_DEF, TITLE_LINES_ALLOWED);
}
function cardTitleSize() {
return SPP_CONFIG.pick('spp_card_title_size', TITLE_SIZE_DEF, TITLE_SIZES_ALLOWED);
}
const TITLE_LINE_RATIO = 1.375;
const PIN_OFF = 'off';
const PIN_HOSTS = [
['魂+', 'soul-plus.net'],
['北+', 'north-plus.net'],
['南+', 'south-plus.net'],
['白+', 'white-plus.net'],
['Lv+', 'level-plus.net'],
['夏+', 'summer-plus.net'],
['春+', 'spring-plus.net'],
['雪+', 'snow-plus.net'],
['东+', 'east-plus.net'],
['蓝+', 'blue-plus.net']
];
const PIN_ALLOWED = [PIN_OFF].concat(PIN_HOSTS.map(function (p) { return p[1]; }));
const PIN_PROBE_TIMEOUT = 6000;
const PIN_TEST_TRIES = 4;
const PIN_TEST_GAP = 200;
function pinDomain() {
return SPP_CONFIG.pick('spp_pin_domain', PIN_OFF, PIN_ALLOWED);
}
function pinTargetHost(currentHost, domain) {
return /^www\./i.test(String(currentHost || '')) ? ('www.' + domain) : domain;
}
function pinProbeOnce(host, timeoutMs) {
return new Promise(function (resolve) {
let settled = false;
const finish = function (ok) { if (!settled) { settled = true; clearTimeout(timer); resolve(ok); } };
const timer = setTimeout(function () { finish(false); }, timeoutMs);
try {
fetch('https://' + host + '/favicon.ico?r=' + Math.random(),
{ mode: 'no-cors', cache: 'no-store', credentials: 'omit' })
.then(function () { finish(true); })
.catch(function () { finish(false); });
} catch (e) { finish(false); }
});
}
let pinReachCache = null;
async function pinReachable(host) {
if (pinReachCache && pinReachCache.host === host) return pinReachCache;
let ok = await pinProbeOnce(host, PIN_PROBE_TIMEOUT);
if (!ok) {
await new Promise(function (r) { setTimeout(r, 800); });
ok = await pinProbeOnce(host, PIN_PROBE_TIMEOUT);
}
pinReachCache = { host: host, ok: ok };
return pinReachCache;
}
async function pinMeasure(host) {
const samples = [];
let fails = 0;
for (let i = 0; i < PIN_TEST_TRIES; i++) {
const t0 = performance.now();
const ok = await pinProbeOnce(host, PIN_PROBE_TIMEOUT);
const dt = Math.round(performance.now() - t0);
if (i > 0) { if (ok) samples.push(dt); else fails++; }
await new Promise(function (r) { setTimeout(r, PIN_TEST_GAP); });
}
if (!samples.length) return { ok: false, fails: fails, med: null, lo: null, hi: null };
const s = samples.slice().sort(function (a, b) { return a - b; });
return { ok: true, fails: fails, med: s[Math.floor(s.length / 2)], lo: s[0], hi: s[s.length - 1] };
}
function pinReportText(rows, total) {
let bestTag = '', bestMed = Infinity, worstMed = -1, maxJitter = 0, alive = 0;
rows.forEach(function (r) {
if (!r.stat.ok) return;
alive++;
if (r.stat.med < bestMed) { bestMed = r.stat.med; bestTag = r.host; }
if (r.stat.med > worstMed) worstMed = r.stat.med;
if (r.stat.hi - r.stat.lo > maxJitter) maxJitter = r.stat.hi - r.stat.lo;
});
let out = '';
rows.forEach(function (r) {
const label = '[' + r.tag + '] ' + r.host;
const pad = label + ' '.repeat(Math.max(1, 30 - label.length));
const s = r.stat;
if (!s.ok) out += pad + 'X 连不上(' + s.fails + '/' + (PIN_TEST_TRIES - 1) + ' 次失败)\n';
else out += pad + 'OK ' + s.med + ' ms(' + s.lo + '-' + s.hi + ')' + (r.host === bestTag ? '  ← 中位最快' : '') + '\n';
});
out += '已测 ' + rows.length + ' / ' + total + ' 家,可达 ' + alive + ' 家';
if (alive > 1) {
out += '\n最快与最慢的中位只差 ' + (worstMed - bestMed) + ' ms,而单个域名自己的波动就有 ' + maxJitter + ' ms';
out += (worstMed - bestMed) <= maxJitter ? ' ⇒ 差异在噪声里,按延迟挑没有意义' : ' ⇒ 有可分辨的差';
}
return out;
}
let openSettingsPanel = null;
function initSettingsPanel() {
GM_addStyle(`
            #spp-global-settings-overlay {
                display:none; position:fixed; inset:0; z-index:100002;
                background:rgba(15,23,42,0.38); align-items:center; justify-content:center;
                backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px);
            }
            #spp-global-settings-overlay.spp-open { display:flex; }
            #spp-global-settings-box {
                background:var(--spu-surface, #ffffff); border-radius:8px;
                padding:22px 26px; width:min(900px, calc(100vw - 48px)); max-width:none;
                max-height:min(740px, calc(100vh - 48px));
                overflow-y:auto;
                box-shadow:0 24px 70px rgba(15,23,42,0.18), 0 0 0 1px rgba(15,23,42,0.04);
                font-size:14px; color:var(--spu-text,#1f2937);
                border:1px solid var(--spu-border,#d8dee7);
            }
            #spp-global-settings-box .spp-gs-cols { display:flex; gap:28px; align-items:flex-start; }
            #spp-global-settings-box .spp-gs-col { flex:1 1 0; min-width:0; }
            @media (max-width:760px) {
                #spp-global-settings-box .spp-gs-cols { flex-direction:column; gap:0; }
            }
            #spp-global-settings-box h3 {
                display:block;
                margin:0 0 16px; font-size:17px; color:var(--spu-text,#1f2937);
                border-bottom:1px solid var(--spu-border,#d8dee7); padding-bottom:10px;
                font-weight:650; letter-spacing:0;
            }
            #spp-global-settings-box h3 {
                position:sticky !important;
                top:0 !important;
                z-index:61 !important;
                background:#fff !important;
                margin-bottom:0 !important;
                padding-bottom:16px !important;
                box-shadow:0 -40px 0 40px #fff !important;
            }
            #spp-global-settings-box .spp-panebar {
                top:51px !important;
                position:sticky; top:0; z-index:3;
                display:grid; grid-template-columns:repeat(6, minmax(0, 1fr));
                gap:8px; align-items:center; overflow-x:visible;
                margin:0 0 14px; padding:0 0 12px;
                background:var(--spu-surface,#ffffff);
                border-bottom:1px solid var(--spu-border,#d8dee7);
            }
            #spp-global-settings-box .spp-pane {
                flex:1 1 auto; display:inline-flex; align-items:center; justify-content:center; min-width:0; overflow:hidden;
                padding:5px 12px; border-radius:999px; cursor:pointer; white-space:nowrap;
                font-size:13px; line-height:1.25; font-family:inherit;
                color:var(--spu-text,#1f2937);
                background:var(--spu-surface,#ffffff);
                border:1px solid var(--spu-border,#d8dee7);
                transition:background .16s, border-color .16s, color .16s, opacity .16s;
            }
            #spp-global-settings-box .spp-pane:hover { border-color:var(--spu-accent,#2f6f68); }
            #spp-global-settings-box .spp-pane--on {
                background:var(--spu-accent,#2f6f68);
                border-color:var(--spu-accent,#2f6f68); color:#ffffff;
            }
            #spp-global-settings-box .spp-pane--dim { opacity:.42; }
            #spp-global-settings-box input.spp-pane-q {
                flex:1 1 auto; min-width:110px; margin-left:6px;
                padding:5px 11px; font-size:13px; font-family:inherit;
                border-radius:999px; border:1px solid var(--spu-border,#d8dee7);
                background:var(--spu-surface,#ffffff); color:var(--spu-text,#1f2937);
            }
#spp-global-settings-box h3 { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
#spp-global-settings-box h3 input.spp-pane-q { flex: 0 1 340px; margin: 0; padding: 4px 11px; font-size: 12px; }
#spp-global-settings-box input.spp-pane-q:focus {
                outline:none; border-color:var(--spu-accent,#2f6f68);
                box-shadow:0 0 0 3px rgba(47,111,104,.16);
            }
            #spp-global-settings-box [data-pane].spp-pane-hidden { display:none; }
            #spp-global-settings-box .spp-gs-group:not(:has([data-pane]:not(.spp-pane-hidden))) { display:none; }
            #spp-global-settings-box .spp-gs-col:not(:has([data-pane]:not(.spp-pane-hidden))) { display:none; }
            #spp-global-settings-box .spp-pane-empty {
                display:none; padding:16px 2px; font-size:13px; color:#6b7280;
            }
            #spp-global-settings-box .spp-pane-empty.spp-pane-on { display:block; }
            #spp-global-settings-box .spp-gs-group {
                margin-bottom:14px;
            }
            #spp-global-settings-box .spp-gs-group-title {
                font-size:12px; color:var(--spu-muted,#6b7280);
                letter-spacing:0; margin-bottom:8px; padding-left:2px; font-weight:650;
            }
            #spp-global-settings-box .spp-gs-row {
                display:flex; align-items:center; justify-content:space-between;
                padding:8px 10px; border-radius:7px; cursor:pointer;
                transition:background 0.16s ease, color 0.16s ease;
            }
            #spp-global-settings-box .spp-gs-row:hover {
                background:var(--spu-overlay,#f2f5f8);
            }
            #spp-global-settings-box .spp-gs-row label {
                flex:1; cursor:pointer; font-size:13px; user-select:none;
            }
            #spp-global-settings-box .spp-gs-row input[type="checkbox"] {
                width:18px; height:18px; cursor:pointer; accent-color:var(--spu-accent,#2f6f68);
                flex-shrink:0;
            }
            #spp-global-settings-box .spp-gs-row input[type="range"] {
                width:90px; cursor:pointer; accent-color:var(--spu-accent,#2f6f68);
                flex-shrink:0;
            }
            #spp-global-settings-box .spp-gs-row .spp-val {
                font-size:11px; color:var(--spu-muted,#6b7280); min-width:36px; text-align:right;
                font-family:monospace;
            }
            #spp-global-settings-box .spp-gs-row .spp-gs-hint {
                display:block; font-size:11px; font-weight:400; line-height:1.55;
                color:var(--spu-muted,#6b7280); margin-top:2px;
            }
            #spp-global-settings-box .spp-gs-row input[type="number"] {
                width:70px; padding:5px 8px; border:1px solid var(--spu-border,#d8dee7);
                border-radius:6px; font-size:13px; text-align:center;
                background:#fff; color:var(--spu-text,#1f2937);
            }
            #spp-global-settings-box .spp-gs-btns {
                display:flex; gap:8px; justify-content:flex-end;
                margin-top:16px; padding-top:14px; border-top:1px solid var(--spu-border,#d8dee7);
            }
            #spp-global-settings-box .spp-gs-btns button {
                padding:8px 18px; border:1px solid var(--spu-border,#d8dee7); border-radius:7px;
                cursor:pointer; font-size:13px; background:#fff; color:var(--spu-text,#1f2937);
                transition:background 0.16s ease, transform 0.16s ease, border-color 0.16s ease;
            }
            #spp-global-settings-box .spp-gs-btns button.spp-primary {
                background:var(--spu-accent,#2f6f68); color:#fff; border-color:var(--spu-accent,#2f6f68);
            }
            #spp-global-settings-box .spp-gs-btns button:hover { transform:translateY(-1px); }
            #spp-global-settings-box .spp-cardzone > .spp-gs-row { flex-wrap:wrap; }
            #spp-global-settings-box .spp-cardzone > .spp-gs-row > label { flex:1 1 100%; }
            #spp-global-settings-box .spp-cardzone > .spp-gs-row > select { margin-left:auto; }
            #spp-global-settings-box .spp-gs-act {
                display:flex; align-items:center; justify-content:space-between; gap:10px;
                flex-wrap:wrap;
                padding:8px 10px; border-radius:7px; background:var(--spu-overlay,#f2f5f8);
            }
            #spp-global-settings-box .spp-gs-act .spp-gs-acthint {
                flex:1; min-width:0; max-width:100%; font-size:11px; line-height:1.55; color:var(--spu-muted,#6b7280);
            }
            #spp-global-settings-box .spp-gs-act button {
                flex-shrink:0; padding:6px 14px; border:1px solid var(--spu-border,#d8dee7);
                border-radius:7px; cursor:pointer; font-size:13px; background:#fff;
                color:var(--spu-text,#1f2937);
                transition:background 0.16s ease, border-color 0.16s ease, transform 0.16s ease;
            }
            #spp-global-settings-box .spp-gs-act button:hover { border-color:var(--spu-accent,#2f6f68); transform:translateY(-1px); }
            #spp-global-settings-box .spp-gs-act button:disabled { opacity:0.55; cursor:default; transform:none; }
            #spp-global-settings-box .spp-gs-row[data-type="packs"] {
                flex-direction:column; align-items:stretch; gap:6px; cursor:default;
            }
            #spp-global-settings-box .spp-gs-row[data-type="packs"] label { flex:0 0 auto; cursor:default; }
            #spp-global-settings-box .spp-packs-ta {
                width:100%; box-sizing:border-box; min-height:150px; resize:vertical;
                padding:6px 8px; border:1px solid var(--spu-border,#d8dee7); border-radius:6px;
                font:12px/1.6 Consolas,"Courier New",monospace;
                color:var(--spu-text,#1f2937); background:#fff; outline:none;
                white-space:pre; overflow:auto;
            }
            #spp-global-settings-box .spp-packs-ta:focus { border-color:var(--spu-accent,#2f6f68); }
            #spp-global-settings-box .spp-packs-fb {
                font-size:11px; line-height:1.6; color:var(--spu-muted,#6b7280); word-break:break-all;
            }
            #spp-global-settings-box .spp-packs-fb b { color:var(--spu-accent,#2f6f68); }
            #spp-global-settings-box .spp-packs-fb .spp-bad { color:#C0392B; }
            #spp-global-settings-box .spp-gs-row[data-key="spp_host_extra"] .spp-packs-ta { min-height:96px; }
            #spp-global-settings-box .spp-packs-cols { display:flex; gap:14px; align-items:flex-start; }
            #spp-global-settings-box .spp-packs-cols > .spp-gs-row { flex:1 1 0; min-width:0; }
            @media (max-width:760px) {
                #spp-global-settings-box .spp-packs-cols { flex-direction:column; gap:0; }
            }
            #spp-global-settings-box .spp-packs-cols .spp-packs-ta { min-height:120px; }
            #spp-global-settings-box .spp-packs-eg {
                font:11px/1.65 Consolas,"Courier New",monospace;
                color:var(--spu-text,#1f2937);
                background:var(--spu-overlay,#f2f5f8);
                border-left:2px solid var(--spu-accent,#2f6f68);
                border-radius:0 5px 5px 0; padding:6px 9px;
                white-space:pre-wrap; word-break:break-all;
            }
            #spp-global-settings-box .spp-packs-eg .spp-eg-note { color:var(--spu-muted,#6b7280); }
            /* ★ t8:楼层正文两栏 + 常用词库 */
            #spp-global-settings-box .spp-wordpack-bar {
                display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-top:2px;
                white-space:normal !important;   /* 压过上面的 .spp-gs-row > div { white-space:pre-wrap !important } */
            }
            #spp-global-settings-box .spp-wordpack-import {
                box-sizing:border-box; height:26px; padding:0 12px; margin:0;
                border:1px solid var(--spu-border,#d8dee7); border-radius:6px;
                background:#fff; color:var(--spu-text,#1f2937);
                font:12px/1 inherit; cursor:pointer; transition:border-color .18s ease, color .18s ease;
            }
            #spp-global-settings-box .spp-wordpack-import:hover { border-color:var(--spu-accent,#2f6f68); color:var(--spu-accent,#2f6f68); }
            #spp-global-settings-box .spp-wordpack-hint { font-size:11px; line-height:1.6; color:var(--spu-muted,#6b7280); }
            /* ★ t11:导入提示专用行 —— 独立于 .spp-packs-fb(解析回显),不会被其重绘覆盖 */
            #spp-global-settings-box .spp-wordpack-msg {
                font-size:11px; line-height:1.6; font-weight:600;
                color:var(--spu-accent,#2f6f68); white-space:normal !important;
            }
            #spp-global-settings-box .spp-wordpack-msg:empty { display:none; }
            #spp-global-settings-box .spp-wordpack-fb-on { color:var(--spu-accent,#2f6f68); }
            #spp-global-settings-box .spp-packs-ta[readonly] {
                background:var(--spu-overlay,#f2f5f8); cursor:default; color:var(--spu-secondary,#475569);
            }
            #spp-global-settings-box .spp-gs-row > div,
            #spp-global-settings-box .spp-gs-row > pre,
            #spp-global-settings-box .spp-gs-row > p {
                max-width:100% !important;
                white-space:pre-wrap !important;
                overflow-wrap:anywhere !important;
                word-break:break-word !important;
            }
#spp-global-settings-box .spp-panebar {
    width:100% !important;
    max-width:none !important;
    box-sizing:border-box !important;
    z-index:60 !important;
    background:#fff !important;
    border-bottom:1px solid rgba(0,0,0,0.08) !important;
    box-shadow:0 -60px 0 60px #fff !important;
}
#spp-global-settings-box .spp-gs-row[data-type="heat_json"] {
                flex-direction:column; align-items:stretch; gap:8px; cursor:default;
            }
            #spp-global-settings-box .spp-gs-row[data-type="heat_json"] label { flex:0 0 auto; cursor:default; }
            #spp-global-settings-box .spp-heat-grid {
                display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:8px;
            }
            #spp-global-settings-box .spp-heat-cell {
                display:flex; flex-direction:column; gap:5px; padding:7px 9px;
                border:1px solid var(--spu-border,#d8dee7); border-radius:7px;
            }
            #spp-global-settings-box .spp-heat-cap {
                font-size:11px; color:var(--spu-muted,#6b7280); white-space:nowrap;
            }
            #spp-global-settings-box .spp-heat-line { display:flex; align-items:center; gap:6px; }
            #spp-global-settings-box .spp-gs-row[data-type="heat_json"] input[type="number"] {
                width:100%; min-width:0; box-sizing:border-box; text-align:center;
            }
            #spp-global-settings-box .spp-gs-row[data-type="heat_json"] input[type="color"] {
                flex-shrink:0; width:36px; height:28px; padding:0; cursor:pointer;
                border:1px solid var(--spu-border,#d8dee7); border-radius:6px; background:#fff;
            }
        `);
const PANEL_FIELD_BY_KEY = (function () {
const m = new Map();
SPP_PANEL_DEFS.forEach(g => g.fields.forEach(f => { m.set(f.key, f); }));
return m;
})();
function panelBoolDef(key) {
let d = true;
SPP_PANEL_DEFS.forEach(g => g.fields.forEach(f => {
if (f.key === key && f.type === 'bool') d = !!f.def;
}));
return d;
}
function panelRowSig(row) {
const t = row.dataset.type;
if (t === 'number') { const i = row.querySelector('input[type="number"]'); return i ? 'n' + i.value : ''; }
if (t === 'bool') { const c = row.querySelector('input[type="checkbox"]'); return c ? 'b' + c.checked : ''; }
if (t === 'select') { const s = row.querySelector('select'); return s ? 's' + s.value : ''; }
if (t === 'packs') {
if (isWordRow(row.dataset.key)) return 'p' + wordDraftOf(row.dataset.key);
const a = row.querySelector('.spp-packs-ta'); return a ? 'p' + a.value : '';
}
if (t === 'img_json') {
const c = row.querySelector('input[type="checkbox"]'); if (c) return 'ib' + c.checked;
const r = row.querySelector('input[type="range"]'); if (r) return 'ir' + r.value;
const s = row.querySelector('select'); if (s) return 'is' + s.value;
return '';
}
if (t === 'heat_json') {
const o = {};
row.querySelectorAll('input[data-field]').forEach(function (i) { o[i.dataset.field] = i.value; });
return 'h' + JSON.stringify(o);
}
return '';
}
function sppEscHtml(v) {
return String(v).replace(/[&<>"]/g, function (c) {
return ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' })[c];
});
}
function renderCustomPacksFeedback(ta, fb, key) {
const esc = sppEscHtml;
const isEmoji = key === SPP_CUSTOM_EMOJI_KEY;
const r = sppParseCustomPacks(ta.value, isEmoji ? 'emoji' : 'sticker');
if (r.empty) {
fb.innerHTML = isEmoji
? '这一格留空 = emoji 页只用脚本自带的那几套,不影响任何东西。'
: '这一格留空 = 贴纸页只用脚本自带的那几套,不影响任何东西。';
return;
}
const parts = [];
if (r.packs) {
parts.push('解析出 <b>' + r.packs + '</b> 套 / <b>' + r.urls + '</b> 张');
const seg = [];
if (r.emoji.length) seg.push('emoji 页 ' + r.emoji.length + ' 套(' + r.emoji.map(p => esc(p.name)).join('、') + ')');
if (r.sticker.length) seg.push('贴纸页 ' + r.sticker.length + ' 套(' + r.sticker.map(p => esc(p.name)).join('、') + ')');
if (seg.length) parts.push(seg.join(';'));
const named = r.emoji.concat(r.sticker).reduce(function (n, p) {
return n + p.list.filter(function (e) { return e.label && e.label !== e.url; }).length;
}, 0);
if (named) parts.push('其中 <b>' + named + '</b> 张带自定义提示文本');
} else {
parts.push('没解析出可用的套系');
}
if (r.bad.length) {
const head = r.bad.slice(0, 6).map(b => '第 ' + b.n + ' 行(' + b.why + ')').join('、');
parts.push('<span class="spp-bad">忽略 ' + r.bad.length + ' 行:' + head +
(r.bad.length > 6 ? ' 等' : '') + '</span>');
}
parts.push(isEmoji ? '点「保存并刷新」后出现在 emoji 栏' : '点「保存并刷新」后出现在贴纸栏');
fb.innerHTML = parts.join(' · ');
}
function renderCustomHostsFeedback(ta, fb) {
const esc = sppEscHtml;
const r = sppParseCustomHosts(ta.value);
if (r.empty) {
fb.innerHTML = '这一格留空 = 「图床 ▾」里还是脚本自带的六个,不影响任何东西。';
return;
}
const parts = [];
if (r.list.length) {
parts.push('解析出 <b>' + r.list.length + '</b> 个图床:' +
r.list.map(function (h) {
return esc(h.name) + '(' + esc(h.hosts.join(' / ')) + ')';
}).join('、'));
} else {
parts.push('没解析出可用的图床');
}
if (r.bad.length) {
const head = r.bad.slice(0, 6).map(b => '第 ' + b.n + ' 行(' + b.why + ')').join('、');
parts.push('<span class="spp-bad">忽略 ' + r.bad.length + ' 行:' + head +
(r.bad.length > 6 ? ' 等' : '') + '</span>');
}
parts.push('点「保存并刷新」后出现在「图床 ▾」下拉里,标注时也认这些域名');
fb.innerHTML = parts.join(' · ');
}
function renderPacksFeedback(root) {
root.querySelectorAll('.spp-gs-row[data-type="packs"]').forEach(function (row) {
const ta = row.querySelector('.spp-packs-ta');
const fb = row.querySelector('.spp-packs-fb');
if (!ta || !fb) return;
if (isWordRow(row.dataset.key)) { wordColumnFeedback(row); return; }
if (row.dataset.key === SPP_HOST_KEY) renderCustomHostsFeedback(ta, fb);
else renderCustomPacksFeedback(ta, fb, row.dataset.key);
});
}
const SPP_WORDPACK_SEP = '# --- 以下为常用词库(只读预览 · 不会写入你的自定义词表)---';
const SPP_WORD_ROW_KEYS = ['spp_hide_words_any', 'spp_hide_words_exact', 'spp_wordpack'];
const wordDraft = Object.create(null);
function isWordRow(key) { return SPP_WORD_ROW_KEYS.indexOf(key) >= 0; }
function normWord(v) { return String(v == null ? '' : v).trim().replace(/\s+/g, '').toLowerCase(); }
function wordLines(raw) {
return String(raw == null ? '' : raw).split(/\r?\n/).filter(function (l) { return l.trim() !== ''; });
}
function wordDraftOf(key) { return wordDraft[key] === undefined ? '' : wordDraft[key]; }
function wordDraftLoad() {
SPP_WORD_ROW_KEYS.forEach(function (key) { wordDraft[key] = SPP_CONFIG.text(key, ''); });
}
function wordShowOn(root) {
const box = (root || document).querySelector(
'.spp-gs-row[data-key="spp_wordpack_show"] input[type="checkbox"]');
if (box) return !!box.checked;
return SPP_CONFIG.bool('spp_wordpack_show', false);
}
function wordPreviewText(custom, pack) {
const head = String(custom == null ? '' : custom).replace(/\s+$/, '');
const lines = wordLines(pack);
const body = lines.length ? lines.join('\n')
: '(还没有导入常用词库:关掉「显示常用词」后点右栏上方的「一键导入常用词库」)';
return (head ? head + '\n' : '') + SPP_WORDPACK_SEP + '\n' + body;
}
function renderWordRow(root, key) {
const row = root.querySelector('.spp-gs-row[data-key="' + key + '"]');
if (!row) return null;
const ta = row.querySelector('.spp-packs-ta');
if (!ta) return null;
const draft = wordDraftOf(key);
if (key === 'spp_hide_words_exact') {
const msg = row.querySelector('.spp-wordpack-msg');
if (msg) msg.textContent = '';
}
const preview = (key === 'spp_hide_words_exact') && wordShowOn(root);
if (preview) {
ta.value = wordPreviewText(draft, wordDraftOf('spp_wordpack'));
ta.readOnly = true;
ta.setAttribute('aria-readonly', 'true');
ta.title = '只读预览:你的自定义词在上、分隔线下面是常用词库。关闭「显示常用词」后即可编辑自定义。';
} else {
ta.value = draft;
ta.readOnly = false;
ta.removeAttribute('aria-readonly');
ta.removeAttribute('title');
}
return ta;
}
function renderWordRows(root) { SPP_WORD_ROW_KEYS.forEach(function (k) { renderWordRow(root, k); }); }
function wordColumnFeedback(row) {
const fb = row.querySelector('.spp-packs-fb');
if (!fb) return;
const key = row.dataset.key;
const isAny = key === 'spp_hide_words_any';
let n = 0, comment = 0, ignored = 0;
const stars = [];
String(wordDraftOf(key)).split(/[\r\n]+/).forEach(function (line, i) {
const s = line.trim().replace(/\s+/g, '');
if (!s) { ignored++; return; }
if (s.charAt(0) === '#') { comment++; return; }
n++;
if (s.charAt(0) === '*') stars.push(i + 1);
});
const parts = [];
parts.push(isAny ? ('<b>' + n + '</b> 条包含词(词内空白已忽略)')
: ('<b>' + n + '</b> 条整段完全匹配词'));
if (!isAny && wordShowOn(row.ownerDocument)) {
parts.push('<span class="spp-wordpack-fb-on">当前是只读预览:显示状态不影响过滤,保存只写你自己的自定义词</span>');
}
if (comment || ignored) parts.push('注释 / 空行 ' + (comment + ignored) + ' 行');
if (stars.length) {
parts.push('<span class="spp-bad">第 ' + stars.slice(0, 6).join('、') +
(stars.length > 6 ? ' 等' : '') + ' 行以 * 开头:' + (isAny
? '左栏本身就是"包含",* 会按<b>字面</b>匹配。只想写词就删掉这个 *。'
: '右栏是"整段完全匹配",* 会按<b>字面</b>匹配(要求正文里真的出现星号)。想表达"包含"请把这一行搬到左栏,并删掉开头的 *。') +
'</span>');
}
fb.innerHTML = parts.join(' · ');
}
function renderWordsFeedback(root) {
SPP_WORD_ROW_KEYS.forEach(function (key) {
const row = root.querySelector('.spp-gs-row[data-key="' + key + '"]');
if (!row || !row.querySelector('.spp-packs-fb')) return;   
wordColumnFeedback(row);
});
}
function importWordPack(root) {
const row = root.querySelector('.spp-gs-row[data-key="spp_hide_words_exact"]');
const existing = wordLines(wordDraftOf('spp_wordpack'));
const seen = Object.create(null);
existing.forEach(function (w) { seen[normWord(w)] = 1; });
const added = [];
let dup = 0, blank = 0;
SPP_WORDPACK_BUILTIN.forEach(function (w) {
const n = normWord(w);
if (!n) { blank++; return; }
if (seen[n]) { dup++; return; }
seen[n] = 1;
added.push(w);
});
if (added.length) {
wordDraft['spp_wordpack'] = existing.concat(added).join('\n');
renderWordRow(root, 'spp_wordpack');
}
const onBox = root.querySelector('.spp-gs-row[data-key="spp_wordpack_on"] input[type="checkbox"]');
if (onBox) onBox.checked = true;
renderWordRow(root, 'spp_hide_words_exact');   
renderWordsFeedback(root);
const msg = row ? row.querySelector('.spp-wordpack-msg') : null;
if (msg) {
msg.textContent = '已导入:新增 ' + added.length + ' 条 · 跳过 ' + dup + ' 条重复' +
(blank ? ' · 忽略 ' + blank + ' 条空行' : '') +
' · 已勾选「启用常用词库」 · 点「保存并刷新」后生效';
}
try {
const packLines = wordLines(wordDraftOf('spp_wordpack'));
const have = Object.create(null);
packLines.forEach(function (l) { have[normWord(l)] = 1; });
const miss = SPP_WORDPACK_BUILTIN.filter(function (w) {
const n = normWord(w);
return n && !have[n];
});
if (miss.length) {
SPP_INIT.fail.push('常用词库自检:导入后库草稿仍缺 ' + miss.length + ' 条(例:' +
miss.slice(0, 3).join('、') + ')');
} else if (!existing.length && packLines.length !== 54) {
SPP_INIT.fail.push('常用词库自检:空库导入后草稿行数 = ' + packLines.length + '(应为 54)');
}
if (!onBox || !onBox.checked) {
SPP_INIT.fail.push('常用词库自检:导入后「启用常用词库」未被勾上');
}
} catch (eSc) { }
}
function bindWordRows(root) {
SPP_WORD_ROW_KEYS.forEach(function (key) {
const row = root.querySelector('.spp-gs-row[data-key="' + key + '"]');
if (!row) return;
const ta = row.querySelector('.spp-packs-ta');
if (!ta || ta.dataset.sppWordBound) return;
ta.dataset.sppWordBound = '1';
ta.addEventListener('input', function () {
if (ta.readOnly) return;                 
wordDraft[key] = ta.value;
renderWordsFeedback(root);
});
});
const showRow = root.querySelector('.spp-gs-row[data-key="spp_wordpack_show"]');
const showBox = showRow ? showRow.querySelector('input[type="checkbox"]') : null;
if (showRow && showBox && !showRow.dataset.sppWordShowBound) {
showRow.dataset.sppWordShowBound = '1';
const sync = function () {
renderWordRows(root);                    
renderWordsFeedback(root);
};
showBox.addEventListener('change', sync);
showRow.addEventListener('click', function () { setTimeout(sync, 0); });
}
const btn = root.querySelector('.spp-wordpack-import');
if (btn && !btn.dataset.sppWordBound) {
btn.dataset.sppWordBound = '1';
btn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
try { importWordPack(root); } catch (err) {
const fb = root.querySelector('.spp-gs-row[data-key="spp_hide_words_exact"] .spp-packs-fb');
if (fb) fb.innerHTML = '<span class="spp-bad">导入失败:' + sppEscHtml(errBrief(err)) + '</span>';
}
});
}
}
const SPP_PANES = [
{ id: 'img',   name: '图片与页眉' },
{ id: 'emoji', name: '表情与贴纸' },
{ id: 'locate', name: '图片与链接定位' },
{ id: 'nav',   name: '导航与翻页' },
{ id: 'look',  name: '外观与版块' },
{ id: 'inpost', name: '贴内设置' },
{ id: 'card',  name: '卡片' },
{ id: 'block', name: '屏蔽与过滤' },
{ id: 'read',  name: '已读' },
{ id: 'bounty', name: '悬赏' },
{ id: 'misc',  name: '后台运行' }
];
const SPP_PANE_OF = {
maxImgHeight: 'img', maxImgWidth: 'img', vertImgHeight: 'img', vertImgWidth: 'img',
centerImg: 'img', wheelAction: 'img', spp_att_inline: 'img',
spp_brand_bar: 'img', spp_brand_slide: 'img', spp_brand_slide_sec: 'img',
spp_sticker_center: 'emoji', spp_sticker_autobr: 'emoji',
spp_custom_emoji: 'emoji', spp_custom_sticker: 'emoji', spp_host_extra: 'emoji',
spp_cat_memory: 'emoji',
spp_hover_preview: 'emoji',
spp_cat_scroll: 'emoji',
spp_hover_preview_size: 'emoji',
spp_name_ui: 'card',
spp_date_ui: 'card',
spp_read_ui: 'read', spp_read_dim: 'read',
spp_read_zone_tea: 'read', spp_read_zone_ask: 'read',
spp_read_zone_res: 'read', spp_read_zone_chat: 'read',
spp_read_zone_other: 'read',
spp_bounty_ui: 'bounty', spp_bounty_show_state: 'bounty', spp_bounty_show_sp: 'bounty', spp_bounty_time: 'bounty',
spp_bounty_filter: 'bounty',
spp_auto_expand_hidden: 'misc', spp_fix_white_text: 'misc', spp_autobuy_free: 'misc',
spp_buy_lift: 'misc',
spp_ajax_page: 'misc',
spp_imgidx_show: 'locate', spp_idx_auto: 'locate', spp_idx_per: 'locate',
spp_hide_smileonly: 'block',
spp_hide_words_any: 'block',
spp_hide_words_exact: 'block',
spp_wordpack: 'block',
spp_wordpack_on: 'block',
spp_wordpack_show: 'block',
spp_pg_ends: 'nav', spp_pager_nums: 'nav', spp_pager_nums_read: 'nav', spp_nav_step: 'nav', spp_nav_edge: 'inpost',    spp_nav_autohide: 'nav',    spp_search_order: 'nav',
spp_preview_live: 'misc', spp_editor_blockpick: 'misc', spp_host_mark: 'misc',   
spp_board_pl: 'nav',
spp_preload_pages: 'inpost', spp_nest_on: 'inpost',
spp_topkey_remember: 'look',
spp_page_width: 'look', spp_font_size: 'look', spp_read_dark: 'look', spp_star_motion: 'look', spp_fx_loop: 'look', spp_glass: 'look', spp_gray_flip: 'misc',    spp_floor_hover: 'inpost', spp_act_style: 'inpost',
spp_avatar_spin: 'look', spp_avatar_spin_dir: 'look', spp_hide_default_avatar: 'inpost',
spp_heat_style: 'card', spp_heat_scope: 'card', spp_heat_target_zone: 'card', spp_heat_target_board: 'card',
spp_cardinfo_view: 'card',
spp_card_hz_nm: 'card', spp_card_hz_dt: 'card',
spp_card_hz_fav: 'card', spp_card_hz_glow: 'card',
spp_card_vt_nm: 'card', spp_card_vt_dt: 'card',
spp_card_vt_fav: 'card', spp_card_vt_glow: 'card',
spp_card_ni_nm: 'card', spp_card_ni_dt: 'card',
spp_card_ni_fav: 'card', spp_card_ni_glow: 'card',
spp_read_mark: 'read', spp_read_dwell: 'read', spp_read_purge: 'read',
spp_read_purge_unit: 'read', spp_task_autoclaim: 'misc', spp_bounty_badge: 'bounty',
spp_tea_filter_memory: 'nav',
spp_fav_ui: 'card',
spp_cover_probe: 'card',
spp_card_title_lines: 'card',
spp_card_title_size: 'card',
spp_card_words_chat: 'block', spp_card_words_other: 'block',
spp_card_words_ask: 'block',
spp_pin_domain: 'misc',
spp_secbar_cm: 'look', spp_secbar_hj: 'look'
};
const SPP_PANE_STORE = 'spp_pane';
function stampPanelPanes(overlay) {
let n = 0;
overlay.querySelectorAll('.spp-gs-row').forEach(function (row) {
const p = row.dataset.key ? SPP_PANE_OF[row.dataset.key] : '';
if (p) { row.dataset.pane = p; n++; }
else SPP_INIT.fail.push('设置面板页签归类漏登记:' + (row.dataset.key || '(没有 data-key 的行)'));
});
const ACTS = [['.spp-gs-actbtn', 'look'], ['.spp-eh-n', 'emoji'], ['.spp-read-count', 'read'], ['.spp-pin-report', 'misc']];
overlay.querySelectorAll('.spp-gs-act').forEach(function (act) {
const hit = ACTS.filter(function (t) { return act.querySelector(t[0]); })[0];
if (hit) { act.dataset.pane = hit[1]; n++; }
else SPP_INIT.fail.push('设置面板页签归类漏登记:动作行');
});
Object.keys(SPP_PANE_OF).forEach(function (k) {
if (!overlay.querySelector('.spp-gs-row[data-key="' + k + '"]')) {
SPP_INIT.fail.push('设置面板页签归类写了个面板上没有的键:' + k);
}
});
return n;
}
function applyPanelPane(overlay) {
const box = overlay.querySelector('#spp-global-settings-box');
if (!box) return;
const qEl = box.querySelector('.spp-pane-q');
const q = (qEl && qEl.value ? qEl.value : '').trim().toLowerCase();
const filtering = q.length > 0;
const active = box.dataset.paneCur || SPP_PANES[0].id;
const hit = {};
SPP_PANES.forEach(function (p) { hit[p.id] = 0; });
box.querySelectorAll('[data-pane]').forEach(function (el) {
const show = filtering
? (el.textContent || '').toLowerCase().indexOf(q) >= 0
: el.dataset.pane === active;
el.classList.toggle('spp-pane-hidden', !show);
if (show) hit[el.dataset.pane] = (hit[el.dataset.pane] || 0) + 1;
});
let any = false;
SPP_PANES.forEach(function (p) { if (hit[p.id] > 0) any = true; });
box.querySelectorAll('.spp-pane').forEach(function (b) {
const on = !filtering && b.dataset.goto === active;
b.classList.toggle('spp-pane--on', on);
b.setAttribute('aria-selected', on ? 'true' : 'false');
b.classList.toggle('spp-pane--dim', filtering && !hit[b.dataset.goto]);
});
const empty = box.querySelector('.spp-pane-empty');
if (empty) empty.classList.toggle('spp-pane-on', filtering && !any);
}
function wirePanelPanes(overlay) {
const box = overlay.querySelector('#spp-global-settings-box');
if (!box) return;
stampPanelPanes(overlay);
try {
const last = sessionStorage.getItem(SPP_PANE_STORE);
if (last && SPP_PANES.some(function (p) { return p.id === last; })) box.dataset.paneCur = last;
} catch (e) {}
if (!box.dataset.paneCur) box.dataset.paneCur = SPP_PANES[0].id;
const go = function (id) {
box.dataset.paneCur = id;
try { sessionStorage.setItem(SPP_PANE_STORE, id); } catch (e) {}
applyPanelPane(overlay);
};
const clearQ = function () {
const qEl = box.querySelector('.spp-pane-q');
if (qEl && qEl.value) qEl.value = '';
};
const bar = box.querySelector('.spp-panebar');
if (bar) {
bar.addEventListener('click', function (ev) {
const btn = ev.target && ev.target.closest ? ev.target.closest('.spp-pane') : null;
if (!btn || !btn.dataset.goto) return;
clearQ();
go(btn.dataset.goto);
});
bar.addEventListener('keydown', function (ev) {
if (ev.key !== 'ArrowLeft' && ev.key !== 'ArrowRight') return;
const ids = SPP_PANES.map(function (p) { return p.id; });
const d = ev.key === 'ArrowRight' ? 1 : -1;
const nx = ids[(ids.indexOf(box.dataset.paneCur) + d + ids.length) % ids.length];
clearQ();
go(nx);
const f = box.querySelector('.spp-pane[data-goto="' + nx + '"]');
if (f) f.focus();
ev.preventDefault();
});
}
const q = box.querySelector('.spp-pane-q');
if (q) q.addEventListener('input', function () { applyPanelPane(overlay); });
applyPanelPane(overlay);
}
function buildOverlay() {            const overlay = document.createElement('div');
overlay.id = 'spp-global-settings-overlay';
let html = '<div id="spp-global-settings-box"><h3>脚本设置' +
'<input type="search" class="spp-pane-q" aria-label="筛选设置项" ' +
'placeholder="筛选设置项…(翻页 / 贴纸 / 黑夜 / 屏蔽)">' +
'</h3>';
html += '<div class="spp-panebar" role="tablist" aria-label="设置分类">' +
SPP_PANES.map(function (p) {
return '<button type="button" class="spp-pane" role="tab" data-goto="' + p.id +
'" aria-selected="false">' + p.name + '</button>';
}).join('') +
'</div>' +
'<div class="spp-pane-empty">没有匹配的设置项 —— 换个词,或把筛选框清空。</div>';
let leftTail = '';
html += '<div class="spp-gs-cols"><div class="spp-gs-col">';
let imgSettings = SPP_CONFIG.imgSettings();
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">横屏图片 (仅帖子页)</div>';
html += `<div class="spp-gs-row" data-key="maxImgHeight" data-type="img_json">
                <label>横屏图片最大高度<span class="spp-gs-hint">横屏图片(宽不小于高)的最大显示高度,可填 30-100(单位 vh)。默认 80</span></label>
                <span style="display:flex;align-items:center;gap:6px;">
                    <input type="range" min="30" max="100" step="5" value="${imgSettings.maxImgHeight}" style="width:90px;">
                    <span class="spp-val">${imgSettings.maxImgHeight}vh</span>
                </span>
            </div>`;
html += `<div class="spp-gs-row" data-key="maxImgWidth" data-type="img_json">
                <label>横屏图片最大宽度<span class="spp-gs-hint">横屏图片(宽不小于高)的最大显示宽度,可填 20-100(单位 %)。默认 100</span></label>
                <span style="display:flex;align-items:center;gap:6px;">
                    <input type="range" min="20" max="100" step="5" value="${imgSettings.maxImgWidth}" style="width:90px;">
                    <span class="spp-val">${imgSettings.maxImgWidth}%</span>
                </span>
            </div>`;
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">竖屏图片 (仅帖子页)</div>';
html += '<div class="spp-gs-row" data-key="vertImgHeight" data-type="img_json">' +
'<label>竖屏图片最大高度<span class="spp-gs-hint">竖屏图片(高大于宽)的最大显示高度,可填 30-100(单位 vh)。默认 80</span></label>' +
'<span style="display:flex;align-items:center;gap:6px;">' +
'<input type="range" min="30" max="100" step="5" value="' + imgSettings.vertImgHeight + '" style="width:90px;">' +
'<span class="spp-val">' + imgSettings.vertImgHeight + 'vh</span>' +
'</span>' +
'</div>';
html += '<div class="spp-gs-row" data-key="vertImgWidth" data-type="img_json">' +
'<label>竖屏图片最大宽度<span class="spp-gs-hint">竖屏图片(高大于宽)的最大显示宽度,可填 20-100(单位 %)。默认 100</span></label>' +
'<span style="display:flex;align-items:center;gap:6px;">' +
'<input type="range" min="20" max="100" step="5" value="' + imgSettings.vertImgWidth + '" style="width:90px;">' +
'<span class="spp-val">' + imgSettings.vertImgWidth + '%</span>' +
'</span>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">图片设置 (仅帖子页)</div>';
html += `<div class="spp-gs-row" data-key="centerImg" data-type="img_json">
                <label>图片居中显示</label>
                <input type="checkbox" ${imgSettings.centerImg ? 'checked' : ''}>
            </div>`;
html += `<div class="spp-gs-row" data-key="wheelAction" data-type="img_json">
                <label>灯箱滚轮行为</label>
                <select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">
                    <option value="switch" ${imgSettings.wheelAction === 'switch' ? 'selected' : ''}>切换图片</option>
                    <option value="zoom" ${imgSettings.wheelAction === 'zoom' ? 'selected' : ''}>缩放图片</option>
                </select>
            </div>`;
const attInline = SPP_CONFIG.bool('spp_att_inline', true);
html += `<div class="spp-gs-row" data-key="spp_att_inline" data-type="bool">
                <label>附件图原地显示<span class="spp-gs-hint">有些版块的帖子把上传的图片附件只渲染成一个空的「图片:」占位,正文里看不到图(但文件在服务器上)。勾选 = 按附件号把图取回来、原地显示在帖子里;不勾选 = 保持站点原样的空占位。默认开启</span></label>
                <input type="checkbox" ${attInline ? 'checked' : ''}>
            </div>`;
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">数值设置</div>';
const pageWidth = SPP_CONFIG.num('spp_page_width', 1400, 1200, 1600);
html += `<div class="spp-gs-row" data-key="spp_page_width" data-type="number">
                <label>页面宽度 (px)<span class="spp-gs-hint">整页容器宽度,可填 1200-1600。默认 1400</span></label>
                <input type="number" value="${pageWidth}" min="1200" max="1600" step="10">
            </div>`;
const navStep = SPP_CONFIG.num('spp_nav_step', 1, 1, 50);
html += `<div class="spp-gs-row" data-key="spp_nav_step" data-type="number">
                <label>翻页步长<span class="spp-gs-hint">悬浮按钮每次点击翻几页,可填 1-50(1 = 逐页翻)。默认 1</span></label>
                <input type="number" value="${navStep}" min="1" max="50" step="1">
            </div>`;
const fontSize = SPP_CONFIG.num('spp_font_size', 14, 12, 18);
html += `<div class="spp-gs-row" data-key="spp_font_size" data-type="number">
                <label>正文文字大小 (px)<span class="spp-gs-hint">帖子正文文字大小,可填 12-18(12 = 小、14 = 中、18 = 大)。改完刷新后所有楼层一起变。默认 14</span></label>
                <input type="number" value="${fontSize}" min="12" max="18" step="3">
            </div>`;
const titleLines = cardTitleLines();
html += '<div class="spp-gs-row" data-key="spp_card_title_lines" data-type="select">' +
'<label>卡片标题最大行数<span class="spp-gs-hint">版块页卡片标题最多折几行,长标题选大一点更完整;只改折行上限、不动字号。默认「2 行」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="2"' + (titleLines === '2' ? ' selected' : '') + '>2 行(默认)</option>' +
'<option value="3"' + (titleLines === '3' ? ' selected' : '') + '>3 行</option>' +
'<option value="4"' + (titleLines === '4' ? ' selected' : '') + '>4 行</option>' +
'<option value="5"' + (titleLines === '5' ? ' selected' : '') + '>5 行</option>' +
'<option value="6"' + (titleLines === '6' ? ' selected' : '') + '>6 行</option>' +
'</select>' +
'</div>';
const titleSize = cardTitleSize();
html += '<div class="spp-gs-row" data-key="spp_card_title_size" data-type="select">' +
'<label>卡片标题字号<span class="spp-gs-hint">版块页卡片标题的字号,调小能把同一段标题挤进更少的行里。默认 18 px(当前字号)</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="14"' + (titleSize === '14' ? ' selected' : '') + '>14 px</option>' +
'<option value="15"' + (titleSize === '15' ? ' selected' : '') + '>15 px</option>' +
'<option value="16"' + (titleSize === '16' ? ' selected' : '') + '>16 px</option>' +
'<option value="17"' + (titleSize === '17' ? ' selected' : '') + '>17 px</option>' +
'<option value="18"' + (titleSize === '18' ? ' selected' : '') + '>18 px(默认,当前字号)</option>' +
'</select>' +
'</div>';
const pinNow = pinDomain();
let pinOpts = '<option value="' + PIN_OFF + '"' + (pinNow === PIN_OFF ? ' selected' : '') + '>关闭(默认)</option>';
for (let pi = 0; pi < PIN_HOSTS.length; pi++) {
const pHost = PIN_HOSTS[pi][1];
pinOpts += '<option value="' + pHost + '"' + (pinNow === pHost ? ' selected' : '') + '>' +
PIN_HOSTS[pi][0] + ' ' + pHost + '</option>';
}
html += '<div class="spp-gs-row" data-key="spp_pin_domain" data-type="select">' +
'<label>锚定域名<span class="spp-gs-hint">选定后打开任意镜像域名会自动跳到这一家(同一页)。登录态按主机名分开 ⇒ 锚到别家可能变成游客。默认「关闭」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' + pinOpts + '</select>' +
'</div>';
html += '<div class="spp-gs-act spp-pin-act" data-pane="misc">' +
'<span class="spp-gs-acthint">逐个域名测 ' + PIN_TEST_TRIES + ' 次,结果显示在下面。这一栏看的是「谁连不上」,不是「谁更快」。' +
'<b class="spp-pin-report" style="display:block;margin-top:6px;font-weight:400;white-space:pre-wrap;word-break:break-all;max-width:100%;max-height:220px;overflow:auto;font-family:Consolas,Menlo,monospace;font-size:11px;line-height:1.5;color:var(--spu-text,#1f2937);">还没有测过</b>' +
'</span>' +
'<button type="button" class="spp-pin-test-btn">测试全部域名</button>' +
'</div>';
const idxPer = SPP_CONFIG.num('spp_idx_per', 15, 5, 60);
html += `<div class="spp-gs-row" data-key="spp_idx_per" data-type="number">
                <label>索引面板每页行数<span class="spp-gs-hint">含图 / 链接两栏每页显示多少行,可填 5-60;超过一页时面板底部出现翻页条。默认 15</span></label>
                <input type="number" value="${idxPer}" min="5" max="60" step="5">
            </div>`;
const avSpin = SPP_CONFIG.num('spp_avatar_spin', 8, 0, 60);
html += '<div class="spp-gs-row" data-key="spp_avatar_spin" data-type="number">' +
'<label>头像自转周期 (秒/圈)<span class="spp-gs-hint">用户卡上那枚圆形头像每多少秒转一圈,可填 0-60(0 = 不转)。默认 8</span></label>' +
'<input type="number" value="' + avSpin + '" min="0" max="60" step="1">' +
'</div>';
const avDir = SPP_CONFIG.pick('spp_avatar_spin_dir', 'cw', AV_SPIN_DIRS);
html += '<div class="spp-gs-row" data-key="spp_avatar_spin_dir" data-type="select">' +
'<label>头像自转方向<span class="spp-gs-hint">头像自转的方向;上一个参数填 0(不转)时不起作用。默认「顺时针」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="cw"' + (avDir === 'cw' ? ' selected' : '') + '>顺时针</option>' +
'<option value="ccw"' + (avDir === 'ccw' ? ' selected' : '') + '>逆时针</option>' +
'</select>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">板块条样式 (首页)</div>';
html += '<div class="spp-gs-row" data-key="spp_secbar_cm" data-type="select">' +
'<label>漫区特设 · 板块条样式<span class="spp-gs-hint">首页「漫区特设」那一条的样式(固定为「赛博机能切角」):洋红切角外框、两枚机能铭牌、方块 M 徽标</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="mecha" selected>赛博机能切角(默认)</option>' +
'</select>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_secbar_hj" data-type="select">' +
'<label>综合交流 · 板块条样式<span class="spp-gs-hint">首页「综合交流」那一条的样式(固定为「赛博脉冲」):青色网格底、呼吸辉光</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="pulse" selected>赛博脉冲(默认)</option>' +
'</select>' +
'</div>';
html += '</div>';
html += '<!--SPP-LEFT-TAIL-->';
html += '</div><div class="spp-gs-col">';
const autoExpand = SPP_CONFIG.bool('spp_auto_expand_hidden', true);
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">功能开关</div>';
html += `<div class="spp-gs-row" data-key="spp_auto_expand_hidden" data-type="bool">
                <label>自动展开隐藏楼层<span class="spp-gs-hint">被站点折叠的楼层内容(纯 mark 水帖这类)是否直接展开。勾选 = 直接展开、不留「▼展开」按钮;不勾选 = 照旧要手点。默认开启</span></label>
                <input type="checkbox" ${autoExpand ? 'checked' : ''}>
            </div>`;
const hideSmile = SPP_CONFIG.bool('spp_hide_smileonly', false);
html += '<div class="spp-gs-row" data-key="spp_hide_smileonly" data-type="bool">' +
'<label>隐藏纯表情楼<span class="spp-gs-hint">帖子里只有论坛默认表情的楼层整层不显示。勾选 = 藏起来(楼主那层与引用 / 带图 / 带附件 / 售价楼不动);不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (hideSmile ? 'checked' : '') + '>' +
'</div>';
html += '<div class="spp-packs-cols">';
html += '<div class="spp-gs-row" data-key="spp_hide_words_any" data-type="packs">' +
'<label>楼层正文屏蔽词 · 左栏(包含)<span class="spp-gs-hint">正文里<b>出现</b>这个词就整层不显示。# 开头的行当注释;想让词本身以 # 或 \\ 开头,就在开头多写一个 \\(\\#测试 表示词 #测试,开头的反斜杠不要手删)。只对没有附件 / 外链图的楼层生效,楼主那层不屏蔽</span></label>' +
'<textarea class="spp-packs-ta" spellcheck="false" placeholder="mark&#10;马克"></textarea>' +
'<div class="spp-packs-fb"></div>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_hide_words_exact" data-type="packs">' +
'<label>楼层正文屏蔽词 · 右栏(整段完全匹配)<span class="spp-gs-hint">整段正文(去掉全部空白与图片后)与这个词<b>逐字相等</b>才整层不显示(不是"含这个词")。# 开头的行当注释;\\ 开头的写法同上。留空 = 不生效</span></label>' +
'<textarea class="spp-packs-ta" spellcheck="false" placeholder="感谢分享&#10;mark"></textarea>' +
'<div class="spp-wordpack-bar"><button type="button" class="spp-wordpack-import">一键导入常用词库</button><span class="spp-wordpack-hint">导入后勾上「启用常用词库」,点「保存并刷新」才生效</span></div>' +
'<div class="spp-wordpack-msg" role="status" aria-live="polite"></div>' +
'<div class="spp-packs-fb"></div>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-row" data-key="spp_wordpack" data-type="packs" style="display:none">' +
'<label>常用精确匹配词库(内部承载,不在此编辑)</label>' +
'<textarea class="spp-packs-ta" spellcheck="false"></textarea>' +
'</div>';
const wpOn = SPP_CONFIG.bool('spp_wordpack_on', false);
html += '<div class="spp-gs-row" data-key="spp_wordpack_on" data-type="bool">' +
'<label>启用常用词库<span class="spp-gs-hint">勾选 = 已导入的常用词库参与"整段完全匹配"过滤(与左右两栏自定义词同时生效);不勾选 = 只跳过词库这一路,自定义两栏照旧。默认关闭</span></label>' +
'<input type="checkbox" ' + (wpOn ? 'checked' : '') + '>' +
'</div>';
const wpShow = SPP_CONFIG.bool('spp_wordpack_show', false);
html += '<div class="spp-gs-row" data-key="spp_wordpack_show" data-type="bool">' +
'<label>显示常用词(右栏只读预览)<span class="spp-gs-hint">勾选 = 右栏变成只读预览(你的自定义词在上、分隔线下面是词库词,可框选复制);<b>关闭"显示常用词"后即可编辑自定义</b>。此开关只影响显示,不影响过滤效果。默认关闭</span></label>' +
'<input type="checkbox" ' + (wpShow ? 'checked' : '') + '>' +
'</div>';
const avaInit = SPP_CONFIG.bool('spp_hide_default_avatar', false);
leftTail += `<div class="spp-gs-row" data-key="spp_hide_default_avatar" data-type="bool">
                <label>用户名 + 彩色背景头像<span class="spp-gs-hint">没有图床(或头像链接已失效)的用户,用「用户名 + 彩色渐变块」替换站点默认头像。勾选 = 替换;不勾选 = 用站点默认头像。默认关闭</span></label>
                <input type="checkbox" ${avaInit ? 'checked' : ''}>
            </div>`;
const iiShow = SPP_CONFIG.bool('spp_imgidx_show', false);
leftTail += `<div class="spp-gs-row" data-key="spp_imgidx_show" data-type="bool">
                <label>含图楼层悬浮窗<span class="spp-gs-hint">含图 / 链接那块悬浮面板的显示方式。勾选 = 常显;不勾选 = 收起成侧边一条、只留当前页签(鼠标移上去滑回来)。默认关闭</span></label>
                <input type="checkbox" ${iiShow ? 'checked' : ''}>
            </div>`;
const hostMark = SPP_CONFIG.bool('spp_host_mark', false);
html += `<div class="spp-gs-row" data-key="spp_host_mark" data-type="bool">
                <label>链接自动标注<span class="spp-gs-hint">输入框里的超链接自动按图床格式标注。勾选 = 自动标注;不勾选 = 不标。默认关闭</span></label>
                <input type="checkbox" ${hostMark ? 'checked' : ''}>
            </div>`;
leftTail += '<div class="spp-gs-act">' +
'<span class="spp-gs-acthint">上面那两页(emoji / 贴纸)记着最近用过的表情,而且是按板块分开记的(小圆脸记小圆脸的、滑稽记滑稽的)—— 网格顶部那一组只铺当前所选板块的,选「全部」时把该页各板块按时间合并着铺;每页每个板块各留 ' + EMOJI_HIST_MAX + ' 条、同一张只留最近那一次;点完按钮网格顶部那一组立刻消失(不必保存 / 刷新页面,也不动已经插进正文里的表情)。当前 emoji <b class="spp-eh-n" data-pg="emoji">' + histCount('emoji') + '</b> 条 / 贴纸 <b class="spp-eh-n" data-pg="sticker">' + histCount('sticker') + '</b> 条</span>' +
'<button type="button" class="spp-eh-clear" data-pg="emoji">清空 emoji 记录</button>' +
'<button type="button" class="spp-eh-clear" data-pg="sticker">清空贴纸记录</button>' +
'</div>';
const stickerCenter = SPP_CONFIG.bool('spp_sticker_center', false);
leftTail += `<div class="spp-gs-row" data-key="spp_sticker_center" data-type="bool">
                <label>贴纸居中显示<span class="spp-gs-hint">脚本贴进帖子里的表情 / 贴纸是否居中。勾选 = 居中;不勾选 = 保持行内原样。默认关闭</span></label>
                <input type="checkbox" ${stickerCenter ? 'checked' : ''}>
            </div>`;
html += '<div class="spp-gs-row" data-key="spp_card_words_chat" data-type="packs">' +
'<label>卡片标题屏蔽词(茶馆)<span class="spp-gs-hint">只对茶馆图墙里的卡片生效:一行一个词,# 开头的行当注释,标题里含这个词的卡片整张不显示。留空 = 不生效</span></label>' +
'<textarea class="spp-packs-ta" spellcheck="false" placeholder="一行一个词,例如:&#10;ai生成&#10;求资源"></textarea>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_card_words_other" data-type="packs">' +
'<label>卡片标题屏蔽词(其他板块)<span class="spp-gs-hint">只对茶馆以外的板块生效,与上面茶馆那条互相独立:一行一个词、# 开头的行当注释,标题里含这个词的卡片整张不显示。留空 = 不生效</span></label>' +
'<textarea class="spp-packs-ta" spellcheck="false" placeholder="一行一个词,例如:&#10;转载&#10;求物"></textarea>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_card_words_ask" data-type="packs">' +
'<label>卡片标题屏蔽词(求物区)<span class="spp-gs-hint">只对求物区(fid 48)图墙里的卡片生效,与茶馆、其他板块两条互相独立:一行一个词,# 开头的行当注释,标题里含这个词的卡片整张不显示。留空 = 不生效</span></label>' +
'<textarea class="spp-packs-ta" spellcheck="false" placeholder="一行一个词,例如:&#10;结贴&#10;结帖"></textarea>' +
'</div>';            const idxAuto = SPP_CONFIG.bool('spp_idx_auto', false);
leftTail += `<div class="spp-gs-row" data-key="spp_idx_auto" data-type="bool">
                <label>打开帖子自动索引全贴(含图 / 链接跨页定位)<span class="spp-gs-hint">打开帖子时是否自动开始全贴索引并切到全贴视图。勾选 = 自动开始,抓的过程可随时停;不勾选 = 点面板底部「全贴索引」才开始。默认关闭</span></label>
                <input type="checkbox" ${idxAuto ? 'checked' : ''}>
            </div>`;
const wfFix = SPP_CONFIG.bool('spp_fix_white_text', true);
html += `<div class="spp-gs-row" data-key="spp_fix_white_text" data-type="bool">
                <label>白底白字转加粗深色<span class="spp-gs-hint">白底正文上完全看不见的白色字自动转成加粗深色。勾选 = 转换;不勾选 = 保持原样。默认开启</span></label>
                <input type="checkbox" ${wfFix ? 'checked' : ''}>
            </div>`;
const autobuy = SPP_CONFIG.bool('spp_autobuy_free', true);
html += `<div class="spp-gs-row" data-key="spp_autobuy_free" data-type="bool">
                <label>免费帖自动购买<span class="spp-gs-hint">打开还没买过、售价为 0 SP币 的帖子时自动买下(页面不跳转)。勾选 = 自动买;不勾选 = 手动买。收费帖一律手动。默认开启</span></label>
                <input type="checkbox" ${autobuy ? 'checked' : ''}>
            </div>`;
const buyLift = SPP_CONFIG.bool('spp_buy_lift', true);
html += `<div class="spp-gs-row" data-key="spp_buy_lift" data-type="bool">
                <label>提亮已购正文<span class="spp-gs-hint">买下后解锁的正文按正常正文显示(深灰、不再缩成引用块那样)。勾选 = 提亮;不勾选 = 站点原样。默认开启</span></label>
                <input type="checkbox" ${buyLift ? 'checked' : ''}>
            </div>`;
const floorHover = SPP_CONFIG.bool('spp_floor_hover', false);
leftTail += `<div class="spp-gs-row" data-key="spp_floor_hover" data-type="bool">
                <label>悬停高亮<span class="spp-gs-hint">鼠标停在楼层或表格行上时整行刷一层淡底。勾选 = 划过上色;不勾选 = 不上色。默认关闭</span></label>
                <input type="checkbox" ${floorHover ? 'checked' : ''}>
            </div>`;
const actStyle = SPP_CONFIG.pick('spp_act_style', 'both', ['both', 'icon', 'text']);
leftTail += '<div class="spp-gs-row" data-key="spp_act_style" data-type="select">' +
'<label>楼层底栏按钮显示方式<span class="spp-gs-hint">楼层底部那排动作(回复 / 只看该作者 / 屏蔽 / 引用)的显示方式。图标跟随文字颜色。默认图标 + 文字</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="both"' + (actStyle === 'both' ? ' selected' : '') + '>图标 + 文字(默认)</option>' +
'<option value="icon"' + (actStyle === 'icon' ? ' selected' : '') + '>纯图标</option>' +
'<option value="text"' + (actStyle === 'text' ? ' selected' : '') + '>纯文字</option>' +
'</select>' +
'</div>';
const readDark = SPP_CONFIG.bool('spp_read_dark', false);
leftTail += `<div class="spp-gs-row" data-key="spp_read_dark" data-type="bool">
                <label>黑夜模式<span class="spp-gs-hint">帖子页正文区改用反光黑玻璃底色。勾选 = 进黑夜模式;不勾选 = 原来的浅色。默认关闭</span></label>
                <input type="checkbox" ${readDark ? 'checked' : ''}>
            </div>`;
const starMotion = SPP_CONFIG.bool('spp_star_motion', false);
leftTail += `<div class="spp-gs-row" data-key="spp_star_motion" data-type="bool">
                <label>星空缓慢流动(关=静态,更省电)<span class="spp-gs-hint">关 = 星点静止、最省电(默认);开 = 恢复原来缓慢上升的观感(50 秒一轮、三层各 50/100/150 秒)。改完点「保存并刷新」生效</span></label>
                <input type="checkbox" ${starMotion ? 'checked' : ''}>
            </div>`;
const fxLoop = SPP_CONFIG.bool('spp_fx_loop', true);
leftTail += '<div class="spp-gs-row" data-key="spp_fx_loop" data-type="bool">' +
'<label>装饰动效循环播放<span class="spp-gs-hint">脚本自身的装饰动画(顶栏状态灯、用户卡渐变/光环/头像、右侧导航点呼吸)是否一直循环。勾选(默认)= 与现在完全一样;取消 = 这些动画静止不动(外观仍"静止但正常",不会透明也不会变形),空闲时更省电。改完点「保存并刷新」生效</span></label>' +
'<input type="checkbox"' + (fxLoop ? ' checked' : '') + '>' +
'</div>';
const glassOn = SPP_CONFIG.bool('spp_glass', false);
leftTail += '<div class="spp-gs-row" data-key="spp_glass" data-type="bool">' +
'<label>毛玻璃<span class="spp-gs-hint">脚本 UI(右侧导航面板、顶栏 HUD、悬浮提示、预览浮层、弹窗等)是否用背景模糊。默认关闭 = 摘掉毛玻璃(背景改为接近不透明,文字照样清楚,空闲时少一层重绘);勾选 = 恢复原来观感。改完点「保存并刷新」立刻生效</span></label>' +
'<input type="checkbox"' + (glassOn ? ' checked' : '') + '>' +
'</div>';
const grayFlip = SPP_CONFIG.bool('spp_gray_flip', true);
leftTail += '<div class="spp-gs-row" data-key="spp_gray_flip" data-type="bool">' +
'<label>灰字翻色<span class="spp-gs-hint">正文里发灰的字在暗底看不清时,自动提亮成主题的次亮色。只认「灰字 + 暗底 + 对比度不够」三条同时成立;白字、彩字一律不碰。勾选 = 翻色;不勾选 = 保留原色。默认开启</span></label>' +
'<input type="checkbox"' + (grayFlip ? ' checked' : '') + '>' +
'</div>';
const navEdge = SPP_CONFIG.bool('spp_nav_edge', false);
leftTail += `<div class="spp-gs-row" data-key="spp_nav_edge" data-type="bool">
                <label>翻页悬浮框靠边自动隐藏<span class="spp-gs-hint">右侧翻页悬浮框贴到屏幕右缘时自动缩进去、只留一条窄边,鼠标移上去滑回来。勾选 = 靠边自动隐藏;不勾选 = 一直展开。默认关闭</span></label>
                <input type="checkbox" ${navEdge ? 'checked' : ''}>
            </div>`;
const navAutohide = SPP_CONFIG.pick('spp_nav_autohide', 'off', ['off', 'hover', 'always']);
leftTail += '<div class="spp-gs-row" data-key="spp_nav_autohide" data-type="select">' +
'<label>翻页悬浮框自动隐藏<span class="spp-gs-hint">默认关闭;选「一直隐藏」后,可从油猴菜单「打开设置面板」改回</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="off"' + (navAutohide === 'off' ? ' selected' : '') + '>关闭(默认)</option>' +
'<option value="hover"' + (navAutohide === 'hover' ? ' selected' : '') + '>鼠标经过弹出</option>' +
'<option value="always"' + (navAutohide === 'always' ? ' selected' : '') + '>一直隐藏</option>' +
'</select>' +
'</div>';
const preloadPages = SPP_CONFIG.num('spp_preload_pages', 5, 1, 30);
leftTail += '<div class="spp-gs-row" data-key="spp_preload_pages" data-type="number">' +
'<label>预加载 N 页合并整页<span class="spp-gs-hint">翻页时预取后续 N 页、合并成一页。可填 1-30。默认 5</span></label>' +
'<input type="number" value="' + preloadPages + '" min="1" max="30" step="1">' +
'</div>';
const nestOn = SPP_CONFIG.bool('spp_nest_on', true);
leftTail += '<div class="spp-gs-row" data-key="spp_nest_on" data-type="bool">' +
'<label>Reddit 式楼层排版<span class="spp-gs-hint">Reddit 化楼层排版开关;关 = 回脚本美化版。默认开启</span></label>' +
'<input type="checkbox" ' + (nestOn ? 'checked' : '') + '>' +
'</div>';
const ajaxPage = SPP_CONFIG.bool('spp_ajax_page', true);
leftTail += '<div class="spp-gs-row" data-key="spp_ajax_page" data-type="bool">' +
'<label>无刷新翻页<span class="spp-gs-hint">翻页时后台换页、不整页刷新;块页码条随预加载档走。默认开启</span></label>' +
'<input type="checkbox" ' + (ajaxPage ? 'checked' : '') + '>' +
'</div>';
const topKeyRemember = SPP_CONFIG.bool('spp_topkey_remember', false);
leftTail += '<div class="spp-gs-row" data-key="spp_topkey_remember" data-type="bool">' +
'<label>进入页面自动收起顶部信息板<span class="spp-gs-hint">顶栏箭头按钮那枚开关。勾选 = 每次打开 / 刷新页面都自动收起(当页仍可用箭头手动展开或再收起,不会被强行改回);不勾选 = 每次打开默认展开。默认关闭</span></label>' +
'<input type="checkbox" ' + (topKeyRemember ? 'checked' : '') + '>' +
'</div>';
const taskAuto = SPP_CONFIG.bool('spp_task_autoclaim', true);
leftTail += `<div class="spp-gs-row" data-key="spp_task_autoclaim" data-type="bool">
                <label>社区论坛任务自动领取<span class="spp-gs-hint">打开任意南+页面时,在后台把社区任务里「可领取」的奖励领掉(先申请再领取,页面不跳转),同一任务 24 小时内只领一次。勾选 = 自动领;不勾选 = 手动领。默认开启</span></label>
                <input type="checkbox" ${taskAuto ? 'checked' : ''}>
            </div>`;
const bountyBadge = SPP_CONFIG.bool('spp_bounty_badge', true);
leftTail += `<div class="spp-gs-row" data-key="spp_bounty_badge" data-type="bool">
                <label>求物区悬赏徽章<span class="spp-gs-hint">求物区卡片上那枚「悬赏中 / 已解决 / 已结束」徽章。勾选 = 显示(要反查帖子页);不勾选 = 不显示,也不发探测请求。默认开启</span></label>
                <input type="checkbox" ${bountyBadge ? 'checked' : ''}>
            </div>`;
const catMemory = SPP_CONFIG.bool('spp_cat_memory', true);
leftTail += '<div class="spp-gs-row" data-key="spp_cat_memory" data-type="bool">' +
'<label>记住上次选的表情分类<span class="spp-gs-hint">表情栏两页各自记住上次点过的分类胶囊,下次打开直接落在那类上。勾选 = 记住;不勾选 = 每次都从默认类开始。默认开启</span></label>' +
'<input type="checkbox" ' + (catMemory ? 'checked' : '') + '>' +
'</div>';
const hoverPreview = SPP_CONFIG.bool('spp_hover_preview', true);
leftTail += '<div class="spp-gs-row" data-key="spp_hover_preview" data-type="bool">' +
'<label>贴纸悬停预览大图<span class="spp-gs-hint">鼠标停在贴纸格子上时,除名字外再给一张大图预览(动图照旧会动;只在贴纸页生效)。勾选 = 给大图;不勾选 = 只留名字卡。默认开启</span></label>' +
'<input type="checkbox" ' + (hoverPreview ? 'checked' : '') + '>' +
'</div>';
const hoverSize = SPP_CONFIG.num('spp_hover_preview_size', 128, 64, 320);
leftTail += '<div class="spp-gs-row" data-key="spp_hover_preview_size" data-type="number">' +
'<label>悬停预览尺寸 (px)<span class="spp-gs-hint">悬停预览那张大图的边长,可填 64-320。盒子是正方形、图按原比例内缩放。默认 128</span></label>' +
'<input type="number" value="' + hoverSize + '" min="64" max="320" step="8">' +
'</div>';
const pgNums = SPP_CONFIG.num('spp_pager_nums', 5, 1, 15);
leftTail += '<div class="spp-gs-row" data-key="spp_pager_nums" data-type="number">' +
'<label>页码按钮最少枚数<span class="spp-gs-hint">版块页 / 搜索页翻页条里数字页码最少露出几枚,可填 1-15。只补不收:站点给得更多就不动。默认 5</span></label>' +
'<input type="number" value="' + pgNums + '" min="1" max="15" step="1">' +
'</div>';
const pgNumsRead = SPP_CONFIG.num('spp_pager_nums_read', 5, 1, 10);
leftTail += '<div class="spp-gs-row" data-key="spp_pager_nums_read" data-type="number">' +
'<label>页码按钮最少枚数(帖子页)<span class="spp-gs-hint">帖子页翻页条里数字页码最少露出几枚,可填 1-10。只补不收:站点给得更多就不动。默认 5</span></label>' +
'<input type="number" value="' + pgNumsRead + '" min="1" max="10" step="1">' +
'</div>';
const boardPl = SPP_CONFIG.num('spp_board_pl', 0, 0, 10);
leftTail += '<div class="spp-gs-row" data-key="spp_board_pl" data-type="number">' +
'<label>板块列表预加载页数<span class="spp-gs-hint">0 = 关闭(默认);1-10 = 进板块页后把后续这么多页接在当前页后面(串行抓取、页间等 400-500 ms、失败即停),上限 10。这些页同时也是翻页「一步」的步长</span></label>' +
'<input type="number" value="' + boardPl + '" min="0" max="10" step="1">' +
'</div>';
const nameUi = SPP_CONFIG.pick('spp_name_ui', 'sweep', ['sweep', 'neon', 'holo', 'code', 'line']);
leftTail += '<div class="spp-gs-row" data-key="spp_name_ui" data-type="select">' +
'<label>名字框样式<span class="spp-gs-hint">作者名字外面那只胶囊走哪一套,五套都是常态可见、悬停加特效。默认「浮光掠影」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="sweep"' + (nameUi === 'sweep' ? ' selected' : '') + '>浮光掠影</option>' +
'<option value="neon"' + (nameUi === 'neon' ? ' selected' : '') + '>霓虹呼吸</option>' +
'<option value="holo"' + (nameUi === 'holo' ? ' selected' : '') + '>幻境底色</option>' +
'<option value="code"' + (nameUi === 'code' ? ' selected' : '') + '>视界代码</option>' +
'<option value="line"' + (nameUi === 'line' ? ' selected' : '') + '>极简底线</option>' +
'</select>' +
'</div>';
const readUi = SPP_CONFIG.pick('spp_read_ui', 'stamp', ['stamp', 'fluid', 'spine']);
leftTail += '<div class="spp-gs-row" data-key="spp_read_ui" data-type="select">' +
'<label>已读标记样式</label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="stamp"' + (readUi === 'stamp' ? ' selected' : '') + '>纸感钢印</option>' +
'<option value="fluid"' + (readUi === 'fluid' ? ' selected' : '') + '>能量波纹</option>' +
'<option value="spine"' + (readUi === 'spine' ? ' selected' : '') + '>冷光脊柱</option>' +
'</select>' +
'</div>';
const readDim = SPP_CONFIG.bool('spp_read_dim', false);
leftTail += '<div class="spp-gs-row" data-key="spp_read_dim" data-type="bool">' +
'<label>已读时标题变暗<span class="spp-gs-hint">已读主题的标题文字压暗一档。勾选 = 压暗;不勾选 = 与未读一样亮。默认关闭</span></label>' +
'<input type="checkbox" ' + (readDim ? 'checked' : '') + '>' +
'</div>';
const rzTea = SPP_CONFIG.bool('spp_read_zone_tea', true);
leftTail += '<div class="spp-gs-row" data-key="spp_read_zone_tea" data-type="bool">' +
'<label>已读:茶馆<span class="spp-gs-hint">茶馆大区的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启</span></label>' +
'<input type="checkbox" ' + (rzTea ? 'checked' : '') + '>' +
'</div>';
const rzAsk = SPP_CONFIG.bool('spp_read_zone_ask', true);
leftTail += '<div class="spp-gs-row" data-key="spp_read_zone_ask" data-type="bool">' +
'<label>已读:求物区<span class="spp-gs-hint">询问&求物大区的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启</span></label>' +
'<input type="checkbox" ' + (rzAsk ? 'checked' : '') + '>' +
'</div>';
const rzRes = SPP_CONFIG.bool('spp_read_zone_res', true);
leftTail += '<div class="spp-gs-row" data-key="spp_read_zone_res" data-type="bool">' +
'<label>已读:资源区<span class="spp-gs-hint">资源区(含免空区、漫区、网赚区)的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启</span></label>' +
'<input type="checkbox" ' + (rzRes ? 'checked' : '') + '>' +
'</div>';
const rzChat = SPP_CONFIG.bool('spp_read_zone_chat', true);
leftTail += '<div class="spp-gs-row" data-key="spp_read_zone_chat" data-type="bool">' +
'<label>已读:交流区<span class="spp-gs-hint">交流区(ACG交流 / 轻小说 / 原创绘画 / 原创小说区 / AI交流,与「热度」那栏同一批板块)的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启</span></label>' +
'<input type="checkbox" ' + (rzChat ? 'checked' : '') + '>' +
'</div>';
const rzOther = SPP_CONFIG.bool('spp_read_zone_other', true);
leftTail += '<div class="spp-gs-row" data-key="spp_read_zone_other" data-type="bool">' +
'<label>已读:其他<span class="spp-gs-hint">不在上面几个大区里的版块的卡片要不要显示已读标记。勾选 = 显示;不勾选 = 不显示。默认开启</span></label>' +
'<input type="checkbox" ' + (rzOther ? 'checked' : '') + '>' +
'</div>';
const bountyUi = SPP_CONFIG.pick('spp_bounty_ui', 's1', ['s1', 's2', 's3', 's4', 's5']);
leftTail += '<div class="spp-gs-row" data-key="spp_bounty_ui" data-type="select">' +
'<label>悬赏框样式<span class="spp-gs-hint">悬赏徽章走哪一套,五套都是机甲 / 仪表风。默认「精工切角」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="s1"' + (bountyUi === 's1' ? ' selected' : '') + '>精工切角</option>' +
'<option value="s2"' + (bountyUi === 's2' ? ' selected' : '') + '>模块拼接</option>' +
'<option value="s3"' + (bountyUi === 's3' ? ' selected' : '') + '>全息玻璃</option>' +
'<option value="s4"' + (bountyUi === 's4' ? ' selected' : '') + '>暗星微光</option>' +
'<option value="s5"' + (bountyUi === 's5' ? ' selected' : '') + '>机能视窗</option>' +
'</select>' +
'</div>';
const bountyState = SPP_CONFIG.bool('spp_bounty_show_state', true);
leftTail += '<div class="spp-gs-row" data-key="spp_bounty_show_state" data-type="bool">' +
'<label>悬赏显示状态<span class="spp-gs-hint">徽章里「悬赏中 / 已解决 / 悬赏已结束」那一段(含状态圆点)。勾选 = 显示;不勾选 = 不显示。默认开启</span></label>' +
'<input type="checkbox" ' + (bountyState ? 'checked' : '') + '>' +
'</div>';
const bountySp = SPP_CONFIG.bool('spp_bounty_show_sp', true);
leftTail += '<div class="spp-gs-row" data-key="spp_bounty_show_sp" data-type="bool">' +
'<label>悬赏显示悬赏 SP<span class="spp-gs-hint">徽章里「xx SP」那一段。勾选 = 显示;不勾选 = 不显示。默认开启</span></label>' +
'<input type="checkbox" ' + (bountySp ? 'checked' : '') + '>' +
'</div>';
const bountyLeft = SPP_CONFIG.bool('spp_bounty_time', false);
leftTail += '<div class="spp-gs-row" data-key="spp_bounty_time" data-type="bool">' +
'<label>悬赏显示剩余时间<span class="spp-gs-hint">徽章里「剩 xxh」那一段(只有悬赏中才有)。勾选 = 显示;不勾选 = 不显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (bountyLeft ? 'checked' : '') + '>' +
'</div>';
const bountyFilter = SPP_CONFIG.pick('spp_bounty_filter', 'all', ['all', 'open', 'done']);
leftTail += '<div class="spp-gs-row" data-key="spp_bounty_filter" data-type="select">' +
'<label>求物区悬赏状态筛选<span class="spp-gs-hint">只对求物区按悬赏状态筛选,默认显示全部=本版之前</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="all"' + (bountyFilter === 'all' ? ' selected' : '') + '>显示全部(默认)</option>' +
'<option value="open"' + (bountyFilter === 'open' ? ' selected' : '') + '>只显示悬赏中</option>' +
'<option value="done"' + (bountyFilter === 'done' ? ' selected' : '') + '>只显示已完成</option>' +
'</select>' +
'</div>';
const dateUi = SPP_CONFIG.pick('spp_date_ui', 'orbit', ['sweep', 'neon', 'glass', 'neu', 'orbit']);
leftTail += '<div class="spp-gs-row" data-key="spp_date_ui" data-type="select">' +
'<label>日期框样式<span class="spp-gs-hint">作者行里那枚日期走哪一套,五套都是常态可见、悬停加特效。默认「星轨流转」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="sweep"' + (dateUi === 'sweep' ? ' selected' : '') + '>流光微刻</option>' +
'<option value="neon"' + (dateUi === 'neon' ? ' selected' : '') + '>赛博霓虹</option>' +
'<option value="glass"' + (dateUi === 'glass' ? ' selected' : '') + '>幻彩琉璃</option>' +
'<option value="neu"' + (dateUi === 'neu' ? ' selected' : '') + '>拟物压感</option>' +
'<option value="orbit"' + (dateUi === 'orbit' ? ' selected' : '') + '>星轨流转</option>' +
'</select>' +
'</div>';            const catAxis = SPP_CONFIG.pick('spp_cat_scroll', 'h', ['h', 'v']);
leftTail += '<div class="spp-gs-row" data-key="spp_cat_scroll" data-type="select">' +
'<label>分类栏滚轮方向<span class="spp-gs-hint">鼠标停在分类胶囊栏上滚轮时:水平 = 那一栏排成一行、滚轮左右翻页;上下 = 保持换行铺开、滚轮照旧滚页面。默认「水平翻页」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="h"' + (catAxis === 'h' ? ' selected' : '') + '>水平翻页(默认)</option>' +
'<option value="v"' + (catAxis === 'v' ? ' selected' : '') + '>上下(换行铺开)</option>' +
'</select>' +
'</div>';            const stickerAutoBr = SPP_CONFIG.bool('spp_sticker_autobr', true);
leftTail += `<div class="spp-gs-row" data-key="spp_sticker_autobr" data-type="bool">
                <label>贴纸自动换行<span class="spp-gs-hint">往输入框贴表情 / 贴纸时先补一个换行把它推到下一行,连续贴的几枚之间不加空行。勾选 = 自动换行;不勾选 = 就地插入。默认开启</span></label>
                <input type="checkbox" ${stickerAutoBr ? 'checked' : ''}>
            </div>`;
const editorBlockPick = SPP_CONFIG.bool('spp_editor_blockpick', true);
leftTail += `<div class="spp-gs-row" data-key="spp_editor_blockpick" data-type="bool">
                <label>输入框双击选块<span class="spp-gs-hint">在输入框里双击选中一整个 BBCode 单元(含标签本身),而不是浏览器默认的那个「词」。勾选 = 按单元选;不勾选 = 按浏览器默认选词。单击 / 拖选 / 三击不变。默认开启</span></label>
                <input type="checkbox" ${editorBlockPick ? 'checked' : ''}>
            </div>`;
const teaMemo = SPP_CONFIG.bool('spp_tea_filter_memory', true);
leftTail += '<div class="spp-gs-row" data-key="spp_tea_filter_memory" data-type="bool">' +
'<label>茶馆继承上一次的筛选<span class="spp-gs-hint">下次进茶馆时自动套用上一次用过的筛选(时间范围、排序、精华分类)。勾选 = 套用;不勾选 = 每次都从默认开始。想回到全部,在分类子板块那一格点「全部」。默认开启</span></label>' +
'<input type="checkbox" ' + (teaMemo ? 'checked' : '') + '>' +
'</div>';
const coverProbe = SPP_CONFIG.bool('spp_cover_probe', true);
leftTail += '<div class="spp-gs-row" data-key="spp_cover_probe" data-type="bool">' +
'<label>封面图床失效检测<span class="spp-gs-hint">检测版块页卡片封面的图床是否已失效,失效的卡片改用无图卡片显示。勾选 = 检测;不勾选 = 照旧显示封面。默认开启</span></label>' +
'<input type="checkbox" ' + (coverProbe ? 'checked' : '') + '>' +
'</div>';
const pgEnds = SPP_CONFIG.bool('spp_pg_ends', true);
html += `<div class="spp-gs-row" data-key="spp_pg_ends" data-type="bool">
                <label>翻页双箭头(首页 / 末页)<span class="spp-gs-hint">翻页条两端各补一枚双箭头,点一下到第 1 页 / 最后一页。勾选 = 有双箭头;不勾选 = 只剩上一页 / 下一页。默认开启</span></label>
                <input type="checkbox" ${pgEnds ? 'checked' : ''}>
            </div>`;
const searchOrderNow = searchOrder();
html += `<div class="spp-gs-row" data-key="spp_search_order" data-type="select">
                <label>搜索结果排序方式<span class="spp-gs-hint">搜索表单「排序方式」的默认选中项,只改表单默认值、不动地址上已写明的那一种。默认「人气」</span></label>
                <select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">
                    <option value="hits" ${searchOrderNow === 'hits' ? 'selected' : ''}>人气</option>
                    <option value="replies" ${searchOrderNow === 'replies' ? 'selected' : ''}>回复</option>
                    <option value="postdate" ${searchOrderNow === 'postdate' ? 'selected' : ''}>发帖时间</option>
                    <option value="lastpost" ${searchOrderNow === 'lastpost' ? 'selected' : ''}>最后回复</option>
                </select>
            </div>`;
const previewLive = SPP_CONFIG.bool('spp_preview_live', true);
const brandOn = SPP_CONFIG.bool('spp_brand_bar', true);
html += '<div class="spp-gs-row" data-key="spp_brand_bar" data-type="bool">' +
'<label>南+ 品牌条<span class="spp-gs-hint">页眉那两块广告图重排成一条品牌条(两图分列左右、中间一行站名)。勾选 = 用品牌条;不勾选 = 页眉那条广告整条消失、也不占位置。默认开启</span></label>' +
'<input type="checkbox" ' + (brandOn ? 'checked' : '') + '>' +
'</div>';
const brandSlide = SPP_CONFIG.bool('spp_brand_slide', true);
const brandSlideSec = SPP_CONFIG.num('spp_brand_slide_sec', 3, 1, 60);
html += '<div class="spp-gs-row" data-key="spp_brand_slide" data-type="bool">' +
'<label>品牌条右侧图自动轮播<span class="spp-gs-hint">品牌条右侧那一格自动轮播站点那几张广告素材(等比缩放进格子、不裁不拉)。勾选 = 轮播;不勾选 = 只放原来那张静态图。默认开启</span></label>' +
'<input type="checkbox" ' + (brandSlide ? 'checked' : '') + '>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_brand_slide_sec" data-type="number">' +
'<label>轮播间隔 (秒)<span class="spp-gs-hint">品牌条右侧每张素材的切换间隔,可填 1-60(秒);鼠标停上去或页面切到后台时自动暂停。默认 3</span></label>' +
'<input type="number" value="' + brandSlideSec + '" min="1" max="60" step="1">' +
'</div>';
html += `<div class="spp-gs-row" data-key="spp_preview_live" data-type="bool">
                <label>编辑器实时预览<span class="spp-gs-hint">输入框下方常驻一块预览,边打边渲染(图片 / 表情 / 引用块都算)。勾选 = 实时渲染;不勾选 = 点一次「预览」渲染一次。默认开启</span></label>
                <input type="checkbox" ${previewLive ? 'checked' : ''}>
            </div>`;
html += `<div class="spp-gs-act">
                <span class="spp-gs-acthint">把页面上已经替换成彩色块的头像立刻还原成站点原样,并关闭上面的开关</span>
                <button type="button" class="spp-gs-actbtn">恢复默认头像</button>
            </div>`;
html += '</div>';
const readMarkOn = SPP_CONFIG.bool('spp_read_mark', true);
const readDwell  = SPP_CONFIG.num('spp_read_dwell', 5, 0, 600);
const readPurgeN = SPP_CONFIG.num('spp_read_purge', 24, 1, 100000);
const readPurgeU = SPP_CONFIG.pick('spp_read_purge_unit', 'hour', READ_PURGE_UNITS);
html += '<div class="spp-gs-group" data-pane="read"><div class="spp-gs-group-title">已读标记(按大区)</div>';
html += '<div class="spp-gs-row" data-key="spp_read_mark" data-type="bool">' +
'<label>资源区已读标记<span class="spp-gs-hint">打开资源区的帖子并停留够指定的秒数,那帖的卡片就挂上一枚「已读」标识。勾选 = 标记;不勾选 = 不标记。默认开启</span></label>' +
'<input type="checkbox" ' + (readMarkOn ? 'checked' : '') + '>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_read_dwell" data-type="number">' +
'<label>判定已读的停留秒数<span class="spp-gs-hint">帖子页实际停留多久才算「已读」(只算页面可见的时间),可填 0-600(0 = 打开即算)。默认 5</span></label>' +
'<input type="number" value="' + readDwell + '" min="0" max="600" step="1">' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_read_purge" data-type="number">' +
'<label>清除早于 (小时 / 天)<span class="spp-gs-hint">「清除记录」清理早于这个时间的已读记录,可填 1-100000。默认 24</span></label>' +
'<input type="number" value="' + readPurgeN + '" min="1" max="100000" step="1">' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_read_purge_unit" data-type="select">' +
'<label>清除的时间单位<span class="spp-gs-hint">清除阈值的时间单位(小时 / 天)。默认「小时」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="hour"' + (readPurgeU === 'hour' ? ' selected' : '') + '>小时</option>' +
'<option value="day"' + (readPurgeU === 'day' ? ' selected' : '') + '>天</option>' +
'</select>' +
'</div>';
html += '<div class="spp-gs-act" data-pane="read">' +
'<span class="spp-gs-acthint">清理已读记录:按设定的小时 / 天数阈值清掉更早的记录,或清空全部记录(清空要连点两次才生效)。当前共 <span class="spp-read-count">0</span> 条;清完本页的「已读」标识立刻同步,不用刷新</span>' +
'<button type="button" class="spp-read-clear-btn">清除记录</button>' +
'<button type="button" class="spp-read-wipe-btn">清除全部记录</button>' +
'</div>';
html += '</div>';
html += '</div></div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">自备表情 / 贴纸 · 自定义图床</div>';
html += '<div class="spp-packs-cols">';
html += '<div class="spp-gs-row" data-key="spp_custom_emoji" data-type="packs">' +
'<label>自备 Emoji(进 emoji 页)<span class="spp-gs-hint">一行套系名 + 若干行图片直链,套系之间空一行;地址后接一段文本当那一张的悬停提示。留空 = 不生效</span></label>' +
'<div class="spp-packs-eg">例:<br>我的表情<br>https://i.example.com/1.png <span class="spp-eg-note">← 悬停弹「我的表情 1」</span><br>https://i.example.com/2.png 坏笑 <span class="spp-eg-note">← 悬停弹「坏笑」</span><br>同一张图两页都要用:两格各写一次即可<br>png / jpg / webp / gif 都行;动图只画静止首帧<br>想改道到另一页,就在套系名前写 [emoji] 或 [贴纸]</div>' +
'<textarea class="spp-packs-ta" spellcheck="false"></textarea>' +
'<div class="spp-packs-fb"></div>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_custom_sticker" data-type="packs">' +
'<label>自备贴纸(进贴纸页)<span class="spp-gs-hint">一行套系名 + 若干行图片直链,套系之间空一行;地址后接一段文本当那一张的悬停提示。留空 = 不生效</span></label>' +
'<div class="spp-packs-eg">例:<br>我的贴纸<br>https://i.example.com/1.png <span class="spp-eg-note">← 悬停弹「我的贴纸 1」</span><br>https://i.example.com/2.png 坏笑 <span class="spp-eg-note">← 悬停弹「坏笑」</span><br>同一张图两页都要用:两格各写一次即可<br>png / jpg / webp / gif 都行;动图只画静止首帧<br>想改道到另一页,就在套系名前写 [emoji] 或 [贴纸]</div>' +
'<textarea class="spp-packs-ta" spellcheck="false"></textarea>' +
'<div class="spp-packs-fb"></div>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-row" data-key="spp_host_extra" data-type="packs">' +
'<label>自定义图床(粘贴区)<span class="spp-gs-hint">一行一个图床,写成「名称 首页地址 认链域名」;名称进标注的【名称】、首页地址进「图床 ▾」下拉。留空 = 不生效</span></label>' +
'<div class="spp-packs-eg">例:<br>Postimages https://postimages.org/ postlmg.cc <span class="spp-eg-note">← 标注成【Postimages】,认得 postlmg.cc 的链接</span><br>Freeimage https://freeimage.host/ <span class="spp-eg-note">← 认链域名不写,就按首页域名推</span></div>' +
'<textarea class="spp-packs-ta" spellcheck="false"></textarea>' +
'<div class="spp-packs-fb"></div>' +
'</div>';
html += '</div>';
const heatCfg = SPP_CONFIG.heatStyle();
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">热度配色(全站默认 · 七个大区 · 子板块)</div>';
const heatTgtZone = String(GM_getValue(HEAT_TARGET_ZONE_KEY, 'all') || 'all');
const heatTgtBoard = String(GM_getValue(HEAT_TARGET_BOARD_KEY, '') || '');
const heatSelStyle = 'padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;';
let heatTgtOpts = '<option value="all"' + (heatTgtZone === 'all' ? ' selected' : '') + '>全站默认</option>';
HEAT_ZONE_KEYS.forEach(function (z) {
heatTgtOpts += '<option value="' + z + '"' + (heatTgtZone === z ? ' selected' : '') + '>' + HEAT_ZONE_LABEL[z] + '</option>';
});
html += '<div class="spp-gs-row" data-key="spp_heat_target_zone" data-type="select">' +
'<label>要调哪个大区<span class="spp-gs-hint">先选一个大区,下面的分档与配色只对它生效。默认「交流区」</span></label>' +
'<select style="' + heatSelStyle + '">' + heatTgtOpts + '</select>' +
'</div>';
const heatBoardOpts = heatBoardOptions(heatTgtZone, heatTgtBoard) ||
'<option value="">整个大区(统一)</option>';
html += '<div class="spp-gs-row" data-key="spp_heat_target_board" data-type="select"' +
'<label>细分到子板块<span class="spp-gs-hint">只有交流区 / 免空区 / 网赚区有子板块;其余大区是整块,保持「整个大区(统一)」即可。子板块优先于所属大区</span></label>' +
'<select style="' + heatSelStyle + '">' + heatBoardOpts + '</select>' +
'</div>';
html += '<div class="spp-gs-row" data-key="spp_heat_style" data-type="heat_json">' +
'<label>热度分档与配色<span class="spp-gs-hint">' + HEAT_HINT + '</span></label>' +
'<div class="spp-heat-grid">' +
'<span class="spp-heat-cell"><span class="spp-heat-cap">≤ 第一档</span><span class="spp-heat-line">' +
'<input type="number" class="spp-heat-n" data-field="tCold" min="0" max="9999999" step="100" value="' + heatCfg.tCold + '">' +
'<input type="color" class="spp-heat-c" data-field="cCold" value="' + heatCfg.cCold + '" title="热度不超过第一档的颜色(默认赛博青)">' +
'</span></span>' +
'<span class="spp-heat-cell"><span class="spp-heat-cap">≤ 第二档</span><span class="spp-heat-line">' +
'<input type="number" class="spp-heat-n" data-field="tWarm" min="0" max="9999999" step="100" value="' + heatCfg.tWarm + '">' +
'<input type="color" class="spp-heat-c" data-field="cWarm" value="' + heatCfg.cWarm + '" title="热度不超过第二档的颜色(默认霓虹紫)">' +
'</span></span>' +
'<span class="spp-heat-cell"><span class="spp-heat-cap">≤ 第三档</span><span class="spp-heat-line">' +
'<input type="number" class="spp-heat-n" data-field="tHot" min="0" max="9999999" step="100" value="' + heatCfg.tHot + '">' +
'<input type="color" class="spp-heat-c" data-field="cHot" value="' + heatCfg.cHot + '" title="热度不超过第三档的颜色(默认荧光粉)">' +
'</span></span>' +
'<span class="spp-heat-cell"><span class="spp-heat-cap">更高</span><span class="spp-heat-line">' +
'<input type="color" class="spp-heat-c" data-field="cPeak" value="' + heatCfg.cPeak + '" title="热度高于第三档的颜色(默认炽焰橙)">' +
'</span></span>' +
'</div>' +
'</div>';
const heatScopeNow = SPP_CONFIG.heatScope();
html += '<div class="spp-gs-row" data-key="spp_heat_scope" data-type="select">' +
'<label>热度颜色的作用范围<span class="spp-gs-hint">' + HEAT_SCOPE_HINT + '</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="flame"' + (heatScopeNow === 'flame' ? ' selected' : '') + '>火焰 + 回复</option>' +
'<option value="flame_title"' + (heatScopeNow === 'flame_title' ? ' selected' : '') + '>火焰 + 标题颜色</option>' +
'<option value="off"' + (heatScopeNow === 'off' ? ' selected' : '') + '>颜色设置不生效</option>' +
'</select>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">卡片信息显隐(按卡型分别设置)</div>';
const ciView = SPP_CONFIG.pick(CARDINFO_VIEW_KEY, 'hz', ['hz', 'vt', 'ni']);
html += '<div class="spp-gs-row" data-key="spp_cardinfo_view" data-type="select">' +
'<label>要调哪一套(卡型)<span class="spp-gs-hint">横屏 / 竖屏 / 无图 三种卡型的信息显隐项完全相同,这里选一个,下面就只显示那一套。默认「横屏」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="hz"' + (ciView === 'hz' ? ' selected' : '') + '>横屏</option>' +
'<option value="vt"' + (ciView === 'vt' ? ' selected' : '') + '>竖屏</option>' +
'<option value="ni"' + (ciView === 'ni' ? ' selected' : '') + '>无图</option>' +
'</select>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">卡片信息显隐 (横屏)</div>';
const chhz1 = SPP_CONFIG.bool('spp_card_hz_nm', false);
html += '<div class="spp-gs-row" data-key="spp_card_hz_nm" data-type="bool">' +
'<label>不显示用户名<span class="spp-gs-hint">作者名那一串文字。勾选 = 不显示(点作者主页的链接一并收起);不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chhz1 ? 'checked' : '') + '>' +
'</div>';
const chhz2 = SPP_CONFIG.bool('spp_card_hz_dt', false);
html += '<div class="spp-gs-row" data-key="spp_card_hz_dt" data-type="bool">' +
'<label>不显示时间<span class="spp-gs-hint">发布日期那一枚小字。勾选 = 不显示;不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chhz2 ? 'checked' : '') + '>' +
'</div>';
const chhz3 = SPP_CONFIG.bool('spp_card_hz_fav', false);
html += '<div class="spp-gs-row" data-key="spp_card_hz_fav" data-type="bool">' +
'<label>不显示收藏<span class="spp-gs-hint">数据行那一枚收藏按钮。勾选 = 不显示;不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chhz3 ? 'checked' : '') + '>' +
'</div>';
const chhz4 = SPP_CONFIG.bool('spp_card_hz_glow', false);
html += '<div class="spp-gs-row" data-key="spp_card_hz_glow" data-type="bool">' +
'<label>不显示鼠标经过时的边缘光效<span class="spp-gs-hint">鼠标移到卡片上时那圈霓虹描边与内侧辉光。勾选 = 收掉光效、卡片照旧微微上浮;不勾选 = 照常发光。默认关闭</span></label>' +
'<input type="checkbox" ' + (chhz4 ? 'checked' : '') + '>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">卡片信息显隐 (竖屏)</div>';
const chvt1 = SPP_CONFIG.bool('spp_card_vt_nm', false);
html += '<div class="spp-gs-row" data-key="spp_card_vt_nm" data-type="bool">' +
'<label>不显示用户名<span class="spp-gs-hint">作者名那一串文字。勾选 = 不显示(点作者主页的链接一并收起);不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chvt1 ? 'checked' : '') + '>' +
'</div>';
const chvt2 = SPP_CONFIG.bool('spp_card_vt_dt', false);
html += '<div class="spp-gs-row" data-key="spp_card_vt_dt" data-type="bool">' +
'<label>不显示时间<span class="spp-gs-hint">发布日期那一枚小字。勾选 = 不显示;不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chvt2 ? 'checked' : '') + '>' +
'</div>';
const chvt3 = SPP_CONFIG.bool('spp_card_vt_fav', false);
html += '<div class="spp-gs-row" data-key="spp_card_vt_fav" data-type="bool">' +
'<label>不显示收藏<span class="spp-gs-hint">数据行那一枚收藏按钮。勾选 = 不显示;不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chvt3 ? 'checked' : '') + '>' +
'</div>';
const chvt4 = SPP_CONFIG.bool('spp_card_vt_glow', false);
html += '<div class="spp-gs-row" data-key="spp_card_vt_glow" data-type="bool">' +
'<label>不显示鼠标经过时的边缘光效<span class="spp-gs-hint">鼠标移到卡片上时那圈霓虹描边与内侧辉光。勾选 = 收掉光效、卡片照旧微微上浮;不勾选 = 照常发光。默认关闭</span></label>' +
'<input type="checkbox" ' + (chvt4 ? 'checked' : '') + '>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">卡片信息显隐 (无图)</div>';
const chni1 = SPP_CONFIG.bool('spp_card_ni_nm', false);
html += '<div class="spp-gs-row" data-key="spp_card_ni_nm" data-type="bool">' +
'<label>不显示用户名<span class="spp-gs-hint">作者名那一串文字。勾选 = 不显示(点作者主页的链接一并收起);不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chni1 ? 'checked' : '') + '>' +
'</div>';
const chni2 = SPP_CONFIG.bool('spp_card_ni_dt', false);
html += '<div class="spp-gs-row" data-key="spp_card_ni_dt" data-type="bool">' +
'<label>不显示时间<span class="spp-gs-hint">发布日期那一枚小字。勾选 = 不显示;不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chni2 ? 'checked' : '') + '>' +
'</div>';
const chni3 = SPP_CONFIG.bool('spp_card_ni_fav', false);
html += '<div class="spp-gs-row" data-key="spp_card_ni_fav" data-type="bool">' +
'<label>不显示收藏<span class="spp-gs-hint">数据行那一枚收藏按钮。勾选 = 不显示;不勾选 = 照常显示。默认关闭</span></label>' +
'<input type="checkbox" ' + (chni3 ? 'checked' : '') + '>' +
'</div>';
const chni4 = SPP_CONFIG.bool('spp_card_ni_glow', false);
html += '<div class="spp-gs-row" data-key="spp_card_ni_glow" data-type="bool">' +
'<label>不显示鼠标经过时的边缘光效<span class="spp-gs-hint">鼠标移到卡片上时那圈霓虹描边与内侧辉光。勾选 = 收掉光效、卡片照旧微微上浮;不勾选 = 照常发光。默认关闭</span></label>' +
'<input type="checkbox" ' + (chni4 ? 'checked' : '') + '>' +
'</div>';
html += '</div>';
html += '<div class="spp-gs-group"><div class="spp-gs-group-title">收藏按钮 UI</div>';
const favUiNow = SPP_CONFIG.pick('spp_fav_ui', SPP_FAV_UI_DEF, SPP_FAV_UI_ALLOWED);
html += '<div class="spp-gs-row" data-key="spp_fav_ui" data-type="select">' +
'<label>收藏按钮外观<span class="spp-gs-hint">版块页(横屏 / 竖屏 / 无图三类卡都算)底部那一枚收藏按钮的外观,三选一。默认「伴月夜阑」</span></label>' +
'<select style="padding:4px 8px;border:1px solid #e8e3d8;border-radius:4px;font-size:12px;background:#fff;color:#2D2318;cursor:pointer;">' +
'<option value="1"' + (favUiNow === '1' ? ' selected' : '') + '>璀璨星河脉冲</option>' +
'<option value="2"' + (favUiNow === '2' ? ' selected' : '') + '>暗夜霓虹电弧</option>' +
'<option value="6"' + (favUiNow === '6' ? ' selected' : '') + '>伴月夜阑(默认)</option>' +
'</select>' +
'</div>';
html += '</div>';
html += `<div class="spp-gs-btns">
                <button class="spp-gs-cancel">取消</button>
                <button class="spp-gs-save spp-primary">保存并刷新</button>
            </div></div>`;
html = html.replace('<!--SPP-LEFT-TAIL-->', (function () {
const at = leftTail.search(/<div class="spp-gs-row" data-key="spp_read_/);
const head = at >= 0 ? leftTail.slice(0, at) : leftTail;
const tail = at >= 0 ? leftTail.slice(at) : '';
return '<div class="spp-gs-group"><div class="spp-gs-group-title">图片与链接定位</div>' + head + '</div>' +
(tail ? '<div class="spp-gs-group"><div class="spp-gs-group-title">已读</div>' + tail + '</div>' : '');
})());
overlay.innerHTML = html;
document.body.appendChild(overlay);
wirePanelPanes(overlay);
function regroupNavPane(root) {
const NAV_GROUPS = [
['翻页设置', ['spp_nav_step', 'spp_pg_ends', 'spp_pager_nums', 'spp_pager_nums_read', 'spp_board_pl']],
['筛选设置', ['spp_search_order', 'spp_tea_filter_memory']],
['帖子阅读', ['spp_nest_on', 'spp_preload_pages']]
];
const cols = root.querySelectorAll('.spp-gs-col');
if (cols.length < 2) return;
NAV_GROUPS.forEach(function (spec, idx) {
const rows = [];
spec[1].forEach(function (k) {
const r = root.querySelector('.spp-gs-row[data-key="' + k + '"]');
if (r) rows.push(r);
});
if (!rows.length) return;
const box = document.createElement('div');
box.className = 'spp-gs-group';
const t = document.createElement('div');
t.className = 'spp-gs-group-title';
t.textContent = spec[0];
box.appendChild(t);
const host = cols[idx === 0 ? 0 : 1];
host.appendChild(box);
rows.forEach(function (r) { box.appendChild(r); });
});
}
function moveLeftoverLookRows(root) {
const K3 = ['spp_hide_default_avatar', 'spp_floor_hover', 'spp_act_style', 'spp_read_dark'];
const cols = root.querySelectorAll('.spp-gs-col');
if (cols.length < 2) return;
const rows = [];
K3.forEach(function (k) {
const r = cols[0].querySelector('.spp-gs-row[data-key="' + k + '"]');
if (r) rows.push(r);
});
if (!rows.length) return;
const box = document.createElement('div');
box.className = 'spp-gs-group';
const t = document.createElement('div');
t.className = 'spp-gs-group-title';
t.textContent = '贴内设置';
box.appendChild(t);
cols[1].appendChild(box);
rows.forEach(function (r) { box.appendChild(r); });
}
moveLeftoverLookRows(overlay);
regroupNavPane(overlay);
function regroupMiscPane(root) {
const MISC_KEYS = ['spp_host_mark', 'spp_preview_live', 'spp_editor_blockpick'];
const cols = root.querySelectorAll('.spp-gs-col');
if (cols.length < 2) return;
const rows = [];
MISC_KEYS.forEach(function (k) {
const r = root.querySelector('.spp-gs-row[data-key="' + k + '"]');
if (r) rows.push(r);
});
if (!rows.length) return;
const box = document.createElement('div');
box.className = 'spp-gs-group';
const t = document.createElement('div');
t.className = 'spp-gs-group-title';
t.textContent = '文本输入设置';
box.appendChild(t);
cols[1].appendChild(box);
rows.forEach(function (r) { box.appendChild(r); });
}
regroupMiscPane(overlay);
function regroupLookPane(root) {
const LOOK_GROUPS = [
['基础设置', ['spp_page_width', 'spp_font_size', 'spp_read_dark', 'spp_star_motion', 'spp_fx_loop', 'spp_glass'], 0],
['用户状态栏', ['spp_avatar_spin', 'spp_avatar_spin_dir', 'spp_topkey_remember'], 0],
['主页板块', ['spp_secbar_cm', 'spp_secbar_hj'], 1],
];
const cols = root.querySelectorAll('.spp-gs-col');
if (cols.length < 2) return;
LOOK_GROUPS.forEach(function (spec) {
const rows = [];
spec[1].forEach(function (k) {
const r = root.querySelector('.spp-gs-row[data-key="' + k + '"]');
if (r) rows.push(r);
});
if (!rows.length) return;
const box = document.createElement('div');
box.className = 'spp-gs-group';
const t = document.createElement('div');
t.className = 'spp-gs-group-title';
t.textContent = spec[0];
box.appendChild(t);
cols[spec[2]].appendChild(box);
rows.forEach(function (r) { box.appendChild(r); });
});
}
regroupLookPane(overlay);
function regroupCardPane(root) {
const CARD_GROUPS = [
['卡片元素样式设置', ['spp_name_ui', 'spp_date_ui', 'spp_fav_ui', 'spp_card_title_lines', 'spp_card_title_size', 'spp_cover_probe'], 0],
['卡片颜色设置', ['spp_heat_target_zone', 'spp_heat_target_board', 'spp_heat_style', 'spp_heat_scope'], 0, ' spp-cardzone'],
['卡片隐藏信息设置', ['spp_cardinfo_view',
'spp_card_hz_nm', 'spp_card_hz_dt', 'spp_card_hz_fav', 'spp_card_hz_glow',
'spp_card_vt_nm', 'spp_card_vt_dt', 'spp_card_vt_fav', 'spp_card_vt_glow',
'spp_card_ni_nm', 'spp_card_ni_dt', 'spp_card_ni_fav', 'spp_card_ni_glow'], 1]
];
const cols = root.querySelectorAll('.spp-gs-col');
if (cols.length < 2) return;
CARD_GROUPS.forEach(function (spec) {
const rows = [];
spec[1].forEach(function (k) {
const r = root.querySelector('.spp-gs-row[data-key="' + k + '"]');
if (r) rows.push(r);
});
if (!rows.length) return;
const box = document.createElement('div');
box.className = 'spp-gs-group' + (spec[3] || '');
const t = document.createElement('div');
t.className = 'spp-gs-group-title';
t.textContent = spec[0];
box.appendChild(t);
cols[spec[2]].appendChild(box);
rows.forEach(function (r) { box.appendChild(r); });
});
}
regroupCardPane(overlay);
wordDraftLoad();
overlay.querySelectorAll('.spp-gs-row[data-type="packs"]').forEach(function (row) {
const ta = row.querySelector('.spp-packs-ta');
if (!ta) return;
if (isWordRow(row.dataset.key)) { renderWordRow(overlay, row.dataset.key); return; }
ta.value = SPP_CONFIG.text(row.dataset.key, '');
ta.addEventListener('input', function () { renderPacksFeedback(overlay); });
});
bindWordRows(overlay);
renderPacksFeedback(overlay);
renderWordsFeedback(overlay);
try {
const want = [];
SPP_PANEL_DEFS.forEach(g => g.fields.forEach(f => want.push(f.key)));
const got = [];
overlay.querySelectorAll('.spp-gs-row[data-type="img_json"], .spp-gs-row[data-type="number"], .spp-gs-row[data-type="bool"], .spp-gs-row[data-type="select"], .spp-gs-row[data-type="packs"], .spp-gs-row[data-type="heat_json"]')
.forEach(r => got.push(r.dataset.key));
const missing = want.filter(k => got.indexOf(k) < 0);
const extra = got.filter(k => want.indexOf(k) < 0);
if (missing.length || extra.length) {
SPP_INIT.fail.push('设置面板与 SPP_PANEL_DEFS 不一致:缺 [' + missing.join(', ') +
'] 多 [' + extra.join(', ') + ']');
}
window.__SPP_SETTINGS_EARLY = { rows: got.length, hidden: SPP_HIDDEN_SWITCHES.length, fail: SPP_INIT.fail.slice() };
} catch (e) {
SPP_INIT.fail.push('设置面板自检失败:' + errBrief(e));
}
overlay.querySelectorAll('.spp-gs-row[data-type="img_json"], .spp-gs-row[data-type="bool"]').forEach(row => {
const cb = row.querySelector('input[type="checkbox"]');
if (!cb) return;
row.addEventListener('click', e => {
if (e.target.tagName === 'INPUT') return;
cb.checked = !cb.checked;
});
});
overlay.querySelectorAll('input[type="range"]').forEach(slider => {
slider.addEventListener('input', () => {
const valSpan = slider.parentElement.querySelector('.spp-val');
if (valSpan) {
const row = slider.closest('.spp-gs-row');
const key = row ? row.dataset.key : '';
valSpan.textContent = slider.value + (IMG_SLIDER_UNITS[key] || '');
}
});
});
overlay.querySelector('.spp-gs-cancel').addEventListener('click', () => {
overlay.classList.remove('spp-open');
});
overlay.addEventListener('click', e => {
if (e.target === overlay) overlay.classList.remove('spp-open');
});
overlay.querySelector('.spp-gs-save').addEventListener('click', () => {
overlay.querySelectorAll('.spp-gs-row').forEach(row => {
const key = row.dataset.key;
const type = row.dataset.type;
if (row.dataset.sppBase !== undefined && panelRowSig(row) === row.dataset.sppBase) return;
if (type === 'number') {
const input = row.querySelector('input[type="number"]');
const val = parseInt(input.value);
if (!isNaN(val)) GM_setValue(key, val);
} else if (type === 'bool') {
const cb = row.querySelector('input[type="checkbox"]');
if (cb) GM_setValue(key, cb.checked);
} else if (type === 'select') {
const sel = row.querySelector('select');
if (sel) GM_setValue(key, sel.value);
} else if (type === 'packs') {
const ta = row.querySelector('.spp-packs-ta');
if (isWordRow(key)) GM_setValue(key, wordDraftOf(key));
else if (ta) GM_setValue(key, ta.value);
} else if (type === 'heat_json') {
const heatObj = {};
row.querySelectorAll('input[data-field]').forEach(inp => {
if (inp.type === 'color') { heatObj[inp.dataset.field] = inp.value; return; }
const n = parseInt(inp.value, 10);
if (!isNaN(n)) heatObj[inp.dataset.field] = n;
});
GM_setValue(key, JSON.stringify(heatObj));
for (const hc in heatStyleCache) delete heatStyleCache[hc];
if (key !== HEAT_STYLE_KEY) {
const heatUp = SPP_CONFIG.heatStyleOf(HEAT_STYLE_KEY);
let heatSame = true;
['tCold', 'tWarm', 'tHot', 'cCold', 'cWarm', 'cHot', 'cPeak'].forEach(function (f) {
if (heatObj[f] !== undefined && String(heatObj[f]) !== String(heatUp[f])) heatSame = false;
});
if (heatSame) GM_setValue(key, '');
}
const heatScSel = overlay.querySelector('.spp-gs-row[data-key^="spp_heat_scope"] select');
if (heatScSel) {
const heatScKey = heatTargetKeysFromPanel(overlay).scope;
const heatScVal = String(heatScSel.value || 'flame');
if (heatScKey && heatScKey !== HEAT_SCOPE_KEY
&& heatScVal === SPP_CONFIG.heatScopeOf(HEAT_SCOPE_KEY)) {
GM_setValue(heatScKey, '');
} else if (heatScKey) {
GM_setValue(heatScKey, heatScVal);
}
}
const zHit = /^spp_heat_style_(tea|ask|chat|free|money|comic|other)$/.exec(key);
if (zHit) {
const hz = zHit[1];
(HEAT_ZONES[hz] || []).forEach(function (fid) {
GM_setValue('spp_heat_style_b' + fid, '');
GM_setValue('spp_heat_scope_b' + fid, '');
});
}
} else if (type === 'img_json') {
let current = {};
try { current = JSON.parse(GM_getValue(IMG_SETTINGS_KEY, '{}')); } catch (_) {}
if (row.querySelector('input[type="checkbox"]')) {
current[key] = row.querySelector('input[type="checkbox"]').checked;
} else if (row.querySelector('input[type="range"]')) {
current[key] = Number(row.querySelector('input[type="range"]').value);
} else if (row.querySelector('select')) {
current[key] = row.querySelector('select').value;
}
GM_setValue(IMG_SETTINGS_KEY, JSON.stringify(current));
}
});
location.reload();
});
const pinBtn = overlay.querySelector('.spp-pin-test-btn');
if (pinBtn) pinBtn.addEventListener('click', function () {
const rep = overlay.querySelector('.spp-pin-report');
const rows = [];
pinBtn.disabled = true;
pinBtn.textContent = '测试中…';
(async function () {
try {
for (let pi = 0; pi < PIN_HOSTS.length; pi++) {
const host = pinTargetHost(location.hostname.toLowerCase(), PIN_HOSTS[pi][1]);
if (rep) {
rep.textContent = pinReportText(rows, PIN_HOSTS.length) +
'\n正在测 [' + PIN_HOSTS[pi][0] + '] ' + host + ' …(' + (pi + 1) + '/' + PIN_HOSTS.length + ')';
}
rows.push({ tag: PIN_HOSTS[pi][0], host: host, stat: await pinMeasure(host) });
}
} catch (e) {  }
if (rep) rep.textContent = pinReportText(rows, PIN_HOSTS.length);
pinBtn.textContent = '测试全部域名';
pinBtn.disabled = false;
})();
});
const actBtn = overlay.querySelector('.spp-gs-actbtn');
if (actBtn) actBtn.addEventListener('click', () => {
let n = 0;
try { n = (typeof sppAvaRestore === 'function') ? sppAvaRestore() : 0; } catch (e) { n = 0; }
const cb = overlay.querySelector('.spp-gs-row[data-key="spp_hide_default_avatar"] input[type="checkbox"]');
if (cb) cb.checked = false;
actBtn.textContent = n > 0 ? ('已恢复 ' + n + ' 个头像') : '已恢复默认头像';
actBtn.disabled = true;
});
const clearBtn = overlay.querySelector('.spp-read-clear-btn');
if (clearBtn) clearBtn.addEventListener('click', () => {
const numInput = overlay.querySelector('.spp-gs-row[data-key="spp_read_purge"] input[type="number"]');
const unitSel = overlay.querySelector('.spp-gs-row[data-key="spp_read_purge_unit"] select');
const amount = numInput ? parseInt(numInput.value, 10) : 0;
const unit = unitSel ? unitSel.value : 'hour';
let res = { removed: 0, left: 0 };
try { res = readPurgeNow(amount, unit); } catch (e) { res = { removed: 0, left: 0 }; }
const cnt = overlay.querySelector('.spp-read-count');
if (cnt) cnt.textContent = String(res.left);
clearBtn.textContent = res.removed > 0 ? ('已清除 ' + res.removed + ' 条') : '没有更早的记录';
setTimeout(function () { clearBtn.textContent = '清除记录'; }, 2400);
});
let wipeTimer = 0;
const wipeBtn = overlay.querySelector('.spp-read-wipe-btn');
if (wipeBtn) wipeBtn.addEventListener('click', () => {
if (wipeBtn.dataset.sppArmed !== '1') {
wipeBtn.dataset.sppArmed = '1';
wipeBtn.textContent = '确定清空?';
if (wipeTimer) clearTimeout(wipeTimer);
wipeTimer = setTimeout(function () {
wipeBtn.dataset.sppArmed = '';
wipeBtn.textContent = '清除全部记录';
}, 4000);
return;
}
let res = { removed: 0, left: 0 };
try { res = readWipeNow(); } catch (e) { res = { removed: 0, left: 0 }; }
wipeBtn.dataset.sppArmed = '';
if (wipeTimer) { clearTimeout(wipeTimer); wipeTimer = 0; }
const cnt = overlay.querySelector('.spp-read-count');
if (cnt) cnt.textContent = String(res.left);
wipeBtn.textContent = res.removed > 0 ? ('已清空 ' + res.removed + ' 条') : '本来就没有记录';
setTimeout(function () { wipeBtn.textContent = '清除全部记录'; }, 2400);
});
overlay.querySelectorAll('.spp-eh-clear').forEach(btn => {
btn.addEventListener('click', () => {
const pg = btn.getAttribute('data-pg') === 'sticker' ? 'sticker' : 'emoji';
let n = 0;
try { n = histClear(pg); } catch (e) { n = 0; }
const cnt = overlay.querySelector('.spp-eh-n[data-pg="' + pg + '"]');
if (cnt) cnt.textContent = '0';
btn.textContent = n > 0 ? ('已清除 ' + n + ' 条') : '本来就没有记录';
if (typeof SPP_HIST_REFRESH === 'function') {
try { SPP_HIST_REFRESH(); } catch (e) {}
}
setTimeout(function () { btn.textContent = pg === 'sticker' ? '清空贴纸记录' : '清空 emoji 记录'; }, 2400);
});
});
return overlay;
}
let overlay = null;
openSettingsPanel = function () {
if (!overlay) overlay = buildOverlay();
overlay.querySelectorAll('.spp-gs-row[data-type="number"] input').forEach(input => {
const key = input.closest('.spp-gs-row').dataset.key;
const meta = PANEL_FIELD_BY_KEY.get(key) || null;
const d = (meta && meta.def !== undefined) ? meta.def : 1;
const lo = (meta && meta.min !== undefined) ? meta.min : 1;
const hi = (meta && meta.max !== undefined) ? meta.max : 50;
input.value = SPP_CONFIG.num(key, d, lo, hi);
});
overlay.querySelectorAll('.spp-gs-row[data-type="bool"]').forEach(row => {
const cb = row.querySelector('input[type="checkbox"]');
if (cb) cb.checked = SPP_CONFIG.bool(row.dataset.key, panelBoolDef(row.dataset.key));
});
overlay.querySelectorAll('.spp-gs-row[data-type="select"]').forEach(row => {
const sel = row.querySelector('select');
if (!sel) return;
const meta = PANEL_FIELD_BY_KEY.get(row.dataset.key) || null;
const allowed = ((meta && meta.options) || []).map(o => o.v);
const dflt = (meta && meta.def !== undefined) ? meta.def : allowed[0];
sel.value = SPP_CONFIG.pick(row.dataset.key, dflt, allowed);
});
const readCnt = overlay.querySelector('.spp-read-count');
if (readCnt) readCnt.textContent = String(readLog.count());
const imgSettings = SPP_CONFIG.imgSettings();
overlay.querySelectorAll('.spp-gs-row[data-type="img_json"]').forEach(row => {
const key = row.dataset.key;
const cb = row.querySelector('input[type="checkbox"]');
if (cb) { cb.checked = !!imgSettings[key]; return; }
const slider = row.querySelector('input[type="range"]');
if (slider) {
slider.value = imgSettings[key];
const valSpan = row.querySelector('.spp-val');
if (valSpan) {
valSpan.textContent = imgSettings[key] + (IMG_SLIDER_UNITS[key] || '');
}
}
const select = row.querySelector('select');
if (select) { select.value = imgSettings[key] || 'switch'; }
});
wordDraftLoad();
overlay.querySelectorAll('.spp-gs-row[data-type="packs"]').forEach(row => {
const ta = row.querySelector('.spp-packs-ta');
if (!ta) return;
if (isWordRow(row.dataset.key)) { renderWordRow(overlay, row.dataset.key); return; }
ta.value = SPP_CONFIG.text(row.dataset.key, '');
});
renderPacksFeedback(overlay);
renderWordsFeedback(overlay);
heatApplyTarget(overlay);
bindHeatTargetPickers(overlay);
cardinfoViewApply(overlay);
bindCardinfoView(overlay);
overlay.querySelectorAll('.spp-gs-row').forEach(row => { row.dataset.sppBase = panelRowSig(row); });
overlay.classList.add('spp-open');
};
GM_registerMenuCommand('⚙ 打开设置面板', () => {
if (typeof openSettingsPanel !== 'function') {
console.error('[SPP] 设置面板模块未就绪(openSettingsPanel 未赋值),打不开');
return;
}
try { openSettingsPanel(); } catch (e) { console.error('[SPP] 打开设置面板失败', e); }
});
}
const SPP_MIG_WORD_SPLIT = 'spp_mig_words_split';
const SPP_HIDE_WORDS_OLD = 'spp_hide_words';
const SPP_ANY_WORDS_KEY = 'spp_hide_words_any';
const SPP_EXACT_WORDS_KEY = 'spp_hide_words_exact';
function sppWordNorm(v) { return String(v == null ? '' : v).trim().replace(/\s+/g, ''); }
function sppWordLinesRaw(raw) {
return String(raw == null ? '' : raw).split(/\r?\n/).filter(function (l) { return l.trim() !== ''; });
}
function sppWordEncode(w) { return (/^[#\\]/.test(w) ? '\\' : '') + w; }
function sppMigrateWordsSplit() {
if (GM_getValue(SPP_MIG_WORD_SPLIT, null) !== null) return;      
const oldRaw = GM_getValue(SPP_HIDE_WORDS_OLD, '');
const left = [], right = [];
let ignored = 0, dropped = 0;
String(oldRaw == null ? '' : oldRaw).split(/[\r\n]+/).forEach(function (line) {
const s = line.trim().replace(/\s+/g, '');
if (!s || s.charAt(0) === '#') { ignored++; return; }
if (s.charAt(0) === '*') {
if (s.length > 1) left.push(sppWordEncode(s.slice(1)));
else dropped++;
return;
}
right.push(sppWordEncode(s));
});
let added = 0, skipped = 0, failed = '';
[[SPP_ANY_WORDS_KEY, left], [SPP_EXACT_WORDS_KEY, right]].forEach(function (pair) {
const key = pair[0], want = pair[1];
try {
const seen = Object.create(null);
const cur = sppWordLinesRaw(GM_getValue(key, ''));
cur.forEach(function (l) { seen[sppWordNorm(l)] = 1; });
const add = [];
want.forEach(function (l) {
const n = sppWordNorm(l);
if (!n) return;
if (seen[n]) { skipped++; return; }
seen[n] = 1;
add.push(l);
});
if (add.length) GM_setValue(key, cur.concat(add).join('\n'));
added += add.length;
} catch (e) { failed = key; }
});
if (failed) {
console.warn('[SPP] 楼层正文分栏迁移:写 ' + failed + ' 失败,本次不落标记,下次加载重试');
return;
}
GM_setValue(SPP_MIG_WORD_SPLIT, true);
try {
console.info('[SPP] 楼层正文分栏迁移:包含栏 ' + left.length + ' 条 / 完全栏 ' + right.length +
' 条 / 追加 ' + added + ' 条 / 因已存在跳过 ' + skipped + ' 条 / 注释与空行 ' + ignored +
' 行 / 丢弃孤星 ' + dropped + ' 行(旧键 ' + SPP_HIDE_WORDS_OLD + ' 原值保留、不再参与过滤)');
} catch (e2) { }
}
function migrateSettings() {
if (GM_getValue('spp_mig_secbar_mecha', null) === null) {
const was = GM_getValue('spp_secbar_cm', null);
if (was === 'star' || was === 'breathe') GM_setValue('spp_secbar_cm', 'mecha');
GM_setValue('spp_mig_secbar_mecha', true);
}
const IMG_NEW = 'spp_img_settings';
if (GM_getValue(IMG_NEW, null) === null) {
for (const old of ['sp_plus_img_settings', 'spiv_settings']) {
const raw = GM_getValue(old, null);
if (raw !== null) {
try {
const parsed = JSON.parse(raw);
if (parsed && typeof parsed === 'object') {
GM_setValue(IMG_NEW, raw);
break;
}
} catch (_) {  }
}
}
}
const NAV_NEW = 'spp_nav_step';
if (GM_getValue(NAV_NEW, null) === null) {
const oldVal = GM_getValue('sp_plus_nav_step', null);
if (oldVal !== null) GM_setValue(NAV_NEW, oldVal);
}
const IDX_MIG = 'spp_mig_imgidx_off';
if (!GM_getValue(IDX_MIG, false)) {
GM_setValue('spp_imgidx_show', false);
GM_setValue(IDX_MIG, true);
}
const HM_MIG = 'spp_mig_hostmark_off';
if (!GM_getValue(HM_MIG, false)) {
GM_setValue('spp_host_mark', false);
GM_setValue(HM_MIG, true);
}
const HP_MIG = 'spp_mig_heatpalette_neon';
if (!GM_getValue(HP_MIG, false)) {
let hs = null;
try {
const raw = GM_getValue(HEAT_STYLE_KEY, null);
if (raw) {
const o = JSON.parse(raw);
if (o && typeof o === 'object') hs = o;
}
} catch (_) { hs = null; }
if (hs) {
const LEGACY = { cCold: '#FFFFFF', cWarm: '#67C23A', cHot: '#E6A23C', cPeak: '#F56C6C' };
const isLegacy = ['cCold', 'cWarm', 'cHot', 'cPeak'].every(function (k) {
return typeof hs[k] === 'string' && hs[k].trim().toUpperCase() === LEGACY[k];
});
if (isLegacy) {
hs.cCold = HEAT_STYLE_DEFAULTS.cCold;
hs.cWarm = HEAT_STYLE_DEFAULTS.cWarm;
hs.cHot  = HEAT_STYLE_DEFAULTS.cHot;
hs.cPeak = HEAT_STYLE_DEFAULTS.cPeak;
GM_setValue(HEAT_STYLE_KEY, JSON.stringify(hs));
}
}
GM_setValue(HP_MIG, true);
}
sppMigrateWordsSplit();
}
migrateSettings();
function initPageWiden() {
const WIDTH_KEY = 'spp_page_width';
const W_NUM = SPP_CONFIG.num(WIDTH_KEY, 1400, 1200, 1600);
const BG_SCALE = Math.round(4000 * W_NUM / 920);
const W = `min(${W_NUM}px, 100%)`;
GM_addStyle(`
            body { background-size: ${BG_SCALE}px auto !important; }
            #toptool, #header, #main, #footer, .footer { width: ${W} !important; }
            #header > table { width: 920px !important; margin: 0 auto !important; }
            #header > .c, #mainNav { width: auto !important; }
            #infobox { width: auto !important; padding: 6px !important; }
            .contentc, #content, .contentwrap, .bdbA { width: 100% !important; }
            .t { width: auto !important; }
            .t table { width: 100% !important; }
            .t5.t_one { width: auto !important; min-width: 550px; }
        `);
}
let sppPlBridge = null;
/* ==================== 楼层跳转(导航面板 · 「快捷入口」行下方)====================
       ★ t13。只做这一项:在 --nav 页「快捷入口」行之后追加一行,**仅帖子页**(PAGE.read)渲染。
       依据 调研/审查/实施要求.md §6 F-1…F-21。关键约束(实现的每个取舍都对着条款):
       · 控件用自己的类名 `.spp-fj-*`,**不使用** `.spp-page-input` / `.spp-nav-arrow`:
         flow 的 syncPanel 按单例取前者并给它挂 blur 回填、onPanelClick/syncPanel 按索引消费后者。
       · 层号解析:本模块的 sppFjRowNo 是**楼层跳转层号的唯一实现来源**,按 F-4 三步判据:
           ① 主判据 = `.tiptop` 内复制链接锚 `a[onclick*="copyUrl("]` 的锚文本 `GF|B{k}F`;
           ② 回落 = `a[href*="action-quote"]` 里的 `-article-(N)`(全帖绝对层号);
           ③ 再回落 = 整 `.tiptop` 文本的宽松正则(与 flow 内**私有** rowNo 同口径)。
         为什么不导出 flow 的 rowNo:它是 initFlowPaging 的函数内变量(外部拿不到),而且它
         **没有 ① 这条主判据**(只有 ②③);导出它反而会丢掉 F-4 的主判据。故此处自带一份,
         —— **rowNo 的口径若变更,必须同步本函数**(两处必须一致)。
         取不到任何来源 ⇒ 返回 **null(未知)**,**绝不返回 0**(0 是楼主的合法层号)。
       · 跨模块钩子(sppFlowGoto / sppFlowPageOf / sppFlowPageUrl / sppFlowPagesList / SPP_FLOW_SYNC)
         一律**在调用时解析**:它们在 flow 的 onDomReady 里才赋值,而 initNavButtons 注册更早。
       · 不使用 `data-spp-nest-no`(全文件只有读、没有任何写入者,是遗留死路径)。
       · 扫描阶段**只做只读 fetch + DOMParser**,绝不拿 sppFlowGoto / sppFlowPageUrl 去逐候选页探测:
         关闭无刷新翻页(spp_ajax_page=false)时 loadPage 会直接整页跳走(`!ajaxOn() && !fromPop ⇒ fallback`),
         逐候选页探测会把用户一页页甩走。钩子只在**落地**时用。
       · 滚动目标是楼层容器 `#main form[name="delatc"] > div.t5.t2`,**不是**正文节点
         `#read_<pid>`:站点折叠层的正文在 display:none 子树里,对正文节点 scrollIntoView 是空操作。
       · 不使用/不改动下载相关的层号函数(dlFloorTag / dlFindFloor 属另一条需求)。
       ★ t6(本轮):反馈**不再用浮层**。原来七档反馈写进本行的 `.spp-nav-tip` 节点(加类常显)
       并靠共享悬停规则亮起一个"文本板",输入框上还叠了个原生 title 气泡 —— 三者全部移除:
       ① 本行的浮层节点在挂载时从 DOM 摘掉(共享样式与 navRow 工厂一个字都不动,其余行的
          悬停提示照旧);② 输入框的 title 已删,只留 aria-label;③ 新落点 = 本行行内一行短状态
       (静态文档流、宽度撑满本行、默认隐藏),文案压成 ≤8 字短码(七档语义不变),
       完整长文案只走 console.info。生命周期:新提交/换页/整页跳转先清空,终态 15 秒自动清除。 */
const SPP_FJ_MAX_CAND = 4;         
const SPP_FJ_GAP = 400;            
const SPP_FJ_TIMEOUT = 15000;      
const SPP_FJ_RETRY_WAIT = 800;     
const SPP_FJ_STYLE_ID = 'spp-fj-style';
const SPP_FJ_FLOORS = '#main form[name="delatc"] > div.t5.t2';
const SPP_FJ_STATE = { seq: 0, running: false };
const SPP_FJ_NOTE_TTL = 15000;
const SPP_FJ_NOTE_POLL = 1000;
function sppFjErrBrief(e) {
try { return (e && e.name ? e.name : 'Error') + (e && e.message ? ': ' + e.message : ''); }
catch (x) { return '错误'; }
}
let sppFjNoteEl = null;      
let sppFjNoteTimer = 0;      
let sppFjNotePoll = 0;       
let sppFjNoteSig = '';       
function sppFjPageSig() {
try {
const de = document.documentElement;
const here = (de && de.getAttribute) ? (de.getAttribute('data-spp-flow-here') || '') : '';
return String(location.href || '') + '|' + here;
} catch (e) { return ''; }
}
function sppFjNoteStopPoll() {
if (!sppFjNotePoll) return;
try { clearInterval(sppFjNotePoll); } catch (e) { }
sppFjNotePoll = 0;
}
function sppFjClearNote() {
if (sppFjNoteTimer) { try { clearTimeout(sppFjNoteTimer); } catch (e) { } sppFjNoteTimer = 0; }
sppFjNoteStopPoll();
sppFjNoteSig = '';
if (sppFjNoteEl) {
sppFjNoteEl.textContent = '';
try { sppFjNoteEl.style.display = 'none'; } catch (e2) { }
}
}
function sppFjNoteStartPoll() {
if (sppFjNotePoll) return;
try {
sppFjNotePoll = setInterval(function () {
if (!sppFjNoteEl || !sppFjNoteSig) return;
if (sppFjPageSig() !== sppFjNoteSig) sppFjClearNote();
}, SPP_FJ_NOTE_POLL);
} catch (e) { sppFjNotePoll = 0; }
}
function sppFjNote(code, detail, final) {
if (detail) { try { console.info('[楼层跳转] ' + detail); } catch (e) { } }
if (!sppFjNoteEl) return;
sppFjNoteEl.textContent = String(code == null ? '' : code);
try { sppFjNoteEl.style.display = 'block'; } catch (e2) { }
sppFjNoteSig = sppFjPageSig();
if (sppFjNoteTimer) { try { clearTimeout(sppFjNoteTimer); } catch (e3) { } sppFjNoteTimer = 0; }
if (final) sppFjNoteTimer = setTimeout(sppFjClearNote, SPP_FJ_NOTE_TTL);
sppFjNoteStartPoll();
}
function sppFjStyle() {
ensureStyle(SPP_FJ_STYLE_ID, '/* SPP-FJ-BEGIN */\n' +
'#spp-nav-panel .spp-fj-cur { width:52px; height:32px; box-sizing:border-box; border-radius:10px;\n' +
'  display:flex; align-items:center; justify-content:center;\n' +
'  background:var(--spp-dock-cur); border:1.5px dashed var(--spp-dock-acc); transition:all .25s ease; }\n' +
'#spp-nav-panel .spp-fj-cur:hover { box-shadow:0 0 12px var(--spp-dock-glow); }\n' +
'#spp-nav-panel .spp-fj-cur:focus-within { border-color:#34d399;\n' +
'  box-shadow:0 0 16px var(--spp-dock-glowb),inset 0 0 10px rgba(16,185,129,0.3); }\n' +
'#spp-nav-panel .spp-fj-input { width:100%; height:100%; box-sizing:border-box; margin:0; padding:0;\n' +
'  text-align:center; outline:none; cursor:text; background:transparent !important;\n' +
'  border:0 !important; box-shadow:none !important; color:var(--spp-dock-acc);\n' +
'  font-size:11.5px; font-weight:700; line-height:1;\n' +
"  font-family:'SF Mono','Cascadia Code','Consolas',monospace; }\n" +
'#spp-nav-panel .spp-fj-input::placeholder { color:#64748b; font-weight:500; }\n' +
'#spp-nav-panel .spp-fj-input:focus { color:#6ee7b7; }\n' +
'/* ★ t6:反馈改到这一行**行内**的一行短状态(静态文档流:不绝对定位、不描边、不悬浮)。\n' +
'   flex-wrap 只作用在本行([data-spp-floorjump]),共享的行/提示样式一字未改。 */\n' +
'#spp-nav-panel .spp-nav-row[data-spp-floorjump="1"] { flex-wrap:wrap; }\n' +
'#spp-nav-panel .spp-fj-note { display:none; flex:0 0 100%; width:100%; box-sizing:border-box;\n' +
'  margin:4px 0 0; padding:0 2px; white-space:normal; overflow-wrap:anywhere;\n' +
'  text-align:center; font-size:10px; line-height:1.35; color:#94a3b8; }\n' +
'/* SPP-FJ-END */');
}
function sppFjParseInput(raw) {
const s = String(raw == null ? '' : raw).trim().replace(/\s+/g, '');
if (!s) return { ok: false };
if (/^(楼主|gf)$/i.test(s)) return { ok: true, no: 0 };
const m = /^(?:b(\d{1,6})f|(\d{1,6})f?)$/i.exec(s);
if (m) {
const n = Number(m[1] !== undefined ? m[1] : m[2]);
return n === 0 ? { ok: true, no: 0 } : { ok: true, no: n };
}
return { ok: false };
}
function sppFjRowNo(row) {
if (!row || !row.querySelector) return null;
const cp = row.querySelector('.tiptop a[onclick*="copyUrl"]');
if (cp) {
const t = String(cp.textContent == null ? '' : cp.textContent).replace(/\s+/g, '').toUpperCase();
const m1 = /^(GF|B(\d{1,6})F)/.exec(t);
if (m1) return m1[1] === 'GF' ? 0 : Number(m1[2]);
}
const q = row.querySelector('a[href*="action-quote"]');
if (q) {
const m2 = /-article-(\d+)/.exec(String(q.getAttribute('href') || ''));
if (m2) return Number(m2[1]);
}
const tip = row.querySelector('.tiptop');
const t3 = tip ? String(tip.textContent || '').replace(/\s+/g, ' ') : '';
const g = /(?:^|\s)(GF|B(\d+)F)(?:\s|$)/.exec(t3);
if (g) return g[1] === 'GF' ? 0 : Number(g[2]);
return null;                                  
}
function sppFjFindRow(doc, no) {
if (!doc || no === null || no === undefined) return null;
const rows = doc.querySelectorAll(SPP_FJ_FLOORS);
for (let i = 0; i < rows.length; i++) {
if (sppFjRowNo(rows[i]) === no) return rows[i];
}
return null;
}
function sppFjPidOf(row) {
const a = row.querySelector('.tiptop a[onclick*="copyUrl"]');
const m = a && /copyUrl\(\s*'([^']+)'/.exec(a.getAttribute('onclick') || '');
if (m) return m[1];
const el = row.querySelector('.tpc_content [id^="read_"], .tpc_content [id^="p_"]');
return el ? String(el.id || '').replace(/^(read_|p_)/, '') : '';
}
function sppFjExpand(row) {
let n = row, up = 0;
while (n && n !== document.body && up++ < 14) {
try {
if (n.classList && n.classList.contains('spp-nest-hid')) {
const bt = n.querySelector('.spp-nest-toggle, [data-spp-nest-toggle], .spp-nest-fold, .spp-nest-gutter a, .spp-nest-gutter span');
if (bt) bt.click();
}
} catch (e) { }
n = n.parentElement;
}
const box = row.querySelector('.tpc_content');
try {
if (box && getComputedStyle(box).display === 'none') {
const ex = row.querySelector('a[onclick*="expandpuremark"]');
if (ex) ex.click();                   
}
} catch (e2) { }
}
function sppFjAjaxOn() {
try { return SPP_CONFIG.bool('spp_ajax_page', true); } catch (e) { return true; }
}
function sppFjUrlPage() {
const s = location.pathname + location.search;
const hits = s.match(/(?<!f)page[-=](\d+)/gi);
if (hits) return Number(hits[hits.length - 1].match(/(\d+)/)[1]);
if (/page[-=](e|last)\b/i.test(s)) return sppFjTotal() || 1;
return 1;
}
function sppFjTotal() {
try {
const s = SPP_FLOW_SYNC;
if (s && s.siteLast) return Number(s.siteLast) || 1;     
} catch (e) { }
const one = document.querySelector('.pagesone');
const m = one ? String(one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/) : null;
return m ? (Number(m[2]) || 1) : 1;
}
function sppFjPerPage() {
const here = sppFjUrlPage();
if (here <= 1) return 30;
const first = document.querySelector(SPP_FJ_FLOORS + ' .tiptop > .fl');
const m = first ? /(\d+)/.exec(first.textContent || '') : null;
if (!m) return 30;
const per = Math.round((Number(m[1]) - 1) / (here - 1));
return (per > 0 && per < 500) ? per : 30;
}
function sppFjPageUrl(n) {
try {
const f = sppFlowPageUrl;
if (typeof f === 'function') {
const u = f(n);
if (u) return u;
}
} catch (e) { }
const base = location.href.split('#')[0];
if (/(?<!f)page[-=](\d+|e|last)\b/i.test(base)) {
return base.replace(/([\s\S]*)(?<!f)page([-=])(\d+|e|last)\b/i, '$1page$2' + n);
}
return base + (base.indexOf('?') >= 0 ? '&' : '?') + 'page=' + n;
}
function sppFjPageOfDoc(doc) {
const one = doc.querySelector('.pagesone');
const m = one ? String(one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/) : null;
return m ? (Number(m[1]) || 0) : 0;            
}
function sppFjFetchDoc(page, tries) {
const url = sppFjPageUrl(page);
const ctrl = (typeof AbortController === 'function') ? new AbortController() : null;
const to = ctrl ? setTimeout(function () { try { ctrl.abort(); } catch (e) { } }, SPP_FJ_TIMEOUT) : 0;
const opt = { credentials: 'include', cache: 'no-store' };
if (ctrl) opt.signal = ctrl.signal;
return fetch(url, opt).then(function (r) {
if (to) clearTimeout(to);
if (!r.ok) throw new Error('HTTP ' + r.status);
return r.text();
}).then(function (t) {
if (to) clearTimeout(to);
return new DOMParser().parseFromString(t, 'text/html');   
}).catch(function (e) {
if (to) clearTimeout(to);
if (tries <= 0) throw e;
return new Promise(function (res) { setTimeout(res, SPP_FJ_RETRY_WAIT); })
.then(function () { return sppFjFetchDoc(page, tries - 1); });
});
}
function sppFjLoadedPages() {
const out = Object.create(null);
try {
const L = sppFlowPagesList;                 
if (typeof L === 'function') {
(L() || []).forEach(function (x) { if (x && x.page) out[Number(x.page)] = 1; });
}
} catch (e) { }
try {
const s = SPP_FLOW_SYNC;
if (s && s.pages && s.pages.length) s.pages.forEach(function (p) { if (p) out[Number(p)] = 1; });
} catch (e2) { }
try { out[sppFjUrlPage()] = 1; } catch (e3) { }
return out;
}
function sppFjEstimate(want) {
let page = 0, pp = 0;
try {
const f = sppFlowPageOf;                    
if (typeof f === 'function') {
const p = Number(f(want));
if (isFinite(p) && p >= 1) page = p;
}
} catch (e) { }
if (page >= 2) pp = Math.max(1, Math.round(want / (page - 1)));
if (!pp) pp = sppFjPerPage();
if (!pp) pp = 30;
const cand = page || Math.ceil(Math.max(want, 1) / pp);
return { cand: Math.max(1, cand), pp: pp };
}
function sppFjCandidates(est, cur, T, loaded) {
const out = [], seen = Object.create(null);
const t = Math.max(1, Number(T) || 1);
const base = Math.min(t, Math.max(1, Number(est && est.cand) || 1));
const push = function (p) {
if (!p || p < 1 || p > t) return;
if (p === cur) return;                       
if (loaded[p]) return;                       
if (seen[p]) return;                         
seen[p] = 1; out.push(p);
};
push(base);
for (let d = 1; out.length < SPP_FJ_MAX_CAND && d <= t; d++) { push(base + d); push(base - d); }
return out.slice(0, SPP_FJ_MAX_CAND);
}
function sppFjKillImgAlign(why) {
try {
if (typeof window !== 'undefined' && typeof window.__sppAlignKill === 'function') {
window.__sppAlignKill(why || 'floor-jump');
}
} catch (e) { }
}
function sppFjSettle(row, page, want, msg) {
const my = SPP_FJ_STATE.seq;                      
const real = sppFjRowNo(row);
if (real !== want) {
msg('该页无', '落点复核不通过:期望第 ' + want + ' 层,读到的层号是 ' +
(real === null ? '未知' : real) + ',未跳转', true);
return false;
}
sppFjExpand(row);                                 
sppFjKillImgAlign('fj-settle');                   
const jump = function () { try { row.scrollIntoView({ block: 'start' }); } catch (e) { try { row.scrollIntoView(); } catch (e2) { } } };
jump();
setTimeout(function () { if (my === SPP_FJ_STATE.seq) jump(); }, 460);
msg('已到位 ' + (want === 0 ? '楼主' : ('B' + want + 'F')) + (page ? ' 页' + page : ''),
'已定位到' + (want === 0 ? '楼主' : ('B' + want + 'F')) + (page ? '(第 ' + page + ' 页)' : ''), true);
return true;
}
function sppFjLandCross(row, page, want, my, msg) {
const pid = sppFjPidOf(row);
const go = (typeof sppFlowGoto === 'function') ? sppFlowGoto : null;   
if (sppFjAjaxOn() && go) {
sppFjKillImgAlign('fj-cross');                
msg('查询中 换页' + page, '第 ' + page + ' 页找到第 ' + want + ' 层,正在切到该页…');
let ok = true;
try { go(page); } catch (e) { ok = false; }
if (ok) {
let tries = 0;
(function waitRow() {
if (my !== SPP_FJ_STATE.seq) return;                      
const r = sppFjFindRow(document, want);
if (r) { SPP_FJ_STATE.running = false; sppFjSettle(r, page, want, msg); return; }
if (++tries > 20) {
SPP_FJ_STATE.running = false;
msg('没有', '已切到第 ' + page + ' 页,但没有找到第 ' + want + ' 层', true);
return;
}
setTimeout(waitRow, 250);
})();
return;
}
}
SPP_FJ_STATE.running = false;
sppFjClearNote();                                  
sppFjKillImgAlign('fj-jump');                      
msg('查询中 换页' + page, '第 ' + page + ' 页找到第 ' + want + ' 层,正在整页跳过去…');
try { location.href = sppFjPageUrl(page) + (pid ? ('#read_' + pid) : ''); }
catch (e2) { msg('未确认', '跳转失败:' + sppFjErrBrief(e2), true); }
}
function sppFloorJumpMount(pageNav, navRow) {
if (!pageNav || !PAGE.read) return null;
sppFjStyle();
sppFjClearNote();                                  
const pill = document.createElement('div');
pill.className = 'spp-fj-cur';
const input = document.createElement('input');
input.className = 'spp-fj-input';
input.type = 'text';
input.setAttribute('autocomplete', 'off');
input.setAttribute('spellcheck', 'false');
input.setAttribute('placeholder', '楼层');
input.setAttribute('aria-label', '楼层跳转:填 0 / 楼主 / GF,或 12 / B12F,回车提交,Esc 取消');
pill.appendChild(input);
const row = navRow(pill, '楼层跳转(回车提交)', 'acc');
row.setAttribute('data-spp-floorjump', '1');
const tip = row.querySelector('.spp-nav-tip');
if (tip && tip.parentNode) tip.parentNode.removeChild(tip);
const note = document.createElement('div');
note.className = 'spp-fj-note';
try { note.style.display = 'none'; } catch (eN) { }
row.appendChild(note);
sppFjNoteEl = note;                                
pageNav.appendChild(row);                          
try {
if (typeof window !== 'undefined' && window.addEventListener) window.addEventListener('pagehide', sppFjClearNote);
} catch (ePh) { }
const msg = sppFjNote;                             
function cancel() {
if (!SPP_FJ_STATE.running) return;
SPP_FJ_STATE.seq++;                            
SPP_FJ_STATE.running = false;
msg('已停止', '已停止查找', true);
}
function scan(p, my) {
const want = p.no;
const label = want === 0 ? '楼主' : ('第 ' + want + ' 层');
const est = sppFjEstimate(want);
const cur = sppFjUrlPage();
const T = sppFjTotal();
const cands = sppFjCandidates(est, cur, T, sppFjLoadedPages());
if (!cands.length) {
SPP_FJ_STATE.running = false;
msg('没有', '没有可查的候选页:本页没有' + label + ',估算的第 ' + est.cand + ' 页也不可查', true);
return;
}
msg('查询中 0/' + cands.length, '本页没有' + label + ':按每页约 ' + est.pp + ' 层估算在第 ' + est.cand +
' 页,开始查(最多 ' + cands.length + ' 页)…');
const checked = [], unconfirmed = [];
let i = 0;
(function step() {
if (my !== SPP_FJ_STATE.seq) return;
if (i >= cands.length) return finish();
const page = cands[i];
msg('查询中 ' + (i + 1) + '/' + cands.length, '第 ' + page + ' 页抓取中(' + (i + 1) + '/' + cands.length + ')…');
sppFjFetchDoc(page, 1).then(function (doc) {
if (my !== SPP_FJ_STATE.seq) return;
const got = sppFjPageOfDoc(doc);
if (got && got !== page) {             
unconfirmed.push(page);
msg('未确认', '第 ' + page + ' 页抓回来的是第 ' + got + ' 页,该页未确认,继续…');
return next();
}
const hit = sppFjFindRow(doc, want);
if (hit) {
sppFjLandCross(hit, page, want, my, msg);
return;
}
checked.push(page);
msg('该页无', '第 ' + page + ' 页没有' + label + ',继续…');
next();
}).catch(function (e) {
if (my !== SPP_FJ_STATE.seq) return;
unconfirmed.push(page);
msg('未确认', '第 ' + page + ' 页抓取失败(' + sppFjErrBrief(e) + '):本次未能确认该页…');
next();
});
function next() {
if (my !== SPP_FJ_STATE.seq) return;
i++;
if (i >= cands.length) return finish();
setTimeout(step, SPP_FJ_GAP);
}
function finish() {
if (my !== SPP_FJ_STATE.seq) return;
SPP_FJ_STATE.running = false;
const scope = checked.length ? ('本页与第 ' + checked.join('、') + ' 页') : '本页';
if (!unconfirmed.length) {
if (!checked.length) { msg('没有', '本页没有' + label + ',也没有查到别的候选页', true); return; }
msg('没有', scope + '都没有' + label + '(已核对 ' + checked.length + ' 页)', true);
} else {
msg('未确认', '未能确认' + label + '是否存在:第 ' + unconfirmed.join('、') +
' 页未确认(抓取失败或抓回页号不符);' + scope +
(checked.length ? '已核对但没有' : '也没有查到'), true);
}
}
})();
}
function submit() {
const raw = String(input.value == null ? '' : input.value);
sppFjClearNote();                              
const p = sppFjParseInput(input.value);
if (!p.ok) {
msg('填 0/B12F', '无效输入「' + raw + '」:可填 0 / 楼主 / GF,或 12 / B12F(回车提交)', true);
return;                                    
}
SPP_FJ_STATE.seq++;                            
const my = SPP_FJ_STATE.seq;
SPP_FJ_STATE.running = true;
const want = p.no;
const rowNow = sppFjFindRow(document, want);   
if (rowNow) {
SPP_FJ_STATE.running = false;
sppFjSettle(rowNow, 0, want, msg);
return;
}
scan(p, my);
}
input.addEventListener('keydown', function (e) {
if (e.key === 'Enter') { e.preventDefault(); e.stopPropagation(); submit(); return; }
if (e.key === 'Escape') { e.preventDefault(); e.stopPropagation(); cancel(); }
});
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && SPP_FJ_STATE.running) cancel();
});
return row;
}
function initNavButtons() {
const STEP_KEY = 'spp_nav_step';
let pageStep = SPP_CONFIG.num(STEP_KEY, 1, 1, 50);
const plStep = (function () {
try {
if (!PAGE.board) return 0;
const n = SPP_CONFIG.num('spp_board_pl', 0, 0, BOARD_PL_MAX);
return (n > 0) ? Math.min(n, BOARD_PL_MAX) : 0;   
} catch (e) { return 0; }
})();
function getPageInfoFromUrl() {
const url = location.href;
const result = { current: 1, urlPattern: null };
let m = url.match(/(read\.php\?tid-\d+)-page-(\d+)([^#]*\.html)/);
if (m) {
result.current = parseInt(m[2]);
result.urlPattern = url.replace(/-page-\d+/, '-page-{PAGE}').replace(/#.*$/, '');
return result;
}
m = url.match(/(read\.php\?tid-\d+)(\.html)/);
if (m) {
result.current = 1;
result.urlPattern = m[1] + '-page-{PAGE}' + m[2];
return result;
}
m = url.match(/read\.php\?tid=(\d+).*[&?]page=(\d+)/);
if (m) {
result.current = parseInt(m[2]);
result.urlPattern = 'read.php?tid-' + m[1] + '-page-{PAGE}.html';
return result;
}
m = url.match(/read\.php\?tid=(\d+)/);
if (m) {
result.current = 1;
result.urlPattern = 'read.php?tid-' + m[1] + '-page-{PAGE}.html';
return result;
}
m = url.match(/(thread\.php\?fid-\d+)-page-(\d+)([^#]*\.html)/);
if (m) {
result.current = parseInt(m[2]);
result.urlPattern = url.replace(/-page-\d+/, '-page-{PAGE}').replace(/#.*$/, '');
return result;
}
m = url.match(/(thread\.php\?fid-\d+)(\.html)/);
if (m) {
result.current = 1;
result.urlPattern = m[1] + '-page-{PAGE}' + m[2];
return result;
}
m = url.match(/^(.*-page-)(\d+)(\.html)([?#].*)?$/);
if (m) {
result.current = parseInt(m[2]);
result.urlPattern = m[1] + '{PAGE}' + m[3];
return result;
}
return result;
}
function getPageInfoFromDom() {
const containers = document.querySelectorAll('.pages, .pagesone, .f_pager');
for (const c of containers) {
let current = 0, urlPattern = null;
const walk = c.querySelectorAll('a, b, strong, span, font');
for (const el of walk) {
const num = parseInt(el.textContent.trim());
if (isNaN(num) || num < 1) continue;
if (el.tagName === 'A') {
if (!urlPattern) {
const m = el.href.match(/^(.*)-page-\d+(\.[^#]*)/);
if (m) urlPattern = m[1] + '-page-{PAGE}' + m[2];
}
} else {
if (!current) current = num;
}
}
if (current > 0) return { current, urlPattern };
}
return null;
}
function getPagePatternFromDom() {
const containers = document.querySelectorAll('.pages, .pagesone, .f_pager');
for (const c of containers) {
const links = c.querySelectorAll('a[href*="page-"]');
for (const link of links) {
const m = link.href.match(/^(.*)-page-\d+(\.[^#]*)/);
if (m) return m[1] + '-page-{PAGE}' + m[2];
}
}
return null;
}
function getTotalFromDom() {
const one = document.querySelector('.pagesone');
if (one) {
const tm = (one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/);
if (tm) return parseInt(tm[2]);
}
const selectors = ['.pages', '.pagesone', '.f_pager', '[class*="page"]'];
for (const sel of selectors) {
const container = document.querySelector(sel);
if (!container) continue;
let maxPage = 0;
container.querySelectorAll('a').forEach(link => {
const num = parseInt(link.textContent.trim());
if (!isNaN(num) && num > maxPage) maxPage = num;
const m = link.href.match(/page-(\d+)/);
if (m) { const p = parseInt(m[1]); if (p > maxPage) maxPage = p; }
});
if (maxPage > 0) return maxPage;
}
return 0;
}
function hasPagerEvidence() {
if (document.querySelector('.pagesone')) return true;
const links = document.querySelectorAll('a[href*="page-"]');
for (const a of links) {
let path = '';
try { path = new URL(a.getAttribute('href') || '', location.href).pathname; }
catch (err) { path = a.getAttribute('href') || ''; }
if (/\/read\.php$/.test(path)) return true;
}
return false;
}
var sppGlideToken = 0;
function sppGlideAbort() { sppGlideToken++; }
function sppDocMaxTop() {
var h = Math.max(document.documentElement.scrollHeight,
(document.body ? document.body.scrollHeight : 0));
return Math.max(0, h - (window.innerHeight || 0));
}
function sppGlide(getTarget) {
sppGlideAbort();
var token = sppGlideToken;
var fromY = 0, toY = 0, t0 = 0, dur = 0;
var hops = 0, calm = 0, lastH = -1, born = performance.now();
var reduce = false;
try { reduce = !!(window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches); } catch (e0) {}
function gone() { return token !== sppGlideToken; }
function aim(now) {
var to = getTarget(), from = window.pageYOffset;
if (Math.abs(to - from) <= 1) return false;
fromY = from; toY = to; t0 = now;
var dist = Math.abs(to - from);
var cap = hops === 0 ? 700 : 240;
dur = reduce ? 0 : Math.min(cap, 120 + dist * 0.10);
if (dur === 0) { window.scrollTo(0, to); }
return true;
}
function tick() {
if (gone()) { return; }
var now = performance.now();
if (dur > 0 && now - t0 < dur) {
var p = (now - t0) / dur;
var e = p < 0.5 ? 2 * p * p : 1 - Math.pow(-2 * p + 2, 2) / 2;
window.scrollTo(0, Math.round(fromY + (toY - fromY) * e));
window.setTimeout(tick, 16);
return;
}
if (dur > 0) { window.scrollTo(0, toY); dur = 0; }
var target = getTarget(), gap = target - window.pageYOffset;
var grew = target !== lastH;
lastH = target;
if (gap > 2) {
if (hops >= 20 || now - born > 8000) return;
hops++;
if (!aim(now)) return;
calm = 0;
window.setTimeout(tick, 16);
return;
}
calm++;
if (calm >= 3 && !grew) return;
window.setTimeout(tick, 16);
}
if (aim(performance.now())) { window.setTimeout(tick, 16); }
}
function sppToBottom() { sppGlide(sppDocMaxTop); }
function sppScrollTop() { sppGlide(function () { return 0; }); }
(function () {
var stop = function () { sppGlideAbort(); };
['wheel', 'touchstart', 'keydown'].forEach(function (ev) {
window.addEventListener(ev, stop, { passive: true, capture: true });
});
window.addEventListener('mousedown', function (e) {
var t = e.target;
if (t && t.closest && t.closest('#spp-nav-panel')) return;
stop();
}, { passive: true, capture: true });
})();
function buildNavPanel() {
GM_addStyle(`
                #spp-nav-panel {
                    --spp-dock-acc:#10b981;
                    --spp-dock-glow:rgba(16,185,129,0.45);
                    --spp-dock-glowb:rgba(16,185,129,0.85);
                    --spp-dock-cur:rgba(16,185,129,0.12);
                    position:fixed; right:12px; top:50%; transform:translateY(-50%);
                    transition:transform .22s ease;
                    z-index:99998;
                    width:70px; box-sizing:border-box;
                    display:flex; flex-direction:column; align-items:center;
                    padding:12px 6px;
                    background:rgba(6,10,20,0.88);
                    border:1px solid rgba(30,41,59,0.9);
                    border-radius:16px;
                    box-shadow:0 16px 42px -6px rgba(0,0,0,0.85),0 0 20px -3px var(--spp-dock-glow),inset 0 1px 0 rgba(255,255,255,0.14);
                    backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px);
                    user-select:none;
                }
                #spp-nav-panel::before,
                #spp-nav-panel::after {
                    content:''; position:absolute; width:8px; height:8px; pointer-events:none;
                }
                #spp-nav-panel::before { top:7px; left:7px; border-top:2px solid var(--spp-dock-acc); border-left:2px solid var(--spp-dock-acc); border-top-left-radius:4px; }
                #spp-nav-panel::after { bottom:7px; right:7px; border-bottom:2px solid var(--spp-dock-acc); border-right:2px solid var(--spp-dock-acc); border-bottom-right-radius:4px; }
                #spp-nav-panel .spp-nav-row { position:relative; display:flex; justify-content:center; width:100%; }
                #spp-nav-panel .spp-nav-tip {
                    position:absolute; right:100%; top:50%; margin-right:14px;
                    transform:translate(6px,-50%);
                    visibility:hidden; opacity:0; pointer-events:none; z-index:60;
                    transition:opacity .18s ease, transform .18s ease;
                    white-space:nowrap; padding:6px 12px; border-radius:12px;
                    background:rgba(2,6,23,0.95);
                    border:1px solid rgba(51,65,85,0.8);
                    color:#e2e8f0; font-size:11px; font-weight:500;
                    box-shadow:0 25px 50px -12px rgba(0,0,0,0.6);
                    backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px);
                }
                #spp-nav-panel .spp-nav-tip--acc { border-color:rgba(16,185,129,0.7); color:#6ee7b7; font-weight:600; }
                #spp-nav-panel .spp-nav-tip--dim { color:#94a3b8; }
                #spp-nav-panel .spp-nav-row:hover .spp-nav-tip,
                #spp-nav-panel .spp-nav-row:focus-within .spp-nav-tip { visibility:visible; opacity:1; transform:translate(0,-50%); }
                #spp-nav-panel .spp-btn {
                    display:flex; align-items:center; justify-content:center; box-sizing:border-box;
                    width:44px; height:40px; border-radius:12px; color:#94a3b8; font-size:14px;
                    text-decoration:none; cursor:pointer; opacity:1;
                    background:transparent; border:1px solid transparent; outline:none; box-shadow:none;
                    user-select:none;
                    transition:color .2s ease, transform .2s ease, background .2s ease, border-color .2s ease, box-shadow .2s ease;
                }
                #spp-nav-panel .spp-btn:hover { color:#34d399; background:rgba(30,41,59,0.7); }
                #spp-nav-panel .spp-nav-arrow {
                    width:52px; height:42px; border-radius:12px; color:#94a3b8;
                    background:rgba(15,23,42,0.5); border:1px solid rgba(51,65,85,0.6);
                    position:relative; overflow:hidden;
                    transition:all .22s cubic-bezier(0.34,1.56,0.64,1);
                }
                #spp-nav-panel .spp-nav-arrow::before {
                    content:''; position:absolute; inset:0; pointer-events:none; opacity:0;
                    background:radial-gradient(circle at center,var(--spp-dock-acc),transparent 75%);
                    transition:opacity .25s ease;
                }
                #spp-nav-panel .spp-nav-arrow:hover {
                    color:#fff; border-color:var(--spp-dock-acc); background:rgba(15,23,42,0.9);
                    transform:scale(1.06); box-shadow:0 0 16px var(--spp-dock-glow);
                }
                #spp-nav-panel .spp-nav-arrow:hover::before { opacity:0.15; }
                #spp-nav-panel .spp-nav-arrow:active { transform:scale(0.94); }
                #spp-nav-panel .spp-btn.spp-enabled { color:#cbd5e1; }
                #spp-nav-panel .spp-btn.spp-enabled:hover { color:#fff; background:rgba(15,23,42,0.9); }
                #spp-nav-panel .spp-btn.spp-disabled { color:#475569; cursor:not-allowed; opacity:0.38; background:transparent; }
                #spp-nav-panel .spp-btn.spp-disabled:hover { color:#475569; background:transparent; border-color:rgba(51,65,85,0.6); transform:none; box-shadow:none; }
                #spp-nav-panel .spp-btn.spp-disabled:hover::before { opacity:0; }
                #spp-nav-panel .spp-btn.spp-scroll { color:#94a3b8; }
                #spp-nav-panel .spp-btn.spp-scroll:hover { color:#34d399; background:rgba(30,41,59,0.7); }
                #spp-nav-panel .spp-nav-sep {
                    width:40px; height:1px; margin:8px 0; border-radius:9999px; opacity:0.75;
                    background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,0.12) 20%,var(--spp-dock-acc) 50%,rgba(255,255,255,0.12) 80%,transparent 100%);
                }
                #spp-nav-panel .spp-nav-cluster { display:flex; flex-direction:column; align-items:center; width:100%; margin:8px 0; }
                #spp-nav-panel .spp-nav-cur {
                    width:52px; height:32px; box-sizing:border-box; border-radius:10px;
                    display:flex; align-items:center; justify-content:center;
                    background:var(--spp-dock-cur); border:1.5px solid var(--spp-dock-acc);
                    box-shadow:0 0 12px var(--spp-dock-glow),inset 0 0 8px rgba(16,185,129,0.2);
                    transition:all .25s ease;
                }
                #spp-nav-panel .spp-nav-cur:hover { box-shadow:0 0 16px var(--spp-dock-glow),inset 0 0 8px rgba(16,185,129,0.28); }
                #spp-nav-panel .spp-nav-cur:focus-within {
                    border-color:#34d399;
                    box-shadow:0 0 18px var(--spp-dock-glowb),inset 0 0 12px rgba(16,185,129,0.35);
                    transform:scale(1.03);
                }
                #spp-nav-panel .spp-page-input {
                    width:100%; height:100%; box-sizing:border-box; margin:0; padding:0;
                    text-align:center; outline:none; cursor:text;
                    background:transparent !important; border:0 !important; box-shadow:none !important;
                    color:var(--spp-dock-acc); font-size:12px; font-weight:700; line-height:1;
                    font-family:'SF Mono','Cascadia Code','Consolas',monospace;
                    -moz-appearance:textfield; appearance:textfield;
                }
                #spp-nav-panel .spp-page-input:focus { color:#6ee7b7; }
                #spp-nav-panel .spp-page-input::-webkit-outer-spin-button,
                #spp-nav-panel .spp-page-input::-webkit-inner-spin-button { -webkit-appearance:none; margin:0; }
                #spp-nav-panel .spp-nav-hline {
                    width:38px; height:2px; margin:6px auto; border-radius:9999px; position:relative; opacity:0.9;
                    background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,0.3) 20%,var(--spp-dock-acc) 50%,rgba(255,255,255,0.3) 80%,transparent 100%);
                    box-shadow:0 0 8px var(--spp-dock-acc);
                }
                #spp-nav-panel .spp-nav-hline::after {
                    content:''; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
                    width:4px; height:4px; border-radius:50%; background:#fff; box-shadow:0 0 6px var(--spp-dock-acc);
                }
                #spp-nav-panel .spp-nav-tot {
                    width:52px; height:28px; box-sizing:border-box; border-radius:8px;
                    display:flex; align-items:center; justify-content:center;
                    background:rgba(15,23,42,0.9); border:1px solid rgba(71,85,105,0.7);
                    color:#94a3b8; font-size:11px; font-weight:600;
                    font-family:'SF Mono','Cascadia Code','Consolas',monospace;
                    box-shadow:inset 0 1px 4px rgba(0,0,0,0.7);
                    transition:all .2s ease;
                }
                #spp-nav-panel .spp-nav-tot:hover { border-color:rgba(148,163,184,0.9); color:#fff; }
                #spp-nav-panel .spp-nav-ico { display:block; }
                #spp-nav-panel .spp-nav-sm { height:36px; }
                #spp-nav-panel .spp-btn.spp-nav-gear { width:44px; height:44px; position:relative; }
                #spp-nav-panel .spp-nav-page { display:flex; flex-direction:column; align-items:center; width:100%; }
                #spp-nav-panel.spp-nav--sc .spp-nav-page--nav { display:none; }
                #spp-nav-panel:not(.spp-nav--sc) .spp-nav-page--sc { display:none; }
                #spp-nav-panel .spp-btn.spp-nav-sc,
                #spp-nav-panel .spp-btn.spp-nav-sw { width:40px; height:34px; }
                #spp-nav-panel .spp-btn.spp-nav-sc:hover { color:var(--spp-dock-acc); background:rgba(16,185,129,0.10); }
                #spp-nav-panel .spp-btn.spp-nav-gear:hover { color:var(--spp-dock-acc); background:rgba(16,185,129,0.10); }
                #spp-nav-panel .spp-nav-gear-ico {
                    transition:transform .65s cubic-bezier(0.34,1.56,0.64,1), filter .25s ease, color .25s ease;
                }
                #spp-nav-panel .spp-btn.spp-nav-gear:hover .spp-nav-gear-ico {
                    transform:rotate(180deg); color:var(--spp-dock-acc); filter:drop-shadow(0 0 8px var(--spp-dock-acc));
                }
                #spp-nav-panel .spp-nav-dot {
                    position:absolute; top:8px; right:8px; width:6px; height:6px; border-radius:50%;
                    background:var(--spp-dock-acc); pointer-events:none;
                    animation:spp-dock-breathe 2s infinite ease-in-out;
                    /* t122:原来是关键帧里每帧 filter:drop-shadow 发光(主线程逐帧重绘)。这个点只有 6×6px、
                       发光在正常视距下几乎不可辨 ⇒ 改成静态 box-shadow(同一参数、同一颜色):仍是柔和光晕,
                       但不再逐帧重绘。呼吸主体仍是 opacity+transform。 */
                    box-shadow:0 0 5px var(--spp-dock-acc);
                    will-change:transform, opacity;
                }
                @keyframes spp-dock-breathe {
                    0%, 100% { opacity:0.45; transform:scale(0.9); }
                    50% { opacity:1; transform:scale(1.25); }   /* t122:filter:drop-shadow 已改为静态 box-shadow(见 .spp-nav-dot 规则)*/
                }
                #spp-nav-panel .spp-nav-mt { margin-top:4px; }
                #spp-nav-panel.spp-nav--edge { transform:translateX(calc(100% - 36px)) translateY(-50%) !important; }
                #spp-nav-panel.spp-nav--edge:hover,
                #spp-nav-panel.spp-nav--edge:focus-within { transform:translateX(0) translateY(-50%) !important; }
                #spp-nav-panel.spp-nav--hidden { display:none !important; }
                @media (prefers-reduced-motion: reduce) {
                    #spp-nav-panel { transition:none; }
                    #spp-nav-panel .spp-nav-dot { animation:none; }
                    #spp-nav-panel .spp-btn,
                    #spp-nav-panel .spp-nav-arrow,
                    #spp-nav-panel .spp-nav-cur,
                    #spp-nav-panel .spp-nav-tot,
                    #spp-nav-panel .spp-nav-tip,
                    #spp-nav-panel .spp-nav-gear-ico { transition:none; }
                    #spp-nav-panel .spp-nav-arrow:hover { transform:none; }
                    #spp-nav-panel .spp-nav-cur:focus-within { transform:none; }
                    #spp-nav-panel .spp-btn.spp-nav-gear:hover .spp-nav-gear-ico { transform:none; }
                }
            `);
const pageInfo = getPageInfoFromUrl();
let totalPages = getTotalFromDom();
const domInfo = getPageInfoFromDom();
if (domInfo) {
pageInfo.current = domInfo.current;
if (!pageInfo.urlPattern && domInfo.urlPattern) {
pageInfo.urlPattern = domInfo.urlPattern;
}
}
if (!pageInfo.urlPattern) {
const domPattern = getPagePatternFromDom();
if (domPattern) pageInfo.urlPattern = domPattern;
}
if (totalPages <= 0 && (pageInfo.current || 1) <= 1 && !hasPagerEvidence()) totalPages = 1;
const canNavigate = !!pageInfo.urlPattern;
const atFirst = pageInfo.current <= 1;
const atLast = totalPages > 0 && pageInfo.current >= totalPages;
function buildUrl(pageNum) {
if (!pageInfo.urlPattern) return null;
return pageInfo.urlPattern.replace('{PAGE}', pageNum);
}
function navigateToPage(targetPage) {
if (!pageInfo.urlPattern || !isFinite(targetPage)) return;
const upper = totalPages > 0 ? totalPages : Infinity;
const clamped = Math.min(Math.max(1, targetPage), upper);
if (clamped === pageInfo.current) return;
const url = buildUrl(clamped);
if (url) window.location.href = url;
}
const panel = document.createElement('div');
panel.id = 'spp-nav-panel';
const curStep = plStep ? (Math.floor((pageInfo.current - 1) / plStep) + 1) : 0;
const totSteps = (plStep > 0 && totalPages > 0) ? Math.max(1, Math.ceil(totalPages / plStep)) : 0;
function stepStartOf(k) { return 1 + (k - 1) * plStep; }
function stepEndOf(k) { return Math.min(stepStartOf(k) + plStep - 1, totalPages || (stepStartOf(k) + plStep - 1)); }
function navStep(dir) {
if (plStep && sppPlBridge && sppPlBridge.stepGo && sppPlBridge.stepGo(dir)) return;
if (!plStep) { navigateToPage(pageInfo.current + dir * pageStep); return; }
const k2 = curStep + dir;
if (k2 < 1) {
try { window.scrollTo({ top: 0, behavior: 'smooth' }); } catch (err) { window.scrollTo(0, 0); }
return;
}
if (totSteps && k2 > totSteps) return;
navigateToPage(stepStartOf(k2));
}
function jumpToStep(k) {
if (plStep && sppPlBridge && sppPlBridge.stepGoTo && sppPlBridge.stepGoTo(k)) return;
navigateToPage(plStep ? stepStartOf(k) : k);
}
const atLastEff = plStep ? (totSteps > 0 && curStep >= totSteps) : atLast;
const NAV_ICO = {
top: '<svg class="spp-nav-ico" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path stroke-linecap="round" stroke-linejoin="round" d="M5 10l7-7m0 0l7 7m-7-7v18"/></svg>',
prev: '<svg class="spp-nav-ico" width="22" height="22" viewBox="0 0 24 24" fill="currentColor"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></svg>',
next: '<svg class="spp-nav-ico" width="22" height="22" viewBox="0 0 24 24" fill="currentColor"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg>',
bottom: '<svg class="spp-nav-ico" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2"><path stroke-linecap="round" stroke-linejoin="round" d="M19 14l-7 7m0 0l-7-7m7 7V3"/></svg>',
gear: '<svg class="spp-nav-ico spp-nav-gear-ico" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="3"/><path stroke-linecap="round" stroke-linejoin="round" d="M19.4 15a1.65 1.65 0 00.33 1.82l.06.06a2 2 0 11-2.83 2.83l-.06-.06a1.65 1.65 0 00-1.82-.33 1.65 1.65 0 00-1 1.51V21a2 2 0 01-4 0v-.09A1.65 1.65 0 009 19.4a1.65 1.65 0 00-1.82.33l-.06.06a2 2 0 11-2.83-2.83l.06-.06a1.65 1.65 0 00.33-1.82 1.65 1.65 0 00-1.51-1H3a2 2 0 010-4h.09A1.65 1.65 0 004.6 9a1.65 1.65 0 00-.33-1.82l-.06-.06a2 2 0 112.83-2.83l.06.06a1.65 1.65 0 001.82.33H9a1.65 1.65 0 001-1.51V3a2 2 0 014 0v.09a1.65 1.65 0 001 1.51 1.65 1.65 0 001.82-.33l.06-.06a2 2 0 112.83 2.83l-.06.06a1.65 1.65 0 00-.33 1.82V9a1.65 1.65 0 001.51 1H21a2 2 0 010 4h-.09a1.65 1.65 0 00-1.51 1z"/></svg>',
star: '<svg class="spp-nav-ico" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/></svg>',
swap: '<svg class="spp-nav-ico" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M7 4L4 7l3 3M4 7h13M17 20l3-3-3-3M20 17H7"/></svg>',
tea: '<svg class="spp-nav-ico" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M21 11.5a8.38 8.38 0 01-.9 3.8 8.5 8.5 0 01-7.6 4.7 8.38 8.38 0 01-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 01-.9-3.8 8.5 8.5 0 014.7-7.6 8.38 8.38 0 013.8-.9h.5a8.48 8.48 0 018 8v.5z"/></svg>',
pick: '<svg class="spp-nav-ico" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path stroke-linecap="round" stroke-linejoin="round" d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/><polyline stroke-linecap="round" stroke-linejoin="round" points="3.27 6.96 12 12.01 20.73 6.96"/><line stroke-linecap="round" x1="12" y1="22.08" x2="12" y2="12"/></svg>',
search: '<svg class="spp-nav-ico" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line stroke-linecap="round" x1="21" y1="21" x2="16.65" y2="16.65"/></svg>',
globe: '<svg class="spp-nav-ico" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path stroke-linecap="round" stroke-linejoin="round" d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z"/></svg>',
coin: '<svg class="spp-nav-ico" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path stroke-linecap="round" stroke-linejoin="round" d="M15 9.5a3.5 3.5 0 00-3-2h-.5a3 3 0 000 6h1a3 3 0 010 6H12a3.5 3.5 0 01-3-2"/><line stroke-linecap="round" x1="12" y1="5" x2="12" y2="7"/><line stroke-linecap="round" x1="12" y1="17" x2="12" y2="19"/></svg>'
};
function makeBtn(ico, cls, onClick, label) {
const btn = document.createElement('a');
btn.className = 'spp-btn ' + cls;
btn.innerHTML = ico;
btn.href = 'javascript:void(0)';
if (label) btn.setAttribute('aria-label', label);
if (onClick) btn.addEventListener('click', onClick);
return btn;
}
function makeSep() {
const sep = document.createElement('div');
sep.className = 'spp-nav-sep';
return sep;
}
function navRow(el, text, tone) {
const row = document.createElement('div');
row.className = 'spp-nav-row';
const tip = document.createElement('div');
tip.className = 'spp-nav-tip' + (tone ? ' spp-nav-tip--' + tone : '');
tip.appendChild(document.createTextNode(text));
row.appendChild(el);
row.appendChild(tip);
return row;
}
panel.appendChild(navRow(makeBtn(NAV_ICO.top, 'spp-scroll', (e) => {
e.preventDefault(); sppScrollTop();
}, '回到顶部'), '回到顶部', 'acc'));
panel.appendChild(makeSep());
if (canNavigate && !atFirst) {
panel.appendChild(navRow(makeBtn(NAV_ICO.prev, 'spp-enabled spp-nav-arrow', (e) => {
e.preventDefault(); navStep(-1);
}, plStep ? '上一步' : '上一页'), plStep ? ('上一步(一步 ' + plStep + ' 页)') : '上一页'));
} else {
panel.appendChild(navRow(makeBtn(NAV_ICO.prev, 'spp-disabled spp-nav-arrow'), plStep ? '上一步' : '上一页'));
}
if (canNavigate) {
const cluster = document.createElement('div');
cluster.className = 'spp-nav-cluster';
const curBox = document.createElement('div');
curBox.className = 'spp-nav-cur';
const curIn = document.createElement('input');
curIn.className = 'spp-page-input';
curIn.type = 'number';
curIn.min = '1';
curIn.value = plStep ? String(curStep) : String(pageInfo.current);
curIn.setAttribute('aria-label', plStep ? '当前步数,输入后回车跳转' : '当前页码,输入后回车跳转');
if (plStep) {
curIn.title = '当前第 ' + curStep + ' 步(覆盖第 ' + stepStartOf(curStep) + '–' + stepEndOf(curStep) +
' 页;一步 = ' + plStep + ' 页)';
}
curIn.addEventListener('focus', () => { try { curIn.select(); } catch (err) { } });
curIn.addEventListener('blur', () => { curIn.value = plStep ? String(curStep) : String(pageInfo.current); });
curIn.addEventListener('keydown', (e) => {
if (e.key === 'Enter') {
const val = parseInt(curIn.value, 10);
if (!isNaN(val) && val > 0 && val !== (plStep ? curStep : pageInfo.current)) jumpToStep(val);
else curIn.value = plStep ? String(curStep) : String(pageInfo.current);
} else if (e.key === 'Escape') {
curIn.value = plStep ? String(curStep) : String(pageInfo.current);
}
});
curBox.appendChild(curIn);
cluster.appendChild(navRow(curBox, plStep ? '当前步数 (可直接修改)' : '当前页码 (可直接修改)', 'acc'));
const hline = document.createElement('div');
hline.className = 'spp-nav-hline';
cluster.appendChild(hline);
const totBox = document.createElement('div');
totBox.className = 'spp-nav-tot';
totBox.textContent = plStep ? String(totSteps) : (totalPages > 0 ? String(totalPages) : '?');
if (plStep) {
totBox.title = '总步数:一步 = ' + plStep + ' 页,站内共 ' + totalPages + ' 页 ⇒ ' +
Math.ceil(totalPages / plStep) + ' 步';
}
cluster.appendChild(navRow(totBox, plStep ? '总步数' : '总页数', 'dim'));
panel.appendChild(cluster);
}
if (canNavigate && !atLastEff) {
panel.appendChild(navRow(makeBtn(NAV_ICO.next, 'spp-enabled spp-nav-arrow', (e) => {
e.preventDefault(); navStep(1);
}, plStep ? '下一步' : '下一页'), plStep ? ('下一步(一步 ' + plStep + ' 页)') : '下一页'));
} else {
panel.appendChild(navRow(makeBtn(NAV_ICO.next, 'spp-disabled spp-nav-arrow'), plStep ? '下一步' : '下一页'));
}
const downRow = navRow(makeBtn(NAV_ICO.bottom, 'spp-scroll spp-nav-sm', (e) => {
e.preventDefault(); sppToBottom();
}, '直达底部'), '直达底部');
downRow.classList.add('spp-nav-mt');            
panel.appendChild(downRow);
panel.appendChild(makeSep());
const gearBtn = makeBtn(NAV_ICO.gear, 'spp-scroll spp-nav-gear', (e) => {
e.preventDefault(); openSettingsPanel();
}, '进入设置面板');
const gearDot = document.createElement('span');
gearDot.className = 'spp-nav-dot';
gearBtn.appendChild(gearDot);
panel.appendChild(navRow(gearBtn, '进入设置面板', 'acc'));
const swBtn = makeBtn(NAV_ICO.swap, 'spp-nav-sw', function (e) {
e.preventDefault(); panel.classList.add('spp-nav--sc');
}, '快捷入口');
panel.appendChild(navRow(swBtn, '快捷入口', 'acc'));
const pageNav = document.createElement('div');
pageNav.className = 'spp-nav-page spp-nav-page--nav';
while (panel.firstChild) pageNav.appendChild(panel.firstChild);
panel.appendChild(pageNav);
try { sppFloorJumpMount(pageNav, navRow); } catch (eFj) { }
const pageSc = document.createElement('div');
pageSc.className = 'spp-nav-page spp-nav-page--sc';
[['tea', '茶馆', 'thread_new.php?fid-9-page-1.html'],
['pick', '求物', 'thread_new.php?fid-48-page-1.html'],
['search', '检索', 'https://blue-plus.net/search.php'],
['globe', '免空', 'thread_new.php?fid-13-page-1.html'],
['coin', '网赚', 'thread_new.php?fid-170-page-1.html'],
['star', '收藏', 'u.php?action=favor']
].forEach(function (sc) {
const a = document.createElement('a');
a.className = 'spp-btn spp-nav-sc';
a.innerHTML = NAV_ICO[sc[0]];
a.href = sc[2];
a.target = '_blank';
a.rel = 'noopener';
a.setAttribute('aria-label', sc[1]);
pageSc.appendChild(navRow(a, sc[1], 'dim'));
});
const swBack = makeBtn(NAV_ICO.swap, 'spp-nav-sw', function (e) {
e.preventDefault(); panel.classList.remove('spp-nav--sc');
}, '返回导航');
pageSc.appendChild(navRow(swBack, '返回导航', 'acc'));
panel.appendChild(pageSc);
const autoHide = SPP_CONFIG.pick('spp_nav_autohide', 'off', ['off', 'hover', 'always']);
panel.classList.toggle('spp-nav--edge', autoHide === 'hover' || (autoHide === 'off' && SPP_CONFIG.bool('spp_nav_edge', false)));
panel.classList.toggle('spp-nav--hidden', autoHide === 'always');
appendToBodySafe(panel);
document.addEventListener('keydown', (e) => {
if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;
const el = document.activeElement;
if (el && (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' ||
el.isContentEditable === 'true')) return;
if (document.querySelector('.spp-overlay.spp-open')) return;
if (!canNavigate) return;
if (e.key === 'ArrowLeft' ? (plStep ? pageInfo.current <= 1 : atFirst) : (plStep ? atLastEff : atLast)) return;
e.preventDefault();
navStep(e.key === 'ArrowLeft' ? -1 : 1);
});
}
onDomReady(buildNavPanel);
}
function initSearchRescue() {
if (!PAGE.search) return;
const Q = SEARCH || '';
const mKw = Q.match(/[?&\-]keyword-([\s\S]*?)-sid[-=]/) || Q.match(/[?&\-]keyword=([^&]*)/);
if (!mKw) return;
let keyword = '';
try { keyword = decodeURIComponent(String(mKw[1]).replace(/\+/g, ' ')); } catch (e) { return; }
if (!keyword) return;
if (!/[?&\-]sid[-=]\d+/.test(Q)) return;
const mFid = Q.match(/[?&\-]seekfid[-=]([^&\-]+)/) || Q.match(/[?&\-]f_fid[-=]([^&\-]+)/);
const fid = mFid ? mFid[1] : 'all';
const mPage = Q.match(/(?:[?&]|-|^)(?<!f)page[-=](\d+)/);
const want = mPage ? parseInt(mPage[1]) : 1;
onDomReady(function () {
const box = document.querySelector('#main .t');
if (!box || (box.textContent || '').indexOf('没有查找匹配的内容') < 0) return;
const KEY = 'spp_srescue:' + Q;
const CNT = 'spp_srescue_n';
let n = 0;
try {
const last = parseInt(sessionStorage.getItem(KEY) || '0', 10);
n = parseInt(sessionStorage.getItem(CNT) || '0', 10) || 0;
if (last && Date.now() - last < 30000) return;
if (n >= 3) return;
} catch (e) { return; }
try {
sessionStorage.setItem(KEY, String(Date.now()));
sessionStorage.setItem(CNT, String(n + 1));
} catch (e) {  }
const body = new URLSearchParams();
body.set('step', '2');
body.set('keyword', keyword);
body.set('method', 'OR');
body.set('pwuser', '');
body.set('sch_area', '0');
body.set('digest', '0');
body.set('f_fid', fid);
body.set('sch_time', 'all');
body.set('orderway', searchOrder());
body.set('asc', 'DESC');
body.set('submit', '提 交');
fetch('search.php?', { method: 'POST', body: body, credentials: 'include', cache: 'no-store' })
.then(function (res) { return res && res.ok ? res.text() : ''; })
.then(function (html) {
if (!html) return;
const doc = new DOMParser().parseFromString(html, 'text/html');
const a = doc.querySelector('.pages a[href*="page-"]');
if (!a) return;
let abs = '';
try { abs = new URL(a.getAttribute('href') || '', location.href).href; } catch (e) { return; }
let tpl = '';
let m = abs.match(/^(.*-page-)\d+(\.html.*)$/);
if (m) tpl = m[1] + '{PAGE}' + m[2];
if (!tpl) {
m = abs.match(/^(.*[?&]page=)\d+(.*)$/);
if (m) tpl = m[1] + '{PAGE}' + m[2];
}
if (!tpl) return;
let total = 0;
const one = doc.querySelector('.pagesone');
if (one) {
const t = (one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/);
if (t) total = parseInt(t[2]);
}
let to = isFinite(want) && want > 0 ? want : 1;
if (total > 0 && to > total) to = total;
const url = tpl.replace('{PAGE}', to);
console.info('[SPP] 搜索索引已过期,已用同一条件重新搜索,回到第 ' + to + ' 页');
location.replace(url);
})
.catch(function () {  });
});
}
const PACK_A_P = 'https://p.inari.site/usr/2927/';
const PACK_B_P = 'https://cdn.jsdelivr.net/gh/qwqcode/huaji/';
const PACK_EMOJI_OMEGA = [
{ name:'ω 1', url:PACK_A_P+'6ac36cc24c8c0.png' },
{ name:'ω 2', url:PACK_A_P+'6ac36cc2d21cf.png' },
{ name:'ω 3', url:PACK_A_P+'6ac36cc34a2e9.png' },
{ name:'ω 4', url:PACK_A_P+'6ac36cc3ac8c8.png' },
{ name:'ω 5', url:PACK_A_P+'6ac36cc42970b.png' },
{ name:'ω 6', url:PACK_A_P+'6ac36cc619718.png' },
{ name:'ω 7', url:PACK_A_P+'6ac36cc676bf6.png' },
{ name:'ω 8', url:PACK_A_P+'6ac36cc6eeee7.png' },
{ name:'ω 9', url:PACK_A_P+'6ac36cc75a3dd.png' },
{ name:'ω 10', url:PACK_A_P+'6ac36cc7c3a9a.png' },
{ name:'ω 11', url:PACK_A_P+'6ac36cc882341.png' },
{ name:'ω 12', url:PACK_A_P+'6ac36cc8e1703.png' },
{ name:'ω 13', url:PACK_A_P+'6ac36cca6d9c6.png' },
{ name:'ω 14', url:PACK_A_P+'6ac36ccac505a.png' },
{ name:'ω 15', url:PACK_A_P+'6ac36ccb34078.png' },
{ name:'ω 16', url:PACK_A_P+'6ac36ccb91aab.png' },
{ name:'ω 17', url:PACK_A_P+'6ac36ccc1bfe7.png' },
{ name:'ω 18', url:PACK_A_P+'6ac36ccc7e0c5.png' },
{ name:'ω 19', url:PACK_A_P+'6ac36ccda6ed4.png' },
{ name:'ω 20', url:PACK_A_P+'6ac36cce2e768.png' },
{ name:'ω 21', url:PACK_A_P+'6ac36ccebad95.png' },
{ name:'ω 22', url:PACK_A_P+'6ac36ccf3c21c.png' },
{ name:'ω 23', url:PACK_A_P+'6ac36ccfb15e3.png' },
{ name:'ω 24', url:PACK_A_P+'6ac36cd02d1de.png' },
{ name:'ω 25', url:PACK_A_P+'6ac36cd0c0dbb.png' },
{ name:'ω 26', url:PACK_A_P+'6ac36cd1c44d6.png' },
{ name:'ω 27', url:PACK_A_P+'6ac36cd23cd2f.png' },
{ name:'ω 28', url:PACK_A_P+'6ac36cd2b18e3.png' },
{ name:'ω 29', url:PACK_A_P+'6ac36cd359572.png' },
{ name:'ω 30', url:PACK_A_P+'6ac36cd3d01be.png' },
{ name:'ω 31', url:PACK_A_P+'6ac370982fb36.png' },
{ name:'ω 32', url:PACK_A_P+'6ac3709863730.png' },
{ name:'ω 33', url:PACK_A_P+'6ac37098c7ab0.png' },
{ name:'ω 34', url:PACK_A_P+'6ac370992ffb4.png' },
{ name:'ω 35', url:PACK_A_P+'6ac37099a2a20.png' },
{ name:'ω 36', url:PACK_A_P+'6ac3709a126e7.png' },
{ name:'ω 37', url:PACK_A_P+'6ac3709a7039d.png' },
{ name:'ω 38', url:PACK_A_P+'6ac3709ac992f.png' },
{ name:'ω 39', url:PACK_A_P+'6ac3709b2ee2c.png' },
{ name:'ω 40', url:PACK_A_P+'6ac3709c503ca.png' },
{ name:'ω 41', url:PACK_A_P+'6ac3709ca23f6.png' },
{ name:'ω 42', url:PACK_A_P+'6ac3709d0e382.png' },
{ name:'ω 43', url:PACK_A_P+'6ac3709d8073c.png' },
{ name:'ω 44', url:PACK_A_P+'6ac3709de2893.png' },
{ name:'ω 45', url:PACK_A_P+'6ac3709ec70e9.png' },
{ name:'ω 46', url:PACK_A_P+'6ac3709f1338c.png' },
{ name:'ω 47', url:PACK_A_P+'6ac370a04450b.png' },
{ name:'ω 48', url:PACK_A_P+'6ac370a0a1c2d.png' },
{ name:'ω 49', url:PACK_A_P+'6ac370a14ccae.png' },
{ name:'ω 50', url:PACK_A_P+'6ac370a1bb7b9.png' },
{ name:'ω 51', url:PACK_A_P+'6ac370a265551.png' },
{ name:'ω 52', url:PACK_A_P+'6ac370a2c5ed3.png' },
{ name:'ω 53', url:PACK_A_P+'6ac370a341912.png' },
{ name:'ω 54', url:PACK_A_P+'6ac370a485ebc.png' },
{ name:'ω 55', url:PACK_A_P+'6ac370a51b680.png' },
{ name:'ω 56', url:PACK_A_P+'6ac370a5965af.png' },
{ name:'ω 57', url:PACK_A_P+'6ac370a61865c.png' },
{ name:'ω 58', url:PACK_A_P+'6ac370a6dcae4.png' },
{ name:'ω 59', url:PACK_A_P+'6ac370a768392.png' },
{ name:'ω 60', url:PACK_A_P+'6ac370a7d48b3.png' },
{ name:'ω 61', url:PACK_A_P+'6ac370e3ee23a.png' },
{ name:'ω 62', url:PACK_A_P+'6ac370e468a7f.png' },
{ name:'ω 63', url:PACK_A_P+'6ac370e517bdf.png' },
{ name:'ω 64', url:PACK_A_P+'6ac370e570a2a.png' },
{ name:'ω 65', url:PACK_A_P+'6ac370e5f083e.png' },
{ name:'ω 66', url:PACK_A_P+'6ac370e66de92.png' },
{ name:'ω 67', url:PACK_A_P+'6ac370e7149ef.png' },
{ name:'ω 68', url:PACK_A_P+'6ac370e7b23ee.png' },
{ name:'ω 69', url:PACK_A_P+'6ac370e84d568.png' },
{ name:'ω 70', url:PACK_A_P+'6ac370ea32451.png' },
{ name:'ω 71', url:PACK_A_P+'6ac370ec019ab.png' },
{ name:'ω 72', url:PACK_A_P+'6ac370ec80a50.png' },
{ name:'ω 73', url:PACK_A_P+'6ac370ed06038.png' },
{ name:'ω 74', url:PACK_A_P+'6ac370ed676be.png' },
{ name:'ω 75', url:PACK_A_P+'6ac370ee11d7f.png' },
{ name:'ω 76', url:PACK_A_P+'6ac370ee68689.png' },
{ name:'ω 77', url:PACK_A_P+'6ac370eed1d6b.png' },
{ name:'ω 78', url:PACK_A_P+'6ac370f1827df.png' },
{ name:'ω 79', url:PACK_A_P+'6ac370f1d6ca9.png' },
{ name:'ω 80', url:PACK_A_P+'6ac370f252d79.png' },
{ name:'ω 81', url:PACK_A_P+'6ac370f2cd5af.png' },
{ name:'ω 82', url:PACK_A_P+'6ac370f338f6d.png' },
{ name:'ω 83', url:PACK_A_P+'6ac370f397243.png' },
{ name:'ω 84', url:PACK_A_P+'6ac370f4de5df.png' },
{ name:'ω 85', url:PACK_A_P+'6ac370f5527c8.png' },
{ name:'ω 86', url:PACK_A_P+'6ac370f5b1742.png' },
{ name:'ω 87', url:PACK_A_P+'6ac370f623dce.png' },
{ name:'ω 88', url:PACK_A_P+'6ac370f6a8f1e.png' },
{ name:'ω 89', url:PACK_A_P+'6ac370f7230dd.png' },
{ name:'ω 90', url:PACK_A_P+'6ac37161ac45b.png' },
];
const PACK_STICKER_OMEGA = [
{ name:'ω 1', url:PACK_A_P+'6ac36ae563b88.png' },
{ name:'ω 2', url:PACK_A_P+'6ac36ae5f0611.png' },
{ name:'ω 3', url:PACK_A_P+'6ac36ae6939a9.png' },
{ name:'ω 4', url:PACK_A_P+'6ac36ae726d6a.png' },
{ name:'ω 5', url:PACK_A_P+'6ac36ae84d61b.png' },
{ name:'ω 6', url:PACK_A_P+'6ac36ae8b077c.png' },
{ name:'ω 7', url:PACK_A_P+'6ac36ae91bc71.png' },
{ name:'ω 8', url:PACK_A_P+'6ac36ae997b49.png' },
{ name:'ω 9', url:PACK_A_P+'6ac36ae9ea6c3.png' },
{ name:'ω 10', url:PACK_A_P+'6ac36aea47207.png' },
{ name:'ω 11', url:PACK_A_P+'6ac36aea9ee2f.png' },
{ name:'ω 12', url:PACK_A_P+'6ac36aebaf384.png' },
{ name:'ω 13', url:PACK_A_P+'6ac36aec7c756.png' },
{ name:'ω 14', url:PACK_A_P+'6ac36aed61167.png' },
{ name:'ω 15', url:PACK_A_P+'6ac36aedea684.png' },
{ name:'ω 16', url:PACK_A_P+'6ac36aee60825.png' },
{ name:'ω 17', url:PACK_A_P+'6ac36aefabbbb.png' },
{ name:'ω 18', url:PACK_A_P+'6ac36af0d1e40.png' },
{ name:'ω 19', url:PACK_A_P+'6ac36af244d4f.png' },
{ name:'ω 20', url:PACK_A_P+'6ac36af328745.png' },
{ name:'ω 21', url:PACK_A_P+'6ac36af4496f5.png' },
{ name:'ω 22', url:PACK_A_P+'6ac36af675c80.png' },
{ name:'ω 23', url:PACK_A_P+'6ac36af70f070.png' },
{ name:'ω 24', url:PACK_A_P+'6ac36af7b43b1.png' },
{ name:'ω 25', url:PACK_A_P+'6ac36af834a37.png' },
{ name:'ω 26', url:PACK_A_P+'6ac36af89cfab.png' },
{ name:'ω 27', url:PACK_A_P+'6ac36af9ddce6.png' },
{ name:'ω 28', url:PACK_A_P+'6ac36afa43307.png' },
{ name:'ω 29', url:PACK_A_P+'6ac36afaabd04.png' },
{ name:'ω 30', url:PACK_A_P+'6ac36b8490dbe.png' },
{ name:'ω 31', url:PACK_A_P+'6ac36b84c0e24.png' },
{ name:'ω 32', url:PACK_A_P+'6ac36b8528ac1.png' },
{ name:'ω 33', url:PACK_A_P+'6ac36b8647de5.png' },
{ name:'ω 34', url:PACK_A_P+'6ac36b86bf5d0.png' },
{ name:'ω 35', url:PACK_A_P+'6ac36b87317c3.png' },
{ name:'ω 36', url:PACK_A_P+'6ac36b87dd088.png' },
{ name:'ω 37', url:PACK_A_P+'6ac36b8848e86.png' },
{ name:'ω 38', url:PACK_A_P+'6ac36b88bf96e.png' },
{ name:'ω 39', url:PACK_A_P+'6ac36b8a6ce61.png' },
{ name:'ω 40', url:PACK_A_P+'6ac36b8ae3bb5.png' },
{ name:'ω 41', url:PACK_A_P+'6ac36b8be4a68.png' },
{ name:'ω 42', url:PACK_A_P+'6ac36b8c63cb4.png' },
{ name:'ω 43', url:PACK_A_P+'6ac36b8cce889.png' },
{ name:'ω 44', url:PACK_A_P+'6ac36b8d34268.png' },
{ name:'ω 45', url:PACK_A_P+'6ac36b8d8df27.png' },
{ name:'ω 46', url:PACK_A_P+'6ac36b8e62ce5.png' },
{ name:'ω 47', url:PACK_A_P+'6ac36b8fa7f6a.png' },
{ name:'ω 48', url:PACK_A_P+'6ac36b900b440.png' },
{ name:'ω 49', url:PACK_A_P+'6ac36b90b3359.png' },
{ name:'ω 50', url:PACK_A_P+'6ac36b912cb82.png' },
{ name:'ω 51', url:PACK_A_P+'6ac36b91860de.png' },
{ name:'ω 52', url:PACK_A_P+'6ac36b91d8d88.png' },
{ name:'ω 53', url:PACK_A_P+'6ac36b9241fe9.png' },
{ name:'ω 54', url:PACK_A_P+'6ac36b93af25a.png' },
{ name:'ω 55', url:PACK_A_P+'6ac36b94aea5b.png' },
{ name:'ω 56', url:PACK_A_P+'6ac36b953d4cf.png' },
{ name:'ω 57', url:PACK_A_P+'6ac36b95e6acd.png' },
{ name:'ω 58', url:PACK_A_P+'6ac36b96e4e23.png' },
{ name:'ω 59', url:PACK_A_P+'6ac36b9790715.png' },
{ name:'ω 60', url:PACK_A_P+'6ac36bf6e3270.png' },
{ name:'ω 61', url:PACK_A_P+'6ac36bf72a1cb.png' },
{ name:'ω 62', url:PACK_A_P+'6ac36bf796741.png' },
{ name:'ω 63', url:PACK_A_P+'6ac36bf7ef0b7.png' },
{ name:'ω 64', url:PACK_A_P+'6ac36bf8de622.png' },
{ name:'ω 65', url:PACK_A_P+'6ac36bf99fa48.png' },
{ name:'ω 66', url:PACK_A_P+'6ac36bf9ea4ab.png' },
{ name:'ω 67', url:PACK_A_P+'6ac36bfb7eb72.png' },
{ name:'ω 68', url:PACK_A_P+'6ac36bfbcc144.png' },
{ name:'ω 69', url:PACK_A_P+'6ac36bfc52786.png' },
{ name:'ω 70', url:PACK_A_P+'6ac36bfcce20a.png' },
{ name:'ω 71', url:PACK_A_P+'6ac36bfd50bbf.png' },
{ name:'ω 72', url:PACK_A_P+'6ac36bfda5553.png' },
{ name:'ω 73', url:PACK_A_P+'6ac36bff409ff.png' },
{ name:'ω 74', url:PACK_A_P+'6ac36bffe996d.png' },
{ name:'ω 75', url:PACK_A_P+'6ac36c005ee0d.png' },
{ name:'ω 76', url:PACK_A_P+'6ac36c01498d6.png' },
{ name:'ω 77', url:PACK_A_P+'6ac36c017d7b8.png' },
{ name:'ω 78', url:PACK_A_P+'6ac36c023e981.png' },
{ name:'ω 79', url:PACK_A_P+'6ac36c0261873.png' },
{ name:'ω 80', url:PACK_A_P+'6ac36c03146d1.png' },
{ name:'ω 81', url:PACK_A_P+'6ac36c0400794.png' },
{ name:'ω 82', url:PACK_A_P+'6ac36c0451954.png' },
{ name:'ω 83', url:PACK_A_P+'6ac36c04e19c8.png' },
{ name:'ω 84', url:PACK_A_P+'6ac36c05453bb.png' },
{ name:'ω 85', url:PACK_A_P+'6ac36c05a0aa3.png' },
{ name:'ω 86', url:PACK_A_P+'6ac36c0771675.png' },
{ name:'ω 87', url:PACK_A_P+'6ac36c07d93b7.png' },
{ name:'ω 88', url:PACK_A_P+'6ac36c08554b0.png' },
{ name:'ω 89', url:PACK_A_P+'6ac36c08df2c1.png' },
{ name:'ω 90', url:PACK_A_P+'6ac36c652ff36.png' },
];
const PACK_DAIDAIWEI = [
{ name:'呆呆唯 1', url:PACK_A_P+'6ac350666ed15.webp', anim: true },
{ name:'呆呆唯 2', url:PACK_A_P+'6ac350671decb.gif', anim: true },
{ name:'呆呆唯 3', url:PACK_A_P+'6ac35067c3bfc.webp', anim: true },
{ name:'呆呆唯 4', url:PACK_A_P+'6ac350686b5db.webp', anim: true },
{ name:'呆呆唯 5', url:PACK_A_P+'6ac35069d3d0a.gif', anim: true },
{ name:'呆呆唯 6', url:PACK_A_P+'6ac3506a857dd.webp', anim: true },
{ name:'呆呆唯 7', url:PACK_A_P+'6ac3506b654ac.gif', anim: true },
{ name:'呆呆唯 8', url:PACK_A_P+'6ac3506c5e90b.webp', anim: true },
{ name:'呆呆唯 9', url:PACK_A_P+'6ac3506ce5aa9.gif', anim: true },
{ name:'呆呆唯 10', url:PACK_A_P+'6ac3506e0292d.webp', anim: true },
{ name:'呆呆唯 11', url:PACK_A_P+'6ac3506e7e9e8.webp', anim: true },
{ name:'呆呆唯 12', url:PACK_A_P+'6ac3507243273.webp', anim: true },
{ name:'呆呆唯 13', url:PACK_A_P+'6ac35072c1eed.webp', anim: true },
{ name:'呆呆唯 14', url:PACK_A_P+'6ac3507398fef.webp', anim: true },
{ name:'呆呆唯 15', url:PACK_A_P+'6ac350747599a.webp', anim: true },
{ name:'呆呆唯 16', url:PACK_A_P+'6ac3507652ef4.webp', anim: true },
{ name:'呆呆唯 17', url:PACK_A_P+'6ac35076e58c4.webp', anim: true },
{ name:'呆呆唯 18', url:PACK_A_P+'6ac35077acd52.gif', anim: true },
{ name:'呆呆唯 19', url:PACK_A_P+'6ac350783ecd5.webp', anim: true },
{ name:'呆呆唯 20', url:PACK_A_P+'6ac3507926144.gif', anim: true },
{ name:'呆呆唯 21', url:PACK_A_P+'6ac3507a96404.webp', anim: true },
{ name:'呆呆唯 22', url:PACK_A_P+'6ac3507c0f6bf.gif', anim: true },
{ name:'呆呆唯 23', url:PACK_A_P+'6ac3507e4afe0.webp', anim: true },
{ name:'呆呆唯 24', url:PACK_A_P+'6ac3507f0e92a.webp', anim: true },
{ name:'呆呆唯 25', url:PACK_A_P+'6ac3507fb4215.gif', anim: true },
{ name:'呆呆唯 26', url:PACK_A_P+'6ac35080b749d.gif', anim: true },
{ name:'呆呆唯 27', url:PACK_A_P+'6ac35081ae00a.webp', anim: true },
{ name:'呆呆唯 28', url:PACK_A_P+'6ac350828d1c1.webp', anim: true },
{ name:'呆呆唯 29', url:PACK_A_P+'6ac3508364939.webp', anim: true },
{ name:'呆呆唯 30', url:PACK_A_P+'6ac3508443a00.gif', anim: true },
{ name:'呆呆唯 31', url:PACK_A_P+'6ac3595ee1d36.gif', anim: true },
{ name:'呆呆唯 32', url:PACK_A_P+'6ac3595fc8394.webp', anim: true },
{ name:'呆呆唯 33', url:PACK_A_P+'6ac35960ba869.webp', anim: true },
{ name:'呆呆唯 34', url:PACK_A_P+'6ac35963a8076.webp', anim: true },
{ name:'呆呆唯 35', url:PACK_A_P+'6ac3596413db1.webp', anim: true },
{ name:'呆呆唯 36', url:PACK_A_P+'6ac35964d90ae.webp', anim: true },
{ name:'呆呆唯 37', url:PACK_A_P+'6ac35966600d9.webp', anim: true },
{ name:'呆呆唯 38', url:PACK_A_P+'6ac3596706b2c.gif', anim: true },
{ name:'呆呆唯 39', url:PACK_A_P+'6ac3596949bec.webp', anim: true },
{ name:'呆呆唯 40', url:PACK_A_P+'6ac3596948de4.webp', anim: true },
{ name:'呆呆唯 41', url:PACK_A_P+'6ac35974aad63.webp', anim: true },
{ name:'呆呆唯 42', url:PACK_A_P+'6ac35974e905e.gif', anim: true },
{ name:'呆呆唯 43', url:PACK_A_P+'6ac35975357c2.webp', anim: true },
{ name:'呆呆唯 44', url:PACK_A_P+'6ac3597552e05.webp', anim: true },
{ name:'呆呆唯 45', url:PACK_A_P+'6ac3597597a4a.webp', anim: true },
{ name:'呆呆唯 46', url:PACK_A_P+'6ac35977e4a2d.webp', anim: true },
{ name:'呆呆唯 47', url:PACK_A_P+'6ac359788bc2f.webp', anim: true },
{ name:'呆呆唯 48', url:PACK_A_P+'6ac35988104fb.webp', anim: true },
{ name:'呆呆唯 49', url:PACK_A_P+'6ac359884ddf7.gif', anim: true },
{ name:'呆呆唯 50', url:PACK_A_P+'6ac359888e59c.webp', anim: true },
{ name:'呆呆唯 51', url:PACK_A_P+'6ac35989017f5.webp', anim: true },
{ name:'呆呆唯 52', url:PACK_A_P+'6ac35989d57e4.webp', anim: true },
];
const PACK_MAOERXIAOYI = [
{ name:'猫儿小忆 1', url:PACK_A_P+'6ac35d3337cc3.gif', anim: true },
{ name:'猫儿小忆 2', url:PACK_A_P+'6ac3609050085.webp', anim: true },
{ name:'猫儿小忆 3', url:PACK_A_P+'6ac3609097720.webp', anim: true },
{ name:'猫儿小忆 4', url:PACK_A_P+'6ac36090df8d7.webp', anim: true },
{ name:'猫儿小忆 5', url:PACK_A_P+'6ac3609160b1b.webp', anim: true },
{ name:'猫儿小忆 6', url:PACK_A_P+'6ac36091c29c6.webp', anim: true },
{ name:'猫儿小忆 7', url:PACK_A_P+'6ac36092d52b7.webp', anim: true },
{ name:'猫儿小忆 8', url:PACK_A_P+'6ac36092d56e7.webp', anim: true },
{ name:'猫儿小忆 9', url:PACK_A_P+'6ac360937822e.webp', anim: true },
{ name:'猫儿小忆 10', url:PACK_A_P+'6ac360941959e.webp', anim: true },
{ name:'猫儿小忆 11', url:PACK_A_P+'6ac36094bf620.webp', anim: true },
{ name:'猫儿小忆 12', url:PACK_A_P+'6ac360955cb95.webp', anim: true },
{ name:'猫儿小忆 13', url:PACK_A_P+'6ac36095f2e7e.webp', anim: true },
{ name:'猫儿小忆 14', url:PACK_A_P+'6ac36098c66d0.webp', anim: true },
{ name:'猫儿小忆 15', url:PACK_A_P+'6ac360996e413.webp', anim: true },
{ name:'猫儿小忆 16', url:PACK_A_P+'6ac3609a1e840.webp', anim: true },
{ name:'猫儿小忆 17', url:PACK_A_P+'6ac3609acb9e1.webp', anim: true },
{ name:'猫儿小忆 18', url:PACK_A_P+'6ac3609b2dedf.webp', anim: true },
{ name:'猫儿小忆 19', url:PACK_A_P+'6ac3609bd44bf.webp', anim: true },
{ name:'猫儿小忆 20', url:PACK_A_P+'6ac3609c3f88d.webp', anim: true },
{ name:'猫儿小忆 21', url:PACK_A_P+'6ac3609cb353a.webp', anim: true },
{ name:'猫儿小忆 22', url:PACK_A_P+'6ac3609d8f184.webp', anim: true },
{ name:'猫儿小忆 23', url:PACK_A_P+'6ac3609e2b771.webp', anim: true },
{ name:'猫儿小忆 24', url:PACK_A_P+'6ac360a09ad64.webp', anim: true },
{ name:'猫儿小忆 25', url:PACK_A_P+'6ac360a227462.webp', anim: true },
{ name:'猫儿小忆 26', url:PACK_A_P+'6ac360a36ee8d.webp', anim: true },
{ name:'猫儿小忆 27', url:PACK_A_P+'6ac360a4d9c02.webp', anim: true },
{ name:'猫儿小忆 28', url:PACK_A_P+'6ac360a562b4d.webp', anim: true },
{ name:'猫儿小忆 29', url:PACK_A_P+'6ac360a631b21.webp', anim: true },
{ name:'猫儿小忆 30', url:PACK_A_P+'6ac360a9ddc4a.webp', anim: true },
{ name:'猫儿小忆 31', url:PACK_A_P+'6ac360aa4b6b1.webp', anim: true },
{ name:'猫儿小忆 32', url:PACK_A_P+'6ac36175a4d5b.webp', anim: true },
{ name:'猫儿小忆 33', url:PACK_A_P+'6ac3617602fcd.webp', anim: true },
{ name:'猫儿小忆 34', url:PACK_A_P+'6ac361770d4dd.webp', anim: true },
{ name:'猫儿小忆 35', url:PACK_A_P+'6ac3617792eaa.webp', anim: true },
{ name:'猫儿小忆 36', url:PACK_A_P+'6ac36177f1ec9.webp', anim: true },
{ name:'猫儿小忆 37', url:PACK_A_P+'6ac36178b6091.webp', anim: true },
{ name:'猫儿小忆 38', url:PACK_A_P+'6ac361797b888.webp', anim: true },
{ name:'猫儿小忆 39', url:PACK_A_P+'6ac36179a701b.webp', anim: true },
{ name:'猫儿小忆 40', url:PACK_A_P+'6ac3617bed7d1.webp', anim: true },
{ name:'猫儿小忆 41', url:PACK_A_P+'6ac3617c73eaa.webp', anim: true },
{ name:'猫儿小忆 42', url:PACK_A_P+'6ac3617d48e5f.webp', anim: true },
{ name:'猫儿小忆 43', url:PACK_A_P+'6ac3617df2292.webp', anim: true },
{ name:'猫儿小忆 44', url:PACK_A_P+'6ac3617e71285.webp', anim: true },
{ name:'猫儿小忆 45', url:PACK_A_P+'6ac3617f7c655.webp', anim: true },
{ name:'猫儿小忆 46', url:PACK_A_P+'6ac361803c9d7.webp', anim: true },
{ name:'猫儿小忆 47', url:PACK_A_P+'6ac361823d9d0.webp', anim: true },
{ name:'猫儿小忆 48', url:PACK_A_P+'6ac36182bc368.webp', anim: true },
{ name:'猫儿小忆 49', url:PACK_A_P+'6ac3618362e5b.webp', anim: true },
{ name:'猫儿小忆 50', url:PACK_A_P+'6ac36183ebc9c.webp', anim: true },
{ name:'猫儿小忆 51', url:PACK_A_P+'6ac3618476d5d.webp', anim: true },
{ name:'猫儿小忆 52', url:PACK_A_P+'6ac36184df910.webp', anim: true },
{ name:'猫儿小忆 53', url:PACK_A_P+'6ac3618549edc.webp', anim: true },
{ name:'猫儿小忆 54', url:PACK_A_P+'6ac36185cf70f.webp', anim: true },
{ name:'猫儿小忆 55', url:PACK_A_P+'6ac361868b583.webp', anim: true },
{ name:'猫儿小忆 56', url:PACK_A_P+'6ac361870820d.webp', anim: true },
{ name:'猫儿小忆 57', url:PACK_A_P+'6ac36189d5cad.webp', anim: true },
{ name:'猫儿小忆 58', url:PACK_A_P+'6ac3618a5140d.webp', anim: true },
{ name:'猫儿小忆 59', url:PACK_A_P+'6ac3618b1ce0f.webp', anim: true },
{ name:'猫儿小忆 60', url:PACK_A_P+'6ac3618c387e5.webp', anim: true },
{ name:'猫儿小忆 61', url:PACK_A_P+'6ac3618cd9e11.webp', anim: true },
{ name:'猫儿小忆 62', url:PACK_A_P+'6ac3629e9bb12.webp', anim: true },
{ name:'猫儿小忆 63', url:PACK_A_P+'6ac3629ee2417.webp', anim: true },
{ name:'猫儿小忆 64', url:PACK_A_P+'6ac3629f5dc4a.webp', anim: true },
{ name:'猫儿小忆 65', url:PACK_A_P+'6ac3629fb9c7e.webp', anim: true },
{ name:'猫儿小忆 66', url:PACK_A_P+'6ac362a01ae37.webp', anim: true },
{ name:'猫儿小忆 67', url:PACK_A_P+'6ac362a07b9de.webp', anim: true },
{ name:'猫儿小忆 68', url:PACK_A_P+'6ac362a123db4.webp', anim: true },
{ name:'猫儿小忆 69', url:PACK_A_P+'6ac362a49a4b4.webp', anim: true },
{ name:'猫儿小忆 70', url:PACK_A_P+'6ac362a654a1c.webp', anim: true },
{ name:'猫儿小忆 71', url:PACK_A_P+'6ac362a6caab1.webp', anim: true },
{ name:'猫儿小忆 72', url:PACK_A_P+'6ac362a73c6a2.webp', anim: true },
{ name:'猫儿小忆 73', url:PACK_A_P+'6ac362a798a50.webp', anim: true },
{ name:'猫儿小忆 74', url:PACK_A_P+'6ac362a80ad83.webp', anim: true },
{ name:'猫儿小忆 75', url:PACK_A_P+'6ac362a869c44.webp', anim: true },
{ name:'猫儿小忆 76', url:PACK_A_P+'6ac362a9e1e38.webp', anim: true },
{ name:'猫儿小忆 77', url:PACK_A_P+'6ac362aa3229f.webp', anim: true },
{ name:'猫儿小忆 78', url:PACK_A_P+'6ac362aa980d7.webp', anim: true },
{ name:'猫儿小忆 79', url:PACK_A_P+'6ac362ab7cb83.webp', anim: true },
{ name:'猫儿小忆 80', url:PACK_A_P+'6ac362ac8d08f.webp', anim: true },
{ name:'猫儿小忆 81', url:PACK_A_P+'6ac362acc92b6.webp', anim: true },
{ name:'猫儿小忆 82', url:PACK_A_P+'6ac362acd0f5e.webp', anim: true },
{ name:'猫儿小忆 83', url:PACK_A_P+'6ac362ae0a3e9.webp', anim: true },
{ name:'猫儿小忆 84', url:PACK_A_P+'6ac362ae71a7f.webp', anim: true },
{ name:'猫儿小忆 85', url:PACK_A_P+'6ac362af54aa3.webp', anim: true },
{ name:'猫儿小忆 86', url:PACK_A_P+'6ac362afaa16f.webp', anim: true },
{ name:'猫儿小忆 87', url:PACK_A_P+'6ac362b041608.webp', anim: true },
{ name:'猫儿小忆 88', url:PACK_A_P+'6ac362b0943fb.webp', anim: true },
{ name:'猫儿小忆 89', url:PACK_A_P+'6ac362b109377.webp', anim: true },
{ name:'猫儿小忆 90', url:PACK_A_P+'6ac362b15853e.webp', anim: true },
{ name:'猫儿小忆 91', url:PACK_A_P+'6ac362b3285a4.webp', anim: true },
{ name:'猫儿小忆 92', url:PACK_A_P+'6ac3676ecf480.webp', anim: true },
{ name:'猫儿小忆 93', url:PACK_A_P+'6ac3676ed3222.webp', anim: true },
{ name:'猫儿小忆 94', url:PACK_A_P+'6ac3676f04c0e.webp', anim: true },
{ name:'猫儿小忆 95', url:PACK_A_P+'6ac3676f77a24.webp', anim: true },
{ name:'猫儿小忆 96', url:PACK_A_P+'6ac3676fc9a42.webp', anim: true },
{ name:'猫儿小忆 97', url:PACK_A_P+'6ac367703d558.webp', anim: true },
{ name:'猫儿小忆 98', url:PACK_A_P+'6ac367720a74f.webp', anim: true },
{ name:'猫儿小忆 99', url:PACK_A_P+'6ac367728253f.webp', anim: true },
{ name:'猫儿小忆 100', url:PACK_A_P+'6ac36772e5f7f.webp', anim: true },
{ name:'猫儿小忆 101', url:PACK_A_P+'6ac36773526ca.webp', anim: true },
{ name:'猫儿小忆 102', url:PACK_A_P+'6ac36773b1371.webp', anim: true },
{ name:'猫儿小忆 103', url:PACK_A_P+'6ac3677414876.webp', anim: true },
{ name:'猫儿小忆 104', url:PACK_A_P+'6ac3677475447.webp', anim: true },
{ name:'猫儿小忆 105', url:PACK_A_P+'6ac36775c5a77.webp', anim: true },
{ name:'猫儿小忆 106', url:PACK_A_P+'6ac3677634d2e.webp', anim: true },
{ name:'猫儿小忆 107', url:PACK_A_P+'6ac367769fff8.webp', anim: true },
{ name:'猫儿小忆 108', url:PACK_A_P+'6ac367770f8e0.webp', anim: true },
{ name:'猫儿小忆 109', url:PACK_A_P+'6ac3677781a15.webp', anim: true },
{ name:'猫儿小忆 110', url:PACK_A_P+'6ac367785b425.webp', anim: true },
{ name:'猫儿小忆 111', url:PACK_A_P+'6ac367795473d.webp', anim: true },
{ name:'猫儿小忆 112', url:PACK_A_P+'6ac36779ae238.webp', anim: true },
{ name:'猫儿小忆 113', url:PACK_A_P+'6ac3677a45798.webp', anim: true },
{ name:'猫儿小忆 114', url:PACK_A_P+'6ac3677a6b8b9.webp', anim: true },
{ name:'猫儿小忆 115', url:PACK_A_P+'6ac3677aec03b.webp', anim: true },
{ name:'猫儿小忆 116', url:PACK_A_P+'6ac3677b6646b.webp', anim: true },
{ name:'猫儿小忆 117', url:PACK_A_P+'6ac3677beb919.webp', anim: true },
{ name:'猫儿小忆 118', url:PACK_A_P+'6ac3677e05976.webp', anim: true },
{ name:'猫儿小忆 119', url:PACK_A_P+'6ac3677e3d66e.webp', anim: true },
{ name:'猫儿小忆 120', url:PACK_A_P+'6ac3677e9570e.webp', anim: true },
{ name:'猫儿小忆 121', url:PACK_A_P+'6ac3677f0fe5b.webp', anim: true },
];
const PACK_SHISHOUXIANG = [
{ name:'是,首相 1', url:PACK_A_P+'6ac368b782af0.png' },
{ name:'是,首相 2', url:PACK_A_P+'6ac368b83e708.png' },
{ name:'是,首相 3', url:PACK_A_P+'6ac368b91b7f2.png' },
{ name:'是,首相 4', url:PACK_A_P+'6ac368bc1821c.png' },
{ name:'是,首相 5', url:PACK_A_P+'6ac368bcc530c.png' },
{ name:'是,首相 6', url:PACK_A_P+'6ac368bd2c2bd.png' },
{ name:'是,首相 7', url:PACK_A_P+'6ac368bd8f2c3.png' },
{ name:'是,首相 8', url:PACK_A_P+'6ac368be0348c.png' },
{ name:'是,首相 9', url:PACK_A_P+'6ac368bf1e18e.png' },
{ name:'是,首相 10', url:PACK_A_P+'6ac368bf1e1c2.png' },
{ name:'是,首相 11', url:PACK_A_P+'6ac368bf46164.png' },
{ name:'是,首相 12', url:PACK_A_P+'6ac368bfab8f6.png' },
{ name:'是,首相 13', url:PACK_A_P+'6ac368c0ed4ed.png' },
{ name:'是,首相 14', url:PACK_A_P+'6ac368c192643.png' },
{ name:'是,首相 15', url:PACK_A_P+'6ac368c21f7b7.png' },
{ name:'是,首相 16', url:PACK_A_P+'6ac368c27d4d8.png' },
{ name:'是,首相 17', url:PACK_A_P+'6ac368c3498ae.png' },
{ name:'是,首相 18', url:PACK_A_P+'6ac368c3a5a48.png' },
{ name:'是,首相 19', url:PACK_A_P+'6ac368c42fe88.png' },
{ name:'是,首相 20', url:PACK_A_P+'6ac368c5b68db.png' },
{ name:'是,首相 21', url:PACK_A_P+'6ac368c63a843.png' },
{ name:'是,首相 22', url:PACK_A_P+'6ac368c6cdeeb.png' },
{ name:'是,首相 23', url:PACK_A_P+'6ac368c77d8bd.png' },
{ name:'是,首相 24', url:PACK_A_P+'6ac368c7ceb3b.png' },
{ name:'是,首相 25', url:PACK_A_P+'6ac368c893a0e.png' },
{ name:'是,首相 26', url:PACK_A_P+'6ac368c9ed228.png' },
{ name:'是,首相 27', url:PACK_A_P+'6ac368ca78e31.png' },
{ name:'是,首相 28', url:PACK_A_P+'6ac368cb29796.png' },
{ name:'是,首相 29', url:PACK_A_P+'6ac368cbae75a.png' },
{ name:'是,首相 30', url:PACK_A_P+'6ac368ccc0572.png' },
{ name:'是,首相 31', url:PACK_A_P+'6ac3698588029.png' },
{ name:'是,首相 32', url:PACK_A_P+'6ac369858f9ca.png' },
{ name:'是,首相 33', url:PACK_A_P+'6ac36985e00c4.png' },
{ name:'是,首相 34', url:PACK_A_P+'6ac369864a501.png' },
{ name:'是,首相 35', url:PACK_A_P+'6ac36986ab4f2.png' },
{ name:'是,首相 36', url:PACK_A_P+'6ac36987086df.png' },
{ name:'是,首相 37', url:PACK_A_P+'6ac36987c6953.png' },
{ name:'是,首相 38', url:PACK_A_P+'6ac369881a3f7.png' },
{ name:'是,首相 39', url:PACK_A_P+'6ac369893c25e.png' },
{ name:'是,首相 40', url:PACK_A_P+'6ac369899d3e7.png' },
{ name:'是,首相 41', url:PACK_A_P+'6ac3698a2cc3c.png' },
{ name:'是,首相 42', url:PACK_A_P+'6ac3698a9580f.png' },
{ name:'是,首相 43', url:PACK_A_P+'6ac3698b0b3c2.png' },
{ name:'是,首相 44', url:PACK_A_P+'6ac3698b5cccd.png' },
{ name:'是,首相 45', url:PACK_A_P+'6ac3698c3b0a9.png' },
{ name:'是,首相 46', url:PACK_A_P+'6ac3698c7283d.png' },
{ name:'是,首相 47', url:PACK_A_P+'6ac3698dba54c.png' },
{ name:'是,首相 48', url:PACK_A_P+'6ac3698e1d016.png' },
{ name:'是,首相 49', url:PACK_A_P+'6ac3698e792ce.png' },
{ name:'是,首相 50', url:PACK_A_P+'6ac3698ed245e.png' },
{ name:'是,首相 51', url:PACK_A_P+'6ac3698f31807.png' },
{ name:'是,首相 52', url:PACK_A_P+'6ac3698f7b681.png' },
{ name:'是,首相 53', url:PACK_A_P+'6ac36990a48b7.png' },
{ name:'是,首相 54', url:PACK_A_P+'6ac369911ed2a.png' },
{ name:'是,首相 55', url:PACK_A_P+'6ac3699173a0a.png' },
{ name:'是,首相 56', url:PACK_A_P+'6ac3699237c0b.png' },
{ name:'是,首相 57', url:PACK_A_P+'6ac3699294a0d.png' },
{ name:'是,首相 58', url:PACK_A_P+'6ac36992ec9b7.png' },
{ name:'是,首相 59', url:PACK_A_P+'6ac369943f480.png' },
{ name:'是,首相 60', url:PACK_A_P+'6ac3699529e69.png' },
{ name:'是,首相 61', url:PACK_A_P+'6ac36a129e58f.png' },
{ name:'是,首相 62', url:PACK_A_P+'6ac36a13a31d9.png' },
{ name:'是,首相 63', url:PACK_A_P+'6ac36a141a334.png' },
{ name:'是,首相 64', url:PACK_A_P+'6ac36a14b301b.png' },
{ name:'是,首相 65', url:PACK_A_P+'6ac36a154b301.png' },
{ name:'是,首相 66', url:PACK_A_P+'6ac36a15a3b80.png' },
{ name:'是,首相 67', url:PACK_A_P+'6ac36a1713ff0.png' },
{ name:'是,首相 68', url:PACK_A_P+'6ac36a178724e.png' },
{ name:'是,首相 69', url:PACK_A_P+'6ac36a17c99fe.png' },
{ name:'是,首相 70', url:PACK_A_P+'6ac36a1808846.png' },
{ name:'是,首相 71', url:PACK_A_P+'6ac36a18c09b5.png' },
{ name:'是,首相 72', url:PACK_A_P+'6ac36a192b4d3.png' },
{ name:'是,首相 73', url:PACK_A_P+'6ac36a19ae16e.png' },
{ name:'是,首相 74', url:PACK_A_P+'6ac36a1b1e04f.png' },
{ name:'是,首相 75', url:PACK_A_P+'6ac36a1b689b1.png' },
{ name:'是,首相 76', url:PACK_A_P+'6ac36a1bc963f.png' },
{ name:'是,首相 77', url:PACK_A_P+'6ac36a1c3db93.png' },
{ name:'是,首相 78', url:PACK_A_P+'6ac36a1c99f0e.png' },
{ name:'是,首相 79', url:PACK_A_P+'6ac36a1d15b55.png' },
{ name:'是,首相 80', url:PACK_A_P+'6ac36a1e40f02.png' },
{ name:'是,首相 81', url:PACK_A_P+'6ac36a1e8ea49.png' },
{ name:'是,首相 82', url:PACK_A_P+'6ac36a1ee2cf4.png' },
{ name:'是,首相 83', url:PACK_A_P+'6ac36a1f3b4f3.png' },
{ name:'是,首相 84', url:PACK_A_P+'6ac36a1f8d762.png' },
{ name:'是,首相 85', url:PACK_A_P+'6ac36a1fdae88.png' },
{ name:'是,首相 86', url:PACK_A_P+'6ac36a2053557.png' },
{ name:'是,首相 87', url:PACK_A_P+'6ac36a215f59e.png' },
{ name:'是,首相 88', url:PACK_A_P+'6ac36a21be121.png' },
{ name:'是,首相 89', url:PACK_A_P+'6ac36a221b26b.png' },
{ name:'是,首相 90', url:PACK_A_P+'6ac36a227dbe9.png' },
{ name:'是,首相 91', url:PACK_A_P+'6ac36a539e468.png' },
{ name:'是,首相 92', url:PACK_A_P+'6ac36a54b29c9.png' },
{ name:'是,首相 93', url:PACK_A_P+'6ac36a5555560.png' },
{ name:'是,首相 94', url:PACK_A_P+'6ac36a55ce647.png' },
{ name:'是,首相 95', url:PACK_A_P+'6ac36a569c65a.png' },
{ name:'是,首相 96', url:PACK_A_P+'6ac36a56eb3c1.png' },
{ name:'是,首相 97', url:PACK_A_P+'6ac36a574fcaa.png' },
{ name:'是,首相 98', url:PACK_A_P+'6ac36a589517c.png' },
{ name:'是,首相 99', url:PACK_A_P+'6ac36a592d71f.png' },
{ name:'是,首相 100', url:PACK_A_P+'6ac36a59a3b86.png' },
];
const PACK_RAW_KUN = 'https://raw.githubusercontent.com/KunMoe/kun-galgame-stickers/main/';
const PACK_CDN_KUN = 'https://cdn.jsdelivr.net/gh/KunMoe/kun-galgame-stickers@main/';
const PACK_RAW_BQB = 'https://raw.githubusercontent.com/zhaoolee/ChineseBQB/master/';
const PACK_CDN_BQB = 'https://cdn.jsdelivr.net/gh/zhaoolee/ChineseBQB@master/';
function sppUrlPath(p) {
return String(p).replace(/[^\x21-\x7e]|[#%]/gu, function (c) { return encodeURIComponent(c); });
}
const PACK_BQB_CONTRIB = [
{ name:'封面', file:'000Contribution_贡献🇨🇳BQB/000000000.gif', anim: true },
{ name:'贡献 2', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/-376c0ee1664a20ca.gif', anim: true },
{ name:'贡献 3', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/-78bea92e972d7395.jpg' },
{ name:'贡献 4', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/2020-04-19 13.11.11.jpg' },
{ name:'贡献 5', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/250df27e9c8e6c26549a876fbdad61fe8d224229.jpg1180w_1070h.jpg' },
{ name:'贡献 6', file:'000Contribution_贡献🇨🇳BQB/2c7889dbe9efbf7145d3ef669b11d22d.gif', anim: true },
{ name:'贡献 7', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/41e1f9aa39d7534c.jpg' },
{ name:'贡献 8', file:'000Contribution_贡献🇨🇳BQB/4c92b891ly1ghxdcssghij205k04u74a.jpg' },
{ name:'贡献 9', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/6dd57921ly1ghenwqkjx3j20aq0afdgr.jpg' },
{ name:'贡献 10', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/72104f1ab294919b12925486bba2b5f08119f961.jpg476w_248h.jpg' },
{ name:'贡献 11', file:'000Contribution_贡献🇨🇳BQB/8b4a01da911cb2b27f38392a067d0a0b.jpg' },
{ name:'贡献 12', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/EHVWyd2UUAADRu-.jpg' },
{ name:'TIM图片 20200524084313', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/TIM图片20200524084313.png' },
{ name:'歪脑', file:'000Contribution_贡献🇨🇳BQB/contribution00001-歪脑.jpg' },
{ name:'贡献 15', file:'000Contribution_贡献🇨🇳BQB/contribution00002.jpg' },
{ name:'贡献 16', file:'000Contribution_贡献🇨🇳BQB/contribution00003.gif', anim: true },
{ name:'贡献 17', file:'000Contribution_贡献🇨🇳BQB/contribution00005.jpg' },
{ name:'贡献 18', file:'000Contribution_贡献🇨🇳BQB/contribution00006.jpg' },
{ name:'贡献 19', file:'000Contribution_贡献🇨🇳BQB/contribution00007.jpg' },
{ name:'贡献 20', file:'000Contribution_贡献🇨🇳BQB/contribution00008.jpg' },
{ name:'贡献 21', file:'000Contribution_贡献🇨🇳BQB/contribution00009.jpg' },
{ name:'贡献 22', file:'000Contribution_贡献🇨🇳BQB/contribution00010.jpg' },
{ name:'贡献 23', file:'000Contribution_贡献🇨🇳BQB/contribution00011.jpg' },
{ name:'贡献 24', file:'000Contribution_贡献🇨🇳BQB/contribution00012.gif', anim: true },
{ name:'贡献 25', file:'000Contribution_贡献🇨🇳BQB/contribution00013.jpg' },
{ name:'贡献 26', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/e0cdeb6a6f9bf9989d8bb7d150d808e0.jpg' },
{ name:'贡献 27', file:'000Contribution_贡献🇨🇳BQB/hetui001.jpg' },
{ name:'贡献 28', file:'000Contribution_贡献🇨🇳BQB/hetui002.jpg' },
{ name:'贡献 29', file:'000Contribution_贡献🇨🇳BQB/hetui003.jpg' },
{ name:'贡献 30', file:'000Contribution_贡献🇨🇳BQB/hetui004.jpg' },
{ name:'劳资来了渣渣们都退下吧', file:'000Contribution_贡献🇨🇳BQB/劳资来了渣渣们都退下吧.jpg' },
{ name:'悟空退下吧为师一个人就足够了', file:'000Contribution_贡献🇨🇳BQB/悟空退下吧为师一个人就足够了.jpg' },
{ name:'扇贝听了都想鼓掌', file:'000Contribution_贡献🇨🇳BQB/扇贝听了都想鼓掌.gif', anim: true },
{ name:'本王要退寝了没事就退下吧', file:'000Contribution_贡献🇨🇳BQB/本王要退寝了没事就退下吧.jpg' },
{ name:'泪,冲了下来', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/泪,冲了下来.jpg' },
{ name:'浏览器', file:'000Contribution_贡献🇨🇳BQB/浏览器.jpg' },
{ name:'睡了一整天,好累哦', file:'000Contribution_贡献🇨🇳BQB/万恶vtb/睡了一整天,好累哦.jpg' },
{ name:'程序员专属表情包 1', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_01.jpg' },
{ name:'程序员专属表情包 2', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_02.jpg' },
{ name:'程序员专属表情包 3', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_03.jpg' },
{ name:'程序员专属表情包 4', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_04.jpg' },
{ name:'程序员专属表情包 5', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_05.jpg' },
{ name:'程序员专属表情包 6', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_06.jpg' },
{ name:'程序员专属表情包 7', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_07.jpg' },
{ name:'程序员专属表情包 8', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_08.jpg' },
{ name:'程序员专属表情包 9', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_09.gif', anim: true },
{ name:'程序员专属表情包 10', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_10.jpg' },
{ name:'程序员专属表情包 11', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_11.png' },
{ name:'程序员专属表情包 12', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_12.jpg' },
{ name:'程序员专属表情包 13', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_13.jpg' },
{ name:'程序员专属表情包 14', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_14.jpg' },
{ name:'程序员专属表情包 15', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_15.gif', anim: true },
{ name:'程序员专属表情包 16', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_16.jpg' },
{ name:'程序员专属表情包 17', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_17.jpg' },
{ name:'程序员专属表情包 18', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_18.jpg' },
{ name:'程序员专属表情包 19', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_19.jpg' },
{ name:'程序员专属表情包 20', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_20.jpg' },
{ name:'程序员专属表情包 21', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_21.jpg' },
{ name:'程序员专属表情包 22', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_22.jpg' },
{ name:'程序员专属表情包 23', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_23.jpg' },
{ name:'程序员专属表情包 24', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_24.jpg' },
{ name:'程序员专属表情包 25', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_25.jpg' },
{ name:'程序员专属表情包 26', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_26.png' },
{ name:'程序员专属表情包 27', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_27.png' },
{ name:'程序员专属表情包 28', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_28.jpg' },
{ name:'程序员专属表情包 29', file:'000Contribution_贡献🇨🇳BQB/程序员专属表情包_29.jpg' },
{ name:'你有病得治', file:'000Contribution_贡献🇨🇳BQB/精神病院欢迎您-你有病得治.gif', anim: true },
{ name:'还不快给本宫退下吧', file:'000Contribution_贡献🇨🇳BQB/还不快给本宫退下吧.gif', anim: true },
];
const PACK_BQB_HUAJI = [
{ name:'封面', file:'001Funny_滑稽大佬😏BQB/000000001.gif', anim: true },
{ name:'360度鄙视你', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00001-360度鄙视你.gif', anim: true },
{ name:'抱竹竿', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00002-抱竹竿.gif', anim: true },
{ name:'抱住-抱墙', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00003-抱住-抱墙.gif', anim: true },
{ name:'背书包-一名路过的小码农', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00004-背书包-一名路过的小码农.jpg' },
{ name:'菜刀-给你看看爸爸的厉害', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00005-菜刀-给你看看爸爸的厉害.gif', anim: true },
{ name:'超怂-摩擦-抱住', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00006-超怂-摩擦-抱住.jpg' },
{ name:'打不着-打不到', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00007-打不着-打不到.gif', anim: true },
{ name:'打人-可怜', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00008-打人-可怜.gif', anim: true },
{ name:'咚次嗒次咚咚哒', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00009-咚次嗒次咚咚哒.gif', anim: true },
{ name:'反弹', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00010-反弹.gif', anim: true },
{ name:'搞事-搞事情-酒瓶', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00011-搞事-搞事情-酒瓶.gif', anim: true },
{ name:'鼓掌', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00012-鼓掌.gif', anim: true },
{ name:'哈腰-低头', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00013-哈腰-低头.gif', anim: true },
{ name:'害怕-舞动青春版', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00014-害怕-舞动青春版.gif', anim: true },
{ name:'喝咖啡-咖啡', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00015-喝咖啡-咖啡.jpg' },
{ name:'横向扭腰-划水', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00016-横向扭腰-划水.gif', anim: true },
{ name:'夹心酱', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00017-夹心酱.gif', anim: true },
{ name:'就不要-不要', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00018-就不要-不要.gif', anim: true },
{ name:'看我的腰-扭起来', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00019-看我的腰-扭起来.gif', anim: true },
{ name:'跪着-平移', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00020-跪着-平移.gif', anim: true },
{ name:'垃圾-辣鸡', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00021-垃圾-辣鸡.gif', anim: true },
{ name:'浪里个浪', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00022-浪里个浪.gif', anim: true },
{ name:'绿帽子-带上它你将拥有力量', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00023-绿帽子-带上它你将拥有力量.jpg' },
{ name:'猫-喵喵喵', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00024-猫-喵喵喵.gif', anim: true },
{ name:'毛巾-布偶滑稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00025-毛巾-布偶滑稽.jpg' },
{ name:'秘技-反复横跳', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00026-秘技-反复横跳.gif', anim: true },
{ name:'摸鱼', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00027-摸鱼.gif', anim: true },
{ name:'脑子是个好东西希望你也有', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00028-脑子是个好东西希望你也有.gif', anim: true },
{ name:'扭屁股-变色-内裤', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00029-扭屁股-变色-内裤.gif', anim: true },
{ name:'扭起来-斗舞', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00030-扭起来-斗舞.gif', anim: true },
{ name:'啪啪啪', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00031-啪啪啪.gif', anim: true },
{ name:'劈叉-跳舞-卖艺', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00032-劈叉-跳舞-卖艺.gif', anim: true },
{ name:'皮球-磕头', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00033-皮球-磕头.gif', anim: true },
{ name:'欠收拾', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00034-欠收拾.gif', anim: true },
{ name:'提起-上吊', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00035-提起-上吊.gif', anim: true },
{ name:'投降', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00036-投降.jpg' },
{ name:'兔子-兔纸-看左边-看右边', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00037-兔子-兔纸-看左边-看右边.gif', anim: true },
{ name:'要饭', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00038-要饭.gif', anim: true },
{ name:'左右横跳', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00039-左右横跳.gif', anim: true },
{ name:'我反正萌新一个', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00040-我反正萌新一个.jpg' },
{ name:'飞稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00041-飞稽.jpg' },
{ name:'滑稽树下滑稽果,滑稽树下你和我,滑稽树下做交易欢乐多又多', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00042-滑稽树下滑稽果,滑稽树下你和我,滑稽树下做交易欢乐多又多.jpg' },
{ name:'滑稽和阴险达成共识', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00043-滑稽和阴险达成共识.jpg' },
{ name:'妖孽看法宝', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00044-妖孽看法宝.jpg' },
{ name:'嘤盖世嘤雄', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00045-嘤盖世嘤雄.jpg' },
{ name:'嘤你大爷', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00046-嘤你大爷.png' },
{ name:'这个时候要装傻', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00047-这个时候要装傻.jpg' },
{ name:'我觉得法律在这里一点用都没有', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00048-我觉得法律在这里一点用都没有.jpg' },
{ name:'马尾滑稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00049-马尾滑稽.jpg' },
{ name:'警察是不会听你解释的', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00050-警察是不会听你解释的.jpg' },
{ name:'稍加思索恍然大悟明白110', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00051-稍加思索恍然大悟明白110.jpg' },
{ name:'蝴蝶结滑稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00052-蝴蝶结滑稽.jpg' },
{ name:'呆若木稽降智打击', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00053-呆若木稽降智打击.jpg' },
{ name:'已经没有什么好害怕的了', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00054-已经没有什么好害怕的了.jpg' },
{ name:'晋太元中武陵人捕鱼为业', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00055-晋太元中武陵人捕鱼为业.jpg' },
{ name:'一起哈啤', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00056-一起哈啤.jpg' },
{ name:'送给你', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00057-送给你.jpg' },
{ name:'送你一朵小滑稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00058-送你一朵小滑稽.jpg' },
{ name:'嘤雄气短', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00059-嘤雄气短.jpg' },
{ name:'不再害怕', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00060-不再害怕.jpg' },
{ name:'吮指原味稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00061-吮指原味稽.jpg' },
{ name:'滑稽问号', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00062-滑稽问号.jpg' },
{ name:'呐花花送你', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00063-呐花花送你.jpg' },
{ name:'暗中观察', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00064-暗中观察.jpg' },
{ name:'可以这很滑稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00065-可以这很滑稽.jpg' },
{ name:'梆梆梆', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00066-梆梆梆.jpg' },
{ name:'天妒嘤才', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00067-天妒嘤才.jpg' },
{ name:'立体几何简约版', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00068-立体几何简约版.jpg' },
{ name:'林嗣环口径京中有善口技者侧目微笑默叹以为妙绝', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00069-林嗣环口径京中有善口技者侧目微笑默叹以为妙绝.jpg' },
{ name:'我开始慌了', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00070-我开始慌了.jpg' },
{ name:'莫名其妙就慌了', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00071-莫名其妙就慌了.jpg' },
{ name:'我猜你也开始慌了', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00072-我猜你也开始慌了.jpg' },
{ name:'我TM才没慌', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00073-我TM才没慌.jpg' },
{ name:'双菜刀滑稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00074-双菜刀滑稽.gif', anim: true },
{ name:'目睹了整个事件的吃瓜群众', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00075-目睹了整个事件的吃瓜群众.jpg' },
{ name:'tql跳起来', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00076-tql跳起来.jpg' },
{ name:'萌新拿起了搬准备和大佬肛道理', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00077-萌新拿起了搬准备和大佬肛道理.jpg' },
{ name:'一时语塞', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00078-一时语塞.jpg' },
{ name:'受到惊吓', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00079-受到惊吓.jpg' },
{ name:'不过如此', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00080-不过如此.jpg' },
{ name:'敲木鱼转佛珠', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00081-敲木鱼转佛珠.gif', anim: true },
{ name:'滑稽上吊', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00082-滑稽上吊.gif', anim: true },
{ name:'滑稽躁动', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00083-滑稽躁动.gif', anim: true },
{ name:'我书读的少你不要骗我', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00084-我书读的少你不要骗我.jpg' },
{ name:'滑稽震惊', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00085-滑稽震惊.jpg' },
{ name:'过分', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00086-过分.jpg' },
{ name:'真是危机四伏的世界', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00087-真是危机四伏的世界.jpg' },
{ name:'我有360保护', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00088-我有360保护.jpg' },
{ name:'喝茶', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00089-喝茶.jpg' },
{ name:'将稽就稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00090-将稽就稽.jpg' },
{ name:'小声密谋嗯嗯嗯', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00091-小声密谋嗯嗯嗯.jpg' },
{ name:'不是很懂', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00092-不是很懂.jpg' },
{ name:'这么巧你也怕呀是啊害怕', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00093-这么巧你也怕呀是啊害怕.jpg' },
{ name:'来啊互相伤害啊', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00094-来啊互相伤害啊.gif', anim: true },
{ name:'躲进小被几', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00095-躲进小被几.jpg' },
{ name:'超级加被', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00096-超级加被.jpg' },
{ name:'无敌加被', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00097-无敌加被.jpg' },
{ name:'拽走小被几', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00098-拽走小被几.jpg' },
{ name:'冰冰滑稽简约线条极致色彩', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00099-冰冰滑稽简约线条极致色彩.jpg' },
{ name:'老实', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00100-老实.jpg' },
{ name:'调皮捣蛋还TM搞事', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00101-调皮捣蛋还TM搞事.jpg' },
{ name:'燥起来', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00102-燥起来.gif', anim: true },
{ name:'嘤俊潇洒', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00103-嘤俊潇洒.jpg' },
{ name:'等待要饭', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00104-等待要饭.gif', anim: true },
{ name:'滑稽遗照', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00105-滑稽遗照.jpg' },
{ name:'鼓掌不错', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00106-鼓掌不错.gif', anim: true },
{ name:'滑稽上吊', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00107-滑稽上吊.jpg' },
{ name:'滑稽刀法', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00108-滑稽刀法.gif', anim: true },
{ name:'少来这套', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00109-少来这套.jpg' },
{ name:'要饭势力登场穷', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00110-要饭势力登场穷.jpg' },
{ name:'队长别开枪是我', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00111-队长别开枪是我.jpg' },
{ name:'摸着我可爱的自己摸鱼咸鱼', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00112-摸着我可爱的自己摸鱼咸鱼.gif', anim: true },
{ name:'害怕立体几何限定', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00113-害怕立体几何限定.jpg' },
{ name:'害怕立体几何高级版', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00114-害怕立体几何高级版.jpg' },
{ name:'记录丢人过程', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00115-记录丢人过程.jpg' },
{ name:'好评', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00116-好评.jpg' },
{ name:'当然我说是就是', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00117-当然我说是就是.jpg' },
{ name:'你完蛋了', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00118-你完蛋了.jpg' },
{ name:'我觉得你要被抓起来了', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00119-我觉得你要被抓起来了.jpg' },
{ name:'事情似乎变得有趣起来', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00120-事情似乎变得有趣起来.jpeg' },
{ name:'老嘤抓小稽', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00121-老嘤抓小稽.jpeg' },
{ name:'穷人的微笑', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00122-穷人的微笑.jpeg' },
{ name:'不向恶势力低头', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00123-不向恶势力低头.jpeg' },
{ name:'嘤年早逝', file:'001Funny_滑稽大佬😏BQB/滑稽大佬00124-嘤年早逝.jpeg' },
];
const PACK_BQB_GREENHAT = [
{ name:'封面', file:'019Green_Hat绿帽子🖼BQB/000000019.gif', anim: true },
{ name:'别瞎说我们很相爱', file:'019Green_Hat绿帽子🖼BQB/绿帽子00002-别瞎说我们很相爱.gif', anim: true },
{ name:'绿帽子我们走', file:'019Green_Hat绿帽子🖼BQB/绿帽子00003-绿帽子我们走.gif', anim: true },
{ name:'绿帽星爆气流斩', file:'019Green_Hat绿帽子🖼BQB/绿帽子00004-绿帽星爆气流斩.gif', anim: true },
{ name:'我把自己绿了', file:'019Green_Hat绿帽子🖼BQB/绿帽子00005-我把自己绿了.gif', anim: true },
{ name:'妹子戴绿帽', file:'019Green_Hat绿帽子🖼BQB/绿帽子00006-妹子戴绿帽.gif', anim: true },
{ name:'比原谅', file:'019Green_Hat绿帽子🖼BQB/绿帽子00007-比原谅.gif', anim: true },
{ name:'原谅她', file:'019Green_Hat绿帽子🖼BQB/绿帽子00008-原谅她.gif', anim: true },
{ name:'歪老婆怎么是老王', file:'019Green_Hat绿帽子🖼BQB/绿帽子00009-歪老婆怎么是老王.gif', anim: true },
{ name:'送你一顶原谅帽', file:'019Green_Hat绿帽子🖼BQB/绿帽子00010-送你一顶原谅帽.gif', anim: true },
{ name:'就喜欢看你俩斗图谁赢了这个绿帽子给谁', file:'019Green_Hat绿帽子🖼BQB/绿帽子00011-就喜欢看你俩斗图谁赢了这个绿帽子给谁.gif', anim: true },
{ name:'送你一顶原谅帽', file:'019Green_Hat绿帽子🖼BQB/绿帽子00012-送你一顶原谅帽.gif', anim: true },
{ name:'快拿掉绿帽', file:'019Green_Hat绿帽子🖼BQB/绿帽子00013-快拿掉绿帽.gif', anim: true },
{ name:'力量', file:'019Green_Hat绿帽子🖼BQB/绿帽子00014-力量.gif', anim: true },
{ name:'绿帽变色', file:'019Green_Hat绿帽子🖼BQB/绿帽子00015-绿帽变色.gif', anim: true },
{ name:'当然选择原谅她啦', file:'019Green_Hat绿帽子🖼BQB/绿帽子00016-当然选择原谅她啦.gif', anim: true },
{ name:'绿帽子真好看', file:'019Green_Hat绿帽子🖼BQB/绿帽子00017-绿帽子真好看.gif', anim: true },
{ name:'企鹅戴绿帽', file:'019Green_Hat绿帽子🖼BQB/绿帽子00018-企鹅戴绿帽.gif', anim: true },
{ name:'无限绿帽叠加', file:'019Green_Hat绿帽子🖼BQB/绿帽子00019-无限绿帽叠加.gif', anim: true },
{ name:'绿坏坏', file:'019Green_Hat绿帽子🖼BQB/绿帽子00020-绿坏坏.gif', anim: true },
{ name:'给你织个帽子', file:'019Green_Hat绿帽子🖼BQB/绿帽子00021-给你织个帽子.gif', anim: true },
{ name:'问号', file:'019Green_Hat绿帽子🖼BQB/绿帽子00022-问号.gif', anim: true },
{ name:'互丢绿帽', file:'019Green_Hat绿帽子🖼BQB/绿帽子00023-互丢绿帽.gif', anim: true },
{ name:'手持绿帽', file:'019Green_Hat绿帽子🖼BQB/绿帽子000024-手持绿帽.gif', anim: true },
];
const PACK_BQB_EMOJI23 = [
{ name:'封面', file:'023Emoji_表情符号BQB/000000023.JPG' },
{ name:'公共场所禁止呲牙咧嘴', file:'023Emoji_表情符号BQB/Emoji00039-公共场所禁止呲牙咧嘴.JPG' },
{ name:'做只快乐的小肥猪', file:'023Emoji_表情符号BQB/Emoji00092-做只快乐的小肥猪.JPG' },
{ name:'暗中观察', file:'023Emoji_表情符号BQB/Emoji00093-暗中观察.JPG' },
{ name:'我没事你忙你的', file:'023Emoji_表情符号BQB/Emoji00114-我没事你忙你的.JPG' },
{ name:'那你会把我捧在手心里吗', file:'023Emoji_表情符号BQB/Emoji00115-那你会把我捧在手心里吗.JPG' },
{ name:'能饮一杯么', file:'023Emoji_表情符号BQB/Emoji00116-能饮一杯么.JPG' },
{ name:'把委屈藏在小包包里', file:'023Emoji_表情符号BQB/Emoji00117-把委屈藏在小包包里.JPG' },
{ name:'卑微', file:'023Emoji_表情符号BQB/Emoji00118-卑微.JPG' },
{ name:'卑微', file:'023Emoji_表情符号BQB/Emoji00119-卑微.JPG' },
{ name:'熬夜冠军奖杯', file:'023Emoji_表情符号BQB/Emoji00120-熬夜冠军奖杯.JPG' },
{ name:'A罩杯', file:'023Emoji_表情符号BQB/Emoji00123-A罩杯.JPG' },
{ name:'我们什么时候能快乐啊', file:'023Emoji_表情符号BQB/Emoji00124-我们什么时候能快乐啊.JPG' },
{ name:'我哪敢说话', file:'023Emoji_表情符号BQB/Emoji00125-我哪敢说话.JPG' },
{ name:'报告我不快乐', file:'023Emoji_表情符号BQB/Emoji00126-报告我不快乐.JPG' },
{ name:'好期待哇', file:'023Emoji_表情符号BQB/Emoji00127-好期待哇.JPG' },
{ name:'阿尔卑微', file:'023Emoji_表情符号BQB/Emoji00128-阿尔卑微.JPG' },
{ name:'没关系鸭你不是抓到我了吗', file:'023Emoji_表情符号BQB/Emoji00129-没关系鸭你不是抓到我了吗.JPG' },
{ name:'好喽我打包滚', file:'023Emoji_表情符号BQB/Emoji00130-好喽我打包滚.JPG' },
{ name:'放过俺', file:'023Emoji_表情符号BQB/Emoji00131-放过俺.JPG' },
{ name:'好兄弟', file:'023Emoji_表情符号BQB/Emoji00132-好兄弟.JPG' },
{ name:'那我就鼓掌呗', file:'023Emoji_表情符号BQB/Emoji00133-那我就鼓掌呗.JPG' },
{ name:'欺负我你能得到什么', file:'023Emoji_表情符号BQB/Emoji00134-欺负我你能得到什么.JPG' },
{ name:'明白', file:'023Emoji_表情符号BQB/Emoji00135-明白.JPG' },
{ name:'哥哥我来了', file:'023Emoji_表情符号BQB/Emoji00136-哥哥我来了.JPG' },
{ name:'谁来和我一起喝下这杯爱情水', file:'023Emoji_表情符号BQB/Emoji00137-谁来和我一起喝下这杯爱情水.JPG' },
{ name:'让人怪不好意思的', file:'023Emoji_表情符号BQB/Emoji00138-让人怪不好意思的.JPG' },
{ name:'我被爱判处终身孤寂', file:'023Emoji_表情符号BQB/Emoji00139-我被爱判处终身孤寂.JPG' },
{ name:'求你了', file:'023Emoji_表情符号BQB/Emoji00140-求你了.JPG' },
{ name:'我没有生气呀', file:'023Emoji_表情符号BQB/Emoji00141-我没有生气呀.JPG' },
{ name:'那么我开动了', file:'023Emoji_表情符号BQB/Emoji00142-那么我开动了.JPG' },
{ name:'你能把我碰倒手心了珍惜吗', file:'023Emoji_表情符号BQB/Emoji00143-你能把我碰倒手心了珍惜吗.JPG' },
{ name:'你送我的帽子真好看', file:'023Emoji_表情符号BQB/Emoji00144-你送我的帽子真好看.JPG' },
{ name:'没关系呀你不是抓到我了吗', file:'023Emoji_表情符号BQB/Emoji00145-没关系呀你不是抓到我了吗.JPG' },
{ name:'暗中观察', file:'023Emoji_表情符号BQB/Emoji00146-暗中观察.JPG' },
{ name:'问号-墨镜', file:'023Emoji_表情符号BQB/Emoji00147-问号-墨镜.JPG' },
{ name:'滚就滚我最会滚了', file:'023Emoji_表情符号BQB/Emoji00148-滚就滚我最会滚了.JPG' },
{ name:'行吧', file:'023Emoji_表情符号BQB/Emoji00149-行吧.JPG' },
{ name:'我把你妈捉起来', file:'023Emoji_表情符号BQB/Emoji00151-我把你妈捉起来.JPG' },
{ name:'俺来啦', file:'023Emoji_表情符号BQB/Emoji00152-俺来啦.JPG' },
{ name:'要我一直可爱吗', file:'023Emoji_表情符号BQB/Emoji00153-要我一直可爱吗.JPG' },
{ name:'您有事儿吗', file:'023Emoji_表情符号BQB/Emoji00154-您有事儿吗.JPG' },
{ name:'要我一直笑吗', file:'023Emoji_表情符号BQB/Emoji00155-要我一直笑吗.JPG' },
{ name:'问号', file:'023Emoji_表情符号BQB/Emoji00157-问号.JPG' },
{ name:'行', file:'023Emoji_表情符号BQB/Emoji00159-行.JPG' },
{ name:'打扰了', file:'023Emoji_表情符号BQB/Emoji00162-打扰了.JPG' },
{ name:'嗨', file:'023Emoji_表情符号BQB/Emoji00164-嗨.JPG' },
{ name:'你对我越凶我就越喜欢', file:'023Emoji_表情符号BQB/Emoji00169-你对我越凶我就越喜欢.JPG' },
{ name:'我没有生气呀', file:'023Emoji_表情符号BQB/Emoji00170-我没有生气呀.JPG' },
{ name:'我是不是你的小baby', file:'023Emoji_表情符号BQB/Emoji00171-我是不是你的小baby.JPG' },
{ name:'你真的很机车诶', file:'023Emoji_表情符号BQB/Emoji00172-你真的很机车诶.JPG' },
{ name:'我什么都没有', file:'023Emoji_表情符号BQB/Emoji00173-我什么都没有.JPG' },
{ name:'好可爱不愧是我最喜欢的人', file:'023Emoji_表情符号BQB/Emoji00174-好可爱不愧是我最喜欢的人.JPG' },
{ name:'请您滚', file:'023Emoji_表情符号BQB/Emoji00175-请您滚.JPG' },
{ name:'本公主真是给你脸了', file:'023Emoji_表情符号BQB/Emoji00176-本公主真是给你脸了.JPG' },
{ name:'来啦来啦', file:'023Emoji_表情符号BQB/Emoji00178-来啦来啦.JPG' },
{ name:'来了来了', file:'023Emoji_表情符号BQB/Emoji00179-来了来了.JPG' },
{ name:'花钱一时爽一直花钱一直爽', file:'023Emoji_表情符号BQB/Emoji00180-花钱一时爽一直花钱一直爽.JPG' },
{ name:'我离当场去世就差这么一点', file:'023Emoji_表情符号BQB/Emoji00181-我离当场去世就差这么一点.JPG' },
{ name:'将进酒卑莫停', file:'023Emoji_表情符号BQB/Emoji00182-将进酒卑莫停.JPG' },
{ name:'喝卑水', file:'023Emoji_表情符号BQB/Emoji00183-喝卑水.JPG' },
{ name:'空气中弥漫着奇怪的气息', file:'023Emoji_表情符号BQB/Emoji00185-空气中弥漫着奇怪的气息.JPG' },
{ name:'我生活', file:'023Emoji_表情符号BQB/Emoji00186-我生活.JPG' },
{ name:'赌气', file:'023Emoji_表情符号BQB/Emoji00187-赌气.JPG' },
{ name:'走辽', file:'023Emoji_表情符号BQB/Emoji00189-走辽.JPG' },
{ name:'没钱的日子阴云密布', file:'023Emoji_表情符号BQB/Emoji00190-没钱的日子阴云密布.JPG' },
{ name:'关我屁事', file:'023Emoji_表情符号BQB/Emoji00191-关我屁事.JPG' },
{ name:'难以入睡', file:'023Emoji_表情符号BQB/Emoji00192-难以入睡.JPG' },
{ name:'成了', file:'023Emoji_表情符号BQB/Emoji00194-成了.JPG' },
{ name:'我能送你回家吗可能外面要下雨啦', file:'023Emoji_表情符号BQB/Emoji00195-我能送你回家吗可能外面要下雨啦.JPG' },
{ name:'爷笑了', file:'023Emoji_表情符号BQB/Emoji00196-爷笑了.JPG' },
{ name:'向快乐出发', file:'023Emoji_表情符号BQB/Emoji00198-向快乐出发.JPG' },
{ name:'这谁顶得住啊', file:'023Emoji_表情符号BQB/Emoji00199-这谁顶得住啊.JPG' },
{ name:'不听不听王八念经', file:'023Emoji_表情符号BQB/Emoji00204-不听不听王八念经.GIF', anim: true },
{ name:'看戏', file:'023Emoji_表情符号BQB/Emoji00205-看戏.GIF', anim: true },
{ name:'您有事儿吗', file:'023Emoji_表情符号BQB/Emoji00206-您有事儿吗.JPG' },
{ name:'哎呦我C', file:'023Emoji_表情符号BQB/Emoji00210-哎呦我C.JPG' },
{ name:'妹妹行为', file:'023Emoji_表情符号BQB/Emoji00211-妹妹行为.JPG' },
{ name:'相视一笑', file:'023Emoji_表情符号BQB/Emoji00212-相视一笑.JPG' },
{ name:'要我一直阴险吗', file:'023Emoji_表情符号BQB/Emoji00215-要我一直阴险吗.JPG' },
{ name:'要我一直这么可怜吗', file:'023Emoji_表情符号BQB/Emoji00216-要我一直这么可怜吗.JPG' },
{ name:'CanYouStopAngry', file:'023Emoji_表情符号BQB/Emoji00231-CanYouStopAngry.GIF', anim: true },
{ name:'情侣都低调一点不要逼我动手', file:'023Emoji_表情符号BQB/Emoji00233-情侣都低调一点不要逼我动手.JPG' },
{ name:'好可爱不愧是我喜欢的人', file:'023Emoji_表情符号BQB/Emoji00234-好可爱不愧是我喜欢的人.JPG' },
];
const PACK_BQB_CATDAILY = [
{ name:'封面', file:'049CatEveryday_猫咪日常BQB/000000049.JPG' },
{ name:'你知道我要说什么吧', file:'049CatEveryday_猫咪日常BQB/猫咪日常00002-你知道我要说什么吧.JPG' },
{ name:'内蒙都给我整一个', file:'049CatEveryday_猫咪日常BQB/猫咪日常00003-内蒙都给我整一个.JPG' },
{ name:'给我也整一个', file:'049CatEveryday_猫咪日常BQB/猫咪日常00004-给我也整一个.JPG' },
{ name:'奥利给', file:'049CatEveryday_猫咪日常BQB/猫咪日常00005-奥利给.JPG' },
{ name:'就不给你整', file:'049CatEveryday_猫咪日常BQB/猫咪日常00006-就不给你整.JPG' },
{ name:'劳资还要整', file:'049CatEveryday_猫咪日常BQB/猫咪日常00008-劳资还要整.JPG' },
{ name:'整完以后', file:'049CatEveryday_猫咪日常BQB/猫咪日常00009-整完以后.JPG' },
{ name:'别打了我不整了', file:'049CatEveryday_猫咪日常BQB/猫咪日常00010-别打了我不整了.JPG' },
{ name:'不整了不整了', file:'049CatEveryday_猫咪日常BQB/猫咪日常00011-不整了不整了.JPG' },
{ name:'给你整来了四个', file:'049CatEveryday_猫咪日常BQB/猫咪日常00012-给你整来了四个.JPG' },
{ name:'给我整俩', file:'049CatEveryday_猫咪日常BQB/猫咪日常00013-给我整俩.JPG' },
{ name:'我也要', file:'049CatEveryday_猫咪日常BQB/猫咪日常00014-我也要.JPG' },
{ name:'你给不给我整一个不整我打趴你', file:'049CatEveryday_猫咪日常BQB/猫咪日常00015-你给不给我整一个不整我打趴你.JPG' },
];
const PACK_BQB_SQUIRTLE = [
{ name:'封面', file:'052Squirtle_杰尼龟BQB/000000052.JPG' },
{ name:'给爷整懵了', file:'052Squirtle_杰尼龟BQB/杰尼龟00002-给爷整懵了.JPG' },
{ name:'无情嘲笑哈哈哈', file:'052Squirtle_杰尼龟BQB/杰尼龟00003-无情嘲笑哈哈哈.JPG' },
{ name:'憨上加憨', file:'052Squirtle_杰尼龟BQB/杰尼龟00004-憨上加憨.JPG' },
{ name:'好兄弟', file:'052Squirtle_杰尼龟BQB/杰尼龟00005-好兄弟.JPG' },
{ name:'憨憨敬礼', file:'052Squirtle_杰尼龟BQB/杰尼龟00006-憨憨敬礼.JPG' },
{ name:'憨批被排挤', file:'052Squirtle_杰尼龟BQB/杰尼龟00007-憨批被排挤.JPG' },
{ name:'给我冲', file:'052Squirtle_杰尼龟BQB/杰尼龟00008-给我冲.JPG' },
{ name:'不冲了不冲了', file:'052Squirtle_杰尼龟BQB/杰尼龟00009-不冲了不冲了.JPG' },
{ name:'你就给我等着吧', file:'052Squirtle_杰尼龟BQB/杰尼龟00010-你就给我等着吧.JPG' },
{ name:'就是TM的扛不住哇', file:'052Squirtle_杰尼龟BQB/杰尼龟00011-就是TM的扛不住哇.JPG' },
{ name:'明天会更好', file:'052Squirtle_杰尼龟BQB/杰尼龟00012-明天会更好.JPG' },
{ name:'爷好委屈', file:'052Squirtle_杰尼龟BQB/杰尼龟00013-爷好委屈.JPG' },
{ name:'不要试图和爷叫嚣可笑', file:'052Squirtle_杰尼龟BQB/杰尼龟00014-不要试图和爷叫嚣可笑.JPG' },
{ name:'冲啊', file:'052Squirtle_杰尼龟BQB/杰尼龟00015-冲啊.JPG' },
{ name:'你的心像石头', file:'052Squirtle_杰尼龟BQB/杰尼龟00016-你的心像石头.JPG' },
{ name:'我都不想说我认识你', file:'052Squirtle_杰尼龟BQB/杰尼龟00018-我都不想说我认识你.JPG' },
{ name:'别想了没有', file:'052Squirtle_杰尼龟BQB/杰尼龟00019-别想了没有.JPG' },
{ name:'憨批军团', file:'052Squirtle_杰尼龟BQB/杰尼龟00020-憨批军团.JPG' },
{ name:'憨憨的春天', file:'052Squirtle_杰尼龟BQB/杰尼龟00022-憨憨的春天.JPG' },
{ name:'送你上西天', file:'052Squirtle_杰尼龟BQB/杰尼龟00023-送你上西天.JPG' },
{ name:'我恰柠檬', file:'052Squirtle_杰尼龟BQB/杰尼龟00024-我恰柠檬.JPG' },
{ name:'我哪敢说话呀', file:'052Squirtle_杰尼龟BQB/杰尼龟00025-我哪敢说话呀.JPG' },
{ name:'等待回应', file:'052Squirtle_杰尼龟BQB/杰尼龟00026-等待回应.JPG' },
{ name:'你醒啦', file:'052Squirtle_杰尼龟BQB/杰尼龟00027-你醒啦.JPG' },
{ name:'爷又快乐咯', file:'052Squirtle_杰尼龟BQB/杰尼龟00028-爷又快乐咯.JPG' },
{ name:'整挺好', file:'052Squirtle_杰尼龟BQB/杰尼龟00029-整挺好.JPG' },
{ name:'冲冲冲', file:'052Squirtle_杰尼龟BQB/杰尼龟00030-冲冲冲.JPG' },
{ name:'冷冷的狗粮胡乱往嘴里塞', file:'052Squirtle_杰尼龟BQB/杰尼龟00031-冷冷的狗粮胡乱往嘴里塞.JPG' },
{ name:'我杰尼龟一记火箭头槌让你尝尝龟头是什么味道的', file:'052Squirtle_杰尼龟BQB/杰尼龟00032-我杰尼龟一记火箭头槌让你尝尝龟头是什么味道的.JPG' },
{ name:'哈哈哈', file:'052Squirtle_杰尼龟BQB/杰尼龟00033-哈哈哈.GIF', anim: true },
{ name:'哈哈哈雪人', file:'052Squirtle_杰尼龟BQB/杰尼龟00034-哈哈哈雪人.GIF', anim: true },
{ name:'戴墨镜登场', file:'052Squirtle_杰尼龟BQB/杰尼龟00035-戴墨镜登场.GIF', anim: true },
{ name:'快别丢人现眼了快走快走', file:'052Squirtle_杰尼龟BQB/杰尼龟00036-快别丢人现眼了快走快走.JPG' },
];
const PACK_BQB_KAGUYA = [
{ name:'封面', file:'071辉夜大小姐🎀BQB/000000071.gif', anim: true },
{ name:'📚舞', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00002-📚舞.gif', anim: true },
{ name:'血都干了呀-你觉得我们人民警察会相信你的说的鬼话', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00003-血都干了呀-你觉得我们人民警察会相信你的说的鬼话.png' },
{ name:'小朋友不可以听变态说话', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00004-小朋友不可以听变态说话.png' },
{ name:'反正会长也不会给我过生日的吧-傲娇生气', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00005-反正会长也不会给我过生日的吧-傲娇生气.png' },
{ name:'暴怒我绝对不会原谅你的', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00006-暴怒我绝对不会原谅你的.jpg' },
{ name:'惊慌', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00007-惊慌.gif', anim: true },
{ name:'抱紧大佬', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00008-抱紧大佬.jpg' },
{ name:'我觉得你对我有点放肆', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00009-我觉得你对我有点放肆.png' },
{ name:'空无模式', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00010-空无模式.jpg' },
{ name:'暴怒看死人的眼神', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00011-暴怒看死人的眼神.jpg' },
{ name:'还真是可爱-哦卡哇伊', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00012-还真是可爱-哦卡哇伊.png' },
{ name:'贪婪', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00013-贪婪.jpg' },
{ name:'欲望', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00014-欲望.jpg' },
{ name:'诶', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00015-诶.jpg' },
{ name:'哈哈', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00016-哈哈.jpg' },
{ name:'DJ书记舞', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00017-DJ书记舞.jpg' },
{ name:'你好恶心喔', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00018-你好恶心喔.jpg' },
{ name:'原来如此-侦探', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00019-原来如此-侦探.jpg' },
{ name:'卷报纸打人', file:'071辉夜大小姐🎀BQB/辉夜大小姐想让我告白00020-卷报纸打人.gif', anim: true },
];
const PACK_BQB_PAIYIPAI = [
{ name:'封面', file:'072PaiYiPai_微信拍一拍👋BQB/0000000072.jpg' },
{ name:'把我拍倒了赔钱', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00002-把我拍倒了赔钱.png' },
{ name:'七大姑八大姨拍了拍你', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00003-七大姑八大姨拍了拍你.jpg' },
{ name:'爸爸拍了拍你', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00004-爸爸拍了拍你.jpg' },
{ name:'领导拍了拍你', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00005-领导拍了拍你.jpg' },
{ name:'对方拍了拍你', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00006-对方拍了拍你.jpg' },
{ name:'我要拍你了哦', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00007-我要拍你了哦.jpg' },
{ name:'拍一次收费十元', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00008-拍一次收费十元.png' },
{ name:'好了再拍就烦了', file:'072PaiYiPai_微信拍一拍👋BQB/微信拍一拍00009-好了再拍就烦了.jpg' },
];
const PACK_BQB_GUI = [
{ name:'封面', file:'074BrotherGui_兄贵哲学BQB/0000000074.gif', anim: true },
{ name:'兄贵哲学 2', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00001.jpg' },
{ name:'兄贵哲学 3', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00002.jpg' },
{ name:'兄贵哲学 4', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00003.jpg' },
{ name:'兄贵哲学 5', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00004.jpg' },
{ name:'兄贵哲学 6', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00005.gif', anim: true },
{ name:'兄贵哲学 7', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00006.gif', anim: true },
{ name:'兄贵哲学 8', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00007.gif', anim: true },
{ name:'兄贵哲学 9', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00008.gif', anim: true },
{ name:'兄贵哲学 10', file:'074BrotherGui_兄贵哲学BQB/BrotherGui00009.jpg' },
];
const PACK_KUN1 = [
{ name:'鲲 1 1', file:'KUN_Stickers1/s1-1.png' },
{ name:'鲲 1 10', file:'KUN_Stickers1/s1-10.jpg' },
{ name:'鲲 1 11', file:'KUN_Stickers1/s1-11.jpg' },
{ name:'鲲 1 12', file:'KUN_Stickers1/s1-12.jpg' },
{ name:'鲲 1 13', file:'KUN_Stickers1/s1-13.jpg' },
{ name:'鲲 1 14', file:'KUN_Stickers1/s1-14.jpg' },
{ name:'鲲 1 15', file:'KUN_Stickers1/s1-15.jpg' },
{ name:'鲲 1 16', file:'KUN_Stickers1/s1-16.jpg' },
{ name:'鲲 1 17', file:'KUN_Stickers1/s1-17.jpg' },
{ name:'鲲 1 18', file:'KUN_Stickers1/s1-18.jpg' },
{ name:'鲲 1 19', file:'KUN_Stickers1/s1-19.jpg' },
{ name:'鲲 1 2', file:'KUN_Stickers1/s1-2.jpg' },
{ name:'鲲 1 20', file:'KUN_Stickers1/s1-20.jpg' },
{ name:'鲲 1 21', file:'KUN_Stickers1/s1-21.jpg' },
{ name:'鲲 1 22', file:'KUN_Stickers1/s1-22.jpg' },
{ name:'鲲 1 23', file:'KUN_Stickers1/s1-23.jpg' },
{ name:'鲲 1 24', file:'KUN_Stickers1/s1-24.png' },
{ name:'鲲 1 25', file:'KUN_Stickers1/s1-25.jpg' },
{ name:'鲲 1 26', file:'KUN_Stickers1/s1-26.png' },
{ name:'鲲 1 27', file:'KUN_Stickers1/s1-27.jpg' },
{ name:'鲲 1 28', file:'KUN_Stickers1/s1-28.jpg' },
{ name:'鲲 1 29', file:'KUN_Stickers1/s1-29.jpg' },
{ name:'鲲 1 3', file:'KUN_Stickers1/s1-3.png' },
{ name:'鲲 1 30', file:'KUN_Stickers1/s1-30.jpg' },
{ name:'鲲 1 31', file:'KUN_Stickers1/s1-31.jpg' },
{ name:'鲲 1 32', file:'KUN_Stickers1/s1-32.jpg' },
{ name:'鲲 1 33', file:'KUN_Stickers1/s1-33.jpg' },
{ name:'鲲 1 34', file:'KUN_Stickers1/s1-34.jpg' },
{ name:'鲲 1 35', file:'KUN_Stickers1/s1-35.jpg' },
{ name:'鲲 1 36', file:'KUN_Stickers1/s1-36.jpg' },
{ name:'鲲 1 37', file:'KUN_Stickers1/s1-37.jpg' },
{ name:'鲲 1 38', file:'KUN_Stickers1/s1-38.jpg' },
{ name:'鲲 1 39', file:'KUN_Stickers1/s1-39.jpg' },
{ name:'鲲 1 4', file:'KUN_Stickers1/s1-4.jpg' },
{ name:'鲲 1 40', file:'KUN_Stickers1/s1-40.png' },
{ name:'鲲 1 41', file:'KUN_Stickers1/s1-41.jpg' },
{ name:'鲲 1 42', file:'KUN_Stickers1/s1-42.jpg' },
{ name:'鲲 1 43', file:'KUN_Stickers1/s1-43.png' },
{ name:'鲲 1 44', file:'KUN_Stickers1/s1-44.png' },
{ name:'鲲 1 45', file:'KUN_Stickers1/s1-45.jpg' },
{ name:'鲲 1 46', file:'KUN_Stickers1/s1-46.jpg' },
{ name:'鲲 1 47', file:'KUN_Stickers1/s1-47.jpg' },
{ name:'鲲 1 48', file:'KUN_Stickers1/s1-48.jpg' },
{ name:'鲲 1 49', file:'KUN_Stickers1/s1-49.jpg' },
{ name:'鲲 1 5', file:'KUN_Stickers1/s1-5.jpg' },
{ name:'鲲 1 50', file:'KUN_Stickers1/s1-50.jpg' },
{ name:'鲲 1 51', file:'KUN_Stickers1/s1-51.png' },
{ name:'鲲 1 52', file:'KUN_Stickers1/s1-52.jpg' },
{ name:'鲲 1 53', file:'KUN_Stickers1/s1-53.jpg' },
{ name:'鲲 1 54', file:'KUN_Stickers1/s1-54.jpg' },
{ name:'鲲 1 55', file:'KUN_Stickers1/s1-55.jpg' },
{ name:'鲲 1 56', file:'KUN_Stickers1/s1-56.jpg' },
{ name:'鲲 1 57', file:'KUN_Stickers1/s1-57.jpg' },
{ name:'鲲 1 58', file:'KUN_Stickers1/s1-58.jpg' },
{ name:'鲲 1 59', file:'KUN_Stickers1/s1-59.jpg' },
{ name:'鲲 1 6', file:'KUN_Stickers1/s1-6.jpg' },
{ name:'鲲 1 60', file:'KUN_Stickers1/s1-60.jpg' },
{ name:'鲲 1 61', file:'KUN_Stickers1/s1-61.jpg' },
{ name:'鲲 1 62', file:'KUN_Stickers1/s1-62.jpg' },
{ name:'鲲 1 63', file:'KUN_Stickers1/s1-63.jpg' },
{ name:'鲲 1 64', file:'KUN_Stickers1/s1-64.jpg' },
{ name:'鲲 1 65', file:'KUN_Stickers1/s1-65.jpg' },
{ name:'鲲 1 66', file:'KUN_Stickers1/s1-66.jpg' },
{ name:'鲲 1 67', file:'KUN_Stickers1/s1-67.jpg' },
{ name:'鲲 1 68', file:'KUN_Stickers1/s1-68.jpg' },
{ name:'鲲 1 69', file:'KUN_Stickers1/s1-69.jpg' },
{ name:'鲲 1 7', file:'KUN_Stickers1/s1-7.jpg' },
{ name:'鲲 1 70', file:'KUN_Stickers1/s1-70.jpg' },
{ name:'鲲 1 71', file:'KUN_Stickers1/s1-71.jpg' },
{ name:'鲲 1 72', file:'KUN_Stickers1/s1-72.jpg' },
{ name:'鲲 1 73', file:'KUN_Stickers1/s1-73.jpg' },
{ name:'鲲 1 74', file:'KUN_Stickers1/s1-74.jpg' },
{ name:'鲲 1 75', file:'KUN_Stickers1/s1-75.jpg' },
{ name:'鲲 1 76', file:'KUN_Stickers1/s1-76.jpg' },
{ name:'鲲 1 77', file:'KUN_Stickers1/s1-77.jpg' },
{ name:'鲲 1 78', file:'KUN_Stickers1/s1-78.jpg' },
{ name:'鲲 1 79', file:'KUN_Stickers1/s1-79.jpg' },
{ name:'鲲 1 8', file:'KUN_Stickers1/s1-8.jpg' },
{ name:'鲲 1 80', file:'KUN_Stickers1/s1-80.jpg' },
{ name:'鲲 1 9', file:'KUN_Stickers1/s1-9.jpg' },
];
const PACK_KUN2 = [
{ name:'鲲 2 1', file:'KUN_Stickers2/s2-1.png' },
{ name:'鲲 2 10', file:'KUN_Stickers2/s2-10.png' },
{ name:'鲲 2 11', file:'KUN_Stickers2/s2-11.png' },
{ name:'鲲 2 12', file:'KUN_Stickers2/s2-12.png' },
{ name:'鲲 2 13', file:'KUN_Stickers2/s2-13.png' },
{ name:'鲲 2 14', file:'KUN_Stickers2/s2-14.png' },
{ name:'鲲 2 15', file:'KUN_Stickers2/s2-15.png' },
{ name:'鲲 2 16', file:'KUN_Stickers2/s2-16.png' },
{ name:'鲲 2 17', file:'KUN_Stickers2/s2-17.png' },
{ name:'鲲 2 18', file:'KUN_Stickers2/s2-18.png' },
{ name:'鲲 2 19', file:'KUN_Stickers2/s2-19.png' },
{ name:'鲲 2 2', file:'KUN_Stickers2/s2-2.jpg' },
{ name:'鲲 2 20', file:'KUN_Stickers2/s2-20.png' },
{ name:'鲲 2 21', file:'KUN_Stickers2/s2-21.png' },
{ name:'鲲 2 22', file:'KUN_Stickers2/s2-22.png' },
{ name:'鲲 2 23', file:'KUN_Stickers2/s2-23.png' },
{ name:'鲲 2 24', file:'KUN_Stickers2/s2-24.png' },
{ name:'鲲 2 25', file:'KUN_Stickers2/s2-25.png' },
{ name:'鲲 2 26', file:'KUN_Stickers2/s2-26.png' },
{ name:'鲲 2 27', file:'KUN_Stickers2/s2-27.png' },
{ name:'鲲 2 28', file:'KUN_Stickers2/s2-28.png' },
{ name:'鲲 2 29', file:'KUN_Stickers2/s2-29.png' },
{ name:'鲲 2 3', file:'KUN_Stickers2/s2-3.png' },
{ name:'鲲 2 30', file:'KUN_Stickers2/s2-30.jpg' },
{ name:'鲲 2 31', file:'KUN_Stickers2/s2-31.jpg' },
{ name:'鲲 2 32', file:'KUN_Stickers2/s2-32.jpg' },
{ name:'鲲 2 33', file:'KUN_Stickers2/s2-33.jpg' },
{ name:'鲲 2 34', file:'KUN_Stickers2/s2-34.png' },
{ name:'鲲 2 35', file:'KUN_Stickers2/s2-35.png' },
{ name:'鲲 2 36', file:'KUN_Stickers2/s2-36.png' },
{ name:'鲲 2 37', file:'KUN_Stickers2/s2-37.png' },
{ name:'鲲 2 38', file:'KUN_Stickers2/s2-38.png' },
{ name:'鲲 2 39', file:'KUN_Stickers2/s2-39.png' },
{ name:'鲲 2 4', file:'KUN_Stickers2/s2-4.jpg' },
{ name:'鲲 2 40', file:'KUN_Stickers2/s2-40.png' },
{ name:'鲲 2 41', file:'KUN_Stickers2/s2-41.png' },
{ name:'鲲 2 42', file:'KUN_Stickers2/s2-42.png' },
{ name:'鲲 2 43', file:'KUN_Stickers2/s2-43.png' },
{ name:'鲲 2 44', file:'KUN_Stickers2/s2-44.png' },
{ name:'鲲 2 45', file:'KUN_Stickers2/s2-45.png' },
{ name:'鲲 2 46', file:'KUN_Stickers2/s2-46.png' },
{ name:'鲲 2 47', file:'KUN_Stickers2/s2-47.png' },
{ name:'鲲 2 48', file:'KUN_Stickers2/s2-48.png' },
{ name:'鲲 2 49', file:'KUN_Stickers2/s2-49.png' },
{ name:'鲲 2 5', file:'KUN_Stickers2/s2-5.jpg' },
{ name:'鲲 2 50', file:'KUN_Stickers2/s2-50.png' },
{ name:'鲲 2 51', file:'KUN_Stickers2/s2-51.png' },
{ name:'鲲 2 52', file:'KUN_Stickers2/s2-52.png' },
{ name:'鲲 2 53', file:'KUN_Stickers2/s2-53.png' },
{ name:'鲲 2 54', file:'KUN_Stickers2/s2-54.png' },
{ name:'鲲 2 55', file:'KUN_Stickers2/s2-55.png' },
{ name:'鲲 2 56', file:'KUN_Stickers2/s2-56.png' },
{ name:'鲲 2 57', file:'KUN_Stickers2/s2-57.png' },
{ name:'鲲 2 58', file:'KUN_Stickers2/s2-58.png' },
{ name:'鲲 2 59', file:'KUN_Stickers2/s2-59.png' },
{ name:'鲲 2 6', file:'KUN_Stickers2/s2-6.jpg' },
{ name:'鲲 2 60', file:'KUN_Stickers2/s2-60.png' },
{ name:'鲲 2 61', file:'KUN_Stickers2/s2-61.png' },
{ name:'鲲 2 62', file:'KUN_Stickers2/s2-62.png' },
{ name:'鲲 2 63', file:'KUN_Stickers2/s2-63.png' },
{ name:'鲲 2 64', file:'KUN_Stickers2/s2-64.png' },
{ name:'鲲 2 65', file:'KUN_Stickers2/s2-65.png' },
{ name:'鲲 2 66', file:'KUN_Stickers2/s2-66.png' },
{ name:'鲲 2 67', file:'KUN_Stickers2/s2-67.png' },
{ name:'鲲 2 68', file:'KUN_Stickers2/s2-68.png' },
{ name:'鲲 2 69', file:'KUN_Stickers2/s2-69.png' },
{ name:'鲲 2 7', file:'KUN_Stickers2/s2-7.png' },
{ name:'鲲 2 70', file:'KUN_Stickers2/s2-70.png' },
{ name:'鲲 2 71', file:'KUN_Stickers2/s2-71.png' },
{ name:'鲲 2 72', file:'KUN_Stickers2/s2-72.png' },
{ name:'鲲 2 73', file:'KUN_Stickers2/s2-73.png' },
{ name:'鲲 2 74', file:'KUN_Stickers2/s2-74.png' },
{ name:'鲲 2 75', file:'KUN_Stickers2/s2-75.png' },
{ name:'鲲 2 76', file:'KUN_Stickers2/s2-76.png' },
{ name:'鲲 2 77', file:'KUN_Stickers2/s2-77.png' },
{ name:'鲲 2 78', file:'KUN_Stickers2/s2-78.png' },
{ name:'鲲 2 79', file:'KUN_Stickers2/s2-79.jpg' },
{ name:'鲲 2 8', file:'KUN_Stickers2/s2-8.png' },
{ name:'鲲 2 80', file:'KUN_Stickers2/s2-80.png' },
{ name:'鲲 2 9', file:'KUN_Stickers2/s2-9.png' },
];
const PACK_KUN3 = [
{ name:'鲲 3 1', file:'KUN_Stickers3/s3-1.png' },
{ name:'鲲 3 10', file:'KUN_Stickers3/s3-10.png' },
{ name:'鲲 3 11', file:'KUN_Stickers3/s3-11.png' },
{ name:'鲲 3 12', file:'KUN_Stickers3/s3-12.png' },
{ name:'鲲 3 13', file:'KUN_Stickers3/s3-13.png' },
{ name:'鲲 3 14', file:'KUN_Stickers3/s3-14.png' },
{ name:'鲲 3 15', file:'KUN_Stickers3/s3-15.png' },
{ name:'鲲 3 16', file:'KUN_Stickers3/s3-16.png' },
{ name:'鲲 3 17', file:'KUN_Stickers3/s3-17.png' },
{ name:'鲲 3 18', file:'KUN_Stickers3/s3-18.png' },
{ name:'鲲 3 19', file:'KUN_Stickers3/s3-19.png' },
{ name:'鲲 3 2', file:'KUN_Stickers3/s3-2.png' },
{ name:'鲲 3 20', file:'KUN_Stickers3/s3-20.png' },
{ name:'鲲 3 21', file:'KUN_Stickers3/s3-21.png' },
{ name:'鲲 3 22', file:'KUN_Stickers3/s3-22.png' },
{ name:'鲲 3 23', file:'KUN_Stickers3/s3-23.png' },
{ name:'鲲 3 24', file:'KUN_Stickers3/s3-24.png' },
{ name:'鲲 3 25', file:'KUN_Stickers3/s3-25.png' },
{ name:'鲲 3 26', file:'KUN_Stickers3/s3-26.png' },
{ name:'鲲 3 27', file:'KUN_Stickers3/s3-27.png' },
{ name:'鲲 3 28', file:'KUN_Stickers3/s3-28.png' },
{ name:'鲲 3 29', file:'KUN_Stickers3/s3-29.png' },
{ name:'鲲 3 3', file:'KUN_Stickers3/s3-3.png' },
{ name:'鲲 3 30', file:'KUN_Stickers3/s3-30.png' },
{ name:'鲲 3 31', file:'KUN_Stickers3/s3-31.png' },
{ name:'鲲 3 32', file:'KUN_Stickers3/s3-32.png' },
{ name:'鲲 3 33', file:'KUN_Stickers3/s3-33.png' },
{ name:'鲲 3 34', file:'KUN_Stickers3/s3-34.png' },
{ name:'鲲 3 35', file:'KUN_Stickers3/s3-35.png' },
{ name:'鲲 3 36', file:'KUN_Stickers3/s3-36.png' },
{ name:'鲲 3 37', file:'KUN_Stickers3/s3-37.png' },
{ name:'鲲 3 38', file:'KUN_Stickers3/s3-38.png' },
{ name:'鲲 3 39', file:'KUN_Stickers3/s3-39.png' },
{ name:'鲲 3 4', file:'KUN_Stickers3/s3-4.png' },
{ name:'鲲 3 40', file:'KUN_Stickers3/s3-40.png' },
{ name:'鲲 3 41', file:'KUN_Stickers3/s3-41.png' },
{ name:'鲲 3 42', file:'KUN_Stickers3/s3-42.png' },
{ name:'鲲 3 43', file:'KUN_Stickers3/s3-43.png' },
{ name:'鲲 3 44', file:'KUN_Stickers3/s3-44.png' },
{ name:'鲲 3 45', file:'KUN_Stickers3/s3-45.png' },
{ name:'鲲 3 46', file:'KUN_Stickers3/s3-46.png' },
{ name:'鲲 3 47', file:'KUN_Stickers3/s3-47.png' },
{ name:'鲲 3 48', file:'KUN_Stickers3/s3-48.png' },
{ name:'鲲 3 49', file:'KUN_Stickers3/s3-49.png' },
{ name:'鲲 3 5', file:'KUN_Stickers3/s3-5.png' },
{ name:'鲲 3 50', file:'KUN_Stickers3/s3-50.png' },
{ name:'鲲 3 51', file:'KUN_Stickers3/s3-51.png' },
{ name:'鲲 3 52', file:'KUN_Stickers3/s3-52.png' },
{ name:'鲲 3 53', file:'KUN_Stickers3/s3-53.png' },
{ name:'鲲 3 54', file:'KUN_Stickers3/s3-54.png' },
{ name:'鲲 3 55', file:'KUN_Stickers3/s3-55.png' },
{ name:'鲲 3 56', file:'KUN_Stickers3/s3-56.png' },
{ name:'鲲 3 57', file:'KUN_Stickers3/s3-57.png' },
{ name:'鲲 3 58', file:'KUN_Stickers3/s3-58.png' },
{ name:'鲲 3 59', file:'KUN_Stickers3/s3-59.png' },
{ name:'鲲 3 6', file:'KUN_Stickers3/s3-6.png' },
{ name:'鲲 3 60', file:'KUN_Stickers3/s3-60.png' },
{ name:'鲲 3 61', file:'KUN_Stickers3/s3-61.png' },
{ name:'鲲 3 62', file:'KUN_Stickers3/s3-62.png' },
{ name:'鲲 3 63', file:'KUN_Stickers3/s3-63.png' },
{ name:'鲲 3 64', file:'KUN_Stickers3/s3-64.png' },
{ name:'鲲 3 65', file:'KUN_Stickers3/s3-65.png' },
{ name:'鲲 3 66', file:'KUN_Stickers3/s3-66.png' },
{ name:'鲲 3 67', file:'KUN_Stickers3/s3-67.png' },
{ name:'鲲 3 68', file:'KUN_Stickers3/s3-68.png' },
{ name:'鲲 3 69', file:'KUN_Stickers3/s3-69.png' },
{ name:'鲲 3 7', file:'KUN_Stickers3/s3-7.png' },
{ name:'鲲 3 70', file:'KUN_Stickers3/s3-70.png' },
{ name:'鲲 3 71', file:'KUN_Stickers3/s3-71.png' },
{ name:'鲲 3 72', file:'KUN_Stickers3/s3-72.png' },
{ name:'鲲 3 73', file:'KUN_Stickers3/s3-73.png' },
{ name:'鲲 3 74', file:'KUN_Stickers3/s3-74.png' },
{ name:'鲲 3 75', file:'KUN_Stickers3/s3-75.png' },
{ name:'鲲 3 76', file:'KUN_Stickers3/s3-76.png' },
{ name:'鲲 3 77', file:'KUN_Stickers3/s3-77.png' },
{ name:'鲲 3 78', file:'KUN_Stickers3/s3-78.png' },
{ name:'鲲 3 79', file:'KUN_Stickers3/s3-79.png' },
{ name:'鲲 3 8', file:'KUN_Stickers3/s3-8.png' },
{ name:'鲲 3 80', file:'KUN_Stickers3/s3-80.png' },
{ name:'鲲 3 9', file:'KUN_Stickers3/s3-9.png' },
];
const PACK_KUN4 = [
{ name:'鲲 4 1', file:'KUN_Stickers4/s4-1.png' },
{ name:'鲲 4 10', file:'KUN_Stickers4/s4-10.png' },
{ name:'鲲 4 11', file:'KUN_Stickers4/s4-11.png' },
{ name:'鲲 4 12', file:'KUN_Stickers4/s4-12.png' },
{ name:'鲲 4 13', file:'KUN_Stickers4/s4-13.png' },
{ name:'鲲 4 14', file:'KUN_Stickers4/s4-14.png' },
{ name:'鲲 4 15', file:'KUN_Stickers4/s4-15.png' },
{ name:'鲲 4 16', file:'KUN_Stickers4/s4-16.png' },
{ name:'鲲 4 17', file:'KUN_Stickers4/s4-17.png' },
{ name:'鲲 4 18', file:'KUN_Stickers4/s4-18.png' },
{ name:'鲲 4 19', file:'KUN_Stickers4/s4-19.png' },
{ name:'鲲 4 2', file:'KUN_Stickers4/s4-2.png' },
{ name:'鲲 4 20', file:'KUN_Stickers4/s4-20.png' },
{ name:'鲲 4 21', file:'KUN_Stickers4/s4-21.png' },
{ name:'鲲 4 22', file:'KUN_Stickers4/s4-22.png' },
{ name:'鲲 4 23', file:'KUN_Stickers4/s4-23.png' },
{ name:'鲲 4 24', file:'KUN_Stickers4/s4-24.png' },
{ name:'鲲 4 25', file:'KUN_Stickers4/s4-25.png' },
{ name:'鲲 4 26', file:'KUN_Stickers4/s4-26.png' },
{ name:'鲲 4 27', file:'KUN_Stickers4/s4-27.png' },
{ name:'鲲 4 28', file:'KUN_Stickers4/s4-28.png' },
{ name:'鲲 4 29', file:'KUN_Stickers4/s4-29.png' },
{ name:'鲲 4 3', file:'KUN_Stickers4/s4-3.png' },
{ name:'鲲 4 30', file:'KUN_Stickers4/s4-30.png' },
{ name:'鲲 4 31', file:'KUN_Stickers4/s4-31.png' },
{ name:'鲲 4 32', file:'KUN_Stickers4/s4-32.png' },
{ name:'鲲 4 33', file:'KUN_Stickers4/s4-33.png' },
{ name:'鲲 4 34', file:'KUN_Stickers4/s4-34.png' },
{ name:'鲲 4 35', file:'KUN_Stickers4/s4-35.png' },
{ name:'鲲 4 36', file:'KUN_Stickers4/s4-36.png' },
{ name:'鲲 4 37', file:'KUN_Stickers4/s4-37.png' },
{ name:'鲲 4 38', file:'KUN_Stickers4/s4-38.png' },
{ name:'鲲 4 39', file:'KUN_Stickers4/s4-39.png' },
{ name:'鲲 4 4', file:'KUN_Stickers4/s4-4.png' },
{ name:'鲲 4 40', file:'KUN_Stickers4/s4-40.png' },
{ name:'鲲 4 41', file:'KUN_Stickers4/s4-41.png' },
{ name:'鲲 4 42', file:'KUN_Stickers4/s4-42.png' },
{ name:'鲲 4 43', file:'KUN_Stickers4/s4-43.png' },
{ name:'鲲 4 44', file:'KUN_Stickers4/s4-44.png' },
{ name:'鲲 4 45', file:'KUN_Stickers4/s4-45.png' },
{ name:'鲲 4 46', file:'KUN_Stickers4/s4-46.png' },
{ name:'鲲 4 47', file:'KUN_Stickers4/s4-47.png' },
{ name:'鲲 4 48', file:'KUN_Stickers4/s4-48.png' },
{ name:'鲲 4 49', file:'KUN_Stickers4/s4-49.png' },
{ name:'鲲 4 5', file:'KUN_Stickers4/s4-5.png' },
{ name:'鲲 4 50', file:'KUN_Stickers4/s4-50.png' },
{ name:'鲲 4 51', file:'KUN_Stickers4/s4-51.png' },
{ name:'鲲 4 52', file:'KUN_Stickers4/s4-52.png' },
{ name:'鲲 4 53', file:'KUN_Stickers4/s4-53.png' },
{ name:'鲲 4 54', file:'KUN_Stickers4/s4-54.png' },
{ name:'鲲 4 55', file:'KUN_Stickers4/s4-55.png' },
{ name:'鲲 4 56', file:'KUN_Stickers4/s4-56.png' },
{ name:'鲲 4 57', file:'KUN_Stickers4/s4-57.png' },
{ name:'鲲 4 58', file:'KUN_Stickers4/s4-58.png' },
{ name:'鲲 4 59', file:'KUN_Stickers4/s4-59.png' },
{ name:'鲲 4 6', file:'KUN_Stickers4/s4-6.png' },
{ name:'鲲 4 60', file:'KUN_Stickers4/s4-60.png' },
{ name:'鲲 4 61', file:'KUN_Stickers4/s4-61.png' },
{ name:'鲲 4 62', file:'KUN_Stickers4/s4-62.png' },
{ name:'鲲 4 63', file:'KUN_Stickers4/s4-63.png' },
{ name:'鲲 4 64', file:'KUN_Stickers4/s4-64.png' },
{ name:'鲲 4 65', file:'KUN_Stickers4/s4-65.png' },
{ name:'鲲 4 66', file:'KUN_Stickers4/s4-66.png' },
{ name:'鲲 4 67', file:'KUN_Stickers4/s4-67.png' },
{ name:'鲲 4 68', file:'KUN_Stickers4/s4-68.png' },
{ name:'鲲 4 69', file:'KUN_Stickers4/s4-69.png' },
{ name:'鲲 4 7', file:'KUN_Stickers4/s4-7.png' },
{ name:'鲲 4 70', file:'KUN_Stickers4/s4-70.png' },
{ name:'鲲 4 71', file:'KUN_Stickers4/s4-71.png' },
{ name:'鲲 4 72', file:'KUN_Stickers4/s4-72.png' },
{ name:'鲲 4 73', file:'KUN_Stickers4/s4-73.png' },
{ name:'鲲 4 74', file:'KUN_Stickers4/s4-74.png' },
{ name:'鲲 4 75', file:'KUN_Stickers4/s4-75.png' },
{ name:'鲲 4 76', file:'KUN_Stickers4/s4-76.png' },
{ name:'鲲 4 77', file:'KUN_Stickers4/s4-77.png' },
{ name:'鲲 4 78', file:'KUN_Stickers4/s4-78.png' },
{ name:'鲲 4 79', file:'KUN_Stickers4/s4-79.png' },
{ name:'鲲 4 8', file:'KUN_Stickers4/s4-8.png' },
{ name:'鲲 4 80', file:'KUN_Stickers4/s4-80.png' },
{ name:'鲲 4 9', file:'KUN_Stickers4/s4-9.png' },
];
const PACK_KUN5 = [
{ name:'鲲 5 1', file:'KUN_Stickers5/s5-1.png' },
{ name:'鲲 5 10', file:'KUN_Stickers5/s5-10.png' },
{ name:'鲲 5 11', file:'KUN_Stickers5/s5-11.png' },
{ name:'鲲 5 12', file:'KUN_Stickers5/s5-12.png' },
{ name:'鲲 5 13', file:'KUN_Stickers5/s5-13.png' },
{ name:'鲲 5 14', file:'KUN_Stickers5/s5-14.png' },
{ name:'鲲 5 15', file:'KUN_Stickers5/s5-15.png' },
{ name:'鲲 5 16', file:'KUN_Stickers5/s5-16.png' },
{ name:'鲲 5 17', file:'KUN_Stickers5/s5-17.png' },
{ name:'鲲 5 18', file:'KUN_Stickers5/s5-18.png' },
{ name:'鲲 5 19', file:'KUN_Stickers5/s5-19.png' },
{ name:'鲲 5 2', file:'KUN_Stickers5/s5-2.png' },
{ name:'鲲 5 20', file:'KUN_Stickers5/s5-20.png' },
{ name:'鲲 5 21', file:'KUN_Stickers5/s5-21.png' },
{ name:'鲲 5 22', file:'KUN_Stickers5/s5-22.png' },
{ name:'鲲 5 23', file:'KUN_Stickers5/s5-23.png' },
{ name:'鲲 5 24', file:'KUN_Stickers5/s5-24.png' },
{ name:'鲲 5 25', file:'KUN_Stickers5/s5-25.png' },
{ name:'鲲 5 26', file:'KUN_Stickers5/s5-26.png' },
{ name:'鲲 5 27', file:'KUN_Stickers5/s5-27.png' },
{ name:'鲲 5 28', file:'KUN_Stickers5/s5-28.png' },
{ name:'鲲 5 29', file:'KUN_Stickers5/s5-29.png' },
{ name:'鲲 5 3', file:'KUN_Stickers5/s5-3.png' },
{ name:'鲲 5 30', file:'KUN_Stickers5/s5-30.png' },
{ name:'鲲 5 31', file:'KUN_Stickers5/s5-31.png' },
{ name:'鲲 5 32', file:'KUN_Stickers5/s5-32.png' },
{ name:'鲲 5 33', file:'KUN_Stickers5/s5-33.png' },
{ name:'鲲 5 34', file:'KUN_Stickers5/s5-34.png' },
{ name:'鲲 5 35', file:'KUN_Stickers5/s5-35.png' },
{ name:'鲲 5 36', file:'KUN_Stickers5/s5-36.png' },
{ name:'鲲 5 37', file:'KUN_Stickers5/s5-37.png' },
{ name:'鲲 5 38', file:'KUN_Stickers5/s5-38.png' },
{ name:'鲲 5 39', file:'KUN_Stickers5/s5-39.png' },
{ name:'鲲 5 4', file:'KUN_Stickers5/s5-4.png' },
{ name:'鲲 5 40', file:'KUN_Stickers5/s5-40.png' },
{ name:'鲲 5 41', file:'KUN_Stickers5/s5-41.png' },
{ name:'鲲 5 42', file:'KUN_Stickers5/s5-42.png' },
{ name:'鲲 5 43', file:'KUN_Stickers5/s5-43.png' },
{ name:'鲲 5 44', file:'KUN_Stickers5/s5-44.png' },
{ name:'鲲 5 45', file:'KUN_Stickers5/s5-45.png' },
{ name:'鲲 5 46', file:'KUN_Stickers5/s5-46.png' },
{ name:'鲲 5 47', file:'KUN_Stickers5/s5-47.png' },
{ name:'鲲 5 48', file:'KUN_Stickers5/s5-48.png' },
{ name:'鲲 5 49', file:'KUN_Stickers5/s5-49.png' },
{ name:'鲲 5 5', file:'KUN_Stickers5/s5-5.png' },
{ name:'鲲 5 50', file:'KUN_Stickers5/s5-50.png' },
{ name:'鲲 5 51', file:'KUN_Stickers5/s5-51.png' },
{ name:'鲲 5 52', file:'KUN_Stickers5/s5-52.png' },
{ name:'鲲 5 53', file:'KUN_Stickers5/s5-53.png' },
{ name:'鲲 5 54', file:'KUN_Stickers5/s5-54.png' },
{ name:'鲲 5 55', file:'KUN_Stickers5/s5-55.png' },
{ name:'鲲 5 56', file:'KUN_Stickers5/s5-56.png' },
{ name:'鲲 5 57', file:'KUN_Stickers5/s5-57.png' },
{ name:'鲲 5 58', file:'KUN_Stickers5/s5-58.png' },
{ name:'鲲 5 59', file:'KUN_Stickers5/s5-59.png' },
{ name:'鲲 5 6', file:'KUN_Stickers5/s5-6.png' },
{ name:'鲲 5 60', file:'KUN_Stickers5/s5-60.png' },
{ name:'鲲 5 61', file:'KUN_Stickers5/s5-61.png' },
{ name:'鲲 5 62', file:'KUN_Stickers5/s5-62.png' },
{ name:'鲲 5 63', file:'KUN_Stickers5/s5-63.png' },
{ name:'鲲 5 64', file:'KUN_Stickers5/s5-64.png' },
{ name:'鲲 5 65', file:'KUN_Stickers5/s5-65.png' },
{ name:'鲲 5 66', file:'KUN_Stickers5/s5-66.png' },
{ name:'鲲 5 67', file:'KUN_Stickers5/s5-67.png' },
{ name:'鲲 5 68', file:'KUN_Stickers5/s5-68.png' },
{ name:'鲲 5 69', file:'KUN_Stickers5/s5-69.png' },
{ name:'鲲 5 7', file:'KUN_Stickers5/s5-7.png' },
{ name:'鲲 5 70', file:'KUN_Stickers5/s5-70.png' },
{ name:'鲲 5 71', file:'KUN_Stickers5/s5-71.png' },
{ name:'鲲 5 72', file:'KUN_Stickers5/s5-72.png' },
{ name:'鲲 5 73', file:'KUN_Stickers5/s5-73.png' },
{ name:'鲲 5 74', file:'KUN_Stickers5/s5-74.png' },
{ name:'鲲 5 75', file:'KUN_Stickers5/s5-75.png' },
{ name:'鲲 5 76', file:'KUN_Stickers5/s5-76.png' },
{ name:'鲲 5 77', file:'KUN_Stickers5/s5-77.png' },
{ name:'鲲 5 78', file:'KUN_Stickers5/s5-78.png' },
{ name:'鲲 5 79', file:'KUN_Stickers5/s5-79.png' },
{ name:'鲲 5 8', file:'KUN_Stickers5/s5-8.png' },
{ name:'鲲 5 80', file:'KUN_Stickers5/s5-80.png' },
{ name:'鲲 5 9', file:'KUN_Stickers5/s5-9.png' },
];
const PACK_KUN6 = [
{ name:'鲲 6 1', file:'KUN_Stickers6/s6-1.png' },
{ name:'鲲 6 10', file:'KUN_Stickers6/s6-10.png' },
{ name:'鲲 6 11', file:'KUN_Stickers6/s6-11.png' },
{ name:'鲲 6 12', file:'KUN_Stickers6/s6-12.png' },
{ name:'鲲 6 13', file:'KUN_Stickers6/s6-13.png' },
{ name:'鲲 6 14', file:'KUN_Stickers6/s6-14.png' },
{ name:'鲲 6 15', file:'KUN_Stickers6/s6-15.png' },
{ name:'鲲 6 16', file:'KUN_Stickers6/s6-16.png' },
{ name:'鲲 6 17', file:'KUN_Stickers6/s6-17.png' },
{ name:'鲲 6 18', file:'KUN_Stickers6/s6-18.png' },
{ name:'鲲 6 19', file:'KUN_Stickers6/s6-19.png' },
{ name:'鲲 6 2', file:'KUN_Stickers6/s6-2.png' },
{ name:'鲲 6 20', file:'KUN_Stickers6/s6-20.png' },
{ name:'鲲 6 21', file:'KUN_Stickers6/s6-21.png' },
{ name:'鲲 6 22', file:'KUN_Stickers6/s6-22.png' },
{ name:'鲲 6 23', file:'KUN_Stickers6/s6-23.png' },
{ name:'鲲 6 24', file:'KUN_Stickers6/s6-24.png' },
{ name:'鲲 6 25', file:'KUN_Stickers6/s6-25.png' },
{ name:'鲲 6 26', file:'KUN_Stickers6/s6-26.png' },
{ name:'鲲 6 27', file:'KUN_Stickers6/s6-27.png' },
{ name:'鲲 6 28', file:'KUN_Stickers6/s6-28.png' },
{ name:'鲲 6 29', file:'KUN_Stickers6/s6-29.png' },
{ name:'鲲 6 3', file:'KUN_Stickers6/s6-3.png' },
{ name:'鲲 6 30', file:'KUN_Stickers6/s6-30.png' },
{ name:'鲲 6 31', file:'KUN_Stickers6/s6-31.png' },
{ name:'鲲 6 32', file:'KUN_Stickers6/s6-32.png' },
{ name:'鲲 6 33', file:'KUN_Stickers6/s6-33.png' },
{ name:'鲲 6 34', file:'KUN_Stickers6/s6-34.png' },
{ name:'鲲 6 4', file:'KUN_Stickers6/s6-4.png' },
{ name:'鲲 6 5', file:'KUN_Stickers6/s6-5.png' },
{ name:'鲲 6 6', file:'KUN_Stickers6/s6-6.png' },
{ name:'鲲 6 7', file:'KUN_Stickers6/s6-7.png' },
{ name:'鲲 6 8', file:'KUN_Stickers6/s6-8.png' },
{ name:'鲲 6 9', file:'KUN_Stickers6/s6-9.png' },
];
const SPP_CUSTOM_EMOJI_KEY = 'spp_custom_emoji';
const SPP_CUSTOM_STICKER_KEY = 'spp_custom_sticker';
const SPP_CUSTOM_KEY = 'spp_custom_packs';
const SPP_CUSTOM_IMG_RE = /^https?:\/\/[^\s<>"']+\.(png|jpe?g|webp|gif|bmp|avif)(\?[^\s]*)?$/i;
const SPP_CUSTOM_PAGE_TAGS = { emoji: 'emoji', '表情': 'emoji', sticker: 'sticker', '贴纸': 'sticker' };
function sppNewPackAcc() {
return {
emoji: [], sticker: [], packs: 0, urls: 0, bad: [], empty: true,
seen: { emoji: new Set(), sticker: new Set() }
};
}
function sppPackScan(raw, defaultPage, acc) {
const text = String(raw === null || raw === undefined ? '' : raw);
if (!text.trim()) return;
acc.empty = false;
let cur = null;
text.split(/\r?\n/).forEach(function (line, i) {
const t = line.trim();
if (!t) { cur = null; return; }
if (t.slice(0, 4).toLowerCase() === 'http') {
if (!cur) { acc.bad.push({ n: i + 1, why: '上面没有套系名' }); return; }
const sp = t.search(/\s/);
const url = sp < 0 ? t : t.slice(0, sp);
const label = sp < 0 ? '' : t.slice(sp).trim();
if (!SPP_CUSTOM_IMG_RE.test(url)) { acc.bad.push({ n: i + 1, why: '不是图片直链' }); return; }
if (acc.seen[cur.page].has(url)) { acc.bad.push({ n: i + 1, why: '这一页里和前面重复' }); return; }
acc.seen[cur.page].add(url);
cur.list.push({ name: label, url: url, label: label, anim: /\.(gif|webp)(\?|$)/i.test(url) });
return;
}
let name = t, page = defaultPage;
const m = t.match(/^\[([^\]]{1,12})\]\s*(.*)$/);
if (m) {
const tag = m[1].trim().toLowerCase();
if (SPP_CUSTOM_PAGE_TAGS[tag]) page = SPP_CUSTOM_PAGE_TAGS[tag];
name = (m[2] || '').trim() || m[1].trim();
}
cur = { key: 'spp-custom-' + page + '-' + acc[page].length, page: page, name: name, list: [] };
acc[page].push(cur);
});
}
function sppPackFinish(acc) {
['emoji', 'sticker'].forEach(function (pg) {
acc[pg] = acc[pg].filter(function (p) { return p.list.length; });
acc[pg].forEach(function (p) {
p.list.forEach(function (e, i) { e.name = e.label || (p.name + ' ' + (i + 1)); });
});
});
acc.packs = acc.emoji.length + acc.sticker.length;
acc.urls = acc.seen.emoji.size + acc.seen.sticker.size;
return acc;
}
function sppParseCustomPacks(raw, defaultPage) {
const acc = sppNewPackAcc();
sppPackScan(raw, defaultPage || 'sticker', acc);
return sppPackFinish(acc);
}
function sppParseCustomPacksAll(emojiRaw, stickerRaw) {
const acc = sppNewPackAcc();
sppPackScan(emojiRaw, 'emoji', acc);
sppPackScan(stickerRaw, 'sticker', acc);
return sppPackFinish(acc);
}
function sppMigratePacksSplit() {
const MIG = 'spp_mig_packsplit_on';
if (GM_getValue(MIG, false)) return;
const oldRaw = GM_getValue(SPP_CUSTOM_KEY, '');
const hasNew = String(GM_getValue(SPP_CUSTOM_EMOJI_KEY, '') || '') ||
String(GM_getValue(SPP_CUSTOM_STICKER_KEY, '') || '');
if (typeof oldRaw === 'string' && oldRaw.trim() && !hasNew) {
try {
const parsed = sppParseCustomPacks(oldRaw, 'sticker');
const dump = function (arr) {
return arr.map(function (p) {
return p.name + '\n' + p.list.map(function (e) {
return e.url + (e.label ? ' ' + e.label : '');
}).join('\n');
}).join('\n\n');
};
GM_setValue(SPP_CUSTOM_EMOJI_KEY, dump(parsed.emoji));
GM_setValue(SPP_CUSTOM_STICKER_KEY, dump(parsed.sticker));
} catch (e) {  }
}
GM_setValue(MIG, true);
}
sppMigratePacksSplit();
const SPP_CUSTOM_PACKS = sppParseCustomPacksAll(
SPP_CONFIG.text(SPP_CUSTOM_EMOJI_KEY, ''),
SPP_CONFIG.text(SPP_CUSTOM_STICKER_KEY, '')
);
const SPP_HOST_KEY = 'spp_host_extra';
var SPP_WORDPACK_BUILTIN = [
'mark', '感谢分享', '马克', '牛逼', '插眼', '谢谢分享',
'好好好', '不错', '謝謝分享', 'mark一下', '不赖', '顶',
'牛', '感谢', '前排', '牛的', '厉害', '好看',
'不错不错', '好', '羡慕', '马克一下', '帮顶', 'cy',
'马', '不戳不戳', '插个眼', '好人一生平安', 'nb', '看看',
'牛逼牛逼', '多谢分享', '好耶', '感谢大佬', '蹲', 'cycy',
'好涩', '厉害了', '可以的', '太棒了', '真不错', 'markmark',
'太色了', '好看爱看', '好帖', '好色', '牛蛙', 'hero',
'make', 'yyds', '感謝分享', '感谢感谢', '摩多摩多', '感谢分享!'
];
if (!Array.isArray(SPP_WORDPACK_BUILTIN)) {
SPP_INIT.fail.push('常用词库常量类型错误:SPP_WORDPACK_BUILTIN 应为数组,实际是 ' +
(typeof SPP_WORDPACK_BUILTIN));
console.error('[SPP] 常用词库常量类型错误:SPP_WORDPACK_BUILTIN 应为数组,实际是 ' +
(typeof SPP_WORDPACK_BUILTIN) + ';一键导入将不可用');
} else if (SPP_WORDPACK_BUILTIN.length !== 54) {
SPP_INIT.fail.push('常用词库常量条数异常:期望 54 条,实际 ' + SPP_WORDPACK_BUILTIN.length + ' 条');
}
function sppParseCustomHosts(raw) {
const out = { list: [], bad: [], empty: true };
const text = String(raw === null || raw === undefined ? '' : raw);
if (!text.trim()) return out;
out.empty = false;
const seen = new Set();
text.split(/\r?\n/).forEach(function (line, i) {
const t = line.trim();
if (!t || t.slice(0, 1) === '#') return;
const tok = t.split(/\s+/);
if (tok.length < 2) { out.bad.push({ n: i + 1, why: '要写「名称 首页地址」两段' }); return; }
const name = tok[0].replace(/[\[\]【】]/g, '').replace(/[\s\u0000-\u001f]/g, '').slice(0, 24);
if (!name) { out.bad.push({ n: i + 1, why: '名称是空的' }); return; }
const site = tok[1];
if (!/^https?:\/\//i.test(site)) { out.bad.push({ n: i + 1, why: '首页地址要带 http:// 或 https://' }); return; }
let host0 = '';
try { host0 = new URL(site).hostname.toLowerCase().replace(/^www\./, ''); } catch (e) { host0 = ''; }
if (!host0) { out.bad.push({ n: i + 1, why: '首页地址解析不出域名' }); return; }
let hosts = tok.slice(2).join(' ').split(/[\s,,、]+/)
.map(function (d) {
return d.trim().toLowerCase()
.replace(/^https?:\/\//, '').replace(/^www\./, '').replace(/\/.*$/, '');
})
.filter(Boolean);
if (!hosts.length) hosts = [host0];
const dupKey = name + '|' + hosts.join(',');
if (seen.has(dupKey)) { out.bad.push({ n: i + 1, why: '和前面重复' }); return; }
seen.add(dupKey);
out.list.push({ name: name, site: site, hosts: hosts });
});
return out;
}
const SPP_CUSTOM_HOSTS = sppParseCustomHosts(SPP_CONFIG.text(SPP_HOST_KEY, ''));
const SPP_PACK_URLS = new Set();
[PACK_EMOJI_OMEGA, PACK_STICKER_OMEGA, PACK_DAIDAIWEI, PACK_MAOERXIAOYI, PACK_SHISHOUXIANG]
.forEach(function (arr) { arr.forEach(function (e) { SPP_PACK_URLS.add(e.url); }); });
[
[PACK_RAW_KUN, PACK_CDN_KUN,
[PACK_KUN1, PACK_KUN2, PACK_KUN3, PACK_KUN4, PACK_KUN5, PACK_KUN6]],
[PACK_RAW_BQB, PACK_CDN_BQB,
[PACK_BQB_CONTRIB, PACK_BQB_HUAJI, PACK_BQB_GREENHAT, PACK_BQB_EMOJI23,
PACK_BQB_CATDAILY, PACK_BQB_SQUIRTLE, PACK_BQB_KAGUYA, PACK_BQB_PAIYIPAI,
PACK_BQB_GUI]]
].forEach(function (tri) {
tri[2].forEach(function (arr) {
arr.forEach(function (e) {
const f = sppUrlPath(e.file);
e.url = tri[0] + f;
e.alt = tri[1] + f;
SPP_PACK_URLS.add(e.url);
SPP_PACK_URLS.add(e.alt);
});
});
});
['emoji', 'sticker'].forEach(function (pg) {
SPP_CUSTOM_PACKS[pg].forEach(function (p) {
p.list.forEach(function (e) { SPP_PACK_URLS.add(e.url); });
});
});
function isStickerUrl(u) {
if (!u) return false;
try { return SPP_PACK_URLS.has(new URL(u, location.href).href); } catch (e) { return false; }
}
function initImageViewer() {
if (!WANTS.readOnly) return;
function loadSettings() { return SPP_CONFIG.imgSettings(); }
let settings = loadSettings();
let dynamicStyle = null;
let imgUid = 0;
let observerStarted = false;
function applyDynamicStyles() {
if (!dynamicStyle) {
dynamicStyle = document.createElement('style');
appendToHeadSafe(dynamicStyle);
}
dynamicStyle.textContent = `
                .tpc_content img.spp-img {
                    max-height:${settings.maxImgHeight}vh !important;
                    max-width:${settings.maxImgWidth}% !important;
                    object-fit:contain !important;
                    cursor:zoom-in !important;
                    transition:opacity 0.2s;
                }
                .tpc_content img.spp-img.spp-img-h {
                    max-height:${settings.maxImgHeight}vh !important;
                    max-width:${settings.maxImgWidth}% !important;
                }
                .tpc_content img.spp-img.spp-img-v {
                    max-height:${settings.vertImgHeight}vh !important;
                    max-width:${settings.vertImgWidth}% !important;
                }
                .tpc_content img.spp-img:hover { opacity:0.85; }
                ${settings.centerImg ? '.tpc_content img.spp-img:not(.spp-sticker-img) { display:block !important; margin:0 auto !important; }' : ''}
                ${SPP_CONFIG.bool('spp_sticker_center', false) ? '.tpc_content img.spp-img.spp-sticker-img { display:block !important; margin:0 auto !important; }' : ''}
                .spp-thumb { width:${settings.thumbSize}px !important; height:${settings.thumbSize}px !important; }
            `;
}
function injectStaticStyles() {
GM_addStyle(`
                .spp-overlay { display:none; position:fixed; inset:0; z-index:99999; background:rgba(0,0,0,0.92); flex-direction:column; align-items:center; justify-content:center; }
                .spp-overlay.spp-open { display:flex; }
                .spp-main { flex:1; display:flex; align-items:center; justify-content:center; width:100%; min-height:0; position:relative; overflow:hidden; }
                .spp-main img { max-width:95vw; max-height:calc(100vh - 100px); object-fit:contain; user-select:none; transition:opacity 0.15s; }
                .spp-arrow { position:absolute; top:50%; transform:translateY(-50%); width:48px; height:80px; background:rgba(255,255,255,0.1); border:none; color:#fff; font-size:28px; cursor:pointer; border-radius:6px; z-index:2; display:flex; align-items:center; justify-content:center; transition:background 0.2s; }
                .spp-arrow:hover { background:rgba(255,255,255,0.25); }
                .spp-arrow-left { left:12px; }
                .spp-arrow-right { right:12px; }
                .spp-close { position:absolute; top:10px; right:16px; width:36px; height:36px; background:rgba(255,255,255,0.12); border:none; color:#fff; font-size:22px; cursor:pointer; border-radius:50%; z-index:3; display:flex; align-items:center; justify-content:center; }
                .spp-close:hover { background:rgba(255,255,255,0.3); }
                .spp-counter { position:absolute; top:14px; left:16px; color:rgba(255,255,255,0.7); font-size:14px; z-index:3; user-select:none; }
                .spp-thumbs { display:flex; gap:4px; padding:6px 10px; overflow-x:auto; max-width:100vw; flex-shrink:0; scrollbar-width:thin; scrollbar-color:rgba(255,255,255,0.3) transparent; }
                .spp-thumbs::-webkit-scrollbar { height:6px; }
                .spp-thumbs::-webkit-scrollbar-thumb { background:rgba(255,255,255,0.3); border-radius:3px; }
                .spp-thumb { flex-shrink:0; object-fit:cover; border:2px solid transparent; border-radius:4px; cursor:pointer; opacity:0.5; transition:opacity 0.15s, border-color 0.15s; }
                .spp-thumb:hover { opacity:0.8; }
                .spp-thumb.spp-active { border-color:#e74c3c; opacity:1; }
            `);
}
function patchImg(img) {
if (img.dataset.sppUid) return;
if (!isContentImage(img)) return;
img.dataset.sppUid = String(++imgUid);
img.classList.add('spp-img');
const realSrc = getImgSrc(img);
if (realSrc && (!img.src || img.src === 'about:blank' || img.src.startsWith('data:'))) {
img.src = realSrc;
}
if (isStickerUrl(realSrc)) img.classList.add('spp-sticker-img');
img.removeAttribute('onload');
img.onload = null;
img.removeAttribute('onclick');
img.onclick = null;
img.removeAttribute('width');
img.style.removeProperty('width');
function dropSmallImage() {
if (img.classList.contains('spp-sticker-img')) return;
if (img.naturalWidth > 0 && img.naturalWidth < 80 && img.naturalHeight > 0 && img.naturalHeight < 80) {
img.classList.remove('spp-img');
img.classList.remove('spp-img-h', 'spp-img-v');
delete img.dataset.sppUid;
}
}
function applyImgOrientation() {
const w = img.naturalWidth, h = img.naturalHeight;
if (!w || !h) return false;
img.classList.toggle('spp-img-h', w >= h);
img.classList.toggle('spp-img-v', w < h);
return true;
}
if (img.complete) dropSmallImage();
else img.addEventListener('load', dropSmallImage, { once: true });
if (!applyImgOrientation()) img.addEventListener('load', applyImgOrientation, { once: true });
}
function processPostImages() {
document.querySelectorAll('.tpc_content img').forEach(patchImg);
}
function startObserver() {
if (observerStarted) return;
observerStarted = true;
const target = document.getElementById('main') || document.body;
new MutationObserver(mutations => {
for (const m of mutations) {
if (m.addedNodes.length) {
m.addedNodes.forEach(node => {
if (node.nodeType !== 1) return;
if (node.tagName === 'IMG' && node.closest('.tpc_content')) {
patchImg(node);
} else if (node.querySelectorAll) {
node.querySelectorAll('.tpc_content img').forEach(patchImg);
}
});
}
if (m.type === 'attributes' && m.target.tagName === 'IMG') {
const img = m.target;
if (img.closest('.tpc_content') && !img.dataset.sppUid) {
patchImg(img);
}
}
}
}).observe(target, {
childList: true, subtree: true, attributes: true,
attributeFilter: ['src', 'data-src', 'data-original', 'data-lazy-src']
});
}
function initLightbox() {
const overlay = document.createElement('div');
overlay.className = 'spp-overlay';
overlay.innerHTML = `
                <button class="spp-close" title="关闭 (Esc)">✕</button>
                <span class="spp-counter"></span>
                <div class="spp-main">
                    <button class="spp-arrow spp-arrow-left" title="上一张 (←)">‹</button>
                    <img src="" alt="">
                    <button class="spp-arrow spp-arrow-right" title="下一张 (→)">›</button>
                </div>
                <div class="spp-thumbs"></div>
            `;
document.body.appendChild(overlay);
const mainImg = overlay.querySelector('.spp-main img');
const counter = overlay.querySelector('.spp-counter');
const thumbsBar = overlay.querySelector('.spp-thumbs');
let images = [], currentIdx = 0;
function open(imgList, startIdx) {
images = imgList;
currentIdx = Math.min(Math.max(startIdx, 0), imgList.length - 1);
overlay.classList.add('spp-open');
document.body.style.overflow = 'hidden';
buildThumbs(); show(currentIdx);
}
function close() {
overlay.classList.remove('spp-open');
document.body.style.overflow = '';
mainImg.src = '';
mainImg.style.transform = ''; 
}
function show(idx) {
if (idx < 0 || idx >= images.length) return;
currentIdx = idx;
mainImg.src = images[idx].src;
mainImg.style.transform = ''; 
counter.textContent = (idx + 1) + ' / ' + images.length;
thumbsBar.querySelectorAll('.spp-thumb').forEach((t, i) => {
t.classList.toggle('spp-active', i === idx);
if (i === idx) t.scrollIntoView({ block: 'nearest', inline: 'center', behavior: 'smooth' });
});
}
function prev() { show((currentIdx - 1 + images.length) % images.length); }
function next() { show((currentIdx + 1) % images.length); }
function buildThumbs() {
thumbsBar.innerHTML = '';
images.forEach((item, i) => {
const thumb = document.createElement('img');
thumb.className = 'spp-thumb';
thumb.src = item.src;
thumb.addEventListener('click', () => show(i));
thumbsBar.appendChild(thumb);
});
}
overlay.querySelector('.spp-close').addEventListener('click', close);
overlay.querySelector('.spp-arrow-left').addEventListener('click', prev);
overlay.querySelector('.spp-arrow-right').addEventListener('click', next);
overlay.addEventListener('click', e => {
if (e.target === overlay || e.target.classList.contains('spp-main')) close();
});
document.addEventListener('keydown', e => {
if (!overlay.classList.contains('spp-open')) return;
if (e.key === 'Escape') close();
else if (e.key === 'ArrowLeft') prev();
else if (e.key === 'ArrowRight') next();
});
let wheelAccum = 0;
overlay.addEventListener('wheel', e => {
if (!overlay.classList.contains('spp-open')) return;
if (e.target.closest('.spp-thumbs')) return;
e.preventDefault();
if (settings.wheelAction === 'zoom') {
const scale = e.deltaY < 0 ? 1.15 : 0.87;
const current = mainImg.style.transform || 'scale(1)';
const curVal = parseFloat(current.replace(/[^0-9.]/g, '')) || 1;
const newVal = Math.min(Math.max(curVal * scale, 0.3), 5);
mainImg.style.transform = 'scale(' + newVal + ')';
} else {
wheelAccum += e.deltaY;
if (Math.abs(wheelAccum) < 120) return;
if (wheelAccum > 0) next();
else prev();
wheelAccum = 0;
}
}, { passive: false });
document.addEventListener('click', e => {
if (!e.target.closest || !e.target.closest('.tpc_content')) return;
let img = null;
if (e.target.tagName === 'IMG') {
img = e.target;
} else if (e.target.tagName === 'A' && e.target.children.length === 1 && e.target.children[0].tagName === 'IMG') {
img = e.target.children[0];
}
if (!img) return;
if (!isContentImage(img)) return;
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
patchImg(img);
const postContent = img.closest('.tpc_content');
postContent.querySelectorAll('img').forEach(patchImg);
const postImgs = [...postContent.querySelectorAll('img.spp-img[data-spp-uid]')];
const imgList = postImgs.map(i => ({
uid: i.dataset.sppUid,
src: getImgSrc(i) || i.src
})).filter(item => item.src);
if (!imgList.length) return;
const clickedUid = img.dataset.sppUid;
const foundIdx = imgList.findIndex(item => item.uid === clickedUid);
const startIdx = foundIdx >= 0 ? foundIdx : 0;
open(imgList, startIdx);
}, true);
}
function bootstrap() {
injectStaticStyles();
applyDynamicStyles();
initLightbox();
waitForElement('.tpc_content', 20, 500).then(function () {
processPostImages();
startObserver();
setTimeout(function () { processPostImages(); }, 3500);
});
}
onDomReady(bootstrap);
}
const CSS_MENUPOP = `
body > div.menu {
    background:#0b1119 !important; background-image:none !important; opacity:1 !important;
    border:1px solid rgba(255,255,255,.12) !important;
    border-radius:12px !important;
    box-shadow:0 18px 44px rgba(2,6,23,.62), inset 0 1px 0 rgba(255,255,255,.05) !important;
    padding:6px !important;
    color:#3ef58c !important; font-size:13.5px !important;
    max-height:min(70vh, 460px) !important; overflow:auto !important;
}
body > div.menu > .bor { background:none !important; border:0 !important; padding:0 !important; }
body > div.menu table { background:none !important; border:0 !important; width:100% !important; }
body > div.menu th.h {
    display:table-cell !important;
    background-color:rgba(255,255,255,.05) !important; background-image:none !important;
    color:#3ef58c !important; font-size:13.5px !important; font-weight:700 !important; text-align:left !important;
    padding:8px 10px !important; border:0 !important; border-radius:8px !important;
    position:sticky !important; top:0 !important; z-index:1 !important;
}
body > div.menu th.h .fr {
    float:right !important; margin:0 !important;
    width:28px !important; height:28px !important;
    position:relative !important;
    display:flex !important; align-items:center !important; justify-content:center !important;
    border-radius:8px !important; transition:background-color .18s ease !important;
}
body > div.menu th.h .fr img { display:none !important; }
body > div.menu th.h .fr::before,
body > div.menu th.h .fr::after {
    content:"" !important; position:absolute !important; left:50% !important; top:50% !important;
    width:2px !important; height:14px !important;
    background:#cfe0f2 !important; border-radius:2px !important;
    transition:background-color .18s ease !important;
}
body > div.menu th.h .fr::before { transform:translate(-50%,-50%) rotate(45deg) !important; }
body > div.menu th.h .fr::after { transform:translate(-50%,-50%) rotate(-45deg) !important; }
body > div.menu th.h .fr:hover { background-color:rgba(255,255,255,.12) !important; }
body > div.menu th.h .fr:hover::before,
body > div.menu th.h .fr:hover::after { background:#fff !important; }
body > div.menu tr.tr3 > td {
    background:none !important; border:0 !important;
    border-bottom:1px solid rgba(255,255,255,.06) !important;
    padding:8px 10px !important; color:#3ef58c !important; font-size:13.5px !important; vertical-align:middle !important;
}
body > div.menu tr.tr3:last-child > td { border-bottom:0 !important; }
body > div.menu tr.tr3:hover > td { background-color:rgba(255,255,255,.05) !important; }
body > div.menu tr.tr3 > td.tal { color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important; }
body > div.menu a { color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important; text-decoration:none !important; }
body > div.menu a:hover { color:#9dffc9 !important; -webkit-text-fill-color:#9dffc9 !important; }

body > div.menu.pad {
    background:#0d1420 !important; background-image:none !important; opacity:1 !important;
    border:1px solid rgba(255,255,255,.13) !important; border-radius:14px !important;
    box-shadow:0 20px 46px rgba(2,6,23,.66) !important;
    padding:6px 0 !important; min-width:152px !important;
}
body > div.menu.pad > ul {
    width:auto !important; margin:0 !important; padding:0 !important; list-style:none !important;
}
body > div.menu.pad > ul > li { list-style:none !important; }
body > div.menu.pad > ul > li + li { border-top:1px solid rgba(255,255,255,.06) !important; }
body > div.menu.pad > ul > li > a {
    display:flex !important; align-items:center !important; gap:9px !important;
    padding:8px 14px !important; line-height:1.2 !important;
    font-size:13px !important; text-decoration:none !important;
    color:#cfd9e3 !important; -webkit-text-fill-color:#cfd9e3 !important;
    transition:background .16s ease, color .16s ease !important;
}
body > div.menu.pad > ul > li > a::before {
    content:'' !important; flex:none !important;
    width:5px !important; height:5px !important; border-radius:50% !important;
    background:rgba(32,201,151,.55) !important;
    transition:background .16s ease, box-shadow .16s ease !important;
}
body > div.menu.pad > ul > li > a:hover {
    background:rgba(255,255,255,.07) !important;
    color:#eafff8 !important; -webkit-text-fill-color:#eafff8 !important;
}
body > div.menu.pad > ul > li > a:hover::before {
    background:#3ef58c !important; box-shadow:0 0 8px rgba(62,245,140,.55) !important;
}
`;
GM_addStyle(CSS_MENUPOP);
const CSS_SITEUI = `
html.spp-hm-star input.btn,
html.spp-hm-star button.btn,
html.spp-hm-star a.btn {
    box-sizing:border-box !important;
    height:32px !important;
    padding:0 18px !important;
    font-family:inherit !important; font-size:13px !important; font-weight:600 !important;
    line-height:1 !important; letter-spacing:.2px !important;
    background-color:rgba(32,201,151,.16) !important;
    background-image:none !important;
    border:1px solid rgba(32,201,151,.70) !important;
    border-radius:9px !important;
    color:#c9f7e4 !important; -webkit-text-fill-color:#c9f7e4 !important;
    text-shadow:none !important;
    cursor:pointer !important;
    transition:background-color .25s ease, border-color .25s ease, color .25s ease !important;
}
html.spp-hm-star input.btn:hover,
html.spp-hm-star button.btn:hover,
html.spp-hm-star a.btn:hover {
    background-color:rgba(32,201,151,.26) !important;
    border-color:rgba(32,201,151,.92) !important;
    color:#eafff6 !important; -webkit-text-fill-color:#eafff6 !important;
}
html.spp-hm-star input.btn:active,
html.spp-hm-star button.btn:active { background-color:rgba(32,201,151,.34) !important; }
html.spp-hm-star input.btn[type="reset"] {
    background-color:rgba(255,255,255,.05) !important;
    border-color:rgba(255,255,255,.10) !important;
    color:#dbe4f2 !important; -webkit-text-fill-color:#dbe4f2 !important;
}
html.spp-hm-star input.btn[type="reset"]:hover {
    background-color:rgba(220,80,70,.16) !important;
    border-color:rgba(220,80,70,.55) !important;
    color:#ffd9d4 !important; -webkit-text-fill-color:#ffd9d4 !important;
}

body > div.menu input.btn {
    box-sizing:border-box !important;
    height:30px !important;
    padding:0 18px !important;
    font-family:inherit !important; font-size:12.5px !important; font-weight:600 !important;
    line-height:1 !important; letter-spacing:.2px !important;
    background-color:rgba(32,201,151,.16) !important;
    background-image:none !important;
    border:1px solid rgba(32,201,151,.70) !important;
    border-radius:8px !important;
    color:#c9f7e4 !important; -webkit-text-fill-color:#c9f7e4 !important;
    text-shadow:none !important;
    cursor:pointer !important;
    transition:background-color .25s ease, border-color .25s ease, color .25s ease !important;
}
body > div.menu input.btn:hover {
    background-color:rgba(32,201,151,.26) !important;
    border-color:rgba(32,201,151,.92) !important;
    color:#eafff6 !important; -webkit-text-fill-color:#eafff6 !important;
}

html.spp-hm-star #u-top a#sethonor > img { display:none !important; }
html.spp-hm-star #u-top a#sethonor::before {
    content:"" !important; display:inline-block !important;
    width:12px !important; height:12px !important; margin-right:5px !important;
    vertical-align:-2px !important;
    background-repeat:no-repeat !important; background-position:center center !important;
    background-size:12px 12px !important;
    background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%238ef0b8' d='M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z'/%3E%3C/svg%3E") !important;
}
`;
GM_addStyle(CSS_SITEUI);
const CSS_BOARDTOOL = `
            #main .spp-pgbar {
                display:flex !important; align-items:center !important; justify-content:flex-start !important;
                box-sizing:border-box !important;
                gap:10px !important; min-height:54px !important; padding:9px 12px !important;
                border-radius:12px !important; border:1px solid rgba(255,255,255,.10) !important;
                background-color:rgb(0 0 0 / .86) !important;
                background-image:linear-gradient(152deg, rgba(255,255,255,.03) 0%, rgba(0,0,0,0) 55%) !important;
                -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
                backdrop-filter:blur(18px) saturate(140%) !important;
                box-shadow:0 10px 26px rgba(0,0,0,.34), inset 0 1px 0 rgba(255,255,255,.05) !important;
            }
            #main .spp-pgbar > .fl { order:1 !important; }
            #main .spp-pgbar > .c  { display:none !important; }
            #main .spp-pgbar > .fr { order:2 !important; }
            #main .spp-pgbar > .fr.spp-pg-mid  { order:3 !important; }
            #main .spp-pgbar > .fr.spp-pg-flex { margin-left:auto !important; }
            #main .spp-pgbar .pages {
                height:auto !important; line-height:1 !important; margin:0 !important; padding:0 !important;
                border:0 !important; background:none !important; float:none !important;
            }
            #main .spp-pgbar .pages ul {
                display:flex !important; align-items:center !important; gap:6px !important;
                margin:0 !important; padding:0 !important; list-style:none !important;
            }
            #main .spp-pgbar .pages ul li {
                display:inline-flex !important; float:none !important;
                margin:0 !important; padding:0 !important; list-style:none !important;
                border:0 !important;
            }
            #main .spp-pgbar .pages ul li a,
            #main .spp-pgbar .pages ul li b {
                display:inline-flex !important; align-items:center !important; justify-content:center !important;
                box-sizing:border-box !important;
                height:32px !important; min-width:32px !important; padding:0 10px !important; margin:0 !important;
                font-size:13.5px !important; font-weight:500 !important; line-height:1 !important;
                text-decoration:none !important; border-radius:9px !important;
                border:1px solid rgba(255,255,255,.10) !important;
                background-color:rgba(255,255,255,.05) !important; background-image:none !important;
                color:#dbe4f2 !important; -webkit-text-fill-color:#dbe4f2 !important;
                transition:transform .22s ease, background-color .22s ease, border-color .22s ease, color .22s ease !important;
            }
            #main .spp-pgbar .pages ul li a:hover {
                background-color:rgba(32,201,151,.14) !important; border-color:rgba(32,201,151,.55) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important; transform:translateY(-1px) !important;
            }
            #main .spp-pgbar .pages ul li b {
                background-color:rgba(32,201,151,.16) !important; border-color:rgba(32,201,151,.70) !important;
                color:#c9f7e4 !important; -webkit-text-fill-color:#c9f7e4 !important; font-weight:700 !important;
            }
            #main .spp-pgbar .pages ul li.pagesone {
                display:inline-flex !important; align-items:center !important; gap:8px !important;
                margin-left:12px !important; padding:0 2px !important;
                color:#9aa8bd !important; -webkit-text-fill-color:#9aa8bd !important;
                font-size:13px !important; white-space:nowrap !important;
            }
            #main .spp-pgbar .pages ul li.pagesone input {
                box-sizing:border-box !important; height:30px !important; width:62px !important; padding:0 6px !important;
                font-size:13px !important; text-align:center !important; border-radius:8px !important;
                border:0 !important; outline:none !important;
                background-color:#05070b !important; background-image:none !important;
                color:#e6edf7 !important; -webkit-text-fill-color:#e6edf7 !important;
                transition:background-color .22s ease, box-shadow .22s ease !important;
                --spp-go-bg:#141922; --spp-go-bd:1px; --spp-go-bdc:rgba(255,255,255,.16);
                --spp-go-sh:inset 0 1px 0 rgba(255,255,255,.04);
            }
            #main .spp-pgbar .pages ul li.pagesone input:focus {
                background-color:#1b2331 !important;
                box-shadow:0 0 0 2px rgba(32,201,151,.30) !important;
                --spp-go-bg:#1b2331; --spp-go-bdc:rgba(32,201,151,.75);
                --spp-go-sh:0 0 0 2px rgba(32,201,151,.30);
            }
            #main .spp-postbtn {
                position:relative !important; display:inline-flex !important; align-items:center !important; gap:7px !important;
                box-sizing:border-box !important;
                height:34px !important; padding:0 16px 0 13px !important; margin-left:auto !important;
                background-color:#09090b !important; background-image:none !important;
                color:#e2e8f0 !important; -webkit-text-fill-color:#e2e8f0 !important;
                font-size:12.5px !important; font-weight:600 !important; line-height:1 !important;
                border:1.58px solid #52525b !important; border-radius:8px !important;
                text-decoration:none !important; cursor:pointer !important; overflow:visible !important;
                transition:color .3s ease, border-color .3s ease, background-color .3s ease !important;
            }
            #main .spp-pgbar .pages ul li a.spp-pg-off {
                opacity:.30 !important; pointer-events:none !important; cursor:default !important;
            }
            #main .spp-postbtn > img { display:none !important; }
            #main .spp-postbtn:hover {
                color:#fff !important; -webkit-text-fill-color:#fff !important;
                border-color:rgba(32,201,151,.55) !important; background-color:#0d0d10 !important;
            }
            #main .spp-postbtn .spp-post-ico { position:relative !important; z-index:1 !important; width:11px !important; height:11px !important; }
            #main .spp-postbtn .spp-post-ico::before,
            #main .spp-postbtn .spp-post-ico::after {
                content:"" !important; position:absolute !important; left:50% !important; top:50% !important;
                transform:translate(-50%,-50%) !important; background-color:#8ef0b8 !important; border-radius:1px !important;
            }
            #main .spp-postbtn .spp-post-ico::before { width:11px !important; height:2px !important; }
            #main .spp-postbtn .spp-post-ico::after { width:2px !important; height:11px !important; }
            #main .spp-postbtn .spp-post-txt { position:relative !important; z-index:1 !important; }
            #main .spp-postbtn .spp-post-glow {
                pointer-events:none !important; position:absolute !important; inset:0 !important;
                --w:2px; --t:-8px; --s:calc(var(--t) * -1); --e:calc(100% + var(--t));
                --g:#0000, rgba(255,255,255,.20) var(--s), rgba(255,255,255,.65) var(--s), #fff,
                    rgba(255,255,255,.65) var(--e), rgba(255,255,255,.20) var(--e), #0000;
            }
            #main .spp-postbtn .spp-post-glow > i { position:absolute !important; }
            #main .spp-postbtn .spp-pb-l { left:-2px !important; top:var(--t) !important; bottom:var(--t) !important;   width:var(--w) !important;  background-image:linear-gradient(var(--g)) !important; }
            #main .spp-postbtn .spp-pb-r { right:-2px !important; top:var(--t) !important; bottom:var(--t) !important;  width:var(--w) !important;  background-image:linear-gradient(var(--g)) !important; }
            #main .spp-postbtn .spp-pb-t { top:-2px !important; left:var(--t) !important; right:var(--t) !important;    height:var(--w) !important; background-image:linear-gradient(90deg, var(--g)) !important; }
            #main .spp-postbtn .spp-pb-b { bottom:-2px !important; left:var(--t) !important; right:var(--t) !important; height:var(--w) !important; background-image:linear-gradient(90deg, var(--g)) !important; }
            #main .spp-postbtn .spp-post-glow > i::before {
                content:"" !important; position:absolute !important; inset:0 !important;
                background:inherit !important; filter:blur(4px) !important; z-index:-2 !important;
            }
            #main .spp-postbtn .spp-post-glow > i::after {
                content:"" !important; position:absolute !important; inset:0 !important;
                background:inherit !important; filter:blur(10px) !important; opacity:0 !important;
                z-index:-2 !important; transition:opacity .3s ease !important;
            }
            #main .spp-postbtn:hover .spp-post-glow > i::after { opacity:1 !important; }
            #main .spp-postbtn .spp-pb-backdrop {
                position:absolute !important; inset:0 !important; z-index:-1 !important;
                background-image:radial-gradient(circle at 50% 50%, #0000 0, #0000 20%, rgba(17,17,17,.55) 50%) !important;
                background-size:3px 3px !important;
            }
            #main .spp-postbtn::before {
                content:"" !important; position:absolute !important; inset:0 !important; opacity:0 !important;
                border-radius:inherit !important; transition:opacity .3s ease !important;
                background-image:radial-gradient(circle at 50% 50%, #0000 0, #0000 20%, rgba(17,17,17,.67) 50%),
                                 radial-gradient(ellipse 100% 100%, rgba(255,255,255,.85), rgba(255,255,255,0)) !important;
                background-size:3px 3px, auto auto !important;
            }
            #main .spp-postbtn:hover::before { opacity:.3 !important; }
            #spp-btabs #breadcrumbs {
                display:flex !important; align-items:center !important; margin-left:auto !important;
                padding:0 !important; height:auto !important; min-height:0 !important; float:none !important;
                background:none !important; background-color:transparent !important; border:none !important;
                font-size:13px !important; gap:2px !important; min-height:24px !important;
            }
            #spp-btabs #breadcrumbs .crumbs-item {
                display:inline-flex !important; align-items:center !important; padding:0 !important;
                background:none !important; font-size:13px !important; line-height:1.2 !important;
            }
            #spp-btabs #breadcrumbs .crumbs-item i { display:none !important; }
            #spp-btabs #breadcrumbs .crumbs-item.gray3 {
                color:#8b9ab1 !important; -webkit-text-fill-color:#8b9ab1 !important; text-decoration:none !important;
            }
            #spp-btabs #breadcrumbs .crumbs-item.gray3:hover {
                color:#e2e8f0 !important; -webkit-text-fill-color:#e2e8f0 !important;
            }
            #spp-btabs #breadcrumbs #td_cate:not(.spp-hbtn-hit) {
                width:15px !important; height:15px !important; margin:0 9px 0 2px !important;
                filter:invert(1) brightness(1.5) opacity(.66) !important; cursor:pointer !important;
            }
            #spp-btabs #breadcrumbs .crumbs-item.current {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
            }
            #spp-btabs #breadcrumbs .crumbs-item.current > strong > a {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                font-weight:600 !important; text-decoration:none !important;
            }
            #spp-btabs #breadcrumbs .crumbs-item + .crumbs-item::before {
                content:"›" !important; display:inline-block !important;
                margin:0 10px !important; padding:0 !important;
                color:rgba(32,201,151,.72) !important; -webkit-text-fill-color:rgba(32,201,151,.72) !important;
                font-size:16px !important; font-weight:400 !important; line-height:1 !important;
                vertical-align:middle !important; transform:none !important;
            }
            #spp-btabs #breadcrumbs .threadno,
            #spp-btabs #breadcrumbs .threadrss { display:none !important; }
            #spp-btabs #breadcrumbs .fr.gray3 { margin-left:60px !important; float:none !important; }
            #spp-btabs #breadcrumbs a.s3 {
                display:inline-flex !important; align-items:center !important; height:24px !important;
                padding:0 12px !important; border-radius:999px !important; white-space:nowrap !important;
                border:1px solid rgba(32,201,151,.45) !important; background-color:rgba(32,201,151,.12) !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                font-size:12px !important; font-weight:600 !important; text-decoration:none !important;
                transition:background-color .22s ease, border-color .22s ease, color .22s ease !important;
            }
            #spp-btabs #breadcrumbs a.s3:hover {
                background-color:rgba(32,201,151,.20) !important; border-color:rgba(32,201,151,.75) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
            }
            #main:has(#thread_img) > div.t.z { display:none !important; }

            /* ===== SPP-T5BAR-BEGIN ===== */
            #main .spp-t5bar {
                background-color:#0e1116 !important; background-image:none !important;
                border:0 !important; border-radius:12px !important;
                box-shadow:inset 0 1px 0 rgba(255,255,255,.04) !important;
                margin:6px 0 0 !important; padding:9px 12px !important;
                color:#dbe4f2 !important; font-size:13.5px !important;
                position:relative !important; z-index:40 !important;
            }
            #main .spp-t5bar tr { animation:none !important; transform:none !important; }
            #main .spp-t5bar > table.f_one { background:none !important; border:0 !important; padding:0 !important; box-shadow:none !important; }
            #main .spp-t5bar tbody,
            #main .spp-t5bar tr { background:none !important; border:0 !important; }
            #main .spp-t5bar td { border:0 !important; padding:0 !important; vertical-align:middle !important; background:none !important; }
            #main .spp-t5bar tr:hover > td { background:none !important; }
            #main .spp-t5bar form { display:inline-flex !important; align-items:center !important; margin:0 !important; }
            #main .spp-t5bar select {
                -webkit-appearance:none !important; appearance:none !important;
                box-sizing:border-box !important; height:32px !important; margin:0 8px 0 0 !important; padding:0 26px 0 10px !important;
                font-family:inherit !important; font-size:13.5px !important; line-height:1 !important; vertical-align:middle !important;
                color:#dbe4f2 !important; background-color:rgba(255,255,255,.05) !important;
                background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='6'%3E%3Cpath d='M0 0h9L4.5 6z' fill='%239aa8bd'/%3E%3C/svg%3E") !important;
                background-repeat:no-repeat !important; background-position:right 9px center !important; background-size:9px 6px !important;
                border:1px solid rgba(255,255,255,.10) !important; border-radius:9px !important;
                cursor:pointer !important; transition:background-color .25s ease, border-color .25s ease !important;
            }
            #main .spp-t5bar select:hover { background-color:rgba(255,255,255,.09) !important; border-color:rgba(255,255,255,.20) !important; }
            #main .spp-t5bar input.btn {
                box-sizing:border-box !important; height:32px !important; margin:0 0 0 2px !important; padding:0 16px !important;
                font-family:inherit !important; font-size:13.5px !important; font-weight:600 !important; line-height:1 !important; vertical-align:middle !important;
                color:#c9f7e4 !important; background-color:rgba(32,201,151,.16) !important;
                border:1px solid rgba(32,201,151,.70) !important; border-radius:9px !important;
                cursor:pointer !important; transition:background-color .25s ease, border-color .25s ease !important;
            }
            #main .spp-t5bar input.btn:hover { background-color:rgba(32,201,151,.26) !important; border-color:rgba(32,201,151,.92) !important; color:#eafff6 !important; }
            #main .spp-t5bar a.abtn {
                box-sizing:border-box !important; display:inline-flex !important; align-items:center !important;
                height:32px !important; margin:0 0 0 8px !important; padding:0 12px !important;
                font-size:13px !important; line-height:1 !important; vertical-align:middle !important;
                color:#dbe4f2 !important; background-color:rgba(255,255,255,.05) !important;
                border:1px solid rgba(255,255,255,.10) !important; border-radius:9px !important;
                text-decoration:none !important; text-shadow:none !important;
                transition:background-color .25s ease, border-color .25s ease !important;
            }
            #main .spp-t5bar a.abtn:hover { background-color:rgba(255,255,255,.10) !important; border-color:rgba(255,255,255,.20) !important; color:#fff !important; }
            #main .spp-t5bar a.abtn img { display:none !important; }
            #main .spp-t5bar #readlog::after,
            #main .spp-t5bar #threadlog::after {
                content:'▾' !important; margin-left:6px !important; font-size:10px !important; line-height:1 !important; color:#9aa8bd !important;
            }

            #main .spp-t5bar { overflow:visible !important; }
            #main .spp-dd { position:relative; display:inline-flex; vertical-align:middle; margin:0 8px 0 0; }
            #main .spp-dd > select { display:none !important; }
            #main .spp-dd-btn {
                box-sizing:border-box; display:inline-flex; align-items:center; gap:9px;
                height:32px; padding:0 11px; font-family:inherit; font-size:13.5px; line-height:1;
                color:#dbe4f2; background-color:rgba(255,255,255,.05);
                border:1px solid rgba(255,255,255,.10); border-radius:9px; cursor:pointer;
                transition:background-color .25s ease, border-color .25s ease, color .25s ease;
            }
            #main .spp-dd-btn:hover { background-color:rgba(255,255,255,.09); border-color:rgba(255,255,255,.20); }
            #main .spp-dd.is-open .spp-dd-btn { background-color:#0b1119; border-color:rgba(32,201,151,.62); color:#fff; }
            #main .spp-dd-txt { flex:1 1 auto; text-align:left; }
            #main .spp-dd-caret {
                flex:0 0 auto; width:8px; height:8px;
                border-right:1.6px solid #9aa8bd; border-bottom:1.6px solid #9aa8bd;
                transform:translateY(-2px) rotate(45deg);
                transition:transform .22s ease, border-color .22s ease;
            }
            #main .spp-dd.is-open .spp-dd-caret { transform:translateY(1px) rotate(-135deg); border-color:#8ef0b8; }
            #main .spp-dd-pop {
                position:absolute; top:calc(100% + 7px); left:0; z-index:200;
                min-width:calc(100% + 24px); max-height:286px; overflow:auto; padding:6px;
                background-color:#0b1119; border:1px solid rgba(255,255,255,.12); border-radius:11px;
                box-shadow:0 18px 44px rgba(2,6,23,.62), inset 0 1px 0 rgba(255,255,255,.05);
                opacity:0; visibility:hidden; transform:translateY(-6px) scale(.985); transform-origin:top left;
                transition:opacity .18s ease, transform .18s ease, visibility .18s ease;
            }
            #main .spp-dd.is-open .spp-dd-pop { opacity:1; visibility:visible; transform:translateY(0) scale(1); }
            #main .spp-dd-opt {
                display:flex; align-items:center; gap:10px;
                padding:7px 10px; border-radius:7px; font-size:13px; line-height:1.35;
                color:#3ef58c; white-space:nowrap; cursor:pointer;
                transition:background-color .16s ease, color .16s ease;
            }
            #main .spp-dd-opt.is-hi { background-color:rgba(255,255,255,.07); color:#9dffc9; }
            #main .spp-dd-opt.is-on { color:#3ef58c; background-color:rgba(32,201,151,.14); }
            #main .spp-dd-opt.is-on.is-hi { background-color:rgba(32,201,151,.22); color:#9dffc9; }
            #main .spp-dd-opt.is-on::after { content:'✓' !important; margin-left:auto; font-size:11px; color:#8ef0b8; }
            #main .spp-dd-pop::-webkit-scrollbar { width:9px; }
            #main .spp-dd-pop::-webkit-scrollbar-thumb { background:rgba(255,255,255,.14); border-radius:9px; }

                        /* ===== SPP-T5BAR-END ===== */

            /* ===== SPP-BOARDTOOL-END ===== */
`;
const CSS_HOTBOARD = `
/* ===== SPP-HOTBOARD-BEGIN ===== */
            #infobox.spp-up-on td.spp-up-host-td > .hb-wrap { width:100% !important; min-width:0; }
            #infobox.spp-up-on .hb-hd {
                display:flex !important; align-items:center !important; gap:9px !important;
                margin:0 0 11px !important;
            }
            #infobox.spp-up-on .hb-hd__t {
                font-size:13.5px !important; font-weight:700 !important; letter-spacing:.3px !important;
                color:#eef3fb !important; -webkit-text-fill-color:#eef3fb !important;
            }
            #infobox.spp-up-on .hb-hd__n {
                font-size:11px !important; font-weight:700 !important; line-height:1.6 !important;
                color:#dbe6f7 !important; -webkit-text-fill-color:#dbe6f7 !important;
                padding:0 8px !important; border-radius:999px !important;
                background:rgba(120,150,220,.20) !important; border:1px solid rgba(150,180,240,.30) !important;
            }
            #infobox.spp-up-on .hb-hd__hint {
                font-size:11.5px !important; margin-left:auto !important;
                color:#8798a8 !important; -webkit-text-fill-color:#8798a8 !important;
            }
            #infobox.spp-up-on .hb-grid .spp-hm-stat { text-decoration:none !important; cursor:pointer; }
            #infobox.spp-up-on .hb-grid .spp-hm-stat .v {
                white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
            }
            #infobox.spp-up-on .hb-grid .spp-hm-stat.is-cur {
                border-color:rgba(32,201,151,.58) !important;
                background:linear-gradient(180deg, rgba(32,201,151,.20), rgba(255,255,255,.02)) !important;
            }
            #infobox.spp-up-on .hb-grid .spp-hm-stat.is-cur .v { color:#8ef0b8 !important; }
            #infobox.spp-up-on .hb-grid .spp-hm-stat.is-cur .k { color:#a9d8cd !important; }
            #infobox.spp-up-on td.spp-up-host-td > #fav-fid { display:none !important; }
/* ===== SPP-HOTBOARD-END ===== */
`;
const PIN_SKIP_FILES = ['login.php', 'register.php', 'post.php', 'job.php', 'plugin.php', 'pw_ajax.php', 'ck.php'];
const PIN_SESSION_KEY = 'spp-pin-skipped:';
function initPinDomain() {
const domain = pinDomain();
const stamp = function (v) {
try { document.documentElement.setAttribute('data-spp-pin', v); } catch (e) { }
};
if (domain === PIN_OFF) { stamp('off'); return; }
try { if (window.top !== window.self) { stamp('skip:frame'); return; } } catch (e) { stamp('skip:frame'); return; }
const host = location.hostname.toLowerCase();
const target = pinTargetHost(host, domain);
if (target === host) { stamp('here:' + host); return; }
if (PIN_SKIP_FILES.indexOf(FILE) >= 0) { stamp('skip:file:' + FILE); return; }
try {
const key = PIN_SESSION_KEY + host;
const last = parseInt(sessionStorage.getItem(key) || '0', 10);
if (last && (Date.now() - last) < 60000) { stamp('skip:recent:' + target); return; }
sessionStorage.setItem(key, String(Date.now()));
} catch (e) {  }
pinReachable(target).then(function (r) {
stamp((r.ok ? 'jump:' : 'fail:') + target);
if (r.ok) location.replace('https://' + target + PATH + SEARCH + (location.hash || ''));
});
}
const SPP_STAR_FID = 43;
const SPP_SCHEME_STAR = (sppFidNum() === SPP_STAR_FID);
function initThreadListConvert() {
if (!PAGE.board) return;
GM_addStyle(`
            #wall ul.stream > li .inner { overflow: visible !important; height: auto !important; }
            #wall ul.stream > li:not(.spp-tl-list) .section-title {
                font-size:13px !important;
                height:auto !important;
                min-height:50px !important;
                white-space: normal !important;
                overflow: visible !important;
                text-overflow: clip !important;
            }
            #wall ul.stream > li.spp-tl-list {
                float:none !important; clear:both !important; width:100% !important;
                height:auto !important; padding:0 !important; margin:0 !important;
                display:block !important; border-bottom:1px solid #e8e8e8; box-sizing:border-box !important;
            }
            .spp-tl-list > .inner {
                display:flex !important; flex-direction:row !important; flex-wrap:wrap !important;
                align-items:flex-start !important; width:100% !important; height:auto !important;
                padding:30px 20px !important; gap:0 !important; box-sizing:border-box !important;
                position:relative !important;
            }
            .spp-tl-list .section-text div { display:none !important; }
            .spp-tl-list .section-title {
                flex:0 0 100% !important; width:100% !important; min-width:0 !important;
                font-size:15px !important; font-weight:bold !important;
                line-height:1.5 !important; padding:0 !important; margin:0 0 6px 0 !important;
                height:auto !important; display:block !important;
            }
            .spp-tl-list .section-title a { text-decoration:none !important; }
            .spp-tl-list .section-intro, .spp-tl-list .section-intro[style] {
                flex:1 1 auto !important; position:static !important; width:auto !important;
                padding:0 !important; border-radius:0 !important; font-size:12px !important;
                margin:0 !important; height:auto !important;
                background:transparent !important; background-color:transparent !important;
                color:#999 !important; line-height:1.4 !important; order:2 !important;
            }
            .spp-tl-list .section-intro table { width:auto !important; background:transparent !important; background-color:transparent !important; }
            .spp-tl-list .section-intro td, .spp-tl-list .section-intro td[style] {
                padding:0 !important; white-space:nowrap !important; color:#999 !important;
                background:transparent !important; background-color:transparent !important; font-size:12px !important;
            }
            .spp-tl-list .section-intro a, .spp-tl-list .section-intro a[style] { color:#999 !important; text-decoration:none !important; }
            .spp-tl-list .section-text {
                flex:0 0 auto !important; display:flex !important; align-items:center !important;
                gap:6px !important; font-size:12px !important; line-height:1.4 !important;
                white-space:nowrap !important; padding:0 !important; margin:0 !important;
                height:auto !important; color:#999 !important; order:3 !important;
            }
            .spp-tl-list .section-text > span { float:none !important; color:#999 !important; }
            .spp-tl-list .clear { display:none !important; }
            .spp-tl-list .inner > span.s3 { display:none !important; }

            #wall ul.stream > li:not(.spp-tl-list) {
                float:none !important; clear:both !important;
                width:100% !important; height:auto !important;
                margin:0 0 12px 0 !important; padding:0 !important;
                box-sizing:border-box !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) > .inner {
                display:grid !important;
                grid-template-columns:200px minmax(0,1fr) !important;
                grid-template-areas:"thumb title" "thumb meta" "thumb foot" !important;
                gap:5px 18px !important; padding:15px 18px !important;
                height:auto !important; overflow:visible !important;
                align-content:start !important; box-sizing:border-box !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-text { display:contents !important; }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > div { grid-area:thumb !important; overflow:hidden !important; border-radius:6px !important; }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > div img {
                width:100% !important; height:130px !important;
                object-fit:cover !important; object-position:center top !important;
                display:block !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > div img ~ img { display:none !important; }
            #wall ul.stream > li:not(.spp-tl-list) .section-title {
                grid-area:title !important; margin:0 !important;
                height:auto !important; min-height:0 !important; max-height:none !important;
                font-size:15px !important; font-weight:600 !important; line-height:1.45 !important;
                white-space:normal !important; overflow:visible !important; text-overflow:clip !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .spp-card-meta {
                grid-area:meta !important; display:flex !important; align-items:center !important;
                flex-wrap:wrap !important; gap:6px 16px !important;
                font-size:12px !important; line-height:1.5 !important;
                color:var(--spu-secondary) !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .spp-card-meta > span {
                float:none !important; color:var(--spu-secondary) !important; white-space:nowrap !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-intro,
            #wall ul.stream > li:not(.spp-tl-list) .section-intro[style] {
                grid-area:foot !important; position:static !important;
                background:transparent !important; background-color:transparent !important;
                width:auto !important; height:auto !important; padding:0 !important;
                color:var(--spu-secondary) !important; font-size:12px !important;
                border-radius:0 !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-intro tbody,
            #wall ul.stream > li:not(.spp-tl-list) .section-intro tr {
                display:flex !important; justify-content:flex-start !important;
                align-items:baseline !important; gap:18px !important; width:100% !important;
                background:transparent !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-intro td,
            #wall ul.stream > li:not(.spp-tl-list) .section-intro td[style] {
                display:block !important; width:auto !important; padding:0 !important;
                background:transparent !important; background-color:transparent !important;
                color:var(--spu-secondary) !important; font-size:12px !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .clear { display:none !important; }

            #wall ul.stream > li.spp-tl-list > .inner {
                padding:11px 18px !important; align-items:center !important; row-gap:2px !important;
            }
            #wall ul.stream > li.spp-tl-list .section-title {
                font-size:14px !important; margin:0 0 3px 0 !important;
                min-height:0 !important; line-height:1.45 !important;
            }
            #wall ul.stream > li.spp-tl-list.spp-has-meta .section-text { display:none !important; }
            #wall ul.stream > li.spp-tl-list .spp-card-meta {
                flex:0 0 auto !important; display:flex !important; align-items:center !important;
                gap:14px !important; margin-left:auto !important; order:3 !important;
                font-size:12px !important; line-height:1.5 !important;
                color:var(--spu-secondary) !important;
            }
            #wall ul.stream > li.spp-tl-list .spp-card-meta > span {
                float:none !important; color:var(--spu-secondary) !important; white-space:nowrap !important;
            }
            #wall ul.stream > li.spp-tl-list .spp-tl-author-line { color:var(--spu-secondary) !important; }
            #wall ul.stream > li.spp-tl-list .section-intro,
            #wall ul.stream > li.spp-tl-list .section-intro[style] { color:var(--spu-secondary) !important; }

            #main #ajaxtable tr.tr2 > td {
                background:var(--spu-overlay) !important;
                color:var(--spu-secondary) !important;
                font-size:12px !important; font-weight:600 !important;
                padding:7px 8px !important;
            }
            #main #ajaxtable tr.tr3 > td, #main #ajaxtable tr.tr3 > th {
                padding:7px 6px !important; vertical-align:middle !important;
                white-space:nowrap !important;
            }
            #main #ajaxtable tr.tr3 > td.tal.y-style.f10 { font-size:11px !important; }

            #wall ul.stream > li:not(.spp-tl-list) > .inner {
                position:relative !important;
                grid-template-rows:auto auto auto !important;
                align-content:center !important; align-items:start !important;
                gap:4px 18px !important;
                min-height:163px !important; height:auto !important;
                overflow:visible !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-text {
                grid-area:thumb !important; position:static !important;
                display:block !important; width:200px !important; height:0 !important;
                overflow:visible !important; margin:0 !important; padding:0 !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > span { display:none !important; }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > div {
                position:absolute !important; left:0 !important; top:50% !important;
                transform:translateY(-50%) !important;
                margin:0 !important; padding:0 !important;
                width:200px !important; height:133px !important;
                overflow:hidden !important; border-radius:6px !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > div img {
                width:200px !important; max-width:none !important; height:133px !important;
                object-fit:cover !important; object-position:center top !important;
                display:block !important; border:0 !important; padding:0 !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) > .inner {
                grid-template-areas:"thumb title" "thumb foot" "thumb meta" !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .spp-card-meta {
                justify-content:flex-end !important; width:100% !important;
            }

            #wall ul.stream > li.spp-tl-list > .inner {
                padding:9px 18px !important; row-gap:1px !important;
            }

            #wall ul.stream {
                display:grid !important;
                grid-template-columns:repeat(3, minmax(0, 1fr)) !important;
                gap:12px !important;
                float:none !important;
                width:auto !important;
                margin:0 !important;
                padding:0 !important;
                list-style:none !important;
            }
            #wall ul.stream > li,
            #wall ul.stream > li.spp-tl-list,
            #wall ul.stream > li:not(.spp-tl-list) {
                float:none !important; clear:none !important;
                width:auto !important; height:auto !important;
                min-width:0 !important;
                margin:0 !important; padding:0 !important;
                border-bottom:0 !important;
                display:flex !important;
                align-items:stretch !important;
                box-sizing:border-box !important;
            }

            #wall ul.stream > li:not(.spp-tl-list) > .inner,
            #wall ul.stream > li.spp-tl-list > .inner {
                position:relative !important;
                display:flex !important;
                flex-direction:column !important;
                width:100% !important;
                height:auto !important;
                min-height:0 !important;
                padding:2px !important;
                margin:0 !important;
                border-radius:10px !important;
                background:#131a2a !important;
                box-shadow:0 0 3px 1px #00000088 !important;
                overflow:hidden !important;
                box-sizing:border-box !important;
                transition:box-shadow .3s ease !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) > .inner::before,
            #wall ul.stream > li.spp-tl-list > .inner::before {
                content:'' !important;
                position:absolute !important;
                top:50% !important; left:50% !important;
                width:80px !important; height:620px !important;
                margin:-310px 0 0 -40px !important;
                background:linear-gradient(#ff2288, #387ef0) !important;
                opacity:0 !important;
                transition:opacity .3s !important;
                /* ★ t60b:和 neon-sweep 同理——静止时(opacity:0 看不见)不声明 animation,连动画对象都不建;只留 keyframes 与悬停声明 */
                pointer-events:none !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) > .inner::after,
            #wall ul.stream > li.spp-tl-list > .inner::after {
                content:'' !important;
                position:absolute !important; inset:0 !important;
                background:rgba(19,26,42,.62) !important;
                backdrop-filter:blur(50px) !important;
                -webkit-backdrop-filter:blur(50px) !important;
                pointer-events:none !important;
            }
            #wall ul.stream > li:not(.spp-tl-list):hover > .inner::before,
            #wall ul.stream > li.spp-tl-list:hover > .inner::before {
                opacity:1 !important; animation:spp-card-spin 8s linear infinite !important;   /* ★ t60b:悬停才创建 */
            }
            #wall ul.stream > li:not(.spp-tl-list):hover > .inner,
            #wall ul.stream > li.spp-tl-list:hover > .inner {
                box-shadow:0 0 24px -2px rgba(61,106,255,.5), 0 0 3px 1px #00000088 !important;
            }
            @keyframes spp-card-spin { 0% { transform:rotate(0) } 100% { transform:rotate(360deg) } }

            #wall ul.stream > li > .inner > span.section-title,
            #wall ul.stream > li > .inner > span.section-text,
            #wall ul.stream > li > .inner > div.spp-card-meta,
            #wall ul.stream > li > .inner > span.section-intro {
                position:relative !important;
                z-index:1 !important;
            }

            #wall ul.stream > li:not(.spp-tl-list) .section-text {
                display:block !important;
                order:1 !important;
                position:static !important;
                flex:0 0 auto !important;
                width:100% !important;
                height:150px !important;
                margin:0 !important; padding:0 !important;
                overflow:hidden !important;
                border-radius:8px 8px 0 0 !important;
                background:#0b1120 !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > div {
                position:static !important;
                width:100% !important; height:100% !important;
                left:auto !important; top:auto !important;
                transform:none !important;
                margin:0 !important; padding:0 !important;
                border-radius:0 !important;
                overflow:hidden !important;
                background:none !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-text > div img {
                width:100% !important; max-width:none !important; height:150px !important;
                object-fit:cover !important; object-position:center !important;
                display:block !important; border:0 !important; padding:0 !important;
            }
            #wall ul.stream > li .section-text > div img ~ img { display:none !important; }

            #wall ul.stream > li .section-title {
                flex:1 1 auto !important;
                box-sizing:border-box !important;
                width:auto !important;
                max-width:100% !important;
                min-width:0 !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-title {
                order:2 !important;
                margin:13px 15px 0 15px !important;
                height:auto !important; min-height:0 !important;
                max-height:none !important;
                font-size:15.5px !important; font-weight:700 !important; line-height:1.55 !important;
                white-space:normal !important;
                overflow:hidden !important; text-overflow:clip !important;
                display:-webkit-box !important;
                -webkit-line-clamp:2 !important;
                -webkit-box-orient:vertical !important;
                word-break:break-word !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-title a {
                text-decoration:none !important;
            }

            #wall ul.stream > li:not(.spp-tl-list) .section-intro,
            #wall ul.stream > li:not(.spp-tl-list) .section-intro[style] {
                order:3 !important;
                position:static !important;
                display:block !important;
                grid-area:auto !important;
                background:transparent !important; background-color:transparent !important;
                width:auto !important; height:auto !important;
                padding:0 !important; margin:9px 15px 0 15px !important;
                color:var(--spu-secondary) !important;
                overflow:visible !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .section-intro table { display:none !important; }

            #wall ul.stream > li:not(.spp-tl-list) .spp-card-meta {
                order:4 !important;
                grid-area:auto !important;
                margin:auto 15px 0 15px !important;
                padding-top:10px !important;
                display:flex !important; align-items:center !important;
                flex-wrap:nowrap !important; gap:12px !important;
                border-top:1px solid rgba(120,150,220,.10) !important;
                font-size:11.5px !important; line-height:1.5 !important;
                color:var(--spu-secondary) !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .spp-card-meta > span {
                float:none !important;
                color:var(--spu-secondary) !important;
                white-space:nowrap !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) .spp-card-meta > span:first-child { margin-right:auto !important; }

            #wall ul.stream > li.spp-tl-list > .inner {
                padding:2px !important;
                padding-top:114px !important;
                justify-content:flex-start !important;
                background:#131a2a !important;
            }
            #wall ul.stream > li.spp-tl-list > .inner > * { position:relative !important; z-index:1 !important; }

            #wall ul.stream > li.spp-tl-list > .inner::before {
                content:'' !important;
                position:absolute !important;
                left:0 !important; right:0 !important; top:0 !important;
                height:112px !important;
                margin:0 !important;
                background:
                    radial-gradient(34% 40% at 26% 30%, hsl(var(--spp-h1, 220) 78% 58% / .34), transparent 70%),
                    radial-gradient(30% 36% at 68% 22%, hsl(var(--spp-h2, 278) 80% 60% / .27), transparent 72%),
                    radial-gradient(26% 32% at 48% 52%, hsl(var(--spp-h1, 220) 72% 54% / .18), transparent 74%) !important;
                filter:blur(26px) !important;
                backdrop-filter:none !important;
                -webkit-backdrop-filter:none !important;
                opacity:1 !important;
                transform-origin:50% 50% !important;
                animation:spp-aurora 18s ease-in-out infinite !important;
                animation-delay:calc(var(--spp-idx, 0) * -0.5s) !important;
                animation-play-state:running !important;
                -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 42%,transparent 100%) !important;
                mask-image:linear-gradient(180deg,#000 0%,#000 42%,transparent 100%) !important;
                pointer-events:none !important;
            }
            #wall ul.stream > li.spp-tl-list > .inner::after {
                content:none !important;
                background:none !important;
                backdrop-filter:none !important;
                -webkit-backdrop-filter:none !important;
                animation:none !important;
            }
            #wall ul.stream > li.spp-tl-list:hover > .inner::before {
                opacity:1 !important;
                animation-play-state:running !important;
            }
            @keyframes spp-aurora {
                0%   { transform:translate3d(-7%,  3%,0) scale(1.00) rotate(0deg) }
                33%  { transform:translate3d( 5%, -5%,0) scale(1.12) rotate(7deg) }
                66%  { transform:translate3d(-3%,  5%,0) scale(1.05) rotate(-5deg) }
                100% { transform:translate3d(-7%,  3%,0) scale(1.00) rotate(0deg) }
            }

            #wall ul.stream > li.spp-tl-list .section-text { display:none !important; }
            #wall ul.stream > li.spp-tl-list .section-title {
                order:1 !important;
                margin:13px 15px 0 15px !important;
                height:auto !important; min-height:0 !important; max-height:none !important;
                font-size:15.5px !important; font-weight:700 !important; line-height:1.55 !important;
                white-space:normal !important; overflow:hidden !important; text-overflow:clip !important;
                display:-webkit-box !important;
                -webkit-line-clamp:2 !important;
                -webkit-box-orient:vertical !important;
                word-break:break-word !important;
            }
            #wall ul.stream > li.spp-tl-list > .inner { row-gap:0 !important; gap:0 !important; }
            #wall ul.stream > li:not(.spp-tl-list) .section-title,
            #wall ul.stream > li.spp-tl-list .section-title {
                min-height:calc(15.5px * 1.55 * 2) !important;
            }
            #wall ul.stream > li:not(.spp-tl-list) > .inner { min-height:295px !important; }
            #wall ul.stream > li.spp-tl-list > .inner { min-height:257px !important; }
            #wall ul.stream > li.spp-tl-list .section-title a { text-decoration:none !important; }
            #wall ul.stream > li.spp-tl-list .section-intro,
            #wall ul.stream > li.spp-tl-list .section-intro[style] {
                order:2 !important;
                position:static !important; display:block !important;
                background:transparent !important; background-color:transparent !important;
                width:auto !important; height:auto !important; padding:0 !important;
                margin:9px 15px 0 15px !important;
                color:var(--spu-secondary) !important;
            }
            #wall ul.stream > li.spp-tl-list .section-intro table { display:none !important; }
            #wall ul.stream > li.spp-tl-list .spp-tl-author-line { display:none !important; }
            #wall ul.stream > li.spp-tl-list .spp-card-meta {
                order:3 !important;
                margin:auto 15px 0 15px !important;
                padding-top:10px !important;
                display:flex !important; align-items:center !important;
                flex-wrap:nowrap !important; gap:12px !important;
                border-top:1px solid rgba(120,150,220,.10) !important;
                color:var(--spu-secondary) !important;
            }
            #wall ul.stream > li.spp-tl-list .spp-card-meta > span {
                float:none !important; white-space:nowrap !important;
            }
            #wall ul.stream > li.spp-tl-list .spp-card-meta > span:first-child { margin-right:auto !important; }

            .spp-byline {
                display:flex !important; align-items:center !important; gap:8px !important;
                min-width:0 !important;
                flex-wrap:nowrap !important;
                white-space:nowrap !important;
                overflow:hidden !important;
            }
            .spp-name {
                position:relative !important;
                display:inline-flex !important; align-items:center !important; gap:2px !important;
                padding:2px 8px 2px 2px !important;
                border-radius:999px !important;
                background:linear-gradient(135deg,
                    hsl(var(--spp-h1, 220) 72% 58% / .40),
                    hsl(var(--spp-h2, 278) 72% 58% / .18)) !important;
                flex:0 1 auto !important;
                max-width:150px !important;
                min-width:0 !important;
                overflow:hidden !important;
                transition:background .28s ease, box-shadow .28s ease !important;
            }
            .spp-name::before {
                content:'' !important;
                position:absolute !important; inset:1px !important;
                border-radius:999px !important;
                background:#1a2233 !important;
                transition:background .28s ease !important;
            }
            #wall ul.stream > li:hover .spp-name {
                background:linear-gradient(135deg,
                    hsl(var(--spp-h1, 220) 82% 62% / .85),
                    hsl(var(--spp-h2, 278) 82% 62% / .45)) !important;
                box-shadow:0 0 12px -3px hsl(var(--spp-h1, 220) 80% 60% / .55) !important;
            }
            #wall ul.stream > li:hover .spp-name::before { background:#202a3e !important; }
            .spp-name-txt {
                position:relative !important; z-index:1 !important;
                font-size:11.5px !important; font-weight:600 !important; letter-spacing:.2px !important;
                color:#b6c1d8 !important;
                overflow:hidden !important; text-overflow:ellipsis !important; white-space:nowrap !important;
                text-decoration:none !important;
                margin:0 !important;
            }
            #wall ul.stream > li:hover .spp-name-txt { color:#e4ecfb !important; }

            .spp-date {
                position:relative !important;
                display:inline-flex !important; align-items:center !important;
                padding:2px 8px !important;
                border-radius:999px !important;
                background:rgba(120,150,220,.06) !important;
                font-size:11px !important;
                color:#78839b !important;
                font-variant-numeric:tabular-nums !important;
                letter-spacing:.2px !important;
                white-space:nowrap !important;
                overflow:hidden !important;
                transition:color .28s ease, background .28s ease !important;
            }
            .spp-date::before {
                content:'' !important;
                position:absolute !important; inset:0 !important; z-index:0 !important;
                background:linear-gradient(90deg, hsl(var(--spp-h2, 278) 70% 56% / .34), transparent) !important;
                transform:scaleX(0) !important;
                transform-origin:left center !important;
                transition:transform .34s cubic-bezier(.22,.61,.36,1) !important;
            }
            .spp-date-txt {
                position:relative !important; z-index:1 !important;
                transition:transform .28s ease !important;
            }
            #wall ul.stream > li:hover .spp-date { color:#bccbe4 !important; background:rgba(120,150,220,.10) !important; }
            #wall ul.stream > li:hover .spp-date::before { transform:scaleX(1) !important; }
            #wall ul.stream > li:hover .spp-date-txt { transform:translateX(2px) !important; }

            .spp-fav {
                display:inline-flex !important; align-items:center !important;
                padding:3px !important;
                border-radius:999px !important;
                border:1px solid rgba(120,150,220,.22) !important;
                background:rgba(120,150,220,.07) !important;
                font-size:11.5px !important; font-weight:500 !important; letter-spacing:.3px !important;
                color:#8e99b0 !important;
                text-decoration:none !important;
                cursor:pointer !important;
                overflow:hidden !important;
                transition:color .26s ease, background .26s ease, border-color .26s ease, box-shadow .26s ease !important;
            }
            .spp-fav-ico {
                flex:0 0 18px !important; width:18px !important; height:18px !important;
                border-radius:999px !important;
                display:flex !important; align-items:center !important; justify-content:center !important;
                background:linear-gradient(135deg, hsl(220 78% 58%), hsl(255 76% 58%)) !important;
                box-shadow:0 0 0 1px rgba(255,255,255,.16) inset !important;
                overflow:hidden !important;
                transition:width .3s cubic-bezier(.22,.61,.36,1), flex-basis .3s cubic-bezier(.22,.61,.36,1) !important;
            }
            .spp-fav-ico::before {
                content:'' !important;
                width:9px !important; height:11px !important;
                background:#fff !important;
                clip-path:polygon(0 0,100% 0,100% 100%,50% 68%,0 100%) !important;
                opacity:.95 !important;
            }
            .spp-fav-txt {
                padding:0 8px 0 5px !important;
                white-space:nowrap !important;
                max-width:40px !important;
                overflow:hidden !important;
                transition:max-width .3s cubic-bezier(.22,.61,.36,1), opacity .22s ease, padding .3s ease !important;
            }
            .spp-fav:hover {
                color:#e6eeff !important;
                background:rgba(61,106,255,.22) !important;
                border-color:rgba(61,106,255,.66) !important;
                box-shadow:0 0 16px -3px rgba(61,106,255,.8) !important;
            }
            .spp-fav:hover .spp-fav-ico { flex-basis:34px !important; width:34px !important; }
            .spp-fav:hover .spp-fav-txt { max-width:0 !important; opacity:0 !important; padding-left:0 !important; padding-right:0 !important; }
            #wall ul.stream .spp-read-chip {
                display:inline-flex !important; align-items:center !important;
                margin-left:8px !important;
                padding:2px 8px !important;
                border-radius:999px !important;
                border:1px solid rgba(103,194,58,.34) !important;
                background:rgba(103,194,58,.10) !important;
                color:#8ed08e !important;
                font-size:11px !important; font-weight:500 !important; letter-spacing:.3px !important;
                line-height:1.5 !important;
                white-space:nowrap !important;
                vertical-align:middle !important;
                pointer-events:none !important;
                user-select:none !important;
                -webkit-user-select:none !important;
            }
            #wall ul.stream .spp-read-chip::before {
                content:'✓' !important;
                margin-right:4px !important;
                font-size:10px !important;
                line-height:1 !important;
            }

            #wall :where(ul).stream > li.spp-st-hasread .spp-card-meta > span:has(a.spp-fav) {
                display:inline-flex !important;
                align-items:center !important;
            }

            #wall ul.stream .spp-fav-txt { color:inherit !important; }

            @media (max-width: 1000px) {
                #wall ul.stream { grid-template-columns:repeat(2, minmax(0, 1fr)) !important; }
            }
            @media (max-width: 640px) {
                #wall ul.stream { grid-template-columns:minmax(0, 1fr) !important; }
            }

            html.spp-board-skin #wall ul.stream > li:not(.spp-tl-list) .section-text {
                height:auto !important;
                aspect-ratio:16 / 9 !important;
            }
            html.spp-board-skin #wall ul.stream > li:not(.spp-tl-list) .section-text > div img {
                height:100% !important;
                max-height:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner {
                padding-top:0 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner::before {
                position:relative !important;
                flex:0 0 auto !important;
                width:100% !important;
                left:auto !important; right:auto !important; top:auto !important;
                height:auto !important;
                aspect-ratio:16 / 9 !important;
                margin:0 !important;
            }

            html.spp-board-skin #wall ul.stream > li:not(.spp-tl-list) .spp-card-meta,
            html.spp-board-skin #wall ul.stream > li.spp-tl-list .spp-card-meta {
                width:calc(100% - 30px) !important;
                box-sizing:border-box !important;
            }

            html.spp-board-skin #wall ul.stream > li .spp-date {
                color:#bccbe4 !important;
                background:rgba(120,150,220,.10) !important;
            }
            html.spp-board-skin #wall ul.stream > li .spp-date::before {
                transform:scaleX(1) !important;
                opacity:.775 !important;   /* ★ t59:原来靠 breathe 动画给 .55↔1 的呼吸;静止态改成等亮度的静态值 —— 连动画对象都不再创建 */
            }
            html.spp-board-skin #wall ul.stream > li:hover .spp-date {
                box-shadow:0 0 10px -2px hsl(var(--spp-h2, 278) 80% 62% / .55) !important;
            }
            html.spp-board-skin #wall ul.stream > li:hover .spp-date::before {
                /* ★ t59:只有悬停这一张卡才创建动画对象 */
                animation:spp-date-breathe 3.6s ease-in-out infinite !important;
                animation-delay:calc(var(--spp-idx, 0) * -0.28s) !important;
            }
            @keyframes spp-date-breathe {
                0%,100% { opacity:.55 }
                50%     { opacity:1   }
            }

            html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner::before {
                opacity:1 !important;
                filter:blur(18px) !important;
                animation:spp-aurora 11s ease-in-out infinite !important;
                animation-delay:calc(var(--spp-idx, 0) * -0.5s) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner::after {
                content:'' !important;
                display:block !important;
                position:absolute !important;
                top:0 !important; left:0 !important; right:0 !important; bottom:auto !important;
                width:100% !important;
                height:auto !important;
                aspect-ratio:16 / 9 !important;
                border-radius:0 !important;
                background-image:linear-gradient(115deg,
                    transparent 30%,
                    hsl(var(--spp-h1, 220) 88% 68% / .30) 45%,
                    hsl(var(--spp-h2, 278) 88% 68% / .22) 55%,
                    transparent 70%) !important;
                background-color:transparent !important;
                background-size:260% 100% !important;
                background-repeat:no-repeat !important;
                filter:none !important;
                backdrop-filter:none !important;
                -webkit-backdrop-filter:none !important;
                box-shadow:none !important;
                opacity:.9 !important;
                transform:none !important;
                animation:spp-sheen 6.5s linear infinite !important;
                animation-delay:calc(var(--spp-idx, 0) * -0.42s) !important;
                animation-play-state:running !important;
                pointer-events:none !important;
            }
            @keyframes spp-sheen {
                0%   { background-position:130% 0 }
                100% { background-position:-130% 0 }
            }

            html.spp-board-skin #wall ul.stream > li { position:relative !important; }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable { cursor:pointer !important; }
            html.spp-board-skin #wall ul.stream > li > .inner > div.spp-card-meta,
            html.spp-board-skin #wall ul.stream > li > .inner > span.section-intro {
                z-index:6 !important;
                pointer-events:none !important;
            }
            html.spp-board-skin #wall ul.stream > li > .inner > div.spp-card-meta a,
            html.spp-board-skin #wall ul.stream > li > .inner > div.spp-card-meta button,
            html.spp-board-skin #wall ul.stream > li > .inner > span.section-intro a {
                pointer-events:auto !important;
            }
            html.spp-board-skin #wall ul.stream > li .spp-fav,
            html.spp-board-skin #wall ul.stream > li .spp-name-txt,
            html.spp-board-skin #wall ul.stream > li .section-title a { position:relative !important; z-index:6 !important; }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] > .inner {
                z-index:6 !important;
                pointer-events:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] > .inner a,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] > .inner button,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] > .inner .spp-bounty-badge {
                pointer-events:auto !important;
            }

            .spp-card-hit {
                display:block !important;
                background:transparent !important;
                text-decoration:none !important;
                position:absolute !important; inset:0 !important;
                z-index:5 !important;
                cursor:pointer !important;
                border-radius:10px !important;
            }

            html.spp-board-skin #wall ul.stream {
                grid-template-columns:repeat(12, minmax(0, 1fr)) !important;
            }
            html.spp-board-skin #wall ul.stream > li:not(.spp-tl-list):not(.spp-card-portrait) > .inner {
                grid-column:span 4 !important;
            }
            html.spp-board-skin #wall ul.stream > li:not(.spp-tl-list):not(.spp-card-portrait) {
                grid-column:span 4 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list {
                grid-column:span 4 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-portrait {
                grid-column:span 3 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-row-start:not(.spp-card-portrait) {
                grid-column:1 / span 4 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-row-start.spp-card-portrait {
                grid-column:1 / span 3 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-portrait > .inner > .section-text {
                aspect-ratio:3 / 4 !important;
                height:auto !important;
            }
            html.spp-board-skin #wall ul.stream > li:not(.spp-tl-list):not(.spp-card-portrait) > .inner > .section-text {
                aspect-ratio:3 / 2 !important;
                height:auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list:not(.spp-card-portrait) > .inner::before {
                aspect-ratio:3 / 2 !important;
                height:auto !important;
            }
            html.spp-board-skin #wall ul.stream > li:not(.spp-tl-list) > .inner > .section-text > div img {
                object-fit:cover !important;
                object-position:center top !important;
                height:100% !important;
                max-height:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list:not(.spp-card-portrait) > .inner::before {
                aspect-ratio:3 / 2 !important;
                height:auto !important;
            }

            @media (max-width: 1000px) {
                html.spp-board-skin #wall ul.stream { grid-template-columns:repeat(8, minmax(0, 1fr)) !important; }
                html.spp-board-skin #wall ul.stream > li.spp-card-portrait { grid-column:span 4 !important; }
                html.spp-board-skin #wall ul.stream > li.spp-row-start.spp-card-portrait { grid-column:1 / span 4 !important; }
            }
            @media (max-width: 640px) {
                html.spp-board-skin #wall ul.stream { grid-template-columns:repeat(4, minmax(0, 1fr)) !important; }
                html.spp-board-skin #wall ul.stream > li.spp-card-portrait { grid-column:span 4 !important; }
                html.spp-board-skin #wall ul.stream > li.spp-row-start.spp-card-portrait { grid-column:1 / span 4 !important; }
            }

            html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner::before,
            html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner::after {
                content:none !important;
                display:none !important;
                height:auto !important;
                aspect-ratio:auto !important;
                background:none !important;
                animation:none !important;
                filter:none !important;
                opacity:0 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list:hover > .inner::before {
                content:none !important;
                display:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner {
                min-height:0 !important;
                padding-top:0 !important;
            }
        `);
const TITLE_LINES = cardTitleLines();
const TITLE_SIZE = cardTitleSize();
if (TITLE_LINES !== TITLE_LINES_DEF || TITLE_SIZE !== TITLE_SIZE_DEF) {
const TL_BASE = [
'html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list)',
'html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list'
];
const TL_TITLE = TL_BASE[0] + ' .section-title,\n' + TL_BASE[1] + ' .section-title';
const TL_TITLE_A = TL_BASE[0] + ' .section-title a,\n' + TL_BASE[1] + ' .section-title a';
let titleCss = '/* ===== SPP-TITLELINES-BEGIN ===== */\n';
if (TITLE_SIZE !== TITLE_SIZE_DEF) {
titleCss += TL_TITLE + ',\n' + TL_TITLE_A + ' {\n    font-size:' + TITLE_SIZE + 'px !important;\n}\n';
}
titleCss += TL_TITLE + ' {\n' +
'    -webkit-line-clamp:' + TITLE_LINES + ' !important;\n' +
'    -webkit-box-orient:vertical !important;\n' +
'    display:-webkit-box !important;\n' +
'    overflow:hidden !important;\n' +
'    min-height:calc(' + TITLE_LINES + ' * ' + TITLE_LINE_RATIO + 'em) !important;\n' +
'}\n' +
'/* ===== SPP-TITLELINES-END ===== */\n';
GM_addStyle(titleCss);
}
GM_addStyle(`
/* ===== SPP-GLASS-BEGIN ===== */
            html.spp-board-skin #wall ul.stream > li,
            html.spp-board-skin #wall ul.stream > li:hover {
                background:transparent !important;
                border:0 !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-tl-list:not(.spp-card-portrait) > .inner {
                background-color:rgb(0 0 0 / 0.86) !important;
                background-image:linear-gradient(152deg,
                    rgb(255 255 255 / 0.05) 0%,
                    rgb(255 255 255 / 0.016) 22%,
                    rgb(255 255 255 / 0.003) 46%,
                    rgb(255 255 255 / 0.000) 62%,
                    rgb(255 255 255 / 0.045) 100%) !important;
                backdrop-filter:blur(18px) saturate(140%) !important;
                -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
                border:1px solid rgb(255 255 255 / 0.09) !important;
                box-shadow:0 12px 32px -14px rgb(0 0 0 / 0.72),
                    inset 0 1px 0 rgb(255 255 255 / 0.22) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list:not(.spp-card-portrait):hover > .inner {
                box-shadow:0 0 24px -2px rgb(61 106 255 / 0.5),
                    0 12px 32px -14px rgb(0 0 0 / 0.72),
                    inset 0 1px 0 rgb(255 255 255 / 0.22) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-tl-list:not(.spp-card-portrait) > .inner::before,
            html.spp-board-skin #wall ul.stream > li.spp-tl-list:not(.spp-card-portrait) > .inner::after {
                content:none !important;
                display:none !important;
                background:none !important;
                background-image:none !important;
                background-color:transparent !important;
                animation:none !important;
                filter:none !important;
                backdrop-filter:none !important;
                -webkit-backdrop-filter:none !important;
                box-shadow:none !important;
                opacity:0 !important;
                height:auto !important;
                aspect-ratio:auto !important;
                -webkit-mask-image:none !important;
                mask-image:none !important;
            }
/* ===== SPP-GLASS-END ===== */
        `);
GM_addStyle(`
/* ===== SPP-NEONCARD-BEGIN ===== */

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] {
                --spp-title-ink:#ffffff;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:hover {
                --spp-title-ink:#ffffff;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] > .inner {
                border-radius:16px !important;
                border:0 !important;
                background-color:rgb(30 35 55 / .40) !important;
                background-image:none !important;
                backdrop-filter:none !important;
                -webkit-backdrop-filter:none !important;
                box-shadow:0 4px 20px rgb(0 0 0 / .50) !important;
                isolation:isolate !important;
                transition:transform .4s cubic-bezier(.175,.885,.32,1.275), box-shadow .4s ease !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:hover > .inner {
                transform:translateY(-6px) !important;
                box-shadow:0 15px 35px -5px rgb(255 0 127 / .20),
                    0 15px 35px -5px rgb(0 210 255 / .20) !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] > .inner::before {
                content:'' !important;
                display:block !important;
                position:absolute !important;
                inset:0 !important;
                width:auto !important;
                transform:none !important;
                height:auto !important;
                aspect-ratio:auto !important;
                margin:0 !important;
                padding:0 !important;
                border:0 !important;
                border-radius:16px !important;
                background:conic-gradient(from var(--spp-neon-angle,0deg), transparent 0%, transparent 25%, #ff007f 35%,
                    transparent 45%, transparent 75%, #00d2ff 85%, transparent 95%) !important;
                background-color:transparent !important;
                opacity:0 !important;
                transition:opacity .5s ease !important;   /* ★ t60:静止时不再声明 animation(原本 paused 冻结在 0deg 且 opacity:0 看不见)⇒ 连动画对象都不创建;--spp-neon-angle 走 @property 的 initial-value:0deg,静态就是原来那一帧 */
                filter:none !important;
                backdrop-filter:none !important;
                -webkit-backdrop-filter:none !important;
                box-shadow:none !important;
                -webkit-mask-image:none !important;
                mask-image:none !important;
                z-index:-1 !important;
                pointer-events:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:hover > .inner::before {
                opacity:1 !important;
                animation:spp-neon-sweep 4s linear infinite !important;   /* ★ t60:只有悬停这张卡才创建动画对象 */
            }
            @property --spp-neon-angle {
                syntax:'<angle>';
                initial-value:0deg;
                inherits:false;
            }
            @keyframes spp-neon-sweep {
                0%   { --spp-neon-angle:0deg }
                100% { --spp-neon-angle:360deg }
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] > .inner::after {
                content:'' !important;
                display:block !important;
                position:absolute !important;
                inset:2px !important;
                height:auto !important;
                aspect-ratio:auto !important;
                margin:0 !important;
                padding:0 !important;
                border:0 !important;
                border-radius:14px !important;
                background-color:#12141d !important;
                background-image:none !important;
                backdrop-filter:none !important;
                -webkit-backdrop-filter:none !important;
                box-shadow:none !important;
                opacity:1 !important;
                animation:none !important;
                filter:none !important;
                -webkit-mask-image:none !important;
                mask-image:none !important;
                z-index:-1 !important;
                pointer-events:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:hover > .inner::after {
                box-shadow:inset 0 0 30px -14px rgb(0 210 255 / .45),
                    inset 0 0 30px -14px rgb(255 0 127 / .35) !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .section-title,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .section-title a {
                font-size:18px !important;
                font-weight:500 !important;
                line-height:1.375 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .section-title {
                padding-left:24px !important;
                padding-right:24px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .section-intro {
                padding-left:24px !important;
                padding-right:24px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .section-text {
                padding-left:24px !important;
                padding-right:24px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta {
                margin:auto 24px 0 24px !important;
                width:calc(100% - 48px) !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list) .section-text img {
                transition:transform .4s ease !important;
                border-top-left-radius:14px !important;
                border-top-right-radius:14px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):hover .section-text img {
                transform:scale(1.03) !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-metabtn {
                background:rgb(255 255 255 / .03) !important;
                border-radius:999px !important;
                box-shadow:inset 0 0 0 1px rgb(255 255 255 / .08) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:hover .spp-card-meta .spp-metabtn {
                background:rgb(255 255 255 / .08) !important;
                box-shadow:inset 0 0 0 1px rgb(255 255 255 / .15) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav {
                background:rgb(255 255 255 / .03) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:hover .spp-card-meta .spp-fav {
                background:rgb(255 255 255 / .08) !important;
            }

            html.spp-board-skin ::-webkit-scrollbar {
                width:6px !important;
                height:6px !important;
            }
            html.spp-board-skin ::-webkit-scrollbar-thumb {
                background:#1e293b !important;
                border-radius:3px !important;
            }
            html.spp-board-skin ::-webkit-scrollbar-thumb:hover {
                background:#334155 !important;
            }

            .spp-flame {
                display:inline-block !important;
                width:13px !important;
                height:13px !important;
                flex:0 0 auto !important;
                margin:0 4px 0 0 !important;
                vertical-align:-2px !important;
                fill:currentColor !important;
                color:inherit !important;
                transform-origin:bottom center !important;
                will-change:transform !important;
                pointer-events:none !important;
            }
            html.spp-board-skin #wall ul.stream > li:hover .spp-flame {
                transition:filter .3s ease !important;
                animation:spp-flame-sway 1.2s ease-in-out infinite !important;
            }
            @keyframes spp-flame-sway {
                0%   { transform:rotate(0deg) skewX(0deg) scaleY(1);        filter:drop-shadow(0 0 2px currentColor); }
                20%  { transform:rotate(-4deg) skewX(-3deg) scaleY(1.05);   filter:drop-shadow(0 0 6px currentColor); }
                40%  { transform:rotate(3deg) skewX(2deg) scaleY(0.95);     filter:drop-shadow(0 0 4px currentColor); }
                60%  { transform:rotate(-2deg) skewX(-1deg) scaleY(1.03);   filter:drop-shadow(0 0 8px currentColor); }
                80%  { transform:rotate(2deg) skewX(1deg) scaleY(0.98);     filter:drop-shadow(0 0 5px currentColor); }
                100% { transform:rotate(0deg) skewX(0deg) scaleY(1);        filter:drop-shadow(0 0 2px currentColor); }
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-byline {
                width:100% !important;
                justify-content:space-between !important;
                gap:8px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-name-txt {
                font-size:12px !important;
                font-weight:500 !important;
                color:#9ca3af !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-date {
                background:rgb(255 255 255 / .04) !important;
                border:1px solid rgb(255 255 255 / .08) !important;
                color:#d1d5db !important;
                font-weight:500 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-date-txt {
                font-size:11px !important;
                font-weight:500 !important;
                color:#d1d5db !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:hover .spp-date {
                background:rgb(255 255 255 / .08) !important;
                border-color:rgb(255 255 255 / .16) !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list) > .inner {
                padding-bottom:20px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list) > .inner > .section-intro {
                order:3 !important;
                margin:12px 24px 0 !important;
                padding:0 !important;
                width:auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list) > .inner > .spp-card-meta {
                order:4 !important;
                margin:12px 24px 0 !important;
                padding:8px 0 0 !important;
                border-top:1px solid #1f2937 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list) .spp-card-meta .spp-fav {
                border:1px solid rgb(255 255 255 / .08) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list) .spp-card-meta .spp-fav .spp-fav-txt {
                color:#818cf8 !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-metabtn {
                padding:6px 12px !important;
                font-size:12px !important;
                line-height:1 !important;
                min-height:0 !important;
                height:auto !important;
                border-radius:999px !important;
                background:rgb(255 255 255 / .03) !important;
                box-shadow:inset 0 0 0 1px rgb(255 255 255 / .08) !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner {
                display:grid !important;
                grid-template-columns:minmax(0, 1fr) auto !important;
                column-gap:12px !important;
                row-gap:0 !important;
                align-content:start !important;
                align-items:end !important;
                padding:20px 24px !important;
                box-sizing:border-box !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .section-title {
                grid-column:1 / -1 !important;
                grid-row:1 !important;
                margin:0 0 12px !important;
                padding:0 !important;
                width:auto !important;
                height:auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .section-text {
                grid-column:1 / -1 !important;
                grid-row:2 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .section-intro {
                grid-column:1 !important;
                grid-row:3 !important;
                margin:0 !important;
                padding:0 !important;
                width:auto !important;
                background:transparent !important;
                background-color:transparent !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .spp-card-meta {
                grid-column:2 !important;
                grid-row:3 !important;
                display:flex !important;
                align-items:center !important;
                gap:8px !important;
                margin:0 0 2px !important;
                padding:0 !important;
                border:0 !important;
                width:auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .clear {
                display:none !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline {
                display:grid !important;
                grid-template-columns:auto auto !important;
                justify-content:start !important;
                align-items:center !important;
                column-gap:8px !important;
                row-gap:10px !important;
                width:auto !important;
                max-width:100% !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline > .spp-name {
                grid-column:1 !important;
                grid-row:1 !important;
                display:flex !important;
                align-items:center !important;
                gap:10px !important;
                width:auto !important;
                margin:0 !important;
                padding:0 !important;
                border:0 !important;
                border-radius:0 !important;
                background:none !important;
                background-color:transparent !important;
                background-image:none !important;
                box-shadow:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline > .spp-name::before {
                display:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline > .spp-date,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline > .spp-date:hover {
                grid-column:2 !important;
                grid-row:1 !important;
                width:auto !important;
                margin:0 !important;
                padding:0 !important;
                border:0 !important;
                border-radius:0 !important;
                background:none !important;
                background-color:transparent !important;
                background-image:none !important;
                box-shadow:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline > .spp-date::before,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline > .spp-date::after {
                display:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .section-text {
                order: 1 !important;
                grid-column: 1 / -1 !important;
                grid-row: auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .section-intro {
                order: 3 !important;
                grid-column: 1 / -1 !important;
                grid-row: auto !important;
                margin: 12px 24px 0 !important;
                padding: 0 !important;
                width: auto !important;
                background: transparent !important;
                background-color: transparent !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .spp-card-meta {
                order: 4 !important;
                grid-column: 1 / -1 !important;
                grid-row: auto !important;
                display: flex !important;
                align-items: center !important;
                flex-wrap: wrap !important;
                gap: 8px !important;
                margin: 12px 24px 0 !important;
                padding: 8px 0 0 !important;
                border: 0 !important;
                border-top: 1px solid #1f2937 !important;
                width: auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline {
                display: flex !important;
                grid-template-columns: none !important;
                justify-content: flex-start !important;
                align-items: center !important;
                column-gap: 8px !important;
                row-gap: 4px !important;
                flex-wrap: wrap !important;
                width: 100% !important;
                max-width: 100% !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-byline {
                justify-content: flex-start !important;
                gap: 8px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-byline > .spp-name {
                order: 0 !important;
                grid-column: auto !important;
                grid-row: auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-byline > .spp-date,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-byline > .spp-date:hover {
                order: -1 !important;
                grid-column: auto !important;
                grid-row: auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-byline > .spp-bounty-badge {
                order: 1 !important;
                grid-column: auto !important;
                grid-row: auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-byline > .spp-bounty-badge {
                grid-column:1 / -1 !important;
                grid-row:2 !important;
                justify-self:start !important;
                align-self:center !important;
                margin:0 !important;
                padding:4px 9.6px !important;
                gap:6px !important;
                font-size:10.4px !important;
                font-weight:500 !important;
                line-height:1.2 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-name-txt {
                font-size:12px !important;
                font-weight:400 !important;
                color:#9ca3af !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-date-txt {
                font-size:10px !important;
                font-weight:400 !important;
                color:#4b5563 !important;
                background:transparent !important;
                border:0 !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta {
                --spp-cmt-mask:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDQuNGMtNC43IDAtOC41IDIuODUtOC41IDYuMzUgMCAyIDEuMTUgMy43OCAyLjk2IDQuOTMtLjA2Ljk1LS40NSAxLjk5LTEuMjkgMi43OCAxLjUzLjA2IDIuODctLjQyIDMuOC0xLjE2Ljk1LjI0IDEuOTguMzcgMy4wMy4zNyA0LjcgMCA4LjUtMi44NSA4LjUtNi4zNVMxNi43IDQuNCAxMiA0LjRaIiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iMS43IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PGNpcmNsZSBjeD0iOC45IiBjeT0iMTAuNzUiIHI9IjEuMTUiIGZpbGw9IiNmZmYiLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEwLjc1IiByPSIxLjE1IiBmaWxsPSIjZmZmIi8+PGNpcmNsZSBjeD0iMTUuMSIgY3k9IjEwLjc1IiByPSIxLjE1IiBmaWxsPSIjZmZmIi8+PC9zdmc+");
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta > span {
                float:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta > span:first-child {
                order:3 !important;
                display:flex !important;
                align-items:center !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta > .spp-meta-btns {
                order:2 !important;
                display:flex !important;
                align-items:center !important;
                gap:8px !important;
                float:none !important;
                color:inherit !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-metabtn {
                display:inline-flex !important;
                align-items:center !important;
                padding:6px 8px !important;
                font-size:0 !important;
                line-height:16px !important;
                min-height:0 !important;
                height:auto !important;
                border:0 !important;
                border-radius:9999px !important;
                background:rgb(255 255 255 / .03) !important;
                box-shadow:inset 0 0 0 1px rgb(255 255 255 / .08) !important;
                color:#9ca3af !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list.spp-st-hasflame .spp-card-meta .spp-metabtn {
                color:var(--spp-mbtn-fg,#9CA3AF) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-metabtn > span {
                font-size:12px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-meta-btns > .spp-metabtn:first-child::before {
                content:'' !important;
                flex:0 0 14px !important;
                width:14px !important;
                height:14px !important;
                margin-right:6px !important;
                background:currentColor !important;
                -webkit-mask:var(--spp-cmt-mask) center / contain no-repeat !important;
                mask:var(--spp-cmt-mask) center / contain no-repeat !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-flame {
                flex:0 0 14px !important;
                width:14px !important;
                height:14px !important;
                margin-right:6px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-fav {
                justify-content:center !important;
                width:26px !important;
                height:26px !important;
                min-height:0 !important;
                padding:0 !important;
                border:1px solid rgb(255 255 255 / .08) !important;
                border-radius:50% !important;
                background:rgb(255 255 255 / .03) !important;
                box-shadow:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-fav .spp-fav-txt {
                display:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-fav .spp-fav-ico {
                flex:0 0 11px !important;
                width:11px !important;
                height:11px !important;
                border-radius:0 !important;
                background:none !important;
                box-shadow:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-fav .spp-fav-ico::before {
                width:9px !important;
                height:11px !important;
                background:#6b7280 !important;
                opacity:1 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-fav:hover .spp-fav-ico {
                flex-basis:11px !important;
                width:11px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list .spp-card-meta .spp-fav:hover {
                border-color:rgb(255 255 255 / .16) !important;
                background:rgb(255 255 255 / .08) !important;
                box-shadow:none !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline {
                display:grid !important;
                grid-template-columns:auto minmax(0, auto) !important;
                grid-template-rows:auto auto !important;
                justify-content:start !important;
                align-items:center !important;
                column-gap:10px !important;
                row-gap:0 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-name {
                display:contents !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-name > .spp-name-txt {
                grid-column:2 !important;
                grid-row:1 !important;
                font-size:12px !important;
                font-weight:400 !important;
                color:#9ca3af !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-date {
                grid-column:2 !important;
                grid-row:2 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-date > .spp-date-txt {
                font-size:10.8px !important;
                line-height:14px !important;
                font-weight:400 !important;
                color:#4b5563 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline {
                display: flex !important;
                grid-template-columns: none !important;
                grid-template-rows: none !important;
                justify-content: flex-start !important;
                align-items: center !important;
                column-gap: 8px !important;
                row-gap: 0 !important;
                flex-wrap: wrap !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-name {
                display: inline-flex !important;
                grid-column: auto !important;
                grid-row: auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-name > .spp-name-txt {
                grid-column: auto !important;
                grid-row: auto !important;
                font-size: 12px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-date {
                grid-column: auto !important;
                grid-row: auto !important;
                order: -1 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-byline > .spp-date > .spp-date-txt {
                font-size: 11px !important;
                line-height: normal !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .spp-card-meta,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) > .inner > .spp-card-meta {
                justify-content: flex-end !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .spp-card-meta > span:first-child,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) > .inner > .spp-card-meta > span:first-child {
                order: 0 !important;
                margin-right: auto !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list > .inner > .spp-card-meta > span.spp-meta-btns,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) > .inner > .spp-card-meta > span.spp-meta-btns {
                order: 0 !important;
                margin-right: 0 !important;
            }

            html.spp-board-skin.spp-nui #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name {
                display: inline-flex !important;
                align-items: center !important;
                justify-content: center !important;
                position: relative !important;
                padding: 5px 16px !important;
                border-radius: 999px !important;
                border: 1px solid transparent !important;
                background-image: none !important;
                background-color: #1e1e28 !important;
                box-shadow: none !important;
                min-height: 0 !important;
                letter-spacing: 0.02em !important;
            }
            html.spp-board-skin.spp-nui #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name > .spp-name-txt {
                display: inline-flex !important;
                align-items: center !important;
                justify-content: center !important;
                font-size: 13px !important;
                font-weight: 500 !important;
                line-height: 1.35 !important;
                letter-spacing: 0.02em !important;
            }

            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name { overflow: hidden !important; }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name > .spp-name-txt { color: #a1a1aa !important; transition: color .3s ease !important; }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name::before {
                content: '' !important; display: block !important; position: absolute !important;
                top: 0 !important; left: -100% !important; width: 50% !important; height: 100% !important;
                background: linear-gradient(to right, transparent, rgba(255,255,255,0.15), transparent) !important;
                transform: skewX(-25deg) !important; transition: 0.4s ease-in-out !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover { border-color: rgba(255,255,255,0.15) !important; box-shadow: 0 4px 12px rgba(0,0,0,0.5) !important; }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover > .spp-name-txt { color: #ffffff !important; }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover::before { left: 150% !important; }

            html.spp-board-skin.spp-nui.spp-nui-neon #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name {
                background-color: transparent !important;
                border-color: rgba(125, 211, 252, 0.3) !important;
                transition: all .3s ease !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-neon #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name > .spp-name-txt { color: #7dd3fc !important; }
            html.spp-board-skin.spp-nui.spp-nui-neon #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover {
                background-color: rgba(125, 211, 252, 0.1) !important;
                border-color: #0ea5e9 !important;
                box-shadow: 0 0 10px rgba(14, 165, 233, 0.5), inset 0 0 8px rgba(14, 165, 233, 0.3) !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-neon #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover > .spp-name-txt {
                color: #e0f2fe !important;
                text-shadow: 0 0 5px rgba(224, 242, 254, 0.8) !important;
            }

            html.spp-board-skin.spp-nui.spp-nui-holo #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name {
                background-color: rgba(255,255,255,0.03) !important;
                transition: color .3s !important;
                z-index: 1 !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-holo #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name > .spp-name-txt { color: #9ca3af !important; transition: color .3s !important; }
            html.spp-board-skin.spp-nui.spp-nui-holo #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name::before {
                content: '' !important; display: block !important; position: absolute !important;
                top: 0 !important; left: 0 !important; right: 0 !important; bottom: 0 !important;
                border-radius: 999px !important;
                background: linear-gradient(135deg, #a855f7, #ec4899) !important;
                z-index: -1 !important; opacity: 0 !important; transition: opacity .3s ease !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-holo #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover > .spp-name-txt { color: #ffffff !important; text-shadow: 0 1px 2px rgba(0,0,0,0.5) !important; }
            html.spp-board-skin.spp-nui.spp-nui-holo #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover::before { opacity: 1 !important; }

            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name {
                background-color: transparent !important;
                padding: 5px 12px !important;
                transition: color .3s !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name > .spp-name-txt { color: #d1d5db !important; transition: color .3s !important; }
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name::before,
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name::after {
                display: block !important; position: absolute !important; opacity: 0 !important;
                color: #10b981 !important; font-weight: 700 !important;
                transition: all .3s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name::before { content: '[' !important; left: 2px !important; }
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name::after { content: ']' !important; right: 2px !important; }
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover > .spp-name-txt { color: #ffffff !important; }
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover::before,
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover::after { opacity: 1 !important; }

            html.spp-board-skin.spp-nui.spp-nui-line #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name {
                background-color: transparent !important;
                border-radius: 0 !important;
                padding: 4px 8px !important;
                transition: color .3s !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-line #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name > .spp-name-txt { color: #e5e7eb !important; transition: color .3s !important; }
            html.spp-board-skin.spp-nui.spp-nui-line #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name::after {
                content: '' !important; display: block !important; position: absolute !important;
                bottom: 0 !important; left: 50% !important; width: 0 !important; height: 2px !important;
                background: linear-gradient(90deg, transparent, #8b5cf6, #3b82f6, transparent) !important;
                transform: translateX(-50%) !important; transition: width .3s ease !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-line #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover > .spp-name-txt { color: #ffffff !important; }
            html.spp-board-skin.spp-nui.spp-nui-line #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-name:hover::after { width: 100% !important; }
            html.spp-board-skin.spp-dui #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date {
                display: inline-flex !important;
                align-items: center !important;
                justify-content: center !important;
                position: relative !important;
                padding: 1px !important;
                border: 0 !important;
                border-radius: 999px !important;
                background: none !important;
                background-color: transparent !important;
                box-shadow: none !important;
                overflow: hidden !important;
            }
            html.spp-board-skin.spp-dui #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt {
                display: inline-flex !important;
                align-items: center !important;
                justify-content: center !important;
                gap: 6px !important;
                position: relative !important;
                z-index: 1 !important;
                padding: 3px 12px !important;
                border: 1px solid transparent !important;
                border-radius: 999px !important;
                font-size: 12px !important;
                font-weight: 500 !important;
                line-height: 1.3 !important;
                letter-spacing: 0.01em !important;
            }
            html.spp-board-skin.spp-dui #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt::before {
                content: '' !important;
                display: block !important;
                flex: 0 0 13px !important;
                width: 13px !important;
                height: 13px !important;
                background-color: currentColor !important;
                -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V10h14v10zM5 8V6h14v2H5z'/%3E%3C/svg%3E") center / contain no-repeat !important;
                mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V10h14v10zM5 8V6h14v2H5z'/%3E%3C/svg%3E") center / contain no-repeat !important;
            }

            html.spp-board-skin.spp-dui.spp-dui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt {
                background: rgba(255, 255, 255, 0.05) !important;
                color: #d1d5db !important;
                border-color: rgba(255, 255, 255, 0.1) !important;
                transition: color 0.3s, border-color 0.3s, box-shadow 0.3s !important;
                overflow: hidden !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt::after {
                content: '' !important; display: block !important; position: absolute !important;
                top: 0 !important; left: -100% !important; width: 50% !important; height: 100% !important;
                background: linear-gradient(to right, transparent, rgba(255,255,255,0.2), transparent) !important;
                transform: skewX(-20deg) !important; transition: 0.5s ease-in-out !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date:hover > .spp-date-txt {
                color: #ffffff !important;
                border-color: rgba(255, 255, 255, 0.4) !important;
                box-shadow: 0 0 15px rgba(255, 255, 255, 0.1) !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-sweep #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date:hover > .spp-date-txt::after { left: 150% !important; }

            html.spp-board-skin.spp-dui.spp-dui-neon #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt {
                background: transparent !important;
                color: #b582ff !important;
                border-color: #b582ff !important;
                transition: all 0.3s ease !important;
                box-shadow: 0 0 5px rgba(181, 130, 255, 0.2), inset 0 0 5px rgba(181, 130, 255, 0.2) !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-neon #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date:hover > .spp-date-txt {
                background: #b582ff !important;
                color: #12121a !important;
                box-shadow: 0 0 15px rgba(181, 130, 255, 0.8), 0 0 25px rgba(181, 130, 255, 0.4) !important;
            }

            html.spp-board-skin.spp-dui.spp-dui-glass #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt {
                background: linear-gradient(135deg, rgba(255,255,255,0.1), rgba(255,255,255,0.03)) !important;
                -webkit-backdrop-filter: blur(10px) !important;
                backdrop-filter: blur(10px) !important;
                border-color: rgba(255,255,255,0.08) !important;
                color: #e2e8f0 !important;
                transition: all 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) !important;
                box-shadow: 0 4px 6px rgba(0,0,0,0.2) !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-glass #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date:hover > .spp-date-txt {
                background: linear-gradient(135deg, rgba(139, 92, 246, 0.4), rgba(59, 130, 246, 0.4)) !important;
                border-color: rgba(255,255,255,0.3) !important;
                transform: translateY(-2px) !important;
                color: #ffffff !important;
                box-shadow: 0 8px 15px rgba(0,0,0,0.4) !important;
            }

            html.spp-board-skin.spp-dui.spp-dui-neu #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt {
                background: #16161e !important;
                color: #9ca3af !important;
                border: none !important;
                box-shadow: 3px 3px 6px #0b0b0f, -3px -3px 6px #21212d !important;
                transition: all 0.2s ease !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-neu #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date:hover > .spp-date-txt {
                color: #60a5fa !important;
                box-shadow: inset 3px 3px 6px #0b0b0f, inset -3px -3px 6px #21212d !important;
            }

            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date::after {
                content: '' !important; display: block !important; position: absolute !important;
                top: -50% !important; left: -50% !important; width: 200% !important; height: 200% !important;
                background: conic-gradient(transparent, transparent, transparent, #00f0ff) !important;
                opacity: 0 !important; transition: opacity 0.3s !important;   /* ★ t59:静止态连动画对象都没有(本来 opacity:0 也看不见) */
                pointer-events: none !important;
                z-index: 0 !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date::after { opacity: 1 !important; animation: spp-date-orbit 3s linear infinite !important; }   /* ★ t65:触发目标从 .spp-date:hover 改成卡片级 :hover(与 L7414 那条 opacity 门控选择器一字不差)——日期被 a.spp-card-hit 盖住,永远收不到 :hover ⇒ 旧写法下环永不转 */
            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date::before { transform: scaleX(0) !important; background: none !important; }
            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date > .spp-date-txt {
                background: #13131c !important;
                color: #cbd5e1 !important;
                border-color: rgba(255,255,255,0.05) !important;
                transition: color 0.3s !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class] .spp-byline > .spp-date:hover > .spp-date-txt {
                color: #00f0ff !important;
                border-color: transparent !important;
            }
            @keyframes spp-date-orbit {
                100% { transform: rotate(360deg); }
            }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name {
                border-color: rgba(255,255,255,0.15) !important;
                box-shadow: 0 4px 12px rgba(0,0,0,0.5) !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name > .spp-name-txt { color: #ffffff !important; }
            html.spp-board-skin.spp-nui.spp-nui-sweep #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name::before { left: 150% !important; }

            html.spp-board-skin.spp-nui.spp-nui-neon #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name {
                background-color: rgba(125, 211, 252, 0.1) !important;
                border-color: #0ea5e9 !important;
                box-shadow: 0 0 10px rgba(14, 165, 233, 0.5), inset 0 0 8px rgba(14, 165, 233, 0.3) !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-neon #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name > .spp-name-txt {
                color: #e0f2fe !important;
                text-shadow: 0 0 5px rgba(224, 242, 254, 0.8) !important;
            }

            html.spp-board-skin.spp-nui.spp-nui-holo #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name > .spp-name-txt {
                color: #ffffff !important;
                text-shadow: 0 1px 2px rgba(0,0,0,0.5) !important;
            }
            html.spp-board-skin.spp-nui.spp-nui-holo #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name::before { opacity: 1 !important; }

            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name > .spp-name-txt { color: #ffffff !important; }
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name::before,
            html.spp-board-skin.spp-nui.spp-nui-code #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name::after { opacity: 1 !important; }

            html.spp-board-skin.spp-nui.spp-nui-line #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name > .spp-name-txt { color: #ffffff !important; }
            html.spp-board-skin.spp-nui.spp-nui-line #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-name::after { width: 100% !important; }
            html.spp-board-skin.spp-rui #wall ul.stream > li.spp-card-clickable[class][class] .spp-read-chip,
            html.spp-board-skin.spp-rui #wall ul.stream .spp-read-chip { display: none !important; }
            html.spp-board-skin.spp-rui-stamp #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .section-title { position: relative !important; }
            html.spp-rui-dim #wall ul.stream > li.spp-card-clickable[class][class].spp-st-hasread > .inner > .section-title a {
                color: #8b93a7 !important;
                -webkit-text-fill-color: #8b93a7 !important;
                opacity: 0.62 !important;
                filter: saturate(0.6) !important;
            }

            html.spp-board-skin.spp-rui #wall ul.stream > li.spp-card-clickable[class][class] .spp-rui-svg { pointer-events: none !important; }

            html.spp-board-skin.spp-rui-stamp #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .section-title { position: relative !important; overflow: visible !important; }
            html.spp-board-skin.spp-rui-stamp #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .section-title > .spp-rui-svg-stamp {
                position: absolute !important;
                left: var(--spp-rui-stamp-x, 61.8%) !important;
                top: var(--spp-rui-stamp-y, 50%) !important;
                right: auto !important;
                transform: translate(-50%, -50%) !important;
                width: 84px !important; height: 84px !important;
                margin: 0 !important; overflow: visible !important;
                display: block !important; z-index: 3 !important;
            }
            html.spp-board-skin.spp-rui-stamp #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .section-title::after,
            html.spp-board-skin.spp-rui-stamp #wall ul.stream > li.spp-card-clickable[class][class].spp-st-hasread > .inner > .section-title::after,
            html.spp-board-skin.spp-rui-stamp #wall ul.stream > li.spp-card-clickable[class][class][class].spp-st-hasread > .inner > .section-title::after {
                content: none !important;
                display: none !important;
                background: none !important;
                border: 0 !important;
                box-shadow: none !important;
                transform: none !important;
            }

            html.spp-board-skin.spp-rui-fluid #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .spp-card-meta {
                position: relative !important;
                border-top: 0 !important;
                border-image: none !important;
                filter: none !important;
            }
            html.spp-board-skin.spp-rui-fluid #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .spp-card-meta > .spp-rui-svg-conduit {
                position: absolute !important;
                left: 0 !important; right: 0 !important; top: -5px !important;
                width: 100% !important; height: 12px !important;
                display: block !important;
            }
            html.spp-board-skin.spp-rui-fluid #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .spp-card-meta > .spp-rui-svg-drop {
                position: absolute !important;
                right: -3px !important; top: -8px !important;
                width: 14px !important; height: 14px !important;
                display: block !important;
            }
            html.spp-board-skin.spp-rui-fluid #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .spp-card-meta > .spp-rui-svg-label {
                position: absolute !important;
                right: 6px !important; top: -17px !important;
                width: 120px !important; height: 14px !important;
                display: block !important;
            }

            html.spp-board-skin.spp-rui-spine #wall ul.stream > li.spp-card-clickable[class][class] > .inner { position: relative !important; }
            html.spp-board-skin.spp-rui-spine #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .spp-rui-spinewrap {
                position: absolute !important; left: 0 !important; z-index: 0 !important;
                pointer-events: none !important;
            }
            html.spp-board-skin.spp-rui-spine #wall ul.stream > li.spp-card-clickable[class][class] > .inner > .spp-rui-spinewrap > .spp-rui-svg-spine {
                width: 6px !important; height: 100% !important; display: block !important;
            }
            html.spp-board-skin.spp-rui-spine #wall ul.stream > li.spp-card-clickable[class][class][class] > .inner > .section-intro,
            html.spp-board-skin.spp-rui-spine #wall ul.stream > li.spp-card-clickable[class][class][class] > .inner > .spp-card-meta {
                border-left: 0 !important;
                border-image: none !important;
                padding-left: 0 !important;
                filter: none !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-sweep #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date > .spp-date-txt {
                color: #ffffff !important;
                border-color: rgba(255, 255, 255, 0.4) !important;
                box-shadow: 0 0 15px rgba(255, 255, 255, 0.1) !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-sweep #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date > .spp-date-txt::after { left: 150% !important; }
            html.spp-board-skin.spp-dui.spp-dui-neon #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date > .spp-date-txt {
                background: #b582ff !important;
                color: #12121a !important;
                box-shadow: 0 0 15px rgba(181, 130, 255, 0.8), 0 0 25px rgba(181, 130, 255, 0.4) !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-glass #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date > .spp-date-txt {
                background: linear-gradient(135deg, rgba(139, 92, 246, 0.4), rgba(59, 130, 246, 0.4)) !important;
                border-color: rgba(255,255,255,0.3) !important;
                transform: translateY(-2px) !important;
                color: #ffffff !important;
                box-shadow: 0 8px 15px rgba(0,0,0,0.4) !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-neu #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date > .spp-date-txt {
                color: #60a5fa !important;
                box-shadow: inset 3px 3px 6px #0b0b0f, inset -3px -3px 6px #21212d !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date::after { opacity: 1 !important; }
            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date > .spp-date-txt {
                color: #00f0ff !important;
                border-color: transparent !important;
            }
            html.spp-board-skin.spp-dui.spp-dui-orbit #wall ul.stream > li.spp-card-clickable[class][class]:hover .spp-byline > .spp-date::before {
                transform: scaleX(0) !important;
                background: none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-card-meta .spp-metabtn {
                padding:6px 10px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-card-meta .spp-fav {
                width:28px !important;
                height:28px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-card-meta .spp-fav .spp-fav-ico,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-card-meta .spp-fav:hover .spp-fav-ico {
                flex:0 0 12px !important;
                flex-basis:12px !important;
                width:12px !important;
                height:12px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-st-hasbb) .spp-card-meta .spp-fav .spp-fav-ico::before {
                width:10px !important;
                height:12px !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-st-hasbb .spp-card-meta .spp-fav {
                box-sizing:border-box !important;
                height:28px !important;
                padding:6px 12px !important;
                gap:6px !important;
                background:rgb(255 255 255 / .03) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-st-hasbb .spp-card-meta .spp-fav .spp-fav-ico,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-st-hasbb .spp-card-meta .spp-fav:hover .spp-fav-ico {
                flex:0 0 12px !important;
                flex-basis:12px !important;
                width:12px !important;
                height:12px !important;
                background:none !important;
                box-shadow:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-st-hasbb .spp-card-meta .spp-fav .spp-fav-ico::before {
                width:10px !important;
                height:12px !important;
                background:#818cf8 !important;
                opacity:1 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-st-hasbb .spp-card-meta .spp-fav .spp-fav-txt,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class].spp-st-hasbb .spp-card-meta .spp-fav:hover .spp-fav-txt {
                max-width:40px !important;
                padding:0 !important;
                font-size:12px !important;
                line-height:16px !important;
                color:#818cf8 !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait > .inner > .section-intro {
                align-self:stretch !important;
                width:auto !important;
                max-width:100% !important;
                box-sizing:border-box !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-byline {
                display:grid !important;
                grid-template-columns:auto minmax(0, 1fr) !important;
                grid-template-rows:auto auto !important;
                justify-content:start !important;
                align-items:center !important;
                column-gap:8px !important;
                row-gap:10px !important;
                width:auto !important;
                max-width:100% !important;
                overflow:visible !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-byline > .spp-name {
                grid-column:1 !important;
                grid-row:1 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-byline > .spp-date {
                grid-column:2 !important;
                grid-row:1 !important;
                justify-self:end !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-byline > .spp-bounty-badge {
                grid-column:1 / -1 !important;
                grid-row:2 !important;
                justify-self:start !important;
                align-self:center !important;
                margin:0 !important;
                padding:4px 9.6px !important;
                gap:6px !important;
                font-size:10.4px !important;
                font-weight:500 !important;
                line-height:1.2 !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-byline > .spp-date > .spp-date-txt {
                font-size:10px !important;
                line-height:14px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-card-meta .spp-fav {
                box-sizing:border-box !important;
                justify-content:center !important;
                width:32px !important;
                height:32px !important;
                min-height:0 !important;
                padding:0 !important;
                gap:0 !important;
                border:1px solid rgb(255 255 255 / .08) !important;
                border-radius:50% !important;
                background:rgb(255 255 255 / .03) !important;
                box-shadow:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-card-meta .spp-fav .spp-fav-txt {
                display:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-card-meta .spp-fav .spp-fav-ico,
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-card-meta .spp-fav:hover .spp-fav-ico {
                flex:0 0 13px !important;
                flex-basis:13px !important;
                width:13px !important;
                height:13px !important;
                background:none !important;
                box-shadow:none !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list).spp-st-hasbb.spp-card-portrait .spp-card-meta .spp-fav .spp-fav-ico::before {
                width:11px !important;
                height:13px !important;
                background:#6b7280 !important;
                opacity:1 !important;
            }

            html.spp-board-skin.spp-card-hz-noav #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .spp-name {
                padding-left:8px !important;
            }
            html.spp-board-skin.spp-card-hz-nonm #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .spp-name-txt {
                display:none !important;
            }
            html.spp-board-skin.spp-card-hz-nonm #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .spp-name {
                padding-right:2px !important;
            }
            html.spp-board-skin.spp-card-hz-nodt #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .spp-date {
                display:none !important;
            }
            html.spp-board-skin.spp-card-hz-nofav #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .spp-fav {
                display:none !important;
            }
            html.spp-board-skin.spp-card-hz-nofav #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .spp-card-meta > span:has(> a.spp-fav):not(:has(> :not(a.spp-fav))) {
                display:none !important;
            }
            html.spp-board-skin.spp-card-hz-noglow #wall ul.stream > li[class]:not(.spp-tl-list):not(.spp-card-portrait):hover > .inner {
                box-shadow:0 4px 20px rgb(0 0 0 / .50) !important;
            }
            html.spp-board-skin.spp-card-hz-noglow #wall ul.stream > li[class]:not(.spp-tl-list):not(.spp-card-portrait):hover > .inner::before {
                opacity:0 !important;
                animation-play-state:paused !important;
            }
            html.spp-board-skin.spp-card-hz-noglow #wall ul.stream > li[class]:not(.spp-tl-list):not(.spp-card-portrait):hover > .inner::after {
                box-shadow:none !important;
            }
            html.spp-board-skin.spp-card-hz-noavnm #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .spp-byline > .spp-name {
                display:none !important;
            }
            html.spp-board-skin.spp-card-hz-nometa #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .section-intro:not(.spp-st-hasbb) {
                display:none !important;
            }
            html.spp-board-skin.spp-card-hz-nometa #wall ul.stream > li.spp-card-clickable[class]:not(.spp-tl-list):not(.spp-card-portrait) .section-intro.spp-st-hasbb .spp-byline {
                column-gap:0 !important;
                row-gap:0 !important;
            }

            html.spp-board-skin.spp-card-vt-noav #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .spp-name {
                padding-left:8px !important;
            }
            html.spp-board-skin.spp-card-vt-nonm #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .spp-name-txt {
                display:none !important;
            }
            html.spp-board-skin.spp-card-vt-nonm #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .spp-name {
                padding-right:2px !important;
            }
            html.spp-board-skin.spp-card-vt-nodt #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .spp-date {
                display:none !important;
            }
            html.spp-board-skin.spp-card-vt-nofav #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .spp-fav {
                display:none !important;
            }
            html.spp-board-skin.spp-card-vt-nofav #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .spp-card-meta > span:has(> a.spp-fav):not(:has(> :not(a.spp-fav))) {
                display:none !important;
            }
            html.spp-board-skin.spp-card-vt-noglow #wall ul.stream > li[class].spp-card-portrait:hover > .inner {
                box-shadow:0 4px 20px rgb(0 0 0 / .50) !important;
            }
            html.spp-board-skin.spp-card-vt-noglow #wall ul.stream > li[class].spp-card-portrait:hover > .inner::before {
                opacity:0 !important;
                animation-play-state:paused !important;
            }
            html.spp-board-skin.spp-card-vt-noglow #wall ul.stream > li[class].spp-card-portrait:hover > .inner::after {
                box-shadow:none !important;
            }
            html.spp-board-skin.spp-card-vt-noavnm #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .spp-byline > .spp-name {
                display:none !important;
            }
            html.spp-board-skin.spp-card-vt-nometa #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .section-intro:not(.spp-st-hasbb) {
                display:none !important;
            }
            html.spp-board-skin.spp-card-vt-nometa #wall ul.stream > li.spp-card-clickable[class].spp-card-portrait:not(.spp-tl-list) .section-intro.spp-st-hasbb .spp-byline {
                column-gap:0 !important;
                row-gap:0 !important;
            }

            html.spp-board-skin.spp-card-ni-nonm #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-card-portrait) .spp-name-txt {
                display:none !important;
            }
            html.spp-board-skin.spp-card-ni-nodt #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-card-portrait) .spp-date {
                display:none !important;
            }
            html.spp-board-skin.spp-card-ni-nofav #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-card-portrait) .spp-fav {
                display:none !important;
            }
            html.spp-board-skin.spp-card-ni-nofav #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-card-portrait) .spp-card-meta > span:has(> a.spp-fav):not(:has(> :not(a.spp-fav))) {
                display:none !important;
            }
            html.spp-board-skin.spp-card-ni-noglow #wall ul.stream > li[class].spp-tl-list:hover > .inner {
                box-shadow:0 4px 20px rgb(0 0 0 / .50) !important;
            }
            html.spp-board-skin.spp-card-ni-noglow #wall ul.stream > li[class].spp-tl-list:hover > .inner::before {
                opacity:0 !important;
                animation-play-state:paused !important;
            }
            html.spp-board-skin.spp-card-ni-noglow #wall ul.stream > li[class].spp-tl-list:hover > .inner::after {
                box-shadow:none !important;
            }
            html.spp-board-skin.spp-card-ni-noavnm #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-card-portrait) .spp-byline > .spp-name {
                display:none !important;
            }
            html.spp-board-skin.spp-card-ni-nometa #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-card-portrait) .section-intro:not(.spp-st-hasbb) {
                display:none !important;
            }
            html.spp-board-skin.spp-card-ni-nometa #wall ul.stream > li.spp-card-clickable[class].spp-tl-list:not(.spp-card-portrait) .section-intro.spp-st-hasbb .spp-byline {
                column-gap:0 !important;
                row-gap:0 !important;
            }

            html.spp-fav-ui-1 {
                --spp-fav-g1:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZmZmZmIiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj48cGF0aCBkPSJNMTIgMnYzbTAgMTR2M00yIDEyaDNtMTQgMGgzbS0zLjUtNi41bC0yLjEgMi4xbS04LjggOC44bC0yLjEgMi4xbTAtMTNsMi4xIDIuMW04LjggOC44bDIuMSAyLjEiLz48L3N2Zz4=");
                --spp-fav-g2:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2ZmZmZmZiI+PHBhdGggZD0iTTEyIDIuNmwyLjkgNi4xIDYuNi45LTQuOCA0LjYgMS4yIDYuNkwxMiAxNy42IDYuMSAyMC44bDEuMi02LjZMMi41IDkuNmw2LjYtLjl6Ii8+PC9zdmc+");
                --spp-fav-bg:linear-gradient(90deg, #0f172a, #1e1b4b, #0f172a);
                --spp-fav-ring:rgba(245,158,11,.30);
                --spp-fav-ring-h:rgba(245,158,11,.70);
                --spp-fav-glow-h:0 0 14px -2px rgba(245,158,11,.45);
                --spp-fav-radius:999px;
                --spp-fav-pad:0 12px;
                --spp-fav-fg:#cbd5e1;
                --spp-fav-fg-h:#fef3c7;
                --spp-fav-fw:600;
                --spp-fav-ls:.4px;
                --spp-fav-ico-w:14px;
                --spp-fav-ico-fg:rgba(251,191,36,.55);
                --spp-fav-ico-fg-h:#fcd34d;
                --spp-fav-bg-on:linear-gradient(90deg, #1e1508, #3b2a0a, #1e1508);
                --spp-fav-ring-on:rgba(245,158,11,.85);
                --spp-fav-glow-on:0 0 16px -2px rgba(245,158,11,.55);
                --spp-fav-fg-on:#fde68a;
                --spp-fav-ico-fg-on:#fbbf24;
                --spp-fav-ico-bg:transparent;
                --spp-fav-ico-ring:0 0 0 0 transparent;
                --spp-fav-ico-radius:0;
                --spp-fav-ico-clip:visible;
            }
            html.spp-fav-ui-2 {
                --spp-fav-g1:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjYgMyAxMiAxOCIgZmlsbD0iI2ZmZmZmZiI+PHBhdGggZD0iTTYgM2gxMnYxOGwtNi00LjZMNiAyMXoiLz48L3N2Zz4=");
                --spp-fav-bg:#020617;
                --spp-fav-ring:rgba(6,182,212,.40);
                --spp-fav-ring-h:rgba(6,182,212,.85);
                --spp-fav-glow-h:0 0 14px -2px rgba(6,182,212,.55), 0 0 8px -2px rgba(217,70,239,.40);
                --spp-fav-radius:8px;
                --spp-fav-pad:0 10px;
                --spp-fav-fg:#cbd5e1;
                --spp-fav-fg-h:#67e8f9;
                --spp-fav-fw:400;
                --spp-fav-ls:.8px;
                --spp-fav-ico-w:16px;
                --spp-fav-ico-fg:#94a3b8;
                --spp-fav-ico-fg-h:#22d3ee;
                --spp-fav-bg-on:#03181f;
                --spp-fav-ring-on:rgba(34,211,238,.90);
                --spp-fav-glow-on:0 0 16px -2px rgba(34,211,238,.55), 0 0 10px -2px rgba(217,70,239,.40);
                --spp-fav-fg-on:#67e8f9;
                --spp-fav-ico-fg-on:#22d3ee;
                --spp-fav-ico-bg:rgba(8,51,68,.6);
                --spp-fav-ico-ring:inset 0 0 0 1px rgba(6,182,212,.40);
                --spp-fav-ico-radius:4px;
                --spp-fav-ico-clip:hidden;
            }
            html.spp-fav-ui-6 {
                --spp-fav-g1:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2ZmZmZmZiI+PHBhdGggZD0iTTIwLjQgMTUuNkE5IDkgMCAxIDEgOC40IDMuNmE3LjYgNy42IDAgMCAwIDEyIDEyeiIvPjwvc3ZnPg==");
                --spp-fav-g2:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI2ZmZmZmZiI+PHBhdGggZD0iTTEyIDEuNmMuNyA1LjQgNC4zIDkgOS43IDkuNy01LjQuNy05IDQuMy05LjcgOS43LS43LTUuNC00LjMtOS05LjctOS43IDUuNC0uNyA5LTQuMyA5LjctOS43eiIvPjwvc3ZnPg==");
                --spp-fav-bg:linear-gradient(135deg, #0f172a, rgba(30,27,75,.8));
                --spp-fav-ring:rgba(253,230,138,.30);
                --spp-fav-ring-h:rgba(253,230,138,.60);
                --spp-fav-glow-h:0 0 16px -2px rgba(253,230,138,.35);
                --spp-fav-radius:8px;
                --spp-fav-pad:0 12px;
                --spp-fav-fg:#cbd5e1;
                --spp-fav-fg-h:#fef9c3;
                --spp-fav-fw:500;
                --spp-fav-ls:.4px;
                --spp-fav-ico-w:14px;
                --spp-fav-ico-fg:#94a3b8;
                --spp-fav-ico-fg-h:#fde68a;
                --spp-fav-bg-on:linear-gradient(135deg, #1a1708, rgba(58,45,10,.85));
                --spp-fav-ring-on:rgba(253,230,138,.65);
                --spp-fav-glow-on:0 0 18px -2px rgba(253,230,138,.45);
                --spp-fav-fg-on:#fef9c3;
                --spp-fav-ico-fg-on:#fcd34d;
                --spp-fav-ico-bg:transparent;
                --spp-fav-ico-ring:0 0 0 0 transparent;
                --spp-fav-ico-radius:0;
                --spp-fav-ico-clip:visible;
            }

            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav {
                box-sizing:border-box !important;
                flex:0 0 auto !important;
                width:auto !important;
                min-width:0 !important;
                height:28px !important;
                min-height:0 !important;
                padding:var(--spp-fav-pad, 0 12px) !important;
                gap:6px !important;
                border:0 !important;
                border-radius:var(--spp-fav-radius, 999px) !important;
                background:var(--spp-fav-bg, transparent) !important;
                box-shadow:inset 0 0 0 1px var(--spp-fav-ring, transparent) !important;
                color:var(--spp-fav-fg, #cbd5e1) !important;
                font-size:12px !important;
                font-weight:var(--spp-fav-fw, 500) !important;
                letter-spacing:var(--spp-fav-ls, 0) !important;
                line-height:16px !important;
                text-decoration:none !important;
                overflow:visible !important;
                vertical-align:middle !important;
                transition:box-shadow .26s ease, background .26s ease, color .26s ease !important;
            }
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav:hover {
                background:var(--spp-fav-bg, transparent) !important;
                box-shadow:inset 0 0 0 1px var(--spp-fav-ring-h, transparent), var(--spp-fav-glow-h, 0 0 0 0 transparent) !important;
                color:var(--spp-fav-fg-h, #fff) !important;
            }
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav .spp-fav-ico {
                position:relative !important;
                flex:0 0 var(--spp-fav-ico-w, 14px) !important;
                flex-basis:var(--spp-fav-ico-w, 14px) !important;
                width:var(--spp-fav-ico-w, 14px) !important;
                height:var(--spp-fav-ico-w, 14px) !important;
                border-radius:var(--spp-fav-ico-radius, 0) !important;
                background:var(--spp-fav-ico-bg, transparent) !important;
                box-shadow:var(--spp-fav-ico-ring, 0 0 0 0 transparent) !important;
                color:var(--spp-fav-ico-fg, currentColor) !important;
                overflow:var(--spp-fav-ico-clip, visible) !important;
            }
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav:hover .spp-fav-ico {
                flex:0 0 var(--spp-fav-ico-w, 14px) !important;
                flex-basis:var(--spp-fav-ico-w, 14px) !important;
                width:var(--spp-fav-ico-w, 14px) !important;
                color:var(--spp-fav-ico-fg-h, currentColor) !important;
            }
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav .spp-fav-txt {
                display:inline-block !important;
                max-width:none !important;
                opacity:1 !important;
                padding:0 !important;
                white-space:nowrap !important;
                color:inherit !important;
                font-size:12px !important;
                line-height:16px !important;
                letter-spacing:inherit !important;
                transition:none !important;
            }
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav:hover .spp-fav-txt {
                max-width:none !important;
                opacity:1 !important;
                padding:0 !important;
            }

            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav.spp-fav-on {
                background:var(--spp-fav-bg-on, transparent) !important;
                box-shadow:inset 0 0 0 1px var(--spp-fav-ring-on, transparent), var(--spp-fav-glow-on, 0 0 0 0 transparent) !important;
                color:var(--spp-fav-fg-on, #ffffff) !important;
            }
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav.spp-fav-on:hover {
                background:var(--spp-fav-bg-on, transparent) !important;
                box-shadow:inset 0 0 0 1px var(--spp-fav-ring-on, transparent), var(--spp-fav-glow-on, 0 0 0 0 transparent) !important;
                color:var(--spp-fav-fg-on, #ffffff) !important;
            }
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav.spp-fav-on .spp-fav-ico,
            html.spp-fav-ui.spp-board-skin #wall ul.stream > li.spp-card-clickable[class]:is(.spp-tl-list, :not(.spp-tl-list), .spp-st-never.spp-st-never.spp-st-never) .spp-card-meta .spp-fav.spp-fav-on:hover .spp-fav-ico {
                color:var(--spp-fav-ico-fg-on, currentColor) !important;
            }
            html.spp-fav-ui.spp-fav-ui-1.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav .spp-fav-ico::before {
                content:'' !important;
                position:absolute !important;
                left:0 !important;
                top:0 !important;
                width:14px !important;
                height:14px !important;
                background:currentColor !important;
                box-shadow:none !important;
                clip-path:none !important;
                -webkit-mask:var(--spp-fav-g1) center / contain no-repeat !important;
                mask:var(--spp-fav-g1) center / contain no-repeat !important;
                opacity:1 !important;
                transition:transform .5s ease !important;
            }
            html.spp-fav-ui.spp-fav-ui-1.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav .spp-fav-ico::after {
                content:'' !important;
                position:absolute !important;
                left:50% !important;
                top:50% !important;
                width:10px !important;
                height:10px !important;
                margin:-5px 0 0 -5px !important;
                background:#fbbf24 !important;
                -webkit-mask:var(--spp-fav-g2) center / contain no-repeat !important;
                mask:var(--spp-fav-g2) center / contain no-repeat !important;
                filter:drop-shadow(0 0 3px rgba(251,191,36,.65)) !important;
                opacity:1 !important;
            }
            html.spp-fav-ui.spp-fav-ui-1.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav:hover .spp-fav-ico::before {
                transform:rotate(45deg) !important;
            }

            html.spp-fav-ui.spp-fav-ui-2.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav {
                font-family:Consolas, "Courier New", monospace !important;
            }
            html.spp-fav-ui.spp-fav-ui-2.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav .spp-fav-txt {
                font-family:Consolas, "Courier New", monospace !important;
            }
            html.spp-fav-ui.spp-fav-ui-2.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav .spp-fav-ico::before {
                content:'' !important;
                position:absolute !important;
                left:50% !important;
                top:50% !important;
                width:9px !important;
                height:12px !important;
                margin:-6px 0 0 -4.5px !important;
                background:currentColor !important;
                box-shadow:none !important;
                clip-path:none !important;
                -webkit-mask:var(--spp-fav-g1) center / contain no-repeat !important;
                mask:var(--spp-fav-g1) center / contain no-repeat !important;
                opacity:1 !important;
            }
            html.spp-fav-ui.spp-fav-ui-2.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav .spp-fav-ico::after {
                content:'' !important;
                position:absolute !important;
                left:0 !important;
                right:0 !important;
                bottom:0 !important;
                height:1.5px !important;
                background:#22d3ee !important;
                transform:scaleX(0) !important;
                transition:transform .28s ease !important;
            }
            html.spp-fav-ui.spp-fav-ui-2.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav:hover .spp-fav-ico::after {
                transform:scaleX(1) !important;
            }

            html.spp-fav-ui.spp-fav-ui-6.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav .spp-fav-ico::before {
                content:'' !important;
                position:absolute !important;
                left:0 !important;
                top:0 !important;
                width:14px !important;
                height:14px !important;
                background:currentColor !important;
                box-shadow:none !important;
                clip-path:none !important;
                -webkit-mask:var(--spp-fav-g1) center / contain no-repeat !important;
                mask:var(--spp-fav-g1) center / contain no-repeat !important;
                opacity:1 !important;
                transition:transform .5s ease !important;
            }
            html.spp-fav-ui.spp-fav-ui-6.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav .spp-fav-ico::after {
                content:'' !important;
                position:absolute !important;
                right:-4px !important;
                top:-4px !important;
                width:6px !important;
                height:6px !important;
                background:#fcd34d !important;
                -webkit-mask:var(--spp-fav-g2) center / contain no-repeat !important;
                mask:var(--spp-fav-g2) center / contain no-repeat !important;
                opacity:1 !important;
            }
            html.spp-fav-ui.spp-fav-ui-6.spp-board-skin #wall ul.stream > li.spp-card-clickable[class] .spp-card-meta .spp-fav:hover .spp-fav-ico::before {
                transform:rotate(-12deg) !important;
            }
            #ajax_guide {
                border:1px solid rgba(255,255,255,.14) !important;
                background:#0b1119 !important;
                background-image:none !important;
                border-radius:12px !important;
                box-shadow:0 18px 44px rgba(2,6,23,.62) !important;
                color:#3ef58c !important;
                font-size:13.5px !important;
                font-weight:600 !important;
                line-height:1.5 !important;
                font-family:inherit !important;
                text-align:left !important;
                padding:12px 16px !important;
            }
/* ===== SPP-NEONCARD-END ===== */
`);
GM_addStyle(`
/* ===== SPP-ANNOUNCE-BEGIN ===== */
            :is(#spp-announce, #spp-bnotice, #spp-btabs) {
                position:relative !important;
                font-family:"Noto Sans SC","Source Han Sans SC","PingFang SC","Microsoft YaHei",system-ui,sans-serif !important;
                -webkit-font-smoothing:antialiased !important;
                margin:0 0 12px !important;
                border-radius:12px !important;
                overflow:hidden !important;
                background-color:rgb(0 0 0 / 0.86) !important;
                background-image:linear-gradient(152deg,
                    rgb(255 255 255 / 0.05) 0%,
                    rgb(255 255 255 / 0.016) 22%,
                    rgb(255 255 255 / 0.003) 46%,
                    rgb(255 255 255 / 0.000) 62%,
                    rgb(255 255 255 / 0.045) 100%) !important;
                backdrop-filter:blur(18px) saturate(140%) !important;
                -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
                border:1px solid rgb(255 255 255 / 0.09) !important;
                box-shadow:0 12px 32px -14px rgb(0 0 0 / 0.72),
                    inset 0 1px 0 rgb(255 255 255 / 0.22) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-head {
                display:flex !important; align-items:center !important; gap:10px !important;
                width:100% !important;
                padding:11px 14px !important; margin:0 !important;
                background:transparent !important; border:0 !important;
                cursor:pointer !important;
                color:#dfe6f2 !important;
                font-family:inherit !important; font-size:14px !important;
                text-align:left !important;
                transition:background .25s ease !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-head:hover { background:rgba(255,255,255,.05) !important; }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-head:focus-visible {
                outline:2px solid rgb(120 160 255 / .7) !important; outline-offset:-2px !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-title {
                font-size:14.5px !important; font-weight:700 !important; letter-spacing:.4px !important;
                color:#f4f7fd !important; -webkit-text-fill-color:#f4f7fd !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-count {
                font-size:11.5px !important; font-weight:700 !important; line-height:1.6 !important;
                padding:0 8px !important; border-radius:999px !important;
                color:#dbe6f7 !important; -webkit-text-fill-color:#dbe6f7 !important;
                background:rgba(120,150,220,.20) !important;
                border:1px solid rgba(150,180,240,.30) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-hint {
                font-size:12px !important;
                color:#a9b6cc !important; -webkit-text-fill-color:#a9b6cc !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-chev {
                margin-left:auto !important;
                width:9px !important; height:9px !important; flex:0 0 9px !important;
                border-right:1.6px solid #93a0b8 !important; border-bottom:1.6px solid #93a0b8 !important;
                transform:rotate(45deg) translate(-1px,-1px) !important;
                transition:transform .38s cubic-bezier(.4,0,.2,1) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs)[data-open="1"] .spp-ann-chev {
                transform:rotate(-135deg) translate(-2px,-2px) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-body {
                display:grid !important;
                grid-template-rows:0fr !important;
                transition:grid-template-rows .42s cubic-bezier(.4,0,.2,1) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs)[data-open="1"] .spp-ann-body { grid-template-rows:1fr !important; }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-inner { overflow:hidden !important; }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-list {
                padding:2px 6px 8px !important;
                border-top:1px solid rgba(255,255,255,.07) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-item {
                position:relative !important;
                display:grid !important;
                grid-template-columns:26px minmax(0,1fr) auto !important;
                grid-template-areas:"dot title meta" "dot byline meta" !important;
                align-items:center !important; column-gap:10px !important; row-gap:2px !important;
                padding:9px 8px !important; margin:1px 0 !important;
                border-radius:9px !important;
                transition:background .22s ease !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-item:hover { background:rgba(255,255,255,.055) !important; }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-dot {
                grid-area:dot !important;
                -webkit-text-fill-color:currentColor !important;
                display:flex !important; align-items:center !important; justify-content:center !important;
                width:22px !important; height:22px !important; border-radius:6px !important;
                font-size:10px !important; font-weight:700 !important; line-height:1 !important;
                border:1px solid transparent !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-dot[data-g="告"] {
                color:#ffb3b3 !important; background:rgba(245,108,108,.16) !important; border-color:rgba(245,108,108,.30) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-dot[data-g="锁"] {
                color:#bfcbe0 !important; background:rgba(150,170,200,.13) !important; border-color:rgba(150,170,200,.24) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-dot[data-g="热"] {
                color:#f5c48a !important; background:rgba(230,162,60,.15) !important; border-color:rgba(230,162,60,.30) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-t {
                grid-area:title !important;
                font-size:14.5px !important; font-weight:600 !important; line-height:1.55 !important;
                color:#eef3fb !important; -webkit-text-fill-color:#eef3fb !important;
                display:-webkit-box !important;
                -webkit-line-clamp:2 !important; -webkit-box-orient:vertical !important;
                overflow:hidden !important; word-break:break-word !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-t a {
                color:#f2f6fd !important;
                -webkit-text-fill-color:#f2f6fd !important;
                text-decoration:none !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-t a:hover {
                color:#ffffff !important;
                -webkit-text-fill-color:#ffffff !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-t a::after {
                content:'' !important; position:absolute !important; inset:0 !important; border-radius:9px !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-t a:focus-visible::after {
                outline:2px solid rgb(120 160 255 / .75) !important; outline-offset:-1px !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-item:hover .spp-ann-t a { color:#fff !important; }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-meta {
                grid-area:meta !important;
                display:flex !important; align-items:center !important; gap:8px !important;
                margin-left:10px !important;
                position:relative !important; z-index:2 !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-byline {
                grid-area:byline !important;
                display:flex !important; align-items:center !important; gap:8px !important; min-width:0 !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-name-txt {
                font-size:12px !important; font-weight:600 !important;
                color:#e2e9f6 !important; -webkit-text-fill-color:#e2e9f6 !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-date-txt {
                font-size:11.5px !important; font-weight:500 !important;
                color:#bccbe4 !important; -webkit-text-fill-color:#bccbe4 !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-nodata {
                font-size:12px !important;
                color:#c3cfe2 !important; -webkit-text-fill-color:#c3cfe2 !important;
                padding:3px 10px !important; border-radius:999px !important;
                border:1px dashed rgba(160,180,210,.42) !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-raw {
                padding:10px 16px 14px !important;
                border-top:1px solid rgba(255,255,255,.07) !important;
                font-size:13px !important; line-height:1.8 !important;
                color:#d7e0ee !important;
                word-break:break-word !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-raw img {
                max-width:100% !important; height:auto !important; vertical-align:middle !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-raw a {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                text-decoration:none !important;
            }
            :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-raw a:hover {
                color:#c9ffe4 !important; -webkit-text-fill-color:#c9ffe4 !important;
                text-decoration:underline !important;
            }

            #spp-btabs {
                display:flex !important; align-items:center !important; flex-wrap:wrap !important;
                padding:0 8px !important;
            }
            #spp-btabs .spp-tab {
                display:flex !important; align-items:center !important; gap:7px !important;
                padding:7px 14px !important; margin:0 !important;
                background-color:#09090b !important; background-image:none !important;
                border:1.58px solid #52525b !important; cursor:pointer !important;
                color:#e2e8f0 !important; -webkit-text-fill-color:#e2e8f0 !important;
                font-family:inherit !important; font-size:13.5px !important; font-weight:500 !important;
                letter-spacing:.3px !important; border-radius:12px !important;
                box-shadow:0 4px 6px -1px rgba(0,0,0,.40), 0 2px 4px -2px rgba(0,0,0,.40) !important;
                transform:none !important;
                transition:transform .3s ease, box-shadow .3s ease, background-color .3s ease,
                           color .3s ease, border-color .3s ease !important;
            }
            #spp-btabs .spp-tab:hover {
                background-color:#18181b !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
                transform:translateY(-.335rem) !important;
                box-shadow:0 20px 25px -5px rgba(0,0,0,.55), 0 8px 10px -6px rgba(0,0,0,.45) !important;
            }
            #spp-btabs .spp-tab.is-on {
                color:#fff !important; -webkit-text-fill-color:#fff !important;
                background-color:rgba(32,201,151,.14) !important;
                border-color:rgba(32,201,151,.80) !important;
                box-shadow:inset 0 -2px 0 rgba(32,201,151,.75) !important;
            }
            #spp-btabs .spp-tab-n {
                font-size:11px !important; font-weight:700 !important; line-height:1.6 !important;
                padding:0 7px !important; border-radius:999px !important;
                color:#dbe6f7 !important; -webkit-text-fill-color:#dbe6f7 !important;
                background-color:rgba(120,150,220,.20) !important;
                border:1px solid rgba(150,180,240,.30) !important;
            }
            #spp-btabs .spp-tab-div {
                width:1px !important; height:20px !important; flex:0 0 1px !important;
                background-color:rgba(255,255,255,.16) !important; margin:0 4px !important;
            }
            #spp-btabs.spp-paired { margin:0 !important; border-radius:12px 12px 0 0 !important; }
            #spp-announce.spp-paired {
                margin:0 !important; border-radius:0 0 12px 12px !important;
                border-top:1px solid rgba(255,255,255,.10) !important;
            }
            #spp-announce .spp-pane { display:none !important; }
            #spp-announce .spp-pane.is-on { display:block !important; }
            #spp-announce .spp-pane-subs { padding:2px 6px 8px !important; }
            #spp-announce .spp-pane-subs div,
            #spp-announce .spp-pane-subs table,
            #spp-announce .spp-pane-subs tbody,
            #spp-announce .spp-pane-subs tr,
            #spp-announce .spp-pane-subs td,
            #spp-announce .spp-pane-subs th {
                background-color:transparent !important;
                border-color:rgba(255,255,255,.08) !important;
            }
            #spp-announce .spp-pane-subs td,
            #spp-announce .spp-pane-subs th { color:#dfe6f2 !important; }
            #spp-announce .spp-pane-subs a {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                text-decoration:none !important;
            }
            #main #spp-announce .spp-pane-subs .t {
                background-color:transparent !important;
                background-image:none !important;
                border-color:rgba(255,255,255,.08) !important;
                box-shadow:none !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children {
                display:grid !important;
                grid-template-columns:repeat(auto-fill, minmax(320px, 1fr)) !important;
                gap:10px !important;
                border:0 none !important;
                padding:0 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children[style*="none"] { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr:not(.f_one) { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one {
                display:grid !important;
                grid-template-columns:minmax(0, 1fr) auto auto !important;
                grid-template-rows:auto auto auto !important;
                gap:5px 8px !important;
                align-content:start !important;
                padding:11px 14px 12px !important;
                border:1px solid rgba(255,255,255,.075) !important;
                border-radius:12px !important;
                background-color:rgb(0 0 0 / .86) !important;
                background-image:linear-gradient(180deg, rgba(255,255,255,.06) 0%, rgba(255,255,255,.014) 44%, rgba(255,255,255,0) 100%) !important;
                -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
                backdrop-filter:blur(18px) saturate(140%) !important;
                box-shadow:0 10px 26px -10px rgba(0,0,0,.70), inset 0 1px 0 rgba(255,255,255,.055) !important;
                transition:transform .25s ease, box-shadow .25s ease, border-color .25s ease !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover {
                transform:translateY(-2px) !important;
                border-color:rgba(61,106,255,.45) !important;
                box-shadow:0 0 24px -2px rgba(61,106,255,.50) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > * {
                display:block !important;
                padding:0 !important; margin:0 !important;
                border:0 none !important;
                background-color:transparent !important;
                background-image:none !important;
                text-align:left !important;
                min-width:0 !important;
                font-weight:400 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one::before {
                content:"" !important;
                display:block !important;
                grid-column:1/-1 !important;
                grid-row:2 !important;
                border-top:1px solid rgba(255,255,255,.065) !important;
                margin:2px 0 4px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td:first-child { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] {
                grid-column:1 !important;
                grid-row:1 !important;
                line-height:1.35 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > br { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] .bklogo { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] h2 {
                display:inline !important;
                font-size:13.5px !important;
                font-weight:600 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] h2 a {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                text-decoration:none !important; font-size:13.5px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover > th[align="left"] h2 a {
                color:#c9ffe4 !important; -webkit-text-fill-color:#c9ffe4 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] .smalltxt {
                display:-webkit-box !important;
                -webkit-line-clamp:2 !important;
                -webkit-box-orient:vertical !important;
                overflow:hidden !important;
                margin-top:3px !important;
                font-size:11.5px !important; line-height:1.5 !important;
                color:#9fb2cc !important; -webkit-text-fill-color:#9fb2cc !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 {
                grid-column:3 !important;
                grid-row:1 !important;
                align-self:start !important; justify-self:end !important;
                font-size:11px !important; line-height:1.7 !important; white-space:nowrap !important;
                color:#c3d4ea !important; -webkit-text-fill-color:#c3d4ea !important;
                padding:1px 9px !important; border-radius:999px !important;
                background-color:rgba(255,255,255,.055) !important;
                border:1px solid rgba(255,255,255,.075) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10::after { content:" 帖" !important; opacity:.62; font-size:10px; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.y-style:not(.f10):not(:first-child) {
                grid-column:2 !important;
                grid-row:1 !important;
                align-self:start !important; justify-self:end !important;
                max-width:132px !important;
                overflow:hidden !important; text-overflow:ellipsis !important; white-space:nowrap !important;
                font-size:11px !important; line-height:1.7 !important;
                color:#8fa3bf !important; -webkit-text-fill-color:#8fa3bf !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt {
                grid-column:1/-1 !important;
                grid-row:3 !important;
                justify-self:stretch !important; text-align:left !important;
                font-size:11px !important; line-height:1.55 !important;
                color:#8fa3bf !important; -webkit-text-fill-color:#8fa3bf !important;
                white-space:nowrap !important; overflow:hidden !important; text-overflow:ellipsis !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt::before { content:"最后发表 " !important; opacity:.55; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt:not(:has(a))::before { content:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > br { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt h3 {
                display:inline !important; font-size:11px !important; font-weight:400 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt h3 a {
                color:#9db8e8 !important; -webkit-text-fill-color:#9db8e8 !important;
                text-decoration:none !important; font-size:11px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt h3 a:hover {
                color:#cfe0ff !important; -webkit-text-fill-color:#cfe0ff !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children { gap:16px !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one {
                grid-template-columns:36px minmax(0,1fr) auto auto !important;
                gap:8px 10px !important;
                padding:16px !important;
                border:1px solid #1f273b !important;
                border-radius:12px !important;
                background-color:#0b0e17 !important;
                background-image:linear-gradient(145deg, #131722, #0b0e17) !important;
                box-shadow:0 12px 28px rgba(0,0,0,.65), inset 0 1px 0 rgba(255,255,255,.07) !important;
                -webkit-backdrop-filter:none !important;
                backdrop-filter:none !important;
                transition:all .3s cubic-bezier(.2,.8,.2,1) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover {
                background-image:linear-gradient(145deg, #181d2a, #0e121c) !important;
                border-color:#3b4668 !important;
                box-shadow:0 20px 40px rgba(0,0,0,.85), inset 0 1px 0 rgba(255,255,255,.15), 0 0 20px rgba(79,70,229,.18) !important;
                transform:translateY(-3px) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td:first-child[data-spp-icon] {
                display:flex !important;
                grid-column:1 !important;
                grid-row:1 !important;
                align-self:start !important;
                justify-self:start !important;
                align-items:center !important;
                justify-content:center !important;
                width:36px !important;
                height:36px !important;
                border:1px solid rgba(255,255,255,.15) !important;
                border-radius:8px !important;
                background-color:transparent !important;
                background-image:linear-gradient(to bottom right, rgba(255,255,255,.10), rgba(255,255,255,.02)) !important;
                box-shadow:inset 0 2px 4px rgba(0,0,0,.05) !important;
                color:#22d3ee !important;
                transition:transform .3s ease, color .3s ease !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td:first-child[data-spp-icon] > .spp-sub-ico {
                display:flex !important;
                align-items:center !important;
                justify-content:center !important;
                color:inherit !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td:first-child[data-spp-icon] > .spp-sub-ico > svg {
                display:block !important;
                width:20px !important;
                height:20px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td:first-child[data-spp-icon] img { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover > td:first-child[data-spp-icon] {
                transform:scale(1.1) !important;
                color:#67e8f9 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] { grid-column:2 !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] h2 {
                display:block !important;
                font-size:14px !important;
                font-weight:700 !important;
                letter-spacing:.35px !important;
                overflow:hidden !important;
                text-overflow:ellipsis !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] h2 a {
                color:#fff !important;
                -webkit-text-fill-color:#fff !important;
                font-size:14px !important;
                font-weight:700 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover > th[align="left"] h2 a {
                color:#67e8f9 !important;
                -webkit-text-fill-color:#67e8f9 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] .smalltxt {
                font-size:10px !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 {
                grid-column:4 !important;
                grid-row:1 !important;
                align-self:start !important;
                justify-self:end !important;
                font-size:0 !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
                color:#67e8f9 !important;
                -webkit-text-fill-color:#67e8f9 !important;
                padding:2px 8px !important;
                border-radius:9999px !important;
                background-color:rgba(6,182,212,.10) !important;
                border:1px solid rgba(6,182,212,.25) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10::before {
                content:attr(data-spp-posts) !important;
                font-size:11px !important;
                font-weight:600 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.y-style:not(.f10):not(:first-child) {
                grid-column:3 !important;
                font-size:10px !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one::before {
                height:1px !important;
                border:0 none !important;
                background-color:transparent !important;
                background-image:linear-gradient(to right, rgba(0,0,0,0), rgba(255,255,255,.10), rgba(0,0,0,0)) !important;
                margin:10px 0 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt {
                display:flex !important;
                align-items:center !important;
                gap:6px !important;
                font-size:11px !important;
                color:#d1d5db !important;
                -webkit-text-fill-color:#d1d5db !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt::before { content:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-last-ico {
                display:flex !important;
                align-items:center !important;
                justify-content:center !important;
                flex:0 0 auto !important;
                color:#9ca3af !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-last-ico > svg {
                display:block !important;
                width:14px !important;
                height:14px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover > th.smalltxt > .spp-sub-last-ico {
                color:#22d3ee !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > h3 {
                display:block !important;
                min-width:0 !important;
                overflow:hidden !important;
                text-overflow:ellipsis !important;
                white-space:nowrap !important;
                font-size:11px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt h3 a {
                color:#d1d5db !important;
                -webkit-text-fill-color:#d1d5db !important;
                font-size:11px !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt h3 a:hover {
                color:#fff !important;
                -webkit-text-fill-color:#fff !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt::after {
                content:attr(title) !important;
                margin-left:auto !important;
                font-size:10px !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall] { grid-template-rows:auto !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall]::before { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall] > th.smalltxt { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall] > td.f10 {
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
                background-color:rgba(255,255,255,.05) !important;
                border-color:rgba(255,255,255,.10) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall] > td.f10::after { content:none !important; }${SPP_SCHEME_STAR ? `
            /* ==================== SPP-STAR-BEGIN:子版块卡片 → 典藏星舰(星舰 + 宽奢 + 双行 + 火花条)==================== */
            html #main #spp-announce .spp-pane-subs #cate_children { gap:18px !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one {
                grid-template-rows:auto auto auto !important;
                row-gap:16px !important;
                column-gap:10px !important;
                align-items:start !important;
                padding:20px !important;
                border:1px solid rgba(255,255,255,.08) !important;
                border-top-color:rgba(255,255,255,.22) !important;
                border-radius:16px !important;
                background-color:transparent !important;
                background-image:linear-gradient(165deg, rgba(15,23,42,.72) 0%, rgba(9,14,26,.85) 100%) !important;
                -webkit-backdrop-filter:blur(24px) saturate(190%) !important;
                backdrop-filter:blur(24px) saturate(190%) !important;
                box-shadow:0 12px 36px -12px rgba(0,0,0,.8), inset 0 1px 1px rgba(255,255,255,.12) !important;
                transition:all .3s cubic-bezier(.16,1,.3,1) !important;
            }
            @media (min-width:640px) {
                html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one { padding:24px !important; }
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover {
                background-image:linear-gradient(165deg, rgba(15,23,42,.72) 0%, rgba(9,14,26,.85) 100%) !important;
                border-color:rgba(56,189,248,.45) !important;
                border-top-color:rgba(147,197,253,.75) !important;
                transform:translateY(-4px) !important;
                box-shadow:0 22px 50px -15px rgba(14,165,233,.3), inset 0 1px 2px rgba(255,255,255,.25) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] h2 { line-height:1 !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] h2 a {
                font-size:24px !important;
                font-weight:900 !important;
                letter-spacing:-.025em !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover > th[align="left"] h2 a {
                color:#7dd3fc !important;
                -webkit-text-fill-color:#7dd3fc !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 {
                padding:2px 10px !important;
                color:#7dd3fc !important;
                -webkit-text-fill-color:#7dd3fc !important;
                background-color:rgba(14,165,233,.15) !important;
                border:1px solid rgba(56,189,248,.30) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one::before {
                content:"" !important;
                display:block !important;
                grid-column:1/-1 !important;
                grid-row:2 !important;
                align-self:center !important;
                height:4px !important;
                border:0 none !important;
                border-radius:9999px !important;
                background-color:rgba(255,255,255,.10) !important;
                background-image:none !important;
                margin:0 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one::after {
                content:"" !important;
                display:block !important;
                grid-column:1/-1 !important;
                grid-row:2 !important;
                align-self:center !important;
                justify-self:start !important;
                width:var(--spp-heat, 0%) !important;
                max-width:100% !important;
                height:4px !important;
                border:0 none !important;
                border-radius:9999px !important;
                background-color:transparent !important;
                background-image:linear-gradient(to right, #38bdf8, #6366f1) !important;
                transition:width .7s ease !important;
                pointer-events:none !important;
            }
            @keyframes sppHeatShine {
                0% { background-position:0% 50%; }
                50% { background-position:100% 50%; }
                100% { background-position:0% 50%; }
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot]::after {
                background-image:linear-gradient(to right, #f43f5e, #fbbf24, #fcd34d) !important;
                background-size:200% 200% !important;
                animation:sppHeatShine 3s ease infinite !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt {
                display:flex !important;
                flex-direction:column !important;
                align-items:stretch !important;
                gap:6px !important;
                grid-column:1/-1 !important;
                grid-row:3 !important;
                justify-self:stretch !important;
                padding:10px 12px !important;
                border:1px solid rgba(255,255,255,.05) !important;
                border-radius:12px !important;
                background-color:rgba(3,7,18,.55) !important;
                background-image:none !important;
                white-space:normal !important;
                overflow:visible !important;
                text-overflow:clip !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt::after { content:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-tray-head {
                display:flex !important;
                align-items:center !important;
                gap:6px !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
                font-size:10px !important;
                line-height:1.4 !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-tray-head > .spp-sub-last-ico {
                display:flex !important;
                align-items:center !important;
                justify-content:center !important;
                flex:0 0 auto !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-tray-head > .spp-sub-last-ico > svg {
                display:block !important;
                width:12px !important;
                height:12px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover > th.smalltxt > .spp-sub-tray-head > .spp-sub-last-ico {
                color:#22d3ee !important;
                -webkit-text-fill-color:#22d3ee !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-tray-head > .spp-sub-avatar {
                display:flex !important;
                align-items:center !important;
                justify-content:center !important;
                flex:0 0 auto !important;
                width:16px !important;
                height:16px !important;
                border:1px solid rgba(56,189,248,.30) !important;
                border-radius:9999px !important;
                background-color:rgba(14,165,233,.20) !important;
                color:#7dd3fc !important;
                -webkit-text-fill-color:#7dd3fc !important;
                font-size:9px !important;
                font-weight:700 !important;
                line-height:1 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-tray-head > .spp-sub-author {
                flex:0 1 auto !important;
                min-width:0 !important;
                max-width:110px !important;
                overflow:hidden !important;
                text-overflow:ellipsis !important;
                white-space:nowrap !important;
                color:#d1d5db !important;
                -webkit-text-fill-color:#d1d5db !important;
                font-weight:600 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-tray-head > .spp-sub-time {
                margin-left:auto !important;
                flex:0 0 auto !important;
                white-space:nowrap !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > h3 {
                display:block !important;
                min-width:0 !important;
                overflow:hidden !important;
                text-overflow:ellipsis !important;
                white-space:nowrap !important;
                line-height:1.375 !important;
                font-size:12px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt h3 a {
                font-size:12px !important;
                color:#e5e7eb !important;
                -webkit-text-fill-color:#e5e7eb !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one:hover > th.smalltxt h3 a {
                color:#bae6fd !important;
                -webkit-text-fill-color:#bae6fd !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-hash { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-noreply] { grid-template-rows:auto auto !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-noreply] > th.smalltxt { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall] { grid-template-rows:auto !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall]::before { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall]::after { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] {
                display:flex !important;
                flex-wrap:wrap !important;
                align-items:center !important;
                column-gap:6px !important;
                row-gap:4px !important;
                min-width:0 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] h2 {
                order:1 !important;
                flex:0 1 auto !important;
                min-width:0 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .smalltxt {
                order:9 !important;
                flex:1 1 100% !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .smalltxt:empty { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-brk {
                order:3 !important;
                flex:1 0 100% !important;
                height:0 !important;
                margin:0 !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-year {
                order:2 !important;
                flex:0 0 auto !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
                font-size:12px !important;
                font-weight:700 !important;
                line-height:1 !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-ms {
                order:4 !important;
                display:inline-flex !important;
                align-items:center !important;
                flex:0 0 auto !important;
                box-sizing:border-box !important;
                height:20px !important;
                padding:0 7px !important;
                border:1px solid transparent !important;
                border-radius:6px !important;
                font-size:10px !important;
                font-weight:700 !important;
                line-height:1 !important;
                letter-spacing:.2px !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-ms[data-tone="gold"] {
                background-color:#fbbf24 !important;
                color:#111827 !important;
                -webkit-text-fill-color:#111827 !important;
                box-shadow:0 2px 8px rgba(251,191,36,.35) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-ms[data-tone="rose"] {
                background-color:rgba(244,63,94,.18) !important;
                color:#fda4af !important;
                -webkit-text-fill-color:#fda4af !important;
                border-color:rgba(244,63,94,.35) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-season {
                order:5 !important;
                display:inline-flex !important;
                align-items:center !important;
                flex:0 0 auto !important;
                box-sizing:border-box !important;
                height:20px !important;
                padding:0 9px !important;
                border:1px solid transparent !important;
                border-radius:9999px !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
                font-size:11px !important;
                font-weight:600 !important;
                line-height:1 !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-season[data-tone="winter"] {
                background-color:rgba(14,165,233,.15) !important;
                color:#7dd3fc !important;
                -webkit-text-fill-color:#7dd3fc !important;
                border-color:rgba(56,189,248,.30) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-season[data-tone="summer"] {
                background-color:rgba(245,158,11,.15) !important;
                color:#fcd34d !important;
                -webkit-text-fill-color:#fcd34d !important;
                border-color:rgba(251,191,36,.30) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-gold] {
                background-image:linear-gradient(155deg, rgba(38,28,12,.85) 0%, rgba(18,14,24,.9) 100%) !important;
                border:1px solid rgba(245,158,11,.5) !important;
                border-top-color:rgba(252,211,77,.8) !important;
                box-shadow:0 16px 45px -12px rgba(245,158,11,.35), inset 0 1px 2px rgba(254,243,199,.3) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-gold]:hover {
                background-image:linear-gradient(155deg, rgba(38,28,12,.85) 0%, rgba(18,14,24,.9) 100%) !important;
                border-color:rgba(251,191,36,.85) !important;
                border-top-color:rgba(252,211,77,.8) !important;
                box-shadow:0 24px 60px -15px rgba(245,158,11,.5), 0 0 30px rgba(245,158,11,.25) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 {
                display:inline-flex !important;
                align-items:center !important;
                box-sizing:border-box !important;
                height:20px !important;
                line-height:16px !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td:first-child[data-spp-icon] { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one { grid-template-columns:minmax(0,1fr) auto auto !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] { grid-column:1 !important; grid-row:1 !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.y-style:not(.f10):not(:first-child) { grid-column:2 !important; grid-row:1 !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 { grid-column:3 !important; grid-row:1 !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] { row-gap:2px !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-brk { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th[align="left"] > .spp-sub-era {
                order:8 !important;
                flex:1 1 100% !important;
                margin-top:2px !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
                font-size:11px !important;
                font-weight:400 !important;
                line-height:1.3 !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
                white-space:nowrap !important;
                overflow:hidden !important;
                text-overflow:ellipsis !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 {
                display:grid !important;
                grid-template-columns:auto auto !important;
                justify-content:end !important;
                justify-items:end !important;
                align-items:center !important;
                align-self:start !important;
                justify-self:end !important;
                row-gap:3px !important;
                height:auto !important;
                padding:0 !important;
                border:0 none !important;
                background-color:transparent !important;
                background-image:none !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 > .spp-sub-season {
                grid-row:1 !important;
                grid-column:1 / -1 !important;
                justify-self:end !important;
                display:inline-flex !important;
                align-items:center !important;
                flex:0 0 auto !important;
                box-sizing:border-box !important;
                height:20px !important;
                padding:0 9px !important;
                border:1px solid transparent !important;
                border-radius:9999px !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
                font-size:11px !important;
                font-weight:600 !important;
                line-height:1 !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 > .spp-sub-season[data-tone="winter"] {
                background-color:rgba(14,165,233,.15) !important;
                color:#7dd3fc !important;
                -webkit-text-fill-color:#7dd3fc !important;
                border-color:rgba(56,189,248,.30) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 > .spp-sub-season[data-tone="summer"] {
                background-color:rgba(245,158,11,.15) !important;
                color:#fcd34d !important;
                -webkit-text-fill-color:#fcd34d !important;
                border-color:rgba(251,191,36,.30) !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10 > .spp-sub-brk { display:none !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10::before {
                content:attr(data-spp-posts) !important;
                grid-row:2 !important;
                grid-column:1 !important;
                font-size:12px !important;
                font-weight:600 !important;
                color:#d1d5db !important;
                -webkit-text-fill-color:#d1d5db !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.f10::after {
                content:" 帖" !important;
                grid-row:2 !important;
                grid-column:2 !important;
                opacity:1 !important;
                font-size:10px !important;
                font-weight:400 !important;
                color:#6b7280 !important;
                -webkit-text-fill-color:#6b7280 !important;
                white-space:nowrap !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall] > td.f10 { row-gap:0 !important; }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-wall] > td.f10::before {
                font-size:11px !important;
                font-weight:600 !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
            }
            html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > th.smalltxt > .spp-sub-tray-head > .spp-sub-last-ico { display:none !important; }
            /* SPP-STAR-END */` : ''}

            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one::before,
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one::after {
                content:none !important;
                display:none !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.spp-sub-gauge-cell {
                grid-column:1 / -1 !important;
                grid-row:2 !important;
                margin:0 !important;
                padding:0 !important;
                border:0 none !important;
                background-color:transparent !important;
                background-image:none !important;
                min-width:0 !important;
                height:auto !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.spp-sub-gauge-cell > .spp-sub-gauge {
                background-color:rgba(3,7,18,.55) !important;
                background-image:none !important;
                border:1px solid rgba(255,255,255,.05) !important;
                border-radius:12px !important;
                padding:10px 12px !important;
                box-sizing:border-box !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.spp-sub-gauge-cell > .spp-sub-gauge > .spp-sub-gauge-head {
                display:flex !important;
                align-items:center !important;
                justify-content:space-between !important;
                font-family:ui-monospace, Consolas, "JetBrains Mono", monospace !important;
                font-size:11px !important;
                font-weight:400 !important;
                line-height:1.35 !important;
                color:#9ca3af !important;
                -webkit-text-fill-color:#9ca3af !important;
                white-space:nowrap !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.spp-sub-gauge-cell .spp-sub-heat-dot {
                flex:0 0 auto !important;
                width:6px !important;
                height:6px !important;
                border-radius:9999px !important;
                background-color:#38bdf8 !important;
                margin-right:6px !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.spp-sub-gauge-cell .spp-sub-heat-val {
                font-weight:700 !important;
                color:#7dd3fc !important;
                -webkit-text-fill-color:#7dd3fc !important;
                margin-left:auto !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.spp-sub-gauge-cell .spp-sub-gauge-track {
                width:100% !important;
                height:8px !important;
                box-sizing:border-box !important;
                padding:1px !important;
                margin-top:6px !important;
                border-radius:9999px !important;
                background-color:rgba(255,255,255,.10) !important;
                overflow:hidden !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one > td.spp-sub-gauge-cell .spp-sub-heat-fill {
                height:100% !important;
                border-radius:9999px !important;
                background-image:linear-gradient(to right, #38bdf8, #6366f1) !important;
                transition:width .7s ease !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot] .spp-sub-heat-dot {
                background-color:#fb7185 !important;
                animation:sppHeatPing 1.6s ease-in-out infinite !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot] .spp-sub-heat-val {
                color:#fcd34d !important;
                -webkit-text-fill-color:#fcd34d !important;
            }
            html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot] .spp-sub-heat-fill {
                background-image:linear-gradient(to right, #f43f5e, #fbbf24, #fcd34d) !important;
            }
            @keyframes sppHeatPing {
                0% { opacity:1; }
                50% { opacity:.35; }
                100% { opacity:1; }
            }
            html.spp-no-topics .spp-pgbar > .fl { display: none !important; }
            html.spp-no-topics #main > div.t3:has(div.pages) > .fl { display: none !important; }
            #spp-announce .spp-pane-cover { padding:12px 16px 16px !important; }
            #spp-announce .spp-pane-cover img {
                display:block !important; max-width:100% !important; height:auto !important;
                margin:0 auto !important; border-radius:8px !important;
            }

            @media (max-width:760px) {
                :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-item {
                    grid-template-columns:26px minmax(0,1fr) !important;
                    grid-template-areas:"dot title" "dot byline" "dot meta" !important;
                }
                :is(#spp-announce, #spp-bnotice, #spp-btabs) .spp-ann-meta { margin-left:0 !important; }
            }
            #spp-btabs { gap:8px !important; padding:6px 10px !important; }
            #spp-btabs .spp-tab-div { display:none !important; }
            #spp-announce .spp-pane-cats { padding:12px 14px 10px !important; }
            #spp-announce .spp-pane-cats ul.threadlist {
                display:flex !important; flex-wrap:wrap !important; align-items:center !important;
                gap:8px !important; margin:0 !important; padding:0 !important;
                position:static !important; bottom:auto !important; height:auto !important;
                overflow:visible !important; float:none !important;
            }
            #spp-announce .spp-pane-cats ul.threadlist > span { display:contents !important; }
            #spp-announce .spp-pane-cats ul.threadlist li {
                display:block !important; float:none !important; list-style:none !important;
                margin:0 !important; padding:0 !important;
            }
            #spp-announce .spp-pane-cats li > a {
                display:inline-flex !important; align-items:center !important; height:28px !important;
                padding:0 13px !important; border-radius:999px !important;
                border:1px solid rgba(255,255,255,.12) !important;
                background-color:rgba(255,255,255,.05) !important;
                color:#c8d6ea !important; -webkit-text-fill-color:#c8d6ea !important;
                font-size:12.5px !important; text-decoration:none !important; white-space:nowrap !important;
            }
            #spp-announce .spp-pane-cats li > a:hover {
                background-color:rgba(255,255,255,.10) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
            }
            #spp-announce .spp-pane-cats li.current > a {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                background-color:rgba(32,201,151,.14) !important;
                border-color:rgba(32,201,151,.45) !important; font-weight:600 !important;
            }
            #spp-btabs .spp-catrow {
                display:flex !important; align-items:center !important;
                gap:6px !important; margin:0 0 0 2px !important; padding:4px 6px !important;
                border-radius:999px !important; white-space:nowrap !important;
                background-color:rgba(255,255,255,.045) !important;
                border:1px solid rgba(255,255,255,.10) !important;
                box-shadow:inset 0 1px 0 rgba(255,255,255,.06) !important;
            }
            #spp-btabs .spp-catrow ul.threadlist {
                display:flex !important; flex-wrap:wrap !important; align-items:center !important;
                gap:6px !important; margin:0 !important; padding:0 !important;
                position:static !important; bottom:auto !important; height:auto !important;
                overflow:visible !important; float:none !important;
                background:none !important; border:0 !important;
            }
            #spp-btabs .spp-catrow ul.threadlist > span { display:contents !important; }
            #spp-btabs .spp-catrow ul.threadlist li {
                display:block !important; float:none !important; list-style:none !important;
                margin:0 !important; padding:0 !important;
            }
            #spp-btabs .spp-catrow li > a {
                display:inline-flex !important; align-items:center !important; height:26px !important;
                padding:0 12px !important; border-radius:999px !important; line-height:1 !important;
                border:1px solid rgba(255,255,255,.12) !important;
                background-color:rgba(255,255,255,.05) !important;
                color:#c8d6ea !important; -webkit-text-fill-color:#c8d6ea !important;
                font-size:12.5px !important;
                text-decoration:none !important; white-space:nowrap !important;
            }
            #spp-btabs .spp-catrow li > a:hover {
                background-color:rgba(255,255,255,.11) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
            }
            #spp-btabs .spp-catrow li.current > a {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                background-color:rgba(32,201,151,.14) !important;
                border-color:rgba(32,201,151,.45) !important; font-weight:600 !important;
            }
            html.spp-tea-filtered #spp-btabs .spp-catrow li > a,
            html.spp-tea-filtered #spp-btabs .spp-catrow li.current > a {
                color:#7c8798 !important; -webkit-text-fill-color:#7c8798 !important;
                background-color:rgba(255,255,255,.03) !important;
                border-color:rgba(255,255,255,.07) !important; font-weight:400 !important;
            }
            #spp-btabs .spp-catrow .spp-cat-filing {
                display:inline-flex !important; align-items:center !important; gap:5px !important;
                height:26px !important; padding:0 11px !important; border-radius:999px !important;
                line-height:1 !important; font-size:12.5px !important; white-space:nowrap !important;
                user-select:none !important; cursor:not-allowed !important;
                border:1px dashed rgba(255,255,255,.10) !important;
                background-color:rgba(255,255,255,.02) !important;
                background-image:none !important;
                color:#5c6678 !important; -webkit-text-fill-color:#5c6678 !important;
                transition:color .18s ease, background-color .18s ease,
                           border-color .18s ease, box-shadow .18s ease !important;
            }
            #spp-btabs .spp-catrow .spp-cat-filing::before {
                content:'' !important; width:6px !important; height:6px !important;
                border-radius:50% !important; background:currentColor !important;
                box-shadow:none !important; opacity:.5 !important;
            }
            html.spp-tea-filtered #spp-btabs .spp-catrow .spp-cat-filing {
                border-style:solid !important;
                border-color:rgba(16,185,129,.55) !important;
                background-color:rgba(16,185,129,.14) !important;
                color:#6ee7b7 !important; -webkit-text-fill-color:#6ee7b7 !important;
                font-weight:600 !important;
                box-shadow:inset 0 0 0 1px rgba(16,185,129,.16),
                           0 0 14px -2px rgba(16,185,129,.45) !important;
            }
            html.spp-tea-filtered #spp-btabs .spp-catrow .spp-cat-filing::before {
                opacity:1 !important;
                box-shadow:0 0 8px rgba(16,185,129,.9) !important;
            }
            #spp-btabs .spp-askrow {
                display:inline-flex !important; align-items:center !important;
                gap:6px !important; margin:0 0 0 2px !important; padding:4px 6px !important;
                border-radius:999px !important; white-space:nowrap !important;
                background-color:rgba(255,255,255,.045) !important;
                border:1px solid rgba(255,255,255,.10) !important;
                box-shadow:inset 0 1px 0 rgba(255,255,255,.06) !important;
            }
            #spp-btabs .spp-askrow .spp-cat-pill {
                display:inline-flex !important; align-items:center !important; height:26px !important;
                padding:0 12px !important; border-radius:999px !important; line-height:1 !important;
                border:1px solid rgba(255,255,255,.12) !important;
                background-color:rgba(255,255,255,.05) !important; background-image:none !important;
                color:#c8d6ea !important; -webkit-text-fill-color:#c8d6ea !important;
                font-size:12.5px !important; font-weight:400 !important;
                text-decoration:none !important; white-space:nowrap !important; cursor:pointer !important;
                transition:color .18s ease, background-color .18s ease, border-color .18s ease !important;
            }
            #spp-btabs .spp-askrow .spp-cat-pill:hover {
                background-color:rgba(255,255,255,.11) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
            }
            #spp-btabs .spp-askrow .spp-cat-pill.is-cur {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                background-color:rgba(32,201,151,.14) !important;
                border-color:rgba(32,201,151,.45) !important; font-weight:600 !important;
            }
            html.spp-ask-filtered #spp-btabs .spp-askrow .spp-cat-pill {
                color:#7c8798 !important; -webkit-text-fill-color:#7c8798 !important;
                background-color:rgba(255,255,255,.03) !important;
                border-color:rgba(255,255,255,.07) !important; font-weight:400 !important;
            }
            #spp-btabs .spp-askrow .spp-cat-filing {
                display:inline-flex !important; align-items:center !important; gap:5px !important;
                height:26px !important; padding:0 11px !important; border-radius:999px !important;
                line-height:1 !important; font-size:12.5px !important; white-space:nowrap !important;
                user-select:none !important; cursor:not-allowed !important;
                border:1px dashed rgba(255,255,255,.10) !important;
                background-color:rgba(255,255,255,.02) !important;
                background-image:none !important;
                color:#5c6678 !important; -webkit-text-fill-color:#5c6678 !important;
                transition:color .18s ease, background-color .18s ease,
                           border-color .18s ease, box-shadow .18s ease !important;
            }
            #spp-btabs .spp-askrow .spp-cat-filing::before {
                content:'' !important; width:6px !important; height:6px !important;
                border-radius:50% !important; background:currentColor !important;
                box-shadow:none !important; opacity:.5 !important;
            }
            html.spp-ask-filtered #spp-btabs .spp-askrow .spp-cat-filing {
                border-style:solid !important;
                border-color:rgba(16,185,129,.55) !important;
                background-color:rgba(16,185,129,.14) !important;
                color:#6ee7b7 !important; -webkit-text-fill-color:#6ee7b7 !important;
                font-weight:600 !important;
                box-shadow:inset 0 0 0 1px rgba(16,185,129,.16),
                           0 0 14px -2px rgba(16,185,129,.45) !important;
            }
            html.spp-ask-filtered #spp-btabs .spp-askrow .spp-cat-filing::before {
                opacity:1 !important;
                box-shadow:0 0 8px rgba(16,185,129,.9) !important;
            }
            ${CSS_BOARDTOOL}
/* ===== SPP-ANNOUNCE-END ===== */
`);
GM_addStyle(CSS_HOTBOARD);
GM_addStyle(`
/* ===== SPP-METABTN-BEGIN ===== */
            html.spp-board-skin #wall ul.stream > li > .inner .spp-meta-btns {
                display:inline-flex !important;
                gap:6px !important;
                align-items:center !important;
            }
            html.spp-board-skin #wall ul.stream > li > .inner .spp-metabtn {
                padding:4px 12px !important;
                font-size:12px !important;
                line-height:1.5 !important;
                font-family:inherit !important;
                font-weight:400 !important;
                outline:none !important;
                border:none !important;
                border-radius:10px !important;
                background:#1e1e1e !important;
                cursor:pointer !important;
                color:var(--spp-mbtn-fg,#9AA5BB) !important;
                box-shadow:0 0 10px #363636, inset 0 0 10px #363636 !important;
            }
            html.spp-board-skin #wall ul.stream > li > .inner .spp-metabtn:hover {
                transition:0.5s !important;
                animation:spp-metabtn-pop 1.1s 1 ease-in-out !important;
            }
            @keyframes spp-metabtn-pop {
                0%   { transform:scale(1, 1) }
                22%  { transform:scale(1.06, 0.95) }
                45%  { transform:scale(0.98, 1.03) }
                68%  { transform:scale(1.02, 0.99) }
                100% { transform:scale(1, 1) }
            }
            #spp-announce .spp-meta-btns {
                display:inline-flex !important;
                gap:6px !important;
                align-items:center !important;
            }
            #spp-announce .spp-metabtn {
                padding:4px 12px !important;
                font-size:12.5px !important;
                line-height:1.5 !important;
                font-family:inherit !important;
                font-weight:500 !important;
                outline:none !important;
                border:none !important;
                border-radius:10px !important;
                background:#1e1e1e !important;
                cursor:pointer !important;
                color:var(--spp-mbtn-fg,#9AA5BB) !important;
                -webkit-text-fill-color:var(--spp-mbtn-fg,#9AA5BB) !important;
                box-shadow:0 0 10px #363636, inset 0 0 10px #363636 !important;
            }
            #spp-announce .spp-metabtn:hover {
                transition:0.5s !important;
                animation:spp-metabtn-pop 1.1s 1 ease-in-out !important;
            }
/* ===== SPP-METABTN-END ===== */
        `);
function norm(str) { return str.replace(/ /g, ' ').trim(); }
function reformatAuthorDate(li) {
const intro = li.querySelector('.section-intro');
if (!intro || intro.dataset.sppTlDone) return;
intro.dataset.sppTlDone = '1';
intro.style.backgroundColor = 'transparent';
const tds = intro.querySelectorAll('td');
let author = '', date = '';
tds.forEach(td => {
const text = norm(td.textContent);
if (/作者/.test(text)) {
const a = td.querySelector('a');
author = a ? a.textContent.trim() : text.replace(/.*作者[::]\s*/, '');
} else if (/\d{4}-\d{2}-\d{2}/.test(text)) {
const m = text.match(/(\d{4}-\d{2}-\d{2})/);
date = m ? m[1] : '';
}
});
if (author || date) {
const newContent = document.createElement('span');
newContent.className = 'spp-tl-author-line';
newContent.textContent = author + (date ? ' - 发布于 ' + date : '');
newContent.style.cssText = 'color:#999;font-size:12px;';
const aLink = intro.querySelector('td a');
if (aLink && aLink.getAttribute('href')) {
newContent.dataset.sppAuthorHref = aLink.getAttribute('href');
}
intro.innerHTML = '';
intro.appendChild(newContent);
}
}
const TITLE_WHITE = '#FFFFFF';
function readReplyCount(li) {
const replySpan = li.querySelector('.spp-tl-reply');
if (replySpan) {
const n = parseInt(replySpan.textContent, 10);
if (!isNaN(n)) return n;
}
const sectionText = li.querySelector('.section-text');
if (!sectionText) return NaN;
const m = sectionText.textContent.match(/回复(?:\/人气)?[::]\s*(\d+)/);
return m ? parseInt(m[1], 10) : NaN;
}
let sppHeatStyleCache = null;
function heatStyleNow() {
if (sppHeatStyleCache === null) sppHeatStyleCache = SPP_CONFIG.heatStyle();
return sppHeatStyleCache;
}
function getHeatColor(heat) {
const s = heatStyleNow();
if (heat <= s.tCold) return s.cCold;
if (heat <= s.tWarm) return s.cWarm;
if (heat <= s.tHot)  return s.cHot;
return s.cPeak;
}
function readHeatCount(li) {
const heatSpan = li.querySelector('.spp-tl-heat');
if (heatSpan) {
const n = parseInt(heatSpan.textContent, 10);
if (!isNaN(n)) return n;
}
const sectionText = li.querySelector('.section-text');
if (!sectionText) return NaN;
const txt = sectionText.textContent;
const m = txt.match(/回复\/人气[::]\s*\d+\s*\/\s*(\d+)/) || txt.match(/热度\s*(\d+)/);
return m ? parseInt(m[1], 10) : NaN;
}
const SPP_TITLE_INK_OFF = '#FFFFFF';
let sppHeatScopeCache = null;
function heatScopeNow() {
if (sppHeatScopeCache === null) sppHeatScopeCache = SPP_CONFIG.heatScope();
return sppHeatScopeCache;
}
function heatFlameOn() { return heatScopeNow() !== 'off'; }
function titleHeatOn() { return heatScopeNow() === 'flame_title'; }
function titleInkCss(li) {
return !titleHeatOn() ? 'var(--spp-title-ink)' : '';
}
function titleInkColor(li) {
if (!heatFlameOn()) return SPP_TITLE_INK_OFF;
const h = readHeatCount(li);
if (!isNaN(h)) return getHeatColor(h);
const n = readReplyCount(li);
return isNaN(n) ? '' : getReplyColor(n);
}
function normalizeTitleInlineColor(li) {
const titleLink = li.querySelector('.section-title a');
if (!titleLink) return 0;
if (titleLink.dataset.sppTitleNorm) return 0;
titleLink.dataset.sppTitleNorm = '1';
const colored = [];
titleLink.querySelectorAll('font[color]').forEach(el => {
if (colored.indexOf(el) < 0) colored.push(el);
});
titleLink.querySelectorAll('[style*="color"]').forEach(el => {
if (colored.indexOf(el) < 0) colored.push(el);
});
if (!colored.length) return 0;
const ink = titleInkColor(li) || TITLE_WHITE;
const inkCss = titleInkCss(li) || ink;
colored.forEach(el => {
if (el.hasAttribute('color')) el.setAttribute('color', ink);
el.style.setProperty('color', inkCss, 'important');
});
return colored.length;
}
function reformatReplyViews(li) {
const sectionText = li.querySelector('.section-text');
if (!sectionText) return;
sectionText.querySelectorAll('span').forEach(span => {
if (span.dataset.sppTlReplyDone) return;
const text = norm(span.textContent);
const match = text.match(/回复\/人气[::]\s*(\d+)\s*\/\s*(\d+)/);
if (match) {
span.dataset.sppTlReplyDone = '1';
const replyCount = parseInt(match[1], 10);
const heatCount = parseInt(match[2], 10);
let color = getReplyColor(replyCount);
if (isTeaFid()) color = titleInkColor(li) || color;
if (!isTeaFid()) color = titleInkColor(li) || color;
const flame = '<svg class="spp-flame" viewBox="0 0 24 24" aria-hidden="true" focusable="false">' +
'<path fill-rule="evenodd" clip-rule="evenodd" d="M12.964 2.126a.75.75 0 00-1.423.284c.159.799-.026 1.777-.66 2.766-.583.91-1.455 1.758-2.58 2.62-1.928 1.476-4.551 3.483-4.551 6.204 0 2.453 1.258 4.606 3.125 5.86 1.838 1.233 4.29 1.638 6.703.882 1.614-.505 3.121-1.573 4.148-3.076.992-1.45 1.524-3.195 1.524-4.887 0-3.522-2.127-5.918-4.043-7.51a37.893 37.893 0 00-2.243-1.637v-.002z"/></svg>';
span.classList.add('spp-meta-btns');
span.innerHTML =
'<button type="button" class="spp-metabtn" style="--spp-mbtn-fg:' + color + '">回复 ' +
'<span class="spp-tl-reply" style="color:' + color + ';-webkit-text-fill-color:' + color + ';font-weight:bold">' + replyCount + '</span></button>' +
'<button type="button" class="spp-metabtn" style="--spp-mbtn-fg:' + color + '">' + flame + '热度 ' +
'<span class="spp-tl-heat" style="color:' + color + ';-webkit-text-fill-color:' + color + ';font-weight:bold">' + heatCount + '</span></button>';
}
});
li.classList.toggle('spp-st-hasflame', !!li.querySelector('.spp-flame'));
}
function colorTitleByHeat(li) {
const titleLink = li.querySelector('.section-title a');
if (!titleLink || titleLink.dataset.sppHeatColor) return;
const color = titleInkCss(li) || titleInkColor(li);
if (!color) return;
titleLink.style.setProperty('color', color, 'important');
titleLink.dataset.sppHeatColor = '1';
}
let fullTitleMapPromise = null;
function getTopicId(href) {
const match = String(href || '').match(/[?&]tid(?:-|=)(\d+)/);
return match ? match[1] : '';
}
function isTruncatedTitle(title) {
return /(?:\.{2,}|…)$/.test(norm(title));
}
function loadFullTitleMap() {
if (fullTitleMapPromise) return fullTitleMapPromise;
fullTitleMapPromise = (async function () {
try {
const listUrl = new URL(location.href);
listUrl.pathname = listUrl.pathname.replace(/thread_new\.php$/, 'thread.php');
const response = await fetch(listUrl.href, { credentials: 'same-origin' });
if (!response.ok) throw new Error('HTTP ' + response.status);
const html = await response.text();
const doc = new DOMParser().parseFromString(html, 'text/html');
const titleMap = new Map();
doc.querySelectorAll('a[href*="read.php?tid"]').forEach(link => {
const tid = getTopicId(link.getAttribute('href'));
const title = norm(link.textContent);
if (!tid || !title) return;
const previous = titleMap.get(tid);
if (!previous || title.length > previous.length) {
titleMap.set(tid, title);
}
});
return titleMap;
} catch (error) {
console.warn('[SPP] 列表模式完整标题读取失败', error);
return new Map();
}
})();
return fullTitleMapPromise;
}
function restoreFullTitle(li) {
const titleLink = li.querySelector('.section-title a');
if (!titleLink || titleLink.dataset.sppFullTitle) return;
const currentTitle = norm(titleLink.textContent);
if (!isTruncatedTitle(currentTitle)) return;
const tid = getTopicId(titleLink.getAttribute('href'));
if (!tid) return;
titleLink.dataset.sppFullTitle = 'loading';
loadFullTitleMap().then(titleMap => {
const fullTitle = titleMap.get(tid);
if (fullTitle && fullTitle.length > currentTitle.length) {
titleLink.textContent = fullTitle;
titleLink.title = fullTitle;
titleLink.dataset.sppFullTitle = 'done';
} else {
titleLink.dataset.sppFullTitle = 'missing';
}
});
}
const COVER_PROBE_ON = SPP_CONFIG.bool('spp_cover_probe', true);
const DELETED_IMAGE_MARKERS = [
{ hostname: 'img.chkaja.com', width: 250, height: 250 },
{ hostname: 'i.ibb.co', width: 250, height: 250, onlyWhenEnabled: true },
{ hostname: 'i.ibb.co', width: 180, height: 180, onlyWhenEnabled: true },
{ hostname: 'i.postimg.cc', width: 320, height: 320, onlyWhenEnabled: true }
];
function isKnownDeletedImage(img) {
const src = img.currentSrc || getImgSrc(img);
if (!src) return false;
try {
const hostname = new URL(src, location.href).hostname.toLowerCase();
return DELETED_IMAGE_MARKERS.some(marker =>
hostname === marker.hostname
&& img.naturalWidth === marker.width
&& img.naturalHeight === marker.height
&& !(marker.onlyWhenEnabled && !COVER_PROBE_ON)
);
} catch (_) {
return false;
}
}
const COVER_REP_MIN = 2;
function coverSigOf(img) {
let host = '';
try { host = coverHostOf(img); } catch (_) { return ''; }
const w = img.naturalWidth, h = img.naturalHeight;
if (!host || !w || !h || w !== h) return '';   
return host + '|' + w;
}
let coverRepCache = null, coverRepAt = 0;
function coverRepSet() {
const now = Date.now();
if (coverRepCache && now - coverRepAt < 200) return coverRepCache;
const counts = new Map();
document.querySelectorAll('#wall ul.stream > li img').forEach(img => {
const sig = coverSigOf(img);
if (!sig) return;
counts.set(sig, (counts.get(sig) || 0) + 1);
});
const dead = new Set();
counts.forEach((n, sig) => { if (n >= COVER_REP_MIN) dead.add(sig); });
coverRepCache = dead;
coverRepAt = now;
return dead;
}
const COVER_PROBE_TIMEOUT = 6000;
const coverHostState = new Map();
function coverHostOf(img) {
try {
return new URL(img.currentSrc || getImgSrc(img), location.href).hostname.toLowerCase();
} catch (_) {
return '';
}
}
function coverHostHasDecoded(host) {
const imgs = document.querySelectorAll('#wall ul.stream > li img');
for (let i = 0; i < imgs.length; i++) {
const img = imgs[i];
if (img.complete && img.naturalWidth > 0 && coverHostOf(img) === host) return true;
}
return false;
}
function coverOtherSample(host, notUrl) {
const imgs = document.querySelectorAll('#wall ul.stream > li img');
for (let i = 0; i < imgs.length; i++) {
const img = imgs[i];
if (coverHostOf(img) !== host) continue;
let url = '';
try { url = new URL(img.currentSrc || getImgSrc(img), location.href).href; } catch (_) { continue; }
if (url && url !== notUrl) return url;
}
return '';
}
function coverProbeHost(host, sampleUrl) {
if (!COVER_PROBE_ON || !host || coverHostState.has(host)) return;
coverHostState.set(host, 'probing');
const settle = function (dead) {
if (!dead || coverHostHasDecoded(host)) { coverHostState.set(host, 'ok'); return; }
coverHostState.set(host, 'dead');
coverSweep();
};
const attempt = function (url, method, next) {
let ctl = null;
try { ctl = new AbortController(); } catch (_) { ctl = null; }
const timer = setTimeout(function () {
if (ctl) { try { ctl.abort(); } catch (_) {} }
}, COVER_PROBE_TIMEOUT);
const fin = function (ok) { clearTimeout(timer); next(ok); };
try {
fetch(url, {
method: method, mode: 'no-cors', credentials: 'omit',
referrerPolicy: 'no-referrer', cache: 'no-store',
signal: ctl ? ctl.signal : undefined
}).then(function () { fin(true); }, function () { fin(false); });
} catch (_) {
fin(false);
}
};
attempt(sampleUrl, 'HEAD', function (ok) {
if (ok) { settle(false); return; }
setTimeout(function () {
attempt(coverOtherSample(host, sampleUrl) || sampleUrl, 'GET', function (ok2) {
settle(!ok2);
});
}, 800);
});
}
function coverIssueProbes() {
if (!COVER_PROBE_ON) return;
document.querySelectorAll('#wall ul.stream > li').forEach(li => {
const img = li.querySelector('.section-text img');
if (!img) return;
const host = coverHostOf(img);
if (!host || coverHostState.has(host)) return;
let url = '';
try { url = new URL(img.currentSrc || getImgSrc(img), location.href).href; } catch (_) { return; }
coverProbeHost(host, url);
});
}
function coverHit(img, repSetIn) {
if (!COVER_PROBE_ON) return false;
if (isKnownDeletedImage(img)) return true;
const host = coverHostOf(img);
if (host && coverHostState.get(host) === 'dead') return true;
const sig = coverSigOf(img);
if (sig && (repSetIn || coverRepSet()).has(sig)) return true;
return false;
}
function coverSweep(onlyLis) {
if (!COVER_PROBE_ON) return 0;
const lis = (onlyLis && onlyLis.length)
? Array.prototype.slice.call(onlyLis)
: Array.from(document.querySelectorAll('#wall ul.stream > li:not(.spp-tl-list)'));
if (!lis.length) return 0;
const repSet = coverRepSet();
let n = 0;
lis.forEach(li => {
const img = li.querySelector('.section-text img');
if (!img) return;
const host = coverHostOf(img);
if (host && coverHostState.get(host) === 'dead') { convertCardToList(li); n++; return; }
if (!img.complete || !img.naturalWidth) return;
if (coverHit(img, repSet)) { convertCardToList(li); n++; }
});
if (n) groupCards();
return n;
}
function getCardImageState(img) {
const src = getImgSrc(img);
if (!src || src === 'about:blank' || src.startsWith('data:')) return 'invalid';
if (src.includes('noimageavailble')) return 'invalid';
if (img.dataset.sppImageLoadFailed === '1') return 'invalid';
const deferredSrc = img.getAttribute('data-src')
|| img.getAttribute('data-original')
|| img.getAttribute('data-lazy-src');
const activeSrc = img.currentSrc || img.src || '';
if (!img.complete || (deferredSrc && (!activeSrc || activeSrc === 'about:blank' || activeSrc.startsWith('data:')))) {
return 'pending';
}
if (img.naturalWidth === 0 || img.naturalHeight === 0) return 'invalid';
if (isKnownDeletedImage(img)) return 'invalid';
if (coverHit(img)) return 'invalid';
if (img.naturalWidth > 50 && img.naturalHeight > 50) return 'valid';
return 'invalid';
}
function convertCardToList(li) {
if (li.classList.contains('spp-tl-list')) return;
li.classList.add('spp-tl-list');
reformatAuthorDate(li);
cgActivity();                                          
}
/* ==CG-CONST-BEGIN== */
const CG_HEAD_CLS = 'spp-cg-head';
const CG_HEADS = [{ rank: 0, name: '横屏' }, { rank: 1, name: '竖屏' }, { rank: 2, name: '无图' }];
const CG_QUIET = 1500;                     
const CG_MAX_SETTLE = 40000;               
let cgTimer = 0, cgQuiet = 0, cgSettling = false, cgStartedAt = 0, cgRunning = false, cgStyled = false;
let cgPendSeen = -1;                       
/* ==CG-CONST-END== */
function cgStyle() {
if (cgStyled) return;
cgStyled = true;
ensureStyle('spp-cg-style', '/* SPP-CG-BEGIN */\n' +
'#wall ul.stream > .' + CG_HEAD_CLS + ' { grid-column:1 / -1; width:100%; max-width:100%;\n' +
'  float:none !important; position:static; box-sizing:border-box;\n' +
'  display:flex; align-items:baseline; gap:8px; margin:2px 0 0; padding:6px 2px 4px;\n' +
'  border-bottom:1px solid rgba(148,163,184,.22); color:#9fb0c8;\n' +
'  font-size:13px; font-weight:600; line-height:1.4; letter-spacing:.02em; }\n' +
'#wall ul.stream > .' + CG_HEAD_CLS + ' > .spp-cg-n { color:#6ee7b7; font-weight:700; }\n' +
'#wall ul.stream > .' + CG_HEAD_CLS + ' > .spp-cg-st { color:#e6b566; font-weight:500; font-size:12px; }\n' +
'html.spp-cf-on #wall ul.stream > .' + CG_HEAD_CLS + ',\n' +
'html.spp-ckw-on #wall ul.stream > .' + CG_HEAD_CLS + ',\n' +
'html.spp-hko-on #wall ul.stream > .' + CG_HEAD_CLS + ',\n' +
'html.spp-hkw-on #wall ul.stream > .' + CG_HEAD_CLS + ' { display:none !important; }\n' +
'/* SPP-CG-END */');
}
function cgRankOf(li) {
return li.classList.contains('spp-tl-list') ? 2
: li.classList.contains('spp-card-portrait') ? 1 : 0;
}
function cgLisOf(ul) {
return ul ? Array.from(ul.children).filter(function (c) { return c.tagName === 'LI'; }) : [];
}
function cgGrouped(lis) {
let last = -1;
for (let i = 0; i < lis.length; i++) {
const r = cgRankOf(lis[i]);
if (r < last) return false;
last = r;
}
return true;
}
function cgExistingHead(ul, rank) {
if (!ul) return null;
const kids = ul.children;
for (let i = 0; i < kids.length; i++) {
const c = kids[i];
if (c && c.getAttribute && c.getAttribute('data-spp-cg-head') === String(rank)) return c;
}
return null;
}
function cgDropHeads(ul) {
if (!ul) return 0;
let n = 0;
Array.from(ul.children).forEach(function (c) {
if (c && c.getAttribute && c.getAttribute('data-spp-cg-head') !== null && c.parentNode) {
c.parentNode.removeChild(c); n++;
}
});
return n;
}
function cgSyncHeads(ul) {
if (!ul) return 0;
const lis = cgLisOf(ul);
if (!cgGrouped(lis)) return cgDropHeads(ul);          
const cnt = [0, 0, 0], first = [null, null, null];
lis.forEach(function (li) {
const r = cgRankOf(li);
cnt[r]++;
if (!first[r]) first[r] = li;
});
let moved = 0;
CG_HEADS.forEach(function (h) {
let node = cgExistingHead(ul, h.rank);
if (!cnt[h.rank] || !first[h.rank]) {             
if (node && node.parentNode) { node.parentNode.removeChild(node); moved++; }
return;
}
cgStyle();
if (!node) {
node = document.createElement('div');
node.className = CG_HEAD_CLS;
node.setAttribute('data-spp-cg-head', String(h.rank));
node.setAttribute('data-spp-cg-name', h.name);
node.setAttribute('aria-hidden', 'true');     
const t = document.createElement('span'); t.className = 'spp-cg-t';
const n = document.createElement('span'); n.className = 'spp-cg-n';
const s = document.createElement('span'); s.className = 'spp-cg-st';
node.appendChild(t); node.appendChild(n); node.appendChild(s);
}
const tEl = node.children[0], nEl = node.children[1], sEl = node.children[2];
const tTxt = h.name + ':';
const nTxt = cnt[h.rank] + ' 张';                  
const sTxt = cgSettling ? '· 分类中…' : '';         
if (tEl.textContent !== tTxt) tEl.textContent = tTxt;
if (nEl.textContent !== nTxt) nEl.textContent = nTxt;
if (sEl.textContent !== sTxt) sEl.textContent = sTxt;
const anchor = first[h.rank];
if (node.parentNode !== ul || node.nextSibling !== anchor) {
ul.insertBefore(node, anchor);                
moved++;
}
});
return moved;
}
function cgPendingImgs(ul) {
if (!ul) return 0;
let n = 0;
cgLisOf(ul).forEach(function (li) {
const imgs = li.querySelectorAll('img');
for (let i = 0; i < imgs.length; i++) {
if (getCardImageState(imgs[i]) === 'pending') { n++; return; }
}
});
return n;
}
function cgWallUl() { return document.querySelector('#wall ul.stream'); }
function cgActivity() {
if (!cgStartedAt) cgStartedAt = Date.now();
cgSettling = true;
cgRegroupSoon();
try { clearTimeout(cgQuiet); } catch (e0) { }
cgQuiet = setTimeout(cgQuietDone, CG_QUIET);
}
function cgQuietDone() {
const ul = cgWallUl();
if (cgPendingImgs(ul) && (Date.now() - cgStartedAt) < CG_MAX_SETTLE) {
cgQuiet = setTimeout(cgQuietDone, CG_QUIET);
return;
}
cgSettling = false;
cgStartedAt = 0;
cgPendSeen = -1;                                      
cgRegroupSoon(true);                                  
}
function cgRegroupSoon(now) {
if (now) {
try { clearTimeout(cgTimer); } catch (e1) { }
cgTimer = 0;
cgRegroupNow();
return;
}
if (cgTimer) return;                                  
cgTimer = setTimeout(function () { cgTimer = 0; cgRegroupNow(); }, 300);
}
function cgRegroupNow() {
if (cgRunning) return;                                
cgRunning = true;
try {
try { groupCards(); } catch (e2) { }               
cgSyncHeads(cgWallUl());
} finally { cgRunning = false; }
}
function cgSyncHeadsNow() {
const ul = cgWallUl();
cgSyncHeads(ul);
const pend = cgPendingImgs(ul);
if (pend > 0 && pend !== cgPendSeen) { cgPendSeen = pend; cgActivity(); }
}
let coverSoonTimer = 0;
let coverSoonSet = new Set();
function coverSweepSoon(li) {
if (li) coverSoonSet.add(li);
if (coverSoonTimer) return;
coverSoonTimer = setTimeout(function () {
coverSoonTimer = 0;
const set = coverSoonSet;
coverSoonSet = new Set();
const lis = Array.from(set).filter(function (x) { return x && x.parentNode; });
if (!lis.length) return;
try { coverSweep(lis); } catch (e0) { }
lis.forEach(function (x) { try { markCardOrientation(x); } catch (e1) { } });
try { cgActivity(); } catch (e2) { }
}, 250);
}
function evaluateCardImages(li) {
const imgs = Array.from(li.querySelectorAll('img'));
let hasValidImage = false;
let hasPendingImage = false;
imgs.forEach(img => {
if (!img.dataset.sppImageWatch) {
img.dataset.sppImageWatch = '1';
img.addEventListener('load', function () {
delete img.dataset.sppImageLoadFailed;
evaluateCardImages(li);
coverSweepSoon(li);      
});
img.addEventListener('error', function () {
img.dataset.sppImageLoadFailed = '1';
evaluateCardImages(li);
coverSweepSoon(li);      
});
}
const state = getCardImageState(img);
if (state === 'valid') hasValidImage = true;
if (state === 'pending') hasPendingImage = true;
});
if (!hasValidImage && !hasPendingImage) {
convertCardToList(li);
}
}
function cardCoverImg(li) {
const box = li.querySelector('.section-text');
const scopes = box ? [box, li] : [li];
for (let s = 0; s < scopes.length; s++) {
const imgs = Array.from(scopes[s].querySelectorAll('img'));
for (let i = 0; i < imgs.length; i++) {
if (getCardImageState(imgs[i]) === 'valid') return imgs[i];
}
}
return null;
}
function cardHasPendingImg(li) {
const imgs = Array.from(li.querySelectorAll('img'));
for (let i = 0; i < imgs.length; i++) {
if (getCardImageState(imgs[i]) === 'pending') return true;
}
return false;
}
function markCardOrientation(li) {
if (li.classList.contains('spp-tl-list')) {
if (li.classList.contains('spp-card-portrait')) li.classList.remove('spp-card-portrait');
return false;
}
const img = cardCoverImg(li);
if (!img) {
if (!cardHasPendingImg(li)) convertCardToList(li);
return false;
}
const isPortrait = (img.naturalWidth / img.naturalHeight) < 1;
const hasPortrait = li.classList.contains('spp-card-portrait');
if (hasPortrait) li.classList.remove('spp-card-portrait');        
if (isPortrait) li.classList.add('spp-card-portrait');            
return isPortrait;
}
function buildCardMeta(li) {
if (li.dataset.sppMetaDone) return;
const sectionText = li.querySelector('.section-text');
if (!sectionText) return;
const spans = Array.from(sectionText.children).filter(c => c.tagName === 'SPAN');
if (!spans.length) return;
li.dataset.sppMetaDone = '1';
const meta = document.createElement('div');
meta.className = 'spp-card-meta';
spans.forEach(s => meta.appendChild(s));
sectionText.parentNode.insertBefore(meta, sectionText.nextSibling);
if (li.classList.contains('spp-tl-list')) li.classList.add('spp-has-meta');
}
function relativeLuminance(rgb) {
const m = String(rgb).match(/(\d+(?:\.\d+)?)[,\s]+(\d+(?:\.\d+)?)[,\s]+(\d+(?:\.\d+)?)/);
if (!m) return null;
const [r, g, b] = [1, 2, 3].map(i => {
let v = parseFloat(m[i]) / 255;
return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);
});
return 0.2126 * r + 0.7152 * g + 0.0722 * b;
}
const CARD_BG_LUM = relativeLuminance('rgb(19,26,42)');   
const READABLE_MIN = '#9AA5BB';
function ensureReadable(el, minRatio, dry) {
if (!el) return false;
const inlineColor = (el.style && el.style.color) ? String(el.style.color).trim() : '';
const cs = getComputedStyle(el);
let colorStr = cs.color;
const hasTrans = (cs.transitionDuration && cs.transitionDuration !== '0s') ||
(cs.transitionProperty && cs.transitionProperty !== 'none' && cs.transitionProperty !== 'all') ||
(cs.animationName && cs.animationName !== 'none');
if (hasTrans && el.getAnimations) {
el.getAnimations().forEach(anim => {
if (anim.transitionProperty === 'color') anim.cancel();
});
colorStr = getComputedStyle(el).color;                 
}
if (inlineColor && relativeLuminance(inlineColor) === null) return false;
const fg = (inlineColor && relativeLuminance(inlineColor) !== null)
? relativeLuminance(inlineColor)
: relativeLuminance(colorStr);
if (fg === null) return false;
const ratio = (Math.max(fg, CARD_BG_LUM) + 0.05) / (Math.min(fg, CARD_BG_LUM) + 0.05);
if (ratio >= (minRatio || 3)) return false;
if (dry) return true;                                      
el.style.setProperty('color', READABLE_MIN, 'important');
el.dataset.sppContrast = '1';
return true;
}
const CONTRAST_MIN = { title: 3, reply: 3, heat: 3, name: 4.5, date: 3, fav: 3 };
function fixDarkTextContrast(li) {
let fixed = 0;
const bump = (el, min) => { if (ensureReadable(el, min, false)) fixed++; };
contrastTargets(li).forEach(function (t) { bump(t.el, t.min); });
return fixed;
}
function contrastTargets(li) {
const out = [];
const want = (el, min) => { if (el && ensureReadable(el, min, true)) out.push({ el: el, min: min }); };
li.querySelectorAll('.section-title a').forEach(el => want(el, CONTRAST_MIN.title));
li.querySelectorAll('.spp-tl-reply').forEach(el => want(el, CONTRAST_MIN.reply));
li.querySelectorAll('.spp-tl-heat').forEach(el => want(el, CONTRAST_MIN.heat));
li.querySelectorAll('.spp-name-txt').forEach(el => want(el, CONTRAST_MIN.name));
li.querySelectorAll('.spp-date-txt').forEach(el => want(el, CONTRAST_MIN.date));
li.querySelectorAll('.spp-fav-txt').forEach(el => want(el, CONTRAST_MIN.fav));
li.querySelectorAll('.section-title a font[color], .section-title a [style*="color"]')
.forEach(el => want(el, CONTRAST_MIN.title));
return out;
}
function processItems(root) {
coverIssueProbes();
const items = (root || document).querySelectorAll('#wall ul.stream > li:not([data-spp-tl-checked])');
items.forEach(li => {
li.setAttribute('data-spp-tl-checked', '1');
reformatReplyViews(li);
normalizeTitleInlineColor(li);
colorTitleByHeat(li);
restoreFullTitle(li);
buildCardByline(li);
evaluateCardImages(li);
buildCardMeta(li);
decorateFavButton(li);
applyReadChip(li);
});
coverSweep();
const all = Array.prototype.slice.call(document.querySelectorAll('#wall ul.stream > li'));
const plans = all.map(li => contrastTargets(li));
all.forEach((li, i) => li.style.setProperty('--spp-idx', String(i)));
all.forEach(li => markCardOrientation(li));
plans.forEach(function (list) {
list.forEach(function (t) { ensureReadable(t.el, t.min, false); });
});
}
function hashHue(str) {
let h = 7;
const s = String(str || '');
for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0;
return h % 360;
}
function buildCardByline(li) {
if (li.dataset.sppBylineDone) return;
const intro = li.querySelector('.section-intro');
if (!intro) return;
let author = '', authorHref = '', date = '';
const flat = intro.querySelector('.spp-tl-author-line');
if (flat) {
const t = norm(flat.textContent);
const m = t.match(/^(.*?)\s*-\s*发布于\s*(\d{4}-\d{2}-\d{2})/);
if (m) { author = m[1].trim(); date = m[2]; }
else { author = t; }
authorHref = flat.dataset.sppAuthorHref || '';
} else {
Array.from(intro.querySelectorAll('td')).forEach(td => {
const text = norm(td.textContent);
if (/作者/.test(text)) {
const a = td.querySelector('a');
author = a ? a.textContent.trim() : text.replace(/.*作者[::]\s*/, '');
if (a) authorHref = a.getAttribute('href') || '';
} else if (/\d{4}-\d{2}-\d{2}/.test(text)) {
const m = text.match(/(\d{4}-\d{2}-\d{2})/);
if (m) date = m[1];
}
});
}
if (!author && !date) return;
li.dataset.sppBylineDone = '1';
const h1 = hashHue(author || date);
const h2 = (h1 + 58) % 360;
const byline = document.createElement('span');
byline.className = 'spp-byline';
byline.style.setProperty('--spp-h1', String(h1));
byline.style.setProperty('--spp-h2', String(h2));
if (author) {
const name = document.createElement('span');
name.className = 'spp-name';
const txt = authorHref ? document.createElement('a') : document.createElement('span');
txt.className = 'spp-name-txt';
txt.textContent = author;
if (authorHref) {
txt.setAttribute('href', authorHref);
txt.setAttribute('target', '_blank');
}
name.appendChild(txt);
byline.appendChild(name);
}
if (date) {
const d = document.createElement('span');
d.className = 'spp-date';
const dt = document.createElement('span');
dt.className = 'spp-date-txt';
dt.textContent = date;
d.appendChild(dt);
byline.appendChild(d);
}
intro.innerHTML = '';
intro.appendChild(byline);
}
function decorateFavButton(li) {
if (li.dataset.sppFavDone) return;
const meta = li.querySelector('.spp-card-meta');
if (!meta) return;
const a = meta.querySelector('a#favor, a[onclick*="action=favor"]');
if (!a) return;
li.dataset.sppFavDone = '1';
a.classList.add('spp-fav');
a.dataset.sppTid = sppFavTidOf(a, li);
a.textContent = '';
const ico = document.createElement('span');
ico.className = 'spp-fav-ico';
ico.setAttribute('aria-hidden', 'true');
const txt = document.createElement('span');
txt.className = 'spp-fav-txt';
a.appendChild(ico);
a.appendChild(txt);
sppFavPaint(a);
sppFavWatch();
a.style.removeProperty('color');
}
const SPP_FAV_ON_LABEL = { '1': '已在星图', '2': 'BOOKMARKED', '6': '夜阑已录' };
const SPP_FAV_STATE_KEY = 'spp_fav_state';
const SPP_FAV_STATE_TTL = 180000;
const SPP_FAV_DEFAULT_CID = '0';           
const FAV_WIN = (function () {
try { return (typeof unsafeWindow !== 'undefined' && unsafeWindow) ? unsafeWindow : window; }
catch (e) { return window; }
})();
function sppFavUiPick() {
return SPP_CONFIG.pick('spp_fav_ui', SPP_FAV_UI_DEF, SPP_FAV_UI_ALLOWED);
}
function sppFavTidOf(a, li) {
const oc = (a && a.getAttribute) ? String(a.getAttribute('onclick') || '') : '';
const m = oc.match(/tid=(\d+)/);
if (m) return m[1];
const link = (li && li.querySelector) ? li.querySelector('.section-title a[href*="tid-"]') : null;
if (!link) return '';
const m2 = String(link.getAttribute('href') || '').match(/tid-(\d+)/);
return m2 ? m2[1] : '';
}
const sppFavState = {
_set: null,
_cacheAt: 0,
_asked: false,
readCache: function () {
try {
const raw = GM_getValue(SPP_FAV_STATE_KEY, null);
const o = (typeof raw === 'string') ? JSON.parse(raw) : raw;
if (o && typeof o.t === 'number' && o.tids && o.tids.length !== undefined) {
this._cacheAt = o.t;
this._set = new Set(Array.prototype.map.call(o.tids, String));
}
} catch (e) { this._set = null; }
return this._set;
},
flush: function () {
try {
GM_setValue(SPP_FAV_STATE_KEY, JSON.stringify({
t: this._cacheAt,
tids: this._set ? Array.from(this._set) : []
}));
} catch (e) {}
},
has: function (tid) {
return !!(this._set && tid && this._set.has(String(tid)));
},
adopt: function (tids) {
this._set = new Set(Array.prototype.map.call(tids || [], String));
this._cacheAt = Date.now();
this.flush();
sppFavPaintAll();
},
flip: function (tid, on) {
tid = String(tid || '');
if (!tid) return;
if (!this._set) this._set = new Set();
if (on) this._set.add(tid); else this._set.delete(tid);
this._cacheAt = Date.now();
this.flush();
sppFavPaintAll();
},
ensure: function () {
if (this._asked) return;
this._asked = true;
this.readCache();
if (this._set) sppFavPaintAll();
if (this._set && (Date.now() - this._cacheAt) < SPP_FAV_STATE_TTL) return;
const self = this;
sppFavFetchTids().then(function (tids) {
if (tids && tids.length !== undefined) self.adopt(tids);
}).catch(function () {});
}
};
function sppFavFetchTids() {
const acc = [];
const eat = function (html) {
const re = /read\.php\?tid-(\d+)\.html/g;
let m;
while ((m = re.exec(html))) if (acc.indexOf(m[1]) < 0) acc.push(m[1]);
return html;
};
const get = function (u) {
return fetch(u, { credentials: 'include' }).then(function (r) { return r.ok ? r.text() : ''; });
};
return get('u.php?action-favor.html').then(function (html) {
eat(html);
const pages = [];
const re = /(u\.php\?action-favor[^"'#\s]*?page-(\d+)\.html)/g;
let m;
while ((m = re.exec(html))) {
const n = parseInt(m[2], 10);
if (n > 1 && !pages.some(function (p) { return p.n === n; })) pages.push({ n: n, u: m[1] });
}
pages.sort(function (x, y) { return x.n - y.n; });
let seq = Promise.resolve();
pages.slice(0, 4).forEach(function (p) {
seq = seq.then(function () { return get(p.u).then(eat); });
});
return seq.then(function () { return acc; });
});
}
function sppFavPaint(a) {
if (!a || !a.classList || !a.dataset) return;
const tid = a.dataset.sppTid || '';
const on = !!(tid && sppFavState.has(tid));
const painted = a.classList.contains('spp-fav-on');
if (on && !painted) a.classList.add('spp-fav-on');
else if (!on && painted) a.classList.remove('spp-fav-on');
const id = sppFavUiPick();
const label = on
? (SPP_FAV_ON_LABEL[id] || '已收藏')
: (SPP_FAV_UI_LABEL[id] || '收藏');
const txt = a.querySelector('.spp-fav-txt');
if (txt && txt.textContent !== label) txt.textContent = label;
const pressed = on ? 'true' : 'false';
if (a.getAttribute('aria-pressed') !== pressed) a.setAttribute('aria-pressed', pressed);
}
function sppFavPaintAll() {
const list = document.querySelectorAll('#wall ul.stream a.spp-fav');
Array.prototype.forEach.call(list, sppFavPaint);
}
let sppFavTipTimer = 0;
function sppFavTip(text) {
const s = String(text || '');
const W = FAV_WIN;
try {
if (W && W.ajax && W.ajax.request && W.ajax.request.responseText !== undefined
&& typeof W.ajax.guide === 'function') {
W.ajax.request.responseText = s;
W.ajax.guide();
return;
}
} catch (e) {}
let box = document.getElementById('ajax_guide');
if (!box) {
box = document.createElement('div');
box.id = 'ajax_guide';
document.body.appendChild(box);
}
box.textContent = s;
box.style.display = '';
if (sppFavTipTimer) clearTimeout(sppFavTipTimer);
sppFavTipTimer = setTimeout(function () { box.style.display = 'none'; }, 3000);
}
function sppFavSiteSend(tid, cid, cb) {
const W = FAV_WIN;
if (!W || !W.ajax || typeof W.ajax.send !== 'function') return false;
try {
W.ajax.send('pw_ajax.php?action=favor&tid=' + encodeURIComponent(tid) + '&type=' + encodeURIComponent(cid),
'', function () {
let t = '';
try { t = String((W.ajax.request && W.ajax.request.responseText) || ''); } catch (e) {}
cb(t);
});
return true;
} catch (e) { return false; }
}
function sppFavPlain(url) {
let u = url + '&nowtime=' + Date.now();
try { if (FAV_WIN.verifyhash) u += '&verify=' + encodeURIComponent(FAV_WIN.verifyhash); } catch (e) {}
return fetch(u, { credentials: 'include' }).then(function (r) { return r.ok ? r.text() : ''; });
}
function sppFavFavorite(tid, cid) {
const after = function (text) {
const t = String(text || '');
if (t.indexOf('成功') >= 0) {
sppFavState.flip(tid, true);
sppFavTip('帖子收藏成功!(Shift+点击可选分类)');
} else if (t.indexOf('已经收藏') >= 0) {
sppFavState.flip(tid, true);
sppFavTip('您已经收藏了该主题');
} else {
sppFavTip('收藏没有成功,请再试一次');
}
};
if (sppFavSiteSend(tid, cid, after)) return;
sppFavPlain('pw_ajax.php?action=favor&tid=' + encodeURIComponent(tid) + '&type=' + encodeURIComponent(cid))
.then(after).catch(function () { sppFavTip('收藏没有成功,请再试一次'); });
}
function sppFavUnfavorite(tid) {
let body = 'job=clear&selid%5B%5D=' + encodeURIComponent(tid);
try { if (FAV_WIN.verifyhash) body += '&verify=' + encodeURIComponent(FAV_WIN.verifyhash); } catch (e) {}
fetch('u.php?action=favor&', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: body
}).then(function (r) {
if (!r.ok) throw new Error('http ' + r.status);
return sppFavFetchTids().then(function (tids) {
if (tids && tids.indexOf(String(tid)) < 0) {
sppFavState.adopt(tids);
sppFavTip('已取消收藏(再点一次可重新收藏)');
} else {
sppFavTip('取消收藏没有成功,请再试一次');
}
});
}).catch(function () { sppFavTip('取消收藏没有成功,请再试一次'); });
}
let sppFavPopupAnchor = null;
let sppFavFavorPatched = false;
function sppFavInstallFavor(anchor) {
const W = FAV_WIN;
if (!W) return;
if (anchor) sppFavPopupAnchor = anchor;
if (typeof W.favor === 'function') return;      
if (sppFavFavorPatched) return;
try {
W.favor = function (cid) {
const obj = sppFavPopupAnchor || (W.read && W.read.obj) || null;
const oc = (obj && obj.getAttribute) ? String(obj.getAttribute('onclick') || '') : '';
const m = oc.match(/tid=(\d+)/);
try { if (typeof W.closep === 'function') W.closep(); } catch (e) {}
if (m) sppFavFavorite(m[1], String(cid));
return false;
};
sppFavFavorPatched = true;
} catch (e) {}
}
function sppFavOpenPopup(a, tid) {
const W = FAV_WIN;
sppFavInstallFavor(a);
const R = W && W.read;
if (!R || typeof R.guide !== 'function' || !W.ajax || typeof W.ajax.send !== 'function') {
sppFavFavorite(tid, SPP_FAV_DEFAULT_CID);
return;
}
try { R.obj = a; R.guide(); }
catch (e) { sppFavFavorite(tid, SPP_FAV_DEFAULT_CID); return; }
setTimeout(function () {
try { W.ajax.send('pw_ajax.php?action=favor&tid=' + encodeURIComponent(tid), '', W.ajax.get); }
catch (e) {}
}, 300);
}
function sppFavClickGuard(e) {
const t = e.target;
const a = (t && t.closest) ? t.closest('a.spp-fav') : null;
if (!a) return;
const tid = (a.dataset && a.dataset.sppTid) || '';
if (!tid) return;
if (e.button !== 0 && e.button !== undefined) return;
e.preventDefault();
e.stopPropagation();
if (e.shiftKey || e.altKey) { sppFavOpenPopup(a, tid); return; }
if (sppFavState.has(tid)) sppFavUnfavorite(tid);
else sppFavFavorite(tid, SPP_FAV_DEFAULT_CID);
}
function sppFavBindOnce() {
const root = document.documentElement;
if (!root || root.dataset.sppFavBound === '1') return;
root.dataset.sppFavBound = '1';
document.addEventListener('click', sppFavClickGuard, true);
}
function sppFavWatch() {
sppFavBindOnce();
sppFavState.ensure();
}
function groupCards() {
const ul = document.querySelector('#wall ul.stream');
if (!ul) return 0;
const lis = Array.from(ul.children).filter(c => c.tagName === 'LI');
if (lis.length < 2) return 0;
const rankOf = li =>
li.classList.contains('spp-tl-list') ? 2          
: li.classList.contains('spp-card-portrait') ? 1  
: 0;
const countOf = (li, cls) => {
const el = li.querySelector('.' + cls);
if (!el) return 0;
const n = parseInt(String(el.textContent).replace(/[^\d]/g, ''), 10);
return isNaN(n) ? 0 : n;
};
const heatOf = li => countOf(li, 'spp-tl-heat');
const replyOf = li => countOf(li, 'spp-tl-reply');
const want = lis.slice().sort((a, b) => {
const dRank = rankOf(a) - rankOf(b);
if (dRank) return dRank;
const dHeat = heatOf(b) - heatOf(a);
if (dHeat) return dHeat;
const dReply = replyOf(b) - replyOf(a);
if (dReply) return dReply;
return (Number(a.dataset.sppPageIdx) || 0) - (Number(b.dataset.sppPageIdx) || 0);
});
const firstOf = {};
want.forEach(li => {
const r = rankOf(li);
if (firstOf[r] === undefined) firstOf[r] = li;
});
want.forEach((li, i) => {
const r = rankOf(li);
const shouldStart = (firstOf[r] === li);
const hasStart = li.classList.contains('spp-row-start');
if (shouldStart && !hasStart) li.classList.add('spp-row-start');
else if (!shouldStart && hasStart) li.classList.remove('spp-row-start');
});
let same = true;
for (let i = 0; i < lis.length; i++) {
if (lis[i] !== want[i]) { same = false; break; }
}
if (same) return 0;
const frag = document.createDocumentFragment();
want.forEach(li => frag.appendChild(li));
ul.appendChild(frag);
return want.filter(li => !li.classList.contains('spp-tl-list')).length;
}
function startTL() {
let timer = 0;
let selfWrites = false;                                  
processItems();
const run = () => {
selfWrites = true;
try { processItems(); groupCards(); cgSyncHeadsNow(); initCardClick(); }
finally {
setTimeout(function () {                         
selfWrites = false;
if (document.querySelector('#wall ul.stream > li:not([data-spp-tl-checked])')) {
clearTimeout(timer);
timer = setTimeout(run, 150);
}
}, 0);
}
};
const obs = new MutationObserver(() => {
if (selfWrites) return;                               
clearTimeout(timer);
timer = setTimeout(run, 150);
});
const deadline = performance.now() + 2000;
const tryObserve = () => {
const wall = document.getElementById('wall');
if (wall) {
obs.observe(wall, { childList: true, subtree: true });   
run();
return;                                           
}
if (performance.now() >= deadline) return;
requestAnimationFrame(tryObserve);
};
tryObserve();
}
function initCardClick() {
const wall = document.getElementById('wall');
if (!wall) return 0;
const lis = wall.querySelectorAll('ul.stream > li');
let n = 0;
lis.forEach(li => {
if (li.dataset.sppClickDone) return;
const titleLink = li.querySelector('.section-title a');
if (!titleLink) return;
const href = titleLink.getAttribute('href');
if (!href) return;
li.dataset.sppClickDone = '1';
li.classList.add('spp-card-clickable');
titleLink.setAttribute('target', '_blank');
titleLink.setAttribute('rel', 'noopener');
const hit = document.createElement('a');
hit.className = 'spp-card-hit';
hit.href = href;
hit.target = '_blank';
hit.rel = 'noopener';
hit.setAttribute('aria-hidden', 'true');
hit.tabIndex = -1;
hit.addEventListener('click', e => {
const t = e.target;
if (t === hit) return;
if (t.closest && t.closest('a,button,input,textarea,select,label')) {
e.preventDefault();
e.stopPropagation();
}
}, true);
li.appendChild(hit);
n++;
});
return n;
}
onDomReady(startTL);
}
function initCardWordBlock() {
if (!PAGE.board) return;
const CHAT_FID = 9;
const KEY_CHAT = 'spp_card_words_chat';
const KEY_ASK = 'spp_card_words_ask';
const KEY_OTHER = 'spp_card_words_other';
const GATE = 'spp-ckw-on';
const HIT = 'spp-card-kw';
const START = 'spp-ckw-start';
const DONE = 'sppCkwDone';
function parseWords(raw) {
const out = [];
String(raw == null ? '' : raw).split(/[\r\n]+/).forEach(function (line) {
const s = line.trim().replace(/\s+/g, '');
if (!s || s.charAt(0) === '#') return;
out.push(s.toLowerCase());
});
return out;
}
const isChat = sppFidNum() === CHAT_FID;
const KEY = isChat ? KEY_CHAT : (isAskFid() ? KEY_ASK : KEY_OTHER);
const words = parseWords(SPP_CONFIG.text(KEY, ''));
if (!document.getElementById('spp-ckw-style')) {
const st = document.createElement('style');
st.id = 'spp-ckw-style';
st.textContent = '/* SPP-CARD-WORDS-BEGIN */\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + HIT + ' { display:none !important; }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + START + ':not(.spp-card-portrait) { grid-column:1 / span 4 !important; }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + START + '.spp-card-portrait { grid-column:1 / span 3 !important; }\n' +
'@media (max-width:1000px) { html.' + GATE + ' #main #wall ul.stream > li.' + START + '.spp-card-portrait { grid-column:1 / span 4 !important; } }\n' +
'@media (max-width:640px) { html.' + GATE + ' #main #wall ul.stream > li.' + START + '.spp-card-portrait { grid-column:1 / span 4 !important; } }\n' +
'/* SPP-CARD-WORDS-END */';
appendToHeadSafe(st);
}
if (!words.length) return;
document.documentElement.classList.add(GATE);
function titleOf(li) {
const el = li.querySelector('.section-title');
return el ? (el.textContent || '').replace(/\s+/g, '').toLowerCase() : '';
}
function rankOf(li) {
return li.classList.contains('spp-tl-list') ? 2
: li.classList.contains('spp-card-portrait') ? 1 : 0;
}
function markCards(ul) {
Array.from(ul.children).forEach(function (li) {
if (li.tagName !== 'LI' || li.dataset[DONE]) return;
li.dataset[DONE] = '1';
const t = titleOf(li);
if (!t) return;
for (let i = 0; i < words.length; i++) {
if (t.indexOf(words[i]) >= 0) { li.classList.add(HIT); return; }
}
});
}
function restampStarts(ul) {
const seen = {};
Array.from(ul.children).forEach(function (li) {
if (li.tagName !== 'LI') return;
const r = rankOf(li);
const hidden = li.classList.contains(HIT);
const should = (!hidden && !seen[r]);
if (should) seen[r] = 1;
const has = li.classList.contains(START);
if (should && !has) li.classList.add(START);
else if (!should && has) li.classList.remove(START);
});
}
function wallUl() {
return document.querySelector('#main #wall ul.stream') || document.querySelector('#wall ul.stream');
}
function sweep() {
const ul = wallUl();
if (!ul) return;
markCards(ul);
restampStarts(ul);
}
onDomReady(function () { sweep(); setTimeout(sweep, 600); });
onDomReady(function () {
const ul = wallUl();
if (!ul) return;
new MutationObserver(function () { sweep(); }).observe(ul, { childList: true });
});
}
const READ_LOG_KEY = 'spp_read_log';
const READ_MIRROR_KEY = 'spp_read_mirror';
const READ_LOG_CAP = 20000;
const READ_DWELL_DEF = 5;
const READ_DWELL_MAX = 600;
const READ_PURGE_UNITS = ['hour', 'day'];
const READ_PURGE_UNIT_MS = { hour: 3600000, day: 86400000 };
function readMirrorRaw() {
try { return String(localStorage.getItem(READ_MIRROR_KEY) || ''); } catch (e) { return ''; }
}
function writeMirrorRaw(s) {
try { localStorage.setItem(READ_MIRROR_KEY, s); } catch (e) { }
}
const readLog = {
_map: null,
_dirty: false,
_timer: 0,
_raw: null,
load() {
if (this._map) return this._map;
let map = {};
let raw = readMirrorRaw();
try {
if (!raw) raw = GM_getValue(READ_LOG_KEY, null);
if (raw) {
const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;
if (parsed && typeof parsed === 'object') map = parsed;
}
} catch (_) { map = {}; }
const clean = {};
Object.keys(map).forEach(k => {
const t = Number(map[k]);
if (/^\d+$/.test(k) && isFinite(t) && t > 0) clean[k] = t;
});
this._map = clean;
this._raw = (raw == null) ? '' : (typeof raw === 'string' ? raw : JSON.stringify(raw));
return clean;
},
reload() {
this.flush();
let raw = readMirrorRaw();
try { if (!raw) raw = GM_getValue(READ_LOG_KEY, null); } catch (_) { }
const s = (raw == null) ? '' : (typeof raw === 'string' ? raw : JSON.stringify(raw));
if (s === this._raw) return this._map || {};
this._raw = s;
this._map = null;
return this.load();
},
has(tid) { return !!this.load()[String(tid)]; },
count() { return Object.keys(this.load()).length; },
mark(tid) {
const k = String(tid || '');
if (!/^\d+$/.test(k)) return false;
const m = this.load();
if (m[k]) return false;
m[k] = Date.now();
const keys = Object.keys(m);
if (keys.length > READ_LOG_CAP) {
keys.sort((a, b) => m[a] - m[b]);
keys.slice(0, keys.length - READ_LOG_CAP).forEach(x => { delete m[x]; });
}
this.later();
return true;
},
purgeBefore(amount, unit) {
const span = (READ_PURGE_UNIT_MS[unit] || READ_PURGE_UNIT_MS.hour) * (Number(amount) || 0);
if (span <= 0) return 0;
const cut = Date.now() - span;
const m = this.load();
let n = 0;
Object.keys(m).forEach(k => { if (m[k] < cut) { delete m[k]; n++; } });
if (n) this.later();
return n;
},
clearAll() {
const m = this.load();
const n = Object.keys(m).length;
if (!n) return 0;
Object.keys(m).forEach(k => { delete m[k]; });
this.later();
return n;
},
later() {
this._dirty = true;
if (this._timer) return;
this._timer = setTimeout(() => { this._timer = 0; this.flush(); }, 1200);
},
flush() {
if (!this._dirty || !this._map) return;
let s = '';
try { s = JSON.stringify(this._map); } catch (_) { return; }
try { GM_setValue(READ_LOG_KEY, s); } catch (_) { }
writeMirrorRaw(s);
this._raw = s;
this._dirty = false;
}
};
function readPageFid() {
const m = location.href.match(/fid[-=](\d+)/);
if (m) return m[1];
let fid = '';
document.querySelectorAll('#breadcrumbs a[href*="thread.php?fid"]').forEach(a => {
const mm = String(a.getAttribute('href') || '').match(/fid[-=](\d+)/);
if (mm) fid = mm[1];
});
return fid;
}
function readIsListPage() {
return /thread(_new)?\.php/.test(location.pathname) && /fid[-=]\d+/.test(location.href);
}
function readTidFromUrl() {
if (!/read\.php/i.test(location.pathname)) return '';
const m = location.href.match(/[?&]tid[-=](\d+)/);
return m ? m[1] : '';
}
const READ_ZONES = {
tea: ['9'],
ask: ['48'],
res: ['13', '14', '128', '4', '73', '5', '109', '6', '201', '221', '222',
'170', '171', '172', '173', '174'],
chat: ['8', '12', '17', '195', '208', '83']    
};
const HEAT_ZONES = {
tea: ['9', '188'],
ask: ['48'],
chat: ['8', '12', '17', '195', '208', '83'],
free: ['13'],
money: ['170', '171', '172', '173', '174'],
comic: ['4', '5', '6', '14', '16', '20', '36', '43', '44', '45', '46', '47',
'73', '109', '128', '201', '221', '222',
'102', '103', '104', '105', '106', '216', '217', '219', '220',
'223', '224', '225', '226', '227', '228', '229', '230', '231',
'107', '136',
'30', '38', '42', '53', '54', '55', '56', '59', '62', '63', '67', '68',
'78', '79', '85', '89', '92', '97', '98', '111', '116', '118', '129', '130',
'137', '143', '144', '145', '152', '153', '158', '159', '164', '165',
'176', '177', '182', '183', '189', '190', '196', '197', '202', '203',
'205', '206', '209', '210', '212', '213', '215', '218']
};
function heatZoneOf(fid) {
const f = String(fid || '');
if (!f || f === '0') return 'other';
for (const z in HEAT_ZONES) {
if (HEAT_ZONES[z].indexOf(f) >= 0) return z;
}
return 'other';
}
function heatKeysForPage() {
try {
const fid = String(readPageFid() || sppFidNum() || '');
const z = heatZoneOf(fid);
let styleKey = HEAT_STYLE_KEY;
let scopeKey = HEAT_SCOPE_KEY;
if (fid && GM_getValue('spp_heat_style_b' + fid, null)) styleKey = 'spp_heat_style_b' + fid;
if (fid && GM_getValue('spp_heat_scope_b' + fid, null)) scopeKey = 'spp_heat_scope_b' + fid;
if (styleKey === HEAT_STYLE_KEY && GM_getValue('spp_heat_style_' + z, null)) styleKey = 'spp_heat_style_' + z;
if (scopeKey === HEAT_SCOPE_KEY && GM_getValue('spp_heat_scope_' + z, null)) scopeKey = 'spp_heat_scope_' + z;
return { style: styleKey, scope: scopeKey };
} catch (e) {  }
return { style: HEAT_STYLE_KEY, scope: HEAT_SCOPE_KEY };
}
function readZoneOf(fid) {
const f = String(fid || '');
if (!f || f === '0') return 'other';
for (const z in READ_ZONES) {
if (READ_ZONES[z].indexOf(f) >= 0) return z;
}
return 'other';
}
function readZoneOn(z) {
try {
if (z === 'tea') return SPP_CONFIG.bool('spp_read_zone_tea', true);
if (z === 'ask') return SPP_CONFIG.bool('spp_read_zone_ask', true);
if (z === 'res') return SPP_CONFIG.bool('spp_read_zone_res', true);
if (z === 'chat') return SPP_CONFIG.bool('spp_read_zone_chat', true);
return SPP_CONFIG.bool('spp_read_zone_other', true);
} catch (e) { return true; }
}
function readScopeOn() {
if (!SPP_CONFIG.bool('spp_read_mark', true)) return false;
return readZoneOn(readZoneOf(readPageFid() || sppFidNum()));
}
let READ_SCOPE = null;
let READ_META_WARNED = false;                 
function readScope() {
if (READ_SCOPE === null) READ_SCOPE = readScopeOn();
return READ_SCOPE;
}
function readTidOfCard(li) {
const a = li.querySelector('.section-title a') || li.querySelector('a[href*="tid"]');
const m = a ? String(a.getAttribute('href') || '').match(/tid[-=](\d+)/) : null;
return m ? m[1] : '';
}
function applyReadChip(li) {
if (!readIsListPage() || !readScope()) return 0;
const tid = readTidOfCard(li);
if (!tid) return 0;
const meta = li.querySelector('.spp-card-meta') || li.querySelector('[class*="spp-card-meta"]');
if (!meta) {
if (!READ_META_WARNED) {
READ_META_WARNED = true;
console.warn('[SPP] 已读徽章:卡片里找不到 .spp-card-meta(同族类名也没命中)⇒ 这一页的已读徽章挂不上去,' +
'本页只提示这一次;请核对卡片骨架的类名', li);
}
return 0;
}
const chip = meta.querySelector('.spp-read-chip');
if (!readLog.has(tid)) {
if (chip) chip.remove();
li.classList.remove('spp-st-hasread');   
return 0;
}
if (chip) { li.classList.add('spp-st-hasread'); return 1; }
const el = document.createElement('span');
el.className = 'spp-read-chip';
el.textContent = '已读';
const fav = meta.querySelector('a.spp-fav') || meta.querySelector('a#favor, a[onclick*="action=favor"]');
if (fav && fav.parentNode) fav.parentNode.insertBefore(el, fav.nextSibling);
else meta.appendChild(el);
li.classList.add('spp-st-hasread');          
return 1;
}
function refreshReadChips() {
document.querySelectorAll('#wall ul.stream > li').forEach(applyReadChip);
}
function syncReadMarks() {
if (!readIsListPage() || !readScope()) return 0;
readLog.reload();
refreshReadChips();
document.querySelectorAll('#wall ul.stream > li[data-spp-ruisvg]').forEach(function (li) {
if (li.querySelector('.spp-read-chip')) return;
li.removeAttribute('data-spp-ruisvg');
Array.prototype.forEach.call(li.querySelectorAll('.spp-rui-svg'), function (n) {
if (n.parentNode) n.parentNode.removeChild(n);
});
});
try { if (typeof window.__sppRuiSweep === 'function') window.__sppRuiSweep(); } catch (e) { }
return 1;
}
window.__sppReadSync = syncReadMarks;
let readSyncT = null;
function readSyncSoon(delay) {
if (readSyncT) clearTimeout(readSyncT);
readSyncT = setTimeout(function () { readSyncT = null; syncReadMarks(); }, delay || 60);
}
window.addEventListener('pageshow', function () { readSyncSoon(0); });
window.addEventListener('focus', function () { readSyncSoon(300); });
document.addEventListener('visibilitychange', function () {
if (document.visibilityState === 'visible') readSyncSoon(60);
});
window.addEventListener('storage', function (e) {
if (e && e.key === READ_MIRROR_KEY) readSyncSoon(0);
});
function readPurgeNow(amount, unit) {
const removed = readLog.purgeBefore(amount, unit);
readLog.flush();
refreshReadChips();
return { removed: removed, left: readLog.count() };
}
function readWipeNow() {
const removed = readLog.clearAll();
readLog.flush();
refreshReadChips();
return { removed: removed, left: readLog.count() };
}
function initReadDwell() {
const tid = readTidFromUrl();
if (!tid || !SPP_CONFIG.bool('spp_read_mark', true)) return 0;
if (readLog.has(tid)) return 0;
const need = SPP_CONFIG.num('spp_read_dwell', READ_DWELL_DEF, 0, READ_DWELL_MAX) * 1000;
let acc = 0;
let last = Date.now();
let timer = 0;
function tick() {
const now = Date.now();
if (document.visibilityState === 'visible') acc += now - last;
last = now;
if (acc < need) return;
readLog.mark(tid);
stop();
}
function stop() {
if (timer) { clearInterval(timer); timer = 0; }
document.removeEventListener('visibilitychange', tick);
readLog.flush();
}
timer = setInterval(tick, 500);
document.addEventListener('visibilitychange', tick);
window.addEventListener('pagehide', function () { tick(); readLog.flush(); });
tick();
return 1;
}
onDomReady(initReadDwell);
function initHideBottom() {
const KEY = 'spp_hide_bottom';
let hidden = SPP_CONFIG.bool(KEY, true);
const STYLE_ID = 'spp-hide-bottom-style';
function apply() {
let el = document.getElementById(STYLE_ID);
if (hidden) {
if (!el) {
el = document.createElement('style');
el.id = STYLE_ID;
el.textContent = '.t5.t_one, .rinsp-quick-action-overlay, #footer { display: none !important; }';
appendToHeadSafe(el);
}
} else {
if (el) el.remove();
}
}
apply();
}
function initHideForumRel() {
const KEY = 'spp_hide_forumrel';
let hidden = SPP_CONFIG.bool(KEY, true);
const STYLE_ID = 'spp-hide-forumrel-style';
const CLS = 'spp-fr-hidden';
function mark(on) {
const cate = document.getElementById('cate_info');
if (!cate) return;
const block = cate.closest('div.t');
if (!block) return;
if (on) block.classList.add(CLS);
else block.classList.remove(CLS);
}
function apply() {
let el = document.getElementById(STYLE_ID);
if (hidden) {
if (!el) {
el = document.createElement('style');
el.id = STYLE_ID;
el.textContent =
'div.t:has(#cate_info) { display: none !important; }\n' +
'div.t.' + CLS + ' { display: none !important; }';
appendToHeadSafe(el);
}
} else {
if (el) el.remove();
}
mark(hidden);
}
apply();
onDomReady(function () { mark(hidden); });
setTimeout(function () { mark(hidden); }, 1500);
setTimeout(function () { mark(hidden); }, 2200);
}
function initHideTopTool() {
const KEY = 'spp_hide_toptool';
let hidden = SPP_CONFIG.bool(KEY, true);
const STYLE_ID = 'spp-hide-toptool-style';
function apply() {
let el = document.getElementById(STYLE_ID);
if (hidden) {
if (!el) {
el = document.createElement('style');
el.id = STYLE_ID;
el.textContent = '#toptool { display: none !important; }';
appendToHeadSafe(el);
}
} else {
if (el) el.remove();
}
}
apply();
}
function initTopbarAxis() {
const STYLE_ID = 'spp-topbar-axis-style';
if (document.getElementById(STYLE_ID)) return;
const el = document.createElement('style');
el.id = STYLE_ID;
el.textContent =
'#mainNav #user-login { padding-left: 10px !important; }\n' +
'#mainNav #one-key { display: none !important; }\n' +
'#header > #mainNav { height: 36px !important; margin-bottom: 6px !important; }\n' +
'#mainNav ul.guide { margin-top: 4px !important; }\n' +
'#mainNav > div:first-child { bottom: 4px !important; }\n';
appendToHeadSafe(el);
}
function initTopBoxToggle() {
const KEY = 'spp_topkey_remember';
const STATE_KEY = 'spp_topkey_collapsed';
const STYLE_ID = 'spp-topkey-style';
const BTN_ID = 'spp-topkey-btn';
const ICO = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" ' +
'stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" class="spp-topkey-ico">' +
'<path d="M18 15l-6-6-6 6"></path></svg>';
const remember = SPP_CONFIG.bool(KEY, false);
function styleOnce() {
if (document.getElementById(STYLE_ID)) return;
const el = document.createElement('style');
el.id = STYLE_ID;
el.textContent =
'/* 收起态把箭头翻半圈。\n' +
'   ★ 选择器 = 8 模块那条 a.spp-hud-ic > svg(3 个 id + 1 个类)再加一个类,\n' +
'     靠优先级压过它,不靠书写顺序(本项目在「同权重靠书写顺序决胜」上栽过两次)。 */\n' +
'#header > #mainNav #user-login > a.spp-hud-ic > svg.spp-topkey-ico {\n' +
'    transition: transform .3s cubic-bezier(.4,0,.2,1) !important;\n' +
'}\n' +
'#header > #mainNav #user-login > a.spp-hud-ic.spp-topkey--c > svg.spp-topkey-ico {\n' +
'    transform: rotate(180deg) !important;\n' +
'}\n' +
'@media (prefers-reduced-motion: reduce) {\n' +
'    #header > #mainNav #user-login > a.spp-hud-ic > svg.spp-topkey-ico { transition: none !important; }\n' +
'}\n';
appendToHeadSafe(el);
}
function isCollapsed() {
const ib = document.getElementById('infobox');
if (ib && ib.style.display === 'none') return true;
const key = document.getElementById('one-key');
return !!(key && key.classList.contains('one-show'));
}
function flip(persist) {
const ib = document.getElementById('infobox');
const key = document.getElementById('one-key');
if (!ib) return;
if (key && typeof window.showInfoBox === 'function') { window.showInfoBox(); }
else {
const wasDown = isCollapsed();
ib.style.display = wasDown ? '' : 'none';
if (key) key.className = wasDown ? 'one-hidden' : 'one-show';
}
if (persist && remember) {
try { GM_setValue(STATE_KEY, isCollapsed()); } catch (e) {  }
}
}
function sync() {
const btn = document.getElementById(BTN_ID);
if (!btn) return;
const down = isCollapsed();
btn.classList.toggle('spp-topkey--c', down);
const label = down ? '展开顶部信息板' : '收起顶部信息板';
btn.setAttribute('title', label);
btn.setAttribute('aria-label', label);
btn.setAttribute('aria-expanded', down ? 'false' : 'true');
}
function apply() {
const ib = document.getElementById('infobox');
const ul = document.getElementById('user-login');
if (!ib || !ul) return false;
styleOnce();
const wantDown = !!remember;
if (wantDown !== isCollapsed()) {
flip(false);
setTimeout(sync, 60);
}
let btn = document.getElementById(BTN_ID);
if (!btn) {
btn = document.createElement('a');
btn.id = BTN_ID;
btn.className = 'spp-hud-ic';
btn.href = 'javascript:void(0)';
btn.setAttribute('role', 'button');
btn.innerHTML = ICO;
btn.addEventListener('click', function (e) {
e.preventDefault();
flip(true);
sync();
});
const mail = ul.querySelector('#td_msg');
if (mail) ul.insertBefore(btn, mail); else ul.appendChild(btn);
}
sync();
return true;
}
let tries = 0;
(function boot() {
if (apply() || tries++ >= 20) return;
setTimeout(boot, 120);
})();
}
function initNavSimplify() {
const KEY = 'spp_nav_search_first';
let on = SPP_CONFIG.bool(KEY, true);
const STYLE_ID = 'spp-navsimplify-style';
function apply() {
let el = document.getElementById(STYLE_ID);
if (on) {
if (!el) {
el = document.createElement('style');
el.id = STYLE_ID;
el.textContent =
'#mainNav ul.guide > li#h_index { display: none !important; }\n' +
'#mainNav ul.guide > li#h_search > a,\n' +
'#mainNav ul.guide > li#h_search > a:hover {\n' +
'    background: linear-gradient(180deg,#37837a,#2f6f68) !important;\n' +
'    background-image: linear-gradient(180deg,#37837a,#2f6f68) !important;\n' +
'    color: #fff !important;\n' +
'    font-weight: 700 !important;\n' +
'    border-radius: 999px !important;\n' +
'    box-shadow: 0 2px 10px -2px rgba(32,201,151,.5), inset 0 1px 0 rgba(255,255,255,.16) !important;\n' +
'}';
appendToHeadSafe(el);
}
} else {
if (el) el.remove();
}
}
apply();
}
function initHeaderBits() {
const SVG_NS = 'http://www.w3.org/2000/svg';
const ICON = '<rect x="0.75" y="1" width="14.5" height="10" rx="1.7"/>' +
'<path d="M1.5 2.2 L8 6.7 L14.5 2.2"/>';
function blankLinks() {
const want = { '搜索': 1, '社区论坛任务': 1 };
let matched = 0;
[].slice.call(document.querySelectorAll('#mainNav a, ul.guide a')).forEach(a => {
const t = (a.textContent || '').replace(/\s+/g, '');
if (!want[t]) return;
matched++;
if (a.getAttribute('target') === '_blank' &&
a.getAttribute('rel') === 'noopener noreferrer') return;
a.setAttribute('target', '_blank');
a.setAttribute('rel', 'noopener noreferrer');
});
return matched;
}
function makeSvg() {
const svg = document.createElementNS(SVG_NS, 'svg');
svg.setAttribute('viewBox', '0 0 16 12');
svg.setAttribute('width', '16');
svg.setAttribute('height', '12');
svg.setAttribute('fill', 'none');
svg.setAttribute('stroke', '#fff');
svg.setAttribute('stroke-width', '1.2');
svg.setAttribute('stroke-linecap', 'round');
svg.setAttribute('stroke-linejoin', 'round');
svg.setAttribute('class', 'spp-mail-ic');
svg.setAttribute('aria-hidden', 'true');
svg.style.cssText = 'position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);pointer-events:none;';
svg.innerHTML = ICON;
return svg;
}
function mailIcon() {
const a = document.getElementById('td_msg');
if (!a) return false;
const img = a.querySelector('img');
if (img) img.style.setProperty('visibility', 'hidden', 'important');
a.style.setProperty('position', 'relative', 'important');
let svg = a.querySelector('svg.spp-mail-ic');
if (!svg) { svg = makeSvg(); a.appendChild(svg); }
if (!a.__sppMailWatch) {
a.__sppMailWatch = new MutationObserver(() => { mailIcon(); });
a.__sppMailWatch.observe(a, { childList: true, subtree: true, attributes: true, attributeFilter: ['src'] });
}
return true;
}
let tries = 0;
(function boot() {
const icon = mailIcon();
const n = blankLinks();
if ((icon && n >= 2) || tries++ >= 40) return;
setTimeout(boot, 300);
})();
}
function initTopbarHud() {
const STYLE_ID = 'spp-topbar-hud-style';
const ICON_NS = 'http://www.w3.org/2000/svg';
const HUD_CSS =
'/* ==================== 顶栏「全息控制中枢」(2.57.37)====================\n' +
'   参考文件:gemini参考/顶部UI-holographic_cyber_control_bar.html\n' +
'   作用访问:全域(任何页面的页眉都有 #mainNav,本段不带任何主题前缀)。\n' +
'\n' +
'   ★ 前缀 #header > #mainNav(2 个 id)是本段的权重底座:稳定压过主题里那条\n' +
'     html.spp-hm-star #mainNav(1,1,1)与 initNavSimplify 里那条\n' +
'     #mainNav ul.guide > li#h_search > a(2,1,2),不靠书写顺序\n' +
'     (本项目在「同权重靠书写顺序决胜」上栽过两次:2.48.0、2.57.28)。\n' +
'   ★ 一律不改盒模型:分隔线 / 描边全走 inset 阴影,不写 border\n' +
'     (写 border 会把条里的行盒整体推 1~2px)。\n' +
'   ★ 宽度不动:条宽 1400、左右外边距、条高 36 全部沿用 2.57.25 / 2.57.26 的定案。 */\n' +
'\n' +
'/* ① 条体:顶部一道极细内发光 + 底部霓虹能量线(不改 box-shadow,主题那条深空投影原样保留) */\n' +
'#header > #mainNav::before {\n' +
'    content: "";\n' +
'    position: absolute;\n' +
'    top: 0; left: 0; right: 0; height: 1px;\n' +
'    background: linear-gradient(90deg, transparent, rgba(255,255,255,0.10), transparent);\n' +
'    pointer-events: none;\n' +
'    z-index: 3;\n' +
'}\n' +
'#header > #mainNav::after {\n' +
'    content: "";\n' +
'    position: absolute;\n' +
'    left: 0; right: 0; bottom: 0; height: 1px;\n' +
'    background: linear-gradient(90deg,\n' +
'        transparent 0%, rgba(0,243,255,0.45) 14%, rgba(0,243,255,0.85) 50%,\n' +
'        rgba(0,243,255,0.45) 86%, transparent 100%);\n' +
'    box-shadow: 0 0 12px rgba(0,243,255,0.45);\n' +
'    pointer-events: none;\n' +
'    z-index: 3;\n' +
'}\n' +
'\n' +
'/* ② 左侧身份区:一行 flex 排布(原先是 inline 文本流 + 站点给的外边距) */\n' +
'#header > #mainNav #user-login {\n' +
'    display: flex !important;\n' +
'    align-items: center !important;\n' +
'    gap: 9px !important;\n' +
'    /* 站点给这块留了上下内衬(实测块高 29 = 24 的图标按钮 + 5 的内衬)⇒ 块中心会掉到\n' +
'       15.5,比右侧导航中心 18 低 2.5px。上下归零、左侧那 10px(2.57.25 定的中轴对齐)保留。 */\n' +
'    padding-top: 0 !important;\n' +
'    padding-bottom: 0 !important;\n' +
'}\n' +
'#header > #mainNav #user-login > a {\n' +
'    margin: 0 !important;\n' +
'    float: none !important;\n' +
'    line-height: 1 !important;\n' +
'}\n' +
'/* 左侧块整体在 36px 条里的位置:原来 bottom:4px 对的是 22.3px 高的文本行,\n' +
'   换成 24px 高的图标按钮后块高变 24 ⇒ 中心会掉到 20(右侧导航中心 18)⇒ 收到 6px 对齐。 */\n' +
'#header > #mainNav > div:first-child { bottom: 6px !important; }\n' +
'\n' +
'/* ③ Cyber ID(用户名) */\n' +
'#header > #mainNav #user-login > a[href*="u.php"] {\n' +
'    position: relative;\n' +
'    color: #00f3ff !important;\n' +
'    font-weight: 700 !important;\n' +
'    letter-spacing: 0.10em !important;\n' +
'    font-variant-numeric: tabular-nums;\n' +
'    text-shadow: 0 0 10px rgba(0,243,255,0.60), 0 0 20px rgba(0,243,255,0.20) !important;\n' +
'    padding-bottom: 2px;\n' +
'    text-decoration: none !important;\n' +
'}\n' +
'#header > #mainNav #user-login > a[href*="u.php"]::after {\n' +
'    content: "";\n' +
'    position: absolute;\n' +
'    left: 0; right: 0; bottom: 0; height: 1px;\n' +
'    background: #00f3ff;\n' +
'    box-shadow: 0 0 5px #00f3ff;\n' +
'    transform: scaleX(0);\n' +
'    transform-origin: right;\n' +
'    transition: transform .3s ease;\n' +
'    pointer-events: none;\n' +
'}\n' +
'#header > #mainNav #user-login > a[href*="u.php"]:hover::after {\n' +
'    transform: scaleX(1);\n' +
'    transform-origin: left;\n' +
'}\n' +
'\n' +
'/* ④ 图标按钮(消息 / 设置 / 退出)—— 参考 .icon-btn */\n' +
'#header > #mainNav #user-login > a.spp-hud-ic {\n' +
'    position: relative !important;\n' +
'    display: inline-flex !important;\n' +
'    align-items: center !important;\n' +
'    justify-content: center !important;\n' +
'    width: 24px !important;\n' +
'    height: 24px !important;\n' +
'    padding: 0 !important;\n' +
'    margin: 0 !important;\n' +
'    border-radius: 999px !important;\n' +
'    background-color: transparent;\n' +
'    color: #64748b !important;\n' +
'    font-size: 0 !important;\n' +
'    line-height: 0 !important;\n' +
'    text-shadow: none !important;\n' +
'    text-decoration: none !important;\n' +
'    box-shadow: none;\n' +
'    transition: color .3s cubic-bezier(.4,0,.2,1), background-color .3s cubic-bezier(.4,0,.2,1),\n' +
'                box-shadow .3s ease, transform .3s cubic-bezier(.4,0,.2,1), filter .3s ease !important;\n' +
'}\n' +
'#header > #mainNav #user-login > a.spp-hud-ic > svg {\n' +
'    width: 17px !important;\n' +
'    height: 17px !important;\n' +
'    display: block !important;\n' +
'    stroke: currentColor !important;\n' +
'    fill: none !important;\n' +
'    pointer-events: none !important;\n' +
'}\n' +
'/* 站点那张老 GIF 是 phpwind 短消息轮询的挂载点,只能藏不能删 —— 让它退成脱流热区,\n' +
'   不给 24×24 的按钮外壳撑出第二层盒子。 */\n' +
'#header > #mainNav #user-login > a#td_msg > img {\n' +
'    position: absolute !important;\n' +
'    left: 50% !important;\n' +
'    top: 50% !important;\n' +
'    width: 1px !important;\n' +
'    height: 1px !important;\n' +
'    margin: -0.5px 0 0 -0.5px !important;\n' +
'    visibility: hidden !important;\n' +
'}\n' +
'#header > #mainNav #user-login > a.spp-hud-ic:hover {\n' +
'    color: #00f3ff !important;\n' +
'    background-color: rgba(0,243,255,0.12);\n' +
'    box-shadow: inset 0 0 0 1px rgba(0,243,255,0.45);\n' +
'    transform: translateY(-2px) !important;\n' +
'    filter: drop-shadow(0 0 8px rgba(0,243,255,0.60));\n' +
'}\n' +
'\n' +
'/* ⑤ 用户名与图标组之间的竖分隔线(参考里的 h-6 w-px bg-white/10) */\n' +
'#header > #mainNav #user-login > a#td_msg::before {\n' +
'    content: "";\n' +
'    position: absolute;\n' +
'    left: -5px;\n' +
'    top: 50%;\n' +
'    width: 1px;\n' +
'    height: 14px;\n' +
'    margin-top: -7px;\n' +
'    background: linear-gradient(180deg, transparent, rgba(255,255,255,0.18), transparent);\n' +
'    pointer-events: none;\n' +
'}\n' +
'\n' +
'/* ⑥ 右侧:搜索胶囊与两枚战术按钮之间让出 10px(本站原本是零间距贴死) */\n' +
'#header > #mainNav ul.guide > li + li { margin-left: 10px !important; }\n' +
'/* 站点给「屏蔽配置」那枚 li **内联写死**了 width:70px —— 塞进状态灯后内容要 81px,\n' +
'   字会在「屏蔽配 / 置」之间折行(实测第一版就是这个样子)。li 是 float:left,\n' +
'   宽度本来就该由内容决定 ⇒ 放开,并禁止战术按钮内部折行。 */\n' +
'#header > #mainNav ul.guide > li:has(> a.spp-tac) { position: relative !important; width: auto !important; }\n' +
'#header > #mainNav ul.guide > li > a.spp-tac { white-space: nowrap !important; }\n' +
'/* 竖分隔线**只一条**,画在搜索胶囊与第一枚战术按钮之间(与参考文件一致 ——\n' +
'   参考里两枚 tactical-btn 之间只有间距,没有第二条线)。 */\n' +
'#header > #mainNav ul.guide > li#h_search + li::before {\n' +
'    content: "";\n' +
'    position: absolute;\n' +
'    left: -5px;\n' +
'    top: 50%;\n' +
'    width: 1px;\n' +
'    height: 14px;\n' +
'    margin-top: -7px;\n' +
'    background: linear-gradient(180deg, transparent, rgba(255,255,255,0.18), transparent);\n' +
'    pointer-events: none;\n' +
'}\n' +
'\n' +
'/* 搜索胶囊(参考 .search-pill-btn)—— 压过 initNavSimplify 里那条绿胶囊配方 */\n' +
'#header > #mainNav ul.guide > li#h_search > a,\n' +
'#header > #mainNav ul.guide > li#h_search > a:hover {\n' +
'    background-image: none !important;\n' +
'    background-color: rgba(0,243,255,0.12) !important;\n' +
'    color: #00f3ff !important;\n' +
'    font-weight: 500 !important;\n' +
'    border-radius: 999px !important;\n' +
'    box-shadow: inset 0 0 0 1px rgba(0,243,255,0.30), 0 0 10px rgba(0,243,255,0.10) !important;\n' +
'    transition: background-color .3s cubic-bezier(.4,0,.2,1), color .3s cubic-bezier(.4,0,.2,1),\n' +
'                box-shadow .3s ease, transform .3s cubic-bezier(.4,0,.2,1) !important;\n' +
'}\n' +
'#header > #mainNav ul.guide > li#h_search > a:hover {\n' +
'    background-color: rgba(0,243,255,0.25) !important;\n' +
'    color: #ffffff !important;\n' +
'    box-shadow: inset 0 0 0 1px #00f3ff, 0 0 15px rgba(0,243,255,0.40),\n' +
'                inset 0 0 8px rgba(0,243,255,0.20) !important;\n' +
'    transform: translateY(-1px) !important;\n' +
'}\n' +
'\n' +
'#header > #mainNav ul.guide > li > a.spp-tac > div {\n' +
'    position: absolute !important;\n' +
'    top: 100% !important;\n' +
'    flex: none !important;\n' +
'}\n' +
'/* 战术按钮(参考 .tactical-btn + .status-led + 悬停扫描能量线) */\n' +
'#header > #mainNav ul.guide > li > a.spp-tac {\n' +
'    position: relative !important;\n' +
'    display: inline-flex !important;\n' +
'    align-items: center !important;\n' +
'    color: #cbd5e1 !important;\n' +
'    font-weight: 700 !important;\n' +
'    text-decoration: none !important;\n' +
'    transition: color .3s ease, text-shadow .3s ease !important;\n' +
'}\n' +
'#header > #mainNav ul.guide > li > a.spp-tac:hover {\n' +
'    color: #ffffff !important;\n' +
'    text-shadow: 0 0 12px rgba(0,243,255,0.35);\n' +
'}\n' +
'#header > #mainNav ul.guide > li > a.spp-tac > .spp-led {\n' +
'    width: 6px;\n' +
'    height: 6px;\n' +
'    border-radius: 50%;\n' +
'    margin-right: 7px;\n' +
'    flex: 0 0 auto;\n' +
'    background-color: currentColor;\n' +
'    box-shadow: 0 0 6px currentColor;\n' +
'    animation: sppHudLed 2s infinite;\n' +
'    will-change: transform, opacity;\n' +   
'}\n' +
'#header > #mainNav ul.guide > li > a.spp-tac--off > .spp-led { color: #94a3b8; }\n' +
'#header > #mainNav ul.guide > li > a.spp-tac--on > .spp-led { color: #00f3ff; }\n' +
'#header > #mainNav ul.guide > li > a.spp-tac::after {\n' +
'    content: "";\n' +
'    position: absolute;\n' +
'    left: 0; right: 0; bottom: 0; height: 2px;\n' +
'    background: linear-gradient(90deg, transparent, #00f3ff, transparent);\n' +
'    transform: scaleX(0);\n' +
'    transition: transform .3s cubic-bezier(.4,0,.2,1);\n' +
'    pointer-events: none;\n' +
'}\n' +
'#header > #mainNav ul.guide > li > a.spp-tac:hover::after { transform: scaleX(1); }\n' +
'\n' +
'@keyframes sppHudLed {\n' +
'    0%, 100% { opacity: 1; transform: scale(1); }\n' +
'    50%      { opacity: 0.5; transform: scale(0.8); }\n' +
'}\n' +
'\n' +
'@media (prefers-reduced-motion: reduce) {\n' +
'    #header > #mainNav ul.guide > li > a.spp-tac > .spp-led { animation: none; }\n' +
'    #header > #mainNav #user-login > a.spp-hud-ic,\n' +
'    #header > #mainNav ul.guide > li#h_search > a,\n' +
'    #header > #mainNav ul.guide > li > a.spp-tac,\n' +
'    #header > #mainNav ul.guide > li > a.spp-tac::after,\n' +
'    #header > #mainNav #user-login > a[href*="u.php"]::after { transition: none; }\n' +
'}';
if (!document.getElementById(STYLE_ID)) {
const st = document.createElement('style');
st.id = STYLE_ID;
st.textContent = HUD_CSS;
appendToHeadSafe(st);
}
const GEAR = '<circle cx="12" cy="12" r="3"></circle>' +
'<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>';
const POWER = '<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path>' +
'<polyline points="16 17 21 12 16 7"></polyline>' +
'<line x1="21" y1="12" x2="9" y2="12"></line>';
function mkSvg(markup) {
const s = document.createElementNS(ICON_NS, 'svg');
s.setAttribute('viewBox', '0 0 24 24');
s.setAttribute('fill', 'none');
s.setAttribute('stroke', 'currentColor');
s.setAttribute('stroke-width', '1.8');
s.setAttribute('stroke-linecap', 'round');
s.setAttribute('stroke-linejoin', 'round');
s.setAttribute('aria-hidden', 'true');
s.setAttribute('class', 'spp-hud-svg');
s.innerHTML = markup;
return s;
}
function dress(a, markup) {
if (!a || a.classList.contains('spp-hud-ic')) return false;
const label = (a.textContent || '').replace(/\s+/g, '').trim();
a.classList.add('spp-hud-ic');
if (label) {
if (!a.getAttribute('aria-label')) a.setAttribute('aria-label', label);
if (!a.getAttribute('title')) a.setAttribute('title', label);
}
if (markup && !a.querySelector('svg')) a.appendChild(mkSvg(markup));
return true;
}
function tac(a, kind) {
if (!a || a.classList.contains('spp-tac')) return false;
a.classList.add('spp-tac');
a.classList.add('spp-tac--' + kind);
const led = document.createElement('span');
led.className = 'spp-led';
led.setAttribute('aria-hidden', 'true');
a.insertBefore(led, a.firstChild);
return true;
}
function apply() {
if (!document.getElementById('mainNav')) return false;
let done = 0;
if (dress(document.getElementById('td_msg'), null)) done++;
if (dress(document.querySelector('#user-login > a[href*="profile.php"]'), GEAR)) done++;
if (dress(document.querySelector('#user-login > a[href*="action-quit"]'), POWER)) done++;
if (tac(document.getElementById('peacemakerconfig'), 'off')) done++;
if (tac(document.querySelector('#guide a[href*="H_name-tasks"]'), 'on')) done++;
return done >= 5;
}
let tries = 0;
(function boot() {
if (apply() || tries++ >= 40) return;
setTimeout(boot, tries < 20 ? 60 : 300);
})();
}
function initBoardPreload() {
if (!PAGE.board) return;
const KEY = 'spp_board_pl';
const GAP = 450;                 
const CAP = 10;                  
const WAIT = 1000;               
const TIMEOUT = 15000;           
let want = 0;
try { want = SPP_CONFIG.num(KEY, 0, 0, BOARD_PL_MAX); } catch (e) { want = 0; }
if (!(want >= 1)) want = 0;
want = Math.min(want, CAP);      
let stopped = false, fails = 0, appended = 0, pumping = false;
let chipEl = null, chipInp = null;
function hint(text) {
try {
let el = document.getElementById('spp-pl-hint');
if (!el) {
el = document.createElement('div');
el.id = 'spp-pl-hint';
el.style.cssText = 'position:fixed;left:14px;bottom:14px;z-index:2147483000;max-width:62vw;' +
'padding:7px 11px;border-radius:9px;background:rgb(0 0 0 / .86);color:#e8eef6;' +
'font:12px/1.5 system-ui,-apple-system,"Segoe UI",sans-serif;' +
'box-shadow:0 8px 24px rgba(0,0,0,.45);pointer-events:none';
(document.body || document.documentElement).appendChild(el);
}
el.textContent = text;
setTimeout(function () { if (el.parentNode) el.parentNode.removeChild(el); }, 6000);
} catch (e) { }
}
function pageUrl(n) {
const base = location.href.split('#')[0];
if (/(?<!f)page[-=](\d+|e|last)\b/i.test(base)) return base.replace(/([\s\S]*)(?<!f)page([-=])(\d+|e|last)\b/i, '$1page$2' + n);
if (/\.html(\?|$)/.test(base)) return base.replace(/\.html(\?|$)/, '-page-' + n + '.html$1');
return base + (base.indexOf('?') >= 0 ? '&' : '?') + 'page=' + n;
}
function urlPage() {
const s = location.pathname + location.search;
const hits = s.match(/(?<!f)page[-=](\d+)/gi);
if (hits) return Number(hits[hits.length - 1].match(/(\d+)/)[1]);
if (/page[-=](e|last)\b/i.test(s)) return siteTotal() || 1;
return 1;
}
function siteTotal() {
const one = document.querySelector('.pagesone');
const m = one ? String(one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/) : null;
return m ? (Number(m[2]) || 1) : 1;
}
function fetchPage(p) {
const url = pageUrl(p);
const ctl = (typeof AbortController === 'function') ? new AbortController() : null;
const to = ctl ? setTimeout(function () { try { ctl.abort(); } catch (e) { } }, TIMEOUT) : 0;
const opt = { credentials: 'include', cache: 'no-store' };
if (ctl) opt.signal = ctl.signal;
return fetch(url, opt).then(function (r) {
if (to) clearTimeout(to);
if (!r.ok) throw new Error('HTTP ' + r.status);
return r.text();
}).then(function (t) {
if (to) clearTimeout(to);
const doc = new DOMParser().parseFromString(t, 'text/html');
if (/刷新不要快于/.test(String(doc.title || ''))) return null;   
return doc;
}).catch(function (e) {
if (to) clearTimeout(to);
throw e;
});
}
function tidOf(el) {
const a = el.querySelector('a[href*="read.php"]');
const m = a ? String(a.getAttribute('href') || '').match(/tid[-=](\d+)/) : null;
return m ? m[1] : '';
}
function pinned(el, kind) {
if (kind === 'wall') return !!el.querySelector('img[src*="headtopic"]');
return !!(el.querySelector('img[title="置顶帖标志"]') || el.querySelector('a[href*="notice.php"]') ||
el.querySelector('td.tac img[src*="anc.gif"]'));
}
function pickTbody(root) {
const table = root.querySelector('#main #ajaxtable') || root.getElementById('ajaxtable');
if (!table) return null;
let best = null, bestN = 0;
Array.prototype.forEach.call(table.querySelectorAll('tbody'), function (tb) {
const n = Array.prototype.filter.call(tb.querySelectorAll('tr'), function (tr) {
return !!tr.querySelector('h3 a[href*="read.php"]');
}).length;
if (n > bestN) { bestN = n; best = tb; }
});
return best || table.querySelector('tbody');
}
function container() {
const wall = document.querySelector('#wall ul.stream');
if (wall && Array.prototype.some.call(wall.children, function (c) { return c.tagName === 'LI'; })) {
return { kind: 'wall', el: wall };
}
const tb = pickTbody(document);
if (tb && tb.querySelector('h3 a[href*="read.php"]')) return { kind: 'list', el: tb };
return null;
}
function collectSeen(box, seen) {
const els = (box.kind === 'wall') ? Array.prototype.slice.call(box.el.children)
: Array.prototype.slice.call(box.el.querySelectorAll('tr'));
els.forEach(function (el) {
if (box.kind === 'wall' && el.tagName !== 'LI') return;
if (box.kind === 'list' && !el.querySelector('h3 a[href*="read.php"]')) return;
const tid = tidOf(el);
if (tid) seen[tid] = 1;
});
}
function buildFrag(doc, box, seen, idx) {
const src = (box.kind === 'wall') ? doc.querySelector('#wall ul.stream') : pickTbody(doc);
if (!src) return null;
const els = (box.kind === 'wall')
? Array.prototype.filter.call(src.children, function (c) { return c.tagName === 'LI'; })
: Array.prototype.filter.call(src.querySelectorAll('tr'), function (tr) { return !!tr.querySelector('h3 a[href*="read.php"]'); });
if (!els.length) return null;
const frag = document.createDocumentFragment();
els.forEach(function (el) {
if (pinned(el, box.kind)) return;
const tid = tidOf(el);
if (tid && seen[tid]) return;          
if (tid) seen[tid] = 1;
const cl = el.cloneNode(true);
cl.dataset.sppPageIdx = String(idx);
frag.appendChild(cl);
});
return frag;
}
function insertList(frag) {
const tb = pickTbody(document);
if (!tb) return false;
const rows = Array.prototype.slice.call(tb.querySelectorAll('tr'));
let spacer = null;
for (let i = rows.length - 1; i >= 0; i--) {
if (!rows[i].querySelector('h3 a[href*="read.php"]')) { spacer = rows[i]; break; }
}
if (spacer) tb.insertBefore(frag, spacer);     
else tb.appendChild(frag);
return true;
}
const RANGE_CLS = 'spp-pl-range';
const IN_CLS = 'spp-pl-in';
let pagerBound = false;
function pagerRows() {
return Array.prototype.slice.call(document.querySelectorAll('.spp-pgbar'));
}
function wallList() {
const box = container();
return (box && box.kind === 'wall') ? box.el : null;
}
function liList(ul) {
return Array.prototype.slice.call(ul.children).filter(function (c) { return c.tagName === 'LI'; });
}
function pagerBox(row) {
const boxes = row.querySelectorAll('.pages');
for (let b = 0; b < boxes.length; b++) {
const t = boxes[b].textContent || '';
if (/[«‹]/.test(t) && /[»›]/.test(t)) return boxes[b];
}
return boxes[0] || null;
}
function rangeNow() {
const cur = urlPage();
let last = cur;
const ul = wallList();
if (ul) liList(ul).forEach(function (li) {
if (li.dataset.sppPageIdx === undefined) return;
const q = cur + (Number(li.dataset.sppPageIdx) || 0);
if (q > last) last = q;
});
return { cur: cur, last: last, on: (last > cur) };
}
function pageOfLi(li, cur) {
return li.dataset.sppPageIdx === undefined ? cur : cur + (Number(li.dataset.sppPageIdx) || 0);
}
function cardOfPageIdx(p, cur, list) {
const want = p - cur;
let fallback = null;
for (let i = 0; i < list.length; i++) {
const li = list[i];
if (pageOfLi(li, cur) !== p) continue;                         
const v = li.dataset ? li.dataset.sppPageIdx : undefined;
if (v !== undefined && (Number(v) || 0) === want) return li;   
if (!fallback) fallback = li;                                  
}
return fallback;
}
function firstCardOfPage(p) {
const ul = wallList();
if (!ul) return null;
return cardOfPageIdx(p, urlPage(), liList(ul));
}
function gotoLoadedPage(p) {
const el = firstCardOfPage(p);
if (!el) return false;
const y = el.getBoundingClientRect().top + window.scrollY - 60;
try { window.scrollTo({ top: Math.max(0, y), behavior: 'smooth' }); }
catch (e) { window.scrollTo(0, Math.max(0, y)); }
return true;
}
function pageOfHref(a) {
const m = String(a.getAttribute('href') || '').match(/(?<!f)page[-=](\d+)/i);
return m ? Number(m[1]) : 0;
}
function stepParts() {
const T = siteTotal();
const N = want;
const cur = urlPage();
if (!(N >= 1)) return { T: T, N: 0, cur: cur, steps: 0, k: 1 };   
return {
T: T, N: N, cur: cur,
steps: (T > 1) ? Math.max(1, Math.ceil(T / N)) : 0,
k: Math.floor((cur - 1) / N) + 1
};
}
function stepSpan(k, N, T) {
const start = 1 + (k - 1) * N;
return { start: start, end: Math.min(start + N - 1, (T > 0) ? T : (start + N - 1)) };
}
function tryStep(k) {
const s = stepParts();
if (!(s.N >= 2)) return false;
if (k < 1) {
try { window.scrollTo({ top: 0, behavior: 'smooth' }); } catch (e) { window.scrollTo(0, 0); }
return true;
}
if (s.steps && k > s.steps) return false;
const rg = rangeNow();
if (!rg.on) return false;
const sp = stepSpan(k, s.N, s.T);
if (sp.start >= rg.cur && sp.end <= rg.last) return gotoLoadedPage(sp.start);
return false;
}
function stepGo(dir) { return tryStep(stepParts().k + dir); }
function stepGoTo(k) { return tryStep(k); }
function stepTargetUrl(k) {
const s = stepParts();
if (!(s.N >= 2)) return null;
if (s.steps && k > s.steps) return null;
return pageUrl(stepSpan(k, s.N, s.T).start);
}
function ensurePlStyle() {
ensureStyle('spp-pl-style', '/* SPP-PL-BEGIN */\n' +
'#main .spp-pgbar li.' + RANGE_CLS + ' { display:inline-flex !important; align-items:center !important; height:26px !important;\n' +
'    padding:0 10px !important; margin-left:6px !important; border-radius:999px !important;\n' +
'    border:1px dashed rgba(16,185,129,.45) !important; background-color:rgba(16,185,129,.10) !important;\n' +
'    color:#6ee7b7 !important; -webkit-text-fill-color:#6ee7b7 !important; font-size:12px !important; white-space:nowrap !important; }\n' +
'#main .spp-pgbar li.' + RANGE_CLS + '::before { content:\'\' !important; width:6px !important; height:6px !important;\n' +
'    margin-right:6px !important; border-radius:50% !important; background:currentColor !important;\n' +
'    box-shadow:0 0 8px rgba(16,185,129,.9) !important; }\n' +
'/* ★ t21:胶囊里直接改预加载页数(0-10)。输入框沿用帖子页那套(无自身边框,融入胶囊)*/\n' +
'#main .spp-pgbar li.' + RANGE_CLS + ' .spp-pl-num { width:34px !important; height:18px !important; box-sizing:border-box !important;\n' +
'    margin:0 5px !important; padding:0 4px !important; text-align:center !important; font-family:inherit !important;\n' +
'    font-size:12px !important; font-weight:600 !important; color:#dbe4f2 !important; -webkit-text-fill-color:#dbe4f2 !important;\n' +
'    border:0 !important; border-radius:999px !important; background-color:rgba(0,0,0,.22) !important;\n' +
'    -webkit-appearance:none !important; appearance:none !important; outline:none !important; box-shadow:none !important; }\n' +
'#main .spp-pgbar li.' + RANGE_CLS + ' .spp-pl-num:hover, #main .spp-pgbar li.' + RANGE_CLS + ' .spp-pl-num:focus {\n' +
'    color:#fff !important; -webkit-text-fill-color:#fff !important; background-color:rgba(32,201,151,.28) !important; }\n' +
'#main .spp-pgbar li.' + RANGE_CLS + ' .spp-pl-num::-webkit-outer-spin-button,\n' +
'#main .spp-pgbar li.' + RANGE_CLS + ' .spp-pl-num::-webkit-inner-spin-button { -webkit-appearance:none !important; margin:0 !important; }\n' +
'#main .spp-pgbar li.' + RANGE_CLS + ' .spp-pl-lab { color:#8ee9c4 !important; -webkit-text-fill-color:#8ee9c4 !important; }\n' +
'/* 关闭态(0):中性虚线,不发光点、不显示步数/范围 */\n' +
'#main .spp-pgbar li.' + RANGE_CLS + '.spp-pl-off { border-color:rgba(255,255,255,.16) !important;\n' +
'    background-color:rgba(255,255,255,.04) !important; color:#9aa8bd !important; -webkit-text-fill-color:#9aa8bd !important; }\n' +
'#main .spp-pgbar li.' + RANGE_CLS + '.spp-pl-off::before { display:none !important; }\n' +
'#main .spp-pgbar li.' + RANGE_CLS + '.spp-pl-off .spp-pl-lab { color:#9aa8bd !important; -webkit-text-fill-color:#9aa8bd !important; }\n' +
'#main .spp-pgbar .pages ul li a.' + IN_CLS + ' { position:relative !important; }\n' +
'#main .spp-pgbar .pages ul li a.' + IN_CLS + '::after { content:\'\' !important; position:absolute !important;\n' +
'    right:3px !important; top:3px !important; width:5px !important; height:5px !important; border-radius:50% !important;\n' +
'    background:#10b981 !important; box-shadow:0 0 6px rgba(16,185,129,.9) !important; }\n' +
'/* SPP-PL-END */');
}
function chipApply(el) {
const raw = parseInt(el.value, 10);
if (!isFinite(raw)) { el.value = String(want); hint('已忽略非法输入'); return; }
const n = Math.min(BOARD_PL_MAX, Math.max(0, raw));
el.value = String(n);
try { GM_setValue(KEY, n); } catch (e) { }
const was = want;
want = n;
stopped = false;
fails = 0;
if (want >= 1) {
hint(was >= 1 ? ('已保存 ' + n + ' 页') : ('已开启:预加载 ' + n + ' 页'));
if (typeof sppPlBridge === 'object' && sppPlBridge) sppPlBridge.step = want;
pump();
} else {
hint('已关闭');
}
paintRange();
}
function ensureChip(box) {
let chip = box.querySelector('li.' + RANGE_CLS);
if (chip) { if (!chipEl) chipEl = chip; return chip; }
chip = document.createElement('li');
chip.className = RANGE_CLS;
const lab = document.createElement('span');
lab.className = 'spp-pl-lab';
lab.textContent = '预加载';
const inp = document.createElement('input');
inp.type = 'number';
inp.className = 'spp-pl-num';
inp.min = '0';
inp.max = String(BOARD_PL_MAX);
inp.step = '1';
inp.value = String(want);
inp.title = '板块列表预加载页数:可填 0-' + BOARD_PL_MAX + '(0 = 关闭,默认)。' +
'改完立即落盘:增档会继续把后续页接在当前页后面(串行抓取、失败即停);减档保留已接上的页;填 0 停止后续抓取。' +
'这些页同时也是页内/悬浮翻页「一步」的步长';
inp.setAttribute('aria-label', '板块列表预加载页数');
inp.addEventListener('change', function () { chipApply(inp); });
inp.addEventListener('keydown', function (e) {
if (e.key === 'Enter') { e.preventDefault(); chipApply(inp); inp.blur(); }
});
inp.addEventListener('blur', function () { if (inp.value !== String(want)) inp.value = String(want); });
chip.appendChild(lab);
chip.appendChild(inp);
const txt = document.createElement('span');
txt.className = 'spp-pl-txt';
chip.appendChild(txt);
const one = box.querySelector('li.pagesone') || box.querySelector('.pagesone');
if (one && one.parentNode) one.parentNode.insertBefore(chip, one.nextSibling);
else box.appendChild(chip);
chipEl = chip;
return chip;
}
function paintRange() {
const rg = rangeNow();
const T = siteTotal();
pagerRows().forEach(function (row) {
const box = pagerBox(row);
if (!box) return;
const chip = ensureChip(box);
const txt = chip.querySelector('.spp-pl-txt');
const own = chip.querySelector('.spp-pl-num');          
if (own && own.value !== String(want)) own.value = String(want);
const open = (want >= 1) && rg.on;
chip.classList.toggle('spp-pl-off', !open);
if (!open) {
txt.textContent = '页(关闭)';
chip.title = '板块列表预加载页数 = 0 ⇒ 关闭:不抓任何页、翻页条与悬浮按钮回到原样。' +
'在上面那个框里填 1-' + BOARD_PL_MAX + ' 可立即开启(增档会接着往下抓)';
return;
}
const s = stepParts();
txt.textContent = s.steps
? ('第 ' + s.k + ' 步 / 共 ' + s.steps + ' 步 · 已载 ' + rg.cur + '–' + rg.last + ' 页')
: ('已载 ' + rg.cur + '–' + rg.last + ' / ' + T);
chip.title = '一步 = ' + s.N + ' 页(设置里的「板块列表预加载页数」)⇒ 站内 ' + T + ' 页共 ' +
(s.steps || '?') + ' 步;当前第 ' + s.k + ' 步覆盖第 ' + stepSpan(s.k, s.N, s.T).start + '–' +
stepSpan(s.k, s.N, s.T).end + ' 页。本页已载第 ' + rg.cur + '–' + rg.last +
' 页:点这个范围内带绿点的页码会就地滚过去;点 ‹ › 走一整步(目标步已在本页就滚过去,否则整页跳到那一步第一页);范围外页码照旧整页跳转。' +
'左边那个框可改页数(0 = 关闭,改完立即生效)';
Array.prototype.forEach.call(box.querySelectorAll('li > a'), function (a) {
const p = pageOfHref(a);
const inR = !!(p && p >= rg.cur && p <= rg.last);
if (inR && !a.classList.contains(IN_CLS)) {
a.classList.add(IN_CLS);
if (a.dataset.sppPlTitle === undefined) a.dataset.sppPlTitle = a.getAttribute('title') || '';
a.setAttribute('title', '第 ' + p + ' 页已经在本页里了(点击原地定位)');
} else if (!inR && a.classList.contains(IN_CLS)) {
a.classList.remove(IN_CLS);
if (a.dataset.sppPlTitle !== undefined) {
if (a.dataset.sppPlTitle) a.setAttribute('title', a.dataset.sppPlTitle);
else a.removeAttribute('title');
delete a.dataset.sppPlTitle;
}
}
});
});
}
function onPagerClick(e) {
if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
const a = (e.target && e.target.closest) ? e.target.closest('.spp-pgbar a, .pages a') : null;
if (!a) return;
const txt = String(a.textContent || '').trim();
const arrow = !a.hasAttribute('data-spp-pg-end') &&
(/^[‹<]+$/.test(txt) ? -1 : (/^[›>]+$/.test(txt) ? 1 : 0));
if (arrow) {
const s = stepParts();
if (!(s.N >= 2)) return;                                  
const k2 = s.k + arrow;
if (tryStep(k2)) { e.preventDefault(); e.stopPropagation(); return; }   
if (k2 < 1) return;                                       
const url = stepTargetUrl(k2);
if (!url) return;
e.preventDefault();
e.stopPropagation();
window.location.href = url;                               
return;
}
const p = pageOfHref(a);
if (!p) return;
const rg = rangeNow();
if (!rg.on || p < rg.cur || p > rg.last) return;   
if (!gotoLoadedPage(p)) return;                    
e.preventDefault();
e.stopPropagation();
}
function bindPager() {
if (pagerBound) return;
pagerBound = true;
ensurePlStyle();
document.addEventListener('click', onPagerClick, true);
sppPlBridge = { step: want, stepGo: stepGo, stepGoTo: stepGoTo };
}
function loadedMax() {
const rg = rangeNow();
return rg.on ? rg.last : urlPage();
}
function pump() {
if (pumping || stopped) return;
const box = container();
if (!box) return;
const T = siteTotal();
const cur = urlPage();
if (!(T > 1)) return;
if (!(want >= 1)) { paintRange(); return; }
if (Math.min(cur + Math.min(want, CAP), T) <= loadedMax()) { paintRange(); return; }
const seen = {};
collectSeen(box, seen);
bindPager();                    
pumping = true;
let p = loadedMax() + 1;
(function step() {
const tgt = Math.min(cur + Math.min(want, CAP), T);   
if (stopped || !(want >= 1) || p > tgt) { pumping = false; try { paintRange(); } catch (e3) { } return; }
const page = p;
fetchPage(page).then(function (doc) {
if (stopped) { pumping = false; return; }
if (!doc) throw new Error('被站点节流页挡下');
const frag = buildFrag(doc, box, seen, page - cur);
if (!frag) throw new Error('解析不出容器');
if (box.kind === 'wall') box.el.appendChild(frag);     
else if (!insertList(frag)) throw new Error('找不到插入位置');
appended++;
fails = 0;
try { paintRange(); } catch (e2) { }        
p++;
if (p <= Math.min(cur + Math.min(want, CAP), T)) setTimeout(step, GAP);
else { pumping = false; }
}).catch(function (e) {
fails++;
if (fails >= 2) stopped = true;             
pumping = false;
console.warn('[SPP] 板块列表预加载:第 ' + page + ' 页抓取失败,就地停止追加' +
'(已接上的 ' + appended + ' 页保留、不回滚;设置上限 ' + want + ' 页):', e);
hint('板块预加载:第 ' + page + ' 页抓取失败,已停止追加(已接上的 ' + appended + ' 页保留)');
});
})();
}
function run() {
ensurePlStyle();
paintRange();                   
if (!(want >= 1)) return;       
pump();
}
onDomReady(function () { setTimeout(run, WAIT); });
}
function initWallMode() {
if (!PAGE.board) return;
function switchToWall() {
const cb = document.querySelector('input[type="checkbox"][name*="wall"]');
if (cb && !cb.checked) cb.checked = true;
if (document.getElementById('wall')) return;
function wallUrl(from) {
const s = String(from);
const fid = s.match(/fid-(\d+)/) || s.match(/[?&]fid=(\d+)/);
if (!fid) return '';
const seg = [];
['type', 'special'].forEach(function (k) {
const m = s.match(new RegExp(k + '-(\\d+)')) || s.match(new RegExp('[?&]' + k + '=(\\d+)'));
if (m) seg.push(k + '-' + m[1]);
});
const d = s.match(/search-([a-z0-9]+)/) || s.match(/[?&]search=([a-z0-9]+)/);
if (d) seg.push('search-' + d[1]);
const od = s.match(/orderway-([a-z]+)/) || s.match(/[?&]orderway=([a-z]+)/);
if (od) seg.push('orderway-' + od[1]);
const dr = s.match(/asc-(ASC|DESC)/) || s.match(/[?&]asc=(ASC|DESC)/i);
if (dr) seg.push('asc-' + dr[1].toUpperCase());
const p = s.match(/page-(\d+)/) || s.match(/[?&]page=(\d+)/);
return location.origin + '/thread_new.php?fid-' + fid[1] +
(seg.length ? '-' + seg.join('-') : '') + '-page-' + (p ? p[1] : '1') + '.html';
}
let sw = null;
Array.prototype.some.call(document.querySelectorAll('a.s3[href*="thread_new.php"]'), function (a) {
if (/图墙/.test(a.textContent || '')) { sw = a; return true; }
return false;
});
if (!sw) return;
const wall = wallUrl(location.pathname + location.search + location.hash);
if (wall) { location.href = wall; return; }
sw.click();
}
onDomReady(switchToWall);
}
const SPP_TEA_MEMO = 'spp_tea_filter';          
const SPP_TEA_RESET = 'spp_tea_filter_reset';   
const SPP_TEA_ALL = '全部(不限时间)';
function sppTeaSegs(href) {
const s = String(href == null ? '' : href);
const one = function (name) {
const m = s.match(new RegExp(name + '-([A-Za-z0-9]+)')) ||
s.match(new RegExp('[?&]' + name + '=([A-Za-z0-9]+)'));
return m ? m[1] : '';
};
const d = s.match(/asc-(ASC|DESC)/) || s.match(/[?&]asc=(ASC|DESC)/i);
const p = s.match(/page-([0-9]+)/) || s.match(/[?&]page=([0-9]+)/);
return {
search: one('search'), way: one('orderway'),
dir: d ? d[1].toUpperCase() : '', page: p ? p[1] : ''
};
}
function sppTeaFiltered(href) {
const g = sppTeaSegs(href);
if (g.search) return true;
if (g.way && g.way !== 'lastpost') return true;
if (g.dir && g.dir !== 'DESC') return true;
return false;
}
function sppTeaNorm(href) {
return String(href).replace(/-page-[0-9]+[.]html/, '-page-1.html')
.replace(/([?&]page=)[0-9]+/, function (m0, p1) { return p1 + '1'; });
}
function sppTeaMemo() {
const raw = String(GM_getValue(SPP_TEA_MEMO, '') || '');
if (raw.indexOf('fid-9') < 0 && raw.indexOf('fid=9') < 0) return '';
return sppTeaFiltered(raw) ? raw : '';
}
function sppTeaMemoSet(v) {
try { GM_setValue(SPP_TEA_MEMO, v); } catch (e) {  }
}
function sppTeaResetMark() {
try { sessionStorage.setItem(SPP_TEA_RESET, '1'); } catch (e) {  }
}
function initTeaFilter() {
if (!PAGE.board || !isTeaFid()) return;
const href = location.href;
let reset = false;
try {
reset = sessionStorage.getItem(SPP_TEA_RESET) === '1';
if (reset) sessionStorage.removeItem(SPP_TEA_RESET);
} catch (e) { reset = false; }
const filtered = sppTeaFiltered(href);
if (reset) sppTeaMemoSet('');
else if (filtered) sppTeaMemoSet(sppTeaNorm(href));
if (filtered) document.documentElement.classList.add('spp-tea-filtered');
if (!filtered && !reset && SPP_CONFIG.bool('spp_tea_filter_memory', true)) {
const want = sppTeaMemo();
if (want && want !== href) { location.replace(want); return; }
}
onDomReady(function () {
const forms = Array.prototype.filter.call(document.querySelectorAll('#main form'), function (f2) {
return String(f2.getAttribute('action') || '').indexOf('fid') >= 0 &&
!!f2.querySelector('select[name="search"]');
});
const sel = forms.length ? forms[0].querySelector('select[name="search"]') : null;
if (sel && sel.dataset.sppAll !== '1') {
sel.dataset.sppAll = '1';
const op = document.createElement('option');
op.value = '';
op.textContent = SPP_TEA_ALL;
sel.insertBefore(op, sel.firstChild);
const g = sppTeaSegs(location.href);
if (!g.search) {
sel.selectedIndex = 0;
} else {
const hit = Array.prototype.filter.call(sel.options, function (o) {
return o.value === g.search;
})[0];
if (hit) sel.selectedIndex = hit.index;
}
}
document.addEventListener('click', function (ev) {
const t = ev.target;
if (!t || !t.closest) return;
const box = document.querySelector('#spp-btabs .spp-catrow');
const a = t.closest('a');
if (box && a && box.contains(a)) {
if (!sppTeaFiltered(a.getAttribute('href') || '')) {
sppTeaMemoSet('');
sppTeaResetMark();
}
return;
}
const btn = t.closest('#main .spp-t5bar form input.btn');
if (!btn) return;
const form = btn.form || btn.closest('form');
if (!form) return;
const val = function (n) {
const e2 = form.elements[n];
return e2 ? String(e2.value || '') : '';
};
if (!val('search') && (!val('orderway') || val('orderway') === 'lastpost') &&
(val('asc') || 'DESC').toUpperCase() === 'DESC') {
sppTeaMemoSet('');
sppTeaResetMark();
}
}, true);
});
}
const SPP_TEA_SEARCH_TXT = {
'1': '1天内的主题', '2': '2天内的主题', '7': '1星期内的主题', '30': '1个月内的主题',
'60': '2个月内的主题', '90': '3个月内的主题', '180': '6个月内的主题',
'365': '1年内的主题', 'digest': '本版精华区'
};
const SPP_TEA_WAY_TXT = {
lastpost: '按回复时间', dateline: '按发表时间', hits: '按人气', replies: '按回复数'
};
function sppTeaFilterText(href) {
const g = sppTeaSegs(href);
const bits = [];
if (g.search) bits.push(SPP_TEA_SEARCH_TXT[g.search] || ('时间范围 ' + g.search));
if (g.way && g.way !== 'lastpost') bits.push(SPP_TEA_WAY_TXT[g.way] || ('排序 ' + g.way));
if (g.dir && g.dir !== 'DESC') bits.push('升序');
return bits.join(' · ');
}
function sppTeaChipMount(catBox) {
if (!catBox || !isTeaFid()) return;
if (catBox.querySelector('.spp-cat-filing')) return;    
const chip = document.createElement('span');
chip.className = 'spp-cat-filing';
chip.textContent = '筛选ing';
chip.setAttribute('role', 'status');
const on = sppTeaFiltered(location.href);
const what = sppTeaFilterText(location.href);
chip.title = on
? '筛选生效中' + (what ? ':' + what : '') + ' —— 点分类里的「全部」可回到全部'
: '筛选没生效(当前就是默认的全部)—— 这枚只是状态,点不了';
catBox.appendChild(chip);
}
function sppAskPickCats(catsRow) {
const out = { all: null, allage: null };
if (!catsRow) return out;
Array.prototype.forEach.call(catsRow.querySelectorAll('li'), function (li) {
if (out.all && out.allage) return;
const a = li.querySelector('a');
if (!a) return;
const href = String(a.getAttribute('href') || '');
if (!href || href.charAt(0) === '#') return;            
if (!out.all && li.id === 'thread_type_all') out.all = { li: li, a: a };
if (!out.allage && String(a.textContent || '').replace(/\s+/g, '').indexOf('全年龄') === 0) {
out.allage = { li: li, a: a };
}
});
return out;
}
function sppAskChipMount(bar, catsRow) {
if (!bar || !isAskFid()) return 0;
if (bar.querySelector('.spp-askrow')) return 0;             
const on = sppTeaFiltered(location.href);
if (on) document.documentElement.classList.add('spp-ask-filtered');
const picked = sppAskPickCats(catsRow);
const box = document.createElement('div');
box.className = 'spp-askrow';
[['all', '全部'], ['allage', '全年龄']].forEach(function (pair) {
const src = picked[pair[0]];
if (!src) return;
const a = document.createElement('a');
a.className = 'spp-cat-pill' +
(src.li.classList.contains('current') ? ' is-cur' : '');
a.setAttribute('href', src.a.getAttribute('href'));      
a.textContent = pair[1];
a.title = '与「分类」那一格里的「' + String(src.a.textContent || '').trim() +
'」是同一个地址';
box.appendChild(a);
});
const chip = document.createElement('span');
chip.className = 'spp-cat-filing';
chip.textContent = '筛选';
chip.setAttribute('role', 'status');
const what = sppTeaFilterText(location.href);
chip.title = on
? '筛选生效中' + (what ? ':' + what : '') + ' —— 上面那两枚可回到不带筛选的分类'
: '筛选没生效(当前就是默认的全部)—— 这枚只是状态,点不了';
box.appendChild(chip);
bar.appendChild(box);
return 1;
}
function initPreviewButton() {
const KEY = 'spp_preview_btn';
let enabled = SPP_CONFIG.bool(KEY, true);
if (!enabled) return;
const LIVE = SPP_CONFIG.bool('spp_preview_live', true);
if (!WANTS.editorUi) return;
function bbcodeToHTML(bbcode) {
let html = bbcode;
html = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
html = html.replace(/\[b\]([\s\S]*?)\[\/b\]/gi, '<strong>$1</strong>');
html = html.replace(/\[i\]([\s\S]*?)\[\/i\]/gi, '<em>$1</em>');
html = html.replace(/\[u\]([\s\S]*?)\[\/u\]/gi, '<u>$1</u>');
html = html.replace(/\[strike\]([\s\S]*?)\[\/strike\]/gi, '<del>$1</del>');
html = html.replace(/\[s\]([\s\S]*?)\[\/s\]/gi, '<del>$1</del>');
html = html.replace(/\[color=([#\w]+)\]([\s\S]*?)\[\/color\]/gi,
'<span style="color:$1">$2</span>');
html = html.replace(/\[size=(\d+)\]([\s\S]*?)\[\/size\]/gi, function(_, size, text) {
let n = parseInt(size, 10);
if (!isFinite(n) || n < 1) n = 1;
if (n > 6) n = 6;
return '<font size="' + n + '">' + text + '</font>';
});
html = html.replace(/\[font=([^\]]+)\]([\s\S]*?)\[\/font\]/gi,
'<span style="font-family:$1">$2</span>');
html = html.replace(/\[align=(\w+)\]([\s\S]*?)\[\/align\]/gi,
'<div style="text-align:$1">$2</div>');
html = html.replace(/\[list(=[1aA])?\]([\s\S]*?)\[\/list\]/gi, function (m, kind, content) {
let inner;
if (/\[li\]/i.test(content)) {
inner = content.replace(/\[li\]/gi, '<li>').replace(/\[\/li\]/gi, '</li>');
} else {
inner = content.split(/\[\*\]/).filter(function (x) { return x.trim(); })
.map(function (x) { return '<li>' + x.trim() + '</li>'; }).join('');
}
const ol = !!kind;
const tag = ol ? 'ol' : 'ul';
return '<' + tag + (ol ? ' type="' + kind.slice(1) + '"' : '') + '>' + inner + '</' + tag + '>';
});
html = html.replace(/\[blockquote\]([\s\S]*?)\[\/blockquote\]/gi,
'<blockquote class="spp-pv-bq">$1</blockquote>');
html = html.replace(/\[table(?:=([^\]]+))?\]([\s\S]*?)\[\/table\]/gi, function (m, w, content) {
const rows = [];
const rre = /\[tr\]([\s\S]*?)\[\/tr\]/gi;
let r;
while ((r = rre.exec(content))) {
const cells = [];
const cre = /\[td\]([\s\S]*?)\[\/td\]/gi;
let c;
while ((c = cre.exec(r[1]))) cells.push('<td>' + c[1] + '</td>');
rows.push('<tr>' + cells.join('') + '</tr>');
}
const ww = !w ? '98%' : (/^\d+$/.test(w) ? w + 'px' : w);
return '<table style="width:' + ww + '">' + rows.join('') + '</table>';
});
html = html.replace(/\[fly\]([\s\S]*?)\[\/fly\]/gi,
'<marquee behavior="alternate" scrollamount="3" width="100%">$1</marquee>');
html = html.replace(/\[move\]([\s\S]*?)\[\/move\]/gi,
'<marquee scrollamount="3">$1</marquee>');
html = html.replace(/\[(flash|wmv|rm)=([^\]]*)\]([\s\S]*?)\[\/\1\]/gi, function (m, kind, prm, url) {
return '<span class="spp-pv-media">▶ ' +
(kind.toLowerCase() === 'flash' ? '点击播放flash' : '点击播放多媒体') +
'(' + prm + ')' + url + '</span>';
});
html = html.replace(/\[hr\]/gi, '<hr class="spp-pv-hr">');
html = html.replace(/\[sup\]([\s\S]*?)\[\/sup\]/gi, '<sup>$1</sup>');
html = html.replace(/\[sub\]([\s\S]*?)\[\/sub\]/gi, '<sub>$1</sub>');
html = html.replace(/\[backcolor=([#\w]+)\]([\s\S]*?)\[\/backcolor\]/gi,
'<span style="background:$1">$2</span>');
html = html.replace(/\[quote=([^\]]*)\]([\s\S]*?)\[\/quote\]/gi,
'<blockquote><strong>$1:</strong>$2</blockquote>');
html = html.replace(/\[quote\]([\s\S]*?)\[\/quote\]/gi, '<blockquote>$1</blockquote>');
html = html.replace(/\[code\]([\s\S]*?)\[\/code\]/gi, '<pre><code>$1</code></pre>');
html = html.replace(/\[sp\]([\s\S]*?)\[\/sp\]/gi,
'<details><summary>展开查看</summary>$1</details>');
html = html.replace(/\[url=([^\]]+)\]([\s\S]*?)\[\/url\]/gi,
'<a href="$1" target="_blank" rel="noopener">$2</a>');
html = html.replace(/\[url\]([\s\S]*?)\[\/url\]/gi,
'<a href="$1" target="_blank" rel="noopener">$1</a>');
html = html.replace(/\[email\]([\s\S]*?)\[\/email\]/gi,
'<a href="mailto:$1">$1</a>');
html = html.replace(/\[img\]([\s\S]*?)\[\/img\]/gi,
'<img src="$1" style="max-width:100%;height:auto;vertical-align:middle;border-radius:4px" alt="" loading="lazy">');
html = html.replace(/\[post\]([\s\S]*?)\[\/post\]/gi,
'<div style="background:#FFF3CD;border:1px dashed #FFC107;padding:8px 12px;border-radius:4px;color:#856404;font-size:13px">🔒 回复可见内容</div>');
html = html.replace(/\[hide\]([\s\S]*?)\[\/hide\]/gi,
'<div style="background:#FFF3CD;border:1px dashed #FFC107;padding:8px 12px;border-radius:4px;color:#856404;font-size:13px">🔒 回复可见内容</div>');
html = html.replace(/\[sell=(\d+)\]([\s\S]*?)\[\/sell\]/gi,
'<div style="background:#FFF3CD;border:1px dashed #FFC107;padding:8px 12px;border-radius:4px;color:#856404;font-size:13px">💰 出售内容 ($1 SP)</div>');
html = html.replace(/\[s:(\d+)\]/gi, function (m, sid) {
const pp = (typeof picpath === 'string' && picpath) ? picpath : 'images/post/smile/';
const meta = (typeof face !== 'undefined' && face && face[sid]) ? face[sid] : null;
if (!meta || !meta[0]) return m;
let src = pp + meta[0];
try { src = new URL(src, document.baseURI).href; } catch (e) {}
return '<img src="' + src + '" style="width:24px;height:24px;vertical-align:middle" alt="[s:' + sid + ']" loading="lazy">';
});
html = html.replace(/\[tb:(\d+)\]/gi, function (m, id) {
return '<img src="https://raw.githubusercontent.com/267208/tieba-emoji/master/image_emoticon' +
(String(id) === '1' ? '' : id) + '.png" style="width:24px;height:24px;vertical-align:middle" alt="[tb:' + id + ']" loading="lazy">';
});
const preBlocks = [];
html = html.replace(/<(pre|code)>[\s\S]*?<\/\1>/gi, function(match) {
preBlocks.push(match);
return '%%PRE_' + (preBlocks.length - 1) + '%%';
});
html = html.replace(/\n/g, '<br>');
html = html.replace(/%%PRE_(\d+)%%/g, function(_, i) {
return preBlocks[parseInt(i)];
});
return html;
}
GM_addStyle([
'.spp-preview-pane {',
'  display:none;',
'  border:1px solid var(--spu-border,#E8E3D8);',
'  border-radius:0 0 6px 6px;',
'  padding:14px 16px; min-height:200px;',
'  background:var(--spu-surface,#FDFBF7);',
'  font-size:15px; line-height:1.85;',
'  color:var(--spu-text,#2D2318);',
'  word-break:break-word;',
'  overflow-y:auto;',
'  scrollbar-width:thin;',
'  scrollbar-color:var(--spu-border,#ddd) transparent;',
'}',
'.spp-preview-pane::-webkit-scrollbar { width:5px; }',
'.spp-preview-pane::-webkit-scrollbar-thumb {',
'  background:var(--spu-border,#ddd); border-radius:3px;',
'}',
'.spp-preview-pane blockquote {',
'  border-left:3px solid var(--spu-accent,#C75B39);',
'  background:color-mix(in srgb,var(--spu-accent,#C75B39) 5%,transparent);',
'  padding:10px 16px; margin:12px 0; border-radius:0 6px 6px 0;',
'}',
'.spp-preview-pane pre {',
'  background:var(--spu-overlay,#F0EBE1); padding:12px 16px;',
'  border-radius:6px; overflow-x:auto;',
'  font-family:"SF Mono","Cascadia Code","Consolas",monospace; font-size:13px;',
'}',
'.spp-preview-pane ul, .spp-preview-pane ol { padding-left:24px; }',
'.spp-preview-pane table { border-collapse:collapse; margin:10px 0; }',
'.spp-preview-pane table td { border-top:1px solid var(--spu-border,#E8E3D8); border-left:1px solid var(--spu-border,#E8E3D8); padding:4px 10px; }',
'.spp-preview-pane .spp-pv-bq { border-left:3px solid var(--spu-border,#E8E3D8); padding:6px 12px; margin:10px 0; color:var(--spu-muted,#9B9489); }',
'.spp-preview-pane .spp-pv-media { display:inline-block; padding:6px 12px; margin:6px 0; border:1px dashed var(--spu-border,#E8E3D8); border-radius:6px; font-size:12px; color:var(--spu-muted,#9B9489); word-break:break-all; }',
'.spp-preview-pane .spp-pv-hr { border:0; border-top:1px solid var(--spu-border,#E8E3D8); margin:12px 0; }',
'.spp-preview-pane details {',
'  border:1px solid var(--spu-border,#E8E3D8); border-radius:6px;',
'  padding:8px 12px; margin:8px 0;',
'}',
'.spp-preview-pane details summary {',
'  cursor:pointer; color:var(--spu-accent,#C75B39);',
'  font-weight:600; font-size:13px;',
'}',
'.spp-preview-pane img { max-width:100%; border-radius:4px; }',
'html.spp-rdark .spp-preview-pane a {',
'  color:var(--spp-rk-link,#8ef0b8) !important;',
'  -webkit-text-fill-color:var(--spp-rk-link,#8ef0b8) !important;',
'}',
'.spp-preview-empty {',
'  text-align:center; color:var(--spu-muted,#9B9489);',
'  padding:40px 20px; font-size:14px;',
'}',
'.spp-preview-pane--live {',
'  display:block;',
'  min-height:56px;',
'  max-height:360px;',
'  overflow-y:auto;',
'  font-size:14px; line-height:1.8;',
'}',
'.spp-preview-pane--live::before {',
'  content:"实时预览";',
'  display:block; margin:0 0 8px; padding:0 0 6px;',
'  border-bottom:1px dashed var(--spu-border,#E8E3D8);',
'  color:var(--spu-muted,#9B9489); font-size:11px; letter-spacing:1px;',
'}',
'.spp-preview-pane--live .spp-preview-empty {',
'  padding:2px 0; text-align:left; font-size:12px;',
'}',
].join('\n'));
function tryAttach(attempt) {
if (attempt === undefined) attempt = 0;
const textarea = document.querySelector('textarea[name="atc_content"]');
if (!textarea) { if (attempt < 60) setTimeout(() => tryAttach(attempt + 1), 300); return; }
if (document.getElementById('spp-preview-btn')) return;
const submitBtn = document.querySelector('input[type="submit"][name="Submit"]');
const container = submitBtn ? submitBtn.parentElement : textarea.parentElement;
if (submitBtn && (SEARCH.indexOf('action-quote') >= 0 || SEARCH.indexOf('action-modify') >= 0)) {
const skin = [
['height', '24px'], ['padding', '0 14px'], ['border-radius', '999px'],
['border', '1px solid var(--spu-accent,#2f6f68)'],
['background-color', 'var(--spu-accent,#2f6f68)'], ['background-image', 'none'],
['color', '#ffffff'], ['-webkit-text-fill-color', '#ffffff'],
['font-size', '12px'], ['font-weight', '600'], ['font-family', 'inherit'],
['line-height', '1'], ['box-sizing', 'border-box'], ['text-shadow', 'none'],
['vertical-align', 'middle'], ['cursor', 'pointer'],
];
skin.forEach(function (kv) { try { submitBtn.style.setProperty(kv[0], kv[1], 'important'); } catch (_) {} });
}
const previewPane = document.createElement('div');
previewPane.className = 'spp-preview-pane';
previewPane.id = 'spp-preview-pane';
textarea.parentElement.insertBefore(previewPane, textarea.nextSibling);
let previewActive = false;
let composing = false;
let renderedSrc = null;
let timer = 0;
function paint() {
const raw = textarea.value.trim();
if (raw === renderedSrc) return;
renderedSrc = raw;
const keepTop = previewPane.scrollTop;
previewPane.innerHTML = raw
? bbcodeToHTML(raw)
: '<div class="spp-preview-empty">' + (LIVE ? '预览会随输入实时更新' : '没有内容可预览') + '</div>';
previewPane.scrollTop = keepTop;
}
function schedulePaint() {
if (!LIVE || !previewActive) return;
clearTimeout(timer);
timer = setTimeout(function () {
if (!composing) paint();
}, textarea.value.length > 50000 ? 800 : 200);
}
if (LIVE) {
previewPane.classList.add('spp-preview-pane--live');
textarea.addEventListener('input', schedulePaint);
textarea.addEventListener('beforeinput', schedulePaint);
textarea.addEventListener('compositionstart', function () { composing = true; });
textarea.addEventListener('compositionupdate', schedulePaint);
textarea.addEventListener('compositionend', function () { composing = false; schedulePaint(); });
textarea.addEventListener('paste', schedulePaint);
const restorePane = function () {
if (!previewActive) return;
if (textarea.offsetParent === null) { previewPane.style.display = 'none'; return; }
if (previewPane.style.display === 'none') previewPane.style.display = 'block';
};
textarea.addEventListener('focus', restorePane);
document.addEventListener('visibilitychange', function () { if (!document.hidden) restorePane(); });
document.addEventListener('click', function () { setTimeout(schedulePaint, 0); }, true);
document.addEventListener('keydown', function () { setTimeout(schedulePaint, 0); }, true);
setInterval(function () {
if (document.hidden || composing || !previewActive) return;
if (textarea.value.trim() !== renderedSrc) paint();
}, 2500);
}
const btn = document.createElement('button');
btn.id = 'spp-preview-btn';
btn.type = 'button';
btn.textContent = '👁 预览';
btn.title = 'BBCode 所见即所得预览 (Ctrl+Shift+P) — 内联切换';
btn.style.cssText = [
'margin-left:10px; padding:0 14px; height:24px; vertical-align:middle;',
'border:1px solid var(--spu-accent,#2f6f68);',
'border-radius:5px; background:var(--spu-surface,#fff);',
'color:var(--spu-accent,#2f6f68); font-size:12px; font-weight:600;',
'cursor:pointer; transition:all 0.2s ease; font-family:inherit;',
].join('');
btn.addEventListener('mouseenter', function() {
if (!previewActive) {
btn.style.background = 'var(--spu-accent,#C75B39)';
btn.style.color = '#fff';
}
});
btn.addEventListener('mouseleave', function() {
if (!previewActive) {
btn.style.background = 'var(--spu-surface,#fff)';
btn.style.color = 'var(--spu-accent,#C75B39)';
}
});
function setPaneVisible(on) {
previewActive = !!on;
if (previewActive) {
if (LIVE) {
previewPane.style.display = 'block';
paint();
} else {
previewPane.style.minHeight = textarea.offsetHeight + 'px';
textarea.style.display = 'none';
previewPane.style.display = 'block';
renderedSrc = null;
paint();
}
btn.textContent = LIVE ? '✕ 收起预览' : '✏ 编辑';
btn.style.background = 'var(--spu-accent,#C75B39)';
btn.style.color = '#fff';
btn.style.borderColor = 'var(--spu-accent,#C75B39)';
} else {
if (!LIVE) {
textarea.style.display = '';
textarea.focus();
}
previewPane.style.display = 'none';
btn.textContent = '👁 预览';
btn.style.background = 'var(--spu-surface,#fff)';
btn.style.color = 'var(--spu-accent,#C75B39)';
btn.style.borderColor = 'var(--spu-accent,#C75B39)';
}
window.dispatchEvent(new CustomEvent('spp-preview-toggle'));
}
function togglePreview() { setPaneVisible(!previewActive); }
btn.addEventListener('click', function(e) {
e.preventDefault();
togglePreview();
});
if (submitBtn) {
submitBtn.insertAdjacentElement('afterend', btn);
} else {
container.appendChild(btn);
}
document.addEventListener('keydown', function(e) {
if (e.ctrlKey && e.shiftKey && (e.key === 'P' || e.key === 'p')) {
const ta = document.querySelector('textarea[name="atc_content"]');
if (ta === document.activeElement || previewActive) {
e.preventDefault();
togglePreview();
}
}
});
if (LIVE) {
textarea.style.display = '';
setPaneVisible(true);
}
}
onDomReady(() => setTimeout(tryAttach, 500));
}
const SPP_TIP = (function () {
const STYLE_ID = 'spp-tip-style';
const BOX_ID = 'spp-tip-box';
let box = null;
let timer = null;
function style() {
if (document.getElementById(STYLE_ID)) return;
GM_addStyle(`
                #spp-tip-box {
                    position: fixed; z-index: 2147483000; display: none;
                    max-width: 340px; padding: 8px 12px; border-radius: 10px;
                    background: rgba(26,30,40,0.97); color: #F5F2EC;
                    font-family: 'Noto Sans SC','Source Han Sans SC','PingFang SC','Microsoft YaHei',sans-serif;
                    font-size: 12px; line-height: 1.6; letter-spacing: 0.01em; text-align: left;
                    white-space: normal; word-break: break-word;
                    border: 1px solid rgba(255,255,255,0.10);
                    box-shadow: 0 10px 28px rgba(0,0,0,0.30);
                    pointer-events: none;
                }
                #spp-tip-box.spp-tip-below::before {
                    content: ''; position: absolute; top: -5px; left: 50%; margin-left: -5px;
                    width: 10px; height: 10px; background: inherit; transform: rotate(45deg);
                    border-left: 1px solid rgba(255,255,255,0.10);
                    border-top: 1px solid rgba(255,255,255,0.10);
                }
                #spp-tip-box.spp-tip-above::after {
                    content: ''; position: absolute; bottom: -5px; left: 50%; margin-left: -5px;
                    width: 10px; height: 10px; background: inherit; transform: rotate(45deg);
                    border-right: 1px solid rgba(255,255,255,0.10);
                    border-bottom: 1px solid rgba(255,255,255,0.10);
                }
                #spp-tip-box .spp-tip-picwrap {
                    display: flex; align-items: center; justify-content: center;
                    width: var(--spp-tip-pic, 128px); height: var(--spp-tip-pic, 128px); margin: 0 auto 6px;
                    background: rgba(255,255,255,0.04);
                    border: 1px solid rgba(255,255,255,0.08);
                    border-radius: 8px; overflow: hidden;
                }
                #spp-tip-box .spp-tip-pic {
                    width: 100%; height: 100%; object-fit: contain;
                    display: block; border-radius: 6px;
                }
                #spp-tip-box > .spp-tip-picwrap:last-child { margin-bottom: 0; }
                #spp-tip-box.spp-tip-emoji {
                    max-width: 260px; padding: 5px 11px; border-radius: 999px;
                    font-size: 12px; font-weight: 600; letter-spacing: 0.02em;
                    background: linear-gradient(180deg, rgba(40,47,62,0.98), rgba(23,27,37,0.98));
                    border-color: rgba(255,255,255,0.16);
                    box-shadow: 0 6px 18px rgba(0,0,0,0.34);
                }
                #spp-tip-box.spp-tip-emoji.spp-tip-below::before,
                #spp-tip-box.spp-tip-emoji.spp-tip-above::after { background: rgba(23,27,37,0.98); }
                #spp-tip-namebox {
                    position: fixed; z-index: 2147483000; display: none;
                    max-width: 260px; padding: 5px 11px; border-radius: 999px;
                    background: linear-gradient(180deg, rgba(40,47,62,0.98), rgba(23,27,37,0.98));
                    border: 1px solid rgba(255,255,255,0.16);
                    box-shadow: 0 6px 18px rgba(0,0,0,0.34);
                    color: #F5F2EC;
                    font-family: 'Noto Sans SC','Source Han Sans SC','PingFang SC','Microsoft YaHei',sans-serif;
                    font-size: 12px; font-weight: 600; letter-spacing: 0.02em; line-height: 1.6;
                    text-align: left; white-space: normal; word-break: break-word;
                    pointer-events: none;
                }
                #spp-tip-namebox.spp-tip-below::before {
                    content: ''; position: absolute; top: -5px; left: 50%; margin-left: -5px;
                    width: 10px; height: 10px; background: rgba(23,27,37,0.98);
                    transform: rotate(45deg);
                    border-left: 1px solid rgba(255,255,255,0.16);
                    border-top: 1px solid rgba(255,255,255,0.16);
                }
                #spp-tip-namebox.spp-tip-above::after {
                    content: ''; position: absolute; bottom: -5px; left: 50%; margin-left: -5px;
                    width: 10px; height: 10px; background: rgba(23,27,37,0.98);
                    transform: rotate(45deg);
                    border-right: 1px solid rgba(255,255,255,0.16);
                    border-bottom: 1px solid rgba(255,255,255,0.16);
                }            `);
}
function node() {
if (box && box.isConnected) return box;
box = document.getElementById(BOX_ID);
if (!box) {
box = document.createElement('div');
box.id = BOX_ID;
document.body.appendChild(box);
}
return box;
}
let picWrap = null, picImg = null;
let nameBox = null;
function nameNode() {
if (nameBox && nameBox.isConnected) return nameBox;
nameBox = document.getElementById('spp-tip-namebox');
if (!nameBox) {
nameBox = document.createElement('div');
nameBox.id = 'spp-tip-namebox';
document.body.appendChild(nameBox);
}
return nameBox;
}
function picSrc(el) {
try {
if (!SPP_CONFIG.bool('spp_hover_preview', true)) return '';
} catch (e) { return ''; }
return (el && el.dataset && el.dataset.sppSrc) || '';
}
function hide() {
if (box) box.style.display = 'none';
if (nameBox) nameBox.style.display = 'none';
}        function place(el, variant) {
const text = el.getAttribute('data-spp-tip') || '';
const pic = picSrc(el);
if (!text && !pic) return;
const n = node();
n.className = '';
n.textContent = '';
if (pic) {
if (!picWrap) {
picWrap = document.createElement('span');
picWrap.className = 'spp-tip-picwrap';
picImg = document.createElement('img');
picImg.className = 'spp-tip-pic';
picImg.alt = '';
picWrap.appendChild(picImg);
}
picImg.src = pic;
n.appendChild(picWrap);
}
n.style.visibility = 'hidden';
n.style.display = 'block';
n.style.left = '0px';
const r = el.getBoundingClientRect();
placeCard(n, r, true);
const nb = nameNode();
if (text) {
nb.textContent = text;
placeCard(nb, r, false);
} else {
nb.style.display = 'none';
}
}
function placeCard(target, r, preferAbove) {
target.style.visibility = 'hidden';
target.style.display = 'block';
target.style.left = '0px';
target.style.top = '0px';
const w = target.offsetWidth;
const h = target.offsetHeight;
const left = Math.max(10, Math.min(r.left + r.width / 2 - w / 2, window.innerWidth - w - 10));
const roomAbove = (r.top - 10 - h) >= 8;
const roomBelow = (r.bottom + 10 + h) <= window.innerHeight - 8;
let above;
if (preferAbove) above = roomAbove ? true : (roomBelow ? false : true);
else above = roomBelow ? false : (roomAbove ? true : false);
target.className = above ? 'spp-tip-above' : 'spp-tip-below';
target.style.left = Math.round(left) + 'px';
const topWant = above ? Math.max(8, r.top - h - 10) : r.bottom + 10;
const topMax = Math.max(8, window.innerHeight - h - 8);
target.style.top = Math.round(Math.max(8, Math.min(topWant, topMax))) + 'px';
target.style.visibility = 'visible';
}        function attach(el, text) {
if (!el || !text) return el;
style();
el.setAttribute('data-spp-tip', text);
el.removeAttribute('title');
el.addEventListener('mouseenter', function () {
clearTimeout(timer);
timer = setTimeout(function () { place(el); }, 180);
});
el.addEventListener('mouseleave', function () { clearTimeout(timer); hide(); });
el.addEventListener('mousedown', function () { clearTimeout(timer); hide(); });
el.addEventListener('blur', hide);
return el;
}
if (!window.__SPP_TIP_BOUND__) {
window.__SPP_TIP_BOUND__ = true;
window.addEventListener('scroll', hide, true);
window.addEventListener('resize', hide, true);
}
function delegate(root, variant) {
if (!root || root.dataset.sppTipBound) return;
root.dataset.sppTipBound = '1';
style();
root.addEventListener('mouseover', function (e) {
const el = e.target && e.target.closest ? e.target.closest('[data-spp-tip],[data-spp-src]') : null;
if (!el || el === e.relatedTarget || el.contains(e.relatedTarget)) return;
clearTimeout(timer);
timer = setTimeout(function () { place(el, variant); }, 180);
});
root.addEventListener('mouseout', function (e) {
const el = e.target && e.target.closest ? e.target.closest('[data-spp-tip],[data-spp-src]') : null;
if (!el || el === e.relatedTarget || el.contains(e.relatedTarget)) return;
clearTimeout(timer);
hide();
});
}
return { attach: attach, delegate: delegate, hide: hide };
})();
(function initCatAxis() {
if (window.__sppCatAxisBound) return;
window.__sppCatAxisBound = 1;
let mode = 'h';
try { mode = SPP_CONFIG.pick('spp_cat_scroll', 'h', ['h', 'v']) === 'v' ? 'v' : 'h'; } catch (e) { mode = 'h'; }
if (mode === 'h') document.documentElement.classList.add('spp-cat-h');
GM_addStyle([
'html.spp-cat-h .spp-emoji-cats { width: 100% !important; max-width: 100% !important; min-width: 0 !important; box-sizing: border-box !important; }',
'html.spp-cat-h .spp-emoji-cats-track {',
'  width: 0 !important; min-width: 100% !important; box-sizing: border-box !important;',
'  flex-flow: column wrap !important;',
'  height: 84px !important;',
'  align-content: flex-start !important;',
'  overflow-x: auto !important;',
'  overflow-y: hidden !important;',
'  scrollbar-width: thin;',
'  scrollbar-color: var(--spu-border,#ddd) transparent;',
'}',
'html.spp-cat-h .spp-emoji-cats-track::-webkit-scrollbar { height: 4px; }',
'html.spp-cat-h .spp-emoji-cats-track::-webkit-scrollbar-thumb {',
'  background: var(--spu-border,#ddd); border-radius: 2px;',
'}',
'/* 不压缩:一轮到头那几枚被挤成半截反而更难认 */',
'html.spp-cat-h .spp-emoji-cat { flex: 0 0 auto !important; }',
].join('\n'));
function onCatWheel(e) {
if (mode !== 'h') return;
const host = e.target && e.target.closest ? e.target.closest('.spp-emoji-cats') : null;
if (!host) return;
const track = host.querySelector('.spp-emoji-cats-track') || host;
const d = e.deltaY || e.deltaX || 0;
if (!d) return;
e.preventDefault();
track.scrollLeft += d;
}
function bindCatWheel() {
const fs = document.querySelector('fieldset.spp-emoji-fieldset') || document.getElementById('smiliebox');
if (!fs) return false;
if (fs.dataset.sppCatWheel) return true;
fs.dataset.sppCatWheel = '1';
fs.addEventListener('wheel', onCatWheel, { passive: false });
return true;
}
if (!bindCatWheel()) {
let tries = 0;
const poll = setInterval(function () {
if (bindCatWheel() || ++tries > 40) clearInterval(poll);
}, 300);
}
})();
(function initTipPicSize() {
let n = 128;
try { n = SPP_CONFIG.num('spp_hover_preview_size', 128, 64, 320); } catch (e) { n = 128; }
if (!(n >= 64 && n <= 320)) n = 128;
n = Math.round(n);
document.documentElement.style.setProperty('--spp-tip-pic', n + 'px');
})();
(function initNameUi() {
const SCHEMES = ['sweep', 'neon', 'holo', 'code', 'line'];
let ui = 'sweep';
try { ui = SPP_CONFIG.pick('spp_name_ui', 'sweep', SCHEMES); } catch (e) { ui = 'sweep'; }
if (SCHEMES.indexOf(ui) < 0) ui = 'sweep';
document.documentElement.classList.add('spp-nui');
document.documentElement.classList.add('spp-nui-' + ui);
})();
(function initDateUi() {
const SCHEMES = ['sweep', 'neon', 'glass', 'neu', 'orbit'];
let ui = 'orbit';
try { ui = SPP_CONFIG.pick('spp_date_ui', 'orbit', SCHEMES); } catch (e) { ui = 'orbit'; }
if (SCHEMES.indexOf(ui) < 0) ui = 'orbit';
document.documentElement.classList.add('spp-dui');
document.documentElement.classList.add('spp-dui-' + ui);
})();
(function initReadUi() {
const SCHEMES = ['stamp', 'fluid', 'spine'];
let ui = 'stamp';
try { ui = SPP_CONFIG.pick('spp_read_ui', 'stamp', SCHEMES); } catch (e) { ui = 'stamp'; }
if (SCHEMES.indexOf(ui) < 0) ui = 'stamp';
const R = document.documentElement;
R.classList.add('spp-rui');
R.classList.add('spp-rui-' + ui);
let dim = false;
try { dim = SPP_CONFIG.bool('spp_read_dim', false); } catch (e) { dim = false; }
if (dim) R.classList.add('spp-rui-dim');
})();
(function initBountyUi() {
const SCHEMES = ['s1', 's2', 's3', 's4', 's5'];
let ui = 's1';
try { ui = SPP_CONFIG.pick('spp_bounty_ui', 's1', SCHEMES); } catch (e) { ui = 's1'; }
if (SCHEMES.indexOf(ui) < 0) ui = 's1';
const R = document.documentElement;
R.classList.add('spp-bbi');
R.classList.add('spp-bbi-' + ui);
const off = function (key, cls, dflt) {
let on = dflt;
try { on = SPP_CONFIG.bool(key, dflt); } catch (e) { on = dflt; }
if (!on) R.classList.add(cls);
};
off('spp_bounty_show_state', 'spp-bbi-hz', true);
off('spp_bounty_show_sp', 'spp-bbi-hs', true);
off('spp_bounty_time', 'spp-bbi-ht', false);
})();
(function initReadSvgAssets() {
const NS = 'http://www.w3.org/2000/svg';
const DEFS =
"<svg id='spp-rui-defs' xmlns='" + NS + "' style='position:absolute;width:0;height:0;overflow:hidden' aria-hidden='true'>" +
"<defs>" +
"<linearGradient id='sppStampEm' x1='0%' y1='0%' x2='100%' y2='100%'>" +
"<stop offset='0%' stop-color='#34d399'/><stop offset='100%' stop-color='#059669'/>" +
"</linearGradient>" +
"<filter id='sppStampShadow' x='-20%' y='-20%' width='140%' height='140%'>" +
"<feDropShadow dx='0' dy='1' stdDeviation='1.5' flood-color='#000000' flood-opacity='0.6'/>" +
"</filter>" +
"<linearGradient id='sppFluidFlow' x1='0%' y1='0%' x2='100%' y2='0%'>" +
"<stop offset='0%' stop-color='#047857' stop-opacity='0.3'/>" +
"<stop offset='60%' stop-color='#10b981'/>" +
"<stop offset='96%' stop-color='#34d399'/>" +
"<stop offset='100%' stop-color='#a7f3d0'/>" +
"</linearGradient>" +
"<filter id='sppLiquidGlow' x='-20%' y='-100%' width='140%' height='300%'>" +
"<feGaussianBlur stdDeviation='3.5' result='glow'/>" +
"<feMerge><feMergeNode in='glow'/><feMergeNode in='SourceGraphic'/></feMerge>" +
"</filter>" +
"<linearGradient id='sppSpineGrad' x1='0%' y1='0%' x2='0%' y2='100%'>" +
"<stop offset='0%' stop-color='#10b981'/><stop offset='50%' stop-color='#06b6d4'/>" +
"<stop offset='100%' stop-color='#8b5cf6'/>" +
"</linearGradient>" +
"<filter id='sppSpineBlur'><feGaussianBlur stdDeviation='2.5'/></filter>" +
"</defs>" +
"</svg>";
const STAMP =
"<svg class='spp-rui-svg spp-rui-svg-stamp' xmlns='" + NS + "' viewBox='0 0 200 200' overflow='visible' aria-hidden='true'>" +
"<g transform='rotate(-45 100 100)' stroke='#d32f2f' fill='#d32f2f' opacity='0.85'>" +
"<rect x='22' y='45' width='156' height='110' rx='14' ry='14' fill='none' stroke-width='4'/>" +
"<rect x='28' y='51' width='144' height='98' rx='10' ry='10' fill='none' stroke-width='1.5' stroke-dasharray='5 3'/>" +
"<path d='M48 100 L60 112 L82 86' fill='none' stroke-width='5' stroke-linecap='round' stroke-linejoin='round'/>" +
"<text x='124' y='106' font-family=\"'PingFang SC','Microsoft YaHei',sans-serif\" font-size='30' font-weight='900' text-anchor='middle' stroke='none' letter-spacing='4'>已读</text>" +
"<text x='124' y='128' font-family='Arial,sans-serif' font-size='10.5' font-weight='700' text-anchor='middle' stroke='none' letter-spacing='2'>PASSED</text>" +
"</g>" +
"</svg>";
const CONDUIT =
"<svg class='spp-rui-svg spp-rui-svg-conduit' xmlns='" + NS + "' viewBox='0 0 340 12' preserveAspectRatio='none' aria-hidden='true'>" +
"<rect x='0' y='4.5' width='340' height='2.5' rx='1.25' fill='#1b2133'/>" +
"<rect x='0' y='4.5' width='340' height='2.5' rx='1.25' fill='url(#sppFluidFlow)' filter='url(#sppLiquidGlow)'/>" +
"</svg>";
const LABEL =
"<svg class='spp-rui-svg spp-rui-svg-label' xmlns='" + NS + "' viewBox='0 0 120 14' aria-hidden='true'>" +
"<text x='120' y='10' text-anchor='end' font-size='8' font-weight='600' fill='#34d399' opacity='0.8'>FLUID \u2022 100% READ</text>" +
"</svg>";
const DROP =
"<svg class='spp-rui-svg spp-rui-svg-drop' xmlns='" + NS + "' viewBox='0 0 14 14' aria-hidden='true'>" +
"<circle cx='7' cy='7' r='5' fill='#10b981' filter='url(#sppLiquidGlow)'/>" +
"<circle cx='7' cy='7' r='2.2' fill='#ecfdf5'/>" +
"</svg>";
const SPINE =
"<svg class='spp-rui-svg spp-rui-svg-spine' xmlns='" + NS + "' viewBox='0 0 6 136' preserveAspectRatio='none' aria-hidden='true'>" +
"<rect x='1' y='0' width='3.5' height='136' rx='1.75' fill='url(#sppSpineGrad)' opacity='0.7' filter='url(#sppSpineBlur)'/>" +
"<rect x='1' y='0' width='3' height='136' rx='1.5' fill='url(#sppSpineGrad)'/>" +
"</svg>";
function ui() {
try { return SPP_CONFIG.pick('spp_read_ui', 'stamp', ['stamp', 'fluid', 'spine']); } catch (e) { return 'stamp'; }
}
function zoneOn() {
try { return readScopeOn(); } catch (e) { return true; }
}
function ensureDefs() {
if (document.getElementById('spp-rui-defs')) return;
if (!document.body) return;
document.body.insertAdjacentHTML('beforeend', DEFS);
}
function isRead(li) { return !!li.classList.contains('spp-st-hasread'); }   
const STAMP_W = 84, STAMP_H = 84;
function placeStamp(li, title) {
try {
const a = title.querySelector('a') || title;
const inner = li.querySelector(':scope > .inner') || li;
const sb = title.getBoundingClientRect();
const ib = inner.getBoundingClientRect();
let tb = null;
try {
const r = document.createRange();
r.selectNodeContents(a);
tb = r.getBoundingClientRect();
} catch (e) { tb = null; }
if (!tb || !tb.width) tb = a.getBoundingClientRect();
const half = STAMP_W / 2, halfV = STAMP_H / 2;
const loX = Math.round(ib.left - sb.left) + half;
const hiX = Math.round(ib.right - sb.left) - half;
const want = Math.round((tb.left - sb.left) + tb.width * 1.2);
const x = (hiX >= loX) ? Math.max(loX, Math.min(hiX, want)) : Math.round((loX + hiX) / 2);
const loY = Math.round(ib.top - sb.top) + halfV;
const hiY = Math.round(ib.bottom - sb.top) - halfV;
const wantY = Math.round((tb.top - sb.top) + tb.height / 2);
const y = (hiY >= loY) ? Math.max(loY, Math.min(hiY, wantY)) : Math.round((loY + hiY) / 2);
li.style.setProperty('--spp-rui-stamp-x', x + 'px');
li.style.setProperty('--spp-rui-stamp-y', y + 'px');
} catch (e) {  }
}
function replaceStamps() {
Array.prototype.forEach.call(document.querySelectorAll('#wall ul.stream > li[data-spp-ruisvg=\'stamp\']'), function (li) {
const t = li.querySelector(':scope > .inner > .section-title') || li.querySelector('.section-title');
if (t) placeStamp(li, t);
});
}
let stampResizeT = null;
window.addEventListener('resize', function () {
if (stampResizeT) clearTimeout(stampResizeT);
stampResizeT = setTimeout(replaceStamps, 220);
});
function inject(li) {
const inner = li.querySelector(':scope > .inner') || li.querySelector('.inner');
if (!inner) return 0;
const title = inner.querySelector(':scope > .section-title');
const meta = inner.querySelector(':scope > .spp-card-meta');
if (!title || !meta) return 0;
if (li.getAttribute('data-spp-ruisvg') === ui()) return 1;
Array.prototype.forEach.call(li.querySelectorAll('.spp-rui-svg'), function (n) {
if (n.parentNode) n.parentNode.removeChild(n);
});
li.removeAttribute('data-spp-ruisvg');
const which = ui();
if (which === 'stamp') {
title.insertAdjacentHTML('beforeend', STAMP);
placeStamp(li, title);
} else if (which === 'fluid') {
meta.insertAdjacentHTML('beforeend', CONDUIT);
meta.insertAdjacentHTML('beforeend', DROP);
meta.insertAdjacentHTML('beforeend', LABEL);
} else {
const box = inner.getBoundingClientRect();
const tb = title.getBoundingClientRect();
const mb = meta.getBoundingClientRect();
const top = Math.max(0, Math.round(tb.top - box.top));
const h = Math.max(24, Math.round(mb.bottom - tb.top));
inner.insertAdjacentHTML('beforeend',
"<div class='spp-rui-spinewrap' style='position:absolute;left:0;top:" + top + "px;height:" + h + "px;width:6px'>" + SPINE + "</div>");
}
li.setAttribute('data-spp-ruisvg', which);
return 1;
}
function sweep() {
if (!zoneOn()) return 0;
ensureDefs();
let n = 0;
Array.prototype.forEach.call(document.querySelectorAll('#wall ul.stream > li'), function (li) {
if (!isRead(li)) return;
n += inject(li);
});
return n;
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', function () { setTimeout(sweep, 600); });
} else {
setTimeout(sweep, 600);
}
if (document.body) {
let t = null;
new MutationObserver(function () {
if (t) return;
t = setTimeout(function () { t = null; sweep(); }, 400);
}).observe(document.getElementById('wall') || document.body, { childList: true, subtree: true });
}
window.__sppRuiSweep = sweep;
})();
function initEditorToolbar() {
const KEY = 'spp_editor_toolbar';
let enabled = SPP_CONFIG.bool(KEY, true);
if (!enabled) return;
if (!WANTS.editorUi) return;
const MARK_ON = SPP_CONFIG.bool('spp_host_mark', false);
const SELF_IMG = true;
const COLOR_PRESETS = [
'#FF0000','#FF4500','#FF6600','#FF8C00','#FFA500',
'#FFD700','#FFFF00','#ADFF2F','#00FF00','#00FA9A',
'#00CED1','#00BFFF','#1E90FF','#0000FF','#8A2BE2',
'#9400D3','#FF00FF','#FF1493','#DC143C','#FF69B4',
'red','blue','green','orange','purple','brown',
'teal','navy','maroon','gray','darkred','darkblue',
'#FFFFFF','#F5F5F5','#D3D3D3','#A9A9A9','#808080','#696969','#2F4F4F','#000000',
];
const IMG_HOSTS_BUILTIN = [
{ name: '厘图片', site: 'https://tupian.li/', hosts: ['tupian.li'] },
{ name: '猫箱', site: 'https://catbox.moe/', hosts: ['catbox.moe'] },
{ name: 'Inari', site: 'https://up.inari.site/', hosts: ['inari.site'] },
{ name: 'Ipfs', site: 'https://beta.fileverse.io/', hosts: ['fileverse.io'] },
{ name: 'Filegarden', site: 'https://filegarden.com/', hosts: ['filegarden.com'] },
{ name: 'Urusai', site: 'https://urusai.cc/', hosts: ['urusai.cc'] },
];
const IMG_HOSTS = IMG_HOSTS_BUILTIN.concat(SPP_CUSTOM_HOSTS.list);
const IMG_HOSTS_LOOKUP = SPP_CUSTOM_HOSTS.list.concat(IMG_HOSTS_BUILTIN);
const BUTTON_GROUPS = [
{
label: '基础文本格式',
buttons: [
{ label: 'B',  title: '粗体 [b]文字[/b]',              tag: 'b' },
{ label: 'I',  title: '斜体 [i]文字[/i]',              tag: 'i' },
{ label: 'U',  title: '下划线 [u]文字[/u]',            tag: 'u' },
{ label: 'S',  title: '删除线 [strike]文字[/strike]',   tag: 'strike' },   
{ label: '字色', title: '字体颜色 (色板选色)',           tag: 'color', type: 'color' },
{ label: '背景色', title: '背景颜色 (色板选色)',           tag: 'backcolor', type: 'backcolor' },
{ label: '字号', title: '字号 [size=4][/size](默认 4 号;点完光标就在标签里,直接打字即可 —— 要改号数把光标移到那个 4 上,1–6 有效)', tag: 'size', param: '4', cursor: 6, body: true },
{ label: '标题 ▾', title: '标题格式 —— 六档:标题1 最大 [size=6][b]文字[/b][/size] 依次到 标题6 最小 [size=1][b]文字[/b][/size]。框里选中了文字就直接套上去;没选中就插一对空标签、光标落在中间', tag: 'size', type: 'heading' },
{ label: '字体', title: '字体选择 (选项表)',             tag: 'font', type: 'font' },
{ label: '水平线', title: '插入水平线 [hr]',                tag: 'hr', type: 'self' },
{ label: '上标', title: '上标 [sup][/sup]',                     tag: 'sup' },
{ label: '下标', title: '下标 [sub][/sub]',                     tag: 'sub' },
]
},
{
label: '段落与布局',
buttons: [
{ label: '左',   title: '居左 [align=left][/align]',            tag: 'align=left' },
{ label: '中',   title: '居中 [align=center][/align]',          tag: 'align=center' },
{ label: '右',   title: '居右 [align=right][/align]',           tag: 'align=right' },
{ label: '表',   title: '插入表格 —— 右边三个框依次是「行 × 列 宽」:宽填 400 就是 400px、填 50% 就是 50%、留空则用站点默认(98%);格子里的占位按列字母+行号铺(A1、B1、A2…)', tag: 'table', type: 'table-ui' },
{ label: '引文', title: '引用 [quote][/quote](站点那枚带「引用」标题的灰框)', tag: 'quote' },
{ label: '块引', title: '块引用 [blockquote][/blockquote](不带标题的朴素缩进块 —— 站点原生编辑器里那枚「增加缩进」就是它)', tag: 'blockquote' },
{ label: '码',   title: '代码块 [code][/code]',                  tag: 'code' },
{ label: '飞',   title: '跑马灯·来回 [fly][/fly](服务端吐 marquee behavior=alternate,宽度撑满)', tag: 'fly' },
{ label: '移',   title: '跑马灯·单向右滚 [move][/move](服务端吐 marquee,没有 alternate)', tag: 'move' },
]
},
{
label: '列表',
buttons: [
{ sub: '有序列表' },
{ label: '1. 空行列表', title: '有序列表(条目之间空一行):[list=1] + 每行一条 [li]条目[/li]', tag: 'list', type: 'list', list: 'ol', loose: true },
{ label: '1. 空行条目', title: '加一条并换行:[li]条目[/li] + 换行 —— 接着写的下一条就和它分开(条目之间空一行)', tag: 'list', type: 'item', list: 'ol', loose: true },
{ label: '1. 紧排列表', title: '有序列表(条目紧挨着、一个空行都没有):[list=1][li]条目[/li][/list] 一行到底', tag: 'list', type: 'list', list: 'ol', loose: false },
{ label: '1. 紧排条目', title: '加一条但不换行:[li]条目[/li] —— 光标停在它后面,再点一次就是紧挨着的一条', tag: 'list', type: 'item', list: 'ol', loose: false },
{ brk: '无序列表', relabel: true },
{ label: '• 空行列表', title: '无序列表(条目之间空一行):[list] + 每行一条 [li]条目[/li]', tag: 'list', type: 'list', list: 'ul', loose: true },
{ label: '• 空行条目', title: '加一条并换行:[li]条目[/li] + 换行(无序列表里同样用它)', tag: 'list', type: 'item', list: 'ul', loose: true },
{ label: '• 紧排列表', title: '无序列表(条目紧挨着、一个空行都没有):[list][li]条目[/li][/list] 一行到底', tag: 'list', type: 'list', list: 'ul', loose: false },
{ label: '• 紧排条目', title: '加一条但不换行:[li]条目[/li](无序列表里同样用它)', tag: 'list', type: 'item', list: 'ul', loose: false },
]
},
{
label: '链接与媒体',
buttons: [
{ label: '链',   title: '链接 [url]https://...[/url]',               tag: 'url', type: 'link' },
{ label: '链文', title: '带文字链接 [url=https://...]文字[/url]',     tag: 'url', type: 'link-text' },
{ label: '邮',   title: '邮箱 [email][/email]',                       tag: 'email' },
{ label: '图',   title: '插入图片 [img][/img]',                       tag: 'img' },
{ label: '媒 ▾', title: '插入媒体', tag: 'media', type: 'media' },
{ label: '标', title: '自动为所有超链接添加图床标签', tag: 'hostmark', type: 'annotate' },
{ label: '图床 ▾', title: '图床快捷跳转 —— 点开选一个图床,点一下即在新标签页打开(' +
IMG_HOSTS.map(function (h) { return h.name; }).join(' / ') + ')', tag: 'hosts', type: 'hosts' },
]
},
];
let activePopover = null;
let popoverDocCloser = null;
function closePopover() {
if (popoverDocCloser) {
document.removeEventListener('click', popoverDocCloser);
popoverDocCloser = null;
}
if (activePopover) { activePopover.remove(); activePopover = null; }
}
function armPopoverClose() {
if (popoverDocCloser) {
document.removeEventListener('click', popoverDocCloser);
popoverDocCloser = null;
}
popoverDocCloser = function (ev) {
if (activePopover && activePopover.contains(ev.target)) return;
closePopover();
};
setTimeout(function () { document.addEventListener('click', popoverDocCloser); }, 0);
}
function splitSelEdge(raw) {
let a = 0, b = raw.length;
while (a < b && /\s/.test(raw.charAt(a))) a++;
while (b > a && /\s/.test(raw.charAt(b - 1))) b--;
if (a >= b) return { lead: '', core: raw, trail: '' };
return { lead: raw.slice(0, a), core: raw.slice(a, b), trail: raw.slice(b) };
}
function insertTag(textarea, tag, param, cursorInOpen, bodyCaret) {
const s = textarea.selectionStart;
const e = textarea.selectionEnd;
const parts = splitSelEdge(textarea.value.substring(s, e));
const sel = parts.core;
const openTag = param != null ? '[' + tag + '=' + param + ']' : '[' + tag + ']';
const closeTag = '[/' + tag.replace(/=.*$/, '') + ']';
textarea.value = textarea.value.substring(0, s) + parts.lead + openTag + (sel || '') + closeTag + parts.trail + textarea.value.substring(e);
if (cursorInOpen != null && !bodyCaret) {
const start = s + parts.lead.length + cursorInOpen;
const end = start + String(param).length;
textarea.setSelectionRange(start, end);
} else if (sel) {
const at = s + parts.lead.length + openTag.length;
textarea.setSelectionRange(at, at + sel.length);
} else {
const at = s + parts.lead.length + openTag.length;
textarea.setSelectionRange(at, at);
}
textarea.focus();
}
function insertSelfTag(textarea, tag) {
const s = textarea.selectionStart;
const e = textarea.selectionEnd;
const tagStr = '[' + tag + ']';
textarea.value = textarea.value.substring(0, s) + tagStr + textarea.value.substring(e);
textarea.setSelectionRange(s + tagStr.length, s + tagStr.length);
textarea.focus();
}
function buildColorPopover(btn, textarea, tag) {
closePopover();
const popover = document.createElement('div');
popover.className = 'spp-color-popover';
popover.style.cssText = [
'position:absolute; z-index:100003;',
'background:var(--spu-surface,#fff);',
'border:1px solid var(--spu-border,#e0e0e0);',
'border-radius:8px; padding:10px;',
'box-shadow:0 8px 32px rgba(0,0,0,0.18);',
'display:grid; grid-template-columns:repeat(10,26px); gap:4px;',
'max-width:320px;',
].join('');
COLOR_PRESETS.forEach(hex => {
const swatch = document.createElement('div');
swatch.style.cssText = [
'width:26px; height:26px; border-radius:4px; cursor:pointer;',
'border:2px solid transparent; transition:transform 0.1s,border-color 0.1s;',
'background:' + hex + ';',
hex === '#FFFFFF' ? 'border:1px solid #ccc;' : '',
].join('');
swatch.addEventListener('mouseenter', () => { swatch.style.transform = 'scale(1.18)'; swatch.style.borderColor = 'var(--spu-accent,#C75B39)'; });
swatch.addEventListener('mouseleave', () => { swatch.style.transform = 'scale(1)'; swatch.style.borderColor = 'transparent'; });
swatch.addEventListener('click', e => { e.stopPropagation(); insertTag(textarea, tag, hex); closePopover(); });
popover.appendChild(swatch);
});
const sep = document.createElement('div');
sep.style.cssText = 'grid-column:1/-1; height:1px; background:var(--spu-border,#eee); margin:4px 0;';
popover.appendChild(sep);
const pickerRow = document.createElement('div');
pickerRow.style.cssText = 'grid-column:1/-1; display:flex; align-items:center; gap:6px;';
const picker = document.createElement('input');
picker.type = 'color'; picker.value = '#FF6600';
picker.style.cssText = 'width:28px; height:24px; border:none; cursor:pointer; padding:0; background:none;';
const pickerLabel = document.createElement('span');
const labelText = tag === 'backcolor' ? '取色器 (自定义背景色)' : '取色器 (自定义颜色)';
pickerLabel.textContent = labelText;
pickerLabel.style.cssText = 'font-size:11px; color:var(--spu-muted,#999); cursor:pointer;';
pickerRow.appendChild(picker); pickerRow.appendChild(pickerLabel);
pickerRow.addEventListener('click', () => picker.click());
picker.addEventListener('input', () => { insertTag(textarea, tag, picker.value); closePopover(); });
picker.addEventListener('click', e => e.stopPropagation());
popover.appendChild(pickerRow);
armPopoverClose();
activePopover = popover;
return popover;
}
const FONT_OPTIONS = [
'宋体', '仿宋', '黑体', '楷体', '微软雅黑',
'Arial', 'Verdana', 'Tahoma', 'Times New Roman', 'Georgia',
];
function buildFontPopover(btn, textarea) {
closePopover();
const popover = document.createElement('div');
popover.className = 'spp-font-popover';
popover.style.cssText = [
'position:absolute; z-index:100003;',
'background:var(--spu-surface,#fff);',
'border:1px solid var(--spu-border,#e0e0e0);',
'border-radius:8px; padding:6px;',
'box-shadow:0 8px 32px rgba(0,0,0,0.18);',
'display:flex; flex-direction:column; gap:2px;',
'min-width:140px;',
].join('');
FONT_OPTIONS.forEach(name => {
const item = document.createElement('div');
item.textContent = name;
item.style.cssText = [
'padding:6px 10px; font-size:13px; cursor:pointer; border-radius:4px;',
'font-family:' + name + ';',
'transition:background 0.12s;',
].join('');
item.addEventListener('mouseenter', () => { item.style.background = 'var(--spu-hover,#f0ebe1)'; });
item.addEventListener('mouseleave', () => { item.style.background = 'transparent'; });
item.addEventListener('click', e => {
e.stopPropagation();
insertTag(textarea, 'font', name);
closePopover();
});
popover.appendChild(item);
});
armPopoverClose();
activePopover = popover;
return popover;
}
const SPP_URL_RE = /https?:\/\/[^\s<>"'【】\u3000-\u303f\u4e00-\u9fff\u3040-\u30ff\uff00-\uffef]+/g;
const SPP_OPEN_TAG_RE = /\[(?:img|media|url|email|flash|wmv|rm)(?:=[^\]]*)?\]?\s*$/i;
const SPP_BARE_RE = /(^|[^0-9A-Za-z_@.\/-])((?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,})((?::\d{2,5})?(?:\/[^\s<>"'【】\u3000-\u303f\u4e00-\u9fff\u3040-\u30ff\uff00-\uffef]*)?)/gi;
const SPP_TLDS = ('com net org edu gov mil int info biz name pro aero coop museum io co me tv cc li moe '
+ 'cn tw hk jp kr sg my th vn ph id in pk au nz uk de fr nl be it es pt se no dk fi is ie ch at pl cz sk hu ro bg gr tr ru ua by kz il sa ae eg za br mx ar cl pe us ca gg la ly to ws pw ne nu tk ml ga cf st su ac sh im '
+ 'top site space xyz club online store shop app dev tech art design live life world today news blog pub win bid loan icu vip wang ren kim work link click press host cloud fun website company network wiki media agency digital studio software mobile tools email zone center city plus love one')
.split(' ');
const SPP_SELF_HOSTS = ['blue-plus.net', 'south-plus.net', 'south-plus.org', 'north-plus.net', 'east-plus.net', 'white-plus.net', 'level-plus.net', 'spring-plus.net', 'summer-plus.net', 'snow-plus.net', 'soul-plus.net', 'imoutolove.me'];
const SPP_IMG_EXT_RE = /\.(?:jpe?g|png|gif|webp|bmp|avif)$/i;
const SPP_FILE_EXT_RE = /\.(?:zip|rar|7z|mp4|webm|mkv|txt|pdf)$/i;
function sppSelfKind(url) {
let u;
try { u = new URL(sppAbsUrl(url), location.href); } catch (e) { return ''; }
const h = u.hostname.toLowerCase().replace(/^www\./, '');
let self = false;
for (let i = 0; i < SPP_SELF_HOSTS.length; i++) {
const d = SPP_SELF_HOSTS[i];
if (h === d || h.slice(-(d.length + 1)) === '.' + d) { self = true; break; }
}
if (!self) return '';
const p = u.pathname.toLowerCase();
if (SPP_IMG_EXT_RE.test(p)) return 'img';
if (p.indexOf('/attachment/') >= 0 || p.indexOf('/thumb/') >= 0 || SPP_FILE_EXT_RE.test(p)) return 'self';
return '';            
}
function sppImgLink(url) {
let u;
try { u = new URL(sppAbsUrl(url), location.href); } catch (e) { return false; }
return SPP_IMG_EXT_RE.test(u.pathname);
}
const SPP_MULTI_SUFFIX = [
'co.uk', 'org.uk', 'me.uk', 'ac.uk', 'gov.uk', 'com.cn', 'net.cn', 'org.cn', 'gov.cn', 'edu.cn',
'com.tw', 'org.tw', 'com.hk', 'com.au', 'co.jp', 'co.kr', 'com.sg', 'com.my', 'com.br', 'com.mx',
'pages.dev', 'github.io', 'gitlab.io', 'netlify.app', 'vercel.app', 'web.app', 'workers.dev',
'firebaseapp.com', 'blogspot.com', 'herokuapp.com', 'onrender.com', 'glitch.me', 'repl.co',
'cloudfront.net', 's3.amazonaws.com', 'r2.dev', 'nyc.mn'
];
function siteNameOfHost(host) {
const h = String(host || '').toLowerCase().replace(/\.$/, '');
if (!h) return '';
if (/^\d{1,3}(\.\d{1,3}){3}$/.test(h) || h.indexOf(':') >= 0) return h;
const parts = h.split('.');
if (parts.length < 2) return h;
const last2 = parts.slice(-2).join('.');
const keep = (SPP_MULTI_SUFFIX.indexOf(last2) >= 0 && parts.length >= 3)
? parts[parts.length - 3]
: parts[parts.length - 2];
const clean = String(keep || '').replace(/[^a-z0-9-]/g, '');
if (!clean) return h;
return clean.charAt(0).toUpperCase() + clean.slice(1);
}
function sppAbsUrl(url) {
return /^[a-z][a-z0-9+.-]*:\/\//i.test(url) ? url : 'https://' + url;
}
function markNameOf(url) {
const hit = imgHostOf(url);
if (hit) return hit.name;
let host = '';
try { host = new URL(sppAbsUrl(url), location.href).hostname; } catch (e) { return ''; }
return siteNameOfHost(host);
}
function imgHostOf(url) {
let host = '';
try { host = new URL(sppAbsUrl(url), location.href).hostname.toLowerCase(); } catch (e) { return null; }
if (!host) return null;
host = host.replace(/^www\./, '');
for (let i = 0; i < IMG_HOSTS_LOOKUP.length; i++) {
const h = IMG_HOSTS_LOOKUP[i];
for (let j = 0; j < h.hosts.length; j++) {
const d = h.hosts[j];
if (host === d || host.slice(-(d.length + 1)) === '.' + d) return h;
}
}
return null;
}
function annotateHostMark(ta, stats) {
const src = ta.value || '';
if (!src) return 0;
const spans = [];
const taken = [];
let m;
SPP_URL_RE.lastIndex = 0;
while ((m = SPP_URL_RE.exec(src)) !== null) {
spans.push({ pos: m.index, url: m[0] });
taken.push([m.index, m.index + m[0].length]);
}
const inTaken = function (at) {
for (let i = 0; i < taken.length; i++) {
if (at >= taken[i][0] && at < taken[i][1]) return true;
}
return false;
};
SPP_BARE_RE.lastIndex = 0;
while ((m = SPP_BARE_RE.exec(src)) !== null) {
const pos = m.index + m[1].length;
if (inTaken(pos)) continue;
if (SPP_TLDS.indexOf(m[2].slice(m[2].lastIndexOf('.') + 1).toLowerCase()) < 0) continue;
spans.push({
pos: pos,
url: (m[2] + (m[3] || '')).replace(/[.,;:!?\u3001\u3002\uff0c\uff1b\uff1a]+$/, ''),
});
}
if (!spans.length) { if (stats) { stats.none = 1; } return 0; }
spans.sort(function (a, b) { return a.pos - b.pos; });
const skip = { marked: 0, tag: 0, code: 0, attr: 0, self: 0 };
const marks = [];
let out = '', last = 0, adds = 0, rms = 0, wraps = 0;
for (let i = 0; i < spans.length; i++) {
const sp = spans[i];
if (sp.pos < last) continue;
out += src.slice(last, sp.pos);
const cut = src.slice(0, sp.pos).replace(/[ \t\u3000]+$/, '');
const name = markNameOf(sp.url);
const tag = name ? '【' + name + '】' : '';
const hasTag = !!name && cut.slice(-tag.length) === tag;
const selfKind = sppSelfKind(sp.url);
const isImg = selfKind === 'img' || sppImgLink(sp.url);
const wantWrap = isImg && SELF_IMG;
let why = '';
if (!name && !wantWrap) why = 'n';                               
else if (SPP_OPEN_TAG_RE.test(cut)) why = 'tag';                 
else if (cut.lastIndexOf('[code]') > cut.lastIndexOf('[/code]')) why = 'code';
else if (cut.lastIndexOf('<') > cut.lastIndexOf('>')) why = 'attr';   
const staleTag = hasTag && isImg && !why;
if (staleTag) {
out = out.slice(0, out.length - tag.length);
marks.push({ at: out.length, len: -tag.length });
rms++;
if (wantWrap) { marks.push({ at: out.length, len: 5 }); out += '[img]'; wraps++; }
} else if (hasTag) {
skip.marked++;
} else if (why) {
if (why !== 'n') skip[why]++;
} else if (selfKind === 'self' || (isImg && !wantWrap)) {
skip.self++;
} else if (wantWrap) {
marks.push({ at: out.length, len: 5 });
out += '[img]';
wraps++;
} else {
marks.push({ at: out.length, len: tag.length });
out += tag;
adds++;
}
out += src.slice(sp.pos, sp.pos + sp.url.length);
if (wantWrap && !why) { marks.push({ at: out.length, len: 6 }); out += '[/img]'; }
last = sp.pos + sp.url.length;
}
out += src.slice(last);
if (stats) { stats.skip = skip; stats.removed = rms; stats.wrapped = wraps; }
if (!adds && !rms && !wraps) return 0;
const s = ta.selectionStart, e = ta.selectionEnd;
ta.value = out;
const shift = function (p) {
let d = 0;
for (let i = 0; i < marks.length; i++) { if (marks[i].at < p) d += marks[i].len; }
return p + d;
};
try { ta.setSelectionRange(shift(s), shift(e)); } catch (err) { }
return adds;
}
function openSite(url) {
try { if (window.open(url, '_blank', 'noopener')) return; } catch (e) { }
const a = document.createElement('a');
a.href = url;
a.target = '_blank';
a.rel = 'noopener noreferrer';
document.body.appendChild(a);
a.click();
a.parentNode.removeChild(a);
}
const HEADING_LEVELS = [
{ lv: 1, size: 6, label: '标题 1' },
{ lv: 2, size: 5, label: '标题 2' },
{ lv: 3, size: 4, label: '标题 3' },
{ lv: 4, size: 3, label: '标题 4' },
{ lv: 5, size: 2, label: '标题 5' },
{ lv: 6, size: 1, label: '标题 6' }
];
function insertHeading(textarea, size) {
const s = textarea.selectionStart;
const e = textarea.selectionEnd;
const parts = splitSelEdge(textarea.value.substring(s, e));
const sel = parts.core;
const open = '[size=' + size + '][b]';
const close = '[/b][/size]';
textarea.value = textarea.value.substring(0, s) + parts.lead + open + sel + close + parts.trail + textarea.value.substring(e);
const at = s + parts.lead.length + open.length;
if (sel) textarea.setSelectionRange(at, at + sel.length);
else textarea.setSelectionRange(at, at);
textarea.focus();
}
function buildHeadingPopover(textarea) {
closePopover();
const popover = document.createElement('div');
popover.className = 'spp-heading-popover';
popover.style.cssText = [
'position:absolute; z-index:100003;',
'background:var(--spu-surface,#fff);',
'border:1px solid var(--spu-border,#e0e0e0);',
'border-radius:8px; padding:6px;',
'box-shadow:0 8px 32px rgba(0,0,0,0.18);',
'display:flex; flex-direction:column; gap:2px;',
'min-width:190px;',
].join('');
HEADING_LEVELS.forEach(function (h) {
const item = document.createElement('div');
item.style.cssText = [
'display:flex; align-items:baseline; gap:10px;',
'padding:6px 10px; cursor:pointer; border-radius:4px;',
'transition:background 0.12s;',
].join('');
const nm = document.createElement('span');
nm.textContent = h.label;
nm.style.cssText = 'font-weight:700; color:var(--spu-text,#333); font-size:' + (18 - h.lv * 1.4) + 'px;';
const code = document.createElement('span');
code.textContent = 'size=' + h.size;
code.style.cssText = 'margin-left:auto; font-family:Consolas,Menlo,monospace; font-size:11px; color:var(--spu-muted,#9B9489);';
item.appendChild(nm);
item.appendChild(code);
item.addEventListener('mouseenter', function () { item.style.background = 'var(--spu-hover,#f0ebe1)'; });
item.addEventListener('mouseleave', function () { item.style.background = 'transparent'; });
item.addEventListener('click', function (ev) {
ev.stopPropagation();
closePopover();
insertHeading(textarea, h.size);
});
popover.appendChild(item);
});
armPopoverClose();
activePopover = popover;
return popover;
}
function buildHostPopover() {
closePopover();
const popover = document.createElement('div');
popover.className = 'spp-host-popover';
popover.style.cssText = [
'position:absolute; z-index:100003;',
'background:var(--spu-surface,#fff);',
'border:1px solid var(--spu-border,#e0e0e0);',
'border-radius:8px; padding:6px;',
'box-shadow:0 8px 32px rgba(0,0,0,0.18);',
'display:flex; flex-direction:column; gap:2px;',
'min-width:180px;',
].join('');
IMG_HOSTS.forEach(function (h) {
const item = document.createElement('div');
item.style.cssText = [
'display:flex; align-items:baseline; gap:8px;',
'padding:6px 10px; font-size:13px; cursor:pointer; border-radius:4px;',
'transition:background 0.12s;',
].join('');
const nm = document.createElement('span');
nm.textContent = h.name;
nm.style.cssText = 'font-weight:600; color:var(--spu-text,#333);';
const dm = document.createElement('span');
dm.textContent = h.site.replace(/^https?:\/\//, '').replace(/\/$/, '');
dm.style.cssText = 'margin-left:auto; font-size:11px; color:var(--spu-muted,#9B9489);';
item.appendChild(nm);
item.appendChild(dm);
item.addEventListener('mouseenter', function () { item.style.background = 'var(--spu-hover,#f0ebe1)'; });
item.addEventListener('mouseleave', function () { item.style.background = 'transparent'; });
item.addEventListener('click', function (e) {
e.stopPropagation();
closePopover();
openSite(h.site);
});
popover.appendChild(item);
});
armPopoverClose();
activePopover = popover;
return popover;
}
const MEDIA_KINDS = [
{ label: 'Flash 动画', tag: 'flash', dim: true,  note: '[flash=长,宽,自动]' },
{ label: '视频 (wmv)', tag: 'wmv',   dim: true,  note: '[wmv=长,宽,自动]' },
{ label: '音频 (mp3)', tag: 'wmv',   dim: false, note: '[wmv=自动]' },
{ label: '音乐 (rm)',  tag: 'rm',    dim: true,  note: '[rm=长,宽,自动]' },
];
function buildMediaPopover(btn, textarea) {
closePopover();
const popover = document.createElement('div');
popover.className = 'spp-media-popover';
popover.style.cssText = [
'position:absolute; z-index:100003;',
'background:var(--spu-surface,#fff);',
'border:1px solid var(--spu-border,#e0e0e0);',
'border-radius:8px; padding:8px;',
'box-shadow:0 8px 32px rgba(0,0,0,0.18);',
'display:flex; flex-direction:column; gap:5px;',
'min-width:206px;',
].join('');
const sizeRow = document.createElement('div');
sizeRow.style.cssText = 'display:flex; align-items:center; gap:4px; font-size:11px; color:var(--spu-muted,#9B9489);';
const wLab = document.createElement('span'); wLab.textContent = '显示尺寸';
const xLab = document.createElement('span'); xLab.textContent = '×';
const wIn = document.createElement('input');
const hIn = document.createElement('input');
wIn.value = '480'; hIn.value = '360';
[wIn, hIn].forEach(function (el) {
el.type = 'text'; el.inputMode = 'numeric';
el.style.cssText = 'width:48px; height:22px; box-sizing:border-box; padding:0 4px; ' +
'border:1px solid var(--spu-border,#E8E3D8); border-radius:5px; text-align:center; ' +
'font-size:12px; font-family:inherit; background:var(--spu-surface,#fff); color:var(--spu-text,#333); outline:none;';
el.addEventListener('click', function (e) { e.stopPropagation(); });
});
[wLab, wIn, xLab, hIn].forEach(function (n) { sizeRow.appendChild(n); });
popover.appendChild(sizeRow);
const autoRow = document.createElement('label');
autoRow.style.cssText = 'display:flex; align-items:center; gap:5px; font-size:11px; color:var(--spu-muted,#9B9489); cursor:pointer;';
const auto = document.createElement('input');
auto.type = 'checkbox';
auto.addEventListener('click', function (e) { e.stopPropagation(); });
autoRow.appendChild(auto);
autoRow.appendChild(document.createTextNode('自动播放'));
popover.appendChild(autoRow);
MEDIA_KINDS.forEach(function (k) {
const item = document.createElement('div');
item.style.cssText = 'display:flex; align-items:baseline; gap:8px; padding:6px 8px; ' +
'font-size:13px; cursor:pointer; border-radius:4px; transition:background 0.12s;';
const nm = document.createElement('span');
nm.textContent = k.label;
nm.style.cssText = 'font-weight:600; color:var(--spu-text,#333);';
const tg = document.createElement('span');
tg.textContent = k.note;
tg.style.cssText = 'margin-left:auto; font-size:11px; color:var(--spu-muted,#9B9489);';
item.appendChild(nm); item.appendChild(tg);
item.addEventListener('mouseenter', function () { item.style.background = 'var(--spu-hover,#f0ebe1)'; });
item.addEventListener('mouseleave', function () { item.style.background = 'transparent'; });
item.addEventListener('click', function (e) {
e.stopPropagation();
insertMediaTag(textarea, k.tag, wIn.value, hIn.value, auto.checked ? 1 : 0, k.dim);
closePopover();
});
popover.appendChild(item);
});
armPopoverClose();
activePopover = popover;
return popover;
}
function buildTableUI(btn) {
const wrap = document.createElement('span');
wrap.className = 'spp-tb-tblui';
wrap.style.cssText = 'display:inline-flex; align-items:center; gap:3px;';
function box(val, ph, w) {
const i = document.createElement('input');
i.type = 'text';
i.inputMode = 'numeric';
i.value = val;
i.placeholder = ph;
i.style.cssText = 'width:' + w + 'px; height:22px; box-sizing:border-box; padding:0 3px; ' +
'border:1px solid var(--spu-border,#E8E3D8); border-radius:5px; text-align:center; ' +
'font-size:12px; font-family:inherit; background:var(--spu-surface,#fff); ' +
'color:var(--spu-text,#333); outline:none;';
i.addEventListener('click', function (e) { e.stopPropagation(); });
i.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); btn.click(); } });
return i;
}
const rows = box('2', '行', 26);
const cols = box('3', '列', 26);
const wide = box('', '宽', 40);
const x = document.createElement('span');
x.textContent = '×';
x.style.cssText = 'font-size:11px; color:var(--spu-muted,#9B9489);';
[rows, x, cols, wide].forEach(function (n) { wrap.appendChild(n); });
btn._sppRows = rows;
btn._sppCols = cols;
btn._sppWide = wide;
return wrap;
}
function insertLink(textarea, withText) {
const s = textarea.selectionStart;
const e = textarea.selectionEnd;
const parts = splitSelEdge(textarea.value.substring(s, e));
const sel = parts.core;
const PLACE = 'https://...';
const asUrl = /^https?:\/\/\S+$/i.test(sel);
const url = asUrl ? sel : PLACE;
const body = asUrl ? '文字' : (sel || '文字');
const open = withText ? '[url=' + url + ']' : '[url]';
const mid = withText ? body : url;
const tag = parts.lead + open + mid + '[/url]' + parts.trail;
textarea.value = textarea.value.substring(0, s) + tag + textarea.value.substring(e);
const base = s + parts.lead.length;
let at, len;
if (withText && asUrl) {
at = base + open.length; len = mid.length;
} else {
at = base + (withText ? '[url='.length : '[url]'.length); len = url.length;
}
textarea.setSelectionRange(at, at + len);
textarea.focus();
}
function tblNum(v, def) {
const n = parseInt(v, 10);
return isFinite(n) ? Math.max(1, Math.min(50, n)) : def;
}
function tblColName(j) {
let s = '';
let n = j;
do { s = String.fromCharCode(65 + (n % 26)) + s; n = Math.floor(n / 26) - 1; } while (n >= 0);
return s;
}
function buildTableTag(rows, cols, wide) {
const r = tblNum(rows, 2);
const c = tblNum(cols, 3);
const w = String(wide == null ? '' : wide).replace(/[^0-9A-Za-z.%]/g, '');
const lines = ['[table' + (w ? '=' + w : '') + ']'];
for (let i = 1; i <= r; i++) {
let line = '[tr]';
for (let j = 0; j < c; j++) line += '[td]' + tblColName(j) + i + '[/td]';
lines.push(line + '[/tr]');
}
lines.push('[/table]');
return lines.join('\n');
}
function insertMediaTag(textarea, tag, w, h, auto, dim) {
const s = textarea.selectionStart;
const e = textarea.selectionEnd;
const parts = splitSelEdge(textarea.value.substring(s, e));
const sel = parts.core;
const placeholder = 'https://...';
const param = dim
? (String(w).replace(/[^0-9]/g, '') || '480') + ',' + (String(h).replace(/[^0-9]/g, '') || '360') + ',' + (auto ? 1 : 0)
: String(auto ? 1 : 0);
const open = '[' + tag + '=' + param + ']';
const body = sel || placeholder;
const tagStr = parts.lead + open + body + '[/' + tag + ']' + parts.trail;
textarea.value = textarea.value.substring(0, s) + tagStr + textarea.value.substring(e);
const us = s + parts.lead.length + open.length;
textarea.setSelectionRange(us, us + body.length);
textarea.focus();
}
function buildToolbar(textarea) {
const bar = document.createElement('div');
bar.className = 'spp-editor-toolbar';
bar.style.cssText = [
'display:flex; flex-wrap:wrap; align-items:center;',
'gap:5px 10px; padding:8px 12px;',
'background:var(--spu-overlay,#F0EBE1);',
'border:1px solid var(--spu-border,#E8E3D8);',
'border-bottom:none; border-radius:8px 8px 0 0;',
'position:relative;',
].join('');
const btnBase = [
'padding:4px 10px; font-size:12px; font-weight:600;',
'border:1.5px solid transparent; border-radius:14px;',
'background:var(--spu-surface,#fff); color:var(--spu-text,#333);',
'cursor:pointer; min-width:28px;',
'transition:all 0.18s ease; font-family:inherit;',
'line-height:1.4; letter-spacing:0.02em;',
'user-select:none;',
].join('');
const lblStyle = [
'font-size:10px; color:var(--spu-muted,#9B9489);',
'white-space:nowrap; letter-spacing:0.05em;',
'text-transform:uppercase; font-weight:500;',
].join('');
const rows = [];
function newRow() {
const row = document.createElement('div');
row.className = 'spp-tb-row';
row.style.cssText = 'display:flex;flex-wrap:wrap;align-items:center;gap:5px 10px;' +
'flex:0 0 100%;width:100%;box-sizing:border-box;' +
'padding-bottom:5px;border-bottom:1px solid var(--spu-border,#E8E3D8);';
bar.appendChild(row);
rows.push(row);
return row;
}
let row = newRow();
BUTTON_GROUPS.forEach((group, gi) => {
if (gi === 1 || gi === 2 || gi === 3) row = newRow();
const label = document.createElement('span');
label.textContent = group.label;
label.style.cssText = lblStyle + 'margin-right:2px;';
row.appendChild(label);
group.buttons.forEach(b => {
if (b.brk !== undefined || b.sub !== undefined) {
if (b.brk !== undefined) {
row.style.borderBottom = 'none';
row = newRow();
if (b.relabel) {
const gutter = document.createElement('span');
gutter.textContent = group.label;
gutter.setAttribute('aria-hidden', 'true');
gutter.style.cssText = lblStyle + 'margin-right:2px;visibility:hidden;';
row.appendChild(gutter);
}
}
const subText = b.brk || b.sub || '';
if (subText) {
const sub = document.createElement('span');
sub.textContent = subText;
sub.style.cssText = lblStyle + 'margin-right:2px;';
row.appendChild(sub);
}
return;
}
const btn = document.createElement('button');
btn.type = 'button';
btn.textContent = b.label;
if (b.tag === 'media') SPP_TIP.attach(btn, b.title);
btn.style.cssText = btnBase;
if (b.tag === 'b') btn.style.fontWeight = '700';
if (b.tag === 'i') btn.style.fontStyle = 'italic';
if (b.tag === 'u') btn.style.textDecoration = 'underline';
if (b.tag === 's' || b.tag === 'strike') btn.style.textDecoration = 'line-through';   
btn.addEventListener('mouseenter', () => {
btn.style.background = 'var(--spu-accent,#C75B39)';
btn.style.color = '#fff';
btn.style.borderColor = 'var(--spu-accent,#C75B39)';
btn.style.transform = 'translateY(-1px)';
btn.style.boxShadow = '0 2px 8px rgba(199,91,57,0.2)';
});
btn.addEventListener('mouseleave', () => {
btn.style.background = 'var(--spu-surface,#fff)';
btn.style.color = 'var(--spu-text,#333)';
btn.style.borderColor = 'transparent';
btn.style.transform = 'translateY(0)';
btn.style.boxShadow = 'none';
});
btn.addEventListener('mousedown', () => {
btn.style.transform = 'scale(0.95)';
btn.style.transition = 'transform 0.08s ease';
});
btn.addEventListener('mouseup', () => {
btn.style.transform = 'translateY(-1px)';
btn.style.transition = 'all 0.18s ease';
});
btn.addEventListener('click', e => {
e.preventDefault();
if (b.type === 'color' || b.type === 'backcolor') {
closePopover();
const tag = b.type === 'backcolor' ? 'backcolor' : 'color';
const popover = buildColorPopover(btn, textarea, tag);
const btnRect = btn.getBoundingClientRect();
const barRect = bar.getBoundingClientRect();
popover.style.top = (btnRect.bottom - barRect.top + 6) + 'px';
popover.style.left = '0px';
bar.appendChild(popover);
return;
}
if (b.type === 'font') {
closePopover();
const popover = buildFontPopover(btn, textarea);
const btnRect = btn.getBoundingClientRect();
const barRect = bar.getBoundingClientRect();
popover.style.top = (btnRect.bottom - barRect.top + 6) + 'px';
popover.style.left = '0px';
bar.appendChild(popover);
return;
}
if (b.type === 'annotate') {
const st = {};
const n = annotateHostMark(textarea, st);
tip(annotateTip(n, st));
return;
}
if (b.type === 'hosts') {
closePopover();
const popover = buildHostPopover();
const btnRect = btn.getBoundingClientRect();
const barRect = bar.getBoundingClientRect();
popover.style.top = (btnRect.bottom - barRect.top + 6) + 'px';
popover.style.left = Math.max(0, Math.min(btnRect.left - barRect.left, barRect.width - 190)) + 'px';
bar.appendChild(popover);
return;
}
if (b.type === 'media') {
closePopover();
const popover = buildMediaPopover(btn, textarea);
const btnRect = btn.getBoundingClientRect();
const barRect = bar.getBoundingClientRect();
popover.style.top = (btnRect.bottom - barRect.top + 6) + 'px';
popover.style.left = Math.max(0, Math.min(btnRect.left - barRect.left, barRect.width - 216)) + 'px';
bar.appendChild(popover);
return;
}
if (b.type === 'link') {
insertLink(textarea, false);
return;
}
if (b.type === 'link-text') {
insertLink(textarea, true);
return;
}
if (b.type === 'list' || b.type === 'item') {
const s = textarea.selectionStart;
const e2 = textarea.selectionEnd;
const parts = splitSelEdge(textarea.value.substring(s, e2));
const sel = parts.core;
const open = b.list === 'ol' ? '[list=1]' : '[list]';
const one = function (line) { return '[li]' + line + '[/li]'; };
const glue = b.loose ? '\n' : '';
const body = sel ? sel.split('\n').map(one).join(glue) : one('条目');
const inner = b.type === 'item'
? (body + (b.loose ? '\n' : ''))
: (b.loose ? open + '\n' + body + '\n[/list]' : open + body + '[/list]');
const tag = parts.lead + inner + parts.trail;
textarea.value = textarea.value.substring(0, s) + tag + textarea.value.substring(e2);
textarea.setSelectionRange(s + tag.length, s + tag.length);
textarea.focus();
return;
}
if (b.type === 'table-ui') {
const rows = btn._sppRows, cols = btn._sppCols, wide = btn._sppWide;
const tag = buildTableTag(rows.value, cols.value, wide.value);
rows.value = tblNum(rows.value, 2);
cols.value = tblNum(cols.value, 3);
const s = textarea.selectionStart;
const e2 = textarea.selectionEnd;
textarea.value = textarea.value.substring(0, s) + tag + textarea.value.substring(e2);
textarea.setSelectionRange(s + tag.length, s + tag.length);
textarea.focus();
tip('已插入 ' + rows.value + '×' + cols.value + ' 表格');
return;
}
if (b.type === 'self') {
insertSelfTag(textarea, b.tag);
return;
}
if (b.type === 'heading') {
closePopover();
const popover = buildHeadingPopover(textarea);
const btnRect = btn.getBoundingClientRect();
const barRect = bar.getBoundingClientRect();
popover.style.top = (btnRect.bottom - barRect.top + 6) + 'px';
popover.style.left = Math.max(0, Math.min(btnRect.left - barRect.left, barRect.width - 190)) + 'px';
bar.appendChild(popover);
return;
}
insertTag(textarea, b.tag, b.param, b.cursor, b.body);
});
if (b.type === 'table-ui') {
const grp = document.createElement('span');
grp.className = 'spp-tb-tblgrp';
grp.style.cssText = 'display:inline-flex; align-items:center; gap:3px;';
grp.appendChild(btn);
grp.appendChild(buildTableUI(btn));
row.appendChild(grp);
} else {
row.appendChild(btn);
}
});
});
if (rows.length) rows[rows.length - 1].style.borderBottom = 'none';
function tip(msg) {
const old = bar.querySelector('.spp-tb-tip');
if (old && old.parentNode) old.parentNode.removeChild(old);
const el = document.createElement('span');
el.className = 'spp-tb-tip';
el.textContent = msg;
el.style.cssText = 'position:absolute; right:10px; top:7px; padding:2px 9px; ' +
'border-radius:10px; font-size:11px; line-height:16px; pointer-events:none; ' +
'background:var(--spu-accent,#C75B39); color:#fff;';
bar.appendChild(el);
setTimeout(function () { if (el.parentNode) el.parentNode.removeChild(el); }, 2200);
}
function missTip(st) {
const k = (st && st.skip) || {};
const pa = [];
if (k.self) pa.push('图片/附件 ' + k.self + ' 条');
if (k.marked) pa.push('已有标符 ' + k.marked + ' 条');
if (k.tag) pa.push('在 [img]/[url] 标签里 ' + k.tag + ' 条');
if (k.code) pa.push('在 [code] 里 ' + k.code + ' 条');
if (k.attr) pa.push('在 HTML 标签里 ' + k.attr + ' 条');
if (!pa.length) return '输入框里没找到链接';
return '没有可标注的链接:' + pa.join('、');
}
function annotateTip(n, st) {
const w = (st && st.wrapped) || 0;
const rm = (st && st.removed) || 0;
const pa = [];
if (n) pa.push('已给 ' + n + ' 条链接补上标符');
if (w) pa.push('已把 ' + w + ' 条图片包成 [img]');
if (rm) pa.push('摘掉 ' + rm + ' 条旧误标');
return pa.length ? pa.join(',') : missTip(st);
}
if (MARK_ON && !textarea.dataset.sppHostHook) {
textarea.dataset.sppHostHook = '1';
textarea.addEventListener('paste', function () {
setTimeout(function () {
const st = {};
const n = annotateHostMark(textarea, st);
if (n || st.wrapped || st.removed) tip(annotateTip(n, st));
}, 0);
});
}
const optRow = newRow();
(function buildOptionPills() {
const form = document.querySelector('form[name="FORM"]') ||
(textarea.closest ? textarea.closest('form') : null);
if (!form) return;
const pick = function (n) {
return form.querySelector('input[name="' + n + '"]') ||
form.querySelector('select[name="' + n + '"]');
};
const PILLS = [
{ n: 'atc_usesign', t: '使用签名' },
{ n: 'atc_convert', t: 'Wind Code自动转换' },
{ n: 'atc_anonymous', t: '匿名帖' },
{ n: 'atc_hide', t: '隐藏此帖' },
{ n: 'atc_hideatt', t: '隐藏附件' }
];
const GROUPS = [
{ gate: 'atc_requiresell', t: '出售', num: 'atc_money', unit: 'atc_credittype' },
{ gate: 'atc_requireenhide', t: '加密', num: 'atc_rvrc', unit: 'atc_enhidetype' }
];
const srcCell = (function () {
for (let i = 0; i < PILLS.length; i++) {
const el = pick(PILLS[i].n);
if (el) return el.closest ? el.closest('td') : null;
}
return null;
})();
let moved = 0;
PILLS.forEach(function (o) {
const box = pick(o.n);
if (!box) return;
const lab = document.createElement('label');
lab.className = 'spp-opt-pill';
const txt = document.createElement('span');
txt.textContent = o.t;
lab.appendChild(box);
lab.appendChild(txt);
optRow.appendChild(lab);
moved++;
});
GROUPS.forEach(function (o) {
const gate = pick(o.gate);
const num = pick(o.num);
const unit = pick(o.unit);
if (!num) return;
const wrap = document.createElement('span');
wrap.className = 'spp-opt-num';
if (gate) {
if (!gate.id) gate.id = 'spp-gate-' + o.gate;
const gl = document.createElement('label');
gl.className = 'spp-opt-gate-lbl';
gl.setAttribute('for', gate.id);
gl.textContent = o.t;
wrap.appendChild(gate);
wrap.appendChild(gl);
}
wrap.appendChild(num);
if (unit) wrap.appendChild(unit);
optRow.appendChild(wrap);
moved++;
});
if (moved >= 5 && srcCell) {
srcCell.classList.add('spp-opt-src');
srcCell.dataset.sppOptSrc = String(moved);
const rowEl = srcCell.parentElement;
const tds = rowEl ? Array.from(rowEl.children).filter(function (c) {
return c.tagName === 'TD';
}) : [];
const tail = tds[tds.length - 1];
if (tds.length === 3 && tail && tail !== srcCell) {
tail.setAttribute('colspan', '2');
tail.dataset.sppOptColspan = '1';
}
}
optRow.dataset.sppOptMoved = String(moved);
})();
optRow.style.borderBottom = 'none';
return bar;
}
function syncEditorWidth() {
const ta = document.getElementById('textarea') || document.querySelector('textarea[name="atc_content"]');
if (!ta || !ta.parentElement) return;
const host = ta.parentElement;
const hr = host.getBoundingClientRect();
if (!hr.width || hr.width < 240) return;
const hcs = getComputedStyle(host);
const left = hr.left + (parseFloat(hcs.paddingLeft) || 0);
let right = hr.right - (parseFloat(hcs.paddingRight) || 0);
const side = document.getElementById('editor-side');
if (side) {
const sr = side.getBoundingClientRect();
if (sr.width > 40 && sr.left > left + 120) right = Math.min(right, sr.left - 14);
}
const w = Math.max(240, Math.round(right - left));
const bar = document.querySelector('.spp-editor-toolbar');
if (bar) {
bar.style.setProperty('width', w + 'px', 'important');
bar.style.setProperty('box-sizing', 'border-box', 'important');
}
ta.style.setProperty('width', w + 'px', 'important');
ta.style.setProperty('box-sizing', 'border-box', 'important');
const pvBox = host.querySelector('.spp-preview-pane');
if (pvBox) {
pvBox.style.setProperty('width', w + 'px', 'important');
pvBox.style.setProperty('box-sizing', 'border-box', 'important');
}
const titleBox = host.querySelector('input[name="atc_title"]');
if (titleBox) {
titleBox.style.setProperty('width', w + 'px', 'important');
titleBox.style.setProperty('box-sizing', 'border-box', 'important');
titleBox.style.setProperty('margin-left', '0', 'important');
}
}
function tryAttach(attempt) {
if (attempt === undefined) attempt = 0;
const textarea = document.querySelector('textarea[name="atc_content"]')
|| document.getElementById('textarea');
if (!textarea || !textarea.parentElement) return;
textarea.dataset.sppToolbar = '1';
attachBlockPick(textarea);
const bar = buildToolbar(textarea);
textarea.parentElement.insertBefore(bar, textarea);
textarea.style.borderRadius = '0 0 6px 6px';
syncEditorWidth();
[300, 1200].forEach(t => setTimeout(syncEditorWidth, t));
if (!window.__sppEditorWidthBound) {
window.__sppEditorWidthBound = 1;
window.addEventListener('resize', syncEditorWidth);
}
}
const SPP_BP_TAG = /\[(\/?)([A-Za-z][A-Za-z0-9]*)((?:=[^\]]*)?)\]/g;
function sppBlockRange(text, pos) {
const ls = [];
let m;
SPP_BP_TAG.lastIndex = 0;
while ((m = SPP_BP_TAG.exec(text))) {
ls.push({ s: m.index, e: m.index + m[0].length, n: m[2].toLowerCase(), c: m[1] === '/' });
}
for (let i = 0; i < ls.length; i++) {
if (ls[i].c) continue;
let d = 1, j = i + 1;
for (; j < ls.length; j++) {
if (ls[j].n !== ls[i].n) continue;
if (ls[j].c) { d--; if (!d) break; } else { d++; }
}
if (j < ls.length && pos >= ls[i].s && pos <= ls[j].e) return [ls[i].s, ls[j].e];
}
const lxn = text.lastIndexOf('\n', pos - 1);
const lxb = text.lastIndexOf(']', pos - 1);
const a = Math.max(lxn + 1, lxb + 1, 0);
const nxn = text.indexOf('\n', pos);
const nxb = text.indexOf('[', pos);
const b = Math.min(nxn < 0 ? text.length : nxn, nxb < 0 ? text.length : nxb, text.length);
return [a, b];
}
function attachBlockPick(textarea) {
if (!textarea || textarea.dataset.sppBlockPick) return;
textarea.dataset.sppBlockPick = '1';
textarea.addEventListener('mousedown', function (ev) {
if (ev.detail !== 2) return;
if (!SPP_CONFIG.bool('spp_editor_blockpick', true)) return;
const r = sppBlockRange(textarea.value, textarea.selectionStart);
if (!r || r[1] <= r[0]) return;
ev.preventDefault();
textarea.setSelectionRange(r[0], r[1]);
});
}
onDomReady(() => setTimeout(tryAttach, 400));
}
const EMOJI_HIST_KEY = 'spp_emoji_hist';
const EMOJI_HIST_MAX = 200;
let SPP_HIST_REFRESH = null;
function histAbs(u) {
try { return new URL(u, location.href).href; } catch (e) { return String(u || ''); }
}
function histBuckets(o, pg) {
const v = o && o[pg];
if (Array.isArray(v)) return { '': v.slice() };
if (v && typeof v === 'object') {
const out = {};
Object.keys(v).forEach(function (k) { if (Array.isArray(v[k])) out[k] = v[k].slice(); });
return out;
}
return {};
}
function histRead() {
try {
const o = JSON.parse(GM_getValue(EMOJI_HIST_KEY, '{}') || '{}');
return { emoji: histBuckets(o, 'emoji'), sticker: histBuckets(o, 'sticker') };
} catch (e) { return { emoji: {}, sticker: {} }; }
}
function histWrite(o) {
try {
GM_setValue(EMOJI_HIST_KEY, JSON.stringify({ v: 2, emoji: (o && o.emoji) || {}, sticker: (o && o.sticker) || {} }));
} catch (e) {}
}
function histPage(page) { return page === 'sticker' ? 'sticker' : 'emoji'; }
function histPush(page, cat, url, name) {
if (!url) return 0;
const u = histAbs(url);
if (!u) return 0;
const pg = histPage(page);
const ck = String(cat == null ? '' : cat);
const o = histRead();
const bs = o[pg];
Object.keys(bs).forEach(function (k) {
const l = bs[k];
for (let i = 0; i < l.length; i++) {
if (l[i] && l[i].u === u) { l.splice(i, 1); break; }
}
if (!l.length) delete bs[k];
});
const list = bs[ck] || (bs[ck] = []);
list.unshift({ u: u, n: String(name || ''), c: ck, t: Date.now() });
if (list.length > EMOJI_HIST_MAX) list.length = EMOJI_HIST_MAX;
histWrite(o);
return list.length;
}
function histDrop(page, url) {
const u = histAbs(url);
if (!u) return 0;
const o = histRead();
const bs = o[histPage(page)];
let n = 0;
Object.keys(bs).forEach(function (k) {
const l = bs[k];
for (let i = l.length - 1; i >= 0; i--) {
if (l[i] && l[i].u === u) { l.splice(i, 1); n++; }
}
if (!l.length) delete bs[k];
});
if (n) histWrite(o);
return n;
}
function histSyncPanelCount(page) {
const el = document.querySelector('.spp-eh-n[data-pg="' + histPage(page) + '"]');
if (el) el.textContent = histCount(page);
}
function histList(page, cat) {
const bs = histRead()[histPage(page)];
const ck = cat == null ? '' : String(cat);
if (ck) return (bs[ck] || []).slice();
const out = [];
Object.keys(bs).forEach(function (k) {
bs[k].forEach(function (it) { if (it && it.u) out.push(it); });
});
out.sort(function (a, b) { return (b.t || 0) - (a.t || 0); });
return out.slice(0, EMOJI_HIST_MAX);
}
function histCount(page) {
const bs = histRead()[histPage(page)];
let n = 0;
Object.keys(bs).forEach(function (k) { n += bs[k].length; });
return n;
}
function histClear(page) {
const pg = histPage(page);
const o = histRead();
let n = 0;
Object.keys(o[pg]).forEach(function (k) { n += o[pg][k].length; });
o[pg] = {};
histWrite(o);
return n;
}
function initEmojiPanel() {
const KEY = 'spp_emoji_enhance';
let enabled = SPP_CONFIG.bool(KEY, true);
if (!enabled) return;
if (!WANTS.editorUi) return;
const TIEBA_EMOJI_ALL = [
{ id:1, name:'呵呵', url:'https://raw.githubusercontent.com/267208/tieba-emoji/master/image_emoticon.png' },
{ id:2, name:'哈哈' },{ id:3, name:'吐舌' },{ id:4, name:'啊' },
{ id:5, name:'酷' },{ id:6, name:'怒' },{ id:7, name:'开心' },
{ id:8, name:'汗' },{ id:9, name:'泪' },{ id:10, name:'汗(插伞)' },
{ id:11, name:'鄙视' },{ id:12, name:'不高兴' },{ id:13, name:'真棒' },
{ id:14, name:'花心' },{ id:15, name:'疑问' },{ id:16, name:'阴脸' },
{ id:17, name:'咦' },{ id:18, name:'委屈' },{ id:19, name:'亲亲' },
{ id:20, name:'爱心眼' },{ id:21, name:'斜眼笑' },{ id:22, name:'笑' },
{ id:23, name:'太开心' },{ id:24, name:'可爱' },{ id:25, name:'勉强' },
{ id:26, name:'狂汗' },{ id:27, name:'乖' },{ id:28, name:'睡觉' },
{ id:29, name:'惊哭' },{ id:30, name:'升起' },{ id:31, name:'惊' },
{ id:32, name:'揉脸' },{ id:33, name:'鲁拉' },{ id:34, name:'点头' },
{ id:35, name:'心碎' },{ id:36, name:'玫瑰' },{ id:37, name:'礼物' },
{ id:38, name:'彩虹' },{ id:39, name:'月亮' },{ id:40, name:'太阳' },
{ id:41, name:'钱' },{ id:42, name:'灯泡' },{ id:43, name:'咖啡杯' },
{ id:44, name:'蛋糕' },{ id:45, name:'音乐' },{ id:46, name:'OK' },
{ id:47, name:'V' },{ id:48, name:'真好' },{ id:49, name:'弱' },
{ id:50, name:'OK手势' },{ id:62, name:'扭捏' },{ id:63, name:'右上蹭脸' },
{ id:64, name:'摊手' },{ id:65, name:'打滚' },{ id:66, name:'衰' },
{ id:67, name:'花痴' },{ id:68, name:'打脸' },{ id:69, name:'喷' },
{ id:70, name:'噗' },{ id:71, name:'大哭' },{ id:72, name:'哭瞎' },
{ id:73, name:'感动' },{ id:74, name:'阴' },{ id:75, name:'害羞' },
{ id:76, name:'炸弹' },{ id:77, name:'刀' },{ id:78, name:'沙发' },
{ id:79, name:'香蕉' },{ id:80, name:'便便' },{ id:81, name:'胶囊' },
{ id:82, name:'围巾' },{ id:83, name:'蜡烛' },{ id:84, name:'浮云' },
{ id:85, name:'敲打' },{ id:86, name:'西瓜' },{ id:87, name:'彩虹糖' },
{ id:88, name:'指点' },{ id:89, name:'擦汗' },{ id:90, name:'狗头' },
{ id:91, name:'阴险' },{ id:92, name:'惊恐' },{ id:93, name:'摊手②' },
{ id:94, name:'哈欠' },{ id:95, name:'哈哈哈' },{ id:96, name:'叼玫瑰' },
{ id:97, name:'怪笑' },{ id:98, name:'愤怒' },{ id:99, name:'骷髅(黑)' },
{ id:100, name:'骷髅(大笑)' },{ id:101, name:'举牌' }
];
const TIEBA_CDN_BASE = 'https://raw.githubusercontent.com/267208/tieba-emoji-cdn/master/tieba/image_emoticon';
const HUAJI_CDN_BASE = 'https://raw.githubusercontent.com/267208/tieba-emoji-cdn/master/huaji/';
const HUAZI_EMOJI_ALL = [
{ name:'原味稽', file:'原味稽.png', url:PACK_B_P+'%E5%8E%9F%E5%91%B3%E7%A8%BD.png' },
{ name:'还是算了', file:'还是算了.png', url:PACK_B_P+'%E8%BF%98%E6%98%AF%E7%AE%97%E4%BA%86.png' },
{ name:'蓝纹稽', file:'蓝纹稽.jpg', url:PACK_B_P+'%E8%93%9D%E7%BA%B9%E7%A8%BD.jpg' },
{ name:'随稽应变', file:'随稽应变.jpg', url:PACK_B_P+'%E9%9A%8F%E7%A8%BD%E5%BA%94%E5%8F%98.jpg' },
{ name:'蠕动', file:'蠕动.gif', url:PACK_B_P+'%E8%A0%95%E5%8A%A8.gif' },
{ name:'束手无稽', file:'束手无稽.jpg', url:PACK_B_P+'%E6%9D%9F%E6%89%8B%E6%97%A0%E7%A8%BD.jpg' },
{ name:'微笑默叹以为妙绝', file:'微笑默叹以为妙绝.png', url:PACK_B_P+'%E5%BE%AE%E7%AC%91%E9%BB%98%E5%8F%B9%E4%BB%A5%E4%B8%BA%E5%A6%99%E7%BB%9D.png' },
{ name:'喝嘤料', file:'喝嘤料.jpg', url:PACK_B_P+'%E5%96%9D%E5%98%A4%E6%96%99.jpg' },
{ name:'暗中观察', file:'暗中观察.jpg', url:PACK_B_P+'%E6%9A%97%E4%B8%AD%E8%A7%82%E5%AF%9F.jpg' },
{ name:'高兴', file:'高兴.jpg', url:PACK_B_P+'%E9%AB%98%E5%85%B4.jpg' },
{ name:'惊稽', file:'惊稽.jpg', url:PACK_B_P+'%E6%83%8A%E7%A8%BD.jpg' },
{ name:'可这和我的帅有什么关系', file:'可这和我的帅有什么关系.jpg', url:PACK_B_P+'%E5%8F%AF%E8%BF%99%E5%92%8C%E6%88%91%E7%9A%84%E5%B8%85%E6%9C%89%E4%BB%80%E4%B9%88%E5%85%B3%E7%B3%BB.jpg' },
{ name:'狱稽', file:'狱稽.jpg', url:PACK_B_P+'%E7%8B%B1%E7%A8%BD.jpg' },
{ name:'梆', file:'梆.jpg', url:PACK_B_P+'%E6%A2%86.jpg' },
{ name:'吃鱼摆摆', file:'吃鱼摆摆.gif', url:PACK_B_P+'%E5%90%83%E9%B1%BC%E6%91%86%E6%91%86.gif' },
{ name:'跃跃欲试', file:'跃跃欲试.jpg', url:PACK_B_P+'%E8%B7%83%E8%B7%83%E6%AC%B2%E8%AF%95.jpg' },
{ name:'跃跃欲试 2', file:'跃跃欲试 2.jpg', url:PACK_B_P+'%E8%B7%83%E8%B7%83%E6%AC%B2%E8%AF%95_2.jpg' },
{ name:'跃跃欲试 3', file:'跃跃欲试 3.gif', url:PACK_B_P+'%E8%B7%83%E8%B7%83%E6%AC%B2%E8%AF%95_3.gif' },
{ name:'突然滑稽', file:'突然滑稽.jpg', url:PACK_B_P+'%E7%AA%81%E7%84%B6%E6%BB%91%E7%A8%BD.jpg' },
{ name:'扶墙怂', file:'扶墙怂.jpg', url:PACK_B_P+'%E6%89%B6%E5%A2%99%E6%80%82.jpg' },
{ name:'阔以', file:'阔以.jpg', url:PACK_B_P+'%E9%98%94%E4%BB%A5.jpg' },
{ name:'不得行', file:'不得行.jpg', url:PACK_B_P+'%E4%B8%8D%E5%BE%97%E8%A1%8C.jpg' },
{ name:'少儿不宜', file:'少儿不宜.jpg', url:PACK_B_P+'%E5%B0%91%E5%84%BF%E4%B8%8D%E5%AE%9C.jpg' },
{ name:'稽日可期', file:'稽日可期.jpg', url:PACK_B_P+'%E7%A8%BD%E6%97%A5%E5%8F%AF%E6%9C%9F.jpg' },
{ name:'哎', file:'哎.jpg', url:PACK_B_P+'%E5%93%8E.jpg' },
{ name:'别看丢人', file:'别看丢人.jpg', url:PACK_B_P+'%E5%88%AB%E7%9C%8B%E4%B8%A2%E4%BA%BA.jpg' },
{ name:'地稽', file:'地稽.jpg', url:PACK_B_P+'%E5%9C%B0%E7%A8%BD.jpg' },
{ name:'地稽 2', file:'地稽 2.jpg', url:PACK_B_P+'%E5%9C%B0%E7%A8%BD_2.jpg' },
{ name:'地稽 3', file:'地稽 3.jpg', url:PACK_B_P+'%E5%9C%B0%E7%A8%BD_3.jpg' },
{ name:'地稽委屈', file:'地稽委屈.jpg', url:PACK_B_P+'%E5%9C%B0%E7%A8%BD%E5%A7%94%E5%B1%88.jpg' },
{ name:'地稽抚摸', file:'地稽抚摸.gif', url:PACK_B_P+'%E5%9C%B0%E7%A8%BD%E6%8A%9A%E6%91%B8.gif' },
{ name:'地稽锤打', file:'地稽锤打.gif', url:PACK_B_P+'%E5%9C%B0%E7%A8%BD%E9%94%A4%E6%89%93.gif' },
{ name:'老阔有点扣', file:'老阔有点扣.gif', url:PACK_B_P+'%E8%80%81%E9%98%94%E6%9C%89%E7%82%B9%E6%89%A3.gif' },
{ name:'啊哈哈', file:'啊哈哈.jpg', url:PACK_B_P+'%E5%95%8A%E5%93%88%E5%93%88.jpg' },
{ name:'无稽可奈', file:'无稽可奈.jpg', url:PACK_B_P+'%E6%97%A0%E7%A8%BD%E5%8F%AF%E5%A5%88.jpg' },
{ name:'老实巴交', file:'老实巴交.jpg', url:PACK_B_P+'%E8%80%81%E5%AE%9E%E5%B7%B4%E4%BA%A4.jpg' },
{ name:'紧张', file:'紧张.jpg', url:PACK_B_P+'%E7%B4%A7%E5%BC%A0.jpg' },
{ name:'摇摆稽', file:'摇摆稽.gif', url:PACK_B_P+'%E6%91%87%E6%91%86%E7%A8%BD.gif' },
{ name:'又不是不能用', file:'又不是不能用.jpg', url:PACK_B_P+'%E5%8F%88%E4%B8%8D%E6%98%AF%E4%B8%8D%E8%83%BD%E7%94%A8.jpg' },
{ name:'一时滑稽', file:'一时滑稽.jpg', url:PACK_B_P+'%E4%B8%80%E6%97%B6%E6%BB%91%E7%A8%BD.jpg' },
{ name:'无法接受', file:'无法接受.jpg', url:PACK_B_P+'%E6%97%A0%E6%B3%95%E6%8E%A5%E5%8F%97.jpg' },
{ name:'嘤雄豪稽', file:'嘤雄豪稽.jpg', url:PACK_B_P+'%E5%98%A4%E9%9B%84%E8%B1%AA%E7%A8%BD.jpg' },
{ name:'相视双稽', file:'相视双稽.jpg', url:PACK_B_P+'%E7%9B%B8%E8%A7%86%E5%8F%8C%E7%A8%BD.jpg' },
{ name:'稽皮发麻', file:'稽皮发麻.jpg', url:PACK_B_P+'%E7%A8%BD%E7%9A%AE%E5%8F%91%E9%BA%BB.jpg' },
{ name:'绝望', file:'绝望.jpg', url:PACK_B_P+'%E7%BB%9D%E6%9C%9B.jpg' },
{ name:'气稽败坏', file:'气稽败坏.jpg', url:PACK_B_P+'%E6%B0%94%E7%A8%BD%E8%B4%A5%E5%9D%8F.jpg' },
{ name:'当场去世', file:'当场去世.jpg', url:PACK_B_P+'%E5%BD%93%E5%9C%BA%E5%8E%BB%E4%B8%96.jpg' },
{ name:'喝酒', file:'喝酒.jpg', url:PACK_B_P+'%E5%96%9D%E9%85%92.jpg' },
{ name:'老衲摆摊算命', file:'老衲摆摊算命.gif', url:PACK_B_P+'%E8%80%81%E8%A1%B2%E6%91%86%E6%91%8A%E7%AE%97%E5%91%BD.gif' },
{ name:'老哥,稳', file:'老哥,稳.jpg', url:PACK_B_P+'%E8%80%81%E5%93%A5%EF%BC%8C%E7%A8%B3.jpg' },
{ name:'自闭稽', file:'自闭稽.jpg', url:PACK_B_P+'%E8%87%AA%E9%97%AD%E7%A8%BD.jpg' },
{ name:'无话可说', file:'无话可说.jpg', url:PACK_B_P+'%E6%97%A0%E8%AF%9D%E5%8F%AF%E8%AF%B4.jpg' },
{ name:'满脑子骚操作', file:'满脑子骚操作.gif', url:PACK_B_P+'%E6%BB%A1%E8%84%91%E5%AD%90%E9%AA%9A%E6%93%8D%E4%BD%9C.gif' },
{ name:'稽之舞', file:'稽之舞.gif', url:PACK_B_P+'%E7%A8%BD%E4%B9%8B%E8%88%9E.gif' },
{ name:'将稽就稽', file:'将稽就稽.gif', url:PACK_B_P+'%E5%B0%86%E7%A8%BD%E5%B0%B1%E7%A8%BD.gif' }
];
GM_addStyle(`
            fieldset.spp-emoji-fieldset {
                border: 1px solid var(--spu-border, #E8E3D8) !important;
                border-radius: var(--spu-radius, 8px) !important;
                padding: 10px 12px 12px !important;
                margin: 0 !important;
                background: var(--spu-surface, #FDFBF7) !important;
                width: auto !important;
                min-width: 260px !important;
                max-height: 100% !important;
                overflow: hidden !important;
                text-align: left !important;
                font-family: 'Noto Sans SC','Source Han Sans SC','PingFang SC','Microsoft YaHei',sans-serif !important;
                font-size: 13px !important;
                line-height: 1.5 !important;
                box-sizing: border-box !important;
            }
            fieldset.spp-emoji-fieldset > legend {
                display: inline-flex !important;
                align-items: center !important;
                gap: 0 !important;
                padding: 0 !important;
                border: none !important;
                border-radius: 0 !important;
                background: none !important;
                font-size: 11px !important;
                font-weight: 700 !important;
                color: var(--spu-accent, #2f6f68) !important;
                letter-spacing: 0.08em !important;
                line-height: 1.4 !important;
            }
            .spp-emoji-tabs {
                display: flex !important;
                flex-wrap: wrap !important;
                gap: 3px !important;
                padding: 2px 0 4px !important;
                border-bottom: 1px solid var(--spu-border,#E8E3D8) !important;
                margin-bottom: 4px !important;
            }
            .spp-emoji-tabs.spp-emoji-tabs--inlegend {
                padding: 0 !important;
                border-bottom: none !important;
                margin: 0 !important;
                gap: 0 !important;
            }
            .spp-emoji-tab {
                position: relative !important;
                padding: 2px 11px !important;
                font-size: 11px !important;
                line-height: 1.5 !important;
                border: 1px solid color-mix(in srgb, var(--spu-accent,#C75B39) 45%, transparent) !important;
                border-radius: 0 !important;
                background: var(--spu-surface,#fff) !important;
                color: var(--spu-muted,#999) !important;
                cursor: pointer !important;
                transition: all 0.15s ease !important;
                user-select: none !important;
                white-space: nowrap !important;
            }
            .spp-emoji-tabs--inlegend .spp-emoji-tab:first-child { border-radius: 999px 0 0 999px !important; }
            .spp-emoji-tabs--inlegend .spp-emoji-tab:last-child {
                border-radius: 0 999px 999px 0 !important;
                margin-left: -1px !important;
            }
            .spp-emoji-tab:hover {
                border-color: var(--spu-accent,#C75B39) !important;
                color: var(--spu-accent,#C75B39) !important;
                background: color-mix(in srgb,var(--spu-accent,#C75B39) 8%,transparent) !important;
                z-index: 1 !important;
            }
            .spp-emoji-tab.spp-active {
                background: var(--spu-accent,#C75B39) !important;
                color: #fff !important;
                border-color: var(--spu-accent,#C75B39) !important;
                font-weight: 600 !important;
                z-index: 2 !important;
            }
            .spp-emoji-cats {
                display: flex !important;
                flex-direction: column !important;
                align-items: stretch !important;
                gap: 4px !important;
                padding: 0 0 5px !important;
                margin: 0 0 5px !important;
                border-bottom: 1px solid var(--spu-border,#E8E3D8) !important;
            }
            .spp-emoji-cats-track {
                display: flex !important;
                flex-wrap: wrap !important;
                align-items: center !important;
                gap: 4px !important;
                flex: 1 1 auto !important;
                min-width: 0 !important;
                overflow: hidden !important;
                scroll-behavior: smooth !important;
                scrollbar-width: none !important;
            }
            .spp-emoji-cats-track::-webkit-scrollbar { height: 0 !important; }
            .spp-emoji-cat {
                display: inline-flex !important;
                align-items: center !important;
                gap: 5px !important;
                flex: 0 0 auto !important;
                padding: 3px 10px !important;
                font-size: 11px !important;
                line-height: 1.5 !important;
                color: var(--spu-muted,#9B9489) !important;
                background: var(--spu-surface,#fff) !important;
                border: 1px solid var(--spu-border,#E8E3D8) !important;
                border-radius: 3px !important;
                cursor: pointer !important;
                user-select: none !important;
                white-space: nowrap !important;
                transition: all 0.15s ease !important;
            }
            .spp-emoji-cat > i { font-style: normal !important; opacity: 0.7 !important; }
            .spp-emoji-cat:hover {
                border-color: var(--spu-accent,#C75B39) !important;
                color: var(--spu-accent,#C75B39) !important;
            }
            .spp-emoji-cat.spp-active {
                background: color-mix(in srgb, var(--spu-accent,#C75B39) 14%, #fff) !important;
                border-color: color-mix(in srgb, var(--spu-accent,#C75B39) 55%, #fff) !important;
                color: var(--spu-accent,#C75B39) !important;
                font-weight: 700 !important;
            }
            .spp-emoji-cat.spp-active > b::before { content: '✓ ' !important; }   /* 勾选态 */
            fieldset.spp-emoji-fieldset > span { display: none !important; }
            .spp-emoji-grid {
                display: flex !important;
                flex-wrap: wrap !important;
                align-content: flex-start !important;
                gap: 2px !important;
                padding: 0 !important;
                overflow-y: auto !important;
                scrollbar-width: thin !important;
                scrollbar-color: var(--spu-border,#ddd) transparent !important;
            }
            .spp-emoji-grid::-webkit-scrollbar { width: 4px !important; }
            .spp-emoji-grid::-webkit-scrollbar-thumb {
                background: var(--spu-border,#ddd) !important; border-radius: 2px !important;
            }
            .spp-emoji-grid .spp-emoji-group {
                flex: 0 0 100% !important;
                position: sticky !important;
                top: 0 !important;
                z-index: 1 !important;
                display: flex !important;
                align-items: center !important;
                gap: 6px !important;
                box-sizing: border-box !important;
                margin: 1px 0 !important;
                padding: 1px 6px !important;
                font-size: 10px !important;
                font-weight: 600 !important;
                letter-spacing: 0.06em !important;
                color: var(--spu-muted,#9B9489) !important;
                background: var(--spu-overlay,#F0EBE1) !important;
                border-bottom: 1px solid var(--spu-border,#E8E3D8) !important;
                border-radius: 3px !important;
            }
            .spp-emoji-grid .spp-emoji-group > i {
                font-style: normal !important;
                font-weight: 500 !important;
                opacity: 0.72 !important;
            }
            .spp-emoji-grid .spp-emoji-hist-sep {
                flex: 0 0 100% !important;
                display: flex !important;
                align-items: center !important;
                gap: 6px !important;
                box-sizing: border-box !important;
                margin: 7px 0 5px !important;
                font-size: 10px !important;
                font-weight: 600 !important;
                letter-spacing: 0.06em !important;
                line-height: 1 !important;
                color: var(--spu-muted,#9B9489) !important;
            }
            .spp-emoji-grid .spp-emoji-hist-sep::before,
            .spp-emoji-grid .spp-emoji-hist-sep::after {
                content: '' !important;
                flex: 1 1 0 !important;
                height: 0 !important;
                border-top: 1px dashed var(--spu-border,#E8E3D8) !important;
            }
            .spp-emoji-grid .spp-emoji-hist-sep.spp-hist-bare { gap: 0 !important; }
            .spp-emoji-grid .spp-emoji-hist-sep.spp-hist-bare::before,
            .spp-emoji-grid .spp-emoji-hist-sep.spp-hist-bare::after { display: none !important; }
            .spp-emoji-grid .spp-emoji-hist-sep.spp-hist-bare {
                height: 0 !important;
                border-top: 1px dashed var(--spu-border,#E8E3D8) !important;
            }
            .spp-emoji-grid .spp-hist-cell {
                position: relative !important;
                display: inline-flex !important;
                flex: 0 0 auto !important;
                line-height: 0 !important;
                margin: 0 !important;
            }
            .spp-emoji-grid .spp-hist-x {
                position: absolute !important;
                top: 0 !important;
                right: 0 !important;
                z-index: 4 !important;
                display: none !important;
                align-items: center !important;
                justify-content: center !important;
                box-sizing: border-box !important;
                width: 13px !important;
                height: 13px !important;
                font: 700 11px/1 Arial, Helvetica, sans-serif !important;
                font-style: normal !important;
                color: #fff !important;
                background: rgba(224,110,92,.96) !important;
                border: 1px solid rgba(0,0,0,.35) !important;
                border-radius: 50% !important;
                box-shadow: 0 1px 3px rgba(0,0,0,.5) !important;
                cursor: pointer !important;
                transition: none !important;
            }
            .spp-emoji-grid .spp-hist-cell:hover > .spp-hist-x { display: flex !important; }
            .spp-emoji-grid .spp-hist-x:hover { background: #e06e5c !important; }
            .spp-emoji-grid img,
            .spp-emoji-grid canvas {
                width: 26px !important; height: 26px !important;
                object-fit: contain !important;
                cursor: pointer !important;
                border-radius: 4px !important;
                border: 2px solid transparent !important;
                padding: 1px !important;
                margin: 0 !important;
                transition: transform 0.12s ease, border-color 0.12s ease, background 0.12s ease !important;
            }
            .spp-emoji-grid img:hover,
            .spp-emoji-grid canvas:hover {
                transform: scale(1.35) !important;
                z-index: 2 !important;
                border-color: var(--spu-accent, #C75B39) !important;
                background: var(--spu-overlay, #F0EBE1) !important;
                box-shadow: 0 3px 10px rgba(0,0,0,0.15) !important;
            }
            .spp-emoji-grid .spp-emoji-name {
                display: none !important;
            }
            .spp-emoji-empty {
                text-align: center !important;
                padding: 12px !important;
                font-size: 11px !important;
                color: var(--spu-muted,#bbb) !important;
            }
            fieldset.spp-emoji-fieldset > span a#td_face,
            fieldset.spp-emoji-fieldset a#td_face {
                display: inline-block !important;
                font-size: 11px !important;
                color: var(--spu-accent, #C75B39) !important;
                border: 1px dashed var(--spu-border, #ddd) !important;
                border-radius: 4px !important;
                padding: 1px 8px !important;
                margin-top: 4px !important;
                text-decoration: none !important;
                transition: all 0.15s ease !important;
                cursor: pointer !important;
            }
            fieldset.spp-emoji-fieldset > span a#td_face:hover,
            fieldset.spp-emoji-fieldset a#td_face:hover {
                background: var(--spu-accent, #C75B39) !important;
                color: #fff !important;
                border-style: solid !important;
                border-color: var(--spu-accent, #C75B39) !important;
            }
            fieldset.spp-emoji-fieldset > span a#td_face { display:none !important; }
            .spp-face-native-host { display:block !important; margin-top:6px !important; }
            fieldset.spp-emoji-fieldset.spp-face-native-on { overflow-y:auto !important; }
            html body div.menu.spp-face-native {
                position:static !important; left:auto !important; top:auto !important; right:auto !important; bottom:auto !important;
                width:100% !important; max-width:100% !important; min-width:0 !important;
                height:auto !important; max-height:none !important;
                margin:0 !important; padding:0 !important; opacity:1 !important;
                background:none !important; background-image:none !important;
                border:0 !important; border-radius:0 !important; box-shadow:none !important;
                overflow:hidden !important; z-index:auto !important; box-sizing:border-box !important;
                color:var(--spu-text,#333) !important; font-size:12px !important;
            }
            html body div.menu.spp-face-native #buttons {
                display:flex !important; flex-wrap:wrap !important; align-items:center !important; gap:3px !important;
                width:100% !important; height:auto !important; padding:0 !important; overflow:hidden !important;
            }
            html body div.menu.spp-face-native #buttons > span {
                float:none !important; display:inline-flex !important; align-items:center !important;
                margin:0 !important; width:auto !important; cursor:pointer !important;
            }
            html body div.menu.spp-face-native #buttons > span img {
                width:13px !important; height:13px !important; opacity:.7 !important;
                filter:invert(1) brightness(.35) !important;
            }
            html body div.menu.spp-face-native #buttons > span:hover img { opacity:1 !important; }
            html body div.menu.spp-face-native #buttons > div {
                float:none !important; display:inline-block !important; flex:0 0 auto !important;
                width:auto !important; min-width:0 !important; height:22px !important;
                padding:0 8px !important; margin:0 !important; box-sizing:border-box !important;
                font-size:11.5px !important; line-height:20px !important; text-align:center !important;
                color:var(--spu-muted,#6a7b90) !important; background:none !important; background-image:none !important;
                border:1px solid var(--spu-border,#E8E3D8) !important; border-radius:9px !important;
                cursor:pointer !important; white-space:nowrap !important; user-select:none !important;
            }
            html body div.menu.spp-face-native #buttons > div:hover {
                border-color:var(--spu-accent,#C75B39) !important; color:var(--spu-accent,#C75B39) !important;
            }
            html body div.menu.spp-face-native #buttons > div.lian {
                color:#fff !important; background:var(--spu-accent,#C75B39) !important;
                border-color:var(--spu-accent,#C75B39) !important;
            }
            html body div.menu.spp-face-native #showface {
                width:100% !important; max-width:100% !important; height:auto !important; max-height:236px !important;
                box-sizing:border-box !important; overflow-y:auto !important; overflow-x:hidden !important;
                padding:6px 2px 2px !important; margin-top:5px !important; background:none !important;
                border-top:1px dashed var(--spu-border,#E8E3D8) !important;
            }
            html body div.menu.spp-face-native #showface img { max-width:100% !important; height:auto !important; vertical-align:middle !important; }
        `);
if (PATH.includes("post.php") && !SEARCH.includes("action-quote")) {
GM_addStyle(`
                #editor-side { width: 33% !important; }
                #editor-side > div { width: 100% !important; }
                div:has(> #editor-side) { position: relative !important; width: 100% !important; max-width: none !important; margin-left: 0 !important; margin-right: 0 !important; }
                #editor-side { left: auto !important; right: 0 !important; max-height: calc(100% - 52px) !important; overflow-y: auto !important; }
                #editor-main { padding-left: 0 !important; padding-right: calc(33% + 14px) !important; }
            `);
}
if (SEARCH.includes("action-quote")) {
GM_addStyle(`
                fieldset.spp-emoji-fieldset {
                    width: 100% !important;
                    max-width: 100% !important;
                    min-width: auto !important;
                    box-sizing: border-box !important;
                }
                #editor-side { width: 260px !important; }
                #editor-side > div { width: 100% !important; }
                #editor-main { padding-left: 274px !important; }
                .spp-emoji-grid img, .spp-emoji-grid canvas { width: 30px !important; height: 30px !important; }
            `);
}
function tryPatch(attempt) {
if (attempt === undefined) attempt = 0;
if (attempt >= 60) return;
const fieldsets = document.querySelectorAll('fieldset');
let emojiFieldset = null;
for (const fs of fieldsets) {
const leg = fs.querySelector('legend');
if (leg && leg.textContent.trim() === '表情') {
emojiFieldset = fs;
break;
}
}
if (!emojiFieldset) { setTimeout(() => tryPatch(attempt + 1), 300); return; }
if (emojiFieldset.dataset.sppEmoji) return;
emojiFieldset.dataset.sppEmoji = '1';
emojiFieldset.classList.add('spp-emoji-fieldset');
emojiFieldset.style.boxSizing = 'border-box';
const textarea = document.querySelector('textarea[name="atc_content"]');
if (!textarea) { setTimeout(() => tryPatch(attempt + 1), 300); return; }
const menuShow = emojiFieldset.querySelector('#menu_show');
const moreLink = emojiFieldset.querySelector('a#td_face');
const emojiGrid = document.createElement('div');
emojiGrid.className = 'spp-emoji-grid';
const defaultEmojiData = [];
if (menuShow) {
menuShow.querySelectorAll('img').forEach(function(origImg) {
defaultEmojiData.push({
type: 'native',  
el: origImg
});
});
menuShow.style.display = 'none';
}
const NATIVE_PACKS = [
{ key: 'smallface', name: '小圆脸' },
{ key: 'miao',      name: '\u00b4\u30fb\u03c9\u30fb\x60' },
{ key: 'kaoani',    name: '颜アニ' },
{ key: 'kaomoji',   name: '颜文字' },
{ key: 'de',        name: '杂项' }
];
const CUSTOM_EMOJI_PACKS = [
{ key: 'omega-emoji', name: 'ω', list: PACK_EMOJI_OMEGA }
];
function nativePackData(key) {
if (typeof faces === 'undefined' || typeof face === 'undefined' || !faces[key]) return null;
const pp = (typeof picpath === 'string' && picpath) ? picpath : 'images/post/smile/';
return faces[key].map(function (sid) {
const meta = face[sid] || [];
return { id: sid, src: pp + (meta[0] || ''), title: String(meta[1] || '') };
});
}
const tabs = document.createElement('div');
tabs.className = 'spp-emoji-tabs';
function staticizeAnimated(img, onClick) {
const w = img.naturalWidth, h = img.naturalHeight;
if (!w || !h) return;
const BOX = 52;
const k = Math.min(BOX / w, BOX / h);
const dw = Math.max(1, Math.round(w * k)), dh = Math.max(1, Math.round(h * k));
const cv = document.createElement('canvas');
cv.width = BOX; cv.height = BOX;
cv.className = img.className;
if (img.title) cv.title = img.title;
if (img.dataset.sppSrc) cv.dataset.sppSrc = img.dataset.sppSrc;
const ctx = cv.getContext('2d');
if (!ctx) return;
try { ctx.drawImage(img, (BOX - dw) / 2, (BOX - dh) / 2, dw, dh); }
catch (e) { return; }
cv.addEventListener('click', onClick);
if (img.parentNode) img.parentNode.replaceChild(cv, img);
img.removeAttribute('src');   
}
function appendEmojiImg(src, alt, onErr, onClick, isAnim) {
const img = document.createElement('img');
img.src = src;
img.alt = alt;
if (curGridType === 'sticker') img.dataset.sppSrc = src;
img.loading = 'lazy';
img.addEventListener('error', function () {
if (onErr && onErr(img)) return;
img.style.display = 'none';
});
img.addEventListener('click', onClick);
if (isAnim) img.addEventListener('load', function () { staticizeAnimated(img, onClick); }, { once: true });
emojiGrid.appendChild(img);
return img;
}
const SPP_TAIL_STICKER = /(?:\s*(?:\[img\][^\[]*\[\/img\]|\[s:\d+\]))+\s*$/i;
function sppTailIsSticker(v) { return SPP_TAIL_STICKER.test(String(v || '')); }
if (!window.__sppAddsmileWrapped && typeof window.addsmile === 'function') {
const _sppAddsmile = window.addsmile;
window.addsmile = function (NewCode) {
try {
const ta = (document.FORM && document.FORM.atc_content) || null;
if (ta && ta.value.trim() && SPP_CONFIG.bool('spp_sticker_autobr', true) && !sppTailIsSticker(ta.value)) {
ta.value += '\n';
}
} catch (e) {}
return _sppAddsmile.apply(this, arguments);
};
window.__sppAddsmileWrapped = 1;
}
function insertEmojiTag(url) {
const s = textarea.selectionStart;
const e = textarea.selectionEnd;
const head = textarea.value.slice(0, s);
const br = (SPP_CONFIG.bool('spp_sticker_autobr', true) && head.trim() && !sppTailIsSticker(head)) ? '\n' : '';
const tag = br + '[img]' + url + '[/img]';
textarea.value = textarea.value.substring(0, s) + tag + textarea.value.substring(e);
const np = s + tag.length;
textarea.setSelectionRange(np, np);
textarea.focus();
}
function histCatName(page, catKey) {
if (!catKey) return '';
const cs = catsOf(page);
for (let i = 0; i < cs.length; i++) if (cs[i].key === catKey) return cs[i].name;
return '';
}
function histShown(page) {
const n = histCount(page);
return n > EMOJI_HIST_MAX ? EMOJI_HIST_MAX : n;
}
function histChipSync(page) {
const chip = catsTrack.querySelector('.spp-emoji-cat[data-cat="' + CAT_HIST + '"]');
if (!chip) return;
const n = histShown(page);
let i = chip.querySelector('i');
if (!n) {
if (i && i.parentNode) i.parentNode.removeChild(i);
return;
}
if (!i) { i = document.createElement('i'); chip.appendChild(i); }
i.textContent = n;
}
function histRenderGrid(page) {
const keep = emojiGrid.scrollTop;
Array.prototype.forEach.call(emojiGrid.querySelectorAll('.spp-hist-cell, .spp-emoji-hist'), function (n) {
if (n.parentNode) n.parentNode.removeChild(n);
});
const histOnly = curCat === CAT_HIST;
const catKey = (curCat === CAT_ALL || histOnly) ? '' : curCat;
const list = histList(page, catKey);
if (!list.length) { emojiGrid.scrollTop = keep; histChipSync(page); return 0; }
const ref = emojiGrid.firstChild;
const nm = histCatName(page, catKey);
const hd = groupHead((page === 'sticker' ? '最近用过的贴纸' : '最近用过的 emoji') + (nm ? ' · ' + nm : ''), list.length);
hd.classList.add('spp-emoji-hist');
const born = [hd];
list.forEach(function (it) {
const im = appendEmojiImg(it.u, it.n || '最近用过', null, function () {
histPush(page, it.c || catKey, it.u, it.n);
insertEmojiTag(it.u);
histRenderGrid(page);
}, false);
im.classList.add('spp-emoji-hist');
const cell = document.createElement('span');
cell.className = 'spp-hist-cell spp-emoji-hist';
im.parentNode.insertBefore(cell, im);
cell.appendChild(im);
const x = document.createElement('i');
x.className = 'spp-hist-x';
x.textContent = '×';
x.title = '删除这条记录(站点原表与已插入正文的表情都不动)';
x.setAttribute('role', 'button');
x.addEventListener('click', function (ev) {
if (ev) { ev.preventDefault(); ev.stopPropagation(); }
if (!histDrop(page, it.u)) return;
histSyncPanelCount(page);
histRenderGrid(page);
});
cell.appendChild(x);
born.push(cell);
});
if (!histOnly) {
const sep = document.createElement('div');
sep.className = 'spp-emoji-hist-sep spp-emoji-hist' + (nm ? '' : ' spp-hist-bare');
if (nm) sep.textContent = nm;
born.push(sep);
}
born.forEach(function (n) { emojiGrid.insertBefore(n, ref); });
emojiGrid.scrollTop = keep;
histChipSync(page);
return list.length;
}
let curGridType = 'sticker';
SPP_HIST_REFRESH = function () { try { renderGrid(curGridType); } catch (e) {} };
const STICKER_PACKS = [
{ key: 'huaji', name: '滑稽', list: HUAZI_EMOJI_ALL.concat(PACK_BQB_HUAJI) },
{ key: 'omega-sticker', name: 'ω', list: PACK_STICKER_OMEGA },
{ key: 'daidaiwei', name: '呆呆唯', list: PACK_DAIDAIWEI },
{ key: 'maoerxiaoyi', name: '猫儿小忆', list: PACK_MAOERXIAOYI },
{ key: 'shishouxiang', name: '是,首相', list: PACK_SHISHOUXIANG },
{ key: 'kun1', name: '鲲 1', list: PACK_KUN1 },
{ key: 'kun2', name: '鲲 2', list: PACK_KUN2 },
{ key: 'kun3', name: '鲲 3', list: PACK_KUN3 },
{ key: 'kun4', name: '鲲 4', list: PACK_KUN4 },
{ key: 'kun5', name: '鲲 5', list: PACK_KUN5 },
{ key: 'kun6', name: '鲲 6', list: PACK_KUN6 },
{ key: 'bqb-contrib', name: '贡献', list: PACK_BQB_CONTRIB },
{ key: 'bqb-greenhat', name: '绿帽子', list: PACK_BQB_GREENHAT },
{ key: 'bqb-emoji23', name: '表情符号', list: PACK_BQB_EMOJI23 },
{ key: 'bqb-catdaily', name: '猫咪日常', list: PACK_BQB_CATDAILY },
{ key: 'bqb-squirtle', name: '杰尼龟', list: PACK_BQB_SQUIRTLE },
{ key: 'bqb-kaguya', name: '辉夜大小姐', list: PACK_BQB_KAGUYA },
{ key: 'bqb-paiyipai', name: '微信拍一拍', list: PACK_BQB_PAIYIPAI },
{ key: 'bqb-gui', name: '兄贵哲学', list: PACK_BQB_GUI }
];
SPP_CUSTOM_PACKS.emoji.forEach(function (p) { CUSTOM_EMOJI_PACKS.push(p); });
SPP_CUSTOM_PACKS.sticker.forEach(function (p) { STICKER_PACKS.push(p); });
const CAT_ALL = '__all__';
const CAT_HIST = '__hist__';
const CAT_DEF = { emoji: 'smallface', sticker: 'huaji' };
const CAT_MEM_KEY = { emoji: 'spp_cat_last_emoji', sticker: 'spp_cat_last_sticker' };
function catMemGet(page) {
if (!SPP_CONFIG.bool('spp_cat_memory', true)) return '';
try {
const raw = GM_getValue(CAT_MEM_KEY[page], '');
return (raw === null || raw === undefined) ? '' : String(raw);
} catch (e) { return ''; }
}
function catMemPut(page, key) {
if (!key) return;
if (!SPP_CONFIG.bool('spp_cat_memory', true)) return;
try { GM_setValue(CAT_MEM_KEY[page], String(key)); } catch (e) {}
}
function catMemOk(type) {
const mem = catMemGet(type);
return (mem && catsHas(type, mem)) ? mem : '';
}
let curCat = CAT_DEF.sticker;
const catMemFirst = catMemOk('sticker');
if (catMemFirst) curCat = catMemFirst;
const catsBar = document.createElement('div');
catsBar.className = 'spp-emoji-cats';
const catsTrack = document.createElement('div');
catsTrack.className = 'spp-emoji-cats-track';
catsBar.appendChild(catsTrack);
SPP_TIP.attach(catsBar, '滚轮翻页');
let catsPages = 0;
let catsLastPage = 0;
let catsLastCount = -1;
let catsSeek = 0;
let catsSeekUntil = 0;
const CATS_VIS_ROWS = 3;
let catsLastH = 0;
function catsRowH() {
const c = catsTrack.children[0];
return (c ? c.offsetHeight : 20) + 4;
}
function catsRows() {
return Math.max(1, Math.round(catsTrack.scrollHeight / catsRowH()));
}
function catsGeom() {
const rows = catsRows();
const more = rows > CATS_VIS_ROWS;
const visH = more ? CATS_VIS_ROWS * catsRowH() - 4 : catsTrack.clientHeight;
return { more: more, visH: visH, pages: more ? Math.ceil(rows / CATS_VIS_ROWS) : 1 };
}
function catsCurPage(g) {
g = g || catsGeom();
if (!g.more) return 1;
if (catsSeek) {
if (Date.now() < catsSeekUntil) return catsSeek;
catsSeek = 0;
}
const maxTo = Math.max(0, catsTrack.scrollHeight - g.visH);
let best = 1;
let bestD = Infinity;
for (let i = 0; i < g.pages; i++) {
const d = Math.abs(Math.min(maxTo, i * g.visH) - catsTrack.scrollTop);
if (d < bestD) { bestD = d; best = i + 1; }
}
return best;
}
function catsSync() {
const g = catsGeom();
catsTrack.style.maxHeight = g.more ? g.visH + 'px' : '';
if (catsSeek) {
const to = Math.min(Math.max(0, catsTrack.scrollHeight - g.visH), (catsSeek - 1) * g.visH);
if (Math.abs(catsTrack.scrollTop - to) <= 1 || Date.now() >= catsSeekUntil) catsSeek = 0;
}
const nChips = catsTrack.children.length;
const cur = catsCurPage(g);
if (g.pages !== catsPages || cur !== catsLastPage || nChips !== catsLastCount) {
catsPages = g.pages;
catsLastPage = cur;
catsLastCount = nChips;
if (g.pages > 1) {
catsBar.setAttribute('data-spp-tip', '滚轮翻页 · 第 ' + cur + '/' + g.pages +
' 页 · 共 ' + nChips + ' 类');
} else {
catsBar.removeAttribute('data-spp-tip');   
}
}
if (catsBar.offsetHeight !== catsLastH) {
catsLastH = catsBar.offsetHeight;
if (typeof syncEmojiLayout === 'function') syncEmojiLayout();
}
}
let catsWheelAcc = 0;
let catsWheelLock = 0;
catsBar.addEventListener('wheel', function (e) {
const g = catsGeom();
if (!g.more) return;
const d = e.deltaMode === 1 ? e.deltaY * 16
: (e.deltaMode === 2 ? e.deltaY * Math.max(1, catsTrack.clientHeight) : e.deltaY);
if (!d) return;
const cur = catsCurPage(g);
if ((d > 0 && cur >= g.pages) || (d < 0 && cur <= 1)) return;
e.preventDefault();
if (e.stopPropagation) e.stopPropagation();
const now = Date.now();
if (now < catsWheelLock) return;
catsWheelAcc += d;
if (Math.abs(catsWheelAcc) < 20) return;
catsWheelAcc = 0;
catsWheelLock = now + 150;
catsGoTo(cur + (d > 0 ? 1 : -1));
}, { passive: false });
function catsGoTo(p) {
const g = catsGeom();
if (!g.more) return;
const idx = Math.max(0, Math.min(g.pages - 1, p - 1));
const to = Math.min(catsTrack.scrollHeight - g.visH, idx * g.visH);
catsSeek = idx + 1;
catsSeekUntil = Date.now() + 1500;
if (catsTrack.scrollTo) catsTrack.scrollTo({ top: to, behavior: 'smooth' });
else catsTrack.scrollTop = to;
}
catsTrack.addEventListener('scroll', catsSync);
window.addEventListener('resize', catsSync);
function catsOf(type) {
const out = [];
if (type === 'sticker') {
STICKER_PACKS.forEach(function (pk) {
if (pk.list && pk.list.length) out.push({ key: pk.key, name: pk.name, count: pk.list.length });
});
} else {
NATIVE_PACKS.forEach(function (p) {
const l = nativePackData(p.key);
if (l && l.length) out.push({ key: p.key, name: p.name, count: l.length });
});
CUSTOM_EMOJI_PACKS.forEach(function (pk) {
if (pk.list && pk.list.length) out.push({ key: pk.key, name: pk.name, count: pk.list.length });
});
if (TIEBA_EMOJI_ALL.length) out.push({ key: 'tieba', name: '贴吧表情', count: TIEBA_EMOJI_ALL.length });
}
let total = 0;
out.forEach(function (c) { total += c.count; });
out.unshift({ key: CAT_ALL, name: '全部', count: total });
out.splice(1, 0, { key: CAT_HIST, name: '历史', count: histShown(type), hist: true });
return out;
}
function catsHas(type, key) {
const list = catsOf(type);
for (let i = 0; i < list.length; i++) if (list[i].key === key) return true;
return false;
}
function renderCats(type) {
if (curCat !== CAT_ALL && !catsHas(type, curCat)) curCat = CAT_ALL;
catsTrack.innerHTML = '';
catsOf(type).forEach(function (c) {
const chip = document.createElement('span');
chip.className = 'spp-emoji-cat' + (c.key === curCat ? ' spp-active' : '');
chip.dataset.cat = c.key;
const nm = document.createElement('b');
nm.textContent = c.name;
chip.appendChild(nm);
if (c.count || !c.hist) {
const ct = document.createElement('i');
ct.textContent = c.count;
chip.appendChild(ct);
}
chip.addEventListener('click', function () {
curCat = c.key;
catMemPut(type, c.key);
renderGrid(type);
emojiGrid.scrollTop = 0;
syncEmojiLayout();
});
catsTrack.appendChild(chip);
});
if (window.requestAnimationFrame) requestAnimationFrame(catsSync); else catsSync();
}
function groupHead(name, count) {
const hd = document.createElement('div');
hd.className = 'spp-emoji-group';
hd.textContent = name;
if (count) {
const n = document.createElement('i');
n.textContent = count;
hd.appendChild(n);
}
emojiGrid.appendChild(hd);
return hd;
}
function renderStickerGrid() {
STICKER_PACKS.forEach(function (pk) {
if (!pk.list || !pk.list.length) return;
if (curCat !== CAT_ALL && curCat !== pk.key) return;
if (curCat === CAT_ALL) groupHead(pk.name, pk.list.length);
pk.list.forEach(function (e) {
const cdn = e.url || (HUAJI_CDN_BASE + encodeURIComponent(e.file));
appendEmojiImg(cdn, e.name, function (img) {
if (e.alt && img.src !== e.alt) { img.src = e.alt; return true; }
if (!e.file || !e.url || img.src === e.url) return false;
img.src = e.url;
return true;
}, function () {
histPush('sticker', pk.key, histAbs(cdn), e.name);
histRenderGrid('sticker');
insertEmojiTag(cdn);
}, e.anim);
});
});
}
function renderEmojiGrid() {
let native = 0;
NATIVE_PACKS.forEach(function (p) {
const list = nativePackData(p.key);
if (!list || !list.length) return;
if (curCat !== CAT_ALL && curCat !== p.key) return;
if (curCat === CAT_ALL) groupHead(p.name, list.length);
list.forEach(function (it) {
appendEmojiImg(it.src, it.title || String(it.id), null, function () {
histPush('emoji', p.key, histAbs(it.src), it.title || '');
histRenderGrid('emoji');
if (typeof addsmile === 'function') addsmile(it.id);
}, false);
native += list.length;
});
});
if (!native && curCat === CAT_ALL) {
defaultEmojiData.forEach(function (d) {
const clone = d.el.cloneNode(true);
const siteTitle = clone.getAttribute('title') || '';
clone.removeAttribute('title');
clone.querySelectorAll('[title]').forEach(function (el) { el.removeAttribute('title'); });
const cs = histAbs(clone.getAttribute('src'));
if (cs) clone.addEventListener('click', function () {
histPush('emoji', 'default', cs, siteTitle);
histRenderGrid('emoji');
});
emojiGrid.appendChild(clone);
});
}
CUSTOM_EMOJI_PACKS.forEach(function (pk) {
if (!pk.list || !pk.list.length) return;
if (curCat !== CAT_ALL && curCat !== pk.key) return;
if (curCat === CAT_ALL) groupHead(pk.name, pk.list.length);
pk.list.forEach(function (e) {
appendEmojiImg(e.url, e.name, null, function () {
histPush('emoji', pk.key, histAbs(e.url), e.name);
histRenderGrid('emoji');
insertEmojiTag(e.url);
}, e.anim);
});
});
const tiebaOn = (curCat === CAT_ALL || curCat === 'tieba') && TIEBA_EMOJI_ALL.length;
if (tiebaOn && curCat === CAT_ALL) groupHead('贴吧表情', TIEBA_EMOJI_ALL.length);
if (tiebaOn) TIEBA_EMOJI_ALL.forEach(function (e) {
const src = e.url || (TIEBA_CDN_BASE + e.id + '.png');
appendEmojiImg(src, e.name, null, function () {
histPush('emoji', 'tieba', histAbs(src), e.name);
histRenderGrid('emoji');
insertEmojiTag(src);
}, false);
});
if (!emojiGrid.childNodes.length) {
const empty = document.createElement('div');
empty.className = 'spp-emoji-empty';
empty.textContent = '这一栏没东西可放(表情数据没拿到)';
emojiGrid.appendChild(empty);
}
}
function renderGrid(type) {
renderCats(type);
emojiGrid.innerHTML = '';
curGridType = type;
histRenderGrid(type);
if (curCat === CAT_HIST) {
if (!emojiGrid.childNodes.length) {
const none = document.createElement('div');
none.className = 'spp-emoji-empty';
none.textContent = '还没有记录 —— 点过的表情会自动记在这儿(每页每个板块各留 ' + EMOJI_HIST_MAX + ' 条)';
emojiGrid.appendChild(none);
}
} else if (type === 'sticker') renderStickerGrid();
else renderEmojiGrid();
SPP_TIP.delegate(emojiGrid, 'spp-tip-emoji');
}
function makeTab(label, type, active, tip) {
const tab = document.createElement('span');
tab.className = 'spp-emoji-tab' + (active ? ' spp-active' : '');
tab.textContent = label;
tab.dataset.type = type;
if (tip) SPP_TIP.attach(tab, tip);
tab.addEventListener('click', function() {
tabs.querySelectorAll('.spp-emoji-tab').forEach(function(t) { t.classList.remove('spp-active'); });
tab.classList.add('spp-active');
curCat = CAT_DEF[type] || CAT_ALL;
const catMemTab = catMemOk(type);
if (catMemTab) curCat = catMemTab;
renderGrid(type);
catsTrack.scrollTop = 0;
catsSeek = 0;
catsSeekUntil = 0;
catsWheelAcc = 0;
emojiGrid.scrollTop = 0;
syncEmojiLayout();
});
return tab;
}
tabs.appendChild(makeTab('emoji', 'emoji', false));
tabs.appendChild(makeTab('贴纸', 'sticker', true));
const legendEl = emojiFieldset.querySelector('legend');
if (legendEl) {
while (legendEl.firstChild) legendEl.removeChild(legendEl.firstChild);
legendEl.appendChild(tabs);
tabs.classList.add('spp-emoji-tabs--inlegend');
} else if (menuShow) {
emojiFieldset.insertBefore(tabs, menuShow);
} else {
emojiFieldset.appendChild(tabs);
}
if (menuShow) {
emojiFieldset.insertBefore(catsBar, menuShow);
emojiFieldset.insertBefore(emojiGrid, menuShow);
} else {
emojiFieldset.appendChild(catsBar);
emojiFieldset.appendChild(emojiGrid);
}
const nativeHost = document.createElement('div');
nativeHost.className = 'spp-face-native-host';
emojiFieldset.appendChild(nativeHost);
function homeNative() {
const list = document.querySelectorAll('body > div.menu');
for (let i = 0; i < list.length; i++) {
const m = list[i];
if (!m.querySelector('#showface, #buttons.face')) continue;
if (m.parentElement === nativeHost) return;
m.classList.add('spp-face-native');
nativeHost.appendChild(m);
emojiFieldset.classList.add('spp-face-native-on');
emojiGrid.style.maxHeight = '160px';
emojiGrid.style.minHeight = '160px';
}
}
homeNative();
new MutationObserver(homeNative).observe(document.body, { childList: true });
document.addEventListener('click', function (e) {
const t = e.target;
if (!t || !t.closest || !t.closest('#td_face, #smiliebox')) return;
setTimeout(homeNative, 0);
setTimeout(homeNative, 200);
}, true);
renderGrid('sticker');
const isCompactEmoji = SEARCH.includes('action-quote') || SEARCH.includes('action-modify');
function syncEmojiLayout() {
const toolbar = document.querySelector('.spp-editor-toolbar');
const ta = document.querySelector('textarea[name="atc_content"]');
if (!ta) return;
const previewPane = document.getElementById('spp-preview-pane');
let contentH = ta.offsetHeight;
if (contentH <= 0 && previewPane && previewPane.style.display !== 'none') {
contentH = previewPane.offsetHeight;
}
if (contentH <= 0) return;
let legendH = 0;
const leg = emojiFieldset.querySelector('legend');
if (leg) legendH = leg.offsetHeight;
const tabsInLegend = !!(leg && tabs && tabs.parentElement === leg);
const tabsH = (!tabsInLegend && tabs) ? tabs.offsetHeight : 0;
const catsH = catsBar ? catsBar.offsetHeight + 4 : 0;
const chromeH = legendH + catsH + tabsH + 24;
const fsTop = emojiFieldset.getBoundingClientRect().top;
let avail = 0;
const cell = emojiFieldset.closest('td.f_one, td, .t_f_one') || emojiFieldset.parentElement;
if (cell) avail = cell.getBoundingClientRect().bottom - fsTop - 12;
if (isCompactEmoji) {
const optT = document.querySelector('.t.f_one > table:has(#post-option)');
if (optT) avail = optT.getBoundingClientRect().top - fsTop - 16;
const viewRoom = window.innerHeight - Math.max(0, fsTop) - 16;
if (viewRoom > 200) avail = Math.min(avail, viewRoom);
}
let gridH;
if (avail > chromeH + 150) {
gridH = Math.max(150, Math.min(900, avail - chromeH));
} else {
const editorH = ((toolbar ? toolbar.offsetHeight : 0) + contentH) * 1.5;
gridH = Math.max(320, Math.min(900, editorH - chromeH));
}
emojiGrid.style.maxHeight = gridH + 'px';
emojiGrid.style.minHeight = gridH + 'px';
emojiGrid.style.overflowY = 'auto';
}
syncEmojiLayout();
setTimeout(syncEmojiLayout, 300);
window.addEventListener('resize', syncEmojiLayout);
window.addEventListener('spp-preview-toggle', function() {
requestAnimationFrame(syncEmojiLayout);
});
if (window.ResizeObserver) {
const ro = new ResizeObserver(function() { syncEmojiLayout(); });
const ta = document.querySelector('textarea[name="atc_content"]');
if (ta) ro.observe(ta);
}
}
onDomReady(() => setTimeout(tryPatch, 500));
}
function sppScopeAll(sel, rootSet) {
if (!rootSet || !rootSet.length) return Array.prototype.slice.call(document.querySelectorAll(sel));
const out = [];
for (let i = 0; i < rootSet.length; i++) {
const n = rootSet[i];
if (!n || n.nodeType !== 1) continue;
if (n.matches(sel)) out.push(n);
const inner = n.querySelectorAll(sel);
for (let j = 0; j < inner.length; j++) out.push(inner[j]);
}
return out;
}
function initTipadMerge(rootSet) {
if (!WANTS.readOnly) return;
function normalizeSeps(fr) {
if (!fr || fr.dataset.sppSepDone) return;
fr.dataset.sppSepDone = '1';
Array.prototype.slice.call(fr.childNodes).forEach(n => {
if (n.nodeType !== 3 || n.textContent.trim() !== '|') return;
const s = document.createElement('span');
s.className = 'spp-tp-sep';
s.textContent = '|';
fr.replaceChild(s, n);
});
}
onDomReady(() => {
sppScopeAll('.t5.t2 .tiptop .fr', rootSet).forEach(normalizeSeps);
sppScopeAll('.t5.t2', rootSet).forEach(post => {
const tiptop = post.querySelector('.tiptop');
const tipad = post.querySelector('.tipad');
if (!tiptop || !tipad) return;
const dingduan = tipad.querySelector('a[title="顶端"]');
const huifu = tipad.querySelector('.huifu a');
const yinyong = tipad.querySelector('.yinyong a');
const gengduo = tipad.querySelector('.dropB');
let fr = tiptop.querySelector('.fr');
if (!fr) {
fr = document.createElement('div');
fr.className = 'fr';
fr.style.cssText = 'overflow:hidden;display:flex;align-items:center;gap:6px;flex-wrap:wrap;';
tiptop.appendChild(fr);
} else {
fr.style.display = 'flex';
fr.style.alignItems = 'center';
fr.style.gap = '6px';
fr.style.flexWrap = 'wrap';
}
normalizeSeps(fr);
const addSep = () => {
const sep = document.createElement('span');
sep.className = 'spp-tp-sep';
sep.textContent = '|';
fr.appendChild(sep);
};
if (fr.children.length > 0) addSep();
[dingduan, huifu, yinyong, gengduo].forEach(el => {
if (!el) return;
const wrapper = document.createElement('span');
wrapper.appendChild(el);
fr.appendChild(wrapper);
addSep();
});
while (fr.lastChild?.tagName === 'SPAN' && fr.lastChild.textContent.trim() === '|') {
fr.removeChild(fr.lastChild);
}
tipad.remove();
const tpc = post.querySelector('.tpc_content');
if (tpc) {
const text = tpc.textContent.replace(/[\s]/g, '');
const hasContent = tpc.querySelector('img, a[href], iframe, blockquote, embed, video, .f14')
|| text.length > 5;
if (!hasContent) {
const postTr = post.querySelector('.tr1.r_one');
if (postTr) postTr.style.display = 'none';
}
}
});
});
}
function sppFloorMarks(rootSet) {
try {
const floors = (rootSet && rootSet.length)
? Array.prototype.filter.call(rootSet, function (n) { return n && n.nodeType === 1 && n.matches && n.matches('.t5.t2'); })
: Array.prototype.slice.call(document.querySelectorAll('#main > form[name="delatc"] > .t5.t2'));
floors.forEach(function (f) {
const rows = f.querySelectorAll(':scope > table.js-post > tbody > tr');
for (let i = 0; i < rows.length; i++) {
const tr = rows[i];
tr.classList.toggle('spp-st-notips', !tr.querySelector('.tips'));
tr.classList.toggle('spp-st-natt', !tr.querySelector('div[id^="att_"]'));
}
});
} catch (e) { }
}
function initBountyTips(rootSet) {
if (!WANTS.readOnly) return;
onDomReady(() => {
sppFloorMarks(rootSet);
sppScopeAll('.t5.t2 .tips', rootSet).forEach(tips => {
if (tips.dataset.sppBnDone) return;
const rows = tips.querySelectorAll('div.tac');
if (!rows.length) return;
tips.dataset.sppBnDone = '1';
rows.forEach(row => {
const m = /^([^::]{1,12})[::]\s*([\s\S]+)$/.exec((row.textContent || '').trim());
if (!m) return;
const k = document.createElement('span');
k.className = 'spp-bn__k';
k.textContent = m[1];
const v = document.createElement('b');
v.className = 'spp-bn__v';
v.textContent = m[2];
row.textContent = '';
row.appendChild(k);
row.appendChild(v);
});
});
});
}
function initPostSignInline(rootSet) {
if (!WANTS.readOnly) return;
onDomReady(() => {
sppScopeAll('.t5.t2', rootSet).forEach(post => {
const top = post.querySelector('.tiptop');
if (!top || top.querySelector('.spp-sign-inline')) return;
const cell = post.querySelector('#td_tpc') || post;
const cand = cell.querySelectorAll('.sign, .signature, [class~="sign"]');
let sig = null;
for (let i = 0; i < cand.length; i++) {
const el = cand[i];
if (el.closest('.spp-sign-inline')) continue;
if (/(^|\s)spp-/.test(el.className || '')) continue;
sig = el;
break;
}
if (!sig) return;
const slot = document.createElement('div');
slot.className = 'spp-sign-inline';
slot.appendChild(sig);
const tspan = top.querySelector('span.fl.gray');
if (tspan && tspan.parentNode) {
tspan.parentNode.insertBefore(slot, tspan.nextSibling);
} else {
const fr = top.querySelector('.fr');
if (fr) top.insertBefore(slot, fr); else top.appendChild(slot);
}
});
});
}
const HOME_NAV_CSS = `
.spp-hbtn {
    box-sizing:border-box !important;
    position:relative !important;
    display:inline-flex !important; align-items:center !important; justify-content:center !important;
    flex:0 0 auto !important;
    width:26px !important; height:26px !important;
    min-width:26px !important; min-height:26px !important;
    max-width:26px !important; max-height:26px !important;
    padding:0 !important; margin:0 !important;
    border-width:0 !important; border-style:solid !important; border-radius:0 !important;
    box-shadow:none !important;
    background:transparent !important;
    transition:all 200ms ease !important;
    overflow:visible !important;
    vertical-align:middle !important; cursor:pointer !important; outline:0 !important;
    -webkit-appearance:none !important; appearance:none !important;
    font-size:0 !important; line-height:0 !important; letter-spacing:0 !important;
    text-decoration:none !important; text-shadow:none !important; text-transform:none !important;
    user-select:none !important; -webkit-user-select:none !important;
    -webkit-tap-highlight-color:transparent !important; touch-action:manipulation !important;
}
.spp-hbtn > svg {
    box-sizing:border-box !important; display:block !important;
    width:20px !important; height:20px !important; max-width:100% !important; max-height:100% !important;
    margin:0 !important; padding:0 !important; fill:none !important;
    stroke:currentColor !important; stroke-width:1.9 !important;
    stroke-linecap:round !important; stroke-linejoin:round !important;
    pointer-events:none !important;
    transform-origin:50% 50% !important;
    transition:transform 200ms ease, filter 200ms ease, stroke 200ms ease !important;
    will-change:transform, filter !important;
}
.spp-hbtn:focus-visible { outline:2px solid currentColor !important; outline-offset:2px !important; }
.spp-hbtn--light { background:transparent !important; border-color:transparent !important; color:#3b82f6 !important; }
.spp-hbtn--light:hover, .spp-hbtn--light:focus-visible, .spp-hbtn--light.is-active {
    color:#2563eb !important; background:transparent !important;
}
.spp-hbtn--dark { background:transparent !important; border-color:transparent !important; color:#ffffff !important; }
.spp-hbtn--dark:hover, .spp-hbtn--dark:focus-visible, .spp-hbtn--dark.is-active {
    color:#60a5fa !important; background:transparent !important;
}
.spp-hbtn:hover > svg,
.spp-hbtn:focus-visible > svg,
.spp-hbtn.is-active > svg,
html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap:hover .spp-hbtn > svg,
html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap.is-active .spp-hbtn > svg {
    transform:scale(1.1) !important;
    filter:drop-shadow(0 0 5px rgba(96,165,250,.65)) !important;
    stroke-dasharray:100 !important;
    animation:sppHbtnDraw 600ms cubic-bezier(.22,1,.36,1) both !important;
}
@keyframes sppHbtnDraw {
    from { stroke-dashoffset:100; }
    to   { stroke-dashoffset:0; }
}
@media (prefers-reduced-motion: reduce) {
    .spp-hbtn > svg { transition:none !important; will-change:auto !important; }
    .spp-hbtn:hover > svg, .spp-hbtn:focus-visible > svg, .spp-hbtn.is-active > svg,
    html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap:hover .spp-hbtn > svg,
    html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap.is-active .spp-hbtn > svg {
        animation:none !important; transform:none !important;
        filter:none !important; stroke-dasharray:none !important;
    }
}
html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap {
    position:relative !important; box-sizing:border-box !important; display:inline-flex !important;
    align-items:center !important; justify-content:center !important;
    width:26px !important; height:26px !important; flex:0 0 auto !important;
    margin:0 2px 0 0 !important; padding:0 !important; vertical-align:middle !important;
    line-height:1 !important; font-size:0 !important;
}
html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap > img {
    position:absolute !important; inset:0 !important; z-index:3 !important;
    width:100% !important; height:100% !important; margin:0 !important; padding:0 !important;
    border:0 !important; opacity:0 !important; cursor:pointer !important;
}
html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap:hover .spp-hbtn,
html.spp-hbtn-on #breadcrumbs .crumbs-item .spp-hbtn-wrap.is-active .spp-hbtn {
    color:#60a5fa !important; background:transparent !important; box-shadow:none !important;
}
.spp-navmenu.spp-navout { animation:sppNavOut .24s cubic-bezier(.22,1,.36,1) both !important; }
@keyframes sppNavOut {
    from { opacity:0 !important; transform:translateY(-10px) !important; }
    to   { opacity:1 !important; transform:translateY(0) !important; }
}
`;
function initCrumbHomeNav() {
if (!WANTS.homeNav) return;
const HOME_SVG = '<svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">'
+ '<path pathLength="100" d="M2.25 12 11.2 3.05a1.2 1.2 0 0 1 1.6 0L21.75 12"></path>'
+ '<path pathLength="100" d="M4.8 9.75V19.5A1.5 1.5 0 0 0 6.3 21h2.7v-5.4a1.5 1.5 0 0 1 1.5-1.5h3a1.5 1.5 0 0 1 1.5 1.5V21h2.7a1.5 1.5 0 0 0 1.5-1.5V9.75"></path></svg>';
let seq = 0;
let leaveT = 0;
let pinnedHost = null;
function unpin() {
if (!pinnedHost) return;
pinnedHost.classList.remove('is-active');
pinnedHost = null;
}
document.addEventListener('click', (e) => {
if (pinnedHost && !pinnedHost.contains(e.target)) { const h = pinnedHost; unpin(); closeNav(h); }
}, true);
const WIN = (function () {
try { return (typeof unsafeWindow !== 'undefined' && unsafeWindow) ? unsafeWindow : window; }
catch (e) { return window; }
})();
function pageRead() { try { return WIN.read || null; } catch (e) { return null; } }
function openNav(img) {
const R = pageRead();
if (R && R.open) {
try {
if (!img.id) img.id = 'spp-hcate-' + (++seq);
R.open('menu_cate', img.id, 1, 0);
} catch (e) { return; }
} else {
try { img.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true })); }
catch (e) { return; }
}
const m = R && R.menu;
if (!m || !m.classList) return;
m.classList.add('spp-navmenu');
m.classList.remove('spp-navout');
void m.offsetWidth;
m.classList.add('spp-navout');
}
function closeNav(host) {
const R = pageRead();
if (R && R.close) { try { R.close(); } catch (e) {} return; }
const img = host && host.querySelector ? host.querySelector('img') : null;
if (img) { try { img.dispatchEvent(new MouseEvent('mouseout', { bubbles: true, cancelable: true })); } catch (e) {} }
}
function holdOpen(img) {
img.onmouseout = null;
}
onDomReady(() => {
ensureStyle('spp-hbtn-style', HOME_NAV_CSS);
document.documentElement.classList.add('spp-hbtn-on');
document.querySelectorAll('#breadcrumbs .crumbs-item').forEach(item => {
const img = item.querySelector('img[src*="home"]');
if (!img || item.querySelector('.spp-hbtn-wrap')) return;
const host = document.createElement('span');
host.className = 'spp-hbtn-wrap';
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'spp-hbtn spp-hbtn--dark';
btn.setAttribute('aria-label', '版块导航');
btn.innerHTML = HOME_SVG;
host.appendChild(btn);
host.appendChild(img);
item.appendChild(host);
img.classList.add('spp-hbtn-hit');
if (pageRead()) {
img.removeAttribute('onmouseover');
img.removeAttribute('onmouseout');
}
img.style.setProperty('position', 'absolute', 'important');
img.style.setProperty('inset', '0', 'important');
img.style.setProperty('width', '100%', 'important');
img.style.setProperty('height', '100%', 'important');
img.style.setProperty('margin', '0', 'important');
img.style.setProperty('padding', '0', 'important');
img.style.setProperty('border', '0', 'important');
host.addEventListener('mouseenter', () => {
clearTimeout(leaveT);
host.classList.add('is-active');
openNav(img);
});
host.addEventListener('mouseleave', () => {
if (pinnedHost === host) return;
clearTimeout(leaveT);
leaveT = setTimeout(() => {
const R = pageRead();
const m = R && R.menu;
if (m && m.classList.contains('spp-navout') && m.matches(':hover')) return;
host.classList.remove('is-active');
closeNav(host);
}, 140);
});
host.addEventListener('click', (ev) => {
ev.preventDefault();
ev.stopPropagation();
clearTimeout(leaveT);
const R = pageRead();
const m = R && R.menu;
const open = !!(m && getComputedStyle(m).display !== 'none' && m.classList.contains('spp-navout'));
if (open && pinnedHost === host) {
unpin();
closeNav(host);
return;
}
if (open) {
unpin();
pinnedHost = host;
host.classList.add('is-active');
holdOpen(img);
return;
}
unpin();
pinnedHost = host;
host.classList.add('is-active');
openNav(img);
holdOpen(img);
});
});
});
}
function initFastReply() {
if (!WANTS.readOnly) return;
onDomReady(() => {
const box = document.querySelector('div.t5:has(textarea[name="atc_content"])');
if (!box) return;
box.style.setProperty('background-color', 'var(--spp-qr-bg, var(--spu-surface, #ffffff))', 'important');
box.style.setProperty('background-image', 'var(--spp-qr-bgi, none)', 'important');
const td = box.querySelector('td.f_one:has(input[name="atc_usesign"])');
if (td) {
td.querySelectorAll('input[type="checkbox"]').forEach(cb => {
if (cb.dataset.sppFrOpt) return;
if (cb.closest('.spp-editor-toolbar')) return;
const next = cb.nextSibling;
if (!next || next.nodeType !== 3) return;
const label = document.createElement('label');
label.className = 'spp-fr-opt';
cb.parentNode.insertBefore(label, cb);
label.appendChild(cb);
label.appendChild(next);
cb.dataset.sppFrOpt = '1';
});
}
const sub = box.querySelector('input[name="Submit"]');
const pv = document.getElementById('spp-preview-btn');
if (sub && pv && pv.parentElement === sub.parentElement
&& !sub.parentElement.querySelector(':scope > .spp-fr-actions')) {
const wrap = document.createElement('span');
wrap.className = 'spp-fr-actions';
sub.parentElement.insertBefore(wrap, sub);
wrap.appendChild(sub);
wrap.appendChild(pv);
}
});
}
let CSS_READ_DARK = `
/* ===== SPP-READDARK-BEGIN ===== */

html.spp-rdark.spp-rdark #main > form.spp-flow,
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) {
    --spu-surface:#2c2c2e;
    --spu-overlay:#3a3a3c;
    --spu-text:#f5f5f7;
    --spu-secondary:#b6c3d6;
    --spu-muted:#93a1b5;
    --spu-border:rgba(255,255,255,.14);
    --spu-accent:#3fbfa8;
    --spu-accent-dim:#2f8f7e;
    --spp-hole:rgba(255,255,255,.06);
    --spp-rk-text:#f5f5f7;
    --spp-rk-line:rgba(255,255,255,.12);
    --spp-rk-hair:rgba(255,255,255,.07);
    --spp-rk-link:#8ef0b8;
    --spp-rk-glass:rgb(0 0 0 / .86);
    --spp-rk-sheen:linear-gradient(152deg, rgba(255,255,255,.03) 0%, rgba(0,0,0,0) 55%);
    --spp-qr-bg:var(--spp-rk-glass);
    --spp-qr-bgi:var(--spp-rk-sheen);
}
html.spp-rdark.spp-rdark #main > form.spp-flow {
    --spp-flow-bg:var(--spp-rk-glass);
    --spp-flow-bgi:var(--spp-rk-sheen);
    --spp-flow-edge:var(--spp-rk-line);
    --spp-flow-hair:var(--spp-rk-hair);
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2.spp-flow-row {
    color:var(--spp-rk-text) !important;
    -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
    backdrop-filter:blur(18px) saturate(140%) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 * {
    background-color:transparent !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .spp-tp-sep {
    background-color:var(--spp-rk-line) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 hr {
    background-color:var(--spp-rk-line) !important;
    border-color:var(--spp-rk-line) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .user-info.spp-ucard,
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .user-infoWrap {
    background-color:rgba(17,23,35,.97) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .spp-uc__rows,
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .spp-uc__v {
    background-color:var(--spp-hole) !important;
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 * {
    border-color:var(--spp-rk-hair) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 :is(img, .tiptop, .user-infoWrap, .dropdown-content.menu, .spp-uc__rows),
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .user-info.spp-ucard .listread ul {
    border-color:var(--spp-rk-line) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .spp-uc__row + .spp-uc__row {
    box-shadow:inset 0 1px 0 var(--spp-rk-hair) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .user-info.spp-ucard > .user-infoWrap::before {
    background-color:rgba(17,23,35,.97) !important;
    border-color:var(--spp-rk-hair) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .dropdown-content.menu {
    background-color:var(--spu-overlay) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .dropdown-content.menu.menu > a:hover {
    background-color:rgba(255,255,255,.09) !important;
}
html.spp-rdark.spp-rdark #main div.t5:has(textarea[name="atc_content"]) {
    border-color:var(--spp-rk-line) !important;
}
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) :is(table, tr, td) {
    border-color:var(--spp-rk-hair) !important;
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .tiptop :is(a, b, span:not(.spp-tp-sep)) {
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 th.r_two,
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 th.r_two a {
    color:var(--spp-rk-text) !important;
    -webkit-text-fill-color:var(--spp-rk-text) !important;
}
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 .tpc_content a {
    color:var(--spp-rk-link) !important;
    -webkit-text-fill-color:var(--spp-rk-link) !important;
}
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 .user-info.spp-ucard :is(a, span, li, b) {
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 .user-info.spp-ucard .spp-uc__v {
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 .user-info.spp-ucard .spp-uc__row.is-post .spp-uc__v {
    color:var(--spu-accent) !important;
    -webkit-text-fill-color:var(--spu-accent) !important;
}
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 .user-info.spp-ucard .spp-uc__row.is-sp .spp-uc__v {
    color:#f0b357 !important;
    -webkit-text-fill-color:#f0b357 !important;
}
html.spp-rdark.spp-rdark #main > form.spp-flow > .t5.t2 .spp-rk-lift {
    color:#eef3fb !important;
    -webkit-text-fill-color:#eef3fb !important;
}

html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) {
    -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
    backdrop-filter:blur(18px) saturate(140%) !important;
}
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) :is(input:not([type="checkbox"]), textarea, select) {
    background-color:var(--spu-surface) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) :is(button, .spp-tb-tblui input) {
    background-color:var(--spp-hole) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) .spp-tb-row > span {
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
    font-weight:700 !important;
}
html.spp-rdark.spp-rdark .spp-editor-toolbar .spp-tb-row > span {
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
    font-weight:700 !important;
}

td.spp-opt-src { display: none !important; }
td.f_one:has(#smiliebox) { width: 33% !important; }
td.f_one:has(#smiliebox) > div { width: 100% !important; padding-top: 7px !important; }

.spp-opt-pill, .spp-opt-num {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 2px 9px; border-radius: 14px;
    border: 1px solid var(--spu-border,#E8E3D8);
    background: var(--spu-surface,#fff); color: var(--spu-text,#333);
    font-size: 11px; line-height: 18px; font-weight: 600;
    cursor: pointer; user-select: none; white-space: nowrap;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.spp-opt-pill:hover, .spp-opt-num:hover { border-color: var(--spu-accent,#C75B39); }
.spp-opt-pill > input[type="checkbox"] { display: none !important; }
.spp-opt-pill:has(> input:checked) {
    background: var(--spu-accent,#C75B39) !important;
    border-color: var(--spu-accent,#C75B39) !important;
    color: #fff !important;
}
.spp-opt-pill:has(> input:checked) > span::before { content: "✓ "; }
.spp-opt-pill:has(> input:disabled), .spp-opt-num:has(> input:disabled),
.spp-opt-pill.spp-opt-off, .spp-opt-num.spp-opt-off {
    opacity: 0.45 !important; cursor: not-allowed !important;
}
.spp-opt-pill:has(> input:disabled):hover, .spp-opt-num:has(> input:disabled):hover {
    border-color: var(--spu-border,#E8E3D8) !important;
}

.spp-opt-num > input[type="checkbox"] {
    appearance: none; -webkit-appearance: none;
    position: absolute; width: 0; height: 0; margin: 0; padding: 0; border: 0; opacity: 0;
}
.spp-opt-num:has(> input:checked) { border-color: var(--spu-accent,#C75B39) !important; }
.spp-opt-num:has(> input:checked) > .spp-opt-gate-lbl::before { content: "✓ "; }
.spp-opt-gate-lbl { cursor: pointer; }
.spp-opt-num > input[type="text"] {
    width: 34px !important; text-align: center !important;
    padding: 0 2px !important; border-radius: 8px !important; font-size: 11px !important;
}
.spp-opt-num > select {
    font-size: 11px !important; padding: 0 2px !important;
    border-radius: 8px !important; max-width: 66px !important;
}

div.t5:has(textarea[name="atc_content"]) tr:has(> td.h2 > b) { display: none !important; }

div.t5:has(textarea[name="atc_content"]) table:has(> tbody#attach) { width: 100% !important; }

div.t5:has(textarea[name="atc_content"]) table:has(> tbody#attach) :is(
    input[name^="atc_desc"], input[name^="attachment_"]
) { width: 100% !important; box-sizing: border-box !important; }

div.t5:has(textarea[name="atc_content"]) table:has(> tbody#attach) td:empty { width: 0 !important; }

div.t5:has(textarea[name="atc_content"]) table:has(> tbody#attach) tr > td:first-child { width: 60% !important; }

div.t5:has(textarea[name="atc_content"]) table:has(> tbody#attach) { box-sizing: border-box !important; }

div.t5:has(textarea[name="atc_content"]) input[name="atc_title"] {
    vertical-align: top !important;
}

html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) :is(tr, td, table) {
    color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) td.h2,
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) td.h2 a {
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark #smiliebox {
    background-color:var(--spu-surface) !important;
    border-color:var(--spu-border) !important;
}
    /* 黑底反相取亮,让颜文字可见 */
    html.spp-rdark.spp-rdark #main img[src*="/kaomoji/"] { filter:brightness(0) invert(.88) !important; }
    /* 悬停底板会被同一条反相规则一起染白,改成只留一圈浅色描边 */
    html.spp-rdark.spp-rdark #main .spp-emoji-grid img[src*="/kaomoji/"]:hover {
        background: transparent !important;
        border-color: rgba(255,255,255,.55) !important;
        box-shadow: none !important;
    }
html.spp-rdark.spp-rdark #smiliebox :is(.spp-emoji-cat, .spp-emoji-tab) {
    background-color:var(--spu-overlay) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark #smiliebox :is(.spp-emoji-cat, .spp-emoji-tab).spp-active {
    background-color:rgba(63,191,168,.16) !important;
    border-color:rgba(63,191,168,.72) !important;
    color:#eafff8 !important;
    -webkit-text-fill-color:#eafff8 !important;
    box-shadow:0 0 12px -2px rgba(63,191,168,.75), inset 0 0 10px rgba(63,191,168,.20) !important;
    text-shadow:0 0 8px rgba(63,191,168,.55) !important;
}
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) a.abtn {
    background-color:var(--spp-hole) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .r_two:not(.spp-ava-tiled) > div[align="center"] > a {
    background-color:#000000 !important;
    background-image:linear-gradient(180deg, rgba(255,255,255,.10) 0%, rgba(255,255,255,0) 100%) !important;
    color:#f5f5f7 !important;
    -webkit-text-fill-color:#f5f5f7 !important;
    -webkit-backdrop-filter:none !important;
    backdrop-filter:none !important;
}
html.spp-rdark.spp-rdark { background-color:#000000 !important; }
html.spp-rdark.spp-rdark #spp-starfield {
    background:radial-gradient(ellipse at bottom, #1d1d1f 0%, #000000 100%) !important;
}

html.spp-rdark.spp-rdark.spp-post-on #main {
    --spu-surface:#2c2c2e;
    --spu-overlay:#3a3a3c;
    --spu-text:#f5f5f7;
    --spu-secondary:#b6c3d6;
    --spu-muted:#93a1b5;
    --spu-border:rgba(255,255,255,.14);
    --spu-accent:#3fbfa8;
    --spu-accent-dim:#2f8f7e;
    --spp-hole:rgba(255,255,255,.06);
    --spp-rk-text:#f5f5f7;
    --spp-rk-line:rgba(255,255,255,.12);
    --spp-rk-hair:rgba(255,255,255,.07);
    --spp-rk-link:#8ef0b8;
    --spp-rk-glass:rgb(0 0 0 / .86);
    --spp-rk-sheen:linear-gradient(152deg, rgba(255,255,255,.03) 0%, rgba(0,0,0,0) 55%);
}
html.spp-rdark.spp-rdark.spp-post-on #main .t.f_one {
    box-sizing:border-box !important;
    background-color:var(--spp-rk-glass) !important;
    background-image:var(--spp-rk-sheen) !important;
    color:var(--spp-rk-text) !important;
    border-color:var(--spp-rk-hair) !important;
    -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
    backdrop-filter:blur(18px) saturate(140%) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .t.f_one :is(td, th, b, strong, label, legend, li, dt, dd, small, em, option, optgroup, p) {
    color:var(--spp-rk-text) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .t.f_one :is(.gray, .f9) {
    color:var(--spu-muted) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .t.f_one :is(input, textarea, select):not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="reset"]):not([type="button"]) {
    background-color:var(--spu-surface) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .t.f_one div:has(> input[name="atc_title"]) {
    background-color:var(--spu-surface) !important;
    border-color:var(--spu-border) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .t.f_one div.t5:not(.spp-t5bar):not(:has(textarea[name="atc_content"])) {
    background-color:var(--spp-hole) !important;
    background-image:none !important;
    border-color:var(--spp-rk-hair) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #editor-content #textarea {
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #editor-tab > span,
html.spp-rdark.spp-rdark.spp-post-on #editor-tool > span,
html.spp-rdark.spp-rdark.spp-post-on #editor-tool > span a {
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #editor-tab > span.buttonPressed {
    background:rgba(63,191,168,.18) !important;
    color:#eafff8 !important;
    -webkit-text-fill-color:#eafff8 !important;
    box-shadow:0 0 10px -2px rgba(63,191,168,.6), inset 0 1px 0 rgba(255,255,255,.10) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #editor-tab > span:hover,
html.spp-rdark.spp-rdark.spp-post-on #editor-tool > span:hover {
    background:rgba(63,191,168,.14) !important;
    color:#eafff8 !important;
    -webkit-text-fill-color:#eafff8 !important;
}

html.spp-rdark.spp-rdark.spp-post-on #main > center { color:var(--spu-muted) !important; }
html.spp-rdark.spp-rdark.spp-post-on #main > table[align="center"] { color:var(--spp-rk-text) !important; }
html.spp-rdark.spp-rdark.spp-post-on #main > table[align="center"] a {
    color:var(--spp-rk-link) !important;
    -webkit-text-fill-color:var(--spp-rk-link) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main > hr {
    background:var(--spp-rk-hair) !important;
    border-color:var(--spp-rk-hair) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main,
html.spp-rdark.spp-rdark div.t5:has(textarea[name="atc_content"]) {
    color-scheme:dark !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .editor-button span {
    border-color:transparent !important;
    border-radius:4px !important;
    filter:invert(1) hue-rotate(180deg) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .editor-button span:hover {
    filter:invert(1) hue-rotate(180deg) brightness(1.3) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main .editor-button span.buttonDisabled {
    opacity:.45 !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main #editor-button img {
    border-color:transparent !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main :is(.tr3 td, .tr3 th) {
    border-bottom-color:var(--spu-border) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main th.h {
    border-bottom-color:var(--spu-border) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main input[type="file"] {
    border-color:var(--spu-border) !important;
    color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark.spp-post-on #main input[type="file"]::file-selector-button {
    box-sizing:border-box !important;
    height:22px !important;
    margin:0 7px 0 0 !important;
    padding:0 11px !important;
    border:1px solid rgba(63,191,168,.42) !important;
    border-radius:6px !important;
    background-color:rgba(63,191,168,.10) !important;
    background-image:none !important;
    color:#9ff0da !important;
    font-family:inherit !important;
    font-size:12px !important;
    font-weight:600 !important;
    cursor:pointer !important;
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__bar {
    background-color:rgba(44,44,46,.92) !important;
    background-image:none !important;
    border-color:var(--spu-border) !important;
    box-shadow:0 1px 2px rgba(0,0,0,.35) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__bar.is-pass,
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__bar.is-done {
    background-color:rgba(63,191,168,.10) !important;
    background-image:none !important;
    border-color:rgba(63,191,168,.34) !important;
    border-left:3px solid rgba(63,191,168,.62) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__bar.is-pass.is-fail {
    background-color:rgba(224,110,92,.12) !important;
    border-color:rgba(224,110,92,.34) !important;
    border-left-color:rgba(224,110,92,.62) !important;
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__tt,
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__t1 {
    color:var(--spu-text) !important;
    -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__t2,
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__facts {
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__num { color:#7ee7c4 !important; -webkit-text-fill-color:#7ee7c4 !important; }
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__dot { background-color:rgba(255,255,255,.28) !important; }
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__seal {
    background-color:rgba(63,191,168,.14) !important;
    border-color:rgba(63,191,168,.34) !important;
    color:#9ff0da !important; -webkit-text-fill-color:#9ff0da !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__seal.is-paid {
    background-color:rgba(240,179,87,.14) !important;
    border-color:rgba(240,179,87,.36) !important;
    color:#f0b357 !important; -webkit-text-fill-color:#f0b357 !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__pill {
    background-color:rgba(63,191,168,.14) !important;
    border-color:rgba(63,191,168,.38) !important;
    color:#9ff0da !important; -webkit-text-fill-color:#9ff0da !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__pill.is-paid {
    background-color:rgba(240,179,87,.14) !important;
    border-color:rgba(240,179,87,.36) !important;
    color:#f0b357 !important; -webkit-text-fill-color:#f0b357 !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__pill.is-busy {
    background-color:rgba(255,255,255,.07) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-muted) !important; -webkit-text-fill-color:var(--spu-muted) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__pill.is-fail {
    background-color:rgba(224,110,92,.14) !important;
    border-color:rgba(224,110,92,.36) !important;
    color:#ffb3a6 !important; -webkit-text-fill-color:#ffb3a6 !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__pic {
    background-color:rgba(63,191,168,.16) !important;
    border-color:rgba(63,191,168,.40) !important;
    color:#9ff0da !important; -webkit-text-fill-color:#9ff0da !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__pic.is-busy {
    background-color:rgba(255,255,255,.07) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-muted) !important; -webkit-text-fill-color:var(--spu-muted) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__pic.is-fail {
    background-color:rgba(224,110,92,.16) !important;
    border-color:rgba(224,110,92,.40) !important;
    color:#ffb3a6 !important; -webkit-text-fill-color:#ffb3a6 !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__btn.is-done {
    background-color:rgba(63,191,168,.14) !important;
    background-image:none !important;
    border-color:rgba(63,191,168,.40) !important;
    color:#9ff0da !important; -webkit-text-fill-color:#9ff0da !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__btn.is-fail {
    background-color:rgba(224,110,92,.14) !important;
    background-image:none !important;
    border-color:rgba(224,110,92,.40) !important;
    color:#ffb3a6 !important; -webkit-text-fill-color:#ffb3a6 !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__fallback { color:#ffb3a6 !important; -webkit-text-fill-color:#ffb3a6 !important; }
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__cf.is-on {
    background-color:rgba(240,179,87,.12) !important;
    border-color:rgba(240,179,87,.30) !important;
    color:#f2c883 !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__cf b {
    background-color:rgba(0,0,0,.28) !important;
    border-color:rgba(240,179,87,.34) !important;
    color:#ffd79a !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__no {
    background-color:rgba(255,255,255,.07) !important;
    border-color:var(--spu-border) !important;
    color:var(--spu-text) !important; -webkit-text-fill-color:var(--spu-text) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.spp-buy .spp-buy__yes {
    background-image:linear-gradient(180deg,#b8493a,#962f24) !important;
    color:#ffffff !important; -webkit-text-fill-color:#ffffff !important;
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 blockquote:not(.blockquote3),
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 blockquote.blockquote {
    background-color:rgba(255,255,255,.05) !important;
    background-image:none !important;
    border-color:var(--spp-rk-hair) !important;
    border-left:4px solid rgba(63,191,168,.45) !important;
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 blockquote.blockquote div {
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 h6.quote2 {
    background-color:transparent !important;
    color:var(--spu-secondary) !important;
    -webkit-text-fill-color:var(--spu-secondary) !important;
}

#main > form.spp-flow > div.t5.t2 h6.quote2,
h6.quote2 {
    background-image:none !important;
    padding-left:0 !important;
}
#main > form.spp-flow > div.t5.t2 blockquote.blockquote3 {
    border:0 !important;
    border-left:3px solid var(--spu-accent,#C75B39) !important;
    border-radius:0 6px 6px 0 !important;
    background-color:color-mix(in srgb, var(--spu-accent,#C75B39) 5%, transparent) !important;
    background-image:none !important;
    padding:10px 16px !important;
    margin:12px 0 !important;
    width:auto !important;
    font-size:inherit !important;
    color:inherit !important;
    -webkit-text-fill-color:inherit !important;
}
#main > form.spp-flow > div.t5.t2 blockquote.blockquote3 > div {
    padding:0 !important;
    color:inherit !important;
    -webkit-text-fill-color:inherit !important;
}
#main > form.spp-flow > div.t5.t2 blockquote.blockquote3 > h6.quote2 {
    display:none !important;
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 blockquote.spp-buy__body {
    background-color:rgba(63,191,168,.09) !important;
    background-image:none !important;
    border-color:rgba(63,191,168,.26) !important;
    border-left:3px solid rgba(63,191,168,.55) !important;
    color:var(--spp-rk-text) !important;
    -webkit-text-fill-color:var(--spp-rk-text) !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 blockquote.spp-buy__body a {
    color:var(--spp-rk-link) !important;
    -webkit-text-fill-color:var(--spp-rk-link) !important;
}

html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 blockquote.spp-buy__warn {
    background-color:rgba(240,179,87,.12) !important;
    background-image:none !important;
    border-color:rgba(240,179,87,.30) !important;
    border-left:3px solid rgba(240,179,87,.60) !important;
    color:#f2c883 !important;
}
html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 blockquote.spp-buy__warn b {
    color:#f2c883 !important;
    -webkit-text-fill-color:#f2c883 !important;
}
html.spp-rdark #main .spp-pgbar .pages ul li.pagesone input {
    --spp-go-bg:#141922; --spp-go-bd:1px; --spp-go-bdc:rgba(255,255,255,.16);
    --spp-go-sh:inset 0 1px 0 rgba(255,255,255,.04);
}
html.spp-rdark #main .spp-pgbar .pages ul li.pagesone input:focus {
    --spp-go-bg:#1b2331; --spp-go-bdc:rgba(32,201,151,.75);
    --spp-go-sh:0 0 0 2px rgba(32,201,151,.26);
}
html.spp-rdark select[name="atc_credittype"],
html.spp-rdark select[name="atc_enhidetype"] {
    background-color:#141922 !important; background-image:none !important;
    border:1px solid rgba(255,255,255,.16) !important; border-radius:6px !important;
    color:#f5f5f7 !important; -webkit-text-fill-color:#f5f5f7 !important;
}
html.spp-rdark input.btn[type="submit"] {
    --spu-accent:#15806c;
    border:1px solid rgba(63,191,168,.50) !important; border-radius:8px !important;
    color:#ffffff !important; -webkit-text-fill-color:#ffffff !important;
    text-shadow:none !important;
    box-shadow:inset 0 1px 0 rgba(255,255,255,.10), 0 1px 0 rgba(0,0,0,.35) !important;
}
html.spp-rdark input.btn[type="submit"]:hover {
    --spu-accent:#127160;
    border-color:rgba(63,191,168,.78) !important;
}
html.spp-rdark input.btn[type="submit"]:active {
    --spu-accent:#0f6555;
    box-shadow:inset 0 2px 4px rgba(0,0,0,.35) !important;
}
/* ===== SPP-READDARK-END ===== */
`;
CSS_READ_DARK += [
'',
'/* ===== SPP-VOTE-DARK-BEGIN(投票块 · 2.57.195)===== */',
'/* 投票块在 form.spp-flow【之外】,上面那整套规则够不着它',
'   (实测块内字色仍是站点 rgb(85,85,85)、表底仍是 #ffffff)⇒ 这里单独点名补齐。',
'   站点原规则特异度:.tt2 table tr th = (0,1,3) / .tt2 table = (0,1,1) / .tt2 = (0,1,0),',
'   下面每条都 ≥ (1,1,3) 且带 !important ⇒ 稳定压过。全挂 html.spp-rdark ⇒ 白昼档一个像素不改。',
'   ★ 选择器按快照里的真结构写:表头 th.h / 选项 th[width] / 结束行 th.tr4+td.tr4',
'     (tr4 挂在单元格上,不在 tr 上 —— 194 版写成 tr.tr4 > … 一条都没命中,对照台量出来的)。 */',
'html.spp-rdark #main > form[name="vote"] .tt2 {',
'    --spu-surface:#2c2c2e; --spu-overlay:#3a3a3c; --spu-text:#f5f5f7;',
'    --spu-secondary:#b6c3d6; --spu-muted:#93a1b5; --spu-border:rgba(255,255,255,.14);',
'    --spu-accent:#3fbfa8; --spu-accent-dim:#2f8f7e;',
'    --spp-vote-rail:340px;',
'    --spp-vote-bar:linear-gradient(90deg,#2f8f7e 0%,#3fbfa8 62%,#6fe0c6 100%);',
'    --spp-vote-track:rgba(255,255,255,.07);',
'    border:1px solid var(--spu-border) !important; border-radius:12px !important;',
'    background-color:rgba(255,255,255,.03) !important;',
'    padding:2px 3px !important; margin:8px 0 10px !important; overflow:hidden !important;',
'}',
'html.spp-rdark #main > form[name="vote"] .tt2 table { background:transparent !important; }',
'/* 表头 */',
'html.spp-rdark #main > form[name="vote"] .tt2 th.h {',
'    background-image:none !important; background-color:rgba(255,255,255,.07) !important;',
'    border-bottom-color:var(--spu-border) !important; padding:7px 12px !important;',
'    color:var(--spu-text) !important; -webkit-text-fill-color:var(--spu-text) !important;',
'}',
'html.spp-rdark #main > form[name="vote"] .tt2 th.h span.fr a { color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; }',
'/* 选项行:标签格 th[width]、内容格 td(排除结束行的 td.tr4) */',
'html.spp-rdark #main > form[name="vote"] .tt2 th[width] {',
'    padding:7px 12px !important; border-bottom-color:rgba(255,255,255,.08) !important;',
'    color:var(--spu-text) !important; -webkit-text-fill-color:var(--spu-text) !important;',
'}',
'html.spp-rdark #main > form[name="vote"] .tt2 td:not(.tr4) {',
'    padding:6px 12px !important; position:relative !important;',
'    border-bottom-color:rgba(255,255,255,.08) !important;',
'    color:var(--spu-secondary) !important; -webkit-text-fill-color:var(--spu-secondary) !important;',
'}',
'/* 结束行「(本次投票已结束)」:两格自带内联 padding/border ⇒ 必须 !important */',
'html.spp-rdark #main > form[name="vote"] .tt2 th.tr4,',
'html.spp-rdark #main > form[name="vote"] .tt2 td.tr4 {',
'    background-color:transparent !important; background-image:none !important;',
'    padding:6px 12px !important; border-bottom:0 !important;',
'    color:var(--spu-muted) !important; -webkit-text-fill-color:var(--spu-muted) !important;',
'}',
'/* 进度条:站点那枚是被 HTML width 拉伸的 1px GIF(本页 312 / 183 = 站点算好的票数比例)。',
'   ★ 不覆盖它的宽度 —— 覆盖成固定值会让两根条一样长、比例全丢。',
'   改成把 GIF 自己的像素挪出盒子(object-fit:none + 负向 object-position),',
'   盒子保留原宽度,露出我们给的渐变底 == 一根按比例长的渐变条;max-width 封顶防溢出。 */',
'html.spp-rdark #main > form[name="vote"] .tt2 td:not(.tr4) > img {',
'    object-fit:none !important; object-position:-9999px 0 !important;',
'    background-image:var(--spp-vote-bar) !important; background-size:100% 100% !important;',
'    background-repeat:no-repeat !important; height:10px !important; max-width:var(--spp-vote-rail) !important;',
'    border-radius:999px !important;',
'    box-shadow:0 0 10px -2px rgba(63,191,168,.55) !important;',
'    vertical-align:middle !important; margin-right:6px !important;',
'}',
'/* 轨道:只画在选项格上(结束行不画) */',
'html.spp-rdark #main > form[name="vote"] .tt2 td:not(.tr4)::after {',
'    content:"" !important; position:absolute !important; left:12px !important;',
'    top:calc(50% - 5px) !important; width:var(--spp-vote-rail) !important;',
'    height:10px !important; border-radius:999px !important;',
'    background-color:var(--spp-vote-track) !important; z-index:-1 !important;',
'}',
'/* ===== SPP-VOTE-DARK-END ===== */'
].join(String.fromCharCode(10));
const RDARK_LIFT = 'spp-rk-lift';
function initReadDark() {
if (!(WANTS.readOnly || PAGE.post)) return;
ensureStyle('spp-rdark-style', CSS_READ_DARK);
if (!SPP_CONFIG.bool('spp_read_dark', false)) return;      
document.documentElement.classList.add('spp-rdark');
function lum(rgbText) {
const m = /rgba?\((\d+),\s*(\d+),\s*(\d+)/.exec(rgbText || '');
if (!m) return null;
const ch = function (v) { v = (+v) / 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); };
return 0.2126 * ch(m[1]) + 0.7152 * ch(m[2]) + 0.0722 * ch(m[3]);
}
function bgLum(el) {
let e = el;
while (e && e !== document.documentElement) {
const bg = getComputedStyle(e).backgroundColor;
const m = /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?/.exec(bg || '');
if (m && (m[4] === undefined || +m[4] > 0.5)) return lum(bg);
e = e.parentElement;
}
return lum(getComputedStyle(document.body).backgroundColor);
}
let lifted = 0;
function scan() {
const boxes = document.querySelectorAll('#main > form.spp-flow > .t5.t2 .tpc_content');
for (let b = 0; b < boxes.length; b++) {
const cands = boxes[b].querySelectorAll('[style*="color"], font[color]');
for (let i = 0; i < cands.length; i++) {
const el = cands[i];
if (el.classList.contains(RDARK_LIFT)) continue;
const st = el.getAttribute('style') || '';
if (!/(^|;)\s*color\s*:/.test(st) && !el.hasAttribute('color')) continue;
const L1 = lum(getComputedStyle(el).color);
if (L1 === null) continue;
const L2 = bgLum(el);
if (L2 === null) continue;
const hi = Math.max(L1, L2), lo = Math.min(L1, L2);
if ((hi + 0.05) / (lo + 0.05) < 2.2) { el.classList.add(RDARK_LIFT); lifted++; }
}
}
try { document.documentElement.setAttribute('data-spp-darklift', String(lifted)); } catch (e) {}
}
let pinned = 0;
function pinUnreadable() {
const rows = document.querySelectorAll('#main > form.spp-flow > .t5.t2');
const SEL = '.tiptop a, .tiptop b, .tiptop span:not(.spp-tp-sep), .user-info.spp-ucard a, .user-info.spp-ucard span';
for (let r = 0; r < rows.length; r++) {
const cands = rows[r].querySelectorAll(SEL);
for (let i = 0; i < cands.length; i++) {
const el = cands[i];
if (el.dataset.sppRkPin === '1') continue;
if (!(el.textContent || '').trim()) continue;             
const L1 = lum(getComputedStyle(el).color);
if (L1 === null) continue;
const L2 = bgLum(el);
if (L2 === null) continue;
const hi = Math.max(L1, L2), lo = Math.min(L1, L2);
if ((hi + 0.05) / (lo + 0.05) >= 2.2) continue;
el.style.setProperty('color', 'var(--spu-secondary, #b6c3d6)', 'important');
el.style.setProperty('-webkit-text-fill-color', 'var(--spu-secondary, #b6c3d6)', 'important');
el.dataset.sppRkPin = '1';
pinned++;
}
}
try { document.documentElement.setAttribute('data-spp-darkpin', String(pinned)); } catch (e) {}
}
function pass() { scan(); pinUnreadable(); }
onDomReady(function () {
setTimeout(pass, 600);
setTimeout(pass, 2400);
});
onDomReady(function () {
const host = document.querySelector('#main > form') || document.getElementById('main');
if (!host || !window.MutationObserver) return;
let t = 0;
new MutationObserver(function () {
clearTimeout(t);
t = setTimeout(pass, 400);
}).observe(host, { childList: true, subtree: true });
});
}
function initGrayFlip() {
if (!(WANTS.readOnly || PAGE.post)) return;
document.documentElement.classList.add('spp-grayflip-on');
if (!SPP_CONFIG.bool('spp_gray_flip', true)) return;
ensureStyle('spp-grayflip-style', 'html.spp-grayflip-on.spp-read-on .spp-gf-hit { color: var(--spu-secondary, #b6c3d6) !important; -webkit-text-fill-color: var(--spu-secondary, #b6c3d6) !important; }');
const HIT = 'spp-gf-hit';
let flipped = 0;
function chan(v) { v = v / 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); }
function rgbOf(c) { const m = /rgba?\((\d+),\s*(\d+),\s*(\d+)/.exec(c || ''); return m ? [+m[1], +m[2], +m[3]] : null; }
function lumOf(q) { return 0.2126 * chan(q[0]) + 0.7152 * chan(q[1]) + 0.0722 * chan(q[2]); }
function bgOf(el) {
let e = el;
while (e && e !== document.documentElement) {
const m = /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?/.exec(getComputedStyle(e).backgroundColor || '');
if (m && (m[4] === undefined || +m[4] > 0.5)) return lumOf([+m[1], +m[2], +m[3]]);
e = e.parentElement;
}
return lumOf(rgbOf(getComputedStyle(document.body).backgroundColor) || [255, 255, 255]);
}
function pass() {
const boxes = document.querySelectorAll('.tpc_content');
for (let b = 0; b < boxes.length; b++) {
const all = boxes[b].querySelectorAll('*');
for (let i = 0; i < all.length; i++) {
const el = all[i];
if (el.classList.contains(HIT)) continue;
let hasText = false;
for (let n = 0; n < el.childNodes.length; n++) {
const c = el.childNodes[n];
if (c.nodeType === 3 && (c.nodeValue || '').trim()) { hasText = true; break; }
}
if (!hasText) continue;
if (!(el.textContent || '').trim()) continue;   
const fg = rgbOf(getComputedStyle(el).color);
if (!fg) continue;
if (Math.max(fg[0], fg[1], fg[2]) - Math.min(fg[0], fg[1], fg[2]) > 28) continue;
const L1 = lumOf(fg);
if (L1 < 0.09 || L1 > 0.62) continue;
const L2 = bgOf(el);
if (L2 >= 0.5) continue;
const hi = Math.max(L1, L2), lo = Math.min(L1, L2);
if ((hi + 0.05) / (lo + 0.05) >= 4.5) continue;
el.classList.add(HIT);
flipped++;
}
}
try { document.documentElement.setAttribute('data-spp-grayflip', String(flipped)); } catch (e) {}
}
onDomReady(function () {
setTimeout(pass, 700);
setTimeout(pass, 2500);
const host = document.querySelector('#main > form') || document.getElementById('main');
if (!host || !window.MutationObserver) return;
let t = 0;
new MutationObserver(function () { clearTimeout(t); t = setTimeout(pass, 400); }).observe(host, { childList: true, subtree: true });
});
}
let sppAvaRefit = null;
let sppAvaRestore = null;
function initHideDefaultAvatar() {
if (!WANTS.readOnly) return;
const KEY = 'spp_hide_default_avatar';
let enabled = SPP_CONFIG.bool('spp_hide_default_avatar', false);
const AVA_GRADS = [
'linear-gradient(145deg,#34c39b,#2b8fd6 55%,#8a72e0)',
'linear-gradient(145deg,#f0a35c,#e2607a 55%,#a262d6)',
'linear-gradient(145deg,#4aa8e8,#2f7fd0 60%,#3fc49b)',
'linear-gradient(145deg,#5cc98a,#2fae86 55%,#3fa8d8)',
'linear-gradient(145deg,#e08a5c,#d4648f 60%,#8f6ad8)',
'linear-gradient(145deg,#4f8fe0,#5a7fd8 55%,#8f7ae0)'
];
function avaGrad(name) {
let h = 0;
for (let i = 0; i < name.length; i++) h = (h * 31 + name.charCodeAt(i)) >>> 0;
return AVA_GRADS[h % AVA_GRADS.length];
}
const LEGACY_BUCKET_CLS = ['is-s1', 'is-s2', 'is-s3', 'is-s4', 'is-s5', 'is-s6', 'is-s7', 'is-s8', 'is-s9', 'is-sX'];
function fitTile(tile) {
if (tile.dataset.sppFit) return;
const txt = tile.firstElementChild;
if (!txt || !txt.firstChild) return;
const box = tile.getBoundingClientRect();
if (box.width < 8 || box.height < 8) return;
const cs = getComputedStyle(tile);
const max = parseFloat(cs.getPropertyValue('--spp-ava-fs-max')) || 26;
const min = parseFloat(cs.getPropertyValue('--spp-ava-fs-min')) || 11;
const one = parseFloat(cs.getPropertyValue('--spp-ava-fs-one')) || 24;
const availW = tile.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight);
const availH = tile.clientHeight - parseFloat(cs.paddingTop) - parseFloat(cs.paddingBottom);
const probe = (px, maxLines) => {
tile.style.setProperty('font-size', px + 'px', 'important');
const r = txt.getBoundingClientRect();
const lh = parseFloat(getComputedStyle(txt).lineHeight) || px * 1.12;
return r.width <= availW + .5 && r.height <= availH + .5
&& Math.ceil(r.height / lh - 0.06) <= maxLines;
};
const search = (maxLines) => {
let lo = Math.ceil(min), hi = Math.floor(max), best = 0;
while (lo <= hi) {
const mid = (lo + hi) >> 1;
if (probe(mid, maxLines)) { best = mid; lo = mid + 1; } else { hi = mid - 1; }
}
return best;
};
let size = search(1);
if (!size) size = Math.max(search(3), Math.ceil(min));
void one;
tile.style.setProperty('font-size', size + 'px', 'important');
tile.dataset.sppFit = String(size);
}
function dropNameLine(th) {
if (!th.closest('.t5.t2')) return;
const wrap = th.querySelector(':scope > div[align="center"]');
if (!wrap || wrap.dataset.sppNameOff) return;
const kids = Array.prototype.slice.call(wrap.children);
let idx = -1;
for (let i = 0; i < kids.length; i++) {
if (kids[i].tagName !== 'A') continue;
if (/u\.php/i.test(kids[i].getAttribute('href') || '')) { idx = i; break; }
}
if (idx < 0) return;
wrap.dataset.sppNameOff = '1';
kids[idx].classList.add('spp-avaname-off');
for (const d of [-1, 1]) {
const sib = kids[idx + d];
if (sib && sib.tagName === 'BR') sib.classList.add('spp-avaname-off');
}
}
function userNameOf(th) {
const links = th.querySelectorAll('a');
for (let i = 0; i < links.length; i++) {
if (links[i].closest('.user-pic')) continue;
const t = (links[i].textContent || '').trim();
if (t) return t;
}
return '';
}
function paintInitial(th, img) {
if (th.dataset.sppAvaDone) return;
th.dataset.sppAvaDone = '1';
const nm = userNameOf(th);
const holder = img.closest('a') || img.parentElement;
if (!holder) return;
if (holder.querySelector('.spp-ava-initial')) return;
th.classList.add('spp-ava-tiled');
const full = String(nm || '').trim() || '?';
const tile = document.createElement('span');
tile.className = 'spp-ava-initial';
const txt = document.createElement('span');
txt.className = 'spp-ava-txt';
txt.textContent = full;
tile.appendChild(txt);
tile.style.backgroundImage = avaGrad(nm || '?');
if (!holder.getAttribute('aria-label')) holder.setAttribute('aria-label', full);
holder.insertBefore(tile, img);
img.classList.add('spp-ava-off');
fitTile(tile);
dropNameLine(th);
}
function judgeAva(th, img) {
if (th.dataset.sppAvaDone || th.dataset.sppAvaScan) return;
th.dataset.sppAvaScan = '1';
const src = img.getAttribute('src') || '';
const lazy = img.getAttribute('data-src') || img.getAttribute('data-original') || '';
if (/none\.gif/i.test(src) || /none\.gif/i.test(lazy)) { paintInitial(th, img); return; }
const chk = () => { if (img.naturalWidth === 0) paintInitial(th, img); else th.dataset.sppAvaDone = '1'; };
if (img.complete) chk();
else img.addEventListener('load', chk, { once: true });
img.addEventListener('error', () => paintInitial(th, img), { once: true });
}
function refitPending() {
document.querySelectorAll('.spp-ava-initial:not([data-spp-fit])').forEach(t => {
LEGACY_BUCKET_CLS.forEach(c => t.classList.remove(c));
fitTile(t);
});
}
function restoreDefaultAvatars() {
enabled = false;
try { GM_setValue(KEY, false); } catch (_) {}
let n = 0;
document.querySelectorAll('.spp-ava-initial').forEach(t => {
const holder = t.parentElement;
if (holder) {
const img = holder.querySelector('img.spp-ava-off');
if (img) img.classList.remove('spp-ava-off');   
}
t.remove();
n++;
});
document.querySelectorAll('img.spp-ava-off').forEach(img => img.classList.remove('spp-ava-off'));
document.querySelectorAll('.spp-avaname-off').forEach(el => el.classList.remove('spp-avaname-off'));
document.querySelectorAll('.spp-ava-tiled').forEach(el => el.classList.remove('spp-ava-tiled'));
document.querySelectorAll('div[data-spp-name-off]').forEach(w => { delete w.dataset.sppNameOff; });
return n;
}
sppAvaRestore = restoreDefaultAvatars;
function processPosts() {
if (!enabled) return;
document.querySelectorAll('.t5.t2 .r_two').forEach(th => {
const img = th.querySelector('.user-pic img');
if (!img) return;
judgeAva(th, img);
});
refitPending();
}
sppAvaRefit = refitPending;
onDomReady(() => setTimeout(processPosts, 500));
onDomReady(() => {
const target = document.getElementById('main') || document.querySelector('.t5')?.parentElement || document.body;
new MutationObserver(() => processPosts()).observe(target, {
childList: true, subtree: true, attributes: false
});
});
}
function initCrumbTitle() {
if (!WANTS.readOnly) return;
const all = document.querySelectorAll('#breadcrumbs');
if (all.length < 2) return;
let tpl = null;
for (let i = 0; i < all.length; i++) {
if (all[i].querySelector('.spp-crumb-cur')) continue;
const s = all[i].querySelector('strong > a');
if (s) { tpl = all[i].querySelector('strong'); break; }
}
if (!tpl) return;
let added = 0;
for (let i = 0; i < all.length; i++) {
const c = all[i];
if (c.contains(tpl)) continue;
if (c.querySelector('strong > a') || c.querySelector('.spp-crumb-cur')) continue;
const node = tpl.cloneNode(true);
node.className = 'spp-crumb-cur';
Array.prototype.forEach.call(node.querySelectorAll('img'), function (im) { im.remove(); });
const fr = c.querySelector(':scope > .fr') || c.querySelector(':scope > div.fr');
if (fr) c.insertBefore(node, fr); else c.appendChild(node);
added++;
}
try { document.documentElement.setAttribute('data-spp-crumbtitle', String(added)); } catch (e) {}
}
var SPP_ADROW_ATTR = 'data-spp-adrow';
var SPP_ADROW_STYLE_ID = 'spp-adrow-style';
var SPP_ADROW_BEATS = 3;
var SPP_ADROW_GAP = 800;
var SPP_ADROW_STARTED = false;
var SPP_ADROW_IMG_RE = /\/images\/(?:sswg9|segucrwj4)(?![0-9a-z])/i;
function sppAdRowProtected(el) {
if (!el) return true;
var id = el.id || '';
if (id === 'mainNav' || id === 'infobox' || id === 'header') return true;
if (id.indexOf('menu_') === 0) return true;
try { if (el.classList && el.classList.contains('c')) return true; } catch (e) { }
try { if (el.getAttribute('data-spp-brand') !== null) return true; } catch (e2) { }
return false;
}
function sppAdRowIsAdHost(host) {
host = String(host || '').toLowerCase();
if (!host) return false;
return host === 'taobao.com' || /\.taobao\.com$/.test(host) ||
host === 'tmall.com' || /\.tmall\.com$/.test(host);
}
function sppAdRowFeatures(el) {
var f = { img: false, link: false, box: false, tail: false };
var i, imgs = el.querySelectorAll('img');
for (i = 0; i < imgs.length; i++) {
var raw = imgs[i].getAttribute('src') || '';
if (SPP_ADROW_IMG_RE.test(raw.split('#')[0].split('?')[0])) { f.img = true; break; }
}
var as = el.querySelectorAll('a[href]');
for (i = 0; i < as.length; i++) {
var a = as[i], host = '';
try {
var u = new URL(a.getAttribute('href'), location.href);
if (u.protocol === 'http:' || u.protocol === 'https:') host = u.hostname;
} catch (e) { host = ''; }
if (!sppAdRowIsAdHost(host)) continue;
var oc = a.getAttribute('onclick') || '';
if (/ga\s*\(/i.test(oc) && /['"]ad['"]/.test(oc)) { f.link = true; break; }
}
var st = String(el.getAttribute('style') || '').toLowerCase().replace(/\s+/g, ' ');
if (/width:\s*920px/.test(st) && /overflow:\s*hidden/.test(st)) f.box = true;
var prev = el.previousElementSibling;
var isLast = !!(el.parentNode && el.parentNode.lastElementChild === el);
if (isLast && prev && prev.id === 'menu_u') f.tail = true;
return f;
}
function sppAdRowFind() {
var header = document.getElementById('header');
if (!header || !header.children) return null;
var kids = header.children, cands = [], i;
for (i = 0; i < kids.length; i++) {
var el = kids[i];
if (!el || el.tagName !== 'DIV') continue;      
if (sppAdRowProtected(el)) continue;            
var f = sppAdRowFeatures(el);
f.el = el;
f.n = (f.img ? 1 : 0) + (f.link ? 1 : 0) + (f.box ? 1 : 0) + (f.tail ? 1 : 0);
cands.push(f);
}
var byImg = [], strong = [];
for (i = 0; i < cands.length; i++) {
if (cands[i].img) byImg.push(cands[i]);
if (cands[i].n >= 2) strong.push(cands[i]);
}
if (byImg.length === 1) return byImg[0].el;         
if (byImg.length > 1) return null;                  
if (strong.length === 1) return strong[0].el;       
return null;                                        
}
function sppAdRowPass() {
var el = sppAdRowFind();
if (!el) return false;
ensureStyle(SPP_ADROW_STYLE_ID,
'/* SPP-ADROW-BEGIN */\n' +
'#header > [' + SPP_ADROW_ATTR + '="off"] { display: none !important; }\n' +
'/* SPP-ADROW-END */');
try { if (el.getAttribute(SPP_ADROW_ATTR) !== 'off') el.setAttribute(SPP_ADROW_ATTR, 'off'); } catch (e) { }
return true;
}
function sppHideAdRow() {
if (SPP_ADROW_STARTED) return;                      
SPP_ADROW_STARTED = true;
var left = SPP_ADROW_BEATS;
function beat() {
var ok = false;
try { ok = sppAdRowPass(); } catch (e) { ok = false; }
if (ok) return;                                 
left--;
if (left <= 0) {
try {
console.info('[SPP] 未找到页眉广告行,关态隐藏未生效:' +
'已保留原始节点,未隐藏任何其它元素');
} catch (e2) { }
return;
}
setTimeout(beat, SPP_ADROW_GAP);
}
onDomReady(beat);
}
function initAdRowHide() {
if (SPP_CONFIG.bool('spp_brand_bar', true)) return;
sppHideAdRow();
}
function initBrandBar() {
if (!SPP_CONFIG.bool('spp_brand_bar', true)) { try { sppHideAdRow(); } catch (e) { } return; }
var BAR_CSS = `
            #spp-brand {
                position:relative; display:flex; align-items:center; box-sizing:border-box;
                width:100%; height:var(--bh,96px); border-radius:12px; overflow:hidden;
                gap:var(--sp,40px);
                border:1px solid rgba(255,255,255,.10);
                background-color:#05070a;
                background-image:
                    radial-gradient(rgba(255,255,255,.055) .5px, rgba(0,0,0,0) 1.1px),
                    radial-gradient(rgba(255,255,255,.035) .5px, rgba(0,0,0,0) 1.1px),
                    radial-gradient(120% 150% at 50% -12%, rgba(12,227,154,.10), rgba(0,0,0,0) 58%),
                    linear-gradient(180deg, #141a22 0%, #05080c 52%, #03050a 100%);
                background-size: 5px 5px, 9px 9px, 100% 100%, 100% 100%;
                background-position: 0 0, 2px 3px, 0 0, 0 0;
                box-shadow: 0 0 0 1px rgba(0,0,0,.6) inset, 0 1px 0 rgba(255,255,255,.07) inset,
                            0 18px 46px -28px #000;
            }
            #spp-brand::after { content:""; position:absolute; left:0; right:0; top:0; height:1px;
                background: linear-gradient(90deg, transparent, rgba(12,227,154,.6), transparent); }
            #spp-brand .spp-brand__art { position:relative; z-index:1; flex:0 0 var(--aw,450px); min-width:0; height:100%; overflow:hidden; }
            #spp-brand .spp-brand__art--none { display:none; }
            #spp-brand .spp-brand__art img { display:block; width:100%; height:100%; max-width:none; object-fit:cover; }
            #spp-brand .spp-brand__link { display:block; width:100%; height:100%; cursor:pointer;
                -webkit-tap-highlight-color:transparent; }
            #spp-brand .spp-brand__link:hover img { filter:brightness(1.14) saturate(1.04);
                transition:filter .18s ease; }
            #spp-brand .spp-brand__link:focus-visible { outline:2px solid rgba(12,227,154,.75);
                outline-offset:-2px; }
            #spp-brand .spp-brand__slider { position:relative; display:block; width:100%; height:100%; overflow:hidden; }
            #spp-brand .spp-brand__slider .spp-brand__slide { position:absolute; left:0; top:0;
                width:100%; height:100%; max-width:none; object-fit:contain; opacity:0;
                transform:translateX(12%); transition:opacity .45s ease, transform .45s ease;
                pointer-events:none; }
            #spp-brand .spp-brand__slider .spp-brand__slide--prev { opacity:0; transform:translateX(-12%); }
            #spp-brand .spp-brand__slider .spp-brand__slide--on { opacity:1; transform:none; }
            #spp-brand .spp-brand__mid { position:relative; z-index:1; flex:1 1 auto; min-width:0; height:100%;
                display:flex; align-items:center; justify-content:center; }
            #spp-brand .spp-brand__stage { position:relative; width:var(--cw,320px); max-width:100%; height:100%;
                perspective:900px; }
            #spp-brand .spp-brand__zone { position:absolute; left:0; right:0; z-index:3; }
            #spp-brand .spp-brand__zone--top { top:0; height:var(--zd,50%); cursor:default; }
            #spp-brand .spp-brand__zone--bot { top:var(--zd,50%); bottom:0; cursor:pointer; }
            #spp-brand .spp-brand__flip { position:relative; z-index:1; width:100%; height:100%;
                transform-style:preserve-3d; -webkit-transform-style:preserve-3d;
                transition:transform .8s cubic-bezier(.42,0,.18,1); }
            #spp-brand .spp-brand__zone--top:hover ~ .spp-brand__flip { transform:rotateY(180deg); }
            #spp-brand .spp-brand__zone--top:hover ~ .spp-brand__flip.spp-brand__flip--nocover { transform:none; }
            #spp-brand .spp-brand__face { position:absolute; inset:0; display:flex; align-items:center;
                justify-content:center; backface-visibility:hidden; -webkit-backface-visibility:hidden; }
            #spp-brand .spp-brand__face--cover { transform:rotateY(180deg); }
            #spp-brand .spp-brand__cover { display:block; width:100%; height:100%; object-fit:contain; }
            #spp-brand .spp-brand__unit { display:flex; flex-direction:column; align-items:center;
                justify-content:center; transform-origin:center center; }
            #spp-brand .spp-brand__row { display:flex; align-items:center; justify-content:center; flex:0 0 auto;
                height:calc(44px * var(--ik,0.898)); margin-bottom:var(--gap,3px);
                transform:scale(var(--ik,0.898)); transform-origin:center center; }
            #spp-brand .spp-brand__ld { --path:#fff; --dot:red; --duration:3s;
                width:44px; height:44px; position:relative; }
            #spp-brand .spp-brand__ld:before { content:''; width:6px; height:6px; border-radius:50%;
                position:absolute; display:block; background:var(--dot); top:37px; left:19px;
                transform:translate(-18px,-18px);
                animation:sppBrandDotRect var(--duration) cubic-bezier(0.785,0.135,0.15,0.86) infinite; }
            #spp-brand .spp-brand__ld svg { display:block; width:100%; height:100%; }
            #spp-brand .spp-brand__ld svg rect, #spp-brand .spp-brand__ld svg polygon,
            #spp-brand .spp-brand__ld svg circle { fill:none; stroke:var(--path); stroke-width:10px;
                stroke-linejoin:round; stroke-linecap:round; }
            #spp-brand .spp-brand__ld svg polygon { stroke-dasharray:145 76 145 76; stroke-dashoffset:0;
                animation:sppBrandPathTriangle var(--duration) cubic-bezier(0.785,0.135,0.15,0.86) infinite; }
            #spp-brand .spp-brand__ld svg rect { stroke-dasharray:192 64 192 64; stroke-dashoffset:0;
                animation:sppBrandPathRect 3s cubic-bezier(0.785,0.135,0.15,0.86) infinite; }
            #spp-brand .spp-brand__ld svg circle { stroke-dasharray:150 50 150 50; stroke-dashoffset:75;
                animation:sppBrandPathCircle var(--duration) cubic-bezier(0.785,0.135,0.15,0.86) infinite; }
            #spp-brand .spp-brand__ld--tri { width:48px; }
            #spp-brand .spp-brand__ld--tri:before { left:21px; transform:translate(-10px,-18px);
                animation:sppBrandDotTriangle var(--duration) cubic-bezier(0.785,0.135,0.15,0.86) infinite; }
            #spp-brand .spp-brand__ld { display:inline-block; margin:0 16px; }
            @keyframes sppBrandPathTriangle { 33% { stroke-dashoffset:74; } 66% { stroke-dashoffset:147; } 100% { stroke-dashoffset:221; } }
            @keyframes sppBrandDotTriangle { 33% { transform:translate(0,0); } 66% { transform:translate(10px,-18px); } 100% { transform:translate(-10px,-18px); } }
            @keyframes sppBrandPathRect { 25% { stroke-dashoffset:64; } 50% { stroke-dashoffset:128; } 75% { stroke-dashoffset:192; } 100% { stroke-dashoffset:256; } }
            @keyframes sppBrandDotRect { 25% { transform:translate(0,0); } 50% { transform:translate(18px,-18px); } 75% { transform:translate(0,-36px); } 100% { transform:translate(-18px,-18px); } }
            @keyframes sppBrandPathCircle { 25% { stroke-dashoffset:125; } 50% { stroke-dashoffset:175; } 75% { stroke-dashoffset:225; } 100% { stroke-dashoffset:275; } }
            #spp-brand .spp-brand__btn { margin:0; height:auto; background:transparent; padding:0;
                border:none; cursor:pointer; }
            #spp-brand .spp-brand__btn, #spp-brand .spp-brand__actual, #spp-brand .spp-brand__sweep {
                white-space:nowrap; text-align:left; }
            #spp-brand .spp-brand__actual { color:var(--text-stroke-color); }
            #spp-brand .spp-brand__btn { --border-right:0px; --text-stroke-color:#37FF8B;
                --animation-color:rgba(255,163,184,0.95); --fs-size:38px; letter-spacing:3px; text-decoration:none;
                font-size:var(--fs-size); font-family:"Arial"; position:relative; text-transform:uppercase;
                color:transparent; -webkit-text-stroke:1px var(--text-stroke-color); }
            #spp-brand .spp-brand__sweep { position:absolute; box-sizing:border-box;
                content:attr(data-text); color:var(--animation-color); width:100%; inset:0;
                border-right:var(--border-right) solid var(--animation-color); overflow:hidden;
                transition:0.5s; -webkit-text-stroke:1px var(--animation-color);
                filter:drop-shadow(0 0 23px var(--animation-color)); }
            #spp-brand .spp-brand__btn:hover .spp-brand__sweep,
            #spp-brand .spp-brand__zone--bot:hover ~ .spp-brand__flip .spp-brand__sweep { width:0%; filter:none; }
            @media (prefers-reduced-motion: reduce) {
                #spp-brand .spp-brand__ld:before, #spp-brand .spp-brand__ld svg rect,
                #spp-brand .spp-brand__ld svg polygon, #spp-brand .spp-brand__ld svg circle { animation:none; }
                #spp-brand .spp-brand__sweep { transition:none; }
                #spp-brand .spp-brand__flip { transition:none; }
            }
        `;
var FS_MAX = 48, FS_MIN = 12, PAD = 20;
var STACK = 0.90, RATIO = 0.90, LINE_K = 1.157, ICON_H = 44, TXT_UNIT = 7.0, TXT_PAD = 36;
var R_ART = 4.6875, R_CARD = 3.3333, SP = 40, H_MIN = 40, H_MAX = 130;
var ART_SRC = ['/images/sswg9.jpg', '/images/segucrwj4.jpg', '/images/colorImagination/logo-fall4.png'];
var ART_HREF = [
'https://shop119340084.taobao.com/?_bind=true&bc_fl_src=tmall_market_llb_1_2691627&llbPlatform=pc&agentId=2527000&spm=a224e.7913437.1.2691627&llbIsd=1&bxsign=llbM8gSReNmYJ3Pd2ciwxkXkDpVQQU1Wm7jiu5t4unnAyy0zGjg0Uz1UlLySUkKDyU01G9ov3AoCxEIIvNxY4mxBFpqgou0zxGIhqVuijeDMUudkDi7-ZiCAeO6WTKAC91x&awkllb=9bacce10-9a92-458e-bf17-120464c6b00b&ntfMsId=2105A43C14992FD1433E32417D9AD6C0&&llbOsd=1&di=__IDFA__&dim=__IMEI__&oaid=__OAID__&caid=__CAID__&sy=llb&pageversion=003R',
'https://shop211165910.taobao.com/'
];
var ART_ROT = [
['/images/segucrwj4.jpg', ''],
['/images/segucrwj28.jpg', ''],
['/images/segucrwj29.jpg', ''],
['/images/segucrwj30.jpg', '']
];
function hostOf() {
var header = document.getElementById('header');
if (!header) return null;
var kids = header.children, i, j;
for (i = 0; i < kids.length; i++) {
var el = kids[i];
if (el.tagName !== 'DIV') continue;
if (el.getAttribute('data-spp-brand') === '1') return el;
var im = el.querySelectorAll('img');
for (j = 0; j < im.length; j++) {
var src = im[j].getAttribute('src') || '';
if (src.indexOf('images/sswg9') >= 0 || src.indexOf('images/segucrwj4') >= 0) return el;
}
}
return null;
}
function unhide(im) {
im.style.setProperty('display', 'block', 'important');
im.style.setProperty('visibility', 'visible', 'important');
im.style.setProperty('opacity', '1', 'important');
im.style.setProperty('max-width', 'none', 'important');
im.style.setProperty('max-height', 'none', 'important');
}
function refetch(im, idx, onOk, onFail) {
var fail = function () { if (onFail) onFail(); };
var raw = im.getAttribute('src') || '';
var url = /^https?:/i.test(raw) ? raw : (location.origin + (im.getAttribute('data-spp-fallback') || ART_SRC[idx] || ''));
if (!/^https?:/i.test(url)) { fail(); return; }
GM_xmlhttpRequest({
method: 'GET', url: url, responseType: 'blob', timeout: 8000,
onload: function (r) {
if (!r || r.status < 200 || r.status >= 300 || !r.response) { fail(); return; }
var u;
try { u = URL.createObjectURL(r.response); } catch (e) { fail(); return; }
if (onOk) im.addEventListener('load', function () { onOk(); });
im.src = u;
im.removeAttribute('srcset');
},
onerror: fail,
ontimeout: fail
});
}
function buildSlider(link, im, idx) {
if (!SPP_CONFIG.bool('spp_brand_slide', true)) return;
if (!ART_ROT.length) return;
var box = document.createElement('span');
box.className = 'spp-brand__slider';
var items = [], k, one, src;
for (k = 0; k < ART_ROT.length; k++) {
src = ART_ROT[k][0];
if (!src) continue;
one = document.createElement('img');
one.className = 'spp-brand__slide' + (items.length === 0 ? ' spp-brand__slide--on' : '');
one.alt = '';
one.setAttribute('decoding', 'async');
one.setAttribute('data-spp-fallback', src);
one.src = /^https?:/i.test(src) ? src : (location.origin + src);
box.appendChild(one);
items.push({ el: one, href: ART_ROT[k][1] || '' });
}
if (!items.length) return;
if (im.parentNode === link) link.removeChild(im);
link.appendChild(box);
var at = 0, hold = false;
var paint = function () {
var prev = at;
at = (at + 1) % items.length;
items[prev].el.className = 'spp-brand__slide spp-brand__slide--prev';
items[at].el.className = 'spp-brand__slide spp-brand__slide--on';
var href = items[at].href || ART_HREF[idx] || '';
if (href) {
link.setAttribute('href', href);
try { link.title = new URL(href).host; } catch (e) { }
}
};
var ms = SPP_CONFIG.num('spp_brand_slide_sec', 3, 1, 60) * 1000;
setInterval(function () {
if (hold || document.hidden) return;
paint();
}, ms);
var grab = function () { hold = true; };
var free = function () { hold = false; };
link.addEventListener('mouseenter', grab);
link.addEventListener('mouseleave', free);
link.addEventListener('focusin', grab);
link.addEventListener('focusout', free);
}        function build() {
var host = hostOf();
if (!host || host.getAttribute('data-spp-brand') === '1') return;   
var imgs = Array.prototype.slice.call(host.querySelectorAll('img')).slice(0, 2);
if (!imgs.length) return;
imgs.forEach(unhide);
host.setAttribute('data-spp-brand', '1');
var slots = [];
imgs.forEach(function (im, k) {
im.removeAttribute('onclick');
im.removeAttribute('srcset');
im.removeAttribute('sizes');
im.removeAttribute('loading');
im.removeAttribute('referrerpolicy');
im.removeAttribute('usemap');
im.setAttribute('alt', '');
var stink = /ad|gg|banner|sponsor|adv|tuiguang/i;
if (stink.test(im.className || '')) im.removeAttribute('class');
if (stink.test(im.id || '')) im.removeAttribute('id');
var a = im.parentNode;
if (a && a.tagName === 'A') {
a.removeAttribute('onclick');       
a.parentNode.replaceChild(im, a);
}
var href = ART_HREF[k] || '';
if (!href) { slots[k] = im; return; }
var link = document.createElement('a');
link.className = 'spp-brand__link';
link.setAttribute('href', href);
link.setAttribute('target', '_blank');
link.setAttribute('rel', 'noopener noreferrer');
try { link.title = new URL(href).host; } catch (e) { }
link.appendChild(im);
slots[k] = link;
});
if (slots[1] && slots[1].tagName === 'A') buildSlider(slots[1], imgs[1], 1);            
var strip = document.createElement('div');
strip.id = 'spp-brand';
var artL = document.createElement('div');
artL.className = 'spp-brand__art';
var artR = document.createElement('div');
artR.className = 'spp-brand__art';
artL.appendChild(slots[0]);
artR.appendChild(slots[1]);
var mid = document.createElement('div');
mid.className = 'spp-brand__mid';
var unit = document.createElement('div');
unit.className = 'spp-brand__unit';
var row = document.createElement('div');
row.className = 'spp-brand__row';
row.innerHTML =
'<div class="spp-brand__ld"><svg viewBox="0 0 80 80">' +
'<rect height="64" width="64" y="8" x="8"></rect></svg></div>' +
'<div class="spp-brand__ld spp-brand__ld--tri"><svg viewBox="0 0 86 80">' +
'<polygon points="43 8 79 72 7 72"></polygon></svg></div>' +
'<div class="spp-brand__ld"><svg viewBox="0 0 80 80">' +
'<circle r="32" cy="40" cx="40"></circle></svg></div>';
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'spp-brand__btn';
btn.setAttribute('data-text', 'South-Plus');
btn.innerHTML =
'<span class="spp-brand__actual">&nbsp;South-&#8288;Plus&nbsp;</span>' +
'<span aria-hidden="true" class="spp-brand__sweep">&nbsp;South-&#8288;Plus&nbsp;</span>';
unit.appendChild(row);
unit.appendChild(btn);
var flip = document.createElement('div');
flip.className = 'spp-brand__flip';
var faceFx = document.createElement('div');
faceFx.className = 'spp-brand__face spp-brand__face--fx';
faceFx.appendChild(unit);
var faceCover = document.createElement('div');
faceCover.className = 'spp-brand__face spp-brand__face--cover';
var cover = document.createElement('img');
cover.className = 'spp-brand__cover';
cover.alt = '';
cover.setAttribute('decoding', 'async');
cover.src = location.origin + ART_SRC[2];
cover.addEventListener('load', function () { fit(); });
cover.addEventListener('error', function () {
if (cover.getAttribute('data-spp-fetched') === '1') return;
cover.setAttribute('data-spp-fetched', '1');
refetch(cover, 2, function () { fit(); }, function () {
flip.className += ' spp-brand__flip--nocover';
cover.style.display = 'none';
fit();
});
});
faceCover.appendChild(cover);
flip.appendChild(faceFx);
flip.appendChild(faceCover);
var stage = document.createElement('div');
stage.className = 'spp-brand__stage';
var zoneTop = document.createElement('div');
zoneTop.className = 'spp-brand__zone spp-brand__zone--top';
var zoneBot = document.createElement('div');
zoneBot.className = 'spp-brand__zone spp-brand__zone--bot';
stage.appendChild(zoneTop);
stage.appendChild(zoneBot);
stage.appendChild(flip);
mid.appendChild(stage);
strip.appendChild(artL);
strip.appendChild(mid);
strip.appendChild(artR);
var settle = function (art, idx) {
var list = art.querySelectorAll('img');
if (!list.length) { art.className += ' spp-brand__art--none'; return; }
var give = function () {
var i, any = false;
for (i = 0; i < list.length; i++) { if (list[i].naturalWidth > 0) any = true; }
if (!any) art.className += ' spp-brand__art--none';
fit();
};
var ok = function () { fit(); };
var tried = [];
var step = function (im, i) {
if (im.naturalWidth > 0) { fit(); return; }
if (tried[i]) return;
tried[i] = true;
refetch(im, idx, ok, give);
};
for (var i = 0; i < list.length; i++) {
(function (im, i) {
if (im.complete) step(im, i);
else {
im.addEventListener('load', function () { fit(); });
im.addEventListener('error', function () { step(im, i); });
}
})(list[i], i);
}
};
settle(artL, 0);
settle(artR, 1);
var slot = document.createElement('div');
slot.setAttribute('data-spp-brand', '1');
if (host.parentNode) {
host.parentNode.insertBefore(slot, host);
host.parentNode.removeChild(host);
} else {
slot = host;
}
host = slot;
var shadow = null;
try { shadow = host.attachShadow({ mode: 'open' }); } catch (e) { shadow = null; }
if (!shadow) return;
var styleEl = document.createElement('style');
styleEl.textContent = BAR_CSS;
shadow.appendChild(styleEl);
while (host.firstChild) host.removeChild(host.firstChild);
shadow.appendChild(strip);
try {
var reAdds = 0;
var mo = new MutationObserver(function () {
if (reAdds >= 3) { mo.disconnect(); return; }
if (host.isConnected) return;
var hd = document.getElementById('header');
if (!hd) return;
reAdds++;
hd.appendChild(host);
fit();
});
mo.observe(document.getElementById('header') || document.body, { childList: true, subtree: true });
} catch (e) { }
var main = document.getElementById('main');
var cap = 0;
if (main) {
var mw = Math.round(main.getBoundingClientRect().width);
if (mw > 0) cap = mw;
}
host.style.setProperty('box-sizing', 'border-box', 'important');
host.style.setProperty('display', 'block', 'important');
host.style.setProperty('position', 'static', 'important');
host.style.setProperty('visibility', 'visible', 'important');
host.style.setProperty('opacity', '1', 'important');
host.style.setProperty('clip-path', 'none', 'important');
host.style.setProperty('transform', 'none', 'important');
host.style.setProperty('filter', 'none', 'important');
host.style.setProperty('pointer-events', 'auto', 'important');
host.style.setProperty('left', 'auto', 'important');
host.style.setProperty('top', 'auto', 'important');
host.style.setProperty('right', 'auto', 'important');
host.style.setProperty('bottom', 'auto', 'important');
host.style.setProperty('width', '100%', 'important');
host.style.setProperty('max-height', 'none', 'important');
host.style.setProperty('height', 'auto', 'important');
host.style.setProperty('zoom', '1', 'important');
host.style.setProperty('scale', '1', 'important');
host.style.setProperty('rotate', 'none', 'important');
host.style.setProperty('translate', 'none', 'important');
host.style.setProperty('clip', 'auto', 'important');
host.style.setProperty('content-visibility', 'visible', 'important');
host.style.setProperty('overflow', 'hidden', 'important');
host.style.setProperty('max-width', (cap > 0 ? cap + 'px' : '100%'), 'important');
host.style.setProperty('margin', '2px auto -5px', 'important');   
function fit() {
if (!strip.offsetWidth) return;
if (main) {
var mw2 = Math.round(main.getBoundingClientRect().width);
if (mw2 > 0 && mw2 !== cap) { cap = mw2; host.style.setProperty('max-width', cap + 'px', 'important'); }
}
var w = strip.clientWidth;
if (w < 320) return;
strip.style.setProperty('--sp', SP + 'px');
var h = Math.floor((w - SP * 2) / (R_ART * 2 + R_CARD));
if (h > H_MAX) h = H_MAX;
if (h < H_MIN) h = H_MIN;
var aw = Math.floor(h * R_ART);
var cw = Math.min(Math.floor(h * R_CARD), w - aw * 2 - SP * 2);
strip.style.setProperty('--bh', h + 'px');
strip.style.setProperty('--aw', aw + 'px');
strip.style.setProperty('--cw', cw + 'px');
var availW = cw - PAD;
if (availW < 60) return;
var gap = Math.max(1, Math.round(h * 0.031));
var hWord = (h * STACK - gap) / (1 + RATIO);
var fs = hWord / LINE_K;
if (fs > FS_MAX) fs = FS_MAX;
if (fs < FS_MIN) fs = FS_MIN;
var wWord = TXT_UNIT * fs + TXT_PAD;
var k = wWord > availW ? (availW / wWord) : 1;
strip.style.setProperty('--gap', gap + 'px');
strip.style.setProperty('--ik', ((hWord * RATIO) / ICON_H).toFixed(4));
btn.style.setProperty('--fs-size', fs.toFixed(2) + 'px');
unit.style.transform = 'scale(' + k.toFixed(4) + ')';
var rowBand = (hWord * RATIO + gap * 0.5) * k;
var zd = (h - h * STACK * k) / 2 + rowBand;
strip.style.setProperty('--zd', (Math.round(zd * 10) / 10) + 'px');
}
fit();
if (document.fonts && document.fonts.ready) document.fonts.ready.then(fit);
var rt = null;
window.addEventListener('resize', function () {
if (rt) clearTimeout(rt);
rt = setTimeout(fit, 160);
});
}
onDomReady(function () { build(); setTimeout(build, 800); });
}
function initImageIndex() {
if (!WANTS.readOnly) return;
function imgIsReal(im) {
const src = im.getAttribute('src') || '';
if (im.closest('.user-pic') || im.closest('.spp-sign-inline')) return false;
if (/images\/(post|face)\//i.test(src)) return false;      
if (/icon|btn|reply|arrow|post\.png|smiley/i.test(src)) return false;
if (im.naturalWidth && Math.min(im.naturalWidth, im.naturalHeight) < 60) return false;
return true;
}
function realImgs(row) {
const box = row.querySelector('.tpc_content');
if (!box) return [];
return [].slice.call(box.querySelectorAll('img')).filter(imgIsReal);
}
GM_addStyle(`
/* ===== SPP-IMGIDX-BEGIN ===== */
#spp-imgidx {
    position:fixed; left:14px; top:calc(50% - 64px); transform:translateY(calc(-1 * var(--spp-ii-anchor, 50%))); z-index:2999;
    transition:width .22s ease;
    box-sizing:border-box; width:var(--spp-ii-ww-lock, var(--spp-ii-ww, 174px));
    background:#0d1420; background-image:none;
    border:1px solid rgba(255,255,255,.13); border-radius:14px;
    box-shadow:0 20px 46px rgba(2,6,23,.66);
    padding:9px 9px 7px;
    font:12px/1.5 "Microsoft YaHei","PingFang SC",Arial,Helvetica,sans-serif;
}
#spp-imgidx .spp-ii__hd {
    position:relative; display:flex; align-items:center; justify-content:center; gap:6px; margin:0 2px 7px;
    font-size:12px; font-weight:700; color:#8ef0b8; cursor:pointer; user-select:none;
}
#spp-imgidx .spp-ii__hd i { width:6px; height:6px; border-radius:50%; background:#3ef58c; box-shadow:0 0 8px rgba(62,245,140,.6); }
#spp-imgidx:not(.spp-ii--edge) .spp-ii__hd { padding-right:24px; }
#spp-imgidx.spp-ii--edge:hover .spp-ii__hd,
#spp-imgidx.spp-ii--edge:focus-within .spp-ii__hd { padding-right:24px; }
#spp-imgidx .spp-ii__hd .spp-ii__fold {
    position:absolute; right:0; top:50%; margin-top:-11px;
    display:inline-flex; align-items:center; justify-content:center;
    box-sizing:border-box; width:22px; height:22px; padding:0;
    border-radius:8px; cursor:pointer;
    font-size:0;
    color:#cfd9e3; background:rgba(255,255,255,.07); border:1px solid rgba(255,255,255,.16);
    transition:color .16s ease, background .16s ease, border-color .16s ease;
}
#spp-imgidx .spp-ii__hd .spp-ii__fold::before,
#spp-imgidx .spp-ii__hd .spp-ii__fold::after {
    content:''; position:absolute; left:50%; top:50%;
    display:block; border-radius:1px; background:currentColor;
}
#spp-imgidx .spp-ii__hd .spp-ii__fold::before { width:10px; height:2px; margin:-1px 0 0 -5px; }
#spp-imgidx .spp-ii__hd .spp-ii__fold::after { width:2px; height:12px; margin:-6px 0 0 -1px; display:none; }
#spp-imgidx.is-fold .spp-ii__hd .spp-ii__fold::before { width:12px; height:2px; margin:-1px 0 0 -6px; }
#spp-imgidx.is-fold .spp-ii__hd .spp-ii__fold::after { display:block; }
#spp-imgidx .spp-ii__hd .spp-ii__fold:hover {
    color:#0ce39a; background:rgba(32,201,151,.16); border-color:rgba(32,201,151,.55);
}
#spp-imgidx .spp-ii__list { max-height:min(62vh, 460px); overflow-y:auto; overflow-x:hidden; }
#spp-imgidx .spp-ii__list::-webkit-scrollbar { width:8px; }
#spp-imgidx .spp-ii__list::-webkit-scrollbar-thumb { background:rgba(255,255,255,.14); border-radius:8px; }
#spp-imgidx .spp-ii__row {
    display:flex; align-items:center; gap:6px; padding:4px 7px; border-radius:8px; cursor:pointer;
    transition:background .14s ease;
}
#spp-imgidx .spp-ii__row:hover { background:rgba(255,255,255,.07); }
#spp-imgidx .spp-ii__row.is-on { background:rgba(32,201,151,.16); box-shadow:inset 2px 0 0 0 #3ef58c; }
#spp-imgidx .spp-ii__tag { font:700 12px/1 Arial,Helvetica,sans-serif; color:#cfd9e3; min-width:34px; }
#spp-imgidx .spp-ii__row.is-on .spp-ii__tag { color:#eafff8; }
#spp-imgidx .spp-ii__num {
    box-sizing:border-box; flex:0 1 46px; min-width:30px; text-align:center; outline:none;
    font:700 11.5px/1 Arial,Helvetica,sans-serif; color:#eafff8; -webkit-text-fill-color:#eafff8;
    background:rgba(255,255,255,.08); border:1px solid rgba(255,255,255,.16); border-radius:7px;
    padding:4px 5px; transition:border-color .14s ease, background .14s ease;
}
#spp-imgidx .spp-ii__num:focus { border-color:rgba(32,201,151,.6); background:rgba(32,201,151,.14); }
#spp-imgidx .spp-ii__total {
    margin-left:auto; min-width:24px; text-align:right;
    font:700 12.5px/1 Arial,Helvetica,sans-serif; color:#3ef58c; font-variant-numeric:tabular-nums;
}
#spp-imgidx .spp-ii__row.is-on .spp-ii__total { color:#8bf2cf; }
#spp-imgidx .spp-ii__num::placeholder { color:#5f7285; font-weight:400; font-size:10.5px; }
#spp-imgidx .spp-ii__u { font-size:10.5px; color:#7f8f9e; }
#spp-imgidx.spp-ii--edge { width:var(--spp-ii-ws, 174px); overflow:hidden; }
#spp-imgidx.spp-ii--edge:not(:hover):not(:focus-within) { width:var(--spp-ii-ws1, 74px); }
#spp-imgidx.spp-ii--edge:not(:hover):not(:focus-within) .spp-ii__tab:not(.is-on) { display:none; }
#spp-imgidx.spp-ii--edge:not(:hover):not(:focus-within) { padding-bottom:9px; }
#spp-imgidx.spp-ii--edge:not(:hover):not(:focus-within) .spp-ii__hd { margin-bottom:0; }
#spp-imgidx.spp-ii--edge .spp-ii__list,
#spp-imgidx.spp-ii--edge .spp-ii__fold { display:none; }
#spp-imgidx.spp-ii--edge:hover,
#spp-imgidx.spp-ii--edge:focus-within { width:var(--spp-ii-ww-lock, var(--spp-ii-ww, 174px)); overflow:visible; }
#spp-imgidx.spp-ii--pinned { outline:none !important; }
#spp-imgidx.spp-ii--noanim, #spp-imgidx.spp-ii--noanim.spp-ii--narrow { transition:none !important; }
#spp-imgidx.spp-ii--edge:hover .spp-ii__list,
#spp-imgidx.spp-ii--edge:focus-within .spp-ii__list { display:block; }
#spp-imgidx.spp-ii--edge:hover .spp-ii__fold,
#spp-imgidx.spp-ii--edge:focus-within .spp-ii__fold { display:inline-flex; }

/* t79: explicit expand state (real machine could not expand via CSS hover) */
#spp-imgidx.spp-ii--open { width:var(--spp-ii-ww-lock, var(--spp-ii-ww, 174px)); overflow:visible; }
#spp-imgidx.spp-ii--open .spp-ii__list { display:block; }
#spp-imgidx.spp-ii--open .spp-ii__fold { display:inline-flex; }
#spp-imgidx .spp-ii__hd:focus { outline:none; }
#spp-imgidx .spp-ii__hd:focus-visible { outline:2px solid rgba(62,245,140,.55); outline-offset:2px; border-radius:6px; }
@media (prefers-reduced-motion: reduce) { #spp-imgidx { transition:none; } }
#spp-imgidx .spp-ii__tab {
    display:inline-flex; align-items:center; gap:5px; height:22px; padding:0 9px;
    border-radius:8px; cursor:pointer; user-select:none;
    font-size:12px; font-weight:700; line-height:1; white-space:nowrap;
    color:#93a6bb; background:rgba(255,255,255,.045); border:1px solid rgba(255,255,255,.08);
    transition:color .16s ease, background .16s ease, border-color .16s ease;
}
#spp-imgidx .spp-ii__tab > i { background:#3f4b5c; box-shadow:none; }
#spp-imgidx .spp-ii__tab:hover { color:#cfe0f0; background:rgba(255,255,255,.08); }
#spp-imgidx .spp-ii__tab.is-on { color:#8ef0b8; background:rgba(32,201,151,.16); border-color:rgba(32,201,151,.55); }
#spp-imgidx .spp-ii__tab.is-on > i { background:#3ef58c; box-shadow:0 0 8px rgba(62,245,140,.6); }
#spp-imgidx .spp-ii__tab.is-off { opacity:.38; cursor:default; }
#spp-imgidx .spp-ii__tab.is-off:hover { color:#93a6bb; background:rgba(255,255,255,.045); }
#spp-imgidx .spp-ii__tab > b { font:inherit; font-weight:700; }
#spp-imgidx.spp-ii--narrow .spp-ii__tab { padding:0 7px; gap:4px; }
#spp-imgidx .spp-ii__row.is-link .spp-ii__u { margin-left:auto; }
#spp-imgidx .spp-ii__code {
    display:inline-flex; align-items:center; height:16px; padding:0 5px; border-radius:5px;
    font:700 10px/1 Arial,Helvetica,sans-serif; color:#ffd489;
    background:rgba(224,165,58,.16); border:1px solid rgba(224,165,58,.42);
}
#spp-imgidx .spp-ii__code.is-bare { color:#8ef0b8; background:rgba(32,201,151,.14); border-color:rgba(32,201,151,.42); }
#spp-imgidx .spp-ii__net {
    display:inline-flex; align-items:center; height:16px; padding:0 5px; border-radius:5px;
    font:700 10px/1 Arial,Helvetica,sans-serif;
}
#spp-imgidx .spp-ii__net.is-ed2k { color:#9fd8ff; background:rgba(56,152,236,.16); border:1px solid rgba(56,152,236,.42); }
#spp-imgidx .spp-ii__net.is-magnet { color:#e0b3ff; background:rgba(155,89,208,.16); border:1px solid rgba(155,89,208,.42); }
#spp-imgidx .spp-ii__net { cursor:pointer; }
#spp-imgidx .spp-ii__net:hover { filter:brightness(1.35); }
#spp-imgidx .spp-ii__list[data-pane="link"] { overflow:visible; max-height:none; }
#spp-imgidx .spp-ii__rows { max-height:min(52vh, 360px); overflow-y:auto; overflow-x:hidden; }
#spp-imgidx .spp-ii__rows::-webkit-scrollbar { width:8px; }
#spp-imgidx .spp-ii__rows::-webkit-scrollbar-thumb { background:rgba(255,255,255,.14); border-radius:8px; }
#spp-imgidx .spp-ii__ft { display:flex; gap:6px; margin:8px 2px 1px; }
#spp-imgidx .spp-ii__btn {
    flex:1 1 0; display:inline-flex; align-items:center; justify-content:center; gap:4px;
    box-sizing:border-box; height:26px; padding:0 6px; cursor:pointer;
    font:700 11.5px/1 "Microsoft YaHei","PingFang SC",Arial,Helvetica,sans-serif;
    color:#cfe0f0; background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.14);
    border-radius:8px; transition:color .16s ease, background .16s ease, border-color .16s ease;
}
#spp-imgidx .spp-ii__btn:hover { color:#eafff8; background:rgba(32,201,151,.18); border-color:rgba(32,201,151,.55); }
#spp-imgidx .spp-ii__btn[disabled] { opacity:.45; cursor:default; }
#spp-imgidx .spp-ii__btn[disabled]:hover { color:#cfe0f0; background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.14); }
#spp-imgidx .spp-ii__num.spp-ii__floor { flex:0 1 62px; width:62px; min-width:52px; }
#spp-imgidx .spp-ii__note--img { margin-top:6px; }
#spp-imgidx .spp-ii__note {
    margin:7px 2px 0; padding:5px 7px; border-radius:7px;
    font-size:11px; line-height:1.35; color:#a9bccd;
    background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.09);
}
#spp-imgidx .spp-ii__note:empty { display:none; }
#spp-imgidx .spp-ii__note.is-ok { color:#8ef0b8; border-color:rgba(32,201,151,.45); background:rgba(32,201,151,.12); }
#spp-imgidx .spp-ii__note.is-bad { color:#ffb4a8; border-color:rgba(255,120,90,.45); background:rgba(255,120,90,.10); }
#spp-imgidx.is-fold .spp-ii__list { display:none; }
#spp-imgidx.is-fold { padding-bottom:9px; }
#spp-imgidx.is-fold .spp-ii__hd { margin-bottom:0; }
html #main > form > .t5.t2 { scroll-margin-top:76px; }
#spp-imgidx .spp-ii__tag { flex:0 0 auto; white-space:nowrap; }
html .spp-ii-hit { outline:3px solid #3ef58c !important; outline-offset:3px !important; border-radius:6px; }
html a.spp-ii-hit { background:rgba(62,245,140,.18) !important; box-shadow:0 0 0 3px rgba(62,245,140,.18) !important; }
#spp-imgidx .spp-ii__pg {
    position:sticky; top:0; z-index:2; margin:6px 0 3px; padding:2px 6px;
    font:700 10.5px/1.5 Arial,Helvetica,sans-serif; color:#8ef0b8;
    background:rgba(13,20,32,.94); border-bottom:1px solid rgba(32,201,151,.28);
}
#spp-imgidx .spp-ii__pg:first-child { margin-top:0; }
#spp-imgidx .spp-ii__row.is-ref { box-shadow:inset 2px 0 0 0 rgba(62,245,140,.45); }
#spp-imgidx .spp-ii__row.is-ref .spp-ii__tag { color:#a9c9b8; }
#spp-imgidx .spp-ii__btn.is-on { color:#0ce39a; background:rgba(32,201,151,.18); border-color:rgba(32,201,151,.55); }
#spp-imgidx .spp-ii__list[data-pane="img"] { overflow:visible; max-height:none; }
#spp-imgidx .spp-ii__pager {
    display:flex; align-items:center; justify-content:center; gap:5px;
    margin:6px 2px 0; padding-top:6px; border-top:1px solid rgba(255,255,255,.09);
}
#spp-imgidx .spp-ii__pager[hidden] { display:none; }
#spp-imgidx .spp-ii__pgb {
    flex:0 0 auto; box-sizing:border-box; width:22px; height:22px; padding:0; cursor:pointer;
    font:700 13px/1 Arial,Helvetica,sans-serif; color:#cfe0f0;
    background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.14); border-radius:7px;
    transition:color .16s ease, background .16s ease, border-color .16s ease;
}
#spp-imgidx .spp-ii__pgb:hover { color:#eafff8; background:rgba(32,201,151,.18); border-color:rgba(32,201,151,.55); }
#spp-imgidx .spp-ii__pgb[disabled] { opacity:.38; cursor:default; }
#spp-imgidx .spp-ii__pgb[disabled]:hover { color:#cfe0f0; background:rgba(255,255,255,.06); border-color:rgba(255,255,255,.14); }
#spp-imgidx .spp-ii__pgt {
    flex:0 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
    font:700 10.5px/1 Arial,Helvetica,sans-serif; color:#93a6bb; font-variant-numeric:tabular-nums;
}
/* ===== SPP-IMGIDX-END ===== */
`);
var CODE_LABEL = /(提取码|提取碼|访问码|訪問碼|解压码|解壓碼|解压密码|解壓密碼|验证码|驗證碼|密码|密碼|pwd|password)\s*[::=]?\s*([A-Za-z0-9]{4,10})/gi;
var CODE_PARAM = /[?&](?:pwd|password)=([A-Za-z0-9]{4,10})/i;
var CODE_BARE = /(^|[^A-Za-z0-9])([A-Za-z0-9]{4})(?![A-Za-z0-9])/g;
var NOT_A_CODE = [/^[A-Za-z]\d{1,3}[Ff]$/, /^(19|20)\d{2}$/];
var CODE_STOP = /^(ed2k|m3u8|h264|x265|h265|1080|2160|1440|720p)$/i;
var lkMode = 'strict', lkFmt = 'a', lkTab = 'img';
try {
if (localStorage.getItem('spp_lk_mode') === 'lax') lkMode = 'lax';
var lkF = localStorage.getItem('spp_lk_fmt');
if (lkF === 'b' || lkF === 'c') lkFmt = lkF;
if (localStorage.getItem('spp_lk_tab') === 'link') lkTab = 'link';
} catch (e) {}
function halfWidth(s) {
return String(s || '').replace(/[\uFF01-\uFF5E]/g, function (c) {
return String.fromCharCode(c.charCodeAt(0) - 0xFEE0);
}).replace(/\u3000/g, ' ');
}
function splitParts(box) {
const F = flatScan(box);
const flat = F.flat, own = F.ownOf, anchors = F.anchors;
const hits = netHits(flat);
const inNet = [];
let i, hi = 0, p = 0, ai = 0, q;
for (i = 0; i < hits.length; i++) for (q = hits[i].s; q < hits[i].e; q++) inNet[q] = 1;
const parts = [];
const flushEmpty = function (at) {
while (ai < anchors.length) {
const a = anchors[ai];
if (a.e > a.s) { ai++; continue; }
if (a.s > at) break;
ai++;
parts.push({ kind: 'link', url: a.href, net: netKind(a.href), el: a.el, pic: true });
}
};
while (p < flat.length) {
flushEmpty(p);
while (hits[hi] && p >= hits[hi].e) hi++;
if (hits[hi] && p >= hits[hi].s && p < hits[hi].e) {
const h = hits[hi];
const nd = F.nodeOf[h.s];
parts.push({ kind: 'link', url: h.url, net: h.net, el: (nd && nd.parentElement) || null });
p = h.e;
continue;
}
const o = own[p];
q = p + 1;
while (q < flat.length && !inNet[q] && own[q] === o) q++;
if (o === -1) {
const t = flat.slice(p, q);
if (t.replace(/\s+/g, '')) parts.push({ kind: 'text', text: t });
} else if (o >= 0) {
const a = anchors[o];
parts.push({ kind: 'link', url: a.href, net: netKind(a.href), el: a.el,
pic: !String(a.el.textContent || '').trim() });
if (ai <= o) ai = o + 1;
}
p = q;
}
flushEmpty(flat.length);
return parts;
}
function codesIn(text) {
var out = [], m, i;
CODE_LABEL.lastIndex = 0;
while ((m = CODE_LABEL.exec(text))) out.push({ label: m[1], code: m[2] });
CODE_BARE.lastIndex = 0;
while ((m = CODE_BARE.exec(text))) {
var tok = m[2], bad = false;
for (i = 0; i < NOT_A_CODE.length; i++) if (NOT_A_CODE[i].test(tok)) bad = true;
if (bad) continue;
if (CODE_STOP.test(tok)) continue;
if (out.some(function (c) { return c.code === tok; })) continue;
if (lkMode === 'strict' && /[A-Za-z]/.test(tok) && !/\d/.test(tok)) continue;
out.push({ label: '', code: tok, bare: true });
}
return out;
}
const NET_RE = /(?:magnet:\?(?=[^\s<>"']*xt=urn:btih:)[^\s<>"']+|ed2k:\/\/\|file\|[^\n<>"']*?\|\d+\|[0-9a-fA-F]{32}\|\/?|ed2k:\/\/[^\s<>"']+)/gi;
const NET_TAIL = /[)\])】》、,。;:,.;:!!??"'”’…]+$/;
const NET_LABEL = { ed2k: '电', magnet: '磁' };
function netKind(u) {
if (/^ed2k:\/\//i.test(u)) return 'ed2k';
if (/^magnet:\?/i.test(u) && /xt=urn:btih:/i.test(u)) return 'magnet';
return '';
}
function netClean(u) {
var s = String(u || ''), prev = '';
while (prev !== s) { prev = s; s = s.replace(NET_TAIL, ''); }
return s;
}
const NET_FLAT_BLOCK = /^(ADDRESS|ARTICLE|ASIDE|BLOCKQUOTE|BR|CENTER|DD|DIV|DL|DT|FIELDSET|FIGCAPTION|FIGURE|FOOTER|FORM|H1|H2|H3|H4|H5|H6|HEADER|HR|LI|MAIN|NAV|OL|P|PRE|SECTION|TABLE|TBODY|TD|TFOOT|TH|THEAD|TR|UL)$/;
function flatScan(box) {
const chars = [], nodeOf = [], offOf = [], ownOf = [], anchors = [];
let cur = -1;
const sep = function () {
if (chars.length && chars[chars.length - 1] !== '\n') {
chars.push('\n'); nodeOf.push(null); offOf.push(0); ownOf.push(-2);
}
};
(function walk(node) {
Array.prototype.forEach.call(node.childNodes, function (n) {
if (n.nodeType === 3) {
const v = halfWidth(n.nodeValue);
for (let i = 0; i < v.length; i++) {
chars.push(v.charAt(i)); nodeOf.push(n); offOf.push(i); ownOf.push(cur);
}
return;
}
if (n.nodeType !== 1) return;
if (n.tagName === 'H6' && n.classList && n.classList.contains('quote')) return;
const block = NET_FLAT_BLOCK.test(n.tagName);
if (block) sep();
let isA = false, idx = -1;
const prev = cur;
if (n.tagName === 'A') {
const href = n.getAttribute('href') || '';
if (href && !/^(javascript:|#)/i.test(href)) {
isA = true;
idx = anchors.length;
anchors.push({ el: n, href: n.href || href, s: chars.length, e: -1 });
cur = idx;
}
}
walk(n);
if (isA) { anchors[idx].e = chars.length; cur = prev; }
if (block) sep();
});
})(box);
return { flat: chars.join(''), chars: chars, nodeOf: nodeOf, offOf: offOf, ownOf: ownOf, anchors: anchors };
}
function netHits(flat) {
const out = [];
let m, guard = 0;
NET_RE.lastIndex = 0;
while ((m = NET_RE.exec(flat)) && guard < 4000) {
guard++;
const u = netClean(m[0]);
if (u) out.push({ s: m.index, e: m.index + u.length, url: u, net: netKind(u) });
NET_RE.lastIndex = m.index + (u.length || 1);
}
return out;
}
function scanLinks(box) {
var parts = splitParts(box), links = [], i, j;
for (i = 0; i < parts.length; i++) {
if (parts[i].kind !== 'link') continue;
var item = { url: parts[i].url, el: parts[i].el || null, net: parts[i].net || '',
pic: !!parts[i].pic,
fp: parts[i].net ? parts[i].url : fpOf(parts[i].url), code: null };
var pm = CODE_PARAM.exec(item.url);
if (pm) item.code = { label: 'pwd', code: pm[1], inUrl: true };
var after = '', before = '';
for (j = i + 1; j < parts.length && parts[j].kind !== 'link'; j++) after += parts[j].text;
for (j = i - 1; j >= 0 && parts[j].kind !== 'link'; j--) before = parts[j].text + before;
if (!item.code) {
var ca = codesIn(after);
if (ca.length) item.code = ca[0];
}
if (!item.code) {
var cb = codesIn(before);
if (cb.length) item.code = cb[0];
}
links.push(item);
}
if (!links.length) return { links: [], loose: [] };
return { links: links, loose: [] };
}
function lkCodeText(c) { return c.label ? (c.label + ' ' + c.code) : c.code; }
function locList(list) {
return (list || []).filter(function (l) { return l && !l.pic; });
}
function picA(a) {
if (!a || a.tagName !== 'A') return false;
const kids = a.children;
if (kids.length !== 1 || kids[0].tagName !== 'IMG') return false;
return !String(a.textContent || '').trim();
}
function pageUrl(n) {
var base = location.href.split('#')[0];
if (/(?<!f)page[-=](\d+|e|last)\b/i.test(base)) return base.replace(/([\s\S]*)(?<!f)page([-=])(\d+|e|last)\b/i, '$1page$2' + n);
if (/\.html(\?|$)/.test(base)) return base.replace(/\.html(\?|$)/, '-page-' + n + '.html$1');
return base + (base.indexOf('?') >= 0 ? '&' : '?') + 'page=' + n;
}
function curPage() {
var s = location.pathname + location.search;
var m = s.match(/(?<!f)page[-=](\d+)/gi);
if (m) return Number((m[m.length - 1].match(/\d+/) || [1])[0]);
if (/(?<!f)page[-=](e|last)\b/i.test(s)) {
try { if (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.siteLast) return SPP_FLOW_SYNC.siteLast; } catch (e) { }
try { return totalPages() || 1; } catch (e) { return 1; }
}
return 1;
}
function totalPages() {
var one = document.querySelector('.pagesone');
var m = one ? (one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/) : null;
var byText = m ? (Number(m[2]) || 1) : 1;
var byLinks = 1;
var tid = (location.href.match(/tid[-=](\d+)/i) || [])[1];
Array.prototype.forEach.call(document.querySelectorAll('a[href*="page-"], a[href*="page="]'), function (a) {
var href = a.getAttribute('href') || '';
if (!/read\.php/i.test(href)) return;
if (tid && href.indexOf(tid) < 0) return;
var mm = href.match(/(?<!f)page[-=](\d+)/i);
if (mm) byLinks = Math.max(byLinks, Number(mm[1]) || 1);
});
return Math.min(Math.max(byText, byLinks), 60);
}
function pagerSeen() {
var one = document.querySelector('.pagesone');
return one ? ((one.textContent || '').replace(/\s+/g, ' ').trim().slice(0, 18) || '(空)') : null;
}
function fetchPage(n, tries) {
return fetch(pageUrl(n), { credentials: 'include' }).then(function (res) {
if (!res.ok) throw new Error('HTTP ' + res.status);
return res.text();
}).catch(function (e) {
if (tries <= 1) throw e;
return new Promise(function (r) { setTimeout(r, 800); })
.then(function () { return fetchPage(n, tries - 1); });
});
}
function locRowTag(row) {
var fl = row.querySelector('.tiptop > .fl');
if (!fl) return '楼';
var nm = fl.querySelector('.spp-rf-name');
var s = fl.textContent || '';
if (nm) s = s.split(nm.textContent || '').join('');
return s.replace(/\s+/g, '').trim() || '楼';
}
function scanDoc(doc) {
var out = [];
Array.prototype.forEach.call(doc.querySelectorAll('#main > form > .t5.t2'), function (row) {
var box = row.querySelector('.tpc_content');
if (!box) return;
var lk = scanLinks(box);
lk = { links: locList(lk.links), loose: lk.loose };
if (!lk.links.length && !lk.loose.length) return;
out.push({ row: null, tag: locRowTag(row), links: lk.links, loose: lk.loose });
});
return out;
}
function dedupeLinks(list) {
var seen = {}, out = [];
list.forEach(function (r) {
(r.links || []).forEach(function (l) {
var key = r.tag + '\u0001' + l.url;
if (seen[key]) return;
seen[key] = 1;
out.push({ tag: r.tag, url: l.url, code: l.code });
});
if (r.loose && r.loose.length && !(r.links && r.links.length)) {
out.push({ tag: r.tag, url: '', code: r.loose[0] });
}
});
return out;
}
function renderCopy(list) {
if (lkFmt === 'c') return list.map(function (r) { return r.url; }).filter(Boolean).join('\n');
if (lkFmt === 'b') {
var o = [];
list.forEach(function (r, i) {
if (i === 0 || list[i - 1].tag !== r.tag) {
o.push('- ' + r.tag + (r.code && !r.code.inUrl ? '  ' + lkCodeText(r.code) : ''));
}
if (r.url) o.push('  ' + r.url);
});
return o.join('\n');
}
var groups = [], cur = null;
list.forEach(function (r) {
if (!cur || cur.tag !== r.tag) { cur = { tag: r.tag, parts: [] }; groups.push(cur); }
if (r.url) cur.parts.push(r.url + (r.code && !r.code.inUrl ? ' ' + lkCodeText(r.code) : ''));
else if (r.code) cur.parts.push(lkCodeText(r.code));
});
return groups.map(function (g) {
return '- ' + g.tag + '  ' + (g.parts.join(' 、 ') || '(本层无链接)');
}).join('\n');
}
function copyText(text, done) {
var fb = function () {
try {
var ta = document.createElement('textarea');
ta.value = text;
ta.style.cssText = 'position:fixed;left:-9999px;top:0';
document.body.appendChild(ta);
ta.select();
var ok = document.execCommand('copy');
ta.parentNode.removeChild(ta);
done(ok);
} catch (e) { done(false); }
};
try {
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(function () { done(true); }, fb);
return;
}
} catch (e) {}
fb();
}
let panel = null, rows = [], linkRows = [], lastKey = '', noteEl = null, noteImgEl = null;
const dlState = { run: false, stop: false };
let activeTab = lkTab, folded = false, tabOk = { img: false, link: false };
var II_W_LEFT = 14, II_W_GAP = 10, II_W_MAX = 174;
var II_W_MIN = 128;
var II_W_HEAD = 138;
function contentLeft() {
var el = document.querySelector('#main > form > .t5.t2 .r_two') ||
document.querySelector('#main > form > .t5.t2 .user-pic img') ||
document.querySelector('#main > form > .t5.t2 img');
if (!el) return null;
var b = el.getBoundingClientRect();
return b.width ? b.x : null;
}
function fitWidth() {
if (!panel) return;
var left = contentLeft();
var avail = (left === null) ? II_W_MAX : (left - II_W_LEFT - II_W_GAP);
var w = Math.max(II_W_MIN, Math.min(II_W_MAX, Math.round(avail)));
panel.style.setProperty('--spp-ii-ws', w + 'px');
panel.classList.toggle('spp-ii--narrow', w < II_W_HEAD);
var tab0 = panel.querySelector('.spp-ii__tab');
var tw = tab0 ? tab0.getBoundingClientRect().width : 0;
panel.style.setProperty('--spp-ii-ws1', (tw > 10 ? Math.ceil(tw) + 24 : 74) + 'px');
}
function textLeft() {
const b = document.querySelector('#main > form > .t5.t2 .tpc_content') ||
document.querySelector('#main .tpc_content');
if (!b) return null;
const x = b.getBoundingClientRect().left;
return x > 8 ? Math.round(x) : null;
}
const II_W_WIDE = 250;
var WW_NEED = { img: 0, link: 0 };
var WW_TAB = '';        
function applyPaneWidth() {
if (!panel) return 0;
var cur = parseFloat(panel.style.getPropertyValue('--spp-ii-ww')) || 0;
var want = WW_NEED[activeTab] || WW_NEED.img || WW_NEED.link || II_W_MAX;
var exact = (WW_TAB !== activeTab);
WW_TAB = activeTab;
var w = exact ? want : Math.max(want, cur);
w = Math.max(II_W_MAX, w);
if (Math.abs(w - cur) >= 1 && !panel.style.getPropertyValue('--spp-ii-ww-lock')) panel.style.setProperty('--spp-ii-ww', Math.round(w) + 'px');
return w;
}
function fitRowWidth() {
if (!panel) return 0;
const lists = [panel.querySelector('.spp-ii__list[data-pane="img"]'),
panel.querySelector('.spp-ii__list[data-pane="link"]')];
const rowBox = [panel.querySelector('.spp-ii__rows[data-rows="img"]'),
panel.querySelector('.spp-ii__rows[data-rows="link"]')];
const prevW = panel.style.width, prevT = panel.style.transition, prevC = panel.className;
const prevD = lists.map(function (l) { return l ? l.style.display : ''; });
lists.forEach(function (l) { if (l) l.style.display = 'block'; });
panel.style.transition = 'none';
panel.className = '';
panel.style.width = '400px';
let cap = II_W_WIDE;
const tl = textLeft();
if (tl !== null) cap = Math.max(II_W_MAX, Math.min(cap, tl - II_W_LEFT - 8));
const paneW = function (r) { return Math.max(II_W_MAX, Math.min(cap, Math.ceil(r) + 28)); };
const need = { img: 0, link: 0 };
rowBox.forEach(function (l) {
if (!l) return;
const nm = l.getAttribute('data-rows') || 'img';
const rs = l.querySelectorAll('.spp-ii__row');
for (let i = 0; i < rs.length && i < 40; i++) {
const kids = rs[i].children;
let sum = 14;
for (let j = 0; j < kids.length; j++) sum += kids[j].getBoundingClientRect().width;
if (kids.length > 1) sum += 6 * (kids.length - 1);
if (sum > need[nm]) need[nm] = sum;
}
});
panel.style.width = prevW;
panel.style.transition = prevT;
panel.className = prevC;
lists.forEach(function (l, i) { if (l) l.style.display = prevD[i]; });
WW_NEED.img = paneW(need.img);
WW_NEED.link = paneW(need.link);
return applyPaneWidth();
}
function renderMergedChips() {
try {
const SY = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC) ? SPP_FLOW_SYNC : null;
if (!SY || !SY.pages || !SY.pages.length) return;
var KG = 5;
try { KG = SPP_CONFIG.num('spp_preload_pages', 5, 1, 30); } catch (e) { KG = 5; }
if (KG > 1 && SY.pages.length > 1) return;
const here = curPage();
const ps = SY.pages.slice().sort(function (a, b) { return a - b; });
const hosts = [panel.querySelector('.spp-ii__rows[data-rows="img"]'), panel.querySelector('.spp-ii__rows[data-rows="link"]')];
hosts.forEach(function (host) {
if (!host) return;
[].slice.call(host.querySelectorAll('.spp-ii__pg.is-merged')).forEach(function (x) { x.remove(); });
let rowPages = null;
try {
const nmKey = host.getAttribute('data-rows') === 'img' ? 'img' : 'link';
if (SY.rowPages && SY.rowPages[nmKey]) rowPages = SY.rowPages[nmKey];
} catch (e) { }
if (!rowPages) {
rowPages = {};
[].slice.call(host.querySelectorAll('.spp-ii__row[data-key]')).forEach(function (r) {
const k = r.getAttribute('data-key') || '';
const p = Number(k.split('#')[0]);
if (p) rowPages[p] = 1;
});
}
const others = ps.filter(function (p) { return p !== here; });
const emitted = {};
[].slice.call(host.querySelectorAll('.spp-ii__pg:not(.is-merged)')).forEach(function (h) {
const m = String(h.textContent || '').match(/第\s*(\d+)\s*页/);
if (m) emitted[Number(m[1])] = 1;
});
const noRows = others.filter(function (p) { return !rowPages[p]; });
const withRows = others.filter(function (p) { return rowPages[p] && !emitted[p]; });
withRows.forEach(function (p) {
const h = document.createElement('div');
h.className = 'spp-ii__pg is-merged';
h.textContent = '第 ' + p + ' 页 · 已合并';
host.appendChild(h);
});
const pushRun = function (a, b) {
const h = document.createElement('div');
h.className = 'spp-ii__pg is-merged';
h.textContent = (a === b)
? ('第 ' + a + ' 页 · 已合并 · 暂无可定位内容')
: ('第 ' + a + '–' + b + ' 页 · 已合并 · 暂无可定位内容');
host.appendChild(h);
};
let runStart = null, runPrev = null;
noRows.forEach(function (p) {
if (runStart === null) { runStart = p; runPrev = p; return; }
if (p === runPrev + 1) { runPrev = p; return; }
pushRun(runStart, runPrev); runStart = p; runPrev = p;
});
if (runStart !== null) pushRun(runStart, runPrev);
});
} catch (e) { }
}
function refreshMergedTitles() {
try {
var done = false;
try { done = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.fillDone === true); } catch (e0) { }
var K = 5;
try { K = SPP_CONFIG.num('spp_preload_pages', 5, 1, 30); } catch (e1) { K = 5; }
var heads = panel.querySelectorAll('.spp-ii__pg.is-merged[data-spp-static-text]');
var ps = [];
try { ps = (SPP_FLOW_SYNC && SPP_FLOW_SYNC.pages) ? SPP_FLOW_SYNC.pages.slice().sort(function (x, y) { return x - y; }) : []; } catch (eP) { }
for (var i = 0; i < heads.length; i++) {
var h = heads[i];
var busy = (K > 1) && !done && (h.getAttribute('data-spp-busy-len') === '1');
var want;
if (busy) {
want = h.getAttribute('data-spp-busy-text');
} else {
var want0 = h.getAttribute('data-spp-static-text');
try {
var hereR = Number(h.getAttribute('data-spp-here')) || 1;
var rowsR = h.getAttribute('data-spp-rows') || '0';
if (ps.length) {
var loR = Math.min(ps[0], hereR), hiR = Math.max(ps[ps.length - 1], hereR);
want0 = '第 ' + loR + '–' + hiR + ' 页 · 已合并(共 ' + rowsR + ' 条,第 ' + hereR + ' 页为本页)';
}
} catch (eR) { }
want = want0;
}
if (want && h.textContent !== want) h.textContent = want;
}
} catch (e) { }
}
try { SPP_FLOW_SYNC.onPush = function () { try { build(); } catch (e) { } try { refreshMergedTitles(); } catch (e) { } try { renderMergedChips(); } catch (e) { } }; } catch (e) { }
function build() {
try { (window.__sppDebug = window.__sppDebug || {}).idxRebuild = build; } catch (e) { }   
const all = [].slice.call(document.querySelectorAll('#main > form > .t5.t2'));
const here = curPage();
const flowOf = function (row) {
try {
if (!row || !row.getAttribute) return 0;
const own = row.getAttribute('data-spp-pg');
if (own) { const q = Number(own); if (q) return q; }
const host = (row.closest) ? row.closest('[data-spp-pg]') : null;
if (host) { const q2 = Number(host.getAttribute('data-spp-pg')); if (q2) return q2; }
} catch (e) { }
return 0;
};            
totalCache = totalPages();
const byPage = function (a, b) { return a.page - b.page; };
const data = [], ldata = [];
all.forEach(function (row) {
const tag = locRowTag(row);
const pid = rowPid(row);
const imgs = realImgs(row).map(function (im) {
return { el: im, fp: fpOf(im.getAttribute('src')) };
});
if (imgs.length) data.push({ row: row, imgs: imgs, tag: tag, pid: pid, page: flowOf(row) || here });
const box = row.querySelector('.tpc_content');
if (!box) return;
const lk = scanLinks(box);
const lkLoc = locList(lk.links);
if (lkLoc.length) {
ldata.push({ row: row, tag: tag, pid: pid, page: flowOf(row) || here, links: lkLoc, loose: lk.loose });
}
});
if (idxOn()) {
var snap = {};
data.forEach(function (d) {
if (d.page !== here) return;
var e = snap[d.tag] || (snap[d.tag] = { tag: d.tag, pid: d.pid, page: here, imgs: [], links: [] });
d.imgs.forEach(function (it) { e.imgs.push({ el: null, fp: it.fp }); });
});
ldata.forEach(function (d) {
if (d.page !== here) return;
var e = snap[d.tag] || (snap[d.tag] = { tag: d.tag, pid: d.pid, page: here, imgs: [], links: [] });
d.links.forEach(function (l) { e.links.push({ url: l.url, el: null, fp: l.fp, net: l.net, code: l.code }); });
});
var snapArr = Object.keys(snap).map(function (k2) { return snap[k2]; });
if (JSON.stringify(idxS.pages[here] || null) !== JSON.stringify(snapArr)) {
idxS.pages[here] = snapArr;
idxWrite();
}
const domTags = {}, domPages = {};
data.concat(ldata).forEach(function (d) { if (d.row) { domTags[d.tag] = 1; domPages[d.page] = 1; } });
Object.keys(idxS.pages).forEach(function (k) {
const n = Number(k);
if (n === here) return;
if (domPages[n]) return;   
(idxS.pages[k] || []).forEach(function (r) {
if (domTags[r.tag]) return;   
if (r.imgs && r.imgs.length) {
data.push({ row: null, imgs: r.imgs, tag: r.tag, pid: r.pid, page: n });
}
if (r.links && r.links.length) {
ldata.push({ row: null, tag: r.tag, pid: r.pid, page: n, links: r.links, loose: [] });
}
});
});
data.sort(byPage); ldata.sort(byPage);
}
const per = perPage();
const key = data.map(function (d) { return d.page + '#' + d.tag + ':' + d.imgs.length; }).join('|') + '#' +
ldata.map(function (d) {
return d.page + '#' + d.tag + ':' + d.links.length + ':' + d.links.filter(function (x) { return x.code; }).length;
}).join('|') + '@' + idxRev() + '%' + pgS.img + '/' + pgS.link + '/' + per;
if (key === lastKey && panel) return;
lastKey = key;
rows = data;
linkRows = mergeByTag(ldata);
if (!panel) {
panel = document.createElement('div');
panel.id = 'spp-imgidx';
panel.innerHTML = '<div class="spp-ii__hd">' +
'<span class="spp-ii__tab" data-tab="img" role="button" tabindex="0" aria-label="含图楼层"><i></i><b class="spp-ii__tx">含图</b></span>' +
'<span class="spp-ii__tab" data-tab="link" role="button" tabindex="0" aria-label="链接楼层"><i></i><b class="spp-ii__tx">链接</b></span>' +
'<span class="spp-ii__fold" aria-label="折叠 / 展开" aria-label="折叠 / 展开"></span></div>' +
'<div class="spp-ii__list" data-pane="img">' +
'<div class="spp-ii__rows" data-rows="img"></div>' +
'<div class="spp-ii__pager" data-pager="img" hidden>' +
'<button class="spp-ii__pgb" data-pg="prev" aria-label="上一页">‹</button>' +
'<span class="spp-ii__pgt"></span>' +
'<button class="spp-ii__pgb" data-pg="next" aria-label="下一页">›</button>' +
'</div>' +
'<div class="spp-ii__ft">' +
'<button class="spp-ii__btn" data-scope="1" aria-label="逐页抓完整贴:列出全贴所有含图楼层,点行跨页跳到那一层">全贴索引</button>' +
'</div>' +
'<div class="spp-ii__ft">' +
'<button class="spp-ii__btn" data-dl="page" aria-label="本页所有帖内图片,按 tid—标题—楼层—原名 存进下载目录">下载本页</button>' +
'<button class="spp-ii__btn" data-dl="thread" aria-label="按 Pages x/y 逐页抓完整贴,再按 tid—标题—楼层—原名 下载全部帖内图片">下载本帖</button>' +
'</div>' +
'<div class="spp-ii__ft">' +
'<input class="spp-ii__num spp-ii__floor" placeholder="楼层" aria-label="填楼层号:31 / B31F / 楼主(楼主与 GF 都当 1 楼)">' +
'<button class="spp-ii__btn" data-dl="floor">下载该楼</button>' +
'</div>' +
'<div class="spp-ii__ft">' +
'<button class="spp-ii__btn" data-step="-1" aria-label="上一张图:本层第 1 张上按 = 进上一层的最后一张;本页走到头绕回本页最后一张">上一张</button>' +
'<button class="spp-ii__btn" data-step="1" aria-label="下一张图:本层走完接着走同一页的下一层;本页走到头绕回本页第 1 张">下一张</button>' +
'</div>' +
'<div class="spp-ii__note spp-ii__note--img"></div>' +
'</div>' +
'<div class="spp-ii__list" data-pane="link">' +
'<div class="spp-ii__rows" data-rows="link"></div>' +
'<div class="spp-ii__pager" data-pager="link" hidden>' +
'<button class="spp-ii__pgb" data-pg="prev" aria-label="上一页">‹</button>' +
'<span class="spp-ii__pgt"></span>' +
'<button class="spp-ii__pgb" data-pg="next" aria-label="下一页">›</button>' +
'</div>' +
'<div class="spp-ii__ft">' +
'<button class="spp-ii__btn" data-copy="page" aria-label="复制本页所有链接(含提取码)">复制本页</button>' +
'<button class="spp-ii__btn" data-copy="thread" aria-label="逐页抓完整贴再复制">复制本贴</button>' +
'</div>' +
'<div class="spp-ii__ft">' +
'<button class="spp-ii__btn" data-scope="1" aria-label="逐页抓完整贴:列出全贴所有含链接楼层,点行跨页跳到那一层">全贴索引</button>' +
'</div>' +
'<div class="spp-ii__ft">' +
'<button class="spp-ii__btn" data-step="-1" aria-label="上一条链接:本层第 1 条上按 = 进上一层的最后一条;本页走到头绕回本页最后一条">上一条</button>' +
'<button class="spp-ii__btn" data-step="1" aria-label="下一条链接:本层走完接着走同一页的下一层;本页走到头绕回本页第 1 条">下一条</button>' +
'</div>' +
'<div class="spp-ii__note"></div>' +
'</div>';
document.body.appendChild(panel);
noteEl = panel.querySelector('.spp-ii__list[data-pane="link"] .spp-ii__note');
noteImgEl = panel.querySelector('.spp-ii__list[data-pane="img"] .spp-ii__note');
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__tab'), function (t) {
t.addEventListener('click', function (e) {
e.stopPropagation();
var k = t.getAttribute('data-tab');
if (!tabOk[k]) return;
activeTab = k;
try { localStorage.setItem('spp_lk_tab', k); } catch (er) {}
applyTab();
});
t.addEventListener('keydown', function (e) {
if (e.key !== 'Enter' && e.key !== ' ') return;
e.preventDefault();
t.click();
});
});
(function () {
const hd = panel.querySelector('.spp-ii__hd');
if (!hd) return;
hd.addEventListener('click', function (e) {
const tg = e.target;
if (tg && tg.closest && (tg.closest('.spp-ii__tab') || tg.closest('.spp-ii__fold'))) return;
panel.classList.toggle('spp-ii--open');
});
})();
panel.querySelector('.spp-ii__fold').addEventListener('click', function (e) {
e.stopPropagation();
folded = !folded;
applyTab();
});
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__btn[data-copy]'), function (b) {
b.addEventListener('click', function (e) { e.stopPropagation(); onCopy(b); });
});
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__btn[data-scope]'), function (b) {
b.addEventListener('click', function (e) { e.stopPropagation(); onScope(); });
});
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__btn[data-dl]'), function (b) {
b.addEventListener('click', function (e) {
e.stopPropagation();
onDl(b.getAttribute('data-dl'));
});
});
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__btn[data-step]'), function (b) {
b.addEventListener('click', function (e) {
e.stopPropagation();
var box = b.closest ? b.closest('.spp-ii__list') : null;
stepItem(box ? box.getAttribute('data-pane') : activeTab, Number(b.getAttribute('data-step')) || 1);
});
});
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__pager'), function (bar) {
bar.addEventListener('click', function (e) {
e.stopPropagation();
var b = e.target && e.target.closest ? e.target.closest('.spp-ii__pgb') : null;
if (!b || b.disabled) return;
var d = (b.getAttribute('data-pg') === 'next') ? 1 : -1;
var kind = bar.getAttribute('data-pager');
pgS[kind] = Math.max(1, (pgS[kind] || 1) + d);
pgTop = kind;
build();
});
});
panel.addEventListener('input', function (e) {
var t = e.target;
if (t && t.classList && t.classList.contains('spp-ii__num')) t.__sppAuto = null;
});
}
const list = panel.querySelector('.spp-ii__list[data-pane="img"]');
const listImg = panel.querySelector('.spp-ii__rows[data-rows="img"]');
const listLink = panel.querySelector('.spp-ii__rows[data-rows="link"]');
if (!data.length && !ldata.length) { panel.style.display = 'none'; return; }
panel.style.display = '';
panel.classList.toggle('spp-ii--edge', !SPP_CONFIG.bool('spp_imgidx_show', false));
fitWidth();
panel.classList.add('spp-ii--noanim');
setTimeout(function () { if (panel) panel.classList.remove('spp-ii--noanim'); }, 700);
const keepS = [[listImg, 'img'], [listLink, 'link']].map(function (x) {
const h = x[0];
const f = document.activeElement;
const on = f && h.contains(f) && f.className === 'spp-ii__num';
const top = (pgTop === x[1]) ? 0 : h.scrollTop;
return { h: h, top: top, key: on ? (f.getAttribute('data-key') || '') : '', val: on ? f.value : '' };
});
headSeq = {};
const imgSp = pgSpan(data.length, per, pgS.img);
pgS.img = imgSp.cur;
const imgSlice = data.slice(imgSp.from, imgSp.to);
listImg.textContent = '';
imgSlice.forEach(function (d) {
headRow(d, listImg);
const r = document.createElement('div');
r.className = 'spp-ii__row' + (d.row ? '' : ' is-ref');
r.setAttribute('data-key', d.page + '#' + d.tag);   
r.setAttribute('aria-label', '第 ' + d.page + ' 页 ' + d.tag + (d.row ? '' : '(已索引)'));   
const tag = document.createElement('span');
tag.className = 'spp-ii__tag';
tag.textContent = d.tag;
const total = document.createElement('span');
total.className = 'spp-ii__total';
total.textContent = String(d.imgs.length);
const num = document.createElement('input');
num.className = 'spp-ii__num';
num.type = 'text';
num.inputMode = 'numeric';
num.ariaLabel =  '该层共 ' + d.imgs.length + ' 张图;填第 k 张、回车(或点这一行)跳过去;留空 / 超出总数 = 第 1 张' +
(d.row ? '' : '(第 ' + d.page + ' 页:回车会换页跳过去)');
num.setAttribute('data-key', d.page + '#' + d.tag);
const u = document.createElement('span');
u.className = 'spp-ii__u';
u.textContent = '张';
r.appendChild(tag); r.appendChild(total); r.appendChild(num); r.appendChild(u);
r.addEventListener('click', function (e) {
if (e.target === num) return;
const k = stepIdx(num, d, 'img', d.imgs.length, false);
fillNum(num, k);
go(d, k);
});
num.addEventListener('click', function (e) { e.stopPropagation(); });
num.addEventListener('keydown', function (e) {
if (e.key !== 'Enter') return;
e.preventDefault();
const n = stepIdx(num, d, 'img', d.imgs.length, true);
fillNum(num, n);
go(d, n);
num.blur();
});
d.el = r;
r.__d = d; d.__numEl = num;
listImg.appendChild(r);
});
tabOk.img = !!data.length;
tabOk.link = !!ldata.length;
if (!tabOk[activeTab]) activeTab = tabOk.img ? 'img' : 'link';
const lkSp = pgSpan(ldata.length, per, pgS.link);
pgS.link = lkSp.cur;
const lkSlice = ldata.slice(lkSp.from, lkSp.to);
listLink.textContent = '';
lkSlice.forEach(function (d) {
const r = document.createElement('div');
headRow(d, listLink);
r.className = 'spp-ii__row is-link' + (d.row ? '' : ' is-ref');
r.setAttribute('data-key', d.page + '#' + d.tag);   
r.setAttribute('aria-label', '第 ' + d.page + ' 页 ' + d.tag + (d.row ? '' : '(已索引)'));   
const links = locList(d.links);
const tag = document.createElement('span');
tag.className = 'spp-ii__tag';
tag.textContent = d.tag;
const total = document.createElement('span');
total.className = 'spp-ii__total';
total.textContent = String(links.length);
const coded = links.filter(function (l) { return l.code; })[0] || null;
const nets = ['ed2k', 'magnet'].filter(function (k) {
return links.some(function (l) { return l.net === k; });
});
r.appendChild(tag); r.appendChild(total);
if (coded) {
const cb = document.createElement('span');
cb.className = 'spp-ii__code' + (coded.bare ? ' is-bare' : '');
cb.textContent = coded.bare ? '裸码' : '码';
cb.ariaLabel =  coded.label ? (coded.label + ' ' + coded.code) : ('裸码 ' + coded.code);
r.appendChild(cb);
}
nets.forEach(function (k) {
const nb = document.createElement('span');
nb.className = 'spp-ii__net is-' + k;
nb.textContent = NET_LABEL[k];
nb.addEventListener('click', function (e) { e.stopPropagation(); locateNet(d, k); });
nb.ariaLabel =  (k === 'ed2k' ? '本层有电驴(ed2k)链接' : '本层有磁力(magnet)链接') +
';点它 = 跳到本层这一条' + (k === 'ed2k' ? '电驴' : '磁力') +
'(同类连点 = 下一条);它与 http 链接一起计入「条」数、可「第 k 条」定位、并进复制输出';
r.appendChild(nb);
});
const u = document.createElement('span');
u.className = 'spp-ii__u';
u.textContent = '条';
r.appendChild(u);
r.ariaLabel =  (d.row ? '' : ('第 ' + d.page + ' 页 · ')) +
links.map(function (l) { return l.url; }).slice(0, 4).join('\n') +
'\n点行跳到该层;填第 k 条、回车跳到那一条链接';
const lnum = document.createElement('input');
lnum.className = 'spp-ii__num';
lnum.type = 'text';
lnum.inputMode = 'numeric';
lnum.setAttribute('data-key', d.page + '#' + d.tag);
lnum.ariaLabel =  '该层共 ' + links.length + ' 条可定位链接;填第 k 条、回车(或点这一行)跳过去;留空 / 超出总数 = 第 1 条' +
(d.row ? '' : '(第 ' + d.page + ' 页:回车会换页跳过去)');
lnum.style.marginLeft = 'auto';
u.style.marginLeft = '0';
r.insertBefore(lnum, u);
lnum.addEventListener('click', function (e) { e.stopPropagation(); });
lnum.addEventListener('keydown', function (e) {
if (e.key !== 'Enter') return;
e.preventDefault();
const n = stepIdx(lnum, d, 'link', links.length, true);
fillNum(lnum, n);
goLink(d, n);
lnum.blur();
});
r.addEventListener('click', function (e) {
if (e.target === lnum) return;
const k = stepIdx(lnum, d, 'link', links.length, false);
fillNum(lnum, k);
goLink(d, k);
});
d.el = r;
r.__d = d; d.__numEl = lnum;
listLink.appendChild(r);
});
if (!ldata.length) {
const em = document.createElement('div');
em.className = 'spp-ii__note';
em.textContent = idxOn() ? '本贴没有链接' : '本页没有链接';
listLink.appendChild(em);
}
paintPager('img', data.length, per, pgS.img);
paintPager('link', ldata.length, per, pgS.link);
pgTop = '';      
keepS.forEach(function (k) {
k.h.scrollTop = k.top;
if (!k.key) return;
const f2 = k.h.querySelector('.spp-ii__num[data-key="' + k.key + '"]');
if (f2) { f2.value = k.val; try { f2.focus(); } catch (e2) {} }
});
try {
var rpImg = {}, rpLink = {};
data.forEach(function (d) { if (d.page) rpImg[d.page] = 1; });
ldata.forEach(function (d) { if (d.page) rpLink[d.page] = 1; });
if (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC) SPP_FLOW_SYNC.rowPages = { img: rpImg, link: rpLink };
} catch (e) { }
try {
var SY4 = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC) ? SPP_FLOW_SYNC : null;
var ps4 = (SY4 && SY4.pages) ? SY4.pages.slice().sort(function (a, b) { return a - b; }) : [];
var K4 = 5;
try { K4 = SPP_CONFIG.num('spp_preload_pages', 5, 1, 30); } catch (e) { K4 = 5; }
var mergeOn4 = (K4 > 1) && ps4.length > 1;
if (mergeOn4) {
var here4 = curPage();
var domSet4 = {}; ps4.forEach(function (p) { domSet4[p] = 1; }); domSet4[here4] = 1;
var lo4 = Math.min(ps4[0], here4), hi4 = Math.max(ps4[ps4.length - 1], here4);
[[listImg, data], [listLink, ldata]].forEach(function (pr) {
var host = pr[0], arr = pr[1];
if (!host) return;
[].slice.call(host.querySelectorAll('.spp-ii__pg')).forEach(function (x) { x.remove(); });
var cacheRows4 = [], cachePages4 = {};
[].slice.call(host.querySelectorAll('.spp-ii__row')).forEach(function (r) {
var kk = r.getAttribute('data-key') || '';
var pp = Number(kk.split('#')[0]) || 0;
if (pp && !domSet4[pp]) { cacheRows4.push(r); cachePages4[pp] = 1; }
});
var nRows4 = 0;
arr.forEach(function (d) { nRows4 += (d.imgs ? d.imgs.length : (d.links ? locList(d.links).length : 0)); });
var head4 = document.createElement('div');
head4.className = 'spp-ii__pg is-merged';
var _blkLo = Math.max(1, Math.floor((here4 - 1) / K4) * K4 + 1);
var _blkHi = _blkLo + K4 - 1;
try { var _T = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.siteLast) || 0; if (_T > 0 && _T < _blkHi) _blkHi = _T; } catch (eT) { }
var _fillDone = false;
try { _fillDone = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.fillDone === true); } catch (eFD) { }
var _busy = (K4 > 1) && !_fillDone && (ps4.length < (_blkHi - _blkLo + 1));
var _staticText = '第 ' + lo4 + '–' + hi4 + ' 页 · 已合并(共 ' + nRows4 + ' 条,第 ' + here4 + ' 页为本页)';
var _busyText = '合并中(第 ' + _blkLo + '–' + _blkHi + ' 页)· 已定位 ' + nRows4 + ' 条 · 第 ' + here4 + ' 页为本页';
head4.setAttribute('data-spp-static-text', _staticText);
head4.setAttribute('data-spp-busy-text', _busyText);
head4.setAttribute('data-spp-busy-len', _busy ? '1' : '0');
head4.setAttribute('data-spp-rows', String(nRows4));
head4.setAttribute('data-spp-here', String(here4));
head4.textContent = _busy ? _busyText : _staticText;
host.insertBefore(head4, host.firstChild);
var nP4 = Object.keys(cachePages4).length;
if (nP4 && cacheRows4.length) {
var fold4 = document.createElement('div');
fold4.className = 'spp-ii__pg is-merged';
fold4.style.cursor = 'pointer';
fold4.textContent = '另有 ' + nP4 + ' 页已索引(' + (IDX_FOLD_OPEN ? '收起' : '点开看') + ')';
var box4 = document.createElement('div');
box4.style.display = IDX_FOLD_OPEN ? 'block' : 'none';
cacheRows4.forEach(function (r) { box4.appendChild(r); });
fold4.addEventListener('click', function () {
IDX_FOLD_OPEN = !IDX_FOLD_OPEN;
box4.style.display = IDX_FOLD_OPEN ? 'block' : 'none';
fold4.textContent = '另有 ' + nP4 + ' 页已索引(' + (IDX_FOLD_OPEN ? '收起' : '点开看') + ')';
});
host.appendChild(fold4);
host.appendChild(box4);
}
});
} else {
try { renderMergedChips(); } catch (e) { }
}
} catch (e) { try { renderMergedChips(); } catch (e2) { } }
idxPaint();
applyTab();
fitRowWidth();
}
function mergeByTag(list) {
var byTag = {}, order = [];
list.forEach(function (d) {
var kk = d.page + '#' + d.tag;
var hit = byTag[kk];
if (!hit) { byTag[kk] = d; order.push(d); return; }
d.links.forEach(function (l) {
if (!hit.links.some(function (x) { return x.url === l.url; })) hit.links.push(l);
});
d.loose.forEach(function (c) {
if (!hit.loose.some(function (x) { return x.code === c.code; })) hit.loose.push(c);
});
if (!hit.row && d.row) hit.row = d.row;
});
return order;
}
function paintPager(kind, total, per, cur) {
if (!panel) return;
var bar = panel.querySelector('.spp-ii__pager[data-pager="' + kind + '"]');
if (!bar) return;
var tp = Math.max(1, Math.ceil(total / per));
if (tp <= 1) { bar.hidden = true; return; }
bar.hidden = false;
var tx = bar.querySelector('.spp-ii__pgt');
if (tx) tx.textContent = cur + '/' + tp + ' · 共' + total + '层';
var pv = bar.querySelector('.spp-ii__pgb[data-pg="prev"]');
var nx = bar.querySelector('.spp-ii__pgb[data-pg="next"]');
if (pv) { pv.disabled = cur <= 1; pv.ariaLabel =  (cur <= 1 ? '已经是第一页' : '上一页') + '(每页 ' + per + ' 行)'; }
if (nx) { nx.disabled = cur >= tp; nx.ariaLabel =  (cur >= tp ? '已经是最后一页' : '下一页') + '(每页 ' + per + ' 行)'; }
}
function linkMark(d) {
linkRows.forEach(function (x) { if (x.el) x.el.classList.toggle('is-on', x === d); });
}
function applyTab() {
if (!panel) return;
panel.classList.toggle('is-fold', folded);
const foldEl = panel.querySelector('.spp-ii__fold');
if (foldEl) foldEl.textContent = folded ? '+' : '—';
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__tab'), function (t) {
const k = t.getAttribute('data-tab');
t.classList.toggle('is-on', k === activeTab);
t.classList.toggle('is-off', !tabOk[k]);
});
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__list'), function (p) {
p.style.display = (folded || p.getAttribute('data-pane') !== activeTab) ? 'none' : '';
});
applyPaneWidth();
}
function say(text, kind) {
[noteEl, noteImgEl].forEach(function (n) {
if (!n) return;
n.textContent = text;
n.className = 'spp-ii__note' + (n === noteImgEl ? ' spp-ii__note--img' : '') +
(kind ? ' is-' + kind : '');
});
}
const DL_SCAN_MAX = 5;
function dlTid() {
var m = /[?&]tid[=-](\d+)/i.exec(location.search) || /tid[-=](\d+)/i.exec(location.href);
return m ? m[1] : 'thread';
}
function dlBase(url) {
var name = '';
try {
var u = new URL(url, location.href);
name = decodeURIComponent((u.pathname.split('/').pop() || ''));
} catch (e) { name = ''; }
name = String(name || 'img').replace(/[\\/:*?"<>|]+/g, '_');
if (name.charAt(0) === '.') name = 'img' + name;
if (!/\.[a-z0-9]{2,5}$/i.test(name)) name += '.jpg';
return name;
}
var dlTitleCache = null;
function dlTitle() {
if (dlTitleCache === null) {
var el = document.querySelector('#breadcrumbs strong > a');
dlTitleCache = el ? String(el.textContent || '').replace(/\s+/g, ' ').trim() : '';
}
return dlTitleCache;
}
var DL_MAP = { '\\': '\', '/': '/', ':': ':', '*': '*', '?': '?', '"': '”', '<': '<', '>': '>', '|': '|' };
function dlSafeTitle(t) {
var s = String(t || '').replace(/[\u0000-\u0008\u000e-\u001f\u007f\u202a-\u202e]+/g, '');
s = s.replace(/[\\/:*?"<>|]/g, function (c) { return DL_MAP[c]; });
s = s.replace(/\s+/g, ' ').trim().replace(/[. ]+$/, '');
if (/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(\..*)?$/i.test(s)) s = '_' + s;
return s;
}
var DL_NAME_MAX = 180;
function dlName(url, tag) {
var floor = String(tag || '楼').replace(/[\\/:*?"<>|+\s—]+/g, '_') || '楼';
var base = dlBase(url), head = dlTid();
var title = dlSafeTitle(dlTitle());
if (!title) return head + '—' + floor + '—' + base;
var name = head + '—' + title + '—' + floor + '—' + base;
if (name.length > DL_NAME_MAX) {
var room = DL_NAME_MAX - (head.length + floor.length + base.length + 4);
var chars = Array.from(title), kept = '';
for (var i = 0; i < chars.length; i++) {
if (kept.length + chars[i].length > room && i >= 6) break;
kept += chars[i];
}
title = kept + '…';
name = head + '—' + title + '—' + floor + '—' + base;
}
return name;
}
function dlRowsOf(doc) {
var out = [];
Array.prototype.forEach.call(doc.querySelectorAll('#main > form > .t5.t2'), function (row) {
var box = row.querySelector('.tpc_content');
if (!box) return;
var tag = locRowTag(row);
Array.prototype.forEach.call(box.querySelectorAll('img'), function (im) {
if (!imgIsReal(im)) return;
var u = fpOf(im.getAttribute('src'));
if (u) out.push({ url: u, tag: tag });
});
});
return out;
}
function dlFloorTag(v) {
var s = String(v || '').replace(/\s+/g, '');
if (!s) return '';
if (/^(楼主|gf)$/i.test(s)) return 'B1F';
var m = /^b?(\d{1,4})f?$/i.exec(s);
if (!m) return '';
return 'B' + m[1] + 'F';
}
function dlPageSize() {
var here = curPage();
if (here <= 1) return 30;
var first = document.querySelector('#main > form > .t5.t2 .tiptop > .fl');
var m = first ? /(\d+)/.exec(first.textContent || '') : null;
if (!m) return 30;
var per = Math.round((Number(m[1]) - 1) / (here - 1));
return (per > 0 && per < 500) ? per : 30;
}
function dlOne(url, name) {
return new Promise(function (resolve, reject) {
if (typeof GM_xmlhttpRequest === 'function') {
GM_xmlhttpRequest({
method: 'GET', url: url, responseType: 'blob', timeout: 60000,
onload: function (r) {
if (!r || r.status < 200 || r.status >= 300 || !r.response) {
reject(new Error('HTTP ' + (r ? r.status : '?'))); return;
}
try {
dlSaveBlob(r.response, name);
resolve({ via: 'xhr', size: r.response.size });
} catch (e) { reject(e); }
},
onerror: function () { reject(new Error('网络错误')); },
ontimeout: function () { reject(new Error('超时')); }
});
return;
}
if (typeof GM_download === 'function') {
try {
GM_download({
url: url, name: name, saveAs: false,
onload: function () { resolve({ via: 'gm' }); },
onerror: function (e) { reject(new Error((e && e.error) || 'GM_download 失败')); }
});
} catch (e) { reject(e); }
return;
}
reject(new Error('没有可用的下载通道'));
});
}
function dlSaveBlob(blob, name) {
var u = URL.createObjectURL(blob);
var a = document.createElement('a');
a.href = u; a.download = name; a.rel = 'noopener'; a.style.display = 'none';
document.body.appendChild(a);
a.click();
setTimeout(function () {
try { URL.revokeObjectURL(u); } catch (e) {}
if (a.parentNode) a.parentNode.removeChild(a);
}, 12000);
}
function dlStart(rows, label) {
if (!rows.length) {
dlState.run = false; say('没有找到可下载的图片', 'bad'); return;
}
var seen = {}, ok = 0, failed = [], i = 0;
say(label + ':' + rows.length + ' 张,开始下载…(首次会问一次「是否允许本站下载多个文件」,允许即可)', 'ok');
(function step() {
if (dlState.stop || i >= rows.length) {
dlState.run = false;
say((dlState.stop ? '已停止(' : '完成(') + label + '):成功 ' + ok + ' / ' + rows.length +
(failed.length ? (';失败 ' + failed.length + ':' + failed.slice(0, 2).join('、')) : ''),
failed.length ? 'bad' : 'ok');
return;
}
var r = rows[i++];
var name = dlName(r.url, r.tag);
if (seen[name]) {
seen[name] += 1;
name = name.replace(/(\.[a-z0-9]{2,5})$/i, '-' + seen[name] + '$1');
} else { seen[name] = 1; }
dlOne(r.url, name).then(function () { ok++; }, function (e) {
failed.push(dlBase(r.url) + '(' + ((e && e.message) || '失败') + ')');
}).then(function () {
say(label + ':' + i + ' / ' + rows.length + ' ' + name, 'ok');
setTimeout(step, 240);
});
})();
}
function dlThread() {
var total = totalPages(), here = curPage(), all = dlRowsOf(document), n = 1, bad = 0;
say('整贴 ' + total + ' 页:正在逐页收图…(已收 ' + all.length + ' 张)', 'ok');
(function step() {
if (dlState.stop) {
dlState.run = false; say('已停止:收到 ' + all.length + ' 张', 'bad'); return;
}
if (n > total) {
if (bad) say('整贴 ' + total + ' 页里有 ' + bad + ' 页没抓到(其余照下)', 'bad');
dlStart(all, '本帖');
return;
}
var page = n++;
if (page === here) { step(); return; }
fetchPage(page, 2).then(function (html) {
var d = new DOMParser().parseFromString(html, 'text/html');
dlRowsOf(d).forEach(function (r) { all.push(r); });
}).catch(function () { bad++; }).then(function () {
say('整贴 ' + total + ' 页:收到第 ' + page + ' 页(共 ' + all.length + ' 张' +
(bad ? ',失败 ' + bad + ' 页' : '') + ')', 'ok');
step();
});
})();
}
function dlFindFloor(tag) {
var num = Number((/(\d+)/.exec(tag) || [])[1] || 0);
var per = dlPageSize(), total = totalPages(), here = curPage();
var guess = num > 0 ? Math.min(total, Math.max(1, Math.ceil(num / per))) : 1;
var pages = [];
if (guess !== here) pages.push(guess);
for (var p = 1; p <= total && pages.length < DL_SCAN_MAX; p++) {
if (p !== here && pages.indexOf(p) < 0) pages.push(p);
}
say('本页没有 ' + tag + ':按每页 ' + per + ' 层估算在第 ' + guess + ' 页,正在抓…', 'ok');
(function step(i) {
if (dlState.stop) { dlState.run = false; say('已停止', 'bad'); return; }
if (i >= pages.length) {
dlState.run = false;
say('没找到 ' + tag + '(本页没有;估算页与顺次补抓的 ' + pages.length + ' 页也没有)', 'bad');
return;
}
var page = pages[i];
fetchPage(page, 2).then(function (html) {
var d = new DOMParser().parseFromString(html, 'text/html');
var hit = dlRowsOf(d).filter(function (r) { return r.tag.toUpperCase() === tag; });
if (hit.length) { dlStart(hit, tag); return true; }
say('第 ' + page + ' 页没有 ' + tag + ',继续…', 'ok');
return false;
}).catch(function () {
say('第 ' + page + ' 页抓取失败,继续…', 'bad');
return false;
}).then(function (done) { if (done !== true) step(i + 1); });
})(0);
}
function onDl(kind) {
if (dlState.run) { dlState.stop = true; say('正在停止…', 'bad'); return; }
say('');
dlState.run = true; dlState.stop = false;
if (kind === 'page') { dlStart(dlRowsOf(document), '本页'); return; }
if (kind === 'thread') { dlThread(); return; }
var inp = panel ? panel.querySelector('.spp-ii__floor') : null;
var tag = dlFloorTag(inp ? inp.value : '');
if (!tag) {
dlState.run = false;
say('楼层号认不出来:填 31 / B31F / 楼主 这样的写法', 'bad');
return;
}
var mine = dlRowsOf(document).filter(function (r) { return r.tag.toUpperCase() === tag; });
if (mine.length) { dlStart(mine, tag); return; }
dlFindFloor(tag);
}
function onCopy(btn) {
const isPage = btn.getAttribute('data-copy') === 'page';
say('');
if (isPage) {
const list = dedupeLinks(linkRows);
if (!list.length) { say('本页没有链接', 'bad'); return; }
copyText(renderCopy(list), function (ok) {
say(ok ? ('已复制 ' + list.filter(function (r) { return r.url; }).length + ' 条链接 · ' +
list.filter(function (r) { return r.code && !r.code.inUrl; }).length + ' 个提取码')
: '复制失败:浏览器拒绝了剪贴板权限', ok ? 'ok' : 'bad');
});
return;
}
const total = totalPages(), here = curPage();
if (total <= 1) {
const seen = pagerSeen();
const list0 = dedupeLinks(linkRows);
if (!list0.length) { say('本页没有链接', 'bad'); return; }
copyText(renderCopy(list0), function (ok) {
const n0 = list0.filter(function (r) { return r.url; }).length;
const c0 = list0.filter(function (r) { return r.code && !r.code.inUrl; }).length;
say(ok ? ('已复制 ' + n0 + ' 条链接 · ' + c0 + ' 个提取码 · ' +
(seen ? ('本贴只有 1 页(分页显示「' + seen + '」)') :
'没读到分页信息(本页没有 .pagesone)') +
' ⇒ 复制本贴 = 复制本页')
: '复制失败:浏览器拒绝了剪贴板权限', ok ? 'ok' : 'bad');
});
return;
}
const missAll = (function () {
for (let n = 1; n <= total; n++) if (n !== here && !idxS.pages[n]) return true;
return false;
})();
if (idxOn() && !missAll) {
const fin0 = dedupeLinks(linkRows);
copyText(renderCopy(fin0), function (ok) {
const n0 = fin0.filter(function (r) { return r.url; }).length;
const c0 = fin0.filter(function (r) { return r.code && !r.code.inUrl; }).length;
say(ok ? ('已复制 ' + n0 + ' 条链接 · ' + c0 + ' 个提取码 · 全贴 ' + total +
' 页(用全贴索引,没再抓一次)')
: '复制失败:浏览器拒绝了剪贴板权限', ok ? 'ok' : 'bad');
});
return;
}
let acc = dedupeLinks(linkRows).map(function (r) {
return { tag: r.tag, links: r.url ? [{ url: r.url, code: r.code }] : [], loose: r.url ? [] : [r.code] };
});
const todo = [];
for (let n = 1; n <= total; n++) if (n !== here) todo.push(n);
let i = 0, fail = 0, failWhy = '';
btn.disabled = true;
say('正在抓取 0/' + todo.length + ' 页…');
(function step() {
if (i >= todo.length) {
btn.disabled = false;
const fin = dedupeLinks(acc);
copyText(renderCopy(fin), function (ok) {
const n = fin.filter(function (r) { return r.url; }).length;
const c = fin.filter(function (r) { return r.code && !r.code.inUrl; }).length;
say((ok ? ('已复制 ' + n + ' 条链接 · ' + c + ' 个提取码') : '复制失败:浏览器拒绝了剪贴板权限') +
(fail ? ('(' + fail + ' 页失败:' + failWhy + ')') : '') + ' · 全贴 ' + total + ' 页',
ok ? (fail ? 'bad' : 'ok') : 'bad');
});
return;
}
const n = todo[i++];
fetchPage(n, 2)
.then(function (html) {
const d0 = new DOMParser().parseFromString(html, 'text/html');
acc = acc.concat(scanDoc(d0));
idxS.pages[n] = scanDocFull(d0, n); idxWrite();
})
.catch(function (e) {
fail++;
if (!failWhy) failWhy = '第 ' + n + ' 页 ' + ((e && e.message) || '抓取失败');
})
.then(function () {
say('正在抓取 ' + i + '/' + todo.length + ' 页…');
step();
});
})();
}
function pickIdx(input, total) {
const raw = String((input && input.value) || '').replace(/[^0-9]/g, '');
const n = raw ? parseInt(raw, 10) : 0;
if (!n || n < 1 || n > total) return 1;
return n;
}
var SPOT_GEN = 0;
var SPOT_USER = 0;
try {
window.addEventListener('wheel', function () { SPOT_USER = SPOT_GEN; }, { passive: true });
window.addEventListener('touchstart', function () { SPOT_USER = SPOT_GEN; }, { passive: true });
} catch (e) {  }
function stickTop() {
var h = 0;
['#header', '#mainNav', '#main-nav', '#nv_forum', '.spp-topbar'].forEach(function (sel) {
var el = document.querySelector(sel);
if (!el || !el.getBoundingClientRect) return;
var cs = getComputedStyle(el);
if (cs.position !== 'fixed' && cs.position !== 'sticky' && cs.position !== '-webkit-sticky') return;
var r = el.getBoundingClientRect();
if (r.bottom > 0 && r.height > 0) h = Math.max(h, Math.round(r.bottom));
});
return Math.max(0, h);
}
/* ==SPOT-TARGET-BEGIN== */
function spotTargetY(g) {
var y0 = Number(g.y0) || 0;                 
var pad = Number(g.pad) || 0;               
var vh = Number(g.vh) || 0;                 
var cTop = Number(g.cTop) || 0;             
var cBottom = Number(g.cBottom) || 0;       
var body = vh - 8;                          
var base = y0 + cTop - pad;                 
var want = base, yMin = null, yMax = null, tall = false;
if (g.eTop !== undefined && g.eTop !== null && Number(g.eHeight) > 0) {
var et = Number(g.eTop) || 0;
var eh = Number(g.eHeight) || 0;
if (eh > vh - pad - 8) {
want = y0 + et - pad;
tall = true;
} else {
yMax = y0 + et - pad;               
yMin = y0 + et + eh - body;         
if (want > yMax) want = yMax;       
else if (want < yMin) want = yMin;  
}
}
var lo = y0 + cTop - pad - 40, hi = y0 + cBottom - pad;
if (want < lo) want = lo;
if (want > hi) want = hi;
if (want < 0) want = 0;
var mx = Number(g.maxY);
if (isFinite(mx) && want > mx) want = mx;
return { want: want, base: base, yMin: yMin, yMax: yMax, tall: tall };
}
/* ==SPOT-TARGET-END== */
function viewMaxY() {
try {
var de = document.documentElement;
var h = Math.max(de.scrollHeight || 0, (document.body && document.body.scrollHeight) || 0);
return Math.max(0, h - window.innerHeight);
} catch (e) { return 0; }
}
function rectOf(el) {
try { return (el && el.getBoundingClientRect) ? el.getBoundingClientRect() : null; }
catch (e) { return null; }
}
function contOf(el) {
try {
if (!el) return null;
if (el.closest) return el.closest('tr.tr1') || el.closest('.t5.t2') || el.closest('.t5 .t2') || el;
return el;
} catch (e) { return el; }
}
function spotTargetOf(ctn, focus) {
var rc = rectOf(ctn) || { top: 0, bottom: 0, height: 0 };
var rf = focus ? rectOf(focus) : null;
return spotTargetY({
y0: window.pageYOffset || document.documentElement.scrollTop || 0,
pad: stickTop() + 8,
vh: window.innerHeight,
maxY: viewMaxY(),
cTop: rc.top, cBottom: rc.bottom,
eTop: rf ? rf.top : null, eHeight: rf ? rf.height : 0
});
}
function sppScrollToY(y) {
SPP_OURS_UNTIL = Date.now() + 200;
window.scrollTo({ top: Math.round(y), behavior: 'instant' });
try {
SPP_WRITE_Y = Math.round(window.pageYOffset || document.documentElement.scrollTop || 0);
} catch (e0) {
SPP_WRITE_Y = Math.round(y);
}
}
function pinTarget(ctn, focus) {
if (!ctn || !ctn.isConnected) return false;
var t = spotTargetOf(ctn, focus);
var y0 = window.pageYOffset || document.documentElement.scrollTop || 0;
if (Math.abs(y0 - t.want) < 2) return false;
sppScrollToY(t.want);
return true;
}
function sppAlignPin(row, focus) {
var t = spotTargetOf(row, focus);
var y0 = window.pageYOffset || document.documentElement.scrollTop || 0;
if (SPP_ALIGN_LASTWANT === null || t.want !== SPP_ALIGN_LASTWANT) {
SPP_ALIGN_LASTWANT = t.want;                  
if (Math.abs(y0 - t.want) >= 2) sppScrollToY(t.want);
return 1;
}
if (Math.abs(y0 - t.want) < SPP_ALIGN_YIELD_EPS) return 0;      
if (SPP_WRITE_Y !== null && Math.abs(y0 - SPP_WRITE_Y) < 2) {
sppScrollToY(t.want);
return 2;
}
sppAlignStop('external');                         
return -1;
}
function sppAlignStop(reason) {
try { if (HASH_LOOP_T) { clearTimeout(HASH_LOOP_T); HASH_LOOP_T = 0; } } catch (e0) { }
HASH_LOOP_ON = false;
HASH_ALIGN_UNTIL = 0;
SPP_ALIGN_GEN++;                                  
SPP_ALIGN_GET = null;
SPP_ALIGN_FOCUS = null;
SPP_ALIGN_LASTWANT = null;
if (reason === 'external') {
SPP_EXT_SEQ++;                                
SPP_TAKEOVER_UNTIL = Date.now() + SPP_TAKEOVER_QUIET;   
try { SPOT_USER = SPOT_GEN; } catch (e1) { }   
}
HASH_YIELD = (reason === 'external');
}
function spotOk(focus) {
if (!focus || !focus.isConnected) return false;
var pad = stickTop() + 8, vh = window.innerHeight;
var rf = rectOf(focus);
if (!rf || rf.height <= 0) return false;
if (rf.height > vh - pad - 8) return (rf.top >= pad - 2 && rf.top <= pad + 40);
return (rf.top >= pad - 2 && rf.bottom <= vh - 8 + 2);
}
function spotScroll(tgt, blk, focus) {
var f = (blk === 'nearest') ? tgt : (focus || null);
var ctn = contOf(tgt) || tgt;
var t = spotTargetOf(ctn, (f && f !== ctn) ? f : null);
var y0 = window.pageYOffset || document.documentElement.scrollTop || 0;
if (Math.abs(y0 - t.want) < 2) return false;   
sppScrollToY(t.want);                          
return true;
}
function ensureRowHeadVisible(row, focus) {
try {
if (!row || !row.isConnected) return;
var pad = stickTop() + 8;
var r = row.getBoundingClientRect();
var vh = window.innerHeight;
if (!focus && r.top >= pad - 2 && r.top <= pad + 40) return;   
if (focus || r.bottom < 40 || r.top > vh - 40) pinTarget(row, focus || null);
} catch (e) { }
}
function spotTo(el, block, focus) {
var tgt = (el && el.isConnected) ? el : null;
if (!tgt) return null;
try { sppAlignStop('new'); } catch (eStop) { }
SPP_JUMP_SEQ++;                                
var my = ++SPOT_GEN;
var alive = function () { return my === SPOT_GEN && SPOT_USER !== my && tgt.isConnected; };
var off = function () {
var b = tgt.getBoundingClientRect();
return b.bottom < 40 || b.top > window.innerHeight - 40;
};
var y0 = window.pageYOffset || document.documentElement.scrollTop || 0;
var moved = spotScroll(tgt, block, focus);
setTimeout(function () {
if (!alive()) return;
var y1 = window.pageYOffset || document.documentElement.scrollTop || 0;
if (moved && Math.abs(y1 - y0) < 2) {
SPP_OURS_UNTIL = Date.now() + 250;     
tgt.scrollIntoView({ block: block, behavior: 'auto' });
}
}, 280);
setTimeout(function () {
if (!alive() || !off()) return;
spotScroll(tgt, block, focus);      
}, 600);
setTimeout(function () {
if (!alive() || !off()) return;
spotScroll(tgt, block, focus);      
}, 1200);
setTimeout(function () {
if (!alive() || !off()) return;
spotScroll(tgt, block, focus);      
}, 2400);
var left = 10;
(function settle() {
if (!alive() || left <= 0) return;
left--;
var was = off();
spotScroll(tgt, block, focus);      
if (was) hit(tgt);
setTimeout(settle, 400);
})();
return tgt;
}
function stableFocus(get) {
var cur = null;
return function (row) {
try {
if (cur && cur.isConnected) return cur;
cur = (typeof get === 'function') ? get(row) : null;
return cur;
} catch (e) { return null; }
};
}
function imgFocusOf(d, k) {
return function (row) {
try {
if (!row || !(k >= 1)) return null;
var box = row.querySelector ? row.querySelector('.tpc_content') : null;
var fresh = box ? imagesIn(box) : [];
return fresh[k - 1] || ((d.imgs && d.imgs[k - 1] && d.imgs[k - 1].el) || null);
} catch (e) { return null; }
};
}
function linkFocusOf(d, k) {
return function (row) {
try {
if (!row || !(k >= 1)) return null;
var box0 = row.querySelector ? row.querySelector('.tpc_content') : null;
var fresh = box0 ? locList(scanLinks(box0).links) : [];
var it = fresh[k - 1] || locList(d.links)[k - 1] || null;
if (!it) return null;
if (it.net) return netSpot(row, it.url) || ((it.el && it.el.isConnected) ? it.el : null);
var el = (it.el && it.el.isConnected) ? it.el : null;
if (!el && box0) {
var h = 0, j;
for (j = 0; j < k && j < fresh.length; j++) if (!fresh[j].net) h++;
el = h >= 1 ? (anchorsIn(box0)[h - 1] || null) : null;
}
return el;
} catch (e) { return null; }
};
}
function rowNowOf(d) {
try {
if (d.row && d.row.isConnected) return d.row;
return jumpRowOf({ pid: d.pid || '', tag: d.tag || '' });     
} catch (e) { return null; }
}
var VERIFY_EARLY = 600, VERIFY_LATE = 3200;
function verifyLanding(d, kind, k, focusGet) {
if (!(k >= 1) || typeof focusGet !== 'function') return;
var unit = (kind === 'link') ? '条' : '张';
var msg = '已定位到 ' + d.tag + ' · 第 ' + k + ' ' + unit + ' 未能进入视口(可再点一次或手动滚动)';
var myJump = SPP_JUMP_SEQ, myExt = SPP_EXT_SEQ;
var stale = function () { return SPP_JUMP_SEQ !== myJump || SPP_EXT_SEQ !== myExt; };
var meet = function () {
var row = rowNowOf(d);
var el = row ? focusGet(row) : null;
return (row && el && spotOk(el)) ? row : null;
};
setTimeout(function () {
if (stale()) return;                           
if (!meet()) {
var row0 = rowNowOf(d);
if (row0) { try { pinTarget(row0, focusGet(row0)); } catch (e0) { } }   
}
setTimeout(function () {
if (stale()) return;
if (meet()) return;                        
try { say(msg, 'bad'); } catch (e1) { }    
}, VERIFY_LATE - VERIFY_EARLY);
}, VERIFY_EARLY);
}
function go(d, k) {
if (!d.row || !d.row.isConnected) {
try { say('目标楼层不在当前文档里:' + d.tag + ',改走跨页定位…', 'bad'); } catch (eS) { }
jumpTo(d, 'img', k);
try { setTimeout(function () { say('目标楼层不在当前文档里:' + d.tag + '(已按跨页定位处理)', 'bad'); }, 0); } catch (eS2) { }
return;
}
var focusGet = stableFocus(imgFocusOf(d, k));
var el = focusGet(d.row);
if (el) {
hit(el);
spotTo(d.row, 'start', el);                    
setTimeout(function () { try { window.__sppAlignRow && window.__sppAlignRow(d.row, 24000, focusGet); } catch (e) { } }, 500);
setTimeout(function () { ensureRowHeadVisible(d.row, focusGet(d.row)); }, 460);
verifyLanding(d, 'img', k, focusGet);
} else d.row.scrollIntoView({ block: 'start', behavior: 'smooth' });
mark(d);
}
function goLink(d, k) {
if (!d.row || !d.row.isConnected) {
try { say('目标楼层不在当前文档里:' + d.tag + ',改走跨页定位…', 'bad'); } catch (eS) { }
jumpTo(d, 'link', k);
try { setTimeout(function () { say('目标楼层不在当前文档里:' + d.tag + '(已按跨页定位处理)', 'bad'); }, 0); } catch (eS2) { }
return;
}
var focusGet = stableFocus(linkFocusOf(d, k));
var el = focusGet(d.row);                          
if (el) {
hit(el);
spotTo(d.row, 'start', el);                    
setTimeout(function () { try { window.__sppAlignRow && window.__sppAlignRow(d.row, 24000, focusGet); } catch (e) { } }, 500);
setTimeout(function () { ensureRowHeadVisible(d.row, focusGet(d.row)); }, 460);
verifyLanding(d, 'link', k, focusGet);
} else d.row.scrollIntoView({ block: 'start', behavior: 'smooth' });
linkMark(d);
}
function mark(d) {
rows.forEach(function (x) { if (x.el) x.el.classList.toggle('is-on', x === d); });
}
var TID = (location.href.match(/tid[-=](\d+)/i) || [])[1] || '';
var IDX_KEY = 'spp_idx_' + TID;   
var JUMP_KEY = 'spp_jump';        
var idxS = { on: false, run: false, stop: false, pages: {}, fail: {}, done: 0, total: 0 };
var headSeq = {}, totalCache = 1;
var pgS = { img: 1, link: 1 }, pgTop = '';
function perPage() { return SPP_CONFIG.num('spp_idx_per', 15, 5, 60); }
const KLAST = {};
var kSpot = '';
function numTyped(num) {
if (!num) return '';
var v = String(num.value || '').replace(/[^0-9]/g, '');
if (num.__sppAuto == null) return v;
return (v === String(num.__sppAuto)) ? '' : v;
}
function fillNum(num, k) {
if (!num) return num;
num.value = String(k);
num.__sppAuto = String(k);
return num;
}
function iiCount(d, pane) {
if (pane === 'img') return (d.imgs || []).length;
return locList(d.links).length;
}
function stepItem(pane, dir) {
pane = (pane === 'link') ? 'link' : 'img';
const list = (pane === 'link') ? linkRows : rows;
const what = (pane === 'link') ? '链接' : '图片';
const unit = (pane === 'link') ? '条' : '张';
if (!list || !list.length) { say('这一栏还没有可定位的楼层', 'bad'); return; }
const here = String(curPage());
const live = function (x) {
if (!x.row || iiCount(x, pane) <= 0) return false;
if (String(x.page) === here) return true;
try {
const ps2 = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.pages) || [];
return ps2.indexOf(Number(x.page)) >= 0;
} catch (e) { return false; }
};
let d = null;
const kcur = String(kSpot || '');
if (kcur.slice(-(pane.length + 1)) === '#' + pane) {
const seg = kcur.split('#');
const want = seg[0] + '#' + seg[1];
for (let i = 0; i < list.length; i++) {
if ((list[i].page + '#' + list[i].tag) === want) { d = list[i]; break; }
}
}
if (!d || !live(d)) d = edgeRow(list, live, dir);
if (!d) { say('这一页没有可定位的' + what, 'bad'); return; }
const total = iiCount(d, pane);
const key = d.page + '#' + d.tag + '#' + pane;
const had = !!KLAST[key];
let k;
if (!had) k = (dir < 0) ? total : 1;
else {
k = KLAST[key] + (dir < 0 ? -1 : 1);
if (k > total || k < 1) {
const nx = nextRow(list, live, d, dir);
if (nx) { d = nx; k = (dir < 0) ? iiCount(nx, pane) : 1; }
else {
k = (dir < 0) ? total : 1;
try {
const tp = totalPages(), cp = curPage();
if (dir > 0 && tp > cp) say('这里到底了(当前第 ' + cp + ' 页 · 全贴共 ' + tp + ' 页)· 翻页后从第 1 格继续', 'ok');
else if (total <= 1) say('本页可定位的' + what + '就这一' + unit + '了', 'bad');
} catch (e) {}
}
}
}
const kk = d.page + '#' + d.tag + '#' + pane;
KLAST[kk] = k; kSpot = kk;
let num = d.__numEl;
if (!num && d.el && d.el.querySelector) num = d.el.querySelector('.spp-ii__num');
if (num) fillNum(num, k);
if (pane === 'link') goLink(d, k); else go(d, k);
}
function edgeRow(list, live, dir) {
if (dir < 0) { for (let i = list.length - 1; i >= 0; i--) if (live(list[i])) return list[i]; }
else { for (let i = 0; i < list.length; i++) if (live(list[i])) return list[i]; }
return null;
}
function nextRow(list, live, d, dir) {
const at = list.indexOf(d);
if (dir > 0) {
for (let i = at + 1; i < list.length; i++) if (live(list[i])) return list[i];
for (let i = 0; i < at; i++) if (live(list[i])) return list[i];
} else {
for (let i = at - 1; i >= 0; i--) if (live(list[i])) return list[i];
for (let i = list.length - 1; i > at; i--) if (live(list[i])) return list[i];
}
return null;
}
function stepIdx(num, d, pane, total, exact) {
const typed = numTyped(num);
const key = d.page + '#' + d.tag + '#' + pane;
let k;
if (typed || exact) k = pickIdx(num, total);
else if (kSpot !== key) k = (KLAST[key] || 1);
else { k = (KLAST[key] || 0) + 1; if (k > total) k = 1; }
if (!(k >= 1)) k = 1;
if (total && k > total) k = total;
KLAST[key] = k;
kSpot = key;
return k;
}
var NET_CYCLE = '';
function locateNet(d, kind) {
var list = locList(d.links), i, idxs = [];
for (i = 0; i < list.length; i++) if (list[i].net === kind) idxs.push(i + 1);
if (!idxs.length) return 0;
var key = d.page + '#' + d.tag + '#link';
var nk = key + '#' + kind;
var at = (NET_CYCLE === nk) ? (KLAST[nk] || 0) : 0;
var k = idxs[at % idxs.length];
KLAST[nk] = (at % idxs.length) + 1;
NET_CYCLE = nk;
KLAST[key] = k;
kSpot = key;
var num = (d.el && d.el.querySelector) ? d.el.querySelector('.spp-ii__num') : null;
if (num) fillNum(num, k);
goLink(d, k);
return k;
}
function pgSpan(n, per, cur) {
var tp = Math.max(1, Math.ceil(n / per));
var c = Math.min(Math.max(1, cur), tp);
return { tp: tp, cur: c, from: (c - 1) * per, to: c * per };
}
function idxOn() { return !!idxS.on; }
function idxRev() {
return (idxOn() ? 'A' : 'P') + Object.keys(idxS.pages).length + '/' + Object.keys(idxS.fail).length;
}
function fpOf(u) {
if (!u) return '';
try {
var x = new URL(u, location.href);
return x.origin + x.pathname + x.search + x.hash;
} catch (e) { return String(u); }
}
function rowPid(row) {
var a = row.querySelector('.tiptop a[onclick*="copyUrl"]');
var m = a && /copyUrl\(\s*'([^']+)'/.exec(a.getAttribute('onclick') || '');
if (m) return m[1];
var el = row.querySelector('.tpc_content [id^="read_"], .tpc_content [id^="p_"]');
if (el) return (el.id || '').replace(/^(read_|p_)/, '');
return '';
}
function scanDocFull(doc, pageNo) {
var out = [];
Array.prototype.forEach.call(doc.querySelectorAll('#main > form > .t5.t2'), function (row) {
var box = row.querySelector('.tpc_content');
if (!box) return;
var tag = locRowTag(row);
var imgs = [], links = [];
Array.prototype.forEach.call(box.querySelectorAll('img'), function (im) {
if (!imgIsReal(im)) return;
imgs.push({ el: null, fp: fpOf(im.getAttribute('src')) });
});
var lk = scanLinks(box);
locList(lk.links).forEach(function (l) {
links.push({ url: l.url, el: null, fp: l.fp || fpOf(l.url), net: l.net, code: l.code });
});
if (imgs.length || links.length) {
out.push({ tag: tag, pid: rowPid(row), page: pageNo, imgs: imgs, links: links });
}
});
return out;
}
function idxRead() {
try {
var raw = sessionStorage.getItem(IDX_KEY);
if (!raw) return;
var o = JSON.parse(raw);
if (!o || o.ver !== window.__SPP_VERSION || !o.pages) return;
idxS.pages = o.pages; idxS.fail = o.fail || {}; idxS.on = !!o.on;
} catch (e) {}
}
function idxWrite() {
try {
sessionStorage.setItem(IDX_KEY, JSON.stringify({
ver: window.__SPP_VERSION, at: Date.now(), on: idxS.on,
pages: idxS.pages, fail: idxS.fail
}));
} catch (e) {}
}
function idxPaint() {
if (!panel) return;
var tot = idxS.total || totalCache;
Array.prototype.forEach.call(panel.querySelectorAll('.spp-ii__btn[data-scope]'), function (b) {
b.classList.toggle('is-on', idxOn());
if (idxS.run) b.textContent = '停止 ' + idxS.done + '/' + tot;
else if (idxOn()) {
var have = Object.keys(idxS.pages).length;
var f = Object.keys(idxS.fail).length;
b.textContent = (have >= tot ? '全贴 ' + tot + ' 页' : '全贴 ' + have + '/' + tot + ' 页') +
(f ? (' · ' + f + ' 失败') : '') + ' · 收回';
b.ariaLabel = have >= tot
? '索引已覆盖全贴 ' + tot + ' 页;点一下收回本页视图(索引留着)'
: ('已索引 ' + have + '/' + tot + ' 页' + (f ? (',另有 ' + f + ' 页抓取失败') : '') +
'。想接着抓:先收回本页,再点一次「全贴索引」(只补没抓的页)');
} else b.textContent = '全贴索引';
});
}
function idxStart() {
var total = totalPages(), here = curPage();
var todo = [];
for (var n = 1; n <= total; n++) if (n !== here && !idxS.pages[n]) todo.push(n);
idxS.on = true; idxS.total = total; idxS.done = total - todo.length;
idxWrite(); build(); idxPaint();
if (!todo.length) {
say('全贴 ' + total + ' 页都已在索引里(缓存 ' + Object.keys(idxS.pages).length + ' 页)', 'ok');
return;
}
if (total <= 1) { say('本贴只有 1 页,没有可索引的其它页', 'bad'); return; }
idxS.run = true; idxS.stop = false;
iiStabilize(true);
idxPaint();
say('正在逐页抓取…(再点一次「停止」可中断)', 'ok');
var i = 0;
(function step() {
if (idxS.stop || i >= todo.length) {
idxS.run = false; idxPaint(); build();
iiStabilize(false);
say(idxS.stop ? ('已停止:抓到 ' + i + '/' + todo.length + ' 页')
: ('全贴索引完成:' + total + ' 页'),
idxS.stop ? 'bad' : 'ok');
return;
}
var n = todo[i++];
fetchPage(n, 2).then(function (html) {
idxS.pages[n] = scanDocFull(new DOMParser().parseFromString(html, 'text/html'), n);
delete idxS.fail[n];
}).catch(function (e) {
idxS.fail[n] = (e && e.message) || '抓取失败';
}).then(function () {
idxS.done = Math.min(total, idxS.done + 1);
idxWrite(); idxPaint(); build();
say('已索引 ' + idxS.done + '/' + total + ' 页…', 'ok');
step();
});
})();
}
var sppIiScrollMemo = 0;
function iiStabilize(on) {
if (!panel) return;
panel.classList[on ? 'add' : 'remove']('spp-ii--pinned');
if (on) {
if (!panel.style.getPropertyValue('--spp-ii-anchor')) {
var h = panel.getBoundingClientRect().height || 0;
if (h > 0) panel.style.setProperty('--spp-ii-anchor', Math.round(h / 2) + 'px');
}
if (!panel.style.getPropertyValue('--spp-ii-ww-lock')) {
var ww = parseFloat(getComputedStyle(panel).getPropertyValue('--spp-ii-ww'));
if (!(ww > 0)) ww = panel.getBoundingClientRect().width || 174;
panel.style.setProperty('--spp-ii-ww-lock', Math.round(ww) + 'px');
}
} else {
panel.style.removeProperty('--spp-ii-anchor');
panel.style.removeProperty('--spp-ii-ww-lock');
if (typeof fitWidth === 'function') fitWidth();
}
}
function onScope() {
if (idxS.run) { idxS.stop = true; idxPaint(); return; }
if (idxOn()) {
idxS.on = false; idxWrite(); build();
say('已收回本页', 'ok');
return;
}
idxStart();
}
function idxAuto() {
if (!SPP_CONFIG.bool('spp_idx_auto', false)) return;
if (idxS.on || idxS.run) return;
idxStart();
}
function kindIdx(d, kind, k) {
var i, n = 0, L = locList(d.links);
if (kind !== 'link' || !(k >= 1)) return k || 0;
for (i = 0; i < k && i < L.length; i++) if (!L[i].net) n++;
return n;
}
function jumpTo(d, kind, k) {
var it = k >= 1 ? (kind === 'img' ? d.imgs[k - 1] : (locList(d.links)[k - 1] || null)) : null;
var url0 = pageUrl(d.page) + (d.pid ? ('#read_' + d.pid) : '');
var sameNow = false;
try { sameNow = (String(d.page) === String(curPage())) || (url0 === location.href); } catch (e) { }
if (sameNow) {
var rowX = null;
try {
if (d.pid) {
var aX = document.getElementById('read_' + d.pid);
if (aX && aX.closest) rowX = aX.closest('tr.tr1') || aX.closest('.t5.t2') || null;
}
} catch (e0) { }
if (!rowX && d.row && d.row.isConnected) rowX = d.row;
if (rowX) {
var focusGet = stableFocus((kind === 'link') ? linkFocusOf(d, k) : imgFocusOf(d, k));
var elX = focusGet(rowX);
try { say('已定位到第 ' + d.page + ' 页 ' + d.tag, 'ok'); } catch (e1) { }
try { if (kind === 'link' && typeof linkMark === 'function') linkMark(d); else if (typeof mark === 'function') mark(d); } catch (e2) { }
try { spotTo(rowX, 'start', elX); } catch (e3) { }
try { window.__sppAlignRow(rowX, 24000, focusGet); } catch (e4) { }   
try { setTimeout(function () { try { ensureRowHeadVisible(rowX, focusGet(rowX)); } catch (e6) { } }, 460); } catch (e7) { }
try { verifyLanding({ row: rowX, pid: d.pid, tag: d.tag }, kind, k, focusGet); } catch (e8) { }
return;         
}
}
try {
sessionStorage.setItem(JUMP_KEY, JSON.stringify({
tid: TID, tag: d.tag, pid: d.pid || '', kind: kind, k: k || 0,
kh: kindIdx(d, kind, k),
fp: it ? (it.fp || '') : '', ts: Date.now()
}));
} catch (e) {}
say('正在跳到第 ' + d.page + ' 页 ' + d.tag + '…', 'ok');
location.href = pageUrl(d.page) + (d.pid ? ('#read_' + d.pid) : '');
}
function hitVisual(el) {
return picA(el) ? el.children[0] : el;
}
var HIT_CUR = null;
function hitDropNode(n, soft) {
if (!n) return;
if (n.__sppHitT) { clearTimeout(n.__sppHitT); n.__sppHitT = null; }
if (n.__sppDrop && !soft) {
if (n.__sppDropT) { clearTimeout(n.__sppDropT); n.__sppDropT = null; }
try { n.__sppDrop(); } catch (e) {}
return;
}
if (n.classList) n.classList.remove('spp-ii-hit');
}
function hitClear(keep) {
var i, s, n = HIT_CUR;
HIT_CUR = null;
if (n && n !== keep) hitDropNode(n, !!(keep && n.contains && n.contains(keep)));
var stray = document.querySelectorAll('.spp-ii-hit');
for (i = 0; i < stray.length; i++) {
s = stray[i];
if (s === n || s === keep) continue;
hitDropNode(s, !!(keep && s.contains && s.contains(keep)));
}
}
function hit(el) {
const t = hitVisual(el);
if (!t || !t.classList) return;
if (t !== HIT_CUR) {
hitClear(t);
t.classList.add('spp-ii-hit');
HIT_CUR = t;
}
if (t.__sppHitT) clearTimeout(t.__sppHitT);
t.__sppHitT = setTimeout(function () {
if (HIT_CUR === t) HIT_CUR = null;
t.classList.remove('spp-ii-hit');
t.__sppHitT = null;
}, 2600);
if (t.__sppDrop) {
if (t.__sppDropT) clearTimeout(t.__sppDropT);
t.__sppDropT = setTimeout(t.__sppDrop, 2600);
}
}
function netSpot(row, url) {
const box = row && row.querySelector('.tpc_content');
if (!box || !url) return null;
const F = flatScan(box);
const at = F.flat.indexOf(url);
if (at < 0) return null;
let s = at, e = at + url.length;
while (s < e && !F.nodeOf[s]) s++;
while (e > s && !F.nodeOf[e - 1]) e--;
if (e <= s) return null;
for (let up = F.nodeOf[s]; up && up !== box; up = up.parentElement) {
if (up.__sppDrop && String(up.textContent || '') === url) return up;
}
const r = document.createRange();
try { r.setStart(F.nodeOf[s], F.offOf[s]); r.setEnd(F.nodeOf[e - 1], F.offOf[e - 1] + 1); }
catch (err0) { return null; }
const sp = document.createElement('span');
sp.className = 'spp-ii-hit';
try { sp.appendChild(r.extractContents()); r.insertNode(sp); }
catch (err1) { return null; }
const drop = function () {
const p = sp.parentNode;
if (!p) return;
if (sp.querySelector && sp.querySelector('.spp-ii-hit')) { setTimeout(drop, 1200); return; }
while (sp.firstChild) p.insertBefore(sp.firstChild, sp);
p.removeChild(sp);
};
sp.__sppDrop = drop;
sp.__sppDropT = setTimeout(drop, 2600);
return sp;
}
function linkish(a) { return !/^(javascript:|#)/i.test(a.getAttribute('href') || ''); }
function anchorsIn(box) {
return [].slice.call(box.querySelectorAll('a[href]')).filter(function (a) {
if (!linkish(a)) return false;
if (a.closest && a.closest('h6.quote')) return false;
if (picA(a)) return false;
return true;
});
}
function imagesIn(box) { return [].slice.call(box.querySelectorAll('img')).filter(imgIsReal); }
var JUMP_P = null, JUMP_TRIES = 0;
try { window.__sppJumpConsume = function () { try { consumeJump(); } catch (e) { } }; } catch (e) { }
function jumpRowOf(p) {
var row = null;
Array.prototype.forEach.call(document.querySelectorAll('#main > form > .t5.t2'), function (r) {
if (row) return;
if (p.no && r.getAttribute('data-spp-nest-no') === String(p.no)) { row = r; return; }   
if (p.pid && rowPid(r) === p.pid) { row = r; return; }
if (p.tag && locRowTag(r) === p.tag) row = r;
});
return row;
}
function expandRowForJump(row) {
var n = row, up = 0;
while (n && n !== document.body && up++ < 14) {
if (n.classList && n.classList.contains('spp-nest-hid')) {
var bt = n.querySelector('.spp-nest-toggle, [data-spp-nest-toggle], .spp-nest-fold, .spp-nest-gutter a, .spp-nest-gutter span');
if (bt) { try { bt.click(); } catch (e) {} }
}
n = n.parentElement;
}
var box = row.querySelector('.tpc_content');
if (box && getComputedStyle(box).display === 'none') {
var ex = row.querySelector('a[onclick*="expandpuremark"]');
if (ex) { try { ex.click(); } catch (e) {} }
}
}
function consumeJump() {
var fresh = null;
try { fresh = JSON.parse(sessionStorage.getItem(JUMP_KEY) || 'null'); } catch (e) {}
var p = fresh || JUMP_P;
if (!p) return;
if (fresh) { try { sessionStorage.removeItem(JUMP_KEY); } catch (e) {} JUMP_P = fresh; JUMP_TRIES = 0; }
if (p.tid !== TID) return;
if ((Date.now() - p.ts) > 60000) return;
(function step() {
var row = jumpRowOf(p);
if (row && row.isConnected) {
expandRowForJump(row);
setTimeout(function () {
var row2 = (row.isConnected) ? row : jumpRowOf(p);
if (!row2) { JUMP_TRIES++; if (JUMP_TRIES <= 40) { setTimeout(step, 200); } return; }
landOn(row2, row2.querySelector('.tpc_content'), p);
JUMP_P = null;
}, 90);
return;
}
if (JUMP_TRIES++ > 40) { JUMP_P = null; return; }   
setTimeout(step, 200);
})();
}
function landFocusOf(p) {
return function (row) {
try {
if (!row) return null;
var box = row.querySelector('.tpc_content');
var el = null;
if (p.net && box) el = netSpot(row, p.fp);
if (!el && !p.net && p.fp && box) {
var pick = (p.kind === 'img') ? imagesIn(box) : anchorsIn(box);
Array.prototype.forEach.call(pick, function (x) {
if (el) return;
var raw = (p.kind === 'img') ? x.getAttribute('src') : (x.getAttribute('href') || '');
if (fpOf(raw) === p.fp) el = x;
});
}
var kk = (p.kh >= 1) ? p.kh : p.k;
if (!el && !p.net && box && kk >= 1) {
var list = (p.kind === 'img') ? imagesIn(box) : anchorsIn(box);
el = list[kk - 1] || null;
}
return el;
} catch (e) { return null; }
};
}
function landOn(row, box, p) {
var focusGet = stableFocus(landFocusOf(p));
var el = focusGet(row);                            
hit(el || row);
spotTo(row, 'start', el);
setTimeout(function () { ensureRowHeadVisible(row, focusGet(row)); }, 460);   
try { window.__sppAlignRow(row, 24000, focusGet); } catch (e) { }   
try { verifyLanding({ row: row, pid: p.pid, tag: p.tag }, p.kind, (p.kh >= 1) ? p.kh : p.k, focusGet); } catch (e7) { }
try { history.replaceState(null, '', location.pathname + location.search); } catch (e) {}
}
function headRow(d, host) {
if (!idxOn() || totalCache <= 1) return;
var nm = host.getAttribute('data-rows') || 'img';
if (headSeq[nm] === d.page) return;
headSeq[nm] = d.page;
var h = document.createElement('div');
h.className = 'spp-ii__pg';
h.textContent = '第 ' + d.page + ' 页' + (d.row
? ((d.page === curPage()) ? ' · 本页' : ' · 已合并')
: (idxS.pages[d.page] ? ' · 已索引' : (idxS.fail[d.page] ? ' · 抓取失败' : ' · 未索引')));
host.appendChild(h);
}
function bindObserver() {
if (!window.IntersectionObserver || !rows.length) return;
const io = new IntersectionObserver(function (es) {
es.forEach(function (e) {
if (!e.isIntersecting) return;
const hit = rows.filter(function (x) { return x.row === e.target; })[0];
if (hit) mark(hit);
});
}, { threshold: 0.05, rootMargin: '-20% 0px -60% 0px' });
rows.forEach(function (x) { if (x.row) io.observe(x.row); });
}
try {
document.addEventListener('click', function (ev) {
try {
const a = ev.target && ev.target.closest ? ev.target.closest('a[href*="#read_"]') : null;
if (!a) return;
const m = /#read_(\d+)/.exec(a.getAttribute('href') || '');
if (!m) return;
const base = String(a.href || '').split('#')[0];
if (base !== String(location.href).split('#')[0]) return;   
const pid = m[1];
const fix = function () {
try {
const el = document.getElementById('read_' + pid);
const row = el ? (el.closest('tr.tr1') || el) : null;
if (row && typeof window.__sppAlignRow === 'function') window.__sppAlignRow(row, 8000);
} catch (e) { }
};
setTimeout(fix, 40); setTimeout(fix, 300); setTimeout(fix, 800);
} catch (e) { }
}, true);
} catch (e) { }
/* ==ALIGN-STATE-BEGIN== */
var HASH_ALIGN_UNTIL = 0, HASH_LOOP_ON = false, HASH_LOOP_T = 0;
var SPP_ALIGN_GET = null;   
var SPP_ALIGN_FOCUS = null; var SPP_ALIGN_LASTWANT = null;  
var SPP_WRITE_Y = null;         
var SPP_OURS_UNTIL = 0;         
var SPP_JUMP_SEQ = 0;           
var SPP_EXT_SEQ = 0;            
var SPP_ALIGN_YIELD_EPS = 48;   
var HASH_YIELD = false;         var SPP_TAKEOVER_UNTIL = 0;     var SPP_TAKEOVER_QUIET = 1600;  
var IDX_FOLD_OPEN = false;  
var SPP_ALIGN_GEN = 0, SPP_ALIGN_MY = 0;   
var HASH_STARTED_AT = 0;   /* ==ALIGN-STATE-END== */
try {
['wheel', 'touchstart', 'keydown', 'mousedown'].forEach(function (ev) {
window.addEventListener(ev, function () {
try {
if (Date.now() - HASH_STARTED_AT > 900) HASH_ALIGN_UNTIL = 0;
HASH_YIELD = false;                   
} catch (e) { }
}, { passive: true });
});
} catch (e) { }
try {
window.addEventListener('scroll', function () {
try {
if (Date.now() <= SPP_OURS_UNTIL) return;                     
var aligning = !!(SPP_ALIGN_GET && SPP_ALIGN_MY === SPP_ALIGN_GEN);
if (!aligning && SPOT_USER === SPOT_GEN) return;              
if (aligning) sppAlignStop('external');
SPOT_USER = SPOT_GEN;                                        
SPP_EXT_SEQ++;
} catch (eS) { }
}, { passive: true });
} catch (e) { }
try {
window.addEventListener('pagehide', function () { try { sppAlignStop('pagehide'); } catch (eP) { } });
} catch (e) { }
onDomReady(function () {
idxRead();
consumeJump();
/* ==ALIGN-BEGIN== */
window.__sppHashAlignTick = function () {
try {
if (Date.now() > HASH_ALIGN_UNTIL) return;
var alignRowNow = null;
try { if (SPP_ALIGN_GET && SPP_ALIGN_MY === SPP_ALIGN_GEN) alignRowNow = SPP_ALIGN_GET(); } catch (eAN) { }
var mH = (location.hash || '').match(/^#read_(\d+)/);
if (mH) {
var rowH = null;
try {
var elA = document.getElementById('read_' + mH[1]);
if (elA && elA.closest) rowH = elA.closest('tr.tr1') || elA.closest('.t5.t2') || null;
} catch (e0) { }
if (!rowH) {
Array.prototype.forEach.call(document.querySelectorAll('#main > form > .t5.t2'), function (r) {
if (rowH) return;
try { if (String(rowPid(r)) === String(mH[1])) rowH = r; } catch (e1) { }
});
}
if (rowH && rowH.isConnected) {
var fH = null;
try { if (SPP_ALIGN_FOCUS && rowH === alignRowNow) fH = SPP_ALIGN_FOCUS(rowH); } catch (eFH) { }
if (!HASH_YIELD && (!alignRowNow || alignRowNow === rowH)) pinTarget(rowH, fH);
}
}   
try {
if (SPP_ALIGN_GET && SPP_ALIGN_MY === SPP_ALIGN_GEN) {   
var rw = alignRowNow;
if (rw && rw.isConnected) {
var fw = null;
try { if (SPP_ALIGN_FOCUS) fw = SPP_ALIGN_FOCUS(rw); } catch (eF) { }
sppAlignPin(rw, fw);
}
}
} catch (eR) { }
} catch (e3) { }
};
window.__sppAlignRow = function (rowEl, ms, focusGet) {
try {
if (!rowEl) return false;
if (Date.now() < SPP_TAKEOVER_UNTIL) return false;
try { sppAlignStop('new'); } catch (eOld) { }
var no0 = rowEl.getAttribute ? rowEl.getAttribute('data-spp-nest-no') : null;
var pid0 = null;
try { pid0 = rowPid(rowEl); } catch (e0) { }
SPP_ALIGN_FOCUS = (typeof focusGet === 'function') ? focusGet : null;
SPP_ALIGN_GET = function () {
try {
if (pid0) {
var aEl = document.getElementById('read_' + pid0);
if (aEl && aEl.closest) { var rr0 = aEl.closest('tr.tr1') || aEl.closest('.t5.t2'); if (rr0) return rr0; }
}
if (no0 !== null && no0 !== undefined && no0 !== '') {
var hit = null;
Array.prototype.forEach.call(document.querySelectorAll('#main > form > .t5.t2'), function (r) {
if (hit) return;
if (String(r.getAttribute('data-spp-nest-no')) === String(no0)) hit = r;
});
if (hit) return hit;
}
if (rowEl && rowEl.isConnected) return rowEl;
} catch (e1) { }
return null;
};
SPP_ALIGN_GEN++;                            
SPP_ALIGN_MY = SPP_ALIGN_GEN;
HASH_STARTED_AT = Date.now();              
HASH_ALIGN_UNTIL = HASH_STARTED_AT + (ms || 24000);
window.__sppHashAlignLoop();
try {
var boxA = (rowEl.closest && rowEl.closest('tr.tr1')) || rowEl;
var imgsA = Array.prototype.slice.call(boxA.querySelectorAll('img')).slice(0, 80);
imgsA.forEach(function (imX) {
if (imX.complete) return;
var onL = function () {
try {
if (SPP_ALIGN_MY !== SPP_ALIGN_GEN) return;      
HASH_ALIGN_UNTIL = Date.now() + 1500;
window.__sppHashAlignLoop();
} catch (eL) { }
};
imX.addEventListener('load', onL, { once: true });
imX.addEventListener('error', onL, { once: true });
});
} catch (eI) { }
return true;
} catch (e) { return false; }
};
window.__sppHashAlignLoop = function () {
if (HASH_LOOP_ON) return;                 
HASH_LOOP_ON = true;
(function keepAligned() {
try { window.__sppHashAlignTick(); } catch (e) { }   
if (Date.now() <= HASH_ALIGN_UNTIL) { HASH_LOOP_T = setTimeout(keepAligned, 400); return; }
HASH_LOOP_ON = false;
HASH_LOOP_T = 0;                      
})();
};
window.__sppHashAlign = function () {
try {
var mH = (location.hash || '').match(/^#read_(\d+)/);
if (!mH) return false;
HASH_YIELD = false;                         
SPP_ALIGN_GEN++;                            
SPP_ALIGN_MY = SPP_ALIGN_GEN;
HASH_STARTED_AT = Date.now();              
HASH_ALIGN_UNTIL = HASH_STARTED_AT + 24000;    
window.__sppHashAlignTick();
window.__sppHashAlignLoop();
return true;
} catch (e) { return false; }
};
try {
window.__sppAlignKill = function (why) {
try { sppAlignStop('external'); } catch (eK) { }
};
} catch (e) { }
/* ==ALIGN-END== */
try { if (/#read_\d+/.test(location.hash || '')) { HASH_ALIGN_UNTIL = Date.now() + 24000; window.__sppHashAlignLoop(); } } catch (e) { }
try { window.__sppHashAlign && window.__sppHashAlign(); } catch (e) { }
try { window.addEventListener('hashchange', function () { try { window.__sppHashAlign && window.__sppHashAlign(); } catch (e) { } }); } catch (e) { }
try { window.addEventListener('pageshow', function () { try { window.__sppHashAlign && window.__sppHashAlign(); } catch (e) { } }); } catch (e) { }
try { document.addEventListener('visibilitychange', function () { if (!document.hidden) { try { window.__sppHashAlign && window.__sppHashAlign(); } catch (e) { } } }); } catch (e) { }
setTimeout(function () { idxAuto(); }, 900);
setTimeout(function () { build(); bindObserver(); }, 700);
setTimeout(function () { build(); }, 2600);
});
onDomReady(function () {
var rt = 0;
window.addEventListener('resize', function () {
clearTimeout(rt);
rt = setTimeout(function () {
if (panel && panel.classList.contains('spp-ii--pinned')) { applyTab(); return; }
fitWidth(); applyTab();
}, 200);
});
});
onDomReady(function () {
const host = document.querySelector('#main > form') || document.getElementById('main');
if (!host) return;
let t = 0;
new MutationObserver(function () {
clearTimeout(t);
t = setTimeout(build, 400);
}).observe(host, { childList: true, subtree: true });
});
}
function initWhiteTextFix() {
if (!WANTS.readOnly) return;
if (!SPP_CONFIG.bool('spp_fix_white_text', true)) return;
GM_addStyle(`
/* ===== SPP-WHITEFIX-BEGIN ===== */
html.spp-read-on .spp-wf {
    color:#111111 !important; -webkit-text-fill-color:#111111 !important;
    font-weight:700 !important;
}
/* ===== SPP-WHITEFIX-END ===== */
`);
const FIX = 'spp-wf';
const MAX_CONTRAST = 2.2;
const MIN_FG_LUM = 0.6;
function lum(rgbText) {
const m = /rgba?\((\d+),\s*(\d+),\s*(\d+)/.exec(rgbText || '');
if (!m) return null;
const ch = function (v) { v = (+v) / 255; return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); };
return 0.2126 * ch(m[1]) + 0.7152 * ch(m[2]) + 0.0722 * ch(m[3]);
}
function bgLum(el) {
let e = el;
while (e && e !== document.documentElement) {
const bg = getComputedStyle(e).backgroundColor;
const m = /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?/.exec(bg || '');
if (m && (m[4] === undefined || +m[4] > 0.5)) return lum(bg);
e = e.parentElement;
}
return lum(getComputedStyle(document.body).backgroundColor);
}
let count = 0;
function scan() {
const boxes = document.querySelectorAll('.tpc_content');
for (let b = 0; b < boxes.length; b++) {
const cands = boxes[b].querySelectorAll('[style*="color"], font[color]');
for (let i = 0; i < cands.length; i++) {
const el = cands[i];
if (el.classList.contains(FIX)) continue;
const st = el.getAttribute('style') || '';
if (!/(^|;)\s*color\s*:/.test(st) && !el.hasAttribute('color')) continue;
const fg = getComputedStyle(el).color;
const L1 = lum(fg);
if (L1 === null || L1 < MIN_FG_LUM) continue;
const L2 = bgLum(el);
if (L2 === null) continue;
const hi = Math.max(L1, L2), lo = Math.min(L1, L2);
if ((hi + 0.05) / (lo + 0.05) < MAX_CONTRAST) { el.classList.add(FIX); count++; }
}
}
try { document.documentElement.setAttribute('data-spp-whitefix', String(count)); } catch (e) {}
}
onDomReady(function () {
setTimeout(scan, 500);
setTimeout(scan, 2200);
});
onDomReady(function () {
const host = document.querySelector('#main > form') || document.getElementById('main');
if (!host || !window.MutationObserver) return;
let t = 0;
new MutationObserver(function () {
clearTimeout(t);
t = setTimeout(scan, 400);
}).observe(host, { childList: true, subtree: true });
});
}
function initHotlinkFix() {
if (!PAGE.read && !PAGE.board) return;
if (!SPP_CONFIG.bool('spp_fix_hotlink', true)) return;
const HL_KEY = 'spp_hotlink_verdict';        
const HL_STALE = 30 * 24 * 3600 * 1000;
const HL_WAIT = 8000;
const HL_REC = 2;                            
const HL_SITE = /(^|\.)(blue-plus\.net|south-plus\.net|south-plus\.org|north-plus\.net|east-plus\.net|white-plus\.net|level-plus\.net|spring-plus\.net|summer-plus\.net|snow-plus\.net|soul-plus\.net|imoutolove\.me)$/i;
let HL_MAP = {};
try { HL_MAP = JSON.parse(GM_getValue(HL_KEY, '{}')) || {}; } catch (e) { HL_MAP = {}; }
const HL_HOLD = {};
function hlSave() {
try { GM_setValue(HL_KEY, JSON.stringify(HL_MAP)); } catch (e) {  }
}
function hlFresh(rec) { return !!rec && (Date.now() - (rec.t || 0) < HL_STALE); }
function hlDims(im) { return im.naturalWidth + 'x' + im.naturalHeight; }
function hlDimsOk(d) {
const m = /^(\d+)x(\d+)$/.exec(String(d || ''));
return !!m && Number(m[1]) > 0 && Number(m[2]) > 0;
}
function hlTrust(rec) {
if (!rec || (rec.v !== 1 && rec.v !== -1)) return false;
if (rec.v !== -1) return true;
return hlDimsOk(rec.sig);
}
(function hlPurge() {
let n = 0;
for (const h in HL_MAP) {
if (!hlTrust(HL_MAP[h])) { delete HL_MAP[h]; n++; }
}
if (n) {
hlSave();
console.info('[SPP] 外链图防盗链:清掉 ' + n + ' 条不可信的旧判定(负判定 + 无有效尺寸签名)⇒ 这些图床会重新尝试修复');
}
})();
let hlSeq = 0;
function hlRefetch(im, url, onDone) {
hlSeq++;
const mySeq = String(hlSeq);
const u = new URL(url, location.href);
u.searchParams.set('_spprl', mySeq);
const want = u.href;
let settled = false;
const onLoad = function () { finish(true); };
const onErr = function () { finish(false); };
const rearm = function () {
im.addEventListener('load', onLoad, { once: true });
im.addEventListener('error', onErr, { once: true });
};
function finish(ok) {
if (settled) return;
if (!im.complete) { rearm(); return; }
settled = true;
im.removeEventListener('load', onLoad);
im.removeEventListener('error', onErr);
if (onDone) onDone(hlDims(im), !!ok);
}
im.removeAttribute('srcset');
im.removeAttribute('referrerpolicy');
im.setAttribute('data-spp-hl-seq', mySeq);
rearm();
im.src = want;
}
function hlLearn(host, before, after, why) {
const v = after === before ? -1 : 1;
if (v === -1 && !hlDimsOk(before)) return 0;
HL_MAP[host] = { v: v, sig: before, why: why || '', t: Date.now(), rv: HL_REC };
hlSave();
return v;
}
function hlSettle(host, v) {
const h = HL_HOLD[host];
if (!h) return;
if (h.timer) { clearTimeout(h.timer); h.timer = 0; }
h.probing = false;
const list = h.list;
h.list = [];
for (let i = 0; i < list.length; i++) {
const im = list[i].im, url = list[i].url;
if (!im || !im.parentNode) continue;
if (v === 1) {
let shown = false;
try { shown = !!(im.complete && im.naturalWidth > 0) && !isKnownDeletedImage(im); } catch (e0) { shown = false; }
if (shown) continue;
hlRefetch(im, url, function () {
if (im.naturalWidth === 0) im.src = url;
});
}
}
if (!h.list.length && !h.timer && !h.probing) delete HL_HOLD[host];
}
function hlFix(im) {
if (!im || im.tagName !== 'IMG' || im.getAttribute('data-spp-hl') === '1') return;
const raw = im.getAttribute('src') || '';
if (!raw || /^(data|blob):/i.test(raw)) return;
const u = new URL(im.src, location.href);
if (HL_SITE.test(u.host)) return;
im.setAttribute('data-spp-hl', '1');          
const orig = u.href;
const rec = HL_MAP[u.host];
if (rec && hlFresh(rec) && hlTrust(rec)) {
if (rec.v !== 1) return;
let shown = false;
try { shown = !!(im.complete && im.naturalWidth > 0) && !isKnownDeletedImage(im); } catch (e0) { shown = false; }
if (shown) return;
hlRefetch(im, orig, function () {
if (im.naturalWidth === 0) im.src = orig;
});
return;
}
let h = HL_HOLD[u.host];
if (h && h.probing) { h.list.push({ im: im, url: orig }); return; }
h = HL_HOLD[u.host] = { list: [], probing: true, timer: 0 };
h.timer = setTimeout(function () { hlSettle(u.host, 0); }, HL_WAIT);
const probe = function () {
if (!im.complete) return;                
const before = hlDims(im);
hlRefetch(im, orig, function (after, ok) {
if (!ok || im.naturalWidth === 0) {
im.src = orig;
hlSettle(u.host, hlLearn(u.host, before, before, 'refetch-failed'));
return;
}
hlSettle(u.host, hlLearn(u.host, before, after, ''));
});
};
if (im.complete) probe();
else {
im.addEventListener('load', probe, { once: true });
im.addEventListener('error', probe, { once: true });
}
}
function hlSweep(root) {
const list = (root || document).querySelectorAll('img[referrerpolicy]');
for (let i = 0; i < list.length; i++) hlFix(list[i]);
}
function hlMount() {
hlSweep(document);
if (!window.MutationObserver) return;
new MutationObserver(function (muts) {
for (let i = 0; i < muts.length; i++) {
const m = muts[i];
if (m.type === 'attributes') { hlFix(m.target); continue; }
for (let j = 0; j < m.addedNodes.length; j++) {
const n = m.addedNodes[j];
if (n.nodeType !== 1) continue;
if (n.tagName === 'IMG') hlFix(n); else hlSweep(n);
}
}
}).observe(document.documentElement || document, {
childList: true, subtree: true,
attributes: true, attributeFilter: ['referrerpolicy']
});
}
if (document.documentElement) hlMount();
else document.addEventListener('DOMContentLoaded', hlMount, { once: true });
document.addEventListener('DOMContentLoaded', function () { hlSweep(document); }, { once: true });
}
function initBountyBadge() {
if (!PAGE.board) return;
if (!SPP_CONFIG.bool('spp_bounty_badge', true)) return;
const BB_FIDS = String(SPP_CONFIG.text('spp_bounty_fids', '48')).split(/[,\s]+/).filter(Boolean);
const bbFid = (function () {
const m = String(SEARCH || '').match(/[?&]fid[=-](\d+)/i);
return m ? m[1] : '';
})();
if (!bbFid || BB_FIDS.indexOf(bbFid) < 0) return;
const BB_KEY = 'spp_bounty_state';
let bbUi = 's1';
try { bbUi = SPP_CONFIG.pick('spp_bounty_ui', 's1', ['s1', 's2', 's3', 's4', 's5']); } catch (e) { bbUi = 's1'; }
const BB_TTL = {
solved: 3650 * 24 * 3600 * 1000,
open:   30 * 60 * 1000,
ended:  7 * 24 * 3600 * 1000,
none:   7 * 24 * 3600 * 1000,
other:  7 * 24 * 3600 * 1000
};
const BB_MAXP = 3;
const BB_GAP = 30;
const BB_CAP = 400;
const BB_MAXBYTES = 400000;
let BB_MAP = {};
try { BB_MAP = JSON.parse(GM_getValue(BB_KEY, '{}')) || {}; } catch (e) { BB_MAP = {}; }
if (!BB_MAP || typeof BB_MAP !== 'object') BB_MAP = {};
let bbDirty = 0;
function bbSave() {
try { GM_setValue(BB_KEY, JSON.stringify(BB_MAP)); } catch (e) {  }
}
function bbFresh(rec) {
if (!rec || !rec.v) return false;
const ttl = BB_TTL[rec.v] !== undefined ? BB_TTL[rec.v] : BB_TTL.none;
return Date.now() - (rec.t || 0) < ttl;
}
function bbLearn(tid, v, sp, left, why) {
BB_MAP[tid] = { v: v, sp: sp || '', left: left || '', t: Date.now(), why: why || '' };
bbDirty++;
if (bbDirty >= 8) {
bbDirty = 0;
const keys = Object.keys(BB_MAP);
if (keys.length > BB_CAP) {
keys.sort(function (a, b) { return (BB_MAP[a].t || 0) - (BB_MAP[b].t || 0); });
for (let i = 0; i < keys.length - BB_CAP; i++) delete BB_MAP[keys[i]];
}
bbSave();
}
}
window.addEventListener('pagehide', function () { if (bbDirty) { bbDirty = 0; bbSave(); } }, false);
GM_addStyle(`
/* ===== SPP-BADGE-BEGIN ===== */
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge {
                 --bg-body: #090a0f !important; --bg-card: #12141d !important; --border-dim: #232635 !important; /* 悬赏中 (Active) - 科技橙/红 */ --active-orange: #ff6600 !important; --active-pink: #ff0055 !important; --active-bg-light: rgba(255, 102, 0, 0.1) !important; /* 已解决 (Resolved) - 高级青/绿 */ --resolved-cyan: #00f0ff !important; --resolved-mint: #00ffa3 !important; --resolved-bg-light: rgba(0, 240, 255, 0.1) !important; /* 通用文本色 */ --text-main: #e2e8f0 !important; --text-muted: #64748b !important; --divider-color: rgba(255, 255, 255, 0.15) !important
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge {
                display: inline-flex !important;
                align-items: center !important;
                line-height: 1 !important;
                font-size: 12px !important;
                gap: 0 !important;
                margin: 0 !important;
                box-sizing: border-box !important;
                white-space: nowrap !important;
                text-decoration: none !important;
                user-select: none !important;
                font-variant-numeric: tabular-nums !important;
                pointer-events: auto !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-mod {
                display: contents !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2 .spp-bb-mod {
                display: inline-flex !important;
                align-items: center !important;
                line-height: 1 !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class].spp-st-hasbb .spp-byline {
                flex-wrap: wrap !important;
                justify-content: flex-start !important;
                row-gap: 4px !important;
                overflow: visible !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class].spp-st-hasbb .spp-byline > .spp-name {
                margin-right: auto !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge {
                flex: 0 0 auto !important;
                order: 9 !important;
                max-width: 100% !important;
            }
            html.spp-bbi.spp-bbi-ht.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-time,
            html.spp-bbi.spp-bbi-ht.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-d2 {
                display: none !important;
            }
            html.spp-bbi.spp-bbi-hs.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-sp,
            html.spp-bbi.spp-bbi-hs.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-d1 {
                display: none !important;
            }
            html.spp-bbi.spp-bbi-hz.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-st,
            html.spp-bbi.spp-bbi-hz.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-dot {
                display: none !important;
            }
            html.spp-bbi.spp-bbi-hz.spp-bbi-hs.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-d2 {
                display: none !important;
            }
            html.spp-bbi.spp-bbi-hz.spp-bbi-hs.spp-bbi-ht.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge {
                display: none !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb--ended {
                --active-orange: #8b93a7 !important;
                --active-pink: #8b93a7 !important;
                --resolved-cyan: #8b93a7 !important;
                --resolved-mint: #8b93a7 !important;
                --active-bg-light: rgb(139 147 167 / .10) !important;
                --resolved-bg-light: rgb(139 147 167 / .10) !important;
                filter: grayscale(1) !important;
                opacity: .78 !important;
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-num {
                font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace !important; font-weight: 700 !important; transform: translateY(0.5px) !important;
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-st {
                font-weight: 500 !important; font-size: 13px !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-time {
                font-size: 12px !important; color: var(--text-muted) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-div {
                width: 1px !important; height: 12px !important; background: var(--divider-color) !important; margin: 0 4px !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-dot {
                width: 6px !important; height: 6px !important; border-radius: 50% !important; margin-right: 6px !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1 {
                position: relative !important; background: rgba(255, 255, 255, 0.03) !important; padding: 8px 14px !important; clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px) !important; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important; cursor: pointer !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1::before {
                content: '' !important; position: absolute !important; inset: 1px !important; z-index: -1 !important; background: var(--bg-card) !important; clip-path: polygon(10px 0, 100% 0, 100% calc(100% - 10px), calc(100% - 10px) 100%, 0 100%, 0 10px) !important; transition: all 0.3s ease !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1:is(.spp-bb--open,.spp-bb--ended) {
                background: var(--active-orange) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1:is(.spp-bb--open,.spp-bb--ended) .spp-bb-st {
                color: var(--active-orange) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1:is(.spp-bb--open,.spp-bb--ended) .spp-bb-num {
                color: #fff !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1:is(.spp-bb--open,.spp-bb--ended):hover {
                filter: drop-shadow(0 0 8px rgba(255, 102, 0, 0.4)) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1:is(.spp-bb--open,.spp-bb--ended):hover::before {
                background: var(--active-bg-light) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1:is(.spp-bb--open,.spp-bb--ended):hover .spp-bb-st,
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1:is(.spp-bb--open,.spp-bb--ended):hover .spp-bb-num {
                text-shadow: 0 0 8px rgba(255, 102, 0, 0.8) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1.spp-bb--solved {
                background: var(--resolved-cyan) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1.spp-bb--solved .spp-bb-st {
                color: var(--resolved-cyan) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1.spp-bb--solved .spp-bb-num {
                color: #fff !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1.spp-bb--solved:hover {
                filter: drop-shadow(0 0 8px rgba(0, 240, 255, 0.4)) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1.spp-bb--solved:hover::before {
                background: var(--resolved-bg-light) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1.spp-bb--solved:hover .spp-bb-st,
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s1.spp-bb--solved:hover .spp-bb-num {
                text-shadow: 0 0 8px rgba(0, 240, 255, 0.8) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2 {
                border-radius: 4px !important; overflow: hidden !important; border: 1px solid var(--border-dim) !important; transition: all 0.3s !important; cursor: pointer !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-mod {
                padding: 8px 12px !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-mod-st {
                background: rgba(255, 255, 255, 0.05) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-mod-data {
                background: rgba(0, 0, 0, 0.3) !important; border-left: 1px solid var(--border-dim) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2:hover {
                transform: translateY(-2px) !important; box-shadow: 0 8px 20px rgba(0,0,0,0.5) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2:is(.spp-bb--open,.spp-bb--ended) {
                border-color: rgba(255, 102, 0, 0.3) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2:is(.spp-bb--open,.spp-bb--ended) .spp-bb-mod-st {
                color: var(--active-orange) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2:is(.spp-bb--open,.spp-bb--ended) .spp-bb-num {
                color: var(--active-orange) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2:is(.spp-bb--open,.spp-bb--ended):hover {
                border-color: var(--active-orange) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2:is(.spp-bb--open,.spp-bb--ended):hover .spp-bb-mod-data {
                background: var(--active-bg-light) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2.spp-bb--solved {
                border-color: rgba(0, 255, 163, 0.3) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2.spp-bb--solved .spp-bb-mod-st {
                color: var(--resolved-mint) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2.spp-bb--solved .spp-bb-num {
                color: var(--resolved-mint) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2.spp-bb--solved:hover {
                border-color: var(--resolved-mint) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s2.spp-bb--solved:hover .spp-bb-mod-data {
                background: rgba(0, 255, 163, 0.1) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3 {
                background: rgba(255, 255, 255, 0.02) !important; backdrop-filter: blur(12px) !important; -webkit-backdrop-filter: blur(12px) !important; border: 1px solid rgba(255, 255, 255, 0.08) !important; border-radius: 20px !important; padding: 6px 14px !important; transition: all 0.4s ease !important; cursor: pointer !important; position: relative !important; overflow: hidden !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3:is(.spp-bb--open,.spp-bb--ended) .spp-bb-st {
                color: var(--active-pink) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3:is(.spp-bb--open,.spp-bb--ended) .spp-bb-num {
                color: #fff !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3:is(.spp-bb--open,.spp-bb--ended) .spp-bb-dot {
                background: var(--active-pink) !important; box-shadow: 0 0 8px var(--active-pink) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3:is(.spp-bb--open,.spp-bb--ended):hover {
                border-color: rgba(255, 0, 85, 0.5) !important; background: rgba(255, 0, 85, 0.08) !important; box-shadow: 0 8px 24px rgba(255, 0, 85, 0.15), inset 0 0 12px rgba(255, 0, 85, 0.1) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3.spp-bb--solved .spp-bb-st {
                color: var(--resolved-cyan) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3.spp-bb--solved .spp-bb-num {
                color: #fff !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3.spp-bb--solved .spp-bb-dot {
                background: var(--resolved-cyan) !important; box-shadow: 0 0 8px var(--resolved-cyan) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s3.spp-bb--solved:hover {
                border-color: rgba(0, 240, 255, 0.5) !important; background: rgba(0, 240, 255, 0.08) !important; box-shadow: 0 8px 24px rgba(0, 240, 255, 0.15), inset 0 0 12px rgba(0, 240, 255, 0.1) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4 {
                background: #000000 !important; border-radius: 6px !important; padding: 8px 16px !important; box-shadow: inset 0 0 0 1px rgba(255,255,255,0.05) !important; transition: all 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important; cursor: pointer !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4:is(.spp-bb--open,.spp-bb--ended) .spp-bb-st {
                color: var(--text-muted) !important; transition: color 0.3s !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4:is(.spp-bb--open,.spp-bb--ended) .spp-bb-num {
                color: var(--active-orange) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4:is(.spp-bb--open,.spp-bb--ended) .spp-bb-dot {
                background: var(--active-orange) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4:is(.spp-bb--open,.spp-bb--ended):hover {
                box-shadow: inset 0 0 0 1px var(--active-orange), 0 0 15px rgba(255,102,0,0.2) !important; transform: scale(1.03) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4:is(.spp-bb--open,.spp-bb--ended):hover .spp-bb-st {
                color: var(--active-orange) !important; text-shadow: 0 0 8px rgba(255,102,0,0.5) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4.spp-bb--solved .spp-bb-st {
                color: var(--text-muted) !important; transition: color 0.3s !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4.spp-bb--solved .spp-bb-num {
                color: var(--resolved-mint) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4.spp-bb--solved .spp-bb-dot {
                background: var(--resolved-mint) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4.spp-bb--solved:hover {
                box-shadow: inset 0 0 0 1px var(--resolved-mint), 0 0 15px rgba(0,255,163,0.2) !important; transform: scale(1.03) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s4.spp-bb--solved:hover .spp-bb-st {
                color: var(--resolved-mint) !important; text-shadow: 0 0 8px rgba(0,255,163,0.5) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5 {
                position: relative !important; padding: 8px 18px !important; background: linear-gradient(90deg, rgba(255,255,255,0.02), transparent, rgba(255,255,255,0.02)) !important; border-top: 1px solid var(--border-dim) !important; border-bottom: 1px solid var(--border-dim) !important; transition: 0.3s ease !important; cursor: pointer !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5::before,
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5::after {
                content: '' !important; position: absolute !important; top: 2px !important; bottom: 2px !important; width: 3px !important; transition: 0.3s ease !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5::before {
                left: 0 !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5::after {
                right: 0 !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5:is(.spp-bb--open,.spp-bb--ended) {
                color: var(--active-pink) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5:is(.spp-bb--open,.spp-bb--ended)::before,
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5:is(.spp-bb--open,.spp-bb--ended)::after {
                background: var(--active-pink) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5:is(.spp-bb--open,.spp-bb--ended) .spp-bb-num {
                color: #fff !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5:is(.spp-bb--open,.spp-bb--ended):hover {
                background: var(--active-bg-light) !important; border-color: rgba(255, 0, 85, 0.4) !important; padding: 8px 24px !important;
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5:is(.spp-bb--open,.spp-bb--ended):hover::before,
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5:is(.spp-bb--open,.spp-bb--ended):hover::after {
                box-shadow: 0 0 10px var(--active-pink) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5.spp-bb--solved {
                color: var(--resolved-cyan) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5.spp-bb--solved::before,
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5.spp-bb--solved::after {
                background: var(--resolved-cyan) !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5.spp-bb--solved .spp-bb-num {
                color: #fff !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5.spp-bb--solved:hover {
                background: var(--resolved-bg-light) !important; border-color: rgba(0, 240, 255, 0.4) !important; padding: 8px 24px !important
            }
html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5.spp-bb--solved:hover::before,
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge.spp-bb-s5.spp-bb--solved:hover::after {
                box-shadow: 0 0 10px var(--resolved-cyan) !important
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-dot {
                flex: 0 0 auto !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class] .spp-byline > .spp-bounty-badge .spp-bb-div {
                flex: 0 0 auto !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class].spp-card-portrait.spp-st-hasbb .spp-byline {
                display: flex !important;
                flex-wrap: wrap !important;
                align-items: center !important;
                justify-content: flex-start !important;
                gap: 4px 8px !important;
                grid-template-columns: none !important;
                grid-template-rows: none !important;
                overflow: visible !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class].spp-card-portrait.spp-st-hasbb .spp-byline > .spp-name {
                order: 0 !important;
                grid-area: auto !important;
                margin-right: auto !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class].spp-card-portrait.spp-st-hasbb .spp-byline > .spp-date {
                order: -1 !important;
                grid-area: auto !important;
                justify-self: auto !important;
            }
            html.spp-bbi.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class].spp-card-portrait.spp-st-hasbb .spp-byline > .spp-bounty-badge {
                order: 9 !important;
                grid-area: auto !important;
                place-self: auto !important;
                flex: 0 0 auto !important;
            }

            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class][class]:not(.spp-tl-list) .spp-card-meta .spp-metabtn {
                display:inline-flex !important;
                align-items:center !important;
                padding:6px 8px !important;
                font-size:0 !important;
                line-height:16px !important;
                min-height:0 !important;
                height:auto !important;
                border:0 !important;
                border-radius:9999px !important;
                background:rgba(255,255,255,.03) !important;
                box-shadow:inset 0 0 0 1px rgba(255,255,255,.08) !important;
                color:rgb(156,163,175) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class][class]:not(.spp-tl-list).spp-st-hasflame .spp-card-meta .spp-metabtn {
                color:var(--spp-mbtn-fg,#9CA3AF) !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class][class]:not(.spp-tl-list) .spp-card-meta .spp-metabtn > span {
                font-size:12px !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class][class]:not(.spp-tl-list) .spp-card-meta .spp-meta-btns > .spp-metabtn:first-child::before {
                content:"" !important;
                flex:0 0 14px !important;
                width:14px !important;
                height:14px !important;
                margin-right:6px !important;
                background:currentcolor !important;
                mask:var(--spp-cmt-mask) center / contain no-repeat !important;
            }
            html.spp-board-skin #wall ul.stream > li.spp-card-clickable[class][class][class][class][class]:not(.spp-tl-list) .spp-card-meta .spp-flame {
                flex:0 0 14px !important;
                width:14px !important;
                height:14px !important;
                margin-right:6px !important;
            }
/* ===== SPP-BADGE-END ===== */
        `);
function bbSp(s) {
const m = String(s).match(/最佳答案:\s*([0-9]+)/);
return m ? m[1] : '';
}
function bbLeft(s) {
const m = String(s).match(/剩余时间[::]\s*([^))]*)/);
if (!m) return '';
const raw = m[1].trim();
if (!/^(?:[0-9]+\s*(?:天|小时|分钟|秒)\s*)+$/.test(raw)) return '';
return raw.replace(/\s+/g, '')
.replace(/小时/g, 'h').replace(/分钟/g, 'm').replace(/天/g, 'd').replace(/秒/g, 's');
}
function bbRead(seg, done) {
const s = String(seg).replace(/\s+/g, ' ');
const i = s.indexOf('class="tips"');
if (i < 0) { done('none', '', '', 'no-tips'); return; }
const t = s.slice(i, i + 360);
if (/最佳答案获得者/.test(t)) { done('solved', bbSp(t), '', ''); return; }
if (/此帖悬赏中/.test(t)) { done('open', bbSp(t), bbLeft(t), ''); return; }
if (/此帖悬赏结束/.test(t)) { done('ended', bbSp(t), '', ''); return; }
done('other', '', '', 'tips-unknown');
}
function bbProbe(tid, cb) {
let called = false;
const once = function (v, sp, left, why) {
if (called) return;
called = true;
if (v !== 'err') bbLearn(tid, v, sp, left, why);
cb(v);
};
let ctl = null;
try { ctl = new AbortController(); } catch (e) { ctl = null; }
const stop = function () { if (ctl) { try { ctl.abort(); } catch (e) {  } } };
let p;
try {
p = fetch('./read.php?tid-' + tid + '.html', {
credentials: 'same-origin',
signal: ctl ? ctl.signal : undefined
});
} catch (e) { once('err', '', '', 'fetch-throw'); return; }
p.then(function (r) {
if (!r.ok) { once('err', '', '', 'http-' + r.status); return; }
if (!r.body || typeof r.body.getReader !== 'function') {
return r.text().then(function (h) { stop(); bbRead(h, once); });
}
const rd = r.body.getReader();
const dec = new TextDecoder();
let txt = '';
const step = function () {
return rd.read().then(function (res) {
if (res.done) { stop(); bbRead(txt, once); return; }
txt += dec.decode(res.value, { stream: true });
const i = txt.indexOf('class="tips"');
if (i >= 0 && txt.length > i + 280) { stop(); bbRead(txt.slice(i), once); return; }
if (txt.length > BB_MAXBYTES) { stop(); bbRead(txt, once); return; }
return step();
});
};
return step();
}).catch(function () { once('err', '', '', 'net'); });
}
const bbQueue = [];
let bbActive = 0, bbPump = 0;
function bbPumpSoon() {
if (bbPump) return;
bbPump = setTimeout(function () { bbPump = 0; bbPumpNow(); }, BB_GAP);
}
function bbPumpNow() {
while (bbActive < BB_MAXP && bbQueue.length) {
const item = bbQueue.shift();
const rec = BB_MAP[item.tid];
if (bbFresh(rec)) { bbPaint(item.li, rec); continue; }
bbActive++;
bbProbe(item.tid, (function (li, tid) {
return function (v) {
bbActive--;
bbPaint(li, v === 'err' ? null : BB_MAP[tid]);
bbPumpSoon();
};
})(item.li, item.tid));
}
}
function bbHost(li) {
return li.querySelector('.spp-byline') || li.querySelector('.section-intro');
}
function bbPaint(li, rec) {
if (!li || !li.isConnected) return;
let el0 = null;
const bbAll = li.querySelectorAll('.spp-bounty-badge');
for (let bi = 0; bi < bbAll.length; bi++) {
if (bi + 1 === bbAll.length) el0 = bbAll[bi];
else bbAll[bi].remove();
}
if (!rec || rec.v === 'none' || rec.v === 'other') { if (el0) el0.remove(); li.classList.remove('spp-st-hasbb'); return; }
const host = bbHost(li);
if (!host) { li.classList.remove('spp-st-hasbb'); return; }
const el = el0 || document.createElement('span');
el.className = 'spp-bounty-badge spp-bb--' + rec.v + ' spp-bb-' + bbUi;
while (el.firstChild) el.removeChild(el.firstChild);
const part = function (cls, s) {
const w = document.createElement('span');
w.className = cls;
if (s) w.appendChild(document.createTextNode(s));
return w;
};
const pnum = function (cls, head, s, tail) {
const w = document.createElement('span');
w.className = cls;
if (head) w.appendChild(document.createTextNode(head));
const b = document.createElement('b');
b.textContent = s;
w.appendChild(b);
if (tail) w.appendChild(document.createTextNode(tail));
return w;
};
const modSt = part('spp-bb-mod spp-bb-mod-st', '');
const modData = part('spp-bb-mod spp-bb-mod-data', '');
const d = document.createElement('span');
d.className = 'spp-bb-dot';
d.setAttribute('aria-hidden', 'true');
modSt.appendChild(d);
if (rec.v === 'solved') {
modSt.appendChild(part('spp-bb-st', '已解决'));
if (rec.sp) { modData.appendChild(part('spp-bb-div spp-bb-d1', '')); modData.appendChild(pnum('spp-bb-sp spp-bb-num', '', rec.sp, ' SP')); }
el.title = '此帖悬赏已结束,答案已被选定' + (rec.sp ? '(悬赏 ' + rec.sp + ' SP)' : '');
} else if (rec.v === 'open') {
modSt.appendChild(part('spp-bb-st', '悬赏中'));
if (rec.sp) { modData.appendChild(part('spp-bb-div spp-bb-d1', '')); modData.appendChild(pnum('spp-bb-sp spp-bb-num', '', rec.sp, ' SP')); }
if (rec.left) { modData.appendChild(part('spp-bb-div spp-bb-d2', '')); modData.appendChild(pnum('spp-bb-time spp-bb-num', '剩 ', rec.left, '')); }
el.title = '此帖仍在悬赏' + (rec.sp ? '(' + rec.sp + ' SP)' : '') + (rec.left ? ',剩余 ' + rec.left : '');
} else {
modSt.appendChild(part('spp-bb-st', '悬赏已结束'));
el.title = '悬赏已结束,但没有选中任何答案';
}
el.appendChild(modSt);
el.appendChild(modData);
host.appendChild(el);
li.classList.add('spp-st-hasbb');
}
function bbTidOf(li) {
const a = li.querySelector('.section-title a[href*="read.php?tid-"]');
if (!a) return '';
const m = String(a.getAttribute('href') || '').match(/tid-(\d+)/);
return m ? m[1] : '';
}
function bbInView(li) {
const r = li.getBoundingClientRect();
const h = window.innerHeight || 800;
return r.bottom > -200 && r.top < h + 200;
}
function bbRepaint(li) {
const tid = bbTidOf(li);
if (!tid) return;
const rec = BB_MAP[tid];
if (rec) bbPaint(li, rec);
}
function bbCard(li) {
if (!li || li.tagName !== 'LI') return;
if (li.dataset.sppBbDone === '1') { bbRepaint(li); return; }
const tid = bbTidOf(li);
if (!tid) return;
li.dataset.sppBbDone = '1';
const rec = BB_MAP[tid];
if (bbFresh(rec)) { bbPaint(li, rec); return; }
if (bbInView(li)) bbQueue.unshift({ tid: tid, li: li });
else bbQueue.push({ tid: tid, li: li });
bbPumpSoon();
}
function bbSweep(root) {
const sc = root || document;
if (!sc.querySelectorAll) return;
const list = sc.querySelectorAll('ul.stream > li');
for (let i = 0; i < list.length; i++) bbCard(list[i]);
const done = sc.querySelectorAll('ul.stream > li[data-spp-bb-done="1"]');
for (let j = 0; j < done.length; j++) {
if (!done[j].querySelector('.spp-bounty-badge')) bbRepaint(done[j]);
}
}
function bbStart() {
bbSweep(document);
if (window.MutationObserver) {
new MutationObserver(function (muts) {
for (let i = 0; i < muts.length; i++) {
const m = muts[i];
if (m.type !== 'childList') continue;
const nodes = m.addedNodes;
for (let j = 0; j < nodes.length; j++) {
const n = nodes[j];
if (n.nodeType !== 1) continue;
if (n.classList && n.classList.contains('spp-byline')) {
const li = n.closest ? n.closest('li') : null;
if (li && !li.querySelector('.spp-bounty-badge')) bbRepaint(li);
continue;
}
if (n.tagName === 'LI') { bbCard(n); continue; }
if (n.querySelectorAll) bbSweep(n);
}
}
}).observe(document.getElementById('wall') || document.documentElement || document, { childList: true, subtree: true });
}
setTimeout(function () { bbSweep(document); }, 900);
setTimeout(function () { bbSweep(document); }, 2400);
}
if (document.documentElement) bbStart();
else document.addEventListener('DOMContentLoaded', bbStart, { once: true });
document.addEventListener('DOMContentLoaded', function () { bbSweep(document); }, { once: true });
}
function initAskBountyFilter() {
if (!PAGE.board) return;
if (!isAskFid()) return;
const MODE = (function () {
try { return SPP_CONFIG.pick('spp_bounty_filter', 'all', ['all', 'open', 'done']); }
catch (e) { return 'all'; }
})();
if (MODE === 'all') return;                       
const GATE = 'spp-ask-bf-on';
const HIT = 'spp-ask-bf';
const START = 'spp-ask-bf-start';
ensureStyle('spp-ask-bf-style', '/* SPP-ASK-BF-BEGIN */\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + HIT + ' { display:none !important; }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + START + ':not(.spp-card-portrait) { grid-column:1 / span 4 !important; }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + START + '.spp-card-portrait { grid-column:1 / span 3 !important; }\n' +
'@media (max-width:1000px) { html.' + GATE + ' #main #wall ul.stream > li.' + START + '.spp-card-portrait { grid-column:1 / span 4 !important; } }\n' +
'@media (max-width:640px) { html.' + GATE + ' #main #wall ul.stream > li.' + START + '.spp-card-portrait { grid-column:1 / span 4 !important; } }\n' +
'/* SPP-ASK-BF-END */');
document.documentElement.classList.add(GATE);
function badgeState(li) {
const el = li.querySelector('.spp-bounty-badge');
if (!el) return null;
if (el.classList.contains('spp-bb--open')) return 'open';
if (el.classList.contains('spp-bb--solved')) return 'solved';
if (el.classList.contains('spp-bb--ended')) return 'ended';
return null;
}
function isGone(li) {
return li.classList.contains(HIT) || li.classList.contains('spp-card-kw');
}
function rankOf(li) {
return li.classList.contains('spp-tl-list') ? 2
: li.classList.contains('spp-card-portrait') ? 1 : 0;
}
function wallUl() {
return document.querySelector('#main #wall ul.stream') || document.querySelector('#wall ul.stream');
}
function restampStarts(ul) {
const seen = {};
Array.from(ul.children).forEach(function (li) {
if (li.tagName !== 'LI') return;
const r = rankOf(li);
const should = (!isGone(li) && !seen[r]);
if (should) seen[r] = 1;
const has = li.classList.contains(START);
if (should && !has) li.classList.add(START);
else if (!should && has) li.classList.remove(START);
});
}
function sweep() {
const ul = wallUl();
if (!ul) return;
Array.from(ul.children).forEach(function (li) {
if (li.tagName !== 'LI') return;
const v = badgeState(li);
const hide = v !== null && (MODE === 'open'
? (v === 'solved' || v === 'ended')
: v === 'open');
if (hide && !li.classList.contains(HIT)) li.classList.add(HIT);
else if (!hide && li.classList.contains(HIT)) li.classList.remove(HIT);
});
restampStarts(ul);
}
onDomReady(function () { sweep(); setTimeout(sweep, 600); setTimeout(sweep, 900); setTimeout(sweep, 2400); });
onDomReady(function () {
const ul = wallUl();
if (!ul) return;
new MutationObserver(function () { sweep(); }).observe(ul,
{ childList: true, subtree: true });   
});
}
function initBoardCardFilter() {
if (!PAGE.board) return;
if (!isTeaFid() && !isAskFid()) return;
const SKEY = 'spp_cf_f' + sppFidNum();
const GATE = 'spp-cf-on', HIT = 'spp-cf', START = 'spp-cf-start';
const MAX_PRIME = 12, PRIME_WAIT = 5000, DEBOUNCE = 150;
const DIMS = [['reply', '回复'], ['heat', '热度'], ['cover', '封面图片']]
.concat(isAskFid() ? [['sp', '悬赏 SP']] : []);
const OPS = [['ge', '≥'], ['gt', '>'], ['eq', '='], ['lt', '<'], ['le', '≤']];
const CVS = [['has', '有封面'], ['none', '无图'], ['land', '横屏'], ['port', '竖屏']];
let state = { conds: [] };
try {
const raw = sessionStorage.getItem(SKEY);
const o = raw ? JSON.parse(raw) : null;
if (o && Array.isArray(o.conds)) {
state.conds = o.conds.filter(function (c) {
if (!c || typeof c !== 'object') return false;
if (!DIMS.some(function (d) { return d[0] === c.dim; })) return false;
if (c.dim === 'cover') return CVS.some(function (v) { return v[0] === c.cv; });
return OPS.some(function (v) { return v[0] === c.op; });
}).map(function (c) {
return c.dim === 'cover'
? { dim: 'cover', cv: c.cv }
: { dim: c.dim, op: c.op, val: Math.max(0, parseInt(c.val, 10) || 0) };
});
}
} catch (e) { }
let lamp = null, panel = null, countEl = null, timer = 0;
let dimSel = null, opSel = null, numIn = null, cvSel = null, condBox = null;
function save() {
try { sessionStorage.setItem(SKEY, JSON.stringify({ conds: state.conds })); } catch (e) { }
}
function active() { return state.conds.length > 0; }
function wallUl() {
return document.querySelector('#main #wall ul.stream') || document.querySelector('#wall ul.stream');
}
function cards(ul) {
return Array.prototype.slice.call(ul.children).filter(function (c) { return c.tagName === 'LI'; });
}
function isGone(li) {
return li.classList.contains(HIT) || li.classList.contains('spp-card-kw') || li.classList.contains('spp-ask-bf');
}
function numOf(li, cls) {
const el = li.querySelector('.' + cls);
if (!el) return 0;
const n = parseInt(String(el.textContent).replace(/[^\d]/g, ''), 10);
return isNaN(n) ? 0 : n;
}
function replyOf(li) { return numOf(li, 'spp-tl-reply'); }
function heatOf(li) { return numOf(li, 'spp-tl-heat'); }
function spRaw(li) {
const b = li.querySelector('.spp-bounty-badge');
if (!b) return null;
let n = 0;
const nb = b.querySelector('.spp-bb-sp b') || b.querySelector('.spp-bb-sp');
if (nb) n = parseInt(String(nb.textContent).replace(/[^\d]/g, ''), 10) || 0;
if (!n) {
const m = /(\d[\d,]*)\s*SP/.exec(String(b.getAttribute('title') || ''));
if (m) n = parseInt(m[1].replace(/[^\d]/g, ''), 10) || 0;
}
return n > 0 ? n : null;
}
function noImage(li) { return li.classList.contains('spp-tl-list'); }
function coverImg(li) { return li.querySelector('.section-text img') || li.querySelector('img'); }
function judged(li) {
const im = coverImg(li);
return !!(im && im.naturalWidth && im.naturalHeight);
}
function isPortrait(li) {                       
const im = coverImg(li);
return !!(im && im.naturalWidth && im.naturalHeight && (im.naturalWidth / im.naturalHeight) < 1);
}
function rankOf(li) { return noImage(li) ? 2 : (isPortrait(li) ? 1 : 0); }
function condMatch(li, c) {
if (c.dim === 'cover') {
if (c.cv === 'none') return noImage(li);
if (c.cv === 'has') return !noImage(li);
if (noImage(li)) return false;
if (!judged(li)) return true;               
return c.cv === 'port' ? isPortrait(li) : !isPortrait(li);
}
if (c.dim === 'sp') {
const sp = spRaw(li);
if (sp === null) return false;          
if (c.op === 'gt') return sp > c.val;
if (c.op === 'lt') return sp < c.val;
if (c.op === 'eq') return sp === c.val;
if (c.op === 'le') return sp <= c.val;
return sp >= c.val;
}
const v = c.dim === 'heat' ? heatOf(li) : replyOf(li);
if (c.op === 'gt') return v > c.val;
if (c.op === 'lt') return v < c.val;
if (c.op === 'eq') return v === c.val;
if (c.op === 'le') return v <= c.val;
return v >= c.val;                              
}
function wanted(li) {
return state.conds.every(function (c) { return condMatch(li, c); });
}
function restampStarts(ul) {
const seen = {};
cards(ul).forEach(function (li) {
const r = rankOf(li);
const should = (!isGone(li) && !seen[r]);
if (should) seen[r] = 1;
const has = li.classList.contains(START);
if (should && !has) li.classList.add(START);
else if (!should && has) li.classList.remove(START);
});
}
function clearMarks() {
const ul = wallUl();
if (!ul) return;
cards(ul).forEach(function (li) {
li.classList.remove(HIT);
li.classList.remove(START);
});
}
function sweep() {
const ul = wallUl();
if (!ul) return;
if (!active()) {
document.documentElement.classList.remove(GATE);
clearMarks();
paintStatus(ul);
return;
}
document.documentElement.classList.add(GATE);
const list = cards(ul);
list.forEach(function (li) {
const hide = !wanted(li);
if (hide && !li.classList.contains(HIT)) li.classList.add(HIT);
else if (!hide && li.classList.contains(HIT)) li.classList.remove(HIT);
});
restampStarts(ul);
paintStatus(ul);
}
function scheduleSweep() {
if (timer) clearTimeout(timer);
timer = setTimeout(function () { timer = 0; sweep(); }, DEBOUNCE);
}
function primeOrientation() {
const ul = wallUl();
if (!ul) return;
let n = 0;
cards(ul).forEach(function (li) {
if (n >= MAX_PRIME) return;
if (noImage(li) || judged(li)) return;
const im = coverImg(li);
if (!im) return;
n++;
im.setAttribute('loading', 'eager');
im.addEventListener('load', scheduleSweep, { once: true });
im.addEventListener('error', scheduleSweep, { once: true });
try { im.src = im.src; } catch (e) { }
});
if (n) { setTimeout(sweep, 800); setTimeout(sweep, PRIME_WAIT); }
}
function paintStatus(ul) {
const u = ul || wallUl();
const all = u ? cards(u) : [];
const visible = all.filter(function (li) { return !isGone(li) && !li.classList.contains(HIT); }).length;
if (panel) panel.dataset.empty = (active() && visible === 0) ? '1' : '';
if (lamp) lamp.classList.toggle('spp-cf-active', active());
}
function condText(c) {
if (c.dim === 'cover') {
const v = CVS.filter(function (p) { return p[0] === c.cv; })[0];
return '封面图片 = ' + (v ? v[1] : c.cv);
}
const d = DIMS.filter(function (p) { return p[0] === c.dim; })[0];
const o = OPS.filter(function (p) { return p[0] === c.op; })[0];
return (d ? d[1] : c.dim) + ' ' + (o ? o[1] : c.op) + ' ' + c.val;
}
function renderConds() {
if (!condBox) return;
condBox.textContent = '';
state.conds.forEach(function (c, i) {
const chip = document.createElement('span');
chip.className = 'spp-cf-cond';
const txt = document.createElement('span');
txt.textContent = condText(c);
chip.appendChild(txt);
const x = document.createElement('button');
x.type = 'button';
x.className = 'spp-cf-x';
x.textContent = '×';
x.title = '去掉这条条件';
x.addEventListener('click', function () {
state.conds.splice(i, 1);
save();
syncPanel();
sweep();
});
chip.appendChild(x);
condBox.appendChild(chip);
});
}
function syncPanel() {
if (!panel) return;
const dim = dimSel ? dimSel.value : 'reply';
const cover = (dim === 'cover');
if (opSel) opSel.style.display = cover ? 'none' : '';
if (numIn) numIn.style.display = cover ? 'none' : '';
if (cvSel) cvSel.style.display = cover ? '' : 'none';
renderConds();
paintStatus();
}
function mkLab(text) {
const l = document.createElement('span');
l.className = 'spp-cf-lab';
l.textContent = text;
return l;
}
function mkSel(cls, pairs) {
const s = document.createElement('select');
s.className = 'spp-cf-sel ' + cls;
pairs.forEach(function (p) {
const o = document.createElement('option');
o.value = p[0];
o.textContent = p[1];
s.appendChild(o);
});
return s;
}
function addCond() {
const dim = dimSel ? dimSel.value : 'reply';
let c = null;
if (dim === 'cover') c = { dim: 'cover', cv: cvSel ? cvSel.value : 'has' };
else c = { dim: dim, op: opSel ? opSel.value : 'ge', val: Math.max(0, parseInt(numIn ? numIn.value : '0', 10) || 0) };
const dup = state.conds.some(function (x) {
return x.dim === c.dim && (c.dim === 'cover' ? x.cv === c.cv : (x.op === c.op && x.val === c.val));
});
if (!dup) state.conds.push(c);
save();
syncPanel();
sweep();
if (c.dim === 'cover' && (c.cv === 'land' || c.cv === 'port')) primeOrientation();
}
function buildPanel() {
const p = document.createElement('div');
p.className = 'spp-cf-panel';
p.dataset.pane = 'cf';
p.appendChild(mkLab('条件'));
dimSel = mkSel('spp-cf-dim', DIMS);
p.appendChild(dimSel);
opSel = mkSel('spp-cf-op', OPS);
p.appendChild(opSel);
numIn = document.createElement('input');
numIn.type = 'number';
numIn.min = '0';
numIn.step = '1';
numIn.className = 'spp-cf-num';
numIn.value = '0';
numIn.title = '数值(回复 / 热度用)';
p.appendChild(numIn);
cvSel = mkSel('spp-cf-cv', CVS);
cvSel.style.display = 'none';
p.appendChild(cvSel);
dimSel.addEventListener('change', syncPanel);
const add = document.createElement('button');
add.type = 'button';
add.className = 'spp-cf-add';
add.textContent = '+ 添加';
add.title = '把上面这条条件加入筛选(多条条件取交集)';
add.addEventListener('click', addCond);
p.appendChild(add);
const clear = document.createElement('button');
clear.type = 'button';
clear.className = 'spp-cf-reset';
clear.textContent = '清空';
clear.addEventListener('click', function () {
state = { conds: [] };
save();
syncPanel();
sweep();
});
p.appendChild(clear);
condBox = document.createElement('span');
condBox.className = 'spp-cf-conds';
p.appendChild(condBox);
return p;
}
function ensureStyleCss() {
const css = '/* SPP-CF-BEGIN */\n' +
'#spp-btabs .spp-catrow .spp-cat-filing.spp-cf-active, #spp-btabs .spp-askrow .spp-cat-filing.spp-cf-active {\n' +
'    border-style:solid !important; border-color:rgba(16,185,129,.55) !important;\n' +
'    background-color:rgba(16,185,129,.14) !important; color:#6ee7b7 !important; -webkit-text-fill-color:#6ee7b7 !important;\n' +
'    font-weight:600 !important; box-shadow:inset 0 0 0 1px rgba(16,185,129,.16), 0 0 14px -2px rgba(16,185,129,.45) !important; }\n' +
'/* ★ t14:只把控件本身放进工具条那一行的空白区(分类行之后、面包屑之前);\n' +
'   不撑宽(flex:0 1 auto)⇒ 宽屏下面包屑仍在同一行右侧;窄屏时控件自己换行。*/\n' +
'#spp-btabs .spp-cf-panel { display:inline-flex; flex:0 1 auto; min-width:0; max-width:100%;\n' +
'    box-sizing:border-box; align-items:center; flex-wrap:wrap; gap:6px; margin:0; padding:2px 0; border:0; background:none; box-shadow:none; }\n' +
'#main .spp-cf-lab { flex:0 0 auto; color:#8b98a8; font-size:12px; }\n' +
'#main .spp-cf-sel, #main .spp-cf-num { flex:0 1 auto; min-width:0; max-width:100%; height:26px;\n' +
'    box-sizing:border-box; padding:0 6px; border-radius:8px;\n' +
'    border:1px solid rgba(255,255,255,.12); background-color:rgba(255,255,255,.05); color:#c8d6ea; font-size:12.5px; }\n' +
'#main .spp-cf-num { width:72px; }\n' +
'#main .spp-cf-add, #main .spp-cf-reset { flex:0 0 auto; display:inline-flex; align-items:center; height:26px; padding:0 12px;\n' +
'    border-radius:999px; line-height:1; font-size:12.5px; cursor:pointer;\n' +
'    border:1px solid rgba(255,255,255,.12); background-color:rgba(255,255,255,.05); background-image:none;\n' +
'    color:#c8d6ea; -webkit-text-fill-color:#c8d6ea; white-space:nowrap; }\n' +
'#main .spp-cf-add:hover, #main .spp-cf-reset:hover { border-color:rgba(255,255,255,.26); }\n' +
'#main .spp-cf-add { border-color:rgba(16,185,129,.42); color:#8ee9c4; -webkit-text-fill-color:#8ee9c4; }\n' +
'#main .spp-cf-conds { display:inline-flex; align-items:center; flex-wrap:wrap; gap:6px; min-width:0; }\n' +
'#main .spp-cf-cond { display:inline-flex; align-items:center; gap:6px; height:26px; padding:0 6px 0 10px;\n' +
'    border-radius:999px; font-size:12.5px; white-space:nowrap;\n' +
'    border:1px solid rgba(16,185,129,.55); background-color:rgba(16,185,129,.14);\n' +
'    color:#6ee7b7; -webkit-text-fill-color:#6ee7b7; }\n' +
'#main .spp-cf-x { display:inline-flex; align-items:center; justify-content:center; width:16px; height:16px;\n' +
'    padding:0; border:0; border-radius:50%; cursor:pointer; line-height:1;\n' +
'    background-color:rgba(16,185,129,.22); color:#d7fbec; -webkit-text-fill-color:#d7fbec; font-size:12px; }\n' +
'#main .spp-cf-x:hover { background-color:rgba(239,68,68,.42); color:#ffe9e9; -webkit-text-fill-color:#ffe9e9; }\n' +
'/* 只在「有条件下一个都没剩」时补一句,避免全白页面(仍不显示计数/方向等其它信息)*/\n' +
'#main .spp-cf-panel[data-empty="1"]::after { content:\'当前条件下没有卡片\'; margin-left:6px; color:#f0a6a6; font-size:12px; white-space:nowrap; }\n' +
'@media (max-width:640px) { #main .spp-cf-num { width:56px; } #main .spp-cf-sel { max-width:42vw; } }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + HIT + ' { display:none !important; }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.spp-row-start { grid-column:auto !important; }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + START + ':not(.spp-card-portrait) { grid-column:1 / span 4 !important; }\n' +
'html.' + GATE + ' #main #wall ul.stream > li.' + START + '.spp-card-portrait { grid-column:1 / span 3 !important; }\n' +
'/* SPP-CF-END */';
ensureStyle('spp-cf-style', css);
}
function mount() {
const bar = document.querySelector('#spp-btabs');
if (!bar) return false;
if (bar.querySelector('.spp-cf-panel')) return true;            
const wall = wallUl();
if (!wall || cards(wall).length < 2) return false;
ensureStyleCss();
const chip = bar.querySelector('.spp-cat-filing');
if (chip) {
lamp = chip;
lamp.classList.add('spp-cf-lamp');
lamp.title = (chip.title || '') +
' | 右边那排「条件 …」就是卡片级二次筛选(与上面的 URL 级筛选是两回事);这枚只是状态灯。';
}
panel = buildPanel();
const crumbs = bar.querySelector('#breadcrumbs');
if (crumbs) bar.insertBefore(panel, crumbs);
else if (chip && chip.parentNode && chip.parentNode.nextSibling) bar.insertBefore(panel, chip.parentNode.nextSibling);
else bar.appendChild(panel);
syncPanel();
return true;
}
let tries = 0;
onDomReady(function boot() {
if (mount() || ++tries >= 12) return;
setTimeout(boot, 200);
});
onDomReady(function () { sweep(); setTimeout(sweep, 400); setTimeout(sweep, 1200); setTimeout(sweep, 2400); });
onDomReady(function () {
const ul = wallUl();
if (!ul) return;
new MutationObserver(scheduleSweep).observe(ul,
{ childList: true, subtree: true });   
});
}
let sppBuySweep = null;
let sppFlowGoto = null;
let sppFlowPageOf = null;
let sppFlowPageUrl = null;
let sppFlowReapply = null;
let sppFlowPagesList = null;   
let sppFlowNodeOfPage = null;
let sppFlowPageOfNode = null;
function initBuyFramework() {
if (!WANTS.readOnly) return;
GM_addStyle(`
/* ===== SPP-BUY-BEGIN ===== */
html.spp-read-on h6.spp-buy {
    display:block !important;
    margin:10px 0 7px !important;
    padding:0 !important;
    border:0 !important; background:none !important;
    font-size:14px !important; font-weight:400 !important; line-height:normal !important;
    min-height:0 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__bar {
    display:flex !important; align-items:center !important; gap:14px !important; flex-wrap:wrap !important;
    background-color:#ffffff !important;
    background-image:linear-gradient(180deg,#ffffff 0%,#fbfcfe 100%) !important;
    border:1px solid #e6ebf2 !important; border-radius:12px !important;
    padding:11px 13px 11px 12px !important;
    box-shadow:0 1px 2px rgba(15,23,42,.03), 0 6px 18px -12px rgba(15,23,42,.18) !important;
}
html.spp-read-on h6.spp-buy .spp-buy__bar.is-done {
    background-color:#fbfefc !important;
    background-image:linear-gradient(180deg,#fbfefc 0%,#f6fcf9 100%) !important;
    border-color:#cfeede !important;
}
html.spp-read-on h6.spp-buy .spp-buy__seal {
    flex:0 0 auto !important; display:flex !important; flex-direction:column !important;
    align-items:center !important; justify-content:center !important;
    width:44px !important; height:44px !important; border-radius:11px !important;
    background-color:#eefaf3 !important; border:1px solid #cfeede !important; color:#1f7a55 !important;
    font-size:15px !important; font-weight:700 !important; line-height:1 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__seal.is-paid {
    background-color:#fff5e2 !important; border-color:#f3e2c2 !important; color:#a4670f !important;
}
html.spp-read-on h6.spp-buy .spp-buy__seal.is-done {
    background-color:#eefaf3 !important; border-color:#cfeede !important; color:#1f7a55 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__seal b { font-weight:700 !important; font-variant-numeric:tabular-nums !important; }
html.spp-read-on h6.spp-buy .spp-buy__seal i {
    font-style:normal !important; font-size:9px !important; letter-spacing:.5px !important;
    margin-top:2px !important; opacity:.8 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__meta { min-width:0 !important; }
html.spp-read-on h6.spp-buy .spp-buy__t1 {
    display:flex !important; align-items:center !important; gap:7px !important; flex-wrap:wrap !important;
    font-size:13.5px !important; font-weight:600 !important; color:#334155 !important; line-height:1.4 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__t2 {
    margin-top:3px !important; font-size:11.5px !important; font-weight:400 !important;
    color:#8a94a6 !important; line-height:1.4 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__num {
    color:#2f6f68 !important; font-weight:700 !important; font-variant-numeric:tabular-nums !important;
}
html.spp-read-on h6.spp-buy .spp-buy__dot {
    display:inline-block !important; width:3px !important; height:3px !important;
    border-radius:50% !important; background-color:#cfd8e3 !important;
    margin:0 7px !important; vertical-align:middle !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pill {
    font-size:10.5px !important; font-weight:600 !important; line-height:1 !important;
    padding:3px 7px !important; border-radius:999px !important;
    background-color:#eefaf3 !important; border:1px solid #cfeede !important; color:#1f7a55 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pill.is-paid {
    background-color:#fff5e2 !important; border-color:#f3e2c2 !important; color:#a4670f !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pill.is-done {
    background-color:#eefaf3 !important; border-color:#cfeede !important; color:#1f7a55 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__right {
    margin-left:auto !important; display:flex !important; align-items:center !important; gap:8px !important;
}
html.spp-read-on h6.spp-buy .spp-buy__btn {
    display:inline-flex !important; align-items:center !important; gap:7px !important;
    height:34px !important; padding:0 16px !important; box-sizing:border-box !important;
    border:1px solid transparent !important; border-radius:10px !important;
    font-family:inherit !important; font-size:13px !important; font-weight:600 !important;
    line-height:1 !important; white-space:nowrap !important;
    color:#ffffff !important; -webkit-text-fill-color:#ffffff !important;
    background-color:#2f6f68 !important;
    background-image:linear-gradient(180deg,#3f8a80,#2f6f68) !important;
    box-shadow:0 1px 2px rgba(47,111,104,.28), 0 6px 16px -10px rgba(47,111,104,.55) !important;
    cursor:pointer !important;
}
html.spp-read-on h6.spp-buy .spp-buy__btn:hover {
    background-image:linear-gradient(180deg,#46968b,#2b6660) !important;
    transition:background-image .14s ease, box-shadow .14s ease !important;
}
html.spp-read-on h6.spp-buy .spp-buy__btn:disabled { cursor:progress !important; opacity:.72 !important; }
html.spp-read-on h6.spp-buy .spp-buy__btn.is-done {
    background-color:#eefaf3 !important; background-image:none !important;
    border-color:#cfeede !important; color:#1f7a55 !important; -webkit-text-fill-color:#1f7a55 !important;
    box-shadow:none !important; cursor:default !important; opacity:1 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__btn.is-fail {
    background-color:#fdf0ee !important; background-image:none !important;
    border-color:#f3d4cf !important; color:#b23a2c !important; -webkit-text-fill-color:#b23a2c !important;
    box-shadow:none !important; opacity:1 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__cf { display:none !important; }
html.spp-read-on h6.spp-buy .spp-buy__cf.is-on {
    display:flex !important; flex:1 1 100% !important; align-items:center !important;
    gap:10px !important; flex-wrap:wrap !important;
    margin-top:9px !important; padding:9px 12px !important; box-sizing:border-box !important;
    background-color:#fffaeb !important; border:1px solid #f4e4bb !important; border-radius:10px !important;
    color:#8a6512 !important; font-size:12.5px !important; font-weight:400 !important; line-height:1.5 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__cf b {
    display:inline-block !important; background-color:#ffffff !important;
    border:1px solid #f3e2c2 !important; color:#a4670f !important;
    border-radius:999px !important; padding:1px 8px !important;
    font-weight:700 !important; font-variant-numeric:tabular-nums !important;
}
html.spp-read-on h6.spp-buy .spp-buy__yes,
html.spp-read-on h6.spp-buy .spp-buy__no {
    height:30px !important; padding:0 14px !important; box-sizing:border-box !important;
    border-radius:9px !important; font-family:inherit !important; font-size:12.5px !important;
    font-weight:600 !important; line-height:1 !important; cursor:pointer !important;
    border:1px solid #e6ebf2 !important; background-color:#ffffff !important; background-image:none !important;
    color:#334155 !important; -webkit-text-fill-color:#334155 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__yes {
    margin-left:auto !important; border-color:transparent !important;
    background-color:#b23a2c !important;
    background-image:linear-gradient(180deg,#d9705f,#b23a2c) !important;
    color:#ffffff !important; -webkit-text-fill-color:#ffffff !important;
}
html.spp-read-on h6.spp-buy .spp-buy__fallback {
    flex:1 1 100% !important; margin-top:5px !important;
    font-size:11px !important; color:#8a94a6 !important; text-decoration:underline !important;
    text-underline-offset:2px !important;
}
html.spp-read-on blockquote.spp-buy__warn {
    display:flex !important; align-items:flex-start !important; gap:8px !important;
    margin:0 2px 7px !important; padding:7px 11px 7px 10px !important; box-sizing:border-box !important;
    background-color:#fffaeb !important; background-image:none !important;
    border:1px solid #f4e4bb !important; border-left:3px solid #e8c469 !important;
    border-radius:8px !important;
    color:#8a6512 !important; font-size:11.5px !important; font-weight:400 !important; line-height:1.55 !important;
}
html.spp-read-on blockquote.spp-buy__warn b { font-weight:400 !important; }
html.spp-read-on blockquote.spp-buy__warn::before {
    content:"⚠" !important; flex:0 0 auto !important; font-size:12px !important; line-height:1.45 !important;
}

html.spp-read-on blockquote.spp-buy__body {
    box-sizing:border-box !important;
    margin:0 0 10px !important;
    background-color:#fbfefc !important; background-image:none !important;
    border:1px solid #d9ece2 !important;
    border-left:3px solid #8ccfae !important;
    border-radius:12px !important;
    padding:11px 14px 12px !important;
}
html.spp-read-on.spp-lift-on blockquote.spp-buy__body {
    color:#3f4a5a !important;
    font-family:inherit !important;
    font-size:13px !important;
    line-height:1.75 !important;
}
html.spp-read-on.spp-lift-on blockquote.spp-buy__body a { color:#0a6ea8 !important; }

html.spp-read-on h6.spp-buy .spp-buy__bar.is-pass {
    height:40px !important;
    padding:0 13px 0 11px !important;
    gap:10px !important;
    flex-wrap:nowrap !important;
    border-color:#d9ece2 !important;
    border-left:3px solid #8ccfae !important;
    border-radius:10px !important;
    background-color:#fbfefc !important;
    background-image:linear-gradient(180deg,#fbfefc 0%,#f3faf6 100%) !important;
    box-shadow:0 1px 2px rgba(15,23,42,.03) !important;
}
html.spp-read-on h6.spp-buy .spp-buy__bar.is-pass.is-fail {
    height:auto !important; min-height:40px !important;
    padding:8px 13px 8px 11px !important; flex-wrap:wrap !important;
    border-color:#f3d4cf !important; border-left-color:#e0a79c !important;
    background-image:linear-gradient(180deg,#fefbfa 0%,#fdf4f2 100%) !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pic {
    flex:0 0 auto !important;
    width:20px !important; height:20px !important; border-radius:50% !important;
    display:inline-flex !important; align-items:center !important; justify-content:center !important;
    background-color:#e3f5eb !important; border:1px solid #c6e8d6 !important;
    color:#1f7a55 !important; -webkit-text-fill-color:#1f7a55 !important;
    font-size:11px !important; font-weight:700 !important; line-height:1 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pic.is-busy {
    background-color:#f1f4f8 !important; border-color:#e3e8ef !important;
    color:#93a1b5 !important; -webkit-text-fill-color:#93a1b5 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pic.is-fail {
    background-color:#fdf0ee !important; border-color:#f3d4cf !important;
    color:#b23a2c !important; -webkit-text-fill-color:#b23a2c !important;
}
html.spp-read-on h6.spp-buy .spp-buy__tt {
    font-size:13px !important; font-weight:600 !important; color:#334155 !important;
    -webkit-text-fill-color:#334155 !important; line-height:1 !important; white-space:nowrap !important;
}
html.spp-read-on h6.spp-buy .spp-buy__facts {
    margin-left:auto !important;
    font-size:11.5px !important; font-weight:400 !important; color:#8a94a6 !important;
    -webkit-text-fill-color:#8a94a6 !important; line-height:1.4 !important; white-space:nowrap !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pill.is-busy {
    background-color:#f1f4f8 !important; border-color:#e3e8ef !important; color:#7c8ba1 !important;
}
html.spp-read-on h6.spp-buy .spp-buy__pill.is-fail {
    background-color:#fdf0ee !important; border-color:#f3d4cf !important; color:#b23a2c !important;
}
html.spp-read-on h6.spp-buy .spp-buy__bar.is-pass .spp-buy__fallback { color:#b23a2c !important; }
/* ===== SPP-BUY-END ===== */
`);
function stillBuyable(html, pid) {
if (!pid) return /action=buytopic/i.test(html);
const re = /action=buytopic[^"'\s<>]*/gi;
let m, any = false, mine = false;
while ((m = re.exec(html))) {
any = true;
const q = /[?&](?:amp;)?pid=(\d+)/.exec(m[0]);
if (q && q[1] === String(pid)) mine = true;
}
if (!any) return false;
return mine;
}
function buyPageHasPid(html, pid) {
if (!pid) return true;
return new RegExp('id="(?:read|td)_' + pid + '"').test(html);
}
function buyPageCandidates(host, pid) {
const list = [];
const push = function (u) { if (u && list.indexOf(u) < 0) list.push(u); };
let own = null;
try {
const row = host && host.closest ? (host.closest('div.t5.t2') || host.closest('div.t5')) : null;
const no = row ? row.getAttribute('data-spp-nest-no') : null;
if (no !== null && no !== '' && typeof sppFlowPageOf === 'function' &&
typeof sppFlowPageUrl === 'function') {
const pg = sppFlowPageOf(parseInt(no, 10));
if (pg) own = sppFlowPageUrl(pg);
}
} catch (e) { own = null; }
push(own || location.href.split('#')[0]);
if (pid && typeof sppFlowPageUrl === 'function') {
for (let k = 1; k <= 30; k++) push(sppFlowPageUrl(k));
}
return list;
}
function fetchBuyPage(host, pid) {
const urls = buyPageCandidates(host, pid);
let i = 0;
function step() {
if (i >= urls.length) return Promise.resolve(null);
const u = urls[i++];
return fetch(u, { credentials: 'include', cache: 'no-store' })
.then(function (r) { return r.text(); })
.then(function (h) { return buyPageHasPid(h, pid) ? h : step(); })
.catch(function () { return step(); });
}
return step();
}
function buildBlock(h6, host, txt, nth) {
const pm = /售价\s*([\d,]+)\s*SP币/.exec(txt);
if (!pm) return;
const price = parseInt(pm[1].replace(/,/g, ''), 10);
if (!isFinite(price)) return;
const bm = /已有\s*([\d,]+)\s*人购买/.exec(txt);
let buyers = bm ? parseInt(bm[1].replace(/,/g, ''), 10) : 0;
if (!isFinite(buyers)) buyers = 0;
const isFree = price === 0;
const rawCtl = h6.querySelector(
'input[onclick*="buytopic"], a[onclick*="buytopic"], a[href*="buytopic"]');
const bought = !rawCtl;
let buyUrl = null;
if (rawCtl) {
const oc = rawCtl.getAttribute('onclick') || '';
const hf = rawCtl.getAttribute('href') || '';
const um = /location\.href\s*=\s*['"]([^'"]+)['"]/.exec(oc) ||
(/buytopic/.test(hf) ? [null, hf] : null);
if (um) { try { buyUrl = new URL(um[1], location.href).href; } catch (e) { buyUrl = null; } }
if (!buyUrl) return;
}
const hm = /^read_(\d+)$/.exec(host.id);
const qm = buyUrl ? /[?&]pid=(\d+)/.exec(buyUrl) : null;
const pid = hm ? hm[1] : (qm ? qm[1] : null);
h6.classList.add('spp-buy');
while (h6.firstChild) h6.removeChild(h6.firstChild);
const bar = document.createElement('div');
bar.className = 'spp-buy__bar';
bar.innerHTML =
'<div class="spp-buy__seal' + (isFree ? ' is-free' : ' is-paid') + '">' +
'<b>' + (isFree ? '免费' : price) + '</b><i>SP</i>' +
'</div>' +
'<div class="spp-buy__meta">' +
'<div class="spp-buy__t1">售价 <b class="spp-buy__num">' + price + '</b> SP币' +
'<span class="spp-buy__pill' + (isFree ? ' is-free' : ' is-paid') + '">' +
(isFree ? '免费帖' : '需付费') + '</span>' +
'</div>' +
'<div class="spp-buy__t2">已有 <b class="spp-buy__num spp-buy__cnt">' +
buyers.toLocaleString() + '</b> 人购买</div>' +
'</div>' +
'<div class="spp-buy__right">' +
'<button type="button" class="spp-buy__btn">愿意购买,我买,我付钱</button>' +
'</div>' +
'<div class="spp-buy__cf">' +
'<span>确认花费 <b>' + price + ' SP币</b> 购买本帖?</span>' +
'<button type="button" class="spp-buy__no">取消</button>' +
'<button type="button" class="spp-buy__yes">确认购买</button>' +
'</div>';
h6.appendChild(bar);
const btn = bar.querySelector('.spp-buy__btn');
const cf = bar.querySelector('.spp-buy__cf');
let busy = false;
let done = false;
let usePass = false;
function passHtml(state) {
const ok = state === 'done';
const bad = state === 'fail';
return '<span class="spp-buy__pic' + (ok ? '' : bad ? ' is-fail' : ' is-busy') + '">' +
(ok ? '✓' : bad ? '!' : '⋯') + '</span>' +
'<span class="spp-buy__tt">' + (ok ? '已购买' : bad ? '购买失败' : '购买中…') + '</span>' +
'<span class="spp-buy__pill ' + (ok ? 'is-done' : bad ? 'is-fail' : 'is-busy') + '">' +
(ok ? '已解锁' : bad ? '点我重试' : '请稍候') + '</span>' +
'<span class="spp-buy__facts">售价 <b class="spp-buy__num">' + price + '</b> SP币' +
'<i class="spp-buy__dot"></i>已有 <b class="spp-buy__num">' +
buyers.toLocaleString() + '</b> 人购买</span>';
}
function paintDone(state) {
busy = false; done = true;
usePass = true;
bar.className = 'spp-buy__bar is-pass';
bar.innerHTML = passHtml('done');
try { bar.setAttribute('data-spp-buy', state); } catch (e) {}
}
function setDone() { buyers++; paintDone('done'); }
function setFail() {
busy = false;
if (usePass) {
bar.className = 'spp-buy__bar is-pass is-fail';
bar.innerHTML = passHtml('fail') +
(buyUrl ? '<a class="spp-buy__fallback" href="' + buyUrl +
'">或改用站点原路购买(会跳转页面)</a>' : '');
bar.addEventListener('click', function () {
if (bar.getAttribute('data-spp-buy') === 'fail') doBuy();
});
try { bar.setAttribute('data-spp-buy', 'fail'); } catch (e) {}
return;
}
btn.disabled = false;
btn.className = 'spp-buy__btn is-fail';
btn.textContent = '购买失败,点我重试';
try { bar.setAttribute('data-spp-buy', 'fail'); } catch (e) {}
if (buyUrl && !bar.querySelector('.spp-buy__fallback')) {
const a = document.createElement('a');
a.className = 'spp-buy__fallback';
a.href = buyUrl;
a.textContent = '或改用站点原路购买(会跳转页面)';
bar.appendChild(a);
}
}
function doBuy() {
if (done || busy) return;
if (!buyUrl) { setFail(); return; }
busy = true;
cf.classList.remove('is-on');
btn.disabled = true;
btn.className = 'spp-buy__btn';
btn.textContent = '购买中…';
try { bar.setAttribute('data-spp-buy', 'busy'); } catch (e) {}
const RETRY = [600, 1400];
function verify(step) {
return fetchBuyPage(host, pid)
.then(function (html) {
if (html === null) { setFail(); return; }
if (!stillBuyable(html, pid)) {
setDone();
revealContent(html);
return;
}
if (step >= RETRY.length) { setFail(); return; }
return new Promise(function (res) { setTimeout(res, RETRY[step]); })
.then(function () { return verify(step + 1); });
})
.catch(function () { setFail(); });
}
fetch(buyUrl, { credentials: 'include', cache: 'no-store' })
.then(function () { return verify(0); })
.catch(function () { setFail(); });
}
function revealContent(html) {
let fresh = null;
try {
fresh = new DOMParser().parseFromString(html, 'text/html').getElementById(host.id);
} catch (e) { fresh = null; }
const freshH6 = fresh ? fresh.querySelector('h6') : null;
if (!fresh || !freshH6) return;
const fm = /已有\s*([\d,]+)\s*人购买/.exec(freshH6.textContent || '');
const fb = fm ? parseInt(fm[1].replace(/,/g, ''), 10) : NaN;
if (isFinite(fb) && fb > buyers) { buyers = fb; paintDone('done'); }
const pure = Array.prototype.every.call(host.children, function (c) {
return c === h6 || c.tagName === 'BLOCKQUOTE';
});
if (!pure) {
let nb = freshH6.nextElementSibling;
while (nb && nb.tagName !== 'BLOCKQUOTE') nb = nb.nextElementSibling;
if (nb) {
let ob = h6.nextElementSibling;
while (ob && ob.tagName !== 'BLOCKQUOTE') ob = ob.nextElementSibling;
if (ob && ob.parentElement === host) ob.replaceWith(nb);
else host.insertBefore(nb, h6.nextSibling);
}
claimBody();
return;
}
let slot = freshH6;
for (let up = 0; up < 3; up++) {
const p = slot.parentElement;
if (!p || p === fresh) break;
if (!/^(b|span|font|i|u|em|strong)$/.test(p.tagName.toLowerCase())) break;
if ((p.textContent || '').replace(/\s+/g, '') !==
(slot.textContent || '').replace(/\s+/g, '')) break;
slot = p;
}
slot.replaceWith(h6);
const kids = Array.prototype.slice.call(fresh.childNodes);
while (host.firstChild) host.removeChild(host.firstChild);
for (let i = 0; i < kids.length; i++) host.appendChild(kids[i]);
claimBody();
}
let sib = h6.nextElementSibling;
for (let k = 0; k < 2 && sib; k++, sib = sib.nextElementSibling) {
if (sib.tagName !== 'BLOCKQUOTE') continue;
const wt = sib.textContent || '';
if (wt.indexOf('举报') >= 0 && wt.indexOf('封掉ID') >= 0) {
sib.classList.add('spp-buy__warn');
break;
}
}
function claimBody() {
let fb = h6.nextElementSibling;
for (let k = 0; k < 3 && fb; k++, fb = fb.nextElementSibling) {
if (fb.tagName !== 'BLOCKQUOTE') continue;
const ft = (fb.textContent || '').replace(/\s+/g, '');
if (!ft) continue;
if (ft.indexOf('举报') >= 0 && ft.indexOf('封掉ID') >= 0) continue;
fb.classList.add('spp-buy__body');
return;
}
}
if (bought) claimBody();
if (bought) { paintDone('bought'); return; }
btn.addEventListener('click', function () {
if (done || busy) return;
if (isFree) { doBuy(); return; }
cf.classList.add('is-on');              
});
bar.querySelector('.spp-buy__yes').addEventListener('click', function () { doBuy(); });
bar.querySelector('.spp-buy__no').addEventListener('click', function () {
cf.classList.remove('is-on');
btn.focus();
});
if (isFree && SPP_CONFIG.bool('spp_autobuy_free', true)) {
usePass = true;
bar.className = 'spp-buy__bar is-pass is-busy';
bar.innerHTML = passHtml('busy');
setTimeout(function () { doBuy(); }, 600 + nth * 400);
}
}
const buySweep = function () {
if (SPP_CONFIG.bool('spp_buy_lift', true)) {
document.documentElement.classList.add('spp-lift-on');
}
const blocks = [];
const allH6 = document.querySelectorAll('h6');
for (let i = 0; i < allH6.length; i++) {
const t = (allH6[i].textContent || '').replace(/\s+/g, ' ');
if (!/售价\s*[\d,]+\s*SP币/.test(t)) continue;
if (allH6[i].querySelector('.spp-buy__bar')) continue;
let n = allH6[i].parentElement, hp = null;
for (let up = 0; n && up < 12; up++, n = n.parentElement) {
if (n.id && n.id.indexOf('read_') === 0) { hp = n; break; }
}
if (!hp) continue;
blocks.push({ h6: allH6[i], host: hp, txt: t });
}
for (let i = 0; i < blocks.length; i++) {
buildBlock(blocks[i].h6, blocks[i].host, blocks[i].txt, i);
}
};
onDomReady(buySweep);
sppBuySweep = buySweep;
}
function initAttachRestore() {
if (!WANTS.readOnly) return;
sppFloorMarks();                     
if (!SPP_CONFIG.bool('spp_att_inline', true)) return;
const m = /[?&]tid[=-](\d+)/.exec(location.href);
const tid = m ? m[1] : '';
if (!tid) return;
const DONE = 'data-spp-att-done';
const GAP = 60;             
let queue = [];
let busy = false;
let timer = null;
function pump() {
if (busy) return;
if (!queue.length) return;
busy = true;
const el = queue.shift();
const aid = el.id.slice(4);
const url = 'job.php?action=download&aid=' + aid + '&tid=' + tid;
fetch(url, { method: 'HEAD', credentials: 'include' }).then(function (res) {
const ct = res && res.headers ? (res.headers.get('content-type') || '') : '';
if (res && res.ok !== false && ct.indexOf('image/') === 0) {
const img = document.createElement('img');
img.src = url;
img.loading = 'lazy';
img.alt = '';
img.className = 'spp-att-img';
el.appendChild(img);
}
}).catch(function () {
}).then(function () {
busy = false;
if (!queue.length) sppFloorMarks();   
timer = setTimeout(pump, GAP);
});
}
function sweep() {
const nodes = document.querySelectorAll('#main [id^="att_"]');
for (let i = 0; i < nodes.length; i++) {
const el = nodes[i];
if (el.id === 'att_mode') continue;
const aid = el.id.slice(4);
if (!/^\d+$/.test(aid)) continue;
if (el.getAttribute(DONE) === '1') continue;   
if (el.querySelector('img')) continue;
el.setAttribute(DONE, '1');                    
queue.push(el);
}
pump();
}
function kick() {
if (timer) clearTimeout(timer);
timer = setTimeout(sweep, 300);                    
}
onDomReady(sweep);
setTimeout(sweep, 1500);                               
onDomReady(function () {
const target = document.getElementById('main') || document.body;
new MutationObserver(kick).observe(target, { childList: true, subtree: true });
});
}
function initAvatarRatio() {
if (!WANTS.readOnly) return;
var UP = 1.35;
function judge(img) {
var w = img.naturalWidth, h = img.naturalHeight;
if (!w || !h) { img.classList.remove('spp-ava-crop'); return; }
var r = h / w;
img.classList.toggle('spp-ava-crop', r > UP);
}
function scan() {
document.querySelectorAll('.t5.t2 .r_two .user-pic img:not(.spp-ava-off)').forEach(function (img) {
if (!img.dataset.sppAvaRatio) {
img.dataset.sppAvaRatio = '1';
img.addEventListener('load', function () { judge(img); });
img.addEventListener('error', function () { img.classList.remove('spp-ava-crop'); });
}
if (img.complete) judge(img);
});
}
onDomReady(function () { setTimeout(scan, 600); setTimeout(scan, 2600); });
var tick = false;
window.addEventListener('scroll', function () {
if (tick) return;
tick = true;
requestAnimationFrame(function () { tick = false; scan(); });
}, { passive: true });
}
function initFloorTopBar() {
if (!WANTS.readOnly) return;
GM_addStyle(`
html.spp-read-on div[id^="read_"].spp-fs-small  { font-size: 12px !important; }
html.spp-read-on div[id^="read_"].spp-fs-middle { font-size: 14px !important; }
html.spp-read-on div[id^="read_"].spp-fs-big    { font-size: 18px !important; }
/* ===== SPP-FLOORTOP-END ===== */
        `);
const FONT_KEY = 'spp_font_size';
const FONT_DEF = 14, FONT_MIN = 12, FONT_MAX = 18;
const FS = [['spp-fs-small', 12], ['spp-fs-middle', 14], ['spp-fs-big', 18]];
const CLASSES = FS.map(p => p[0]);
function applyFontSize() {
const v = SPP_CONFIG.num(FONT_KEY, FONT_DEF, FONT_MIN, FONT_MAX);
const pick = FS.reduce((best, p) => Math.abs(p[1] - v) < Math.abs(best[1] - v) ? p : best, FS[1]);
const SITE = { 12: 'small', 14: 'middle', 18: 'big' };
const siteCls = SITE[pick[1]];
const nodes = document.querySelectorAll('div[id^="read_"]');
for (let i = 0; i < nodes.length; i++) {
const el = nodes[i];
if (el.classList.contains(pick[0]) && (!siteCls || el.classList.contains(siteCls))) continue;
CLASSES.forEach(c => el.classList.remove(c));
el.classList.add(pick[0]);
if (siteCls) el.classList.add(siteCls);
}
}
function pruneTools() {
function dropBtn(bar, sel) {
const btns = bar.querySelectorAll(sel);
for (let i = 0; i < btns.length; i++) {
const a = btns[i].parentElement;
btns[i].remove();
if (a && a !== bar && a.tagName === 'SPAN' &&
!(a.textContent || '').trim() && !a.querySelector('input, a, img, select, button')) {
a.remove();
}
}
}
const tops = document.querySelectorAll('.tiptop');
for (let t = 0; t < tops.length; t++) {
const bar = tops[t];
dropBtn(bar, 'a[onclick^="fontsize("]');
dropBtn(bar, 'a[title="顶端"]');
const seps = bar.querySelectorAll('.spp-tp-sep');
for (let i = seps.length - 1; i >= 0; i--) {
const s = seps[i];
const prev = s.previousElementSibling;
if (prev && prev.classList && prev.classList.contains('spp-tp-sep')) { s.remove(); continue; }
if (!prev) s.remove();
}
}
}
onDomReady(() => { applyFontSize(); pruneTools(); });
setTimeout(() => { applyFontSize(); pruneTools(); }, 900);
let tick = false;
onDomReady(() => {
const target = document.getElementById('main') || document.body;
if (!target) return;
new MutationObserver(() => {
if (tick) return;
tick = true;
setTimeout(() => { tick = false; applyFontSize(); pruneTools(); }, 400);
}).observe(target, { childList: true, subtree: true });
});
}
function initReadFlow() {
if (!WANTS.readOnly) return;
const EDGE = '1px solid var(--spp-flow-edge, #eaeff7)', HAIR = '1px solid var(--spp-flow-hair, #f1f5fa)';
function tag() {
const rows = document.querySelectorAll('#main > form > .t5.t2');
if (!rows.length) return;
rows[0].parentElement.classList.add('spp-flow');
for (let i = 0; i < rows.length; i++) {
const r = rows[i], first = i === 0, last = i === rows.length - 1;
r.classList.add('spp-flow-row');
r.classList.toggle('spp-flow-start', first);
r.classList.toggle('spp-flow-end', last);
r.style.setProperty('margin', '0', 'important');
r.style.setProperty('position', 'relative', 'important');
r.style.setProperty('box-shadow', 'none', 'important');
r.style.setProperty('transform', 'none', 'important');
r.style.setProperty('border-top', first ? EDGE : '0', 'important');
r.style.setProperty('border-bottom', last ? EDGE : HAIR, 'important');
r.style.setProperty('border-left', EDGE, 'important');
r.style.setProperty('border-right', EDGE, 'important');
r.style.setProperty('border-radius', first ? 'var(--spp-flow-r-top, 17px 17px 0 0)' : (last ? 'var(--spp-flow-r-bot, 0 0 17px 17px)' : '0'), 'important');
r.style.setProperty('background-color', 'var(--spp-flow-bg, #fff)', 'important');
r.style.setProperty('background-image', 'var(--spp-flow-bgi, none)', 'important');
}
}
onDomReady(() => { tag(); setTimeout(tag, 600); });
onDomReady(() => {
const target = document.getElementById('main') || document.body;
let timer = 0;
new MutationObserver(() => {
clearTimeout(timer);
timer = setTimeout(tag, 150);
}).observe(target, { childList: true, subtree: true });
});
}
const CSS_FLOOR_HOVER = `
html.spp-fh-off.spp-fh-off #main .t tr:hover,
html.spp-fh-off.spp-fh-off #main .t tr:hover > td,
html.spp-fh-off.spp-fh-off #main .t tr:hover > th,
html.spp-fh-off.spp-fh-off #main .t5 tr:hover > td,
html.spp-fh-off.spp-fh-off #main .t5 tr:hover > th,
html.spp-fh-off.spp-fh-off #main .t5:not(.spp-t5bar) tr:hover > td {
    background:transparent !important;
    background-image:none !important;
}
html.spp-fh-off.spp-fh-off #main > form.spp-flow > .t5.t2.spp-flow-row:hover::after {
    content:none !important;
}
`;
function initFloorHoverSwitch() {
ensureStyle('spp-fh-style', CSS_FLOOR_HOVER);
if (SPP_CONFIG.bool('spp_floor_hover', false)) return;   
document.documentElement.classList.add('spp-fh-off');
}
const SPP_NEST_DEPTH_MAX = 4;
const SPP_NEST_STORE = 'spp_nest_fold';  
const CSS_NEST = `
/* ===== SPP-NEST-BEGIN ===== */
html.spp-nest-on .spp-nest-row {
    position: relative;
    --spp-nest-step: 32px;
    --spp-nest-line: #dfe4ee;
    --spp-nest-rail: #c8ccd1;
    --spp-nest-acc: var(--spu-accent, #2f8f7e);
    --spp-nest-acc-deep: var(--spu-accent-dim, #22705f);
    --spp-nest-head-fg: var(--spu-text, #1f2937);
    --spp-nest-head-dim: var(--spu-secondary, #8a93a3);
    --spp-nest-mark-bg: #ffffff;
    --spp-nest-gap: 16px;
}
html.spp-nest-on.spp-rdark .spp-nest-row {
    --spp-nest-line: rgba(255,255,255,.13);
    --spp-nest-rail: #ffffff;
    --spp-nest-head-fg: var(--spp-rk-text, #f5f5f7);
    --spp-nest-head-dim: var(--spu-secondary, #b6c3d6);
    --spp-nest-mark-bg: rgba(255,255,255,.06);
}
html.spp-nest-on .spp-nest-row { padding-left: calc(var(--spp-nest-step) * var(--spp-nest-d, 0)) !important; }
/* 行的 1px 下边框是「边框区」,行又只让子元素画到内边距盒为止 ⇒ 竖线到行底就断一层(见 paintNestRails 里的 SPP_NEST_SEAM)。
   把裁切放宽 5px:裁切本身还在(宽图照样被裁),竖线却能越过那条缝连上。
   带上 :not(:hover):悬停时要让位给下面那条下拉菜单的 overflow:visible(否则菜单又被剪回一条边)。 */
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row:not(:hover) {
    overflow: clip !important; overflow-clip-margin: 5px !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-rail {
    position: absolute; bottom: 0; width: 2px; margin-left: -1px; z-index: 2; pointer-events: none;
    background: var(--spp-nest-rail, #d9d9d9) !important;
}
/* 折叠按钮所在的那一条竖线:在按钮上下各让出一点 ⇒ 线—按钮—线(两个 --spp-nest-cut-* 由 JS 按同一组常量写入) */
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-rail[data-spp-nest-cut] {
    background: linear-gradient(180deg,
        var(--spp-nest-rail, #d9d9d9) 0 var(--spp-nest-cut-a, 17px),
        transparent var(--spp-nest-cut-a, 17px) var(--spp-nest-cut-b, 39px),
        var(--spp-nest-rail, #d9d9d9) var(--spp-nest-cut-b, 39px) 100%) !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-elbow {
    position: absolute; box-sizing: border-box; pointer-events: none; z-index: 2; margin-left: -1px;
    border-left: 2px solid var(--spp-nest-rail, #d9d9d9) !important;
    border-bottom: 2px solid var(--spp-nest-rail, #d9d9d9) !important;
    border-bottom-left-radius: 12px;
    background: transparent !important;
}
html.spp-nest-on .spp-nest-gutter {
    position: absolute; top: 7px; left: 10px; width: 18px; height: 18px;
    pointer-events: none; z-index: 3;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-gutter .spp-nest-fold {
    display: block; box-sizing: border-box; width: 18px; height: 18px; border-radius: 50%;
    margin: 0; padding: 0; position: relative;
    background: var(--spp-nest-mark-bg) !important;
    border: 1px solid transparent; border-color: var(--spp-nest-acc) !important;
    cursor: pointer; pointer-events: auto; user-select: none;
    transition: border-color .12s ease, box-shadow .12s ease;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-gutter .spp-nest-fold::after {
    content: ''; position: absolute; left: 50%; top: 50%; width: 9px; height: 2px;
    margin: -1px 0 0 -4.5px; border-radius: 1px; background: var(--spp-nest-acc);
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-gutter .spp-nest-fold::before {
    content: ''; position: absolute; left: 50%; top: 50%; width: 2px; height: 9px;
    margin: -4.5px 0 0 -1px; border-radius: 1px; background: var(--spp-nest-acc);
    transform: scaleY(0); transition: transform .12s ease;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-gutter .spp-nest-fold[data-spp-nest-mark="plus"]::before {
    transform: scaleY(1);
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row.spp-nest-folded > .spp-nest-gutter .spp-nest-fold,
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row.spp-nest-d4 > .spp-nest-gutter .spp-nest-fold {
    border-color: var(--spp-nest-acc-deep) !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row.spp-nest-folded > .spp-nest-gutter .spp-nest-fold::after,
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row.spp-nest-folded > .spp-nest-gutter .spp-nest-fold::before,
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row.spp-nest-d4 > .spp-nest-gutter .spp-nest-fold::after,
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row.spp-nest-d4 > .spp-nest-gutter .spp-nest-fold::before {
    background: var(--spp-nest-acc-deep);
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-gutter .spp-nest-fold:hover {
    box-shadow: 0 0 0 3px rgba(127,127,127,.16) !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row > .spp-nest-gutter .spp-nest-fold:focus-visible {
    outline: 2px solid var(--spp-nest-acc) !important; outline-offset: 1px !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head {
    display: flex; align-items: center; gap: 6px; min-height: 30px; padding: 2px 8px;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > span.fl {
    color: var(--spp-nest-head-fg) !important;
    -webkit-text-fill-color: var(--spp-nest-head-fg) !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > span.fl > a {
    display: inline-block; padding: 0 7px; border-radius: 999px;
    background: transparent !important;
    border: 1px solid transparent; border-color: var(--spp-nest-line) !important;
    color: var(--spp-nest-head-fg) !important;
    -webkit-text-fill-color: var(--spp-nest-head-fg) !important;
    font-weight: 600; text-decoration: none;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > span.fl.gray {
    color: var(--spp-nest-head-dim) !important;
    -webkit-text-fill-color: var(--spp-nest-head-dim) !important;
    font-size: 11px;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > span.fl.gray::before {
    content: ''; display: inline-block; width: 3px; height: 3px; border-radius: 50%;
    background: var(--spp-nest-head-dim); vertical-align: middle; margin: 0 6px 2px 2px;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > .spp-nest-up {
    display: inline-block; font-style: normal; font-size: 11px; line-height: 16px;
    padding: 0 7px; border-radius: 999px; white-space: nowrap; cursor: default;
    background: transparent !important;
    border: 1px dashed transparent; border-color: var(--spp-nest-line) !important;
    color: var(--spp-nest-head-dim) !important;
    -webkit-text-fill-color: var(--spp-nest-head-dim) !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > .spp-nest-up[data-spp-goto-page] {
    cursor: pointer !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > .spp-nest-up[data-spp-goto-page]:hover {
    border-color: var(--spp-nest-acc) !important;
    color: var(--spp-nest-head-fg) !important; -webkit-text-fill-color: var(--spp-nest-head-fg) !important;
}
html.spp-nest-on.spp-nest-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-nest-row .tiptop.spp-nest-head > .spp-nest-up[data-spp-goto-page]:focus-visible {
    outline: 2px solid var(--spp-nest-acc) !important; outline-offset: 1px !important;
}
/* 父楼已在树里的行:「↑ 楼 N」这枚补位标记被缩进 + 子树竖线取代 ⇒ 藏掉;父楼在别的页/未加载的行照旧显示
   (那时它是唯一的线索,且带跳页能力)。 */
html.spp-nest-on .spp-nest-row:not(.spp-nest-root) .spp-nest-up { display: none !important; }
html.spp-nest-on .spp-nest-row.spp-nest-root:not(.spp-flow-start) { margin-top: var(--spp-nest-gap); }
html.spp-nest-on .spp-nest-row.spp-nest-hid { display: none !important; }
/* ===== SPP-NEST-END ===== */
`;
function initNestTree() {
if (!WANTS.readOnly) return;
if (!SPP_CONFIG.bool('spp_nest_on', true)) return;   
ensureStyle('spp-nest-style', CSS_NEST);             
document.documentElement.classList.add('spp-nest-on');
const foldKey = SPP_NEST_STORE + ':' + (function () {
const m = String(location.search).match(/tid-(\d+)/) || String(location.href).match(/tid-(\d+)/);
return m ? m[1] : '';
})();
let folded = readFold();
let stamp = '';      
let timer = 0;
function readFold() {
try { const raw = sessionStorage.getItem(foldKey) || ''; return raw ? raw.split(',') : []; }
catch (e) { return []; }
}
function writeFold() {
try { sessionStorage.setItem(foldKey, folded.join(',')); } catch (e) {  }
}
function noOf(row) {
const q = row.querySelector('a[href*=action-quote]');
const m = q ? String(q.getAttribute('href') || '').match(/-article-(\d+)/) : null;
if (m) return parseInt(m[1], 10);
const tip = row.querySelector('.tiptop');
const t = tip ? (tip.textContent || '').replace(/\s+/g, ' ') : '';
const g = t.match(/(?:^|\s)(GF|B(\d+)F)(?:\s|$)/);
if (!g) return null;
return g[1] === 'GF' ? 0 : parseInt(g[2], 10);
}
const REF = /引用\s*(?:楼主|第\s*(\d+)\s*楼|(\d+)\s*楼)/;
const SUBJ = /(?:回|回复|引用第?)\s*(?:楼主|(\d+)\s*楼)/;
function upOf(row) {
const body = row.querySelector('.tpc_content');
const bq = body ? body.querySelector('blockquote.blockquote3') : null;
if (bq) {
const txt = (bq.textContent || '').replace(/\u00a0/g, ' ');
const head = txt.split(/发表的|于\s*\d{4}-/)[0] || txt.slice(0, 40);
const m = head.match(REF);
if (m) {
if (m[1]) return parseInt(m[1], 10);
if (m[2]) return parseInt(m[2], 10);
return 0;
}
}
const h1 = row.querySelector('h1[id^="subject_"]');
if (!h1) return null;
const st = (h1.textContent || '').replace(/\u00a0/g, ' ');
const sm = st.match(SUBJ);
if (!sm) return null;
if (sm[1]) return parseInt(sm[1], 10);
return 0;
}
function mark() {
const rows = document.querySelectorAll('#main > form > .t5.t2');   
if (!rows.length) return;
const list = Array.prototype.slice.call(rows);
const sig = list.map(function (r) { return (r.querySelector('[id^=td_]') || {}).id || '?'; }).join(',') +
'|' + list.length + '|' + (list[0].classList.contains('spp-nest-row') ? '1' : '0');
if (sig === stamp) return;
const no = [], has = {}, up = {}, kids = {}, upNo = {}, upPage = {};
for (let i = 0; i < list.length; i++) {
const n = noOf(list[i]);
no.push(n);
if (n !== null) has[n] = 1;
}
for (let i = 0; i < list.length; i++) {
const n = no[i];
if (n === null) continue;
const p = upOf(list[i]);
if (p !== null && has[p] && p < n) { up[n] = p; kids[p] = (kids[p] || 0) + 1; upNo[n] = p; upPage[n] = ''; }
else if (p !== null && p < n && SPP_CONFIG.num('spp_preload_pages', 5, 1, 30) > 1 && typeof sppFlowPageOf === 'function') {
const pg = sppFlowPageOf(p);
up[n] = null; upNo[n] = p; upPage[n] = pg || '';
}
else { up[n] = null; upNo[n] = null; upPage[n] = ''; }
}
const memo = {};
const depth = function (n) {
if (n in memo) return memo[n];
const p = up[n];
let d = (p === null || p === undefined) ? 0 : depth(p) + 1;
if (d > SPP_NEST_DEPTH_MAX) d = SPP_NEST_DEPTH_MAX;
memo[n] = d;
return d;
};
const anc = function (n) {
const out = [];
let p = up[n];
while (p !== null && p !== undefined && out.length < 64) { out.push(p); p = up[p]; }
return out;
};
for (let i = 0; i < list.length; i++) {
const r = list[i], n = no[i];
if (n === null) continue;
const d = depth(n);
r.classList.add('spp-nest-row');
for (let k = 0; k <= SPP_NEST_DEPTH_MAX; k++) r.classList.toggle('spp-nest-d' + k, k > 0 && k === d);
r.dataset.sppNestNo = String(n);
r.dataset.sppNestUp = up[n] === null ? '' : String(up[n]);
r.dataset.sppNestAnc = anc(n).join(' ');
r.classList.toggle('spp-nest-root', up[n] === null);
const tip = r.querySelector('.tiptop');
if (tip) tip.classList.add('spp-nest-head');
let upEl = tip ? tip.querySelector('.spp-nest-up') : null;
if (tip && upNo[n] !== null && upNo[n] !== undefined) {
if (!upEl) {
upEl = document.createElement('em');
upEl.className = 'spp-nest-up';
const upFr = tip.querySelector('.fr');
if (upFr) tip.insertBefore(upEl, upFr); else tip.appendChild(upEl);
upEl.addEventListener('click', function (ev) {
const pg = Number(upEl.dataset.sppGotoPage || 0);
if (!pg) return;
ev.preventDefault(); ev.stopPropagation();
try {
const tid0 = (location.href.match(/tid[-=](\d+)/i) || [])[1] || '';
sessionStorage.setItem('spp_jump', JSON.stringify({ tid: tid0, page: pg, no: String(upNo[n] == null ? '' : upNo[n]), kind: 'up', k: 0, ts: Date.now() }));
} catch (e) { }
if (typeof sppFlowGoto === 'function') sppFlowGoto(pg);
});
}
if (up[n] !== null) {
upEl.textContent = '↑ 楼 ' + up[n];         
upEl.removeAttribute('data-spp-goto-page');
upEl.removeAttribute('role');
upEl.removeAttribute('tabindex');
upEl.removeAttribute('aria-label');
} else if (upPage[n] !== '') {
upEl.textContent = '↑ 楼 ' + upNo[n] + ' · 第 ' + upPage[n] + ' 页';   
upEl.setAttribute('data-spp-goto-page', upPage[n]);
upEl.setAttribute('role', 'button');
upEl.setAttribute('tabindex', '0');
upEl.setAttribute('aria-label', '跳到第 ' + upPage[n] + ' 页查看父楼');
} else {
upEl.textContent = '↑ 楼 ' + upNo[n] + ' · 未加载';   
upEl.removeAttribute('data-spp-goto-page');
upEl.removeAttribute('role');
upEl.removeAttribute('tabindex');
upEl.setAttribute('aria-label', '父楼未加载');
}
} else if (upEl) { upEl.remove(); }
let gut = r.querySelector('.spp-nest-gutter');
if (!kids[n]) {
if (gut) gut.style.setProperty('display', 'none');
continue;
}
if (!gut) {
gut = document.createElement('div');
gut.className = 'spp-nest-gutter';
const mk = document.createElement('span');   
mk.className = 'spp-nest-fold';
mk.setAttribute('role', 'button');
mk.setAttribute('tabindex', '0');
mk.setAttribute('aria-label', '收起 / 展开这条分支');
mk.addEventListener('click', function (ev) { ev.preventDefault(); ev.stopPropagation(); flip(String(n)); });
mk.addEventListener('keydown', function (ev) {
if (ev.key === 'Enter' || ev.key === ' ') { ev.preventDefault(); flip(String(n)); }
});
gut.appendChild(mk);
r.appendChild(gut);
}
gut.style.removeProperty('display');
const mk2 = gut.querySelector('.spp-nest-fold');
if (mk2) {
mk2.dataset.sppNestFor = String(n);
mk2.dataset.sppNestKids = String(kids[n]);
}
}
function sppNestGather(list, no, up) {
const form = list[0] && list[0].parentNode;
if (!form || list.length < 2) return '';
const first = {}, dups = {}, nos = [];
for (let i = 0; i < list.length; i++) {
const n = no[i];
if (n === null || n === undefined) continue;
if (!first[n]) { first[n] = list[i]; nos.push(n); }
else (dups[n] || (dups[n] = [])).push(list[i]);
}
if (nos.length < 2) return '';
nos.sort(function (a, b) { return a - b; });
const kids = {}, roots = [];
for (let i = 0; i < nos.length; i++) {
const n = nos[i], p = up[n];
if (p === null || p === undefined || !first[p]) roots.push(n);
else (kids[p] || (kids[p] = [])).push(n);
}
const numbered = [], seen = {};
const emit = function (n) {
if (seen[n]) return;
seen[n] = 1;
numbered.push(first[n]);
const ds = dups[n];
if (ds) for (let q = 0; q < ds.length; q++) numbered.push(ds[q]);
const ks = kids[n];
if (ks) for (let j = 0; j < ks.length; j++) emit(ks[j]);
};
for (let i = 0; i < roots.length; i++) emit(roots[i]);
if (numbered.length !== nos.length) {
for (let i = 0; i < nos.length; i++) {
if (seen[nos[i]]) continue;
numbered.push(first[nos[i]]);
const ds2 = dups[nos[i]];
if (ds2) for (let q = 0; q < ds2.length; q++) numbered.push(ds2[q]);
}
}
const anchorAt = {};
let k = 0;
for (let i = 0; i < list.length; i++) {
const n = no[i];
if (n === null || n === undefined) (anchorAt[k] || (anchorAt[k] = [])).push(list[i]);
else k++;
}
const target = [];
for (let j = 0; j <= numbered.length; j++) {
if (j > 0) target.push(numbered[j - 1]);
const a = anchorAt[j];
if (a) for (let q = 0; q < a.length; q++) target.push(a[q]);
}
if (target.length !== list.length) return '';   
let moved = 0;
const cap = list.length * 2;
for (let j = target.length - 2; j >= 0; j--) {
const cur = target[j], next = target[j + 1];
if (!cur || !next) return '';
let sppNestScan = cur.nextElementSibling;
while (sppNestScan && list.indexOf(sppNestScan) < 0) sppNestScan = sppNestScan.nextElementSibling;
if (sppNestScan === next) continue;
if (cur.parentNode !== form || next.parentNode !== form) return '';   
form.insertBefore(cur, next);
if (++moved > cap) break;
}
if (!moved) return '';
form.dataset.sppNestGathered = String(moved);
for (let i = 0; i < nos.length; i++) {
let d = 0, p = up[nos[i]];
while (p !== null && p !== undefined && d <= 64) { d++; p = up[p]; }
if (d > SPP_NEST_DEPTH_MAX) first[nos[i]].dataset.sppNestClip = '1';
}
const arr = Array.prototype.slice.call(document.querySelectorAll('#main > form > .t5.t2'));
if (!arr.length) return '';
return arr.map(function (r) { return (r.querySelector('[id^=td_]') || {}).id || '?'; }).join(',') +
'|' + arr.length + '|' + (arr[0].classList.contains('spp-nest-row') ? '1' : '0');
}
const sigGathered = sppNestGather(list, no, up);
stamp = sigGathered || sig;
syncFold();
}
const SPP_NEST_RAIL_STEP = 32, SPP_NEST_RAIL_PAD = 49, SPP_NEST_RAIL_TOP = 37;
const SPP_NEST_ELBOW_R = 12, SPP_NEST_ELBOW_H = 16, SPP_NEST_AVA_L = 33.2, SPP_NEST_AVA_MID = 25.5;
const SPP_NEST_MARK_GAP = 8, SPP_NEST_MARK_SIZE = 18, SPP_NEST_MARK_AIR = 2;
const SPP_NEST_MARK_TOP = SPP_NEST_AVA_MID + 22.5 + SPP_NEST_MARK_GAP;
const SPP_NEST_SEAM = 3;
function nestRailX(lv) {
if (lv > 24) lv = 24;
return SPP_NEST_RAIL_PAD + SPP_NEST_RAIL_STEP * (lv - 1);
}
function nestRailCut(el, on) {
const has = el.hasAttribute('data-spp-nest-cut');
if (!on) {
if (!has) return;
el.removeAttribute('data-spp-nest-cut');
el.style.removeProperty('--spp-nest-cut-a');
el.style.removeProperty('--spp-nest-cut-b');
return;
}
if (has) return;
el.setAttribute('data-spp-nest-cut', '');
el.style.setProperty('--spp-nest-cut-a', (SPP_NEST_MARK_TOP - SPP_NEST_MARK_AIR - SPP_NEST_RAIL_TOP) + 'px');
el.style.setProperty('--spp-nest-cut-b', (SPP_NEST_MARK_TOP + SPP_NEST_MARK_SIZE + SPP_NEST_MARK_AIR - SPP_NEST_RAIL_TOP) + 'px');
}
function paintNestRails() {
const list = document.querySelectorAll('#main > form > .t5.t2.spp-nest-row');
const ancOf = [], vis = [], live = {};
let i, k;
for (i = 0; i < list.length; i++) {
const r = list[i], a = [], raw = r.dataset.sppNestAnc;
if (raw) {
const sp = raw.split(' ');
for (k = 0; k < sp.length; k++) if (sp[k]) a.push(sp[k]);
}
ancOf.push(a);
vis.push(!r.classList.contains('spp-nest-hid'));
}
for (i = 0; i < ancOf.length; i++) {
if (!vis[i]) continue;
for (k = 0; k < ancOf[i].length; k++) live[ancOf[i][k]] = 1;
}
const lastChild = {};
for (i = 0; i < list.length; i++) {
if (!vis[i] || !ancOf[i].length) continue;
lastChild[ancOf[i][0]] = i;
}
for (i = 0; i < list.length; i++) {
const r = list[i], a = ancOf[i], want = {};
if (a.length) r.style.setProperty('--spp-nest-d', Math.min(a.length, 24));
if (vis[i]) {
for (k = 0; k < a.length; k++) {
const li = lastChild[a[a.length - 1 - k]];
if (li < i) continue;                     
want[nestRailX(k + 1)] = { top: -SPP_NEST_SEAM, clip: li === i };
}
const gut = r.querySelector(':scope > .spp-nest-gutter');
if (gut && gut.style.display !== 'none' && live[r.dataset.sppNestNo]) {
const x = nestRailX(a.length + 1);
want[x] = { top: SPP_NEST_RAIL_TOP, clip: false, cut: 1 };
gut.style.left = (x - 9) + 'px';
gut.style.top = SPP_NEST_MARK_TOP + 'px';
}
}
const xs = Object.keys(want), els = r.querySelectorAll(':scope > .spp-nest-rail');
for (k = 0; k < els.length; k++) {
if (k < xs.length) {
const w = want[xs[k]];
els[k].style.left = xs[k] + 'px';
els[k].style.top = w.top + 'px';
if (w.clip) { els[k].style.bottom = 'auto'; els[k].style.height = (SPP_NEST_AVA_MID + SPP_NEST_SEAM) + 'px'; }
else { els[k].style.bottom = '0'; els[k].style.height = ''; }
nestRailCut(els[k], w.cut);
} else els[k].remove();
}
for (k = els.length; k < xs.length; k++) {
const el = document.createElement('i');
el.className = 'spp-nest-rail';
el.style.left = xs[k] + 'px';
el.style.top = want[xs[k]].top + 'px';
if (want[xs[k]].clip) { el.style.bottom = 'auto'; el.style.height = (SPP_NEST_AVA_MID + SPP_NEST_SEAM) + 'px'; }
nestRailCut(el, want[xs[k]].cut);
r.appendChild(el);
}
let eb = r.querySelector(':scope > .spp-nest-elbow');
if (vis[i] && a.length) {
const px = nestRailX(a.length);
const wA = SPP_NEST_AVA_L + SPP_NEST_RAIL_STEP * a.length - px;
if (wA > 4) {
if (!eb) { eb = document.createElement('i'); eb.className = 'spp-nest-elbow'; r.appendChild(eb); }
eb.style.left = px + 'px';
eb.style.width = wA + 'px';
eb.style.height = SPP_NEST_ELBOW_H + 'px';
eb.style.top = (SPP_NEST_AVA_MID - SPP_NEST_ELBOW_H) + 'px';
} else if (eb) eb.remove();
} else if (eb) eb.remove();
}
}
function syncFold() {
const list = document.querySelectorAll('#main > form > .t5.t2.spp-nest-row');
for (let i = 0; i < list.length; i++) {
const r = list[i];
const n = r.dataset.sppNestNo;
const chain = (r.dataset.sppNestAnc || '').split(' ');
let hid = false;
for (let k = 0; k < chain.length; k++) {
if (chain[k] && folded.indexOf(chain[k]) >= 0) { hid = true; break; }
}
r.classList.toggle('spp-nest-hid', hid);
r.classList.toggle('spp-nest-folded', folded.indexOf(n) >= 0);
const pic = r.querySelector('.user-pic img');
if (pic && pic.style.minHeight !== '45px') { pic.style.setProperty('width', '45px', 'important'); pic.style.setProperty('height', '45px', 'important'); pic.style.setProperty('min-height', '45px', 'important'); pic.style.setProperty('max-height', '45px', 'important'); }
if (pic && pic.style.zIndex !== '3') { pic.style.setProperty('position', 'relative'); pic.style.setProperty('z-index', '3'); }
const mk = r.querySelector('.spp-nest-fold');
if (mk) mk.dataset.sppNestMark = folded.indexOf(n) >= 0 ? 'plus' : 'minus';
}
paintNestRails();
}
function flip(n) {
const at = folded.indexOf(n);
if (at >= 0) folded.splice(at, 1); else folded.push(n);
writeFold();
syncFold();
}
onDomReady(function () {
mark();
setTimeout(mark, 600);
const target = document.getElementById('main') || document.body;
new MutationObserver(function () {
clearTimeout(timer);
timer = setTimeout(mark, 150);
}).observe(target, { childList: true, subtree: true });
});
}
const CSS_RF = [
'/* ===== SPP-RF-BEGIN ===== */',
'/* 作用域:html.spp-rf-on(由 initRedditFloor 按开关挂 / 摘);关态一个类都不加。 */',
'html.spp-rf-on {',
'    --spp-rf-step: var(--spp-nest-step, 36px);        /* 与 15q 同源:15q 在就跟随它(★ 116:兜底 40→36,与 15q 令牌同值) */',
'    --spp-rf-avatar: 45px;                            /* 头像直径(119:40 → 60,+50%,操作者原话「头像过小,需要加大 50% 看看效果」;本轮 60 → 45 = 32 × 1.4,因实际渲染由 syncFold 的行内尺寸决定,两处必须同步)*/',
'    --spp-rf-avatar-col: 96px;                        /* 头像列宽(119:72 → 96)。算式:头像外盒 60 + 旧留白 32(= 旧列 72 − 旧头像 40)= 92 是「留白一分不减」的下限;96 给 18 + 18 的对称留白(旧实测是左 17 / 右 15,本就不对称)。站点行内 185 由 !important 压 */',
'    --spp-rf-col-max: 1000px;                         /* 119 新增:内容列(#main > form.spp-flow)的上限宽。Reddit 式窄栏,宽窄只由这一个数决定 */',
'    --spp-flow-r-top: 0;                              /* 119 新增:15b 首行圆角的变量出口(原字面量 17px 17px 0 0,见 119-R3)*/',
'    --spp-flow-r-bot: 0;                              /* 119 新增:15b 末行圆角的变量出口(原字面量 0 0 17px 17px)*/',
'    --spp-rf-body-pad: 1px;                           /* 底栏左缘对齐:正文左界 = 头像列 72px + 1px 边框(实测行左 146 → 正文 219,差 73)*/',
'    --spp-rf-head-h: 32px;                            /* 头部行最小高度 */',
'    --spp-rf-foot-h: 30px;                            /* 底部栏预留高(行 padding-bottom)*/',
'    --spp-rf-line: var(--spp-nest-line, #dfe4ee);',
'    --spp-rf-dim: var(--spp-nest-head-dim, #8a93a3);',
'    --spp-rf-fg: var(--spp-nest-head-fg, #1f2937);',
'    --spp-rf-acc: var(--spp-nest-acc, #2f8f7e);',
'    --spp-rf-gap-x: 6px;                            /* §4 建议的那枚:101 当时在 flex 行里写的是字面量 6px */',
'    --spp-rf-sep: var(--spp-flow-hair, #f1f5fa);      /* 亮态发丝线:15b 那四枚里的一枚(§4 第 1 行)*/',
'    --spp-rf-bar-bg: var(--spp-flow-bg, #ffffff);     /* 亮态栏底:同上(行卡底色)*/',
'    --spp-rf-bar-hover: var(--spu-overlay, #eef2f5);  /* 亮态悬停底::root 的 --spu-overlay(L7426)*/',
'}',
'/* 黑夜:只换三枚写死的兜底色;强调色继续跟着 19 段令牌走 */',
'html.spp-rf-on.spp-rdark {',
'    --spp-rf-line: var(--spp-nest-line, rgba(255,255,255,.13));',
'    --spp-rf-dim: var(--spp-nest-head-dim, #b6c3d6);',
'    --spp-rf-fg: var(--spp-nest-head-fg, #f5f5f7);',
'    --spp-rf-sep: var(--spp-rk-hair, rgba(255,255,255,.07));   /* 暗态发丝线:19 段同名覆盖 */',
'    --spp-rf-bar-bg: var(--spp-rk-glass, rgb(0 0 0 / .86));      /* 暗态栏底:19 段黑玻璃 */',
'    --spp-rf-bar-hover: var(--spp-hole, rgba(255,255,255,.06));  /* 暗态悬停底:19 段的凹槽色(L28922)*/',
'}',
'/* ---- 修:暗态 + RF 下楼层底板必须不透明(操作者截图报的「透出星空」)------------',
'   两态的楼层底板都走 15b 的内联 background-color: var(--spp-flow-bg, #fff):',
'     【亮态】--spp-flow-bg 未定义 ⇒ 兜底 #fff,不透明(本条不参与,一个字节不动);',
'     【暗态】「19 段」把它接成 --spp-rk-glass = rgb(0 0 0 / .86) ⇒ 14% 透星。',
'   为什么只在 RF 下要钉死:非 RF 时本行那条 backdrop-filter:blur(18px) saturate(140%)',
'   会把背后的星点糊开(观感仍是黑玻璃);而 RF 段为了去卡片感把本行的 backdrop-filter',
'   关掉了(下面「原样:.spp-flow-row { backdrop-filter: blur(18px) saturate(140%) }」那条',
'   override)⇒ 星点原样透过 .86 的底板。只把这一格的底板钉成同色不透明(#000 = 同一枚',
'   黑,只去掉 alpha),亮态与「关掉 RF 的脚本美化版」都零匹配(选择器同时要求 spp-rdark',
'   与 spp-rf-on 两个类)。特异性 (1,5,2) > 19 段那枚 (1,3,2),不靠书写顺序决胜。',
'   ★ 为什么不改共用的 --spp-rk-glass:那枚还管着玻璃面板 / 悬停卡 / 面板底等一堆地方。 */',
'html.spp-rdark.spp-rdark.spp-rf-on.spp-rf-on #main > form.spp-flow { --spp-flow-bg: #000000; }',
'',
'/* ---- 1. 头像列 185 → 72、头像 40px 圆 ----',
'   站点把 width:185px 写在 th 的**行内**上,只有 !important 压得动;列收窄不挤正文:fixed 布局下',
'   列宽来自首行 th 的行内 width,正文反而更宽(t48 实测 左界 332→219、宽 1214→1327)。',
'   两条红线:不给 th.r_two / .inner / .user-pic 写 overflow:hidden(悬停卡本体住在里面)、',
'   不搬悬停卡宿主那枚 span 本体 —— 本模块一条都没碰。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_two { width: var(--spp-rf-avatar-col) !important; padding: 0 !important; }',
'/* ★ 106(冒烟 D2):min-height 必须一起压 —— spp-boardtop-style-read 段那条',
'   html.spp-read-on .t5.t2 .r_two .user-pic img:not(.spp-ava-off)(272 实读 L49071-49081)',
'   声明了 min-height:150px !important(L49076),与本规则同时命中同一枚 img。',
'   反直觉实测:只写 height:40px !important 无效 —— 我们的 height 特异性更高、确实生效,',
'   但那条的 min-height 我们一条都没声明、无人对抗 ⇒ 渲染盒高 = max(150, 40) = 150(宽 40)。',
'   所以四件同写:width / height / min-height / max-width,全用同一把尺子 --spp-rf-avatar。',
'   活体预期:头像渲染盒 40×40、border-radius 50%、object-fit cover;L49071 那条一字未动。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_two img { width: var(--spp-rf-avatar) !important; height: var(--spp-rf-avatar) !important; min-height: var(--spp-rf-avatar) !important; max-width: none !important; border-radius: 50% !important; object-fit: cover !important; }',
'/* ---- t142:头像槽位永远正方(任何图床/任何人炸了都一样)----------------------------------',
'   现象:坏头像被**横向撑开**(≈正常宽度 4 倍、高约 1 倍)成横长椭圆 —— 不是单纯高度塌,是宽度被撑。',
'   机制:图片加载失败后,浏览器按规范把 <img> 退化成「带替代文字的 inline 盒」⇒ alt 文本当盒内内容参与排版,',
'         盒宽 = 那行替代文字有多宽、盒高 = 行高(深色主题下暗字压暗底,看着像一块空区域);',
'         再叠 border-radius:50% ⇒ 非正方 + 50% 圆角 = 椭圆形。',
'   修法(按结构修,不按用户/域名打补丁):把槽位钉死成与同页正常头像同尺寸的正方 + overflow 裁切 +',
'         覆盖填充;并让替代文字**不参与排版**(font-size:0 / line-height:0;alt 仍在 DOM 里,无障碍名不丢)。 */',
'html #main .t5.t2 th.r_two img,',
'html #main .t5.t2 .r_two .user-pic img {',
'    display: block !important;',
'    width: var(--spp-rf-avatar, 45px) !important;',
'    height: var(--spp-rf-avatar, 45px) !important;',
'    min-width: var(--spp-rf-avatar, 45px) !important;',
'    min-height: var(--spp-rf-avatar, 45px) !important;',
'    max-width: var(--spp-rf-avatar, 45px) !important;',
'    aspect-ratio: 1 / 1 !important;',
'    object-fit: cover !important;',
'    border-radius: 50% !important;',
'    overflow: hidden !important;',
'    font-size: 0 !important;',
'    color: transparent !important;',
'    line-height: 0 !important;',
'    background: rgba(127,127,127,.16);',
'}',
'html #main .t5.t2 th.r_two .user-pic > a,',
'html #main .t5.t2 th.r_two > div[align] > a { display: block !important; overflow: hidden !important; line-height: 0 !important; }',
'/* 名字条:150px 时代的 -25px 叠压手法(条底压框沿)在 40px 圆下不再成立 ⇒ 回到正常流 + 4px 间距;',
'   顺带让「名字条 top > 头像 bottom」这条判据显然成立(t48 的 R14)。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_two:not(.spp-ava-tiled) > div[align=center] { margin: 4px 0 0 !important; line-height: normal !important; }',
'/* ★ 274:头像列下方那枚「名字黑条」必须收起来 —— 它其实是一枚 **150px 宽的 <a>**',
'   (暗态由 spp-rdark 那条 (1,9,5) 给它黑底 + 下圆角),挂在只有 72px 宽的列里 ⇒ 实测',
'   横跨 x147→297、**压住正文区 x219→297 的 78px**(th.r_two 的 scrollWidth = 150 > 72)。',
'   名字已经在头部行(em.spp-rf-name)里,这里只隐藏,不搬节点:',
'   · 悬浮卡的触发挂在**头像那枚 <a>** 上(onmouseover 里调 read.open 打开本楼那张卡),',
'     不在这枚名字链上 ⇒ 隐藏它不影响悬浮卡;',
'   · 悬浮卡本体 span.user-info#showface_N 是这枚 div 的**兄弟**、不是子孙 ⇒ 也不会被误伤;',
'   · 这条只写 display,不碰背景 —— 与暗态那条 (1,9,5) 不同属性,无需比特异性。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_two > div[align="center"] > a { display: none !important; }',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_two > div[align="center"] { margin: 0 !important; min-height: 0 !important; }',
'/* ID 色块的三把尺子(原定义在 html.spp-read-on .t5.t2 .r_two .spp-ava-initial 上,按 150px 标定;',
'   fitTile 读的就是这三枚)。40/150 折算 ⇒ max 8.5 / one 6.4 / min 2.9;min 取 6px 是可读下限。',
'   本选择器带 #main(同 id、class 数更多)⇒ 赢得过原定义,不必加 !important。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .r_two .spp-ava-initial { --spp-ava-fs-max: 9px; --spp-ava-fs-min: 6px; --spp-ava-fs-one: 7px; }',
'',
'/* ---- 2. 头部行:楼层号 - 头像 - 名称 - 时间 - 签名 ---- */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop { display: flex !important; align-items: center !important; gap: var(--spp-rf-gap-x, 6px) !important; min-height: var(--spp-rf-head-h) !important; margin: 0 0 8px !important; padding: 2px 0 !important; }',
'/* 楼层号胶囊:站点那枚 a.s3(onclick=copyUrl(pid))只换皮,元素与事件一个不动 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > span.fl > a { display: inline-block !important; padding: 0 7px !important; border-radius: 999px !important; background: transparent !important; border: 1px solid transparent !important; border-color: var(--spp-rf-line) !important; color: var(--spp-rf-fg) !important; -webkit-text-fill-color: var(--spp-rf-fg) !important; font-weight: 600 !important; text-decoration: none !important; }',
'/* 时间:灰一档;前面那枚圆点用 ::before 画(零新增节点) */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > span.fl.gray { color: var(--spp-rf-dim) !important; -webkit-text-fill-color: var(--spp-rf-dim) !important; font-size: 11px !important; }',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > span.fl.gray::before { content: ""; display: inline-block; width: 3px; height: 3px; border-radius: 50%; background: var(--spp-rf-dim); vertical-align: middle; margin: 0 6px 2px 2px; }',
'/* 名称(脚本克隆的 em,插在楼层号之后):往 .tiptop 里只放 em / i / div —— 19 段那条 (1,8,4)',
'   通配的名单是 :is(a, b, span:not(.spp-tp-sep)),em 不在其中 ⇒ **颜色白拿**,这里只做字重/间距/不换行。',
'   将来若要给它底色或胶囊:必须 ≥(1,8,3) 且带 !important(19 段 L28957 的后代通配会扫 background-color),',
'   实测生效写法逐字形如 html.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2 .tiptop .spp-rf-name',
'   —— 本版刻意不用底色,所以不必打这场特异性仗。 */',
'html.spp-rf-on .spp-rf-row .tiptop .spp-rf-name { font-style: normal !important; font-weight: 600 !important; font-size: 12px !important; line-height: 16px !important; margin: 0 2px 0 6px !important; white-space: nowrap !important; }',
'',
'/* ---- 3. 底部 UI 栏:DOM 不动,只把 .fr 摆到正文下方(路线甲)---- */',
'/* 行上预留底高(写在行上才有效:写在 th.r_one 上实测不生效) */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row { padding-bottom: var(--spp-rf-foot-h) !important; }',
'/* .fr 绝对定位到行底:行本来就是它的包含块(.fr / .tiptop / th.r_one 全 static、行 relative),',
'   所以这是「不需要新增任何定位层」的做法 —— 含站点屏蔽下拉在内的既有绝对定位件本应全部不受影响;',
'   实测那枚下拉仍会被换包含块,所以紧接着补两条缓解(见下)。 */',
'html.spp-rf-on .spp-rf-row .tiptop > .fr { position: absolute !important; top: auto !important; bottom: 4px !important; right: 8px !important; float: none !important; margin: 0 !important; left: calc(var(--spp-rf-step) * var(--spp-nest-d, 0) + var(--spp-rf-avatar-col) + var(--spp-rf-body-pad)) !important; }',
'/* ★ 缓解:站点屏蔽下拉的菜单是绝对定位、包含块原本是**行**;.fr 一旦 positioned,菜单会跟着跑到新',
'   包含块里(实测相对按钮偏移从 dx −6 / dy −2 变成 dx −999 / dy +337)。下面两条把包含块拉回触发',
'   按钮自身并复刻原观感 —— 改后实测偏移仍是 dx −6 / dy −2、菜单 84×65 不变、仍可展开。 */',
'html.spp-rf-on .spp-rf-row .tiptop > .fr > div.dropdown { position: relative !important; }',
'html.spp-rf-on .spp-rf-row .tiptop > .fr > div.dropdown > .dropdown-content { left: 0 !important; top: 100% !important; right: auto !important; bottom: auto !important; }',
'/* 下拉菜单的包含块拉回按钮之后,它就落进了 .fr(行内 overflow:hidden)/ th.r_one(行内 overflow:hidden)/',
'   .t5(站点样式 overflow:hidden)三层裁剪链里 —— 菜单被剪成底栏下缘那一条边,看着像「屏蔽」底部多了一道特效。',
'   只在悬停该下拉时放开这三层(菜单是它的子孙,鼠标移进菜单仍保持 :hover)。 */',
'html.spp-rf-on .spp-rf-row:has(.tiptop > .fr > div.dropdown:hover) { overflow: visible !important; }',
'html.spp-rf-on .spp-rf-row:has(.tiptop > .fr > div.dropdown:hover) th.r_one { overflow: visible !important; }',
'html.spp-rf-on .spp-rf-row:has(.tiptop > .fr > div.dropdown:hover) .tiptop > .fr { overflow: visible !important; }',
'/* 顺序:回复 - 只看该作者 - 屏蔽 - 引用(其余靠右);分隔竖线在底栏不需要,隐藏的是视觉不是 DOM */',
'html.spp-rf-on .spp-rf-row .tiptop > .fr > * { order: 9; }',
'html.spp-rf-on .spp-rf-row .tiptop > .fr > span:has(> a[onclick^=postreply]) { order: 1; }',
'html.spp-rf-on .spp-rf-row .tiptop > .fr > a[href*=uid] { order: 2; }',
'html.spp-rf-on .spp-rf-row .tiptop > .fr > div.dropdown { order: 3; }',
'html.spp-rf-on .spp-rf-row .tiptop > .fr > span:has(> a[href*=quote]) { order: 4; }',
'/* ★ 274:这条要赢过 READ_CSS 的 html.spp-read-on #main > form.spp-flow .tiptop .spp-tp-sep',
'   ((1,4,2) + display:block !important,实测把四条分隔竖线又点亮了);旧写法 (0,5,1) 输在',
'   「对方带 #main」,所以补上 #main 这一级 ⇒ (1,8,3) 稳赢。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > .fr > .spp-tp-sep { display: none !important; }',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop .spp-rf-name { color: var(--spp-rf-fg) !important; -webkit-text-fill-color: var(--spp-rf-fg) !important; }',
'/* ★ 108(截图①的底板):本条原来是「底栏面板」= 底色 + 下圆角 + 上方发丝线。',
'   亮态底色 #ffffff、暗态 --spp-rk-glass = rgb(0 0 0 / .86) ⇒ 四枚动作底下压着一块深色圆角板。',
'   Reddit 的评论动作行没有面板:纯文字 + 悬停变色 + 与正文之间一条极淡的横线。',
'   ⇒ 去掉 background-color 与 border-radius 0 0 8px 8px(两样都在「矩形 UI 框」判据里),',
'     只留 border-top 1px —— 单侧发丝线是 Reddit 允许的观感(亮 #f1f5fa / 暗 rgba(255,255,255,.07))。',
'   为什么用「改原规则」而不是「再加一条覆盖」:这条本来就是本模块自己写的皮,减去声明比再压一层干净,',
'   也不必再算一轮特异性。布局零位移(border-top 那 1px 照旧占位)。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > .fr { border-top: 1px solid var(--spp-rf-sep) !important; }',
'/* ★ 105:补 html.spp-rf-on 闸门(已在 .spp-rf-row 作用域内,这一枚是「关态零产物」的第二道锁;色值一字不改) */',
'/* ★ 108:暗态那一份同上 —— 去掉 background-color(rgb(0 0 0 / .86) 黑圆角面板),',
'   border-top 原样保留。规则本体不删(亮/暗成对,与 102 段口径一致);',
'   --spp-rf-bar-bg 这枚令牌也留着(它是颜色不是框,将来要做别的栏皮还用得上)。 */',
'html.spp-rf-on.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > .fr { border-top: 1px solid var(--spp-rf-sep) !important; }',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > .fr :is(a, span) { border-radius: 6px !important; }',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > .fr :is(a, span):hover { background-color: var(--spp-rf-bar-hover) !important; }',
'/* ★ 105:同上(悬停底那条) */',
'html.spp-rf-on.spp-rdark.spp-rdark.spp-rdark #main > form.spp-flow > div.t5.t2.spp-rf-row .tiptop > .fr :is(a, span):hover { background-color: var(--spp-rf-bar-hover) !important; }',
'/* ==================== 108:去框(Reddit 本体没有矩形 UI 框)====================',
'   ★ 用户批评:「我合理的怀疑你使用了一个个类似于矩形UI框框住了信息元素,Reddit 化很明显',
'     是没有这些UI框的」。截图两处:①四枚动作各自被 1px 方框套住(只在暗色态);②头部行像卡片底板。',
'   ★ 本段只做一件事:把「四边框 / 面板底(.tiptop 与 .fr 那两块)/ 圆角 / 投影 / 外描」清零。',
'     ★★ 但**楼层行自己的底色要留**(见 R1b):没有底色的行,正文会直接压在星空主题的星点上。',
'     不用星号通配一把梭(* { border: 0 })—— 它会连站点的表格线、头像圆环、折叠圆标一起打掉;',
'     而且真凶里有一半是**内联 !important**(15b 一体流),星号选择器根本赢不了它。',
'     所以下面逐条精准覆盖,每条注释都写明「压的是哪条原规则」+「为什么这条能赢(算过特异性)」。',
'   ★ 特异性记号统一写 (id, class, elem)。本段所有选择器都以 html.spp-rf-on 开头 ⇒ 关掉总开关即零匹配。',
'   ★ 为什么 .spp-rf-on 写三遍、.spp-flow-row 写三遍:不是笔误,是本仓库既有手法(19 段的 .spp-rdark',
'     写三遍、15q 的 .spp-nest-on 写三遍、15h 的 .spp-fh-off 写两遍同款)—— 对手都带 !important,',
'     平局时只看特异性,重复同类名是唯一不依赖「样式表先后」的抬权手段。 */',
'/* ---- 108-R1:楼层行的「四边框」变量(15b 一体流写在**行内 !important**,只能改变量)----',
'   原规则(274 实读,全部由 initReadFlow.tag() 写在**行内**):',
'     L36107 r.style.setProperty(border-top, first ? EDGE : 0, important)',
'     L36109 r.style.setProperty(border-left, EDGE, important)',
'     L36110 r.style.setProperty(border-right, EDGE, important)',
'     L36111 r.style.setProperty(border-radius, first ? 17px 17px 0 0 : (last ? 0 0 17px 17px : 0), important)',
'   其中 EDGE = 1px solid var(--spp-flow-edge, #eaeff7)(L36092)。',
'   ⇒ 行是一张「白底 + 四边 1px + 17px 圆角」的卡片;暗态那半由 19 段给变量赋值:',
'     --spp-flow-edge = --spp-rk-line = rgba(255,255,255,.12)(L29092 / L29104)。',
'   ★ 为什么只能改变量:CSS 规范里**内联 !important 优先于任何样式表 !important**,写多高特异性',
'     都赢不了 —— 这是本条不能像别条那样「加一条覆盖」的原因;但 15b 写的是 var(--x, 兜底),',
'     所以改的是**变量的值**,不是属性的值 ⇒ 完全绕开内联 !important。',
'     1px 的框宽、17px 的圆角**一个字节都没动**(transparent 边 = 占位照旧、只是不画)⇒ 布局零位移。',
'   ★ 本条**只翻一枚** --spp-flow-edge。--spp-flow-hair(行与行之间那条 1px 细线)**故意不动** ——',
'     单侧分隔线是 Reddit 允许的观感。',
'   ★ 本条特异性 (1,4,2):压过 19 段给同一元素赋值的那条 (1,3,2)(L29101),亮暗两态都赢。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow { --spp-flow-edge: transparent !important; }',
'/* ---- 108-R1b:★ 底色**不翻**(本轮撤回的两处翻值,留档防下一轮又抄回去)----',
'   上版把 --spp-flow-bg 翻成 transparent、--spp-flow-bgi 翻成 none ⇒ 行底色透明,正文直接压在',
'   星空主题的星点上:#spp-starfield 是 position:fixed; inset:0; z-index:-1 的',
'   radial-gradient(#1b2735 → #090a0f)(L44399-44402),星点是 box-shadow 画的 1~3px 白点',
'   (L44388 / L44405)⇒ 可读性当场崩掉。这就是必须撤回的全部理由。',
'   ⇒ 这两枚**一个字都不写**(不翻 = 回到 274 的取值链)。行底色不是框:没有 border / radius /',
'     shadow 就不是卡片,所以本段不碰任何 background 声明(R2 那条是「钉住」不是「清零」,见下)。',
'   两态最终生效的 background 链(274 实读 + 本补丁改后,逐条可查):',
'     【亮态】行本体内联 background-color: var(--spp-flow-bg, #fff) [L36112,行内 !important]',
'       → --spp-flow-bg 未定义(19 段只在 html.spp-rdark 下赋值,L29101)⇒ 取兜底 **#fff**(不透明);',
'       同属性竞争者:R2 (1,9,3) 的 var(--spp-flow-bg, #fff) 同值;L49057 (1,5,2) #fff 同值;',
'       星空玻璃 html.spp-hm-star #main .t5:not(.spp-t5bar) (1,3,1) rgba(250,252,255,.93) 输给行内。',
'     【暗态】同上内联 → --spp-flow-bg = --spp-rk-glass = **rgb(0 0 0 / .86)**(L29095 / L29102)',
'       ⇒ 14% 透过率,不是 transparent;19 段那条扫白 (1,6,3) 的选择器是 div.t5.t2 加一个星号,',
'       星号只匹配行的**后代**,行本体不归它管 ⇒ 暗态行底色不会被它清成透明。 */',
'/* ---- 108-R2:行卡「样式表兜底」那一份(READ_CSS 2.52.48)+ 两态 surface 钉子 ----',
'   原规则(274 实读 L49057-49074,全带 !important):',
'     L49057 (1,5,2) html.spp-read-on #main > form.spp-flow > .t5.t2.spp-flow-row {',
'                      border-left:1px solid #eaeff7; border-right:1px solid #eaeff7;',
'                      border-bottom:1px solid #f1f5fa; background-color:#fff }',
'     L49067 (1,5,2) .spp-flow-start { border-top:1px solid #eaeff7; 17px 上圆角 }',
'     L49071 (1,5,2) .spp-flow-end   { border-bottom:1px solid #eaeff7; 17px 下圆角 }',
'   ⇒ 只清左/右/上三边的**颜色**与圆角、投影:border-bottom 那 1px 细线**留着**(C 类,单侧分隔线),',
'     L49057 的 background-color:#fff **也留着** —— 本轮改判:底色不算框。',
'   ★ background-color 这条不是「清零」而是「钉住」:写成与 15b 内联同一条变量链',
'     var(--spp-flow-bg, #fff),两态各自解析到自己的地板色(亮 #fff / 暗 rgb(0 0 0 / .86)),',
'     一条管两态、不新增任何色值。为什么值得写:15b 的 tag() 要等 onDomReady + 600ms 才跑,',
'     首帧只有这条兜底;写死 #fff 的话暗态首帧会闪一下白卡(274 原样就是闪的),写变量则首帧即是正确地板色。',
'   ★ 特异性对撞:(1,9,3) > L49057 / L49067 / L49071 三枚 (1,5,2) > 星空玻璃 (1,3,1)。',
'     也 > 暗态扫白 (1,6,3),但扫白只匹配后代、行本体本来就不归它;唯一赢不了的是行内 !important',
'     (L36112),而两者取值相同 ⇒ 稳态零视觉差。',
'   ★ 暗态行左右那两条 rgba(255,255,255,.12) 竖线,就是被 border-*-color 这三条清掉的。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row { background-color: var(--spp-flow-bg, #fff) !important; border-left-color: transparent !important; border-right-color: transparent !important; border-top-color: transparent !important; border-radius: 0 !important; box-shadow: none !important; }',
'/* ---- 108-R3:悬停那圈 2px 内描(READ_CSS L49080-49084,(1,6,4))----',
'   原规则:.spp-flow-row:hover::after { box-shadow: inset 0 0 0 2px rgba(32,201,151,.15) }',
'   在没有卡的行上,那个 ::after 就是一枚**悬停才出现的矩形边框**;Reddit 的悬停只有底色微变。',
'   ★ 本版只关这一条:上版那条「:hover { background-color: transparent }」已撤回 —— 它同样属',
'     底色类清零,而底色必须留着(见 R1b);且行内 !important 恒赢它,本来就不产生任何效果,',
'     留着只是给下一轮埋一个「一关总开关就整行透星」的雷。15h 的悬停高亮开关(html.spp-fh-off)',
'     管的是另外几条,互不相干。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row:hover::after { content: none !important; }',
'/* ---- 108-R4:头部行那张「卡片底板」(截图②,READ_CSS 2.53.4)----',
'   原规则(274 实读 L49410-49418,特异性 (1,3,2),全带 !important):',
'     html.spp-read-on #main > form.spp-flow .tiptop {',
'       background-color:#f8fafc; border:1px solid #edf1f7; border-radius:10px; padding:0 10px }',
'   —— 这是 2.53.4 那轮**用户自己点名要的**「用 UI 框包住整行」(L49403 注释原文:「需用 UI 框包裹,',
'     以提升高级感并适配白色背景」)。本轮口径反过来:Reddit 化的头部行是裸的一行元信息',
'     (楼层号 · 时间 · 名字 · 签名 · 动作),没有底板。⇒ 底色/描边/圆角/投影四样清零。',
'   ★ 只清这四样:padding 与 min-height **不动**(那是排版,不是框)。',
'   ★ 暗态还有一条更贴脸的:19 段 L29165-29168 的 :is(img, .tiptop, .user-infoWrap, ...) 把 .tiptop 的',
'     border-color 提到 rgba(255,255,255,.12)(特异性 (1,8,3))⇒ 暗态那圈轮廓比亮态还清楚。',
'     本条 (1,10,3) 压过它(也多过 (1,6,3) 的扫白、与 (1,3,2) 的原条)。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row .tiptop { background-color: transparent !important; background-image: none !important; border-color: transparent !important; border-radius: 0 !important; box-shadow: none !important; }',
'/* ---- 108-R5:楼层号那枚胶囊(三处来源,合起来就是一枚 1px 圆框 + 白底)----',
'   ① READ_CSS L49426-49435 (1,5,3):border:1px solid #e3eaf3 + background-color:#ffffff + radius 999px;',
'      悬停 L49436-49438 再换 border-color:#cfe3df((1,6,3))。',
'   ② 15q L36316-36323 (1,10,5):border-color: var(--spp-nest-line)。',
'   ③ 15r L36668 (1,7,5):border-color: var(--spp-rf-line)。',
'   Reddit 的楼层号是裸文字(old.reddit 里就是一行 1 point / 2 hours ago),没有胶囊。',
'   ★ 只清「可见性」:border 的 1px 宽度与 padding:0 7px 一字不动(transparent = 占位不变),',
'     圆角 999px 也保留(没有底、没有边时它不可见)⇒ 将来想恢复胶囊只改颜色即可。',
'   ★ 本条 (1,12,5):三枚原规则里最高的是 15q 的 (1,10,5),稳赢。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row .tiptop > span.fl:not(.gray) > a { border-color: transparent !important; background-color: transparent !important; box-shadow: none !important; }',
'/* ---- 108-R6:四枚动作按钮各自的 1px 方框(截图①)—— 本次最隐蔽的一处 ----',
'   链路必须写清,否则下一轮会被当成「没边框怎么会画出框」再查一遍:',
'   ① READ_CSS L49445-49455 (1,5,3)/(1,5,4)/(1,6,5) 给每枚动作 a 写了',
'      border:1px solid **transparent** + border-radius:999px(「幽灵胶囊」:亮态靠悬停才浮出);',
'      悬停那三条 L49456-49460 把 border-color 换成 #e2ebf3 ⇒ **亮态悬停时**会显出一个 1px 胶囊框。',
'   ② 19 段 L29160-29162 有一条扫白:(1,6,3) 的 div.t5.t2 * { border-color: var(--spp-rk-hair) }。',
'      它的特异性 (1,6,3) **高于**按钮那条 (1,5,3)/(1,5,4) ⇒ 把 transparent 换成了 rgba(255,255,255,.07)',
'      ⇒ **暗态下每枚按钮的透明边框当场变成一条可见的 1px 方框**。',
'      这就是「四个按钮各自被方框套住、而且只有暗色态有」的全部原因(亮态那条 transparent 是隐形的)。',
'   ⇒ 本条把三处按钮形态(.fr 直接子 a / span 包着的 a / 下拉里的 a)的 border-color 钉回 transparent,',
'     顺带 box-shadow:none(19 段扫不到它,只是不留隐患)。',
'   ★ 保留什么:L36725 那条 6px 圆角与 L36726 的悬停底色继续有效 —— 那正是 Reddit 的做法',
'     (纯文字按钮,悬停才浮出一层极浅的底),没有方框。',
'   ★ 本条 (1,11,4)/(1,11,5)/(1,12,5):三处形态都压过 (1,6,3) 与 (1,5,3)。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row .tiptop > .fr > a, html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row .tiptop > .fr > span > a, html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row .tiptop > .fr > div.dropdown > a { border-color: transparent !important; box-shadow: none !important; }',
'/* ---- 108-R7:父楼那枚虚线胶囊(15q L36335-36342,特异性 (1,10,3))----',
'   原样:border:1px dashed transparent + border-color: var(--spp-nest-line) ⇒ 一枚虚线圆框。',
'   它不在你点名的两个模块里,但它就画在头部行上(「↑ 父楼 B10F」),虚线框属同一口径 ⇒',
'   一并去框:文字与箭头留着,只把描边变透明。本条 (1,11,3) 压过 (1,10,3)。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row .tiptop > .spp-nest-up { border-color: transparent !important; }',
'/* ---- 108-R8:暗态那块「玻璃底板」(19 段 L29115-29119,(1,6,3))----',
'   原样:.spp-flow-row { backdrop-filter: blur(18px) saturate(140%) }。',
'   ★ 底色回来之后它的危害变了但没消失:亮态行是不透明 #fff,毛玻璃完全看不见;',
'     暗态行是 rgb(0 0 0 / .86) ⇒ 还透 14%,被 blur(18px) 糊过的星点会从「星」变成一整片',
'     脏糊斑(比不模糊更显脏),视觉上仍是一块矩形底板 ⇒ 仍然清零;顺带省掉一层合成。',
'   ★ 它不属于「border / background / border-radius / box-shadow / outline」五类(是滤镜),',
'     但视觉目标一样(一块面板),故一并清零;报告里单独标出,供主模型取舍。',
'   ★ 本条 (1,9,3):压过 (1,6,3)。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row { -webkit-backdrop-filter: none !important; backdrop-filter: none !important; }',
'/* ===== 108 去框段结束(8 条规则;关掉总开关 spp_nest_on ⇒ html.spp-rf-on 摘掉 ⇒ 零匹配)===== */',
'',
'/* ==================== ★ 116:噪音 / 几何五修(全部落在本样式块内:零新增节点、零新增类、零新增定位层)====================',
'   依据 = 真机截图逐像素实测(tid-2967808 的 276 渲染;取证脚本 tmp/land/_probe-116-*.py,读数由 check 打印)。',
'   ★ 为什么写进 CSS_RF(15r 的样式块)而不是 15q 的 CSS_NEST:两者共用同一个开关(spp_nest_on)与同一批行标记',
'     (.spp-rf-row 由 15r 打,.spp-nest-row / .spp-nest-gutter / .spp-nest-head 由 15q 打)⇒ 收在一处只注入一次;',
'     ④ 那条要压过 15q 的基类,靠**抬特异性**(.spp-nest-on 写两遍 + 判据里那两枚选择器计入特异性),',
'     不依赖样式表先后 —— 本文件 L36097 一带的注释已写明「那条时序不牢靠」。 */',
'',
'/* ---- ① 藏掉站点那行「回 N楼(…) 的帖子」(Reddit 模式下的纯噪音) ------------------------------',
'   站点 DOM(tmp/r1/live/read_2940042_p1.html 逐字):点了「回复」的楼层,th.r_one 里多出一层',
'     <div class="h1 fl" style="margin-left:1em;"><h1 class="fl" id="subject_37206459">回 14楼(66f7600a) 的帖子</h1></div>',
'   非回复楼层同位置是**空的** <span id="subject_<pid>"></span>。',
'   实测 10 个真机抓取:span#subject_ 共 211 枚、非空 0 枚;h1#subject_ 共 8 枚(read_2940042_p1.html 是 1 对 29)。',
'   ★★ 地雷(10 个抓取件逐字确认):**楼主标题也是同一层 div.h1.fl**,id 恒为 subject_tpc;',
'      subject_tpc 同样以 subject_ 开头 ⇒ 只写 h1[id^="subject_"] 会把楼主标题一起藏掉。',
'      所以下面两处都带 :not(#subject_tpc)。(113 的 upOf() 读 h1 不吃这个亏:它的正则要求「回/回复 + N楼」,',
'      楼主标题匹配不上、照旧交回 null —— 那条路一个字没改。) */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row h1[id^="subject_"]:not(#subject_tpc) {',
'    display: none !important;',
'}',
'/* ③-a 光藏 h1 还留一截空白:外层 div.h1.fl 自带站点 .h1{color:#bbbbbb;margin:0 0 1em 0}',
'   (站点 read.css 原文,见 tmp/r1/live/bench-poll.html 的 <style id="site-inline">,873,719 字符)。',
'   .h1 继承 body 的 font-size:12px ⇒ 那 1em = 12px,实测标题块 23px(y=184..206)里就含着它;',
'   把外边距清零(只清外边距,不动盒模型、不动节点、不动任何子元素)。',
'   只对「里面真的是回复标题 h1」的那层生效 —— :has 的判据里带同一个 :not(#subject_tpc)。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row .h1.fl:has(> h1[id^="subject_"]:not(#subject_tpc)) {',
'    margin: 0 !important;',
'}',
'',
'/* ---- ② 楼层号那枚 1px 环:删掉(它读起来就是「一道横线穿过字号」) ------------------------------',
'   先把「是不是删除线」证伪(三条,全部来自逐字检索):',
'     · 本交付物里 line-through 只出现 1 次 —— L26275,发帖工具栏那枚 S 按钮的预览,与本行无关;',
'     · 站点 read.css 原文里 line-through / strike 各 0 次;',
'     · 给这枚 a 写 text-decoration:none !important 的地方已有三处(15q L36365、15r L36880、READ_CSS L49645)',
'       ⇒ 真被画上的删除线不可能活下来。能看见的横线只能是它自己的 border。',
'   逐像素分层图(_probe-116-layer.py,阈值分档见脚本头):胶囊那块分成两层 ——',
'     · 淡环(灰度 28~31;同行底色灰度 8):上边 y=35 横跨 x285..310、左 x279..280、右 x310..311、下边 y=47..48;',
'     · 亮字形(灰度 245 = 暗态 --spp-rf-fg #f5f5f7)只占 y=36..41 —— 落在环的**上半格**,环下沿之下还空 6px。',
'   灰度 28 对应 rgba(255,255,255,.07) 压在底色 8 上(0.07*255 + 0.93*8 ≈ 25.6)⇒ 19 段暗态通配那一档。',
'   环的三条来源(276 行号):15q L36359-36366 写 border-color: var(--spp-nest-line);',
'     15r L36880 又写一次 border-color: var(--spp-rf-line)(暗态两枚都是 rgba(255,255,255,.13));',
'     19 段暗态通配 L29203-29205 再按 --spp-rk-hair(.07) 重新上色。',
'   ⇒ 只清这一枚 a 的 border-color(圆角 999px / 内边距 0 7px / 前景令牌一字不动)。',
'   特异性 (1,11,5):压得过 15q 的 (1,10,5) 与 READ_CSS 的 (1,5,3),与样式表先后无关。 */',
'html.spp-rf-on.spp-rf-on.spp-nest-on #main > form.spp-flow > div.t5.t2.spp-rf-row.spp-nest-row .tiptop.spp-nest-head > span.fl > a {',
'    border-color: transparent !important;',
'    text-decoration: none !important;   /* 冗余兜底(同款已有三处):把这一枚钉死,防将来有新规则插进来 */',
'}',
'',
'/* ---- ③-b 收紧正文框的下内边距(站点 .tpc_content{padding:0 2em 2em 2em}) ---------------------',
'   实测那一行的分块(t276-live-f4.png 逐 y 剖面;单位 px,行距 122):',
'     行顶发丝线 1 · 头部行块 34(15r L36878 min-height 32 + margin-bottom 8 的可见部分)',
'     · 站点标题行块 23(y=184..206,由 ① 连带清掉)· 正文墨迹 10(y=207..216)',
'     · 正文下留白 40(2em 下内边距 28 + 末行行盒半行距 9)',
'     · 底栏预留 30(15r L36825 的 --spp-rf-foot-h + L36893 的 padding-bottom)。',
'   那个 40px 里有 28px 是站点给正文框的下内边距 —— Reddit 模式下底栏那 30px 已经单独预留了,',
'   两层叠着正是「一行被切成三段」的来源 ⇒ 把 28px 收到 6px(左右内边距、上内边距一个字不动)。',
'   ★ 为什么外层不加 .spp-rf-row 通配:一行里还有第二枚 .tpc_content(段末那行,装附件与悬赏框),',
'     READ_CSS L49498-49526 给它写的是 padding-bottom:0 !important(那边有过「附件被藏」的前科);',
'     这里用 th.r_one 把范围钉在**正文那一格**上(段末行的 th 没有 class)—— 段末行一根手指都不碰。 */',
'html.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_one > .tpc_content {',
'    padding-bottom: 6px !important;',
'}',
'/* ★ 底栏预留(--spp-rf-foot-h / 15r L36825 + L36893)**故意一个字不动**:那 30px 里住着',
'   四枚动作(回复 / 只看该作者 / 屏蔽 / 引用),归 117 号补丁;收窄它会把 117 排好的底栏往上顶。',
'   它也不参与「三段」观感 —— 实测底栏文字下沿到下一行发丝线只有 7px。 */',
'',
'/* ---- ⑤ 缩进步长 40 → 36px 的派生数值表(令牌改在 15q L36252 + 15r L36820 兜底)---------------',
'   令牌:--spp-nest-step = 36px;15r 的 --spp-rf-step 兜底同步 36px。',
'   派生(改前 → 改后,单位 px):',
'     深度       d1      d2      d3      d4',
'     缩进左距   50→46   90→82   130→118 170→154    padding-left = step*N + 10(L36272-36275)',
'     轨道 x     40→36   80→72   120→108 160→144    box-shadow 偏移 = step*1..N(L36283-36286)',
'     圆标 left  10      50→46   90→82   130→118    step*(N-1) + 10(L36304-36307)',
'     底栏 left  123→119 163→159 203→199 243→239    step*N + 10 + 72 + 1(L36898-36901)',
'   封顶仍是 4 档(SPP_NEST_DEPTH_MAX = 4,L36241):最宽 154px(40px 时代 170px、18px 时代 82px)。',
'   本补丁不改任何一条派生规则 —— 它们全部写成 calc(var(--spp-nest-step) * N ...),改令牌即改全部。 */',
'',
'/* ==================== 119:内容列居中限宽 / 头像 40→60px / 行卡去圆角(操作者四条投诉里的 ①③④)====================',
'   ★ 三条都在 html.spp-rf-on 闸门内 ⇒ 关掉「Reddit 式楼层排版」即零匹配、逐像素回脚本美化版。',
'   ★ 投诉②(箭头指向的位置)不属于本轮范围,本段一个字都没写。',
'   ---- 119-R1:内容列水平居中 + 上限宽(Reddit 式窄栏)----',
'   作用面**只有 #main > form.spp-flow 这一层**;上限是一枚令牌 --spp-rf-col-max: 1000px',
'   (定义在 15r 令牌块)⇒ 想改宽窄只改那一个数。刻意不碰 #main 本身:分区条、整页底色与',
'   页面高度都挂在 #main 上,动它才是真会出事的做法。',
'   ★ 实测几何(操作者 2560 宽屏;换算视口 1366 / dpr 1.875):#main x=0 w=1354、',
'     form.spp-flow x=0 w=1354 ⇒ 整列贴左、右边一大片星空。改后 (1354 − 1000) / 2 = 177,',
'     左右各留 177 ⇒ 正文列居中。',
'   ★ 不在本条链上、因此一个像素都不会移的固定位 / 外部元素(逐条读过源码):',
'     · 站点上/下两条翻页条 div.t3.spp-pgbar:#main 的**直接子元素、form 的兄弟**。',
'       静态证据(tmp/r1/live/read_2999999_p1.html,解析脚本 tmp/land/_probe-119-dom.js):',
'       深度 2 的 div class=t3 落在 idx 35260(form name=delatc 起于 37216)与 idx 212329',
'       (上一个 form 结束于 212322)⇒ 两条都在那个 form 之外;本文件自己的选择器同口径:',
'       html.spp-read-on #main > .t3.spp-pgbar(L49390)与',
'       html.spp-no-topics #main > div.t3:has(div.pages) > .fl(L20469)。',
'     · #spp-nav-panel:视口定位(L12132 面板贴右边 12px、竖向 50% 居中)⇒ 包含块是视口。',
'     · #spp-imgidx(15a-2 含图索引浮窗):视口定位(L31499 面板贴左边 14px)⇒ 同上。',
'     · 房子按钮 .spp-hbtn-wrap:挂在 #breadcrumbs 里,而面包屑板块是 #main > .bdbA',
'       (L49155)⇒ 同样是 form 的兄弟,不在这条链上。',
'     · 站点悬停卡 div.user-info:站点 read.open() 在 body 末尾新建的浮层(L50536-50537',
'       实测记录)⇒ 在 #main 之外。 · 星空层 #spp-starfield:视口定位 + inset:0(L44399 一带)。',
'   ★ 已知观感后果(不是错位、位置一个像素没变,故本条不动它):上/下翻页条与面包屑板块',
'     仍是满宽 1354 —— 它们比正文列宽。要一起收窄是另一件事(把 .t3 加进同一条选择器即可)。 */',
'/* ★【落地执行者修正·AME-278】下面这句 display: block !important 不是 119 的原样 —— 119 只写了 max-width 与左右 auto,',
'   而站点自带 read.css 有 form{display:inline;},行内元素上 max-width / margin:auto 一概无效 ⇒ 119 那条规则',
'   实测命中(computed max-width=1000px、margin-left=auto)但元素仍满宽 x≈12 / w=1400(视口 1440)。',
'   活体反证:改 block ⇒ x=212.33 / w=1000 / right=1212.33(1440 视口、左右各留 200);改 inline-block ⇒',
'   w=1000 但 x=12.33 仍贴左。⇒ 只补这一句、只为达成「内容列居中限宽」这个功能规格;',
'   回退 = 删这一句(回到 119 原样)。仍挂在 html.spp-rf-on 闸门下 ⇒ 关态零匹配。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow { display: block !important; max-width: var(--spp-rf-col-max, 1000px) !important; margin-left: auto !important; margin-right: auto !important; }',
'',
'/* ---- 119-R2:头像 40 → 60px(令牌已改),并把 15a 那圈装裱框夹成正方形 ----',
'   15a(initAvatarRatio 的皮,READ_CSS L49553-49575)有四句会跟本条抢同一枚 img,逐条列清:',
'     L49555 (0,6,2)  width:150px !important                                     → 压成 60',
'     L49558 (0,6,2)  height:auto / min-height:150px / max-height:200px !important → 三面夹死成 60',
'     L49570 (0,6,2)  object-fit:contain(细长图那条 .spp-ava-crop 是 cover,(0,7,2))  → 统一 cover',
'     L49560 (0,6,2)  border-radius:14px !important                              → 改成 50%(圆)',
'   15a 的选择器是 html.spp-read-on .t5.t2 .r_two .user-pic img:not(.spp-ava-off) ⇒ (0,6,2)。',
'   ★ 本条特异性算式(逐段数,记号 0/0/0 = id/class/元素):',
'     html(0/0/1) #main(1/0/0) form(0/0/1) .spp-flow(0/1/0) div(0/0/1) .t5(0/1/0) .t2(0/1/0)',
'     .spp-rf-row(0/1/0) th(0/0/1) .r_two(0/1/0) div(0/0/1) .user-pic(0/1/0) img(0/0/1)',
'     :not(.spp-ava-off)(+0/1/0 —— :not 自身不计,只计参数)  加上两个 html.spp-rf-on 类',
'     ⇒ 合计 **(1,9,6)**。',
'     · (1,9,6) > (0,6,2):先比 id 数,1 > 0 ⇒ 15a 那四句全输(同为 important,平局才看特异性)。',
'     · 也 > 15r 原条 L36912 的 (1,6,5)(同 id 同类数:本条多 .user-pic 与 :not 参数两枚类、',
'       多一枚 .spp-rf-on、多一枚 div)。',
'   ★ 正方形怎么保证:宽 / 高 / min-height / max-height **四句同写同一把尺子** --spp-rf-avatar',
'     ⇒ 四者恒等于 60px。15a 那句 height:auto(想按内在比例推高)与 min/max 两个夹子全部作废,',
'     不存在「宽 60、高 150」这种组合。盒模型:15a 的 box-sizing:border-box 继续生效(本条不覆盖',
'     它)⇒ 60 这个数**包含**它自己的 3+3 内衬与 1+1 发丝边,渲染外盒正好 60×60;',
'     object-fit:cover 保证非方图裁切填满、不拉伸不变形。',
'   ★ 只声明尺寸 / 裁切 / 圆角:padding、border、background-color 三样一个字没写 ——',
'     那是 15a 装裱框的本体,本轮不动(40px 时它就在、观感已验收过)。 */',
'html.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_two > div.user-pic img:not(.spp-ava-off) { box-sizing: border-box !important; width: var(--spp-rf-avatar) !important; height: var(--spp-rf-avatar) !important; min-height: var(--spp-rf-avatar) !important; max-height: var(--spp-rf-avatar) !important; max-width: none !important; border-radius: 50% !important; object-fit: cover !important; }',
'',
'/* ---- 119-R3:行卡圆角 17px → 0(投诉③「框架还是没优化好」的最后那层观感)----',
'   行卡圆角**不是**样式表写的:15b 的 initReadFlow.tag() 把它写成行内 important(277 的 L36208)。',
'   内联 important 优先于任何样式表 important ⇒ 样式表侧无解;所以走 15b 自己那条变量出口',
'   (同函数 2.55.25 立的先例):L36208 改成 var(--spp-flow-r-top, 17px 17px 0 0) 与',
'   var(--spp-flow-r-bot, 0 0 17px 17px),中间行仍是字面量 0;上面令牌块把两枚变量置 0。',
'   回退:删掉令牌块那两行 ⇒ 变量未定义 ⇒ 取兜底 ⇒ 与 277 逐字节同观感。',
'   ★ 只去圆角:108-R1 那道**已透明**的 1px 边框(占位不变、只是不画)与 108-R1b 的行底色钉子',
'     一个字都没碰;行间细横线(border-bottom: HAIR)与底栏那套也不归本轮。 */',
'/* ---- 120:默认头像色块(.spp-ava-initial)尺寸跟随头像令牌 ----',
'   病灶:没有头像的楼层,15c 把 <img> 换成 span.spp-ava-initial(paintInitial,L30598-30637),',
'   而它的尺寸**只有一处声明** —— READ_CSS 的 html.spp-read-on .t5.t2 .r_two .spp-ava-initial',
'   (L49494 选择器 / L49522 尺寸)写着 width:150px + height:150px(两个都是 !important)。',
'   数字 150 的来历见 L49515-49521 的批注:2.53.8 按「站点头像基准 150」标定的,那时头像列',
'   还是 72px、真头像也是 157 —— 150 的色块当时就比列宽大,只是 119 之前列的 scrollWidth',
'   本来就被名字黑条(L36916 那条 150px 的 <a>)撑到 150,看不出多出来的这 54px。',
'   ★ 15r 那条 L36929(--spp-ava-fs-max / -min / -one)只改**字号**三把尺子,尺寸一个字没碰',
'     ⇒ 119 把头像列 72 → 96、真头像钉成 60 之后,「有头像」的楼层是 60×60 正圆,',
'       「无头像」的楼层仍是 150×150 的方块 ⇒ **比 96px 的列宽多 54px**,溢出行左栏、',
'       压住正文。操作者看到的就是「某个用户头像是一块大方块压住正文」。',
'   ★ 为什么追加覆盖、不改 L49522 原地:那条挂在 html.spp-read-on 上(不是 spp-rf-on),',
'     两种模式共用 ⇒ 原地改会把「关掉 Reddit 式楼层排版」时的脚本美化版色块一起缩小,',
'     超出本轮范围(用户投诉的是 Reddit 形态)。本条只在 html.spp-rf-on 闸门内生效。',
'   ★ 特异性算式(逐段数,记号 0/0/0 = id/class/元素;:not() 只计参数,本条没有 :not):',
'     html(0/0/1) .spp-rf-on(0/1/0) ×3 .spp-rf-on(0/1/0) .spp-rf-on(0/1/0) #main(1/0/0)',
'     form(0/0/1) .spp-flow(0/1/0) div(0/0/1) .t5(0/1/0) .t2(0/1/0) .spp-rf-row(0/1/0)',
'     th(0/0/1) .r_two(0/1/0) .spp-ava-initial(0/1/0) ⇒ 合计 **(1,6,4)**。',
'     · 压 L49522 的 (0,6,2):先比 id 数,1 > 0 ⇒ 本条赢(同为 important,平局才看特异性)。',
'     · 压 15r 原条 L36929 的 (1,5,2):id 平(都 1),比 class 6 > 5 ⇒ 本条赢。',
'     · 连写三枚 .spp-rf-on 与 119-R1 / 108 段同一手法(L37121 / L37131 / L37146 / L37160):',
'       只抬权、不改语义(html 上挂一次即满足);关掉总开关 ⇒ L37167 门口 return、一个类都不加',
'       ⇒ 本条零匹配。写在哨兵之前 ⇒ 与 119 同处一个样式表且排在它之后,文档序也不吃亏。',
'   ★ 只改尺寸两句话:',
'     · 不写像素数,一律引用 --spp-rf-avatar(119 之后是 60px,40px 或将来任何值都自动跟随);',
'     · 令牌从 html 继承(令牌块 L36873-36888 定义在 html.spp-rf-on 上,自定义属性继承穿透',
'       .user-pic 那条 line-height:0 / font-size:0(只挡文字相关属性,挡不住自定义属性)。',
'   ★ 圆角一个字没写:L49524 现在是 14px 圆角方块(**不是圆的**)⇒ 按硬约束不顺手改圆角。',
'     margin / padding / overflow / color / 字号 / 行高 / 字距 / 阴影(L49522 后半与 L49523-49528)',
'     与三把字号尺子(--spp-ava-fs-*)全部原样:色块变小后字号由 fitTile() 自己重新二分。',
'   ★ 不碰:底栏四枚动作(117)、行间细横线(118)、缩进步长与竖线(116)、',
'     站点标题行 h1[id^="subject_"](116)、头像令牌值本身(119)、节点位置与数量。 */',
'html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row th.r_two .spp-ava-initial { width: var(--spp-rf-avatar) !important; height: var(--spp-rf-avatar) !important; }',
'',
'/* ===== SPP-RF-END ===== */'
].join('\n');
function initRedditFloor() {
if (!WANTS.readOnly) return;
if (!SPP_CONFIG.bool('spp_nest_on', true)) return;    
ensureStyle('spp-rf-style', CSS_RF);
document.documentElement.classList.add('spp-rf-on');
let stamp = '';
let timer = 0;
function pass() {
const rows = document.querySelectorAll('#main > form > .t5.t2');
if (!rows.length) return;
const list = Array.prototype.slice.call(rows);
const sig = list.map(function (r) { return (r.querySelector('[id^=td_]') || {}).id || '?'; }).join(',') +
'|' + list.length + '|' + (list[0].classList.contains('spp-rf-row') ? '1' : '0');
if (sig === stamp) return;
const marks = [];
for (let i = 0; i < list.length; i++) {
const r = list[i];
const tip = r.querySelector('.tiptop');
if (!tip) continue;
const no = tip.querySelector('span.fl > a');                 
const links = r.querySelectorAll('th.r_two a[href*="u.php"]');
let nameTxt = '';
for (let li = 0; li < links.length; li++) {
if (links[li].closest('.user-pic')) continue;      
const t = (links[li].textContent || '').trim();
if (t) { nameTxt = t; break; }
}
marks.push({ r: r, tip: tip, no: no, name: nameTxt });
}
for (let k = 0; k < marks.length; k++) {
const m = marks[k];
m.r.classList.add('spp-rf-row');
let em = m.tip.querySelector('.spp-rf-name');
if (!m.name) { if (em) em.remove(); continue; }
if (!em) {
em = document.createElement('em');
em.className = 'spp-rf-name';
if (m.no && m.no.parentNode) m.no.parentNode.insertBefore(em, m.no.nextSibling);
else m.tip.appendChild(em);
}
if (em.textContent !== m.name) em.textContent = m.name;
}
stamp = sig;
}
onDomReady(function () {
pass();
setTimeout(pass, 600);
const target = document.getElementById('main') || document.body;
new MutationObserver(function () {
clearTimeout(timer);
timer = setTimeout(pass, 150);
}).observe(target, { childList: true, subtree: true });
});
}
const SPP_ACT_SVG = {
reply: '<svg viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor"><path d="M10 5.12L3.12 12 10 18.88V14.5c6.5 0 10.5 3.2 11 9.5 0-7.2-4.5-13-11-13.88V5.12z"/></svg>',
author: '<svg viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor"><path d="M12 2a4 4 0 0 1 4 4c0 1.95-1.4 3.58-3.25 3.93l1.75 2.07H9.5l1.75-2.07A4.002 4.002 0 0 1 12 2zm0 11c3.87 0 7 2.13 7 5v2H5v-2c0-2.87 3.13-5 7-5zm6-5h3v2h-3V8zm-15 0h3v2H3V8z"/></svg>',
block: '<svg viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor"><path fill-rule="evenodd" clip-rule="evenodd" d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-7.9 10c0-1.85.64-3.55 1.71-4.9L16.9 18.19A7.94 7.94 0 0 1 12 20c-4.41 0-8-3.59-8-8zm13.79 4.9L6.81 5.81A7.94 7.94 0 0 1 12 4c4.41 0 8 3.59 8 8 0 1.85-.64 3.55-1.71 4.9z"/></svg>',
quote: '<svg viewBox="0 0 24 24" width="1em" height="1em" fill="currentColor"><path d="M4.58 17.32C3.55 16.23 3 14.84 3 13.15c0-4.07 2.87-7.79 7.42-9.15l.83 1.62c-3.1.99-4.8 2.92-5.07 5.13.43-.2.93-.32 1.48-.32 2.1 0 3.8 1.7 3.8 3.8 0 2.21-1.79 4-4 4-.98 0-1.89-.37-2.58-.91zm10 0C13.55 16.23 13 14.84 13 13.15c0-4.07 2.87-7.79 7.42-9.15l.83 1.62c-3.1.99-4.8 2.92-5.07 5.13.43-.2.93-.32 1.48-.32 2.1 0 3.8 1.7 3.8 3.8 0 2.21-1.79 4-4 4-.98 0-1.89-.37-2.58-.91z"/></svg>'
};
const CSS_ACT = `
/* ===== SPP-ACT-BEGIN ===== */
html.spp-act-on .tiptop > .fr .spp-act__ico {
    display: inline-flex; align-items: center; justify-content: center;
    width: 1em; height: 1em; font-size: 15px; line-height: 1; font-style: normal;
    vertical-align: -0.14em; margin-right: 5px; flex: 0 0 auto;
}
html.spp-act-on .tiptop > .fr .spp-act__lb { font-style: normal; }
html.spp-act-icon .tiptop > .fr .spp-act__lb { display: none !important; }
html.spp-act-text .tiptop > .fr .spp-act__ico { display: none !important; }
html.spp-act-icon .tiptop > .fr .spp-act__ico { margin-right: 0; }
html.spp-act-both .tiptop > .fr > a,
html.spp-act-both .tiptop > .fr > span > a,
html.spp-act-both .tiptop > .fr > div.dropdown > a,
html.spp-act-icon .tiptop > .fr > a,
html.spp-act-icon .tiptop > .fr > span > a,
html.spp-act-icon .tiptop > .fr > div.dropdown > a { display: inline-flex !important; align-items: center; }
/* ===== SPP-ACT-END ===== */
`;
function initActionIcons() {
if (!WANTS.readOnly) return;
const MODE = SPP_CONFIG.pick('spp_act_style', 'both', ['both', 'icon', 'text']);
const root = document.documentElement;
root.classList.add('spp-act-on');
root.classList.toggle('spp-act-both', MODE === 'both');
root.classList.toggle('spp-act-icon', MODE === 'icon');
root.classList.toggle('spp-act-text', MODE === 'text');
if (MODE === 'text') return;
ensureStyle('spp-act-style', CSS_ACT);
function paint(a, key) {
if (!a.querySelector(':scope > .spp-act__ico')) {
const ico = document.createElement('i');
ico.className = 'spp-act__ico';
ico.innerHTML = SPP_ACT_SVG[key];
a.insertBefore(ico, a.firstChild);
}
if (!a.querySelector(':scope > .spp-act__lb')) {
const nodes = Array.prototype.slice.call(a.childNodes);
const lb = document.createElement('i');
lb.className = 'spp-act__lb';
for (let i = 0; i < nodes.length; i++) {
if (nodes[i].nodeType === 3 && nodes[i].textContent.trim()) lb.appendChild(nodes[i]);
}
if (lb.childNodes.length) a.appendChild(lb);
}
}
function pass() {
const bars = document.querySelectorAll('#main > form > .t5.t2 .tiptop > .fr');
for (let i = 0; i < bars.length; i++) {
const as = bars[i].querySelectorAll('a');
for (let k = 0; k < as.length; k++) {
const a = as[k];
if (a.closest('.dropdown-content')) continue;
const t = (a.textContent || '').replace(/\s+/g, '');
let key = '';
if (t === '回复') key = 'reply';
else if (t === '引用') key = 'quote';
else if (t === '屏蔽') key = 'block';
else if (t.indexOf('只看') === 0) key = 'author';
if (key) paint(a, key);
}
}
}
let actTimer = 0;
onDomReady(function () {
pass();
setTimeout(pass, 600);
const target = document.getElementById('main') || document.body;
new MutationObserver(function () {
clearTimeout(actTimer);
actTimer = setTimeout(pass, 150);
}).observe(target, { childList: true, subtree: true });
});
}
function initAutoExpandHidden() {
if (!WANTS.readOnly) return;
const KEY = 'spp_auto_expand_hidden';
if (!SPP_CONFIG.bool(KEY, true)) return;
function expandPost(post) {
const bodies = post.querySelectorAll('.js-hidepuremark');
if (!bodies.length) return;
let folded = false;
for (let i = 0; i < bodies.length; i++) {
if (getComputedStyle(bodies[i]).display === 'none') { folded = true; break; }
}
if (!folded) return;
bodies.forEach(el => el.style.removeProperty('display'));   
post.querySelectorAll('.js-puremark-content')
.forEach(el => el.style.setProperty('display', 'none'));  
post.querySelectorAll('a[onclick*="expandpuremark"]').forEach(a => {
const box = a.parentElement;
if (box) box.style.setProperty('display', 'none');        
});
post.dataset.sppPuremarkOpen = '1';
if (typeof sppAvaRefit === 'function') sppAvaRefit();
}
function sweep() {
const posts = document.querySelectorAll('table.js-post');
for (let i = 0; i < posts.length; i++) expandPost(posts[i]);
}
onDomReady(() => { sweep(); setTimeout(sweep, 600); });
onDomReady(() => {
const target = document.getElementById('main') || document.body;
new MutationObserver(() => sweep()).observe(target, { childList: true, subtree: true });
});
}
function initHideNoise() {
if (!WANTS.readOnly) return;
const SMILE_KEY = 'spp_hide_smileonly';
const ANY_KEY = 'spp_hide_words_any';       
const EXACT_KEY = 'spp_hide_words_exact';   
const PACK_KEY = 'spp_wordpack';            
const PACK_ON_KEY = 'spp_wordpack_on';
const CLS_SMILE = 'spp-smileonly';
const CLS_WORD = 'spp-wordkill';
const DONE = 'sppNoiseDone';
const SMILE_SRC = /\/images\/post\/(smile|face)\//i;
function parseColumn(raw, isAny) {
const out = [];
String(raw == null ? '' : raw).split(/[\r\n]+/).forEach(function (line) {
const s = line.trim().replace(/\s+/g, '');
if (!s || s.charAt(0) === '#') return;
let w = s;
if (s.length >= 2 && s.charAt(0) === '\\' &&
(s.charAt(1) === '#' || s.charAt(1) === '\\')) {
w = s.slice(1);
}
out.push({ any: isAny, w: w });
});
return out;
}
const wantPack = SPP_CONFIG.bool(PACK_ON_KEY, false);
const words = [].concat(
parseColumn(SPP_CONFIG.text(ANY_KEY, ''), true),
parseColumn(SPP_CONFIG.text(EXACT_KEY, ''), false),
wantPack ? parseColumn(SPP_CONFIG.text(PACK_KEY, ''), false) : []
);
const wantSmile = SPP_CONFIG.bool(SMILE_KEY, false);
ensureStyle('spp-hso-style', '/* SPP-HIDE-NOISE-BEGIN */\n' +
'html.spp-hso-on #main .t5.t2:has(> table.js-post.spp-smileonly) { display:none !important; }\n' +
'html.spp-hkw-on #main .t5.t2:has(> table.js-post.spp-wordkill) { display:none !important; }\n' +
'html.spp-hso-on #main table.js-post.spp-smileonly { display:none !important; }\n' +
'html.spp-hkw-on #main table.js-post.spp-wordkill { display:none !important; }\n' +
'/* SPP-HIDE-NOISE-END */');
if (!wantSmile && !words.length) return;
const rootEl = document.documentElement;
if (wantSmile) rootEl.classList.add('spp-hso-on');
if (words.length) rootEl.classList.add('spp-hkw-on');
function bodyOf(post) {
return post.querySelector('.tpc_content > .f14[id^="read_"]') ||
post.querySelector('.tpc_content .f14[id^="read_"]');
}
function scan(body) {
const imgs = body.querySelectorAll('img');
let smile = 0, other = 0;
for (let i = 0; i < imgs.length; i++) {
const im = imgs[i];
if (!im.classList.contains('spp-sticker-img') && SMILE_SRC.test(im.src || '')) smile++;
else other++;
}
const clone = body.cloneNode(true);
clone.querySelectorAll('img').forEach(function (n) { n.parentNode.removeChild(n); });
return { smile: smile, other: other, resid: (clone.textContent || '').replace(/\s+/g, '') };
}
function wordHit(resid) {
if (!resid) return false;
const low = resid.toLowerCase();
for (let i = 0; i < words.length; i++) {
const w = words[i].w.toLowerCase();
if (words[i].any ? low.indexOf(w) >= 0 : low === w) return true;
}
return false;
}
function markPost(post) {
if (post.dataset[DONE]) return;
const body = bodyOf(post);
if (!body || body.id === 'read_tpc') return;
post.dataset[DONE] = '1';
const s = scan(body);
if (s.other) return;
if (wantSmile && s.smile > 0 && !s.resid) { post.classList.add(CLS_SMILE); return; }
if (words.length && wordHit(s.resid)) post.classList.add(CLS_WORD);
}
function sweep() {
const posts = document.querySelectorAll('#main table.js-post');
for (let i = 0; i < posts.length; i++) markPost(posts[i]);
}
onDomReady(function () { sweep(); setTimeout(sweep, 600); });
onDomReady(function () {
const target = document.getElementById('main') || document.body;
new MutationObserver(function () { sweep(); }).observe(target, { childList: true, subtree: true });
});
}
function initUserStatusCard() {
if (!WANTS.readOnly) return;
const ACCENT = { 'SP币': 'is-sp', '发帖': 'is-post' };
const ICON_MAP = {
readprofile: { k: 'profile', t: '资料' },
readmessage: { k: 'msg', t: '短消息' },
readonline: { k: 'friend', t: '加好友' },
readmagic: { k: 'magic', t: '道具' },
};
const ICON_SVG = {
profile: '<rect x="2.1" y="2.6" width="11.8" height="10.8" rx="2.4"/><circle cx="6.4" cy="6.9" r="1.7"/><path d="M3.7 11.5c.4-1.4 1.5-2.1 2.7-2.1s2.3.7 2.7 2.1"/><path d="M11 6.7h1.4M11 9.3h1.4"/>',
msg: '<path d="M13.4 8.7a1.7 1.7 0 0 1-1.7 1.7H6.5L3.2 13.1V4.7A1.7 1.7 0 0 1 4.9 3h6.8a1.7 1.7 0 0 1 1.7 1.7z"/><path d="M6.2 6h4M6.2 8.2h2.5"/>',
friend: '<circle cx="6.5" cy="5.4" r="2.3"/><path d="M2.6 13.3c.5-2.1 2.1-3.3 3.9-3.3.9 0 1.8.3 2.5.8"/><path d="M12.3 9.4v4M10.3 11.4h4"/>',
magic: '<path d="M3.3 12.7 9.4 6.6"/><path d="M11.5 2.4l.7 1.8 1.8.7-1.8.7-.7 1.8-.7-1.8L8.9 4.9l1.8-.7z"/><path d="M5.3 3.4l.45 1.1 1.1.45-1.1.45-.45 1.1-.45-1.1-1.1-.45 1.1-.45z"/>',
dot: '<circle cx="8" cy="8" r="2.4"/><path d="M8 2.6v1.6M8 11.8v1.6M2.6 8h1.6M11.8 8h1.6"/>',
};
function decorateIcons(wrap) {
if (!wrap) return;
wrap.querySelectorAll('.listread li').forEach(li => {
if (li.dataset.sppUcIco) return;
const a = li.querySelector('a');
const d = li.querySelector('div');
if (!a || !d) return;
let key = '';
for (const name in ICON_MAP) { if (d.classList.contains(name)) { key = name; break; } }
const full = (li.getAttribute('title') || d.textContent || '').trim();
const meta = ICON_MAP[key] || { k: 'dot', t: full.slice(0, 5) || '操作' };
d.classList.add('spp-uc-old');                 
const box = document.createElement('span');
box.className = 'spp-uc__ico';
box.innerHTML = '<svg viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' + ICON_SVG[meta.k] + '</svg>';
const lbl = document.createElement('span');
lbl.className = 'spp-uc__lbl';
lbl.textContent = meta.t;
a.appendChild(box);
a.appendChild(lbl);
if (!a.getAttribute('aria-label')) a.setAttribute('aria-label', full || meta.t);
li.dataset.sppUcIco = '1';
});
}
function build(card) {
if (card.dataset.sppUcDone) return;
const wrap = card.querySelector('.user-infoWrap');
if (!wrap) return;
const spacer = wrap.querySelector(':scope > div.c');   
const nodes = [];
let started = !spacer;
for (let i = 0; i < wrap.childNodes.length; i++) {
const n = wrap.childNodes[i];
if (n === spacer) { started = true; continue; }
if (started) nodes.push(n);
}
if (!nodes.length) return;
const lines = [[]];
nodes.forEach(n => {
if (n.nodeType === 1 && n.tagName === 'BR') { lines.push([]); return; }
lines[lines.length - 1].push(n);
});
const rows = [];
lines.forEach(line => {
const text = line.map(n => n.textContent || '').join('');
const m = text.match(/^\s*([^::]{1,8})[::]\s*([\s\S]*?)\s*$/);
if (!m) return;
rows.push({ k: m[1], v: m[2] || '—' });
});
if (!rows.length) return;
const box = document.createElement('div');
box.className = 'spp-uc__rows';
rows.forEach(r => {
const row = document.createElement('div');
row.className = 'spp-uc__row' + (ACCENT[r.k] ? ' ' + ACCENT[r.k] : '');
const k = document.createElement('span');
k.className = 'spp-uc__k';
k.textContent = r.k;
const v = document.createElement('span');
v.className = 'spp-uc__v';
v.textContent = r.v;
row.appendChild(k);
row.appendChild(v);
box.appendChild(row);
});
nodes.forEach(n => { if (n.parentNode === wrap) wrap.removeChild(n); });
wrap.appendChild(box);
decorateIcons(wrap);
card.classList.add('spp-ucard');
card.dataset.sppUcDone = '1';
}
function sweep() {
document.querySelectorAll('table.js-post span.user-info[id^="showface_"]').forEach(build);
}
onDomReady(() => { sweep(); setTimeout(sweep, 700); });
}
const CSS_FPK = `
/* ===== SPP-FPK-BEGIN ===== */
.spp-fpk__trig {
    position:relative; box-sizing:border-box; height:38.7px !important; min-height:0 !important; min-width:120px;
    padding:0 34px 0 12px !important; text-align:left; cursor:pointer;
    font-family:inherit; font-size:14px !important; line-height:1.2 !important; font-weight:400 !important; color:#1f2937 !important; -webkit-text-fill-color:#1f2937 !important;
    background-color:#fff; background-image:none;
    border:1px solid #d8dee7; border-radius:8px;
    transition:border-color .18s ease, color .18s ease, box-shadow .18s ease;
}
.spp-fpk__trig:hover { border-color:#20c997; color:#15795f; box-shadow:0 0 0 3px rgba(32,201,151,.12); }
.spp-fpk__trig::after {
    content:""; position:absolute; right:13px; top:50%; margin-top:-3px;
    width:0; height:0; border-left:5px solid transparent; border-right:5px solid transparent;
    border-top:6px solid #6b7280;
}
.spp-fpk__trig-t { display:block; overflow:hidden; white-space:nowrap; text-overflow:ellipsis; }

.spp-fpk {
    position:fixed; left:50%; transform:translateX(-50%); top:44px; z-index:3400;
    box-sizing:border-box; width:min(1560px, calc(100vw - 32px));
    max-height:calc(100vh - 86px); overflow:auto;
    padding:14px 16px 16px; border-radius:16px;
    background-color:#0b1119;
    background-image:linear-gradient(152deg, rgba(255,255,255,.055) 0%, rgba(0,0,0,0) 62%);
    border:1px solid rgba(255,255,255,.10);
    box-shadow:0 26px 60px rgba(0,0,0,.62);
    color:#dbe6f7; font-size:13px;
    font-family:'Noto Sans SC','Source Han Sans SC','PingFang SC','Microsoft YaHei',sans-serif;
}
.spp-fpk[hidden] { display:none !important; }
.spp-fpk__hd { display:flex; align-items:center; gap:10px; margin:0 0 12px; }
.spp-fpk__t {
    font-size:14.5px; font-weight:700; letter-spacing:.3px;
    color:#eef3fb !important; -webkit-text-fill-color:#eef3fb !important;
}
.spp-fpk__cur {
    margin-left:auto; font-size:12px; color:#7de8b0 !important; -webkit-text-fill-color:#7de8b0 !important;
}
.spp-fpk__x {
    flex:none !important; width:26px !important; height:26px !important; min-height:0 !important; line-height:1 !important; padding:0 !important; cursor:pointer; border-radius:8px; box-shadow:none !important;
    font-size:16px; color:#a9b6c7 !important; -webkit-text-fill-color:#a9b6c7 !important;
    background-color:rgba(255,255,255,.05); background-image:none;
    border:1px solid rgba(255,255,255,.10);
}
.spp-fpk__x:hover { color:#fff !important; -webkit-text-fill-color:#fff !important; background-color:rgba(255,255,255,.12); }

.spp-fpk__grp { margin:0 0 12px; }
.spp-fpk__grp:last-child { margin-bottom:0; }
.spp-fpk__grp-t {
    display:inline-flex !important; align-items:center !important; gap:8px !important; margin:0 0 8px !important; padding:0 !important; height:auto !important; min-height:0 !important; box-shadow:none !important;
    cursor:pointer; background:none; border:0;
    font-size:13.5px !important; line-height:20px !important; font-weight:700 !important; letter-spacing:.2px;
    color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important;
}
.spp-fpk__grp-t:disabled { cursor:default; color:#7de8b0 !important; -webkit-text-fill-color:#7de8b0 !important; }
.spp-fpk__grp-t:hover:not(:disabled) { color:#9dffc9 !important; -webkit-text-fill-color:#9dffc9 !important; }
.spp-fpk__grp-n {
    font-size:10.5px; font-weight:700; line-height:1.6; padding:0 7px; border-radius:999px;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    background-color:rgba(32,201,151,.16); border:1px solid rgba(32,201,151,.45);
}
.spp-fpk__subs { display:flex; flex-wrap:wrap; gap:6px; }
.spp-fpk__subs--cards { display:grid; grid-template-columns:repeat(auto-fill, minmax(140px, 1fr)); gap:6px; }

.spp-fpk__mini {
    box-sizing:border-box; min-width:0; padding:5px 6px 6px; border-radius:9px;
    background-color:rgba(255,255,255,.035); border:1px solid rgba(255,255,255,.075);
}
.spp-fpk__mini-t {
    display:block !important; margin:0 0 3px !important; padding:0 !important;
    height:auto !important; min-height:0 !important;
    cursor:pointer; background:none !important; border:0 !important; box-shadow:none !important;
    font-size:11px !important; line-height:14px !important; font-weight:700 !important;
    text-align:left; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    color:#cfdcee !important; -webkit-text-fill-color:#cfdcee !important;
}
.spp-fpk__mini-t:hover { color:#9dffc9 !important; -webkit-text-fill-color:#9dffc9 !important; }
.spp-fpk__mini-t.is-on { color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; }
.spp-fpk__mini-b { display:block; line-height:0; font-size:0; }
.spp-fpk__mini-b .spp-fpk__lnk {
    display:inline-block !important; padding:0 !important; margin:0 !important;
    width:auto !important; height:auto !important; min-height:0 !important;
    cursor:pointer; background:none !important; border:0 !important; border-radius:0 !important;
    box-shadow:none !important; transform:none !important;
    font-size:10.5px !important; line-height:14px !important;
    vertical-align:top; white-space:nowrap;
    color:#c8d6e6 !important; -webkit-text-fill-color:#c8d6e6 !important;
}
.spp-fpk__mini-b .spp-fpk__lnk + .spp-fpk__lnk::before {
    content:"·"; margin:0 3px; color:rgba(255,255,255,.24) !important; -webkit-text-fill-color:rgba(255,255,255,.24) !important;
}
.spp-fpk__mini-b .spp-fpk__lnk:hover { color:#fff !important; -webkit-text-fill-color:#fff !important; }
.spp-fpk__mini-b .spp-fpk__lnk.is-on {
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:700;
}

.spp-fpk__chip {
    box-sizing:border-box; max-width:100%; padding:2px 8px !important; cursor:pointer; border-radius:8px;
    height:auto !important; min-height:0 !important; box-shadow:none !important;
    font-size:11.5px !important; line-height:1.5 !important; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    color:#c8d6e6 !important; -webkit-text-fill-color:#c8d6e6 !important;
    background-color:rgba(255,255,255,.045); background-image:none;
    border:1px solid rgba(255,255,255,.085);
    transition:background-color .16s ease, border-color .16s ease, color .16s ease;
}
.spp-fpk__chip:hover {
    color:#fff !important; -webkit-text-fill-color:#fff !important;
    background-color:rgba(32,201,151,.16); border-color:rgba(32,201,151,.5);
}
.spp-fpk__chip.is-on,
.spp-fpk__mini-t.is-on + .spp-fpk__mini-b .spp-fpk__chip.is-on {
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:700;
    background-color:rgba(32,201,151,.2); border-color:rgba(32,201,151,.62);
}
.spp-fpk__chip--all { margin-left:2px; font-weight:600; }
/* ===== SPP-FPK-END ===== */`;
const CSS_UPANEL = `
    @property --sppUpAng { syntax:'<angle>'; inherits:false; initial-value:0deg; }

    html.spp-hm-star #infobox.spp-up-on {
        background:rgba(14,18,26,0.90) !important;
        border:1px solid rgba(255,255,255,0.075) !important;
        box-shadow:0 16px 46px rgba(2,6,23,0.50), inset 0 1px 0 rgba(255,255,255,0.05) !important;
    }
    #infobox.spp-up-on > table { border-collapse:separate !important; border-spacing:14px 8px !important; }
    #infobox.spp-up-on td { vertical-align:middle !important; }
    #infobox.spp-up-on td { padding:14px 16px !important; }

    #infobox.spp-up-on,
    #user_info.spp-up-card,
    #infobox.spp-up-on td.spp-up-host-td {
        -webkit-font-smoothing:subpixel-antialiased !important;
        -moz-osx-font-smoothing:auto !important;
    }

    #user_info.spp-up-card {
        position:relative !important;
        min-height:189px;
        border-radius:14px !important;
        overflow:hidden;
        border:2px solid transparent !important;
        background-image:
            radial-gradient(150% 190% at 104% -22%, var(--spp-up-a1,rgba(32,201,151,.26)), transparent 58%),
            linear-gradient(135deg,#222732 0%,#191d25 58%,#12161d 100%),
            conic-gradient(from var(--sppUpAng),
                var(--spp-up-c1,#20c997) 0deg, var(--spp-up-c2,#2f6f68) 120deg,
                var(--spp-up-c3,#387ef0) 240deg, var(--spp-up-c1,#20c997) 360deg);
        background-origin:border-box;
        background-clip:padding-box, padding-box, border-box;
        animation:sppUpSpin 8s steps(36, end) infinite;   /* t122:注册自定义属性 × conic-gradient 背景 ⇒ 原来每帧都要重算样式并重绘渐变;改成 36 步离散步进(8s ⇒ ≈4.5 次/秒),外观仍是慢速流转、只把"每帧"降成"每 222ms" */
        box-shadow:0 1px 25px rgba(255,255,255,.07), 0 18px 44px -20px rgba(0,0,0,.9) !important;
        transition:box-shadow .28s ease, transform .28s ease;
    }
    #user_info.spp-up-card:hover {
        transform:translateY(-2px);
        box-shadow:0 1px 30px rgba(255,255,255,.12), 0 22px 52px -20px rgba(0,0,0,.95) !important;
    }
    @keyframes sppUpSpin { to { --sppUpAng:360deg; } }

    #user_info.spp-up-card::after {
        content:''; position:absolute; inset:2px; z-index:1; border-radius:12px;
        pointer-events:none;
        box-shadow:inset 0 1px 0 rgba(255,255,255,.12);
        background:linear-gradient(180deg, rgba(255,255,255,.07), transparent 36%);
    }

    #user_info.spp-up-card .spp-up__real {
        position:absolute; inset:14px 16px; z-index:3;
        display:grid;
        grid-template-columns:60px minmax(0,1fr) auto;
        grid-template-rows:auto auto auto;
        align-content:center;
        column-gap:16px; row-gap:9px;
        align-items:center;
        overflow:hidden;
    }

    #user_info.spp-up-card .spp-up__av {
        grid-column:1; grid-row:1 / span 2;
        position:relative; width:60px; height:60px; justify-self:start;
        box-sizing:border-box;
        border-radius:50%; padding:3px;
        box-shadow:0 6px 18px -8px rgba(0,0,0,.85);
    }
    #user_info.spp-up-card .spp-up__av::before {
        content:''; position:absolute; inset:0; border-radius:50%; z-index:0;
        background:conic-gradient(from 140deg,
            var(--spp-up-c1,#20c997), var(--spp-up-c2,#2f6f68),
            var(--spp-up-c3,#387ef0), var(--spp-up-c1,#20c997));
        animation:sppUpRing 9s linear infinite;
        will-change:transform;   /* t119:rotate 循环动画提升到合成层(纯提示,不改渲染结果) */
    }
    @keyframes sppUpRing { to { transform:rotate(360deg); } }
    #user_info.spp-up-card:hover .spp-up__av::before { animation-duration:2.6s; }

    #user_info.spp-up-card .spp-up__av img {
        position:relative !important;
        z-index:1;
        width:100% !important; height:100% !important;
        object-fit:cover; border-radius:50%;
        display:block; background:#232a33;
        clip:auto !important;
        float:none !important; margin:0 !important;
    }

    #user_info.spp-up-card .spp-up__av.spp-av-spin img {
        animation: sppAvSpin var(--spp-av-spin, 8s) linear infinite;
        animation-direction: var(--spp-av-dir, normal);
        will-change: transform;
    }
    @keyframes sppAvSpin { to { transform: rotate(360deg); } }

    #user_info.spp-up-card .spp-up__row1 {
        grid-column:2; grid-row:1;
        display:flex; align-items:center; flex-wrap:wrap; gap:7px; min-width:0;
    }
    #user_info.spp-up-card .spp-up__chip {
        display:inline-flex; align-items:center; gap:5px;
        height:24px; padding:0 10px; border-radius:8px;
        background:rgba(255,255,255,.055);
        border:1px solid rgba(255,255,255,.105);
        font-size:12px; color:#a9bccb; white-space:nowrap;
        transition:transform .18s ease, background .18s ease, border-color .18s ease;
    }
    #user_info.spp-up-card .spp-up__chip:hover {
        transform:translateY(-1px); background:rgba(32,201,151,.16); border-color:rgba(32,201,151,.42);
    }
    #user_info.spp-up-card .spp-up__chip .k { font-size:11px; color:#8798a8; line-height:24px; }
    #user_info.spp-up-card .spp-up__chip .v {
        font-weight:700; font-size:13px; color:#e8eef6;
        font-variant-numeric:tabular-nums; letter-spacing:-.01em;
        line-height:24px;
    }
    #user_info.spp-up-card .spp-up__chip--lv .v {
        background:linear-gradient(45deg,#5ff0c0,#63b8ff);
        -webkit-background-clip:text; background-clip:text; color:transparent;
    }
    #user_info.spp-up-card .spp-up__acts { display:inline-flex; align-items:center; gap:5px; margin-left:2px; }
    #user_info.spp-up-card .spp-up__acts a,
    #user_info.spp-up-card .spp-up__more {
        display:inline-flex; align-items:center; gap:4px;
        height:24px; padding:0 10px; border-radius:999px;
        font-size:12px; text-decoration:none !important;
        color:#a9d8cd !important; background:rgba(255,255,255,.07) !important;
        border:1px solid rgba(255,255,255,.14);
        transition:background .16s ease, transform .16s ease, border-color .16s ease, color .16s ease;
    }
    #user_info.spp-up-card .spp-up__acts a:hover,
    #user_info.spp-up-card .spp-up__more:hover {
        background:rgba(32,201,151,.22) !important; border-color:rgba(32,201,151,.55);
        color:#d8fff5 !important; transform:translateY(-1px);
    }
    #user_info.spp-up-card #td_u {
        float:none !important; clear:none !important;
        width:auto !important; height:24px !important;
        font-size:12px !important; color:#a9d8cd !important;
        background-image:none !important;
        text-indent:0 !important;
        overflow:visible !important;
        line-height:1 !important;
        display:inline-flex !important; align-items:center;
    }
    #user_info.spp-up-card #td_u::after { content:'▼'; font-size:9px; margin-left:4px; opacity:.8; }

    #user_info.spp-up-card .spp-up__sign {
        grid-column:2 / span 2; grid-row:2;
        display:flex; align-items:center; gap:8px; min-width:0;
        padding:8px 12px 8px 13px; border-radius:10px;
        background:linear-gradient(100deg, rgba(255,255,255,.07), rgba(255,255,255,.028));
        border-left:3px solid var(--spp-up-c2,#2f6f68);
        box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
        transition:background .22s ease, border-color .22s ease;
    }
    #user_info.spp-up-card:hover .spp-up__sign {
        background:linear-gradient(100deg, rgba(32,201,151,.16), rgba(56,126,240,.08));
    }
    #user_info.spp-up-card #honor {
        flex:1; min-width:0;
        font-size:13.5px !important; color:#cfd9e3 !important;
        font-style:italic; letter-spacing:.2px;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    #user_info.spp-up-card #sethonor {
        flex:none; display:inline-flex; align-items:center; gap:4px;
        font-size:11.5px !important; color:#8b9bab !important; text-decoration:none !important;
        padding:2px 8px; border-radius:6px;
        transition:background .16s ease, color .16s ease;
    }
    #user_info.spp-up-card #sethonor:hover { background:rgba(56,126,240,.22); color:#bcd6ff !important; }
    #user_info.spp-up-card #sethonor img { width:11px; height:11px; vertical-align:middle; opacity:.8; }

    #user_info.spp-up-card .spp-up__row3 {
        grid-column:1 / span 3; grid-row:3;
        display:flex; align-items:center; flex-wrap:wrap; gap:6px 4px;
        padding-top:9px; margin-top:1px;
        border-top:1px dashed rgba(255,255,255,.14);
    }
    #user_info.spp-up-card .spp-up__m {
        display:inline-flex; align-items:baseline; gap:5px;
        padding:2px 9px 2px 0; font-size:11.5px; color:#93a3b4;
        border-right:1px solid rgba(255,255,255,.13);
        font-variant-numeric:tabular-nums;
    }
    #user_info.spp-up-card .spp-up__m:last-child { border-right:0; padding-right:0; }
    #user_info.spp-up-card .spp-up__m b { font-size:12px; font-weight:700; color:#dbe5ef; }
    #user_info.spp-up-card .spp-up__m--sp b { color:#ffc36b; }
    #user_info.spp-up-card .spp-up__m--ip b {
        font-family:'SF Mono','Cascadia Code',Consolas,monospace; font-weight:500; color:#a9bccb;
    }

    #user_info.spp-up-card .spp-up__orig { display:none !important; }

    #infobox.spp-up-on td.spp-up-host-td {
        padding:14px 16px !important;
        border-radius:14px !important;
        vertical-align:middle !important;
        border:1px solid rgba(255,255,255,.075) !important;
        background:linear-gradient(160deg,#1b2029 0%,#171b22 60%,#14181e 100%) !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,.05), 0 10px 30px -24px rgba(0,0,0,.9) !important;
    }
    #infobox.spp-up-on td.spp-up-host-td > .spp-hm-host {
        width:100%; box-sizing:border-box;
        float:none !important; text-align:left !important; padding:0 !important;
    }
    #infobox.spp-up-on .spp-hm-stats { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:9px; }
    #infobox.spp-up-on .spp-hm-stat {
        display:flex; flex-direction:column; gap:3px;
        padding:9px 13px 10px;
        border-radius:10px;
        border:1px solid rgba(255,255,255,.075) !important;
        background:linear-gradient(180deg, rgba(255,255,255,.055), rgba(255,255,255,.018)) !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,.06) !important;
        transition:transform .18s ease, box-shadow .18s ease, border-color .18s ease, background .18s ease;
    }
    #infobox.spp-up-on .spp-hm-stat:hover {
        transform:translateY(-2px);
        border-color:rgba(32,201,151,.42) !important;
        background:linear-gradient(180deg, rgba(32,201,151,.14), rgba(255,255,255,.02)) !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,.10), 0 8px 22px -10px rgba(0,0,0,.9) !important;
    }
    #infobox.spp-up-on .spp-hm-stat .k {
        display:inline-flex; align-items:center; gap:5px;
        font-size:11px !important; color:#8798a8 !important; letter-spacing:.3px;
        font-weight:450 !important;
    }
    #infobox.spp-up-on .spp-hm-stat .k::before {
        content:''; width:4px; height:4px; border-radius:50%;
        background:var(--spp-up-c1,#20c997);
        box-shadow:0 0 6px var(--spp-up-a1,rgba(32,201,151,.26)); flex:none;
    }
    #infobox.spp-up-on .spp-hm-stat .v {
        font-size:16px !important; font-weight:700 !important; color:#eaf2f9 !important;
        font-variant-numeric:tabular-nums; letter-spacing:-.015em;
        text-shadow:0 1px 2px rgba(0,0,0,.6);
    }
    #infobox.spp-up-on .spp-hm-acts {
        display:flex; flex-wrap:wrap; gap:6px; justify-content:flex-end; align-items:center;
        margin-top:11px; padding-top:10px;
        border-top:1px dashed rgba(255,255,255,.12);
    }
    #infobox.spp-up-on .spp-hm-acts a {
        position:relative; overflow:hidden; isolation:isolate;
        font-size:12px !important; font-weight:650 !important; letter-spacing:.01em;
        padding:5px 14px !important; border-radius:30px !important;
        background:#1c222b !important; color:#d9e7e2 !important;
        border:1.5px solid rgba(255,255,255,.18) !important;
        text-decoration:none !important; cursor:pointer;
        display:inline-flex !important; align-items:center; gap:6px;
        box-shadow:0 1px 2px rgba(0,0,0,.35), inset 0 1px 0 rgba(255,255,255,.05);
        transition:all .4s ease !important;
    }
    #infobox.spp-up-on .spp-hm-acts a::after {
        content:''; position:absolute; inset:0; z-index:-1;
        background:radial-gradient(circle, rgba(255,255,255,.25) 0%, rgba(255,255,255,0) 70%);
        transform:scale(0); transition:transform .5s ease; pointer-events:none;
    }
    #infobox.spp-up-on .spp-hm-acts a:hover::after { transform:scale(4); }
    #infobox.spp-up-on .spp-hm-acts a:hover {
        background:#253040 !important; border-color:rgba(32,201,151,.55) !important;
        color:#eafff8 !important; transform:translateY(-1px);
        box-shadow:0 6px 18px -6px rgba(32,201,151,.45), inset 0 1px 0 rgba(255,255,255,.09);
    }
    #infobox.spp-up-on .spp-hm-acts a:active { transform:translateY(0) scale(.985); transition-duration:.08s !important; }
    #infobox.spp-up-on .spp-hm-acts a[href*="show-username"] {
        background:linear-gradient(180deg,#2b7d6f,#22655b) !important;
        border-color:rgba(32,201,151,.45) !important; color:#f0fffa !important;
    }
    #infobox.spp-up-on .spp-hm-acts a[href*="show-username"]:hover {
        background:linear-gradient(180deg,#33907f,#2a7a6b) !important;
        border-color:rgba(32,201,151,.8) !important;
    }

    #infobox.spp-up-on .spp-onb {
        border-color:rgba(255,255,255,.10) !important;
        background:linear-gradient(90deg, rgba(32,201,151,.15), rgba(255,255,255,.045) 64%) !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,.06) !important;
    }
    #infobox.spp-up-on .spp-onb__dot {
        background:var(--spp-up-c1,#20c997) !important;
        box-shadow:0 0 7px var(--spp-up-a1,rgba(32,201,151,.26)) !important;
        animation:sppOnPulse 2.4s ease-in-out infinite;
    }
    @keyframes sppOnPulse {
        0%,100% { opacity:1; transform:scale(1); }
        50%     { opacity:.55; transform:scale(.8); }
    }
    #infobox.spp-up-on .spp-onb__k,
    #infobox.spp-up-on .spp-onb__peak { color:#8798a8 !important; }
    #infobox.spp-up-on .spp-onb__v {
        color:#7ef0c4 !important; text-shadow:0 0 12px rgba(32,201,151,.28);
    }
    #infobox.spp-up-on .spp-onb__peak b { color:#dfe7f0 !important; }
    #infobox.spp-up-on .spp-onb__date { color:#8798a8 !important; opacity:1; }`;
function esc(s) {
return String(s).replace(/[&<>"]/g, function (c) {
return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c];
});
}
function polishUserInfo(onUPanel) {
if (!onUPanel) return;
const ib = document.getElementById('infobox');
if (!ib || ib.classList.contains('spp-up-on')) return;
const ui = document.getElementById('user_info');
if (!ui) return;
if (ui.dataset.sppUpDone) return;
ui.dataset.sppUpDone = '1';
const tbl = ib.querySelector('table');
const tds = tbl ? [].slice.call(tbl.querySelectorAll('tr > td')) : [];
const hostTd = tds.filter(function (t) { return t !== ui; })[0];
if (!tbl || tds.length !== 2 || !hostTd) return;
const face = ui.querySelector('#showface');
function grab(re) {
if (!face) return null;
const m = (face.textContent || '').match(re);
return m ? m[1].trim() : null;
}
const uid  = grab(/UID\s*[::]?\s*([\w]+)/i);
const sp   = grab(/SP币\s*[::]?\s*([\d,]+\s*G)/i);
const hp   = grab(/HP\s*[::]?\s*([\d,]+\s*点)/i);
const po   = grab(/魄\s*[::]?\s*([\d,]+\s*点)/i);
const last = grab(/最后登录\s*[::]?\s*([\d-]+)/i);
const ip   = grab(/登录IP\s*[::]?\s*([\d.]+)/i);
const lvTxt = (ui.textContent || '').match(/等级\s*[::]\s*(Lv\.?\s*\d+)/i);
const poTxt = (ui.textContent || '').match(/帖子\s*[::]?\s*(\d[\d,]*\d|\d)/);
const avatar = ui.querySelector('a[href="u.php"] img');
const links = [].slice.call(ui.querySelectorAll('a.link5'));
const mineTopics = links.filter(function (a) { return /我的主题/.test(a.textContent); })[0];
const minePosts  = links.filter(function (a) { return /我的回复/.test(a.textContent); })[0];
const more       = ui.querySelector('#td_u');
const honor      = ui.querySelector('#honor');
const setHonor   = ui.querySelector('#sethonor');
const editImg    = setHonor ? setHonor.querySelector('img') : null;
const sf = ui.querySelector('#sf');
const real = document.createElement('div');
real.className = 'spp-up__real';
const av = document.createElement('div');
av.className = 'spp-up__av';
if (avatar) {
const img = avatar.cloneNode(true);
img.removeAttribute('style');             
img.removeAttribute('onmouseover');
img.removeAttribute('onmouseout');
av.appendChild(img);
}
const AV_SPIN = SPP_CONFIG.num('spp_avatar_spin', 8, 0, 60);
if (avatar && AV_SPIN > 0) {
const AV_DIR = SPP_CONFIG.pick('spp_avatar_spin_dir', 'cw', AV_SPIN_DIRS);
av.classList.add('spp-av-spin');
av.style.setProperty('--spp-av-spin', AV_SPIN + 's');
av.style.setProperty('--spp-av-dir', AV_DIR === 'ccw' ? 'reverse' : 'normal');
}
real.appendChild(av);
const row1 = document.createElement('div');
row1.className = 'spp-up__row1';
if (lvTxt) {
row1.innerHTML += '<span class="spp-up__chip spp-up__chip--lv"><span class="k">等级</span>' +
'<span class="v">' + esc(lvTxt[1].replace(/\s+/g, '')) + '</span></span>';
}
if (poTxt) {
row1.innerHTML += '<span class="spp-up__chip"><span class="k">帖子</span>' +
'<span class="v">' + esc(poTxt[1]) + '</span></span>';
}
const acts = document.createElement('span');
acts.className = 'spp-up__acts';
if (mineTopics) acts.appendChild(mineTopics);
if (minePosts)  acts.appendChild(minePosts);
if (more)       acts.appendChild(more);
row1.appendChild(acts);
real.appendChild(row1);
const sign = document.createElement('div');
sign.className = 'spp-up__sign';
if (honor) sign.appendChild(honor);
if (setHonor) sign.appendChild(setHonor);
real.appendChild(sign);
const row3 = document.createElement('div');
row3.className = 'spp-up__row3';
const cells = [
['UID', uid, ''], ['SP币', sp, ' spp-up__m--sp'], ['HP', hp, ''],
['魄', po, ''], ['最后登录', last, ''], ['IP', ip, ' spp-up__m--ip']
].filter(function (c) { return c[1]; });
row3.innerHTML = cells.map(function (c) {
return '<span class="spp-up__m' + c[2] + '">' + esc(c[0]) + ' <b>' + esc(c[1]) + '</b></span>';
}).join('');
real.appendChild(row3);
const orig = document.createElement('div');
orig.className = 'spp-up__orig';
if (face) orig.appendChild(face);
if (sf) orig.appendChild(sf);
const origWrap = ui.querySelector('div[style*="margin-left"]');
if (origWrap) orig.appendChild(origWrap);
const avatarLink = ui.querySelector('a[href="u.php"]');
if (avatarLink) orig.appendChild(avatarLink);
ui.classList.add('spp-up-card');
ui.innerHTML = '';
ui.appendChild(real);
ui.appendChild(orig);
hostTd.classList.add('spp-up-host-td');
ib.classList.add('spp-up-on');
if (setHonor && editImg) {
setHonor.querySelectorAll('svg.spp-up__edit-ico').forEach(function (s) { s.remove(); });
const svg = '<svg class="spp-up__edit-ico" viewBox="0 0 24 24" width="12" height="12" fill="currentColor" style="opacity:.85;flex:none">' +
'<path d="M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04a1 1 0 0 0 0-1.41' +
'l-2.34-2.34a1 1 0 0 0-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z"/></svg>';
editImg.insertAdjacentHTML('afterend', svg);
editImg.style.display = 'none';
}
}
function initHomePolish() {
if (!(PATH === '/' || PATH === '' || /\/index\.php$/.test(PATH))) return;
const HP_KEY    = 'spp_home_polish';    
const HP_STATS  = 'spp_home_stats';     
const HP_NOTICE = 'spp_home_notice';    
const HP_BOARDS = 'spp_home_boards';    
const HP_CM     = 'spp_home_cm_card';   
const HP_HJ     = 'spp_home_hj_card';   
const HP_RM     = 'spp_home_rm_card';   
const HP_FL     = 'spp_home_fl_card';
const HP_FLK    = 'spp_home_flk_section';
const HP_ONLINE = 'spp_home_online';    
const HP_SUBCARD = 'spp_home_subcard';  
const HP_TOPCARD = 'spp_home_topcard';  
const HP_HIDE_NOTICE = 'spp_home_hide_notice'; 
const HP_HDR    = 'spp_home_hide_header'; 
const HP_UPANEL = 'spp_home_upanel';    
if (!GM_getValue(HP_KEY, true)) return;
const onStats  = GM_getValue(HP_STATS, true);
const onNotice = GM_getValue(HP_NOTICE, true);
const onBoards = GM_getValue(HP_BOARDS, true);
const onCard   = GM_getValue(HP_CM, true);
const onHjCard = GM_getValue(HP_HJ, true);
const onRmCard = GM_getValue(HP_RM, true);
const onFlCard = GM_getValue(HP_FL, true);
const onFlkSec = GM_getValue(HP_FLK, true);
const onOnline = GM_getValue(HP_ONLINE, true);
const onSub    = GM_getValue(HP_SUBCARD, true);
const onTopCard = GM_getValue(HP_TOPCARD, true);
const onHideNotice = GM_getValue(HP_HIDE_NOTICE, true);
const onHdr    = GM_getValue(HP_HDR, true);
const onUPanel = GM_getValue(HP_UPANEL, true);
const STYLE_ID = 'spp-home-polish-style';
const CSS_STATS = `
    #infobox .spp-hm-host { float:none !important; text-align:left !important; padding:6px 8px !important; }
    .spp-hm-stats { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; }
    .spp-hm-stat {
        display:flex; flex-direction:column; gap:1px; padding:8px 12px;
        border-radius:10px; border:1px solid var(--spu-border,#d8dee7);
        background:linear-gradient(180deg,rgba(255,255,255,.95),rgba(238,242,245,.92));
        box-shadow:0 1px 2px rgba(15,23,42,.04);
        transition:transform .18s ease,box-shadow .18s ease,border-color .18s ease;
    }
    .spp-hm-stat:hover { transform:translateY(-2px); box-shadow:0 8px 20px rgba(15,23,42,.09); border-color:var(--spu-accent,#2f6f68); }
    .spp-hm-stat .k { font-size:11px; color:var(--spu-muted,#6b7280); }
    .spp-hm-stat .v { font-size:15px; font-weight:700; color:var(--spu-text,#1f2937); font-variant-numeric:tabular-nums; letter-spacing:-.01em; }
    .spp-hm-acts { display:flex; flex-wrap:wrap; gap:6px; justify-content:flex-end; align-items:center; margin-top:8px; }
    .spp-hm-acts a {
        font-size:12px !important; padding:4px 11px; border-radius:999px;
        background:rgba(47,111,104,.08); color:var(--spu-accent,#2f6f68) !important;
        text-decoration:none !important; transition:background .16s ease,transform .16s ease;
    }
    .spp-hm-acts a:hover { background:rgba(47,111,104,.18); transform:translateY(-1px); }

    #infobox .spp-hm-acts a[href*="show-username"] {
        box-sizing:border-box;
        max-width:140px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
    }

    .spp-onb {
        display:inline-flex; align-items:center; gap:7px;
        margin-right:auto; min-width:0; max-width:100%;
        padding:3px 12px 3px 10px; border-radius:999px;
        border:1px solid var(--spu-border,#d8dee7);
        background:rgba(47,111,104,.08);
        font-size:11px; line-height:1.55; white-space:nowrap;
        flex:0 1 auto;
    }
    .spp-onb__dot {
        width:6px; height:6px; border-radius:50%; background:var(--spu-accent,#2f6f68); flex:none;
    }
    .spp-onb__k { color:var(--spu-muted,#6b7280); flex:none; }
    .spp-onb__v { color:var(--spu-text,#1f2937); font-variant-numeric:tabular-nums; letter-spacing:-.01em; flex:none; }
    .spp-onb__peak { color:var(--spu-muted,#6b7280); flex:none; }
    .spp-onb__peak b { color:var(--spu-text,#1f2937); font-variant-numeric:tabular-nums; }
    .spp-onb__date {
        color:var(--spu-muted,#6b7280); opacity:.75; font-variant-numeric:tabular-nums;
        flex:0 99 auto; min-width:0; overflow:hidden; text-overflow:ellipsis;
    }
    `;
const CSS_NOTICE = `
    #notice { overflow:visible !important; }
    #notice0 { height:auto !important; overflow:visible !important; }
    #notice > div[style*="height:36px"] { display:none !important; }
    #notice0 ul.spp-hm-notice-list { display:flex !important; flex-wrap:wrap; gap:8px; margin:0 !important; padding:0 !important; list-style:none !important; }
    #notice0 ul.spp-hm-notice-list > li {
        display:flex; align-items:center; gap:8px; padding:6px 12px;
        border-radius:999px; background:#fff; border:1px solid var(--spu-border,#d8dee7);
        box-shadow:0 1px 2px rgba(15,23,42,.04);
        transition:transform .16s ease,box-shadow .16s ease,border-color .16s ease;
    }
    #notice0 ul.spp-hm-notice-list > li:hover { transform:translateY(-1px); border-color:var(--spu-accent,#2f6f68); box-shadow:0 6px 16px rgba(15,23,42,.09); }
    #notice0 ul.spp-hm-notice-list > li a { text-decoration:none !important; font-size:12.5px !important; }
    #notice0 ul.spp-hm-notice-list > li .f9 { font-size:11px !important; opacity:.6; }
    `;
const CSS_BOARDS = `
    .spp-hm-on .t > table { border-collapse:separate !important; border-spacing:0 !important; }
    .spp-hm-on .t > table > tbody > tr > th.h {
        background:linear-gradient(180deg,#ffffff,#f0f4f7) !important;
        border-bottom:1px solid var(--spu-border,#d8dee7) !important;
        padding:9px 14px !important;
    }
    .spp-hm-on .t > table > tbody > tr > th.h h2 a.cfont {
        font-size:14.5px !important; font-weight:700 !important;
        color:var(--spu-text,#1f2937) !important; text-decoration:none !important;
    }
    .spp-hm-on .t > table > tbody > tr > th.h h2 a.cfont::before {
        content:''; display:inline-block; width:3px; height:13px; margin-right:8px;
        vertical-align:-1px; border-radius:2px;
        background:linear-gradient(180deg,var(--spu-accent,#2f6f68),#7fb3ac);
    }
    .spp-hm-on .t > table > tbody > tr.tr2 > td {
        background:linear-gradient(180deg,#ffffff,#f3f6f9) !important;
        border-bottom:1px solid var(--spu-border,#d8dee7) !important;
        padding:8px 10px !important;
    }
    .spp-hm-on .t > table > tbody > tr.tr2 > td > span.b { font-weight:650 !important; font-size:12.5px !important; color:var(--spu-text,#1f2937) !important; }
    .spp-hm-on .t > table > tbody > tr.tr2 > td > span.b::before {
        content:''; display:inline-block; width:3px; height:11px; margin-right:6px;
        vertical-align:-1px; border-radius:2px; background:var(--spu-accent,#2f6f68);
    }
    .spp-hm-on .t > table > tbody > tr.tr3 > td.icon img { border-radius:9px !important; opacity:.9; }
    .spp-hm-on .t > table > tbody > tr.tr3 > th { padding:10px 8px !important; }
    .spp-hm-on .t > table > tbody > tr.tr3 > th h3.b > a { font-size:13.5px !important; font-weight:600 !important; }
    .spp-hm-on .t > table > tbody > tr.tr3 > td.tal.y-style.e { padding:10px 12px !important; line-height:1.95 !important; }
    `;
const CSS_CARD = `
    .spp-cm-row > td { padding:14px 10px !important; border:none !important; background:transparent !important; }
    .spp-cm-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(330px,1fr)); gap:16px; }
    .spp-cm-grid.is-single { grid-template-columns:minmax(0,540px); justify-content:center; }
    .spp-cm-grid + .spp-cm-grid { margin-top:16px; }
    .spp-cm-group-hd {
        grid-column:1 / -1;
        display:flex; align-items:center; gap:10px;
        margin:2px 0 0; font-size:12px; letter-spacing:.02em;
        color:#94a3b8;
    }
    .spp-cm-group-hd::before, .spp-cm-group-hd::after {
        content:""; flex:1; height:1px; background:rgba(148,163,184,.22);
    }
    .spp-cm-group-hd.is-first::before { display:none; }
    .spp-cm-group-hd b { color:#cbd5e1; font-weight:650; font-size:12.5px; }
    .spp-cm-group-hd i { font-style:normal; color:#64748b; font-size:11px; }
    .spp-cm-group-hd em {
        font-style:normal; font-weight:600; font-size:10.5px;
        padding:2px 8px; border-radius:999px;
        background:rgba(56,126,240,.16); color:#93c5fd;
    }
    .spp-cm-group-hd.is-std em { background:rgba(255,34,136,.16); color:#f9a8d4; }
    .spp-cm-group-hd.is-pin em { background:rgba(12,227,154,.16); color:#6ee7b7; }

    .spp-cm-card {
        position:relative; padding:1.5px; border-radius:14px; overflow:hidden; isolation:isolate;
        background:#0b1120; cursor:pointer;
        display:flex; flex-direction:column;
        box-shadow:0 18px 40px -18px rgba(2,6,23,.9);
        transition:transform .32s cubic-bezier(.2,.7,.3,1), box-shadow .32s ease;
        font-family:'Noto Sans SC','Source Han Sans SC','PingFang SC','Microsoft YaHei',sans-serif;
    }
    .spp-cm-card:hover { transform:translateY(-4px); box-shadow:0 26px 54px -20px rgba(99,102,241,.55); }

    .spp-cm-card__spin {
        position:absolute; top:50%; left:50%; width:120px; height:420px; margin:-210px 0 0 -60px;
        background:linear-gradient(180deg,#ff2288,#387ef0);
        opacity:0; z-index:0; pointer-events:none;
        animation:spp-cm-spin 8s linear infinite; animation-play-state:paused;
        transition:opacity .3s ease;
    }
    .spp-cm-card:hover .spp-cm-card__spin { opacity:1; animation-play-state:running; }
    @keyframes spp-cm-spin { from { transform:rotate(0deg); } to { transform:rotate(360deg); } }

    .spp-cm-card::before {
        content:""; position:absolute; inset:0; border-radius:14px; z-index:0;
        background:linear-gradient(120deg,rgba(56,126,240,.55),rgba(168,85,247,.4),rgba(255,34,136,.55));
        opacity:.45; transition:opacity .3s ease;
    }
    .spp-cm-card:hover::before { opacity:0; }

    .spp-cm-card__inner {
        position:relative; z-index:1; display:flex; flex-direction:column; gap:14px;
        flex:1 1 auto;
        padding:16px; border-radius:13px;
        background:linear-gradient(180deg,rgba(2,6,23,.97),rgba(2,6,23,.92));
        -webkit-backdrop-filter:blur(14px); backdrop-filter:blur(14px);
    }

    .spp-cm-card__head { display:flex; align-items:center; gap:10px; }
    .spp-cm-card__badge {
        flex:0 0 auto; display:flex; flex-direction:column; align-items:center; justify-content:center;
        width:46px; height:46px; border-radius:11px; line-height:1;
        background:linear-gradient(145deg,#387ef0,#a855f7);
        box-shadow:0 6px 16px -6px rgba(56,126,240,.8);
    }
    .spp-cm-card__badge em { font-style:normal; font-size:9px; font-weight:600; letter-spacing:.08em; opacity:.85; margin-bottom:3px; }
    .spp-cm-card__badge b { font-size:17px; font-weight:800; font-variant-numeric:tabular-nums; color:#fff; }

    .spp-cm-card__titles { flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:5px; }
    .spp-cm-card__title {
        font-size:15px !important; font-weight:650 !important; color:#fff !important; text-decoration:none !important;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-cm-card__title:hover { color:#c7d2fe !important; }
    .spp-cm-card__meta { display:flex; flex-wrap:wrap; align-items:center; gap:2px 6px; font-size:11px; color:#64748b; }
    .spp-cm-card__meta b { color:#94a3b8; font-weight:600; font-variant-numeric:tabular-nums; }

    .spp-cm-card__pill {
        flex:0 0 auto; display:inline-flex; align-items:center; gap:5px; padding:3px 9px;
        border-radius:999px; font-size:10.5px; font-weight:600; white-space:nowrap;
        background:rgba(16,185,129,.12); color:#10b981;
    }
    .spp-cm-card__pill.is-idle { background:rgba(100,116,139,.16); color:#94a3b8; }
    .spp-cm-card__dot { width:6px; height:6px; border-radius:50%; background:currentColor; }
    .spp-cm-card__pill:not(.is-idle) .spp-cm-card__dot { animation:spp-cm-pulse 1.8s ease-in-out infinite; }
    @keyframes spp-cm-pulse { 0%,100% { opacity:1; transform:scale(1); } 50% { opacity:.35; transform:scale(.8); } }

    .spp-cm-card__stats {
        display:grid; grid-template-columns:1fr 1fr 1.15fr; border-radius:10px; overflow:hidden;
        background:rgba(15,23,42,.6); border:1px solid rgba(148,163,184,.1);
    }
    .spp-cm-card__stat { display:flex; flex-direction:column; gap:2px; padding:9px 11px; position:relative; }
    .spp-cm-card__stat + .spp-cm-card__stat::before {
        content:""; position:absolute; left:0; top:18%; bottom:18%; width:1px; background:rgba(148,163,184,.14);
    }
    .spp-cm-card__stat .k { font-size:10.5px; color:#64748b; letter-spacing:.02em; }
    .spp-cm-card__stat .v { font-size:16px; font-weight:700; color:#fff; font-variant-numeric:tabular-nums; letter-spacing:-.01em; white-space:nowrap; }
    .spp-cm-card__stats.is-wide .spp-cm-card__stat { padding:9px 8px; }
    .spp-cm-card__stats.is-wide .spp-cm-card__stat .v { font-size:13px; letter-spacing:-.02em; }
    .spp-cm-card__stat .v small { font-size:11px; font-weight:600; color:#94a3b8; margin-left:2px; }
    .spp-cm-card__stat .d { font-size:10px; color:#64748b; }
    .spp-cm-card__stat.is-hot .v { color:#10b981; }
    .spp-cm-card__stat.is-hot .d { color:#10b981; opacity:.75; }

    .spp-cm-card__boards { display:flex; flex-direction:column; gap:8px; }
    .spp-cm-card__boards-k { font-size:10.5px; color:#64748b; letter-spacing:.06em; display:flex; align-items:center; gap:8px; }
    .spp-cm-card__boards-k::after { content:""; flex:1; height:1px; background:rgba(148,163,184,.14); }

    .spp-cm-card__board {
        display:flex; align-items:center; gap:10px; padding:9px 11px; border-radius:10px;
        background:rgba(30,41,59,.5); border:1px solid rgba(148,163,184,.1); text-decoration:none !important;
        transition:background .18s ease,border-color .18s ease,transform .18s ease;
    }
    .spp-cm-card__board:hover { background:rgba(56,126,240,.16); border-color:rgba(56,126,240,.45); transform:translateX(2px); }
    .spp-cm-card__board-ico {
        flex:0 0 30px; width:30px; height:30px; border-radius:8px;
        display:flex; align-items:center; justify-content:center;
        background:rgba(56,126,240,.16); color:#93c5fd;
    }
    .spp-cm-card__board.is-wall .spp-cm-card__board-ico { background:rgba(255,34,136,.16); color:#f9a8d4; }
    .spp-cm-card__board-ico svg { width:15px; height:15px; }
    .spp-cm-card__board-txt { flex:1 1 auto; min-width:0; }
    .spp-cm-card__board-txt b { display:block; font-size:12.5px; font-weight:600; color:#e2e8f4; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
    .spp-cm-card__board-txt i { display:block; font-style:normal; font-size:10.5px; color:#64748b; margin-top:1px; }
    .spp-cm-card__board-go { flex:0 0 auto; color:#64748b; display:flex; }
    .spp-cm-card__board-go svg { width:13px; height:13px; }
    .spp-cm-card__board:hover .spp-cm-card__board-go { color:#c7d2fe; }

    .spp-cm-card__last {
        display:flex; align-items:center; gap:10px; padding:10px 11px; border-radius:10px;
        background:linear-gradient(90deg,rgba(56,126,240,.12),rgba(2,6,23,0));
        border-left:2px solid rgba(56,126,240,.6); text-decoration:none !important;
    }
    .spp-cm-card__last:hover { background:linear-gradient(90deg,rgba(56,126,240,.22),rgba(2,6,23,0)); }
    .spp-cm-card__avatar {
        flex:0 0 26px; width:26px; height:26px; border-radius:50%;
        display:flex; align-items:center; justify-content:center;
        font-size:11px; font-weight:700; color:#fff;
        background:linear-gradient(145deg,#387ef0,#ff2288);
    }
    .spp-cm-card__last-txt { flex:1 1 auto; min-width:0; }
    .spp-cm-card__last-txt b { display:block; font-size:12px; font-weight:500; color:#dbe4f2; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
    .spp-cm-card__last-txt i { display:block; font-style:normal; font-size:10.5px; color:#64748b; margin-top:2px; }
    .spp-cm-card__last-time {
        flex:0 0 auto; display:flex; flex-direction:column; align-items:flex-end; gap:2px;
        font-size:10.5px; color:#94a3b8; font-variant-numeric:tabular-nums;
    }
    .spp-cm-card__last-time b { font-size:11px; color:#cbd5e1; font-weight:600; }
    .spp-cm-card__last-time.is-fresh b { color:#10b981; }

    .spp-cm-card__foot { display:flex; align-items:center; justify-content:space-between; gap:10px; margin-top:auto; padding-top:2px; }
    .spp-cm-card__cta {
        flex:0 0 auto; display:inline-flex; align-items:center; gap:4px; padding:5px 11px; border-radius:8px;
        background:#000; border:1px solid rgba(255,255,255,.24); color:#fff !important;
        font-size:11px !important; font-weight:600 !important; text-decoration:none !important;
        transition:background .18s ease,border-color .18s ease;
    }
    .spp-cm-card__cta:hover { background:#1a1a1a; border-color:rgba(255,255,255,.42); }
    .spp-cm-card__cta svg { width:12px; height:12px; }

    .spp-cm-card__subs { display:flex; flex-wrap:wrap; gap:6px; min-width:0; }
    .spp-cm-card__subs a {
        font-size:10.5px !important; padding:3px 8px; border-radius:6px;
        background:rgba(51,65,85,.55); color:#cbd5e1 !important; text-decoration:none !important;
        transition:background .16s ease,color .16s ease;
    }
    .spp-cm-card__subs a:hover { background:rgba(99,102,241,.4); color:#fff !important; }

    .spp-uvbtn {
        position:relative !important; isolation:isolate;
        background:linear-gradient(45deg,#0ce39a,#69007f,#fc0987) !important;
        border:none !important; border-radius:11px !important;
        box-shadow:0 8px 22px -14px rgba(105,0,127,.85);
        overflow:visible;
    }
    .spp-uvbtn::before {
        content:""; position:absolute; inset:1px; border-radius:10px;
        background:#272727; z-index:-1; pointer-events:none;
        transition:opacity .5s ease;
    }
    .spp-uvbtn:hover::before { opacity:.72; }
    .spp-uvbtn::after {
        content:""; position:absolute; inset:0; border-radius:10px;
        background:linear-gradient(45deg,#0ce39a,#69007f,#fc0987);
        opacity:0; filter:blur(20px); z-index:-2; pointer-events:none;
        transition:opacity .5s ease;
    }
    .spp-uvbtn:hover::after { opacity:1; }
    .spp-uvbtn > * { position:relative; z-index:1; }

    html.spp-hm-on .t > table > tbody > tr > th.h.spp-uvbtn {
        background:linear-gradient(45deg,#0ce39a,#69007f,#fc0987) !important;
        border-bottom:none !important;
        padding:10px 14px !important;
    }
    .spp-hm-on .t > table > tbody > tr > th.h.spp-uvbtn h2 a.cfont {
        color:#fff !important; text-shadow:0 1px 6px rgba(0,0,0,.55);
    }
    .spp-hm-on .t > table > tbody > tr > th.h.spp-uvbtn h2 a.cfont::before {
        background:linear-gradient(180deg,#0ce39a,#fc0987) !important;
    }
    .spp-hm-on .t > table > tbody > tr > th.h.spp-uvbtn a.closeicon img { filter:invert(1); opacity:.7; }
    .spp-hm-on .t > table > tbody > tr > th.h.spp-uvbtn a.closeicon:hover img { opacity:1; }

    .spp-cm-sec { display:flex; flex-direction:column; gap:14px; }
    .spp-cm-sec__hd {
        display:flex; align-items:center; gap:12px; padding:11px 16px; flex-wrap:wrap;
    }
    .spp-cm-sec__bar {
        width:3px; height:15px; border-radius:2px; flex:0 0 auto;
        background:linear-gradient(180deg,#0ce39a,#fc0987);
    }
    .spp-cm-sec__title {
        font-size:14.5px !important; font-weight:700 !important;
        color:#fff !important; text-decoration:none !important;
        text-shadow:0 1px 6px rgba(0,0,0,.55);
    }
    .spp-cm-sec__title:hover { color:#a7f3d0 !important; }
    .spp-cm-sec__meta {
        font-size:11.5px; color:#cbd5e1; font-variant-numeric:tabular-nums;
    }
    .spp-cm-sec__count {
        margin-left:auto; font-size:11px; font-weight:600; padding:3px 10px; border-radius:999px;
        background:rgba(12,227,154,.14); color:#6ee7b7;
    }

    .spp-cm-sec__grid {
        display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:10px;
    }
    .spp-cm-mini {
        position:relative; display:flex; align-items:center; padding:10px 14px 10px 16px;
        border-radius:10px; overflow:hidden;
        background:#141d2f; border:1px solid rgba(148,163,184,.24);
        text-decoration:none !important;
        transition:border-color .18s ease, background .18s ease, transform .18s ease;
    }
    .spp-cm-mini::before {
        content:""; position:absolute; left:0; top:0; bottom:0; width:3px;
        background:linear-gradient(180deg,#0ce39a,#69007f,#fc0987);
        opacity:.8; transition:opacity .18s ease;
    }
    .spp-cm-mini:hover {
        background:#1d2a44; border-color:rgba(12,227,154,.55); transform:translateY(-2px);
    }
    .spp-cm-mini:hover::before { opacity:1; }
    .spp-cm-mini__nm {
        font-size:13px; font-weight:600; color:#e2e8f4; letter-spacing:.01em;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }

    .spp-fl-card {
        position:relative; background:#0b0f1a; border-radius:8px; cursor:default;
        display:flex; flex-direction:column; gap:12px; padding:14px 16px 16px;
    }
    .spp-fl-card::before {
        content:''; position:absolute; inset:-5px; border-radius:10px;
        background:linear-gradient(-45deg,#e81cff 0%,#40c9ff 100%);
        z-index:-10; pointer-events:none;
        opacity:0; transform:translateZ(0);
        transition:opacity .45s cubic-bezier(.175,.885,.32,1.275);
    }
    .spp-fl-card::after {
        content:""; position:absolute; inset:0; border-radius:8px;
        background:linear-gradient(-45deg,#fc00ff 0%,#00dbde 100%);
        transform:translate3d(0,0,0) scale(.95); filter:blur(20px);
        z-index:-1;
    }
    .spp-fl-card:hover::before {
        opacity:1;
    }

    .spp-fl-head { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
    .spp-fl-head .ttl { font-size:20px; font-weight:700; color:#fff; letter-spacing:.01em; }
    .spp-fl-head .cnt {
        font-size:11px; font-weight:600; padding:2px 9px; border-radius:999px;
        background:rgba(232,28,255,.16); color:#f0abfc;
    }
    .spp-fl-head .hint { font-size:11.5px; color:#64748b; margin-left:auto; }

    .spp-fl-grid { display:grid; gap:7px; grid-template-columns:repeat(auto-fill,minmax(142px,1fr)); }
    .spp-fl-card.is-loose .spp-fl-grid { gap:10px; grid-template-columns:repeat(auto-fill,minmax(196px,1fr)); }

    .spp-fl-item {
        display:flex; align-items:center; gap:9px; text-decoration:none !important;
        padding:9px 11px; border-radius:9px; min-width:0;
        background:rgba(30,41,59,.55); border:1px solid rgba(148,163,184,.12);
        transition:background .18s ease, border-color .18s ease, transform .18s ease;
    }
    .spp-fl-item:hover {
        background:rgba(232,28,255,.14); border-color:rgba(232,28,255,.45);
        transform:translateY(-2px);
    }
    .spp-fl-dot {
        flex:0 0 auto; width:24px; height:24px; border-radius:7px;
        display:grid; place-items:center; font-size:11px; font-weight:800; color:#fff;
        background:linear-gradient(145deg,#e81cff,#40c9ff);
        box-shadow:0 4px 12px -5px rgba(232,28,255,.8);
    }
    .spp-fl-txt { min-width:0; display:flex; flex-direction:column; gap:1px; }
    .spp-fl-txt b {
        font-size:12.5px; font-weight:600; color:#fff;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-fl-txt i {
        font-style:normal; font-size:10.5px; color:#64748b;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-fl-item:hover .spp-fl-txt i { color:#a5b4fc; }

    .spp-fl-two { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.15fr); gap:16px; align-items:stretch; }
    .spp-fl-two > * { min-width:0; }
    .spp-fl-two > .spp-cm-grid { display:flex; flex-direction:column; }
    .spp-fl-two > .spp-cm-grid > .spp-cm-card { flex:1 1 auto; }
    @media (max-width:1000px) { .spp-fl-two { grid-template-columns:minmax(0,1fr); } }
    .spp-hm-on .t.spp-fl-host, .spp-hm-on .t.spp-fl-host > table,
    .spp-hm-on .t.spp-fl-host > table > tbody,
    .spp-hm-on .t.spp-fl-host > table > tbody > tr,
    .spp-hm-on .t.spp-fl-host > table > tbody > tr > td { overflow:visible !important; }
    .spp-gal-wrap, .spp-gal-wrap *, .spp-gal-wrap *::before, .spp-gal-wrap *::after,
    .spp-modal-backdrop, .spp-modal-backdrop * { box-sizing:border-box; }

    .spp-gal-wrap, .spp-modal-backdrop {
        --spp-gal-core: 122px;
        --c-cyan:#00eeff; --c-purple:#aa00ff; --c-pink:#ff007f; --c-gold:#fbbf24;
        --glow-cyan:rgba(0,238,255,.45); --glow-pink:rgba(255,0,127,.45);
        --glow-purple:rgba(170,0,255,.45); --glow-gold:rgba(251,191,36,.6);
        --bg-dark:#060811;
    }
    .spp-gal-wrap {
        display:flex; flex-direction:column; gap:14px;
        font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Noto Sans SC','Source Han Sans SC','PingFang SC','Microsoft YaHei',sans-serif;
    }

    .spp-hud-bar {
        display: flex;
        align-items: center;
        justify-content: space-between;
        flex-wrap: wrap;
        gap: 12px;
        padding: 12px 22px;
        background: rgba(13, 17, 30, 0.72);
        backdrop-filter: blur(16px);
        -webkit-backdrop-filter: blur(16px);
        border: 1px solid rgba(255, 255, 255, 0.1);
        border-radius: 16px;
        box-shadow: 0 8px 32px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.08);
    }

    .spp-hud-left {
        display: flex;
        align-items: center;
        gap: 12px;
        flex-wrap: wrap;
    }

    .spp-hud-title {
        display: inline-flex;
        align-items: center;
        gap: 8px;
        font-size: 14px;
        font-weight: 700;
        color: #f8fafc !important;
        text-decoration: none !important;
        letter-spacing: 0.04em;
        transition: all 0.25s ease;
    }
    .spp-hud-title:hover {
        color: var(--c-cyan) !important;
        text-shadow: 0 0 14px var(--c-cyan);
    }
    .spp-hud-title svg { color: var(--c-cyan); filter: drop-shadow(0 0 6px var(--c-cyan)); }

    .spp-badge {
        font-size: 11px;
        font-weight: 600;
        padding: 3px 10px;
        border-radius: 999px;
        line-height: 1.3;
        display: inline-flex;
        align-items: center;
        gap: 5px;
        border: 1px solid transparent;
    }
    .spp-badge-mint {
        background: rgba(16, 185, 129, 0.15);
        color: #6ee7b7;
        border-color: rgba(16, 185, 129, 0.35);
    }
    .spp-badge-gold {
        background: rgba(251, 191, 36, 0.15);
        color: #fbbf24;
        border-color: rgba(251, 191, 36, 0.4);
        box-shadow: 0 0 10px rgba(251, 191, 36, 0.2);
    }

    .spp-hud-stats {
        display: inline-flex;
        align-items: center;
        gap: 14px;
        color: #94a3b8;
        font-size: 12px;
        margin-left: 6px;
    }
    .spp-hud-stat-item {
        display: inline-flex;
        align-items: center;
        gap: 5px;
        font-variant-numeric: tabular-nums;
    }
    .spp-hud-stat-item svg { opacity: 0.85; }

    .spp-hud-right {
        display: flex;
        align-items: center;
        gap: 14px;
    }

    .spp-filter-group {
        display: inline-flex;
        background: rgba(0, 0, 0, 0.4);
        border: 1px solid rgba(255, 255, 255, 0.08);
        border-radius: 10px;
        padding: 3px;
        gap: 2px;
    }
    .spp-filter-btn {
        background: transparent;
        border: none;
        color: #94a3b8;
        font-size: 11.5px;
        font-weight: 600;
        padding: 4px 11px;
        border-radius: 7px;
        cursor: pointer;
        transition: all 0.2s ease;
    }
    .spp-filter-btn:hover { color: #f1f5f9; }
    .spp-filter-btn.active {
        background: rgba(0, 238, 255, 0.18);
        color: var(--c-cyan);
        box-shadow: 0 0 12px rgba(0, 238, 255, 0.28);
    }
    .spp-filter-btn[data-filter="milestone"].active {
        background: rgba(251, 191, 36, 0.2);
        color: #fbbf24;
        box-shadow: 0 0 12px rgba(251, 191, 36, 0.35);
    }

    .spp-live-status {
        display: inline-flex;
        align-items: center;
        gap: 6px;
        font-family: ui-monospace, Menlo, Consolas, monospace;
        font-size: 11px;
        letter-spacing: 0.14em;
        color: rgba(74, 222, 128, 0.95);
        padding: 3px 9px;
        border-radius: 6px;
        background: rgba(74, 222, 128, 0.09);
    }
    .spp-live-dot {
        width: 6px; height: 6px; border-radius: 50%;
        background: #4ade80; box-shadow: 0 0 8px #4ade80;
        animation: spp-pulse-glow 1.8s ease-in-out infinite alternate;
    }
    @keyframes spp-pulse-glow {
        from { opacity: 0.35; transform: scale(0.9); }
        to { opacity: 1; transform: scale(1.15); box-shadow: 0 0 12px #4ade80; }
    }

    .spp-gal {
        position: relative;
        overflow: hidden;
        height: clamp(500px, 49vw, 720px);
        border-radius: 24px;
        background: radial-gradient(circle at 50% 50%, rgba(15, 23, 42, 0.52) 0%, rgba(5, 7, 15, 0.85) 85%);
        border: 1px solid rgba(255, 255, 255, 0.08);
        box-shadow: 0 25px 60px rgba(0, 0, 0, 0.65), inset 0 0 70px rgba(0, 0, 0, 0.85);
        isolation: isolate;
    }

    .spp-gal__stage { position: absolute; inset: 0; z-index: 10; }

    .spp-gal__ring {
        position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
        border: 1px dashed rgba(255, 255, 255, 0.075);
        border-radius: 50%;
        pointer-events: none; z-index: 1;
        transition: border-color 0.4s ease;
    }
    .spp-gal__ring::after {
        content: '';
        position: absolute; inset: -1px; border-radius: 50%;
        box-shadow: inset 0 0 16px rgba(255, 255, 255, 0.02);
        pointer-events: none;
    }

    #spp-gal-tether-svg {
        position: absolute; inset: 0; width: 100%; height: 100%;
        pointer-events: none; z-index: 25;
    }

    .spp-gal__node {
        --gal-c: rgb(0, 238, 255);
        --gal-glow: 0 0 12px rgba(0, 238, 255, 0.25);
        position: absolute; left: 50%; top: 50%;
        width: 86px; height: 38px;
        border-radius: 999px;
        display: inline-flex; align-items: center; justify-content: center;
        font-size: 13.5px; font-weight: 750; letter-spacing: 0.06em; line-height: 1;
        background: rgba(10, 14, 28, 0.82);
        backdrop-filter: blur(8px);
        -webkit-backdrop-filter: blur(8px);
        border: 1.5px solid var(--gal-c) !important;
        color: var(--gal-c) !important;
        box-shadow: var(--gal-glow), inset 0 0 8px rgba(0, 0, 0, 0.5) !important;
        text-decoration: none !important;
        cursor: pointer;
        user-select: none;
        will-change: transform, opacity;
        transition: color 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease, background 0.25s ease;
    }

    .spp-gal__node[data-name="C107"]::after,
    .spp-gal__node[data-name="C100"]::after {
        content: '👑';
        position: absolute; top: -8px; right: -5px;
        font-size: 11px; line-height: 1;
        filter: drop-shadow(0 0 6px var(--c-gold));
    }
    .spp-gal__node[data-name="C108"]::after,
    .spp-gal__node[data-name="C83"]::after,
    .spp-gal__node[data-name="C97"]::after,
    .spp-gal__node[data-name="C98"]::after {
        content: '★';
        position: absolute; top: -6px; right: -4px;
        font-size: 10px; width: 14px; height: 14px;
        border-radius: 50%; display: flex; align-items: center; justify-content: center;
        background: var(--c-gold); color: #000;
        box-shadow: 0 0 8px var(--c-gold);
    }

    .spp-gal__node.is-active {
        background: #ffffff !important;
        color: #050814 !important;
        border-color: #ffffff !important;
        box-shadow: 0 0 25px #ffffff, 0 0 50px var(--gal-c) !important;
        transform-origin: center center;
        font-weight: 850;
    }

    .spp-core-anchor {
        position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
        width: var(--spp-gal-core); height: var(--spp-gal-core);
        z-index: 60;
        pointer-events: auto;
    }

    .spp-accretion-disk {
        position: absolute; inset: -28px;
        border-radius: 50%;
        background: conic-gradient(
            from 0deg,
            rgba(0, 238, 255, 0.45),
            rgba(170, 0, 255, 0.55),
            rgba(255, 0, 127, 0.65),
            rgba(251, 191, 36, 0.4),
            rgba(0, 238, 255, 0.45)
        );
        filter: blur(15px);
        opacity: 0.7;
        animation: spp-disk-spin 12s linear infinite;
        transition: opacity 0.4s ease, filter 0.4s ease;
        pointer-events: none;
    }
    @keyframes spp-disk-spin {
        from { transform: rotate(0deg); }
        to { transform: rotate(360deg); }
    }

    .spp-blackhole-body {
        position: absolute; inset: 0;
        border-radius: 50%;
        background: radial-gradient(circle at 40% 40%, #0d121f 0%, #000000 70%);
        border: 1.5px solid rgba(255, 255, 255, 0.22);
        box-shadow: 
            0 0 26px rgba(255, 0, 127, 0.38),
            0 0 54px rgba(0, 238, 255, 0.32),
            inset 0 0 22px rgba(0, 0, 0, 0.95);
        cursor: pointer;
        overflow: hidden;
        display: flex; flex-direction: column; align-items: center; justify-content: center;
        transition: transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1), box-shadow 0.35s ease;
    }
    .spp-blackhole-body:hover {
        transform: scale(1.08);
        box-shadow: 
            0 0 38px rgba(255, 0, 127, 0.65),
            0 0 75px rgba(0, 238, 255, 0.55),
            inset 0 0 26px rgba(0, 0, 0, 0.95);
    }

    .spp-event-horizon {
        position: absolute; inset: 2px; border-radius: 50%;
        border: 1px solid transparent;
        border-top: 2px solid rgba(0, 238, 255, 0.85);
        border-bottom: 2px solid rgba(255, 0, 127, 0.85);
        animation: spp-horizon-rotate 6s ease-in-out infinite alternate;
        pointer-events: none;
    }
    @keyframes spp-horizon-rotate {
        from { transform: rotate(0deg) scale(0.96); opacity: 0.65; }
        to   { transform: rotate(180deg) scale(1.03); opacity: 1; }
    }

    .spp-core-idle {
        display: flex; flex-direction: column; align-items: center; justify-content: center;
        gap: 4px; pointer-events: none; transition: opacity 0.3s ease;
    }
    .spp-core-idle-icon {
        width: 22px; height: 22px; color: rgba(255, 255, 255, 0.75);
        filter: drop-shadow(0 0 8px rgba(0, 238, 255, 0.85));
        animation: spp-float 3s ease-in-out infinite alternate;
    }
    .spp-core-idle-txt {
        font-size: 10px; font-weight: 700; color: #cbd5e1;
        letter-spacing: 0.12em; text-transform: uppercase;
        text-shadow: 0 0 8px rgba(255, 255, 255, 0.4);
    }
    @keyframes spp-float {
        from { transform: translateY(-2px); }
        to { transform: translateY(2px); }
    }

    .spp-core-active-hud {
        position: absolute; inset: 0;
        display: none; flex-direction: column; align-items: center; justify-content: center;
        padding: 8px; text-align: center;
        background: radial-gradient(circle, rgba(16, 24, 48, 0.94) 0%, rgba(5, 7, 15, 0.97) 100%);
        animation: spp-core-pop 0.2s ease-out;
    }
    .spp-core-active-hud.show { display: flex; }
    @keyframes spp-core-pop {
        from { opacity: 0; }
        to   { opacity: 1; }
    }

    .spp-core-target-name {
        font-size: 16px; font-weight: 900; letter-spacing: 0.05em;
        background: linear-gradient(135deg, #ffffff 20%, var(--c-cyan) 80%);
        -webkit-background-clip: text; -webkit-text-fill-color: transparent;
        line-height: 1.1; margin-bottom: 2px;
    }
    .spp-core-open-badge {
        display: inline-flex; align-items: center; gap: 3px;
        font-size: 9.5px; font-weight: 700;
        padding: 2px 7px; border-radius: 999px;
        background: rgba(0, 238, 255, 0.22);
        color: var(--c-cyan);
        border: 1px solid rgba(0, 238, 255, 0.45);
        box-shadow: 0 0 10px rgba(0, 238, 255, 0.3);
        margin-bottom: 4px;
    }
    .spp-core-sub-action {
        display: inline-flex; align-items: center; gap: 3px;
        font-size: 9px; color: #94a3b8; text-decoration: none;
        transition: color 0.2s ease;
    }
    .spp-core-sub-action:hover { color: #f8fafc; }

    .spp-gal__line {
        position: absolute; bottom: 8px; left: 50%; transform: translateX(-50%);
        width: 44px; height: 1.5px; opacity: 0.7;
        background: linear-gradient(90deg, transparent, rgba(255, 0, 127, 0.95), transparent);
        pointer-events: none;
    }

    .spp-modal-backdrop {
        position: fixed; inset: 0; z-index: 9999;
        background: rgba(3, 5, 12, 0.8);
        backdrop-filter: blur(20px);
        -webkit-backdrop-filter: blur(20px);
        display: flex; align-items: center; justify-content: center;
        padding: 20px;
        opacity: 0; pointer-events: none;
        transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1);
    }
    .spp-modal-backdrop.open {
        opacity: 1; pointer-events: auto;
    }

    .spp-modal-dialog {
        width: min(800px, 94vw);
        max-height: 88vh;
        display: flex; flex-direction: column;
        background: linear-gradient(145deg, rgba(20, 27, 45, 0.93) 0%, rgba(10, 14, 26, 0.97) 100%);
        border: 1px solid rgba(255, 255, 255, 0.15);
        border-radius: 24px;
        box-shadow: 
            0 25px 75px rgba(0, 0, 0, 0.85),
            0 0 45px rgba(0, 238, 255, 0.16),
            inset 0 1px 0 rgba(255, 255, 255, 0.22);
        overflow: hidden;
        transform: scale(0.99) translateY(6px);
        transition: transform 0.2s cubic-bezier(0.16, 1, 0.3, 1);
    }
    .spp-modal-backdrop.open .spp-modal-dialog {
        transform: scale(1) translateY(0);
    }

    .spp-modal-header {
        padding: 20px 24px;
        background: rgba(255, 255, 255, 0.03);
        border-bottom: 1px solid rgba(255, 255, 255, 0.08);
        display: flex; align-items: center; justify-content: space-between;
        position: relative;
    }
    .spp-modal-header-left {
        display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
    }
    .spp-modal-title {
        font-size: 28px; font-weight: 900; letter-spacing: 0.04em;
        color: #ffffff; line-height: 1;
    }
    .spp-modal-season-tag {
        font-size: 12px; font-weight: 700; padding: 4px 12px; border-radius: 999px;
    }
    .tag-summer {
        background: rgba(251, 191, 36, 0.16); color: #fbbf24; border: 1px solid rgba(251, 191, 36, 0.4);
    }
    .tag-winter {
        background: rgba(0, 238, 255, 0.16); color: #38bdf8; border: 1px solid rgba(0, 238, 255, 0.4);
    }
    .tag-special {
        background: rgba(255, 0, 127, 0.18); color: #f43f5e; border: 1px solid rgba(255, 0, 127, 0.4);
    }
    .tag-anniv {
        background: linear-gradient(135deg, rgba(251, 191, 36, 0.25), rgba(255, 0, 127, 0.25));
        color: #fde047; border: 1px solid rgba(251, 191, 36, 0.5);
        box-shadow: 0 0 12px rgba(251, 191, 36, 0.3);
    }

    .spp-modal-date {
        font-size: 13px; color: #94a3b8; font-variant-numeric: tabular-nums;
    }

    .spp-modal-close {
        background: rgba(255, 255, 255, 0.06);
        border: 1px solid rgba(255, 255, 255, 0.1);
        color: #94a3b8;
        width: 34px; height: 34px; border-radius: 50%;
        display: flex; align-items: center; justify-content: center;
        cursor: pointer; transition: all 0.2s ease;
    }
    .spp-modal-close:hover {
        background: rgba(255, 0, 127, 0.25);
        color: #ffffff; border-color: rgba(255, 0, 127, 0.5);
        transform: rotate(90deg);
    }

    .spp-modal-body {
        padding: 24px;
        overflow-y: auto;
        display: flex; flex-direction: column; gap: 20px;
    }
    .spp-modal-body::-webkit-scrollbar { width: 6px; }
    .spp-modal-body::-webkit-scrollbar-thumb {
        background: rgba(255, 255, 255, 0.15); border-radius: 999px;
    }

    .spp-info-card {
        background: rgba(255, 255, 255, 0.025);
        border: 1px solid rgba(255, 255, 255, 0.07);
        border-radius: 14px;
        padding: 16px 18px;
    }
    .spp-info-card-title {
        display: flex; align-items: center; gap: 8px;
        font-size: 13px; font-weight: 750; color: #38bdf8;
        letter-spacing: 0.05em; text-transform: uppercase;
        margin-bottom: 12px;
    }
    .spp-info-card-title svg { width: 15px; height: 15px; }

    .spp-tag-cloud {
        display: flex; flex-wrap: wrap; gap: 8px;
    }
    .spp-ip-pill {
        font-size: 12px; font-weight: 600;
        padding: 5px 12px; border-radius: 8px;
        background: rgba(170, 0, 255, 0.12);
        color: #d8b4fe; border: 1px solid rgba(170, 0, 255, 0.25);
    }

    .spp-history-list {
        margin: 0; padding-left: 20px;
        display: flex; flex-direction: column; gap: 10px;
        color: #cbd5e1; font-size: 13.5px; line-height: 1.68;
    }
    .spp-history-list li strong { color: #f8fafc; font-weight: 700; }

    .spp-modal-footer {
        padding: 16px 24px;
        background: rgba(255, 255, 255, 0.02);
        border-top: 1px solid rgba(255, 255, 255, 0.07);
        display: flex; align-items: center; justify-content: space-between;
        flex-wrap: wrap; gap: 12px;
    }
    .spp-modal-nav-group {
        display: flex; align-items: center; gap: 8px;
    }
    .spp-nav-pill-btn {
        background: rgba(255, 255, 255, 0.05);
        border: 1px solid rgba(255, 255, 255, 0.1);
        color: #cbd5e1;
        font-size: 12px; font-weight: 600;
        padding: 7px 14px; border-radius: 8px;
        cursor: pointer; transition: all 0.2s ease;
        display: inline-flex; align-items: center; gap: 4px;
    }
    .spp-nav-pill-btn:hover:not(:disabled) {
        background: rgba(0, 238, 255, 0.15);
        color: var(--c-cyan); border-color: rgba(0, 238, 255, 0.4);
    }
    .spp-nav-pill-btn:disabled {
        opacity: 0.35; cursor: not-allowed;
    }

    .spp-direct-jump-btn {
        display: inline-flex; align-items: center; gap: 6px;
        background: linear-gradient(135deg, #00eeff, #0284c7);
        color: #030712 !important;
        font-size: 13px; font-weight: 750;
        padding: 8px 18px; border-radius: 10px;
        text-decoration: none !important;
        box-shadow: 0 4px 18px rgba(0, 238, 255, 0.35);
        transition: all 0.25s ease;
    }
    .spp-direct-jump-btn:hover {
        transform: translateY(-1px);
        box-shadow: 0 6px 25px rgba(0, 238, 255, 0.55);
        filter: brightness(1.1);
    }

    @media (max-width: 860px) {
        .spp-hud-bar { flex-direction: column; align-items: flex-start; }
        .spp-hud-right { width: 100%; justify-content: space-between; }
        .spp-gal { height: 440px; }
        .spp-gal__node { width: 72px; height: 34px; font-size: 12px; }
        .spp-gal-wrap { --spp-gal-core: 104px; }
        .spp-modal-header { padding: 16px; }
        .spp-modal-body { padding: 16px; }
    }
    @media (prefers-reduced-motion: reduce) {
        .spp-accretion-disk, .spp-event-horizon, .spp-live-dot, .spp-gal__node.is-active {
            animation:none !important;
        }
    }

    .spp-cm-card.spp-cmc {
        background:rgba(14,18,26,.9) !important;
        border:1px solid #1f293d !important;
        box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1) !important;
        -webkit-backdrop-filter:blur(4px) !important; backdrop-filter:blur(4px) !important;
        border-radius:16px !important;
        padding:16px !important;
        position:relative;
        display:flex !important; flex-direction:column !important; justify-content:space-between !important;
        transition:border-color .3s ease, transform .3s ease, box-shadow .3s ease;
    }
    .spp-cm-card.spp-cmc:hover {
        border-color:rgba(6,182,212,.4) !important;
        transform:translateY(-4px);
        box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1),
                   0 10px 26px -12px rgba(6,182,212,.35) !important;
    }
    .spp-cm-card.spp-cmc::before { content:none !important; }
    .spp-cm-card.spp-cmc .spp-cm-card__spin { display:none !important; }
    .spp-cm-card.spp-cmc .spp-cm-card__inner {
        background:none !important; padding:0 !important; border-radius:0 !important;
        -webkit-backdrop-filter:none !important; backdrop-filter:none !important;
    }

    .spp-cmc__top { min-width:0; }
    .spp-cmc__hd { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; margin-bottom:8px; }
    .spp-cmc__nm {
        margin:0; font-size:14px !important; font-weight:700 !important; line-height:1.35;
        color:#f1f5f9 !important; min-width:0;
        display:-webkit-box; -webkit-line-clamp:1; -webkit-box-orient:vertical; overflow:hidden;
    }
    .spp-cmc__nm a { color:inherit !important; text-decoration:none !important; }
    .spp-cm-card.spp-cmc:hover .spp-cmc__nm { color:#67e8f9 !important; }
    .spp-cmc__badge {
        flex:0 0 auto; display:inline-block; padding:2px 8px; border-radius:999px; white-space:nowrap;
        font-family:Consolas,Menlo,monospace !important; font-size:10px !important; line-height:1.5;
        border:1px solid transparent;
    }
    .spp-cmc__badge.is-hot    { background:rgba(84,8,42,.60);   color:#ff2a85 !important; border-color:rgba(255,42,133,.42); }
    .spp-cmc__badge.is-recent { background:rgba(76,18,50,.55);  color:#ff74b4 !important; border-color:rgba(255,116,180,.30); }
    .spp-cmc__badge.is-past   { background:rgba(56,22,74,.55);  color:#c07ad8 !important; border-color:rgba(192,122,216,.30); }
    .spp-cmc__badge.is-idle   { background:rgba(44,37,32,.60);  color:#8b8178 !important; border-color:rgba(139,129,120,.22); }

    .spp-cmc__date {
        display:flex; align-items:center; gap:6px; margin-bottom:12px;
        font-family:Consolas,Menlo,monospace !important; font-size:11px !important; color:#94a3b8 !important;
    }
    .spp-cmc__date svg { width:12px !important; height:12px !important; flex:none; color:#64748b !important; }

    .spp-cmc__date.is-note { color:#7f8794 !important; }
    .spp-cmc__date.is-note svg { color:#565e6b !important; }

    html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .spp-secbar-mecha__notice { color:#8c8276 !important; }

    html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .spp-secbar-mecha__today { color:#4fc8ea !important; }

    html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .spp-secbar-mecha__era {
        color:#ff74b4 !important;
        border-color:rgba(255,116,180,.45) !important;
        background-image:linear-gradient(90deg, rgba(255,42,133,.18), rgba(255,116,180,.10)) !important;
    }

    .spp-cmc__stats {
        display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px;
        padding:8px 10px; border-radius:12px; margin-bottom:14px; text-align:center; min-width:0;
        background:rgba(0,0,0,.4); border:1px solid rgba(30,41,59,.8);
    }
    .spp-cmc__stats.is-two { grid-template-columns:repeat(2,minmax(0,1fr)); }
    .spp-cmc__stats.is-two .spp-cmc__stat:nth-child(2) { border-right:none; }
    .spp-cmc__stat { min-width:0; }
    .spp-cmc__stat:nth-child(2) { border-left:1px solid #1e293b; border-right:1px solid #1e293b; }
    .spp-cmc__stat .k { display:block; font-size:10px !important; color:#94a3b8 !important; }
    .spp-cmc__stat .v {
        display:block; margin-top:2px; white-space:nowrap;
        font-family:Consolas,Menlo,monospace !important; font-size:12px !important; font-weight:700 !important;
        color:#e2e8f0 !important; font-variant-numeric:tabular-nums;
    }
    .spp-cmc__stat.is-hot .v { color:#34d399 !important; font-weight:800 !important; }

    .spp-cmc__links { display:flex; flex-direction:column; gap:6px; margin-bottom:14px; }
    .spp-cmc__link {
        display:flex; align-items:center; justify-content:space-between; gap:8px; padding:8px;
        border-radius:12px; text-decoration:none !important; min-width:0;
        background:rgba(7,9,14,.6); border:1px solid rgba(30,41,59,.8);
        transition:background .18s ease, border-color .18s ease;
    }
    .spp-cmc__link:hover { background:rgba(7,9,14,1); border-color:rgba(6,182,212,.3); }
    .spp-cmc__link-l { display:flex; align-items:center; gap:8px; min-width:0; }
    .spp-cmc__link-ico {
        flex:0 0 24px; width:24px; height:24px; border-radius:8px;
        display:flex; align-items:center; justify-content:center;
        background:#1e293b; color:#94a3b8 !important;
        transition:background .18s ease, color .18s ease;
    }
    .spp-cmc__link-ico svg { width:14px !important; height:14px !important; }
    .spp-cmc__link:hover .spp-cmc__link-ico { background:rgba(8,47,73,.6); color:#22d3ee !important; }
    .spp-cmc__link-txt { min-width:0; }
    .spp-cmc__link-txt b {
        display:block; font-size:12px !important; font-weight:500 !important; color:#e2e8f0 !important;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-cmc__link:hover .spp-cmc__link-txt b { color:#67e8f9 !important; }
    .spp-cmc__link-txt i {
        display:block; font-style:normal; font-size:10px !important; color:#64748b !important;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-cmc__link-go { flex:0 0 auto; display:flex; color:#475569 !important; transition:color .18s ease, transform .18s ease; }
    .spp-cmc__link-go svg { width:14px !important; height:14px !important; }
    .spp-cmc__link:hover .spp-cmc__link-go { color:#22d3ee !important; transform:translateX(2px); }

    .spp-cmc__ft { margin-top:auto; padding-top:8px; border-top:1px solid rgba(30,41,59,.8); }
    .spp-cmc__last { display:block; text-decoration:none !important; margin-bottom:10px; }
    .spp-cmc__last .spp-cmc__lastt {
        display:block; font-size:11px !important; font-weight:400 !important; color:#cbd5e1 !important;
        background:none !important; box-shadow:none !important; border:0 !important;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-cmc__last:hover .spp-cmc__lastt { color:#f9a8d4 !important; }
    .spp-cmc__last .m {
        display:flex; align-items:center; justify-content:space-between; gap:8px; margin-top:4px;
        font-family:Consolas,Menlo,monospace !important; font-size:10px !important; color:#94a3b8 !important;
    }
    .spp-cmc__last .m > span { min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
    .spp-cmc__last .m em { font-style:normal; color:#64748b; margin-left:5px; }
    .spp-cmc__cta {
        display:flex; align-items:center; justify-content:center; gap:6px; width:100%;
        padding:6px 12px; border-radius:12px; text-decoration:none !important;
        font-size:12px !important; font-weight:500 !important; color:#cbd5e1 !important;
        background:#0f172a; border:1px solid #1e293b;
        transition:background .18s ease, border-color .18s ease, color .18s ease;
    }
    .spp-cmc__cta:hover { background:rgba(8,47,73,.7); border-color:rgba(6,182,212,.4); color:#67e8f9 !important; }
    .spp-cmc__cta svg { width:14px !important; height:14px !important; }

    .spp-cmc-filter {
        display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:12px;
        padding:4px 0 6px;
    }
    .spp-cmc-filter__l { display:flex; align-items:center; gap:8px; flex-wrap:wrap; font-size:12px; color:#cbd5e1; }
    .spp-cmc-filter__ico { display:flex; color:#22d3ee !important; }
    .spp-cmc-filter__ico svg { width:14px !important; height:14px !important; }
    .spp-cmc-filter__lb { font-weight:500; }
    .spp-cmc-filter__btns { display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
    .spp-cmc-filter__btns button {
        padding:4px 10px; border-radius:8px; cursor:pointer; font-family:inherit;
        font-size:12px !important; font-weight:500 !important; color:#94a3b8 !important;
        background:#121722; border:1px solid #1e293b;
        transition:color .16s ease, background .16s ease, border-color .16s ease;
    }
    .spp-cmc-filter__btns button:hover { color:#e2e8f0 !important; }
    .spp-cmc-filter__btns button.is-on {
        background:rgba(8,47,73,.8); color:#67e8f9 !important;
        border-color:rgba(6,182,212,.4); font-weight:700 !important;
    }
    .spp-cmc-filter__r { display:flex; align-items:center; gap:8px; font-size:12px; color:#94a3b8; }
    .spp-cmc-filter__r b { font-family:Consolas,Menlo,monospace !important; font-weight:700 !important; }
    .spp-cmc-filter__r b.cy { color:#22d3ee !important; }
    .spp-cmc-filter__r b.pk { color:#f472b6 !important; }
    .spp-cmc-filter__r .sep { color:#475569; }

    .spp-cmc-foldwrap > tr > td { padding:14px 10px !important; border:none !important; background:transparent !important; }
    .spp-cmc-foldph {
        padding:48px 16px; text-align:center;
        border:1px dashed #1e293b; border-radius:16px; background:rgba(14,18,26,.4);
    }
    .spp-cmc-foldph__ico { display:block; color:#475569 !important; animation:spp-cmc-bounce 1s infinite; }
    .spp-cmc-foldph__ico svg { display:block; width:32px !important; height:32px !important; margin:0 auto 8px; }
    .spp-cmc-foldph p { margin:0; font-size:14px !important; color:#94a3b8 !important; }
    .spp-cmc-foldph__btn {
        margin-top:12px; padding:6px 16px; border-radius:12px; cursor:pointer; font-family:inherit;
        font-size:12px !important; color:#67e8f9 !important;
        background:rgba(8,47,73,.7); border:1px solid rgba(6,182,212,.4);
        transition:background .16s ease;
    }
    .spp-cmc-foldph__btn:hover { background:#164e63; }
    @keyframes spp-cmc-bounce {
        0%, 100% { transform:translateY(-25%); animation-timing-function:cubic-bezier(.8,0,1,1); }
        50%      { transform:none;            animation-timing-function:cubic-bezier(0,0,.2,1); }
    }

    `;
const CSS_TOPCARD = `
    .spp-top4 {
        --sz-card-h:256px;
        display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:16px;
        margin:0 0 16px;
    }
    .spp-top4 > .spp-sc { height:var(--sz-card-h); }
    html.spp-hm-on .t.spp-top4-host { margin-top:16px !important; }
    .spp-top4 .spp-lt__hd { font-size:14px; color:#f0f5ff; letter-spacing:1.4px; }
    .spp-top4 .spp-lt__hd em { display:none; }
    .spp-top4 .spp-lt__hd a.spp-top4__hd {
        color:#f0f5ff !important; text-decoration:none !important;
        transition:color .16s ease, text-shadow .16s ease;
        flex:1 1 auto; min-width:0; cursor:pointer;
    }
    .spp-top4 .spp-lt__hd a.spp-top4__hd:hover {
        color:#39ff14 !important;
        text-shadow:0 0 6px rgba(57,255,20,.85), 0 0 16px rgba(57,255,20,.45);
    }
    .spp-top4 .spp-lt__list a { height:29px; font-size:13.5px; }

    .spp-sc--mikan { perspective:900px; }
    .spp-mk {
        position:absolute; inset:0;
        transform-style:preserve-3d;
        transition:transform 300ms;
        box-shadow:0 0 10px 1px #000000ee;
        border-radius:20px;
    }
    .spp-sc--mikan:hover .spp-mk { transform:rotateY(180deg); }
    .spp-mk__back, .spp-mk__front {
        position:absolute; inset:0; overflow:hidden; border-radius:20px;
        background-color:#151515;
        backface-visibility:hidden; -webkit-backface-visibility:hidden;
    }
    .spp-mk__back { display:grid; place-items:center; }
    .spp-mk__back::before {
        position:absolute; content:''; display:block;
        width:46%; height:300%;
        background:linear-gradient(90deg,transparent,#ff9966,#ff9966,#ff9966,#ff9966,transparent);
        animation:sppMkSpin 5000ms infinite linear;
    }
    @keyframes sppMkSpin {
        0%   { transform:rotateZ(0deg); }
        100% { transform:rotateZ(360deg); }
    }
    .spp-mk__core {
        position:absolute; inset:1px; z-index:1; border-radius:19px;
        background-color:#151515;
        display:flex; flex-direction:column; align-items:center; justify-content:center; gap:16px;
        color:#fff;
    }
    .spp-mk__core strong {
        font-size:15px; font-weight:700; letter-spacing:3px; color:#f4f4f4;
        text-shadow:0 1px 3px rgba(0,0,0,.75);
    }
    .spp-mk__front { transform:rotateY(180deg); color:#fff; }
    .spp-mk__orbs { position:absolute; inset:0; z-index:1; pointer-events:none; }
    .spp-mk__orbs span {
        position:absolute; border-radius:50%; filter:blur(15px);
        animation:sppMkFloat 2600ms infinite linear;
    }
    .spp-mk__orbs .c1 { width:120px; height:120px; background:#ffbb66; left:10%;  top:46%; }
    .spp-mk__orbs .c2 { width:44px;  height:44px;  background:#ff2233; right:13%; top:8%;  animation-delay:-1800ms; }
    .spp-mk__orbs .c3 { width:150px; height:150px; background:#ff8866; left:32%;  top:88%; animation-delay:-800ms; }
    @keyframes sppMkFloat {
        0%   { transform:translateY(0); }
        50%  { transform:translateY(10px); }
        100% { transform:translateY(0); }
    }
    .spp-mk__frontcore {
        position:relative; z-index:2; height:100%; padding:14px 16px;
        box-sizing:border-box; overflow:hidden;
        display:flex; flex-direction:column; justify-content:space-between; gap:10px;
    }
    .spp-mk__badge {
        align-self:flex-start; flex:0 0 auto;
        background-color:rgba(0,0,0,.34); backdrop-filter:blur(2px);
        padding:3px 11px; border-radius:10px;
        font-size:11px; letter-spacing:1.6px; color:#ffd9c2;
        max-width:100%; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-mk__desc {
        flex:0 1 auto; min-height:0;
        background-color:rgba(0,0,0,.62); backdrop-filter:blur(5px);
        border-radius:10px; padding:10px 13px;
        box-shadow:0 0 10px 5px rgba(0,0,0,.53);
    }
    .spp-mk__title {
        display:flex; align-items:center; justify-content:space-between; gap:10px;
        font-size:13px; font-weight:700; color:#fff; line-height:1.3;
    }
    .spp-mk__title span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
    .spp-mk__title svg { flex:0 0 auto; fill:#20c997; }
    .spp-mk__foot {
        margin:5px 0 0; font-size:11px; line-height:1.45;
        color:rgba(255,255,255,.66);
        display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
        overflow:hidden;
    }
    .spp-mk__foot--host {
        display:block; margin-top:3px; -webkit-line-clamp:none;
        color:rgba(255,153,102,.82); letter-spacing:.4px;
    }
    .spp-mk__link { position:absolute; inset:0; z-index:300; display:block; }

    .spp-bili {
        flex:0 0 auto; width:19px; height:19px;
        fill:none; stroke:currentColor; stroke-width:1.7;
        stroke-linecap:round; stroke-linejoin:round;
        color:#f4f4f4; vertical-align:middle;
        filter:drop-shadow(0 0 5px rgba(255,255,255,.22));
        transition:color .16s ease, filter .16s ease;
    }
    .spp-mk__core .spp-bili {
        width:64px; height:64px; stroke-width:1.5;
        filter:drop-shadow(0 0 9px rgba(255,255,255,.28));
    }
    .spp-sc--mikan:hover .spp-bili { color:#fff; filter:drop-shadow(0 0 8px rgba(255,255,255,.5)); }
    `;
const CSS_HIDE_NOTICE = `
    #main > .bdbA { display:none !important; }
    `;
const CSS_HDR = `
    #header > table { display:none !important; }
    `;
const CSS_CLEARBG = `
    html.spp-hm-on.spp-hm-star #header {
        background:transparent !important;
        backdrop-filter:none !important;
        -webkit-backdrop-filter:none !important;
        box-shadow:none !important;
    }
    html.spp-hm-on.spp-hm-star #main div.t:has(> .spp-top4) {
        background:transparent !important;
        border-color:transparent !important;
        box-shadow:none !important;
    }
    html.spp-hm-on.spp-hm-star #main div.t:has(#cate_39) {
        background:transparent !important;
        border-color:transparent !important;
        box-shadow:none !important;
    }
    html.spp-hm-on.spp-hm-star #main div.t:has(#cate_7) {
        background:transparent !important;
        border-color:transparent !important;
        box-shadow:none !important;
    }
    html.spp-hm-on.spp-hm-star #main div.t:has(#cate_1) {
        background:transparent !important;
        border-color:transparent !important;
        box-shadow:none !important;
    }
    html.spp-hm-on.spp-hm-star #main div.t.spp-top4-host,
    html.spp-hm-on.spp-hm-star #main div.t.spp-clear-host {
        background:transparent !important;
        border-color:transparent !important;
        box-shadow:none !important;
    }
    `;
function applyHomeStyle() {
let el = document.getElementById(STYLE_ID);
if (!el) {
el = document.createElement('style');
el.id = STYLE_ID;
appendToHeadSafe(el);
}
el.textContent = (onHdr ? CSS_HDR : '') +
(onHideNotice ? CSS_HIDE_NOTICE : '') +
(onStats ? CSS_STATS : '') +
(onUPanel ? CSS_UPANEL : '') +
((onTopCard || onSub || onCard || onHjCard || onRmCard) ? CSS_CLEARBG : '') +
(onNotice ? CSS_NOTICE : '') +
(onBoards ? CSS_BOARDS : '') + ((onCard || onFlCard) ? CSS_CARD : '') +
(onTopCard ? CSS_TOPCARD : '') +
((onSub || onTopCard) ? CSS_SUBCARD : '') +
(onFlkSec ? FLK_CSS + FLK_SEC_CSS : '');
if (onBoards || onCard || onSub || onTopCard || onUPanel || onHjCard || onRmCard || onFlkSec) document.documentElement.classList.add('spp-hm-on');
}
const CSS_SUBCARD = `
    .spp-sz { margin:0 0 8px !important; }
    .spp-sz-group { margin-bottom:20px; }
    .spp-sz-group:last-child { margin-bottom:0; }

    .spp-sz-hd {
        position:relative; isolation:isolate;
        display:flex; align-items:center; gap:14px;
        background:linear-gradient(45deg,#0ce39a,#69007f,#fc0987) !important;
        border-radius:11px; padding:9px 16px; margin-bottom:14px;
        box-shadow:0 8px 22px -14px rgba(105,0,127,.85);
    }
    .spp-sz-hd::before {
        content:""; position:absolute; inset:1px; border-radius:10px;
        background:#272727; z-index:-1; pointer-events:none; transition:opacity .5s ease;
    }
    .spp-sz-hd:hover::before { opacity:.72; }
    .spp-sz-hd__t {
        position:relative; z-index:1; margin:0; font-size:17px; font-weight:700;
        color:#fff !important; text-decoration:none !important;
        text-shadow:0 1px 6px rgba(0,0,0,.55);
    }
    .spp-sz-hd__meta {
        margin-left:auto; position:relative; z-index:1;
        font-size:12px; letter-spacing:.6px; color:rgba(255,255,255,.55); white-space:nowrap;
    }
    .spp-sz-hd__meta b { color:#0ce39a; font-weight:700; }
    .spp-sz-hd__cnt {
        position:relative; z-index:1; font-size:11px; letter-spacing:2px;
        color:rgba(255,255,255,.4); padding-left:12px;
        border-left:1px solid rgba(255,255,255,.16);
    }

    .spp-sz-grid {
        --scols:5;
        display:grid; grid-template-columns:repeat(var(--scols),1fr); gap:16px;
    }
    .spp-sz-group.is-center .spp-sz-grid {
        --sz-card-h:256px;
        --tea-w:460px;
        --tea-grow:1.1;
        --tea-bleed:calc(var(--tea-w) * (var(--tea-grow) - 1) / 2 + 3px);
        display:flex; justify-content:center;
        gap:var(--tea-bleed);
        padding:16px 0;
    }
    .spp-sz-group.is-center .spp-sz-grid > .spp-sc:not(.spp-sc--tea):not(.spp-latest) {
        width:calc((100% - (var(--scols) - 1) * 16px) / var(--scols)); flex:0 0 auto;
    }

    .spp-sc {
        position:relative; display:block; height:172px;
        text-decoration:none !important; color:inherit;
        transition:200ms;
        -webkit-touch-callout:none; -webkit-user-select:none;
        -moz-user-select:none; -ms-user-select:none; user-select:none;
    }
    .spp-sc:active { filter:brightness(.94); }
    .spp-sc__canvas {
        position:absolute; inset:0; z-index:200; perspective:800px;
        display:grid;
        grid-template-columns:1fr 1fr 1fr 1fr 1fr;
        grid-template-rows:1fr 1fr 1fr 1fr 1fr; gap:0 0;
        grid-template-areas:
            "a1 a2 a3 a4 a5"
            "b1 b2 b3 b4 b5"
            "c1 c2 c3 c4 c5"
            "d1 d2 d3 d4 d5"
            "e1 e2 e3 e4 e5";
    }
    .spp-sc__tr { position:absolute; z-index:200; width:100%; height:100%; }
    .spp-sc__tr:nth-child(1)  { grid-area:a1; --rx:20deg;  --ry:-10deg; }
    .spp-sc__tr:nth-child(2)  { grid-area:a2; --rx:20deg;  --ry:-5deg;  }
    .spp-sc__tr:nth-child(3)  { grid-area:a3; --rx:20deg;  --ry:0deg;   }
    .spp-sc__tr:nth-child(4)  { grid-area:a4; --rx:20deg;  --ry:5deg;   }
    .spp-sc__tr:nth-child(5)  { grid-area:a5; --rx:20deg;  --ry:10deg;  }
    .spp-sc__tr:nth-child(6)  { grid-area:b1; --rx:10deg;  --ry:-10deg; }
    .spp-sc__tr:nth-child(7)  { grid-area:b2; --rx:10deg;  --ry:-5deg;  }
    .spp-sc__tr:nth-child(8)  { grid-area:b3; --rx:10deg;  --ry:0deg;   }
    .spp-sc__tr:nth-child(9)  { grid-area:b4; --rx:10deg;  --ry:5deg;   }
    .spp-sc__tr:nth-child(10) { grid-area:b5; --rx:10deg;  --ry:10deg;  }
    .spp-sc__tr:nth-child(11) { grid-area:c1; --rx:0deg;   --ry:-10deg; }
    .spp-sc__tr:nth-child(12) { grid-area:c2; --rx:0deg;   --ry:-5deg;  }
    .spp-sc__tr:nth-child(13) { grid-area:c3; --rx:0deg;   --ry:0deg;   }
    .spp-sc__tr:nth-child(14) { grid-area:c4; --rx:0deg;   --ry:5deg;   }
    .spp-sc__tr:nth-child(15) { grid-area:c5; --rx:0deg;   --ry:10deg;  }
    .spp-sc__tr:nth-child(16) { grid-area:d1; --rx:-10deg; --ry:-10deg; }
    .spp-sc__tr:nth-child(17) { grid-area:d2; --rx:-10deg; --ry:-5deg;  }
    .spp-sc__tr:nth-child(18) { grid-area:d3; --rx:-10deg; --ry:0deg;   }
    .spp-sc__tr:nth-child(19) { grid-area:d4; --rx:-10deg; --ry:5deg;   }
    .spp-sc__tr:nth-child(20) { grid-area:d5; --rx:-10deg; --ry:10deg;  }
    .spp-sc__tr:nth-child(21) { grid-area:e1; --rx:-20deg; --ry:-10deg; }
    .spp-sc__tr:nth-child(22) { grid-area:e2; --rx:-20deg; --ry:-5deg;  }
    .spp-sc__tr:nth-child(23) { grid-area:e3; --rx:-20deg; --ry:0deg;   }
    .spp-sc__tr:nth-child(24) { grid-area:e4; --rx:-20deg; --ry:5deg;   }
    .spp-sc__tr:nth-child(25) { grid-area:e5; --rx:-20deg; --ry:10deg;  }
    .spp-sc__tr:hover { cursor:pointer; }
    .spp-sc__card {
        position:absolute; inset:0; z-index:0;
        display:flex; justify-content:center; align-items:center;
        border-radius:20px; transition:700ms;
        background:linear-gradient(45deg,#1a1a1a,#262626);
        border:2px solid rgba(255,255,255,.1);
        overflow:hidden;
        box-shadow:0 0 20px rgba(0,0,0,.3), inset 0 0 20px rgba(0,0,0,.2);
    }
    .spp-sc__card::before {
        content:""; position:absolute; left:50%; top:50%;
        width:150%; height:150%;
        transform:translate(-50%,-50%);
        background:radial-gradient(circle at center,
            rgba(0,255,170,.1) 0%, rgba(0,162,255,.05) 50%, transparent 100%);
        filter:blur(20px); opacity:0; transition:opacity .3s ease;
    }
    .spp-sc__tr:hover ~ .spp-sc__card {
        transition:125ms ease-in-out;
        transform:rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg));
        filter:brightness(1.1);
    }
    .spp-sc__tr:hover ~ .spp-sc__card::before { opacity:1; }
    .spp-sc__tr:hover ~ .spp-sc__card .spp-sc__glows > div { opacity:1; }
    .spp-sc__tr:hover ~ .spp-sc__card .spp-sc__particles span { animation:sppScFloat 2s infinite; }
    .spp-sc__tr:hover ~ .spp-sc__card .spp-sc__name { transform:translateY(-4px); }
    .spp-sc__body {
        position:relative; width:100%; height:100%;
        padding:16px 18px 12px;
        display:flex; flex-direction:column; align-items:center; justify-content:center;
    }
    .spp-sc__glare {
        position:absolute; inset:0; pointer-events:none; opacity:0; transition:opacity 300ms;
        background:linear-gradient(125deg,
            rgba(255,255,255,0) 0%, rgba(255,255,255,.05) 45%,
            rgba(255,255,255,.1) 50%, rgba(255,255,255,.05) 55%, rgba(255,255,255,0) 100%);
    }
    .spp-sc:hover .spp-sc__glare { opacity:1; }
    .spp-sc__lines span {
        position:absolute; pointer-events:none;
        background:linear-gradient(90deg,transparent,rgba(92,103,255,.2),transparent);
    }
    .spp-sc__lines span:nth-child(1) { top:20%; left:0;  width:100%; height:1px; transform:scaleX(0); transform-origin:left;  animation:sppScLine 3s linear infinite; }
    .spp-sc__lines span:nth-child(2) { top:40%; right:0; width:100%; height:1px; transform:scaleX(0); transform-origin:right; animation:sppScLine 3s linear infinite 1s; }
    .spp-sc__lines span:nth-child(3) { top:60%; left:0;  width:100%; height:1px; transform:scaleX(0); transform-origin:left;  animation:sppScLine 3s linear infinite 2s; }
    .spp-sc__lines span:nth-child(4) { top:80%; right:0; width:100%; height:1px; transform:scaleX(0); transform-origin:right; animation:sppScLine 3s linear infinite 1.5s; }
    .spp-sc__glows > div {
        position:absolute; pointer-events:none; width:100px; height:100px; border-radius:50%;
        background:radial-gradient(circle at center,rgba(0,255,170,.3) 0%,rgba(0,255,170,0) 70%);
        filter:blur(15px); opacity:0; transition:opacity .3s ease;
    }
    .spp-sc__glows .g1 { top:-20px; left:-20px; }
    .spp-sc__glows .g2 { top:50%; right:-30px; transform:translateY(-50%); }
    .spp-sc__glows .g3 { bottom:-20px; left:30%; }
    .spp-sc__particles span {
        position:absolute; pointer-events:none; width:3px; height:3px;
        background:#00ffaa; border-radius:50%; opacity:0; transition:opacity .3s ease;
    }
    .spp-sc__particles span:nth-child(1) { --x:1;   --y:-1; top:40%; left:20%; }
    .spp-sc__particles span:nth-child(2) { --x:-1;  --y:-1; top:60%; right:20%; }
    .spp-sc__particles span:nth-child(3) { --x:.5;  --y:1;  top:20%; left:40%; }
    .spp-sc__particles span:nth-child(4) { --x:-.5; --y:1;  top:80%; right:40%; }
    .spp-sc__particles span:nth-child(5) { --x:1;   --y:.5; top:30%; left:60%; }
    .spp-sc__particles span:nth-child(6) { --x:-1;  --y:.5; top:70%; right:60%; }
    .spp-sc--hud .spp-sc__corners span {
        box-sizing:border-box;
        position:absolute; pointer-events:none; z-index:20;
        width:14px; height:14px; opacity:0;
        border-style:solid; border-width:0; border-color:transparent;
        box-shadow:none; transition:all .4s cubic-bezier(.25,.8,.25,1);
    }
    .spp-sc--hud .spp-sc__corners span:nth-child(1) { top:0; left:0;  border-top-width:2px; border-left-width:2px;  border-top-left-radius:6px; }
    .spp-sc--hud .spp-sc__corners span:nth-child(2) { top:0; right:0; border-top-width:2px; border-right-width:2px; border-top-right-radius:6px; }
    .spp-sc--hud .spp-sc__corners span:nth-child(3) { bottom:0; left:0;  border-bottom-width:2px; border-left-width:2px;  border-bottom-left-radius:6px; }
    .spp-sc--hud .spp-sc__corners span:nth-child(4) { bottom:0; right:0; border-bottom-width:2px; border-right-width:2px; border-bottom-right-radius:6px; }
    .spp-sc--hud:hover .spp-sc__corners span {
        border-color:#ff007f; opacity:1; box-shadow:0 0 8px rgba(255,0,127,.4) inset;
    }
    .spp-sc--hud:hover .spp-sc__corners span:nth-child(1) { transform:translate(6px,6px); }
    .spp-sc--hud:hover .spp-sc__corners span:nth-child(2) { transform:translate(-6px,6px); }
    .spp-sc--hud:hover .spp-sc__corners span:nth-child(3) { transform:translate(6px,-6px); }
    .spp-sc--hud:hover .spp-sc__corners span:nth-child(4) { transform:translate(-6px,-6px); }
    .spp-sc__scan {
        position:absolute; inset:0; pointer-events:none;
        background:linear-gradient(to bottom,transparent,rgba(92,103,255,.1),transparent);
        transform:translateY(-100%); animation:sppScScan 2s linear infinite;
    }
    @keyframes sppScFloat {
        0%   { transform:translate(0,0); opacity:0; }
        50%  { opacity:1; }
        100% { transform:translate(calc(var(--x,0) * 30px),calc(var(--y,0) * 30px)); opacity:0; }
    }
    @keyframes sppScLine {
        0%   { transform:scaleX(0); opacity:0; }
        50%  { transform:scaleX(1); opacity:1; }
        100% { transform:scaleX(0); opacity:0; }
    }
    @keyframes sppScScan {
        0%   { transform:translateY(-100%); }
        100% { transform:translateY(100%); }
    }
    .spp-sc__name {
        position:relative; z-index:5; margin:0; text-align:center;
        font-size:20px; font-weight:800; letter-spacing:2px; line-height:1.25;
        background:linear-gradient(45deg,#8dffdd,#6fd0ff);
        -webkit-background-clip:text; background-clip:text;
        -webkit-text-fill-color:transparent;
        filter:drop-shadow(0 1px 1px rgba(0,0,0,.95)) drop-shadow(0 0 6px rgba(0,255,170,.22));
        -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale;
        text-rendering:optimizeLegibility;
        transition:transform 300ms ease-in-out; word-break:break-word;
    }
    .spp-sc.is-long  .spp-sc__name { font-size:16px;   letter-spacing:1px; }
    .spp-sc.is-xlong .spp-sc__name { font-size:13.5px; letter-spacing:.5px; }

    .spp-sz-group.is-center .spp-sz-grid > .spp-sc--tea {
        flex:0 0 var(--tea-w); width:var(--tea-w); height:var(--sz-card-h);
    }
    .spp-tc {
        position:relative; width:var(--tea-w); height:100%;
        background:#243137; display:grid; place-content:center;
        border-radius:10px; overflow:hidden; transition:all .5s ease-in-out;
        -webkit-user-select:none; -moz-user-select:none; user-select:none;
    }
    .spp-tc__border {
        position:absolute; inset:0; border:2px solid #bd9f67;
        opacity:0; transform:rotate(10deg); transition:all .5s ease-in-out; pointer-events:none;
    }
    .spp-tc__bottom {
        position:absolute; left:50%; bottom:13px; transform:translateX(-50%);
        font-size:9px; text-transform:uppercase; padding:0 5px 0 8px;
        color:#bd9f67; background:#243137;
        opacity:0; letter-spacing:7px; transition:all .5s ease-in-out;
        white-space:nowrap; pointer-events:none;
    }
    .spp-tc__content { transition:all .5s ease-in-out; }
    .spp-tc__logo {
        height:46px; position:relative; width:48px;
        overflow:hidden; transition:all 1s ease-in-out;
    }
    .spp-tc__logo1, .spp-tc__logo2 {
        height:100%; position:absolute; top:0;
        display:flex; align-items:center; color:#bd9f67; white-space:nowrap;
    }
    .spp-tc__logo1 { left:0; font-size:22px; font-weight:700; letter-spacing:1px;
        transition:opacity .35s ease, transform .5s ease; }
    .spp-tc__logo2 { left:48px; font-size:15px; letter-spacing:1px;
        transition:left .5s ease-in-out; }
    .spp-tc__trail {
        position:absolute; right:0; height:100%; width:100%; opacity:0; pointer-events:none;
    }
    .spp-tc__sub {
        position:absolute; left:50%; top:50%; transform:translate(-50%,-50%);
        margin-top:44px; color:#bd9f67; padding-left:8px; font-size:11px;
        opacity:0; letter-spacing:0; transition:all .5s ease-in-out .5s;
        white-space:nowrap; pointer-events:none;
    }
    .spp-tc:hover { border-radius:0; transform:scale(1.1); }
    .spp-tc:hover .spp-tc__logo { width:356px; animation:sppTcFlash 1s ease-in-out; }
    .spp-tc:hover .spp-tc__logo1 { opacity:0; transform:translateX(-14px); }
    .spp-tc:hover .spp-tc__logo2 { left:0; }
    .spp-tc:hover .spp-tc__border { inset:15px; opacity:1; transform:rotate(0); }
    .spp-tc:hover .spp-tc__bottom { letter-spacing:3px; opacity:1; }
    .spp-tc:hover .spp-tc__sub { opacity:1; letter-spacing:9.5px; }
    .spp-tc:hover .spp-tc__trail { animation:sppTcTrail 1s ease-in-out; }
    @keyframes sppTcFlash {
        0%   { border-right:1px solid transparent; }
        10%  { border-right:1px solid #bd9f67; }
        80%  { border-right:1px solid #bd9f67; }
        100% { border-right:1px solid transparent; }
    }
    @keyframes sppTcTrail {
        0%  { background:linear-gradient(90deg,rgba(189,159,103,0) 90%,rgb(189,159,103) 100%); opacity:0; }
        30% { background:linear-gradient(90deg,rgba(189,159,103,0) 70%,rgb(189,159,103) 100%); opacity:1; }
        70% { background:linear-gradient(90deg,rgba(189,159,103,0) 70%,rgb(189,159,103) 100%); opacity:1; }
        95% { background:linear-gradient(90deg,rgba(189,159,103,0) 90%,rgb(189,159,103) 100%); opacity:0; }
    }

    .spp-sz-group.is-center .spp-sz-grid > .spp-latest {
        flex:1 1 0; width:auto; height:var(--sz-card-h);
    }
    .spp-sz-group.is-center .spp-sz-grid > .spp-latest .spp-lt__list a { height:29px; font-size:13.5px; }
    .spp-sz-group.is-center .spp-sz-grid > .spp-latest .spp-lt__hd { font-size:14px; }
    .spp-lt {
        box-sizing:border-box;
        position:relative; height:100%; padding:16px 18px 12px;
        display:flex; flex-direction:column;
        border-radius:20px;
        background:linear-gradient(45deg,#1a1a1a,#262626);
        border:2px solid rgba(255,255,255,.1);
        box-shadow:0 0 20px rgba(0,0,0,.3), inset 0 0 20px rgba(0,0,0,.2);
        overflow:hidden;
    }
    .spp-lt__glare {
        position:absolute; inset:0; pointer-events:none; opacity:0; transition:opacity 300ms;
        background:linear-gradient(125deg,
            rgba(255,255,255,0) 0%, rgba(255,255,255,.05) 45%,
            rgba(255,255,255,.1) 50%, rgba(255,255,255,.05) 55%, rgba(255,255,255,0) 100%);
    }
    .spp-lt:hover .spp-lt__glare { opacity:1; }
    .spp-lt__lines span {
        position:absolute; pointer-events:none;
        background:linear-gradient(90deg,transparent,rgba(92,103,255,.2),transparent);
    }
    .spp-lt__lines span:nth-child(1) { top:22%; left:0;  width:100%; height:1px; transform:scaleX(0); transform-origin:left;  animation:sppScLine 3s linear infinite; }
    .spp-lt__lines span:nth-child(2) { top:42%; right:0; width:100%; height:1px; transform:scaleX(0); transform-origin:right; animation:sppScLine 3s linear infinite 1s; }
    .spp-lt__lines span:nth-child(3) { top:62%; left:0;  width:100%; height:1px; transform:scaleX(0); transform-origin:left;  animation:sppScLine 3s linear infinite 2s; }
    .spp-lt__lines span:nth-child(4) { top:82%; right:0; width:100%; height:1px; transform:scaleX(0); transform-origin:right; animation:sppScLine 3s linear infinite 1.5s; }
    .spp-lt__glows > div {
        position:absolute; pointer-events:none; width:100px; height:100px; border-radius:50%;
        background:radial-gradient(circle at center,rgba(0,255,170,.3) 0%,rgba(0,255,170,0) 70%);
        filter:blur(15px); opacity:0; transition:opacity .3s ease;
    }
    .spp-lt__glows .g1 { top:-20px; left:-20px; }
    .spp-lt__glows .g2 { top:50%; right:-30px; transform:translateY(-50%); }
    .spp-lt__glows .g3 { bottom:-20px; left:30%; }
    .spp-lt:hover .spp-lt__glows > div { opacity:1; }
    .spp-lt__corners span {
        position:absolute; pointer-events:none; width:10px; height:10px;
        border:2px solid rgba(92,103,255,.3); transition:all .3s ease;
    }
    .spp-lt__corners span:nth-child(1) { top:8px; left:8px;  border-right:0; border-bottom:0; }
    .spp-lt__corners span:nth-child(2) { top:8px; right:8px; border-left:0;  border-bottom:0; }
    .spp-lt__corners span:nth-child(3) { bottom:8px; left:8px;  border-right:0; border-top:0; }
    .spp-lt__corners span:nth-child(4) { bottom:8px; right:8px; border-left:0;  border-top:0; }
    .spp-lt:hover .spp-lt__corners span {
        border-color:rgba(92,103,255,.8); box-shadow:0 0 10px rgba(92,103,255,.5);
    }
    .spp-lt__scan {
        position:absolute; inset:0; pointer-events:none;
        background:linear-gradient(to bottom,transparent,rgba(92,103,255,.1),transparent);
        transform:translateY(-100%); animation:sppScScan 2s linear infinite;
    }
    .spp-lt__hd {
        position:relative; z-index:5;
        display:flex; align-items:center; gap:8px;
        padding-bottom:9px; margin-bottom:8px;
        border-bottom:1px solid rgba(148,163,184,.16);
        font-size:13px; font-weight:700; letter-spacing:1px; color:#e8eefc;
    }
    .spp-lt__hd i {
        flex:0 0 auto; width:3px; height:13px; border-radius:2px;
        background:linear-gradient(180deg,#00ffaa,#00a2ff);
        box-shadow:0 0 8px rgba(0,255,170,.5);
    }
    .spp-lt__hd em {
        margin-left:auto; font-style:normal; font-weight:400;
        font-size:10.5px; letter-spacing:2px; color:rgba(255,255,255,.34);
    }
    .spp-lt__list {
        position:relative; z-index:5; list-style:none; margin:0; padding:0;
        display:flex; flex-direction:column; flex:1; min-height:0;
    }
    .spp-lt__list a {
        display:flex; align-items:center; gap:9px; height:25px;
        text-decoration:none !important; font-size:13px; font-weight:500;
        color:rgba(255,255,255,.88) !important;
        text-shadow:0 1px 2px rgba(0,0,0,.8);
        -webkit-font-smoothing:antialiased; -moz-osx-font-smoothing:grayscale;
        transition:color .15s ease, transform .15s ease;
    }
    .spp-lt__list a i {
        flex:0 0 auto; width:5px; height:5px; border-radius:50%;
        background:rgba(0,255,170,.75);
    }
    .spp-lt__list a span {
        flex:1 1 auto; min-width:0;
        white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
    }
    .spp-lt__list a:hover { color:#0ce39a !important; transform:translateX(2px); }
    .spp-lt__list a:hover i { background:#00ffaa; box-shadow:0 0 8px rgba(0,255,170,.8); }

    .spp-sc--hud { height:110px; }
    .spp-sc--hud .spp-sc__body { box-sizing:border-box; }
    .spp-sc--hud .spp-sc__card {
        border-radius:6px; border:0;
        background:rgba(12,16,28,.65);
        -webkit-backdrop-filter:blur(8px); backdrop-filter:blur(8px);
        box-shadow:none; overflow:hidden;
        transition:transform .3s cubic-bezier(.175,.885,.32,1.275),
                   box-shadow .3s ease, background .3s ease;
    }
    .spp-sc--hud .spp-sc__card::before {
        left:0; top:0; width:100%; height:100%; transform:none; filter:none;
        background-image:linear-gradient(rgba(255,255,255,.02) 1px,transparent 1px),
                         linear-gradient(90deg,rgba(255,255,255,.02) 1px,transparent 1px);
        background-size:15px 15px; background-position:0 0;
        opacity:1; transition:none;
    }
    .spp-sc--hud .spp-sc__tr:hover ~ .spp-sc__card,
    .spp-sc--hud:hover .spp-sc__card {
        transform:translateY(-4px); filter:none;
        background:rgba(18,24,40,.85);
        box-shadow:0 15px 30px -10px rgba(0,0,0,.8), 0 0 20px -5px rgba(255,0,127,.2);
        transition:transform .3s cubic-bezier(.175,.885,.32,1.275),
                   box-shadow .3s ease, background .3s ease;
    }
    .spp-sc--hud .spp-sc__glare,
    .spp-sc--hud .spp-sc__lines,
    .spp-sc--hud .spp-sc__glows,
    .spp-sc--hud .spp-sc__particles { display:none; }
    .spp-sc--hud .spp-sc__scan {
        position:absolute; inset:auto; top:-100%; left:0; width:100%; height:40px;
        background:linear-gradient(to bottom,transparent,rgba(0,243,255,.15),rgba(0,243,255,.4),transparent);
        opacity:0; transform:none; animation:none;
    }
    .spp-sc--hud:hover .spp-sc__scan { opacity:1; animation:sppHudScan 1.5s linear infinite; }
    @keyframes sppHudScan { 0% { top:-50%; } 100% { top:150%; } }

    .spp-sc--hud .spp-sc__name {
        background:none; -webkit-background-clip:border-box; background-clip:border-box;
        -webkit-text-fill-color:#cbd5e1; color:#cbd5e1;
        font-size:16.8px; font-weight:700; letter-spacing:.05em; line-height:1.2;
        filter:none; transform:none !important;
        font-family:Inter,system-ui,-apple-system,'Segoe UI','Microsoft YaHei',sans-serif;
        transition:color .3s ease, text-shadow .3s ease;
    }
    .spp-sc--hud:hover .spp-sc__name,
    .spp-sc--hud .spp-sc__tr:hover ~ .spp-sc__card .spp-sc__name {
        color:#fff; -webkit-text-fill-color:#fff; text-shadow:0 0 12px #00f3ff;
    }
    .spp-sc--hud.is-long  .spp-sc__name { font-size:14px; letter-spacing:.04em; }
    .spp-sc--hud.is-xlong .spp-sc__name { font-size:12px; letter-spacing:.02em; }
    .spp-sc__hex {
        display:block; position:relative; z-index:5; margin-top:6px;
        font-size:9.6px; line-height:1; letter-spacing:.06em;
        color:#475569; opacity:.6; transition:all .3s ease;
        font-family:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
    }
    .spp-sc--hud:hover .spp-sc__hex { color:#ff007f; opacity:.9; text-shadow:0 0 8px rgba(255,0,127,.6); }

    .spp-sz-hd {
        display:flex; align-items:center;
        background:linear-gradient(90deg,rgba(10,15,25,.8) 0%,rgba(5,8,15,.4) 100%) !important;
        border-top:1px solid rgba(255,255,255,.05) !important;
        border-right:0 !important; border-left:0 !important;
        border-bottom:2px solid transparent !important;
        border-radius:8px !important; padding:16px 24px; margin-bottom:24px;
        -webkit-backdrop-filter:blur(12px); backdrop-filter:blur(12px);
        box-shadow:none !important;
    }
    .spp-sz-hd::before { display:none; }
    .spp-sz-hd::after {
        content:""; position:absolute; left:0; bottom:-2px; width:100%; height:2px;
        border-radius:0; opacity:.8; pointer-events:none;
        filter:none; z-index:0;
        background:linear-gradient(90deg,#00f3ff,#ff007f 50%,transparent 100%);
        box-shadow:0 0 10px rgba(0,243,255,.4);
    }
    .spp-sz-group.is-net .spp-sz-hd::after {
        background:linear-gradient(90deg,#00ff66,#00f3ff 50%,transparent 100%);
        box-shadow:0 0 10px rgba(0,255,102,.4);
    }
    .spp-sz-hd__t::before {
        content:""; display:inline-block; width:6px; height:24px; border-radius:2px;
        margin-right:12px; vertical-align:-5px;
        background:#00f3ff; box-shadow:0 0 10px #00f3ff;
    }
    .spp-sz-group.is-net .spp-sz-hd__t::before { background:#00ff66; box-shadow:0 0 10px #00ff66; }
    .spp-sz-hd__t {
        font-size:18px; font-weight:700; color:#f3f4f6 !important; text-shadow:none;
        font-family:Inter,system-ui,-apple-system,'Segoe UI','Microsoft YaHei',sans-serif;
    }
    .spp-sz-hd__meta {
        margin-left:auto; font-size:12px; letter-spacing:.02em; color:#9ca3af;
        opacity:.8; transition:opacity .3s ease; white-space:nowrap;
        font-family:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
    }
    .spp-sz-hd:hover .spp-sz-hd__meta { opacity:1; }
    .spp-sz-hd__meta i { font-style:normal; color:#4b5563; margin:0 6px; }
    .spp-sz-hd__meta b {
        color:#00ff66; font-weight:700; text-shadow:0 0 8px rgba(0,255,102,.6);
        animation:sppHudPulse 2s infinite alternate;
    }
    @keyframes sppHudPulse {
        0%   { opacity:.7; text-shadow:0 0 4px rgba(0,255,102,.4); }
        100% { opacity:1;  text-shadow:0 0 12px rgba(0,255,102,.9); }
    }
    .spp-sz-hd__cnt {
        font-size:12px; letter-spacing:.02em; color:#d1d5db; padding-left:0; border-left:0;
        font-family:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
    }
    .spp-sz-hd__cnt::before { content:"|"; color:#4b5563; margin:0 8px; }
    `;
function comma(n) { return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ','); }
function relTime(s) {
if (!s) return '';
const t = new Date(String(s).replace(' ', 'T')).getTime();
if (!t || isNaN(t)) return '';
const diff = Date.now() - t;
if (diff < 0) return '刚刚';
const m = Math.floor(diff / 60000);
if (m < 1) return '刚刚';
if (m < 60) return m + ' 分钟前';
const h = Math.floor(m / 60);
if (h < 24) return h + ' 小时前';
const d = Math.floor(h / 24);
if (d < 30) return d + ' 天前';
const mo = Math.floor(d / 30);
if (mo < 12) return mo + ' 个月前';
return Math.floor(mo / 12) + ' 年前';
}
function polishStats() {
if (!onStats) return;
const host = document.querySelector('#infobox div.fr.tar');
if (!host || host.dataset.sppHm) return;
host.dataset.sppHm = '1';
const txt = (host.textContent || '').replace(/\s+/g, ' ');
const pick = function (label) {
const m = txt.match(new RegExp(label + '\\s*[::]\\s*([\\d,]+)'));
return m ? m[1] : null;
};
const items = [
['今日', pick('今日')], ['昨日', pick('昨日')], ['最高日', pick('最高日')],
['主题', pick('主题')], ['帖子', pick('帖子')], ['会员', pick('会员')]
].filter(function (i) { return i[1]; });
const acts = [].slice.call(host.querySelectorAll('a')).filter(function (a) {
return /^(标记已读|最新帖子|RSS)$/.test(a.textContent.trim());
});
const newbie = host.querySelector('a[href*="u.php?action-show-username"]');
host.classList.add('spp-hm-host');
host.innerHTML = '<div class="spp-hm-stats">' +
items.map(function (i) {
return '<div class="spp-hm-stat"><span class="k">' + i[0] + '</span><span class="v">' + i[1] + '</span></div>';
}).join('') +
'</div><div class="spp-hm-acts">' +
(newbie ? '<a href="' + newbie.getAttribute('href') + '" target="_blank">新会员:' + esc(newbie.textContent.trim()) + '</a>' : '') +
acts.map(function (a) {
return '<a href="' + a.getAttribute('href') + '"' +
(a.getAttribute('target') ? ' target="' + a.getAttribute('target') + '"' : '') + '>' +
esc(a.textContent.trim()) + '</a>';
}).join('') + '</div>';
}
function polishNotice() {
if (!onNotice) return;
const ul = document.querySelector('#notice0 ul');
if (ul) ul.classList.add('spp-hm-notice-list');
}
function parseBoardRow(tr) {
const a = tr.querySelector('th h3.b > a');
if (!a) return null;
const ths = tr.querySelectorAll('th');
const nameTh = ths[0];
const statTd = tr.querySelector('td.tal');
const m = (statTd ? statTd.textContent : '').match(/(\d+)\s*\/\s*(\d+)/);
const cm = a.textContent.trim().match(/^Comic Market\s+(\d+)/i);
const todayEl = nameTh ? nameTh.querySelector('span.s3.f10') : null;
const todayM = todayEl ? todayEl.textContent.match(/\((\d+)\)/) : null;
const subWrap = [].slice.call(tr.querySelectorAll('th div')).filter(function (d) {
return /子版/.test(d.textContent);
})[0];
const subs = subWrap ? [].slice.call(subWrap.querySelectorAll('a')).map(function (x) {
return { name: x.textContent.trim(), href: x.href };
}) : [];
const lastCell = ths[ths.length - 1];
const lastA = lastCell ? lastCell.querySelector('a.a2') : null;
const lastUserEl = lastCell ? lastCell.querySelector('span.f12') : null;
const lastT = lastCell ? (lastCell.textContent.match(/\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2})\]/) || [])[1] : null;
const dateEl = tr.querySelector('span.smalltxt');
return {
tr: tr, name: a.textContent.trim(), href: a.href,
no: cm ? parseInt(cm[1], 10) : null,
topics: m ? +m[1] : 0, posts: m ? +m[2] : 0,
today: todayM ? parseInt(todayM[1], 10) : null,
date: dateEl ? dateEl.textContent.trim() : '',
lastTitle: lastA ? lastA.textContent.trim() : '',
lastUser: lastUserEl ? lastUserEl.textContent.trim() : '',
lastTime: lastT || '',
subs: subs
};
}
function buildCmCard(info) {
const card = document.createElement('div');
card.className = 'spp-cm-card';
const avg = info.topics ? (info.posts / info.topics) : 0;
const avgTxt = avg ? '帖均 ' + avg.toFixed(1) : '暂无数据';
const hasToday = (typeof info.today === 'number');
const todayTxt = hasToday ? (info.today > 0 ? '+' + info.today : '0') : '—';
const fresh = info.lastTime ? (Date.now() - new Date(info.lastTime.replace(' ', 'T')).getTime() < 7 * 864e5) : false;
const rel = relTime(info.lastTime);
const pill = info.lastTime
? '<span class="spp-cm-card__pill' + (fresh ? '' : ' is-idle') + '"><span class="spp-cm-card__dot"></span>' + (fresh ? '近期活跃' : '已沉淀') + '</span>'
: '<span class="spp-cm-card__pill is-idle"><span class="spp-cm-card__dot"></span>暂无更新</span>';
const subs = info.subs || [];
const wallSub = subs.filter(function (s) { return /图墙/.test(s.name); })[0];
const listSub = subs.filter(function (s) { return !/图墙/.test(s.name); })[0];
const otherSubs = subs.filter(function (s) { return s !== wallSub && s !== listSub; });
const listDesc = /同人志|CG/.test(listSub ? listSub.name : '') ? '列表模式 · 按最后回复排序' : '列表模式';
const wallDesc = '封面墙 · 缩略图瀑布流';
const badgeEm = info.badgeEm || (info.no === null ? '漫区' : 'CM');
const badgeNo = info.badgeNo || (info.no === null ? String(info.name || '?').trim().slice(0, 2) : String(info.no));
const wallIco = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">' +
'<path stroke-linecap="round" stroke-linejoin="round" d="M3 3h7v7H3zM14 3h7v7h-7zM3 14h7v7H3zM14 14h7v7h-7z"/></svg>';
const listIco = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">' +
'<path stroke-linecap="round" stroke-linejoin="round" d="M4 5h16v14H4zM4 9h16M9 5v14"/></svg>';
const goIco = '<span class="spp-cm-card__board-go">' +
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">' +
'<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"/></svg></span>';
const statVals = [comma(info.topics), comma(info.posts), todayTxt];
const wideStats = statVals.some(function (s) { return String(s).length >= 7; });
card.innerHTML =
'<span class="spp-cm-card__spin"></span>' +
'<div class="spp-cm-card__inner">' +
'<div class="spp-cm-card__head">' +
'<div class="spp-cm-card__titles">' +
'<a class="spp-cm-card__title" href="' + info.href + '" target="_blank" rel="noopener">' + esc(info.name) + '</a>' +
(info.date ? '<div class="spp-cm-card__meta"><span>' + esc(info.date) + '</span></div>' : '') +
'</div>' + pill +
'</div>' +
'<div class="spp-cm-card__stats' + (wideStats ? ' is-wide' : '') + '">' +
'<div class="spp-cm-card__stat"><span class="k">主题</span><span class="v">' + comma(info.topics) +
'</span><span class="d">' + esc(avgTxt) + '</span></div>' +
'<div class="spp-cm-card__stat"><span class="k">帖数</span><span class="v">' + comma(info.posts) +
'</span><span class="d">' + (subs.length ? '子版 ' + subs.length + ' 个' : '无子版') + '</span></div>' +
'<div class="spp-cm-card__stat is-today' + (hasToday && info.today > 0 ? ' is-hot' : '') + '">' +
'<span class="k">今日</span><span class="v">' + esc(todayTxt) + '</span><span class="d">今日发帖</span></div>' +
'</div>' +
'<div class="spp-cm-card__boards">' +
'<div class="spp-cm-card__boards-k">板块入口</div>' +
(listSub
? '<a class="spp-cm-card__board" href="' + listSub.href + '" target="_blank" rel="noopener">' +
'<span class="spp-cm-card__board-ico">' + listIco + '</span>' +
'<span class="spp-cm-card__board-txt"><b>' + esc(listSub.name) + '</b><i>' + esc(listDesc) + '</i></span>' +
goIco +
'</a>'
: '') +
(wallSub
? '<a class="spp-cm-card__board is-wall" href="' + wallSub.href + '" target="_blank" rel="noopener">' +
'<span class="spp-cm-card__board-ico">' + wallIco + '</span>' +
'<span class="spp-cm-card__board-txt"><b>' + esc(wallSub.name) + '</b><i>' + esc(wallDesc) + '</i></span>' +
goIco +
'</a>'
: '') +
(!listSub && !wallSub
? '<a class="spp-cm-card__board" href="' + info.href + '" target="_blank" rel="noopener">' +
'<span class="spp-cm-card__board-ico">' + listIco + '</span>' +
'<span class="spp-cm-card__board-txt"><b>进入板块</b><i>浏览全部主题</i></span>' +
goIco +
'</a>'
: '') +
'</div>' +
(info.lastTime || info.lastTitle
? '<a class="spp-cm-card__last" href="' + info.href + '" target="_blank" rel="noopener">' +
'<span class="spp-cm-card__last-txt">' +
'<b>' + esc(info.lastTitle || info.name + ' · 暂无新帖') + '</b>' +
'<i>最后发言 <em>' + esc(info.lastUser || info.name) + '</em></i>' +
'</span>' +
'<span class="spp-cm-card__last-time' + (fresh ? ' is-fresh' : '') + '">' +
'<b>' + esc(info.lastTime || '—') + '</b><span>' + esc(rel) + '</span>' +
'</span>' +
'</a>'
: '') +
'<div class="spp-cm-card__foot">' +
'<div class="spp-cm-card__subs">' + otherSubs.slice(0, 3).map(function (s) {
return '<a href="' + s.href + '" target="_blank" rel="noopener">子版:' + esc(s.name) + '</a>';
}).join('') + '</div>' +
'<a class="spp-cm-card__cta" href="' + info.href + '" target="_blank" rel="noopener">进入板块' +
'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">' +
'<path stroke-linecap="round" stroke-linejoin="round" d="M9 5l7 7-7 7"></path></svg></a>' +
'</div>' +
'</div>';
return card;
}
const CM_PINNED = ['汉化本发布', '询问&求物'];
const CM_FOREIGN = [
{ name: '询问&求物', cateId: 'cate_7', badgeEm: '交流', badgeNo: '求物' }
];
const CM_ARCHIVE = '旧物仓库';
function isStdBoard(r) { return r.no === null; }
function pickCmTargets(all, scope, series) {
let targets = all;
if (scope === 'latest' && series.length) targets = all.filter(function (r) { return r.no === series[0].no; });
else if (scope === 'cm') targets = all.filter(function (r) { return r.no !== null && r.no >= 104; });
const merged = [];
const seen = {};
targets.concat(all.filter(isStdBoard)).forEach(function (r) {
if (seen[r.name]) return;
seen[r.name] = 1;
merged.push(r);
});
const pinned = CM_PINNED.map(function (n) {
return all.filter(function (r) { return r.name === n; })[0];
}).filter(Boolean);
return pinned.concat(merged.filter(function (r) { return pinned.indexOf(r) === -1; }))
.filter(function (r) { return r.name !== CM_ARCHIVE; });
}
function pickForeignPins() {
return CM_FOREIGN.map(function (f) {
const cate = document.getElementById(f.cateId);
if (!cate) return null;
const row = [].slice.call(cate.querySelectorAll('tr.f_one[id^="fid_"]'))
.map(parseBoardRow).filter(Boolean)
.filter(function (r) {
return r.name === f.name || String(r.name).indexOf(f.name) === 0;
})[0];
if (!row) return null;
return Object.assign({}, row, { badgeEm: f.badgeEm, badgeNo: f.badgeNo });
}).filter(Boolean);
}
function buildCmGroups(targets, refSkin) {
const pinned  = targets.filter(function (r) { return CM_PINNED.indexOf(r.name) !== -1; });
const rest    = targets.filter(function (r) { return CM_PINNED.indexOf(r.name) === -1; });
const cmGroup  = rest.filter(function (r) { return !isStdBoard(r); });
const stdGroup = rest.filter(isStdBoard);
const out = [];
const gcount = (pinned.length ? 1 : 0) + (cmGroup.length ? 1 : 0) + (stdGroup.length ? 1 : 0);
const many = gcount > 1;
function grid(list, headerEl) {
const g = document.createElement('div');
g.className = 'spp-cm-grid' + (list.length === 1 && !headerEl ? ' is-single' : '');
if (headerEl) g.appendChild(headerEl);
list.forEach(function (t) { g.appendChild(refSkin ? buildCmCardRef(t) : buildCmCard(t)); });
return g;
}
function head(text, note, count, cls, isFirst) {
const h = document.createElement('div');
h.className = 'spp-cm-group-hd' + (cls ? ' ' + cls : '') + (isFirst ? ' is-first' : '');
h.innerHTML = '<b>' + esc(text) + '</b><em>' + esc(count + ' 个') + '</em>' +
'<i>' + esc(note) + '</i>';
return h;
}
let first = true;
if (pinned.length) {
out.push(grid(pinned, many
? head('置顶', '常驻最前', pinned.length, 'is-pin', first) : null));
first = false;
}
if (cmGroup.length) {
out.push(grid(cmGroup, many
? head('CM 届次', '按届次倒序 · 最新在左', cmGroup.length, '', first) : null));
first = false;
}
if (stdGroup.length) {
out.push(grid(stdGroup, many
? head('常设大区', '每届通用的固定板块', stdGroup.length, 'is-std', first) : null));
}
return out;
}
const CMC_SVG_HEAD = '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" ' +
'stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">';
const CMC_SVG_BOOK = CMC_SVG_HEAD + '<path d="M4 5h16v14H4z"/><path d="M4 9h16"/><path d="M9 5v14"/></svg>';
const CMC_SVG_GRID = CMC_SVG_HEAD + '<path d="M3 3h7v7H3zM14 3h7v7h-7zM3 14h7v7H3zM14 14h7v7h-7z"/></svg>';
const CMC_SVG_CAL = CMC_SVG_HEAD + '<path d="M8 2v4M16 2v4"/><rect x="3" y="4" width="18" height="18" rx="2"/>' +
'<path d="M3 10h18"/></svg>';
const CMC_SVG_GO = CMC_SVG_HEAD + '<path d="M9 5l7 7-7 7"/></svg>';
const CMC_SVG_ARROW = CMC_SVG_HEAD + '<path d="M5 12h14"/><path d="M13 5l7 7-7 7"/></svg>';
const CMC_SVG_FILTER = CMC_SVG_HEAD + '<path d="M3 5h18l-7 8v6l-4 2v-8z"/></svg>';
const CMC_SVG_LAYERS = CMC_SVG_HEAD + '<path d="M12 2 2 7l10 5 10-5z"/><path d="M2 17l10 5 10-5"/>' +
'<path d="M2 12l10 5 10-5"/></svg>';
const CMC_NOTE_BY_FID = {
'45':  '东方 Project 主题祭典'
};
function cmcFidOf(info) {
const m = String(info.href || '').match(/fid[=-](\d+)/);
return m ? m[1] : '';
}
const CMC_SVG_SPARK = CMC_SVG_HEAD + '<path d="M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9z"/></svg>';
function cmcBadge(info, fresh) {
if (typeof info.today === 'number' && info.today > 0) return { t: '今日有帖', c: 'hot' };
if (fresh) return { t: '近期活跃', c: 'recent' };
if (info.no !== null) return { t: '往届回顾', c: 'past' };
if (info.lastTime) return { t: '已沉淀', c: 'idle' };
return { t: '暂无更新', c: 'idle' };
}
function cmcLinks(info) {
const subs = info.subs || [];
const wall = subs.filter(function (s) { return /图墙/.test(s.name); })[0];
const list = subs.filter(function (s) { return !/图墙/.test(s.name); })[0];
const out = [];
if (list) {
out.push({ href: list.href, ico: CMC_SVG_BOOK, name: list.name,
sub: /同人志|CG/.test(list.name) ? '列表模式 · 按最后回复排序' : '列表模式' });
}
if (wall) out.push({ href: wall.href, ico: CMC_SVG_GRID, name: wall.name, sub: '封面墙 · 缩略图瀑布流' });
if (!out.length) out.push({ href: info.href, ico: CMC_SVG_BOOK, name: '进入版块', sub: '浏览全部主题' });
return out;
}
function buildCmCardRef(info) {
const cmcNote = CMC_NOTE_BY_FID[cmcFidOf(info)] || '';
const card = document.createElement('div');
card.className = 'spp-cm-card spp-cmc';
const fresh = info.lastTime
? (Date.now() - new Date(info.lastTime.replace(' ', 'T')).getTime() < 7 * 864e5) : false;
const bg = cmcBadge(info, fresh);
const hasToday = (typeof info.today === 'number');
const todayTxt = hasToday ? (info.today > 0 ? '+' + info.today : '0') : '';
const stat = function (k, v, cls) {
return '<div class="spp-cmc__stat' + (cls ? ' ' + cls : '') + '">' +
'<span class="k">' + k + '</span><span class="v">' + v + '</span></div>';
};
let statsHTML = stat('主题', comma(info.topics)) + stat('帖数', comma(info.posts));
if (hasToday) statsHTML += stat('今日', esc(todayTxt), 'is-today' + (info.today > 0 ? ' is-hot' : ''));
const linksHTML = cmcLinks(info).map(function (l) {
return '<a class="spp-cmc__link" href="' + l.href + '" target="_blank" rel="noopener">' +
'<span class="spp-cmc__link-l">' +
'<span class="spp-cmc__link-ico">' + l.ico + '</span>' +
'<span class="spp-cmc__link-txt"><b>' + esc(l.name) + '</b><i>' + esc(l.sub) + '</i></span>' +
'</span>' +
'<span class="spp-cmc__link-go">' + CMC_SVG_GO + '</span>' +
'</a>';
}).join('');
const rel = relTime(info.lastTime);
card.innerHTML =
'<div class="spp-cmc__top">' +
'<div class="spp-cmc__hd">' +
'<h3 class="spp-cmc__nm"><a href="' + info.href + '" target="_blank" rel="noopener">' +
esc(info.name) + '</a></h3>' +
'<span class="spp-cmc__badge is-' + bg.c + '">' + esc(bg.t) + '</span>' +
'</div>' +
(info.date
? '<div class="spp-cmc__date">' + CMC_SVG_CAL + '<span>' + esc(info.date) + '</span></div>'
: (cmcNote
? '<div class="spp-cmc__date is-note">' + CMC_SVG_SPARK + '<span>' + esc(cmcNote) + '</span></div>'
: '')) +
'<div class="spp-cmc__stats' + (hasToday ? '' : ' is-two') + '">' + statsHTML + '</div>' +
'<div class="spp-cmc__links">' + linksHTML + '</div>' +
'</div>' +
'<div class="spp-cmc__ft">' +
(info.lastTime || info.lastTitle
? '<a class="spp-cmc__last" href="' + info.href + '" target="_blank" rel="noopener">' +
'<span class="spp-cmc__lastt">' + esc(info.lastTitle || info.name + ' · 暂无新帖') + '</span>' +
'<span class="m"><span>' + esc(info.lastUser || info.name) + '</span>' +
'<span>' + esc(info.lastTime || '未知') + '<em>' + esc(rel) + '</em></span></span>' +
'</a>'
: '') +
'<a class="spp-cmc__cta" href="' + info.href + '" target="_blank" rel="noopener">' +
'<span>进入版块</span>' + CMC_SVG_ARROW + '</a>' +
'</div>';
return card;
}
const CM_FILTER_CATS = ['all', 'pin', 'cm', 'std'];
function cmFilterCatOf(t) {
if (CM_PINNED.indexOf(t.name) !== -1) return 'pin';
return isStdBoard(t) ? 'std' : 'cm';
}
function cmFilterLabel(id) {
return id === 'pin' ? '置顶' : id === 'cm' ? 'CM 届次' : id === 'std' ? '常设大区' : '全部';
}
function cmFilterCounts(targets) {
const n = { all: targets.length, pin: 0, cm: 0, std: 0 };
targets.forEach(function (t) { n[cmFilterCatOf(t)]++; });
return n;
}
function cmFilterSlice(targets, id) {
return id === 'all' ? targets : targets.filter(function (t) { return cmFilterCatOf(t) === id; });
}
function cmCompact(n) {
if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';
if (n >= 1e3) return Math.round(n / 1e3) + 'K';
return String(n);
}
let cmFilterNow = 'all';   
let cmFilterCtx = null;
function cmFilterRightHTML(targets, cat) {
const list = cmFilterSlice(targets, cat);
const hasPosts = list.some(function (t) { return (t.posts || 0) > 0; });
const posts = list.reduce(function (s, t) { return s + (t.posts || 0); }, 0);
return '<span>显示版块: <b class="cy">' + list.length + '</b> 个</span>' +
(hasPosts
? '<span class="sep">/</span><span>总发帖量: <b class="pk">' + cmCompact(posts) + '</b></span>'
: '');
}
function cmFilterBarHTML(targets) {
const c = cmFilterCounts(targets);
return '<div class="spp-cmc-filter">' +
'<div class="spp-cmc-filter__l">' +
'<span class="spp-cmc-filter__ico">' + CMC_SVG_FILTER + '</span>' +
'<span class="spp-cmc-filter__lb">快速筛选版块:</span>' +
'<div class="spp-cmc-filter__btns">' +
CM_FILTER_CATS.map(function (id) {
return '<button type="button" data-cat="' + id + '"' +
(id === cmFilterNow ? ' class="is-on"' : '') + '>' +
cmFilterLabel(id) + ' (' + c[id] + ')</button>';
}).join('') +
'</div>' +
'</div>' +
'<div class="spp-cmc-filter__r">' + cmFilterRightHTML(targets, cmFilterNow) + '</div>' +
'</div>';
}
function cmApplyFilter(cat) {
if (!cmFilterCtx) return;
if (CM_FILTER_CATS.indexOf(cat) === -1) cat = 'all';
cmFilterNow = cat;
const td = cmFilterCtx.td;
const targets = cmFilterCtx.targets;
[].slice.call(td.querySelectorAll('.spp-cm-grid')).forEach(function (g) {
if (g.parentNode) g.parentNode.removeChild(g);
});
buildCmGroups(cmFilterSlice(targets, cat), true).forEach(function (node) { td.appendChild(node); });
const bar = td.querySelector('.spp-cmc-filter');
if (bar) {
bar.querySelector('.spp-cmc-filter__r').innerHTML = cmFilterRightHTML(targets, cat);
[].slice.call(bar.querySelectorAll('.spp-cmc-filter__btns button')).forEach(function (b) {
if (b.getAttribute('data-cat') === cat) b.classList.add('is-on');
else b.classList.remove('is-on');
});
}
cmSyncSecBarPills();
}
function cmSyncSecBarPills() {
const box = document.querySelector('#t_39 .spp-secbar-glass__pills');
if (!box || !cmFilterCtx) return;
const c = cmFilterCounts(cmFilterCtx.targets);
box.innerHTML = CM_FILTER_CATS.map(function (id) {
return '<button type="button" data-cat="' + id + '"' +
(id === cmFilterNow ? ' class="is-on"' : '') + '>' +
cmFilterLabel(id) + ' (' + c[id] + ')</button>';
}).join('');
[].slice.call(box.querySelectorAll('button')).forEach(function (b) {
b.addEventListener('click', function () { cmApplyFilter(b.getAttribute('data-cat')); });
});
}
function cmEnsureFoldPh(cate) {
const tbl = cate.closest('table');
if (!tbl) return null;
let ph = tbl.querySelector('.spp-cmc-foldwrap');
if (ph) return ph;
ph = document.createElement('tbody');
ph.className = 'spp-cmc-foldwrap';
ph.style.display = 'none';
ph.innerHTML =
'<tr><td colspan="6"><div class="spp-cmc-foldph">' +
'<span class="spp-cmc-foldph__ico">' + CMC_SVG_LAYERS + '</span>' +
'<p>漫区特设栏已折叠收起</p>' +
'<button type="button" class="spp-cmc-foldph__btn">点击展开查看所有板块</button>' +
'</div></td></tr>';
cate.parentNode.insertBefore(ph, cate);
ph.querySelector('.spp-cmc-foldph__btn').addEventListener('click', function () {
const ctl = document.querySelector('#t_39.t > table > tbody > tr > th.h a.closeicon');
if (ctl) ctl.click();
});
return ph;
}
function cmSyncFoldPh(cate) {
const tbl = cate.closest('table');
const ph = tbl ? tbl.querySelector('.spp-cmc-foldwrap') : null;
if (!ph) return;
ph.style.display = (getComputedStyle(cate).display === 'none') ? '' : 'none';
}
function cmWatchFold(cate) {
const ph = cmEnsureFoldPh(cate);
if (!ph || ph.getAttribute('data-spp-watch') === 'on') return;
ph.setAttribute('data-spp-watch', 'on');
new MutationObserver(function () { cmSyncFoldPh(cate); })
.observe(cate, { attributes: true, attributeFilter: ['style'] });
cmSyncFoldPh(cate);
}
const GAL_RINGS = [
{ n: 7,  k: 0.42, spd:  0.0022, rgb: '0, 238, 255' },    
{ n: 11, k: 0.70, spd: -0.0016, rgb: '170, 0, 255' },   
{ n: 13, k: 0.98, spd:  0.0011, rgb: '255, 0, 127' }    
];
const GAL_RATIO = GAL_RINGS.reduce(function (a, r) { return a + r.n; }, 0);
function galRingCounts(total) {
let used = 0;
return GAL_RINGS.map(function (r, i) {
const n = (i === GAL_RINGS.length - 1)
? total - used : Math.round(total * r.n / GAL_RATIO);
used += n;
return n;
});
}
let GAL_INFO = null;
let GAL_TARGET = -1;
let GAL_FILTER = 'all';       
let GAL_SELECT = null;
function galEraRange(cat) {
const hit = (GAL_INFO ? GAL_INFO.subs : []).filter(function (s) {
const h = GAL_HISTORIES[s.name];
return h && h.eraCategory === cat;
});
if (!hit.length) return '';
return ' (' + hit[hit.length - 1].name + '-' + hit[0].name + ')';
}
function galMilestoneCount() {
return (GAL_INFO ? GAL_INFO.subs : []).filter(function (s) {
const h = GAL_HISTORIES[s.name];
return h && h.isMilestone;
}).length;
}
const GAL_HISTORIES = {
'C108': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 凉夏之阵', era: '2026年8月 · 令和8年', eraCategory: 'reiwa', isMilestone: true,
ips: ['原神 (至冬国预热联动)', '绝区零 (ZZZ规模飙升)', '蔚蓝档案 (BA)', '学园偶像大师', 'Netflix超かぐや姫!', 'VTuber双向直播'],
events: [
{ t: '官方通史《50th CHRONICLE》发售', d: '收录漫展半世纪年表、文献归档与万人问卷调查的 270 页权威纪念史书在 C108 现场正式开售,成为同人文化研究的标杆文献。' },
{ t: '雨中夏 Comi 与跨界企业破圈', d: '两日总到场达 26 万人。会期遭遇间歇性小雨,气温降至 30°C~31°C 左右;日本家具品牌“山善”等传统实体企业首次以“防疲劳/收纳装备”名义跨界出展。' },
{ t: '时隔8年的“3日制”回归预告', d: '准备会在闭幕之际正式宣布,为承载日益膨胀的社团报名需求,年底的 C109 将时隔 8 年重新恢复为 3 天会期(12月29日~31日)。' }
]
},
'C107': {
season: 'anniv', seasonTxt: '👑 冬Comi · 50周年半世纪大典', era: '2025年12月 · 令和7年', eraCategory: 'reiwa', isMilestone: true,
ips: ['学园偶像大师', '蔚蓝档案', '胜利的女神:妮姬', '棕色尘埃2', 'VTuber专区', '少年漫改'],
events: [
{ t: '创展 50 周年黄金大典 (1975~2025)', d: '正式迎来 Comiket 成立 50 周年历史性时刻!现场推出大量 50 周年纪念史册与限定典藏周边,引发排队扫货狂潮。' },
{ t: '盛况空前的跨年冬展', d: '在东馆部分改修施工制约下,两日参展人数依然顶格突破 30 万人次,海外参展国跃升至 75 个以上,Cosplay 注册超 1.3 万人。' },
{ t: '可食用“Comiket 室内云”棉花糖', d: '官方展区特制了致敬历史名场面的“Comiket 室内云”纪念棉花糖,引爆全网社交平台刷屏。' }
]
},
'C106': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 半世纪前夜', era: '2025年8月 · 令和7年', eraCategory: 'reiwa', isMilestone: false,
ips: ['学园偶像大师', '蔚蓝档案', '绝区零 / 崩铁 / 原神', '鸣潮', '炼金工房新作'],
events: [
{ t: '迎向半世纪的“50年目”漫展', d: '自 1975 年诞生起正式步入第 50 个年头,两日总客流达 25 万人次,迎来了全球超过 71 个国家与地区的创作者和爱好者参展。' },
{ t: '场馆空间重组与庭园区复活', d: '东京 Big Sight 推进设施检修,主办方优化动线,阔别近三年的原庭园 Cosplay 专区规整开放,分流烈日下的暴晒压力。' }
]
},
'C105': {
season: 'winter', seasonTxt: '❄️ 冬Comi · 非跨年冬展', era: '2024年12月 · 令和6年', eraCategory: 'reiwa', isMilestone: false,
ips: ['学园偶像大师 (同人总爆发)', '胜利的女神:妮姬 (雪见温泉)', 'VTuber', '传统同人'],
events: [
{ t: '时隔整整十年的“非跨年冬 Comi”', d: '因东京 Big Sight 年底日程排期,本次冬展定在 12月29-30日,创下自 2014 年 C87 以来整整 10 年未见的“没有漫展的除夕”。' },
{ t: '客流量重回 30 万人次大关', d: '两天累计 30 万人次,出展社团数增至约 2.9 万个空间,单日空间数创下疫后历史新纪录,年轻创作者比例明显上升。' }
]
},
'C104': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 蔚蓝之夏', era: '2024年8月 · 令和6年', eraCategory: 'reiwa', isMilestone: false,
ips: ['蔚蓝档案 (1900+社团包揽东1)', '学园偶像大师 (初登场起势)', '迷宫饭', '无职转生'],
events: [
{ t: '酷暑考验与“无课金大叔”网络爆梗', d: '两日总客流达 26 万人,模仿巴黎奥运土耳其银牌射手“无课金大叔”的神还原 Cosplay 引爆全球社交网络。' },
{ t: '企业馆热量与 PSA 跨界出展', d: '国际卡牌鉴定巨头 PSA 首次出展;Love Live! 企业摊位万人 DJ 电音打 call 震动全场,一度被主办方要求控制音量。' }
]
},
'C103': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2023年12月 · 令和5年', eraCategory: 'reiwa', isMilestone: false,
ips: ['蔚蓝档案 (BA破纪录矩阵)', '葬送的芙莉莲', 'VTuber (彩虹社/holo)', '偶像大师'],
events: [
{ t: '同人统治新皇确立', d: '《蔚蓝档案》创下超 1,700 个社团出展的历史巅峰,并在西展示栋开辟专属巨大矩阵,稳坐同人创作首把交椅。' },
{ t: '新常态运营模式定型', d: '两日总客流稳定在 27 万人次,告别疫情前的失控拥挤,通过“分时段阶梯票价+早午场分流”确立了高周转、强安全性的现代运营范式。' },
{ t: '无现金支付大普及', d: '展会彻底打破“只收纸币硬币”的传统,各大中小型社团普遍普及了 PayPay、信用卡及扫码支付,交易效率大幅跃升。' }
]
},
'C102': {
season: 'summer', seasonTxt: '☀️ 夏Comi', era: '2023年8月 · 令和5年', eraCategory: 'reiwa', isMilestone: false,
ips: ['蔚蓝档案', '我推的孩子', '崩坏:星穹铁道', '原神'],
events: [
{ t: '免预约下午票落地', d: '打破此前两年的极度限流状态,下午票实行不限人数公开发售,两日总客流大幅回弹至 26 万人次。' },
{ t: '口罩令解除与酷暑炼狱', d: '官方全面解除口罩强制令,室内恢复正常表情交流;伴随东京 38°C 极端干热天气,昔日的“战场的灼热地狱”全貌回归。' }
]
},
'C101': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2022年12月 · 令和4年', eraCategory: 'reiwa', isMilestone: false,
ips: ['孤独摇滚!(全网现象级)', '机动战士高达 水星的魔女', '原神', '碧蓝航线'],
events: [
{ t: '日本国境解封与海外势力大回归', d: '随着日本全面解除入境限制,阔别三年的欧美、中韩等海外画师与游客首次成规模重返展会,国际交流区重现多元语言氛围。' },
{ t: 'Cosplay 庭园全面复苏', d: '此前因防疫严格限制的摄影区与更衣室大规模恢复开放,单日到场总人数突破 9 万人关口。' }
]
},
'C100': {
season: 'anniv', seasonTxt: '👑 夏Comi · 百回盛典', era: '2022年8月 · 令和4年', eraCategory: 'reiwa', isMilestone: true,
ips: ['蔚蓝档案 (蓄力井喷)', '间谍过家家', 'Type-Moon (月姬/FGO)', '赛马娘'],
events: [
{ t: '半世纪百回大典 (通算100回纪念)', d: '自 1975 年至今整整走过 100 届历程,官方出版厚重纪念特刊并设荣誉长廊,许多自昭和时代参展的元老作者自发回访。' },
{ t: '台风8号狂暴对流考验', d: '开展首日遭遇台风直接掠过,但在严格限流下,8.5 万人依然井然有序地冒暴雨入场,再次展现同人文化惊人的自律。' },
{ t: '金色专属纪念手环', d: '实名入场券附带专属金色编年史手环,被动漫迷视为极具历史收藏价值的“百年圣物”。' }
]
},
'C99': {
season: 'winter', seasonTxt: '❄️ 冬Comi · 破晓重生', era: '2021年12月 · 令和3年', eraCategory: 'reiwa', isMilestone: false,
ips: ['赛马娘 Pretty Derby', '咒术回战', '鬼灭之刃', 'VTuber'],
events: [
{ t: '阔别整整两年的“破晓重生”', d: '经历 C98 取消、多次延期后,漫展在奥运会场馆拆除后时隔整整两年重返 Tokyo Big Sight。' },
{ t: '彻底告别免费时代与实名审查', d: '延续数十年的自由免费入场终结,全面改为实名抽选购票制,单日上限严格控制在 5.5 万人并核验健康证明。' },
{ t: '首次缩减为 2 天会期', d: '因防疫要求会期大幅缩短,场内全员佩戴口罩,呈现前所未有的克制与静穆。' }
]
},
'C98': {
season: 'special', seasonTxt: '⚡ 创展首次中止 · 空中漫展', era: '2020年5月 · 令和2年', eraCategory: 'reiwa', isMilestone: true,
ips: ['鬼灭之刃 (原定顶峰)', 'VTuber', 'FGO', '集合啦!动物森友会'],
events: [
{ t: '创展 45 年来首次“完全停办”', d: '原为避开奥运会改至 5 月黄金周,但在开幕前夕受全球新冠疫情暴发与紧急事态宣言影响,准备会于 3 月 27 日艰难宣布展会取消。' },
{ t: '“空中 Comiket”虚拟自救奇迹', d: '全球创作者在 Twitter 和 Pixiv 发起线上虚拟漫展,大家假装排队、在自家地板摆摊,成为亚文化史上极具温情的虚拟浪漫注脚。' }
]
},
'C97': {
season: 'winter', seasonTxt: '❄️ 冬Comi · 历史巅峰', era: '2019年12月 · 令和元年', eraCategory: 'reiwa', isMilestone: true,
ips: ['鬼灭之刃 (现象级横扫)', 'Hololive / 彩虹社', 'Fate/Grand Order', '明日方舟'],
events: [
{ t: '空前绝后的历史巅峰 (75万人次)', d: '持续 4 天,总入场人数突破创纪录的 75 万人次,出展社团数与客流均创人类同人文化史上的绝对天花板。' },
{ t: '旧时代的最终绝唱', d: '疫情暴发前全球御宅族最后一次能够毫无顾忌、免戴口罩紧密相拥的狂欢盛典。' }
]
},
'C96': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 改元首届', era: '2019年8月 · 令和元年', eraCategory: 'reiwa', isMilestone: false,
ips: ['鬼灭之刃 (爆发前夜)', 'FGO', 'VTuber板块壮大', '碧蓝航线'],
events: [
{ t: '“令和”新时代首届 Comiket', d: '伴随日本年号更替迈入新纪元,并史上首次将展期扩充至整整 4 天。' },
{ t: '首度引入付费手环制度', d: '普通入场者必须购买纸质防伪手环入场,正式迈出收费化试水第一步。' },
{ t: '青海展区大分裂 (相隔 1.5 公里)', d: '因东馆改造奥运媒体中心,商业馆被分置至 1.5 公里外的青海展示栋,参展者顶着烈日上演两地折返长征。' }
]
},
'C95': {
season: 'winter', seasonTxt: '❄️ 冬Comi · 平成绝唱', era: '2018年12月 · 平成30年', eraCategory: 'heisei', isMilestone: false,
ips: ['SSSS.GRIDMAN (宝多六花风暴)', '催眠麦克风', 'VTuber', 'FGO'],
events: [
{ t: '“平成最后的冬 Comi”', d: '因改元在即,整个展区弥漫着告别平成时代的怀旧情怀,官方特设回顾展销。' },
{ t: '告别完全免费入场的前奏', d: '准备会正式宣布从下届起引入入场付费机制,以覆盖奥运改建带来的分场馆运营成本。' }
]
},
'C94': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 酷暑考验', era: '2018年8月 · 平成30年', eraCategory: 'heisei', isMilestone: false,
ips: ['VTuber纪元开启 (绊爱/彩虹社)', 'Fate/Grand Order (登顶霸主)', '偶像大师'],
events: [
{ t: 'VTuber 势力大爆发', d: '虚拟主播社团首次成规模出现,拉开同人界未来数年的崭新风口。' },
{ t: '历史级高温“屋顶烤肉板”', d: '西馆屋顶排队区地面温度突破 50°C,主办方破例调集大量喷雾降温车与防中暑急救站。' }
]
},
'C93': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2017年12月 · 平成29年', eraCategory: 'heisei', isMilestone: false,
ips: ['碧蓝航线 (日服上线爆发)', '偶像大师 SideM', 'FGO', '东方Project'],
events: [
{ t: '中资二次元出海同人突破', d: '《碧蓝航线》在日本本土引发极其猛烈的自发二次创作浪潮,改写了海外作品在日本同人圈的参与深度。' },
{ t: '医疗急救联动升级', d: '联合东京消防厅建立伤病员现场快速分流与急救机制。' }
]
},
'C92': {
season: 'summer', seasonTxt: '☀️ 夏Comi', era: '2017年8月 · 平成29年', eraCategory: 'heisei', isMilestone: false,
ips: ['兽娘动物园 (Tanoshii热潮)', 'Fate/Grand Order', '碧蓝幻想 GBF'],
events: [
{ t: '突发特大雷暴雨', d: '排队阿宅顶着狂风暴雨以身体和雨衣死守纸质同人志,“肉身保本”成为年度热梗。' },
{ t: '海外代购与壁摊防黄牛限购', d: '大手社团普遍开始推行“每人限购 1~2 册”并加强语言口令识别以遏制倒卖。' }
]
},
'C91': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2016年12月 · 平成28年', eraCategory: 'heisei', isMilestone: false,
ips: ['冰上的尤里 (女性向核弹)', 'FGO (终局时间神殿共振)', 'Re:从零开始的异世界生活'],
events: [
{ t: 'FGO 冠位时间神殿决战共鸣', d: '游戏内第一部最终战刚刚落幕,海量作者通宵赶制无料折页,玩家与创作者情感共振达到顶点。' },
{ t: '跨年极寒排队装备升级', d: '海风极端凛冽促使参展者全面普及铝箔保温睡袋等专业防寒装备。' }
]
},
'C90': {
season: 'summer', seasonTxt: '☀️ 夏Comi', era: '2016年8月 · 平成28年', eraCategory: 'heisei', isMilestone: false,
ips: ['Re:从零开始的异世界生活 (雷姆风暴)', 'Love Live! Sunshine!!', 'FGO'],
events: [
{ t: '奥运场馆改建危机公开', d: '东京都政府公布奥运新闻中心占用 Big Sight 方案,漫展面临无地可用的生存危机。' },
{ t: '《Comiket 40年史》正式刊行', d: '系统性梳理近半个世纪日本同人发展历程。' }
]
},
'C89': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2015年12月 · 平成27年', eraCategory: 'heisei', isMilestone: false,
ips: ['阿松 (おそ松さん狂潮)', '偶像大师 灰姑娘女孩', '一拳超人', '请问您今天要来点兔子吗?'],
events: [
{ t: '女性向人流爆发堵塞通道', d: '《阿松》与《刀剑乱舞》长队导致西馆至东馆联络通道数度瘫痪,准备会紧急开辟室外缓冲区。' },
{ t: '电子支付萌芽试水', d: '部分社团开始尝试便携刷卡器,但受限现场网络信号瘫痪。' }
]
},
'C88': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 40周年', era: '2015年8月 · 平成27年', eraCategory: 'heisei', isMilestone: false,
ips: ['刀剑乱舞 (审神者大迁徙)', '舰队Collection', 'Fate/Grand Order (萌芽开服)', '东方Project'],
events: [
{ t: 'Comiket 创立 40 周年里程碑', d: '展会走过整整 40 年,现场陈列 1975 年第一届油印纸作品与珍贵社刊。' },
{ t: '“男提督,女审神者”双轨确立', d: 'DMM 旗下两大题材分别统治男女阵地,形成空前的同人生态奇观。' }
]
},
'C87': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2014年12月 · 平成26年', eraCategory: 'heisei', isMilestone: false,
ips: ['舰娘 / 东方 / 型月 (三强争霸)', '偶像大师 灰姑娘女孩 (动画前夜)'],
events: [
{ t: '罕见的非跨年日程 (12月28-30日)', d: '为配合 Tokyo Big Sight 排水防灾施工检修,罕见提前至 28 日开幕,让参展者得以回家跨年。' },
{ t: '反偷拍便衣巡查常态化', d: '对 Cosplay 区域低角度恶意偷拍实施高压管控与即刻取证。' }
]
},
'C86': {
season: 'summer', seasonTxt: '☀️ 夏Comi', era: '2014年8月 · 平成26年', eraCategory: 'heisei', isMilestone: false,
ips: ['舰队Collection (登顶第一霸主)', 'Love Live! 初代巅峰', '排球少年!!'],
events: [
{ t: '舰娘正式超越东方 Project', d: '打破了《东方》称霸近十年的纪录,成为 Comiket 摊位数第一名。' },
{ t: '台风暴雨“肉身保本”', d: '第一天遭遇台风暴雨扫过,阿宅们冒雨用雨衣甚至肉身护住同人纸袋的名场面传遍全网。' }
]
},
'C85': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2013年12月 · 平成25年', eraCategory: 'heisei', isMilestone: false,
ips: ['舰队Collection (独立成区暴增)', '斩服少女 KILL la KILL', '黑子的篮球 (解禁参战)'],
events: [
{ t: '黑篮恐吓犯落网与正义解禁', d: '连环恐吓犯落网后,《黑子的篮球》在被禁一年后终于重回漫展,同人作者现场相拥而泣。' },
{ t: '通信运营商痛基站大战', d: 'Docomo、SoftBank 调集主题痛车车载基站,并派遣身背 Wi-Fi 天线的流动“人间兵器”疏导网络。' }
]
},
'C84': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 室内云奇观', era: '2013年8月 · 平成25年', eraCategory: 'heisei', isMilestone: false,
ips: ['进击的巨人 (全场献出心脏)', '舰队Collection (初次参展爆发)', 'Love Live!'],
events: [
{ t: '奇观“Comiket 室内云 (コミケ云)”', d: '连续三日逼近 40°C 高温,数十万人汗水蒸汽在东馆天花板冷凝成肉眼可见的“白云”并降下雨滴,轰动气象界。' },
{ t: '到场客流破 59 万人次', d: '三日参展人流创下当时历史最高峰。' }
]
},
'C83': {
season: 'winter', seasonTxt: '❄️ 冬Comi · 空白长街', era: '2012年12月 · 平成24年', eraCategory: 'heisei', isMilestone: true,
ips: ['少女与战车 (大洗热潮)', '中二病也要谈恋爱!', 'JOJO的奇妙冒险'],
events: [
{ t: '黑篮投毒纵火恐吓信危机', d: '主办方收到针对《黑子的篮球》社团的毒粉与纵火信,为保障数十万人生命安全被迫取消约 900 个社团出展。' },
{ t: '令人肃然起敬的空白长街', d: '展馆内留下了整整几列空无一人的桌椅长街,参展者展现极高自律与秩序尊严。' }
]
},
'C82': {
season: 'summer', seasonTxt: '☀️ 夏Comi', era: '2012年8月 · 平成24年', eraCategory: 'heisei', isMilestone: false,
ips: ['黑子的篮球', '刀剑神域 SAO', '冰菓', 'Fate/Zero'],
events: [
{ t: 'Cosplay 摄影限制全面收紧', d: '数码单反与长焦普及后,准备会划定专门摄影区并明令禁止危险道具。' }
]
},
'C81': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2011年12月 · 平成23年', eraCategory: 'heisei', isMilestone: false,
ips: ['Fate/Zero (老虚型月狂潮)', '偶像大师 (A-1动画版爆发)', '魔法少女小圆'],
events: [
{ t: '西馆露天屋顶排队危机', d: '企业馆规模激增导致数万人被滞留露天屋顶吹海风,催生后续的早间时间带整理券分流制度。' }
]
},
'C80': {
season: 'summer', seasonTxt: '☀️ 夏Comi · 震灾复兴', era: '2011年8月 · 平成23年', eraCategory: 'heisei', isMilestone: false,
ips: ['魔法少女小圆 (总喷发霸权)', '命运石之门', 'TIGER & BUNNY'],
events: [
{ t: '3·11 震灾后的“节电夏 Comi”', d: '受福岛核事故引发的节电令影响,展馆冷气与照明受严格限制,准备会设立赈灾义卖,作者自发绘制东日本复兴支援画作。' }
]
},
'C79': {
season: 'winter', seasonTxt: '❄️ 冬Comi', era: '2010年12月 · 平成22年', eraCategory: 'heisei', isMilestone: false,
ips: ['我的妹妹哪有这么可爱!', '魔法少女奈叶 The MOVIE 1st', '薄樱鬼'],
events: [
{ t: '东京都青少年条例修正案抗议风波', d: '东京都强行通过限制二次元创作的审查法案,漫展现场弥漫对二次创作自由的焦虑,准备会联合各大出版社发起全民普及与联名抗争。' }
]
},
'C78': {
season: 'summer', seasonTxt: '☀️ 夏Comi', era: '2010年8月 · 平成22年', eraCategory: 'heisei', isMilestone: false,
ips: ['东方Project (单日占满东馆)', '轻音少女!!(K-ON!!)', '某科学的超电磁炮', '初音未来 Vocaloid'],
events: [
{ t: '纪录级猛暑考验', d: '东京气温连续冲破 36°C,漫展全面普及“盐分糖+能量饮”的防中暑硬性手册。' },
{ t: 'Twitter 参战元年', d: '智能手机与推特普及,参展者首次大规模实现实时的“始发冲刺路况”与“壁摊完售情报”互动。' }
]
}
};
function pickNewerCmSubs(all, archive) {
const subs0 = (archive && archive.subs) || [];
const have = {};
const nums = subs0.map(function (s) {
have[s.name] = 1;
return parseInt(String(s.name).replace(/\D/g, ''), 10) || 0;
});
const top = nums.length ? Math.max.apply(null, nums) : 0;
return (all || []).filter(function (r) {
return r && typeof r.no === 'number' && r.no > top && !have['C' + r.no];
}).sort(function (a, b) { return b.no - a.no; }).map(function (r) {
const list = (r.subs || []).filter(function (s) { return !/图墙/.test(s.name); })[0];
return {
name: 'C' + r.no,
href: (list && list.href) || r.href,
board: r.name,
boardHref: r.href
};
});
}
const GAL_ARCH_SUB = true;
const GAL_ARCH_SUB_KEY = 'spp261:archsub';
const GAL_ARCH_SUB_TTL = 72 * 60 * 60 * 1000;
function galArchSubCache() {
try {
const raw = window.localStorage.getItem(GAL_ARCH_SUB_KEY);
const o = raw ? JSON.parse(raw) : null;
if (o && o.m && o.t && (Date.now() - o.t) < GAL_ARCH_SUB_TTL) return o;
} catch (e) {  }
return { m: {}, t: Date.now() };
}
function parseArchSubHref(html, base) {
if (!html || html.indexOf('cate_children') < 0) return null;
const doc = new DOMParser().parseFromString(html, 'text/html');
const tb = doc.getElementById('cate_children');
if (!tb) return null;
const links = [].slice.call(tb.querySelectorAll('h2 a'));
let fallback = null;
for (let i = 0; i < links.length; i++) {
const t = (links[i].textContent || '').trim();
if (!t || /图墙/.test(t)) continue;
const raw = links[i].getAttribute('href');
const url = raw ? (function () {
try { return new URL(raw, base).href; } catch (e) { return raw; }
})() : (links[i].href || null);
if (/同人志/.test(t)) return url;
if (!fallback) fallback = url;
}
return fallback;
}
function applyArchSub(sub, anchor, href) {
if (!sub || !href || sub.href === href) return;
sub.href = href;
sub.subHref = href;
if (anchor) anchor.setAttribute('href', href);
}
function galArchSubRefresh() {
const subs = (GAL_INFO && GAL_INFO.subs) || [];
if (GAL_SELECT && GAL_TARGET >= 0 && subs[GAL_TARGET]) GAL_SELECT(GAL_TARGET);
if (GAL_MODAL && GAL_MODAL.backdrop.classList.contains('open') && subs[GAL_MODAL_INDEX]) {
GAL_MODAL.jump.href = subs[GAL_MODAL_INDEX].href;
}
}
function resolveArchSubs(stage, nodes, subsAll) {
if (!GAL_ARCH_SUB || !window.fetch || !subsAll || !subsAll.length) return;
const cache = galArchSubCache();
const todo = [];
let changed = false;
subsAll.forEach(function (s, idx) {
if (!s || !s.fromBoard || !s.boardHref) return;
const hit = cache.m[s.boardHref];
if (hit === 0) return;
if (hit) { applyArchSub(s, nodes[idx], hit); changed = true; return; }
todo.push({ sub: s, anchor: nodes[idx] });
});
if (changed) galArchSubRefresh();
if (!todo.length) return;
let cursor = 0, live = 0;
function save() {
try { window.localStorage.setItem(GAL_ARCH_SUB_KEY, JSON.stringify(cache)); } catch (e) {}
}
function tick() {
while (live < 2 && cursor < todo.length) {
const job = todo[cursor++];
let base = job.sub.boardHref;
try { base = new URL(base, location.href).href; } catch (e) {}
live++;
window.fetch(base, { credentials: 'same-origin', cache: 'no-store' })
.then(function (r) { return r.ok ? r.text() : ''; })
.then(function (html) {
const href = parseArchSubHref(html, base);
cache.m[job.sub.boardHref] = href || 0;
if (href) { applyArchSub(job.sub, job.anchor, href); galArchSubRefresh(); }
save();
})
.catch(function () {})
.then(function () { live--; window.setTimeout(tick, 400); });
}
}
window.setTimeout(tick, 0);
}
function buildEnhancedArchive(info, extraSubs) {
if (info.subs) info.subs.forEach(function (s) {
if (s) { s.fromBoard = 1; s.boardHref = s.href; }
});
const subs = (extraSubs || []).concat(info.subs || []);
GAL_INFO = { name: info.name, href: info.href, topics: info.topics, posts: info.posts, subs: subs };
const wrap = document.createElement('div');
wrap.className = 'spp-gal-wrap';
wrap.innerHTML =
'<div class="spp-hud-bar">' +
'<div class="spp-hud-left">' +
'<a class="spp-hud-title" href="' + esc(info.href) + '" target="_blank" rel="noopener">' +
'<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2"><path d="M12 2L2 7l10 5 10-5-10-5Z"/><path d="m2 17 10 5 10-5"/><path d="m2 12 10 5 10-5"/></svg>' +
esc(info.name) +
'</a>' +
'<span class="spp-badge spp-badge-mint">' +
'<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polyline points="20 6 9 17 4 12"/></svg>' +
subs.length + ' 个编年存档' +
'</span>' +
'<span class="spp-badge spp-badge-gold">★ 50周年半世纪纪元 (1975~2026)</span>' +
'<div class="spp-hud-stats">' +
'<span class="spp-hud-stat-item" title="主题总数">' +
'<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/></svg>' +
comma(info.topics) + ' 主题' +
'</span>' +
'<span class="spp-hud-stat-item" title="帖子总数">' +
'<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2Z"/></svg>' +
comma(info.posts) + ' 帖' +
'</span>' +
'</div>' +
'</div>' +
'<div class="spp-hud-right">' +
'<div class="spp-filter-group" id="spp-gal-filters">' +
'<button type="button" class="spp-filter-btn active" data-filter="all">全星系 (' + subs.length + ')' +
'<button type="button" class="spp-filter-btn" data-filter="reiwa">令和' + galEraRange('reiwa') + '</button>' +
'<button type="button" class="spp-filter-btn" data-filter="heisei">平成' + galEraRange('heisei') + '</button>' +
'<button type="button" class="spp-filter-btn" data-filter="milestone">盛典与里程碑 (' + galMilestoneCount() + ')' +
'</div>' +
'<div class="spp-live-status"><span class="spp-live-dot"></span>ONLINE</div>' +
'</div>' +
'</div>' +
'<div class="spp-gal" id="spp-gal-stage">' +
'<svg id="spp-gal-tether-svg"><line id="spp-gal-tether-line" x1="0" y1="0" x2="0" y2="0" stroke="rgba(0,238,255,0.65)" stroke-width="1.5" stroke-dasharray="4,4" opacity="0"/></svg>' +
'<div class="spp-gal__stage" id="spp-gal-nodes">' +
'<div class="spp-gal__ring"></div><div class="spp-gal__ring"></div><div class="spp-gal__ring"></div>' +
subs.map(function (s, idx) {
return '<a class="spp-gal__node" href="' + esc(s.href) + '"' +
' target="_blank" rel="noopener"' +
' data-index="' + idx + '" data-name="' + esc(s.name) + '"' +
' title="' + esc(s.name) + ':进入该届存档版块(左键看档案,Ctrl/中键直接开版块)">' +
esc(s.name) + '</a>';
}).join('') +
'</div>' +
'<div class="spp-core-anchor" id="spp-gal-core-anchor">' +
'<div class="spp-accretion-disk"></div>' +
'<div class="spp-blackhole-body" id="spp-gal-core" title="' + esc(info.name) +
':点击展开全息时空档案">' +
'<div class="spp-event-horizon"></div>' +
'<div class="spp-core-idle" id="spp-gal-core-idle">' +
'<svg class="spp-core-idle-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>' +
'<span class="spp-core-idle-txt">黑洞核心</span>' +
'</div>' +
'<div class="spp-core-active-hud" id="spp-gal-core-hud">' +
'<span class="spp-core-target-name" id="spp-gal-core-name">' + esc(subs.length ? subs[0].name : '') + '</span>' +
'<span class="spp-core-open-badge">' +
'<svg width="10" height="10" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="12"/><line x1="12" y1="16" x2="12.01" y2="16"/></svg>' +
'点击查阅档案' +
'</span>' +
'<a class="spp-core-sub-action" id="spp-gal-core-link" href="#" target="_blank" rel="noopener" title="直接前往该论坛版块">直达版区 ↗</a>' +
'</div>' +
'<span class="spp-gal__line"></span>' +
'</div>' +
'</div>' +
'</div>';
return wrap;
}
function initEnhancedGalaxy(root) {
if (!root) return;
const stage = root.querySelector('#spp-gal-stage');
if (!stage || stage.getAttribute('data-gal-on')) return;
stage.setAttribute('data-gal-on', '1');
const nodes = [].slice.call(stage.querySelectorAll('.spp-gal__node'));
const ringEls = [].slice.call(stage.querySelectorAll('.spp-gal__ring'));
const tetherLine = stage.querySelector('#spp-gal-tether-line');
const coreActiveHUD = stage.querySelector('#spp-gal-core-hud');
const coreIdleUI = stage.querySelector('#spp-gal-core-idle');
const coreTargetTitle = stage.querySelector('#spp-gal-core-name');
const coreDirectLink = stage.querySelector('#spp-gal-core-link');
const blackHoleCore = stage.querySelector('#spp-gal-core');
const subsAll = (GAL_INFO && GAL_INFO.subs) || [];
const counts = galRingCounts(nodes.length);
const tracks = GAL_RINGS.map(function (r) {
return { rx: 0, ry: 0, spd: r.spd, rgb: r.rgb };
});
const items = [];
let cursor = 0;
let currentTargetIndex = GAL_TARGET;
counts.forEach(function (cnt, ring) {
for (let j = 0; j < cnt; j++) {
const el = nodes[cursor + j];
if (!el) continue;
const idx = cursor + j;
const it = {
el: el, index: idx, ring: ring,
ang: (Math.PI * 2 / cnt) * j, hot: false,
subData: subsAll[idx],
history: GAL_HISTORIES[subsAll[idx] ? subsAll[idx].name : '']
};
items.push(it);
el.addEventListener('mouseenter', function () { it.hot = true; paintNodeStyle(it, true); });
el.addEventListener('mouseleave', function () { it.hot = false; paintNodeStyle(it, false); });
el.addEventListener('focus', function () { it.hot = true; paintNodeStyle(it, true); });
el.addEventListener('blur', function () { it.hot = false; paintNodeStyle(it, false); });
el.addEventListener('click', function (e) {
if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button !== 0) return;
e.preventDefault();
selectPlanet(it.index);
});
}
cursor += cnt;
});
function selectPlanet(index) {
if (index < 0 || index >= items.length) return;
currentTargetIndex = index;
GAL_TARGET = index;
const it = items[index];
const data = it.subData;
nodes.forEach(function (n) { n.classList.remove('is-active'); });
it.el.classList.add('is-active');
coreIdleUI.style.display = 'none';
coreActiveHUD.classList.add('show');
coreTargetTitle.textContent = data.name;
coreDirectLink.href = data.href;
const disk = stage.querySelector('.spp-accretion-disk');
const rgb = tracks[it.ring].rgb;
if (disk) {
disk.style.background = 'conic-gradient(from 0deg, rgba(' + rgb +
', 0.85), rgba(255, 255, 255, 0.7), rgba(' + rgb + ', 0.85))';
}
}
GAL_SELECT = selectPlanet;
blackHoleCore.addEventListener('click', function (e) {
if (e.target.closest && e.target.closest('#spp-gal-core-link')) return;
openArchiveModal(currentTargetIndex >= 0 ? currentTargetIndex : 0);
});
function paintNodeStyle(it, hot) {
const rgb = tracks[it.ring].rgb;
it.el.style.setProperty('--gal-c', hot ? '#ffffff' : 'rgb(' + rgb + ')');
it.el.style.setProperty('--gal-glow', hot
? '0 0 20px rgba(' + rgb + ',.9),0 0 38px rgba(' + rgb + ',.7),inset 0 0 10px rgba(' + rgb + ',.5)'
: '0 0 10px rgba(' + rgb + ',.25)');
}
const S = { out: false, slow: false, mult: 1 };
let raf = 0, last = 0, rt = 0;
const RM = window.matchMedia ? window.matchMedia('(prefers-reduced-motion: reduce)') : null;
function calc() {
const w = stage.clientWidth, h = stage.clientHeight;
if (!w || !h) return;
const maxRx = Math.min(w * 0.44, 780);
const maxRy = Math.min(maxRx * 0.35, (h - 80) / 2);
GAL_RINGS.forEach(function (r, i) {
tracks[i].rx = maxRx * r.k;
tracks[i].ry = maxRy * r.k;
if (ringEls[i]) {
ringEls[i].style.width = (tracks[i].rx * 2).toFixed(1) + 'px';
ringEls[i].style.height = (tracks[i].ry * 2).toFixed(1) + 'px';
}
});
}
function paint(dt) {
let hot = false;
for (let i = 0; i < items.length; i++) if (items[i].hot) { hot = true; break; }
const want = hot ? 0 : (S.slow ? 0.2 : 1);
S.mult += (want - S.mult) * 0.05;
const k = dt / 16.667;
const centerX = stage.clientWidth / 2;
const centerY = stage.clientHeight / 2;
let activeCoord = null;
for (let i = 0; i < items.length; i++) {
const it = items[i], tr = tracks[it.ring], el = it.el;
it.ang += tr.spd * S.mult * k;
const x = Math.cos(it.ang) * tr.rx;
const y = Math.sin(it.ang) * tr.ry;
const depth = Math.sin(it.ang);
let filterOp = 1;
if (GAL_FILTER !== 'all' && it.history) {
if (GAL_FILTER === 'milestone') {
filterOp = it.history.isMilestone ? 1 : 0.18;
} else if (it.history.eraCategory !== GAL_FILTER) {
filterOp = 0.22;
}
}
const sc = it.hot ? 1.35 : 0.85 + depth * 0.32;
const op = (it.hot ? 1 : 0.65 + depth * 0.35) * filterOp;
el.style.transform = 'translate(calc(-50% + ' + x.toFixed(2) + 'px), ' +
'calc(-50% + ' + y.toFixed(2) + 'px)) scale(' + sc.toFixed(3) + ')';
el.style.opacity = op.toFixed(3);
el.style.zIndex = String(it.hot ? 999
: (it.index === currentTargetIndex ? 888 : Math.floor((depth + 1) * 50)));
if (it.index === currentTargetIndex) activeCoord = { x: centerX + x, y: centerY + y };
}
if (activeCoord && tetherLine) {
tetherLine.setAttribute('x1', centerX);
tetherLine.setAttribute('y1', centerY);
tetherLine.setAttribute('x2', activeCoord.x);
tetherLine.setAttribute('y2', activeCoord.y);
tetherLine.setAttribute('opacity', '0.75');
const targetRing = items[currentTargetIndex] ? items[currentTargetIndex].ring : 0;
tetherLine.setAttribute('stroke', 'rgb(' + tracks[targetRing].rgb + ')');
} else if (tetherLine) {
tetherLine.setAttribute('opacity', '0');
}
}
function frame(t) {
raf = 0;
if (S.out || document.hidden) return;
const dt = last ? Math.min(t - last, 64) : 16.667;
last = t;
paint(dt);
raf = window.requestAnimationFrame(frame);
}
function start() {
if (raf || S.out || document.hidden) return;
if (RM && RM.matches) { calc(); paint(0); return; }
last = 0;
raf = window.requestAnimationFrame(frame);
}
function stop() {
if (raf) { window.cancelAnimationFrame(raf); raf = 0; }
}
calc();
items.forEach(function (it) { paintNodeStyle(it, false); });
paint(0);
let slowPt = null;
function slowZone() {
if (!slowPt) return false;
let rx = 0, ry = 0;
for (let i = 0; i < tracks.length; i++) {
if (tracks[i].rx > rx) { rx = tracks[i].rx; ry = tracks[i].ry; }
}
if (!rx || !ry) return true;
const r = stage.getBoundingClientRect();
const dx = (slowPt.x - (r.left + r.width / 2)) / rx;
const dy = (slowPt.y - (r.top + r.height / 2)) / ry;
return dx * dx + dy * dy <= 1;
}
function refreshSlow() { S.slow = slowZone(); }
let slowRaf = 0;
function refreshSlowSoon() {
if (slowRaf) return;
slowRaf = window.requestAnimationFrame(function () { slowRaf = 0; refreshSlow(); });
}
stage.addEventListener('pointermove', function (e) {
slowPt = { x: e.clientX, y: e.clientY };
refreshSlowSoon();
}, { passive: true });
stage.addEventListener('pointerdown', function (e) {
slowPt = { x: e.clientX, y: e.clientY };
refreshSlow();
});
stage.addEventListener('pointerleave', function () { slowPt = null; S.slow = false; });
window.addEventListener('scroll', refreshSlowSoon, { passive: true });
if (window.IntersectionObserver) {
new window.IntersectionObserver(function (es) {
S.out = !es[0].isIntersecting;
if (S.out) stop(); else start();
}, { threshold: 0 }).observe(stage);
}
document.addEventListener('visibilitychange', function () {
if (document.hidden) stop(); else start();
});
window.addEventListener('resize', function () {
window.clearTimeout(rt);
rt = window.setTimeout(function () { calc(); if (!raf) paint(0); }, 100);
});
start();
const fg = stage.parentNode.querySelector('#spp-gal-filters');
if (fg) {
fg.addEventListener('click', function (e) {
const btn = e.target.closest ? e.target.closest('.spp-filter-btn') : null;
if (!btn) return;
[].forEach.call(fg.querySelectorAll('.spp-filter-btn'), function (b) {
b.classList.remove('active');
});
btn.classList.add('active');
GAL_FILTER = btn.getAttribute('data-filter') || 'all';
if (!raf) paint(0);
});
}
selectPlanet(0);
if (RM && RM.matches) paint(0);
window.setTimeout(function () { resolveArchSubs(stage, nodes, subsAll); }, 800);
}
let GAL_MODAL = null;
let GAL_MODAL_INDEX = 0;
function ensureArchiveModal() {
if (GAL_MODAL) return GAL_MODAL;
const host = document.createElement('div');
host.innerHTML =
'<div class="spp-modal-backdrop" id="spp-am-backdrop" aria-hidden="true" role="dialog">' +
'  <div class="spp-modal-dialog">' +
'    <div class="spp-modal-header">' +
'      <div class="spp-modal-header-left">' +
'        <span class="spp-modal-title" id="spp-am-title">C103</span>' +
'        <span class="spp-modal-season-tag tag-summer" id="spp-am-season">☀️ 夏Comi</span>' +
'        <span class="spp-modal-date" id="spp-am-date">2026年8月 · 令和8年</span>' +
'      </div>' +
'      <button class="spp-modal-close" id="spp-am-close" title="关闭弹窗 (Esc)">' +
'        <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><path d="M18 6 6 18M6 6l12 12"/></svg>' +
'      </button>' +
'    </div>' +
'' +
'    <div class="spp-modal-body">' +
'      <!-- 流行与主导 IP 阵营 -->' +
'      <div class="spp-info-card">' +
'        <div class="spp-info-card-title">' +
'          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg>' +
'          主导 IP 与同人版图' +
'        </div>' +
'        <div class="spp-tag-cloud" id="spp-am-ips"></div>' +
'      </div>' +
'' +
'      <!-- 历史重大事件剖析 -->' +
'      <div class="spp-info-card">' +
'        <div class="spp-info-card-title">' +
'          <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>' +
'          历史纪实与重大标志变革' +
'        </div>' +
'        <ul class="spp-history-list" id="spp-am-events"></ul>' +
'      </div>' +
'    </div>' +
'' +
'    <div class="spp-modal-footer">' +
'      <div class="spp-modal-nav-group">' +
'        <button class="spp-nav-pill-btn" id="spp-am-prev">' +
'          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="m15 18-6-6 6-6"/></svg>' +
'          上一届' +
'        </button>' +
'        <button class="spp-nav-pill-btn" id="spp-am-next">' +
'          下一届' +
'          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="m9 18 6-6-6-6"/></svg>' +
'        </button>' +
'      </div>' +
'' +
'      <!-- 保留原始论坛真实跳转 -->' +
'      <a class="spp-direct-jump-btn" id="spp-am-jump" href="#" target="_blank" rel="noopener">' +
'        <span>进入论坛版块</span>' +
'        <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>' +
'      </a>' +
'    </div>' +
'  </div>' +
'</div>';
const bd = host.firstElementChild;
document.body.appendChild(bd);
const g = function (id) { return bd.querySelector('#' + id); };
GAL_MODAL = {
backdrop: bd,
title: g('spp-am-title'), season: g('spp-am-season'), date: g('spp-am-date'),
ips: g('spp-am-ips'), events: g('spp-am-events'), jump: g('spp-am-jump'),
prev: g('spp-am-prev'), next: g('spp-am-next'), close: g('spp-am-close')
};
GAL_MODAL.close.addEventListener('click', closeArchiveModal);
bd.addEventListener('click', function (e) { if (e.target === bd) closeArchiveModal(); });
GAL_MODAL.prev.addEventListener('click', function () {
if (GAL_MODAL_INDEX < ((GAL_INFO && GAL_INFO.subs) || []).length - 1) {
renderArchiveModal(GAL_MODAL_INDEX + 1);
}
});
GAL_MODAL.next.addEventListener('click', function () {
if (GAL_MODAL_INDEX > 0) renderArchiveModal(GAL_MODAL_INDEX - 1);
});
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && GAL_MODAL.backdrop.classList.contains('open')) closeArchiveModal();
});
return GAL_MODAL;
}
function openArchiveModal(index) {
const md = ensureArchiveModal();
GAL_MODAL_INDEX = index;
renderArchiveModal(index);
md.backdrop.classList.add('open');
md.backdrop.setAttribute('aria-hidden', 'false');
GAL_MODAL_SCROLL = document.body.style.overflow;
document.body.style.overflow = 'hidden';
}
let GAL_MODAL_SCROLL = '';
function closeArchiveModal() {
const md = ensureArchiveModal();
md.backdrop.classList.remove('open');
md.backdrop.setAttribute('aria-hidden', 'true');
document.body.style.overflow = GAL_MODAL_SCROLL || '';
}
function renderArchiveModal(index) {
const subs = (GAL_INFO && GAL_INFO.subs) || [];
const sub = subs[index];
if (!sub) return;
const history = GAL_HISTORIES[sub.name];
if (!history) return;
const md = ensureArchiveModal();
GAL_MODAL_INDEX = index;
md.title.textContent = sub.name;
md.date.textContent = history.era;
md.season.textContent = history.seasonTxt;
md.season.className = 'spp-modal-season-tag ' + (
history.season === 'anniv' ? 'tag-anniv' :
history.season === 'summer' ? 'tag-summer' :
history.season === 'winter' ? 'tag-winter' : 'tag-special');
md.ips.innerHTML = history.ips.map(function (ip) {
return '<span class="spp-ip-pill">' + esc(ip) + '</span>';
}).join('');
md.events.innerHTML = history.events.map(function (ev) {
return '<li><strong>' + esc(ev.t) + '</strong>:' + esc(ev.d) + '</li>';
}).join('');
md.jump.href = sub.href;
md.prev.disabled = index >= subs.length - 1;
md.next.disabled = index <= 0;
if (GAL_SELECT) GAL_SELECT(index);
}
const SZ_GROUPS = ['茶馆', '免空资源区', '网赚资源区'];
const SZ_TEA    = '茶馆';
function buildSubCard(sub, tag) {
const a = document.createElement('a');
a.className = 'spp-sc spp-sc--hud';
const n = sub.name || '';
if (n.length >= 14) a.className += ' is-xlong';
else if (n.length >= 9) a.className += ' is-long';
a.href = sub.href;
a.target = '_blank';
a.rel = 'noopener';
a.innerHTML =
'<div class="spp-sc__canvas">' +
new Array(25).join('<div class="spp-sc__tr"></div>') + '<div class="spp-sc__tr"></div>' +
'<div class="spp-sc__card"><div class="spp-sc__body">' +
'<div class="spp-sc__glare"></div>' +
'<div class="spp-sc__lines"><span></span><span></span><span></span><span></span></div>' +
'<div class="spp-sc__glows"><div class="g1"></div><div class="g2"></div><div class="g3"></div></div>' +
'<div class="spp-sc__particles"><span></span><span></span><span></span><span></span><span></span><span></span></div>' +
'<div class="spp-sc__corners"><span></span><span></span><span></span><span></span></div>' +
'<div class="spp-sc__scan"></div>' +
'<h4 class="spp-sc__name">' + esc(n) + '</h4>' +
(tag ? '<span class="spp-sc__hex">// ' + esc(tag) + '</span>' : '') +
'</div></div>' +
'</div>';
return a;
}
const SZ_TEA_POEM = '休对故人思故国,且将新火试新茶,诗酒趁年华。';
function buildTeaCard(info) {
const a = document.createElement('a');
a.className = 'spp-sc spp-sc--tea';
a.href = info ? info.href : 'thread.php?fid-9.html';
a.target = '_blank';
a.rel = 'noopener';
a.innerHTML =
'<div class="spp-tc">' +
'<div class="spp-tc__border"></div>' +
'<div class="spp-tc__content">' +
'<div class="spp-tc__logo">' +
'<div class="spp-tc__logo1">茶馆</div>' +
'<div class="spp-tc__logo2">' + SZ_TEA_POEM + '</div>' +
'<span class="spp-tc__trail"></span>' +
'</div>' +
'<span class="spp-tc__sub">SOUTH-PLUS</span>' +
'</div>' +
'<span class="spp-tc__bottom">苏轼《望江南》</span>' +
'</div>';
return a;
}
function renderSubCards() {
if (!onSub) return;
const cw = document.querySelector('#content > .contentwrap');
if (!cw || cw.querySelector('.spp-sz')) return;
const cate = document.getElementById('cate_7');
if (!cate) return;
const all = [].slice.call(cate.querySelectorAll('tr.f_one[id^="fid_"]'))
.map(parseBoardRow).filter(Boolean);
if (!all.length) return;
const zone = document.createElement('div');
zone.className = 'spp-sz';
const picked = SZ_GROUPS.map(function (name) {
return all.filter(function (r) { return r.name === name; })[0];
}).filter(Boolean);
if (!picked.length) return;
picked.forEach(function (info) {
const g = document.createElement('div');
const isTea = info.name === SZ_TEA;
g.className = 'spp-sz-group' + (isTea ? ' is-center'
: (info.name === '网赚资源区' ? ' is-net' : ' is-sec'));
const hd = document.createElement('div');
hd.className = 'spp-sz-hd spp-uvbtn';
hd.innerHTML =
'<a class="spp-sz-hd__t" href="' + info.href + '" target="_blank" rel="noopener">' + esc(info.name) + '</a>' +
'<span class="spp-sz-hd__meta">' + comma(info.topics) + ' 主题<i>·</i>' + comma(info.posts) + ' 帖' +
(typeof info.today === 'number' ? '<i>·</i>今日 <b>' + (info.today > 0 ? '+' + info.today : '0') + '</b>' : '') +
'</span>' +
'<span class="spp-sz-hd__cnt">' + info.subs.length + ' 子版</span>';
g.appendChild(hd);
const grid = document.createElement('div');
grid.className = 'spp-sz-grid';
if (isTea) {
const snap = collectTopCols();
const pick = function (name) {
return snap ? snap.cols.filter(function (c) { return c.title === name; })[0] : null;
};
const l = pick('最新讨论'), r = pick('最新回复');
if (l) grid.appendChild(buildTopCard(l.title, l.links, l.href || null));
grid.appendChild(buildTeaCard(info));
if (r) grid.appendChild(buildTopCard(r.title, r.links, r.href || null));
} else {
const tagPre = (info.name === '网赚资源区') ? 'NET' : 'SEC';
info.subs.forEach(function (sub, si) {
grid.appendChild(buildSubCard(sub, tagPre + '-' + (si < 9 ? '0' : '') + (si + 1)));
});
}
g.appendChild(grid);
zone.appendChild(g);
});
if (!zone.children.length) return;
cw.insertBefore(zone, cw.firstChild);
}
let TOP_SNAPSHOT = null;
function collectTopCols() {
if (TOP_SNAPSHOT) return TOP_SNAPSHOT;
const wrap = document.querySelector('#main > div.t');
if (!wrap) return null;
const tbl = wrap.querySelector('table');
if (!tbl || tbl.rows.length < 2) return null;
const headRow = tbl.rows[0], bodyRow = tbl.rows[1];
if (headRow.cells.length !== 4 || bodyRow.cells.length !== 4) return null;
const cols = [];
for (let i = 0; i < 4; i++) {
const title = headRow.cells[i].textContent.replace(/\s+/g, ' ').trim();
const links = [].slice.call(bodyRow.cells[i].querySelectorAll('a'))
.filter(function (a) { return (a.textContent || '').trim(); });
if (!title || !links.length) return null;
cols.push({ title: title, links: links });
}
TOP_SNAPSHOT = { wrap: wrap, tbl: tbl, cols: cols };
return TOP_SNAPSHOT;
}
const TOP_KEEP = ['GALGAME汉化区', '提问求物'];   
const TOP_JUMP = {
'GALGAME汉化区': 'thread_new.php?fid-221-page-1.html',
'提问求物': 'thread_new.php?fid-48-page-1.html'
};
const TOP_MIKAN = '蜜柑计划';
const MIKAN_URL = 'https://mikan.tangbai.cc/';
const SZ_BILI_SVG =
'<svg class="spp-bili" viewBox="0 0 24 24" aria-hidden="true" focusable="false">' +
'<path d="M6.4 6.6 4.1 4.2"/>' +
'<path d="M17.6 6.6 19.9 4.2"/>' +
'<rect x="2.6" y="6.6" width="18.8" height="13.6" rx="3.4"/>' +
'<path d="M8.2 11.4v2.8"/>' +
'<path d="M15.8 11.4v2.8"/>' +
'</svg>';
function buildTopCard(title, links, href, opts) {
opts = opts || {};
const wrap = document.createElement('div');
wrap.className = 'spp-sc spp-latest' + (opts.variant ? ' spp-sc--' + opts.variant : '');
if (opts.variant === 'mikan') {
const link = opts.href || '#';
wrap.innerHTML =
'<div class="spp-mk">' +
'<div class="spp-mk__back">' +
'<div class="spp-mk__core">' +
(opts.icon || '') +
'<strong>' + esc(title) + '</strong>' +
'</div>' +
'</div>' +
'<div class="spp-mk__front">' +
'<div class="spp-mk__orbs"><span class="c1"></span><span class="c2"></span><span class="c3"></span></div>' +
'<div class="spp-mk__frontcore">' +
'<span class="spp-mk__badge">' + esc(opts.name || title) + '</span>' +
'<div class="spp-mk__desc">' +
'<div class="spp-mk__title"><span>' + esc(title) + '</span>' +
'<svg height="15px" width="15px" viewBox="0,0,256,256" aria-hidden="true">' +
'<path d="M25,27l-9,-6.75l-9,6.75v-23h18z"></path>' +
'</svg>' +
'</div>' +
(opts.desc ? '<p class="spp-mk__foot">' + esc(opts.desc) + '</p>' : '') +
(opts.host ? '<p class="spp-mk__foot spp-mk__foot--host">' + esc(opts.host) + ' ↗</p>' : '') +
'</div>' +
'</div>' +
'</div>' +
'<a class="spp-mk__link" href="' + esc(link) + '" target="_blank" rel="noopener" aria-label="' + esc(title) + '"></a>' +
'</div>';
return wrap;
}
const box = document.createElement('div');
box.className = 'spp-lt';
const head = href
? '<a class="spp-top4__hd" href="' + esc(href) + '" target="_blank" rel="noopener">' + esc(title) + '</a>'
: '<span class="spp-top4__hd">' + esc(title) + '</span>';
box.innerHTML =
'<div class="spp-lt__glare"></div>' +
'<div class="spp-lt__lines"><span></span><span></span><span></span><span></span></div>' +
'<div class="spp-lt__glows"><div class="g1"></div><div class="g2"></div><div class="g3"></div></div>' +
'<div class="spp-lt__corners"><span></span><span></span><span></span><span></span></div>' +
'<div class="spp-lt__scan"></div>' +
'<div class="spp-lt__hd"><i></i>' + (opts.icon || '') + head + '</div>';
const ul = document.createElement('ul');
ul.className = 'spp-lt__list';
links.forEach(function (a) {
const li = document.createElement('li');
const na = document.createElement('a');
na.href = a.getAttribute('href') || '#';
na.target = '_blank';
na.rel = 'noopener';
const txt = (a.textContent || '').replace(/\s+/g, ' ').trim();
na.innerHTML = '<i></i><span>' + esc(txt) + '</span>';
li.appendChild(na);
ul.appendChild(li);
});
box.appendChild(ul);
wrap.appendChild(box);
return wrap;
}
function collectMikan() {
const cate = document.getElementById('cate_123');
if (!cate) return null;
const row = cate.querySelector('tr.f_one[id^="fid_"]');
const tbl = cate.closest('table');
if (!row) return null;
const a = row.querySelector('th h3.b > a');
if (!a) return null;
const descEl = row.querySelector('span.smalltxt');
const statTd = row.querySelector('td.tal');
const st = (statTd ? statTd.textContent : '').match(/(\d+)\s*\/\s*(\d+)/);
return {
block: document.getElementById('t_123') || (tbl ? tbl.parentNode : null),
title: TOP_MIKAN,
name: a.textContent.trim(),
href: MIKAN_URL,
boardHref: a.getAttribute('href'),
desc: descEl ? descEl.textContent.replace(/\s+/g, ' ').trim() : '',
topics: st ? Number(st[1]) : null,
posts: st ? Number(st[2]) : null,
links: [a]
};
}
function renderTopCards() {
if (!onTopCard) return;
const snap = collectTopCols();
if (!snap || snap.wrap.querySelector('.spp-top4')) return;
const mikan = collectMikan();
const grid = document.createElement('div');
grid.className = 'spp-top4';
const keep = TOP_KEEP.map(function (name) {
return snap.cols.filter(function (c) { return c.title === name; })[0];
}).filter(Boolean);
if (keep.length !== TOP_KEEP.length) return;
const seq = [keep[0], mikan, keep[1]].filter(Boolean);
if (seq.length !== 3) return;
seq.forEach(function (c) {
const isMikan = c === mikan;
grid.appendChild(buildTopCard(c.title, c.links, c.href || TOP_JUMP[c.title] || null,
isMikan ? {
variant: 'mikan',
icon: SZ_BILI_SVG,
href: mikan.href,
name: mikan.name,
desc: mikan.desc,
host: 'mikan.tangbai.cc'
} : null));
});
snap.tbl.style.display = 'none';
if (mikan && mikan.block) mikan.block.style.display = 'none';
snap.wrap.classList.add('spp-top4-host');
snap.wrap.appendChild(grid);
}
function renderCmCards() {
if (!onCard) return;
const cate = document.getElementById('cate_39');
if (!cate || cate.querySelector('.spp-cm-row')) return;
const all = [].slice.call(cate.querySelectorAll('tr.f_one[id^="fid_"]'))
.map(parseBoardRow).filter(Boolean);
if (!all.length) return;
const pool = all.concat(pickForeignPins());
const series = all.filter(function (r) { return r.no !== null; })
.sort(function (a, b) { return b.no - a.no; }).slice(0, 5);
const headRow = cate.querySelector('tr.tr2');
if (headRow) headRow.style.display = 'none';
const tbl = cate.closest('table');
const headTh = tbl ? tbl.querySelector('th.h') : null;
if (headTh) headTh.classList.add('spp-uvbtn');
const targets = pickCmTargets(pool, 'cm', series);
const hostT = cate.closest('.t');
if (hostT) hostT.classList.add('spp-clear-host');
const anchor = all.filter(function (r) { return targets.indexOf(r) !== -1; })[0];
if (targets.length && anchor) {
const tr = document.createElement('tr');
tr.className = 'spp-cm-row';
const td = document.createElement('td');
td.colSpan = 5;
td.insertAdjacentHTML('beforeend', cmFilterBarHTML(targets));
cmFilterCtx = { td: td, targets: targets };
[].slice.call(td.querySelectorAll('.spp-cmc-filter__btns button')).forEach(function (b) {
b.addEventListener('click', function () { cmApplyFilter(b.getAttribute('data-cat')); });
});
cmApplyFilter(cmFilterNow);
tr.appendChild(td);
anchor.tr.parentNode.insertBefore(tr, anchor.tr);
targets.forEach(function (t) { t.tr.style.display = 'none'; });
cmWatchFold(cate);
[0, 200, 800, 1800].forEach(function (ms) { window.setTimeout(cmSyncSecBarPills, ms); });
}
const archive = all.filter(function (r) { return r.name === CM_ARCHIVE; })[0];
if (archive) {
const atr = document.createElement('tr');
atr.className = 'spp-cm-row spp-cm-archive-row';
const atd = document.createElement('td');
atd.colSpan = 5;
const galaxy = buildEnhancedArchive(archive, pickNewerCmSubs(all, archive));
atd.appendChild(galaxy);
atr.appendChild(atd);
archive.tr.parentNode.insertBefore(atr, archive.tr);
archive.tr.style.display = 'none';
initEnhancedGalaxy(galaxy);
}
}
const HJ_KEEP = ['ACG交流', '轻小说', '原创绘画', '原创小说区', 'AI交流'];
const HJ_BADGE = {
'ACG交流':    'AC',
'轻小说':      '轻小',
'原创绘画':    '绘画',
'原创小说区':  '小说',
'AI交流':      'AI'
};
function pickHjTargets(all) {
return HJ_KEEP.map(function (k) {
return all.filter(function (r) {
return r.name === k || String(r.name).indexOf(k) === 0;
})[0];
}).filter(Boolean);
}
function buildBoardGrid(targets, badgeEm, badgeMap, keepList) {
const grid = document.createElement('div');
grid.className = 'spp-cm-grid' + (targets.length === 1 ? ' is-single' : '');
targets.forEach(function (t) {
const keys = keepList || [];
const key = keys.filter(function (k) {
return t.name === k || String(t.name).indexOf(k) === 0;
})[0] || t.name;
const info = Object.assign({}, t, {
badgeEm: badgeEm,
badgeNo: (badgeMap && badgeMap[key]) || String(t.name).trim().slice(0, 2)
});
grid.appendChild(buildCmCard(info));
});
return grid;
}
function renderBoardCards(opt) {
const cate = document.getElementById(opt.cateId);
if (!cate || cate.querySelector('.' + opt.rowClass)) return;
const all = [].slice.call(cate.querySelectorAll('tr.f_one[id^="fid_"]'))
.map(parseBoardRow).filter(Boolean);
if (!all.length) return;
const targets = opt.pick(all);
if (!targets.length) return;
const rest = all.filter(function (r) { return targets.indexOf(r) === -1; });
if (rest.length && !opt.hideRest) return;
const hostT = cate.closest('.t');
if (hostT) hostT.classList.add('spp-clear-host');
const tbl = cate.closest('table');
const headTh = tbl ? tbl.querySelector('th.h') : null;
if (headTh) headTh.classList.add('spp-uvbtn');
if (opt.hideRest) {
const headRow = cate.querySelector('tr.tr2');
if (headRow) headRow.style.display = 'none';
}
const anchor = all.filter(function (r) { return targets.indexOf(r) !== -1; })[0];
if (!anchor) return;
const tr = document.createElement('tr');
tr.className = 'spp-cm-row' + (opt.rowClass === 'spp-cm-row' ? '' : ' ' + opt.rowClass);
const td = document.createElement('td');
td.colSpan = 5;
td.appendChild(buildBoardGrid(targets, opt.badgeEm, opt.badgeMap, opt.keepList));
tr.appendChild(td);
anchor.tr.parentNode.insertBefore(tr, anchor.tr);
(opt.hideRest ? all : targets).forEach(function (r) { r.tr.style.display = 'none'; });
}
function renderHjCards() {
if (!onHjCard) return;
return renderBoardCards({
cateId: 'cate_7',
rowClass: 'spp-hj-row',
pick: pickHjTargets,
badgeEm: '交流',
badgeMap: HJ_BADGE,
keepList: HJ_KEEP,
hideRest: true
});
}
const RM_KEEP = ['事务受理'];
const RM_BADGE = { '事务受理': '受理' };
function pickRmTargets(all) {
return RM_KEEP.map(function (k) {
return all.filter(function (r) {
return r.name === k || String(r.name).indexOf(k) === 0;
})[0];
}).filter(Boolean);
}
function renderRmCards() {
if (!onRmCard) return;
return renderBoardCards({
cateId: 'cate_1',
rowClass: 'spp-rm-row',
pick: pickRmTargets,
badgeEm: '服务',
badgeMap: RM_BADGE,
keepList: RM_KEEP,
hideRest: true
});
}
function moveOnlineStats() {
if (!onOnline || !onStats) return;
const host = document.querySelector('#infobox div.fr.tar');
if (!host || host.querySelector('.spp-onb')) return;
const acts = host.querySelector('.spp-hm-acts');
if (!acts) return;
const cate = document.getElementById('cate_info');
if (!cate) return;
const src = [].slice.call(cate.querySelectorAll('tr')).filter(function (tr) {
return /在线用户/.test(tr.textContent) && /人在线/.test(tr.textContent);
})[0];
if (!src) return;
const td = src.querySelector('td');
const txt = (td ? td.textContent : src.textContent).replace(/\s+/g, ' ').trim();
const cur  = txt.match(/共\s*([\d,]+)\s*人在线/);
const peak = txt.match(/最多\s*([\d,]+)\s*人发生在\s*([\d-]+)[ T]?([\d:]*)/);
if (!cur) return;
let dateTxt = '';
let peakAt = '';
if (peak) {
peakAt = peak[2] + (peak[3] ? ' ' + peak[3] : '');
const m = peak[2].match(/^(\d{4})-(\d{2})-(\d{2})$/);
if (m) dateTxt = m[1].slice(2) + '-' + m[2] + '-' + m[3];
}
const badge = document.createElement('span');
badge.className = 'spp-onb';
badge.title = '共 ' + cur[1] + ' 人在线' +
(peak ? ',最多 ' + peak[1] + ' 人发生在 ' + peakAt : '');
badge.innerHTML =
'<span class="spp-onb__dot"></span>' +
'<span class="spp-onb__k">在线</span>' +
'<b class="spp-onb__v">' + esc(cur[1]) + '</b>' +
(peak ? '<span class="spp-onb__peak">峰值 <b>' + esc(peak[1]) + '</b></span>' : '') +
(dateTxt ? '<span class="spp-onb__date">· ' + esc(dateTxt) + '</span>' : '');
acts.insertBefore(badge, acts.firstChild);
if (td) {
[].slice.call(td.childNodes).forEach(function (n) {
if (n.nodeType === 3 && /人在线|人发生在/.test(n.nodeValue)) {
n.nodeValue = n.nodeValue.replace(/\s*[-—–]?\s*共\s*[\d,]+\s*人在线.*$/, '');
}
});
}
}
const FLK_CSS = [
'/* ===== 钟表美化 UI(外链星轨)样式:_gen-flk-css.js 从参考页实际生效样式机械改写 ===== */',
'/* 来源:外站code_artifact.html 在浏览器里 316 条 cssRules 的整份导出 */',
'/* 账目:保留类规则 258 + 分级转无条件 14 + keyframes 4;丢弃 preflight/页面级 44、分级尺寸 20 */',
'',
'/* ── 作用域化迷你 reset:顶替 Tailwind preflight(参考全靠它抹平台式) ── */',
'.spp-flk-root, .spp-flk-root *, .spp-flk-root *::before, .spp-flk-root *::after { box-sizing:border-box; border-width:0; border-style:solid; border-color:rgb(229 231 235); }',
'.spp-flk-root * { margin:0; padding:0; }',
'.spp-flk-root { position:relative; margin:0; padding:0; line-height:1.5; color:var(--flk-text-primary); text-align:left;',
'  background-color:transparent; font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;',
'  display:flex; flex-direction:column; align-items:center; width:100%;',
'  --flk-obsidian-bg:#05070c; --flk-obsidian-card:#090e18; --flk-obsidian-glass:rgba(10, 15, 26, 0.82);',
'  --flk-gold-stellar:#f59e0b; --flk-gold-light:#fbbf24; --flk-silver-platinum:#f1f5f9;',
'  --flk-text-primary:#ffffff; --flk-text-secondary:#94a3b8; --flk-border-hairline:rgba(255, 255, 255, 0.14);',
'  --flk-jewel-primary:#a855f7; --flk-jewel-secondary:#6366f1;',
'  --flk-jewel-glow:rgba(168, 85, 247, 0.38); --flk-jewel-glow-soft:rgba(99, 102, 241, 0.16);',
'  --flk-font-mono:ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;',
'  --spp-flk-dial:630px; }',
'.spp-flk-root h1, .spp-flk-root h2, .spp-flk-root h3, .spp-flk-root h4, .spp-flk-root h5, .spp-flk-root h6 { font-size:inherit; font-weight:inherit; }',
'.spp-flk-root a { color:inherit; text-decoration:inherit; }',
'.spp-flk-root b, .spp-flk-root strong { font-weight:bolder; }',
'.spp-flk-root svg, .spp-flk-root img, .spp-flk-root video { display:block; vertical-align:middle; }',
'.spp-flk-root button, .spp-flk-root input, .spp-flk-root select { font:inherit; color:inherit; margin:0; padding:0; background-color:transparent; background-image:none; text-transform:none; }',
'.spp-flk-root button, .spp-flk-root [role="button"] { cursor:pointer; }',
'.spp-flk-root p, .spp-flk-root ul, .spp-flk-root ol, .spp-flk-root dl { list-style:none; }',
'.spp-flk-root ::placeholder { opacity:1; color:rgb(156 163 175); }',
'',
'/* ── 尺寸:全部跟着表盘直径走(顶替参考的四档视口分级);id 开头保证特异度够 ── */',
'#spp-flk-chrono-container { width:var(--spp-flk-dial); height:var(--spp-flk-dial); }',
'#spp-flk-center-viewport { width:calc(var(--spp-flk-dial) * 0.457); height:calc(var(--spp-flk-dial) * 0.457); padding:calc(var(--spp-flk-dial) * 0.035); }',
'#spp-flk-site-display-name { font-size:calc(var(--spp-flk-dial) * 0.048); line-height:1.2; }',
'#spp-flk-site-domain-name { font-size:calc(var(--spp-flk-dial) * 0.022); margin-top:calc(var(--spp-flk-dial) * 0.005); margin-bottom:calc(var(--spp-flk-dial) * 0.02); }',
'#spp-flk-site-index-tag, #spp-flk-hover-status-text { font-size:calc(var(--spp-flk-dial) * 0.017); }',
'#spp-flk-site-logo-badge { width:calc(var(--spp-flk-dial) * 0.076); height:calc(var(--spp-flk-dial) * 0.076); font-size:calc(var(--spp-flk-dial) * 0.038); }',
'#spp-flk-site-direct-anchor { font-size:calc(var(--spp-flk-dial) * 0.021); padding:calc(var(--spp-flk-dial) * 0.013) calc(var(--spp-flk-dial) * 0.03); }',
'#spp-flk-orbital-nodes-container .node-pill { width:calc(var(--spp-flk-dial) * 0.0635); height:calc(var(--spp-flk-dial) * 0.0635); font-size:calc(var(--spp-flk-dial) * 0.022); border-radius:calc(var(--spp-flk-dial) * 0.024); }',
'#spp-flk-orbital-nodes-container .node-name-tip { bottom:calc(var(--spp-flk-dial) * -0.04); font-size:calc(var(--spp-flk-dial) * 0.016); }',
'#spp-flk-pointer-needle { width:max(1px, calc(var(--spp-flk-dial) * 0.0032)); }',
'#spp-flk-chrono-container .flk-ring-a { inset:0.4%; }',
'#spp-flk-chrono-container .flk-ring-b { inset:7.6%; }',
'#spp-flk-chrono-container .flk-ring-c { inset:12.7%; }',
'#spp-flk-center-viewport { -webkit-backdrop-filter: none !important; backdrop-filter: none !important; }',
'#spp-flk-countdown-arc, #spp-flk-dial-ticks-svg { filter: none !important; }',
'.spp-flk-hint { color: rgba(255,255,255,.62); border: 1px solid rgba(255,255,255,.16); background: rgba(255,255,255,.05); font-family: inherit; }',
'',
'/* ── 不搬的页面级声明(记在这里当账目,不生成规则):body 的 user-select:none /',
'   overflow-x:hidden / 背景色;::selection 两条;星空画布、固定环境光、撑满一屏。 ── */',
'',
'/* Tailwind 的工具类变量(作用域化保留:transform / 阴影全靠它们) */',
'.spp-flk-root, .spp-flk-root *, .spp-flk-root *::before, .spp-flk-root *::after { --tw-border-spacing-x: 0; --tw-border-spacing-y: 0; --tw-translate-x: 0; --tw-translate-y: 0; --tw-rotate: 0; --tw-skew-x: 0; --tw-skew-y: 0; --tw-scale-x: 1; --tw-scale-y: 1; --tw-pan-x: ; --tw-pan-y: ; --tw-pinch-zoom: ; --tw-scroll-snap-strictness: proximity; --tw-gradient-from-position: ; --tw-gradient-via-position: ; --tw-gradient-to-position: ; --tw-ordinal: ; --tw-slashed-zero: ; --tw-numeric-figure: ; --tw-numeric-spacing: ; --tw-numeric-fraction: ; --tw-ring-inset: ; --tw-ring-offset-width: 0px; --tw-ring-offset-color: #fff; --tw-ring-color: rgb(59 130 246 / 0.5); --tw-ring-offset-shadow: 0 0 #0000; --tw-ring-shadow: 0 0 #0000; --tw-shadow: 0 0 #0000; --tw-shadow-colored: 0 0 #0000; --tw-blur: ; --tw-brightness: ; --tw-contrast: ; --tw-grayscale: ; --tw-hue-rotate: ; --tw-invert: ; --tw-saturate: ; --tw-sepia: ; --tw-drop-shadow: ; --tw-backdrop-blur: ; --tw-backdrop-brightness: ; --tw-backdrop-contrast: ; --tw-backdrop-grayscale: ; --tw-backdrop-hue-rotate: ; --tw-backdrop-invert: ; --tw-backdrop-opacity: ; --tw-backdrop-saturate: ; --tw-backdrop-sepia: ; --tw-contain-size: ; --tw-contain-layout: ; --tw-contain-paint: ; --tw-contain-style: ; }',
'.spp-flk-root *::before, .spp-flk-root *::after { --tw-content: \'\'; }',
'',
'/* ===== 参考自身的组件规则 + 它用到的工具类 ===== */',
'.spp-flk-root .font-mono-chrono { font-family:var(--flk-font-mono); }',
'.spp-flk-root .font-horology { font-family:Georgia, "Times New Roman", "Songti SC", serif; }',
'.spp-flk-root .horology-dial-plate { background: radial-gradient(circle, rgba(13, 19, 32, 0.88) 0%, rgba(8, 12, 20, 0.94) 75%, rgba(4, 6, 11, 0.98) 100%); backdrop-filter: blur(36px) saturate(190%); border: 1px solid rgba(255, 255, 255, 0.22); box-shadow: 0 32px 90px rgba(0, 0, 0, 0.92), inset 0 1px 2px rgba(255, 255, 255, 0.35), inset 0 -1px 2px rgba(245, 158, 11, 0.12), 0 0 45px var(--flk-jewel-glow-soft); transition: box-shadow 0.6s cubic-bezier(0.16, 1, 0.3, 1); }',
'.spp-flk-root .horology-core-hub { background: radial-gradient(circle at 40% 30%, rgba(20, 28, 46, 0.94) 0%, rgba(9, 13, 22, 0.98) 100%); backdrop-filter: blur(28px); border: 1px solid rgba(255, 255, 255, 0.26); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.85), inset 0 1.5px 2px rgba(255, 255, 255, 0.4), 0 0 35px var(--flk-jewel-glow); transition: 0.5s cubic-bezier(0.16, 1, 0.3, 1); }',
'.spp-flk-root .chrono-node { background: rgba(11, 16, 26, 0.88); border: 1px solid rgba(255, 255, 255, 0.18); box-shadow: rgba(0, 0, 0, 0.6) 0px 4px 16px, rgba(255, 255, 255, 0.25) 0px 1px 1px inset; transition: 0.38s cubic-bezier(0.16, 1, 0.3, 1); }',
'.spp-flk-root .chrono-node:hover { transform: scale(1.18); border-color: rgba(255, 255, 255, 0.75); box-shadow: 0 0 22px var(--node-color, rgba(255, 255, 255, 0.5)); }',
'.spp-flk-root .chrono-node-active { transform: scale(1.22); border-color: rgb(255, 255, 255) !important; box-shadow: 0 0 32px var(--node-color, #ffffff), inset 0 0 10px rgba(255, 255, 255, 0.5) !important; }',
'.spp-flk-root .btn-prism-capsule { background: linear-gradient(145deg, rgba(26, 34, 52, 0.9) 0%, rgba(12, 16, 26, 0.98) 100%); border: 1px solid rgba(255, 255, 255, 0.32); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.7), inset 0 1px 1.5px rgba(255, 255, 255, 0.5), 0 0 18px var(--flk-jewel-glow); transition: 0.28s cubic-bezier(0.16, 1, 0.3, 1); }',
'.spp-flk-root .btn-prism-capsule:hover { transform: translateY(-2px) scale(1.04); border-color: rgba(255, 255, 255, 0.85); box-shadow: 0 14px 34px rgba(0, 0, 0, 0.85), inset 0 1px 2px #ffffff, 0 0 32px var(--flk-jewel-glow); }',
'.spp-flk-root .btn-prism-capsule:active { transform: translateY(1px) scale(0.98); }',
'.spp-flk-root .btn-titanium-tool { background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.16); backdrop-filter: blur(14px); transition: 0.22s; }',
'.spp-flk-root .btn-titanium-tool:hover { background: rgba(255, 255, 255, 0.12); border-color: rgba(255, 255, 255, 0.45); color: rgb(255, 255, 255); box-shadow: rgba(255, 255, 255, 0.1) 0px 0px 16px; }',
'@keyframes clock-orbit-cw { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }',
'@keyframes clock-orbit-ccw { 0% { transform: rotate(360deg); } 100% { transform: rotate(0deg); } }',
'.spp-flk-root .anim-ring-cw { animation: 180s linear 0s infinite normal none running clock-orbit-cw; }',
'.spp-flk-root .anim-ring-ccw { animation: 130s linear 0s infinite normal none running clock-orbit-ccw; }',
'.spp-flk-root .no-scrollbar::-webkit-scrollbar { display: none; }',
'.spp-flk-root .no-scrollbar { scrollbar-width: none; }',
'.spp-flk-root .pointer-events-none { pointer-events: none; }',
'.spp-flk-root .pointer-events-auto { pointer-events: auto; }',
'.spp-flk-root .fixed { position: fixed; }',
'.spp-flk-root .absolute { position: absolute; }',
'.spp-flk-root .relative { position: relative; }',
'.spp-flk-root .inset-0 { inset: 0px; }',
'.spp-flk-root .inset-1 { inset: 0.25rem; }',
'.spp-flk-root .inset-16 { inset: 4rem; }',
'.spp-flk-root .inset-2\\.5 { inset: 0.625rem; }',
'.spp-flk-root .inset-8 { inset: 2rem; }',
'.spp-flk-root .bottom-1\\.5 { bottom: 0.375rem; }',
'.spp-flk-root .bottom-16 { bottom: 4rem; }',
'.spp-flk-root .left-1\\.5 { left: 0.375rem; }',
'.spp-flk-root .left-1\\/2 { left: 50%; }',
'.spp-flk-root .right-0 { right: 0px; }',
'.spp-flk-root .right-1\\.5 { right: 0.375rem; }',
'.spp-flk-root .top-0 { top: 0px; }',
'.spp-flk-root .top-1 { top: 0.25rem; }',
'.spp-flk-root .top-1\\.5 { top: 0.375rem; }',
'.spp-flk-root .top-1\\/2 { top: 50%; }',
'.spp-flk-root .top-full { top: 100%; }',
'.spp-flk-root .-bottom-6 { bottom: -1.5rem; }',
'.spp-flk-root .z-0 { z-index: 0; }',
'.spp-flk-root .z-10 { z-index: 10; }',
'.spp-flk-root .z-20 { z-index: 20; }',
'.spp-flk-root .z-30 { z-index: 30; }',
'.spp-flk-root .z-50 { z-index: 50; }',
'.spp-flk-root .z-\\[100000\\] { z-index: 100000; }',
'.spp-flk-root .mx-auto { margin-left: auto; margin-right: auto; }',
'.spp-flk-root .my-1 { margin-top: 0.25rem; margin-bottom: 0.25rem; }',
'.spp-flk-root .mb-1 { margin-bottom: 0.25rem; }',
'.spp-flk-root .mb-2\\.5 { margin-bottom: 0.625rem; }',
'.spp-flk-root .mb-4 { margin-bottom: 1rem; }',
'.spp-flk-root .ml-1 { margin-left: 0.25rem; }',
'.spp-flk-root .mt-0\\.5 { margin-top: 0.125rem; }',
'.spp-flk-root .mt-2 { margin-top: 0.5rem; }',
'.spp-flk-root .line-clamp-1 { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; }',
'.spp-flk-root .flex { display: flex; }',
'.spp-flk-root .inline-flex { display: inline-flex; }',
'.spp-flk-root .grid { display: grid; }',
'.spp-flk-root .hidden { display: none; }',
'.spp-flk-root .h-1\\.5 { height: 0.375rem; }',
'.spp-flk-root .h-1\\/2 { height: 50%; }',
'.spp-flk-root .h-11 { height: 2.75rem; }',
'.spp-flk-root .h-14 { height: 3.5rem; }',
'.spp-flk-root .h-2 { height: 0.5rem; }',
'.spp-flk-root .h-2\\.5 { height: 0.625rem; }',
'.spp-flk-root .h-3 { height: 0.75rem; }',
'.spp-flk-root .h-3\\.5 { height: 0.875rem; }',
'.spp-flk-root .h-4 { height: 1rem; }',
'.spp-flk-root .h-56 { height: 14rem; }',
'.spp-flk-root .h-6 { height: 1.5rem; }',
'.spp-flk-root .h-\\[345px\\] { height: 345px; }',
'.spp-flk-root .h-full { height: 100%; }',
'.spp-flk-root .h-10 { height: 2.5rem; }',
'.spp-flk-root .h-8 { height: 2rem; }',
'.spp-flk-root .max-h-\\[85vh\\] { max-height: 85vh; }',
'.spp-flk-root .w-1\\.5 { width: 0.375rem; }',
'.spp-flk-root .w-11 { width: 2.75rem; }',
'.spp-flk-root .w-14 { width: 3.5rem; }',
'.spp-flk-root .w-2 { width: 0.5rem; }',
'.spp-flk-root .w-2\\.5 { width: 0.625rem; }',
'.spp-flk-root .w-3 { width: 0.75rem; }',
'.spp-flk-root .w-3\\.5 { width: 0.875rem; }',
'.spp-flk-root .w-36 { width: 9rem; }',
'.spp-flk-root .w-4 { width: 1rem; }',
'.spp-flk-root .w-56 { width: 14rem; }',
'.spp-flk-root .w-6 { width: 1.5rem; }',
'.spp-flk-root .w-\\[2px\\] { width: 2px; }',
'.spp-flk-root .w-\\[345px\\] { width: 345px; }',
'.spp-flk-root .w-full { width: 100%; }',
'.spp-flk-root .w-10 { width: 2.5rem; }',
'.spp-flk-root .w-8 { width: 2rem; }',
'.spp-flk-root .max-w-2xl { max-width: 42rem; }',
'.spp-flk-root .max-w-4xl { max-width: 56rem; }',
'.spp-flk-root .max-w-6xl { max-width: 72rem; }',
'.spp-flk-root .max-w-full { max-width: 100%; }',
'.spp-flk-root .flex-1 { flex: 1 1 0%; }',
'.spp-flk-root .origin-bottom { transform-origin: center bottom; }',
'.spp-flk-root .-translate-x-1\\/2 { --tw-translate-x: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .-translate-y-1\\/2 { --tw-translate-y: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .translate-y-2 { --tw-translate-y: 0.5rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .translate-y-3 { --tw-translate-y: 0.75rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .translate-x-1 { --tw-translate-x: 0.25rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .translate-y-0 { --tw-translate-y: 0px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .-rotate-90 { --tw-rotate: -90deg; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'@keyframes pulse { 50% { opacity: 0.5; } }',
'.spp-flk-root .animate-pulse { animation: 2s cubic-bezier(0.4, 0, 0.6, 1) 0s infinite normal none running pulse; }',
'@keyframes spin { 100% { transform: rotate(360deg); } }',
'.spp-flk-root .animate-spin { animation: 1s linear 0s infinite normal none running spin; }',
'.spp-flk-root .cursor-pointer { cursor: pointer; }',
'.spp-flk-root .grid-cols-1 { grid-template-columns: repeat(1, minmax(0px, 1fr)); }',
'.spp-flk-root .flex-col { flex-direction: column; }',
'.spp-flk-root .flex-wrap { flex-wrap: wrap; }',
'.spp-flk-root .items-center { align-items: center; }',
'.spp-flk-root .justify-end { justify-content: flex-end; }',
'.spp-flk-root .justify-center { justify-content: center; }',
'.spp-flk-root .justify-between { justify-content: space-between; }',
'.spp-flk-root .gap-1\\.5 { gap: 0.375rem; }',
'.spp-flk-root .gap-2 { gap: 0.5rem; }',
'.spp-flk-root .gap-3 { gap: 0.75rem; }',
'.spp-flk-root .gap-3\\.5 { gap: 0.875rem; }',
'.spp-flk-root .gap-4 { gap: 1rem; }',
'.spp-flk-root .gap-6 { gap: 1.5rem; }',
'.spp-flk-root .overflow-hidden { overflow: hidden; }',
'.spp-flk-root .overflow-y-auto { overflow-y: auto; }',
'.spp-flk-root .whitespace-nowrap { white-space: nowrap; }',
'.spp-flk-root .rounded-2xl { border-radius: 1rem; }',
'.spp-flk-root .rounded-3xl { border-radius: 1.5rem; }',
'.spp-flk-root .rounded-full { border-radius: 9999px; }',
'.spp-flk-root .rounded-lg { border-radius: 0.5rem; }',
'.spp-flk-root .rounded-xl { border-radius: 0.75rem; }',
'.spp-flk-root .border { border-width: 1px; }',
'.spp-flk-root .border-b { border-bottom-width: 1px; }',
'.spp-flk-root .border-t { border-top-width: 1px; }',
'.spp-flk-root .border-dashed { border-style: dashed; }',
'.spp-flk-root .border-amber-300 { --tw-border-opacity: 1; border-color: rgb(252 211 77 / var(--tw-border-opacity, 1)); }',
'.spp-flk-root .border-amber-400\\/25 { border-color: rgba(251, 191, 36, 0.25); }',
'.spp-flk-root .border-amber-400\\/40 { border-color: rgba(251, 191, 36, 0.4); }',
'.spp-flk-root .border-amber-400\\/70 { border-color: rgba(251, 191, 36, 0.7); }',
'.spp-flk-root .border-white\\/10 { border-color: rgba(255, 255, 255, 0.1); }',
'.spp-flk-root .border-white\\/15 { border-color: rgba(255, 255, 255, 0.15); }',
'.spp-flk-root .border-white\\/20 { border-color: rgba(255, 255, 255, 0.2); }',
'.spp-flk-root .border-white\\/30 { border-color: rgba(255, 255, 255, 0.3); }',
'.spp-flk-root .border-white\\/40 { border-color: rgba(255, 255, 255, 0.4); }',
'.spp-flk-root .border-white\\/25 { border-color: rgba(255, 255, 255, 0.25); }',
'.spp-flk-root .bg-\\[\\#05070c\\]\\/85 { background-color: rgba(5, 7, 12, 0.85); }',
'.spp-flk-root .bg-\\[\\#080d16\\]\\/90 { background-color: rgba(8, 13, 22, 0.9); }',
'.spp-flk-root .bg-\\[\\#090e18\\] { --tw-bg-opacity: 1; background-color: rgb(9 14 24 / var(--tw-bg-opacity, 1)); }',
'.spp-flk-root .bg-\\[\\#0a0f1a\\] { --tw-bg-opacity: 1; background-color: rgb(10 15 26 / var(--tw-bg-opacity, 1)); }',
'.spp-flk-root .bg-amber-400 { --tw-bg-opacity: 1; background-color: rgb(251 191 36 / var(--tw-bg-opacity, 1)); }',
'.spp-flk-root .bg-amber-500\\/10 { background-color: rgba(245, 158, 11, 0.1); }',
'.spp-flk-root .bg-black\\/60 { background-color: rgba(0, 0, 0, 0.6); }',
'.spp-flk-root .bg-black\\/85 { background-color: rgba(0, 0, 0, 0.85); }',
'.spp-flk-root .bg-black\\/90 { background-color: rgba(0, 0, 0, 0.9); }',
'.spp-flk-root .bg-white { --tw-bg-opacity: 1; background-color: rgb(255 255 255 / var(--tw-bg-opacity, 1)); }',
'.spp-flk-root .bg-white\\/10 { background-color: rgba(255, 255, 255, 0.1); }',
'.spp-flk-root .bg-white\\/5 { background-color: rgba(255, 255, 255, 0.05); }',
'.spp-flk-root .bg-white\\/\\[0\\.04\\] { background-color: rgba(255, 255, 255, 0.04); }',
'.spp-flk-root .bg-slate-400 { --tw-bg-opacity: 1; background-color: rgb(148 163 184 / var(--tw-bg-opacity, 1)); }',
'.spp-flk-root .bg-gradient-to-br { background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); }',
'.spp-flk-root .bg-gradient-to-t { background-image: linear-gradient(to top, var(--tw-gradient-stops)); }',
'.spp-flk-root .from-white { --tw-gradient-from: #fff var(--tw-gradient-from-position); --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }',
'.spp-flk-root .from-white\\/10 { --tw-gradient-from: rgb(255 255 255 / 0.1) var(--tw-gradient-from-position); --tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); }',
'.spp-flk-root .via-amber-200 { --tw-gradient-to: rgb(253 230 138 / 0) var(--tw-gradient-to-position); --tw-gradient-stops: var(--tw-gradient-from), #fde68a var(--tw-gradient-via-position), var(--tw-gradient-to); }',
'.spp-flk-root .to-transparent { --tw-gradient-to: transparent var(--tw-gradient-to-position); }',
'.spp-flk-root .p-0\\.5 { padding: 0.125rem; }',
'.spp-flk-root .p-2 { padding: 0.5rem; }',
'.spp-flk-root .p-3 { padding: 0.75rem; }',
'.spp-flk-root .p-4 { padding: 1rem; }',
'.spp-flk-root .p-5 { padding: 1.25rem; }',
'.spp-flk-root .p-3\\.5 { padding: 0.875rem; }',
'.spp-flk-root .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }',
'.spp-flk-root .px-2\\.5 { padding-left: 0.625rem; padding-right: 0.625rem; }',
'.spp-flk-root .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }',
'.spp-flk-root .px-3\\.5 { padding-left: 0.875rem; padding-right: 0.875rem; }',
'.spp-flk-root .px-4 { padding-left: 1rem; padding-right: 1rem; }',
'.spp-flk-root .px-5 { padding-left: 1.25rem; padding-right: 1.25rem; }',
'.spp-flk-root .px-6 { padding-left: 1.5rem; padding-right: 1.5rem; }',
'.spp-flk-root .py-0\\.5 { padding-top: 0.125rem; padding-bottom: 0.125rem; }',
'.spp-flk-root .py-1 { padding-top: 0.25rem; padding-bottom: 0.25rem; }',
'.spp-flk-root .py-1\\.5 { padding-top: 0.375rem; padding-bottom: 0.375rem; }',
'.spp-flk-root .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }',
'.spp-flk-root .py-2\\.5 { padding-top: 0.625rem; padding-bottom: 0.625rem; }',
'.spp-flk-root .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; }',
'.spp-flk-root .py-4 { padding-top: 1rem; padding-bottom: 1rem; }',
'.spp-flk-root .pb-3 { padding-bottom: 0.75rem; }',
'.spp-flk-root .pb-4 { padding-bottom: 1rem; }',
'.spp-flk-root .pt-3 { padding-top: 0.75rem; }',
'.spp-flk-root .pt-4 { padding-top: 1rem; }',
'.spp-flk-root .text-left { text-align: left; }',
'.spp-flk-root .text-center { text-align: center; }',
'.spp-flk-root .text-right { text-align: right; }',
'.spp-flk-root .text-\\[10px\\] { font-size: 10px; }',
'.spp-flk-root .text-\\[11px\\] { font-size: 11px; }',
'.spp-flk-root .text-\\[9px\\] { font-size: 9px; }',
'.spp-flk-root .text-base { font-size: 1rem; line-height: 1.5rem; }',
'.spp-flk-root .text-sm { font-size: 0.875rem; line-height: 1.25rem; }',
'.spp-flk-root .text-xl { font-size: 1.25rem; line-height: 1.75rem; }',
'.spp-flk-root .text-xs { font-size: 0.75rem; line-height: 1rem; }',
'.spp-flk-root .font-bold { font-weight: 700; }',
'.spp-flk-root .font-extrabold { font-weight: 800; }',
'.spp-flk-root .font-medium { font-weight: 500; }',
'.spp-flk-root .font-normal { font-weight: 400; }',
'.spp-flk-root .font-semibold { font-weight: 600; }',
'.spp-flk-root .uppercase { text-transform: uppercase; }',
'.spp-flk-root .tracking-\\[0\\.24em\\] { letter-spacing: 0.24em; }',
'.spp-flk-root .tracking-tight { letter-spacing: -0.025em; }',
'.spp-flk-root .tracking-wide { letter-spacing: 0.025em; }',
'.spp-flk-root .tracking-wider { letter-spacing: 0.05em; }',
'.spp-flk-root .tracking-widest { letter-spacing: 0.1em; }',
'.spp-flk-root .text-amber-300 { --tw-text-opacity: 1; color: rgb(252 211 77 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .text-amber-300\\/80 { color: rgba(252, 211, 77, 0.8); }',
'.spp-flk-root .text-black { --tw-text-opacity: 1; color: rgb(0 0 0 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .text-slate-200 { --tw-text-opacity: 1; color: rgb(226 232 240 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .text-slate-300 { --tw-text-opacity: 1; color: rgb(203 213 225 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .text-slate-400 { --tw-text-opacity: 1; color: rgb(148 163 184 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .text-slate-500 { --tw-text-opacity: 1; color: rgb(100 116 139 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .text-white { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .text-white\\/95 { color: rgba(255, 255, 255, 0.95); }',
'.spp-flk-root .opacity-0 { opacity: 0; }',
'.spp-flk-root .opacity-100 { opacity: 1; }',
'.spp-flk-root .shadow-2xl { --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-\\[0_0_10px_\\#f59e0b\\] { --tw-shadow: 0 0 10px #f59e0b; --tw-shadow-colored: 0 0 10px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-\\[0_0_12px_var\\(--flk-jewel-primary\\)\\] { --tw-shadow: 0 0 12px var(--flk-jewel-primary); --tw-shadow-colored: 0 0 12px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-\\[0_0_14px_var\\(--flk-jewel-primary\\)\\] { --tw-shadow: 0 0 14px var(--flk-jewel-primary); --tw-shadow-colored: 0 0 14px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-\\[0_0_25px_rgba\\(255\\,255\\,255\\,0\\.06\\)\\] { --tw-shadow: 0 0 25px rgba(255,255,255,0.06); --tw-shadow-colored: 0 0 25px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-\\[0_10px_30px_rgba\\(255\\,255\\,255\\,0\\.4\\)\\] { --tw-shadow: 0 10px 30px rgba(255,255,255,0.4); --tw-shadow-colored: 0 10px 30px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-\\[0_12px_28px_rgba\\(0\\,0\\,0\\,0\\.6\\)\\] { --tw-shadow: 0 12px 28px rgba(0,0,0,0.6); --tw-shadow-colored: 0 12px 28px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-\\[0_30px_100px_rgba\\(0\\,0\\,0\\,0\\.95\\)\\] { --tw-shadow: 0 30px 100px rgba(0,0,0,0.95); --tw-shadow-colored: 0 30px 100px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-lg { --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-md { --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .shadow-sm { --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); }',
'.spp-flk-root .drop-shadow-\\[0_0_16px_rgba\\(255\\,255\\,255\\,0\\.4\\)\\] { --tw-drop-shadow: drop-shadow(0 0 16px rgba(255,255,255,0.4)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); }',
'.spp-flk-root .drop-shadow-\\[0_0_8px_rgba\\(245\\,158\\,11\\,0\\.25\\)\\] { --tw-drop-shadow: drop-shadow(0 0 8px rgba(245,158,11,0.25)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); }',
'.spp-flk-root .drop-shadow-\\[0_0_8px_var\\(--flk-jewel-primary\\)\\] { --tw-drop-shadow: drop-shadow(0 0 8px var(--flk-jewel-primary)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); }',
'.spp-flk-root .drop-shadow-\\[0_1px_3px_rgba\\(0\\,0\\,0\\,0\\.8\\)\\] { --tw-drop-shadow: drop-shadow(0 1px 3px rgba(0,0,0,0.8)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); }',
'.spp-flk-root .drop-shadow-\\[0_2px_10px_rgba\\(0\\,0\\,0\\,0\\.9\\)\\] { --tw-drop-shadow: drop-shadow(0 2px 10px rgba(0,0,0,0.9)); filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); }',
'.spp-flk-root .backdrop-blur-2xl { --tw-backdrop-blur: blur(40px); backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); }',
'.spp-flk-root .backdrop-blur-md { --tw-backdrop-blur: blur(12px); backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); }',
'.spp-flk-root .transition-all { transition-property: all; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }',
'.spp-flk-root .transition-colors { transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, -webkit-text-decoration-color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }',
'.spp-flk-root .transition-transform { transition-property: transform; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }',
'.spp-flk-root .transition-opacity { transition-property: opacity; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; }',
'.spp-flk-root .duration-100 { transition-duration: 100ms; }',
'.spp-flk-root .duration-200 { transition-duration: 200ms; }',
'.spp-flk-root .duration-300 { transition-duration: 300ms; }',
'.spp-flk-root .duration-500 { transition-duration: 500ms; }',
'.spp-flk-root .duration-700 { transition-duration: 700ms; }',
'.spp-flk-root .ease-linear { transition-timing-function: linear; }',
'.spp-flk-root .ease-out { transition-timing-function: cubic-bezier(0, 0, 0.2, 1); }',
'.spp-flk-root .hover\\:scale-\\[1\\.02\\]:hover { --tw-scale-x: 1.02; --tw-scale-y: 1.02; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .hover\\:border-white\\/30:hover { border-color: rgba(255, 255, 255, 0.3); }',
'.spp-flk-root .hover\\:bg-white\\/10:hover { background-color: rgba(255, 255, 255, 0.1); }',
'.spp-flk-root .hover\\:bg-white\\/\\[0\\.08\\]:hover { background-color: rgba(255, 255, 255, 0.08); }',
'.spp-flk-root .hover\\:text-white:hover { --tw-text-opacity: 1; color: rgb(255 255 255 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .active\\:scale-95:active { --tw-scale-x: .95; --tw-scale-y: .95; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .group:hover .spp-flk-root .group-hover\\:pointer-events-auto { pointer-events: auto; }',
'.spp-flk-root .group\\/btn:hover .spp-flk-root .group-hover\\/btn\\:translate-x-1 { --tw-translate-x: 0.25rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .group:hover .spp-flk-root .group-hover\\:translate-y-0 { --tw-translate-y: 0px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .group:hover .spp-flk-root .group-hover\\:translate-x-1 { --tw-translate-x: 0.25rem; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .group:hover .spp-flk-root .group-hover\\:scale-105 { --tw-scale-x: 1.05; --tw-scale-y: 1.05; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); }',
'.spp-flk-root .group:hover .spp-flk-root .group-hover\\:text-amber-300 { --tw-text-opacity: 1; color: rgb(252 211 77 / var(--tw-text-opacity, 1)); }',
'.spp-flk-root .group:hover .spp-flk-root .group-hover\\:opacity-100 { opacity: 1; }',
'.spp-flk-root .sm\\:inline { display: inline; }',
'.spp-flk-root .sm\\:grid-cols-2 { grid-template-columns: repeat(2, minmax(0px, 1fr)); }',
'.spp-flk-root .sm\\:flex-row { flex-direction: row; }',
'.spp-flk-root .sm\\:justify-center { justify-content: center; }',
'.spp-flk-root .sm\\:p-5 { padding: 1.25rem; }',
'.spp-flk-root .sm\\:p-6 { padding: 1.5rem; }',
'.spp-flk-root .sm\\:p-8 { padding: 2rem; }',
'.spp-flk-root .sm\\:px-8 { padding-left: 2rem; padding-right: 2rem; }',
'.spp-flk-root .sm\\:text-center { text-align: center; }',
'.spp-flk-root .sm\\:text-2xl { font-size: 1.5rem; line-height: 2rem; }',
'.spp-flk-root .sm\\:text-base { font-size: 1rem; line-height: 1.5rem; }',
'.spp-flk-root .sm\\:text-lg { font-size: 1.125rem; line-height: 1.75rem; }',
'.spp-flk-root .sm\\:text-sm { font-size: 0.875rem; line-height: 1.25rem; }',
'.spp-flk-root .lg\\:grid-cols-3 { grid-template-columns: repeat(3, minmax(0px, 1fr)); }',
'',
].join("\n");
const FLK_SEC_CSS = [
'/* ── 「站外导航」分区外壳(只有这一小块是新写的样式) ── */',
'#spp_t_flk.t { margin: 0 0 8px; overflow: visible !important; padding: 0 !important; border: 0 none !important; }',
'html.spp-hm-star #main div.t#spp_t_flk { background: transparent !important; border-color: transparent !important; box-shadow: none !important; }',
'#spp_t_flk .spp-flk-host { padding: 8px 16px 16px; display: flex; justify-content: center; }',
'',
'/* ── 2.57.193:用户点名改的三处(与站外导航分区无关的两条也放这里,',
'   因为它们都是「本轮新增的样式」,统一在这一块里好找) ── */',
'/* ① 彩色标签不要(其一):组件底栏「切站间隔」里那枚激活的黄色胶囊。',
'   类名是 Tailwind 的三件套,取状态只能按这套类名点(脚本切档时加/删的就是它们)。',
'   改成中性:半透明白底 + 白字 + 浅描边,保留「哪一档是当前」的可读性。 */',
'.spp-flk-root .speed-toggle.bg-amber-400 { background: rgba(255,255,255,.16) !important; color: #fff !important;',
'  border-color: rgba(255,255,255,.3) !important; box-shadow: none !important; }',
'/* ② 彩色标签不要(其二):事务受理卡片里「今日」那一列原本是极光翡翠绿(#10b981)。',
'   数值回到和其它两列一致的白,标签回到同一档灰。 */',
'.spp-cm-card__stat.is-hot .v { color: #fff !important; }',
'.spp-cm-card__stat.is-hot .d { color: #64748b !important; opacity: 1 !important; }',
'/* ③ 人民囧府:标题条收成居中一条,长度取在「卡片 540」与「组件底栏 672」之间 = 600;文字跟着居中。',
'   那一格是表格单元格(display:table-cell,宽度跟着整张表 1399 走),改成 block 才能给固定宽度;',
'   该行里只有这一个格子,改成 block 不影响下方内容行(真站实测:内容仍是 1379 / 卡片仍 540 居中)。',
'   真站实测:条子 600(含内边距,box-sizing 已按 border-box 收住)、文字居中、与下方间距 14px 不变。 */',
'html.spp-hm-on div#t_1 > table > tbody > tr > th.h.spp-uvbtn { display: block !important; box-sizing: border-box !important;',
'  width: 600px !important; margin: 0 auto !important; text-align: center !important; }'
].join('\n');
const FLK_SEC_ID = 'spp_t_flk';
function flkBuildSection(links) {
const sec = document.createElement('div');
sec.className = 't';
sec.id = FLK_SEC_ID;
sec.innerHTML = '<div class="spp-flk-host"></div>';
return sec;
}
function mountFriendSection(opt) {
opt = opt || {};
if (document.getElementById(FLK_SEC_ID)) return null;
const t1 = document.getElementById('t_1');
if (!t1 || !t1.parentNode) return null;
const links = pickFriendLinks();
if (!links || links.length < 3) {
const tries = (opt.tries || 0) + 1;
if (tries <= 6) setTimeout(function () { const o = {}; for (const k in opt) o[k] = opt[k]; o.tries = tries; mountFriendSection(o); }, 500);
return null;
}
if (typeof buildFriendChrono !== 'function') {
safeInit('首页美化·友情链接卡片(降级)', renderFriendCards);
return null;
}
const sec = flkBuildSection(links);
t1.parentNode.insertBefore(sec, t1);
const host = sec.querySelector('.spp-flk-host');
const api = buildFriendChrono(links, {});
host.appendChild(api.el);
api.start();
api.resize();
if (typeof opt.onReady === 'function') opt.onReady(api, sec);
return api;
}
var FLK_STATIONS = {
'hacg.me':          { color: '#a855f7', colorSec: '#7c3aed', glow: 'rgba(168, 85, 247, 0.45)', badge: '琉' },
'gmgard.moe':       { color: '#6366f1', colorSec: '#818cf8', glow: 'rgba(99, 102, 241, 0.45)', badge: '绅' },
'cangku.moe':       { color: '#9333ea', colorSec: '#c084fc', glow: 'rgba(147, 51, 234, 0.45)', badge: '绅' },
'share.acgnx.cc':   { color: '#f59e0b', colorSec: '#fb923c', glow: 'rgba(245, 158, 11, 0.45)', badge: '末' },
'acgn.zone':        { color: '#0284c7', colorSec: '#38bdf8', glow: 'rgba(56, 189, 248, 0.45)', badge: 'A' },
'sshs.pw':          { color: '#8b5cf6', colorSec: '#c084fc', glow: 'rgba(139, 92, 246, 0.45)', badge: '绅' },
'skunkgirl.moe':    { color: '#10b981', colorSec: '#34d399', glow: 'rgba(16, 185, 129, 0.45)', badge: '臭' },
'mcseas.club':      { color: '#2563eb', colorSec: '#60a5fa', glow: 'rgba(37, 99, 235, 0.45)', badge: '混' },
'acg123.co':        { color: '#a855f7', colorSec: '#e879f9', glow: 'rgba(168, 85, 247, 0.45)', badge: '二' },
'moeli-desu.com':   { color: '#ec4899', colorSec: '#f472b6', glow: 'rgba(236, 72, 153, 0.45)', badge: '梦' },
'asmr.one':         { color: '#6366f1', colorSec: '#a5b4fc', glow: 'rgba(99, 102, 241, 0.45)', badge: 'A' },
'alhs.live':        { color: '#06b6d4', colorSec: '#67e8f9', glow: 'rgba(6, 182, 212, 0.45)', badge: '艾' },
'morian.icu':       { color: '#9333ea', colorSec: '#e879f9', glow: 'rgba(147, 51, 234, 0.45)', badge: 'M' },
'xiayuge.top':      { color: '#d97706', colorSec: '#fbbf24', glow: 'rgba(217, 119, 6, 0.45)', badge: '夏' },
'joyacg.com':       { color: '#8b5cf6', colorSec: '#d8b4fe', glow: 'rgba(139, 92, 246, 0.45)', badge: 'J' }
};
var FLK_PALETTE = [
{ color: '#14b8a6', colorSec: '#5eead4', glow: 'rgba(20, 184, 166, 0.45)', badge: '' },
{ color: '#f43f5e', colorSec: '#fda4af', glow: 'rgba(244, 63, 94, 0.45)', badge: '' },
{ color: '#f97316', colorSec: '#fdba74', glow: 'rgba(249, 115, 22, 0.45)', badge: '' },
{ color: '#0ea5e9', colorSec: '#7dd3fc', glow: 'rgba(14, 165, 233, 0.45)', badge: '' },
{ color: '#a3e635', colorSec: '#d9f99d', glow: 'rgba(163, 230, 53, 0.45)', badge: '' },
{ color: '#d946ef', colorSec: '#f0abfc', glow: 'rgba(217, 70, 239, 0.45)', badge: '' }
];
var FLK_DEFAULT_DIAL = 630;
function buildFriendChrono(links, opt) {
opt = opt || {};
var RADIAL_PANEL = [
'radial-gradient(circle at 50% 50%, rgba(13, 19, 32, 0.88) 0%,',
' rgba(8, 12, 20, 0.94) 75%, rgba(4, 6, 11, 0.98) 100%)'
].join('');
var NODE_BASE = [
'absolute -translate-x-1/2 -translate-y-1/2 flex flex-col items-center',
' justify-center cursor-pointer group transition-all duration-300'
].join('');
var NODE_TOOLTIP = [
'absolute -bottom-6 text-[10px] font-mono-chrono text-white font-bold',
' opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none',
' whitespace-nowrap bg-black/90 px-2 py-0.5 rounded-full border border-white/30 shadow-md node-name-tip'
].join('');
var CARD_CLASS = [
'p-3.5 rounded-2xl bg-white/[0.04] hover:bg-white/[0.08] border border-white/10',
' hover:border-white/30 transition-all cursor-pointer flex items-center',
' justify-between group shadow-sm'
].join('');
var TOAST_BASE = [
'px-5 py-2.5 rounded-full bg-white text-black font-bold text-xs font-mono-chrono',
' shadow-[0_10px_30px_rgba(255,255,255,0.4)] transition-all duration-300'
].join(' ');
var PIN_CLASSES = [
'bg-amber-400', 'text-black', 'font-bold', 'border', 'border-amber-300', 'shadow-sm'
];
var FREQ_CLASSES = [
'px-2.5', 'py-1', 'rounded-lg', 'text-[11px]', 'text-slate-400',
'hover:text-white', 'transition-colors'
];
var SVG_NS = 'http://www.w3.org/2000/svg';
var ID_PREFIX = 'spp-flk-';
var FADE_MS = 120;
var TOAST_MS = 1800;
var CLOCK_MS = 35;
var sppFlkIndex = 0;
var sppFlkRunning = false;
var sppFlkUserStopped = false;
var sppFlkInView = true;
var sppFlkHover = false;
var sppFlkWheelLock = false;
var sppFlkTheme = 'jewel';
var sppFlkPausedPassed = 0;
var sppFlkInterval = 4500;
var sppFlkStations = [];
var sppFlkNodes = [];
var sppFlkCycleStamp = 0;
var sppFlkLastClock = 0;
var sppFlkFadeTimer = null;
var sppFlkCopyTimer = null;
var sppFlkToastTimer = null;
var sppFlkRaf = null;
var sppFlkObserver = null;
var sppFlkResizeObserver = null;
function pad2(n) {
return n < 10 ? '0' + n : '' + n;
}
function strOr(v, fb) {
return (typeof v === 'string' && v) ? v : (fb || '');
}
function owns(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}
function targetPx(v, w) {
var n = parseFloat(v);
if (!isFinite(n)) return 0;
return (n / 100) * w;
}
function normalizeHost(v) {
var s = strOr(v, '');
if (!s) return '';
s = s.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//, '');
s = s.replace(/^\/\//, '');
s = s.split('/')[0].split('?')[0].split('#')[0];
s = s.replace(/^www\./i, '');
s = s.toLowerCase();
return s;
}
function badgeFromText(t) {
var s = strOr(t, '');
if (!s) return '?';
var c = s.charAt(0);
if (/[\u3400-\u9fff\uf900-\ufaff]/.test(c)) return c;
return c.toUpperCase();
}
function stationBadge(name, host) {
var key = normalizeHost(host);
if (key && owns(FLK_STATIONS, key) && FLK_STATIONS[key].badge) return FLK_STATIONS[key].badge;
return badgeFromText(name);
}
function targetPercent(i, total) {
if (total < 2) return 0;
return (100 * i) / (total - 1);
}
function pointerAngleDeg(i, total) {
if (!(total > 0)) return 0;
return (360 * i) / total;
}
var sppFlkPointerDeg = null;
function writePointerDeg(targetDeg) {
var prev = sppFlkPointerDeg;
if (prev === null) {
sppFlkPointerDeg = targetDeg;
} else {
var delta = ((targetDeg - prev) % 360 + 540) % 360 - 180;
sppFlkPointerDeg = prev + delta;
}
var d = Math.round(sppFlkPointerDeg * 1000) / 1000;
if (pointerFan) pointerFan.style.transform = 'rotate(' + d + 'deg)';
if (pointerNeedle) pointerNeedle.style.transform = 'translateX(-50%) rotate(' + d + 'deg)';
return d;
}
function normalizeInput(list) {
var out = [];
var realList = (list && typeof list.length === 'number') ? list : [];
var total = realList.length;
var i;
for (i = 0; i < total; i++) {
var raw = realList[i] || {};
var host = normalizeHost(raw.host);
var href = strOr(raw.href, '');
var name = strOr(raw.name, '');
if (!name) name = host || href;
if (host && !href) href = 'https://' + host;
if (!host && href) host = normalizeHost(href);
if (!host && name) host = normalizeHost(name);
if (!name) name = '站点 ' + (i + 1);
var spec = (host && owns(FLK_STATIONS, host)) ? FLK_STATIONS[host] : null;
var offset = 0;
if (!spec) {
offset = FLK_PALETTE.length ? (i % FLK_PALETTE.length) : 0;
spec = FLK_PALETTE.length ? FLK_PALETTE[offset] : {
color: '#a855f7', colorSec: '#7c3aed', glow: 'rgba(168, 85, 247, 0.45)', badge: ''
};
}
out.push({
name: name,
host: host,
href: href || 'https://' + host,
badge: stationBadge(name, host),
color: spec.color,
colorSec: spec.colorSec,
glow: spec.glow,
offset: offset
});
}
return out;
}
var el = document.createElement('div');
el.className = 'spp-flk-root';
el.id = 'spp-flk-root';
el.setAttribute('tabindex', '0');
el.style.setProperty('position', 'relative');
el.style.setProperty('z-index', '10');
el.style.setProperty('--spp-flk-dial', FLK_DEFAULT_DIAL + 'px');
el.style.setProperty('--flk-jewel-primary', '#a855f7');
el.style.setProperty('--flk-jewel-secondary', '#6366f1');
el.style.setProperty('--flk-jewel-glow', 'rgba(168, 85, 247, 0.38)');
el.style.setProperty('--flk-jewel-glow-soft', 'rgba(99, 102, 241, 0.16)');
el.innerHTML = [
'<header class="relative z-20 w-full max-w-6xl px-4 sm:px-8 pt-4 pb-3 flex flex-wrap items-center justify-between gap-4 border-b border-white/10 bg-[#05070c]/85 backdrop-blur-2xl">',
'  <div class="flex items-center gap-3.5">',
'    <div class="relative w-11 h-11 rounded-2xl bg-gradient-to-br from-white/10 to-transparent border border-white/20 flex items-center justify-center shadow-lg">',
'      <div class="w-6 h-6 rounded-full border border-dashed border-amber-400/70 animate-spin" style="animation-duration: 25s;"></div>',
'      <div class="w-2 h-2 rounded-full absolute shadow-[0_0_10px_#f59e0b]" style="background-color: var(--flk-jewel-primary);"></div>',
'    </div>',
'    <div>',
'      <div class="flex items-center gap-2">',
'        <span class="text-xs uppercase tracking-[0.24em] text-white/95 font-mono-chrono font-bold">站外导航</span>',
'        <span class="text-[9px] px-2 py-0.5 rounded-full border border-amber-400/40 text-amber-300 font-mono-chrono bg-amber-500/10 font-semibold"',
'              id="spp-flk-station-count">0 个站外站点</span>',
'        <span class="spp-flk-hint text-[9px] px-2 py-0.5 rounded-full">点击直达 · 均为站外</span>',
'      </div>',
'      <h1 class="text-sm sm:text-base font-bold tracking-wide text-white flex items-center gap-2 mt-0.5">',
'        <span>晶曜星轨</span>',
'        <span class="text-xs font-normal text-slate-400 font-mono-chrono">· 天文天体导航仪</span>',
'      </h1>',
'    </div>',
'  </div>',
'  <div class="flex items-center gap-6">',
'    <div class="text-right sm:text-center">',
'      <div class="text-[10px] text-slate-400 font-mono-chrono tracking-widest flex items-center justify-end sm:justify-center gap-1.5">',
'        <span class="w-1.5 h-1.5 rounded-full bg-amber-400 animate-pulse"></span>',
'        <span id="spp-flk-telemetry-date" class="font-bold text-slate-200 tracking-wider">0000.00.00</span>',
'        <span class="text-slate-500 font-mono-chrono">SIDEREAL</span>',
'      </div>',
'      <div id="spp-flk-telemetry-clock" class="text-xl sm:text-2xl font-mono-chrono font-extrabold tracking-widest text-white drop-shadow-[0_0_16px_rgba(255,255,255,0.4)]">',
'        00:00:00<span class="text-sm text-amber-300/80 font-medium ml-1">.00</span>',
'      </div>',
'    </div>',
'  </div>',
'  <div class="flex items-center gap-2">',
'    <button type="button" id="spp-flk-toggle-list-btn" class="btn-titanium-tool px-3 py-1.5 rounded-xl text-white text-xs font-mono-chrono font-semibold flex items-center gap-1.5">',
'      <svg class="w-3.5 h-3.5 text-amber-300" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg>',
'      <span id="spp-flk-atlas-label">星图矩阵</span>',
'    </button>',
'  </div>',
'</header>',
'<main class="relative z-10 flex-1 w-full flex flex-col items-center justify-center p-2 sm:p-5 overflow-hidden">',
'  <div id="spp-flk-chrono-container" class="relative flex items-center justify-center"',
'       style="width: var(--spp-flk-dial); height: var(--spp-flk-dial);">',
'    <div class="absolute inset-0 rounded-full horology-dial-plate pointer-events-none"></div>',
'    <svg id="spp-flk-dial-ticks-svg" class="absolute inset-0 w-full h-full pointer-events-none drop-shadow-[0_0_8px_rgba(245,158,11,0.25)]"></svg>',
'    <div class="absolute inset-1 sm:inset-2.5 flk-ring-a rounded-full border border-amber-400/25 anim-ring-cw pointer-events-none">',
'      <div class="absolute top-1.5 left-1/2 -translate-x-1/2 text-[9px] font-mono-chrono text-amber-300 font-bold tracking-widest bg-black/90 px-2 py-0.5 rounded-full border border-amber-400/40 shadow-md">N · 000°</div>',
'      <div class="absolute bottom-1.5 left-1/2 -translate-x-1/2 text-[9px] font-mono-chrono text-amber-300 font-bold tracking-widest bg-black/90 px-2 py-0.5 rounded-full border border-amber-400/40 shadow-md">S · 180°</div>',
'      <div class="absolute left-1.5 top-1/2 -translate-y-1/2 text-[9px] font-mono-chrono text-amber-300 font-bold tracking-widest bg-black/90 px-2 py-0.5 rounded-full border border-amber-400/40 shadow-md">W · 270°</div>',
'      <div class="absolute right-1.5 top-1/2 -translate-y-1/2 text-[9px] font-mono-chrono text-amber-300 font-bold tracking-widest bg-black/90 px-2 py-0.5 rounded-full border border-amber-400/40 shadow-md">E · 090°</div>',
'    </div>',
'    <div class="absolute inset-8 sm:inset-12 flk-ring-b rounded-full border border-dashed border-white/20 anim-ring-ccw pointer-events-none"></div>',
'    <div class="absolute inset-16 sm:inset-20 flk-ring-c rounded-full border border-white/30 shadow-[0_0_25px_rgba(255,255,255,0.06)] pointer-events-none"></div>',
'    <div id="spp-flk-pointer-layer" class="absolute inset-0 rounded-full pointer-events-none z-10">',
'      <div id="spp-flk-pointer-fan" class="absolute inset-0 rounded-full transition-transform duration-500 ease-out"',
'           style="background: conic-gradient(from 0deg, transparent 0deg, transparent 336deg, rgba(255, 255, 255, 0.02) 345deg, var(--flk-jewel-glow) 360deg);"></div>',
'      <div id="spp-flk-pointer-needle" class="absolute top-0 left-1/2 -translate-x-1/2 w-[2px] h-1/2 origin-bottom bg-gradient-to-t from-white via-amber-200 to-transparent transition-transform duration-500 ease-out shadow-[0_0_14px_var(--flk-jewel-primary)]">',
'        <div class="absolute top-1 left-1/2 -translate-x-1/2 w-2.5 h-2.5 rounded-full border border-amber-300 shadow-[0_0_12px_var(--flk-jewel-primary)]" style="background-color: var(--flk-jewel-primary);"></div>',
'      </div>',
'    </div>',
'    <div id="spp-flk-orbital-nodes-container" class="absolute inset-0 z-20 pointer-events-auto"></div>',
'    <div id="spp-flk-center-viewport" class="relative z-30 w-56 h-56 sm:w-64 sm:h-64 md:w-72 md:h-72 rounded-full horology-core-hub flex flex-col items-center justify-center p-4 sm:p-6 text-center cursor-pointer transition-all duration-300 hover:scale-[1.02] group">',
'      <svg class="absolute inset-0 w-full h-full -rotate-90 pointer-events-none" viewBox="0 0 100 100">',
'        <circle id="spp-flk-countdown-arc" cx="50" cy="50" r="48.5" stroke="var(--flk-jewel-primary)" stroke-width="2.5" fill="none" stroke-dasharray="304.73" stroke-dashoffset="304.73" class="drop-shadow-[0_0_8px_var(--flk-jewel-primary)]"></circle>',
'      </svg>',
'      <div class="absolute inset-2.5 rounded-full border border-white/10 pointer-events-none"></div>',
'      <div class="relative my-1">',
'        <div id="spp-flk-site-logo-badge" class="w-14 h-14 rounded-2xl border border-white/40 flex items-center justify-center text-xl sm:text-2xl font-bold text-white shadow-[0_12px_28px_rgba(0,0,0,0.6)] backdrop-blur-md transition-all duration-300 group-hover:scale-105"',
'             style="background: linear-gradient(135deg, var(--flk-jewel-primary), var(--flk-jewel-secondary)); box-shadow: 0 0 20px var(--flk-jewel-glow);">琉</div>',
'      </div>',
'      <h2 id="spp-flk-site-display-name" class="text-xl sm:text-2xl md:text-3xl font-extrabold tracking-wide text-white drop-shadow-[0_2px_10px_rgba(0,0,0,0.9)] transition-all duration-300 line-clamp-1 max-w-full px-2 mt-0.5">琉璃神社</h2>',
'      <p id="spp-flk-site-domain-name" class="text-xs sm:text-sm font-mono-chrono font-medium text-slate-300 tracking-wider mt-0.5 mb-2.5">hacg.me</p>',
'      <a id="spp-flk-site-direct-anchor" href="https://hacg.me" target="_blank" rel="noopener noreferrer"',
'         class="btn-prism-capsule relative z-10 px-6 py-2 rounded-full text-xs font-bold tracking-wider flex items-center gap-2 group/btn text-white">',
'        <span class="text-white drop-shadow-[0_1px_3px_rgba(0,0,0,0.8)]">直达访问</span>',
'        <div class="w-4 h-4 rounded-full flex items-center justify-center bg-white/10 border border-white/20 group-hover/btn:translate-x-1 transition-transform" style="color: var(--flk-jewel-primary);">',
'          <svg class="w-2.5 h-2.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M13.5 4.5L21 12m0 0l-7.5 7.5M21 12H3"></path></svg>',
'        </div>',
'      </a>',
'    </div>',
'  </div>',
'</main>',
'<footer class="relative z-20 w-full max-w-2xl px-4 py-3 mb-4 flex flex-col sm:flex-row items-center justify-between gap-3 bg-[#080d16]/90 border border-white/15 backdrop-blur-2xl rounded-2xl mx-auto shadow-2xl">',
'  <div class="flex items-center gap-2">',
'    <button type="button" id="spp-flk-prev-site-btn" class="btn-titanium-tool p-2 rounded-xl text-white transition-all active:scale-95 shadow-sm" title="上一个站点 (方向键左)">',
'      <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path></svg>',
'    </button>',
'    <button type="button" id="spp-flk-play-pause-btn" class="btn-titanium-tool px-4 py-2 rounded-xl text-white transition-all flex items-center gap-2 text-xs font-mono-chrono font-semibold active:scale-95 shadow-sm">',
'      <svg id="spp-flk-play-icon-svg" class="w-3.5 h-3.5 text-white hidden" fill="currentColor" viewBox="0 0 20 20"><path d="M6.3 2.841A1.5 1.5 0 004 4.11v11.78a1.5 1.5 0 002.3 1.269l9.344-5.89a1.5 1.5 0 000-2.538L6.3 2.84z"></path></svg>',
'      <svg id="spp-flk-pause-icon-svg" class="w-3.5 h-3.5 text-amber-300" fill="currentColor" viewBox="0 0 20 20"><path d="M5.75 3a.75.75 0 00-.75.75v12.5c0 .414.336.75.75.75h1.5a.75.75 0 00.75-.75V3.75A.75.75 0 007.25 3h-1.5zM12.75 3a.75.75 0 00-.75.75v12.5c0 .414.336.75.75.75h1.5a.75.75 0 00.75-.75V3.75a.75.75 0 00-.75-.75h-1.5z"></path></svg>',
'      <span id="spp-flk-play-text">暂停轮巡</span>',
'    </button>',
'    <button type="button" id="spp-flk-next-site-btn" class="btn-titanium-tool p-2 rounded-xl text-white transition-all active:scale-95 shadow-sm" title="下一个站点 (方向键右)">',
'      <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path></svg>',
'    </button>',
'  </div>',
'  <div class="flex items-center gap-2 text-xs font-mono-chrono">',
'    <span class="text-slate-400 text-[11px] font-medium">切站间隔:</span>',
'    <div class="inline-flex rounded-xl p-0.5 bg-black/60 border border-white/10">',
'      <button type="button" data-speed="3000" class="speed-toggle px-2.5 py-1 rounded-lg text-[11px] text-slate-400 hover:text-white transition-colors">3s</button>',
'      <button type="button" data-speed="4500" class="speed-toggle px-2.5 py-1 rounded-lg text-[11px] bg-amber-400 text-black font-bold border border-amber-300 shadow-sm">4.5s</button>',
'      <button type="button" data-speed="7000" class="speed-toggle px-2.5 py-1 rounded-lg text-[11px] text-slate-400 hover:text-white transition-colors">7s</button>',
'    </div>',
'  </div>',
'  <button type="button" id="spp-flk-copy-url-btn" class="btn-titanium-tool px-3.5 py-2 rounded-xl text-white transition-all text-xs font-mono-chrono font-medium flex items-center gap-2 shadow-sm">',
'    <svg class="w-3.5 h-3.5 text-slate-300" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 5H6a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2v-1M8 5a2 2 0 002 2h2a2 2 0 002-2M8 5a2 2 0 012-2h2a2 2 0 012 2m0 0h2a2 2 0 012 2v3m2 4H10m0 0l3-3m-3 3l3 3"></path></svg>',
'    <span id="spp-flk-copy-label">复制网址</span>',
'  </button>',
'</footer>',
'<div id="spp-flk-matrix-drawer" class="bg-black/85 backdrop-blur-2xl transition-all duration-300 opacity-0 pointer-events-none flex items-center justify-center p-3 sm:p-6"',
'     style="position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 100000;">',
'  <div class="relative w-full max-w-4xl max-h-[85vh] bg-[#0a0f1a] border border-white/20 rounded-3xl p-5 sm:p-8 flex flex-col shadow-[0_30px_100px_rgba(0,0,0,0.95)] overflow-hidden">',
'    <div class="flex items-center justify-between pb-4 border-b border-white/10">',
'      <div class="flex items-center gap-3">',
'        <div class="w-3 h-3 rounded-full bg-amber-400 shadow-[0_0_10px_#f59e0b]"></div>',
'        <h3 id="spp-flk-drawer-title" class="text-base sm:text-lg font-bold font-mono-chrono tracking-wider text-white">CONSTELLATION ATLAS // 站点天体图谱</h3>',
'      </div>',
'      <button type="button" id="spp-flk-close-drawer-btn" class="btn-titanium-tool p-2 rounded-xl text-white transition-colors" title="关闭 (Esc)">',
'        <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg>',
'      </button>',
'    </div>',
'    <div id="spp-flk-drawer-grid" class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 py-4 overflow-y-auto no-scrollbar flex-1"></div>',
'    <div class="pt-3 border-t border-white/10 text-center text-xs font-mono-chrono text-slate-400">点击卡片立即校准天文指针并切换当前站点</div>',
'  </div>',
'</div>',
'<div id="spp-flk-toast-pill" class="' + TOAST_BASE + ' opacity-0 translate-y-3 -translate-x-1/2 pointer-events-none"',
'     style="position: absolute; left: 50%; bottom: 80px; z-index: 100001;">已成功复制至剪贴板</div>'
].join('');
var ambientGlow = document.createElement('div');
ambientGlow.id = 'spp-flk-ambient-glow';
ambientGlow.setAttribute('aria-hidden', 'true');
ambientGlow.style.setProperty('position', 'absolute');
ambientGlow.style.setProperty('left', '50%');
ambientGlow.style.setProperty('top', '50%');
ambientGlow.style.setProperty('width', 'calc(var(--spp-flk-dial) * 1.2)');
ambientGlow.style.setProperty('height', 'calc(var(--spp-flk-dial) * 1.2)');
ambientGlow.style.setProperty('transform', 'translate(-50%, -50%)');
ambientGlow.style.setProperty('border-radius', '9999px');
ambientGlow.style.setProperty('pointer-events', 'none');
ambientGlow.style.setProperty('opacity', '0.5');
ambientGlow.style.setProperty('background',
'radial-gradient(circle, var(--flk-jewel-glow) 0%, var(--flk-jewel-glow-soft) 42%, transparent 70%)');
ambientGlow.style.setProperty('transition', 'background 0.7s cubic-bezier(0.16, 1, 0.3, 1)');
el.insertBefore(ambientGlow, el.firstChild);
function byId(id) {
return el.querySelector('#' + ID_PREFIX + id);
}
var chronoContainer = byId('chrono-container');
var dialTicksSvg = byId('dial-ticks-svg');
var orbitalNodesContainer = byId('orbital-nodes-container');
var pointerFan = byId('pointer-fan');
var pointerNeedle = byId('pointer-needle');
var siteIndexTag = byId('site-index-tag');
var siteLogoBadge = byId('site-logo-badge');
var siteDisplayName = byId('site-display-name');
var siteDomainName = byId('site-domain-name');
var siteDirectAnchor = byId('site-direct-anchor');
var hoverStatusText = byId('hover-status-text');
var countdownArc = byId('countdown-arc');
var centerViewport = byId('center-viewport');
var playPauseBtn = byId('play-pause-btn');
var playIconSvg = byId('play-icon-svg');
var pauseIconSvg = byId('pause-icon-svg');
var playText = byId('play-text');
var prevSiteBtn = byId('prev-site-btn');
var nextSiteBtn = byId('next-site-btn');
var copyUrlBtn = byId('copy-url-btn');
var copyLabel = byId('copy-label');
var toastPill = byId('toast-pill');
var telemetryClock = byId('telemetry-clock');
var sppFlkClockMs = null;
var telemetryDate = byId('telemetry-date');
var stationCountEl = byId('station-count');
var atlasLabel = byId('atlas-label');
var drawerTitle = byId('drawer-title');
var themeLabelIndicator = byId('theme-label-indicator');
var themeIconIndicator = byId('theme-icon-indicator');
var matrixDrawer = byId('matrix-drawer');
var toggleListBtn = byId('toggle-list-btn');
var closeDrawerBtn = byId('close-drawer-btn');
var drawerGrid = byId('drawer-grid');
function flkUpdateTelemetry() {
var now = new Date();
var h = pad2(now.getHours());
var m = pad2(now.getMinutes());
var s = pad2(now.getSeconds());
var ms = pad2(Math.floor(now.getMilliseconds() / 10));
if (telemetryClock) {
var mainNode = telemetryClock.firstChild;
if (mainNode && mainNode.nodeType === 3) {
mainNode.nodeValue = h + ':' + m + ':' + s;
}
if (!sppFlkClockMs) sppFlkClockMs = telemetryClock.querySelector('span');
if (sppFlkClockMs) {
sppFlkClockMs.textContent = '.' + ms;
}
}
if (telemetryDate) {
telemetryDate.textContent = now.getFullYear() + '.' + pad2(now.getMonth() + 1) + '.' + pad2(now.getDate());
}
}
function generateDialTicks() {
if (!dialTicksSvg) return;
dialTicksSvg.innerHTML = '';
var center = 50;
var r = 48.8;
var i;
for (i = 0; i < 60; i++) {
var angle = (i * 6) * (Math.PI / 180);
var isCardinal = (i % 15) === 0;
var isMajor = (i % 5) === 0;
var tickLen = isCardinal ? 3.8 : (isMajor ? 2.6 : 1.4);
var x1 = center + r * Math.sin(angle);
var y1 = center - r * Math.cos(angle);
var x2 = center + (r - tickLen) * Math.sin(angle);
var y2 = center - (r - tickLen) * Math.cos(angle);
var line = document.createElementNS(SVG_NS, 'line');
line.setAttribute('x1', x1 + '%');
line.setAttribute('y1', y1 + '%');
line.setAttribute('x2', x2 + '%');
line.setAttribute('y2', y2 + '%');
if (isCardinal) {
line.setAttribute('stroke', '#f59e0b');
line.setAttribute('stroke-width', '2.5');
} else if (isMajor) {
line.setAttribute('stroke', '#fbbf24');
line.setAttribute('stroke-width', '1.8');
} else {
line.setAttribute('stroke', 'rgba(255, 255, 255, 0.38)');
line.setAttribute('stroke-width', '0.9');
}
dialTicksSvg.appendChild(line);
}
}
function applyDialSize() {
var w = el.clientWidth || el.offsetWidth || 0;
var dialMin = opt.dialMin || 280;
var dialMax = opt.dialSize || FLK_DEFAULT_DIAL;
var d;
if (w > 0) {
d = Math.floor(w - 32);
if (d < dialMin) d = dialMin;
if (d > dialMax) d = dialMax;
} else {
d = dialMax;
}
el.style.setProperty('--spp-flk-dial', d + 'px');
return d;
}
function arrangeOrbitalNodes() {
if (!orbitalNodesContainer || !chronoContainer) return;
orbitalNodesContainer.innerHTML = '';
sppFlkNodes = [];
var total = sppFlkStations.length;
if (!total) return;
var containerRect = chronoContainer.getBoundingClientRect();
var w = containerRect.width;
var h = containerRect.height || w;
var radius = (w / 2) * 0.77;
var cx = w / 2;
var cy = h / 2;
var i;
for (i = 0; i < total; i++) {
var station = sppFlkStations[i];
var angleDeg = (i / total) * 360 - 90;
var angleRad = (angleDeg * Math.PI) / 180;
var nodeX = cx + radius * Math.cos(angleRad);
var nodeY = cy + radius * Math.sin(angleRad);
var xPct = w > 0 ? (nodeX / w) * 100 : 50 + 38.5 * Math.cos(angleRad);
var yPct = h > 0 ? (nodeY / h) * 100 : 50 + 38.5 * Math.sin(angleRad);
var node = document.createElement('div');
node.className = NODE_BASE;
node.style.left = xPct + '%';
node.style.top = yPct + '%';
node.setAttribute('data-node-index', '' + i);
node.setAttribute('data-target-pct', '' + targetPercent(i, total));
node.style.setProperty('--node-color', station.color);
var pill = document.createElement('div');
pill.className = 'node-pill chrono-node relative w-8 h-8 sm:w-10 sm:h-10 rounded-2xl flex items-center justify-center text-xs sm:text-sm font-bold font-mono-chrono text-white shadow-lg overflow-hidden';
pill.style.background = 'linear-gradient(135deg, ' + station.color + '22, rgba(10, 14, 22, 0.9))';
pill.style.borderColor = station.color + '66';
var badge = document.createElement('span');
badge.style.color = station.color;
badge.style.fontWeight = '800';
badge.textContent = station.badge;
pill.appendChild(badge);
var tip = document.createElement('span');
tip.className = NODE_TOOLTIP;
tip.textContent = station.name;
node.appendChild(pill);
node.appendChild(tip);
node.addEventListener('click', flkOnNodeClick);
orbitalNodesContainer.appendChild(node);
sppFlkNodes.push(node);
}
refreshActiveNode();
}
function refreshActiveNode() {
if (!sppFlkStations.length) return;
if (sppFlkIndex >= sppFlkStations.length) sppFlkIndex = 0;
var current = sppFlkStations[sppFlkIndex] || sppFlkStations[0];
var primaryCol = current.color;
var secondaryCol = current.colorSec;
var glowCol = current.glow;
if (sppFlkTheme === 'gold') {
primaryCol = '#f59e0b';
secondaryCol = '#fbbf24';
glowCol = 'rgba(245, 158, 11, 0.45)';
} else if (sppFlkTheme === 'twilight') {
primaryCol = '#8b5cf6';
secondaryCol = '#6366f1';
glowCol = 'rgba(139, 92, 246, 0.45)';
}
el.style.setProperty('--flk-jewel-primary', primaryCol);
el.style.setProperty('--flk-jewel-secondary', secondaryCol);
el.style.setProperty('--flk-jewel-glow', glowCol);
el.style.setProperty('--flk-jewel-glow-soft', glowCol.replace('0.45', '0.15'));
var i;
for (i = 0; i < sppFlkNodes.length; i++) {
var station = sppFlkStations[i];
var node = sppFlkNodes[i];
if (!node) continue;
var pill = node.querySelector('.node-pill');
if (!pill) continue;
var badgeText = pill.querySelector('span');
if (i === sppFlkIndex) {
pill.classList.add('chrono-node-active');
pill.style.background = 'linear-gradient(135deg, ' + primaryCol + ', ' + secondaryCol + ')';
if (badgeText) badgeText.style.color = '#ffffff';
} else {
pill.classList.remove('chrono-node-active');
pill.style.background = 'linear-gradient(135deg, ' + station.color + '22, rgba(10, 14, 22, 0.9))';
if (badgeText) badgeText.style.color = station.color;
}
}
var total = sppFlkStations.length;
writePointerDeg(pointerAngleDeg(sppFlkIndex, total));
if (siteLogoBadge) {
siteLogoBadge.style.background = 'linear-gradient(135deg, ' + primaryCol + ', ' + secondaryCol + ')';
siteLogoBadge.style.boxShadow = '0 0 25px ' + glowCol;
}
}
function switchStation(index, isManual) {
var total = sppFlkStations.length;
if (!total) return;
sppFlkIndex = ((index % total) + total) % total;
var current = sppFlkStations[sppFlkIndex];
if (siteDisplayName) {
siteDisplayName.style.opacity = '0';
siteDisplayName.style.transform = 'translateY(4px)';
}
if (siteDomainName) siteDomainName.style.opacity = '0';
if (sppFlkFadeTimer) clearTimeout(sppFlkFadeTimer);
sppFlkFadeTimer = setTimeout(function () {
sppFlkFadeTimer = null;
if (siteIndexTag) siteIndexTag.textContent = 'PORTAL ' + pad2(sppFlkIndex + 1) + ' / ' + total;
if (siteLogoBadge) siteLogoBadge.textContent = current.badge;
if (siteDisplayName) {
siteDisplayName.textContent = current.name;
siteDisplayName.style.opacity = '1';
siteDisplayName.style.transform = 'translateY(0)';
}
if (siteDomainName) {
siteDomainName.textContent = current.host;
siteDomainName.style.opacity = '1';
}
if (siteDirectAnchor) siteDirectAnchor.href = current.href;
}, FADE_MS);
refreshActiveNode();
if (isManual) writePointerDeg(pointerAngleDeg(sppFlkIndex, total));
if (isManual) sppFlkCycleStamp = Date.now();
if (typeof opt.onIndexChange === 'function') {
opt.onIndexChange(sppFlkIndex, current);
}
}
function setStatusText(text, tone) {
if (!hoverStatusText) return;
while (hoverStatusText.firstChild) hoverStatusText.removeChild(hoverStatusText.firstChild);
var dot = document.createElement('span');
dot.className = 'w-1.5 h-1.5 rounded-full ' + (tone === 'pause' ? 'bg-slate-400' : 'bg-amber-400 animate-pulse');
hoverStatusText.appendChild(dot);
hoverStatusText.appendChild(document.createTextNode(text));
}
function setRunningUI(running) {
if (running) {
if (playIconSvg) playIconSvg.classList.add('hidden');
if (pauseIconSvg) pauseIconSvg.classList.remove('hidden');
if (playText) playText.textContent = '暂停轮巡';
setStatusText('星轨巡航中', 'run');
} else {
if (playIconSvg) playIconSvg.classList.remove('hidden');
if (pauseIconSvg) pauseIconSvg.classList.add('hidden');
if (playText) playText.textContent = '恢复巡航';
setStatusText('轮巡暂停', 'pause');
}
}
function triggerToast(text) {
if (!toastPill) return;
toastPill.textContent = text;
toastPill.classList.remove('opacity-0', 'translate-y-3');
toastPill.classList.add('opacity-100', 'translate-y-0');
if (sppFlkToastTimer) clearTimeout(sppFlkToastTimer);
sppFlkToastTimer = setTimeout(function () {
sppFlkToastTimer = null;
if (!toastPill) return;
toastPill.classList.remove('opacity-100', 'translate-y-0');
toastPill.classList.add('opacity-0', 'translate-y-3');
}, TOAST_MS);
}
function buildDrawerCards() {
if (!drawerGrid) return;
drawerGrid.innerHTML = '';
var i;
for (i = 0; i < sppFlkStations.length; i++) {
var station = sppFlkStations[i];
var card = document.createElement('div');
card.className = CARD_CLASS;
card.setAttribute('data-station-index', '' + i);
var left = document.createElement('div');
left.className = 'flex items-center gap-3';
var iconBox = document.createElement('div');
iconBox.className = 'w-10 h-10 rounded-xl border border-white/25 flex items-center justify-center font-bold text-white group-hover:scale-105 transition-transform';
iconBox.style.background = 'linear-gradient(135deg, ' + station.color + ', ' + station.colorSec + ')';
iconBox.style.boxShadow = '0 4px 12px ' + station.color + '44';
iconBox.textContent = station.badge;
var textBox = document.createElement('div');
var nameEl = document.createElement('div');
nameEl.className = 'text-sm font-bold text-white group-hover:text-amber-300 transition-colors';
nameEl.textContent = station.name;
var hostEl = document.createElement('div');
hostEl.className = 'text-[11px] font-mono-chrono text-slate-400 font-medium';
hostEl.textContent = station.host;
textBox.appendChild(nameEl);
textBox.appendChild(hostEl);
left.appendChild(iconBox);
left.appendChild(textBox);
var nav = document.createElement('span');
nav.className = 'text-[11px] font-mono-chrono font-bold group-hover:translate-x-1 transition-transform';
nav.style.color = station.color;
nav.textContent = 'NAV →';
card.appendChild(left);
card.appendChild(nav);
card.addEventListener('click', flkOnDrawerCardClick);
drawerGrid.appendChild(card);
}
}
function openDrawer() {
if (!matrixDrawer) return;
matrixDrawer.classList.remove('opacity-0', 'pointer-events-none');
matrixDrawer.classList.add('opacity-100', 'pointer-events-auto');
flkTick();
}
function closeDrawer() {
if (!matrixDrawer) return;
matrixDrawer.classList.remove('opacity-100', 'pointer-events-auto');
matrixDrawer.classList.add('opacity-0', 'pointer-events-none');
}
function isDrawerOpen() {
if (!matrixDrawer) return false;
return matrixDrawer.classList.contains('opacity-100');
}
function applyTheme(theme) {
sppFlkTheme = theme;
var label = '幻彩星宿';
var icon = '星';
if (theme === 'gold') {
label = '金曜星轨';
icon = '金';
} else if (theme === 'twilight') {
label = '幻紫深空';
icon = '紫';
}
if (themeLabelIndicator) themeLabelIndicator.textContent = label;
if (themeIconIndicator) themeIconIndicator.textContent = icon;
refreshActiveNode();
return label;
}
function legacyCopy(text) {
try {
var input = document.createElement('input');
input.value = text;
input.setAttribute('readonly', 'readonly');
input.style.position = 'fixed';
input.style.left = '-9999px';
input.style.top = '0';
document.body.appendChild(input);
input.select();
input.setSelectionRange(0, text.length);
var ok = document.execCommand('copy');
document.body.removeChild(input);
return !!ok;
} catch (err) {
return false;
}
}
function doCopy() {
if (!sppFlkStations.length) return;
var current = sppFlkStations[sppFlkIndex];
var urlString = current.href;
var done = function (ok) {
if (copyLabel) copyLabel.textContent = ok ? '已复制' : '复制失败';
triggerToast(ok ? ('已复制: ' + current.host) : '复制失败,请手动访问');
if (sppFlkCopyTimer) clearTimeout(sppFlkCopyTimer);
sppFlkCopyTimer = setTimeout(function () {
sppFlkCopyTimer = null;
if (copyLabel) copyLabel.textContent = '复制网址';
}, TOAST_MS);
flkTick();
};
if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {
navigator.clipboard.writeText(urlString).then(function () {
done(true);
}, function () {
done(legacyCopy(urlString));
});
} else {
done(legacyCopy(urlString));
}
}
function cruiseFrame() {
var now = Date.now();
if (sppFlkRunning && !sppFlkHover) {
var passed = now - sppFlkCycleStamp;
var ratio = Math.min(passed / sppFlkInterval, 1);
if (countdownArc) countdownArc.style.strokeDashoffset = '' + (304.73 * (1 - ratio) + '');
if (ratio >= 1) {
switchStation(sppFlkIndex + 1, false);
flkTick();
sppFlkCycleStamp = Date.now();
if (countdownArc) countdownArc.style.strokeDashoffset = '304.73';
}
}
if (now - sppFlkLastClock >= CLOCK_MS) {
sppFlkLastClock = now;
flkUpdateTelemetry();
}
sppFlkRaf = window.requestAnimationFrame(cruiseFrame);
}
function startRaf() {
if (sppFlkRaf !== null) return;
sppFlkLastClock = 0;
sppFlkRaf = window.requestAnimationFrame(cruiseFrame);
}
function stopRaf() {
if (sppFlkRaf === null) return;
window.cancelAnimationFrame(sppFlkRaf);
sppFlkRaf = null;
}
function clearTimers() {
stopRaf();
if (sppFlkFadeTimer) {
clearTimeout(sppFlkFadeTimer);
sppFlkFadeTimer = null;
}
if (sppFlkCopyTimer) {
clearTimeout(sppFlkCopyTimer);
sppFlkCopyTimer = null;
}
if (sppFlkToastTimer) {
clearTimeout(sppFlkToastTimer);
sppFlkToastTimer = null;
}
}
function start() {
sppFlkUserStopped = false;
sppFlkRunning = true;
sppFlkCycleStamp = Date.now();
setRunningUI(true);
startRaf();
return api;
}
function stop() {
sppFlkRunning = false;
sppFlkUserStopped = true;
setRunningUI(false);
stopRaf();
if (sppFlkFadeTimer) {
clearTimeout(sppFlkFadeTimer);
sppFlkFadeTimer = null;
}
return api;
}
function resize() {
applyDialSize();
arrangeOrbitalNodes();
return api;
}
function destroy() {
sppFlkRunning = false;
sppFlkUserStopped = true;
clearTimers();
if (sppFlkObserver) {
try { sppFlkObserver.disconnect(); } catch (e0) {}
sppFlkObserver = null;
}
if (sppFlkResizeObserver) {
try { sppFlkResizeObserver.disconnect(); } catch (e1) {}
sppFlkResizeObserver = null;
}
el.removeEventListener('keydown', onKeyDown, true);
el.removeEventListener('mousedown', onMouseDown, true);
if (centerViewport) {
centerViewport.removeEventListener('mouseenter', onCenterEnter);
centerViewport.removeEventListener('mouseleave', onCenterLeave);
centerViewport.removeEventListener('wheel', onWheel, { passive: false });
}
if (playPauseBtn) playPauseBtn.removeEventListener('click', onPlayPauseClick);
if (prevSiteBtn) prevSiteBtn.removeEventListener('click', onPrevClick);
if (nextSiteBtn) nextSiteBtn.removeEventListener('click', onNextClick);
if (copyUrlBtn) copyUrlBtn.removeEventListener('click', onCopyClick);
if (toggleListBtn) toggleListBtn.removeEventListener('click', openDrawer);
if (closeDrawerBtn) closeDrawerBtn.removeEventListener('click', closeDrawer);
if (matrixDrawer) {
matrixDrawer.removeEventListener('click', onDrawerBackdropClick);
if (matrixDrawer.parentNode) matrixDrawer.parentNode.removeChild(matrixDrawer);
}
if (toastPill && toastPill.parentNode) toastPill.parentNode.removeChild(toastPill);
var speeds = el.querySelectorAll('.speed-toggle');
var themes = el.querySelectorAll('.theme-opt');
var i;
for (i = 0; i < speeds.length; i++) speeds[i].removeEventListener('click', onSpeedClick);
for (i = 0; i < themes.length; i++) themes[i].removeEventListener('click', onThemeClick);
var nodes = orbitalNodesContainer ? orbitalNodesContainer.querySelectorAll('div[data-node-index]') : [];
for (i = 0; i < nodes.length; i++) nodes[i].removeEventListener('click', flkOnNodeClick);
var cards = drawerGrid ? drawerGrid.querySelectorAll('div[data-station-index]') : [];
for (i = 0; i < cards.length; i++) cards[i].removeEventListener('click', flkOnDrawerCardClick);
sppFlkNodes = [];
if (el.parentNode) el.parentNode.removeChild(el);
return api;
}
function onCenterEnter() {
sppFlkHover = true;
sppFlkPausedPassed = Date.now() - sppFlkCycleStamp;
setStatusText('驻留定格', 'run');
}
function onCenterLeave() {
sppFlkHover = false;
sppFlkCycleStamp = Date.now() - (sppFlkPausedPassed > 0 ? sppFlkPausedPassed : 0);
setStatusText('星轨巡航中', 'run');
}
function onWheel(e) {
if (!el.contains(document.activeElement)) return;
if (e.preventDefault) e.preventDefault();
if (sppFlkWheelLock) return;
sppFlkWheelLock = true;
setTimeout(function () { sppFlkWheelLock = false; }, 90);
if (e.deltaY > 0) {
switchStation(sppFlkIndex + 1, true);
} else {
switchStation(sppFlkIndex - 1, true);
}
flkTick();
}
function onPlayPauseClick() {
sppFlkRunning = !sppFlkRunning;
sppFlkUserStopped = !sppFlkRunning;
if (sppFlkRunning) {
sppFlkCycleStamp = Date.now();
startRaf();
} else {
stopRaf();
}
setRunningUI(sppFlkRunning);
flkTick();
}
function onPrevClick() {
switchStation(sppFlkIndex - 1, true);
flkTick();
}
function onNextClick() {
switchStation(sppFlkIndex + 1, true);
flkTick();
}
function onCopyClick() {
doCopy();
}
function onSpeedClick(e) {
var btn = e.currentTarget;
var speeds = el.querySelectorAll('.speed-toggle');
var i;
for (i = 0; i < speeds.length; i++) {
var b = speeds[i];
var j;
for (j = 0; j < PIN_CLASSES.length; j++) b.classList.remove(PIN_CLASSES[j]);
b.classList.add('text-slate-400');
for (j = 0; j < FREQ_CLASSES.length; j++) b.classList.add(FREQ_CLASSES[j]);
}
var jj;
for (jj = 0; jj < PIN_CLASSES.length; jj++) btn.classList.add(PIN_CLASSES[jj]);
btn.classList.remove('text-slate-400');
for (jj = 0; jj < FREQ_CLASSES.length; jj++) btn.classList.remove(FREQ_CLASSES[jj]);
var sp = parseFloat(btn.getAttribute('data-speed'));
if (isFinite(sp) && sp > 0) sppFlkInterval = sp;
sppFlkCycleStamp = Date.now();
flkTick();
}
function onThemeClick(e) {
var btn = e.currentTarget;
var label = applyTheme(btn.getAttribute('data-theme'));
flkTick();
triggerToast('色系已切换至: ' + label);
}
function onDrawerBackdropClick(e) {
if (e.target === matrixDrawer) closeDrawer();
}
function onMouseDown() {
try { el.focus(); } catch (e) {}
}
var KEY_RIGHT = 39;
var KEY_DOWN = 40;
var KEY_LEFT = 37;
var KEY_UP = 38;
var KEY_SPACE = 32;
var KEY_ESC = 27;
function onKeyDown(e) {
var code = e.keyCode;
if (isDrawerOpen() && code === KEY_ESC) {
closeDrawer();
return;
}
if (code === KEY_RIGHT || code === KEY_DOWN) {
switchStation(sppFlkIndex + 1, true);
flkTick();
} else if (code === KEY_LEFT || code === KEY_UP) {
switchStation(sppFlkIndex - 1, true);
flkTick();
} else if (code === KEY_SPACE) {
if (e.preventDefault) e.preventDefault();
onPlayPauseClick();
}
}
function flkOnNodeClick(e) {
var node = e.currentTarget;
var idx = parseInt(node.getAttribute('data-node-index'), 10);
e.stopPropagation();
if (isFinite(idx)) switchStation(idx, true);
flkTick();
}
function flkOnDrawerCardClick(e) {
var idx = parseInt(e.currentTarget.getAttribute('data-station-index'), 10);
if (isFinite(idx)) switchStation(idx, true);
closeDrawer();
flkTick();
}
function flkTick() {}
sppFlkStations = normalizeInput(links);
var sppFlkTotal = sppFlkStations.length;
sppFlkInterval = opt.interval > 0 ? opt.interval : sppFlkInterval;
var sppFlkAutoStart = opt.autoStart !== false;
if (stationCountEl) stationCountEl.textContent = sppFlkTotal + ' 个站外站点';
if (atlasLabel) atlasLabel.textContent = '星图矩阵 (' + sppFlkTotal + ')';
if (drawerTitle) drawerTitle.textContent = 'CONSTELLATION ATLAS // ' + sppFlkTotal + ' 站点天体图谱';
generateDialTicks();
applyDialSize();
arrangeOrbitalNodes();
buildDrawerCards();
var speedsAll = el.querySelectorAll('.speed-toggle');
var i0;
for (i0 = 0; i0 < speedsAll.length; i0++) speedsAll[i0].addEventListener('click', onSpeedClick);
var themesAll = el.querySelectorAll('.theme-opt');
for (i0 = 0; i0 < themesAll.length; i0++) themesAll[i0].addEventListener('click', onThemeClick);
el.addEventListener('keydown', onKeyDown, true);
el.addEventListener('mousedown', onMouseDown, true);
if (centerViewport) {
centerViewport.addEventListener('mouseenter', onCenterEnter);
centerViewport.addEventListener('mouseleave', onCenterLeave);
centerViewport.addEventListener('wheel', onWheel, { passive: false });
}
if (playPauseBtn) playPauseBtn.addEventListener('click', onPlayPauseClick);
if (prevSiteBtn) prevSiteBtn.addEventListener('click', onPrevClick);
if (nextSiteBtn) nextSiteBtn.addEventListener('click', onNextClick);
if (copyUrlBtn) copyUrlBtn.addEventListener('click', onCopyClick);
if (toggleListBtn) toggleListBtn.addEventListener('click', openDrawer);
if (closeDrawerBtn) closeDrawerBtn.addEventListener('click', closeDrawer);
if (matrixDrawer) matrixDrawer.addEventListener('click', onDrawerBackdropClick);
switchStation(0, false);
flkUpdateTelemetry();
sppFlkCycleStamp = Date.now();
sppFlkRunning = sppFlkAutoStart;
sppFlkUserStopped = !sppFlkAutoStart;
setRunningUI(sppFlkAutoStart);
if (sppFlkAutoStart) startRaf();
if (opt.observer !== false && typeof window.IntersectionObserver === 'function') {
sppFlkObserver = new window.IntersectionObserver(function (entries) {
var i;
for (i = 0; i < entries.length; i++) {
sppFlkInView = entries[i].isIntersecting;
}
if (sppFlkUserStopped || !sppFlkRunning) {
stopRaf();
return;
}
if (sppFlkInView) {
sppFlkCycleStamp = Date.now();
startRaf();
} else {
stopRaf();
}
}, { threshold: 0 });
try { sppFlkObserver.observe(el); } catch (e2) {}
}
if (typeof window.ResizeObserver === 'function') {
sppFlkResizeObserver = new window.ResizeObserver(function () {
resize();
});
try { sppFlkResizeObserver.observe(el); } catch (e3) {}
}
var api = {
el: el,
start: start,
stop: stop,
resize: resize,
destroy: destroy
};
return api;
}
function renderFlkSection() {
if (!onFlkSec) { if (onFlCard && onRmCard) renderFriendCards(); return null; }
return mountFriendSection({});
}
const FL_SEL = '#cate_info tr';
function isSameSite(href) {
try {
const h = new URL(href, location.href).hostname.replace(/^www\./, '');
const cur = location.hostname.replace(/^www\./, '');
if (h === cur) return true;
return /(^|\.)(south-plus\.net|blue-plus\.net|south-plus\.org|north-plus\.net|east-plus\.net|white-plus\.net|level-plus\.net|spring-plus\.net|summer-plus\.net|snow-plus\.net|soul-plus\.net|imoutolove\.me)$/.test(h);
} catch (e) { return false; }
}
function pickFriendLinks() {
const cate = document.getElementById('cate_info');
if (!cate) return [];
let best = null, bestN = 0;
[].slice.call(cate.querySelectorAll('tr')).forEach(function (tr) {
const n = [].slice.call(tr.querySelectorAll('a')).filter(function (a) {
return /^\s*\[.+\]\s*$/.test(a.textContent);
}).length;
if (n > bestN) { bestN = n; best = tr; }
});
if (!best || bestN < 2) return [];
const seen = {};
return [].slice.call(best.querySelectorAll('a')).map(function (a) {
const text = a.textContent.replace(/\s+/g, ' ').trim();
if (!/^\[.+\]$/.test(text)) return null;
if (!a.href) return null;
if (isSameSite(a.href)) return null;
const name = text.replace(/^\[|\]$/g, '');
if (seen[name]) return null;
seen[name] = 1;
let host = '';
try { host = new URL(a.href).hostname.replace(/^www\./, ''); } catch (e) { host = a.href; }
return { name: name, href: a.href, host: host };
}).filter(Boolean);
}
const FL_K = 1.06;
function syncFriendCardScale(card) {
const r = card.getBoundingClientRect();
if (!r.width || !r.height) return;
const W = r.width + 10, H = r.height + 10;
card.style.setProperty('--spp-fl-sx', (FL_K * r.height / W).toFixed(4));
card.style.setProperty('--spp-fl-sy', (FL_K * r.width / H).toFixed(4));
}
function syncAllFriendCardScales() {
[].slice.call(document.querySelectorAll('.spp-fl-card')).forEach(syncFriendCardScale);
}
function initialOf(name) {
const s = String(name || '?').trim();
return /[A-Za-z]/.test(s.charAt(0)) ? s.charAt(0).toUpperCase() : s.charAt(0);
}
function buildFriendCard(links, opt) {
opt = opt || {};
const card = document.createElement('div');
card.className = 'spp-fl-card' + (opt.dense === 'loose' ? ' is-loose' : '');
card.innerHTML =
'<div class="spp-fl-head">' +
'<span class="ttl">友情链接</span>' +
'<span class="cnt">' + links.length + ' 个站点</span>' +
'<span class="hint">点击直达 · 均为站外</span>' +
'</div>' +
'<div class="spp-fl-grid">' + links.map(function (l) {
return '<a class="spp-fl-item" href="' + l.href + '" target="_blank" rel="noopener" title="' + esc(l.href) + '">' +
'<span class="spp-fl-dot">' + esc(initialOf(l.name)) + '</span>' +
'<span class="spp-fl-txt"><b>' + esc(l.name) + '</b><i>' + esc(l.host) + '</i></span>' +
'</a>';
}).join('') + '</div>';
return card;
}
function renderFriendCards() {
if (!onFlCard || !onRmCard) return;
const host = document.querySelector('.spp-rm-row td');
if (!host) return;
if (host.querySelector('.spp-fl-two')) return;   
const links = pickFriendLinks();
if (!links.length) return;
const grid = host.querySelector('.spp-cm-grid');
if (!grid) return;
const two = document.createElement('div');
two.className = 'spp-fl-two';
host.insertBefore(two, grid);
two.appendChild(grid);
two.appendChild(buildFriendCard(links, { dense: 'tight' }));
const t = host.closest('.t');
if (t) t.classList.add('spp-fl-host');
syncAllFriendCardScales();
setTimeout(syncAllFriendCardScales, 60);
}
let _flRzTimer = null;
window.addEventListener('resize', function () {
if (_flRzTimer) clearTimeout(_flRzTimer);
_flRzTimer = setTimeout(syncAllFriendCardScales, 120);
});
applyHomeStyle();
onDomReady(function () {
safeInit('首页美化·统计条', polishStats);
safeInit('首页美化·在线人数', moveOnlineStats);
safeInit('首页美化·用户信息区', function () { polishUserInfo(onUPanel); });
safeInit('首页美化·公告', polishNotice);
safeInit('首页美化·顶部四栏', renderTopCards);
safeInit('首页美化·漫区卡片', renderCmCards);
safeInit('首页美化·综合交流卡片', renderHjCards);
safeInit('首页美化·人民囧府卡片', renderRmCards);
safeInit('首页美化·站外导航分区', renderFlkSection);
safeInit('首页美化·子版卡片', renderSubCards);
setTimeout(function () {
safeInit('首页美化·顶部四栏(延迟)', renderTopCards);
safeInit('首页美化·子版卡片(延迟)', renderSubCards);
}, 1200);
setTimeout(function () { safeInit('首页美化·漫区卡片(延迟)', renderCmCards); }, 1200);
setTimeout(function () { safeInit('首页美化·综合交流卡片(延迟)', renderHjCards); }, 1200);
setTimeout(function () { safeInit('首页美化·人民囧府卡片(延迟)', renderRmCards); }, 1200);
setTimeout(function () { safeInit('首页美化·站外导航分区(延迟)', renderFlkSection); }, 1400);
setTimeout(function () { safeInit('首页美化·在线人数(延迟)', moveOnlineStats); }, 1600);
});
}
const SPP_STAR_LAYERS = [
{ key: 's1', size: 1, dur: 50 },
{ key: 's2', size: 2, dur: 100 },
{ key: 's3', size: 3, dur: 150 }
];
const SPP_STAR_PTS = {
s1: '501 811 1450 1324 1093 1780 1469 678 904 741 1160 781 1841 1962 1630 1667 1788 676 367 1734 1343 156 1283 1142 1062 378 1395 467 1017 1891 137 1114 1767 1403 1543 11 1078 181 1189 1574 1697 1551 439 472 1491 677 1364 599 34 382 1221 1584 1266 1499 169 1907 1219 1125 659 18 1731 1959 332 1216 1913 788 80 712 326 1605 574 1502 473 1653 404 975 322 1797 425 1321 1121 1797 731 647 891 1584 1523 109 1379 244 865 1064 493 956 624 1380 440 619 1630 767 955 1196 62 729 126 946 1256 896 1444 256 661 1628 1078 1716 300 737 1734 413 1296 129 1771 1678 977 1764 1879 549 665 1531 89 701 1084 1183 1597 1576 1354 1774 554 1471 1469 287 887 106 1962 766 638 805 1651 741 1517 1826 24 1152 507 558 1262 652 246 1048 1077 421 1866 1847 1986 1561 704 632 1991 1875 1227 395 45 1116 247 786 890 607 787 1235 557 524 1582 1285 1725 1366 952 747 251 458 1500 1250 1999 1734 1336 1955 1705 1464 728 697 594 510 1345 1990 1919 1803 1117 966 1629 97 1046 1196 810 1092 722 976 406 18 1665 1860 1758 1628 1183 463 564 239 13 1767 1482 1472 1700 347 1362 244 1141 1708 22 885 374 1309 1034 1037 1725 1086 1343 1921 596 903 1061 478 18 1409 729 1364 264 911 677 1442 123 33 1303 646 1945 792 1305 938 918 1536 620 948 183 646 695 687 881 272 1521 1212 1423 1022 1545 1271 1393 348 685 1910 1446 856 73 1201 736 999 673 796 469 850 1912 142 1278 664 184 1990 1173 1312 782 1879 323 1035 611 908 565 1449 748 1713 1047 490 1040 1872 1818 1659 1806 1327 386 575 1550 463 148 687 651 1683 1588 1194 1831 2 581 876 1396 1743 1212 1810 421 1920 658 1461 1859 1809 1456 388 186 1627 1528 1145 171 97 674 1072 676 1052 1165 1131 1088 781 1231 948 330 257 426 1046 549 652 1338 74 1749 364 931 369 383 1428 1558 389 927 133 234 1888 1785 1617 556 643 401 275 406 1644 1253 1852 1599 883 744 1721 524 1297 1226 1177 1679 55 874 1811 838 790 1241 430 1676 652 1191 568 53 1990 1163 237 61 223 592 456 1844 271 1324 1488 1373 717 1822 709 1464 941 1445 1118 991 1414 1964 1076 108 172 641 1722 1539 427 1697 45 1301 1353 1060 329 967 1396 493 301 1228 1406 1211 1653 444 1822 1746 353 1449 381 671 887 650 138 30 1839 1094 1405 273 796 1618 1964 1045 1849 1472 1155 1529 1312 728 448 44 1908 691 818 254 293 1981 1133 1307 375 196 316 1241 1975 1138 1706 1769 463 1768 1428 1730 590 1780 523 1862 1526 1613 909 1266 1781 470 352 699 1682 1002 614 1209 133 1842 518 1422 1836 1720 1901 470 1788 1355 1387 146 1162 933 80 681 1063 313 1341 740 1498 168 1014 345 1355 1498 1562 1626 1358 890 403 663 562 1481 168 22 719 774 1041 1899 829 430 158 430 361 1592 1334 224 323 1639 1131 7 271 1646 1514 1605 1444 1820 1665 1549 1641 1609 1377 486 1098 229 613 542 1694 318 256 1861 918 889 892 442 1524 19 422 1935 1908 828 109 862 1248 1275 560 906 63 337 1605 1691 918 1414 679 1726 749 1540 1149 1337 1466 446 430 676 1616 840 326 976 977 1840 642 1273 804 1071 928 1292 1675 29 1148 1585 135 1007 563 1035 78 1174 574 120 1304 845 1292 861 540 234 232 1940 1367 759 639 1775 1381 906 372 1104 1165 1524 911 1882 330 1389 700 300 1629 220 1614 563 140 1611 1586 793 1316 325 1070 1722 1462 1406 1120 1169 1768 1956 1053 959 1587 585 1566 370 204 1606 1416 443 1606 1499 1102 1943 105 1121 1594 1512 32 871 1425 433 100 294 1471 1688 1755 1666 591 1034 300 734 1178 1342 313 1616 1590 1763 1472 632 1935 1708 872 1871 915 1829 1020 1599 578 42 585 1163 1382 1744 1272 984 1426 1786 1584 1813 379 1867 1127 97 567 626 988 1178 79 1703 211 961 1785 110 975 953 1941 1027 1790 1665 107 11 964 1718 1147 21 1728 1358 1922 872 65 1191 1635 762 681 1519 1033 906 566 1074 657 1093 415 51 198 1075 1418 1547 1070 225 920 850 1974 981 595 1425 131 460 917 56 495 714 428 920 493 470 1521 532 821 1905 71 883 1501 294 196 381 1999 332 793 1246 408 233 149 315 231 1594 1302 696 1585 791 136 479 199 1627 1413 1824 924 1631 342 1251 1151 284 1781 497 1052 204 1161 646 1499 1762 558 854 1833 883 945 44 982 1101 834 515 1748 1578 1435 819 1258 776 670 115 385 1478 434 885 20 192 1513 78 1129 1774 1105 955 1149 1817 1929 1106 1832 1107 1997 94 23 243 982 43 1972 1798 673 1131 1589 841 14 826 345 687 56 1084 32 1887 1878 153 526 1828 253 1947 1105 886 700 1307 1723 1274 651 1530 837 1699 1637 1703 1331 1929 1557 1763 737 1118 1680 1545 692 1462 1092 208 1667 1393 859 186 1794 351 1199 642 1995 1061 1726 1708 115 1233 1305 637 1786 1730 603 75 1240 1704 1326 584 346 438 1554 561 513 1382 225 467 1674 1403 815 1546 1835 127 1119 276 591 688 1458 765 646 474 984 171 361 94 1480 1962 1666 909 1037 1725 222 253 1355 1892 1901 275 1847 28 1184 1725 1382 882 647 1935 1046 10 344 292 1328 127 1352 752 929 1589 384 284 1829 381 820 1229 1125 777 429 1811 1499 1573 287 295 756 389 616 781 41 1092 333 794 1588 386 1847 1802 710 662 60 640 264 463 746 1859 799 763 37 639 396 357 1071 1190 1430 1814 257 1382 235 606 1304 1939 1470 1124 349 307 1567 310 1323 1145 922 1196 1922 1647 544 788 1337 257 632 1413 414 590 620 582 794 1702 1481 1055 53 157 346 50 1901 1038 1369 796 1941 215 194 1567 1538 367 800 1044 489 1109 1712 524 327 525 1252 1475 1240 529 436 795 834 122 1371 79 482 520 1249 336 1878 188 944 325 1259 1491 1942 620 1054 1606 1153 1448 502 53 1381 107 1670 1380 618 967 1557 1116 1722 1174 1044 1805 717 663 394 1848 1007 389 802 49 392 1650 852 1678 1012 335 1009 1818 1631 1568 742 1162 1991 52 1190 1401 928 119 1549 537 1529 2 1709 122 387 543 2 27 1971 507 1377 1362 1080 1031 1544 1631 1174 1603 312 1626 1422 1430 615 1958 1431 1946 1412 1848 247 984 1808 1396 225 319 717 1252 875 1619 156 951 1971 386 355 1406 1151 273 1538 844 1570 947 151 1363 525 209 307 1923 1718 993 1741 1513 353 1353 61 664 352 1382 359 1487 1707 657 1045 1107 490 1834 1176 837 1438 1947 448 1196 333 151 555 18 992 458 748 1801 890 1093 1012 315 1101 194 323 754 292 1737 7 40 840 1170 805 176 1753 805 1148 1578 1271 367 1494 363 1111 1955 243 1451 1093 375 617 1223 720 1178 13 1456 865 1440 49 186 1569 320 1853 300 539 1559 509 1985 1108 1588 828 525 1432 831 363 141 281 1319 402 40 456 1955 478 1758 818 1924 688 1030 953 1982 210 917 1401 1051 1837 1045 463 1744 573 529 1530 542 469 1982 324 1902 1422 1968 782 1666 1561 955 304 323 778 272 443 485 581 1353 1058 1257 131 434 98 1587 1953 1749 68 1984 839 1518 183 1071 855 1662 1994 1111 106 1954 838',
s2: '1925 1320 693 1778 1016 711 1171 563 661 1919 1610 44 1275 140 1208 1802 1473 1587 11 1117 853 1757 1149 937 1353 428 270 279 258 1404 417 1188 286 561 393 1765 147 881 666 1097 1425 1278 806 156 1252 561 218 52 1371 1980 171 745 1424 89 137 244 939 1922 137 1080 1757 50 904 536 1938 1001 1172 440 72 1475 102 121 804 1671 1314 270 440 1341 1216 511 1061 1523 97 274 704 1318 52 1872 1962 296 111 289 1157 1236 1347 1451 820 286 1389 1169 644 841 1286 522 955 659 428 1805 237 557 1689 1058 636 1882 1349 1664 1548 432 1841 504 302 252 827 1765 620 123 207 748 1454 1234 1967 1790 542 33 742 1214 255 1402 74 1772 699 475 980 1253 534 1676 909 202 1498 1251 1796 120 1409 1263 1627 995 969 710 1674 676 1832 759 1623 563 251 1790 96 1688 886 239 778 150 1767 430 765 1259 1189 877 444 1629 1560 324 1952 1097 712 1173 541 911 827 1420 1233 285 784 546 645 285 1273 1255 1821 174 221 1795 1004 456 1298 941 274 387 174 376 1491 258 1489 1946 1134 1382 1289 1145 464 358 1249 1842 1665 831 1982 84 541 774 1994 523 762 1644 1730 867 1951 1287 911 1691 1454 725 1287 1940 70 564 1980 638 1674 1774 1720 116 1747 182 1040 450 1795 375 857 1471 1326 1730 915 274 1224 358 1808 60 43 1870 1810 1536 1564 1719 731 1388 1953 1967 1744 1119 794 1384 959 714 18 1932 1358 1437 355 939 1355 1648 608 719 383 758 1164 1681 1045 253 424 1279 1899 359 379 488 214 465 179 905 830 1993 448 1077 1880 1354 1973 347 745 1025 788 1007 1377 883 6 290 1312 407 1398 622 1405 339 1198 1709 988 1226 87 1459 1113 1698 997 732 708 331 1876 1112 1729 1797 719 703 1295 522 758 1061 1309 1014 1327 1365 854 1317 531 1001 1751 1040 1354 190 800 1538 88 1455 668 39 1379 41 892 524 54 649 1289 730 727 488 181 842 1230 64 3 857 292 1201 1343 673 1096 1412 1520 292 104 1683 934 1387 314 739',
s3: '200 981 1731 521 132 1039 1888 1547 899 1226 1887 580 1548 1092 1626 689 254 1072 1684 1211 672 1267 939 668 1969 645 1126 983 457 568 476 876 829 1896 1364 1846 1507 1120 936 1948 1833 832 1424 285 1377 1596 432 153 1348 1410 1529 954 1102 387 264 297 811 977 1931 673 1734 978 1772 1567 1197 1400 764 282 1103 822 872 1803 1057 1763 52 1299 1312 1236 235 1082 299 1086 1017 1602 1950 626 1306 132 1358 1618 1873 1718 1447 940 1888 1195 1704 1765 872 1357 1555 1120 250 1415 450 415 492 901 170 1641 56 1129 627 1514 1221 500 324 1895 1397 1775 1966 598 1550 763 326 1605 261 969 890 281 736 544 589 1262 1581 368 1900 1132 1914 585 1864 1517 241 217 859 787 996 1729 741 121 418 414 142 967 387 896 703 562 968 1136 1682 332 1287 846 256 1427 1885 432 1739 1458 345 1769 1140 1612 192 1921 920 471 834 881 917 1803 466 1266 483 1108 689 986 1279 786 458 910 1250 870 785 1654 1543 1757 287 1272'
};
function sppStarShadow(pts) {
const a = pts.split(' ');
const out = [];
for (let i = 0; i + 1 < a.length; i += 2) out.push(a[i] + 'px ' + a[i + 1] + 'px #fff');
return out.join(',');
}
function initStarfield() {
const KEY = 'spp_home_starfield';
const GLASS = 'spp_home_star_glass';
const MOTION = SPP_CONFIG.bool('spp_star_motion', false);
if (!SPP_CONFIG.bool(KEY, true)) return;
const glass = SPP_CONFIG.bool(GLASS, true);
const CSS = `
    #spp-starfield {
        position:fixed; inset:0; z-index:-1; overflow:hidden; pointer-events:none;
        background:radial-gradient(ellipse at bottom, #1b2735 0%, #090a0f 100%);
    }
    #spp-starfield > i {
        position:absolute; top:0; left:0; display:block; background:transparent;
        box-shadow:var(--spp-star-sh);
    }
    ` + (MOTION ? `
    #spp-starfield > i {
        animation:spp-star-move linear infinite;
        will-change:transform;
    }
    #spp-starfield > i::after {
        content:" "; position:absolute; top:2000px; left:0;
        width:var(--spp-star-size); height:var(--spp-star-size);
        background:transparent; box-shadow:var(--spp-star-sh);
    }
    @keyframes spp-star-move {
        from { transform:translateY(0); }
        to   { transform:translateY(-2000px); }
    }
    @media (prefers-reduced-motion: reduce) {
        #spp-starfield > i { animation:none !important; }
    }
    ` : '') + (glass ? `
    html.spp-hm-star, html.spp-hm-star body {
        background-color:transparent !important; background-image:none !important;
    }
    html.spp-hm-star #wrapA, html.spp-hm-star #main,
    html.spp-hm-star #content, html.spp-hm-star .contentc,
    html.spp-hm-star #wall, html.spp-hm-star #wall ul.stream {
        background:transparent !important;
    }
    html.spp-hm-star #main .t, html.spp-hm-star #main .t5:not(.spp-t5bar),
    html.spp-hm-star table.t_one {
        background:rgba(250,252,255,0.93) !important;
        border-color:rgba(255,255,255,0.66) !important;
        box-shadow:0 16px 46px rgba(2,6,23,0.46) !important;
    }
    html.spp-hm-star #main .t:hover, html.spp-hm-star #main .t5:hover {
        box-shadow:0 20px 56px rgba(2,6,23,0.56) !important;
    }
    html.spp-hm-star #wall ul.stream > li {
        background:rgba(250,252,255,0.94) !important;
        border-color:rgba(255,255,255,0.66) !important;
        box-shadow:0 10px 30px rgba(2,6,23,0.42) !important;
    }
    html.spp-hm-star #wall ul.stream > li:hover {
        background:rgba(250,252,255,0.98) !important;
        box-shadow:0 16px 40px rgba(2,6,23,0.55) !important;
    }
    html.spp-hm-star #main .t table,
    html.spp-hm-star #main .t tbody,
    html.spp-hm-star #main .t tr,
    html.spp-hm-star #main .t tr > td,
    html.spp-hm-star #main .t tr > th,
    html.spp-hm-star #main .t5 table,
    html.spp-hm-star #main .t5 tbody,
    html.spp-hm-star #main .t5 tr,
    html.spp-hm-star #main .t5 tr > td,
    html.spp-hm-star #main .t5 tr > th,
    html.spp-hm-star table.t_one tbody,
    html.spp-hm-star table.t_one tr,
    html.spp-hm-star table.t_one tr > td,
    html.spp-hm-star table.t_one tr > th {
        background:transparent !important;
    }
    html.spp-hm-star #main .t tr:hover,
    html.spp-hm-star #main .t tr:hover > td,
    html.spp-hm-star #main .t tr:hover > th,
    html.spp-hm-star #main .t5:not(.spp-t5bar) tr:hover > td,
    html.spp-hm-star #main .t5 tr:hover > th {
        background:rgba(47,111,104,0.07) !important;
    }
    html.spp-hm-star #toptool, html.spp-hm-star #header {
        background-color:rgba(9,13,21,0.62) !important;
        background-image:
            linear-gradient(180deg, rgba(255,255,255,0.10) 0%, rgba(255,255,255,0.02) 40%, rgba(255,255,255,0) 74%) !important;
        background-repeat:no-repeat !important;
        backdrop-filter:blur(10px) saturate(150%) !important;
        -webkit-backdrop-filter:blur(10px) saturate(150%) !important;
    }
    html.spp-hm-star #mainNav {
        background-color:rgba(9,13,21,0.62) !important;
        background-image:
            linear-gradient(180deg, rgba(255,255,255,0.10) 0%, rgba(255,255,255,0.02) 40%, rgba(255,255,255,0) 74%),
            radial-gradient(140% 220% at 10% -90%, rgba(120,190,255,0.16) 0%, rgba(0,0,0,0) 62%) !important;
        background-repeat:no-repeat !important;
        box-shadow:0 6px 24px rgba(2,6,23,0.5) !important;
        border-radius:0 0 8px 8px;
        margin-bottom:14px !important;
    }
    html.spp-hm-star #footer { color:#8fa0b5 !important; }

    html.spp-hm-star.spp-hm-task #infobox:not(.spp-up-on) {
        background-color:rgba(14,18,26,0.82) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.085) 0%, rgba(255,255,255,0.015) 44%, rgba(255,255,255,0) 78%) !important;
        background-repeat:no-repeat !important;
        border-radius:12px !important;
        box-shadow:0 16px 46px rgba(2,6,23,0.50), inset 0 0 0 1px rgba(255,255,255,0.075), inset 0 1px 0 rgba(255,255,255,0.06) !important;
        backdrop-filter:blur(18px) saturate(150%) !important;
        -webkit-backdrop-filter:blur(18px) saturate(150%) !important;
        color:#c7d3e3 !important;
    }
    html.spp-hm-star.spp-hm-task #infobox:not(.spp-up-on) a { color:#8fb6ee !important; }
    html.spp-hm-star.spp-hm-task #infobox:not(.spp-up-on) a:hover { color:#d5e6ff !important; }
    html.spp-hm-star.spp-hm-task #infobox:not(.spp-up-on) .gray,
    html.spp-hm-star.spp-hm-task #infobox:not(.spp-up-on) .f10 { color:#8b98a8 !important; }
    html.spp-hm-star.spp-hm-task #infobox:not(.spp-up-on) b,
    html.spp-hm-star.spp-hm-task #infobox:not(.spp-up-on) strong { color:#e3ecf7 !important; }

    html.spp-hm-star.spp-hm-task #breadcrumbs {
        background-color:rgba(14,18,26,0.82) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.075) 0%, rgba(255,255,255,0.012) 46%, rgba(255,255,255,0) 80%) !important;
        background-repeat:no-repeat !important;
        border-color:rgba(255,255,255,0.075) !important;
        border-radius:9px !important;
        box-shadow:0 10px 30px rgba(2,6,23,0.42), inset 0 1px 0 rgba(255,255,255,0.05) !important;
        backdrop-filter:blur(16px) saturate(145%) !important;
        -webkit-backdrop-filter:blur(16px) saturate(145%) !important;
        color:#b6c3d3 !important;
        padding:0 14px !important;
        line-height:30px !important;
    }
    html.spp-hm-star.spp-hm-task #breadcrumbs a { color:#8fb6ee !important; }
    html.spp-hm-star.spp-hm-task #breadcrumbs a:hover { color:#d5e6ff !important; }
    html.spp-hm-star.spp-hm-task #breadcrumbs img { opacity:.72; vertical-align:middle; }
    html.spp-hm-star.spp-hm-task #breadcrumbs a:last-of-type { color:#3fd9a4 !important; }
    html.spp-hm-star.spp-hm-task #breadcrumbs a:last-of-type:hover { color:#8bf2cf !important; }

    html.spp-hm-star.spp-hm-task #main > table {
        background-color:rgba(13,18,27,0.72) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.055) 0%, rgba(255,255,255,0.008) 40%, rgba(255,255,255,0) 82%) !important;
        background-repeat:no-repeat !important;
        border-collapse:separate !important;
        border-radius:14px !important;
        box-shadow:0 18px 54px rgba(2,6,23,0.52), inset 0 0 0 1px rgba(255,255,255,0.065) !important;
        backdrop-filter:blur(16px) saturate(145%) !important;
        -webkit-backdrop-filter:blur(16px) saturate(145%) !important;
        overflow:hidden !important;
    }
    html.spp-hm-star.spp-hm-task #main > table > tbody > tr > td {
        padding:14px !important;
        vertical-align:top !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t {
        position:relative;
        z-index:0;
        box-sizing:border-box !important;
        padding:2px !important;
        background-color:rgb(36,36,36) !important;
        background-image:linear-gradient(180deg, rgb(56,56,56) 0%, rgb(36,36,36) 66%, rgb(41,41,41) 100%) !important;
        background-repeat:no-repeat !important;
        border-color:rgb(56,56,56) !important;
        border-radius:12px !important;
        overflow:hidden !important;
        box-shadow:0 14px 34px rgba(2,6,23,0.50) !important;
        color:rgb(218,218,218) !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t::after {
        content:'' !important;
        position:absolute !important;
        inset:0 !important;
        z-index:1 !important;
        pointer-events:none !important;
        background:repeating-conic-gradient(rgb(48,47,47) 0.0000001%, rgb(51,51,51) 0.000104%) 60% 60%/600% 600% !important;
        opacity:.10;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t > table {
        background-color:rgb(29,29,29) !important;
        background-image:radial-gradient(at 95% 89%, rgb(15,15,15) 0px, transparent 50%),
                         radial-gradient(at 0% 100%, rgb(17,17,17) 0px, transparent 50%),
                         radial-gradient(at 0% 0%, rgb(29,29,29) 0px, transparent 50%) !important;
        border-radius:10px !important;
        color:rgb(218,218,218) !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t > table > tbody > tr,
    html.spp-hm-star.spp-hm-task #main > table div.t > table > tbody > tr > td {
        background-color:transparent !important;
        background-image:none !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t > table > tbody > tr > td.h {
        background-color:rgba(17,23,33,0.97) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.08) 0%, rgba(255,255,255,0) 74%) !important;
        background-repeat:no-repeat !important;
        color:#dfe8f3 !important;
        box-shadow:inset 3px 0 0 rgba(32,201,151,0.85), inset 0 -1px 0 rgba(255,255,255,0.08) !important;
        border-radius:10px 10px 0 0 !important;
        text-shadow:0 0 20px rgba(75,75,75,0.9);
        font-weight:650 !important;
        letter-spacing:.02em;
        padding:2px 12px 0 !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t tr.f_one > td.li {
        border-bottom:0 none !important;
        background-image:none !important;
        background-color:transparent !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t > table > tbody > tr > td {
        border-bottom: 0 none !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t tr.f_one:hover > td { background-color:rgba(47,111,104,0.10) !important; }
    html.spp-hm-star.spp-hm-task #main > table div.t font[color] { color:#7cc6ff !important; }
    html.spp-hm-star.spp-hm-task #main > table div.t b { color:#e8f0f9 !important; }
    html.spp-hm-star.spp-hm-task #main > table div.t a { color:#8fb6ee !important; }
    html.spp-hm-star.spp-hm-task #main > table div.t a:hover { color:#d5e6ff !important; }
    html.spp-hm-star.spp-hm-task #main > table div.t a[href^="plugin.php?H_name-tasks"] {
        display:inline-block;
        padding:2px 11px;
        border-radius:6px;
        background-color:rgba(255,255,255,0.045);
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.055);
        text-decoration:none !important;
        transition:background-color .15s ease, color .15s ease;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t a[href^="plugin.php?H_name-tasks"]:hover {
        background-color:rgba(47,111,104,0.24);
        color:#d5e6ff !important;
    }
    html.spp-hm-star.spp-hm-task #mainNav ul.guide > li:has(> a[href*="H_name-tasks"]),
    html.spp-hm-star.spp-hm-task #mainNav ul.guide > li:has(> a[href*="H_name-tasks"]) > a,
    html.spp-hm-star.spp-hm-task #mainNav ul.guide a[href*="H_name-tasks"],
    html.spp-hm-star.spp-hm-task #mainNav ul.guide a[href*="H_name-tasks"]:hover {
        background:none !important;
        background-image:none !important;
        background-color:transparent !important;
        border:0 !important;
        border-radius:0 !important;
        box-shadow:none !important;
        text-shadow:none !important;
        color:#fff !important;
        font-weight:700 !important;
    }
    html.spp-hm-star.spp-hm-task #main > table > tbody > tr > td:first-child > div.t {
        padding:0 !important;
        background-color:rgba(16,22,32,0.88) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.05) 0%, rgba(255,255,255,0) 62%) !important;
        background-repeat:no-repeat !important;
        border-color:rgba(255,255,255,0.06) !important;
        box-shadow:0 12px 30px rgba(2,6,23,0.45) !important;
        color:#c7d3e3 !important;
    }
    html.spp-hm-star.spp-hm-task #main > table > tbody > tr > td:first-child > div.t::after {
        content:none !important;
    }
    html.spp-hm-star.spp-hm-task #main > table > tbody > tr > td:first-child > div.t > table {
        background-color:transparent !important;
        background-image:none !important;
        border-radius:11px !important;
    }
    html.spp-hm-star.spp-hm-task #main > table > tbody > tr > td:first-child > div.t > table > tbody > tr > td.h {
        box-shadow:inset 0 -1px 0 rgba(255,255,255,0.08) !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t tr.f_one > td:has(> a[href*="H_name-tasks"]) {
        background-color:rgba(255,255,255,0.035) !important;
        background-image:none !important;
        padding:6px 0 !important;
    }
    html.spp-hm-star.spp-hm-task #main > table div.t tr.f_one + tr.f_one > td:has(> a[href*="H_name-tasks"]) {
        box-shadow:inset 0 1px 0 rgba(255,255,255,0.05);
    }
    html.spp-hm-star.spp-hm-task #main > table div.t tr.f_one > td:first-child > img {
        padding:3px;
        background-image:linear-gradient(135deg, rgba(95,240,192,0.55) 0%, rgba(99,184,255,0.32) 55%, rgba(255,255,255,0.14) 100%);
        border-radius:9px;
        box-shadow:0 0 0 1px rgba(255,255,255,0.10), 0 10px 26px rgba(2,6,23,0.55);
    }

    html.spp-hm-star.spp-hm-uprofile #header > table { display:none !important; }

    html.spp-hm-star.spp-hm-uprofile #main,
    html.spp-hm-star.spp-hm-uprofile #header { width:min(1600px, 100%) !important; }

    html.spp-hm-star.spp-hm-uprofile #breadcrumbs {
        background-color:rgba(14,18,26,0.82) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.075) 0%, rgba(255,255,255,0.012) 46%, rgba(255,255,255,0) 80%) !important;
        background-repeat:no-repeat !important;
        border-color:rgba(255,255,255,0.075) !important;
        border-radius:9px !important;
        box-shadow:0 10px 30px rgba(2,6,23,0.42), inset 0 1px 0 rgba(255,255,255,0.05) !important;
        backdrop-filter:blur(16px) saturate(145%) !important;
        -webkit-backdrop-filter:blur(16px) saturate(145%) !important;
        color:#b6c3d3 !important;
        padding:0 14px !important;
        line-height:30px !important;
        margin:0 0 10px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #breadcrumbs a { color:#8fb6ee !important; }
    html.spp-hm-star.spp-hm-uprofile #breadcrumbs a:hover { color:#d5e6ff !important; }
    html.spp-hm-star.spp-hm-uprofile #breadcrumbs a.crumbs-item.current { color:#3fd9a4 !important; }
    html.spp-hm-star.spp-hm-uprofile #breadcrumbs .crumbs-item { background:none !important; border-color:transparent !important; }

    html.spp-hm-star.spp-hm-uprofile #u-wrap { background:none !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 {
        box-sizing:border-box !important;
        background-color:rgba(16,22,32,0.88) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.05) 0%, rgba(255,255,255,0) 62%) !important;
        background-repeat:no-repeat !important;
        border-radius:14px !important;
        box-shadow:0 16px 46px rgba(2,6,23,0.50), inset 0 0 0 1px rgba(255,255,255,0.065) !important;
        color:#eaf2ff !important;
        margin:0 0 14px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 table,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 tbody,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 tr,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 td {
        background-color:transparent !important;
        background-image:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .bgA { background:none !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-portrait { background:none !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 a { background:none !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 table,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 tr,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 td,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 div,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 dl,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 dt,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 li {
        border-color:rgba(255,255,255,0.08) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 td,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 th { color:#eaf2ff !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h1.u-h1 { color:#ffffff !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 a { color:#ffffff !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 a:hover { color:#d8fff5 !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 td.gray3,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .gray,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .gray3,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .f9,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 dt { color:#eaf2ff !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 {
        background:none !important;
        color:#8bf7cd !important;
        font-size:13.5px !important;
        font-weight:650 !important;
        letter-spacing:.02em;
        padding-bottom:5px;
        text-shadow:0 0 12px rgba(139,247,205,0.30);
        box-shadow:inset 0 -1px 0 rgba(255,255,255,0.08);
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 span {
        background:none !important;
        color:#8bf7cd !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 a {
        display:inline-flex;
        align-items:center;
        padding:4px 11px !important;
        font-weight:500 !important;
        border-radius:7px;
        background-color:rgba(255,255,255,0.055) !important;
        color:#ffffff !important;
        text-decoration:none !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.10);
        transition:background-color .15s ease, color .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 a:hover {
        background-color:rgba(32,201,151,0.18) !important;
        color:#d8fff5 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #honor { color:#eaf2ff !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 dl.feed-list dt,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 dl.article-list dt {
        padding:6px 4px !important;
        border-radius:6px;
        transition:background-color .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 dl.feed-list dt:hover,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 dl.article-list dt:hover {
        background-color:rgba(255,255,255,0.045) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 a.link1 { color:#ffffff !important; }
    @property --sppUfAng { syntax:'<angle>'; inherits:false; initial-value:0deg; }
    @keyframes sppUfSpin { to { --sppUfAng:360deg; } }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 td:first-child img {
        box-sizing:border-box;
        border:3px solid transparent !important;
        border-radius:16px !important;
        background:
            linear-gradient(#161b26, #12161d) padding-box,
            conic-gradient(from var(--sppUfAng),
                rgba(95,240,192,0.95), rgba(99,184,255,0.55), rgba(255,255,255,0.16), rgba(95,240,192,0.95)) border-box;
        animation:sppUfSpin 8s linear infinite;
        box-shadow:0 12px 30px rgba(2,6,23,0.55);
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 ul.b {
        display:inline-flex;
        flex-wrap:wrap;
        gap:2px;
        padding:4px !important;
        border-radius:8px;
        background-color:rgba(255,255,255,0.06) !important;
        box-shadow:0 0 0 1px rgba(0,0,0,0.25), inset 0 1px 0 rgba(255,255,255,0.06) !important;
        list-style:none;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 ul.b li,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 ul.b li a {
        box-sizing:border-box !important;
        height:auto !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 ul.b li a {
        display:flex;
        align-items:center;
        justify-content:center;
        line-height:1.2 !important;
        padding:6px 14px !important;
        border-radius:6px;
        background-color:rgba(255,255,255,0.045) !important;
        color:#ffffff !important;
        text-decoration:none !important;
        transition:all .15s ease-in-out;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 ul.b li a:hover {
        background-color:rgba(255,255,255,0.10) !important;
        color:#d8fff5 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 ul.b li.current a {
        background-color:rgba(32,201,151,0.16) !important;
        color:#d8fff5 !important;
        font-weight:600;
        box-shadow:inset 0 0 0 1px rgba(32,201,151,0.42);
    }

    html.spp-hm-star.spp-hm-uprofile #u-sidebar { float:left !important; width:200px !important; }
    html.spp-hm-star.spp-hm-uprofile #u-content {
        float:none !important;
        width:auto !important;
        margin-left:216px !important;
        overflow:hidden !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-content > #u-top,
    html.spp-hm-star.spp-hm-uprofile #u-content > #u-contentmain,
    html.spp-hm-star.spp-hm-uprofile #u-content > #u-contentside,
    html.spp-hm-star.spp-hm-uprofile #u-content > .u-content-66,
    html.spp-hm-star.spp-hm-uprofile #u-content > .u-content-33,
    html.spp-hm-star.spp-hm-uprofile #u-content > .u-profile {
        float:none !important;
        box-sizing:border-box !important;
        width:min(960px, 100%) !important;
        margin-left:auto !important;
        margin-right:auto !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-content > #u-contentmain,
    html.spp-hm-star.spp-hm-uprofile #u-content > .u-content-66,
    html.spp-hm-star.spp-hm-uprofile #u-content > .u-profile { margin-top:24px !important; }
    html.spp-hm-star.spp-hm-uprofile #u-content > #u-contentside,
    html.spp-hm-star.spp-hm-uprofile #u-content > .u-content-33 { margin-top:20px !important; }
    html.spp-hm-star.spp-hm-uprofile #u-content > #u-contentside,
    html.spp-hm-star.spp-hm-uprofile #u-content > .u-content-33 {
        padding-left:0 !important;
        border-left:0 none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-content table { width:100% !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 th,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 td {
        border-bottom-style:solid !important;
        border-bottom-color:rgba(255,255,255,0.06) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 form center {
        margin:12px 0 4px !important;
        line-height:2 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 form center > div { margin-top:8px !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 input[type=text],
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 input:not([type]) {
        background-color:rgba(255,255,255,0.06) !important;
        color:#eaf2ff !important;
        border:1px solid rgba(255,255,255,0.14) !important;
        border-radius:6px;
        padding:3px 8px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 select {
        background-color:#1a2029 !important;
        color:#eaf2ff !important;
        border:1px solid rgba(255,255,255,0.14) !important;
        border-radius:6px;
        padding:2px 6px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 input.btn {
        background:rgba(32,201,151,0.16) !important;
        color:#d8fff5 !important;
        border:1px solid rgba(32,201,151,0.42) !important;
        border-radius:6px;
        padding:3px 12px !important;
        font-weight:600;
        cursor:pointer;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 input.btn:hover {
        background:rgba(32,201,151,0.30) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar img:not(.pic) { display:none !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar td a {
        display:inline-flex;
        align-items:center;
        padding:5px 12px !important;
        border-radius:7px;
        background-color:rgba(255,255,255,0.055) !important;
        color:#ffffff !important;
        text-decoration:none !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.10);
        transition:background-color .15s ease, color .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar td a:hover {
        background-color:rgba(32,201,151,0.18) !important;
        color:#d8fff5 !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-profile > table.u-table,
    html.spp-hm-star.spp-hm-uprofile #u-profile-s > table.u-table { display:block !important; }
    html.spp-hm-star.spp-hm-uprofile #u-profile > table.u-table > tbody,
    html.spp-hm-star.spp-hm-uprofile #u-profile-s > table.u-table > tbody {
        display:grid !important;
        grid-template-columns:repeat(2, minmax(0, 1fr)) !important;
        gap:8px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-profile > table.u-table > tbody > tr,
    html.spp-hm-star.spp-hm-uprofile #u-profile-s > table.u-table > tbody > tr {
        display:flex !important;
        align-items:center !important;
        box-sizing:border-box !important;
        margin:0 !important;
        padding:9px 14px !important;
        border-radius:10px !important;
        background-color:rgba(255,255,255,0.05) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.045) 0%, rgba(255,255,255,0) 72%) !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,0.06) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-profile > table.u-table > tbody > tr > td,
    html.spp-hm-star.spp-hm-uprofile #u-profile-s > table.u-table > tbody > tr > td {
        display:block !important;
        flex:0 0 auto !important;
        width:6em !important;
        min-width:6em !important;
        white-space:nowrap !important;
        color:#eaf2ff !important;
        border-bottom:0 none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-profile > table.u-table > tbody > tr > th,
    html.spp-hm-star.spp-hm-uprofile #u-profile-s > table.u-table > tbody > tr > th {
        display:block !important;
        flex:1 1 auto !important;
        width:auto !important;
        min-width:0 !important;
        text-align:left !important;
        font-weight:400 !important;
        color:#ffffff !important;
        border-bottom:0 none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-profile > table.u-table > tbody > tr:last-child {
        grid-column:1 / -1 !important;
    }

    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table { display:block !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody {
        display:grid !important;
        grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)) !important;
        gap:10px !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr:first-child { display:none !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr {
        display:flex !important;
        flex-direction:column !important;
        align-items:stretch !important;
        box-sizing:border-box !important;
        margin:0 !important;
        padding:11px 14px !important;
        border-radius:12px !important;
        background-color:rgb(0 0 0 / 0.86) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.06) 0%, rgba(255,255,255,0.014) 44%, rgba(255,255,255,0) 100%) !important;
        backdrop-filter:blur(18px) saturate(140%) !important;
        -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
        box-shadow:0 12px 32px -14px rgba(0,0,0,0.72),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(255,255,255,0.09) !important;
        transition:box-shadow .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr:hover {
        box-shadow:0 0 24px -2px rgba(61,106,255,0.5),
            0 12px 32px -14px rgba(0,0,0,0.72),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(255,255,255,0.09) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > th {
        display:block !important;
        flex:1 1 auto !important;
        width:auto !important;
        min-width:0 !important;
        text-align:center !important;
        font-weight:400 !important;
        border-bottom:0 none !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td {
        display:flex !important;
        align-items:baseline !important;
        flex:0 0 auto !important;
        text-align:left !important;
        margin-top:8px !important;
        padding-top:8px !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,0.07) !important;
        border-bottom:0 none !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > .spp-upc-meta {
        margin-left:auto !important;
        display:inline-flex !important;
        align-items:center !important;
        gap:6px !important;
        white-space:nowrap !important;
        line-height:1.4 !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > .spp-upc-meta > a,
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > .spp-upc-meta > span {
        color:#c3d4ea !important;
        font-size:10px !important;
        text-decoration:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > .spp-upc-meta > a:hover {
        color:#ffffff !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > th > a:not(.gray) {
        display:block !important;
        text-align:center !important;
        font-size:14px !important;
        line-height:1.45 !important;
        font-weight:600 !important;
        color:#ffffff !important;
        -webkit-text-fill-color:#ffffff !important;
        letter-spacing:.01em !important;
        text-shadow:0 0 14px rgba(255,255,255,.34), 0 1px 0 rgba(0,0,0,.40) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #minifeed,
    html.spp-hm-star.spp-hm-uprofile #new-reply,
    html.spp-hm-star.spp-hm-uprofile #new-topic {
        display:grid !important;
        grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)) !important;
        gap:10px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > h5.u-h5,
    html.spp-hm-star.spp-hm-uprofile #new-reply > h5.u-h5,
    html.spp-hm-star.spp-hm-uprofile #new-topic > h5.u-h5 {
        grid-column:1 / -1 !important;
        margin-bottom:0 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list {
        display:flex !important;
        flex-direction:column !important;
        box-sizing:border-box !important;
        margin:0 !important;
        padding:11px 14px !important;
        border-radius:12px !important;
        background-color:rgb(0 0 0 / 0.86) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.06) 0%, rgba(255,255,255,0.014) 44%, rgba(255,255,255,0) 100%) !important;
        backdrop-filter:blur(18px) saturate(140%) !important;
        -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
        box-shadow:0 12px 32px -14px rgba(0,0,0,0.72),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(255,255,255,0.09) !important;
        border-bottom:0 none !important;
        transition:box-shadow .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list:hover,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list:hover,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list:hover {
        box-shadow:0 0 24px -2px rgba(61,106,255,0.5),
            0 12px 32px -14px rgba(0,0,0,0.72),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(255,255,255,0.09) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list > dt,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list > dt,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dt {
        flex:1 1 auto !important;
        padding:0 !important;
        border-radius:0 !important;
        background:none !important;
        font-size:12.5px !important;
        line-height:1.65 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list > dt:hover,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list > dt:hover,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dt:hover { background:none !important; }
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list > dt {
        display:flex !important;
        flex-direction:column !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list > dt > a.link1,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dt > a.link1 {
        font-size:13.5px !important;
        line-height:1.45 !important;
        font-weight:600 !important;
        color:#ffffff !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list > dt > span.gray3.f9 {
        margin-top:auto !important;
        padding-top:8px !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,0.07) !important;
        font-size:10px !important;
        color:#c3d4ea !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd {
        display:flex !important;
        align-items:baseline !important;
        gap:8px !important;
        margin:auto 0 0 !important;
        padding-top:8px !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,0.07) !important;
        font-size:10px !important;
        color:#c3d4ea !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd > span.f9 { font-size:10px !important; color:#c3d4ea !important; }
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd > br { display:none !important; }

    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table { display:block !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody {
        display:grid !important;
        grid-template-columns:repeat(auto-fill, minmax(280px, 1fr)) !important;
        gap:10px !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr:first-child { display:none !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr {
        display:flex !important;
        flex-direction:column !important;
        align-items:stretch !important;
        box-sizing:border-box !important;
        margin:0 !important;
        padding:11px 14px !important;
        border-radius:12px !important;
        background-color:rgb(0 0 0 / 0.86) !important;
        background-image:linear-gradient(180deg, rgba(255,255,255,0.06) 0%, rgba(255,255,255,0.014) 44%, rgba(255,255,255,0) 100%) !important;
        backdrop-filter:blur(18px) saturate(140%) !important;
        -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
        box-shadow:0 12px 32px -14px rgba(0,0,0,0.72),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(255,255,255,0.09) !important;
        transition:box-shadow .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr:hover {
        box-shadow:0 0 24px -2px rgba(61,106,255,0.5),
            0 12px 32px -14px rgba(0,0,0,0.72),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(255,255,255,0.09) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr > th {
        display:block !important;
        flex:1 1 auto !important;
        width:auto !important;
        min-width:0 !important;
        text-align:center !important;
        font-weight:400 !important;
        border-bottom:0 none !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr > td {
        display:flex !important;
        align-items:baseline !important;
        flex:0 0 auto !important;
        text-align:left !important;
        margin-top:8px !important;
        padding-top:8px !important;
        box-shadow:inset 0 1px 0 rgba(255,255,255,0.07) !important;
        border-bottom:0 none !important;
        justify-content:center !important;
        gap:8px !important;
        font-size:10.5px !important;
        color:#c3d4ea !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr > td > br { display:none !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr > th > a:not(.gray) {
        display:block !important;
        text-align:center !important;
        font-size:14px !important;
        line-height:1.45 !important;
        font-weight:600 !important;
        color:#ffffff !important;
        -webkit-text-fill-color:#ffffff !important;
        letter-spacing:.01em !important;
        text-shadow:0 0 14px rgba(255,255,255,.34), 0 1px 0 rgba(0,0,0,.40) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr > th > a.gray,
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr > th > span.gray.f9 {
        font-size:10px !important;
        color:#c3d4ea !important;
        text-decoration:none !important;
    }

    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain table.u-table > tbody > tr:not(:first-child) > th > a {
        color:#ffffff !important;
        font-weight:600 !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain table.u-table > tbody > tr:not(:first-child) > td > a {
        color:#eaf2ff !important;
        font-weight:500 !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain table.u-table > tbody > tr:not(:first-child):hover {
        background-color:rgba(255,255,255,0.045) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain table.u-table > tbody > tr:first-child > td {
        color:#f0f6ff !important;
        font-weight:600 !important;
        letter-spacing:.06em;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain table.u-table input[type=checkbox] {
        -webkit-appearance:none !important;
        appearance:none !important;
        width:15px !important;
        height:15px !important;
        margin:0 !important;
        padding:0 !important;
        border-radius:4px;
        background-color:rgba(255,255,255,0.07);
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.22);
        cursor:pointer;
        transition:background-color .15s ease, box-shadow .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain table.u-table input[type=checkbox]:hover {
        box-shadow:inset 0 0 0 1px rgba(32,201,151,0.65);
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain table.u-table input[type=checkbox]:checked {
        background-color:rgba(32,201,151,0.9);
        background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.4 8.5l3.1 3.1 6.1-6.6' fill='none' stroke='%230a1a14' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
        background-repeat:no-repeat;
        background-position:center;
        background-size:11px 11px;
        box-shadow:inset 0 0 0 1px rgba(32,201,151,1), 0 0 10px -3px rgba(32,201,151,0.75);
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-wrap2 #u-contentside td.fav > a.fr {
        display:inline-flex !important;
        align-items:center !important;
        justify-content:center !important;
        box-sizing:border-box !important;
        width:22px !important;
        height:22px !important;
        padding:0 !important;
        margin:2px 2px 0 8px !important;
        border-radius:7px;
        background-color:rgba(255,255,255,0.055) !important;
        color:#eaf2ff !important;
        font-size:12px !important;
        line-height:1 !important;
        text-decoration:none !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.12);
        transition:background-color .15s ease, color .15s ease, box-shadow .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-wrap2 #u-contentside td.fav > a.fr img { display:none !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-wrap2 #u-contentside td.fav > a.fr::before { content:'✕' !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-wrap2 #u-contentside td.fav > a.fr:hover {
        background-color:rgba(255,86,86,0.22) !important;
        color:#ffd9d9 !important;
        box-shadow:inset 0 0 0 1px rgba(255,120,120,0.6);
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain center { line-height:2.2 !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job {
        display:inline-flex;
        align-items:center;
        gap:6px;
        padding:3px 12px 3px 8px !important;
        margin:0 2px !important;
        border-radius:999px;
        font-size:12px !important;
        line-height:1.7 !important;
        color:#ffffff !important;
        background-color:rgba(255,255,255,0.055) !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.12);
        cursor:pointer;
        user-select:none;
        vertical-align:middle;
        transition:background-color .15s ease, color .15s ease, box-shadow .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job > input[type=radio] {
        -webkit-appearance:none !important;
        appearance:none !important;
        flex:0 0 auto;
        width:13px !important;
        height:13px !important;
        margin:0 !important;
        border-radius:50%;
        background-color:rgba(255,255,255,0.06);
        box-shadow:inset 0 0 0 1.5px rgba(255,255,255,0.30);
        cursor:pointer;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job:hover { background-color:rgba(255,255,255,0.09) !important; }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job.is-on {
        background-color:rgba(32,201,151,0.16) !important;
        color:#d8fff5 !important;
        box-shadow:inset 0 0 0 1px rgba(32,201,151,0.55);
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job.is-on > input[type=radio] {
        background-image:radial-gradient(circle at 50% 50%, #20c997 0 3.2px, transparent 3.6px);
        box-shadow:inset 0 0 0 1.5px rgba(32,201,151,0.85);
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job--del:hover {
        background-color:rgba(255,86,86,0.14) !important;
        color:#ffd9d9 !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job--del.is-on {
        background-color:rgba(255,86,86,0.18) !important;
        color:#ffe0e0 !important;
        box-shadow:inset 0 0 0 1px rgba(255,110,110,0.6);
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain .spp-fav-job--del.is-on > input[type=radio] {
        background-image:radial-gradient(circle at 50% 50%, #ff6b6b 0 3.2px, transparent 3.6px);
        box-shadow:inset 0 0 0 1.5px rgba(255,110,110,0.9);
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-favor #u-contentmain center.spp-fav-danger input.btn[type=submit] {
        background:rgba(255,86,86,0.20) !important;
        color:#ffe3e3 !important;
        border-color:rgba(255,110,110,0.55) !important;
        box-shadow:0 0 16px -6px rgba(255,86,86,0.9);
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar .bgA table,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar .bdbA table {
        table-layout:fixed !important;
        width:100% !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar .bgA td,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar .bdbA td {
        width:50% !important;
        text-align:center !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar .bdbA {
        box-sizing:border-box !important;
        padding:.5em 1.2em !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-top-nav {
        left:50% !important;
        width:max-content !important;
        max-width:100% !important;
        transform:translateX(-50%) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-contentside table.u-table {
        width:100% !important;
        margin-left:0 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-contentside td a {
        display:inline-flex;
        align-items:center;
        padding:5px 12px !important;
        border-radius:7px;
        background-color:rgba(255,255,255,0.055) !important;
        color:#ffffff !important;
        text-decoration:none !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.10);
        transition:background-color .15s ease, color .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-contentside td a:hover {
        background-color:rgba(32,201,151,0.18) !important;
        color:#d8fff5 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-contentside td.fav.current a {
        background-color:rgba(32,201,151,0.16) !important;
        color:#d8fff5 !important;
        font-weight:600;
        box-shadow:inset 0 0 0 1px rgba(32,201,151,0.42);
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-top > table {
        table-layout:fixed !important;
        width:100% !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-top { padding-left:0 !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-top > table > tbody > tr > td:first-child {
        width:1px !important;
        white-space:nowrap !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-top > table > tbody > tr > td:last-child {
        text-align:center !important;
        padding-left:0 !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 a {
        top:50% !important;
        transform:translateY(-50%) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages {
        float:none !important;
        height:auto !important;
        line-height:1 !important;
        margin:14px 0 0 !important;
        padding:7px 10px !important;
        border:0 !important;
        border-radius:12px !important;
        background-color:rgb(0 0 0 / 0.86) !important;
        box-shadow:0 10px 26px rgba(0,0,0,0.34), inset 0 0 0 1px rgba(255,255,255,0.09) !important;
        font-size:13.5px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul {
        display:flex !important;
        align-items:center !important;
        flex-wrap:wrap !important;
        gap:6px !important;
        margin:0 !important;
        padding:0 !important;
        list-style:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul li {
        display:inline-flex !important;
        float:none !important;
        align-items:center !important;
        margin:0 !important;
        padding:0 !important;
        list-style:none !important;
        border:0 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul li a,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul li b {
        display:inline-flex !important;
        align-items:center !important;
        justify-content:center !important;
        box-sizing:border-box !important;
        height:32px !important;
        min-width:32px !important;
        padding:0 10px !important;
        margin:0 !important;
        font-size:13.5px !important;
        line-height:1 !important;
        text-decoration:none !important;
        border-radius:9px !important;
        background-color:rgba(255,255,255,0.05) !important;
        color:#ffffff !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.10);
        transition:background-color .15s ease, color .15s ease;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul li a:hover {
        background-color:rgba(32,201,151,0.18) !important;
        color:#d8fff5 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul li b {
        background-color:rgba(32,201,151,0.16) !important;
        color:#d8fff5 !important;
        font-weight:600 !important;
        box-shadow:inset 0 0 0 1px rgba(32,201,151,0.42);
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul li.pagesone {
        gap:8px !important;
        margin-left:10px !important;
        color:#eaf2ff !important;
        font-size:13px !important;
        white-space:nowrap !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 .pages ul li.pagesone input[type=text] {
        box-sizing:border-box !important;
        width:62px !important;
        height:30px !important;
        padding:0 9px !important;
        font-size:13px !important;
        border-radius:9px !important;
    }

    html.spp-hm-star.spp-hm-uprofile {
        --spp-uh-cy:#00f3ff;
        --spp-uh-cy-12:rgba(0,243,255,0.12);
        --spp-uh-cy-30:rgba(0,243,255,0.30);
        --spp-uh-cy-g:rgba(0,243,255,0.28);
        --spp-uh-mg:#ff007f;
        --spp-uh-pu:#b026ff;
        --spp-uh-lv:35%;
        --spp-uh-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, "Courier New", monospace;
        --spp-uh-ic-mail:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNNCA0aDE2YTIgMiAwIDAgMSAyIDJ2MTJhMiAyIDAgMCAxLTIgMkg0YTIgMiAwIDAgMS0yLTJWNmEyIDIgMCAwIDEgMi0yeicvPjxwb2x5bGluZSBwb2ludHM9JzIyLDYgMTIsMTMgMiw2Jy8+PC9zdmc+");
        --spp-uh-ic-friend:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNMTYgMjF2LTJhNCA0IDAgMCAwLTQtNEg1YTQgNCAwIDAgMC00IDR2MicvPjxjaXJjbGUgY3g9JzguNScgY3k9JzcnIHI9JzQnLz48bGluZSB4MT0nMjAnIHkxPSc4JyB4Mj0nMjAnIHkyPScxNCcvPjxsaW5lIHgxPScyMycgeTE9JzExJyB4Mj0nMTcnIHkyPScxMScvPjwvc3ZnPg==");
        --spp-uh-ic-quote:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA1MTIgNTEyJyBmaWxsPSclMjMwMDAnPjxwYXRoIGQ9J000NjQgMjU2aC04MHYtNjRjMC0zNS4zIDI4LjctNjQgNjQtNjRoOGMxMy4zIDAgMjQtMTAuNyAyNC0yNFY1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNGgtOGMtODguNCAwLTE2MCA3MS42LTE2MCAxNjB2MjQwYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4aDEyOGMyNi41IDAgNDgtMjEuNSA0OC00OFYzMDRjMC0yNi41LTIxLjUtNDgtNDgtNDh6bS0yODggMEg5NnYtNjRjMC0zNS4zIDI4LjctNjQgNjQtNjRoOGMxMy4zIDAgMjQtMTAuNyAyNC0yNFY1NmMwLTEzLjMtMTAuNy0yNC0yNC0yNGgtOEM3MS42IDMyIDAgMTAzLjYgMCAxOTJ2MjQwYzAgMjYuNSAyMS41IDQ4IDQ4IDQ4aDEyOGMyNi41IDAgNDgtMjEuNSA0OC00OFYzMDRjMC0yNi41LTIxLjUtNDgtNDgtNDh6Jy8+PC9zdmc+");
        --spp-uh-ic-pencil:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNMTcgM2EyLjgzIDIuODMgMCAwIDEgNCA0TDcuNSAyMC41IDIgMjJsMS41LTUuNUwxNyAzeicvPjwvc3ZnPg==");
        --spp-uh-ic-sat:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNNCAxMGE3LjMxIDcuMzEgMCAwIDAgMTAgMTBaJy8+PHBhdGggZD0nbTkgMTUgMy0zJy8+PHBhdGggZD0nTTE3IDEzYTYgNiAwIDAgMC02LTYnLz48cGF0aCBkPSdNMjEgMTNBMTAgMTAgMCAwIDAgMTEgMycvPjwvc3ZnPg==");
        --spp-uh-ic-reply:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cG9seWxpbmUgcG9pbnRzPSc3IDE3IDIgMTIgNyA3Jy8+PHBvbHlsaW5lIHBvaW50cz0nMTIgMTcgNyAxMiAxMiA3Jy8+PHBhdGggZD0nTTIyIDE4di0yYTQgNCAwIDAgMC00LTRINycvPjwvc3ZnPg==");
        --spp-uh-ic-file:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNMTQgMkg2YTIgMiAwIDAgMC0yIDJ2MTZhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0yVjh6Jy8+PHBvbHlsaW5lIHBvaW50cz0nMTQgMiAxNCA4IDIwIDgnLz48bGluZSB4MT0nMTYnIHkxPScxMycgeDI9JzgnIHkyPScxMycvPjxsaW5lIHgxPScxNicgeTE9JzE3JyB4Mj0nOCcgeTI9JzE3Jy8+PC9zdmc+");
        --spp-uh-ic-comment:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNMjEgMTEuNWE4LjM4IDguMzggMCAwIDEtLjkgMy44IDguNSA4LjUgMCAwIDEtNy42IDQuNyA4LjM4IDguMzggMCAwIDEtMy44LS45TDMgMjFsMS45LTUuN2E4LjM4IDguMzggMCAwIDEtLjktMy44IDguNSA4LjUgMCAwIDEgNC43LTcuNiA4LjM4IDguMzggMCAwIDEgMy44LS45aC41YTguNDggOC40OCAwIDAgMSA4IDh2LjV6Jy8+PC9zdmc+");
        --spp-uh-ic-view:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNMSAxMnM0LTggMTEtOCAxMSA4IDExIDgtNCA4LTExIDgtMTEtOC0xMS04eicvPjxjaXJjbGUgY3g9JzEyJyBjeT0nMTInIHI9JzMnLz48L3N2Zz4=");
        --spp-uh-ic-user:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNCAyNCcgZmlsbD0nbm9uZScgc3Ryb2tlPSclMjMwMDAnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLWxpbmVjYXA9J3JvdW5kJyBzdHJva2UtbGluZWpvaW49J3JvdW5kJz48cGF0aCBkPSdNMjAgMjF2LTJhNCA0IDAgMCAwLTQtNEg4YTQgNCAwIDAgMC00IDR2MicvPjxjaXJjbGUgY3g9JzEyJyBjeT0nNycgcj0nNCcvPjwvc3ZnPg==");
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-portrait td:first-child img {
        background:
            linear-gradient(#161b26, #12161d) padding-box,
            conic-gradient(from var(--sppUfAng),
                rgba(0,243,255,0) 0%, rgba(0,243,255,0) 25%,
                var(--spp-uh-cy) 35%,
                rgba(0,243,255,0) 45%, rgba(255,0,127,0) 75%,
                var(--spp-uh-mg) 85%,
                rgba(255,0,127,0) 95%) border-box !important;
        animation:sppUfSpin 4s linear infinite !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA {
        position:relative !important;
        padding-bottom:15px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA > table { display:block !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA > table > tbody > tr {
        display:flex !important;
        align-items:baseline !important;
        justify-content:space-between !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA td { width:auto !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA td.gray3 {
        font-size:10.5px !important;
        font-weight:600 !important;
        letter-spacing:.10em !important;
        color:#9fb0c4 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA td:last-child {
        font-family:var(--spp-uh-mono) !important;
        font-size:12.5px !important;
        font-weight:700 !important;
        letter-spacing:.02em !important;
        color:var(--spp-uh-cy) !important;
        text-shadow:0 0 10px var(--spp-uh-cy-g) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA::before,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA::after {
        content:'' !important;
        position:absolute !important;
        left:14px !important;
        bottom:7px !important;
        height:4px !important;
        border-radius:999px !important;
        pointer-events:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA::before {
        right:14px !important;
        background-color:rgba(255,255,255,0.09) !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.06) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA::after {
        width:var(--spp-uh-lv) !important;
        background-image:linear-gradient(90deg, rgba(0,243,255,0.30), var(--spp-uh-cy)) !important;
        animation:sppUhLvPulse 2s ease-in-out infinite alternate !important;
    }
    @keyframes sppUhLvPulse {
        0%   { opacity:.72; box-shadow:0 0 7px var(--spp-uh-cy); }
        100% { opacity:1;   box-shadow:0 0 16px var(--spp-uh-cy), inset 0 0 4px rgba(255,255,255,0.9); }
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA > table { display:block !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA > table > tbody {
        display:grid !important;
        grid-template-columns:1fr 1fr !important;
        gap:8px !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA > table > tbody > tr { display:contents !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA td { width:auto !important; padding:0 !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA a {
        position:relative !important;
        overflow:hidden !important;
        display:flex !important;
        align-items:center !important;
        justify-content:center !important;
        gap:6px !important;
        box-sizing:border-box !important;
        width:100% !important;
        padding:7px 6px !important;
        border-radius:9px !important;
        background-color:transparent !important;
        color:var(--spp-uh-cy) !important;
        font-size:11.5px !important;
        font-weight:600 !important;
        letter-spacing:.02em !important;
        white-space:nowrap !important;
        text-decoration:none !important;
        box-shadow:inset 0 0 0 1px var(--spp-uh-cy-30) !important;
        transition:color .18s ease, box-shadow .18s ease !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA a::before {
        content:'' !important;
        flex:0 0 auto !important;
        width:13px !important;
        height:13px !important;
        background-color:currentColor !important;
        -webkit-mask:var(--spp-uh-ic-mail) center / 13px 13px no-repeat !important;
        mask:var(--spp-uh-ic-mail) center / 13px 13px no-repeat !important;
        pointer-events:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA td:last-child a::before {
        -webkit-mask-image:var(--spp-uh-ic-friend) !important;
        mask-image:var(--spp-uh-ic-friend) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA a::after {
        content:'' !important;
        position:absolute !important;
        top:0 !important;
        bottom:0 !important;
        left:-100% !important;
        width:100% !important;
        background-image:linear-gradient(90deg, rgba(0,243,255,0), rgba(0,243,255,0.22), rgba(0,243,255,0)) !important;
        transition:left .45s ease !important;
        pointer-events:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA a:hover {
        color:#ffffff !important;
        box-shadow:inset 0 0 0 1px var(--spp-uh-cy), 0 0 15px rgba(0,243,255,0.30) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA a:hover::after { left:100% !important; }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h1.u-h1 {
        font-family:var(--spp-uh-mono) !important;
        font-size:18px !important;
        letter-spacing:.04em !important;
        text-shadow:0 0 14px var(--spp-uh-cy-g) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #honor::before {
        content:'' !important;
        display:inline-block !important;
        width:10px !important;
        height:10px !important;
        margin-right:5px !important;
        vertical-align:-1px !important;
        background-color:var(--spp-uh-cy) !important;
        opacity:.55 !important;
        -webkit-mask:var(--spp-uh-ic-quote) center / 10px 10px no-repeat !important;
        mask:var(--spp-uh-ic-quote) center / 10px 10px no-repeat !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #sethonor img { display:none !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #sethonor::before {
        content:'' !important;
        display:inline-block !important;
        width:10px !important;
        height:10px !important;
        margin-right:4px !important;
        vertical-align:-1px !important;
        background-color:currentColor !important;
        opacity:.6 !important;
        -webkit-mask:var(--spp-uh-ic-pencil) center / 10px 10px no-repeat !important;
        mask:var(--spp-uh-ic-pencil) center / 10px 10px no-repeat !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 ul.b li.current a {
        background-color:var(--spp-uh-cy-12) !important;
        color:#e6feff !important;
        box-shadow:inset 0 0 0 1px rgba(0,243,255,0.38), 0 0 12px rgba(0,243,255,0.16) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 {
        color:var(--spp-uh-cy) !important;
        box-shadow:inset 0 -1px 0 rgba(0,243,255,0.14) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 > span {
        color:var(--spp-uh-cy) !important;
        text-shadow:0 0 12px var(--spp-uh-cy-g) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 > span::before { content:'[ ' !important; opacity:.55 !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 > span::after  { content:' ]' !important; opacity:.55 !important; }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #minifeed > h5.u-h5::before,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #new-reply > h5.u-h5::before,
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #new-topic > h5.u-h5::before {
        content:'' !important;
        display:inline-block !important;
        width:13px !important;
        height:13px !important;
        margin-right:7px !important;
        vertical-align:-2px !important;
        background-color:currentColor !important;
        opacity:.85 !important;
        -webkit-mask:var(--spp-uh-ic-file) center / 13px 13px no-repeat !important;
        mask:var(--spp-uh-ic-file) center / 13px 13px no-repeat !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #minifeed > h5.u-h5::before {
        -webkit-mask-image:var(--spp-uh-ic-sat) !important;
        mask-image:var(--spp-uh-ic-sat) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 #new-reply > h5.u-h5::before {
        -webkit-mask-image:var(--spp-uh-ic-reply) !important;
        mask-image:var(--spp-uh-ic-reply) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 > a {
        border-radius:999px !important;
        padding:4px 12px !important;
        background-color:transparent !important;
        color:#b8c8da !important;
        box-shadow:inset 0 0 0 1px rgba(255,255,255,0.14) !important;
        transition:background-color .18s ease, color .18s ease, box-shadow .18s ease !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 > a::after {
        content:'›' !important;
        margin-left:4px !important;
        font-size:13px !important;
        line-height:1 !important;
        opacity:.85 !important;
    }
    html.spp-hm-star.spp-hm-uprofile #u-wrap2 h5.u-h5 > a:hover {
        background-color:rgba(0,243,255,0.10) !important;
        color:#eaf6ff !important;
        box-shadow:inset 0 0 0 1px rgba(0,243,255,0.45), 0 0 12px rgba(0,243,255,0.18) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list,
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr,
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr {
        position:relative !important;
        overflow:hidden !important;
        transition:box-shadow .15s ease, transform .3s cubic-bezier(0.25, 0.8, 0.25, 1) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list:hover,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list:hover,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list:hover,
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr:hover,
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr:hover {
        transform:translateY(-4px) !important;
        box-shadow:0 0 26px -4px rgba(0,243,255,0.32),
            0 14px 34px -14px rgba(0,0,0,0.80),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(0,243,255,0.18) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list::after,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list::after,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list::after,
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr::after,
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr::after {
        content:'' !important;
        position:absolute !important;
        left:0 !important;
        right:0 !important;
        bottom:0 !important;
        height:2px !important;
        background-image:linear-gradient(90deg, rgba(0,243,255,0), var(--spp-uh-cy), rgba(0,243,255,0)) !important;
        transform:scaleX(0) !important;
        transform-origin:center !important;
        transition:transform .4s cubic-bezier(0.175, 0.885, 0.32, 1.275) !important;
        pointer-events:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list:hover::after,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list:hover::after,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list:hover::after,
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr:hover::after,
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr:hover::after {
        transform:scaleX(1) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list::before {
        content:'' !important;
        position:absolute !important;
        left:0 !important;
        top:0 !important;
        bottom:0 !important;
        width:3px !important;
        background-image:linear-gradient(180deg, var(--spp-uh-cy) 0%, rgba(0,243,255,0.45) 58%, rgba(0,243,255,0) 100%) !important;
        box-shadow:0 0 9px rgba(0,243,255,0.45) !important;
        pointer-events:none !important;
    }

    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd {
        gap:12px !important;
        align-items:center !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd > span.f9 {
        font-family:var(--spp-uh-mono) !important;
        letter-spacing:.02em !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd > .spp-ustat {
        display:inline-flex !important;
        align-items:center !important;
        gap:5px !important;
        font-family:var(--spp-uh-mono) !important;
        font-size:10px !important;
        letter-spacing:.02em !important;
        color:#c3d4ea !important;
        white-space:nowrap !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd > .spp-ustat::before {
        content:'' !important;
        flex:0 0 auto !important;
        width:11px !important;
        height:11px !important;
        background-color:currentColor !important;
        opacity:.55 !important;
        -webkit-mask:var(--spp-uh-ic-view) center / 11px 11px no-repeat !important;
        mask:var(--spp-uh-ic-view) center / 11px 11px no-repeat !important;
    }
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd > .spp-ustat--r::before {
        -webkit-mask-image:var(--spp-uh-ic-comment) !important;
        mask-image:var(--spp-uh-ic-comment) !important;
    }

    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge {
        align-self:flex-start !important;
        display:inline-flex !important;
        align-items:center !important;
        margin:0 0 8px 0 !important;
        padding:2px 8px !important;
        border-radius:5px !important;
        border-bottom:0 none !important;
        font-size:10px !important;
        font-weight:600 !important;
        letter-spacing:.06em !important;
        line-height:1.6 !important;
        text-decoration:none !important;
        white-space:nowrap !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--c {
        color:#00f3ff !important;
        background-color:rgba(0,243,255,0.10) !important;
        box-shadow:inset 0 0 0 1px rgba(0,243,255,0.30) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--m {
        color:#ff5fa8 !important;
        background-color:rgba(255,0,127,0.12) !important;
        box-shadow:inset 0 0 0 1px rgba(255,0,127,0.30) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--p {
        color:#c98bff !important;
        background-color:rgba(176,38,255,0.12) !important;
        box-shadow:inset 0 0 0 1px rgba(176,38,255,0.32) !important;
    }

    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td {
        font-size:0 !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > a {
        display:inline-flex !important;
        align-items:center !important;
        gap:5px !important;
        font-size:11px !important;
        font-weight:500 !important;
        color:#c3d4ea !important;
        text-decoration:none !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > a::before {
        content:'' !important;
        flex:0 0 auto !important;
        width:11px !important;
        height:11px !important;
        background-color:currentColor !important;
        opacity:.6 !important;
        -webkit-mask:var(--spp-uh-ic-user) center / 11px 11px no-repeat !important;
        mask:var(--spp-uh-ic-user) center / 11px 11px no-repeat !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > a:hover {
        color:#ffffff !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > td > .spp-upc-meta > span {
        font-family:var(--spp-uh-mono) !important;
        letter-spacing:.02em !important;
    }

    @media (prefers-reduced-motion: reduce) {
        html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-portrait td:first-child img { animation:none !important; }
        html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA::after { animation:none !important; }
        html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list,
        html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list,
        html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list,
        html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr,
        html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr {
            transition:none !important;
        }
        html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list:hover,
        html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list:hover,
        html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list:hover,
        html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr:hover,
        html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr:hover {
            transform:none !important;
        }
        html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list::after,
        html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list::after,
        html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list::after,
        html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr::after,
        html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr::after {
            transition:none !important;
        }
        html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA a,
        html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bdbA a::after { transition:none !important; }
    }

    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list,
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr,
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr {
        background-color:rgba(11,15,26,0.52) !important;
        background-image:
            repeating-linear-gradient(180deg,
                rgba(255,255,255,0.028) 0px, rgba(255,255,255,0.028) 1px,
                rgba(0,0,0,0.10) 1px, rgba(0,0,0,0.10) 2px,
                rgba(0,0,0,0) 2px, rgba(0,0,0,0) 4px),
            radial-gradient(130% 104% at 0% 0%, rgba(0,243,255,0.055) 0%, rgba(0,243,255,0) 58%),
            linear-gradient(158deg,
                rgba(22,34,60,0.30) 0%,
                rgba(13,17,30,0.16) 48%,
                rgba(6,9,18,0.42) 100%) !important;
        backdrop-filter:blur(11px) saturate(135%) !important;
        -webkit-backdrop-filter:blur(11px) saturate(135%) !important;
        box-shadow:0 10px 30px -16px rgba(0,0,0,0.78),
            inset 0 1px 0 rgba(255,255,255,0.16),
            inset 0 0 0 1px rgba(255,255,255,0.075) !important;
        transition:box-shadow .22s ease, background-color .22s ease,
            transform .3s cubic-bezier(0.25, 0.8, 0.25, 1) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list:hover,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list:hover,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list:hover,
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr:hover,
    html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr:hover {
        background-color:rgba(15,22,40,0.76) !important;
        box-shadow:0 0 26px -4px rgba(0,243,255,0.30),
            0 14px 34px -16px rgba(0,0,0,0.80),
            inset 0 1px 0 rgba(255,255,255,0.20),
            inset 0 0 0 1px rgba(0,243,255,0.30),
            inset 0 0 12px rgba(0,243,255,0.06) !important;
    }
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list > dt,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list > dt,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dt,
    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list > dd,
    html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list > dd,
    html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list > dd {
        background-color:transparent !important;
        background-image:none !important;
    }
    @media (prefers-reduced-motion: reduce) {
        html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list,
        html.spp-hm-star.spp-hm-uprofile #new-reply > dl.article-list,
        html.spp-hm-star.spp-hm-uprofile #new-topic > dl.article-list,
        html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr,
        html.spp-hm-star.spp-hm-uprofile.spp-up-topic #u-contentmain > table.u-table > tbody > tr {
            transition:none !important;
        }
    }

    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--c {
        color:#00f3ff !important;
        background-color:rgba(0,243,255,0.10) !important;
        box-shadow:inset 0 0 0 1px rgba(0,243,255,0.34), 0 0 10px -2px rgba(0,243,255,0.55) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--m {
        color:#ff5fa8 !important;
        background-color:rgba(255,0,127,0.12) !important;
        box-shadow:inset 0 0 0 1px rgba(255,0,127,0.36), 0 0 10px -2px rgba(255,0,127,0.55) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--p {
        color:#c98bff !important;
        background-color:rgba(176,38,255,0.12) !important;
        box-shadow:inset 0 0 0 1px rgba(176,38,255,0.38), 0 0 10px -2px rgba(176,38,255,0.55) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--g {
        color:#3dffa8 !important;
        background-color:rgba(0,255,150,0.10) !important;
        box-shadow:inset 0 0 0 1px rgba(0,255,150,0.32), 0 0 10px -2px rgba(0,255,150,0.50) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--a {
        color:#ffc247 !important;
        background-color:rgba(255,178,36,0.11) !important;
        box-shadow:inset 0 0 0 1px rgba(255,178,36,0.34), 0 0 10px -2px rgba(255,178,36,0.50) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--b {
        color:#6aa8ff !important;
        background-color:rgba(70,140,255,0.12) !important;
        box-shadow:inset 0 0 0 1px rgba(70,140,255,0.36), 0 0 10px -2px rgba(70,140,255,0.55) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--r {
        color:#ff6b8b !important;
        background-color:rgba(255,60,100,0.11) !important;
        box-shadow:inset 0 0 0 1px rgba(255,60,100,0.34), 0 0 10px -2px rgba(255,60,100,0.52) !important;
    }
    html.spp-hm-star.spp-hm-uprofile.spp-up-post #u-contentmain > table.u-table > tbody > tr > a.spp-ubadge--t {
        color:#4ff0d0 !important;
        background-color:rgba(0,230,190,0.11) !important;
        box-shadow:inset 0 0 0 1px rgba(0,230,190,0.34), 0 0 10px -2px rgba(0,230,190,0.52) !important;
    }

    html.spp-hm-star.spp-hm-uprofile #minifeed > dl.feed-list > dt > a:not(.link1) {
        display:block !important;
        width:fit-content !important;
        max-width:100% !important;
    }

    ` : '');
let el = document.getElementById('spp-starfield-style');
if (!el) {
el = document.createElement('style');
el.id = 'spp-starfield-style';
appendToHeadSafe(el);
}
el.textContent = CSS;
function mount() {
if (document.getElementById('spp-starfield')) return;
const wrap = document.createElement('div');
wrap.id = 'spp-starfield';
wrap.setAttribute('aria-hidden', 'true');
SPP_STAR_LAYERS.forEach(function (L) {
const d = document.createElement('i');
d.style.width = L.size + 'px';
d.style.height = L.size + 'px';
d.style.setProperty('--spp-star-size', L.size + 'px');
d.style.animationDuration = L.dur + 's';
d.style.setProperty('--spp-star-sh', sppStarShadow(SPP_STAR_PTS[L.key]));
wrap.appendChild(d);
});
const host = document.body || document.documentElement;
host.insertBefore(wrap, host.firstChild);
if (glass) document.documentElement.classList.add('spp-hm-star');
}
onDomReady(mount);
}
function initReducedMotionGate() {
const RM_SEL = [
'.spp-led',
'.spp-up-card', '.spp-up__av.spp-av-spin', '.spp-up__av.spp-av-spin::before', '.spp-up__av img',
'.spp-tl-list > .inner::before',
'#wall ul.stream > li > .inner::before',
'.spp-card-clickable > .inner::before',
'html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner::before',
'html.spp-board-skin #wall ul.stream > li.spp-card-clickable > .inner::before',
'.spp-date::before', '.spp-date::after',
'html.spp-board-skin #wall ul.stream > li .spp-date::before',
'html.spp-board-skin #wall ul.stream > li .spp-date::after',
'.spp-nav-dot', '.spp-onb__dot', '.spp-live-dot', '.spp-flame',
'.spp-accretion-disk', '.spp-event-horizon', '.spp-core-idle-icon',
'.spp-accretion-disk svg', '.spp-event-horizon svg', '.spp-core-idle-icon svg',
'.spp-uvbtn::after', '.spp-cm-card__dot', '.spp-cm-card__pill .spp-cm-card__dot',
'.spp-sc__lines span', '.spp-sc__lines', '.spp-lt__lines span', '.spp-lt__lines', '.spp-lt__scan', '.spp-sz-hd__meta b',
'#spp-brand .spp-brand__ld', '#spp-brand .spp-brand__ld::before',
'#spp-brand .spp-brand__ld svg circle', '#spp-brand .spp-brand__ld svg rect', '#spp-brand .spp-brand__ld svg polygon',
'#spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot]::after',
'#spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot] .spp-sub-heat-dot'
].map(function (s) { return 'html body:not(#spp-rm-ignore):not(#spp-rm-ignore-b) ' + s; }).join(',\n  ');
ensureStyle('spp-rm-static', '/* SPP-RM-BEGIN */\n' +
'@media (prefers-reduced-motion: reduce) {\n  ' + RM_SEL + '\n  { animation: none !important; }\n}\n' +
'/* SPP-RM-END */');
}
safeInit('减少动态总闸', initReducedMotionGate);
const FX_LESS_SEL = [
'.spp-led',
'.spp-up-card',
'.spp-up__av.spp-av-spin', '.spp-up__av.spp-av-spin::before', '.spp-up__av img',
'.spp-nav-dot',
'.spp-mk__orbs span', '.spp-mk__back::before',
'.spp-sz-hd__meta b',
'#infobox.spp-up-on .spp-onb__dot',
'.spp-live-dot',
'.spp-accretion-disk', '.spp-event-horizon',
'.spp-cm-card__pill:not(.is-idle) .spp-cm-card__dot',
'#t_7.t > table > tbody > tr > th.h::after',
'.spp-cm-card__spin',                     
'.spp-core-idle-icon',                    
'.spp-cmc-foldph__ico',                   
'html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-sidebar > .bgA::after',   
'html.spp-hm-star.spp-hm-uprofile #u-wrap2 #u-portrait td:first-child img', 
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-online-dot',  
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-online-dot',
'html #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot]::after',              
'html[data-spp-scheme="star"] #main #spp-announce .spp-pane-subs #cate_children > tr.f_one[data-spp-hot] .spp-sub-heat-dot', 
'html.spp-board-skin #wall ul.stream > li.spp-tl-list > .inner::before' 
].map(function (s) { return 'html.spp-fx-less ' + s; }).join(',\n  ');
const FX_LESS_HIDE_SEL = [
'.spp-sc__lines span', '.spp-lt__lines span',
'.spp-sc__scan', '.spp-lt__scan'
].map(function (s) { return 'html.spp-fx-less ' + s; }).join(',\n  ');
function fxLoopOn() {
try {
const row = document.querySelector('.spp-gs-row[data-key="spp_fx_loop"]');
const inp = row ? row.querySelector('input[type="checkbox"]') : null;
if (inp) return !!inp.checked;
} catch (e) { }
try { return SPP_CONFIG.bool('spp_fx_loop', true); } catch (e) { return true; }
}
function applyFxGate() {
try {
const on = fxLoopOn();
document.documentElement.classList.toggle('spp-fx-less', !on);
} catch (e) { }
}
function initFxGate() {
ensureStyle('spp-fx-static', '/* SPP-FX-BEGIN */\n' + FX_LESS_SEL + '\n{ animation: none !important; }\n' +
FX_LESS_HIDE_SEL + '\n{ animation: none !important; opacity: 0 !important; visibility: hidden !important; }\n/* SPP-FX-END */');
applyFxGate();
try { window.__sppApplyFxGate = applyFxGate; } catch (e) { }
try {
document.addEventListener('click', function (ev) {
try {
var b = ev.target && ev.target.closest ? ev.target.closest('.spp-gs-save') : null;
if (b) setTimeout(applyFxGate, 0);
} catch (e2) { }
}, true);
} catch (e3) { }
}
safeInit('装饰动效开关', initFxGate);
function collectGlassSelectors() {
const out = [];
try {
const sheets = Array.prototype.slice.call(document.styleSheets);
for (const sh of sheets) {
let rules = null;
try { rules = sh.cssRules; } catch (e) { continue; }
if (!rules) continue;
const walk = function (list) {
for (const r of Array.prototype.slice.call(list)) {
try {
if (r.selectorText && r.style) {
const bf = r.style.backdropFilter, wf = r.style.webkitBackdropFilter;
const has = (bf && bf !== 'none') || (wf && wf !== 'none');
if (has && out.indexOf(r.selectorText) < 0) out.push(r.selectorText);
}
if (r.cssRules) walk(r.cssRules);
} catch (e2) { }
}
};
walk(rules);
}
} catch (e) { }
return out;
}
function buildGlassOffCss() {
const sels = collectGlassSelectors();
const head = sels.length
? sels.map(function (s) {
const s2 = String(s).replace(/^\s*html(?=[.#:\s\[]|$)/i, '');
return 'html.spp-glass-off ' + s2;
}).join(',\n') + ' { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }'
: '';
const ROOTS = ['#main', '#spp-nav-panel', '#header', '#toptool', '#spp-imgidx',
'#spp-global-settings-overlay', '#spp-announce', '#spp-bnotice', '#spp-btabs',
'#spp-tip-box', '#spp-preview-pane', '#wall', '#u-wrap2', '#infobox'];
const raster = [];
ROOTS.forEach(function (c) {
raster.push('html.spp-glass-off ' + c, 'html.spp-glass-off ' + c + ' *',
'html.spp-glass-off ' + c + ' *::before', 'html.spp-glass-off ' + c + ' *::after');
});
const tail = raster.join(',\n') + ',html.spp-glass-off *, html.spp-glass-off *::before, html.spp-glass-off *::after' +
' { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }';
const nuke = ':root.spp-glass-off *:not(#\\9), :root.spp-glass-off *:not(#\\9)::before, :root.spp-glass-off *:not(#\\9)::after' +
' { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; }';
return [head, tail, nuke, GLASS_OFF_CSS].filter(Boolean).join('\n');
}
const GLASS_OFF_CSS = [
'/* ② 浮在真实内容上方的几类:保持色相、alpha≥0.9 */',
'html.spp-glass-off #spp-nav-panel { background-color: rgba(6,10,20,0.94) !important; }',
'html.spp-glass-off #spp-global-settings-overlay { background-color: rgba(15,23,42,0.92) !important; }',
'html.spp-glass-off #main .spp-pgbar { background-color: rgb(0 0 0 / 0.92) !important; }',
'html.spp-glass-off.spp-hm-star #toptool, html.spp-glass-off.spp-hm-star #header { background-color: rgba(9,13,21,0.94) !important; }'
].join('\n');
var GLASS_TOUCHED = [];
function clearBlurHard() {
try {
const all = document.querySelectorAll('*');
for (const el of all) {
let cs; try { cs = getComputedStyle(el); } catch (e0) { continue; }
const bf = cs.backdropFilter, wbf = cs.webkitBackdropFilter;
const has = (bf && bf !== 'none') || (wbf && wbf !== 'none');
if (!has) continue;
if (el.hasAttribute('data-spp-gc')) continue;      
try {
el.setAttribute('data-spp-gc', '1');
el.setAttribute('data-spp-gc-bf', el.style.getPropertyValue('backdrop-filter') || '');
el.setAttribute('data-spp-gc-bfp', el.style.getPropertyPriority('backdrop-filter') || '');
el.setAttribute('data-spp-gc-wbf', el.style.getPropertyValue('-webkit-backdrop-filter') || '');
el.setAttribute('data-spp-gc-wbfp', el.style.getPropertyPriority('-webkit-backdrop-filter') || '');
el.style.setProperty('backdrop-filter', 'none', 'important');
el.style.setProperty('-webkit-backdrop-filter', 'none', 'important');
} catch (e1) { }
}
} catch (e) { }
}
function restoreBlurHard() {
try {
const touched = document.querySelectorAll('[data-spp-gc]');
for (const el of touched) {
try {
const bf = el.getAttribute('data-spp-gc-bf') || '', bfp = el.getAttribute('data-spp-gc-bfp') || '';
const wbf = el.getAttribute('data-spp-gc-wbf') || '', wbfp = el.getAttribute('data-spp-gc-wbfp') || '';
if (bf && bf !== 'none') el.style.setProperty('backdrop-filter', bf, bfp); else el.style.removeProperty('backdrop-filter');
if (wbf && wbf !== 'none') el.style.setProperty('-webkit-backdrop-filter', wbf, wbfp); else el.style.removeProperty('-webkit-backdrop-filter');
el.removeAttribute('data-spp-gc'); el.removeAttribute('data-spp-gc-bf'); el.removeAttribute('data-spp-gc-bfp');
el.removeAttribute('data-spp-gc-wbf'); el.removeAttribute('data-spp-gc-wbfp');
} catch (e2) { }
}
GLASS_TOUCHED = [];
} catch (e) { }
}
function glassOnNow() {
try {
const ov = document.getElementById('spp-global-settings-overlay');
if (ov && ov.classList.contains('spp-open')) {
const row = document.querySelector('.spp-gs-row[data-key="spp_glass"]');
const inp = row ? row.querySelector('input[type="checkbox"]') : null;
if (inp) return !!inp.checked;
}
} catch (e0) { }
try {
if (typeof GM_getValue === 'function') {
const rv = GM_getValue('spp_glass', null);
if (rv !== null && rv !== undefined) {
const sv = String(rv);
if (sv === 'true' || sv === 'btrue') return true;
if (sv === 'false' || sv === 'bfalse') return false;
}
}
} catch (e1) { }
try { return SPP_CONFIG.bool('spp_glass', false); } catch (e) { return false; }
}
function applyGlassGate() {
try {
const on = glassOnNow();
const html = document.documentElement;
let st = document.getElementById('spp-glass-off');
if (on) {
html.classList.remove('spp-glass-off');
if (st && st.parentNode) st.parentNode.removeChild(st);
restoreBlurHard();
return;
}
html.classList.add('spp-glass-off');
if (!st) { st = document.createElement('style'); st.id = 'spp-glass-off'; appendToHeadSafe(st); }
const css = buildGlassOffCss();
if (st.textContent !== css) st.textContent = css;   
try {
document.documentElement.setAttribute('data-spp-glass-csslen', String(css.length));
document.documentElement.setAttribute('data-spp-glass-sels', String(collectGlassSelectors().length));
} catch (eG) { }
clearBlurHard();                                   
} catch (e) { }
}
function initGlassGate() {
applyGlassGate();
try { window.__sppApplyGlassGate = applyGlassGate; } catch (e) { }
try {
[400, 1600, 3200, 6000, 12000].forEach(function (t) { setTimeout(applyGlassGate, t); });
window.addEventListener('load', function () { setTimeout(applyGlassGate, 300); });
try {
const of = SPP_FLOW_SYNC.onPush;
SPP_FLOW_SYNC.onPush = function () {
try { if (typeof of === 'function') of.apply(null, arguments); } catch (e) { }
try { setTimeout(applyGlassGate, 120); } catch (e2) { }
};
} catch (e3) { }
} catch (e4) { }
try {
document.addEventListener('click', function (ev) {
try { var b = ev.target && ev.target.closest ? ev.target.closest('.spp-gs-save') : null; if (b) setTimeout(applyGlassGate, 0); } catch (e2) { }
}, true);
} catch (e3) { }
}
safeInit('毛玻璃开关', initGlassGate);
function initLayoutContain() {
ensureStyle('spp-contain', '/* SPP-CONTAIN-BEGIN */\n' +
'#wall ul.stream > li { contain: layout style; }\n' +
'#main > form[name="delatc"] > .t5.t2 { contain: layout style; }\n' +
'/* SPP-CONTAIN-END */');
}
safeInit('布局隔离', initLayoutContain);
function isTaskPage() {
return PAGE.task;
}
function initTaskPage() {
if (!isTaskPage()) return;
document.documentElement.classList.add('spp-hm-task');
}
function isUprofilePage() {
return /^\/u\.php$/i.test(location.pathname);
}
function initUprofilePage() {
if (!isUprofilePage()) return;
const root = document.documentElement;
root.classList.add('spp-hm-uprofile');
const m = /action[-=]([a-z_]+)/i.exec(location.search);
root.classList.add('spp-up-' + (m ? m[1].toLowerCase() : 'index'));
}
function isUprofilePostPage() {
return isUprofilePage() && /action[-=]post\b/i.test(location.search);
}
function initUprofilePostCards() {
if (!isUprofilePostPage()) return;
onDomReady(function () {
const rows = document.querySelectorAll('#u-contentmain > table.u-table > tbody > tr');
for (let i = 0; i < rows.length; i++) {
const tr = rows[i];
if (tr.dataset.sppUpc) continue;
const th = tr.querySelector(':scope > th');
const td = tr.querySelector(':scope > td');
if (!th || !td) continue;
let meta = td.querySelector(':scope > .spp-upc-meta');
const board = th.querySelector('a.gray') || (meta && meta.querySelector('a.gray'));
const date = th.querySelector('span.gray.f9') || (meta && meta.querySelector('span.gray.f9'));
if (!board || !date) continue;
if (!meta) {
meta = document.createElement('span');
meta.className = 'spp-upc-meta';
td.appendChild(meta);
}
if (date.parentNode !== meta) meta.appendChild(date);
const fm = /fid[-=](\d+)/.exec(board.getAttribute('href') || '');
const PAL = ['c', 'm', 'p', 'g', 'a', 'b', 'r', 't'];
let seed = ((fm ? Number(fm[1]) : 0) ^ (i * 7919)) >>> 0;
seed = (seed ^ (seed << 13)) >>> 0;
seed = (seed ^ (seed >>> 17)) >>> 0;
seed = (seed ^ (seed << 5)) >>> 0;
const btxt = String(board.textContent || '');
for (let ci = 0; ci < btxt.length; ci++) seed = ((seed * 33) + btxt.charCodeAt(ci)) >>> 0;
seed = (seed ^ (seed >>> 16)) >>> 0;
seed = Math.imul(seed, 2246822507) >>> 0;
seed = (seed ^ (seed >>> 13)) >>> 0;
seed = Math.imul(seed, 3266489909) >>> 0;
seed = (seed ^ (seed >>> 16)) >>> 0;
board.classList.add('spp-ubadge', 'spp-ubadge--' + PAL[seed % PAL.length]);
tr.insertBefore(board, tr.firstChild);
tr.dataset.sppUpc = '1';
}
});
}
function initUprofileHomeStats() {
if (!isUprofilePage()) return;
if (/action[-=]/.test(location.search)) return;
onDomReady(function () {
const dds = document.querySelectorAll('#new-topic > dl.article-list > dd');
for (let i = 0; i < dds.length; i++) {
const dd = dds[i];
if (dd.dataset.sppUstat) continue;
for (let n = dd.firstChild; n; n = n.nextSibling) {
if (n.nodeType !== 3) continue;
const m = /^(\s*)(回复\s*\d+)\s*[,,]\s*(浏览\s*\d+)(\s*)$/.exec(n.nodeValue || '');
if (!m) continue;
const frag = document.createDocumentFragment();
const s1 = document.createElement('span');
s1.className = 'spp-ustat spp-ustat--r';
s1.textContent = m[2];
const s2 = document.createElement('span');
s2.className = 'spp-ustat spp-ustat--v';
s2.textContent = m[3];
frag.appendChild(s1);
frag.appendChild(s2);
dd.replaceChild(frag, n);
break;
}
dd.dataset.sppUstat = '1';
}
});
}
function isFavorPage() {
return isUprofilePage() && /action[-=]favor\b/i.test(location.search);
}
function initFavorPageUI() {
if (!isFavorPage()) return;
onDomReady(function () {
const center = document.querySelector('#u-contentmain > form > center');
if (!center || center.dataset.sppFavJob) return;
const radios = center.querySelectorAll('input[type="radio"][name="job"]');
if (radios.length < 2) return;
center.dataset.sppFavJob = '1';
function paintFavJob() {
Array.prototype.forEach.call(center.querySelectorAll('.spp-fav-job'), function (l) {
const inp = l.querySelector('input[type="radio"]');
l.classList.toggle('is-on', !!(inp && inp.checked));
});
const del = center.querySelector('.spp-fav-job--del input[type="radio"]');
center.classList.toggle('spp-fav-danger', !!(del && del.checked));
}
Array.prototype.forEach.call(radios, function (r) {
const label = document.createElement('label');
label.className = 'spp-fav-job' + (r.value === 'clear' ? ' spp-fav-job--del' : '');
r.parentNode.insertBefore(label, r);
label.appendChild(r);
let n = label.nextSibling;
while (n && n.nodeType === 3) {
const nxt = n.nextSibling;
const t = String(n.nodeValue || '').replace(/[\s\u00a0]+/g, ' ').trim();
label.appendChild(n);
if (t) break;
n = nxt;
}
r.addEventListener('change', paintFavJob);
});
paintFavJob();
if (SPP_TIP && SPP_TIP.attach) {
Array.prototype.forEach.call(
document.querySelectorAll('#u-contentside td.fav > a.fr'),
function (a) { SPP_TIP.attach(a, '删除这个分类目录(会先弹一次确认框)'); }
);
}
});
}
function initTaskAutoClaim() {
if (!SPP_CONFIG.bool('spp_task_autoclaim', true)) return;
GM_addStyle(
'#spp-task-toast {' +
'position:fixed; right:18px; bottom:18px; z-index:100004;' +
'max-width:min(370px, calc(100vw - 36px)); padding:12px 15px; border-radius:12px;' +
'background-color:rgba(10,14,22,0.94);' +
'background-image:linear-gradient(180deg, rgba(255,255,255,0.07) 0%, rgba(255,255,255,0) 70%);' +
'background-repeat:no-repeat; color:#dbe4ef; border:1px solid rgba(255,255,255,0.10);' +
'box-shadow:0 20px 54px rgba(2,6,23,0.6), inset 0 1px 0 rgba(255,255,255,0.06);' +
'backdrop-filter:blur(14px) saturate(140%); -webkit-backdrop-filter:blur(14px) saturate(140%);' +
'font-size:12.5px; line-height:1.75; opacity:0; transform:translateY(10px);' +
'pointer-events:none; transition:opacity .3s ease, transform .3s ease; }' +
'#spp-task-toast.spp-on { opacity:1; transform:translateY(0); }' +
'#spp-task-toast .spp-tt-h { color:#eaf2fb; font-weight:650; margin-bottom:3px; }' +
'#spp-task-toast .spp-tt-b { color:#9fb0c4; }'
);
const LAST = 'spp_task_claim_at';
const LOG = 'spp_task_claimed';
const GAP = 3 * 60 * 60 * 1000;
const GUARD = 24 * 60 * 60 * 1000;
const TASK_URL = 'plugin.php?H_name-tasks.html';
const RUN_URL = 'plugin.php?H_name-tasks-actions-newtasks.html.html';
const JOB = 'plugin.php?H_name=tasks&action=ajax&actions=job&cid=';
const JOB2 = 'plugin.php?H_name=tasks&action=ajax&actions=job2&cid=';
const ON_TASK = isTaskPage();
const now = Date.now();
if (!ON_TASK && now - (Number(GM_getValue(LAST, 0)) || 0) < GAP) return;
GM_setValue(LAST, now);
function cidsFrom(html) {
const out = [];
let m;
const reJob = /startjob\(\s*(\d+)\s*\)/g;
while ((m = reJob.exec(html))) if (out.indexOf(m[1]) < 0) out.push(m[1]);
if (!out.length && html.indexOf('startjob') >= 0) {
const reId = /\bid=["']p_(\d+)["']/g;
while ((m = reId.exec(html))) if (out.indexOf(m[1]) < 0) out.push(m[1]);
}
return out;
}
function scanDoc() {
return Promise.resolve(cidsFrom(document.documentElement.innerHTML));
}
function scanUrl(url) {
const u = url + (url.indexOf('?') < 0 ? '?' : '&') + '_spp=' + Date.now();
return fetch(u, { credentials: 'same-origin' })
.then(function (r) { return r.ok ? r.text() : ''; })
.then(cidsFrom)
.catch(function () { return []; });
}
function scanAll() {
const jobs = [scanUrl(TASK_URL), scanUrl(RUN_URL)];
if (ON_TASK) jobs.push(scanDoc());
return Promise.all(jobs).then(function (rs) {
const list = [];
rs.forEach(function (a) {
(a || []).forEach(function (c) { if (list.indexOf(c) < 0) list.push(c); });
});
return list;
});
}
function post(url) {
return fetch(url + '&nowtime=' + Date.now(),
{ credentials: 'same-origin', headers: { 'X-Requested-With': 'XMLHttpRequest' } })
.then(function (r) { return r.text(); })
.then(function (txt) {
const cd = /<!\[CDATA\[([\s\S]*?)\]\]>/.exec(txt);
const parts = (cd ? cd[1] : txt).split('\t');
return { ok: parts[0] === 'success', msg: (parts[1] || '').trim(), tid: (parts[2] || '').trim() };
})
.catch(function () { return { ok: false, msg: '请求失败' }; });
}
function claim(cid) {
return post(JOB + cid).then(function (ap) {
const h = /还没超过\s*(\d+)\s*小时/.exec(ap.msg || '');
return post(JOB2 + cid).then(function (g) {
g.cid = cid;
g.step = ap.msg;
g.wait = h ? Number(h[1]) * 3600 * 1000 : 0;
return g;
});
});
}
function gateRead() {
try { return JSON.parse(GM_getValue(LOG, '{}')) || {}; } catch (_) { return {}; }
}
function gateLeft(g, cid) {
const r = g[cid];
if (!r) return 0;
const until = Math.max((Number(r.at) || 0) + GUARD, Number(r.until) || 0);
return until - Date.now();
}
function gateSave(g) {
try { GM_setValue(LOG, JSON.stringify(g)); } catch (_) { }
}
function toast(title, lines) {
if (!document.body) { onDomReady(function () { toast(title, lines); }); return; }
let box = document.getElementById('spp-task-toast');
if (!box) { box = document.createElement('div'); box.id = 'spp-task-toast'; document.body.appendChild(box); }
box.textContent = '';
const h = document.createElement('div');
h.className = 'spp-tt-h';
h.textContent = title;
box.appendChild(h);
lines.forEach(function (t) {
const d = document.createElement('div');
d.className = 'spp-tt-b';
d.textContent = t;
box.appendChild(d);
});
void box.offsetHeight;
box.classList.add('spp-on');
if (box.__sppT) clearTimeout(box.__sppT);
box.__sppT = setTimeout(function () { box.classList.remove('spp-on'); }, 9000);
}
let running = false;
function run() {
if (running) return Promise.resolve({ skipped: 'already-running' });
running = true;
const gate = gateRead();
const res = {};
const got = [];
const found = [];
let scanned = 0;
function round(n) {
return scanAll().then(function (cids) {
cids.forEach(function (c) { if (found.indexOf(c) < 0) found.push(c); });
const todo = cids.filter(function (c) {
if (gateLeft(gate, c) > 0) return false;
if (n === 0) return true;
const r = res[c];
return !!(r && r.round === 0 && !r.ok && !r.wait);
});
if (!todo.length) return;
scanned += todo.length;
return todo.reduce(function (p, c) {
return p.then(function () {
return claim(c).then(function (g) {
g.round = n;
res[c] = g;
got.push(g);
if (g.ok) { gate[c] = { at: Date.now() }; gateSave(gate); }
else if (g.wait) { gate[c] = { until: Date.now() + g.wait }; gateSave(gate); }
});
});
}, Promise.resolve()).then(function () {
if (n > 0) return;
return new Promise(function (x) { setTimeout(x, 1500); }).then(function () { return round(1); });
});
});
}
return round(0).then(function () {
running = false;
gateSave(gate);
const ok = got.filter(function (g) { return g.ok; });
const no = got.filter(function (g) { return !g.ok; });
const out = { found: found, scanned: scanned, ok: ok.length, rejected: no.length, results: got };
if (ok.length) {
toast('社区论坛任务 · 自动领取 ' + ok.length + ' 项',
ok.map(function (g) { return '✓ ' + (g.msg || ('cid ' + g.cid)); }));
console.info('[SPP] 社区论坛任务自动领取成功:', out);
} else {
console.info('[SPP] 社区论坛任务自动领取:本次没有可领取的任务(尝试 ' + scanned + ' 枚按钮)', out);
}
return out;
}).catch(function (e) {
running = false;
console.warn('[SPP] 社区论坛任务自动领取异常:', e);
return { error: String(e) };
});
}
window.__SPP_TASKS = {
run: run,
scan: function () { return scanAll(); },
urls: [TASK_URL, RUN_URL]
};
document.addEventListener('spp-tasks-run', function () { run(); });
if (document.readyState === 'interactive' || document.readyState === 'complete') {
setTimeout(function () { run(); }, 500);
} else {
onDomReady(function () { setTimeout(function () { run(); }, 500); });
}
}
const sppDrops = [];
function sppDropsClose(except) {
sppDrops.forEach(function (d) { if (d !== except) d.close(); });
}
document.addEventListener('click', function () { sppDropsClose(null); });
document.addEventListener('keydown', function (e) { if (e.key === 'Escape') sppDropsClose(null); });
function initDropdowns(root) {
if (!root) return 0;
let n = 0;
Array.prototype.forEach.call(root.querySelectorAll('select'), function (sel) {
if (sel.dataset.sppDd) return;
sel.dataset.sppDd = '1';
n++;
const wrap = document.createElement('span');
wrap.className = 'spp-dd';
sel.parentNode.insertBefore(wrap, sel);
wrap.appendChild(sel);
const btn = document.createElement('button');
btn.type = 'button';
btn.className = 'spp-dd-btn';
btn.setAttribute('aria-haspopup', 'listbox');
btn.setAttribute('aria-expanded', 'false');
const txt = document.createElement('span');
txt.className = 'spp-dd-txt';
const car = document.createElement('span');
car.className = 'spp-dd-caret';
car.setAttribute('aria-hidden', 'true');
btn.appendChild(txt);
btn.appendChild(car);
const pop = document.createElement('div');
pop.className = 'spp-dd-pop';
pop.setAttribute('role', 'listbox');
const opts = [];
Array.prototype.forEach.call(sel.options, function (o, i) {
const d = document.createElement('div');
d.className = 'spp-dd-opt';
d.setAttribute('role', 'option');
d.dataset.i = String(i);
d.textContent = String(o.text).replace(/\s+/g, ' ').trim();
pop.appendChild(d);
opts.push(d);
});
wrap.appendChild(btn);
wrap.appendChild(pop);
let hi = 0;
function paint() {
opts.forEach(function (d, i) {
d.classList.toggle('is-on', i === sel.selectedIndex);
d.classList.toggle('is-hi', i === hi);
});
}
function reveal() {
const on = opts[hi];
if (on && on.scrollIntoView) on.scrollIntoView({ block: 'nearest' });
}
function sync() {
txt.textContent = opts[sel.selectedIndex] ? opts[sel.selectedIndex].textContent : '';
paint();
}
const api = {
isOpen: function () { return wrap.classList.contains('is-open'); },
close: function () {
wrap.classList.remove('is-open');
btn.setAttribute('aria-expanded', 'false');
},
open: function () {
sppDropsClose(api);
wrap.classList.add('is-open');
btn.setAttribute('aria-expanded', 'true');
hi = Math.max(0, sel.selectedIndex);
paint();
reveal();
},
move: function (dy) {
hi = Math.min(opts.length - 1, Math.max(0, hi + dy));
paint();
reveal();
},
take: function () {
sel.selectedIndex = hi;
sel.dispatchEvent(new Event('change', { bubbles: true }));
sync();
api.close();
btn.focus();
}
};
btn.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
if (api.isOpen()) api.close(); else api.open();
});
btn.addEventListener('keydown', function (e) {
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
e.preventDefault();
if (api.isOpen()) api.move(e.key === 'ArrowDown' ? 1 : -1); else api.open();
} else if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
if (api.isOpen()) api.take(); else api.open();
} else if (e.key === 'Escape') {
api.close();
}
});
opts.forEach(function (d, i) {
d.addEventListener('mouseenter', function () { hi = i; paint(); });
d.addEventListener('click', function (e) { e.stopPropagation(); hi = i; api.take(); });
});
sppDrops.push(api);
sync();
});
return n;
}
function sppSyncDayFromUrl(root) {
const m = location.href.match(/search-([a-z0-9]+?)-page-/) ||
location.href.match(/[?&]search=([a-z0-9]+)/);
if (!m) return '';
const sel = root.querySelector('select[name="search"]');
if (!sel) return '';
const hit = Array.prototype.filter.call(sel.options, function (o) { return o.value === m[1]; })[0];
if (!hit) return '';
sel.selectedIndex = hit.index;
return m[1];
}
function sppFilterUrl() {
const fm = location.href.match(/fid-(\d+)/) || location.href.match(/[?&]fid=(\d+)/);
if (!fm) return '';
const form = document.querySelector('#main .spp-t5bar form');
if (!form) return '';
const val = function (name) { const e = form.elements[name]; return e ? String(e.value || '') : ''; };
const day = val('search');
const way = val('orderway') || 'lastpost';
const dir = val('asc') === 'ASC' ? 'ASC' : 'DESC';
const pm = location.href.match(/page-(\d+)/) || location.href.match(/[?&]page=(\d+)/);
const page = (pm && pm[1]) || '1';
const seg = function (k) {
const m = location.href.match(new RegExp(k + '-(\\d+)')) ||
location.href.match(new RegExp('[?&]' + k + '=(\\d+)'));
return m ? m[1] : '';
};
const type = seg('type'), special = seg('special');
return location.origin + '/thread_new.php?fid-' + fm[1] +
(type ? '-type-' + type : '') + (special ? '-special-' + special : '') +
(day ? '-search-' + day : '') +
(way === 'lastpost' && dir === 'DESC' ? '' : '-orderway-' + way + '-asc-' + dir) +
'-page-' + page + '.html';
}
function initT5Apply(root) {
const btn = root.querySelector('form input.btn');
if (!btn || btn.dataset.sppApply) return 0;
btn.dataset.sppApply = '1';
document.addEventListener('click', function (ev) {
if (ev.target !== btn) return;
const url = sppFilterUrl();
if (!url) return;
ev.preventDefault();
ev.stopPropagation();
sppDropsClose(null);
location.href = url;
}, true);
return 1;
}
function initBoardNotice() {
if (!PAGE.board) return;
onDomReady(function () {
if (document.getElementById('spp-btabs')) return;      
const cat = document.getElementById('cate_thread');
const panel = document.getElementById('spp-announce');   
let rules = null, cover = null, pan = null;
if (cat) {
pan = Array.from(cat.children).find(function (c) {
return c.classList && c.classList.contains('tr1') &&
(c.textContent || '').replace(/\s+/g, '').length >= 40;
});
if (pan) {
const nodes = [];
Array.from(pan.childNodes).forEach(function (n) {
if (n.nodeType === 1) {
if (!cover && n.tagName === 'DIV' && n.hasAttribute('align') && n.querySelector('img')) {
cover = n;
return;
}
nodes.push(n);
} else if (n.nodeType === 3 && n.textContent.trim()) {
nodes.push(n);
}
});
if (nodes.length) rules = nodes;
}
}
let subs = null;
const subBody = document.getElementById('cate_children');
if (subBody) {
const tb = subBody.closest('table');
subs = (tb && tb.parentElement) || tb;
}
let cats = null, catsWrap = null;
const catRow = document.querySelector('#ajaxtable ul.threadlist') || document.querySelector('ul.threadlist');
if (catRow && Array.prototype.some.call(catRow.querySelectorAll('li[id^="thread_type_"]'), function (li) {
return li.id !== 'thread_type_all' && li.id !== 'thread_type_digest';
})) {
cats = catRow;
catsWrap = catRow.closest('.hthread') || catRow.parentElement;   
}
if (!panel) {
if (!rules || document.getElementById('spp-bnotice')) return;
const anchor = document.createComment('spp-bnotice');
rules[0].parentNode.insertBefore(anchor, rules[0]);
const box = document.createElement('section');
box.id = 'spp-bnotice';
box.dataset.open = '0';                 
const head = document.createElement('button');
head.type = 'button';
head.className = 'spp-ann-head';
head.setAttribute('aria-expanded', 'false');
const t = document.createElement('span');
t.className = 'spp-ann-title';
t.textContent = '本版公告';
const h = document.createElement('span');
h.className = 'spp-ann-hint';
h.textContent = '版规与注意事项';
const cv = document.createElement('span');
cv.className = 'spp-ann-chev';
cv.setAttribute('aria-hidden', 'true');
head.appendChild(t); head.appendChild(h); head.appendChild(cv);
const body = document.createElement('div');
body.className = 'spp-ann-body';
const inner = document.createElement('div');
inner.className = 'spp-ann-inner';
const raw = document.createElement('div');
raw.className = 'spp-ann-raw';
rules.forEach(function (n) { raw.appendChild(n); });
inner.appendChild(raw);
body.appendChild(inner);
box.appendChild(head);
box.appendChild(body);
anchor.parentNode.replaceChild(box, anchor);
head.addEventListener('click', function () {
const open = box.dataset.open === '1';
box.dataset.open = open ? '0' : '1';
head.setAttribute('aria-expanded', open ? 'false' : 'true');
});
return;
}
const panes = {};
Array.prototype.forEach.call(panel.querySelectorAll('.spp-pane'), function (p) {
panes[p.dataset.pane] = p;
});
function put(key, wrapCls, nodes) {
const pane = panes[key];
if (!pane) return false;
const wrap = document.createElement('div');
wrap.className = wrapCls;
nodes.forEach(function (n) { wrap.appendChild(n); });
pane.appendChild(wrap);
return true;
}
const countEl = panel.querySelector('.spp-ann-count');
const tabs = [];
const noticeNum = countEl ? String(countEl.textContent).trim() : '';
if (panes.notice && noticeNum !== '0') {
tabs.push({ key: 'notice', name: '公告', hint: '置顶与论坛公告', num: noticeNum });
}
if (rules && put('rules', 'spp-ann-raw', rules)) {
tabs.push({ key: 'rules', name: '本版公告', hint: '版规与注意事项' });
}
if (subs && put('subs', 'spp-pane-subs', [subs])) {
tabs.push({ key: 'subs', name: '子版块', hint: '本版子版块' });
}
if (cover && put('cover', 'spp-pane-cover', [cover])) {
tabs.push({ key: 'cover', name: '版头图', hint: '本板块图片' });
}
if (cats && put('cats', 'spp-pane-cats', [cats])) {
tabs.push({
key: 'cats', name: '分类',
hint: Array.prototype.map.call(cats.querySelectorAll('li'), function (li) {
return (li.textContent || '').replace(/\s+/g, '');
}).filter(Boolean).join(' / ')
});
if (catsWrap && !catsWrap.children.length) {
catsWrap.style.setProperty('display', 'none', 'important');
}
}
if (tabs.length < 2) return;
const bar = document.createElement('section');
bar.id = 'spp-btabs';
bar.className = 'spp-paired';
const btns = tabs.map(function (it, i) {
const b = document.createElement('button');
b.type = 'button';
b.className = 'spp-tab' + (i === 0 ? ' is-on' : '');
b.dataset.pane = it.key;
b.dataset.name = it.name;
b.dataset.hint = it.hint || '';
b.dataset.num = it.num || '';
b.appendChild(document.createTextNode(it.name));
if (it.num) {
const n = document.createElement('span');
n.className = 'spp-tab-n';
n.textContent = String(it.num);
b.appendChild(n);
}
return b;
});
btns.forEach(function (b, i) {
if (i) {
const d = document.createElement('span');
d.className = 'spp-tab-div';
d.setAttribute('aria-hidden', 'true');
bar.appendChild(d);
}
bar.appendChild(b);
});
const titleEl = panel.querySelector('.spp-ann-title');
const hintEl = panel.querySelector('.spp-ann-hint');
function activate(btn, open) {
btns.forEach(function (b) { b.classList.toggle('is-on', b === btn); });
Array.prototype.forEach.call(panel.querySelectorAll('.spp-pane'), function (p) {
p.classList.toggle('is-on', p.dataset.pane === btn.dataset.pane);
});
if (titleEl) titleEl.textContent = btn.dataset.name;
if (countEl) {
countEl.textContent = btn.dataset.num || '';
countEl.style.display = btn.dataset.num ? '' : 'none';
}
if (hintEl) hintEl.textContent = btn.dataset.hint || '';
if (open) panel.dataset.open = '1';
}
btns.forEach(function (b) {
b.addEventListener('click', function () { activate(b, true); });
});
panel.classList.add('spp-paired');
panel.parentElement.insertBefore(bar, panel);
const defPane = SPP_PANE_DEFAULT[sppFidNum()] || '';
const defBtn = defPane ? btns.filter(function (b) { return b.dataset.pane === defPane; })[0] : null;
activate(defBtn || btns[0], !!defBtn);
if (defBtn) {
const headBtn = panel.querySelector('.spp-ann-head');
if (headBtn) headBtn.setAttribute('aria-expanded', 'true');
}
sppAskChipMount(bar, cats);
if (!cats && catRow) {
const catBox = document.createElement('div');
catBox.className = 'spp-catrow';
catBox.appendChild(catRow);
bar.appendChild(catBox);
sppTeaChipMount(catBox);
const holder = catRow.parentElement;
const rowEl = (holder && holder.closest('tr')) || holder;
if (rowEl && !rowEl.querySelector('a, img, input, table, button') &&
!(rowEl.textContent || '').replace(/\s+/g, '').length) {
rowEl.style.setProperty('display', 'none', 'important');
}
}
const t5bar = Array.prototype.filter.call(
document.querySelectorAll('#main > div.t5'),
function (el) {
return !el.classList.contains('t_one') && !!el.querySelector('table.f_one');
}
)[0];
if (t5bar && !t5bar.classList.contains('spp-t5bar')) {
t5bar.classList.add('spp-t5bar');
bar.parentNode.insertBefore(t5bar, bar);
sppSyncDayFromUrl(t5bar);
initDropdowns(t5bar);
initT5Apply(t5bar);
}
const panels = cat ? Array.from(cat.querySelectorAll('.tr1')) : [];
const emptied = !!pan && panels.length > 0 && panels.every(function (p) {
return p.children.length === 0 && !p.textContent.replace(/\s+/g, '').length;
});
if (emptied) {
cat.style.setProperty('display', 'none', 'important');
const gg = cat.closest('.gonggao');
const legend = gg ? gg.querySelector('ul.gongul') : null;
if (legend) legend.style.setProperty('display', 'none', 'important');
}
});
}
const SPP_SUB_ICONS = {
palette: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zm0 0h12a2 2 0 002-2v-4a2 2 0 00-2-2h-2.343M11 7.343l1.657-1.657a2 2 0 012.828 0l2.829 2.829a2 2 0 010 2.828l-8.486 8.485M7 17h.01"></path></svg>',
headphones: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M19 11a7 7 0 01-7 7m0 0a7 7 0 01-7-7m7 7v4m0 0H8m4 0h4m-4-8a3 3 0 100-6 3 3 0 000 6z"></path></svg>',
video: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M15 10l4.553-2.276A1 1 0 0121 8.618v6.764a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z"></path></svg>',
film: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M7 4v16M17 4v16M3 8h4m10 0h4M3 12h18M3 16h4m10 0h4M4 20h16a1 1 0 001-1V5a1 1 0 00-1-1H4a1 1 0 00-1 1v14a1 1 0 001 1z"></path></svg>',
book: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M12 6.253v13m0-13C10.832 5.477 9.246 5 7.5 5S4.168 5.477 3 6.253v13C4.168 18.477 5.754 18 7.5 18s3.332.477 4.5 1.253m0-13C13.168 5.477 14.754 5 16.5 5c1.747 0 3.332.477 4.5 1.253v13C19.832 18.477 18.247 18 16.5 18c-1.746 0-3.332.477-4.5 1.253"></path></svg>',
grid: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"></path></svg>',
gamepad: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M15 5v2m0 4v2m0 4v2M5 5a2 2 0 00-2 2v3a2 2 0 110 4v3a2 2 0 002 2h14a2 2 0 002-2v-3a2 2 0 110-4V7a2 2 0 00-2-2H5z"></path></svg>',
camera: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"></path><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M15 13a3 3 0 11-6 0 3 3 0 016 0z"></path></svg>',
heart: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"></path></svg>',
sparkles: '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.8" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"></path></svg>'
};
const SPP_SUB_ICON_BY_NAME = {
'CG资源': 'palette',
'同人音声': 'headphones',
'实用动画': 'video',
'高清里番': 'film',
'实用漫画': 'book',
'图墙模式': 'grid',
'游戏资源': 'gamepad',
'COSPLAY': 'camera',
'GALGAME汉化区': 'heart',
'GALGAME汉化区(图墙模式)': 'sparkles'
};
function sppSubIconKey(name) {
const key = String(name || '').replace(/\s+/g, '').replace(/(/g, '(').replace(/)/g, ')');
if (SPP_SUB_ICON_BY_NAME[key]) return SPP_SUB_ICON_BY_NAME[key];
if (/图墙|瀑布|缩略图/.test(key)) return 'grid';
if (/音声|音乐|ASMR|语音/.test(key)) return 'headphones';
if (/动画|视频|里番|短片|映像|动图/.test(key)) return 'film';
if (/漫画|图集|画册|画集|美术|图库|CG/i.test(key)) return 'book';
if (/COS|写真|摄影|自拍/i.test(key)) return 'camera';
if (/汉化|GAL/i.test(key)) return 'heart';
if (/游戏|game/i.test(key)) return 'gamepad';
if (/资源|专区|仓库|存档/.test(key)) return 'palette';
return 'sparkles';
}
const SPP_SUB_BUBBLE = '<svg fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z"></path></svg>';
function sppSubLastIcon(tr) {
const cell = tr.querySelector('th.smalltxt');
if (!cell || cell.dataset.sppBubble) return '';
if (!cell.querySelector('a')) return '';        
const ico = document.createElement('span');
ico.className = 'spp-sub-last-ico';
ico.setAttribute('aria-hidden', 'true');
ico.innerHTML = SPP_SUB_BUBBLE;
cell.dataset.sppBubble = '1';
cell.insertBefore(ico, cell.firstChild);
return 'bubble';
}
function sppSubTile(tr) {
const tile = tr.children[0];
if (!tile || tile.dataset.sppIcon) return '';
const th = tr.querySelector('th[align="left"]');
const nameA = th ? th.querySelector('h2 a') : null;
const name = String((nameA ? nameA.textContent : '') || '').replace(/\s+/g, '');
if (!name) return '';
const key = sppSubIconKey(name);
const ico = document.createElement('span');
ico.className = 'spp-sub-ico';
ico.setAttribute('aria-hidden', 'true');
ico.innerHTML = SPP_SUB_ICONS[key] || SPP_SUB_ICONS.sparkles;
tile.dataset.sppIcon = key;
tile.appendChild(ico);
return key;
}
function initSubsBento() {
if (!PAGE.board) return 0;
const cc = document.getElementById('cate_children');
if (!cc) return 0;
const rows = Array.prototype.filter.call(cc.children, function (tr) {
return !!(tr.classList && tr.classList.contains('f_one'));
});
rows.forEach(function (tr) {
if (tr.dataset.sppBento) return;
tr.dataset.sppBento = '1';
sppSubTile(tr);
sppSubLastIcon(tr);
const f10 = tr.querySelector('td.f10');
if (f10) {
const num = String(f10.textContent || '').replace(/[^0-9]/g, '');
if (num && /^0+$/.test(num)) {
tr.dataset.sppWall = '1';
f10.dataset.sppPosts = '聚合检索';
} else if (num) {
f10.dataset.sppPosts = num.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
}
}
});
return rows.length;
}
onDomReady(function () { initSubsBento(); });
setTimeout(function () { initSubsBento(); }, 900);
const SPP_SUB_EPOCH = '1970-01-01';
function sppSubAuthorOf(text) {
const m = String(text || '').match(/楼主\s*[((]([^))\n]{1,40})[))]/);
return m ? String(m[1]).replace(/\s+/g, ' ').trim() : '';
}
function sppSubInitial(text) {
const s = String(text || '').replace(/\s+/g, '');
if (!s) return '';
return Array.from(s)[0] || '';
}
function sppSubTray(tr) {
const cell = tr.querySelector('th.smalltxt');
if (!cell) return '';
const h3 = cell.querySelector('h3');
const link = h3 ? h3.querySelector('a') : null;
if (!h3 || !link) { tr.dataset.sppNoreply = '1'; return 'noreply'; }
const head = document.createElement('span');
head.className = 'spp-sub-tray-head';
const ico = cell.querySelector('.spp-sub-last-ico');
if (ico) head.appendChild(ico);
const author = sppSubAuthorOf(String(h3.textContent || ''));
const ch = sppSubInitial(author) || sppSubInitial(String(link.textContent || ''));
if (ch) {
const avatar = document.createElement('span');
avatar.className = 'spp-sub-avatar';
avatar.setAttribute('aria-hidden', 'true');
avatar.textContent = ch;
head.appendChild(avatar);
}
if (author) {
const who = document.createElement('span');
who.className = 'spp-sub-author';
who.textContent = author;
head.appendChild(who);
}
const time = String(cell.getAttribute('title') || '').trim();
if (time && time.indexOf(SPP_SUB_EPOCH) !== 0) {
const t = document.createElement('span');
t.className = 'spp-sub-time';
t.textContent = time;
head.appendChild(t);
}
const junk = document.createElement('span');
junk.className = 'spp-sub-hash';
junk.setAttribute('aria-hidden', 'true');
let node = h3.nextSibling;
while (node) {
const next = node.nextSibling;
junk.appendChild(node);
node = next;
}
cell.insertBefore(head, cell.firstChild);
cell.appendChild(junk);
return 'tray';
}
function initSubsStar() {
if (!sppSchemeStar()) return 0;
if (!PAGE.board) return 0;
const cc = document.getElementById('cate_children');
if (!cc) return 0;
const rows = Array.prototype.filter.call(cc.children, function (tr) {
return !!(tr.classList && tr.classList.contains('f_one'));
});
if (!rows.length) return 0;
let max = 0;
const nums = rows.map(function (tr) {
if (tr.dataset.sppWall) return 0;
const f10 = tr.querySelector('td.f10');
const n = f10 ? Number(String(f10.textContent || '').replace(/[^0-9]/g, '')) : 0;
if (n > max) max = n;
return n;
});
rows.forEach(function (tr, i) {
if (tr.dataset.sppStar) return;
tr.dataset.sppStar = '1';
sppSubTray(tr);
if (tr.dataset.sppWall) return;
if (max > 0 && nums[i] > 0) {
const pct = Math.round((nums[i] / max) * 100);
tr.style.setProperty('--spp-heat', pct + '%');
if (pct >= 75) tr.dataset.sppHot = '1';
}
});
return rows.length;
}
onDomReady(function () { initSubsStar(); });
setTimeout(function () { initSubsStar(); }, 950);
const SPP_SUB_COMIKET = {
'C103': [2023, 'winter', ''],
'C102': [2023, 'summer', ''],
'C101': [2022, 'winter', ''],
'C100': [2022, 'summer', '百回盛典'],
'C99': [2021, 'winter', '复刊归来'],
'C98': [2020, 'summer', '空中Comi'],
'C97': [2019, 'winter', '历史峰值'],
'C96': [2019, 'summer', '改元首届'],
'C95': [2018, 'winter', ''],
'C94': [2018, 'summer', '盛夏狂潮'],
'C93': [2017, 'winter', ''],
'C92': [2017, 'summer', ''],
'C91': [2016, 'winter', ''],
'C90': [2016, 'summer', '40周年庆'],
'C89': [2015, 'winter', ''],
'C88': [2015, 'summer', ''],
'C87': [2014, 'winter', ''],
'C86': [2014, 'summer', ''],
'C85': [2013, 'winter', ''],
'C84': [2013, 'summer', ''],
'C83': [2012, 'winter', ''],
'C82': [2012, 'summer', ''],
'C81': [2011, 'winter', '震后复兴'],
'C80': [2011, 'summer', ''],
'C79': [2010, 'winter', ''],
'C78': [2010, 'summer', '怀旧起点']
};
const SPP_SUB_GOLD_NAME = 'C100';
function sppSubChip(cls, txt, tone) {
const s = document.createElement('span');
s.className = cls;
if (tone) s.dataset.tone = tone;
s.textContent = txt;
return s;
}
function sppSubMeta(tr) {
const th = tr.querySelector('th[align="left"]');
if (!th || th.dataset.sppMeta) return '';
const a = th.querySelector('h2 a');
const name = String(a ? a.textContent : '').replace(/\s+/g, '');
if (!name) return '';
const row = SPP_SUB_COMIKET[name];
if (!row) return '';
const h2 = th.querySelector('h2');
if (!h2) return '';
th.dataset.sppMeta = '1';
const winter = row[1] === 'winter';
const nodes = [
sppSubChip('spp-sub-year', '/ ' + row[0], ''),
null,
sppSubChip('spp-sub-season', winter ? '❄️ 冬Comi' : '☀️ 夏Comi', row[1])
];
const brk = document.createElement('span');
brk.className = 'spp-sub-brk';
brk.setAttribute('aria-hidden', 'true');
nodes[1] = brk;
if (row[2]) nodes.splice(2, 0, sppSubChip('spp-sub-ms', row[2], name === SPP_SUB_GOLD_NAME ? 'gold' : 'rose'));
if (name === SPP_SUB_GOLD_NAME) tr.dataset.sppGold = '1';
let anchor = h2;
nodes.forEach(function (n) { anchor.parentNode.insertBefore(n, anchor.nextSibling); anchor = n; });
return name + ' ' + row[0] + ' ' + row[1] + (row[2] ? ' ' + row[2] : '');
}
function initSubsMeta() {
if (!sppSchemeStar()) return 0;
if (!PAGE.board) return 0;
const cc = document.getElementById('cate_children');
if (!cc) return 0;
const rows = Array.prototype.filter.call(cc.children, function (tr) {
return !!(tr.classList && tr.classList.contains('f_one'));
});
let n = 0;
rows.forEach(function (tr) { if (sppSubMeta(tr)) n++; });
return n;
}
onDomReady(function () { initSubsMeta(); });
setTimeout(function () { initSubsMeta(); }, 1040);
const SPP_SUB_ERA = {
'C103': '令和5年 · 12月',
'C102': '令和5年 · 8月',
'C101': '令和4年 · 12月',
'C100': '令和4年 · 8月',
'C99': '令和3年 · 12月',
'C98': '令和2年 · 5月',
'C97': '令和1年 · 12月',
'C96': '令和1年 · 8月',
'C95': '平成30年 · 12月',
'C94': '平成30年 · 8月',
'C93': '平成29年 · 12月',
'C92': '平成29年 · 8月',
'C91': '平成28年 · 12月',
'C90': '平成28年 · 8月',
'C89': '平成27年 · 12月',
'C88': '平成27年 · 8月',
'C87': '平成26年 · 12月',
'C86': '平成26年 · 8月',
'C85': '平成25年 · 12月',
'C84': '平成25年 · 8月',
'C83': '平成24年 · 12月',
'C82': '平成24年 · 8月',
'C81': '平成23年 · 12月',
'C80': '平成23年 · 8月',
'C79': '平成22年 · 12月',
'C78': '平成22年 · 8月'
};
function sppSubLayout(tr) {
if (tr.dataset.sppLayout) return '';
const th = tr.querySelector('th[align="left"]');
const cell = tr.querySelector('td.f10');
if (!th || !cell) return '';
const a = th.querySelector('h2 a');
const name = String(a ? a.textContent : '').replace(/\s+/g, '');
if (!name) return '';
const season = th.querySelector('.spp-sub-season');
if (season) {
let brk = cell.querySelector('.spp-sub-brk');
if (!brk) {
brk = document.createElement('span');
brk.className = 'spp-sub-brk';
brk.setAttribute('aria-hidden', 'true');
cell.appendChild(brk);
}
cell.appendChild(season);
tr.dataset.sppLayout = '1';
}
const era = SPP_SUB_ERA[name];
if (era && !th.querySelector('.spp-sub-era')) {
const span = document.createElement('span');
span.className = 'spp-sub-era';
span.textContent = era;
const sm = th.querySelector('.smalltxt');
if (sm) th.insertBefore(span, sm); else th.appendChild(span);
}
return name + (era ? ' ' + era : '');
}
function initSubsLayout() {
if (!sppSchemeStar()) return 0;
if (!PAGE.board) return 0;
const cc = document.getElementById('cate_children');
if (!cc) return 0;
const rows = Array.prototype.filter.call(cc.children, function (tr) {
return !!(tr.classList && tr.classList.contains('f_one'));
});
let n = 0;
rows.forEach(function (tr) { if (sppSubLayout(tr)) n++; });
return n;
}
onDomReady(function () { initSubsLayout(); });
setTimeout(function () { initSubsLayout(); }, 1100);
function sppSubRelTime(s) {
const m = String(s || '').match(/(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})/);
if (!m) return '';
const t = new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]), Number(m[4]), Number(m[5])).getTime();
if (!t || isNaN(t)) return '';
const d = Date.now() - t;
if (d < 0) return '';
const mi = Math.floor(d / 60000);
if (mi < 1) return '刚刚';
if (mi < 60) return mi + '分钟前';
const h = Math.floor(mi / 60);
if (h < 24) return h + '小时前';
const dd = Math.floor(h / 24);
if (dd < 30) return dd + '天前';
const mo = Math.floor(dd / 30);
if (mo < 12) return mo + '个月前';
return Math.floor(mo / 12) + '年前';
}
function sppSubAuthor2(text) {
const s = String(text || '').replace(/\s+/g, ' ').trim();
let m = s.match(/楼主\s*[((]([^))]{1,40})[))]/);
if (m) return m[1].trim();
m = s.match(/^Re:\s*[((][^))]{1,40}[))]\s*[[【]\s*([^\]】((]{1,24})/);
if (m) return m[1].replace(/[\s.·]+$/, '').trim();
return '';
}
function sppSubHeatOf(tr, max) {
const v = parseFloat(tr.style.getPropertyValue('--spp-heat'));
if (!isNaN(v)) return Math.max(0, Math.min(100, Math.round(v)));
const f10 = tr.querySelector('td.f10');
const n = parseFloat(String(f10 ? f10.textContent : '').replace(/[^0-9]/g, ''));
if (!n || !max) return -1;
return Math.max(0, Math.min(100, Math.round(n / max * 100)));
}
function sppSubGauge(tr, heat) {
if (tr.dataset.sppGauge) return '';
if (heat < 0) return '';
if (heat >= 75) tr.dataset.sppHot = '1';
const cell = document.createElement('td');
cell.className = 'spp-sub-gauge-cell';
const panel = document.createElement('div');
panel.className = 'spp-sub-gauge';
const head = document.createElement('div');
head.className = 'spp-sub-gauge-head';
const dot = document.createElement('span');
dot.className = 'spp-sub-heat-dot';
const label = document.createElement('span');
label.textContent = '创作热度指数';
const val = document.createElement('span');
val.className = 'spp-sub-heat-val';
val.textContent = heat + '%';
head.appendChild(dot);
head.appendChild(label);
head.appendChild(val);
const track = document.createElement('div');
track.className = 'spp-sub-gauge-track';
const fill = document.createElement('div');
fill.className = 'spp-sub-heat-fill';
fill.style.width = heat + '%';
track.appendChild(fill);
panel.appendChild(head);
panel.appendChild(track);
cell.appendChild(panel);
tr.appendChild(cell);
tr.dataset.sppGauge = '1';
return String(heat);
}
function sppSubTrayText(tr) {
const head = tr.querySelector('.spp-sub-tray-head');
if (!head) return '';
let out = '';
let a = head.querySelector('.spp-sub-author');
if (!a) {
const link0 = tr.querySelector('th.smalltxt h3 a');
const name0 = sppSubAuthor2(link0 ? link0.textContent : '');
if (name0) {
a = document.createElement('span');
a.className = 'spp-sub-author';
a.dataset.sppTxt = '1';
a.textContent = name0;
const av = head.querySelector('.spp-sub-avatar');
if (av && av.parentNode === head && av.nextSibling) head.insertBefore(a, av.nextSibling);
else if (av && av.parentNode === head) head.appendChild(a);
else head.appendChild(a);
out += 'author:' + name0 + ' ';
}
} else if (!String(a.textContent || '').trim() && !a.dataset.sppTxt) {
const link = tr.querySelector('th.smalltxt h3 a');
const name = sppSubAuthor2(link ? link.textContent : '');
a.dataset.sppTxt = '1';
if (name) { a.textContent = name; out += 'author:' + name + ' '; }
}
const t = head.querySelector('.spp-sub-time');
if (t && !t.dataset.sppTxt) {
const raw = String(t.getAttribute('title') || t.textContent || '').trim();
const rel = sppSubRelTime(raw);
t.dataset.sppTxt = '1';
if (rel) {
if (!t.getAttribute('title')) t.setAttribute('title', raw);
t.textContent = rel;
out += 'time:' + rel;
}
}
return out;
}
function initSubsGauge() {
if (!sppSchemeStar()) return 0;
if (!PAGE.board) return 0;
const cc = document.getElementById('cate_children');
if (!cc) return 0;
const rows = Array.prototype.filter.call(cc.children, function (tr) {
return !!(tr.classList && tr.classList.contains('f_one'));
});
let max = 0;
rows.forEach(function (tr) {
const f10 = tr.querySelector('td.f10');
const n = parseFloat(String(f10 ? f10.textContent : '').replace(/[^0-9]/g, ''));
if (n > max) max = n;
});
let n = 0;
rows.forEach(function (tr) {
if (sppSubGauge(tr, sppSubHeatOf(tr, max))) n++;
sppSubTrayText(tr);
});
return n;
}
onDomReady(function () { initSubsGauge(); });
setTimeout(function () { initSubsGauge(); }, 1400);
const SPP_NO_TOPIC_CLS = 'spp-no-topics';
let SPP_EMPTY_WARNED = false;                  
function sppSchemeStar() {
return document.documentElement.getAttribute('data-spp-scheme') === 'star';
}
function sppTopicRowCount() {
const stream = document.querySelector('#wall ul.stream');
if (stream) {
return Array.prototype.filter.call(stream.children, function (li) {
if (li.tagName !== 'LI') return false;
if (li.querySelector('img[src*="headtopic"]')) return false;
if (li.querySelector('a[href*="notice.php"]')) return false;
return !!li.querySelector('a[href*="read.php"]');
}).length;
}
const table = document.querySelector('#main #ajaxtable') || document.getElementById('ajaxtable');
if (!table) return -1;
return Array.prototype.filter.call(table.querySelectorAll('tr'), function (tr) {
if (tr.querySelector('.threadlist, #menu_special, #menu_cate, .hthread')) return false;
if (tr.querySelector('img[src*="headtopic"]')) return false;
return !!tr.querySelector('h3 a[href*="read.php"], a[id^="a_ajax_"]');
}).length;
}
function initEmptyListing() {
if (!PAGE.board) return -1;
const n = sppTopicRowCount();
if (n < 0) {
if (!SPP_EMPTY_WARNED && document.readyState !== 'loading') {
SPP_EMPTY_WARNED = true;
console.warn('[SPP] 空榜收纳:找不到主题表(#main #ajaxtable 与 #wall ul.stream 都不在)' +
'⇒ 本页不判空、不打标;容器 id / 类名可能变了');
}
return -1;
}
const root = document.documentElement;
const on = root.classList.contains(SPP_NO_TOPIC_CLS);
if (n === 0 && !on) {
root.classList.add(SPP_NO_TOPIC_CLS);
console.info('[SPP] 2.57.80:本页一条普通主题都没有(图墙与主题表都空)⇒ 收起页码(不再递第二个内容相同的页)');
} else if (n > 0 && on) {
root.classList.remove(SPP_NO_TOPIC_CLS);
}
return n;
}
function sppEmptyWatch() {
initEmptyListing();
[600, 1200, 2400, 3600, 6000, 9000].forEach(function (t) { setTimeout(initEmptyListing, t); });
try {
if (typeof MutationObserver === 'undefined') return;
const seen = [];
[document.querySelector('#main #ajaxtable') || document.getElementById('ajaxtable'),
document.querySelector('#wall ul.stream')].forEach(function (box) {
if (box && seen.indexOf(box) < 0) seen.push(box);
});
if (!seen.length) return;
const mo = new MutationObserver(function () { initEmptyListing(); });
seen.forEach(function (box) { mo.observe(box, { childList: true, subtree: true }); });
setTimeout(function () { mo.disconnect(); }, 12000);
} catch (e) {  }
}
onDomReady(sppEmptyWatch);
function initAnnounceBoard() {
if (!PAGE.board) return;
const clean = x => String(x == null ? '' : x).replace(/\s+/g, ' ').trim();
function rowIsPinned(tr) {
if (tr.querySelector('img[title="置顶帖标志"]')) return true;
if (tr.querySelector('a[href*="notice.php"]')) return true;
if (tr.querySelector('td.tac img[src*="anc.gif"]')) return true;
return false;
}
function readRow(tr) {
const cells = Array.from(tr.querySelectorAll('td, th'));
if (cells.length !== 5) {
console.warn('[SPP] 公告板:置顶行格子数 ' + cells.length + ' ≠ 5(图标/标题/作者+日期/回复+热度/最后回复)' +
'⇒ 作者、日期、热度可能取错位,请核对站点表格结构');
}
const h3 = tr.querySelector('h3');
const a = h3 ? h3.querySelector('a[href]') : null;
if (!a) return null;
const href = a.getAttribute('href') || '';
if (!href) return null;
const isNotice = !!tr.querySelector('a[href*="notice.php"]');
const iconEl = tr.querySelector('td.tac img[src*="thread/"]') || tr.querySelector('td img');
const icon = iconEl ? (iconEl.getAttribute('src') || '').split('/').pop() : '';
let author = '', postDate = '', reply = null, heat = null, lastDate = '', lastBy = '';
if (cells.length >= 5) {
const cAuthor = clean(cells[cells.length - 3].textContent);
const cStats = clean(cells[cells.length - 2].textContent);
const cLast = clean(cells[cells.length - 1].textContent);
const mA = cAuthor.match(/^(.*?)\s*(\d{4}-\d{2}-\d{2})$/);
if (mA) { author = clean(mA[1]); postDate = mA[2]; }
else author = cAuthor;
const mS = cStats.match(/(\d+)\s*\/\s*(\d+)/);
if (mS) { reply = parseInt(mS[1], 10); heat = parseInt(mS[2], 10); }
const mL = cLast.match(/(\d{4}-\d{2}-\d{2}(?:\s+\d{2}:\d{2})?)/);
if (mL) lastDate = mL[1];
if (cLast.indexOf('by:') >= 0) lastBy = clean(cLast.split('by:')[1]);
}
return {
isNotice: isNotice,
icon: icon,
title: clean(h3.textContent) || clean(a.textContent),
href: href,
author: author, postDate: postDate,
reply: reply, heat: heat,
lastDate: lastDate, lastBy: lastBy
};
}
function glyphOf(it) {
if (it.isNotice) return '告';
if (/lock/.test(it.icon || '')) return '锁';
return '热';
}
function buildItem(it) {
const row = document.createElement('div');
row.className = 'spp-ann-item';
const dot = document.createElement('span');
dot.className = 'spp-ann-dot';
dot.setAttribute('aria-hidden', 'true');
const g = glyphOf(it);
dot.dataset.g = g;
dot.textContent = g;
const t = document.createElement('span');
t.className = 'spp-ann-t';
const a = document.createElement('a');
a.href = it.href;
a.target = '_blank';
a.rel = 'noopener';
a.textContent = it.title;
t.appendChild(a);
const byline = document.createElement('span');
byline.className = 'spp-ann-byline';
if (it.author) {
const nm = document.createElement('span');
nm.className = 'spp-name';
const tx = document.createElement('span');
tx.className = 'spp-name-txt';
tx.textContent = it.author;
nm.appendChild(tx);
byline.appendChild(nm);
}
const addDate = (text) => {
if (!text) return;
const d = document.createElement('span');
d.className = 'spp-date';
const dt = document.createElement('span');
dt.className = 'spp-date-txt';
dt.textContent = text;
d.appendChild(dt);
byline.appendChild(d);
};
addDate(it.postDate);
addDate(it.lastDate ? '最后 ' + it.lastDate : '');
const meta = document.createElement('span');
meta.className = 'spp-ann-meta';
if (it.reply === null) {
const nd = document.createElement('span');
nd.className = 'spp-ann-nodata';
nd.textContent = it.isNotice ? '论坛公告' : '置顶';
meta.appendChild(nd);
} else {
const color = getReplyColor(it.reply);
const wrap = document.createElement('span');
wrap.className = 'spp-meta-btns';
[['回复', it.reply, 'spp-tl-reply'], ['热度', it.heat, 'spp-tl-heat']].forEach(pair => {
const b = document.createElement('button');
b.type = 'button';
b.className = 'spp-metabtn';
b.style.setProperty('--spp-mbtn-fg', color);
b.appendChild(document.createTextNode(pair[0] + ' '));
const num = document.createElement('span');
num.className = pair[2];
num.textContent = String(pair[1]);
b.appendChild(num);
wrap.appendChild(b);
});
meta.appendChild(wrap);
}
row.appendChild(dot);
row.appendChild(t);
row.appendChild(byline);
row.appendChild(meta);
return row;
}
function run() {
if (document.getElementById('spp-announce')) return 0;   
const table = document.querySelector('#main #ajaxtable') || document.querySelector('#ajaxtable');
if (!table) return 0;
const rows = Array.from(table.querySelectorAll('tr'));
const pinned = [];
rows.forEach(tr => {
if (rowIsPinned(tr)) {
const it = readRow(tr);
if (it) pinned.push({ row: tr, item: it });
}
});
if (!pinned.length && !document.querySelector('#cate_thread') && !document.querySelector('ul.threadlist')) return 0;
const box = document.createElement('section');
box.id = 'spp-announce';
box.dataset.open = '0';                 
const head = document.createElement('button');
head.type = 'button';
head.className = 'spp-ann-head';
head.setAttribute('aria-expanded', 'false');
const title = document.createElement('span');
title.className = 'spp-ann-title';
title.textContent = '公告';
const count = document.createElement('span');
count.className = 'spp-ann-count';
count.textContent = String(pinned.length);
const hint = document.createElement('span');
hint.className = 'spp-ann-hint';
hint.textContent = '置顶与论坛公告';
const chev = document.createElement('span');
chev.className = 'spp-ann-chev';
chev.setAttribute('aria-hidden', 'true');
head.appendChild(title); head.appendChild(count);
head.appendChild(hint);  head.appendChild(chev);
const body = document.createElement('div');
body.className = 'spp-ann-body';
const inner = document.createElement('div');
inner.className = 'spp-ann-inner';
const list = document.createElement('div');
list.className = 'spp-ann-list spp-pane is-on';
list.dataset.pane = 'notice';
pinned.forEach(p => list.appendChild(buildItem(p.item)));
inner.appendChild(list);
['rules', 'subs', 'cover', 'cats'].forEach(function (k) {
const pane = document.createElement('div');
pane.className = 'spp-pane';
pane.dataset.pane = k;
inner.appendChild(pane);
});
body.appendChild(inner);
box.appendChild(head);
box.appendChild(body);
const wrapper = table.parentElement || table;
if (wrapper.parentElement) wrapper.parentElement.insertBefore(box, wrapper);
else table.parentNode.insertBefore(box, table);
pinned.forEach(p => p.row.remove());
const leftover = Array.from(table.querySelectorAll('tr')).filter(tr =>
tr.querySelector('a[id^="a_ajax_"], h3 a[href*="read.php"]'));
if (!leftover.length) {
Array.from(table.querySelectorAll('tr')).forEach(tr => {
if (tr.querySelector('#menu_special, #menu_cate, .hthread, .threadlist')) return;
tr.style.setProperty('display', 'none', 'important');
});
}
head.addEventListener('click', () => {
const open = box.dataset.open === '1';
box.dataset.open = open ? '0' : '1';
head.setAttribute('aria-expanded', open ? 'false' : 'true');
});
return pinned.length;
}
onDomReady(() => {
run();
setTimeout(run, 800);
});
}
function initBoardTop() {
if (!PAGE.board && !PAGE.read && !PAGE.search && !PAGE.post && !PAGE.task) return;
const HIDE_KEY = 'spp_board_hide_banner';
const CARD_KEY = 'spp_board_upcard';
const HOT_KEY  = 'spp_board_hotboards';
const STYLE_ID = 'spp-boardtop-style';
const EQ_CSS = '#infobox.spp-up-on > table > tbody > tr > td { height:189px !important; }';
function applyBanner() {
const on = SPP_CONFIG.bool(HIDE_KEY, true);
let el = document.getElementById(STYLE_ID + '-banner');
if (on) {
if (!el) {
el = document.createElement('style');
el.id = STYLE_ID + '-banner';
el.textContent = '#header > table { display:none !important; }';
appendToHeadSafe(el);
}
} else if (el) {
el.remove();
}
}
function applyCard() {
const on = SPP_CONFIG.bool(CARD_KEY, true);
let el = document.getElementById(STYLE_ID);
if (!on) { if (el) el.remove(); return; }
if (!el) {
el = document.createElement('style');
el.id = STYLE_ID;
appendToHeadSafe(el);
}
el.textContent = CSS_UPANEL + EQ_CSS;
}
function buildHot(td) {
if (!SPP_CONFIG.bool(HOT_KEY, true)) return 0;
if (td.querySelector('.hb-wrap')) return 0;                       
const ul = document.getElementById('shortcutforum');
if (!ul) return 0;
const links = Array.from(ul.querySelectorAll('li > a'))
.map(a => {
const li = a.closest('li');
const fromId = li && li.id ? (li.id.match(/scf_?(\d+)/) || [])[1] : '';
const fromHref = (a.getAttribute('href') || '').match(/fid[-=](\d+)/);
return {
name: (a.textContent || '').trim(),
href: a.getAttribute('href') || '',
fid: fromId || (fromHref ? fromHref[1] : '')
};
})
.filter(x => x.name && x.href);
if (!links.length) return 0;
const curFid = (location.href.match(/fid[-=](\d+)/) || [])[1] || '';
const wrap = document.createElement('div');
wrap.className = 'hb-wrap';
const hd = document.createElement('div');
hd.className = 'hb-hd';
const t = document.createElement('span');
t.className = 'hb-hd__t'; t.textContent = '热门版块';
const n = document.createElement('span');
n.className = 'hb-hd__n'; n.textContent = String(links.length);
const hint = document.createElement('span');
hint.className = 'hb-hd__hint'; hint.textContent = '常用入口';
hd.appendChild(t); hd.appendChild(n); hd.appendChild(hint);
const grid = document.createElement('div');
grid.className = 'spp-hm-stats hb-grid';
links.forEach(item => {
const a = document.createElement('a');
a.className = 'spp-hm-stat' + (curFid && item.fid === curFid ? ' is-cur' : '');
a.href = item.href;
const k = document.createElement('span');
k.className = 'k';                    
const v = document.createElement('span');
v.className = 'v'; v.textContent = item.name;
a.appendChild(k); a.appendChild(v);
grid.appendChild(a);
});
wrap.appendChild(hd); wrap.appendChild(grid);
td.appendChild(wrap);
if (!ul.__sppHotObserved) {
ul.__sppHotObserved = true;
new MutationObserver(function () {
const old = td.querySelector('.hb-wrap');
if (old) old.remove();
buildHot(td);
}).observe(ul, { childList: true, subtree: true });
}
return links.length;
}
function buildTop() {
if (!SPP_CONFIG.bool(CARD_KEY, true)) return 0;
const ui = document.getElementById('user_info');
if (!ui || !ui.querySelector('#showface')) return 0;
polishUserInfo(true);
const info = document.getElementById('infobox');
if (!info) return 0;
const tbl = info.querySelector('table');
if (!tbl) return 0;
const td = [].slice.call(tbl.querySelectorAll('tr > td'))
.filter(function (x) { return x.id !== 'user_info'; })[0];
if (!td) return 0;
return buildHot(td);
}
const READ_CSS = `
html.spp-read-on #header { background:none !important; }
html.spp-read-on #main > .bdbA { background:none !important; border:0 !important; }
html.spp-read-on #main > .bdbA.spp-crumb-panel {
    box-sizing:border-box !important;
    margin:10px 0 8px !important; padding:6px 12px !important;
    border-radius:12px !important; border:1px solid rgba(255,255,255,.10) !important;
    background-color:rgb(0 0 0 / .86) !important;
    background-image:linear-gradient(152deg, rgba(255,255,255,.03) 0%, rgba(0,0,0,0) 55%) !important;
    -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
    backdrop-filter:blur(18px) saturate(140%) !important;
    box-shadow:0 10px 26px rgba(0,0,0,.34), inset 0 1px 0 rgba(255,255,255,.05) !important;
}
html.spp-read-on #breadcrumbs {
    display:flex !important; align-items:center !important; gap:2px !important;
    box-sizing:border-box !important; min-height:34px !important; height:auto !important;
    margin:0 !important; padding:0 !important;
    background:none !important; background-image:none !important;
    border:0 !important; border-radius:0 !important; box-shadow:none !important;
    font-size:13px !important; color:#cfdcee !important; overflow:hidden !important;
}
html.spp-read-on #main > .bdbA:not(.spp-crumb-panel) > #breadcrumbs {
    margin:6px 0 0 !important; padding:0 12px !important;
    background-color:#0e1116 !important; background-image:none !important;
    border:0 !important; border-radius:12px !important;
    box-shadow:inset 0 1px 0 rgba(255,255,255,.04) !important;
}
html.spp-read-on #main > .bdbA:not(.spp-crumb-panel) > #breadcrumbs > strong.spp-crumb-cur {
    font-weight:700 !important;
}
html.spp-read-on #main > .bdbA:not(.spp-crumb-panel) > #breadcrumbs > strong.spp-crumb-cur::before {
    content:'›' !important; margin:0 .5em 0 .15em !important; color:#5f7285 !important;
    font-weight:400 !important;
}
html.spp-read-on #main > .bdbA:not(.spp-crumb-panel) > #breadcrumbs > strong.spp-crumb-cur > a {
    color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important;
    text-decoration:none !important; white-space:nowrap !important;
}
html.spp-read-on #breadcrumbs .crumbs-item {
    display:inline-flex !important; align-items:center !important; padding:0 !important;
    background:none !important; background-image:none !important;
    font-size:13px !important; line-height:1.2 !important;
    min-width:0 !important; overflow:hidden !important;
    white-space:nowrap !important; text-overflow:ellipsis !important;
}
html.spp-read-on #breadcrumbs .crumbs-item i { display:none !important; }
html.spp-read-on #breadcrumbs .crumbs-item > img,
html.spp-read-on #breadcrumbs #td_cate:not(.spp-hbtn-hit) {
    width:15px !important; height:15px !important; margin:0 9px 0 2px !important;
    filter:invert(1) brightness(1.5) opacity(.66) !important;
}
html.spp-read-on #breadcrumbs .crumbs-item.gray3 {
    color:#8b9ab1 !important; -webkit-text-fill-color:#8b9ab1 !important; text-decoration:none !important;
}
html.spp-read-on #breadcrumbs .crumbs-item.gray3:hover {
    color:#e2e8f0 !important; -webkit-text-fill-color:#e2e8f0 !important;
}
html.spp-read-on #breadcrumbs .crumbs-item + .crumbs-item::before {
    content:"›" !important; display:inline-block !important; flex:none !important;
    margin:0 8px !important; padding:0 !important;
    color:rgba(32,201,151,.72) !important; -webkit-text-fill-color:rgba(32,201,151,.72) !important;
    font-size:16px !important; font-weight:400 !important; line-height:1 !important;
    vertical-align:middle !important; transform:none !important;
}
html.spp-read-on #breadcrumbs .crumbs-item.current {
    flex:0 1 auto !important; min-width:0 !important; overflow:hidden !important;
    white-space:nowrap !important; text-overflow:ellipsis !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
}
html.spp-read-on #breadcrumbs .crumbs-item.current > strong,
html.spp-read-on #breadcrumbs .crumbs-item.current > strong > a {
    display:inline-block !important; min-width:0 !important; max-width:100% !important;
    overflow:hidden !important; white-space:nowrap !important; text-overflow:ellipsis !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    font-weight:600 !important; text-decoration:none !important;
}
html.spp-read-on #infobox.spp-up-on td.spp-up-host-td > #fav-fid { display:none !important; }
html.spp-read-on .spp-hide-row { display:none !important; }
html.spp-read-on #main .spp-pgbar .pages ul li,
html.spp-read-on #main .spp-pgbar .pages ul li.f_one { background:none !important; }
html.spp-read-on #infobox.spp-up-on .hb-hd {
    display:flex !important; align-items:center !important; gap:9px !important; margin:0 0 11px !important;
}
html.spp-read-on #infobox.spp-up-on .hb-hd__t {
    font-size:13.5px !important; font-weight:700 !important; letter-spacing:.3px !important;
    color:#eef3fb !important; -webkit-text-fill-color:#eef3fb !important;
}
html.spp-read-on #infobox.spp-up-on .hb-hd__n {
    font-size:11px !important; font-weight:700 !important; line-height:1.6 !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    padding:0 8px !important; border-radius:999px !important;
    background:rgba(32,201,151,.16) !important; border:1px solid rgba(32,201,151,.45) !important;
}
html.spp-read-on #infobox.spp-up-on .hb-hd__hint {
    font-size:11.5px !important; margin-left:auto !important;
    color:#8798a8 !important; -webkit-text-fill-color:#8798a8 !important;
}
html.spp-read-on div.menu {
    box-sizing:border-box !important; padding:6px !important;
    background-color:#0e1116 !important;
    background-image:linear-gradient(152deg, rgba(255,255,255,.06) 0%, rgba(0,0,0,0) 60%) !important;
    border:1px solid rgba(255,255,255,.10) !important; border-radius:12px !important;
    box-shadow:0 18px 40px rgba(0,0,0,.55) !important;
}
html.spp-read-on div.menu > div { max-height:62vh !important; overflow-y:auto !important; }
html.spp-read-on div.menu .ul3 { padding:0 !important; }
html.spp-read-on div.menu .ul3 > h2 { margin:7px 0 2px !important; }
html.spp-read-on div.menu a {
    display:block !important; padding:5px 12px !important; border-radius:8px !important;
    color:#cfdcee !important; -webkit-text-fill-color:#cfdcee !important;
    font-size:12.5px !important; text-decoration:none !important;
}
html.spp-read-on div.menu .ul3 > h2 > a {
    padding:5px 12px !important; color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    font-weight:700 !important;
}
html.spp-read-on div.menu a:hover {
    background-color:rgba(32,201,151,.14) !important;
    color:#fff !important; -webkit-text-fill-color:#fff !important;
}
html.spp-read-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"] {
    display:inline-flex !important; align-items:center !important; height:20px !important;
    margin-left:8px !important; padding:0 8px !important; border-radius:999px !important;
    background-color:rgba(32,201,151,.14) !important; border:1px solid rgba(32,201,151,.45) !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    font-size:11px !important; font-weight:700 !important; letter-spacing:.4px !important;
    text-decoration:none !important; vertical-align:middle !important;
}
html.spp-read-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"] img { display:none !important; }
html.spp-read-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"]::after { content:"RSS" !important; }
html.spp-read-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"]:hover {
    background-color:rgba(32,201,151,.26) !important; border-color:rgba(32,201,151,.75) !important;
    color:#fff !important; -webkit-text-fill-color:#fff !important;
}
html.spp-read-on #main .spp-pgbar a[href*="action-reply"] {
    position:relative !important; display:inline-flex !important; align-items:center !important; gap:6px !important;
    box-sizing:border-box !important; height:34px !important; padding:0 14px !important; margin:0 !important;
    border-radius:8px !important; border:1px solid rgba(255,255,255,.16) !important;
    background-color:rgba(255,255,255,.055) !important; background-image:none !important;
    color:#dbe4f2 !important; -webkit-text-fill-color:#dbe4f2 !important;
    font-size:12.5px !important; font-weight:600 !important; line-height:1 !important; text-decoration:none !important;
    transition:background-color .22s ease, border-color .22s ease, color .22s ease !important;
}
html.spp-read-on #main .spp-pgbar a[href*="action-reply"] > img { display:none !important; }
html.spp-read-on #main .spp-pgbar a[href*="action-reply"]::before {
    content:"✎" !important; font-size:12px !important; line-height:1 !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
}
html.spp-read-on #main .spp-pgbar a[href*="action-reply"]::after { content:"回帖" !important; }
html.spp-read-on #main .spp-pgbar a[href*="action-reply"] {
    box-shadow:inset 0 0 0 1px rgba(255,255,255,.16), inset 0 0 0 100px rgba(255,255,255,.055) !important;
}
html.spp-read-on #main .spp-pgbar a[href*="action-reply"]:hover {
    box-shadow:inset 0 0 0 1px rgba(32,201,151,.55), inset 0 0 0 100px rgba(32,201,151,.16) !important;
}
html.spp-read-on #main .spp-pgbar .spp-postbtn {
    box-shadow:inset 0 0 0 1px rgba(32,201,151,.55), inset 0 0 0 100px rgba(32,201,151,.14),
               inset 0 1px 0 rgba(255,255,255,.06) !important;
}
html.spp-read-on #main .spp-pgbar .spp-postbtn:hover {
    box-shadow:inset 0 0 0 1px rgba(32,201,151,.85), inset 0 0 0 100px rgba(32,201,151,.22),
               inset 0 1px 0 rgba(255,255,255,.10) !important;
}
html.spp-read-on #main .spp-pgbar a[href^="post.php"]:not([href*="action-reply"]) {
    position:relative !important; display:inline-flex !important; align-items:center !important; gap:7px !important;
    box-sizing:border-box !important; height:34px !important; padding:0 16px !important; margin:0 0 0 auto !important;
    border:0 !important; background:none !important; border-radius:8px !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    font-size:12.5px !important; font-weight:600 !important; line-height:1 !important; text-decoration:none !important;
    box-shadow:inset 0 0 0 1px rgba(32,201,151,.55), inset 0 0 0 100px rgba(32,201,151,.14) !important;
    transition:box-shadow .22s ease, color .22s ease !important;
}
html.spp-read-on #main .spp-pgbar a[href^="post.php"]:not([href*="action-reply"]) > img { display:none !important; }
html.spp-read-on #main .spp-pgbar a[href^="post.php"]:not([href*="action-reply"])::before {
    content:"" !important; position:relative !important; flex:none !important;
    width:11px !important; height:11px !important;
    background-image:linear-gradient(#8ef0b8,#8ef0b8), linear-gradient(#8ef0b8,#8ef0b8) !important;
    background-size:11px 2px, 2px 11px !important;
    background-position:center center, center center !important; background-repeat:no-repeat !important;
}
html.spp-read-on #main .spp-pgbar a[href^="post.php"]:not([href*="action-reply"])::after { content:"发新帖" !important; }
html.spp-read-on #main .spp-pgbar a[href^="post.php"]:not([href*="action-reply"]):hover {
    color:#fff !important; -webkit-text-fill-color:#fff !important;
    box-shadow:inset 0 0 0 1px rgba(32,201,151,.85), inset 0 0 0 100px rgba(32,201,151,.22) !important;
}
html.spp-read-on #main .spp-pgbar a[href*="action-reply"]:hover {
    background-color:rgba(32,201,151,.14) !important; border-color:rgba(32,201,151,.55) !important;
    color:#fff !important; -webkit-text-fill-color:#fff !important;
}
html.spp-read-on #main .spp-pgbar .spp-postbtn {
    border-color:rgba(32,201,151,.55) !important;
    background-color:rgba(32,201,151,.14) !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
}
html.spp-read-on #main .spp-pgbar .spp-postbtn .spp-post-ico::before,
html.spp-read-on #main .spp-pgbar .spp-postbtn .spp-post-ico::after { background-color:#8ef0b8 !important; }
html.spp-read-on #main .spp-pgbar .spp-postbtn:hover {
    border-color:rgba(32,201,151,.85) !important; background-color:rgba(32,201,151,.22) !important;
    color:#fff !important; -webkit-text-fill-color:#fff !important;
}
html.spp-read-on #main > form > .t5.t2 { background-color:#fff !important; background-image:none !important; }
html.spp-read-on #main .spp-pgbar > span:empty,
html.spp-read-on #main .spp-pgbar > div:empty { display:none !important; }
html.spp-read-on #main .t3.spp-pgbar { margin-top: 8px !important; }
html.spp-read-on #main td.f_one:has(.spp-editor-toolbar),
html.spp-read-on #main td.f_one:has(textarea[name="atc_content"]),
html.spp-read-on #main td.f_one:has(#smiliebox) { vertical-align: top !important; }
html.spp-read-on #main > .bdbA #breadcrumbs .fr {
    display:flex !important; align-items:center !important; gap:9px !important;
    margin-left:auto !important;
    height:auto !important; line-height:1 !important; padding:0 !important;
}
html.spp-read-on #main > .bdbA #breadcrumbs .fr .abtn {
    display:inline-flex !important; align-items:center !important; gap:6px !important;
    box-sizing:border-box !important; height:26px !important; padding:0 10px !important; margin:0 !important;
    font-family:inherit !important; font-weight:700 !important;
    font-size:12.5px !important; line-height:1 !important;
    text-decoration:none !important; border-radius:9px !important;
    border:1px solid rgba(255,255,255,.10) !important;
    background-color:rgba(255,255,255,.05) !important; background-image:none !important;
    color:#dbe4f2 !important; -webkit-text-fill-color:#dbe4f2 !important;
    transition:background-color .2s ease, border-color .2s ease, color .2s ease !important;
}
html.spp-read-on #main > .bdbA #breadcrumbs .fr .abtn:hover {
    background-color:rgba(32,201,151,.14) !important; border-color:rgba(32,201,151,.55) !important;
    color:#fff !important; -webkit-text-fill-color:#fff !important;
}
html.spp-read-on #main > .bdbA #breadcrumbs .fr .abtn > img {
    width:12px !important; height:6px !important; margin:0 !important;
    filter:invert(1) brightness(1.8) opacity(.72) !important;
}
html.spp-read-on #main > .bdbA #breadcrumbs .fr .abtn:hover > img {
    filter:invert(1) brightness(2.2) opacity(1) !important;
}
html.spp-read-on #main > .bdbA #breadcrumbs .crumbs-item > img {
    margin:0 8px 0 2px !important;
    filter:invert(1) brightness(1.5) opacity(.66) !important;
}
html.spp-read-on #main > form.spp-flow > .t5.t2.spp-flow-row {
    margin:0 !important;
    border:0 !important; border-radius:0 !important;
    border-left:1px solid #eaeff7 !important;
    border-right:1px solid #eaeff7 !important;
    border-bottom:1px solid #f1f5fa !important;
    background-color:#fff !important; background-image:none !important;
    box-shadow:none !important;
    transform:none !important;
}
/* 行间水平细线归零(口径:水平分隔线 0 条,亮暗两态都清)。
   三条来源:① 15b 行内 border-bottom 写成 var(--spp-flow-hair, 兜底),内联 !important 压不动 ⇒ 只能翻变量值;
   ② READ_CSS 这里原先那两组 .spp-flow-start / .spp-flow-end 的兜底边;③ 底栏 .tiptop > .fr 的 border-top
   (走 --spp-rf-sep,另一条变量链)⇒ 覆盖法。只写 width 与变量值:1px 占位、行底色、左右边与几何一字不动。 */
html.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow { --spp-flow-hair: transparent !important; }
html.spp-rf-on.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-flow-row.spp-flow-row.spp-flow-row:not(.spp-flow-start),
html.spp-rf-on.spp-rf-on.spp-rf-on.spp-rf-on #main > form.spp-flow > div.t5.t2.spp-rf-row.spp-rf-row.spp-rf-row .tiptop > .fr {
    border-top-width: 0 !important; border-bottom-width: 0 !important;
}
html.spp-read-on #main > form.spp-flow > .t5.t2.spp-flow-row:hover {
    background-color:#fff !important; background-image:none !important;
}
html.spp-read-on #main > form.spp-flow > .t5.t2.spp-flow-row:hover::after {
    content:"" !important; position:absolute !important; inset:0 !important;
    border-radius:inherit !important; pointer-events:none !important;
    box-shadow:inset 0 0 0 2px rgba(32,201,151,.15) !important;
}
html.spp-read-on #main > form.spp-flow .t5.t2 th.r_two,
html.spp-read-on #main > form.spp-flow .t5.t2.spp-post-even th.r_two,
html.spp-read-on #main > form.spp-flow .t5.t2.spp-post-op th.r_two {
    background:#fff !important; background-image:none !important;
}
html.spp-read-on .t5.t2 .r_two .user-pic { display:block !important; }
html.spp-read-on .t5.t2 .r_two .user-pic img.spp-ava-off { display:none !important; }
html.spp-read-on .t5.t2 .r_two .spp-ava-initial {
    --spp-ava-fs-max:32px; --spp-ava-fs-min:11px; --spp-ava-fs-one:24px;
    display:flex !important; align-items:center !important; justify-content:center !important;
    box-sizing:border-box !important;
    width:150px !important; height:150px !important; margin:0 !important;
    padding:0 8px !important; overflow:hidden !important;
    border-radius:14px !important;
    color:#fff !important; font-size:32px !important; font-weight:700 !important;
    line-height:1.12 !important; letter-spacing:.02em !important; user-select:none !important;
    text-shadow:0 1px 3px rgba(16,24,40,.28) !important;
    box-shadow:0 8px 20px -12px rgba(16,24,40,.4), inset 0 0 0 1px rgba(255,255,255,.5) !important;
}
html.spp-read-on .t5.t2 .r_two .spp-ava-txt {
    display:block !important; min-width:0 !important; max-width:100% !important;
    white-space:normal !important; overflow-wrap:anywhere !important; word-break:break-word !important;
    text-align:center !important;
}
html.spp-read-on .t5.t2 .r_two .spp-avaname-off { display:none !important; }
html.spp-read-on .t5.t2 .r_two .user-pic img:not(.spp-ava-off) {
    box-sizing:border-box !important;
    width:150px !important;
    height:auto !important; min-height:150px !important; max-height:200px !important;
    padding:3px !important;
    border:1px solid #e4e9f1 !important; border-radius:14px !important;
    background-color:#ffffff !important;
    box-shadow:0 1px 2px rgba(15,23,42,.04), 0 8px 20px -14px rgba(16,24,40,.28) !important;
}

html.spp-read-on .t5.t2 .r_two .user-pic img:not(.spp-ava-off) {
    object-fit:contain !important;
}
html.spp-read-on .t5.t2 .r_two .user-pic img:not(.spp-ava-off).spp-ava-crop {
    object-fit:cover !important;
}

   ★ 2.53.7 立此段时的教训(1.31 的第三次复发):这层 CSS 是**模板字面量**的正文,
     注释里出现反引号会直接**提前闭合整份脚本**(node --check 第一次就红在 12837 行)。
     ⇒ 本段及以下所有注释里,选择器一律不加反引号引号,改用普通书写。 */
html.spp-read-on .t5.t2 .r_two .user-pic > br { display:none !important; }
html.spp-read-on .t5.t2 .r_two > div[align="center"] ~ br { display:none !important; }
html.spp-read-on .t5.t2 .r_two.spp-ava-tiled > div[align="center"] {
    display:block !important; height:0 !important; max-height:0 !important; overflow:hidden !important;
    margin:0 !important; padding:0 !important; line-height:0 !important; font-size:0 !important;
}
html.spp-read-on .t5.t2 .r_two:not(.spp-ava-tiled) > div[align="center"] {
    position:relative !important; z-index:2 !important;
    display:block !important; height:auto !important; max-height:none !important; overflow:visible !important;
    margin:-25px 0 3px !important;
    padding:0 !important;
    line-height:normal !important; font-size:12px !important;
    text-align:center !important;
}
html.spp-read-on .t5.t2 .r_two:not(.spp-ava-tiled) > div[align="center"] > br { display:none !important; }
html.spp-read-on .t5.t2 .r_two:not(.spp-ava-tiled) > div[align="center"] > a {
    display:block !important; box-sizing:border-box !important;
    width:150px !important; margin:0 auto !important; padding:3px 8px !important;
    background-color:rgba(255,255,255,.86) !important;
    -webkit-backdrop-filter:blur(6px) !important; backdrop-filter:blur(6px) !important;
    border-radius:0 0 14px 14px !important;
    color:#26303f !important; -webkit-text-fill-color:#26303f !important;
    font-size:12px !important; font-weight:600 !important; line-height:16px !important;
    text-decoration:none !important;
    white-space:normal !important; overflow-wrap:anywhere !important; word-break:break-word !important;
}
html.spp-read-on .t5.t2 .r_two .user-pic { line-height:0 !important; font-size:0 !important; }
html.spp-read-on .t5.t2 .r_two .user-pic table { margin:0 auto !important; line-height:0 !important; }
html.spp-read-on .t5.t2 > table.js-post > tbody > tr:is(tr):last-child.spp-st-notips.spp-st-natt { display:none !important; }

/* ===== SPP-ATT-BEGIN ===== */
html.spp-read-on #main [id^="att_"] > img.spp-att-img {
    display: block !important; margin: 6px 0 !important; max-width: 100% !important; height: auto !important;
}
/* ===== SPP-ATT-END ===== */

html.spp-read-on .t5.t2 > table.js-post > tbody > tr:is(tr):last-child:not(.spp-st-natt) > th > div.tpc_content {
    margin:0 !important;
    padding-top:0 !important; padding-bottom:0 !important;
}

html.spp-read-on .t5.t2 > table.js-post > tbody > tr:last-child:not(.spp-st-notips) > th {
    padding:0 !important; border:0 !important; vertical-align:top !important;
}
html.spp-read-on .t5.t2 > table.js-post > tbody > tr:last-child:not(.spp-st-notips) > th > div.tpc_content {
    margin:0 !important;
    padding-top:0 !important; padding-bottom:0 !important;
}
html.spp-read-on .t5.t2 .tips {
    display:inline-flex !important; flex-wrap:wrap !important; align-items:center !important;
    gap:6px 8px !important; box-sizing:border-box !important; max-width:100% !important;
    margin:2px 0 9px !important; padding:8px 10px !important;
    background-color:#fffaf0 !important;
    background-image:linear-gradient(180deg,#fffdf8 0%,#fff5e1 100%) !important;
    border:1px solid #f2e3c2 !important; border-left:3px solid #e8c469 !important;
    border-radius:10px !important;
    box-shadow:0 1px 2px rgba(15,23,42,.03) !important;
    color:#8a6512 !important;
    font-size:12px !important; line-height:1.6 !important; text-align:left !important;
}
html.spp-read-on .t5.t2 .tips > span.s3 {
    flex:0 0 auto !important; display:inline-block !important;
    margin:0 !important; padding:2px 9px !important; border-radius:999px !important;
    background-color:#f6e5be !important; color:#7a5a0d !important;
    font-size:11.5px !important; font-weight:600 !important;
}
html.spp-read-on .t5.t2 .tips > div.tac {
    flex:0 0 auto !important; display:inline-flex !important; align-items:baseline !important; gap:5px !important;
    margin:0 !important; padding:2px 10px !important; border-radius:999px !important;
    background-color:#ffffff !important; border:1px solid #f2e3c2 !important;
    color:#8a6512 !important; font-size:11.5px !important;
    text-align:left !important; white-space:nowrap !important;
}
html.spp-read-on .t5.t2 .tips > div.tac > span.spp-bn__k { color:#a08a5e !important; font-weight:400 !important; }
html.spp-read-on .t5.t2 .tips > div.tac:first-of-type > b.spp-bn__v {
    color:#b45309 !important; font-size:13px !important; font-weight:700 !important;
    font-variant-numeric:tabular-nums !important; letter-spacing:.2px !important;
}
html.spp-read-on .t5.t2 .tips > div.tac + div.tac > b.spp-bn__v {
    color:#8a7333 !important; font-size:12px !important; font-weight:600 !important;
    font-variant-numeric:tabular-nums !important;
}
html.spp-read-on .spp-crumb-panel #breadcrumbs .crumbs-item.gray3,
html.spp-read-on .spp-crumb-panel #breadcrumbs .crumbs-item:first-child { flex:none !important; }
html.spp-read-on .spp-crumb-panel #breadcrumbs .crumbs-item.current {
    height:auto !important; min-height:0 !important;
    flex:1 1 auto !important; align-items:center !important;
    white-space:normal !important; overflow:visible !important; text-overflow:clip !important;
}
html.spp-read-on .spp-crumb-panel #breadcrumbs .crumbs-item.current > strong {
    display:block !important; flex:1 1 auto !important;
    min-width:0 !important; max-width:none !important;
    white-space:normal !important; overflow:hidden !important;
}
html.spp-read-on .spp-crumb-panel #breadcrumbs .crumbs-item.current > strong > a {
    display:-webkit-box !important; -webkit-box-orient:vertical !important; -webkit-line-clamp:3 !important;
    max-width:100% !important; overflow:hidden !important;
    white-space:normal !important; overflow-wrap:anywhere !important; word-break:break-word !important;
    line-height:1.45 !important;
}
html.spp-read-on .spp-crumb-panel #breadcrumbs .crumbs-item.current > a[href^="rss.php"] {
    flex:none !important; align-self:center !important;
}
html.spp-read-on .spp-crumb-panel #breadcrumbs .crumbs-item.current { margin-right:0 !important; }
html.spp-read-on #infobox.spp-up-on .hb-wrap .hb-hd { display:none !important; }

html.spp-read-on #main > form.spp-flow .tiptop {
    display:flex !important; align-items:center !important; flex-wrap:nowrap !important;
    gap:10px !important;
    box-sizing:border-box !important; min-height:30px !important; height:auto !important;
    padding:0 10px !important;
    background-color:#f8fafc !important; background-image:none !important;
    border:1px solid #edf1f7 !important; border-radius:10px !important;
    box-shadow:none !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .c { display:none !important; }
html.spp-read-on #main > form.spp-flow .tiptop > .fl { float:none !important; }
html.spp-read-on #main > form.spp-flow .tiptop > .fr { float:none !important; margin-left:auto !important; }
html.spp-read-on #main > form.spp-flow .tiptop > .fl:not(.gray) > a {
    display:inline-flex !important; align-items:center !important;
    box-sizing:border-box !important; height:18px !important; padding:0 8px !important;
    margin:0 !important;
    border:1px solid #e3eaf3 !important; border-radius:999px !important;
    background-color:#ffffff !important; background-image:none !important;
    color:#475569 !important; font-size:11px !important; font-weight:600 !important;
    letter-spacing:.03em !important; line-height:1 !important; text-decoration:none !important;
    transition:color .14s ease, border-color .14s ease !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .fl:not(.gray) > a:hover {
    color:#2f6f68 !important; border-color:#cfe3df !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .fl.gray {
    color:#94a3b8 !important; font-size:12px !important; font-variant-numeric:tabular-nums !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .fr > a,
html.spp-read-on #main > form.spp-flow .tiptop > .fr > span > a,
html.spp-read-on #main > form.spp-flow .tiptop > .fr > div.dropdown > a {
    display:inline-flex !important; align-items:center !important;
    box-sizing:border-box !important; height:19px !important; padding:0 8px !important;
    margin:0 !important;
    border:1px solid transparent !important; border-radius:999px !important;
    color:#4b5563 !important; font-size:12px !important; line-height:1 !important;
    text-decoration:none !important;
    transition:background-color .14s ease, color .14s ease, border-color .14s ease !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .fr > a:hover,
html.spp-read-on #main > form.spp-flow .tiptop > .fr > span > a:hover,
html.spp-read-on #main > form.spp-flow .tiptop > .fr > div.dropdown > a:hover {
    background-color:#eef3f9 !important; color:#2f6f68 !important; border-color:#e2ebf3 !important;
}
html.spp-read-on #main > form.spp-flow .tiptop a.dropB {
    background:none !important; width:auto !important; height:19px !important;
    text-indent:0 !important; font-size:12px !important; line-height:1 !important;
    overflow:visible !important; float:none !important;
}

html.spp-read-on #main > form.spp-flow .tiptop a.dropB[id^="td_read_"] {
    display:none !important;
}

html.spp-read-on #main > form.spp-flow .tiptop > .fr > div.dropdown > div.dropdown-content.menu {
    z-index:3001 !important;
    background-color:#ffffff !important; background-image:none !important;
    border:1px solid #e6ebf2 !important; border-radius:10px !important;
    box-shadow:0 10px 26px rgba(15,23,42,.14), 0 2px 6px rgba(15,23,42,.05) !important;
    padding:4px !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .fr > div.dropdown > div.dropdown-content.menu > a {
    display:block !important;
    box-sizing:border-box !important;
    padding:5px 10px !important; margin:0 !important;
    border:0 !important; border-radius:7px !important;
    background:none !important; text-decoration:none !important; white-space:nowrap !important;
    color:#334155 !important; -webkit-text-fill-color:#334155 !important;
    font-size:12px !important; line-height:1.5 !important;
    transition:background-color .14s ease, color .14s ease !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .fr > div.dropdown > div.dropdown-content.menu > a:hover {
    background-color:#eef3f9 !important;
    color:#2f6f68 !important; -webkit-text-fill-color:#2f6f68 !important;
}
html.spp-read-on #main > form.spp-flow .tiptop .spp-tp-sep {
    display:block !important; flex:0 0 auto !important; align-self:center !important;
    width:1px !important; height:12px !important;
    margin:0 3px !important; padding:0 !important; border:0 !important;
    background-color:#e3eaf3 !important; background-image:none !important;
    color:transparent !important; font-size:0 !important; line-height:0 !important;
    overflow:hidden !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .spp-sign-inline {
    flex:1 1 auto !important; min-width:0 !important;
    display:flex !important; align-items:center !important; justify-content:center !important;
    max-height:24px !important; overflow:hidden !important;
    text-align:center !important; font-size:12px !important; line-height:1.4 !important;
    color:#8a94a6 !important;
}
html.spp-read-on #main > form.spp-flow .tiptop > .spp-sign-inline img {
    max-height:20px !important; width:auto !important; vertical-align:middle !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) {
    color-scheme: light !important;
    background-color: var(--spu-surface,#ffffff) !important;
    background-image: none !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 12px !important;
    box-shadow: 0 1px 2px rgba(15,23,42,.04), 0 12px 30px rgba(15,23,42,.08) !important;
    color: var(--spu-text,#1f2937) !important;
    font-size: 12.5px !important;
}

html.spp-read-on td.spp-opt-src input[type="checkbox"] {
    -webkit-appearance: none !important;
    appearance: none !important;
    accent-color: var(--spu-accent,#2f6f68) !important;
    box-sizing: border-box !important;
    display: inline-block !important;
    width: 15px !important;
    height: 15px !important;
    margin: 1px 7px 1px 0 !important;
    border: 1.5px solid var(--spu-border,#d8dee7) !important;
    border-radius: 5px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    background-image: none !important;
    box-shadow: none !important;
    vertical-align: -2px !important;
    cursor: pointer !important;
    transition: background-color .16s ease, border-color .16s ease, box-shadow .16s ease !important;
}
html.spp-read-on td.spp-opt-src input[type="checkbox"]:hover {
    border-color: var(--spu-accent,#2f6f68) !important;
    box-shadow: 0 0 0 3px rgba(47,111,104,.10) !important;
}
html.spp-read-on td.spp-opt-src input[type="checkbox"]:checked {
    background-color: var(--spu-accent,#2f6f68) !important;
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.4 8.5l3.1 3.1 6.1-6.6' fill='none' stroke='%23ffffff' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") !important;
    background-repeat: no-repeat !important;
    background-position: center center !important;
    background-size: 11px 11px !important;
    border-color: var(--spu-accent,#2f6f68) !important;
    box-shadow: 0 2px 8px rgba(47,111,104,.22) !important;
}
html.spp-read-on td.spp-opt-src input[type="checkbox"]:focus-visible {
    outline: 2px solid rgba(47,111,104,.45) !important;
    outline-offset: 1px !important;
}

html.spp-read-on td.spp-opt-src {
    color: var(--spu-secondary,#475569) !important;
}
html.spp-read-on td.spp-opt-src > b {
    color: var(--spu-text,#1f2937) !important;
    font-size: 12.5px !important;
    font-weight: 700 !important;
    letter-spacing: .04em !important;
}

html.spp-read-on .spp-opt-num > input.input {
    box-sizing: border-box !important;
    width: 40px !important;
    height: 20px !important;
    margin: 0 4px !important;
    padding: 0 4px !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 6px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    background-image: none !important;
    color: var(--spu-text,#1f2937) !important;
    font-family: inherit !important;
    font-size: 12px !important;
    line-height: 1 !important;
    text-align: center !important;
    vertical-align: middle !important;
    outline: none !important;
    box-shadow: none !important;
}
html.spp-read-on .spp-opt-num > input.input:focus {
    border-color: var(--spu-accent,#2f6f68) !important;
    box-shadow: 0 0 0 3px rgba(47,111,104,.12) !important;
}

html.spp-read-on .spp-opt-num > select:has(> option:only-child) {
    -webkit-appearance: none !important;
    appearance: none !important;
    box-sizing: content-box !important;
    width: auto !important;
    height: auto !important;
    min-height: 0 !important;
    margin: 0 2px !important;
    padding: 0 2px !important;
    border: 0 !important;
    border-radius: 0 !important;
    background: transparent none !important;
    background-image: none !important;
    box-shadow: none !important;
    outline: none !important;
    color: var(--spu-secondary,#475569) !important;
    font-family: inherit !important;
    font-size: 12px !important;
    font-weight: 600 !important;
    line-height: 1.5 !important;
    text-align: left !important;
    vertical-align: middle !important;
    cursor: default !important;
    pointer-events: none !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > .spp-editor-toolbar {
    box-sizing: border-box !important;
    display: flex !important;
    flex-wrap: wrap !important;
    align-items: center !important;
    width: auto !important;
    max-width: 100% !important;
    min-width: 0 !important;
    margin: 0 !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-bottom: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 10px 10px 0 0 !important;
    background-color: var(--spu-overlay,#eef2f5) !important;
    color: var(--spu-secondary,#475569) !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > textarea[name="atc_content"] {
    box-sizing: border-box !important;
    display: block !important;
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    margin: 0 !important;
    resize: vertical !important;
    padding: 7px 10px !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-top: 0 !important;
    border-radius: 0 0 10px 10px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    background-image: none !important;
    color: var(--spu-text,#1f2937) !important;
    font-family: inherit !important;
    font-size: 13px !important;
    line-height: 1.7 !important;
    outline: none !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > textarea[name="atc_content"]:has(+ .spp-preview-pane--live) {
    border-bottom-left-radius: 0 !important;
    border-bottom-right-radius: 0 !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > textarea[name="atc_content"]:focus {
    border-color: var(--spu-accent,#2f6f68) !important;
    box-shadow: 0 0 0 3px rgba(47,111,104,.10) !important;
}
html.spp-read-on :is(div.t5:has(textarea[name="atc_content"]), .spp-t5bar) input[type="file"] {
    box-sizing: border-box !important;
    height: 26px !important;
    padding: 1px 6px 1px 1px !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 7px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    background-image: none !important;
    color: var(--spu-muted,#6b7280) !important;
    font-family: inherit !important;
    font-size: 12.5px !important;
    vertical-align: middle !important;
    transition: border-color .16s ease, box-shadow .16s ease !important;
}
html.spp-read-on :is(div.t5:has(textarea[name="atc_content"]), .spp-t5bar) input[type="file"]:hover {
    border-color: var(--spu-accent,#2f6f68) !important;
    box-shadow: 0 0 0 3px rgba(47,111,104,.10) !important;
}
html.spp-read-on :is(div.t5:has(textarea[name="atc_content"]), .spp-t5bar) input[type="file"]::file-selector-button {
    box-sizing: border-box !important;
    height: 22px !important;
    margin: 0 7px 0 0 !important;
    padding: 0 11px !important;
    border: 1px solid rgba(47,111,104,.42) !important;
    border-radius: 6px !important;
    background-color: rgba(47,111,104,.09) !important;
    background-image: none !important;
    color: var(--spu-accent,#2f6f68) !important;
    font-family: inherit !important;
    font-size: 12px !important;
    font-weight: 600 !important;
    cursor: pointer !important;
    transition: background-color .16s ease, color .16s ease, border-color .16s ease !important;
}
html.spp-read-on :is(div.t5:has(textarea[name="atc_content"]), .spp-t5bar) input[type="file"]::file-selector-button:hover {
    background-color: var(--spu-accent,#2f6f68) !important;
    border-color: var(--spu-accent,#2f6f68) !important;
    color: #fff !important;
}

html.spp-read-on .tiptop span:has(> a[title="顶端"]) { display:none !important; }
html.spp-read-on .tiptop > .fr:has(> a[onclick^="fontsize("]) { display:none !important; }
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > .spp-preview-pane {
    box-sizing: border-box !important;
    width: 100% !important;
    max-width: 100% !important;
    min-width: 0 !important;
    margin: 0 !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-top: 0 !important;
    border-radius: 0 0 10px 10px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    color: var(--spu-text,#1f2937) !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) {
    box-sizing: border-box !important;
    display: block !important;
    overflow: hidden !important;
    width: 100% !important;
    max-width: 100% !important;
    height: auto !important;
    margin: 10px 0 0 !important;
    padding: 5px 8px !important;
    background-color: var(--spu-overlay,#eef2f5) !important;
    background-image: none !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 10px !important;
    color: var(--spu-secondary,#475569) !important;
    font-size: 12px !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > div:has(> a.abtn) {
    display: inline-flex !important;
    align-items: center !important;
    gap: 6px !important;
    float: right !important;
    height: auto !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    background: transparent none !important;
    box-shadow: none !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > div:has(> a.abtn) > a.abtn {
    box-sizing: border-box !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    height: 26px !important;
    min-height: 26px !important;
    margin: 0 !important;
    padding: 0 12px !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 999px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    background-image: none !important;
    color: var(--spu-secondary,#475569) !important;
    font-family: inherit !important;
    font-size: 12px !important;
    font-weight: 600 !important;
    line-height: 1 !important;
    text-decoration: none !important;
    text-shadow: none !important;
    white-space: nowrap !important;
    cursor: pointer !important;
    box-shadow: none !important;
    transition: background-color .18s ease, border-color .18s ease, color .18s ease !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > div:has(> a.abtn) > a.abtn:hover {
    background-color: color-mix(in srgb, var(--spu-accent,#2f6f68) 10%, transparent) !important;
    border-color: var(--spu-accent,#2f6f68) !important;
    color: var(--spu-accent,#2f6f68) !important;
    text-decoration: none !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > input[name="Submit"] {
    box-sizing: border-box !important;
    display: inline-block !important;
    height: 26px !important;
    min-width: 78px !important;
    margin: 0 0 0 6px !important;
    padding: 0 18px !important;
    border: 1px solid var(--spu-accent,#2f6f68) !important;
    border-radius: 999px !important;
    background-color: var(--spu-accent,#2f6f68) !important;
    background-image: none !important;
    color: #ffffff !important;
    font-family: inherit !important;
    font-size: 12.5px !important;
    font-weight: 600 !important;
    line-height: 1 !important;
    letter-spacing: .08em !important;
    text-align: center !important;
    text-shadow: none !important;
    vertical-align: middle !important;
    cursor: pointer !important;
    box-shadow: 0 2px 8px rgba(47,111,104,.22) !important;
    transition: background-color .18s ease, border-color .18s ease, box-shadow .18s ease !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > input[name="Submit"]:hover {
    background-color: var(--spu-accent-dim,#255a55) !important;
    border-color: var(--spu-accent-dim,#255a55) !important;
    box-shadow: 0 3px 12px rgba(47,111,104,.30) !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > #spp-preview-btn {
    box-sizing: border-box !important;
    display: inline-block !important;
    height: 26px !important;
    margin: 0 0 0 6px !important;
    padding: 0 16px !important;
    border-radius: 999px !important;
    font-family: inherit !important;
    font-size: 12.5px !important;
    font-weight: 600 !important;
    line-height: 1 !important;
    letter-spacing: .04em !important;
    text-shadow: none !important;
    vertical-align: middle !important;
    cursor: pointer !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > div:not(:has(a)) {
    float: left !important;
    height: 26px !important;
    line-height: 26px !important;
    margin: 0 !important;
    padding: 0 !important;
    color: var(--spu-muted,#6b7280) !important;
    font-size: 11.5px !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(input[name="atc_usesign"]) label.spp-fr-opt {
    box-sizing: border-box !important;
    display: inline-flex !important;
    align-items: center !important;
    gap: 6px !important;
    height: 20px !important;
    margin: 1px 6px 1px 0 !important;
    padding: 0 10px 0 7px !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 999px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    background-image: none !important;
    color: var(--spu-secondary,#475569) !important;
    font-size: 12px !important;
    line-height: 1 !important;
    white-space: nowrap !important;
    cursor: pointer !important;
    user-select: none !important;
    transition: background-color .16s ease, border-color .16s ease, color .16s ease !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(input[name="atc_usesign"]) label.spp-fr-opt:hover {
    border-color: var(--spu-accent,#2f6f68) !important;
    color: var(--spu-accent,#2f6f68) !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(input[name="atc_usesign"]) label.spp-fr-opt:has(input:checked) {
    border-color: var(--spu-accent,#2f6f68) !important;
    background-color: color-mix(in srgb, var(--spu-accent,#2f6f68) 10%, transparent) !important;
    color: var(--spu-accent,#2f6f68) !important;
    font-weight: 600 !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(input[name="atc_usesign"]) label.spp-fr-opt > input[type="checkbox"] {
    width: 14px !important;
    height: 14px !important;
    margin: 0 !important;
    vertical-align: middle !important;
    flex: 0 0 auto !important;
}

html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]):has(> .spp-fr-actions) {
    padding: 0 !important;
    border: 0 !important;
    background: transparent none !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]):has(> .spp-fr-actions) > div:has(> a.abtn) {
    height: 26px !important;
    padding: 0 6px 0 10px !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 999px !important;
    background-color: var(--spu-surface,#ffffff) !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > span.spp-fr-actions {
    box-sizing: border-box !important;
    display: inline-flex !important;
    align-items: center !important;
    gap: 6px !important;
    height: 26px !important;
    margin: 0 0 0 8px !important;
    padding: 0 5px 0 0 !important;
    border: 1px solid var(--spu-border,#d8dee7) !important;
    border-radius: 999px !important;
    background-color: var(--spu-surface,#ffffff) !important;
    vertical-align: middle !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > span.spp-fr-actions > input[name="Submit"] {
    margin: 0 0 0 8px !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]) > span.spp-fr-actions > #spp-preview-btn {
    margin: 0 !important;
}
html.spp-read-on div.t5:has(textarea[name="atc_content"]) td.f_one:has(textarea[name="atc_content"]) > div:has(input[name="Submit"]):has(> .spp-fr-actions) > div:not(:has(a)) {
    height: 26px !important;
    line-height: 26px !important;
}

html.spp-read-on .user-info.spp-ucard {
    z-index:9999 !important;
    opacity:1 !important;
}
html.spp-read-on .user-info.spp-ucard > .user-infoWrap {
    box-sizing:border-box !important;
    width:auto !important; min-width:198px !important; max-width:280px !important;
    margin:0 !important; padding:8px 12px 10px !important;
    border:1px solid #e6ecf5 !important; border-radius:12px !important;
    background-color:#ffffff !important; background-image:none !important;
    box-shadow:0 10px 26px rgba(15,23,42,.14), 0 2px 6px rgba(15,23,42,.06) !important;
    font-family:inherit !important; font-size:12px !important; line-height:1 !important;
    color:#334155 !important; position:relative !important;
}
html.spp-read-on .user-info.spp-ucard > .user-infoWrap > .co { display:none !important; }
html.spp-read-on .user-info.spp-ucard > .user-infoWrap::before {
    content:"" !important; position:absolute !important; left:-5.5px !important; top:15px !important;
    width:9px !important; height:9px !important; background-color:#ffffff !important;
    border-left:1px solid #e6ecf5 !important; border-bottom:1px solid #e6ecf5 !important;
    transform:rotate(45deg) !important; border-radius:0 0 0 2px !important;
}
html.spp-read-on .user-info.spp-ucard > .user-infoWrap > div.c { display:none !important; }
html.spp-read-on .user-info.spp-ucard .listread { height:auto !important; }
html.spp-read-on .user-info.spp-ucard .listread ul {
    display:flex !important; align-items:stretch !important; gap:2px !important;
    height:auto !important; margin:0 0 8px !important; padding:3px !important;
    list-style:none !important;
    background-color:#f8fafc !important; border:1px solid #edf1f7 !important; border-radius:9px !important;
}
html.spp-read-on .user-info.spp-ucard .listread li {
    display:block !important; float:none !important; flex:1 1 0 !important; min-width:0 !important;
    width:auto !important; height:auto !important;
    margin:0 !important; padding:0 !important; border-radius:7px !important;
}
html.spp-read-on .user-info.spp-ucard .listread li > a {
    display:flex !important; flex-direction:column !important; align-items:center !important;
    justify-content:center !important; gap:3px !important;
    padding:6px 2px 5px !important; border-radius:7px !important; cursor:pointer !important;
    color:#475569 !important; transition:background-color .14s ease, color .14s ease !important;
}
html.spp-read-on .user-info.spp-ucard .listread li:hover > a {
    background-color:#eef4fb !important; color:#2563eb !important;
}
html.spp-read-on .user-info.spp-ucard .listread li > a > div.spp-uc-old { display:none !important; }
html.spp-read-on .user-info.spp-ucard .listread .spp-uc__ico {
    display:block !important; width:16px !important; height:16px !important; flex:0 0 auto !important;
}
html.spp-read-on .user-info.spp-ucard .listread .spp-uc__ico svg {
    display:block !important; width:16px !important; height:16px !important;
}
html.spp-read-on .user-info.spp-ucard .listread .spp-uc__lbl {
    font-size:10.5px !important; line-height:1 !important; letter-spacing:.2px !important;
    white-space:nowrap !important; overflow:hidden !important; text-overflow:ellipsis !important;
    max-width:100% !important; color:inherit !important; text-indent:0 !important;
}
html.spp-read-on .user-info.spp-ucard .spp-uc__rows {
    display:flex !important; flex-direction:column !important; gap:0 !important;
    padding:4px 9px !important;
    background-color:#f8fafc !important; border:1px solid #edf1f7 !important; border-radius:9px !important;
}
html.spp-read-on .user-info.spp-ucard .spp-uc__row {
    display:flex !important; align-items:baseline !important;
    justify-content:space-between !important; gap:12px !important;
    padding:3.5px 0 !important;
}
html.spp-read-on .user-info.spp-ucard .spp-uc__row + .spp-uc__row {
    box-shadow:inset 0 1px 0 #eaeff7 !important;
}
html.spp-read-on .user-info.spp-ucard .spp-uc__k {
    color:#94a3b8 !important; font-size:11.5px !important; letter-spacing:.2px !important; white-space:nowrap !important;
}
html.spp-read-on .user-info.spp-ucard .spp-uc__v {
    color:#1f2937 !important; font-size:12px !important; font-weight:600 !important; text-align:right !important;
    font-variant-numeric:tabular-nums !important;
}
html.spp-read-on .user-info.spp-ucard .spp-uc__row.is-sp .spp-uc__v {
    color:#a4670f !important;
    background-color:#fff5e2 !important; border:1px solid #f3e2c2 !important;
    border-radius:999px !important; padding:1px 7px !important;
}
html.spp-read-on .user-info.spp-ucard .spp-uc__row.is-post .spp-uc__v { color:#2f6f68 !important; }

`;
const SEARCH_CSS = `
html.spp-search-on #header { background:none !important; }
html.spp-search-on #main > .bdbA { background:none !important; border:0 !important; }
html.spp-search-on #infobox.spp-up-on td.spp-up-host-td > .spp-crumb-line { margin:0 0 9px !important; min-width:0 !important; }
html.spp-search-on .spp-crumb-line > #breadcrumbs {
    display:flex !important; align-items:center !important; gap:2px !important;
    box-sizing:border-box !important; min-height:20px !important; height:auto !important;
    margin:0 !important; padding:0 !important;
    background:none !important; background-image:none !important; border:0 !important;
    box-shadow:none !important; border-radius:0 !important;
    font-size:12.5px !important; color:#cfdcee !important; overflow:hidden !important;
}
html.spp-search-on .spp-crumb-line .crumbs-item {
    display:inline-flex !important; align-items:center !important; padding:0 !important;
    background:none !important; background-image:none !important;
    font-size:12.5px !important; line-height:1.2 !important;
    min-width:0 !important; overflow:hidden !important;
    white-space:nowrap !important; text-overflow:ellipsis !important;
}
html.spp-search-on .spp-crumb-line .crumbs-item i { display:none !important; }
html.spp-search-on .spp-crumb-line .crumbs-item.gray3 {
    color:#8b9ab1 !important; -webkit-text-fill-color:#8b9ab1 !important; text-decoration:none !important;
}
html.spp-search-on .spp-crumb-line .crumbs-item.gray3:hover {
    color:#e2e8f0 !important; -webkit-text-fill-color:#e2e8f0 !important;
}
html.spp-search-on .spp-crumb-line .crumbs-item + .crumbs-item::before {
    content:"›" !important; display:inline-block !important; flex:none !important;
    margin:0 7px !important; padding:0 !important;
    color:rgba(32,201,151,.72) !important; -webkit-text-fill-color:rgba(32,201,151,.72) !important;
    font-size:15px !important; font-weight:400 !important; line-height:1 !important;
    vertical-align:middle !important;
}
html.spp-search-on .spp-crumb-line .crumbs-item.current {
    flex:0 1 auto !important; min-width:0 !important; overflow:hidden !important;
    white-space:nowrap !important; text-overflow:ellipsis !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
}
html.spp-search-on .spp-crumb-line .crumbs-item.current > strong {
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
}
html.spp-search-on #infobox.spp-up-on td.spp-up-host-td > #fav-fid {
    display:block !important;
    padding:0 !important; margin:0 0 10px !important;
    overflow:hidden !important;
}
html.spp-search-on #infobox.spp-up-on td.spp-up-host-td > #fav-fid #shortcutname {
    color:#7de8b0 !important; -webkit-text-fill-color:#7de8b0 !important;
}
html.spp-search-on #infobox.spp-up-on td.spp-up-host-td > #fav-fid #shortcutforum > li > a {
    color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important;
    font-weight:600 !important; text-decoration:none !important;
}
html.spp-search-on #infobox.spp-up-on td.spp-up-host-td > #fav-fid #shortcutforum > li > a:hover {
    color:#9dffc9 !important; -webkit-text-fill-color:#9dffc9 !important;
}
html.spp-search-on #infobox.spp-up-on td.spp-up-host-td > .hb-wrap {
    width:100% !important; min-width:0 !important; clear:both !important;
}
html.spp-search-on #infobox.spp-up-on .hb-hd {
    display:flex !important; align-items:center !important; gap:9px !important; margin:0 0 11px !important;
}
html.spp-search-on #infobox.spp-up-on .hb-hd__n {
    font-size:11px !important; font-weight:700 !important; line-height:1.6 !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    padding:0 8px !important; border-radius:999px !important;
    background:rgba(32,201,151,.16) !important; border:1px solid rgba(32,201,151,.45) !important;
}
html.spp-search-on #infobox.spp-up-on .hb-grid .spp-hm-stat { text-decoration:none !important; }
html.spp-search-on #infobox.spp-up-on .hb-grid .spp-hm-stat .v {
    white-space:nowrap !important; overflow:hidden !important; text-overflow:ellipsis !important;
}
html.spp-search-on #infobox.spp-up-on .hb-hd__t {
    font-size:14px !important;
    color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important;
}
html.spp-search-on #infobox.spp-up-on .hb-hd__hint {
    color:#7de8b0 !important; -webkit-text-fill-color:#7de8b0 !important;
}
html.spp-search-on #main form input[type="submit"],
html.spp-search-on #main > form > div > input[type="reset"] {
    box-sizing:border-box !important;
    height:26px !important; min-height:0 !important;
    padding:0 16px !important;
    border-radius:999px !important;
    background-image:none !important;
    font-family:inherit !important; font-size:12px !important;
    font-weight:600 !important; line-height:1 !important;
    letter-spacing:normal !important; text-indent:0 !important; text-shadow:none !important;
    vertical-align:middle !important; cursor:pointer !important;
    opacity:1 !important; filter:none !important;
}
html.spp-search-on #main form input[type="submit"] {
    border:1px solid var(--spu-accent,#2f6f68) !important;
    background-color:var(--spu-accent,#2f6f68) !important;
    color:#fff !important; -webkit-text-fill-color:#fff !important;
}
html.spp-search-on #main > form > div > input[type="reset"] {
    margin-left:10px !important;
    border:1px solid var(--spu-accent,#2f6f68) !important;
    background-color:var(--spu-surface,#fff) !important;
    color:var(--spu-accent,#2f6f68) !important;
    -webkit-text-fill-color:var(--spu-accent,#2f6f68) !important;
}
html.spp-search-on #main form input[type="submit"]:hover {
    transition:all .18s ease !important;
    background-color:color-mix(in srgb, var(--spu-accent,#2f6f68) 84%, #000) !important;
    border-color:color-mix(in srgb, var(--spu-accent,#2f6f68) 84%, #000) !important;
    transform:translateY(-1px) !important;
    box-shadow:0 4px 12px -3px rgba(47,111,104,.5) !important;
}
html.spp-search-on #main > form > div > input[type="reset"]:hover {
    transition:all .18s ease !important;
    background-color:#eef6f4 !important;
    border-color:color-mix(in srgb, var(--spu-accent,#2f6f68) 84%, #000) !important;
    transform:translateY(-1px) !important;
}
html.spp-search-on #main form input[type="submit"]:active,
html.spp-search-on #main > form > div > input[type="reset"]:active {
    transition:all .06s !important;
    transform:translateY(0) !important;
}
`;
function applySearchCss() {
if (!PAGE.search) return;
ensureStyle(STYLE_ID + '-search', SEARCH_CSS);                
}
function applyReadCss() {
if (!WANTS.readOnly) return;
ensureStyle(STYLE_ID + '-read', READ_CSS);                    
}
function applyHotCss() {
if (!PAGE.task && !PAGE.post) return;
ensureStyle(STYLE_ID + '-hot', CSS_HOTBOARD);                 
}
const POST_CSS = `
html.spp-post-on #main > .bdbA { background:none !important; border:0 !important; }
html.spp-post-on #main > .bdbA.spp-crumb-panel {
    box-sizing:border-box !important;
    margin:10px 0 8px !important; padding:6px 12px !important;
    border-radius:12px !important; border:1px solid rgba(255,255,255,.10) !important;
    background-color:rgb(0 0 0 / .86) !important;
    background-image:linear-gradient(152deg, rgba(255,255,255,.03) 0%, rgba(0,0,0,0) 55%) !important;
    -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
    backdrop-filter:blur(18px) saturate(140%) !important;
    box-shadow:0 10px 26px rgba(0,0,0,.34), inset 0 1px 0 rgba(255,255,255,.05) !important;
}
html.spp-post-on #breadcrumbs {
    display:flex !important; align-items:center !important; gap:2px !important;
    box-sizing:border-box !important; min-height:34px !important; height:auto !important;
    margin:0 !important; padding:0 !important;
    background:none !important; background-image:none !important;
    border:0 !important; border-radius:0 !important; box-shadow:none !important;
    font-size:13px !important; color:#cfdcee !important; overflow:hidden !important;
}
html.spp-post-on #breadcrumbs .crumbs-item {
    display:inline-flex !important; align-items:center !important; padding:0 !important;
    background:none !important; background-image:none !important;
    font-size:13px !important; line-height:1.2 !important;
    min-width:0 !important; overflow:hidden !important;
    white-space:nowrap !important; text-overflow:ellipsis !important;
}
html.spp-post-on #breadcrumbs .crumbs-item i { display:none !important; }
html.spp-post-on #breadcrumbs .crumbs-item > img,
html.spp-post-on #breadcrumbs #td_cate {
    width:15px !important; height:15px !important; margin:0 9px 0 2px !important;
    filter:invert(1) brightness(1.5) opacity(.66) !important;
}
html.spp-post-on #breadcrumbs .crumbs-item.gray3 {
    color:#8b9ab1 !important; -webkit-text-fill-color:#8b9ab1 !important; text-decoration:none !important;
}
html.spp-post-on #breadcrumbs .crumbs-item.gray3:hover {
    color:#e2e8f0 !important; -webkit-text-fill-color:#e2e8f0 !important;
}
html.spp-post-on #breadcrumbs .crumbs-item + .crumbs-item::before {
    content:"›" !important; display:inline-block !important; flex:none !important;
    margin:0 8px !important; padding:0 !important;
    color:rgba(32,201,151,.72) !important; -webkit-text-fill-color:rgba(32,201,151,.72) !important;
    font-size:16px !important; font-weight:400 !important; line-height:1 !important;
    vertical-align:middle !important; transform:none !important;
}
html.spp-post-on #breadcrumbs .crumbs-item.current {
    flex:0 1 auto !important; min-width:0 !important; overflow:hidden !important;
    white-space:nowrap !important; text-overflow:ellipsis !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
}
html.spp-post-on #breadcrumbs .crumbs-item.current > strong,
html.spp-post-on #breadcrumbs .crumbs-item.current > strong > a {
    display:inline-block !important; min-width:0 !important; max-width:100% !important;
    overflow:hidden !important; white-space:nowrap !important; text-overflow:ellipsis !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    font-weight:600 !important; text-decoration:none !important;
}
html.spp-post-on #infobox.spp-up-on td.spp-up-host-td > #fav-fid { display:none !important; }
html.spp-post-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"] {
    display:inline-flex !important; align-items:center !important; height:20px !important;
    margin-left:8px !important; padding:0 8px !important; border-radius:999px !important;
    background-color:rgba(32,201,151,.14) !important; border:1px solid rgba(32,201,151,.45) !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
    font-size:11px !important; font-weight:700 !important; letter-spacing:.4px !important;
    text-decoration:none !important; vertical-align:middle !important;
}
html.spp-post-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"] img { display:none !important; }
html.spp-post-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"]::after { content:"RSS" !important; }
html.spp-post-on #breadcrumbs .crumbs-item.current > a[href^="rss.php"]:hover {
    background-color:rgba(32,201,151,.26) !important; border-color:rgba(32,201,151,.75) !important;
    color:#fff !important; -webkit-text-fill-color:#fff !important;
}
html.spp-post-on .t.f_one [style*="margin"][style*="205px"]:not(#postrule),
html.spp-post-on .t.f_one [style*="margin-left:200px"] {
    margin-left:0 !important;
    width:auto !important;
    box-sizing:border-box !important;
}
html.spp-post-on .t.f_one > table:has(#post-option) {
    width:calc(100% - 33% - 14px) !important;
    margin:12px 0 0 0 !important;
    border:1px solid var(--spu-border,#d8dee7) !important;
    border-radius:12px !important;
    overflow:hidden !important;
    background:var(--spu-surface,#fff) !important;
    box-shadow:0 1px 2px rgba(15,23,42,.05), 0 12px 30px rgba(15,23,42,.08) !important;
    table-layout:fixed !important;
}
html.spp-post-on .t.f_one > table:has(#post-option) > tbody > tr > td,
html.spp-post-on .t.f_one > table:has(#post-option) > tbody > tr > th {
    padding:7px 12px !important;
}
html.spp-post-on .t.f_one > table:has(#post-option) table { width:100% !important; }
html.spp-post-on .t.f_one > table:has(#post-option) .gray { color:var(--spu-muted,#6b7280) !important; }
html.spp-post-on #editor-content {
    border:1px solid var(--spu-border,#d8dee7) !important;
    border-radius:12px !important;
    background:var(--spu-surface,#fff) !important;
    box-shadow:0 1px 2px rgba(15,23,42,.05), 0 12px 30px rgba(15,23,42,.08) !important;
}
html.spp-post-on #editor-content #editor-button {
    border-radius:0 !important;
    background:var(--spu-overlay,#eef2f5) !important;
    border-bottom:1px solid var(--spu-border,#d8dee7) !important;
}
html.spp-post-on #editor-content .spp-editor-toolbar {
    border:0 !important;
    border-radius:0 !important;
    border-bottom:1px solid var(--spu-border,#d8dee7) !important;
    background:var(--spu-surface,#fff) !important;
}
html.spp-post-on #editor-content #textarea,
html.spp-post-on #editor-content .spp-preview-pane {
    border-radius:0 0 11px 11px !important;
    background:var(--spu-surface,#fff) !important;
}
html.spp-post-on #editor-tab,
html.spp-post-on #editor-tool {
    top:auto !important;
    bottom:100% !important;
    margin:0 !important;
    width:auto !important;
    height:28px !important;
    display:flex !important;
    align-items:center !important;
    padding:3px 5px !important;
    box-sizing:border-box !important;
    border:1px solid var(--spu-border,#d8dee7) !important;
    border-bottom:0 !important;
    border-radius:11px 11px 0 0 !important;
    background:var(--spu-overlay,#eef2f5) !important;
}
html.spp-post-on #editor-tab { left:0 !important; right:auto !important; gap:4px !important; }
html.spp-post-on #editor-tool { left:auto !important; right:0 !important; gap:2px !important; }
html.spp-post-on #editor-tab > .c { display:none !important; }
html.spp-post-on #editor-tab > span,
html.spp-post-on #editor-tool > span {
    flex:0 0 auto !important;
    float:none !important;
    display:inline-flex !important;
    align-items:center !important;
    justify-content:center !important;
    width:auto !important;
    height:22px !important;
    margin:0 !important;
    padding:0 12px !important;
    border:0 !important;
    border-radius:7px !important;
    background:none !important;
    background-image:none !important;
    color:var(--spu-secondary,#475569) !important;
    font-size:12px !important;
    font-weight:600 !important;
    line-height:1 !important;
    cursor:pointer !important;
    white-space:nowrap !important;
    user-select:none !important;
    transition:background .16s ease, color .16s ease !important;
}
html.spp-post-on #editor-tab > span:hover,
html.spp-post-on #editor-tool > span:hover {
    background:color-mix(in srgb,var(--spu-accent,#2f6f68) 10%,transparent) !important;
    color:var(--spu-accent,#2f6f68) !important;
}
html.spp-post-on #editor-tab > span.buttonPressed {
    background:var(--spu-accent,#2f6f68) !important;
    color:#fff !important;
    box-shadow:0 2px 8px rgba(47,111,104,.26) !important;
}
html.spp-post-on #editor-content > #postrule {
    position:absolute !important;
    top:auto !important;
    bottom:100% !important;
    left:auto !important;
    right:301px !important;
    width:auto !important;
    max-width:430px !important;
    height:28px !important;
    margin:0 !important;
    padding:0 2px !important;
    display:flex !important;
    align-items:center !important;
    gap:6px !important;
    box-sizing:border-box !important;
    background:none !important;
    border:0 !important;
    box-shadow:none !important;
    font-size:12px !important;
    line-height:1.2 !important;
    color:var(--spu-muted,#6b7280) !important;
}
html.spp-post-on #editor-content > #postrule > div {
    min-width:0 !important;
    overflow:hidden !important;
    white-space:nowrap !important;
    text-overflow:ellipsis !important;
}
html.spp-post-on #editor-content > #postrule a {
    color:var(--spu-accent,#2f6f68) !important;
    font-weight:600 !important;
    text-decoration:none !important;
}
html.spp-post-on #editor-content > #postrule a:hover { text-decoration:underline !important; }
html.spp-post-on a.btn3[onclick*="gopreview"] { display:none !important; }

html.spp-post-on.spp-quote-on .t.f_one > table:has(#post-option) {
    margin-left: var(--spp-opt-indent, calc(50% - 346px)) !important;
}
html.spp-post-on.spp-quote-on #main { position:relative !important; z-index:0 !important; }
html.spp-post-on input[type="submit"][name="Submit"],
html.spp-post-on #spp-preview-btn {
    height:24px !important;
    padding:0 14px !important;
    border-radius:999px !important;
    font-size:12px !important;
    font-weight:600 !important;
    font-family:inherit !important;
    line-height:1 !important;
    box-sizing:border-box !important;
    vertical-align:middle !important;
    cursor:pointer !important;
    text-shadow:none !important;
    transition:background .18s ease, border-color .18s ease, color .18s ease, transform .18s ease !important;
}
html.spp-post-on input[type="submit"][name="Submit"] {
    border:1px solid var(--spu-accent,#2f6f68) !important;
    background-color:var(--spu-accent,#2f6f68) !important;
    background-image:none !important;
    color:#fff !important;
    -webkit-text-fill-color:#fff !important;
}
html.spp-post-on input[type="submit"][name="Submit"]:hover {
    background-color:color-mix(in srgb, var(--spu-accent,#2f6f68) 84%, #000) !important;
    border-color:color-mix(in srgb, var(--spu-accent,#2f6f68) 84%, #000) !important;
    transform:translateY(-1px) !important;
}
html.spp-post-on #spp-preview-btn {
    border:1px solid var(--spu-accent,#2f6f68) !important;
    background:var(--spu-surface,#fff) !important;
    color:var(--spu-accent,#2f6f68) !important;
    margin-left:8px !important;
}
html.spp-post-on input.btn[type="submit"][value*="删除"] {
    height:24px !important;
    padding:0 14px !important;
    border-radius:999px !important;
    border:1px solid rgba(192,57,43,.9) !important;
    background-color:#c0392b !important;
    background-image:none !important;
    color:#fff !important;
    -webkit-text-fill-color:#fff !important;
    font-size:12px !important;
    font-weight:600 !important;
    font-family:inherit !important;
    line-height:1 !important;
    box-sizing:border-box !important;
    text-shadow:none !important;
    vertical-align:middle !important;
    cursor:pointer !important;
}
html.spp-post-on input.btn[type="submit"][value*="删除"]:hover {
    background-color:#d14836 !important;
    border-color:#d14836 !important;
}
html.spp-post-on.spp-quote-on .t.f_one > table:has(#post-option) > tbody > tr > td > div:has(> input[name="Submit"]) {
    display:flex !important;
    align-items:center !important;
    justify-content:center !important;
    gap:0 !important;
    line-height:1 !important;
}
html.spp-post-on.spp-quote-on #main > center {
    color:var(--spu-secondary,#475569) !important;
    font-size:13px !important;
    font-weight:600 !important;
}
html.spp-post-on.spp-quote-on #main > table,
html.spp-post-on.spp-quote-on #main > table font,
html.spp-post-on.spp-quote-on #main > table span,
html.spp-post-on.spp-quote-on #main > table td {
    color:var(--spu-text,#1f2937) !important;
    -webkit-text-fill-color:var(--spu-text,#1f2937) !important;
    text-shadow:none !important;
}
html.spp-post-on.spp-quote-on #main > table { font-size:12.5px !important; line-height:1.6 !important; }
html.spp-post-on.spp-quote-on #main > table a,
html.spp-post-on.spp-quote-on #main > table a * {
    color:var(--spu-accent,#2f6f68) !important;
    -webkit-text-fill-color:var(--spu-accent,#2f6f68) !important;
    font-weight:600 !important;
    text-decoration:none !important;
}
html.spp-post-on.spp-quote-on #main > table a:hover { text-decoration:underline !important; }
html.spp-post-on.spp-quote-on #main > hr {
    height:0 !important;
    border:0 !important;
    border-top:1px solid var(--spu-border,#e6ebf2) !important;
}
html.spp-post-on.spp-quote-on #main::after {
    content:"" !important;
    position:absolute !important;
    left:0 !important;
    right:0 !important;
    top:var(--spp-white-top, 100%) !important;
    bottom:0 !important;
    background:var(--spu-surface,#fff) !important;
    z-index:-1 !important;
    pointer-events:none !important;
}

html.spp-rdark.spp-rdark.spp-post-on #spp-preview-btn {
    border-color:rgba(63,191,168,.55) !important;
    background:rgba(63,191,168,.14) !important;
    color:#eafff8 !important;
    -webkit-text-fill-color:#eafff8 !important;
}
html.spp-rdark.spp-rdark.spp-post-on #spp-preview-btn:hover {
    background:rgba(63,191,168,.24) !important;
    border-color:rgba(63,191,168,.85) !important;
}

html.spp-post-on:not(.spp-quote-on) #main { position:relative !important; z-index:0 !important; }
html.spp-post-on:not(.spp-quote-on) #main::after {
    content:"" !important;
    position:absolute !important;
    left:0 !important;
    right:0 !important;
    top:var(--spp-white-top, 100%) !important;
    bottom:0 !important;
    background:var(--spp-rk-glass,#fff) !important;
    z-index:-1 !important;
    pointer-events:none !important;
}
html.spp-post-on:not(.spp-quote-on) #main > center { color:var(--spu-muted,#6b7280) !important; }
html.spp-post-on:not(.spp-quote-on) #main > table[align="center"] { color:var(--spu-text,#1f2937) !important; }
html.spp-post-on:not(.spp-quote-on) #main > table[align="center"] a { color:var(--spu-accent,#2f6f68) !important; }
html.spp-post-on:not(.spp-quote-on) #main > hr {
    height:1px !important;
    border:0 !important;
    background:var(--spu-border,#e6ebf2) !important;
}
`;
function movePostRule() {
if (!PAGE.post) return false;
const host = document.getElementById('editor-content');
const rule = document.getElementById('postrule');
if (!host || !rule || rule.parentElement === host) return false;
host.appendChild(rule);
return true;
}
function syncPostFill() {
if (!PAGE.post) return;
const card = document.querySelector('.t.f_one');
const main = document.getElementById('main');
if (!card || !main) return;
const mr = main.getBoundingClientRect();
const cr = card.getBoundingClientRect();
main.style.setProperty('--spp-white-top', Math.round(cr.bottom - mr.top) + 'px');
main.style.setProperty('--spp-postfill', Math.max(0, Math.round(mr.bottom - cr.bottom) + 1) + 'px');
const cardEl = document.getElementById('editor-content');
if (cardEl) {
main.style.setProperty('--spp-opt-indent',
Math.round(cardEl.getBoundingClientRect().left - cr.left) + 'px');
}
}
function applyPostCss() {
if (!PAGE.post) return;
movePostRule();
document.documentElement.classList.toggle('spp-quote-on',
SEARCH.indexOf('action-quote') >= 0 || SEARCH.indexOf('action-modify') >= 0);
if (!window.__sppPostFillBound) {
window.__sppPostFillBound = 1;
window.addEventListener('resize', syncPostFill);
[120, 400, 1200].forEach(function (t) { setTimeout(syncPostFill, t); });
}
syncPostFill();
ensureStyle(STYLE_ID + '-post', POST_CSS);                    
}
function hideToolsRow() {
if (!PAGE.read) return 0;
let n = 0;
[].slice.call(document.querySelectorAll('#main > div.h2')).forEach(function (el) {
if (el.classList.contains('spp-hide-row')) return;
if (!/浏览器收藏|打印/.test(el.textContent || '')) return;
el.classList.add('spp-hide-row');
n++;
});
return n;
}
function moveCrumb() {
if (WANTS.crumbPanel) {
const row = document.querySelector('#main > .bdbA');
if (!row || !row.querySelector('#breadcrumbs')) return 0;
if (row.classList.contains('spp-crumb-panel')) return 0;      
row.classList.add('spp-crumb-panel');
return 1;
}
if (!PAGE.search) return 0;
const host = document.querySelector('#infobox.spp-up-on td.spp-up-host-td');
if (!host) return 0;
const bdbA = document.querySelector('#main > .bdbA');
const bc = bdbA ? bdbA.querySelector('#breadcrumbs') : null;
if (!bc) return 0;
if (bc.parentElement && bc.parentElement.classList.contains('spp-crumb-line')) return 0;   
let line = host.querySelector(':scope > .spp-crumb-line');
if (!line) {
line = document.createElement('div');
line.className = 'spp-crumb-line';
host.insertBefore(line, host.firstChild);
}
line.appendChild(bc);
if (bdbA && !bdbA.children.length) bdbA.style.setProperty('display', 'none', 'important');
return 1;
}
onDomReady(() => {
if (PAGE.search) document.documentElement.classList.add('spp-search-on');
if (PAGE.post) document.documentElement.classList.add('spp-post-on');
applyBanner();
applyCard();
buildTop();
applyReadCss();
applySearchCss();
applyPostCss();
applyHotCss();
moveCrumb();
hideToolsRow();
setTimeout(() => { applyBanner(); applyCard(); buildTop(); applyReadCss(); applySearchCss(); applyPostCss(); applyHotCss(); moveCrumb(); hideToolsRow(); }, 800);
});
}
function initSearchForumPicker() {
if (!PAGE.search) return;
var CONT_NAMES = {
'同人志&CG': 1, '同人志&CG (图墙模式)': 1, '图墙模式': 1, '游戏': 1, '音乐': 1,
'Cosplay&其他': 1, '同人音声&Cosplay&其他': 1, '广播剧&Cosplay&其他': 1
};
function isCont(t) { return !!CONT_NAMES[String(t).replace(/s*(Cd+)$/, '')]; }
var SPLIT_MIN = 40;
var ALL_LABEL = '全部版块分类';
var TEA_LABEL = '茶馆';
function txt(o) { return (o.textContent || '').replace(/\u00a0/g, ' ').replace(/\s+/g, ' ').trim(); }
function short(label) {
return String(label)
.replace(/\s*\(C\d+\)$/, '')
.replace(/^同人志&CG\s*\(图墙模式\)$/, '图墙模式')
.replace(/^同人志&CG$/, '同人志')
.replace(/^Cosplay&其他$/, 'Cosplay')
.replace(/^新视界区\s*\(临时\)$/, '新视界');
}
function parse(sel) {
var out = { all: null, groups: [] }, cur = null;
[].slice.call(sel.options).forEach(function (o) {
var t = txt(o);
if (!t) return;
if (o.value === 'all' || t === ALL_LABEL) { out.all = { v: o.value, t: t }; return; }
if (t.indexOf('>>') === 0) {
cur = { name: t.replace(/^>>\s*/, ''), fid: o.value, subs: [] };
out.groups.push(cur);
return;
}
if (!cur) { cur = { name: ALL_LABEL, fid: o.value, subs: [] }; out.groups.push(cur); }
cur.subs.push({ v: o.value, t: t.replace(/^\|-\s*/, '') });
});
out.groups.forEach(function (g) {
if (g.subs.length <= SPLIT_MIN) return;
var cards = [];
g.subs.forEach(function (s) {
if (cards.length && isCont(s.t)) cards[cards.length - 1].items.push(s);
else cards.push({ head: s, items: [] });
});
g.cards = cards;
});
return out;
}
function injectCss() {
if (document.getElementById('spp-fpk-style')) return 0;
var st = document.createElement('style');
st.id = 'spp-fpk-style';
st.textContent = CSS_FPK;
appendToHeadSafe(st);
return 1;
}
function build() {
var sel = document.querySelector('select[name="f_fid"]');
if (!sel || sel.dataset.sppFpk) return 0;
injectCss();
var data = parse(sel);
var trig = document.createElement('button');
trig.type = 'button';
trig.className = 'spp-fpk__trig';
var trigT = document.createElement('span');
trigT.className = 'spp-fpk__trig-t';
trig.appendChild(trigT);
var wpx = Math.round(sel.getBoundingClientRect().width);
if (wpx > 80) trig.style.width = wpx + 'px';
sel.parentNode.insertBefore(trig, sel);
sel.dataset.sppFpk = '1';
sel.style.setProperty('display', 'none', 'important');
var panel = document.createElement('div');
panel.className = 'spp-fpk';
panel.setAttribute('hidden', 'hidden');
var hd = document.createElement('div');
hd.className = 'spp-fpk__hd';
var ttl = document.createElement('span');
ttl.className = 'spp-fpk__t';
ttl.textContent = '选择版块分类';
var allChip = document.createElement('button');
allChip.type = 'button';
allChip.className = 'spp-fpk__chip spp-fpk__chip--all';
allChip.textContent = ALL_LABEL;
if (data.all) allChip.dataset.fid = data.all.v;
var curTxt = document.createElement('span');
curTxt.className = 'spp-fpk__cur';
var xBtn = document.createElement('button');
xBtn.type = 'button';
xBtn.className = 'spp-fpk__x';
xBtn.textContent = '×';
xBtn.title = '关闭';
hd.appendChild(ttl); hd.appendChild(allChip); hd.appendChild(curTxt); hd.appendChild(xBtn);
var body = document.createElement('div');
body.className = 'spp-fpk__body';
function chipOf(item, compact) {
var c = document.createElement('button');
c.type = 'button';
c.className = compact ? 'spp-fpk__lnk' : 'spp-fpk__chip';
c.textContent = item.short ? short(item.t) : item.t;
c.title = item.t;
if (item.v && String(item.v).trim()) c.dataset.fid = item.v;
else c.disabled = true;
return c;
}
data.groups.forEach(function (g) {
if (!g.subs.length) return;
var sec = document.createElement('section');
sec.className = 'spp-fpk__grp';
var gt = document.createElement('button');
gt.type = 'button';
gt.className = 'spp-fpk__grp-t';
gt.textContent = g.name;
gt.title = '选中「' + g.name + '」这个大板块';
if (g.fid && String(g.fid).trim()) gt.dataset.fid = g.fid;
else gt.disabled = true;
var gn = document.createElement('span');
gn.className = 'spp-fpk__grp-n';
gn.textContent = String(g.subs.length);
gt.appendChild(gn);
sec.appendChild(gt);
var box = document.createElement('div');
box.className = 'spp-fpk__subs';
if (g.cards) {
box.classList.add('spp-fpk__subs--cards');
g.cards.forEach(function (card) {
var mini = document.createElement('div');
mini.className = 'spp-fpk__mini';
var mt = document.createElement('button');
mt.type = 'button';
mt.className = 'spp-fpk__mini-t';
mt.textContent = short(card.head.t);
mt.title = card.head.t;
if (card.head.v && String(card.head.v).trim()) mt.dataset.fid = card.head.v;
else mt.disabled = true;
mini.appendChild(mt);
var mb = document.createElement('div');
mb.className = 'spp-fpk__mini-b';
card.items.forEach(function (it) {
it.short = true;
mb.appendChild(chipOf(it, true));
});
mini.appendChild(mb);
box.appendChild(mini);
});
} else {
g.subs.forEach(function (it) { box.appendChild(chipOf(it)); });
}
sec.appendChild(box);
body.appendChild(sec);
});
panel.appendChild(hd);
panel.appendChild(body);
document.body.appendChild(panel);
function nodes() { return [].slice.call(panel.querySelectorAll('[data-fid]')); }
function labelOf(v) {
for (var i = 0; i < sel.options.length; i++) {
if (sel.options[i].value === v) return txt(sel.options[i]).replace(/^>>\s*/, '').replace(/^\|-\s*/, '');
}
return ALL_LABEL;
}
function paint() {
var v = sel.value;
nodes().forEach(function (el) {
var on = String(el.dataset.fid) === String(v);
el.classList.toggle('is-on', on);
});
var lb = labelOf(v);
trigT.textContent = lb;
trig.title = '当前:' + lb + '(点击选择版块分类)';
curTxt.textContent = '当前:' + lb;
}
function open() { panel.removeAttribute('hidden'); paint(); }
function shut() { panel.setAttribute('hidden', 'hidden'); }
function pick(fid) {
if (!fid || !String(fid).trim()) return;
sel.value = fid;
try { sel.dispatchEvent(new Event('change', { bubbles: true })); } catch (e) { }
paint();
shut();
}
trig.addEventListener('click', function (e) {
e.preventDefault();
if (panel.hasAttribute('hidden')) open(); else shut();
});
xBtn.addEventListener('click', function (e) { e.preventDefault(); shut(); });
panel.addEventListener('click', function (e) {
e.preventDefault();
var el = e.target && e.target.closest ? e.target.closest('[data-fid]') : null;
if (el && !el.disabled) pick(el.dataset.fid);
});
document.addEventListener('keydown', function (e) { if (e.key === 'Escape') shut(); });
document.addEventListener('click', function (e) {
if (panel.hasAttribute('hidden')) return;
if (panel.contains(e.target) || trig.contains(e.target)) return;
shut();
}, true);
if (GM_getValue('spp_fpk_default_tea', true)) {
[].slice.call(sel.options).some(function (o) {
var t = txt(o);
if (t.indexOf(TEA_LABEL) < 0 || t.indexOf('>>') === 0 || o.value === 'all') return false;
if (!String(o.value).trim()) return false;
sel.value = o.value;
return true;
});
}
if (sel.form) {
sel.form.addEventListener('reset', function () { setTimeout(paint, 0); });
}
paint();
return 1;
}
onDomReady(function () {
if (!build()) return;
setTimeout(function () { if (!document.querySelector('.spp-fpk__trig')) build(); }, 900);
});
}
function initSearchSort() {
if (!PAGE.search) return;
function presetForm() {
const sel = document.querySelector('select[name="orderway"]');
if (!sel || sel.dataset.sppSsort) return 0;
sel.dataset.sppSsort = '1';
const m = String(SEARCH || '').match(/[?&]orderway=([a-z]+)/i);
if (m && SEARCH_ORDER_LABEL[m[1]]) {
sel.value = m[1];
} else {
const want = searchOrder();
sel.value = want;
if (want === 'hits' || want === 'replies') {
const asc = document.querySelector('input[name="asc"][value="ASC"]');
const desc = document.querySelector('input[name="asc"][value="DESC"]');
if (asc && asc.checked && desc) desc.checked = true;
}
}
if (sel.form) {
sel.form.addEventListener('reset', function () { setTimeout(function () { sel.value = searchOrder(); }, 0); });
}
return 1;
}
onDomReady(function () {
presetForm();
setTimeout(presetForm, 700);
});
}
function initBoardToolbar() {
if (!PAGE.board && !PAGE.read && !PAGE.search) return;
if (PAGE.read) document.documentElement.classList.add('spp-read-on');
if ((PAGE.read || PAGE.search) && !document.getElementById('spp-boardtool-style')) {
const bt = document.createElement('style');
bt.id = 'spp-boardtool-style';
bt.textContent = CSS_BOARDTOOL;
appendToHeadSafe(bt);
}
function hardenPager(row) {
const cur = row.querySelector('.pages ul li b');
if (cur) {
cur.style.setProperty('box-sizing', 'border-box', 'important');
cur.style.setProperty('background-color', 'rgba(32,201,151,.16)', 'important');
cur.style.setProperty('border-color', 'rgba(32,201,151,.70)', 'important');
cur.style.setProperty('color', '#c9f7e4', 'important');
cur.style.setProperty('-webkit-text-fill-color', '#c9f7e4', 'important');
}
const go = row.querySelector('.pagesone input');
if (go) {
go.style.setProperty('box-sizing', 'border-box', 'important');
go.style.setProperty('height', '30px', 'important');
go.style.setProperty('width', '62px', 'important');
go.style.setProperty('padding', '0 6px', 'important');
go.style.setProperty('font-size', '13px', 'important');
go.style.setProperty('border-radius', '8px', 'important');
go.style.setProperty('background-color', 'var(--spp-go-bg, #141922)', 'important');
go.style.setProperty('border-width', 'var(--spp-go-bd, 1px)', 'important');
go.style.setProperty('border-style', 'solid', 'important');
go.style.setProperty('border-color', 'var(--spp-go-bdc, rgba(255,255,255,.16))', 'important');
go.style.setProperty('box-shadow', 'var(--spp-go-sh, inset 0 1px 0 rgba(255,255,255,.04))', 'important');
go.style.setProperty('outline', 'none', 'important');
go.style.setProperty('color', '#e6edf7', 'important');
go.style.setProperty('-webkit-text-fill-color', '#e6edf7', 'important');
}
}
function retargetEndPager(row) {
let box = null;
const boxes = row.querySelectorAll('.pages');
for (let b = 0; b < boxes.length; b++) {
const t = boxes[b].textContent || '';
if (/[«‹]/.test(t) && /[»›]/.test(t)) { box = boxes[b]; break; }
}
if (!box) return 0;
const anchors = Array.from(box.querySelectorAll('a'));
const byText = (re) => anchors.find(function (a) {
return !a.hasAttribute('data-spp-pg-end') && re.test((a.textContent || '').trim());
});
const prevBtn = byText(/^[«‹]+$/);
const nextBtn = byText(/^[»›]+$/);
const tmplA = anchors.find(function (a) {
return !a.hasAttribute('data-spp-pg-end') && /(?<!f)page[-=]\d+/i.test(a.getAttribute('href') || '');
});
if (!prevBtn || !nextBtn || !tmplA) return 0;
const tmpl = tmplA.getAttribute('href') || '';
const hereHits = (location.pathname + location.search).match(/(?<!f)page[-=](\d+)/gi);
const hereLast = hereHits ? hereHits[hereHits.length - 1].match(/(\d+)/) : null;
const cur = hereLast ? Number(hereLast[1]) : 1;
const one = row.querySelector('.pagesone');
const tm = one ? (one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/) : null;
const total = tm ? Number(tm[2]) : 0;
const build = function (n) {
const re = /(?<!f)page([-=])\d+/gi;
let m, last = null;
while ((m = re.exec(tmpl))) last = m;
if (!last) return tmpl;
return tmpl.slice(0, last.index) + 'page' + last[1] + n + tmpl.slice(last.index + last[0].length);
};
const set = function (a, n, ok) {
if (a.dataset.sppPgTo === String(n) && ok) return;
a.dataset.sppPgTo = String(n);
if (ok) {
a.setAttribute('href', build(n));
a.classList.remove('spp-pg-off');
a.removeAttribute('aria-disabled');
} else if (a.getAttribute('href')) {
a.removeAttribute('href');
a.classList.add('spp-pg-off');
a.setAttribute('aria-disabled', 'true');
}
};
set(prevBtn, cur - 1, cur - 1 >= 1);
set(nextBtn, cur + 1, !total || cur + 1 <= total);
prevBtn.textContent = '‹';
nextBtn.textContent = '›';
const endsOn = SPP_CONFIG.bool('spp_pg_ends', true);
const clearEnds = function () {
Array.prototype.forEach.call(row.querySelectorAll('a[data-spp-pg-end]'), function (a) {
const p = a.parentElement;
if (p && p.tagName === 'LI' && p.querySelectorAll('a').length === 1) p.remove();
else a.remove();
});
};
if (!endsOn) clearEnds();
const mkEnd = function (side, glyph, n, ok) {
try {
var siteLastM = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.siteLast) ? SPP_FLOW_SYNC.siteLast : 0;
if (siteLastM > 0 && (!n || n < 1)) n = siteLastM;
} catch (e) { }
const host = (side === 'first') ? prevBtn.parentElement : nextBtn.parentElement;
if (!host || !host.parentElement) return;
const wrap = host.parentElement;
let a = wrap.querySelector('a[data-spp-pg-end="' + side + '"]');
if (!a) {
a = prevBtn.cloneNode(true);
a.setAttribute('data-spp-pg-end', side);
a.removeAttribute('data-spp-pg-to');
if (host.tagName === 'LI') {
const li = host.cloneNode(false);
li.appendChild(a);
wrap.insertBefore(li, (side === 'first') ? host : host.nextSibling);
} else {
wrap.insertBefore(a, (side === 'first') ? host : host.nextSibling);
}
}
a.textContent = glyph;
if (ok) {
a.setAttribute('href', build(n));
a.classList.remove('spp-pg-off');
a.removeAttribute('aria-disabled');
var seenLast = 0;
try {
document.querySelectorAll('a[href*="page-"], a[href*="page="]').forEach(function (a2) {
var mm = String(a2.getAttribute('href') || '').match(/(?<!f)page[-=](\d+)/i);
if (mm) seenLast = Math.max(seenLast, Number(mm[1]) || 0);
});
} catch (e) { }
var shownLast = seenLast > 0 ? seenLast : n;
var siteLast9 = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.siteLast) ? SPP_FLOW_SYNC.siteLast : 0;
var shownLast9 = siteLast9 > 0 ? siteLast9 : shownLast;
a.setAttribute('title', (side === 'first') ? '第 1 页' : ('末页(第 ' + shownLast9 + ' 页)'));
a.setAttribute('aria-label', a.getAttribute('title'));
} else {
a.removeAttribute('href');
a.classList.add('spp-pg-off');
a.setAttribute('aria-disabled', 'true');
a.setAttribute('title', (side === 'first') ? '已经在第 1 页' : '已经在末页');
}
};
if (endsOn) {
mkEnd('first', '«', 1, cur > 1);
if (total) mkEnd('last', '»', total, cur < total);
}
setTimeout(function () {
try {
var seenLastP = 0;
row.querySelectorAll('.pages a[href*="page"]').forEach(function (a) {
var mm = String(a.getAttribute('href') || '').match(/(?<!f)page[-=](\d+)/i);
if (mm) seenLastP = Math.max(seenLastP, Number(mm[1]) || 0);
});
if (seenLastP > 0) {
var endP = row.querySelector('a[data-spp-pg-end="last"]');
if (endP) {
var siteLastH = (typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.siteLast) ? SPP_FLOW_SYNC.siteLast : 0;
var useLastH = siteLastH > 0 ? siteLastH : seenLastP;
if (endP.getAttribute('href')) endP.setAttribute('href', (endP.getAttribute('href').replace(/(?<!f)page([-=])\d+/i, 'page$1' + useLastH)));
endP.setAttribute('title', '末页(第 ' + ((typeof SPP_FLOW_SYNC === 'object' && SPP_FLOW_SYNC && SPP_FLOW_SYNC.siteLast) ? SPP_FLOW_SYNC.siteLast : seenLastP) + ' 页)');
endP.setAttribute('aria-label', endP.getAttribute('title') || ('末页(第 ' + seenLastP + ' 页)'));
}
}
var links2 = [].slice.call(row.querySelectorAll('.pages a[data-spp-block]'));   
var nums2 = links2.map(function (a) {
var m = String(a.getAttribute('href') || '').match(/(?<!f)page[-=](\d+)/i);
return m ? (Number(m[1]) || 0) : 0;
}).filter(function (n) { return n > 0; }).sort(function (a, b) { return a - b; });
links2.forEach(function (a) {
var m = String(a.getAttribute('href') || '').match(/(?<!f)page[-=](\d+)/i);
var n = m ? (Number(m[1]) || 0) : 0;
if (!n) return;
var i = nums2.indexOf(n);
var hi = (i >= 0 && i + 1 < nums2.length) ? (nums2[i + 1] - 1) : n;
if (hi < n) hi = n;
a.setAttribute('aria-label', '第 ' + n + '-' + hi + ' 页');
});
} catch (e) { }
}, 0);        
try {
const links = [].slice.call(row.querySelectorAll('.pages a[data-spp-block]'));   
const nums = links.map(function (a) {
var m = String(a.getAttribute('href') || '').match(/(?<!f)page[-=](\d+)/i);
return m ? (Number(m[1]) || 0) : 0;
}).filter(function (n) { return n > 0; }).sort(function (a, b) { return a - b; });
links.forEach(function (a) {
var m = String(a.getAttribute('href') || '').match(/(?<!f)page[-=](\d+)/i);
var n = m ? (Number(m[1]) || 0) : 0;
if (!n) return;
var i = nums.indexOf(n);
var hi = (i >= 0 && i + 1 < nums.length) ? (nums[i + 1] - 1) : n;
if (hi < n) hi = n;
a.setAttribute('aria-label', '第 ' + n + '-' + hi + ' 页');
});
} catch (e) { }
return 1;
}
function markPagerRows() {
let n = 0;
const rows = [];
Array.prototype.forEach.call(document.querySelectorAll('.pages'), function (p) {
const t3 = p.closest('.t3');
if (t3) { if (rows.indexOf(t3) < 0) rows.push(t3); return; }
const host = p.parentElement;
if (host && host.classList.contains('spp-pgbar')) { rows.push(host); return; }
const wrap = document.createElement('div');
wrap.className = 'spp-pgbar';
host.insertBefore(wrap, p);
wrap.appendChild(p);
rows.push(wrap);
});
rows.forEach(function (row) {
if (!row.classList.contains('spp-pgbar')) row.classList.add('spp-pgbar');
const frs = row.querySelectorAll(':scope > .fr');
for (let k = 0; k < frs.length; k++) {
frs[k].classList.add(k < frs.length - 1 ? 'spp-pg-mid' : 'spp-pg-flex');
}
hardenPager(row);
retargetEndPager(row);
extendPagerNums(row);
n++;
});
return n;
}
function extendPagerNums(row) {
let want = 5;
try {
want = PAGE.read ? SPP_CONFIG.num('spp_pager_nums_read', 5, 1, 10)
: SPP_CONFIG.num('spp_pager_nums', 5, 1, 15);
} catch (e) { want = 5; }
if (!(want > 0)) return 0;
let box = null;
const boxes = row.querySelectorAll('.pages');
for (let b = 0; b < boxes.length; b++) {
const t = boxes[b].textContent || '';
if (/[«‹]/.test(t) && /[»›]/.test(t)) { box = boxes[b]; break; }
}
if (!box) return 0;
const mine = box.querySelectorAll('li[data-spp-pg-num]');
for (let i = 0; i < mine.length; i++) mine[i].parentNode.removeChild(mine[i]);
const lis = Array.prototype.filter.call(box.querySelectorAll('li'), function (li) {
return /^\s*\d+\s*$/.test(li.textContent || '');
});
if (!lis.length) return 0;
if (lis.length >= want) return 0;
const one = row.querySelector('.pagesone') || document.querySelector('.pagesone');
const tm = one ? (one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/) : null;
const total = tm ? Number(tm[2]) : 0;
if (!(total > 1)) return 0;
let tmplLi = null, tmplHref = '';
for (let i = lis.length - 1; i >= 0; i--) {
const a = lis[i].querySelector('a');
if (a && /page-\d+/i.test(a.getAttribute('href') || '')) {
tmplLi = lis[i];
tmplHref = a.getAttribute('href');
break;
}
}
if (!tmplLi || !tmplHref) return 0;
const nums = lis.map(function (li) { return Number((li.textContent || '').trim()); });
let next = Math.max.apply(null, nums) + 1;
let anchor = lis[lis.length - 1];
let added = 0;
while (lis.length + added < want && next <= total) {
const li = tmplLi.cloneNode(true);
const a = li.querySelector('a');
if (!a) break;
li.setAttribute('data-spp-pg-num', '1');
a.textContent = String(next);
a.setAttribute('href', tmplHref.replace(/(-page-)\d+/i, '$1' + next));
anchor.parentNode.insertBefore(li, anchor.nextSibling);
anchor = li;
next++;
added++;
}
return added;
}
function dressPostButtons() {
if (!PAGE.board) return 0;
let n = 0;
Array.prototype.forEach.call(document.querySelectorAll('.spp-pgbar a[href*="post.php"], #main div.t3 > span.fr > a[href*="post.php"]'), function (a) {
if (a.dataset.sppPost) return;
a.dataset.sppPost = '1';
a.classList.add('spp-postbtn');
const glow = document.createElement('span');
glow.className = 'spp-post-glow';
glow.setAttribute('aria-hidden', 'true');
['l', 'r', 't', 'b'].forEach(function (k) {     
const i = document.createElement('i');
i.className = 'spp-pb-' + k;
glow.appendChild(i);
});
const bd = document.createElement('span');
bd.className = 'spp-pb-backdrop';               
glow.appendChild(bd);
const ico = document.createElement('span');     
ico.className = 'spp-post-ico';
ico.setAttribute('aria-hidden', 'true');
const txt = document.createElement('span');
txt.className = 'spp-post-txt';
txt.textContent = '发新帖';                      
a.appendChild(glow); a.appendChild(ico); a.appendChild(txt);
n++;
});
return n;
}
function stripBrackets() {
const s3 = document.querySelector('#breadcrumbs a.s3');
if (!s3) return 0;
const m = (s3.textContent || '').trim().match(/^\[(.+)\]$/);
if (m) s3.textContent = m[1];
return 1;
}
function moveCrumbs() {
const bar = document.getElementById('spp-btabs');
const bc = document.getElementById('breadcrumbs');
if (!bar || !bc) return 0;
if (bc.parentElement !== bar) bar.appendChild(bc);
const wrap = bc.closest('.bdbA');
if (wrap && !wrap.children.length) wrap.style.setProperty('display', 'none', 'important');
return 1;
}
function run() {
markPagerRows();
dressPostButtons();
stripBrackets();
moveCrumbs();
}
onDomReady(function () {
run();
setTimeout(run, 800);
});
}
function initProfileSkin() {
onDomReady(function () {
if (!document.getElementById('set-wrap')) return;
Array.prototype.forEach.call(
document.querySelectorAll('#set-content div, #set-content .set-tab-table td, #set-content .set-tab-table table, #set-content-wrap'),
function (el) {
el.style.setProperty('border', '0', 'important');
el.style.setProperty('outline', '0', 'important');
el.style.setProperty('box-shadow', 'none', 'important');
}
);
Array.prototype.forEach.call(
document.querySelectorAll('#set-content table.set-table2 tr'),
function (tr) {
tr.style.setProperty('background-color', 'transparent', 'important');
tr.style.setProperty('background-image', 'none', 'important');
}
);
[
['#set-content .set-tab-table td', 'rgba(255,255,255,.06)', '#e6edf7'],
['#set-content table.set-table2 tr.tr32:first-child > td', 'rgba(255,255,255,.045)', '#8ef0b8'],
['#set-content table.set-table2 tr.tr2 > td', 'rgba(255,255,255,.055)', '#9fb0c8']
].forEach(function (it) {
Array.prototype.forEach.call(document.querySelectorAll(it[0]), function (el) {
el.style.setProperty('background-color', it[1], 'important');
el.style.setProperty('background-image', 'none', 'important');
el.style.setProperty('color', it[2], 'important');
el.style.setProperty('-webkit-text-fill-color', it[2], 'important');
});
});
Array.prototype.forEach.call(document.querySelectorAll('#set-menu > li > a'), function (a) {
a.style.setProperty('color', '#cfdcee', 'important');
a.style.setProperty('-webkit-text-fill-color', '#cfdcee', 'important');
a.style.setProperty('padding-left', '16px', 'important');
});
Array.prototype.forEach.call(
document.querySelectorAll('#set-content table td'),
function (td) {
if (td.dataset.sppTick) return;
const t = (td.textContent || '').trim();
if (t === '√' || t === '✓' || t === '✔') {
td.classList.add('spp-tick');
td.dataset.sppTick = '1';
td.style.setProperty('color', '#3ef58c', 'important');
td.style.setProperty('-webkit-text-fill-color', '#3ef58c', 'important');
}
}
);
});
}
function initProfileLayout() {
onDomReady(function () {
if (!document.getElementById('set-wrap')) return;   
const CARDS = [
'#set-content .set-content-left > div:first-child',   
'#set-content .set-content-right > div:not(.c)'       
];
CARDS.forEach(function (sel) {
Array.prototype.forEach.call(document.querySelectorAll(sel), function (el) {
el.style.setProperty('border', '1px solid rgba(255,255,255,.075)', 'important');
el.style.setProperty('border-radius', '14px', 'important');
el.style.setProperty('background-color', 'rgba(255,255,255,.022)', 'important');
el.style.setProperty('background-image',
'linear-gradient(to top, rgba(0,0,0,.30) 0%, rgba(255,255,255,.05) 100%)', 'important');
el.style.setProperty('box-shadow',
'inset 0 2px 5px rgba(0,0,0,.45), inset 0 -1px 0 rgba(255,255,255,.06)', 'important');
});
});
(function buildProfileStats() {
const host = document.querySelector('#set-content .set-content-left');
const table = host ? host.querySelector('table.set-table1') : null;
if (!table || table.dataset.sppStatsDone) return;
table.dataset.sppStatsDone = '1';
const items = [];
Array.prototype.forEach.call(table.querySelectorAll('td'), function (td) {
String(td.innerHTML).split(/<br\s*\/?>/i).forEach(function (seg) {
const t = seg.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
if (!t) return;
const m = t.match(/^([^::]+)[::]\s*(.*)$/);
items.push(m ? { k: m[1].trim(), v: m[2].trim() } : { k: t, v: '' });
});
});
if (!items.length) return;
const box = document.createElement('div');
box.className = 'spp-stats';
items.forEach(function (it) {
const cell = document.createElement('span');
cell.className = 'spp-stat' + (/^(SP币|会员头衔)$/.test(it.k) ? ' is-accent' : '');
const em = document.createElement('em');   
em.textContent = it.k;
const b = document.createElement('b');     
b.textContent = it.v || '—';
cell.appendChild(em);
cell.appendChild(b);
box.appendChild(cell);
});
table.replaceWith(box);
})();
Array.prototype.forEach.call(document.querySelectorAll('#set-menu > li'), function (li) {
if (li.dataset.sppCurDone) return;
li.dataset.sppCurDone = '1';
const a = li.querySelector('a');
if (!a) return;
const m = String(a.getAttribute('href') || '').match(/action-([a-z]+)/);
if (m && SEARCH.indexOf('action-' + m[1]) >= 0) li.classList.add('spp-cur');
});
(function dropTrailingEmpty() {
const left = document.querySelector('#set-content .set-content-left');
if (!left) return;
const blocks = [...left.children].filter(function (d) { return !d.classList.contains('c'); });
const last = blocks[blocks.length - 1];
if (!last || last.dataset.sppEmptyDone) return;
const txt = (last.textContent || '').replace(/\s+/g, '');
const hasMedia = !!last.querySelector('img, input, a, select, textarea');
last.dataset.sppEmptyDone = '1';
if (!txt && !hasMedia) last.style.setProperty('display', 'none', 'important');
})();
const FIELD_SEL = '#set-content input.input, #set-content input[type="text"], #set-content input[type="password"], ' +
'#set-content input[type="email"], #set-content input[type="number"], #set-content input[type="url"], ' +
'#set-content input[type="search"], #set-content input[type="tel"], #set-content textarea';
Array.prototype.forEach.call(document.querySelectorAll(FIELD_SEL), function (el) {
el.style.setProperty('background-color', 'rgba(9,13,21,.55)', 'important');
el.style.setProperty('background-image',
'linear-gradient(to top, rgba(0,0,0,.30) 0%, rgba(255,255,255,.045) 100%)', 'important');
el.style.setProperty('border', '1px solid rgba(255,255,255,.10)', 'important');
el.style.setProperty('color', '#eaf2fb', 'important');
el.style.setProperty('-webkit-text-fill-color', '#eaf2fb', 'important');
el.style.setProperty('font-family', 'inherit', 'important');
});
Array.prototype.forEach.call(document.querySelectorAll('#set-content input[type="file"]'), function (el) {
el.style.setProperty('background-color', 'rgba(9,13,21,.40)', 'important');
el.style.setProperty('background-image', 'none', 'important');
el.style.setProperty('border', '1px dashed rgba(255,255,255,.16)', 'important');
el.style.setProperty('color', '#9fb0c8', 'important');
el.style.setProperty('-webkit-text-fill-color', '#9fb0c8', 'important');
el.style.setProperty('font-family', 'inherit', 'important');
});
Array.prototype.forEach.call(
document.querySelectorAll('#set-content input.btn[type="submit"], #set-content input.btn[type="button"], #set-content button.btn'),
function (el) {
el.style.setProperty('background-image', 'none', 'important');
el.style.setProperty('background-color', '#188a67', 'important');
el.style.setProperty('border', '1px solid rgba(32,201,151,.85)', 'important');
el.style.setProperty('color', '#eafff6', 'important');
el.style.setProperty('-webkit-text-fill-color', '#eafff6', 'important');
el.style.setProperty('font-family', 'inherit', 'important');
el.style.setProperty('font-size', '13.5px', 'important');
}
);
Array.prototype.forEach.call(document.querySelectorAll('#set-content input.btn[type="reset"]'), function (el) {
el.style.setProperty('background-image', 'none', 'important');
el.style.setProperty('background-color', '#c0392b', 'important');
el.style.setProperty('border', '1px solid rgba(192,57,43,.9)', 'important');
el.style.setProperty('color', '#fff', 'important');
el.style.setProperty('-webkit-text-fill-color', '#fff', 'important');
el.style.setProperty('font-family', 'inherit', 'important');
});
});
}
const SECBAR_CM_KEY = 'spp_secbar_cm';
const SECBAR_HJ_KEY = 'spp_secbar_hj';
const SECBAR_CM_DEF = 'mecha';
const SECBAR_HJ_DEF = 'pulse';
const SECBAR_CM_ALLOWED = ['mecha'];
const SECBAR_HJ_ALLOWED = ['pulse'];
function secBarCmStyle() { return SPP_CONFIG.pick(SECBAR_CM_KEY, SECBAR_CM_DEF, SECBAR_CM_ALLOWED); }
function secBarHjStyle() { return SPP_CONFIG.pick(SECBAR_HJ_KEY, SECBAR_HJ_DEF, SECBAR_HJ_ALLOWED); }
const HJ_CARD_CSS = [
".spp-hjcard .glass-section { background: #080c16; border: 1px solid rgba(6, 182, 212, 0.35); box-shadow: 0 0 25px rgba(6, 182, 212, 0.15); }",
".spp-hjcard { background: #090e1a; border: 1px solid rgba(30, 41, 59, 0.9); }",
".spp-hjcard:hover { border-color: #06b6d4; box-shadow: 0 0 30px rgba(6, 182, 212, 0.28); transform: translateY(-2px); }",
".spp-hjcard /* 组件样式 */\n    .inner-slot { background: rgba(7, 9, 16, 0.6); border: 1px solid rgba(255, 255, 255, 0.05); }",
".spp-hjcard .text-slate-200 { color: #e2e8f0; }",
".spp-hjcard .text-slate-400 { color: #94a3b8; }",
".spp-hjcard .text-white { color: #ffffff; }",
".spp-hjcard .text-cyan-200 { color: #a5f3fc; }",
".spp-hjcard .text-cyan-300 { color: #67e8f9; }",
".spp-hjcard .text-cyan-400 { color: #22d3ee; }",
".spp-hjcard .text-purple-300 { color: #d8b4fe; }",
".spp-hjcard .text-purple-400 { color: #c084fc; }",
".spp-hjcard .text-pink-300 { color: #f9a8d4; }",
".spp-hjcard .text-pink-400 { color: #f472b6; }",
".spp-hjcard .text-amber-300 { color: #fcd34d; }",
".spp-hjcard .text-amber-400 { color: #fbbf24; }",
".spp-hjcard .text-emerald-300 { color: #6ee7b7; }",
".spp-hjcard .text-emerald-400 { color: #34d399; }",
".spp-hjcard .cursor-pointer { cursor: pointer; }",
".spp-hjcard .font-mono { font-family: \"JetBrains Mono\", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace; }",
".spp-hjcard .font-medium { font-weight: 500; }",
".spp-hjcard .font-semibold { font-weight: 600; }",
".spp-hjcard .font-bold { font-weight: 700; }",
".spp-hjcard .text-xs { font-size: 0.75rem; line-height: 1rem; }",
".spp-hjcard .text-base { font-size: 1rem; line-height: 1.5rem; }",
".spp-hjcard .text-center { text-align: center; }",
".spp-hjcard.flex, .spp-hjcard .flex { display: flex; }",
".spp-hjcard .grid { display: grid; }",
".spp-hjcard .block { display: block; }",
".spp-hjcard .shrink-0 { flex-shrink: 0; }",
".spp-hjcard .flex-1 { flex: 1 1 0%; }",
".spp-hjcard.flex-col, .spp-hjcard .flex-col { flex-direction: column; }",
".spp-hjcard .flex-wrap { flex-wrap: wrap; }",
".spp-hjcard .items-center { align-items: center; }",
".spp-hjcard .items-start { align-items: flex-start; }",
".spp-hjcard .justify-center { justify-content: center; }",
".spp-hjcard.justify-between, .spp-hjcard .justify-between { justify-content: space-between; }",
".spp-hjcard .grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)); }",
".spp-hjcard .grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }",
".spp-hjcard .gap-1 { gap: 0.25rem; }",
".spp-hjcard .gap-1-5 { gap: 0.375rem; }",
".spp-hjcard .gap-2 { gap: 0.5rem; }",
".spp-hjcard .gap-2-5 { gap: 0.625rem; }",
".spp-hjcard .w-full { width: 100%; }",
".spp-hjcard .w-3-5 { width: 0.875rem; }",
".spp-hjcard .w-4 { width: 1rem; }",
".spp-hjcard .w-5 { width: 1.25rem; }",
".spp-hjcard .w-10 { width: 2.5rem; }",
".spp-hjcard .h-3-5 { height: 0.875rem; }",
".spp-hjcard .h-4 { height: 1rem; }",
".spp-hjcard .h-5 { height: 1.25rem; }",
".spp-hjcard .h-10 { height: 2.5rem; }",
".spp-hjcard .max-w-155px { max-width: 155px; }",
".spp-hjcard .mb-1 { margin-bottom: 0.25rem; }",
".spp-hjcard .mb-1-5 { margin-bottom: 0.375rem; }",
".spp-hjcard .mb-2-5 { margin-bottom: 0.625rem; }",
".spp-hjcard .mb-3 { margin-bottom: 0.75rem; }",
".spp-hjcard .px-1-5 { padding-left: 0.375rem; padding-right: 0.375rem; }",
".spp-hjcard .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }",
".spp-hjcard .px-2-5 { padding-left: 0.625rem; padding-right: 0.625rem; }",
".spp-hjcard .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }",
".spp-hjcard .py-0-2 { padding-top: 0.05rem; padding-bottom: 0.05rem; }",
".spp-hjcard .py-0-5 { padding-top: 0.125rem; padding-bottom: 0.125rem; }",
".spp-hjcard .py-2 { padding-top: 0.5rem; padding-bottom: 0.5rem; }",
".spp-hjcard .p-2 { padding: 0.5rem; }",
".spp-hjcard .p-2-5 { padding: 0.625rem; }",
".spp-hjcard.p-4, .spp-hjcard .p-4 { padding: 1rem; }",
".spp-hjcard .rounded-md { border-radius: 0.375rem; }",
".spp-hjcard .rounded-lg { border-radius: 0.5rem; }",
".spp-hjcard .rounded-xl { border-radius: 0.75rem; }",
".spp-hjcard.rounded-2xl, .spp-hjcard .rounded-2xl { border-radius: 1rem; }",
".spp-hjcard .rounded-3xl { border-radius: 1.5rem; }",
".spp-hjcard .rounded-14px { border-radius: 14px; }",
".spp-hjcard .rounded-full { border-radius: 9999px; }",
".spp-hjcard .border { border-width: 1px; }",
".spp-hjcard .border-b { border-bottom-width: 1px; }",
".spp-hjcard .border-t { border-top-width: 1px; }",
".spp-hjcard .border-l { border-left-width: 1px; }",
".spp-hjcard .border-x { border-left-width: 1px; border-right-width: 1px; }",
".spp-hjcard .border-white-5 { border-color: rgba(255, 255, 255, 0.05); }",
".spp-hjcard .border-white-10 { border-color: rgba(255, 255, 255, 0.1); }",
".spp-hjcard .border-purple-500-30 { border-color: rgba(147, 51, 234, 0.3); }",
".spp-hjcard .border-purple-500-40 { border-color: rgba(147, 51, 234, 0.4); }",
".spp-hjcard .border-cyan-500-25 { border-color: rgba(6, 182, 212, 0.25); }",
".spp-hjcard .border-cyan-500-30 { border-color: rgba(6, 182, 212, 0.3); }",
".spp-hjcard .border-emerald-500-25 { border-color: rgba(16, 185, 129, 0.25); }",
".spp-hjcard .border-emerald-500-30 { border-color: rgba(16, 185, 129, 0.3); }",
".spp-hjcard .border-emerald-500-50 { border-color: rgba(16, 185, 129, 0.5); }",
".spp-hjcard .border-pink-500-30 { border-color: rgba(236, 72, 153, 0.3); }",
".spp-hjcard .border-pink-500-40 { border-color: rgba(236, 72, 153, 0.4); }",
".spp-hjcard .border-amber-500-30 { border-color: rgba(245, 158, 11, 0.3); }",
".spp-hjcard .border-amber-500-35 { border-color: rgba(245, 158, 11, 0.35); }",
".spp-hjcard .border-amber-500-40 { border-color: rgba(245, 158, 11, 0.4); }",
".spp-hjcard .bg-purple-500-10 { background-color: rgba(147, 51, 234, 0.1); }",
".spp-hjcard .bg-purple-600-20 { background-color: rgba(147, 51, 234, 0.2); }",
".spp-hjcard .bg-cyan-500-10 { background-color: rgba(6, 182, 212, 0.1); }",
".spp-hjcard .bg-cyan-500-15 { background-color: rgba(6, 182, 212, 0.15); }",
".spp-hjcard .bg-cyan-500-30 { background-color: rgba(6, 182, 212, 0.3); }",
".spp-hjcard .bg-cyan-600-20 { background-color: rgba(6, 182, 212, 0.2); }",
".spp-hjcard .bg-cyan-950-20 { background-color: rgba(8, 47, 73, 0.2); }",
".spp-hjcard .bg-emerald-500-10 { background-color: rgba(16, 185, 129, 0.1); }",
".spp-hjcard .bg-emerald-500-15 { background-color: rgba(16, 185, 129, 0.15); }",
".spp-hjcard .bg-emerald-600-20 { background-color: rgba(16, 185, 129, 0.2); }",
".spp-hjcard .bg-pink-500-10 { background-color: rgba(236, 72, 153, 0.1); }",
".spp-hjcard .bg-pink-500-20 { background-color: rgba(236, 72, 153, 0.2); }",
".spp-hjcard .bg-pink-600-20 { background-color: rgba(236, 72, 153, 0.2); }",
".spp-hjcard .bg-amber-500-10 { background-color: rgba(245, 158, 11, 0.1); }",
".spp-hjcard .bg-amber-600-20 { background-color: rgba(245, 158, 11, 0.2); }",
".spp-hjcard.duration-300, .spp-hjcard .duration-300 { transition-duration: 300ms; }",
".spp-hjcard.transition-all, .spp-hjcard .transition-all { transition-property: all; }",
".spp-hjcard .transition-colors { transition-property: color, background-color, border-color; }",
".spp-hjcard .transition-transform { transition-property: transform; }",
".spp-hjcard .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }",
".spp-hjcard .line-clamp-1 { display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; }",
".spp-hjcard .text-9px { font-size: 9px; line-height: 12px; }",
".spp-hjcard .text-8px { font-size: 8px; line-height: 11px; }",
".spp-hjcard .text-10px { font-size: 10px; line-height: 14px; }",
".spp-hjcard .text-11px { font-size: 11px; line-height: 15px; }",
".spp-hjcard /* 伪类与状态类 */\n    .hover\\:text-white:hover { color: #ffffff; }",
".spp-hjcard .hover\\:text-cyan-300:hover { color: #67e8f9; }",
".spp-hjcard .hover\\:text-purple-300:hover { color: #d8b4fe; }",
".spp-hjcard .hover\\:text-pink-300:hover { color: #f9a8d4; }",
".spp-hjcard .hover\\:text-amber-300:hover { color: #fcd34d; }",
".spp-hjcard .hover\\:text-emerald-300:hover { color: #6ee7b7; }",
".spp-hjcard .hover\\:bg-purple-600-35:hover { background-color: rgba(147, 51, 234, 0.35); }",
".spp-hjcard .hover\\:bg-cyan-600-35:hover { background-color: rgba(6, 182, 212, 0.35); }",
".spp-hjcard .hover\\:bg-pink-600-35:hover { background-color: rgba(236, 72, 153, 0.35); }",
".spp-hjcard .hover\\:bg-amber-600-35:hover { background-color: rgba(245, 158, 11, 0.35); }",
".spp-hjcard .hover\\:bg-emerald-600-35:hover { background-color: rgba(16, 185, 129, 0.35); }",
".spp-hjcard .hover\\:border-purple-500-50:hover { border-color: rgba(147, 51, 234, 0.5); }",
".spp-hjcard .hover\\:border-cyan-400-60:hover { border-color: rgba(34, 211, 238, 0.6); }",
".spp-hjcard .hover\\:border-pink-500-50:hover { border-color: rgba(236, 72, 153, 0.5); }",
".spp-hjcard .hover\\:border-amber-500-50:hover { border-color: rgba(245, 158, 11, 0.5); }",
".spp-hjcard .hover\\:border-emerald-500-50:hover { border-color: rgba(16, 185, 129, 0.5); }",
".spp-hjcard .active\\:scale-95:active { transform: scale(0.95); }",
".spp-hjcard:hover .group-hover\\:scale-105, .spp-hjcard .group:hover .group-hover\\:scale-105 { transform: scale(1.05); }",
".spp-hjcard:hover .group-hover\\:bg-purple-500-20, .spp-hjcard .group:hover .group-hover\\:bg-purple-500-20 { background-color: rgba(147, 51, 234, 0.2); }",
".spp-hjcard:hover .group-hover\\:bg-cyan-500-20, .spp-hjcard .group:hover .group-hover\\:bg-cyan-500-20 { background-color: rgba(6, 182, 212, 0.2); }",
".spp-hjcard:hover .group-hover\\:bg-pink-500-20, .spp-hjcard .group:hover .group-hover\\:bg-pink-500-20 { background-color: rgba(236, 72, 153, 0.2); }",
".spp-hjcard:hover .group-hover\\:bg-amber-500-20, .spp-hjcard .group:hover .group-hover\\:bg-amber-500-20 { background-color: rgba(245, 158, 11, 0.2); }",
".spp-hjcard:hover .group-hover\\:bg-emerald-500-20, .spp-hjcard .group:hover .group-hover\\:bg-emerald-500-20 { background-color: rgba(16, 185, 129, 0.2); }",
".spp-hjcard:hover .group-hover\\:text-purple-300, .spp-hjcard .group:hover .group-hover\\:text-purple-300 { color: #d8b4fe; }",
".spp-hjcard:hover .group-hover\\:text-cyan-300, .spp-hjcard .group:hover .group-hover\\:text-cyan-300 { color: #67e8f9; }",
".spp-hjcard:hover .group-hover\\:text-pink-300, .spp-hjcard .group:hover .group-hover\\:text-pink-300 { color: #f9a8d4; }",
".spp-hjcard:hover .group-hover\\:text-amber-300, .spp-hjcard .group:hover .group-hover\\:text-amber-300 { color: #fcd34d; }",
".spp-hjcard:hover .group-hover\\:text-emerald-300, .spp-hjcard .group:hover .group-hover\\:text-emerald-300 { color: #6ee7b7; }",
".spp-hjcard .group\\/entry:hover .group-hover\\/entry\\:text-purple-300 { color: #d8b4fe; }",
".spp-hjcard .group\\/entry:hover .group-hover\\/entry\\:text-pink-300 { color: #f9a8d4; }",
".spp-hjcard .group\\/entry:hover .group-hover\\/entry\\:text-amber-300 { color: #fcd34d; }",
".spp-hjcard .group\\/entry:hover .group-hover\\/entry\\:text-emerald-300 { color: #6ee7b7; }",
".spp-hjcard .group\\/entry:hover .group-hover\\/entry\\:text-white { color: #ffffff; }",
".spp-hjcard .group\\/entry:hover .group-hover\\/entry\\:translate-x-1 { transform: translateX(0.25rem); }",
"@media (min-width: 640px) { .spp-hjcard.sm\\:p-5, .spp-hjcard .sm\\:p-5 { padding: 1.25rem; } }",
];
const HJ_CARD_TPL =
"<article data-category=\"__CAT__\" class=\"board-item p-4 sm:p-5 rounded-2xl flex flex-col justify-between group transition-all duration-300\"> <div> <div class=\"flex items-start justify-between gap-2-5 mb-2-5\"> <div class=\"flex items-center gap-2-5\"> <div class=\"w-10 h-10 rounded-xl bg-__ACC__-500-10 border border-__ACC__-500-30 flex items-center justify-center text-__ACC__-300 group-hover:scale-105 group-hover:bg-__ACC__-500-20 transition-all shrink-0\"> <svg class=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"> <line x1=\"6\" x2=\"10\" y1=\"12\" y2=\"12\"/><line x1=\"8\" x2=\"8\" y1=\"10\" y2=\"14\"/><line x1=\"15\" x2=\"15.01\" y1=\"13\" y2=\"13\"/><line x1=\"18\" x2=\"18.01\" y1=\"11\" y2=\"11\"/><rect width=\"20\" height=\"12\" x=\"2\" y=\"6\" rx=\"6\"/> </svg> </div> <div> <div class=\"flex items-center gap-1-5\"> <h3 class=\"font-bold text-white text-base group-hover:text-__ACC__-300 transition-colors\">__NAME__</h3> <span class=\"text-9px font-mono px-1-5 py-0-2 rounded bg-pink-500-20 text-pink-300 border border-pink-500-40 font-semibold\">__HOT__</span> </div> <p class=\"text-11px text-slate-400 truncate max-w-155px\">__SUB__</p> </div> </div> <span class=\"text-10px font-mono px-2 py-0-5 rounded-full bg-emerald-500-15 text-emerald-300 border border-emerald-500-30 shrink-0\">__STATUS__</span> </div> <p class=\"text-xs text-slate-400 mb-3 line-clamp-1\">__DESC__</p> <div class=\"grid grid-cols-3 gap-1 p-2 rounded-xl inner-slot font-mono text-center text-xs mb-3\"> <div> <span class=\"text-10px text-slate-400 block\">主题</span> <span class=\"font-bold text-white text-xs\">__TOPICS__</span> <span class=\"text-9px text-slate-400 block\">__AVG__</span> </div> <div class=\"border-x border-white-5\"> <span class=\"text-10px text-slate-400 block\">帖数</span> <span class=\"font-bold text-white text-xs\">__POSTS__</span> <span class=\"text-9px text-slate-400 block\">__SUBFORUM__</span> </div> <div> <span class=\"text-10px text-slate-400 block\">今日</span> <span class=\"font-bold text-emerald-400 text-xs\">__TODAY__</span> <span class=\"text-9px text-slate-400 block\">今日发帖</span> </div> </div> <div class=\"mb-3\"> <span class=\"text-10px font-mono text-slate-400 block mb-1\">板块入口</span> <a href=\"__HREF__\" class=\"inner-slot p-2-5 rounded-xl hover:border-__ACC__-500-50 cursor-pointer flex items-center justify-between group/entry block\"> <div class=\"flex items-center gap-2\"> <svg class=\"w-4 h-4 text-__ACC__-400\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"> <rect width=\"7\" height=\"7\" x=\"3\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"3\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"14\" y=\"14\" rx=\"1\"/><rect width=\"7\" height=\"7\" x=\"3\" y=\"14\" rx=\"1\"/> </svg> <div> <div class=\"text-xs font-semibold text-slate-200 group-hover/entry:text-__ACC__-300\">__ENTRY__</div> <div class=\"text-10px text-slate-400\">__ENTRYSUB__</div> </div> </div> <svg class=\"w-3-5 h-3-5 text-slate-400 group-hover/entry:translate-x-1 group-hover/entry:text-__ACC__-300 transition-transform\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"> <path d=\"m9 18 6-6-6-6\"/> </svg> </a> </div> <div class=\"inner-slot p-2-5 rounded-xl text-xs mb-3\"> <div class=\"flex items-center justify-between text-10px font-mono text-slate-400 mb-1\"> <span>最后发言 <span class=\"text-__ACC__-300\">__LASTHASH__</span></span> <span>__LASTTIME__</span> </div> <a href=\"__LASTHREF__\" class=\"truncate text-slate-200 hover:text-__ACC__-300 block font-medium\"> __LASTTITLE__ </a> </div> </div> <a href=\"__HREF__\" class=\"w-full py-2 px-3 rounded-xl bg-__ACC__-600-20 hover:bg-__ACC__-600-35 border border-__ACC__-500-40 text-__ACC__-300 hover:text-white text-xs font-semibold flex items-center justify-center gap-1-5 transition-all active:scale-95\"> <span>进入 __NAME__</span> <svg class=\"w-3-5 h-3-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"> <path d=\"M5 12h14\"/><path d=\"m12 5 7 7-7 7\"/> </svg> </a> </article>";
const HJ_CARD_ACC = {"acg":"purple","novel":"cyan","art":"pink","write":"amber","ai":"emerald"};
const HJ_SUB = {
'ACG交流': '动画 · 漫画 · 游戏',
'轻小说': '文库 · 译本 · 读书笔记',
'原创绘画': '手绘 · 数位板 · 同人图',
'原创小说区': '连载 · 短篇 · 设定集',
'AI交流': '模型 · 工作流 · 提示词',
};
const HJ_DESC = {
'ACG交流': '各种动画/漫画/游戏的讨论区,深度番剧研讨与主机游戏评析',
'轻小说': '轻小说书库、资源与讨论,生肉汉化与精校 EPUB 下载',
'原创绘画': '原创插画、绘师交流与技法切磋,CG同人稿件发布与交流',
'原创小说区': '原创长短篇连载与文笔切磋,高帖均深度文字交流阵地',
'AI交流': '新区试运行中,ComfyUI、LoRA炼丹、生成模型提示词与漫作交流',
};
function hjCardCss() {
if (document.getElementById("spp-hjcard-style")) return;
const st = document.createElement("style");
st.id = "spp-hjcard-style";
st.textContent = HJ_CARD_CSS.join("\n")
+ "\nhtml.spp-secbar-on .spp-hjcards, html.spp-secbar-on .spp-hjcards * { box-sizing:border-box; }"
+ "\nhtml.spp-secbar-on #t_7 .spp-cm-grid { display:block !important; width:100% !important; max-width:none !important; grid-template-columns:none !important; }"
+ "\nhtml.spp-secbar-on #t_7 > table { width:100% !important; }"
+ "\nhtml.spp-secbar-on #t_7 #cate_7 { width:100% !important; }"
+ "\nhtml.spp-secbar-on #t_7 #cate_7 > tr > td { width:100% !important; }"
+ "\nhtml.spp-secbar-on .spp-hjcards { width:100%; grid-template-columns:1fr !important; }"
+ "\nhtml.spp-secbar-on[data-spp-secbar-hj] #t_7.t .spp-cm-grid { display:none !important; }"
+ "\nhtml.spp-secbar-on .spp-hjcards { margin:0; padding:0; display:grid; grid-template-columns:repeat(4, minmax(0, 1fr)); gap:16px; align-items:start; }"
+ "\nhtml.spp-secbar-on .spp-hjcards > div { display:flex !important; flex-wrap:wrap !important; justify-content:center !important; gap:16px !important; align-items:start; }"
+ "\nhtml.spp-secbar-on .spp-hjcards > div > * { flex:0 1 calc((100% - 48px) / 4) !important; min-width:0; }"
+ "\nhtml.spp-secbar-on #t_39.t { margin-top:48px !important; }"
+ "\nhtml.spp-secbar-on .spp-hjcards .spp-hjcard { display:flex; flex-direction:column; justify-content:space-between; }"
+ "\nhtml.spp-secbar-on .spp-hjcards .spp-hjcard > div > div:first-child { flex:1 1 auto; min-width:0; }"
+ "\nhtml.spp-secbar-on .spp-hjcards .spp-hjcard { background:#090e1a !important; border:1px solid rgba(30,41,59,.9) !important; }"
+ "\nhtml.spp-secbar-on .spp-hjcards .spp-hjcard:hover { border-color:#06b6d4 !important; box-shadow:0 0 30px rgba(6,182,212,.28) !important; transform:translateY(-2px); }"
+ "\nhtml.spp-secbar-on .spp-hjcards .spp-hjcard > div > div:first-child > div { min-width:0; flex:1 1 auto; }"
+ "\nhtml.spp-secbar-on .spp-hjcards .spp-hjcard h3 { min-width:0; white-space:nowrap; }"
+ "\nhtml.spp-secbar-on .spp-hjcards .spp-hjcard p { min-width:0; }"
+ "\nhtml.spp-secbar-on .spp-hjcards .truncate { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }"
document.head.appendChild(st);
}
function hjCardData() {
const cate = document.getElementById("cate_7");
if (!cate) return null;
const NAMES = ["ACG交流", "轻小说", "原创绘画", "原创小说区", "AI交流"];
const CATS = ["acg", "novel", "art", "write", "ai"];
const all = [].slice.call(cate.querySelectorAll("tr.f_one"));
const out = [];
NAMES.forEach(function (nm, idx) {
const tr = all.filter(function (x) {
const a = x.querySelector("th h3.b > a");
const t = a ? (a.textContent || "").trim() : "";
return t === nm || t.indexOf(nm + " ") === 0;
})[0];
if (!tr) return;
const a = tr.querySelector("th h3.b > a");
const stat = tr.querySelector("td.tal.y-style.f10.e, td.y-style.f10.e");
const sm = (stat ? stat.textContent : "").match(/([\d,]+)\s*\/\s*([\d,]+)/);
const th = tr.querySelector("th");
const s3 = th ? th.querySelector("span.s3.f10") : null;
const tm = s3 ? s3.textContent.match(/\((\d+)\)/) : null;
const desc = th ? th.querySelector("span.smalltxt") : null;
const g2 = th ? th.querySelector("span.gray2") : null;
const g2t = g2 ? (g2.textContent || "").trim() : "";
const hm = g2t.match(/([0-9a-f]{6,})\s*\[([^\]]+)\]/);
const lastA = tr.querySelector("td.y-style a, th a.board-title, a[href*=\"tid-\"]");
out.push({
name: nm, cat: CATS[idx] || "acg",
href: a ? a.getAttribute("href") : "",
topics: sm ? parseInt(sm[1].replace(/,/g, ""), 10) : null,
posts: sm ? parseInt(sm[2].replace(/,/g, ""), 10) : null,
today: tm ? parseInt(tm[1], 10) : null,
desc: desc ? (desc.textContent || "").trim() : "",
avg: (sm && parseInt(sm[1].replace(/,/g, ""), 10) > 0)
? (parseInt(sm[2].replace(/,/g, ""), 10) / parseInt(sm[1].replace(/,/g, ""), 10)).toFixed(1) : "",
subforum: (function () {
const mm = (tr.textContent || "").match(/子版\s*([0-9]+)\s*个/);
return mm ? "子版 " + mm[1] + " 个" : "无子版";
})(),
lastHash: hm ? hm[1] : "", lastTime: hm ? hm[2] : "",
lastTitle: lastA ? (lastA.textContent || "").trim() : "",
lastHref: lastA ? lastA.getAttribute("href") : ""
});
});
return out.length ? out : null;
}
function hjComma2(n) { return n === null || n === undefined ? "" : String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ","); }
function buildHjPanel(list) {
if (!list || !list.length) return null;
const withLast = list.filter(function (d) { return (d.lastTitle || "").trim(); })
.sort(function (a, b) { return String(b.lastTime).localeCompare(String(a.lastTime)); }).slice(0, 3);
if (!withLast.length) return null;
const p = document.createElement("div");
p.id = "side-balance-panel";
p.className = "spp-hjpanel";
p.style.cssText = "grid-column: span 3 / span 3; background:#090e1a; border:1px solid rgba(30,41,59,.9); border-radius:16px; padding:20px; display:flex; flex-direction:column; justify-content:space-between; min-width:0;";
const head = document.createElement("div");
head.style.cssText = "display:flex; align-items:center; gap:10px; margin-bottom:16px;";
const ic = document.createElement("div");
ic.style.cssText = "width:36px; height:36px; flex:none; border-radius:12px; background:rgba(6,182,212,.10); border:1px solid rgba(6,182,212,.30); display:flex; align-items:center; justify-content:center; color:#67e8f9;";
ic.innerHTML = "<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"2\"/><path d=\"M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14\"/></svg>";
const tt = document.createElement("div");
tt.innerHTML = "<div style=\"display:flex;align-items:center;gap:8px\"><h3 style=\"margin:0;font-weight:700;color:#fff;font-size:16px;\">漫区枢纽风向标 · 今日速报</h3>"
+ "<span style=\"font-size:9px;font-family:Consolas,Menlo,monospace;padding:2px 6px;border-radius:4px;background:rgba(59,130,246,.2);color:#93c5fd;border:1px solid rgba(59,130,246,.4);\">TRENDING HUB</span></div>"
+ "<div style=\"font-size:11px;color:#94a3b8;margin-top:2px;\">五个板块最近的动态 —— 全部现读,不是编辑稿</div>";
head.appendChild(ic); head.appendChild(tt);
p.appendChild(head);
const grid = document.createElement("div");
grid.style.cssText = "display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); gap:12px;";
withLast.forEach(function (d) {
const c = document.createElement("a");
c.href = d.lastHref || d.href;
c.style.cssText = "display:block; padding:12px; border-radius:12px; background:rgba(7,9,16,.6); border:1px solid rgba(30,41,59,.9); text-decoration:none; min-width:0;";
c.innerHTML = "<div style=\"display:flex;justify-content:space-between;gap:8px;font-size:10px;font-family:Consolas,Menlo,monospace;color:#94a3b8;margin-bottom:6px;\">"
+ "<span>" + esc(d.name) + "</span><span>" + esc(d.lastTime || "") + "</span></div>"
+ "<div style=\"color:#e2e8f0;font-weight:600;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\">" + esc(d.lastTitle) + "</div>";
grid.appendChild(c);
});
p.appendChild(grid);
const foot = document.createElement("div");
foot.style.cssText = "display:flex;align-items:center;gap:6px;font-size:10px;color:#64748b;margin-top:16px;";
foot.textContent = "严格遵循漫区排版规范 · 本看板随分区折叠一起收起";
p.appendChild(foot);
return p;
}
function buildHjCards() {
if (!document.documentElement.classList.contains("spp-secbar-on")) return 0;
if (secBarHjStyle() !== "pulse") return 0;
const host = document.getElementById("t_7");
if (!host) return 0;
if (host.querySelector(":scope > .spp-hjcards")) return 0;   
const oldGrid = host.querySelector(".spp-cm-grid");
if (oldGrid) { oldGrid.innerHTML = ""; oldGrid.setAttribute("data-spp-oldhidden", "1"); }
const list = hjCardData();
if (!list || !list.length) return 0;
hjCardCss();
let best = -1, bestIdx = -1;
list.forEach(function (d, i) { if (d.today !== null && d.today > best) { best = d.today; bestIdx = i; } });
if (bestIdx >= 0) list[bestIdx].hot = true;
const rows = document.createElement("div");
rows.className = "spp-hjcards";
rows.style.cssText = "display:grid; gap:16px; width:100%; align-items:start;";
function rowOf(n) {
const d = document.createElement("div");
d.style.cssText = "display:grid; grid-template-columns:repeat(" + n + ", minmax(0, 1fr)); gap:16px; align-items:start;";
rows.appendChild(d);
return d;
}
const r1 = rowOf(4);
const r2 = rowOf(4);
const made = [];
list.forEach(function (d) {
const acc = HJ_CARD_ACC[d.cat] || "purple";
let h = HJ_CARD_TPL;
h = h.split("__ACC__").join(acc).split("__CAT__").join(d.cat);
h = h.split("__NAME__").join(esc(d.name)).split("__HREF__").join(esc(d.href))
.split("__LASTHREF__").join(esc(d.lastHref || d.href));
h = h.replace("__TOPICS__", hjComma2(d.topics)).replace("__POSTS__", hjComma2(d.posts));
h = h.replace("__TODAY__", d.today === null ? "" : "+" + d.today);
h = h.replace("__DESC__", esc(HJ_DESC[d.name] || d.desc || ""));
h = h.split("__SUB__").join(esc(HJ_SUB[d.name] || ""));
h = h.split("__AVG__").join(d.avg ? "帖均 " + d.avg : "");
h = h.split("__SUBFORUM__").join(d.subforum || "无子版");
h = h.split("__STATUS__").join(d.today > 0 ? "近期活跃" : "已沉淀");
h = h.split("__ENTRY__").join("进入板块");
h = h.split("__ENTRYSUB__").join("浏览全部主题");
if (d.hot) h = h.split("__HOT__").join("HOT");
h = h.replace("__LASTHASH__", esc(d.lastHash || "")).replace("__LASTTIME__", esc(d.lastTime || ""));
h = h.replace("__LASTTITLE__", esc(d.lastTitle || ""));
const w = document.createElement("div");
w.innerHTML = h;
if (!d.hot) {
const b = [].slice.call(w.querySelectorAll("span")).filter(function (s) {
return (s.textContent || "").trim() === "__HOT__";
})[0];
if (b) b.remove();
}
[].slice.call(w.querySelectorAll("p")).forEach(function (el) {
if (!el.children.length && !(el.textContent || "").trim()) el.remove();
});
const art = w.firstElementChild;
if (!art) return;
art.classList.add("spp-hjcard");
made.push({ art: art, d: d });
});
made.forEach(function (m, i) { (i < 4 ? r1 : r2).appendChild(m.art); });
host.appendChild(rows);
return made.length;
}
onDomReady(function () { buildHjCards(); setTimeout(buildHjCards, 900); });
const HJ_BAR_CSS = [
'.spp-hjwrap .inner-slot { background: rgba(7, 9, 16, 0.6); }',
'.spp-hjwrap .badge-glow:hover { filter: brightness(1.15); }',
'.spp-hjwrap .text-slate-300 { color: #cbd5e1; }',
'.spp-hjwrap .text-slate-400 { color: #94a3b8; }',
'.spp-hjwrap .text-white { color: #ffffff; }',
'.spp-hjwrap .text-cyan-300 { color: #67e8f9; }',
'.spp-hjwrap .text-cyan-400 { color: #22d3ee; }',
'.spp-hjwrap .text-purple-400 { color: #c084fc; }',
'.spp-hjwrap .text-amber-300 { color: #fcd34d; }',
'.spp-hjwrap .text-amber-400 { color: #fbbf24; }',
'.spp-hjwrap .text-emerald-300 { color: #6ee7b7; }',
'.spp-hjwrap .text-emerald-400 { color: #34d399; }',
'.spp-hjwrap .fill-amber-400 { fill: #fbbf24; }',
'.spp-hjwrap .relative { position: relative; }',
'.spp-hjwrap .absolute { position: absolute; }',
'.spp-hjwrap .overflow-hidden { overflow: hidden; }',
'.spp-hjwrap .font-mono { font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; }',
'.spp-hjwrap .font-medium { font-weight: 500; }',
'.spp-hjwrap .font-bold { font-weight: 700; }',
'.spp-hjwrap .font-black { font-weight: 900; }',
'.spp-hjwrap .text-xs { font-size: 0.75rem; line-height: 1rem; }',
'.spp-hjwrap .text-base { font-size: 1rem; line-height: 1.5rem; }',
'.spp-hjwrap .tracking-wide { letter-spacing: 0.025em; }',
'.spp-hjwrap .tracking-wider { letter-spacing: 0.05em; }',
'.spp-hjwrap .flex { display: flex; }',
'.spp-hjwrap .inline-flex { display: inline-flex; }',
'.spp-hjwrap .hidden { display: none; }',
'.spp-hjwrap .shrink-0 { flex-shrink: 0; }',
'.spp-hjwrap .flex-wrap { flex-wrap: wrap; }',
'.spp-hjwrap .items-center { align-items: center; }',
'.spp-hjwrap .justify-center { justify-content: center; }',
'.spp-hjwrap .justify-between { justify-content: space-between; }',
'.spp-hjwrap .gap-1 { gap: 0.25rem; }',
'.spp-hjwrap .gap-1-5 { gap: 0.375rem; }',
'.spp-hjwrap .gap-2 { gap: 0.5rem; }',
'.spp-hjwrap .gap-2-5 { gap: 0.625rem; }',
'.spp-hjwrap .gap-3 { gap: 0.75rem; }',
'.spp-hjwrap .gap-4 { gap: 1rem; }',
'.spp-hjwrap .w-full { width: 100%; }',
'.spp-hjwrap .w-2 { width: 0.5rem; }',
'.spp-hjwrap .w-3 { width: 0.75rem; }',
'.spp-hjwrap .w-3-5 { width: 0.875rem; }',
'.spp-hjwrap .w-4 { width: 1rem; }',
'.spp-hjwrap .w-5 { width: 1.25rem; }',
'.spp-hjwrap .w-10 { width: 2.5rem; }',
'.spp-hjwrap .h-full { height: 100%; }',
'.spp-hjwrap .h-2 { height: 0.5rem; }',
'.spp-hjwrap .h-3 { height: 0.75rem; }',
'.spp-hjwrap .h-3-5 { height: 0.875rem; }',
'.spp-hjwrap .h-4 { height: 1rem; }',
'.spp-hjwrap .h-5 { height: 1.25rem; }',
'.spp-hjwrap .h-10 { height: 2.5rem; }',
'.spp-hjwrap .ml-auto { margin-left: auto; }',
'.spp-hjwrap .ml-2 { margin-left: 0.5rem; }',
'.spp-hjwrap .pl-3 { padding-left: 0.75rem; }',
'.spp-hjwrap .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; }',
'.spp-hjwrap .px-2-5 { padding-left: 0.625rem; padding-right: 0.625rem; }',
'.spp-hjwrap .px-3 { padding-left: 0.75rem; padding-right: 0.75rem; }',
'.spp-hjwrap .py-0-5 { padding-top: 0.125rem; padding-bottom: 0.125rem; }',
'.spp-hjwrap .py-1-5 { padding-top: 0.375rem; padding-bottom: 0.375rem; }',
'.spp-hjwrap .p-1 { padding: 0.25rem; }',
'.spp-hjwrap .p-1-5px { padding: 1.5px; }',
'.spp-hjwrap .p-2 { padding: 0.5rem; }',
'.spp-hjwrap .p-3-5 { padding: 0.875rem; }',
'.spp-hjwrap .rounded-md { border-radius: 0.375rem; }',
'.spp-hjwrap .rounded-xl { border-radius: 0.75rem; }',
'.spp-hjwrap .rounded-2xl { border-radius: 1rem; }',
'.spp-hjwrap .rounded-3xl { border-radius: 1.5rem; }',
'.spp-hjwrap .rounded-14px { border-radius: 14px; }',
'.spp-hjwrap .rounded-full { border-radius: 9999px; }',
'.spp-hjwrap .border { border-width: 1px; }',
'.spp-hjwrap .border-l { border-left-width: 1px; }',
'.spp-hjwrap .border-white-10 { border-color: rgba(255, 255, 255, 0.1); }',
'.spp-hjwrap .border-emerald-500-25 { border-color: rgba(16, 185, 129, 0.25); }',
'.spp-hjwrap .border-emerald-500-30 { border-color: rgba(16, 185, 129, 0.3); }',
'.spp-hjwrap .border-amber-500-35 { border-color: rgba(245, 158, 11, 0.35); }',
'.spp-hjwrap .bg-black-40 { background-color: rgba(0, 0, 0, 0.4); }',
'.spp-hjwrap .bg-black-50 { background-color: rgba(0, 0, 0, 0.5); }',
'.spp-hjwrap .bg-hex-0b0e1b { background-color: #0b0e1b; }',
'.spp-hjwrap .bg-emerald-400 { background-color: #34d399; }',
'.spp-hjwrap .bg-emerald-500 { background-color: #10b981; }',
'.spp-hjwrap .bg-emerald-500-10 { background-color: rgba(16, 185, 129, 0.1); }',
'.spp-hjwrap .bg-amber-500-10 { background-color: rgba(245, 158, 11, 0.1); }',
'.spp-hjwrap .bg-grad-logo-section { background-image: linear-gradient(to top right, #06b6d4, #6366f1, #9333ea); }',
'.spp-hjwrap .bg-grad-pill-active { background-image: linear-gradient(to right, rgba(8, 145, 178, 0.8), rgba(37, 99, 235, 0.8)); }',
'.spp-hjwrap .shadow-md { box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); }',
'.spp-hjwrap .shadow-cyan-logo { box-shadow: 0 4px 6px -1px rgba(6, 182, 212, 0.2); }',
'.spp-hjwrap .duration-300 { transition-duration: 300ms; }',
'.spp-hjwrap .transition-all { transition-property: all; }',
'.spp-hjwrap .opacity-75 { opacity: 0.75; }',
'.spp-hjwrap .opacity-80 { opacity: 0.8; }',
'.spp-hjwrap .animate-ref-ping { animation: ref_ping 1s cubic-bezier(0, 0, 0.2, 1) infinite; }',
'.spp-hjwrap .text-10px { font-size: 10px; line-height: 14px; }',
'.spp-hjwrap .text-11px { font-size: 11px; line-height: 15px; }',
'html.spp-secbar-on .spp-hjcards.spp-hj-folded { display: none !important; }',
];
const HJ_BAR_HTML =
'<div class="spp-hjwrap"><section class="glass-section w-full p-3-5 sm:p-4 rounded-3xl relative overflow-hidden transition-all duration-300"> <div class="flex flex-wrap items-center justify-between gap-4"> <div class="flex items-center flex-wrap gap-2-5 sm:gap-3"> <div class="flex items-center gap-2"> <h2 class="text-base sm:text-lg font-black text-white tracking-wide">__TITLE__</h2> <div class="badge-glow flex items-center gap-1 px-2-5 py-0-5 rounded-full bg-emerald-500-10 text-emerald-300 border border-emerald-500-30 text-11px font-mono font-medium"> <svg class="w-3 h-3 text-emerald-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polyline points="20 6 9 17 4 12"/> </svg> <span>__FORUMCNT__</span> </div> <div class="badge-glow hidden md:flex items-center gap-1 px-2-5 py-0-5 rounded-full bg-amber-500-10 text-amber-300 border border-amber-500-35 text-11px font-medium font-mono"> <svg class="w-3 h-3 text-amber-400 fill-amber-400" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/> </svg> <span>__BADGE__</span> </div> </div> <div class="hidden xl:flex items-center gap-3 text-xs font-mono text-slate-400 ml-2 pl-3 border-l border-white-10"> <div class="flex items-center gap-1-5"> <svg class="w-3-5 h-3-5 text-purple-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5"/> <circle cx="13" cy="12" r="2"/> <path d="M18 19c-2.8 0-5-2.2-5-5v8"/> <circle cx="20" cy="19" r="2"/> </svg> <span class="text-slate-300 font-bold">__THREADS__</span> <span class="text-11px">主题</span> </div> <div class="flex items-center gap-1-5"> <svg class="w-3-5 h-3-5 text-cyan-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/> <path d="M13 8H7"/> <path d="M17 12H7"/> </svg> <span class="text-slate-300 font-bold">__POSTS__</span> <span class="text-11px">帖数</span> </div> <div class="flex items-center gap-1 px-2 py-0-5 rounded-md bg-emerald-500-10 text-emerald-300 text-11px font-bold"> <span>今日 __TODAY__</span> </div> </div> </div> <div class="flex items-center flex-wrap gap-2-5 ml-auto"> <div class="hidden sm:flex items-center gap-1-5 px-3 py-1-5 rounded-xl bg-black-40 border border-emerald-500-25 text-emerald-300 font-mono text-xs"> <span class="relative flex h-2 w-2"> <span class="animate-ref-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75"></span> <span class="relative inline-flex rounded-full h-2 w-2 bg-emerald-500"></span> </span> <span class="font-bold tracking-wider text-11px">ONLINE</span> </div> <button onclick="toggleSectionCollapse()" id="btn-section-toggle" title="折叠/展开本分区" class="p-2 sm:px-2-5 rounded-xl inner-slot hover:border-cyan-500-40 text-slate-300 hover:text-white flex items-center gap-1 text-xs transition-all"> <svg id="icon-section-toggle" class="w-4 h-4 text-slate-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="m18 15-6-6-6 6"/> </svg> </button> </div> </div> </section></div>';
function hjBarAgg() {
const cate = document.getElementById("cate_7");
if (!cate) return null;
const HJ_KEEP_NAMES = ['ACG交流', '轻小说', '原创绘画', '原创小说区', 'AI交流'];
const all = [].slice.call(cate.querySelectorAll('tr.f_one[id^="fid_"]'));
const rows = all.filter(function (tr) {
const a = tr.querySelector("th h3.b > a");
const nm = a ? (a.textContent || "").trim() : "";
if (!nm) return false;
return HJ_KEEP_NAMES.some(function (k) { return nm === k || nm.indexOf(k + " ") === 0; });
});
if (!rows.length) return null;
let topics = 0, posts = 0, today = 0, hasToday = false, title = "";
rows.forEach(function (tr) {
const stat = tr.querySelector("td.tal.y-style.f10.e, td.y-style.f10.e");
const m = (stat ? stat.textContent : "").match(/([\d,]+)\s*\/\s*([\d,]+)/);
if (m) {
topics += parseInt(m[1].replace(/,/g, ""), 10) || 0;
posts += parseInt(m[2].replace(/,/g, ""), 10) || 0;
}
const th = tr.querySelector("th");
const s3 = th ? th.querySelector("span.s3.f10") : null;
const tm = s3 ? s3.textContent.match(/\((\d+)\)/) : null;
if (tm) { hasToday = true; today += parseInt(tm[1], 10) || 0; }
});
const h2a = document.querySelector("#t_7 > table > tbody > tr > th.h h2 a.cfont, #t_7 h2 a.cfont");
if (h2a) title = (h2a.textContent || "").trim();
return { n: rows.length, topics: topics, posts: posts,
today: hasToday ? today : null, title: title };
}
function hjComma(n) { return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ","); }
function injectHjBarCss() {
if (document.getElementById("spp-hjbar-style")) return;
const st = document.createElement("style");
st.id = "spp-hjbar-style";
st.textContent = HJ_BAR_CSS.join("\n")
+ "\nhtml.spp-secbar-on #t_7 > table > tbody > tr > th.h > h2,"
+ "\nhtml.spp-secbar-on #t_7 > table > tbody > tr > th.h > span.a2.fn,"
+ "\nhtml.spp-secbar-on #t_7 > table > tbody > tr > th.h > a.closeicon.fr { display:none !important; }"
+ "\nhtml.spp-secbar-on[data-spp-secbar-hj] #t_7.t > table > tbody > tr > th.h"
+ " { padding:0 !important; background:none !important; border:0 !important; height:auto !important; min-height:0 !important; line-height:normal !important; }"
+ "\nhtml.spp-secbar-on[data-spp-secbar-hj][data-spp-secbar-hj] #t_7.t > table > tbody > tr > th.h > *:not(.spp-hjwrap)"
+ " { display:none !important; }"
+ "\nhtml.spp-secbar-on[data-spp-secbar-hj][data-spp-secbar-hj] #t_7.t > table > tbody > tr > th.h a.closeicon.fr"
+ " { display:none !important; }"
+ "\nhtml.spp-secbar-on .spp-hjwrap { width:100%; }";
st.textContent += "\nhtml.spp-secbar-on .spp-hjwrap, html.spp-secbar-on .spp-hjwrap *, html.spp-secbar-on .spp-hjwrap *::before, html.spp-secbar-on .spp-hjwrap *::after { box-sizing:border-box; }";
st.textContent += "\nhtml.spp-secbar-on .spp-hjwrap [class*=\"xl:flex\"],"
+ "html.spp-secbar-on .spp-hjwrap [class*=\"md:flex\"],"
+ "html.spp-secbar-on .spp-hjwrap [class*=\"sm:flex\"] { display:flex !important; }";
document.head.appendChild(st);
}
function buildSecBarHj() {
if (!document.documentElement.classList.contains("spp-secbar-on")) return 0;
if (secBarHjStyle() !== "pulse") return 0;   
const t7 = document.getElementById("t_7");
if (!t7) return 0;
const th = t7.querySelector(":scope > table > tbody > tr > th.h");
if (!th) return 0;
if (th.querySelector(".spp-hjwrap")) return 0;      
const F = hjBarAgg();
if (!F) return 0;
injectHjBarCss();
const html = HJ_BAR_HTML
.replace("__TITLE__", esc(F.title || "综合交流"))
.replace("__FORUMCNT__", esc(F.n + " 个独立专区"))
.replace("__BADGE__", "ACG·文创·AI 综合核心区")
.replace("__THREADS__", hjComma(F.topics))
.replace("__POSTS__", hjComma(F.posts))
.replace("__TODAY__", F.today === null ? "" : "+" + F.today);
const holder = document.createElement("div");
holder.innerHTML = html;
const bar = holder.firstElementChild;
if (!bar) return 0;
if (F.today === null) {
const spans = [].slice.call(bar.querySelectorAll("span"));
const hit = spans.filter(function (s) { return /^今日\s*$/.test((s.textContent || "").trim()) || /^今日\s*\+?$/.test((s.textContent || "").trim()); })[0];
const cell = hit ? hit.parentElement : null;
if (cell && cell.querySelector("span") === hit && cell.children.length === 1) cell.remove();
else if (hit) hit.remove();
}
if (!th.dataset.sppHjFoldWired) {
th.dataset.sppHjFoldWired = "1";
th.addEventListener("click", function (ev) {
const b = ev.target && ev.target.closest ? ev.target.closest("#btn-section-toggle") : null;
if (!b) return;
ev.preventDefault();
const site = th.querySelector("a.closeicon");
foldNow(); return;
if (typeof window.IndexDeploy === "function") {
window.IndexDeploy((t7.id || "").replace(/[^0-9]/g, "" ) || "7", 0);
syncFold();
}
}, true);
}
th.appendChild(bar);
const row7 = t7.querySelector("#cate_7");
if (row7 && !th.dataset.sppHjFoldSync) {
th.dataset.sppHjFoldSync = "1";
var foldNow = function () {
const g0 = t7.querySelector(".spp-hjcards");
const isFolded = !!(row7 && row7.style.display === "none");
if (row7) row7.style.display = isFolded ? "" : "none";
if (g0) { g0.style.display = isFolded ? "grid" : "none"; g0.classList.toggle("spp-hj-folded", !isFolded); }
};
var syncFold = function () {
const g = t7.querySelector(".spp-hjcards");
if (g) g.style.display = getComputedStyle(row7).display === "none" ? "none" : "grid";
if (g && getComputedStyle(row7).display === "none") g.classList.add("spp-hj-folded");
else if (g) { g.classList.remove("spp-hj-folded"); }
};
syncFold();
new MutationObserver(syncFold).observe(row7, { attributes: true, attributeFilter: ["style", "class"] });
}
return 1;
}
onDomReady(function () { injectHjBarCss(); buildSecBarHj(); setTimeout(buildSecBarHj, 900); });
const SECBAR_STYLE_ID = 'spp-secbar-style';
const CSS_SECBAR = [
'#t_7.t {',
'      --bg-void: #07090e;',
'      --bg-page: #0b0e17;',
'      --bg-surface: #101422;',
'      --bg-card: rgba(18, 23, 37, 0.82);',
'      --bg-card-hover: rgba(24, 31, 50, 0.95);',
'      --bg-stat-box: rgba(8, 11, 18, 0.75);',
'      --bg-subforum: rgba(14, 20, 32, 0.85);',
'',
'      --border-subtle: rgba(255, 255, 255, 0.07);',
'      --border-normal: rgba(255, 255, 255, 0.12);',
'      --border-accent: rgba(124, 58, 237, 0.45);',
'      --border-highlight: rgba(56, 189, 248, 0.5);',
'',
'      --text-main: #f1f5f9;',
'      --text-muted: #94a3b8;',
'      --text-dim: #64748b;',
'      --text-gold: #fbbf24;',
'      --text-emerald: #34d399;',
'      --text-cyan: #38bdf8;',
'      --text-purple: #c084fc;',
'',
'      --accent-purple: #8b5cf6;',
'      --accent-cyan: #06b6d4;',
'      --accent-emerald: #10b981;',
'      --accent-pink: #ec4899;',
'      --accent-amber: #f59e0b;',
'',
'      --radius-sm: 6px;',
'      --radius-md: 10px;',
'      --radius-lg: 14px;',
'      --radius-pill: 9999px;',
'',
'      --transition-smooth: all 0.24s cubic-bezier(0.4, 0, 0.2, 1);',
'      --font-fallback: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;',
'      --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;',
'    }',
'',
'#t_7.t {',
'      box-sizing: border-box;',
'      margin: 0;',
'      padding: 0;',
'    }',
'',
'#t_7.t {',
'      background-color: var(--bg-void);',
'      color: var(--text-main);',
'      font-family: var(--font-fallback);',
'      font-size: 13px;',
'      line-height: 1.5;',
'      padding: 16px;',
'      background-image:',
'        radial-gradient(circle at 10% 10%, rgba(139, 92, 246, 0.08) 0%, transparent 45%),',
'        radial-gradient(circle at 90% 20%, rgba(6, 182, 212, 0.07) 0%, transparent 40%),',
'        radial-gradient(circle at 50% 90%, rgba(236, 72, 153, 0.05) 0%, transparent 50%),',
'        linear-gradient(rgba(255, 255, 255, 0.015) 1px, transparent 1px),',
'        linear-gradient(90deg, rgba(255, 255, 255, 0.015) 1px, transparent 1px);',
'      background-size: 100% 100%, 100% 100%, 100% 100%, 40px 40px, 40px 40px;',
'      -webkit-font-smoothing: antialiased;',
'    }',
'',
'#t_7.t .forum-container {',
'      max-width: 1380px;',
'      margin: 0 auto;',
'      display: flex;',
'      flex-direction: column;',
'      gap: 14px;',
'    }',
'',
'#t_7.t .dev-toolbar {',
'      background: rgba(14, 18, 28, 0.9);',
'      border: 1px solid var(--border-normal);',
'      border-radius: var(--radius-md);',
'      padding: 8px 14px;',
'      display: flex;',
'      align-items: center;',
'      justify-content: space-between;',
'      flex-wrap: wrap;',
'      gap: 10px;',
'      font-size: 12px;',
'    }',
'',
'#t_7.t .dev-toolbar .label {',
'      display: flex;',
'      align-items: center;',
'      gap: 6px;',
'      color: var(--text-muted);',
'    }',
'',
'#t_7.t .dev-toolbar .label strong {',
'      color: var(--text-main);',
'    }',
'',
'#t_7.t .dev-toolbar-actions {',
'      display: flex;',
'      align-items: center;',
'      gap: 8px;',
'    }',
'',
'#t_7.t .btn-toggle-mode {',
'      background: rgba(255, 255, 255, 0.06);',
'      border: 1px solid var(--border-normal);',
'      color: var(--text-main);',
'      padding: 4px 12px;',
'      border-radius: var(--radius-sm);',
'      cursor: pointer;',
'      font-size: 11px;',
'      font-family: var(--font-mono);',
'      transition: var(--transition-smooth);',
'    }',
'',
'#t_7.t .btn-toggle-mode:hover {',
'      background: rgba(255, 255, 255, 0.12);',
'      border-color: var(--text-muted);',
'    }',
'',
'#t_7.t .btn-toggle-mode.active {',
'      background: rgba(139, 92, 246, 0.25);',
'      border-color: var(--accent-purple);',
'      color: #e9d5ff;',
'      font-weight: 600;',
'    }',
'',
'#t_7.t .section-header-bar {',
'      background: linear-gradient(180deg, rgba(23, 28, 44, 0.9) 0%, rgba(14, 17, 28, 0.95) 100%);',
'      border: 1px solid var(--border-normal);',
'      border-radius: var(--radius-lg);',
'      padding: 8px 14px;',
'      display: flex;',
'      align-items: center;',
'      justify-content: space-between;',
'      flex-wrap: wrap;',
'      gap: 12px;',
'      backdrop-filter: blur(16px);',
'      -webkit-backdrop-filter: blur(16px);',
'      box-shadow: 0 4px 20px rgba(0, 0, 0, 0.35);',
'      position: relative;',
'    }',
'',
'#t_7.t .section-header-bar::before {',
'      content: \'\';',
'      position: absolute;',
'      left: 14px;',
'      top: 50%;',
'      transform: translateY(-50%);',
'      width: 3px;',
'      height: 18px;',
'      border-radius: var(--radius-pill);',
'      background: linear-gradient(180deg, #38bdf8, #a855f7, #ec4899);',
'    }',
'',
'#t_7.t .header-left-meta {',
'      display: flex;',
'      align-items: center;',
'      flex-wrap: wrap;',
'      gap: 10px;',
'      padding-left: 8px;',
'    }',
'',
'#t_7.t .section-title-group {',
'      display: flex;',
'      align-items: center;',
'      gap: 8px;',
'    }',
'',
'#t_7.t .section-icon-svg {',
'      width: 17px;',
'      height: 17px;',
'      color: #38bdf8;',
'      display: block;',
'    }',
'',
'#t_7.t .section-title {',
'      font-size: 15px;',
'      font-weight: 700;',
'      color: #ffffff;',
'      letter-spacing: 0.3px;',
'    }',
'',
'#t_7.t .pill-badge {',
'      display: inline-flex;',
'      align-items: center;',
'      gap: 4px;',
'      padding: 2px 9px;',
'      border-radius: var(--radius-pill);',
'      font-size: 11px;',
'      font-weight: 600;',
'      line-height: 1.4;',
'      white-space: nowrap;',
'    }',
'',
'#t_7.t .pill-verified {',
'      background: rgba(16, 185, 129, 0.12);',
'      border: 1px solid rgba(52, 211, 153, 0.35);',
'      color: #34d399;',
'    }',
'',
'#t_7.t .pill-gold {',
'      background: rgba(245, 158, 11, 0.1);',
'      border: 1px solid rgba(251, 191, 36, 0.4);',
'      color: #fcd34d;',
'    }',
'',
'#t_7.t .stats-summary-group {',
'      display: flex;',
'      align-items: center;',
'      gap: 12px;',
'      color: var(--text-dim);',
'      font-size: 12px;',
'      font-family: var(--font-mono);',
'      margin-left: 4px;',
'    }',
'',
'#t_7.t .stats-summary-group span strong {',
'      color: var(--text-main);',
'      font-weight: 600;',
'    }',
'',
'#t_7.t .header-right-meta {',
'      display: flex;',
'      align-items: center;',
'      flex-wrap: wrap;',
'      gap: 8px;',
'    }',
'',
'#t_7.t .filter-pills-wrap {',
'      display: inline-flex;',
'      background: rgba(6, 9, 15, 0.85);',
'      border: 1px solid var(--border-subtle);',
'      border-radius: var(--radius-pill);',
'      padding: 2px;',
'      gap: 2px;',
'    }',
'',
'#t_7.t .filter-pill {',
'      background: transparent;',
'      border: none;',
'      color: var(--text-muted);',
'      font-size: 11px;',
'      padding: 3px 10px;',
'      border-radius: var(--radius-pill);',
'      cursor: pointer;',
'      transition: var(--transition-smooth);',
'      font-family: inherit;',
'    }',
'',
'#t_7.t .filter-pill:hover {',
'      color: #ffffff;',
'    }',
'',
'#t_7.t .filter-pill.active {',
'      background: rgba(56, 189, 248, 0.18);',
'      border: 1px solid rgba(56, 189, 248, 0.45);',
'      color: #7dd3fc;',
'      font-weight: 600;',
'    }',
'',
'#t_7.t .pill-online {',
'      background: rgba(16, 185, 129, 0.1);',
'      border: 1px solid rgba(52, 211, 153, 0.3);',
'      color: #6ee7b7;',
'      font-family: var(--font-mono);',
'      font-size: 11px;',
'      padding: 3px 8px;',
'      border-radius: var(--radius-pill);',
'      display: inline-flex;',
'      align-items: center;',
'      gap: 5px;',
'    }',
'',
'#t_7.t .pulse-dot {',
'      width: 6px;',
'      height: 6px;',
'      background-color: #34d399;',
'      border-radius: 50%;',
'      box-shadow: 0 0 6px #34d399;',
'      display: inline-block;',
'      animation: pulseGlow 2s infinite;',
'    }',
'',
'',
'    @keyframes pulseGlow {',
'      0%, 100% { opacity: 1; transform: scale(1); }',
'      50% { opacity: 0.4; transform: scale(0.85); }',
'    }',
'#t_7.t .btn-collapse {',
'      background: rgba(255, 255, 255, 0.05);',
'      border: 1px solid var(--border-subtle);',
'      border-radius: var(--radius-sm);',
'      width: 26px;',
'      height: 26px;',
'      display: inline-flex;',
'      align-items: center;',
'      justify-content: center;',
'      cursor: pointer;',
'      color: var(--text-muted);',
'      transition: var(--transition-smooth);',
'    }',
'',
'#t_7.t .btn-collapse:hover {',
'      background: rgba(255, 255, 255, 0.12);',
'      color: #ffffff;',
'    }',
'',
'#t_7.t .btn-collapse svg {',
'      transition: transform 0.25s ease;',
'    }',
'',
'#t_7.t .btn-collapse.collapsed svg {',
'      transform: rotate(180deg);',
'    }',
'',
'#t_7.t .boards-grid {',
'      display: grid;',
'      grid-template-columns: repeat(4, minmax(0, 1fr));',
'      gap: 12px;',
'      transition: opacity 0.2s ease;',
'    }',
'',
'#t_7.t .boards-grid.is-collapsed {',
'      display: none;',
'    }',
'',
'#t_7.t .board-card {',
'      background: var(--bg-card);',
'      border: 1px solid var(--border-subtle);',
'      border-radius: var(--radius-md);',
'      padding: 12px;',
'      display: flex;',
'      flex-direction: column;',
'      justify-content: space-between;',
'      backdrop-filter: blur(10px);',
'      -webkit-backdrop-filter: blur(10px);',
'      transition: var(--transition-smooth);',
'      position: relative;',
'      overflow: hidden;',
'    }',
'',
'#t_7.t .board-card:hover {',
'      background: var(--bg-card-hover);',
'      border-color: var(--border-normal);',
'      transform: translateY(-2px);',
'      box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);',
'    }',
'',
'#t_7.t .board-card.filtered-out {',
'      display: none;',
'    }',
'',
'#t_7.t .card-head {',
'      display: flex;',
'      align-items: flex-start;',
'      justify-content: space-between;',
'      gap: 8px;',
'      margin-bottom: 6px;',
'    }',
'',
'#t_7.t .card-head-left {',
'      display: flex;',
'      align-items: center;',
'      gap: 8px;',
'    }',
'',
'#t_7.t .board-icon-box {',
'      width: 32px;',
'      height: 32px;',
'      border-radius: var(--radius-sm);',
'      display: flex;',
'      align-items: center;',
'      justify-content: center;',
'      flex-shrink: 0;',
'      background: rgba(255, 255, 255, 0.05);',
'      border: 1px solid var(--border-subtle);',
'    }',
'',
'#t_7.t .board-icon-box svg {',
'      width: 17px;',
'      height: 17px;',
'    }',
'',
'#t_7.t .board-card[data-cat="acg"] .board-icon-box {',
'      color: #c084fc;',
'      border-color: rgba(192, 132, 252, 0.3);',
'      background: rgba(147, 51, 234, 0.1);',
'    }',
'',
'#t_7.t .board-card[data-cat="novel"] .board-icon-box {',
'      color: #38bdf8;',
'      border-color: rgba(56, 189, 248, 0.3);',
'      background: rgba(2, 132, 199, 0.1);',
'    }',
'',
'#t_7.t .board-card[data-cat="art"] .board-icon-box {',
'      color: #f472b6;',
'      border-color: rgba(244, 114, 182, 0.3);',
'      background: rgba(219, 39, 119, 0.1);',
'    }',
'',
'#t_7.t .board-card[data-cat="writing"] .board-icon-box {',
'      color: #fbbf24;',
'      border-color: rgba(251, 191, 36, 0.3);',
'      background: rgba(217, 119, 6, 0.1);',
'    }',
'',
'#t_7.t .board-card[data-cat="ai"] .board-icon-box {',
'      color: #34d399;',
'      border-color: rgba(52, 211, 153, 0.3);',
'      background: rgba(5, 150, 105, 0.1);',
'    }',
'',
'#t_7.t .board-title-wrap {',
'      display: flex;',
'      flex-direction: column;',
'    }',
'',
'#t_7.t .board-title-line {',
'      display: flex;',
'      align-items: center;',
'      gap: 5px;',
'    }',
'',
'#t_7.t .board-title {',
'      font-size: 14px;',
'      font-weight: 700;',
'      color: #ffffff;',
'      text-decoration: none;',
'      letter-spacing: 0.2px;',
'      transition: color 0.15s ease;',
'    }',
'',
'#t_7.t .board-title:hover {',
'      color: #38bdf8;',
'    }',
'',
'#t_7.t .tag-hot {',
'      font-size: 9px;',
'      font-weight: 800;',
'      font-family: var(--font-mono);',
'      color: #f43f5e;',
'      background: rgba(244, 63, 94, 0.15);',
'      border: 1px solid rgba(244, 63, 94, 0.4);',
'      padding: 1px 4px;',
'      border-radius: 4px;',
'      line-height: 1.2;',
'    }',
'',
'#t_7.t .tag-status {',
'      font-size: 10px;',
'      padding: 2px 7px;',
'      border-radius: var(--radius-pill);',
'      white-space: nowrap;',
'      font-weight: 500;',
'    }',
'',
'#t_7.t .tag-status-active {',
'      background: rgba(16, 185, 129, 0.12);',
'      border: 1px solid rgba(52, 211, 153, 0.35);',
'      color: #34d399;',
'    }',
'',
'#t_7.t .tag-status-beta {',
'      background: rgba(56, 189, 248, 0.12);',
'      border: 1px solid rgba(56, 189, 248, 0.35);',
'      color: #38bdf8;',
'    }',
'',
'#t_7.t .board-desc {',
'      font-size: 11px;',
'      color: var(--text-dim);',
'      margin-bottom: 9px;',
'      height: 17px;',
'      line-height: 17px;',
'      overflow: hidden;',
'      text-overflow: ellipsis;',
'      white-space: nowrap;',
'    }',
'',
'#t_7.t .board-stats-grid {',
'      display: grid;',
'      grid-template-columns: repeat(3, 1fr);',
'      background: var(--bg-stat-box);',
'      border: 1px solid rgba(255, 255, 255, 0.05);',
'      border-radius: var(--radius-sm);',
'      padding: 6px 4px;',
'      text-align: center;',
'      margin-bottom: 9px;',
'      gap: 2px;',
'    }',
'',
'#t_7.t .stat-col {',
'      display: flex;',
'      flex-direction: column;',
'      align-items: center;',
'      justify-content: center;',
'    }',
'',
'#t_7.t .stat-col:not(:last-child) {',
'      border-right: 1px solid rgba(255, 255, 255, 0.06);',
'    }',
'',
'#t_7.t .stat-label {',
'      font-size: 9px;',
'      color: var(--text-dim);',
'      line-height: 1.2;',
'    }',
'',
'#t_7.t .stat-value {',
'      font-size: 12px;',
'      font-weight: 700;',
'      color: var(--text-main);',
'      font-family: var(--font-mono);',
'      margin: 1px 0;',
'    }',
'',
'#t_7.t .stat-value.is-increase {',
'      color: #34d399;',
'    }',
'',
'#t_7.t .stat-sub {',
'      font-size: 9px;',
'      color: var(--text-dim);',
'      font-family: var(--font-mono);',
'      line-height: 1.1;',
'    }',
'',
'#t_7.t .subforum-strip {',
'      background: var(--bg-subforum);',
'      border: 1px solid var(--border-subtle);',
'      border-radius: var(--radius-sm);',
'      padding: 6px 8px;',
'      display: flex;',
'      align-items: center;',
'      justify-content: space-between;',
'      margin-bottom: 8px;',
'      text-decoration: none;',
'      color: var(--text-muted);',
'      transition: var(--transition-smooth);',
'    }',
'',
'#t_7.t .subforum-strip:hover {',
'      background: rgba(24, 33, 52, 0.9);',
'      border-color: rgba(56, 189, 248, 0.4);',
'      color: #ffffff;',
'    }',
'',
'#t_7.t .subforum-name {',
'      display: flex;',
'      align-items: center;',
'      gap: 5px;',
'      font-size: 11px;',
'      font-weight: 600;',
'    }',
'',
'#t_7.t .subforum-icon svg {',
'      width: 12px;',
'      height: 12px;',
'      display: block;',
'      color: var(--text-dim);',
'    }',
'',
'#t_7.t .subforum-strip:hover .subforum-icon svg {',
'      color: #38bdf8;',
'    }',
'',
'#t_7.t .subforum-mode {',
'      font-size: 10px;',
'      color: var(--text-dim);',
'    }',
'',
'#t_7.t .latest-post-widget {',
'      border-top: 1px solid rgba(255, 255, 255, 0.05);',
'      padding-top: 7px;',
'      margin-bottom: 9px;',
'      display: flex;',
'      flex-direction: column;',
'      gap: 2px;',
'    }',
'',
'#t_7.t .latest-post-title {',
'      font-size: 11px;',
'      color: #cbd5e1;',
'      text-decoration: none;',
'      white-space: nowrap;',
'      overflow: hidden;',
'      text-overflow: ellipsis;',
'      transition: color 0.15s ease;',
'      display: block;',
'    }',
'',
'#t_7.t .latest-post-title:hover {',
'      color: #7dd3fc;',
'    }',
'',
'#t_7.t .latest-post-meta {',
'      display: flex;',
'      align-items: center;',
'      justify-content: space-between;',
'      font-size: 10px;',
'      color: var(--text-dim);',
'      font-family: var(--font-mono);',
'    }',
'',
'#t_7.t .latest-post-author {',
'      color: var(--text-muted);',
'      max-width: 110px;',
'      overflow: hidden;',
'      text-overflow: ellipsis;',
'      white-space: nowrap;',
'    }',
'',
'#t_7.t .btn-enter-board {',
'      display: flex;',
'      align-items: center;',
'      justify-content: center;',
'      gap: 4px;',
'      background: rgba(255, 255, 255, 0.04);',
'      border: 1px solid var(--border-subtle);',
'      border-radius: var(--radius-sm);',
'      padding: 5px 0;',
'      color: var(--text-muted);',
'      font-size: 11px;',
'      font-weight: 600;',
'      text-decoration: none;',
'      transition: var(--transition-smooth);',
'    }',
'',
'#t_7.t .btn-enter-board:hover {',
'      background: rgba(139, 92, 246, 0.18);',
'      border-color: rgba(167, 139, 250, 0.5);',
'      color: #ffffff;',
'    }',
'',
'#t_7.t .btn-enter-board svg {',
'      width: 12px;',
'      height: 12px;',
'      transition: transform 0.15s ease;',
'    }',
'',
'#t_7.t .btn-enter-board:hover svg {',
'      transform: translateX(2px);',
'    }',
'',
'#t_7.t .row-balance-slot {',
'      grid-column: 2 / span 3;',
'      background: linear-gradient(135deg, rgba(16, 21, 35, 0.6) 0%, rgba(11, 14, 24, 0.8) 100%);',
'      border: 1px dashed rgba(255, 255, 255, 0.1);',
'      border-radius: var(--radius-md);',
'      padding: 14px 18px;',
'      display: flex;',
'      align-items: center;',
'      justify-content: space-between;',
'      gap: 16px;',
'      transition: var(--transition-smooth);',
'    }',
'',
'#t_7.t .row-balance-slot:hover {',
'      border-color: rgba(56, 189, 248, 0.3);',
'      background: linear-gradient(135deg, rgba(19, 26, 44, 0.75) 0%, rgba(13, 17, 30, 0.9) 100%);',
'    }',
'',
'#t_7.t .balance-info {',
'      display: flex;',
'      align-items: center;',
'      gap: 12px;',
'    }',
'',
'#t_7.t .balance-icon {',
'      width: 36px;',
'      height: 36px;',
'      border-radius: var(--radius-sm);',
'      background: rgba(56, 189, 248, 0.1);',
'      border: 1px solid rgba(56, 189, 248, 0.25);',
'      color: #38bdf8;',
'      display: flex;',
'      align-items: center;',
'      justify-content: center;',
'      flex-shrink: 0;',
'    }',
'',
'#t_7.t .balance-icon svg {',
'      width: 18px;',
'      height: 18px;',
'    }',
'',
'#t_7.t .balance-text-title {',
'      font-size: 13px;',
'      font-weight: 700;',
'      color: #ffffff;',
'      margin-bottom: 2px;',
'    }',
'',
'#t_7.t .balance-text-desc {',
'      font-size: 11px;',
'      color: var(--text-dim);',
'      line-height: 1.4;',
'    }',
'',
'#t_7.t .balance-btn {',
'      padding: 6px 14px;',
'      border-radius: var(--radius-sm);',
'      background: rgba(56, 189, 248, 0.12);',
'      border: 1px solid rgba(56, 189, 248, 0.35);',
'      color: #7dd3fc;',
'      font-size: 11px;',
'      font-weight: 600;',
'      text-decoration: none;',
'      white-space: nowrap;',
'      transition: var(--transition-smooth);',
'    }',
'',
'#t_7.t .balance-btn:hover {',
'      background: rgba(56, 189, 248, 0.22);',
'      color: #ffffff;',
'    }',
'',
'',
'',
'    /* ==========================================================',
'       6. 响应式布局自适应 (Responsive Breakpoints)',
'       ========================================================== */',
'    @media (max-width: 1200px) {',
'#t_7.t .boards-grid {',
'        grid-template-columns: repeat(2, minmax(0, 1fr));',
'      }',
'#t_7.t .row-balance-slot {',
'        grid-column: 1 / span 2;',
'      }',
'',
'    ',
'}',
'',
'',
'    @media (max-width: 768px) {',
'#t_7.t {',
'        padding: 8px;',
'      }',
'#t_7.t .section-header-bar {',
'        padding: 10px;',
'      }',
'#t_7.t .boards-grid {',
'        grid-template-columns: 1fr;',
'      }',
'#t_7.t .row-balance-slot {',
'        grid-column: 1 / span 1;',
'        flex-direction: column;',
'        align-items: flex-start;',
'      }',
'#t_7.t .filter-pills-wrap {',
'        display: none; /* 移动端可隐藏或改为下拉 */',
'      }',
'',
'    ',
'}',
'',
'  ',
'',
'html.spp-secbar-on[data-spp-secbar-cm] #t_39.t > table > tbody > tr > th.h,',
'html.spp-secbar-on[data-spp-secbar-hj] #t_7.t > table > tbody > tr > th.h {',
'    box-sizing:border-box !important;',
'    position:relative !important;',
'    isolation:isolate !important;',
'    overflow:visible !important;',
'    background-image:none !important;',
'    border-style:solid !important;',
'    border-width:1px !important;',
'    clip-path:none !important;',
'    backdrop-filter:none !important;',
'    -webkit-backdrop-filter:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm] #t_39.t > table > tbody > tr > th.h::before,',
'html.spp-secbar-on[data-spp-secbar-cm] #t_39.t > table > tbody > tr > th.h::after,',
'html.spp-secbar-on[data-spp-secbar-hj] #t_7.t > table > tbody > tr > th.h::before,',
'html.spp-secbar-on[data-spp-secbar-hj] #t_7.t > table > tbody > tr > th.h::after {',
'    content:none !important;',
'}',
'/* ================= 漫区特设 #t_39 ================= */',
'/* ★★ 2.57.144:本档由 tmp/scripts/_extract-mecha.js 从参考稿',
'   gemini参考/漫画区/gemini-code-1791913339652.html 的 style 块机械抽取(花括号配平扫描,',
'   不是逐行正则;316 条普通规则 / 4 个断点 / 6 个 ref_ 前缀 keyframes),每条顶层选择器前',
'   加本条作用域前缀;.ref-root-scope 重定向到同一前缀;@keyframes 名字一字不改。',
'   抽取时每条声明机械补 !important —— 本站这条 th.h 上压着三处既有规则(星空主题透明底 /',
'   CSS_BOARDS 浅色底 / .spp-uvbtn 渐变按钮),不补会串味。',
'   ★ 抽取件里 200 余条是参考稿 A / C 两套方案的规则(玻璃拟态 / 极简流光),在本档下',
'     命中 0 个元素 —— 刻意保留:抽取是机械的,逐条挑拣会引入人眼误差,而那几族规则',
'     在切到对应档时本来也轮不到它们(各档 CSS 都带自己的属性闸门)。 */',
'/* 参考稿 .ref-root-scope 那条是演示页的整页画板(底色 + 径向渐变 + min-height:100vh',
'   + padding:24px)。压到条子上会把条子拉成满屏高,所以这里只搬与文字渲染有关的两项',
'   其余四项刻意不带 —— 见报告【刻意偏差】。 */',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t {',
'    color:#e2e8f0 !important;',
'    font-family:"Noto Sans SC",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t *,',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t *::before,',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t *::after {',
'    box-sizing: border-box !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-sans {',
'    font-family: "Noto Sans SC", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-mono {',
'    font-family: "JetBrains Mono", "Cascadia Code", Consolas, Monaco, "Courier New", monospace !important;',
'}',
'@keyframes ref_borderFlow {',
'    0% { background-position: 0% 50%; }',
'    50% { background-position: 100% 50%; }',
'    100% { background-position: 0% 50%; }',
'}',
'@keyframes ref_pulse {',
'    0%, 100% { opacity: 1; }',
'    50% { opacity: 0.5; }',
'}',
'@keyframes ref_pulse_fast {',
'    0%, 100% { opacity: 1; }',
'    50% { opacity: 0.3; }',
'}',
'@keyframes ref_ping {',
'    75%, 100% {',
'    transform: scale(2);',
'    opacity: 0;',
'    }',
'}',
'@keyframes ref_glowLine {',
'    0%, 100% { opacity: 0.4; filter: drop-shadow(0 0 4px #00f2fe); }',
'    50% { opacity: 1; filter: drop-shadow(0 0 10px #ff2a85); }',
'}',
'@keyframes ref_shimmer {',
'    0% { background-position: -200% 0; }',
'    100% { background-position: 200% 0; }',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .clip-cyber {',
'    clip-path: polygon(0 0, calc(100% - 14px) 0, 100% 14px, 100% 100%, 14px 100%, 0 calc(100% - 14px)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .clip-cyber-sm {',
'    clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 8px 100%, 0 calc(100% - 8px)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .neon-border-box {',
'    position: relative !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .neon-border-box::before {',
'    content: \'\' !important;',
'    position: absolute !important;',
'    inset: -1px !important;',
'    background: linear-gradient(90deg, #ff2a85, #00f2fe, #7928ca, #ff2a85) !important;',
'    background-size: 300% 300% !important;',
'    border-radius: inherit !important;',
'    z-index: -1 !important;',
'    animation: ref_borderFlow 6s ease infinite !important;',
'    opacity: 0.85 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .relative {',
'    position: relative !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .absolute {',
'    position: absolute !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .fixed {',
'    position: fixed !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .inset-0 {',
'    inset: 0 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .top-1 {',
'    top: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .top-neg-1 {',
'    top: -0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .top-neg-12 {',
'    top: -3rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .top-neg-16 {',
'    top: -4rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bottom-1 {',
'    bottom: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bottom-neg-10 {',
'    bottom: -2.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .left-2 {',
'    left: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .left-neg-12 {',
'    left: -3rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .left-1-4 {',
'    left: 25% !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .right-4 {',
'    right: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .right-neg-1 {',
'    right: -0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .right-neg-16 {',
'    right: -4rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .z-0 {',
'    z-index: 0 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .z-10 {',
'    z-index: 10 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .z-20 {',
'    z-index: 20 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .flex {',
'    display: flex !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .inline-flex {',
'    display: inline-flex !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .grid {',
'    display: grid !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hidden {',
'    display: none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .flex-col {',
'    flex-direction: column !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .flex-wrap {',
'    flex-wrap: wrap !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .items-center {',
'    align-items: center !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .items-start {',
'    align-items: flex-start !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .justify-center {',
'    justify-content: center !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .justify-between {',
'    justify-content: space-between !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .pointer-events-none {',
'    pointer-events: none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .overflow-hidden {',
'    overflow: hidden !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .select-none {',
'    user-select: none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shrink-0 {',
'    flex-shrink: 0 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .ml-1 {',
'    margin-left: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .ml-auto {',
'    margin-left: auto !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mt-0-5 {',
'    margin-top: 0.125rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mt-1 {',
'    margin-top: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mt-2 {',
'    margin-top: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mt-3 {',
'    margin-top: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mt-auto {',
'    margin-top: auto !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mb-2 {',
'    margin-bottom: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mb-2-5 {',
'    margin-bottom: 0.625rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mb-3 {',
'    margin-bottom: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .mb-3-5 {',
'    margin-bottom: 0.875rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-full {',
'    width: 100% !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-full {',
'    height: 100% !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-1-5 {',
'    width: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-1-5 {',
'    height: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-2 {',
'    width: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-2 {',
'    height: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-2-5 {',
'    width: 0.625rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-2-5 {',
'    height: 0.625rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-3 {',
'    width: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-3 {',
'    height: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-3-5 {',
'    width: 0.875rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-3-5 {',
'    height: 0.875rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-4 {',
'    width: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-4 {',
'    height: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-4-5 {',
'    width: 1.125rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-4-5 {',
'    height: 1.125rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-5 {',
'    width: 1.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-5 {',
'    height: 1.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-6 {',
'    width: 1.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-6 {',
'    height: 1.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-8 {',
'    width: 2rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-8 {',
'    height: 2rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-9 {',
'    width: 2.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-9 {',
'    height: 2.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-48 {',
'    width: 12rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-48 {',
'    height: 12rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-64 {',
'    width: 16rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-64 {',
'    height: 16rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .w-72 {',
'    width: 18rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .h-20 {',
'    height: 5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .gap-1 {',
'    gap: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .gap-1-5 {',
'    gap: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .gap-2 {',
'    gap: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .gap-2-5 {',
'    gap: 0.625rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .gap-3 {',
'    gap: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .gap-3-5 {',
'    gap: 0.875rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .gap-4 {',
'    gap: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .space-y-1-5 > * + * {',
'    margin-top: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .space-y-3 > * + * {',
'    margin-top: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .p-1 {',
'    padding: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .p-1-5 {',
'    padding: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .p-1px {',
'    padding: 1px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .p-1-5px {',
'    padding: 1.5px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .p-2 {',
'    padding: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .p-3-5 {',
'    padding: 0.875rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .p-4 {',
'    padding: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .px-1-5 {',
'    padding-left: 0.375rem !important;',
'    padding-right: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .px-2 {',
'    padding-left: 0.5rem !important;',
'    padding-right: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .px-2-5 {',
'    padding-left: 0.625rem !important;',
'    padding-right: 0.625rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .px-3 {',
'    padding-left: 0.75rem !important;',
'    padding-right: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .px-4 {',
'    padding-left: 1rem !important;',
'    padding-right: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .py-0-5 {',
'    padding-top: 0.125rem !important;',
'    padding-bottom: 0.125rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .py-1 {',
'    padding-top: 0.25rem !important;',
'    padding-bottom: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .py-1-5 {',
'    padding-top: 0.375rem !important;',
'    padding-bottom: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .py-2 {',
'    padding-top: 0.5rem !important;',
'    padding-bottom: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .py-3 {',
'    padding-top: 0.75rem !important;',
'    padding-bottom: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .pt-1 {',
'    padding-top: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .pt-1-5 {',
'    padding-top: 0.375rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .pt-2 {',
'    padding-top: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .pt-3 {',
'    padding-top: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .pt-8 {',
'    padding-top: 2rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .pl-1 {',
'    padding-left: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border {',
'    border-width: 1px !important;',
'    border-style: solid !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-2 {',
'    border-width: 2px !important;',
'    border-style: solid !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-t {',
'    border-top-width: 1px !important;',
'    border-top-style: solid !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-l {',
'    border-left-width: 1px !important;',
'    border-left-style: solid !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-x {',
'    border-left-width: 1px !important;',
'    border-right-width: 1px !important;',
'    border-left-style: solid !important;',
'    border-right-style: solid !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .rounded {',
'    border-radius: 0.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .rounded-lg {',
'    border-radius: 0.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .rounded-xl {',
'    border-radius: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .rounded-2xl {',
'    border-radius: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .rounded-full {',
'    border-radius: 9999px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .rounded-10px {',
'    border-radius: 10px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .rounded-11px {',
'    border-radius: 11px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-cyber-border {',
'    border-color: #1f293d !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-warehouse-inner {',
'    border-color: #1d273a !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-slate-700 {',
'    border-color: #334155 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-slate-800 {',
'    border-color: #1e293b !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-slate-800-70 {',
'    border-color: rgba(30, 41, 59, 0.7) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-slate-800-80 {',
'    border-color: rgba(30, 41, 59, 0.8) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-slate-700-60 {',
'    border-color: rgba(51, 65, 85, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-cyan-400-50 {',
'    border-color: rgba(34, 211, 238, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-cyan-500-30 {',
'    border-color: rgba(6, 182, 212, 0.3) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-cyan-500-40 {',
'    border-color: rgba(6, 182, 212, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-cyan-500-50 {',
'    border-color: rgba(6, 182, 212, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-pink-500-30 {',
'    border-color: rgba(236, 72, 153, 0.3) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-pink-500-40 {',
'    border-color: rgba(236, 72, 153, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-cyber-pink {',
'    border-color: #ff2a85 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-cyber-pink-60 {',
'    border-color: rgba(255, 42, 133, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-amber-400-60 {',
'    border-color: rgba(251, 191, 36, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-amber-500-40 {',
'    border-color: rgba(245, 158, 11, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-amber-500-50 {',
'    border-color: rgba(245, 158, 11, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-amber-500-60 {',
'    border-color: rgba(245, 158, 11, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-emerald-500-20 {',
'    border-color: rgba(16, 185, 129, 0.2) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-emerald-500-30 {',
'    border-color: rgba(16, 185, 129, 0.3) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-emerald-500-40 {',
'    border-color: rgba(16, 185, 129, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .border-purple-500-40 {',
'    border-color: rgba(168, 85, 247, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-black {',
'    background-color: #000000 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-black-40 {',
'    background-color: rgba(0, 0, 0, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-black-60 {',
'    background-color: rgba(0, 0, 0, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-glass-base {',
'    background-color: rgba(11, 15, 25, 0.9) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyber-darker {',
'    background-color: #0a0d14 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-streamline-base {',
'    background-color: #0d111a !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-warehouse-base {',
'    background-color: rgba(13, 18, 28, 0.95) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-card-base {',
'    background-color: rgba(14, 18, 26, 0.9) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-icon-well {',
'    background-color: #0d121f !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-mecha-slot {',
'    background-color: #161b26 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyber-card {',
'    background-color: #121722 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyber-dark {',
'    background-color: #07090e !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyber-dark-60 {',
'    background-color: rgba(7, 9, 14, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyber-pink {',
'    background-color: #ff2a85 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyber-pink-20 {',
'    background-color: rgba(255, 42, 133, 0.2) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyber-cyan {',
'    background-color: #00f2fe !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-slate-700 {',
'    background-color: #334155 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-slate-800 {',
'    background-color: #1e293b !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-slate-800-80 {',
'    background-color: rgba(30, 41, 59, 0.8) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-slate-900 {',
'    background-color: #0f172a !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-400 {',
'    background-color: #22d3ee !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-500 {',
'    background-color: #06b6d4 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-500-5 {',
'    background-color: rgba(6, 182, 212, 0.05) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-500-10 {',
'    background-color: rgba(6, 182, 212, 0.1) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-950 {',
'    background-color: #083344 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-950-40 {',
'    background-color: rgba(8, 51, 68, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-950-50 {',
'    background-color: rgba(8, 51, 68, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-950-60 {',
'    background-color: rgba(8, 51, 68, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-cyan-950-70 {',
'    background-color: rgba(8, 51, 68, 0.7) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-pink-500-15 {',
'    background-color: rgba(236, 72, 153, 0.15) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-pink-500-20 {',
'    background-color: rgba(236, 72, 153, 0.2) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-pink-950-40 {',
'    background-color: rgba(80, 7, 36, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-pink-950-50 {',
'    background-color: rgba(80, 7, 36, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-amber-950-40 {',
'    background-color: rgba(69, 26, 3, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-amber-950-50 {',
'    background-color: rgba(69, 26, 3, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-amber-950-60 {',
'    background-color: rgba(69, 26, 3, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-yellow-950-40 {',
'    background-color: rgba(66, 32, 6, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-emerald-400 {',
'    background-color: #34d399 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-emerald-500-10 {',
'    background-color: rgba(16, 185, 129, 0.1) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-emerald-950-40 {',
'    background-color: rgba(2, 44, 34, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-emerald-950-50 {',
'    background-color: rgba(2, 44, 34, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-purple-500-10 {',
'    background-color: rgba(168, 85, 247, 0.1) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-purple-950-50 {',
'    background-color: rgba(59, 7, 100, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-gradient-to-r {',
'    background-image: linear-gradient(to right, var(--ref-gradient-stops, transparent)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-gradient-to-b {',
'    background-image: linear-gradient(to bottom, var(--ref-gradient-stops, transparent)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-gradient-to-tr {',
'    background-image: linear-gradient(to top right, var(--ref-gradient-stops, transparent)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-gradient-to-br {',
'    background-image: linear-gradient(to bottom right, var(--ref-gradient-stops, transparent)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .from-white {',
'    --ref-gradient-from: #ffffff !important;',
'    --ref-gradient-stops: var(--ref-gradient-from), var(--ref-gradient-to, rgba(255, 255, 255, 0)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .via-slate-100 {',
'    --ref-gradient-stops: var(--ref-gradient-from, transparent), #f1f5f9, var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .to-slate-300 {',
'    --ref-gradient-to: #cbd5e1 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .from-pink-500 {',
'    --ref-gradient-from: #ec4899 !important;',
'    --ref-gradient-stops: var(--ref-gradient-from), var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .from-pink-500-15 {',
'    --ref-gradient-from: rgba(236, 72, 153, 0.15) !important;',
'    --ref-gradient-stops: var(--ref-gradient-from), var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .via-purple-500-10 {',
'    --ref-gradient-stops: var(--ref-gradient-from, transparent), rgba(168, 85, 247, 0.1), var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .via-purple-600 {',
'    --ref-gradient-stops: var(--ref-gradient-from, transparent), #9333ea, var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .via-purple-500 {',
'    --ref-gradient-stops: var(--ref-gradient-from, transparent), #a855f7, var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .to-cyan-400 {',
'    --ref-gradient-to: #22d3ee !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .to-cyan-500-15 {',
'    --ref-gradient-to: rgba(6, 182, 212, 0.15) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .from-cyan-400 {',
'    --ref-gradient-from: #22d3ee !important;',
'    --ref-gradient-stops: var(--ref-gradient-from), var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .to-pink-500 {',
'    --ref-gradient-to: #ec4899 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .from-amber-950-60 {',
'    --ref-gradient-from: rgba(69, 26, 3, 0.6) !important;',
'    --ref-gradient-stops: var(--ref-gradient-from), var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .to-yellow-950-40 {',
'    --ref-gradient-to: rgba(66, 32, 6, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .from-amber-500-20 {',
'    --ref-gradient-from: rgba(245, 158, 11, 0.2) !important;',
'    --ref-gradient-stops: var(--ref-gradient-from), var(--ref-gradient-to, transparent) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .to-pink-500-20 {',
'    --ref-gradient-to: rgba(236, 72, 153, 0.2) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-transparent {',
'    color: transparent !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .bg-clip-text {',
'    -webkit-background-clip: text !important;',
'    background-clip: text !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-black {',
'    color: #000000 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-white {',
'    color: #ffffff !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-slate-100 {',
'    color: #f1f5f9 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-slate-200 {',
'    color: #e2e8f0 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-slate-300 {',
'    color: #cbd5e1 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-slate-400 {',
'    color: #94a3b8 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-slate-500 {',
'    color: #64748b !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-slate-600 {',
'    color: #475569 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-cyan-300 {',
'    color: #67e8f9 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-cyan-400 {',
'    color: #22d3ee !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-cyan-400-80 {',
'    color: rgba(34, 211, 238, 0.8) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-pink-300 {',
'    color: #f472b6 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-pink-400 {',
'    color: #f43f5e !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-cyber-pink {',
'    color: #ff2a85 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-cyber-cyan {',
'    color: #00f2fe !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-amber-300 {',
'    color: #fcd34d !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-amber-400 {',
'    color: #fbbf24 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-yellow-400 {',
'    color: #facc15 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-emerald-300 {',
'    color: #6ee7b7 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-emerald-400 {',
'    color: #34d399 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-purple-300 {',
'    color: #d8b4fe !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-9px {',
'    font-size: 9px !important;',
'    line-height: 12px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-10px {',
'    font-size: 10px !important;',
'    line-height: 14px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-11px {',
'    font-size: 11px !important;',
'    line-height: 16px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-xs {',
'    font-size: 0.75rem !important;',
'    line-height: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-sm {',
'    font-size: 0.875rem !important;',
'    line-height: 1.25rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-base {',
'    font-size: 1rem !important;',
'    line-height: 1.5rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-lg {',
'    font-size: 1.125rem !important;',
'    line-height: 1.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-normal {',
'    font-weight: 400 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-medium {',
'    font-weight: 500 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-semibold {',
'    font-weight: 600 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-bold {',
'    font-weight: 700 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-extrabold {',
'    font-weight: 800 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .font-black {',
'    font-weight: 900 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .tracking-wide {',
'    letter-spacing: 0.025em !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .tracking-wider {',
'    letter-spacing: 0.05em !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .tracking-widest {',
'    letter-spacing: 0.1em !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .uppercase {',
'    text-transform: uppercase !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .text-center {',
'    text-align: center !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .truncate {',
'    overflow: hidden !important;',
'    text-overflow: ellipsis !important;',
'    white-space: nowrap !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .line-clamp-1 {',
'    display: -webkit-box !important;',
'    -webkit-line-clamp: 1 !important;',
'    -webkit-box-orient: vertical !important;',
'    overflow: hidden !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .blur-2xl {',
'    filter: blur(24px) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .blur-3xl {',
'    filter: blur(48px) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .backdrop-blur-sm {',
'    backdrop-filter: blur(4px) !important;',
'    -webkit-backdrop-filter: blur(4px) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .backdrop-blur-md {',
'    backdrop-filter: blur(8px) !important;',
'    -webkit-backdrop-filter: blur(8px) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .backdrop-blur-xl {',
'    backdrop-filter: blur(24px) !important;',
'    -webkit-backdrop-filter: blur(24px) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-sm {',
'    box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-xl {',
'    box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-2xl {',
'    box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.7) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-mecha-pink {',
'    box-shadow: 0 0 25px rgba(255, 42, 133, 0.15) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-glow-cyan {',
'    box-shadow: 0 0 8px #00f2fe !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-amber-500-10 {',
'    box-shadow: 0 1px 3px 0 rgba(245, 158, 11, 0.1) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-cyan-500-20 {',
'    box-shadow: 0 4px 6px -1px rgba(6, 182, 212, 0.2) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .shadow-pink-500-25 {',
'    box-shadow: 0 10px 15px -3px rgba(236, 72, 153, 0.25) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .drop-shadow-sm {',
'    filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.5)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .drop-shadow-pink-glow-8 {',
'    filter: drop-shadow(0 0 8px #ff2a85) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .opacity-75 {',
'    opacity: 0.75 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .animate-pulse {',
'    animation: ref_pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .animate-pulse-fast {',
'    animation: ref_pulse_fast 1.4s cubic-bezier(0.4, 0, 0.6, 1) infinite !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .animate-ping {',
'    animation: ref_ping 1s cubic-bezier(0, 0, 0.2, 1) infinite !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .fill-amber-400 {',
'    fill: #fbbf24 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .stroke-2 {',
'    stroke-width: 2px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .stroke-2-2 {',
'    stroke-width: 2.2px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .stroke-3 {',
'    stroke-width: 3px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .transition-all {',
'    transition-property: all !important;',
'    transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;',
'    transition-duration: 150ms !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .transition-colors {',
'    transition-property: color, background-color, border-color !important;',
'    transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;',
'    transition-duration: 150ms !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .transition-opacity {',
'    transition-property: opacity !important;',
'    transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important;',
'    transition-duration: 150ms !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .duration-300 {',
'    transition-duration: 300ms !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .cursor-pointer {',
'    cursor: pointer !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-underline:hover {',
'    text-decoration: underline !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-text-white:hover {',
'    color: #ffffff !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-text-slate-200:hover {',
'    color: #e2e8f0 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-text-cyan-300:hover {',
'    color: #67e8f9 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-text-pink-300:hover {',
'    color: #f472b6 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-bg-slate-700:hover {',
'    background-color: #334155 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-bg-slate-800:hover {',
'    background-color: #1e293b !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-bg-cyan-900-40:hover {',
'    background-color: rgba(22, 78, 99, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-bg-cyan-950-70:hover {',
'    background-color: rgba(8, 51, 68, 0.7) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-bg-cyber-pink:hover {',
'    background-color: #ff2a85 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-bg-cyber-dark:hover {',
'    background-color: #07090e !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-border-cyan-400-50:hover {',
'    border-color: rgba(34, 211, 238, 0.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-border-cyan-500-30:hover {',
'    border-color: rgba(6, 182, 212, 0.3) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-border-cyan-500-40:hover {',
'    border-color: rgba(6, 182, 212, 0.4) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-translate-y-neg-1:hover {',
'    transform: translateY(-0.25rem) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .hover-shadow-cyan-500-10:hover {',
'    box-shadow: 0 10px 15px -3px rgba(6, 182, 212, 0.1) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .group:hover .group-hover-opacity-100 {',
'    opacity: 1 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .group:hover .group-hover-text-cyan-300 {',
'    color: #67e8f9 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .group-link:hover .group-link-hover-text-cyan-400 {',
'    color: #22d3ee !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .group-link:hover .group-link-hover-text-cyan-300 {',
'    color: #67e8f9 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .group-link:hover .group-link-hover-bg-cyan-950-60 {',
'    background-color: rgba(8, 51, 68, 0.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .group-link:hover .group-link-hover-translate-x-0-5 {',
'    transform: translateX(0.125rem) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .group-title:hover .group-title-hover-text-pink-300 {',
'    color: #f472b6 !important;',
'}',
'@media (min-width: 640px) {',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .sm-p-4 {',
'    padding: 1rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .sm-gap-3 {',
'    gap: 0.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .sm-text-lg {',
'    font-size: 1.125rem !important;',
'    line-height: 1.75rem !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .sm-inline {',
'    display: inline !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .sm-inline-flex {',
'    display: inline-flex !important;',
'}',
'}',
'@media (min-width: 768px) {',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .md-flex {',
'    display: flex !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .md-grid-cols-2 {',
'    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;',
'}',
'}',
'@media (min-width: 1024px) {',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .lg-flex {',
'    display: flex !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .lg-grid-cols-4 {',
'    grid-template-columns: repeat(4, minmax(0, 1fr)) !important;',
'}',
'}',
'@media (min-width: 1280px) {',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t .xl-flex {',
'    display: flex !important;',
'}',
'}',
'/* 容器本体=本站这条 th.h(参考稿 L597 那个 div 的 w-full bg-cyber-darker border-2',
'   border-cyber-pink-60 clip-cyber p-3-5 sm:p-4 shadow-mecha-pink relative transition-all',
'   duration-300,逐项展开;它与内部各节点不同 —— th.h 自己不带那串工具类,所以在这里手写)。 */',
'#t_39.t > table > tbody > tr > th.h .spp-secbar-glass__mark,',
'#t_39.t > table > tbody > tr > th.h .spp-secbar-glass__sub {',
'    display:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h {',
'    box-sizing:border-box !important;',
'    width:100% !important;',
'    background-color:rgb(13,17,26) !important;',
'    background-image:none !important;',
'    border:2px solid rgba(255,42,133,.6) !important;',
'    border-radius:0 !important;',
'    box-shadow:0 0 25px rgba(255,42,133,.15) !important;',
'    padding:14px !important;',
'    clip-path:polygon(0 0, calc(100% - 14px) 0, 100% 14px, 100% 100%, 14px 100%, 0 calc(100% - 14px)) !important;',
'    backdrop-filter:none !important;',
'    -webkit-backdrop-filter:none !important;',
'    position:relative !important;',
'    isolation:isolate !important;',
'    overflow:visible !important;',
'    transition:all .3s cubic-bezier(.4,0,.2,1) !important;',
'    text-align:left !important;',
'}',
'/* sm:p-4 —— 参考稿那个断点(min-width:640px)的 16px 内边距 */',
'@media (min-width:640px) {',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h { padding:16px !important; }',
'}',
'/* 两枚装饰标记:参考稿是绝对定位的纯装饰,别让它挡住点击 */',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__mark {',
'    pointer-events:none !important;',
'}',
'/* 标题格:参考稿 {{SECTION_TITLE_MECHA}} 那个 span 的 text-lg font-black tracking-wider',
'   text-white font-mono drop-shadow-pink-glow-8;站点自带那枚 h2 > a.cfont 搬进这一格。 */',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__titlerow > h2 {',
'    margin:0 !important;',
'    padding:0 !important;',
'    float:none !important;',
'    font-size:inherit !important;',
'    line-height:inherit !important;',
'    display:inline-block !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__titlerow > h2 > a.cfont {',
'    font-family:"JetBrains Mono","Cascadia Code",Consolas,Monaco,"Courier New",monospace !important;',
'    font-size:1.125rem !important;',
'    font-weight:900 !important;',
'    letter-spacing:.05em !important;',
'    color:#fff !important;',
'    -webkit-text-fill-color:#fff !important;',
'    background-image:none !important;',
'    -webkit-background-clip:border-box !important;',
'    background-clip:border-box !important;',
'    text-shadow:0 0 8px rgba(255,42,133,.8) !important;',
'    text-decoration:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__titlerow > h2 > a.cfont::before { content:none !important; }',
'/* 折叠按钮=站点自带那枚 a.closeicon.fr(内联 IndexDeploy,功能不碰),',
'   外形照参考稿右端那枚切角方钮。 */',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h a.closeicon.fr {',
'    display:inline-flex !important;',
'    align-items:center !important;',
'    justify-content:center !important;',
'    width:28px !important;',
'    height:28px !important;',
'    margin:0 !important;',
'    padding:0 !important;',
'    box-sizing:border-box !important;',
'    background-color:rgba(255,42,133,.2) !important;',
'    border:1px solid #ff2a85 !important;',
'    border-radius:0 !important;',
'    box-shadow:none !important;',
'    clip-path:polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 8px 100%, 0 calc(100% - 8px)) !important;',
'    transition:background-color .15s !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h a.closeicon.fr:hover { background-color:#ff2a85 !important; }',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h a.closeicon.fr img {',
'    width:14px !important;',
'    height:14px !important;',
'    display:block !important;',
'    filter:brightness(0) invert(1) !important;',
'    opacity:.95 !important;',
'}',
'/* 分类胶囊:容器同时挂 .spp-secbar-glass__pills,好让漫区筛选器 cmSyncSecBarPills() 原样填进来',
'   (那一支按 #t_39 .spp-secbar-glass__pills 找容器,一个字都不用改);外形照参考稿那排切角钮。 */',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__pills > button {',
'    padding:4px 10px !important;',
'    font-family:"JetBrains Mono","Cascadia Code",Consolas,Monaco,"Courier New",monospace !important;',
'    font-size:12px !important;',
'    line-height:1.25 !important;',
'    background-color:#0f172a !important;',
'    background-image:none !important;',
'    color:#cbd5e1 !important;',
'    -webkit-text-fill-color:#cbd5e1 !important;',
'    border:1px solid #334155 !important;',
'    border-radius:0 !important;',
'    cursor:pointer !important;',
'    transition:all .15s !important;',
'    clip-path:polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 8px 100%, 0 calc(100% - 8px)) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__pills > button:hover {',
'    color:#fff !important;',
'    -webkit-text-fill-color:#fff !important;',
'    border-color:#64748b !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__pills > button.is-on {',
'    background-color:#00f2fe !important;',
'    color:#000 !important;',
'    -webkit-text-fill-color:#000 !important;',
'    border-color:#00f2fe !important;',
'    font-weight:700 !important;',
'}',
'/* 空容器收起(筛选器还没填 / 读不到分类时不留一条空带) */',
'html.spp-secbar-on[data-spp-secbar-cm="mecha"] #t_39.t > table > tbody > tr > th.h .spp-secbar-mecha__pills:empty { display:none !important; }',
'/* ================= 综合交流 #t_7 ================= */',
'/* ---- A. 赛博脉冲(默认):青色网格底 + 静止霓虹框 + 呼吸辉光 ---- */',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h {',
'    background-color:#080c16 !important;',
'    background-image:',
'        linear-gradient(rgba(6,182,212,.055) 1px, transparent 1px),',
'        linear-gradient(90deg, rgba(6,182,212,.055) 1px, transparent 1px) !important;',
'    background-size:28px 28px, 28px 28px !important;',
'    background-repeat:repeat !important;',
'    background-position:0 0, 0 0 !important;',
'    border-color:rgba(6,182,212,.35) !important;',
'    border-radius:14px !important;',
'    box-shadow:0 0 25px rgba(6,182,212,.16) !important;',
'    padding:10px 14px !important;',
'}',
'/* 「脉冲」那一层单独放 ::after:opacity 走动画,所以这一项**不加 !important**',
'           (!important 会压掉 @keyframes;其余各项照旧加)。 */',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h::after {',
'    content:"" !important; display:block !important; position:absolute !important; inset:-1px !important;',
'    width:auto !important; height:auto !important; border-radius:15px !important; background:none !important;',
'    box-shadow:0 0 24px rgba(6,182,212,.55), inset 0 0 18px rgba(6,182,212,.12) !important;',
'    filter:none !important; z-index:0 !important; pointer-events:none !important;',
'    opacity:.25; animation:sppSecBarPulse 2.6s ease-in-out infinite;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h h2 a.cfont {',
'    font-size:16px !important; font-weight:900 !important; letter-spacing:.03em !important;',
'    color:#fff !important; -webkit-text-fill-color:#fff !important;',
'    background-image:none !important; -webkit-background-clip:border-box !important; background-clip:border-box !important;',
'    text-shadow:0 1px 6px rgba(0,0,0,.55) !important; text-decoration:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h h2 a.cfont::before {',
'    content:"" !important; display:inline-block !important; width:16px !important; height:16px !important;',
'    margin-right:9px !important; vertical-align:-3px !important; border-radius:5px !important;',
'    background:linear-gradient(135deg, #06b6d4, #6366f1 52%, #9333ea) !important;',
'    box-shadow:0 2px 8px rgba(6,182,212,.35), inset 0 0 0 1px rgba(255,255,255,.2) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr {',
'    display:inline-flex !important; align-items:center !important; justify-content:center !important;',
'    width:26px !important; height:26px !important; margin:0 !important; padding:0 !important;',
'    border:1px solid rgba(255,255,255,.1) !important; border-radius:9px !important;',
'    background:rgba(7,9,16,.6) !important; box-shadow:none !important; clip-path:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr img {',
'    width:14px !important; height:14px !important; filter:invert(1) !important; opacity:.72 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr:hover {',
'    border-color:rgba(6,182,212,.6) !important; background:rgba(7,9,16,.92) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr:hover img { opacity:1 !important; }',
'html.spp-secbar-on[data-spp-secbar-hj="pulse"] #t_7.t > table > tbody > tr > th.h span.a2.fn::after {',
'    content:"ONLINE" !important; display:inline-block !important; vertical-align:2px !important;',
'    font-family:Consolas,Menlo,monospace !important; font-size:10px !important; letter-spacing:.14em !important;',
'    padding:3px 9px !important; border-radius:999px !important;',
'    color:#6ee7b7 !important; background:rgba(6,78,59,.42) !important; border:1px solid rgba(16,185,129,.35) !important;',
'}',
'/* ---- B. 星云磨砂:紫青星云底 + 24px 磨砂 + 白发丝边 ---- */',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h {',
'    background-color:rgba(13,17,28,.88) !important;',
'    background-image:',
'        radial-gradient(circle at 10% 12%, rgba(147,51,234,.22) 0%, transparent 44%),',
'        radial-gradient(circle at 88% 26%, rgba(6,182,212,.2) 0%, transparent 46%),',
'        radial-gradient(circle at 52% 130%, rgba(16,185,129,.16) 0%, transparent 52%) !important;',
'    background-size:100% 100%, 100% 100%, 100% 100% !important;',
'    background-repeat:no-repeat !important;',
'    background-position:0 0, 0 0, 0 0 !important;',
'    border-color:rgba(255,255,255,.09) !important;',
'    border-radius:18px !important;',
'    box-shadow:0 16px 40px -18px rgba(0,0,0,.85), 0 0 0 1px rgba(255,255,255,.04) !important;',
'    padding:10px 15px !important;',
'    backdrop-filter:blur(24px) !important;',
'    -webkit-backdrop-filter:blur(24px) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h h2 a.cfont {',
'    font-size:16px !important; font-weight:800 !important; letter-spacing:.03em !important;',
'    color:#f8fafc !important; -webkit-text-fill-color:#f8fafc !important;',
'    background-image:none !important; -webkit-background-clip:border-box !important; background-clip:border-box !important;',
'    text-shadow:0 1px 8px rgba(2,6,23,.6) !important; text-decoration:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h h2 a.cfont::before {',
'    content:"" !important; display:inline-block !important; width:4px !important; height:15px !important;',
'    margin-right:9px !important; vertical-align:-3px !important; border-radius:999px !important;',
'    background:linear-gradient(180deg, #a855f7, #22d3ee) !important;',
'    box-shadow:0 0 10px rgba(168,85,247,.6) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr {',
'    display:inline-flex !important; align-items:center !important; justify-content:center !important;',
'    width:26px !important; height:26px !important; margin:0 !important; padding:0 !important;',
'    border:1px solid rgba(255,255,255,.1) !important; border-radius:9px !important;',
'    background:rgba(7,9,16,.5) !important; box-shadow:none !important; clip-path:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr img {',
'    width:14px !important; height:14px !important; filter:invert(1) !important; opacity:.68 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr:hover {',
'    border-color:rgba(6,182,212,.5) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr:hover img { opacity:1 !important; }',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t > table > tbody > tr > th.h span.a2.fn::after {',
'    content:"ONLINE" !important; display:inline-block !important; vertical-align:2px !important;',
'    font-family:Consolas,Menlo,monospace !important; font-size:10px !important; letter-spacing:.14em !important;',
'    padding:3px 10px !important; border-radius:999px !important;',
'    color:#e9d5ff !important; background:rgba(147,51,234,.16) !important; border:1px solid rgba(255,255,255,.12) !important;',
'}',
'/* ---- C. 黑曜纯粹:纯黑平面 + 一条白发丝边,无辉光、无模糊、无动画 ---- */',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h {',
'    background-color:#090b10 !important;',
'    background-image:none !important;',
'    border-color:rgba(255,255,255,.1) !important;',
'    border-radius:12px !important;',
'    box-shadow:0 10px 30px rgba(0,0,0,.9) !important;',
'    padding:10px 14px !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h h2 a.cfont {',
'    font-size:15.5px !important; font-weight:700 !important; letter-spacing:.02em !important;',
'    color:#cbd5e1 !important; -webkit-text-fill-color:#cbd5e1 !important;',
'    background-image:none !important; -webkit-background-clip:border-box !important; background-clip:border-box !important;',
'    text-shadow:none !important; text-decoration:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h h2 a.cfont::before {',
'    content:"" !important; display:inline-block !important; width:3px !important; height:14px !important;',
'    margin-right:9px !important; vertical-align:-2px !important; border-radius:1px !important;',
'    background:#94a3b8 !important; box-shadow:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr {',
'    display:inline-flex !important; align-items:center !important; justify-content:center !important;',
'    width:24px !important; height:24px !important; margin:0 !important; padding:0 !important;',
'    border:1px solid rgba(255,255,255,.1) !important; border-radius:8px !important;',
'    background:transparent !important; box-shadow:none !important; clip-path:none !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr img {',
'    width:14px !important; height:14px !important; filter:invert(1) !important; opacity:.55 !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr:hover {',
'    border-color:rgba(255,255,255,.3) !important;',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h a.closeicon.fr:hover img { opacity:.92 !important; }',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t > table > tbody > tr > th.h span.a2.fn::after {',
'    content:"ONLINE" !important; display:inline-block !important; vertical-align:2px !important;',
'    font-family:Consolas,Menlo,monospace !important; font-size:10px !important; letter-spacing:.14em !important;',
'    padding:3px 9px !important; border-radius:4px !important;',
'    color:#94a3b8 !important; background:transparent !important; border:1px solid rgba(255,255,255,.12) !important;',
'}',
'/* ---- 一条动画:脉冲(透明度)—— 2.57.257 起「流光(背景位移)」与「呼吸」两条已随 breathe 档一起删除 ---- */',
'@keyframes sppSecBarPulse { 0%, 100% { opacity:.12; } 50% { opacity:.85; } }',
'#t_7.t .board-card::before { content:none !important; }',
'#t_7.t .board-card > .spp-cm-card__spin { display:none !important; }',
'#t_7.t .board-card > .spp-cm-card__inner { background:none !important; padding:0 !important; border-radius:0 !important; backdrop-filter:none !important; }',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-root {',
'      --sppp-bg-base: #06080e;',
'      --sppp-card-bg: rgba(14, 20, 32, 0.72);',
'      --sppp-card-border: rgba(255, 255, 255, 0.08);',
'      --sppp-text-main: #f1f5f9;',
'      --sppp-text-sub: #94a3b8;',
'      --sppp-text-dim: #64748b;',
'      --sppp-cyan: #38bdf8;',
'      --sppp-green: #34d399;',
'      --sppp-pink: #f472b6;',
'      --sppp-amber: #fbbf24;',
'      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Microsoft YaHei", sans-serif;',
'      box-sizing: border-box;',
'      color: var(--sppp-text-main);',
'      width: 100%;',
'      margin: 0 auto;',
'      line-height: 1.5;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-root *, html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-root *::before, html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-root *::after {',
'      box-sizing: border-box;',
'      margin: 0;',
'      padding: 0;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-root a { text-decoration: none; color: inherit; }',
'',
'',
'',
'    @keyframes spppPulse {',
'      0%, 100% { opacity: 1; transform: scale(1); }',
'      50% { opacity: 0.35; transform: scale(0.9); }',
'    }',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-mode-switch {',
'      display: inline-flex;',
'      align-items: center;',
'      gap: 10px;',
'      padding: 6px 12px;',
'      background: rgba(255, 255, 255, 0.05);',
'      border: 1px solid var(--sppp-card-border);',
'      border-radius: 9999px;',
'      margin-bottom: 12px;',
'      font-size: 12px;',
'      color: var(--sppp-text-sub);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-mode-btn {',
'      background: transparent;',
'      border: 1px solid transparent;',
'      padding: 2px 10px;',
'      border-radius: 9999px;',
'      color: var(--sppp-text-sub);',
'      cursor: pointer;',
'      font-size: 11px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-mode-btn.is-active {',
'      background: var(--sppp-cyan);',
'      color: #05070a;',
'      font-weight: 700;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-nebula {',
'      display: flex;',
'      align-items: center;',
'      justify-content: space-between;',
'      gap: 16px;',
'      padding: 12px 20px;',
'      margin-bottom: 14px;',
'      background: linear-gradient(135deg, rgba(17, 24, 39, 0.8), rgba(20, 27, 45, 0.65));',
'      backdrop-filter: blur(16px);',
'      -webkit-backdrop-filter: blur(16px);',
'      border: 1px solid rgba(255, 255, 255, 0.09);',
'      border-radius: 12px;',
'      box-shadow: 0 8px 32px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.1);',
'      position: relative;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-nebula::after {',
'      content: "";',
'      position: absolute;',
'      left: 10%; right: 10%; top: -1px; height: 1px;',
'      background: linear-gradient(90deg, transparent, rgba(56, 189, 248, 0.6), rgba(244, 114, 182, 0.6), transparent);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-left { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-title-wrap { display: flex; align-items: center; gap: 10px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-stripe {',
'      width: 4px; height: 18px; border-radius: 2px;',
'      background: linear-gradient(180deg, var(--sppp-pink), var(--sppp-cyan));',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-title { font-size: 15px; font-weight: 700; color: #ffffff; letter-spacing: 0.5px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-tag {',
'      display: inline-flex; align-items: center; gap: 6px;',
'      padding: 3px 10px; border-radius: 9999px; font-size: 11px;',
'      background: rgba(56, 189, 248, 0.1); border: 1px solid rgba(56, 189, 248, 0.3); color: var(--sppp-cyan);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-tag-gold {',
'      background: rgba(251, 191, 36, 0.1); border-color: rgba(251, 191, 36, 0.3); color: var(--sppp-amber);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-stats {',
'      display: flex; align-items: center; gap: 14px;',
'      font-size: 12px; color: var(--sppp-text-sub); margin-left: 6px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-stats strong { color: #f8fafc; font-weight: 600; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-stats .sppp-glow-text { color: var(--sppp-green); font-weight: 700; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-bar-right { display: flex; align-items: center; gap: 12px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-online-badge {',
'      display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700;',
'      color: var(--sppp-green); background: rgba(52, 211, 153, 0.1);',
'      border: 1px solid rgba(52, 211, 153, 0.25); border-radius: 9999px; padding: 3px 9px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-online-dot {',
'      width: 6px; height: 6px; border-radius: 50%;',
'      background-color: var(--sppp-green); animation: spppPulse 2s infinite ease-in-out;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-btn-toggle {',
'      background: transparent; border: none; color: var(--sppp-text-dim);',
'      cursor: pointer; display: inline-flex; padding: 4px; border-radius: 6px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-btn-toggle:hover { color: #fff; background: rgba(255, 255, 255, 0.08); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-grid {',
'      display: grid;',
'      grid-template-columns: repeat(4, minmax(0, 1fr));',
'      gap: 16px;',
'      width: 100%;',
'    }',
'',
'',
'    @media (max-width: 1200px) {',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }',
' ',
'}',
'',
'    @media (max-width: 640px) {',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-grid { grid-template-columns: 1fr; }',
' ',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card {',
'      background: var(--sppp-card-bg);',
'      backdrop-filter: blur(10px);',
'      -webkit-backdrop-filter: blur(10px);',
'      border: 1px solid var(--sppp-card-border);',
'      border-radius: 14px;',
'      padding: 16px;',
'      display: flex;',
'      flex-direction: column;',
'      gap: 14px;',
'      transition: transform 0.2s ease, border-color 0.2s ease;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card:hover {',
'      transform: translateY(-2px);',
'      border-color: rgba(56, 189, 248, 0.35);',
'      box-shadow: 0 10px 24px rgba(0, 0, 0, 0.45);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card-head { display: flex; align-items: flex-start; gap: 12px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-icon-box {',
'      width: 42px; height: 42px; border-radius: 10px;',
'      background: rgba(255, 255, 255, 0.04); border: 1px solid var(--sppp-card-border);',
'      display: flex; align-items: center; justify-content: center;',
'      flex-shrink: 0; color: var(--sppp-cyan);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card-meta { flex: 1; min-width: 0; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-title-row { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-bottom: 4px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-title { font-size: 15px; font-weight: 700; color: #fff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-badge {',
'      display: inline-flex; align-items: center; padding: 2px 7px; border-radius: 9999px;',
'      font-size: 11px; font-weight: 500; background: rgba(52, 211, 153, 0.1);',
'      border: 1px solid rgba(52, 211, 153, 0.25); color: var(--sppp-green);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-badge-hot {',
'      background: rgba(244, 114, 182, 0.12); border-color: rgba(244, 114, 182, 0.3); color: var(--sppp-pink);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-desc {',
'      font-size: 12px; color: var(--sppp-text-dim); line-height: 1.4;',
'      display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-metrics-grid {',
'      display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; padding: 8px 10px;',
'      background: rgba(0, 0, 0, 0.25); border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.03);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-metric-item { display: flex; flex-direction: column; gap: 2px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-metric-lbl { font-size: 11px; color: var(--sppp-text-dim); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-metric-val { font-size: 13px; font-weight: 600; color: #e2e8f0; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-metric-sub { font-size: 10px; color: #64748b; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-today-inc { color: var(--sppp-green); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-subforum-row {',
'      display: flex; align-items: center; justify-content: space-between;',
'      padding: 7px 10px; background: rgba(56, 189, 248, 0.05);',
'      border: 1px dashed rgba(56, 189, 248, 0.25); border-radius: 6px;',
'      font-size: 12px; color: #cbd5e1;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-subforum-row:hover { background: rgba(56, 189, 248, 0.1); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-lastpost-box {',
'      background: rgba(0, 0, 0, 0.2); border-radius: 8px; padding: 8px 10px;',
'      display: flex; flex-direction: column; gap: 4px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-lastpost-title {',
'      font-size: 12px; color: #cbd5e1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-lastpost-title:hover { color: var(--sppp-cyan); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-lastpost-foot { display: flex; align-items: center; justify-content: space-between; font-size: 11px; color: var(--sppp-text-dim); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card-actions { display: flex; justify-content: flex-end; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-btn-enter {',
'      display: inline-flex; align-items: center; gap: 4px; font-size: 12px; font-weight: 500;',
'      color: var(--sppp-cyan); background: rgba(56, 189, 248, 0.08);',
'      border: 1px solid rgba(56, 189, 248, 0.2); border-radius: 6px; padding: 5px 12px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-btn-enter:hover { background: rgba(56, 189, 248, 0.2); color: #fff; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card-placeholder-banner {',
'      grid-column: span 3;',
'      background: rgba(13, 18, 28, 0.45);',
'      backdrop-filter: blur(10px);',
'      -webkit-backdrop-filter: blur(10px);',
'      border: 1px dashed var(--sppp-card-border);',
'      border-radius: 14px;',
'      padding: 24px;',
'      display: flex;',
'      flex-direction: column;',
'      justify-content: center;',
'    }',
'',
'',
'    @media (max-width: 1200px) {',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card-placeholder-banner { grid-column: span 1; }',
' ',
'}',
'',
'    @media (max-width: 640px) {',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-card-placeholder-banner { grid-column: 1; }',
' ',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-banner-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; color: var(--sppp-cyan); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-banner-title { font-size: 14px; font-weight: 600; color: var(--sppp-text-sub); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="nebula"] #t_7.t .sppp-banner-desc { font-size: 12px; color: var(--sppp-text-dim); line-height: 1.6; max-width: 620px; }',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-root {',
'      --sppp-dark-solid: #090b10;',
'      --sppp-dark-card: #0d1117;',
'      --sppp-border-solid: #1f2937;',
'      --sppp-text-main: #f3f4f6;',
'      --sppp-text-sub: #9ca3af;',
'      --sppp-text-dim: #4b5563;',
'      --sppp-accent-blue: #60a5fa;',
'      --sppp-accent-green: #10b981;',
'      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", sans-serif;',
'      box-sizing: border-box;',
'      color: var(--sppp-text-main);',
'      width: 100%;',
'      margin: 0 auto;',
'      line-height: 1.5;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-root *, html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-root *::before, html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-root *::after { box-sizing: border-box; margin: 0; padding: 0; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-root a { text-decoration: none; color: inherit; }',
'',
'',
'',
'    @keyframes spppPulse {',
'      0%, 100% { opacity: 1; }',
'      50% { opacity: 0.3; }',
'    }',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-mode-switch {',
'      display: inline-flex; align-items: center; gap: 10px; padding: 6px 12px;',
'      background: #111827; border: 1px solid var(--sppp-border-solid); border-radius: 6px;',
'      margin-bottom: 12px; font-size: 12px; color: var(--sppp-text-sub);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-mode-btn {',
'      background: transparent; border: 1px solid transparent; padding: 2px 10px;',
'      border-radius: 4px; color: var(--sppp-text-sub); cursor: pointer; font-size: 11px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-mode-btn.is-active { background: #1f2937; color: #fff; font-weight: 700; border-color: #374151; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-obsidian {',
'      display: flex; align-items: center; justify-content: space-between; gap: 16px;',
'      padding: 10px 18px; margin-bottom: 14px; background: var(--sppp-dark-card);',
'      border: 1px solid var(--sppp-border-solid); border-radius: 6px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-left { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-title-wrap { display: flex; align-items: center; gap: 8px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-dot-indicator { width: 4px; height: 16px; background: var(--sppp-accent-blue); border-radius: 2px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-title { font-size: 14px; font-weight: 700; color: #ffffff; letter-spacing: 0.3px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-tag {',
'      font-size: 11px; padding: 2px 8px; border-radius: 4px; background: #111827;',
'      border: 1px solid #374151; color: var(--sppp-text-sub);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-stats { display: flex; align-items: center; gap: 14px; font-size: 12px; color: var(--sppp-text-dim); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-stats strong { color: var(--sppp-text-sub); font-weight: 600; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-stats .sppp-inc { color: var(--sppp-accent-green); font-weight: 700; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-bar-right { display: flex; align-items: center; gap: 12px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-online-badge {',
'      display: inline-flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700;',
'      color: var(--sppp-accent-green); background: rgba(16, 185, 129, 0.08);',
'      border: 1px solid rgba(16, 185, 129, 0.2); border-radius: 4px; padding: 2px 8px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-online-dot { width: 6px; height: 6px; border-radius: 50%; background-color: var(--sppp-accent-green); animation: spppPulse 2s infinite ease-in-out; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-btn-toggle { background: transparent; border: none; color: var(--sppp-text-dim); cursor: pointer; padding: 2px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-grid {',
'      display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; width: 100%;',
'    }',
'',
'',
'    @media (max-width: 1200px) {',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }',
' ',
'}',
'',
'    @media (max-width: 640px) {',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-grid { grid-template-columns: 1fr; }',
' ',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card {',
'      background: var(--sppp-dark-card); border: 1px solid var(--sppp-border-solid);',
'      border-radius: 6px; padding: 14px; display: flex; flex-direction: column; gap: 12px;',
'      transition: border-color 0.15s ease;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card:hover { border-color: #3b82f6; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card-head { display: flex; align-items: flex-start; gap: 10px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-icon-box {',
'      width: 36px; height: 36px; border-radius: 6px; background: #111827;',
'      border: 1px solid #1f2937; display: flex; align-items: center; justify-content: center;',
'      flex-shrink: 0; color: var(--sppp-accent-blue);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card-meta { flex: 1; min-width: 0; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-title-row { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-bottom: 2px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-title { font-size: 14px; font-weight: 700; color: #fff; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-badge {',
'      font-size: 10px; padding: 1px 6px; border-radius: 3px; background: rgba(16, 185, 129, 0.1);',
'      border: 1px solid rgba(16, 185, 129, 0.25); color: var(--sppp-accent-green);',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-desc { font-size: 12px; color: var(--sppp-text-dim); line-height: 1.35; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-metrics-grid {',
'      display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; padding: 6px 8px;',
'      background: #090c10; border-radius: 4px; border: 1px solid #161f2c;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-metric-item { display: flex; flex-direction: column; gap: 1px; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-metric-lbl { font-size: 10px; color: var(--sppp-text-dim); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-metric-val { font-size: 12px; font-weight: 600; color: #d1d5db; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-metric-sub { font-size: 10px; color: #4b5563; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-inc { color: var(--sppp-accent-green); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-subforum-row {',
'      display: flex; align-items: center; justify-content: space-between;',
'      padding: 6px 8px; background: #111827; border: 1px solid #1f2937;',
'      border-radius: 4px; font-size: 11px; color: #9ca3af;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-lastpost-box {',
'      background: #090c10; border-radius: 4px; padding: 6px 8px;',
'      display: flex; flex-direction: column; gap: 3px; border: 1px solid #161f2c;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-lastpost-title { font-size: 11px; color: #9ca3af; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-lastpost-title:hover { color: #fff; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-lastpost-foot { display: flex; align-items: center; justify-content: space-between; font-size: 10px; color: var(--sppp-text-dim); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card-actions { display: flex; justify-content: flex-end; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-btn-enter {',
'      display: inline-flex; align-items: center; gap: 3px; font-size: 11px; font-weight: 600;',
'      color: #9ca3af; background: #111827; border: 1px solid #1f2937; border-radius: 4px; padding: 4px 10px;',
'    }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-btn-enter:hover { background: #1f2937; color: #fff; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card-placeholder-banner {',
'      grid-column: span 3; background: #0b0f15; border: 1px solid var(--sppp-border-solid);',
'      border-radius: 6px; padding: 20px; display: flex; flex-direction: column; justify-content: center;',
'    }',
'',
'',
'    @media (max-width: 1200px) {',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card-placeholder-banner { grid-column: span 1; }',
' ',
'}',
'',
'    @media (max-width: 640px) {',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-card-placeholder-banner { grid-column: 1; }',
' ',
'}',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-banner-head { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; color: var(--sppp-accent-blue); }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-banner-title { font-size: 13px; font-weight: 600; color: #e5e7eb; }',
'',
'html.spp-secbar-on[data-spp-secbar-hj="obsidian"] #t_7.t .sppp-banner-desc { font-size: 11px; color: var(--sppp-text-dim); line-height: 1.6; }'
].join('\n');
safeInit('综合交流挂类名', function () {
var HJ_MARKS = {
pulse:    ['glass-section', 'forum-card'],
nebula:   ['glass-section', 'forum-card'],
obsidian: ['glass-section', 'forum-card']
};
var hj = String(GM_getValue('spp_secbar_hj', 'pulse') || 'pulse');
var marks = HJ_MARKS[hj] || HJ_MARKS.pulse;
var barName = marks[0], cardName = marks[1];
var markSecBarHjClasses = function () {
var t7 = document.querySelector('#t_7');
if (!t7) return;
var bar = t7.querySelector('th.h');
if (bar && !bar.classList.contains(barName)) bar.classList.add(barName);
[].slice.call(t7.querySelectorAll('.spp-cm-card')).forEach(function (c) {
if (!c.classList.contains(cardName)) c.classList.add(cardName);
});
};
markSecBarHjClasses();
var secBarHjTries = 0;
var secBarHjTimer = window.setInterval(function () {
secBarHjTries++;
markSecBarHjClasses();
if (secBarHjTries >= 12) window.clearInterval(secBarHjTimer);
}, 800);
});
function initSectionBarSkin() {
function mapHjPulseClasses() {
const t7 = document.querySelector('#t_7');
if (!t7) return;
const put = function (el, name) { if (el) el.classList.add(name); };
const bar = t7.querySelector('th.h');
put(bar && bar.querySelector('h2'), 'header-left-meta');
put(bar && bar.querySelector('h2 a.cfont'), 'section-title');
put(bar && bar.querySelector('a.closeicon.fr'), 'btn-collapse');
put(t7.querySelector('.spp-cm-grid'), 'boards-grid');
[].slice.call(t7.querySelectorAll('.spp-cm-card')).forEach(function (c) {
c.classList.add('board-card');
put(c.querySelector('.spp-cm-card__head'), 'card-head');
put(c.querySelector('.spp-cm-card__titles'), 'board-title-wrap');
put(c.querySelector('.spp-cm-card__title'), 'board-title');
put(c.querySelector('.spp-cm-card__meta > span'), 'board-desc');
put(c.querySelector('.spp-cm-card__pill'), 'tag-status');
put(c.querySelector('.spp-cm-card__stats'), 'board-stats-grid');
[].slice.call(c.querySelectorAll('.spp-cm-card__stat')).forEach(function (st) {
st.classList.add('stat-col');
put(st.querySelector('.k'), 'stat-label');
put(st.querySelector('.v'), 'stat-value');
put(st.querySelector('.d'), 'stat-sub');
if (st.classList.contains('is-hot')) put(st.querySelector('.v'), 'is-increase');
});
put(c.querySelector('.spp-cm-card__board'), 'subforum-strip');
put(c.querySelector('.spp-cm-card__board-txt'), 'subforum-name');
put(c.querySelector('.spp-cm-card__board-ico'), 'subforum-icon');
put(c.querySelector('.spp-cm-card__board-txt > i'), 'subforum-mode');
put(c.querySelector('.spp-cm-card__last'), 'latest-post-widget');
put(c.querySelector('.spp-cm-card__last-txt > b'), 'latest-post-title');
put(c.querySelector('.spp-cm-card__last-txt > i'), 'latest-post-meta');
put(c.querySelector('.spp-cm-card__last-txt em'), 'latest-post-author');
put(c.querySelector('.spp-cm-card__cta'), 'btn-enter-board');
});
}
if (secBarHjStyle() === 'pulse') {
onDomReady(mapHjPulseClasses);
[0, 200, 800, 1800, 2600].forEach(function (ms) {
window.setTimeout(mapHjPulseClasses, ms);
});
}
if (!document.getElementById(SECBAR_STYLE_ID)) {
const st = document.createElement('style');
st.id = SECBAR_STYLE_ID;
st.textContent = CSS_SECBAR;
(document.head || document.documentElement).appendChild(st);
}
const root = document.documentElement;
root.classList.add('spp-secbar-on');
root.setAttribute('data-spp-secbar-cm', secBarCmStyle());
root.setAttribute('data-spp-secbar-hj', secBarHjStyle());
if (secBarCmStyle() === 'star') onDomReady(buildSecBarGlass);
if (secBarCmStyle() === 'mecha') onDomReady(buildSecBarMecha);
}
const GLASS_STAR_COUNT = 45;
const GLASS_SVG_HEAD = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">';
const GLASS_SVG_COMPASS = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="url(#spp-secbar-glass-ico)" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
'<defs><linearGradient id="spp-secbar-glass-ico" x1="0" y1="0" x2="1" y2="1">' +
'<stop offset="0" stop-color="#f472b6"></stop><stop offset="1" stop-color="#67e8f9"></stop>' +
'</linearGradient></defs>' +
'<circle cx="12" cy="12" r="10"></circle>' +
'<polygon points="16.24 7.76 14.12 14.12 7.76 16.24 9.88 9.88 16.24 7.76"></polygon>' +
'</svg>';
const GLASS_SVG_CROWN = GLASS_SVG_HEAD + '<path d="M11.562 3.266a.5.5 0 0 1 .876 0L15.39 8.87a1 1 0 0 0 1.516.294L21.183 5.5a.5.5 0 0 1 .798.519l-2.834 10.246a1 1 0 0 1-.956.735H5.81a1 1 0 0 1-.957-.735L2.02 6.02a.5.5 0 0 1 .799-.519L7.094 9.164a1 1 0 0 0 1.516-.294z"></path><path d="M5.5 21.5h13"></path></svg>';
const GLASS_SVG_TOPIC = GLASS_SVG_HEAD + '<path d="M18 19a5 5 0 0 1-5-5v8"></path><path d="M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5"></path><circle cx="13" cy="12" r="2"></circle><circle cx="20" cy="19" r="2"></circle></svg>';
const GLASS_SVG_POST = GLASS_SVG_HEAD + '<path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg>';
const GLASS_SVG_TREND = GLASS_SVG_HEAD + '<polyline points="22 7 13.5 15.5 8.5 10.5 2 17"></polyline><polyline points="16 7 22 7 22 13"></polyline></svg>';
const GLASS_SVG_RADIO = GLASS_SVG_HEAD + '<path d="M4.9 19.1C1 15.2 1 8.8 4.9 4.9"></path><path d="M7.8 16.2c-2.3-2.3-2.3-6.1 0-8.5"></path><circle cx="12" cy="12" r="2"></circle><path d="M16.2 7.8c2.3 2.3 2.3 6.1 0 8.5"></path><path d="M19.1 4.9C23 8.8 23 15.1 19.1 19"></path></svg>';
function glassCmFacts() {
const cate = document.getElementById('cate_39');
if (!cate) return null;
const rows = [].slice.call(cate.querySelectorAll('tr.f_one[id^="fid_"]'));
if (!rows.length) return null;
let topics = 0, posts = 0, todaySum = 0, hasToday = false, hot = null, newest = null;
rows.forEach(function (tr) {
const a = tr.querySelector('th h3.b > a');
const name = a ? a.textContent.trim() : '';
const statTd = tr.querySelector('td.tal');
const m = (statTd ? statTd.textContent : '').match(/([\d,]+)\s*\/\s*([\d,]+)/);
if (m) {
topics += parseInt(m[1].replace(/,/g, ''), 10) || 0;
posts += parseInt(m[2].replace(/,/g, ''), 10) || 0;
}
const ths = tr.querySelectorAll('th');
const nameTh = ths[0];
const todayEl = nameTh ? nameTh.querySelector('span.s3.f10') : null;
const tm = todayEl ? todayEl.textContent.match(/\((\d+)\)/) : null;
if (tm) {
const n = parseInt(tm[1], 10);
hasToday = true;
todaySum += n;
if (!hot || n > hot.n) hot = { n: n, name: name };
}
const cm = name.match(/^Comic Market\s+(\d+)/i);
if (cm) {
const no = parseInt(cm[1], 10);
const dEl = tr.querySelector('span.smalltxt');
const date = dEl ? dEl.textContent.trim() : '';
if (!newest || no > newest.no) newest = { no: no, date: date };
}
});
return { n: rows.length, topics: topics, posts: posts,
today: hasToday ? todaySum : null, hot: hot, newest: newest };
}
(function syncBarTotalsWithCards() {
const host = document.getElementById('t_39');
if (!host) return;
const num = function (s) { const m = String(s || '').match(/-?\d[\d,]*/); return m ? (parseInt(m[0].replace(/,/g, ''), 10) || 0) : null; };
function statOf(card, label) {
const cells = card.querySelectorAll('div, span, td, li');
for (let i = 0; i < cells.length; i++) {
const box = cells[i];
if (box.querySelector('*')) continue;              
const t = (box.textContent || '').trim();
if (t.indexOf(label) !== 0) continue;
const v = num(t.slice(label.length));
if (v !== null) return v;
const par = box.parentElement;
if (par) {
const pv = num((par.textContent || '').replace(label, ' '));
if (pv !== null) return pv;
}
}
return null;
}
function totals() {
const cards = host.querySelectorAll('.spp-sc, .spp-cm-card');
let topics = 0, posts = 0, today = 0, nT = 0, nP = 0, nD = 0;
Array.prototype.forEach.call(cards, function (c) {
const t = statOf(c, '主题'), p = statOf(c, '帖数'), d = statOf(c, '今日');
if (t !== null) { topics += t; nT++; }
if (p !== null) { posts += p; nP++; }
if (d !== null) { today += d; nD++; }
});
return (nT || nP || nD) ? { topics: topics, posts: posts, today: today, nT: nT, nP: nP, nD: nD } : null;
}
function apply() {
const t = totals();
if (!t) return;
const comma = function (n) { return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ','); };
const spans = host.querySelectorAll('span');
Array.prototype.forEach.call(spans, function (s) {
const txt = (s.textContent || '');
if (/^TOPICS:\s*[\d,]+$/.test(txt.trim())) { const v = 'TOPICS: ' + comma(t.topics); if (s.textContent !== v) s.textContent = v; }
else if (/^POSTS:\s*[\d,]+$/.test(txt.trim())) { const v = 'POSTS: ' + comma(t.posts); if (s.textContent !== v) s.textContent = v; }
else if (/^TODAY:\s*\+?[\d,]+$/.test(txt.trim())) { const v = 'TODAY: +' + comma(t.today); if (s.textContent !== v) s.textContent = v; }
});
}
let timer = null;
try {
new MutationObserver(function () { clearTimeout(timer); timer = setTimeout(apply, 250); })
.observe(host, { childList: true, subtree: true });
} catch (e) {  }
setTimeout(apply, 800);
setTimeout(apply, 2200);
})();
function buildSecBarGlass() {
const th = document.querySelector('#t_39.t > table > tbody > tr > th.h');
if (!th || th.getAttribute('data-spp-secbar-glass') === 'on') return;   
const h2 = th.querySelector('h2');
const close = th.querySelector('a.closeicon.fr');
const stars = document.createElement('div');
stars.className = 'spp-secbar-glass__stars';
let starHTML = '';
for (let i = 0; i < GLASS_STAR_COUNT; i++) {
const top = Math.random() * 100;
const left = Math.random() * 100;
const size = Math.random() * 2 + 1;
const opacity = Math.random() * 0.7 + 0.2;
const duration = Math.random() * 3 + 2;
starHTML += '<div style="position:absolute; top:' + top + '%; left:' + left + '%; width:' + size +
'px; height:' + size + 'px; background:#fff; border-radius:50%; opacity:' + opacity +
'; animation:pulse ' + duration + 's infinite ease-in-out;"></div>';
}
stars.innerHTML = starHTML;
const glowA = document.createElement('div');
glowA.className = 'spp-secbar-glass__glow spp-secbar-glass__glow--a';
const glowB = document.createElement('div');
glowB.className = 'spp-secbar-glass__glow spp-secbar-glass__glow--b';
const F = glassCmFacts();
const commaG = function (n) { return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ','); };
const seatsHTML = (F && F.n)
? '<div class="spp-secbar-glass__badge spp-secbar-glass__badge--cy">' +
'<span class="spp-secbar-glass__dot"></span>' +
'<span class="spp-secbar-glass__mono">' + F.n + ' 个同人会场席位</span>' +
'</div>'
: '';
const cmHTML = (F && F.newest)
? '<div class="spp-secbar-glass__badge spp-secbar-glass__badge--am">' + GLASS_SVG_CROWN +
'<span>C' + F.newest.no + ' 特设' +
(F.newest.date ? ' · ' + esc(F.newest.date) : '') + '</span>' +
'</div>'
: '';
const statsHTML = F
? '<div class="spp-secbar-glass__stats">' +
'<div class="spp-secbar-glass__stat spp-secbar-glass__stat--topics" title="漫区特设累计主题">' +
GLASS_SVG_TOPIC +
'<span class="spp-secbar-glass__k">主题:</span>' +
'<span class="spp-secbar-glass__v">' + commaG(F.topics) + '</span>' +
'</div>' +
'<div class="spp-secbar-glass__stat spp-secbar-glass__stat--posts" title="漫区特设累计讨论帖">' +
GLASS_SVG_POST +
'<span class="spp-secbar-glass__k">贴数:</span>' +
'<span class="spp-secbar-glass__v">' + commaG(F.posts) + '</span>' +
'</div>' +
(F.today === null
? ''
: '<div class="spp-secbar-glass__trend">' + GLASS_SVG_TREND +
'<span>今日 ' + (F.today > 0 ? '+' + F.today : '0') + '</span></div>') +
'</div>'
: '';
const row = document.createElement('div');
row.className = 'spp-secbar-glass__row';
row.innerHTML =
'<div class="spp-secbar-glass__left">' +
'<div class="spp-secbar-glass__brand">' +
'<div class="spp-secbar-glass__mark">' +
'<div class="spp-secbar-glass__mark-ring"><div class="spp-secbar-glass__mark-plate">' + GLASS_SVG_COMPASS + '</div></div>' +
'<span class="spp-secbar-glass__mark-ping">' +
'<i class="spp-secbar-glass__pingdot"></i><i class="spp-secbar-glass__pingcore"></i>' +
'</span>' +
'</div>' +
'<div><div class="spp-secbar-glass__titlerow">' +
'<span class="spp-secbar-glass__slot"></span>' +
'<span class="spp-secbar-glass__hub">HUB PRO</span>' +
'</div></div>' +
'</div>' +
seatsHTML +
cmHTML +
statsHTML +
'</div>' +
'<div class="spp-secbar-glass__right">' +
'<div class="spp-secbar-glass__pills"></div>' +
'<div class="spp-secbar-glass__live">' +
'<span class="spp-secbar-glass__dot"></span><span>LIVE 连携</span>' +
'</div>' +
'</div>';
const slot = row.querySelector('.spp-secbar-glass__slot');
if (h2 && slot) {
slot.parentNode.insertBefore(h2, slot);
slot.parentNode.removeChild(slot);
}
const rightBox = row.querySelector('.spp-secbar-glass__right');
if (close && rightBox) rightBox.appendChild(close);
const sub = document.createElement('div');
sub.className = 'spp-secbar-glass__sub';
sub.innerHTML =
'<div class="spp-secbar-glass__subleft">' +
'<span class="spp-secbar-glass__hot">HOT PICKS</span>' +
'<span class="spp-secbar-glass__news">📢 C108 申请社团总名单公式预告第 2 弹公布,点此查看特设分流</span>' +
'</div>' +
'<div class="spp-secbar-glass__subright">' +
'<span class="spp-secbar-glass__lat">' + GLASS_SVG_RADIO + ' 节点延时 18ms</span>' +
'<span class="spp-secbar-glass__guide">快捷模式引导 &gt;</span>' +
'</div>';
th.appendChild(stars);
th.appendChild(glowA);
th.appendChild(glowB);
th.appendChild(row);
th.appendChild(sub);
const syncFold = function () {
const cate = document.getElementById('cate_39');
const folded = !!cate && getComputedStyle(cate).display === 'none';
sub.style.display = folded ? 'none' : '';
};
if (close) close.addEventListener('click', function () { window.setTimeout(syncFold, 0); });
syncFold();
th.setAttribute('data-spp-secbar-glass', 'on');
}
const MECHA_SVG_ZAP = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12" fill="currentColor" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"></polygon></svg>';
function buildSecBarMecha() {
const th = document.querySelector('#t_39.t > table > tbody > tr > th.h');
if (!th || th.getAttribute('data-spp-secbar-mecha') === 'on') return;   
const h2 = th.querySelector('h2');
const close = th.querySelector('a.closeicon.fr');
const F = glassCmFacts();
const commaM = function (n) { return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, ','); };
const markA = document.createElement('div');
markA.className = 'spp-secbar-mecha__mark absolute top-1 left-2 text-9px font-mono text-cyber-pink tracking-widest select-none';
markA.textContent = '// CYBER_FORUM_V2';
const markB = document.createElement('div');
markB.className = 'spp-secbar-mecha__mark absolute bottom-1 right-4 text-9px font-mono text-cyber-cyan tracking-widest select-none';
markB.textContent = '>> SEC_OVERRIDE_01';
const eraHTML = (F && F.newest)
? '<div class="spp-secbar-mecha__era clip-cyber-sm border px-3 py-0-5 text-xs font-mono font-bold flex items-center gap-1">' +
MECHA_SVG_ZAP + '<span>C' + F.newest.no + ' 特设' +
(F.newest.date ? ' · ' + esc(F.newest.date) : '') + '</span>' +
'</div>'
: '';
const statHTML = F
? '<div class="hidden md-flex items-center gap-3 text-xs font-mono text-slate-300">' +
'<span class="text-cyan-400">TOPICS: <strong class="text-white">' + commaM(F.topics) + '</strong></span>' +
'<span class="text-pink-400">POSTS: <strong class="text-white">' + commaM(F.posts) + '</strong></span>' +
(F.today === null ? '' :
'<span class="spp-secbar-mecha__today">TODAY: +' + commaM(F.today) + '</span>') +
'</div>'
: '';
const noticeHTML = (F && F.hot)
? '<span class="spp-secbar-mecha__notice">[SYSTEM NOTICE]: 今日最热 · ' + esc(F.hot.name) + ' (+' + F.hot.n + ')</span>'
: '';
const row = document.createElement('div');
row.className = 'flex flex-wrap items-center justify-between gap-3 relative z-10 pt-1';
row.innerHTML =
'<div class="flex items-center flex-wrap gap-3">' +
'<div class="flex items-center gap-2">' +
'<div class="w-8 h-8 bg-cyber-pink text-black font-black flex items-center justify-center clip-cyber-sm font-mono text-base">M</div>' +
'<div><div class="spp-secbar-mecha__titlerow text-lg font-black tracking-wider text-white font-mono drop-shadow-pink-glow-8"></div></div>' +
'</div>' +
eraHTML +
statHTML +
'</div>' +
'<div class="flex items-center flex-wrap gap-2 ml-auto">' +
'<div class="spp-secbar-mecha__pills spp-secbar-glass__pills flex items-center gap-1 text-xs font-mono"></div>' +
'</div>';
const titleBox = row.querySelector('.spp-secbar-mecha__titlerow');
if (h2 && titleBox) titleBox.appendChild(h2);
const rightBox = row.querySelector('.ml-auto');
if (close && rightBox) rightBox.appendChild(close);
th.appendChild(markA);
th.appendChild(markB);
th.appendChild(row);
if (noticeHTML) {
const foot = document.createElement('div');
foot.className = 'mt-2 text-11px font-mono text-cyan-400-80 border-t border-slate-800 pt-1-5 flex justify-between';
foot.innerHTML = noticeHTML;
th.appendChild(foot);
}
th.setAttribute('data-spp-secbar-mecha', 'on');
}
safeInit('锚定域名',          initPinDomain);
safeInit('首页美化',          initHomePolish);
safeInit('板块条皮肤',        initSectionBarSkin);
safeInit('星空背景',          initStarfield);
safeInit('任务页外壳与横条',    initTaskPage);
safeInit('个人主页外壳',        initUprofilePage);
safeInit('主页回复卡片排版',    initUprofilePostCards);
safeInit('主页统计行拆分',      initUprofileHomeStats);
safeInit('收藏页工具条',        initFavorPageUI);
safeInit('社区论坛任务自动领取', initTaskAutoClaim);
safeInit('页面加宽',          initPageWiden);
safeInit('悬浮翻页按钮',      initNavButtons);
safeInit('图片阅读优化',      initImageViewer);
safeInit('操作栏合并',        initTipadMerge);
safeInit('悬赏信息条',        initBountyTips);
safeInit('签名进头部行',      initPostSignInline);
safeInit('房子按钮导航面板',  initCrumbHomeNav);
safeInit('图墙无图/失效图床帖列表化', initThreadListConvert);
safeInit('卡片标题屏蔽(茶馆 / 其他板块)', initCardWordBlock);
safeInit('公告板块',          initAnnounceBoard);
safeInit('子版块曜石卡片',    initSubsBento);
function sppStarMark() {
try {
document.documentElement.setAttribute('data-spp-scheme', SPP_SCHEME_STAR ? 'star' : 'obsidian');
} catch (e) {  }
}
sppStarMark();
onDomReady(function () { sppStarMark(); });
if (!SPP_SCHEME_STAR) {
console.info('[SPP] 样板分派:本页不在星舰名单(fid ' + SPP_STAR_FID +
')里 ⇒ 只跑曜石 Bento;星舰那一段 CSS 与三支模块都不生效');
} else {
console.info('[SPP] 样板分派:fid ' + SPP_STAR_FID +
' ⇒ 典藏星舰(星舰 + 宽奢 + 双行 + 火花条)');
}
function sppStarInvariantCheck() {
try {
const sts = document.querySelectorAll('style');
let found = false;
let announce = false;
for (let i = 0; i < sts.length; i++) {
const t = sts[i].textContent || '';
if (!found && t.indexOf('/* ==================== SPP-STAR-BEGIN') >= 0) found = true;
if (!announce && t.indexOf('/* ===== SPP-ANNOUNCE-BEGIN ===== */') >= 0) announce = true;
}
if (found && !SPP_SCHEME_STAR) {
console.warn('[SPP] 分派:星舰不变式失配——本页不是星舰板块(fid ' + SPP_STAR_FID +
'),但样式表里出现了星舰那几节(SPP-STAR-BEGIN);只提醒不裁剪,请查是否有代码绕过条件拼接');
} else if (!found && SPP_SCHEME_STAR && announce) {
console.warn('[SPP] 分派:星舰不变式失配——本页是星舰板块(fid ' + SPP_STAR_FID +
'),公告样式表也在,但里面没有星舰那几节(SPP-STAR-BEGIN);只提醒不裁剪');
}
} catch (e) {  }
}
onDomReady(sppStarInvariantCheck);
safeInit('子版块星舰卡片',    initSubsStar);
safeInit('子版块期数标记',    initSubsMeta);
safeInit('子版块期数落位',    initSubsLayout);
safeInit('子版块数据槽',      initSubsGauge);
safeInit('空榜不留翻页',      initEmptyListing);
safeInit('茶馆筛选(默认全部 / 继承 / 变灰)', initTeaFilter);
safeInit('版块页本版公告条',  initBoardNotice);
safeInit('版块页工具条',      initBoardToolbar);
safeInit('版块页顶部',        initBoardTop);
safeInit('搜索页版块分类',    initSearchForumPicker);
safeInit('搜索排序人气优先',  initSearchSort);
safeInit('搜索索引过期自救',  initSearchRescue);
safeInit('底部图例与页脚屏蔽', initHideBottom);
safeInit('论坛相关白底面板屏蔽', initHideForumRel);
safeInit('顶部空白工具条屏蔽', initHideTopTool);
safeInit('导航精简',          initNavSimplify);
safeInit('顶栏与板块同中轴',  initTopbarAxis);
safeInit('页眉短消息图标与新窗口', initHeaderBits);
safeInit('顶栏全息控制中枢',      initTopbarHud);
safeInit('顶栏折叠按钮(收起/展开顶板)', initTopBoxToggle);
safeInit('自动图墙模式',      initWallMode);
safeInit('板块列表预加载',    initBoardPreload);
safeInit('隐藏默认头像',      initHideDefaultAvatar);
safeInit('一体流',            initReadFlow);
safeInit('悬停高亮开关',      initFloorHoverSwitch);
safeInit('嵌套评论缩进',      initNestTree);
safeInit('reddit 化骨架',      initRedditFloor);
safeInit('底栏动作图标',       initActionIcons);
safeInit('楼层顶部行',        initFloorTopBar);
safeInit('楼层头像比例',      initAvatarRatio);
safeInit('含图楼层索引',      initImageIndex);
safeInit('南+ 品牌条',        initBrandBar);
safeInit('页眉广告整行隐藏',  initAdRowHide);
safeInit('底部位置栏补本贴',  initCrumbTitle);
safeInit('外链图防盗链修复',  initHotlinkFix);
safeInit('求物区悬赏状态徽章', initBountyBadge);
safeInit('求物区悬赏状态筛选', initAskBountyFilter);
safeInit('板块卡片筛选',      initBoardCardFilter);
safeInit('白底白字转深色',    initWhiteTextFix);
safeInit('黑夜模式',          initReadDark);
safeInit('灰字翻色',          initGrayFlip);
safeInit('购买框架',          initBuyFramework);
safeInit('附件图原地显示',    initAttachRestore);
safeInit('自动展开隐藏楼层',  initAutoExpandHidden);
safeInit('楼层过滤(纯表情 / 关键词)', initHideNoise);
safeInit('悬停弹层白底化',    initUserStatusCard);
safeInit('设置面板',          initSettingsPanel);
safeInit('BBCode预览按钮',    initPreviewButton);
safeInit('编辑器快捷工具栏',  initEditorToolbar);
safeInit('表情面板优化',      initEmojiPanel);
safeInit('个人中心页美化',      initProfileSkin);
safeInit('个人中心页排版',      initProfileLayout);
safeInit('快速发帖框美化',      initFastReply);
function initFlowPaging() {
if (!WANTS.readOnly) return;
const FORM_SEL = '#main > form[name="delatc"]';
const FILL_GAP = 250;
let formEl = null;
let cur = 1, end = 1, T = 1, seq = 0, filling = false, fillTimer = 0;
let numTpl = null, arrowFirst = null, arrowPrev = null, arrowNext = null, arrowLast = null;
const pageFirst = new Map();
function ajaxOn() {
try { return SPP_CONFIG.bool('spp_ajax_page', true); } catch (e) { return true; }
}
function preloadK() {
try { return SPP_CONFIG.num('spp_preload_pages', 5, 1, 30); } catch (e) { return 5; }
}
function blockStartOf(p) {
const K = preloadK();
return Math.floor((p - 1) / K) * K + 1;
}
function blockEndOf(p) {
return Math.min(blockStartOf(p) + preloadK() - 1, T);
}
function blockCount() {
return Math.ceil(T / preloadK());
}
function pageUrl(n) {
const base = location.href.split('#')[0];
if (/(?<!f)page[-=](\d+|e|last)\b/i.test(base)) return base.replace(/([\s\S]*)(?<!f)page([-=])(\d+|e|last)\b/i, '$1page$2' + n);
if (/\.html(\?|$)/.test(base)) return base.replace(/\.html(\?|$)/, '-page-' + n + '.html$1');
return base + (base.indexOf('?') >= 0 ? '&' : '?') + 'page=' + n;
}
function urlPage() {
const s = location.pathname + location.search;
const hits = s.match(/(?<!f)page[-=](\d+)/gi);
if (hits) return Number(hits[hits.length - 1].match(/(\d+)/)[1]);
if (/page[-=](e|last)\b/i.test(s)) return siteTotal() || 1;
return 1;
}
function siteTotal() {
const one = document.querySelector('.pagesone');
const m = one ? (one.textContent || '').match(/(\d+)\s*\/\s*(\d+)/) : null;
let t = m ? (Number(m[2]) || 1) : 1;
const tid = (location.href.match(/tid[-=](\d+)/i) || [])[1];
document.querySelectorAll('a[href*="page-"], a[href*="page="]').forEach(function (a) {
const href = a.getAttribute('href') || '';
if (!/read\.php/i.test(href)) return;
if (tid && href.indexOf(tid) < 0) return;
const mm = href.match(/(?<!f)page[-=](\d+)/i);
if (mm) t = Math.max(t, Number(mm[1]) || 1);
});
return t;
}
function isFloorNode(n) {
if (!n || n.nodeType !== 1) return false;
if (n.tagName === 'A' && n.getAttribute('name') && n.getAttribute('name') !== 'tpc') return true;
if (n.tagName === 'DIV' && n.classList.contains('t5') &&
(n.classList.contains('t2') || n.classList.contains('one'))) return true;
if (n.id && n.id.indexOf('menu_read_') === 0) return true;
return false;
}
function fetchDoc(p) {
let ctrl = null;
try { if (window.AbortController) ctrl = new AbortController(); } catch (e) { ctrl = null; }
const timer = ctrl ? setTimeout(function () { ctrl.abort(); }, 15000) : 0;
return fetch(pageUrl(p), { credentials: 'include', signal: ctrl ? ctrl.signal : undefined })
.then(function (res) {
if (timer) clearTimeout(timer);
if (!res.ok) throw new Error('HTTP ' + res.status);
return res.text();
})
.catch(function (e) { if (timer) clearTimeout(timer); throw e; });
}
function extractDoc(text) {
const doc = new DOMParser().parseFromString(text, 'text/html');
const f = doc.querySelector(FORM_SEL);
if (!f) return null;
const floors = [];
for (let i = 0; i < f.childNodes.length; i++) {
const n = f.childNodes[i];
if (isFloorNode(n)) floors.push(n);
}
if (!floors.length) return null;
return { floors: floors, title: doc.title || '' };
}
let sppLastPlaced = null;
var fillWatchT = null;
var fillWatchTicks = 0;
function startFillWatch() {
try {
if (fillWatchT) return;                       
if (!(preloadK() > 1)) return;
fillWatchTicks = 0;
try { document.documentElement.setAttribute('data-spp-flow-fillwatch', '0'); } catch (eA) { }
var t0 = Date.now();
fillWatchT = setInterval(function () {
fillWatchTicks++;
try { document.documentElement.setAttribute('data-spp-flow-fillwatch', String(fillWatchTicks)); } catch (eB) { }
try { markFillDone(); } catch (eC) { }
var done = false;
try { done = (SPP_FLOW_SYNC && SPP_FLOW_SYNC.fillDone === true); } catch (eD) { }
if (done || Date.now() - t0 > 60000) { clearInterval(fillWatchT); fillWatchT = null; }
}, 300);
} catch (e) { }
}
function markFillDone() {
try {
if (!(preloadK() > 1)) return;
if (typeof SPP_FLOW_SYNC !== 'object' || !SPP_FLOW_SYNC) return;
var lo = lowPageInDom();
var okBack = (lo > 0) && (lo <= blockStartOf(cur));
var okFwd = (end >= Math.min(blockEndOf(cur), T));
var done = okBack && okFwd;
try { document.documentElement.setAttribute('data-spp-flow-filldone', done ? '1' : '0'); } catch (eZ) { }
if (SPP_FLOW_SYNC.fillDone !== done) {
SPP_FLOW_SYNC.fillDone = done;
try { pushFlowPages(); } catch (e0) { }   
}
} catch (e) { }
}
function placeFloors(fetched, mode, pg) {
const all = Array.prototype.slice.call(formEl.childNodes);
const floorNodes = all.filter(isFloorNode);
const ref = (mode === 'prepend')
? (floorNodes.length ? floorNodes[0] : null)
: (floorNodes.length ? (all[all.lastIndexOf(floorNodes[floorNodes.length - 1]) + 1] || null) : null);
const frag = document.createDocumentFragment();
let firstNew = null;
const placed = [];
fetched.forEach(function (n) {
const copy = document.importNode(n, true);
try {
if (pg) {
copy.setAttribute('data-spp-pg', String(pg));
Array.prototype.forEach.call(copy.querySelectorAll('[data-spp-nest-no], .t5.t2'), function (x) {
try { x.setAttribute('data-spp-pg', String(pg)); } catch (e2) { }
});
}
} catch (e) { }
if (!firstNew) firstNew = copy;
frag.appendChild(copy);
placed.push(copy);
});
Array.prototype.forEach.call(frag.querySelectorAll('img'), function (im) {
if (!im.getAttribute('loading')) im.setAttribute('loading', 'lazy');
if (!im.getAttribute('decoding')) im.setAttribute('decoding', 'async');
});
if (mode !== 'append' && mode !== 'prepend') floorNodes.forEach(function (n) { formEl.removeChild(n); });   
formEl.insertBefore(frag, ref);
sppLastPlaced = placed;                 
return firstNew;
}
function pushFlowPages() {
try {
const ps = [];
pageFirst.forEach(function (el, k) { const p = Number(k); if (p) ps.push(p); });
ps.sort(function (a, b) { return a - b; });
if (!ps.length) return;
const sig = ps.join(',');
const allRows = [].slice.call(document.querySelectorAll(FORM_SEL + ' > .t5.t2'));
const firstIdx = {}, firstNo = {};
pageFirst.forEach(function (el, k) {
const p = Number(k); if (!p) return;
const i = allRows.indexOf(el);
if (i >= 0) firstIdx[p] = i;
if (el && el.hasAttribute && el.hasAttribute('data-spp-nest-no')) {
const no = Number(el.getAttribute('data-spp-nest-no'));
if (isFinite(no)) firstNo[p] = no;
}
});
SPP_FLOW_SYNC.firstIdx = firstIdx;
SPP_FLOW_SYNC.firstNo = firstNo;
SPP_FLOW_SYNC.siteLast = T;
SPP_FLOW_SYNC.pages = ps;
SPP_FLOW_SYNC.here = cur;
SPP_FLOW_SYNC.at = Date.now();
SPP_FLOW_SYNC.sig = sig;
try {
document.documentElement.setAttribute('data-spp-flow-pages', sig);
document.documentElement.setAttribute('data-spp-flow-here', String(cur));
document.documentElement.setAttribute('data-spp-flow-last', String(T));
document.documentElement.setAttribute('data-spp-flow-firstidx', ps.map(function (p) { return p + ':' + firstIdx[p]; }).join(','));
} catch (e) { }
{
const cb = SPP_FLOW_SYNC.onPush;
if (typeof cb === 'function') { try { cb(); } catch (e) { } }
}
} catch (e) { }
}
function rehookFloors(rootSet) {
try { initTipadMerge(rootSet); } catch (e) {}
try { initBountyTips(rootSet); } catch (e) {}
try { initPostSignInline(rootSet); } catch (e) {}
try { initUserStatusCard(); } catch (e) {}
try { if (typeof sppBuySweep === 'function') sppBuySweep(); } catch (e) {}
try { pushFlowPages(); } catch (e) { }
}
function fallback(p) {
seq++;
filling = false;
location.href = pageUrl(p);
}
function loadPage(p, fromPop) {
const wasCur = cur;   
if (!formEl) return;
if (p < 1) p = 1;
if (p > T) p = T;
if (!ajaxOn() && !fromPop) { fallback(p); return; }
if (p >= cur && p <= end && pageFirst.has(p)) { scrollToPage(p); return; }
const my = ++seq;
filling = false;
fetchDoc(p).then(function (text) {
if (my !== seq) return;
var gotPage = 0;
try { var mmP = String(text).match(/Pages:\s*(\d+)\s*\/\s*(\d+)/i); if (mmP) gotPage = Number(mmP[1]) || 0; } catch (e) { }
if (gotPage && gotPage !== p) {
try { say('第 ' + p + ' 页抓回来的是第 ' + gotPage + ' 页,本次换页已放弃'); } catch (e) { }
return;
}
const ext = extractDoc(text);
if (!ext) throw new Error('解析失败');
if (my !== seq) return;
const firstNew = placeFloors(ext.floors, 'replace', p);   
cur = p; end = p;
pageFirst.clear();
pageFirst.set(p, firstNew);
if (!fromPop) {
try { history.pushState({ sppFlow: true, page: p }, '', pageUrl(p)); } catch (e) {}
}
if (ext.title) document.title = ext.title;
rehookFloors(sppLastPlaced);
syncUI();
if (p !== wasCur) window.scrollTo(0, 0);   
try { if (typeof window.__sppJumpConsume === 'function') setTimeout(window.__sppJumpConsume, 80); } catch (e) { }
scheduleFill();
}).catch(function () {
if (my !== seq) return;
fallback(p);
});
}
let fillingBack = false;
function lowPageInDom() {
let m = 0;
pageFirst.forEach(function (v, k) { const p = Number(k); if (p && (!m || p < m)) m = p; });
return m;
}
function fillBackBlock() {
if (fillingBack) return;
if (!(preloadK() > 1)) return;
const my = seq;
const blockStart = Math.max(1, blockStartOf(cur));
const lo0 = lowPageInDom();
if (!lo0 || lo0 <= blockStart) return;
fillingBack = true;
bindFillVisibility();
const seenBack = {};
(function stepBack() {
if (my !== seq) { fillingBack = false; return; }
if (document.hidden) {
pendingStep = stepBack;
if (!hiddenWake) hiddenWake = setTimeout(wakePendingStep, 2500);
return;
}
const low = lowPageInDom();
if (!low || low <= blockStart) { fillingBack = false; return; }
const next = low - 1;
if (next < blockStart) { fillingBack = false; return; }
const u = pageUrl(next);
if (seenBack[u] || u === location.href.split('#')[0]) { fillingBack = false; return; }
seenBack[u] = 1;
fetchDoc(next).then(function (text) {
if (my !== seq) { fillingBack = false; return; }
var got = 0;
try { var mmB = String(text).match(/Pages:\s*(\d+)\s*\/\s*(\d+)/i); if (mmB) got = Number(mmB[1]) || 0; } catch (e) { }
if (got && got !== next) { fillingBack = false; return; }   
const ext = extractDoc(text);
if (!ext) throw new Error('解析失败');
const firstNew = placeFloors(ext.floors, 'prepend', next);   
cur = next;                       
pageFirst.set(next, firstNew);
rehookFloors(sppLastPlaced);
syncUI();
setTimeout(stepBack, FILL_GAP);
}).catch(function () { fillingBack = false; });
})();
}
function scheduleFill() {
if (fillTimer) clearTimeout(fillTimer);
try { startFillWatch(); } catch (eW) { }   
fillTimer = setTimeout(function () { try { fillBackBlock(); } catch (e) { } fillBlock(); }, 1200);
}
let pendingStep = null;
let hiddenWake = 0;
let fillVisBound = false;
function wakePendingStep() {
hiddenWake = 0;
if (document.hidden || !pendingStep) return;
const f = pendingStep;
pendingStep = null;
setTimeout(f, 0);
}
function bindFillVisibility() {
if (fillVisBound) return;
fillVisBound = true;
document.addEventListener('visibilitychange', wakePendingStep);
window.addEventListener('focus', wakePendingStep);
window.addEventListener('pageshow', wakePendingStep);
}
function fillBlock() {
if (filling) return;
if (!(preloadK() > 1)) return;
const my = seq;
const targetEnd = blockEndOf(cur);
if (end >= targetEnd) return;
filling = true;
bindFillVisibility();
pendingStep = null;
const seenUrls = {};                       
(function step() {
if (my !== seq) { filling = false; return; }
if (document.hidden) {
pendingStep = step;
if (!hiddenWake) hiddenWake = setTimeout(wakePendingStep, 2500);
return;
}
if (end >= targetEnd || end >= T) { filling = false; return; }
const next = end + 1;
const nextUrl = pageUrl(next);
const hereUrl = location.href.split('#')[0];
if (next === cur || seenUrls[nextUrl] || nextUrl === hereUrl) {
end = targetEnd;
filling = false;
try { syncUI(); } catch (e) { }
return;
}
seenUrls[nextUrl] = 1;
fetchDoc(next).then(function (text) {
if (my !== seq) { filling = false; return; }
const ext = extractDoc(text);
if (!ext) throw new Error('解析失败');
const firstNew = placeFloors(ext.floors, 'append', next);   
end = next;
pageFirst.set(next, firstNew);
rehookFloors(sppLastPlaced);
syncUI();
try { if (typeof window.__sppJumpConsume === 'function') window.__sppJumpConsume(); } catch (e) { }
setTimeout(step, FILL_GAP);
}).catch(function () { filling = false; });
})();
}
function goInput(x) {
const K = preloadK();
if (K > 1) gotoBlock(Math.min(Math.max(x, 1), blockCount()));
else gotoRealPage(Math.min(x, T));
}
function gotoBlock(n) {
const B = blockCount();
if (n < 1 || n > B) return;
const start = (n - 1) * preloadK() + 1;
if (!ajaxOn()) { location.href = pageUrl(start); return; }
loadPage(start);
}
function gotoRealPage(m) {
if (m < 1 || m > T || isNaN(m)) return;
if (m >= cur && m <= end && pageFirst.has(m)) { scrollToPage(m); return; }   
loadPage(m);
}
function rowNo(row) {
const q = row.querySelector('a[href*=action-quote]');
const m = q ? String(q.getAttribute('href') || '').match(/-article-(\d+)/) : null;
if (m) return parseInt(m[1], 10);
const tip = row.querySelector('.tiptop');
const t = tip ? (tip.textContent || '').replace(/\s+/g, ' ') : '';
const g = t.match(/(?:^|\s)(GF|B(\d+)F)(?:\s|$)/);
if (!g) return null;
return g[1] === 'GF' ? 0 : parseInt(g[2], 10);
}
function flowPP() {
let key = null;
try {
const tm = String(location.search).match(/tid-(\d+)/) || String(location.href).match(/tid-(\d+)/);
key = tm ? 'spp_flow_pp:' + tm[1] : null;             
} catch (e) { key = null; }
if (key) {
try {
const c = sessionStorage.getItem(key);
if (c) { const v = parseInt(c, 10); if (v >= 1) return v; }
} catch (e) {}
}
if (!formEl) return null;
const rows = Array.prototype.slice.call(formEl.querySelectorAll(':scope > .t5.t2'));
const marks = [];
pageFirst.forEach(function (el, k) {
while (el && !(el.classList && el.classList.contains('t5'))) el = el.nextElementSibling;
if (!el) return;
const idx = rows.indexOf(el);
const no = rowNo(el);
if (idx >= 0 && no !== null) marks.push({ page: Number(k), idx: idx, no: no });
});
marks.sort(function (a, b) { return a.page - b.page; });
for (let i = 0; i + 1 < marks.length; i++) {
const dNo = marks[i + 1].no - marks[i].no;
const dPg = marks[i + 1].page - marks[i].page;
if (dPg > 0 && dNo > 0 && dNo % dPg === 0) {
const v = dNo / dPg;
if (key) { try { sessionStorage.setItem(key, String(v)); } catch (e) {} }
return v;
}
}
return null;
}
function flowPageOf(no) {
const pp = flowPP();
if (!pp) return null;
const p = Math.floor(no / pp) + 1;
return (p >= 1 && p <= T) ? p : null;
}
function syncUI() {
syncPagers();
labelPager();          
syncPanel();
}
function syncPagers() {
document.querySelectorAll('div.t3.spp-pgbar').forEach(function (bar) {
renderNumbers(bar);
});
}
function renderNumbers(bar) {
const box = bar.querySelector('div.pages');
const ul = box ? box.querySelector('ul') : null;
if (!ul) return;
const K = preloadK();
const blockMode = K > 1;
const total = blockMode ? blockCount() : T;
const here = blockMode ? Math.ceil(cur / K) : cur;
const pagesoneLi = ul.querySelector('li.pagesone');
if (pagesoneLi) {
Array.prototype.forEach.call(pagesoneLi.childNodes, function (n) {
if (n.nodeType === 3 && /Pages\s*:/.test(n.textContent || '')) {
n.textContent = blockMode
? ('第 ' + here + '/' + total + ' 块 · 第 ' + ((here - 1) * K + 1) + '–' + Math.min(here * K, T) + ' 页 ')
: ('Pages: ' + here + '/' + total + ' ');
}
});
}
Array.prototype.slice.call(ul.children).forEach(function (li) {
if (li === pagesoneLi) return;
ul.removeChild(li);
});
const mk = function (tpl, label, href, blockN, current) {
const li = tpl ? tpl.cloneNode(true) : document.createElement('li');
const old = li.querySelector('a, b');
if (current) {
const b = document.createElement('b');
b.textContent = label;
if (old) li.replaceChild(b, old); else li.appendChild(b);
b.style.setProperty('box-sizing', 'border-box', 'important');
b.style.setProperty('background-color', 'rgba(32,201,151,.16)', 'important');
b.style.setProperty('border-color', 'rgba(32,201,151,.70)', 'important');
b.style.setProperty('color', '#c9f7e4', 'important');
b.style.setProperty('-webkit-text-fill-color', '#c9f7e4', 'important');
} else if (old && old.tagName === 'A') {
old.setAttribute('href', href);
old.textContent = label;
if (blockN) old.setAttribute('data-spp-block', String(blockN));
else old.removeAttribute('data-spp-block');
} else {
const a = document.createElement('a');
a.setAttribute('href', href);
a.textContent = label;
if (blockN) a.setAttribute('data-spp-block', String(blockN));
li.appendChild(a);
}
return li;
};
const windowN = total <= 9 ? total : 5;
const winStart = total <= 9 ? 1 : Math.min(Math.max(here - 2, 1), total - windowN + 1);
const target = function (n) { return blockMode ? (n - 1) * K + 1 : n; };
const put = function (li) { ul.insertBefore(li, pagesoneLi || null); };
if (arrowFirst) put(mk(arrowFirst, '«', pageUrl(target(1)), 1, false));
if (arrowPrev) put(mk(arrowPrev, '‹', pageUrl(target(Math.max(1, here - 1))), Math.max(1, here - 1), false));
for (let n = winStart; n < winStart + windowN && n <= total; n++) {
put(mk(numTpl, String(n), pageUrl(target(n)), blockMode ? n : 0, n === here));
}
if (arrowNext) put(mk(arrowNext, '›', pageUrl(target(Math.min(total, here + 1))), Math.min(total, here + 1), false));
if (arrowLast) put(mk(arrowLast, '»', pageUrl(target(total)), total, false));
}
function labelPager() {
try {
const K = preloadK();
const tot = T;
document.querySelectorAll('div.t3.spp-pgbar div.pages a[data-spp-block]').forEach(function (a) {
const b = Number(a.getAttribute('data-spp-block')) || 0;
if (!b) return;
const lo = (b - 1) * K + 1, hi = b * K;   
a.setAttribute('aria-label', (hi <= lo) ? ('第 ' + lo + ' 页') : ('第 ' + lo + '–' + hi + ' 页'));
});
var foundLast = false;
document.querySelectorAll('div.t3.spp-pgbar a[data-spp-pg-end="last"]').forEach(function (a) {
foundLast = true;
const t2 = '末页(第 ' + tot + ' 页)';
a.setAttribute('title', t2); a.setAttribute('aria-label', t2);
try { a.setAttribute('href', pageUrl(tot)); } catch (e) { }
});
if (!foundLast) {
document.querySelectorAll('div.t3.spp-pgbar div.pages a').forEach(function (a) {
const txt = (a.textContent || '').trim();
const isLastTxt = (txt === '»' || txt === '末页' || /末页/.test(a.getAttribute('title') || ''));
if (!isLastTxt) return;
const t2 = '末页(第 ' + tot + ' 页)';
a.setAttribute('title', t2); a.setAttribute('aria-label', t2);
try { a.setAttribute('href', pageUrl(tot)); } catch (e) { }
});
}
document.querySelectorAll('div.t3.spp-pgbar a[data-spp-pg-end="first"]').forEach(function (a) {
a.setAttribute('title', '第 1 页'); a.setAttribute('aria-label', '第 1 页');
});
} catch (e) { }
}
function syncPanel() {
const panel = document.getElementById('spp-nav-panel');
if (!panel) return;
const K = preloadK();
const blockMode = K > 1;
const here = blockMode ? Math.ceil(cur / K) : cur;
const total = blockMode ? blockCount() : T;
const input = panel.querySelector('.spp-page-input');
if (input) {
input.value = String(here);
if (!input.dataset.sppFlowBound) {
input.dataset.sppFlowBound = '1';
input.addEventListener('blur', function () { input.value = String(here); });   
}
}
const tot = panel.querySelector('.spp-nav-tot');
if (tot && blockMode) tot.textContent = String(total);
const arrows = panel.querySelectorAll('.spp-nav-arrow');
if (arrows.length >= 2) {
setArrow(arrows[0], here > 1);
setArrow(arrows[1], here < total);
}
}
function setArrow(btn, on) {
btn.classList.toggle('spp-disabled', !on);
btn.classList.toggle('spp-enabled', on);
}
function scrollToPage(m) {
const node = pageFirst.get(m);
if (node && node.scrollIntoView) node.scrollIntoView({ block: 'start' });
}
function scrollPid(pid) {
if (!pid) return;
const el = document.getElementById('read_' + pid);
if (el && el.scrollIntoView) el.scrollIntoView({ block: 'start' });
}
function onBarClick(e) {
if (!ajaxOn()) return;
if (e.ctrlKey || e.metaKey || e.shiftKey || e.altKey || e.button === 1) return;
const a = (e.target && e.target.closest) ? e.target.closest('a') : null;
if (!a) return;
const nb = a.getAttribute('data-spp-block');
if (nb) {
e.preventDefault(); e.stopPropagation();
gotoBlock(Number(nb));
return;
}
const href = a.getAttribute('href') || '';
if (!/read\.php/i.test(href) || /job\.php/i.test(href)) return;
const hits = href.match(/(?<!f)page[-=](\d+)/gi);
const m = hits ? Number(hits[hits.length - 1].match(/(\d+)/)[1]) : 0;
if (m >= 1) { e.preventDefault(); e.stopPropagation(); gotoRealPage(m); }
}
function onBarKey(e) {
if (e.key !== 'Enter' || !ajaxOn()) return;
const input = (e.target && e.target.closest) ? e.target.closest('.pagesone input') : null;
if (!input) return;
const x = parseInt(input.value, 10);
if (!isFinite(x) || x < 1) return;
e.preventDefault(); e.stopPropagation();
goInput(x);
}
function onPanelClick(e) {
if (!ajaxOn()) return;
const btn = (e.target && e.target.closest) ? e.target.closest('.spp-nav-arrow') : null;
if (!btn || btn.classList.contains('spp-disabled')) return;
const arrows = document.querySelectorAll('#spp-nav-panel .spp-nav-arrow');
const idx = Array.prototype.indexOf.call(arrows, btn);
if (idx !== 0 && idx !== 1) return;
e.preventDefault(); e.stopPropagation();
if (idx === 0) {
const ps = blockStartOf(cur) - preloadK();
if (ps >= 1) loadPage(ps);
} else if (end < T) {
loadPage(end + 1);
}
}
function onPanelKey(e) {
if (e.key !== 'Enter' || !ajaxOn()) return;
const input = (e.target && e.target.closest) ? e.target.closest('.spp-page-input') : null;
if (!input) return;
const x = parseInt(input.value, 10);
if (!isFinite(x) || x < 1) return;
e.preventDefault(); e.stopPropagation();
goInput(x);
}
function wireAll() {
document.querySelectorAll('div.t3.spp-pgbar').forEach(function (bar) {
bar.addEventListener('click', onBarClick, true);
bar.addEventListener('keydown', onBarKey, true);
});
const panel = document.getElementById('spp-nav-panel');
if (panel) {
panel.addEventListener('click', onPanelClick, true);
panel.addEventListener('keydown', onPanelKey, true);
}
}
onDomReady(function () {
formEl = document.querySelector(FORM_SEL);
if (!formEl) return;
cur = urlPage(); end = cur; T = siteTotal();
try { SPP_FLOW_SYNC.siteLast = T; } catch (e) { }
try { history.replaceState({ sppFlow: true, page: cur }, '', location.href); } catch (e) {}
captureTemplates();
wireAll();
try {
const firstNow = [].slice.call(formEl.childNodes).filter(isFloorNode)[0] || null;
if (firstNow) pageFirst.set(cur, firstNow);
} catch (e) { }
try {
var _origFloors = [].slice.call(formEl.childNodes).filter(isFloorNode);
for (var _oi = 0; _oi < _origFloors.length; _oi++) {
try {
if (!_origFloors[_oi].getAttribute('data-spp-pg')) _origFloors[_oi].setAttribute('data-spp-pg', String(cur));
} catch (e2) { }
}
} catch (e3) { }
sppFlowGoto = gotoRealPage;
sppFlowPageOf = flowPageOf;
sppFlowPageUrl = pageUrl;
try {
const dbg = window.__sppDebug = window.__sppDebug || {};
dbg.flowPagesList = sppFlowPagesList;
dbg.flowNodeOfPage = sppFlowNodeOfPage;
dbg.flowPageOfNode = sppFlowPageOfNode;
} catch (e) { }
sppFlowPagesList = function () {
const out = [];
pageFirst.forEach(function (el, k) { out.push({ page: Number(k), node: (el && el.isConnected) ? el : null }); });
return out.sort(function (a, b) { return a.page - b.page; });
};
sppFlowNodeOfPage = function (p) {
const el = pageFirst.get(Number(p));
return (el && el.isConnected) ? el : null;
};
sppFlowPageOfNode = function (node) {
if (!node) return 0;
const all = [].slice.call(document.querySelectorAll(FORM_SEL + ' > .t5.t2'));
const idx = all.indexOf(node);
if (idx < 0) return 0;
let best = 0;
pageFirst.forEach(function (el, k) {
const i = all.indexOf(el);
if (i >= 0 && i <= idx && Number(k) > best) best = Number(k);
});
return best;
};
try { if (typeof window.__sppJumpConsume === 'function') window.__sppJumpConsume(); } catch (e) { }
try { setTimeout(function () { try { if (typeof window.__sppJumpConsume === 'function') window.__sppJumpConsume(); } catch (e) { } }, 900); } catch (e) { }
try {
window.addEventListener('pageshow', function () { try { if (typeof window.__sppJumpConsume === 'function') window.__sppJumpConsume(); } catch (e) { } });
document.addEventListener('visibilitychange', function () { if (!document.hidden) { try { if (typeof window.__sppJumpConsume === 'function') window.__sppJumpConsume(); } catch (e) { } } });
} catch (e) { }
if (preloadK() > 1 && T > 1) { syncPagers(); scheduleFill(); }
sppFlowReapply = function () { try { syncPagers(); scheduleFill(); } catch (e) { } };
});
window.addEventListener('popstate', function (e) {
if (!formEl) return;
const st = e.state;
if (!st || !st.sppFlow) return;
const p = Math.min(Math.max(Number(st.page) || 1, 1), T);
if (p >= cur && p <= end && pageFirst.has(p)) { scrollToPage(p); return; }
loadPage(p, true);
});
document.addEventListener('keydown', function (e) {
if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;
if (!ajaxOn()) return;
if (!formEl || T < 2) return;
const K = preloadK();
const blockMode = K > 1;
const here = blockMode ? Math.ceil(cur / K) : cur;
const total = blockMode ? blockCount() : T;
const el = document.activeElement;
if (el && (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' ||
el.isContentEditable === 'true')) return;
if (document.querySelector('.spp-overlay.spp-open')) return;
const atFirst = here <= 1, atLast = here >= total;
if (e.key === 'ArrowLeft' ? atFirst : atLast) return;
e.preventDefault(); e.stopPropagation();
if (blockMode) {
gotoBlock(e.key === 'ArrowLeft' ? here - 1 : here + 1);
} else {
const step = SPP_CONFIG.num('spp_nav_step', 1, 1, 50);
gotoRealPage(e.key === 'ArrowLeft' ? cur - step : cur + step);
}
}, true);
function captureTemplates() {
const bar = document.querySelector('div.t3.spp-pgbar');
const ul = bar ? bar.querySelector('div.pages ul') : null;
if (!ul) return;
Array.prototype.forEach.call(ul.children, function (li) {
if (li.classList.contains('pagesone')) return;
const txt = (li.textContent || '').trim();
if (!li.querySelector('a')) return;
if (txt === '«') arrowFirst = li;
else if (txt === '‹') arrowPrev = li;
else if (txt === '›') arrowNext = li;
else if (txt === '»') arrowLast = li;
else if (/^\d+$/.test(txt) && !numTpl) numTpl = li;
});
}
}
safeInit('无刷新翻页与合并整页',  initFlowPaging);
function initReadPreloadCtl() {
if (location.pathname.indexOf('read.php') < 0) return;
const KEY = 'spp_preload_pages', MIN = 1, MAX = 30, DEF = 5;
function now() { try { return SPP_CONFIG.num(KEY, DEF, MIN, MAX); } catch (e) { return DEF; } }
function ensureCss() {
ensureStyle('spp-pp-style', '/* SPP-PP-BEGIN */\n' +
'#main .spp-pgbar.spp-pp-rel { position:relative !important; }\n' +
'#main .spp-pgbar .spp-pp-ctl { position:absolute !important; right:198px; top:11px; display:inline-flex !important;\n' +
'    align-items:center; height:30px; margin:0; padding:0 8px 0 10px; box-sizing:border-box; font-size:12px; line-height:1;\n' +
'    white-space:nowrap; float:none !important; list-style:none !important;\n' +
'    border:1px dashed rgba(16,185,129,.45); border-radius:999px; background-color:rgba(16,185,129,.10);\n' +
'    box-shadow:0 0 0 4px rgba(20,22,28,.92); }\n' +
'#main .spp-pgbar .spp-pp-ctl .spp-pp-lab { color:#8ee9c4; -webkit-text-fill-color:#8ee9c4; font-size:12px; font-weight:400; margin-right:6px; }\n' +
'#main .spp-pgbar .spp-pp-ctl .spp-pp-num { width:36px; height:22px; box-sizing:border-box; padding:0 4px; text-align:center;\n' +
'    font-family:inherit; font-size:12px; font-weight:600; color:#dbe4f2; -webkit-text-fill-color:#dbe4f2; cursor:pointer;\n' +
'    border:0; border-radius:999px; background-color:rgba(0,0,0,.22);\n' +
'    -webkit-appearance:none; appearance:none; outline:none; box-shadow:none; }\n' +
'#main .spp-pgbar .spp-pp-ctl .spp-pp-num:hover, #main .spp-pgbar .spp-pp-ctl .spp-pp-num:focus {\n' +
'    color:#fff; -webkit-text-fill-color:#fff; background-color:rgba(32,201,151,.28); }\n' +
'#main .spp-pgbar .spp-pp-ctl .spp-pp-num::-webkit-outer-spin-button,\n' +
'#main .spp-pgbar .spp-pp-ctl .spp-pp-num::-webkit-inner-spin-button { -webkit-appearance:none; margin:0; }\n' +
'/* 保存提示:绝对定位,不占宽度、不推挤旁边按钮 */\n' +
'#main .spp-pgbar .spp-pp-ctl .spp-pp-tip { position:absolute; right:100%; top:50%; transform:translateY(-50%);\n' +
'    margin-right:8px; color:#10b981; font-size:12px; white-space:nowrap; }\n' +
'@media (max-width:1000px) { #main .spp-pgbar .spp-pp-ctl { right:8px; } }\n' +
'@media (max-width:640px) { #main .spp-pgbar .spp-pp-ctl { right:6px; }\n' +
'    #main .spp-pgbar .spp-pp-ctl .spp-pp-num { width:32px; }\n' +
'    #main .spp-pgbar .spp-pp-ctl .spp-pp-tip { display:none; } }\n' +
'/* SPP-PP-END */');
}
function mk() {
const box = document.createElement('span');
box.className = 'spp-pp-ctl';
const lab = document.createElement('span');
lab.className = 'spp-pp-lab';
lab.textContent = '预加载';
const inp = document.createElement('input');
inp.type = 'number';
inp.className = 'spp-pp-num';
inp.min = String(MIN);
inp.max = String(MAX);
inp.step = '1';
inp.value = String(now());
inp.setAttribute('aria-label', '预加载 N 页合并整页');
inp.title = '预加载 N 页合并整页:可填 ' + MIN + '-' + MAX + '(默认 ' + DEF + ')。1 = 不合并(只显示当前页)。' +
'在页面里改会立即落盘并按新档重排块页码条 / 继续合并;调小档位时已合并的页保留,下次翻页或刷新后生效';
const tip = document.createElement('span');
tip.className = 'spp-pp-tip';
let tipTimer = 0;
function flash(t) {
tip.textContent = t;
if (tipTimer) clearTimeout(tipTimer);
tipTimer = setTimeout(function () { tip.textContent = ''; }, 2600);
}
function apply() {
const raw = parseInt(inp.value, 10);
if (!isFinite(raw)) { inp.value = String(now()); flash('已忽略非法输入'); return; }  
const n = Math.min(MAX, Math.max(MIN, raw));                                         
inp.value = String(n);
try { GM_setValue(KEY, n); } catch (e) { }
if (typeof sppFlowReapply === 'function') { try { sppFlowReapply(); } catch (e) { } }
flash('已保存 ' + n + ' 页');
}
inp.addEventListener('change', apply);
inp.addEventListener('keydown', function (e) {
if (e.key === 'Enter') { e.preventDefault(); apply(); inp.blur(); }
});
inp.addEventListener('blur', function () { if (inp.value !== String(now())) inp.value = String(now()); });
box.appendChild(lab); box.appendChild(inp); box.appendChild(tip);
return box;
}
function mount() {
if (!document.querySelector('#main > form[name="delatc"]')) return false;
const rows = Array.prototype.slice.call(document.querySelectorAll('#main .spp-pgbar'));
if (!rows.length) return false;
ensureCss();
rows.forEach(function (row) {
if (row.querySelector('.spp-pp-ctl')) return;
row.classList.add('spp-pp-rel');
const kids = Array.prototype.slice.call(row.children);
const tails = kids.filter(function (e) { return e.tagName === 'DIV' && e.classList.contains('c'); });
const tail = tails.length ? tails[tails.length - 1] : null;
if (tail) row.insertBefore(mk(), tail);
else row.appendChild(mk());
});
return true;
}
let tries = 0;
onDomReady(function boot() { if (mount() || ++tries >= 12) return; setTimeout(boot, 250); });
onDomReady(function () { setTimeout(mount, 1500); setTimeout(mount, 3600); });
}
safeInit('帖子页预加载数字控件', initReadPreloadCtl);
publishInitReport();
if (PAGE.profile) {
GM_addStyle(`
/* ===== SPP-PROFILE-BEGIN ===== */
            html#spp-profile-set body #header > table { display:none !important; }

            html#spp-profile-set body #header {
                background-color:transparent !important; background-image:none !important;
            }

            html#spp-profile-set body #main > .bdbA {
                background:none !important; background-color:transparent !important; background-image:none !important;
                border:0 !important; border-radius:0 !important; box-shadow:none !important;
                padding:0 !important; margin:0 0 8px !important; min-height:0 !important;
            }
            html#spp-profile-set body #main > .bdbA #breadcrumbs { background:none !important; border:0 !important; }
            html#spp-profile-set body #breadcrumbs .crumbs-item,
            html#spp-profile-set body #breadcrumbs .crumbs-item a {
                color:#9fb0c8 !important; -webkit-text-fill-color:#9fb0c8 !important; font-size:13px !important;
            }
            html#spp-profile-set body #breadcrumbs .crumbs-item:hover,
            html#spp-profile-set body #breadcrumbs .crumbs-item:hover a { color:#fff !important; -webkit-text-fill-color:#fff !important; }
            html#spp-profile-set body #breadcrumbs .crumbs-item.current,
            html#spp-profile-set body #breadcrumbs .crumbs-item.current a,
            html#spp-profile-set body #breadcrumbs .crumbs-item.current strong {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
            }
            html#spp-profile-set body #breadcrumbs .crumbs-item i { display:none !important; }
            html#spp-profile-set body #breadcrumbs .crumbs-item {
                background-image:none !important; background-color:transparent !important;
                padding-left:0 !important;
            }
            html#spp-profile-set body #breadcrumbs .crumbs-item + .crumbs-item::before {
                content:'›' !important;
                display:inline-block !important; visibility:visible !important; opacity:1 !important;
                width:auto !important; height:auto !important; min-width:0 !important;
                margin:0 9px 0 1px !important; padding:0 !important; float:none !important;
                background:none !important; background-image:none !important;
                border:0 !important; border-radius:0 !important; transform:none !important;
                color:rgba(32,201,151,.78) !important; -webkit-text-fill-color:rgba(32,201,151,.78) !important;
                font-family:inherit !important; font-size:14px !important; font-weight:700 !important;
                line-height:1 !important; vertical-align:middle !important;
                transition:color .18s ease !important;
            }
            html#spp-profile-set body #breadcrumbs .crumbs-item:hover::before {
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
            }

            html#spp-profile-set body #set-side-wrap,
            html#spp-profile-set body #set-content {
                background-color:rgb(0 0 0 / 0.86) !important;
                background-image:linear-gradient(152deg,
                    rgb(255 255 255 / 0.05) 0%,
                    rgb(255 255 255 / 0.016) 22%,
                    rgb(255 255 255 / 0.003) 46%,
                    rgb(255 255 255 / 0.000) 62%,
                    rgb(255 255 255 / 0.045) 100%) !important;
                border:1px solid rgb(255 255 255 / 0.09) !important;
                border-radius:14px !important;
                box-shadow:0 12px 32px -14px rgb(0 0 0 / 0.72),
                    inset 0 1px 0 rgb(255 255 255 / 0.22) !important;
                backdrop-filter:blur(18px) saturate(140%) !important;
                -webkit-backdrop-filter:blur(18px) saturate(140%) !important;
                overflow:hidden !important;
                color:#dfe7f3 !important;
            }
            html#spp-profile-set body #set-wrap #set-side-wrap *,
            html#spp-profile-set body #set-wrap #set-content * { color:#dfe7f3 !important; -webkit-text-fill-color:#dfe7f3 !important; }
            html#spp-profile-set body #set-content a { color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; }

            html#spp-profile-set body #set-side-wrap h2.set-h2 {
                background-color:transparent !important; background-image:none !important;
                border-bottom:1px solid rgba(255,255,255,.10) !important;
                padding:12px 14px !important; margin:0 !important; font-size:14px !important;
            }
            html#spp-profile-set body #set-side-wrap h2.set-h2 a {
                color:#fff !important; -webkit-text-fill-color:#fff !important;
                font-weight:700 !important; letter-spacing:.4px !important;
            }
            html#spp-profile-set body #set-menu { list-style:none !important; margin:0 !important; padding:8px !important; }
            html#spp-profile-set body #set-menu > li { list-style:none !important; margin:0 0 2px !important; padding:0 !important; }
            html#spp-profile-set body #set-wrap #set-menu > li > a {
                position:relative !important; display:block !important;
                padding:9px 12px 9px 16px !important; border-radius:9px !important;
                font-size:13px !important; text-decoration:none !important;
            }
            html#spp-profile-set body #set-wrap #set-menu > li > a::before {
                content:'' !important; position:absolute !important;
                left:6px !important; top:50% !important; width:3px !important; height:0 !important;
                border-radius:999px !important; background-color:#20c997 !important;
                transform:translateY(-50%) !important; opacity:0 !important;
            }
            html#spp-profile-set body #set-wrap #set-menu > li > a:hover {
                transition:background-color .22s ease, color .22s ease, padding-left .22s ease !important;
                background-color:rgba(255,255,255,.07) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
                padding-left:20px !important;
            }
            html#spp-profile-set body #set-wrap #set-menu > li > a:hover::before { transition:height .22s ease, opacity .22s ease !important; height:58% !important; opacity:1 !important; }
            html#spp-profile-set body #set-menu > li.current > a,
            html#spp-profile-set body #set-menu > li.on > a,
            html#spp-profile-set body #set-menu > li.selected > a,
            html#spp-profile-set body #set-menu > li > a.cur,
            html#spp-profile-set body #set-menu > li > a.on {
                background-color:rgba(32,201,151,.14) !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
            }
            html#spp-profile-set body #set-menu > li.current > a::before,
            html#spp-profile-set body #set-menu > li.on > a::before,
            html#spp-profile-set body #set-menu > li.selected > a::before,
            html#spp-profile-set body #set-menu > li > a.cur::before,
            html#spp-profile-set body #set-menu > li > a.on::before { height:58% !important; opacity:1 !important; }

            html#spp-profile-set body #set-content .set-tab-table {
                background-color:transparent !important; background-image:none !important;
                border-bottom:1px solid rgba(255,255,255,.10) !important;
                padding:12px 16px !important; font-size:14px !important; font-weight:700 !important;
            }
            html#spp-profile-set body #set-content .set-tab-table * { color:#fff !important; -webkit-text-fill-color:#fff !important; }
            html#spp-profile-set body #set-content .set-tab-box { padding:14px 16px 18px !important; }
            html#spp-profile-set body #set-content div,
            html#spp-profile-set body #set-content .set-tab-table,
            html#spp-profile-set body #set-content .set-tab-table table,
            html#spp-profile-set body #set-content .set-tab-table td,
            html#spp-profile-set body #set-content-wrap {
                border:0 !important; border-width:0 !important;
                outline:0 !important; box-shadow:none !important;
            }
            html#spp-profile-set body #set-content table.set-table2 tr.tr32:first-child > td {
                background-color:rgba(255,255,255,.045) !important;
                border-left:3px solid rgba(32,201,151,.85) !important;
                padding:11px 14px !important; text-align:left !important;
                font-size:13.5px !important; font-weight:700 !important; letter-spacing:.2px !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
            }
            html#spp-profile-set body #set-content table.set-table2 tr.tr2 > td {
                background-color:rgba(255,255,255,.05) !important;
                color:#9fb0c8 !important; -webkit-text-fill-color:#9fb0c8 !important;
                font-weight:600 !important; letter-spacing:.3px !important;
            }
            html#spp-profile-set body #set-content table.set-table2 tr.tr32:not(:first-child) > td:not(.spp-tick),
            html#spp-profile-set body #set-content table.set-table2 tr.tr3 > td:not(.spp-tick) {
                color:#dfe7f3 !important; -webkit-text-fill-color:#dfe7f3 !important;
            }
            html#spp-profile-set body #set-content table.set-table2 tr.tr32:not(:first-child) > td:first-child:not(.spp-tick),
            html#spp-profile-set body #set-content table.set-table2 tr.tr3 > td:first-child:not(.spp-tick) {
                text-align:left !important; font-weight:600 !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
            }
            html#spp-profile-set body #set-content table.set-table2 td.spp-tick {
                font-size:15px !important; font-weight:700 !important;
                color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important;
            }
            html#spp-profile-set body #set-content table.set-table2 {
                width:100% !important; max-width:100% !important; margin:0 !important;
                border-collapse:separate !important; border-spacing:0 !important;
                border:1px solid rgba(255,255,255,.10) !important; border-radius:10px !important;
                overflow:hidden !important; background-color:rgba(255,255,255,.02) !important;
            }
            html#spp-profile-set body #set-content table.set-table2 td,
            html#spp-profile-set body #set-content table.set-table2 th {
                border:0 !important; border-right:1px solid rgba(255,255,255,.07) !important;
                border-bottom:1px solid rgba(255,255,255,.07) !important;
                background-color:transparent !important;
                padding:11px 12px !important; text-align:center !important;
                font-size:13px !important; font-weight:400 !important;
            }
            html#spp-profile-set body #set-content table.set-table2 tr > td:last-child,
            html#spp-profile-set body #set-content table.set-table2 tr > th:last-child { border-right:0 !important; }
            html#spp-profile-set body #set-content table.set-table2 tr:last-child > td,
            html#spp-profile-set body #set-content table.set-table2 tr:last-child > th { border-bottom:0 !important; }
            html#spp-profile-set body #set-content table.set-table2 tr:hover > td { background-color:rgba(32,201,151,.07) !important; }

            html#spp-profile-set body #main > .bdbA { box-sizing:border-box !important; width:100% !important; }
            html#spp-profile-set body #main > .bdbA #breadcrumbs { box-sizing:border-box !important; width:100% !important; margin:0 !important; }

            html#spp-profile-set body #set-content-wrap { padding:14px !important; }
            html#spp-profile-set body #set-content .set-content-left { margin:0 320px 0 0 !important; padding:0 !important; }
            html#spp-profile-set body #set-content .set-content-right { padding:0 !important; }

            html#spp-profile-set body #set-content .set-content-left > div:first-child {
                box-sizing:border-box !important; padding:16px 18px 14px !important;
            }
            html#spp-profile-set body #set-content .set-content-left td.tac { width:118px !important; padding-right:16px !important; }
            html#spp-profile-set body #set-content .set-content-left img.pic {
                width:104px !important; height:104px !important; object-fit:cover !important;
                border-radius:18px !important; border:1px solid rgba(255,255,255,.14) !important;
                padding:3px !important; background-color:rgba(255,255,255,.045) !important;
                box-shadow:inset 0 1px 0 rgba(255,255,255,.18), 0 10px 22px -12px rgba(0,0,0,.9) !important;
            }
            html#spp-profile-set body #set-content .set-content-left td.tac > div { padding:9px 0 0 !important; }
            html#spp-profile-set body #set-content .set-content-left td.tac a.gray3 {
                display:inline-block !important; padding:4px 11px !important; border-radius:999px !important;
                background-color:rgba(255,255,255,.055) !important; border:1px solid rgba(255,255,255,.10) !important;
                color:#cfe0f5 !important; -webkit-text-fill-color:#cfe0f5 !important;
                font-size:11.5px !important; letter-spacing:.3px !important; text-decoration:none !important;
            }
            html#spp-profile-set body #set-content .set-content-left td.tac a.gray3:hover {
                transition:background-color .2s ease, border-color .2s ease !important;
                background-color:rgba(32,201,151,.18) !important; border-color:rgba(32,201,151,.5) !important;
                color:#eafff6 !important; -webkit-text-fill-color:#eafff6 !important;
            }
            html#spp-profile-set body #set-content .set-content-left .bdbdash:first-child > div:first-child {
                display:flex !important; align-items:center !important; flex-wrap:wrap !important; gap:9px !important;
                padding:0 0 2px !important;
            }
            html#spp-profile-set body #set-content .set-content-left span[style*="bold"] {
                font-family:inherit !important; font-size:19px !important; font-weight:700 !important;
                letter-spacing:.4px !important; color:#fff !important; -webkit-text-fill-color:#fff !important;
            }
            html#spp-profile-set body #set-content .set-content-left span.gray3 {
                padding:3px 9px !important; border-radius:999px !important;
                background-color:rgba(255,255,255,.055) !important; border:1px solid rgba(255,255,255,.10) !important;
                font-size:11px !important; letter-spacing:.3px !important;
                color:#9fb0c8 !important; -webkit-text-fill-color:#9fb0c8 !important;
            }
            html#spp-profile-set body #set-content .set-content-left a.link5 {
                display:inline-flex !important; align-items:center !important; gap:5px !important;
                padding:5px 12px !important; border-radius:999px !important;
                background-color:rgba(32,201,151,.13) !important; border:1px solid rgba(32,201,151,.42) !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                font-size:12.5px !important; font-weight:600 !important; letter-spacing:.2px !important;
                text-decoration:none !important;
            }
            html#spp-profile-set body #set-content .set-content-left a.link5:hover {
                transition:background-color .2s ease, border-color .2s ease, color .2s ease !important;
                background-color:rgba(32,201,151,.24) !important; border-color:rgba(32,201,151,.85) !important;
                color:#eafff6 !important; -webkit-text-fill-color:#eafff6 !important;
            }
            html#spp-profile-set body #set-content .set-content-left span#honor {
                display:block !important; box-sizing:border-box !important;
                margin:2px 0 10px !important; padding:9px 13px !important; border-radius:10px !important;
                background-color:rgba(255,255,255,.028) !important;
                background-image:linear-gradient(to top, rgba(0,0,0,.26) 0%, rgba(255,255,255,.04) 100%) !important;
                border-left:3px solid rgba(32,201,151,.55) !important;
                box-shadow:inset 0 2px 4px rgba(0,0,0,.40) !important;
                font-size:13.5px !important; line-height:1.65 !important;
                color:#cbd6e6 !important; -webkit-text-fill-color:#cbd6e6 !important;
            }
            html#spp-profile-set body #set-content .set-content-left a#sethonor { margin-left:6px !important; }
            html#spp-profile-set body #set-content .set-content-left a#sethonor img { display:none !important; }
            html#spp-profile-set body #set-content .set-content-left .bdbdash:first-child > div:last-child {
                display:flex !important; flex-wrap:wrap !important; gap:8px !important; padding:2px 0 0 !important;
            }
            html#spp-profile-set body #set-content .set-content-left .bdbdash:first-child > div:last-child a.link5 {
                background-color:rgba(255,255,255,.055) !important; border:1px solid rgba(255,255,255,.10) !important;
                color:#cfe0f5 !important; -webkit-text-fill-color:#cfe0f5 !important; font-weight:500 !important;
            }
            html#spp-profile-set body #set-content .set-content-left .bdbdash:first-child > div:last-child a.link5:hover {
                background-color:rgba(255,255,255,.10) !important; border-color:rgba(255,255,255,.22) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
            }

            html#spp-profile-set body #set-content .set-content-left .spp-stats {
                display:grid !important; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)) !important;
                gap:8px !important; margin:0 !important; padding:0 !important;
            }
            html#spp-profile-set body #set-content .set-content-left .spp-stat {
                box-sizing:border-box !important;
                display:flex !important; flex-direction:column !important; align-items:flex-start !important; gap:2px !important;
                padding:9px 12px !important; border-radius:10px !important;
                background-color:rgba(9,13,21,.55) !important;
                background-image:linear-gradient(to top, rgba(0,0,0,.35) 0%, rgba(255,255,255,.035) 100%) !important;
                border:1px solid rgba(255,255,255,.06) !important;
                box-shadow:inset 0 2px 4px rgba(0,0,0,.55), inset 0 -1px 0 rgba(255,255,255,.05) !important;
            }
            html#spp-profile-set body #set-content .set-content-left .spp-stat em {
                font-style:normal !important; font-size:11.5px !important; line-height:1.5 !important; letter-spacing:.3px !important;
                white-space:nowrap !important; color:#93a4bc !important; -webkit-text-fill-color:#93a4bc !important;
            }
            html#spp-profile-set body #set-content .set-content-left .spp-stat b {
                font-size:14.5px !important; font-weight:600 !important; line-height:1.5 !important; letter-spacing:.2px !important;
                white-space:nowrap !important; color:#eaf2fb !important; -webkit-text-fill-color:#eaf2fb !important;
            }
            html#spp-profile-set body #set-content .set-content-left .spp-stat.is-accent b { color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; }

            html#spp-profile-set body #set-content .set-content-right > div:not(.c) {
                box-sizing:border-box !important; overflow:hidden !important;
            }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table {
                padding:0 !important; border-bottom:1px solid rgba(255,255,255,.08) !important;
                background-color:rgba(255,255,255,.03) !important;
            }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table table { width:100% !important; }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table td {
                background-color:transparent !important; padding:10px 12px !important; vertical-align:middle !important;
            }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table td.current {
                position:relative !important; text-align:left !important; padding-left:22px !important;
                font-size:13px !important; font-weight:700 !important; letter-spacing:.3px !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
            }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table td.current::before {
                content:'' !important; position:absolute !important; left:11px !important; top:50% !important;
                width:3px !important; height:14px !important; margin-top:-7px !important;
                border-radius:999px !important; background-color:#20c997 !important;
            }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table td:not(.current) { text-align:right !important; }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table td:not(.current) a.link5 {
                display:inline-block !important; padding:4px 11px !important; border-radius:999px !important;
                background-color:rgba(32,201,151,.12) !important; border:1px solid rgba(32,201,151,.38) !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
                font-size:11.5px !important; font-weight:500 !important; text-decoration:none !important;
            }
            html#spp-profile-set body #set-content .set-content-right .set-tab-table td:not(.current) a.link5:hover {
                transition:background-color .2s ease !important; background-color:rgba(32,201,151,.24) !important;
                color:#eafff6 !important; -webkit-text-fill-color:#eafff6 !important;
            }
            html#spp-profile-set body #set-content .set-content-right .set-tab-box { padding:6px 12px 10px !important; }
            html#spp-profile-set body #set-content .set-content-right table.set-table1 td.gray3 {
                padding:8px 2px !important; font-size:11.5px !important; letter-spacing:.4px !important;
                border-bottom:1px solid rgba(255,255,255,.055) !important;
                color:#8b9bb2 !important; -webkit-text-fill-color:#8b9bb2 !important;
            }

            html#spp-profile-set body #set-side-wrap h2.set-h2 {
                position:relative !important; padding-left:20px !important; letter-spacing:.5px !important;
            }
            html#spp-profile-set body #set-side-wrap h2.set-h2::before {
                content:'' !important; position:absolute !important; left:12px !important; top:50% !important;
                width:3px !important; height:15px !important; margin-top:-7.5px !important;
                border-radius:999px !important; background-color:#20c997 !important;
            }
            html#spp-profile-set body #set-menu > li > a { padding:10px 12px 10px 16px !important; font-size:13px !important; }
            html#spp-profile-set body #set-menu > li > a::after {
                content:'›' !important; position:absolute !important; right:11px !important; top:50% !important;
                transform:translateY(-50%) !important; font-size:14px !important; line-height:1 !important;
                color:rgba(159,176,200,.55) !important; -webkit-text-fill-color:rgba(159,176,200,.55) !important;
            }
            html#spp-profile-set body #set-menu > li > a:hover::after { color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; }
            html#spp-profile-set body #set-wrap #set-menu > li.spp-cur > a {
                background-color:rgba(32,201,151,.14) !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important; font-weight:600 !important;
            }
            html#spp-profile-set body #set-wrap #set-menu > li.spp-cur > a::before { height:58% !important; opacity:1 !important; }

            html#spp-profile-set body #set-content input.input,
            html#spp-profile-set body #set-content select.input,
            html#spp-profile-set body #set-content textarea.input,
            html#spp-profile-set body #set-content input[type="text"],
            html#spp-profile-set body #set-content input[type="password"],
            html#spp-profile-set body #set-content input[type="email"],
            html#spp-profile-set body #set-content input[type="number"],
            html#spp-profile-set body #set-content input[type="url"],
            html#spp-profile-set body #set-content input[type="search"],
            html#spp-profile-set body #set-content input[type="tel"],
            html#spp-profile-set body #set-content textarea,
            html#spp-profile-set body #set-content select {
                box-sizing:border-box !important;
                background-color:rgba(9,13,21,.55) !important;
                background-image:linear-gradient(to top, rgba(0,0,0,.30) 0%, rgba(255,255,255,.045) 100%) !important;
                border:1px solid rgba(255,255,255,.10) !important;
                border-radius:9px !important;
                color:#eaf2fb !important; -webkit-text-fill-color:#eaf2fb !important;
                font-family:inherit !important; font-size:13px !important; line-height:1.45 !important;
                padding:6px 10px !important; height:auto !important; min-height:32px !important;
                box-shadow:inset 0 2px 4px rgba(0,0,0,.45) !important;
                outline:none !important;
                transition:border-color .2s ease, box-shadow .2s ease, background-color .2s ease !important;
            }
            html#spp-profile-set body #set-content input.input:hover,
            html#spp-profile-set body #set-content textarea:hover,
            html#spp-profile-set body #set-content select:hover { border-color:rgba(255,255,255,.20) !important; }
            html#spp-profile-set body #set-content input.input:focus,
            html#spp-profile-set body #set-content textarea:focus,
            html#spp-profile-set body #set-content select:focus {
                border-color:rgba(32,201,151,.78) !important;
                background-color:rgba(9,13,21,.72) !important;
                box-shadow:inset 0 2px 4px rgba(0,0,0,.35), 0 0 0 3px rgba(32,201,151,.16) !important;
            }
            html#spp-profile-set body #set-content input.input::placeholder,
            html#spp-profile-set body #set-content textarea::placeholder { color:#7d8ca3 !important; -webkit-text-fill-color:#7d8ca3 !important; }
            html#spp-profile-set body #set-content input.input:disabled,
            html#spp-profile-set body #set-content input.input[readonly],
            html#spp-profile-set body #set-content textarea:disabled,
            html#spp-profile-set body #set-content textarea[readonly] {
                color:#8b9bb2 !important; -webkit-text-fill-color:#8b9bb2 !important;
                background-color:rgba(255,255,255,.03) !important; box-shadow:none !important;
                cursor:not-allowed !important;
            }
            html#spp-profile-set body #set-content input.input[size="1"],
            html#spp-profile-set body #set-content input.input[size="2"],
            html#spp-profile-set body #set-content input.input[size="3"],
            html#spp-profile-set body #set-content input.input[size="4"] {
                width:78px !important; text-align:center !important; padding:6px 8px !important;
            }
            html#spp-profile-set body #set-content select,
            html#spp-profile-set body #set-content select.input {
                -webkit-appearance:none !important; appearance:none !important;
                padding-right:28px !important; cursor:pointer !important;
                background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='9' height='6'%3E%3Cpath d='M0 0h9L4.5 6z' fill='%239aa8bd'/%3E%3C/svg%3E"), linear-gradient(to top, rgba(0,0,0,.30) 0%, rgba(255,255,255,.045) 100%) !important;
                background-repeat:no-repeat, no-repeat !important;
                background-position:right 10px center, 0 0 !important;
                background-size:9px 6px, auto !important;
            }
            html#spp-profile-set body #set-content textarea,
            html#spp-profile-set body #set-content textarea.input {
                min-height:78px !important; line-height:1.65 !important; resize:vertical !important;
            }
            html#spp-profile-set body #set-content input[type="radio"],
            html#spp-profile-set body #set-content input[type="checkbox"] {
                accent-color:#20c997 !important;
                width:14px !important; height:14px !important;
                vertical-align:middle !important; margin:0 5px 0 0 !important; cursor:pointer !important;
            }
            html#spp-profile-set body #set-content input[type="file"] {
                box-sizing:border-box !important; padding:5px 8px !important; min-height:0 !important;
                border:1px dashed rgba(255,255,255,.16) !important; border-radius:9px !important;
                background-color:rgba(9,13,21,.40) !important; background-image:none !important;
                color:#9fb0c8 !important; -webkit-text-fill-color:#9fb0c8 !important; font-size:12.5px !important;
            }
            html#spp-profile-set body #set-content input[type="file"]::file-selector-button {
                margin-right:10px !important; padding:4px 11px !important; border-radius:7px !important;
                border:1px solid rgba(255,255,255,.12) !important; background-color:rgba(255,255,255,.07) !important;
                color:#dfe7f3 !important; font-family:inherit !important; font-size:12.5px !important; cursor:pointer !important;
            }
            html#spp-profile-set body #set-content input.btn[type="submit"],
            html#spp-profile-set body #set-content input.btn[type="button"],
            html#spp-profile-set body #set-content button.btn {
                box-sizing:border-box !important; height:34px !important; min-height:0 !important;
                padding:0 20px !important; border-radius:9px !important;
                background-image:none !important; background-color:#188a67 !important;
                border:1px solid rgba(32,201,151,.85) !important;
                color:#eafff6 !important; -webkit-text-fill-color:#eafff6 !important;
                font-family:inherit !important; font-size:13.5px !important; font-weight:600 !important;
                letter-spacing:.3px !important; text-shadow:none !important;
                box-shadow:0 6px 16px -8px rgba(32,201,151,.75), inset 0 1px 0 rgba(255,255,255,.22) !important;
                cursor:pointer !important;
            }
            html#spp-profile-set body #set-content input.btn[type="submit"]:hover,
            html#spp-profile-set body #set-content input.btn[type="button"]:hover,
            html#spp-profile-set body #set-content button.btn:hover { background-color:#1f9d76 !important; }
            html#spp-profile-set body #set-content input.btn[type="reset"] {
                box-sizing:border-box !important; height:34px !important; min-height:0 !important;
                padding:0 18px !important; border-radius:9px !important;
                background-image:none !important; background-color:#c0392b !important;
                border:1px solid rgba(192,57,43,.9) !important;
                color:#fff !important; -webkit-text-fill-color:#fff !important;
                font-family:inherit !important; font-size:13px !important; font-weight:500 !important;
                cursor:pointer !important;
            }
            html#spp-profile-set body #set-content input.btn[type="reset"]:hover { background-color:#d14836 !important; }

            html#spp-profile-set body #set-content table tr.tr3,
            html#spp-profile-set body #set-content table tr.tr32 {
                background-color:transparent !important; background-image:none !important;
            }
            html#spp-profile-set body #set-content table tr.tr3 > td,
            html#spp-profile-set body #set-content table tr.tr32 > td {
                background-color:transparent !important; background-image:none !important;
                border-bottom:1px solid rgba(255,255,255,.07) !important;
                border-right:1px solid rgba(255,255,255,.07) !important;
                padding:9px 12px !important; text-align:center !important;
                font-size:13px !important; font-weight:400 !important;
                color:#dfe7f3 !important; -webkit-text-fill-color:#dfe7f3 !important;
            }
            html#spp-profile-set body #set-content table tr.tr3 > td:first-child {
                text-align:left !important; font-weight:600 !important; letter-spacing:.3px !important;
                color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
            }
            html#spp-profile-set body #set-content table:has(tr.tr32) {
                width:100% !important; max-width:100% !important; margin:0 0 10px !important;
                border-collapse:separate !important; border-spacing:0 !important;
                border:1px solid rgba(255,255,255,.10) !important; border-radius:10px !important;
                overflow:hidden !important; background-color:rgba(255,255,255,.02) !important;
            }
            html#spp-profile-set body #set-content table:has(tr.tr32) tr > td:last-child { border-right:0 !important; }
            html#spp-profile-set body #set-content table:has(tr.tr32) tr:last-child > td { border-bottom:0 !important; }
            html#spp-profile-set body #set-content table td.spp-tick {
                font-size:15px !important; font-weight:700 !important;
                color:#3ef58c !important; -webkit-text-fill-color:#3ef58c !important;
            }

            html#spp-profile-set body #set-content-wrap:not(:has(.set-content-left)) > div > table {
                border:0 !important; background-color:transparent !important; box-shadow:none !important;
            }

html#spp-profile-set body #set-content:has(#td_face) a.abtn {
    display:inline-flex !important; align-items:center !important; box-sizing:border-box !important;
    height:26px !important; padding:0 12px !important; margin:0 6px 0 0 !important;
    border:1px solid rgba(255,255,255,.14) !important; border-radius:8px !important;
    background-color:rgba(255,255,255,.07) !important; background-image:none !important;
    color:#dfe7f3 !important; -webkit-text-fill-color:#dfe7f3 !important;
    font-family:inherit !important; font-size:12.5px !important; font-weight:500 !important;
    line-height:1 !important; white-space:nowrap !important; cursor:pointer !important;
    text-decoration:none !important;
    transition:background-color .18s ease, border-color .18s ease, color .18s ease !important;
}
html#spp-profile-set body #set-content:has(#td_face) a.abtn:hover {
    background-color:rgba(32,201,151,.18) !important;
    border-color:rgba(32,201,151,.55) !important;
    color:#eafff6 !important; -webkit-text-fill-color:#eafff6 !important;
}
/* ===== SPP-PROFILE-END ===== */
`);
}
GM_addStyle(`
/* ===== SPP-MSGWRITE-BEGIN ===== */



body > div.menu:has(> #buttons.face) > #buttons.face {
    background-color:transparent !important; background-image:none !important;
    border-bottom:1px solid rgba(255,255,255,.09) !important;
    border-radius:8px 8px 0 0 !important;
}
body > div.menu:has(> #buttons.face) > #buttons.face div {
    border-radius:7px !important;
    color:#cfe0f5 !important; -webkit-text-fill-color:#cfe0f5 !important;
    transition:background-color .18s ease !important;
}
body > div.menu:has(> #buttons.face) > #buttons.face div:hover { background-color:rgba(255,255,255,.09) !important; }
body > div.menu:has(> #buttons.face) > #buttons.face div.lian {
    background-color:rgba(32,201,151,.22) !important; background-image:none !important;
    color:#8ef0b8 !important; -webkit-text-fill-color:#8ef0b8 !important;
}
body > div.menu:has(> #buttons.face) > #showface {
    background-color:transparent !important; background-image:none !important;
}
body > div.menu:has(> #buttons.face) > #showface img { border-radius:5px !important; }
body > div.menu:has(> #buttons.face) > #showface img:hover { background-color:rgba(32,201,151,.28) !important; }
body > div.menu:has(> #buttons.face) img[src*="close.gif"] { filter:invert(1) !important; }

/* ===== SPP-MSGWRITE-END ===== */
`);
})();