' + (i + 1) + '. ' + stem.slice(0, 80) + '
' +
'' +
'
请作者喝杯奶茶 ☕
' +
'
' + (DONATE.text || '') + '
' +
'
' +
card(DONATE.alipay, '支付宝') + card(DONATE.wechat, '微信') +
'
' +
'
' +
'
';
document.body.appendChild(m);
const close = () => { try { m.remove(); } catch (e) {} };
m.onclick = (ev) => { if (ev.target === m) close(); };
const cb = m.querySelector('#donateClose');
if (cb) cb.onclick = close;
}
$('donate').onclick = () => showDonate();
/* 导出 / 导入改为控制台命令(面板上不再占位置)
__bank._debug.bankToJSON() 导出
__bank._debug.bankMerge(obj) 导入合并 */
let drag = null;
const onDown = (e) => {
if (!e.target.closest('.h') || e.target.closest('.x')) return;
const r = w.getBoundingClientRect();
drag = { dx: e.clientX - r.left, dy: e.clientY - r.top };
w.style.right = 'auto'; w.style.top = 'auto';
w.style.left = r.left + 'px'; w.style.bottom = 'auto';
w.style.top = (r.top) + 'px';
};
const onMove = (e) => {
if (!drag) return;
w.style.left = Math.max(0, e.clientX - drag.dx) + 'px';
w.style.top = Math.max(0, e.clientY - drag.dy) + 'px';
};
const onUp = () => { drag = null; };
w.addEventListener('mousedown', onDown);
window.addEventListener('mousemove', onMove);
window.addEventListener('mouseup', onUp);
const esc = (s) => String(s).replace(/[&<>"]/g, (c) => ({ '&': '&', '<': '<', '>': '>', '"': '"' }[c]));
const api = {
log(level, msg) {
const d = document.createElement('div');
d.textContent = msg;
d.style.color = level === 'ok' ? '#34d399' : level === 'warn' ? '#fbbf24' : level === 'err' ? '#f87171' : '#8b93a5';
$('log').appendChild(d);
while ($('log').children.length > 40) $('log').removeChild($('log').firstChild);
$('log').scrollTop = $('log').scrollHeight;
},
setState() {
const s = BANK.stats();
$('st').textContent = s.total + ' 条';
const acc = s.accuracy >= 0
? ' · 准确率