/** * 管理端调色板常量(TS 侧)。 * * 为什么需要这个文件: * 部分模板用 `:style="{ backgroundColor: stage.color + '15' }"` 把 6 位 hex 拼成 * 8 位带 alpha 的颜色('#409EFF' + '15' → '#409EFF15',即 8% 不透明度)。 * 这类位置**不能**用 CSS var —— `'var(--x)' + '15'` 是无效值,浏览器会整条丢弃。 * 于是「色值只有一处事实源」这条规则在 TS 侧会漏。本文件补上这个缺口。 * * 单一事实源约定: * 键名就是 src/theme/index.css 里的 var 名,值必须与之一致。 * 门控脚本 scripts/lint-admin-tokens.mjs 会逐项比对,任一侧改了而另一侧没改即失败。 */ export const TOKEN_HEX: Record = { '--color-primary': '#F45F68', '--color-primary-strong': '#C0414A', '--color-primary-solid': '#C84A53', '--color-success': '#2E9B68', '--color-success-strong': '#1F7A4F', '--color-warning': '#E59A32', '--color-warning-strong': '#8F5D0F', '--color-danger': '#D94A4A', '--color-danger-strong': '#B8353A', '--color-info': '#4A7CD4', '--color-info-strong': '#3A63B0', '--color-purple': '#8B63BC', '--color-purple-strong': '#6B47A0', '--color-neutral': '#8A9099', '--color-neutral-strong': '#656C79', '--color-text-primary': '#1F2328', '--color-text-secondary': '#555555', '--color-text-tertiary': '#676E7B', '--color-bg-page': '#F7F9FB', '--color-border': '#E4E7EB', } /** * 取 token 的 hex 字面量。用于 :style 绑定(含 hex 拼接透明度的场景)。 * @example token('--color-success') // '#2E9B68' */ export function token(name: string): string { const value = TOKEN_HEX[name] if (!value) throw new Error(`未登记的 token: ${name}(请先加入 TOKEN_HEX 并同步 theme/index.css)`) return value } /** * 生成带 alpha 的 8 位 hex。alpha 传 2 位十六进制('15' = 21/255 ≈ 8%)。 * 与 `color + '15'` 等价,但把「必须 6 位 hex」这个约束显式化,避免误把 var() 传进来。 */ export function tint(hex: string, alphaHex: string): string { if (!/^#[0-9a-fA-F]{6}$/.test(hex)) { throw new Error(`tint() 需要 6 位 hex(不能是 var() 或 3/8 位 hex):${hex}`) } return `${hex}${alphaHex}` } /** 指标卡 / 待办项的色调组,与 theme/index.css 的 --tone-* 一一对应。 */ export interface Tone { /** 图标与图形用的鲜亮色 */ vivid: string /** 文字用的可读色(压 soft 底 ≥4.5:1) */ ink: string /** 浅底 */ soft: string } export const TONES: Record = { rose: { vivid: '#F45F68', ink: '#C0414A', soft: '#FFF0F1' }, amber: { vivid: '#E59A32', ink: '#8F5D0F', soft: '#FFF6E6' }, blue: { vivid: '#4A7CD4', ink: '#3A63B0', soft: '#EEF5FF' }, green: { vivid: '#2E9B68', ink: '#1F7A4F', soft: '#EDF8F1' }, purple: { vivid: '#8B63BC', ink: '#6B47A0', soft: '#F4EFFF' }, slate: { vivid: '#8A9099', ink: '#656C79', soft: '#F4F5F7' }, red: { vivid: '#D94A4A', ink: '#B8353A', soft: '#FFF6F6' }, }