色彩调整
All checks were successful
Docker Build & Deploy / Build Docker Image (push) Successful in 22s
Docker Build & Deploy / Deploy to Production (push) Successful in 12s
Docker Build & Deploy / Cleanup Dangling Images (push) Successful in 1s
Docker Build & Deploy / WeChat Notification (push) Successful in 1s

This commit is contained in:
孙诚
2026-01-15 17:12:27 +08:00
parent 82e5c79868
commit 69298c2ffa

View File

@@ -421,42 +421,68 @@ const getProgressColor = (budget) => {
const ratio = Math.min(Math.max(budget.current / budget.limit, 0), 1) const ratio = Math.min(Math.max(budget.current / budget.limit, 0), 1)
let startColor, midColor, endColor // 颜色插值辅助函数
const interpolate = (start, end, t) => {
return Math.round(start + (end - start) * t)
}
// 多段颜色渐变计算
const getGradientColor = (value, stops) => {
// 找到当前值所在的区间
let startStop = stops[0]
let endStop = stops[stops.length - 1]
for (let i = 0; i < stops.length - 1; i++) {
if (value >= stops[i].p && value <= stops[i + 1].p) {
startStop = stops[i]
endStop = stops[i + 1]
break
}
}
// 计算区间内的相对比例
const range = endStop.p - startStop.p
const t = (value - startStop.p) / range
const r = interpolate(startStop.c.r, endStop.c.r, t)
const g = interpolate(startStop.c.g, endStop.c.g, t)
const b = interpolate(startStop.c.b, endStop.c.b, t)
return `rgb(${r}, ${g}, ${b})`
}
let stops
if (budget.category === BudgetCategory.Expense) { if (budget.category === BudgetCategory.Expense) {
// 支出: 绿 -> -> // 支出: 这是一个"安全 -> 警示 -> 危险"的过程
startColor = { r: 82, g: 196, b: 26 } // 绿 // 使用 蓝绿色 -> 黄色 -> 橙红色的渐变,更加自然且具有高级感
midColor = { r: 25, g: 137, b: 250 } // 蓝 stops = [
endColor = { r: 238, g: 10, b: 36 } // 红 { p: 0, c: { r: 64, g: 169, b: 255 } }, // 0% 清新的蓝色 (Safe/Fresh)
} else if (budget.category === BudgetCategory.Income) { { p: 0.4, c: { r: 54, g: 207, b: 201 } }, // 40% 青色过渡
// 收入: 红 -> 蓝 -> 绿 { p: 0.7, c: { r: 250, g: 173, b: 20 } }, // 70% 温暖的黄色 (Warning)
startColor = { r: 238, g: 10, b: 36 } // { p: 1, c: { r: 255, g: 77, b: 79 } } // 100% 柔和的红色 (Danger)
midColor = { r: 25, g: 137, b: 250 } // 蓝 ]
endColor = { r: 82, g: 196, b: 26 } // 绿
} else { } else {
// 存款: -> -> 绿 // 收入/存款: 这是一个"开始 -> 积累 -> 达成"的过程
startColor = { r: 238, g: 10, b: 36 } // 红 // 采用 红色(未开始) -> 橙色(进行中) -> 绿色(达成) 的经典逻辑,但调整了色值使其更现代
midColor = { r: 25, g: 137, b: 250 } // 蓝 // stops = [
endColor = { r: 82, g: 196, b: 26 } // 绿 // { p: 0, c: { r: 255, g: 120, b: 117 } }, // 0% 淡红 (Start)
// { p: 0.3, c: { r: 255, g: 197, b: 61 } }, // 30% 金黄 (Progress)
// { p: 0.7, c: { r: 115, g: 209, b: 61 } }, // 70% 草绿 (Good)
// { p: 1, c: { r: 35, g: 120, b: 4 } } // 100% 深绿 (Excellent)
// ]
// 如果用户喜欢"红->蓝"的逻辑,可以尝试这种"红->白->蓝"的冷暖过渡:
stops = [
{ p: 0, c: { r: 245, g: 34, b: 45 } }, // 深红
{ p: 0.45, c: { r: 255, g: 204, b: 204 } }, // 浅红
{ p: 0.5, c: { r: 240, g: 242, b: 245 } }, // 中性灰白
{ p: 0.55, c: { r: 186, g: 231, b: 255 } }, // 浅蓝
{ p: 1, c: { r: 24, g: 144, b: 255 } } // 深蓝
]
} }
let r, g, b return getGradientColor(ratio, stops)
if (ratio < 0.5) {
// 从start到mid
const t = ratio * 2
r = Math.round(startColor.r + (midColor.r - startColor.r) * t)
g = Math.round(startColor.g + (midColor.g - startColor.g) * t)
b = Math.round(startColor.b + (midColor.b - startColor.b) * t)
} else {
// 从mid到end
const t = (ratio - 0.5) * 2
r = Math.round(midColor.r + (endColor.r - midColor.r) * t)
g = Math.round(midColor.g + (endColor.g - midColor.g) * t)
b = Math.round(midColor.b + (endColor.b - midColor.b) * t)
}
return `rgb(${r}, ${g}, ${b})`
} }
const showArchiveSummary = async () => { const showArchiveSummary = async () => {