// 甄房换肤 · Electron 桌面外壳 + docs 独立工具页 // 注意:这些文件是「深色外壳」上下文,同一个旧色在这里的含义与 WEB 不同 —— // 例如 #FFB31A 在 WEB 是警告色(→ #E76500),在外壳里是「品牌浅色」(→ #4D9BF6), // 所以不能复用 WEB 的映射表,必须单独一套。 // 用法: node _design-test/apply-electron-colors.js (预演) // node _design-test/apply-electron-colors.js --write (真写) const fs = require('fs'); const WRITE = process.argv.includes('--write'); const ZF = 'e:/KF_7/ZhenOS-ZF'; const FILES = [ `${ZF}/xiaohuju/resources/splash/splash.html`, `${ZF}/xiaohuju/resources/offline/offline.html`, `${ZF}/xiaohuju/resources/blocked/blocked.html`, `${ZF}/xiaohuju/src/common/constants.js`, `${ZF}/xiaohuju/src/preload/titlebar.js`, `${ZF}/docs/财务策算测算器-v2.html`, `${ZF}/docs/财务策算测算器.html` ]; // 十六进制(大小写不敏感) const HEX = [ ['#ff822d', '#0070F2'], // blocked.html 里的品牌亮色 ['#ff7a1a', '#0070F2'], // 品牌亮色 → 交互蓝 ['#ff9a4d', '#4D9BF6'], ['#ff8a3d', '#4D9BF6'], ['#ffb31a', '#4D9BF6'], // 外壳里的「品牌浅色」→ 浅蓝(非警告橙) ['#ffc48a', '#A6CFFF'], ['#1a130d', '#071527'], // 最深底 → 甄房最深墨蓝 ['#2e241a', '#0C2340'], ['#241c14', '#0A1D35'], // 标题栏底 ['#33281d', '#0C2340'], ['#f1e4d2', '#EAF0F6'], // 标题栏符号(暖白 → 冷白) ['#f6ead8', '#F0F4F8'], ['#2a2118', '#131E29'], ['#3a322a', '#556B82'], ['#756a5e', '#5F7590'], ['#d9481c', '#AA0808'], ['#2e9e5b', '#256F3A'], ['#ffb31a', '#4D9BF6'] ]; // rgb()/rgba() 三元组(保留 rgb/rgba 前缀与后面的 alpha) const RGB = [ [/255,\s*122,\s*26/g, '0, 112, 242'], [/255,\s*130,\s*45/g, '0, 112, 242'], [/255,\s*179,\s*26/g, '77, 155, 246'], [/241,\s*228,\s*210/g, '240, 244, 248'], // 暖白带透明 [/58,\s*50,\s*42/g, '12, 35, 64'], [/26,\s*19,\s*13/g, '7, 21, 39'], [/42,\s*33,\s*24/g, '19, 30, 41'], [/51,\s*40,\s*29/g, '12, 35, 64'] ]; let grand = 0, touched = 0; for (const f of FILES) { if (!fs.existsSync(f)) { console.log(' 跳过(不存在): ' + f.split('/').pop()); continue; } let txt = fs.readFileSync(f, 'utf8'); const orig = txt; const hits = []; for (const [from, to] of HEX) { const re = new RegExp(from, 'gi'); const n = (txt.match(re) || []).length; if (n) { txt = txt.replace(re, to); hits.push(from + '→' + to + ' ×' + n); grand += n; } } for (const [re, to] of RGB) { const n = (txt.match(re) || []).length; if (n) { txt = txt.replace(re, to); hits.push('rgb元组 ×' + n); grand += n; } } if (txt !== orig) { touched++; console.log(' ' + f.replace(ZF + '/', '') + '\n ' + hits.join(' ')); } if (WRITE && txt !== orig) fs.writeFileSync(f, txt); } console.log('\n涉及 ' + touched + ' 个文件 / 替换 ' + grand + ' 处 ' + (WRITE ? '(已写入)' : '(预演,加 --write 生效)'));