Files
Profeto/frontend/tailwind.config.js
T
shangfangjian 2cfc9ccc0f refactor(ui): 合并双组件库为 components/ui 基元层,设计令牌变量化,报头字体子集自托管
- 新建 components/ui/(Button/Input/Select/Modal/Tabs/Spinner/Skeleton 等),变体用联合类型约束,根治幻影变体
- admin/components.tsx 与 matches/ui.tsx 改为再导出壳,消除 Spinner 三份重复
- 日期工具收口到 lib/date.ts,滚动监听收口到 lib/useScroll.ts
- index.css 引入 :root RGB 三元组令牌,tailwind.config 接 <alpha-value>(修复透明度修饰符静默失效)
- 刘建毛草 5MB 全字库(jsDelivr 未锁版) → 1KB 自托管子集(仅「先知」二字,unicode-range 限定)
2026-09-22 23:44:46 +08:00

130 lines
4.4 KiB
JavaScript

/** @type {import('tailwindcss').Config} */
export default {
content: ['./index.html', './src/**/*.{ts,tsx}'],
theme: {
extend: {
colors: {
/*
颜色来源说明:
纸白/墨色/印报红三组令牌的**权威定义在 src/index.css 的 :root**
(CSS 自定义属性,值为 RGB 三元组)。这里引用同一份变量,使
工具类(bg-press)与手写 CSS(outline: var(--press))不可能漂移。
此前两处各自硬编码十六进制,改色时必须记得改两边 ——
index.css 里就有 3 处漏网(焦点环/报头粗线/毛笔字),保留了旧色。
<alpha-value> 占位符不可省略:它让 Tailwind 的透明度修饰符
(bg-press-wash/60)能正确注入 alpha。缺了它,带 /60 的类名会
静默不生成任何 CSS。
*/
// 纸白:微暖底色,像新闻纸而不是纯白画布
paper: {
50: 'rgb(var(--paper-50) / <alpha-value>)',
100: 'rgb(var(--paper-100) / <alpha-value>)',
200: 'rgb(var(--paper-200) / <alpha-value>)',
300: 'rgb(var(--paper-300) / <alpha-value>)',
},
// 墨色:暖黑灰阶,替代冷调 slate
// 注:50/100/600/800 尚未提升为 CSS 变量(仅 CSS 侧未用到),
// 保持字面量直至有第二个消费方,避免过早抽象。
ink: {
50: '#FAF9F7',
100: '#F0EEE9',
200: 'rgb(var(--ink-200) / <alpha-value>)',
300: 'rgb(var(--ink-300) / <alpha-value>)',
400: 'rgb(var(--ink-400) / <alpha-value>)',
500: 'rgb(var(--ink-500) / <alpha-value>)',
600: '#524C42',
700: 'rgb(var(--ink-700) / <alpha-value>)',
800: '#282420',
900: 'rgb(var(--ink-900) / <alpha-value>)',
},
// 印报红:全站唯一强调色,克制使用
press: {
DEFAULT: 'rgb(var(--press) / <alpha-value>)',
dark: 'rgb(var(--press-dark) / <alpha-value>)',
wash: 'rgb(var(--press-wash) / <alpha-value>)',
},
// ── 语义状态色:成功/警告/负面 ──
// 设计约束:纸底 #FDFCF8 上文字级(600/700)对比度 ≥ 4.5:1(WCAG AA),
// 点/条级(500) ≥ 3:1;色相降饱和以贴近墨色印刷感,不使用 tailwind 原色。
ok: {
50: '#EAF3ED',
100: '#D5E8DC',
300: '#A3C9B1',
500: '#43925F',
600: '#2E7A4C',
700: '#1F6B45',
},
warn: {
50: '#FBF3E4',
100: '#F5E5C8',
300: '#E2C48E',
500: '#D97706',
600: '#A15C0B',
700: '#8F5109',
},
bad: {
50: '#FAEDED',
100: '#F6E3E3',
300: '#E4AFAF',
500: '#C24A4A',
600: '#A83B3B',
700: '#8F3030',
},
// ── 赛制分区色:欧战 / 附加赛 ──
// 与 ok/warn/bad 同一套降饱和逻辑,替代此前的 sky/orange 原生色
// (原生色冷调高饱和,与纸色暖灰底冲突)。
// 对比度:#FDFCF8 纸底上 700 级 ≥ 4.5:1,100 级仅作底色不与文字对比。
euro: {
50: '#EAF0F2',
100: '#DCE6EA',
300: '#A9C0C9',
500: '#5B7C8A',
600: '#476571',
700: '#3A5460',
},
playoff: {
50: '#F8EEDF',
100: '#F2E0C6',
300: '#DDBE8A',
500: '#B87A2E',
600: '#966124',
700: '#7C511E',
},
},
fontFamily: {
// 毛体草书(国内 CDN)+ 粗楷体回退
brush: ['"Liu Jian Mao Cao"', '"KaiTi"', '"STKaiti"', '"Kaiti SC"', '"楷体"', '"Songti SC"', 'serif'],
// 标题与比分:宋体血统,报纸版面的骨架
serif: [
'Georgia',
'"Times New Roman"',
'"Songti SC"',
'STSong',
'SimSun',
'"Noto Serif CJK SC"',
'serif',
],
// 正文:中文黑体栈
sans: [
'"PingFang SC"',
'"Hiragino Sans GB"',
'"Microsoft YaHei"',
'"Noto Sans CJK SC"',
'sans-serif',
],
mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Consolas', 'monospace'],
},
fontSize: {
'2xs': ['11px', { lineHeight: '16px' }],
},
// 报纸硬阴影:实心偏移、无模糊,替代此前内联的一次性写法
boxShadow: {
print: '4px 4px 0 0 rgb(0 0 0 / 0.06)',
},
},
},
plugins: [],
}