sweep-tokens.mjs 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // 票 15 实施:组件内主题色字面量 → var() 清退(批次 2 的机械替换层)
  2. // 规则:面板域内「有 token 槽位的色」全部改写;无槽位的装饰渐变/一次性色保留(规格 03 允许)。
  3. import { readFileSync, writeFileSync, readdirSync, statSync } from 'node:fs'
  4. import { join, relative } from 'node:path'
  5. const root = 'src/modules/cockpit'
  6. const files = []
  7. ;(function walk(dir) {
  8. for (const e of readdirSync(dir)) {
  9. const p = join(dir, e)
  10. if (statSync(p).isDirectory()) walk(p)
  11. else if (/\.(vue|js|css)$/.test(e)) files.push(p)
  12. }
  13. })(root)
  14. // A. var() fallback 值同步为新值(token 名不变)
  15. const FALLBACK = [
  16. [/#ff4d5e/g, '#ff3b52'],
  17. [/#ffa63d/g, '#ffb020'],
  18. [/#4fd8ff/g, '#01abea'],
  19. [/#35e39a/g, '#27d17a'],
  20. [/#6d92ae/g, '#5680b0'],
  21. [/#e6f5ff/g, '#d7ecff'],
  22. [/#a8cbe2/g, '#88b7e8'],
  23. [/#1b93cf/g, '#009de9'],
  24. [/rgba\(12,\s*48,\s*86,\s*0\.58\)/g, 'rgba(2, 9, 27, 0.28)'],
  25. [/rgba\(3,\s*14,\s*28,\s*0\.9\)/g, 'rgba(0, 15, 52, 0.38)'],
  26. [/rgba\(58,\s*170,\s*226,\s*0\.3\)/g, 'rgba(1, 171, 234, 0.35)'],
  27. [/rgba\(96,\s*220,\s*255,\s*0\.85\)/g, '#01abea'],
  28. ]
  29. // B. 裸字面量 → var() 或设计稿同族色
  30. const BARE = [
  31. // 面板四角 SVG 描边(URL 编码):与 --panel-line-hi 同色
  32. [/%234fd8ff/g, '%2301abea'],
  33. // 标题/数值亮色 → --text(设计稿面板标题 #d7ecff;KPI 值随后单独提到 --text-strong)
  34. [/color:\s*#eaf9ff\b/g, 'color: var(--text)'],
  35. // 纯白强调 → --text-strong(新增槽位;设计稿选中态/KPI 数值 #ffffff)
  36. [/color:\s*#fff\b/g, 'color: var(--text-strong)'],
  37. [/color:\s*#ffffff\b/g, 'color: var(--text-strong)'],
  38. // 时钟亮色 → --text-strong;chip/状态钮正文蓝 → --text-2
  39. [/color:\s*#d7f1ff\b/g, 'color: var(--text-strong)'],
  40. [/color:\s*#9dc2d9\b/g, 'color: var(--text-2)'],
  41. [/color:\s*#b9d8e8\b/g, 'color: var(--text-2)'],
  42. // 一级模式未选中文字:设计稿 #00b8ff = --cyan-hi
  43. [/color:\s*#a9cde4\b/g, 'color: var(--cyan-hi)'],
  44. // 面板竖条渐变顶色 → --cyan-hi
  45. [/#b6f0ff/g, 'var(--cyan-hi)'],
  46. // 面板渐变中停 / 表头渐变基色 → 新面板 token
  47. [/rgba\(6,\s*24,\s*44,\s*0\.82\)/g, 'var(--panel-mid, rgba(0, 53, 156, 0.2))'],
  48. [/rgba\(24,\s*96,\s*152,\s*0\.55\)/g, 'var(--panel-mid, rgba(0, 53, 156, 0.2))'],
  49. [/rgba\(12,\s*52,\s*90,\s*0\.3\)/g, 'var(--panel-bot, rgba(0, 15, 52, 0.38))'],
  50. [/rgba\(34,\s*116,\s*176,\s*0\.6\)/g, 'rgba(1, 171, 234, 0.6)'],
  51. [/rgba\(16,\s*66,\s*110,\s*0\.34\)/g, 'rgba(0, 15, 52, 0.34)'],
  52. [/rgba\(90,\s*200,\s*255,\s*(0\.1|0\.14)\)/g, (m, a) => `rgba(1, 171, 234, ${a})`],
  53. // 主题色族 rgba(含装饰辉光):换到设计稿同族 RGB
  54. [/rgba\(58,\s*170,\s*226,\s*(0\.\d+)\)/g, (m, a) => `rgba(1, 171, 234, ${a})`],
  55. [/rgba\(79,\s*216,\s*255,\s*(0\.\d+)\)/g, (m, a) => `rgba(1, 171, 234, ${a})`],
  56. [/rgba\(96,\s*220,\s*255,\s*(0\.\d+)\)/g, (m, a) => `rgba(1, 171, 234, ${a})`],
  57. [/rgba\(130,\s*225,\s*255,\s*(0\.\d+)\)/g, (m, a) => `rgba(1, 171, 234, ${a})`],
  58. [/rgba\(120,\s*220,\s*255,\s*(0\.\d+)\)/g, (m, a) => `rgba(1, 171, 234, ${a})`],
  59. [/rgba\(140,\s*235,\s*255,\s*(0\.\d+)\)/g, (m, a) => `rgba(0, 184, 255, ${a})`],
  60. [/rgba\(255,\s*166,\s*61,\s*(0\.\d+)\)/g, (m, a) => `rgba(255, 176, 32, ${a})`],
  61. [/rgba\(255,\s*200,\s*130,\s*(0\.\d+)\)/g, (m, a) => `rgba(255, 176, 32, ${a})`],
  62. [/rgba\(255,\s*77,\s*94,\s*(0\.\d+)\)/g, (m, a) => `rgba(255, 59, 82, ${a})`],
  63. [/rgba\(109,\s*146,\s*174,\s*(0\.\d+)\)/g, (m, a) => `rgba(86, 128, 176, ${a})`],
  64. ]
  65. let total = 0
  66. const report = []
  67. for (const f of files) {
  68. const rel = relative('.', f)
  69. const src = readFileSync(f, 'utf8')
  70. let out = src
  71. let count = 0
  72. for (const [re, rep] of [...FALLBACK, ...BARE]) {
  73. out = out.replace(re, (m, ...args) => {
  74. count += 1
  75. return typeof rep === 'function' ? rep(m, ...args) : rep
  76. })
  77. }
  78. if (count) {
  79. writeFileSync(f, out)
  80. report.push(`${rel}: ${count}`)
  81. total += count
  82. }
  83. }
  84. console.log(report.join('\n'))
  85. console.log(`\n合计替换 ${total} 处`)