|
1 | 1 | /** @type {import('tailwindcss').Config} */ |
| 2 | + |
| 3 | +/** |
| 4 | + * 令牌色 + 透明度修饰符支持(如 bg-bg-elevated/90、border-border/40)。 |
| 5 | + * Tailwind v3 无法对纯 var() 颜色应用 /alpha 修饰符(此前这些类静默丢失, |
| 6 | + * 导致明亮主题下弹窗/面板背景全透明),用 color-mix 按透明度混入 transparent |
| 7 | + * 实现(Chromium 111+ / Electron 35 支持)。 |
| 8 | + */ |
| 9 | +const tokenColor = (variable) => ({ opacityValue }) => |
| 10 | + opacityValue === undefined |
| 11 | + ? `var(${variable})` |
| 12 | + : `color-mix(in srgb, var(${variable}) calc(${opacityValue} * 100%), transparent)`; |
| 13 | + |
2 | 14 | module.exports = { |
3 | 15 | content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], |
4 | 16 | darkMode: ['selector', '[data-theme="dark"]'], |
5 | 17 | theme: { |
6 | 18 | extend: { |
7 | 19 | colors: { |
8 | 20 | brand: { |
9 | | - 50: 'var(--kb-brand-50)', |
10 | | - 100: 'var(--kb-brand-100)', |
11 | | - 200: 'var(--kb-brand-200)', |
12 | | - 300: 'var(--kb-brand-300)', |
13 | | - 400: 'var(--kb-brand-400)', |
14 | | - 500: 'var(--kb-brand-500)', |
15 | | - 600: 'var(--kb-brand-600)', |
16 | | - 700: 'var(--kb-brand-700)', |
17 | | - 800: 'var(--kb-brand-800)', |
18 | | - 900: 'var(--kb-brand-900)', |
| 21 | + 50: tokenColor('--kb-brand-50'), |
| 22 | + 100: tokenColor('--kb-brand-100'), |
| 23 | + 200: tokenColor('--kb-brand-200'), |
| 24 | + 300: tokenColor('--kb-brand-300'), |
| 25 | + 400: tokenColor('--kb-brand-400'), |
| 26 | + 500: tokenColor('--kb-brand-500'), |
| 27 | + 600: tokenColor('--kb-brand-600'), |
| 28 | + 700: tokenColor('--kb-brand-700'), |
| 29 | + 800: tokenColor('--kb-brand-800'), |
| 30 | + 900: tokenColor('--kb-brand-900'), |
19 | 31 | }, |
20 | 32 | accent: { |
21 | | - DEFAULT: 'var(--accent)', |
22 | | - foreground: 'var(--accent-foreground)', |
23 | | - 50: 'var(--kb-accent-50)', |
24 | | - 100: 'var(--kb-accent-100)', |
25 | | - 200: 'var(--kb-accent-200)', |
26 | | - 300: 'var(--kb-accent-300)', |
27 | | - 400: 'var(--kb-accent-400)', |
28 | | - 500: 'var(--kb-accent-500)', |
29 | | - 600: 'var(--kb-accent-600)', |
30 | | - 700: 'var(--kb-accent-700)', |
31 | | - 800: 'var(--kb-accent-800)', |
32 | | - 900: 'var(--kb-accent-900)', |
| 33 | + DEFAULT: tokenColor('--accent'), |
| 34 | + foreground: tokenColor('--accent-foreground'), |
| 35 | + 50: tokenColor('--kb-accent-50'), |
| 36 | + 100: tokenColor('--kb-accent-100'), |
| 37 | + 200: tokenColor('--kb-accent-200'), |
| 38 | + 300: tokenColor('--kb-accent-300'), |
| 39 | + 400: tokenColor('--kb-accent-400'), |
| 40 | + 500: tokenColor('--kb-accent-500'), |
| 41 | + 600: tokenColor('--kb-accent-600'), |
| 42 | + 700: tokenColor('--kb-accent-700'), |
| 43 | + 800: tokenColor('--kb-accent-800'), |
| 44 | + 900: tokenColor('--kb-accent-900'), |
33 | 45 | }, |
34 | 46 | pomodoro: { DEFAULT: '#5B8A72', light: '#AAC9B5' }, |
35 | 47 | note: { DEFAULT: '#6B9BD2', light: '#ADD6FF' }, |
36 | 48 | flashcard: { DEFAULT: '#7BC4B8', light: '#B8E0D8' }, |
37 | 49 | feynman: { DEFAULT: '#C4956A', light: '#DEBB92' }, |
38 | 50 | classroom: { DEFAULT: '#14B8A6', light: '#5EEAD4' }, |
39 | 51 | /* 深海静谧功能色 */ |
40 | | - focus: { DEFAULT: 'var(--kb-focus-blue)' }, |
41 | | - amber: { DEFAULT: 'var(--kb-amber)' }, |
42 | | - moss: { DEFAULT: 'var(--kb-moss-green)' }, |
43 | | - cyber: { DEFAULT: 'var(--kb-cyber-cyan)' }, |
44 | | - 'stone-purple': 'var(--kb-stone-purple)', |
| 52 | + focus: { DEFAULT: tokenColor('--kb-focus-blue') }, |
| 53 | + amber: { DEFAULT: tokenColor('--kb-amber') }, |
| 54 | + moss: { DEFAULT: tokenColor('--kb-moss-green') }, |
| 55 | + cyber: { DEFAULT: tokenColor('--kb-cyber-cyan') }, |
| 56 | + 'stone-purple': tokenColor('--kb-stone-purple'), |
45 | 57 | bg: { |
46 | | - primary: 'var(--kb-bg-primary)', |
47 | | - secondary: 'var(--kb-bg-secondary)', |
48 | | - tertiary: 'var(--kb-bg-tertiary)', |
49 | | - elevated: 'var(--kb-bg-elevated)', |
| 58 | + primary: tokenColor('--kb-bg-primary'), |
| 59 | + secondary: tokenColor('--kb-bg-secondary'), |
| 60 | + tertiary: tokenColor('--kb-bg-tertiary'), |
| 61 | + elevated: tokenColor('--kb-bg-elevated'), |
50 | 62 | }, |
51 | 63 | text: { |
52 | | - primary: 'var(--kb-text-primary)', |
53 | | - secondary: 'var(--kb-text-secondary)', |
54 | | - tertiary: 'var(--kb-text-tertiary)', |
55 | | - inverse: 'var(--kb-text-inverse)', |
| 64 | + primary: tokenColor('--kb-text-primary'), |
| 65 | + secondary: tokenColor('--kb-text-secondary'), |
| 66 | + tertiary: tokenColor('--kb-text-tertiary'), |
| 67 | + inverse: tokenColor('--kb-text-inverse'), |
56 | 68 | }, |
57 | 69 | border: { |
58 | | - DEFAULT: 'var(--kb-border-default)', |
59 | | - strong: 'var(--kb-border-strong)', |
| 70 | + DEFAULT: tokenColor('--kb-border-default'), |
| 71 | + strong: tokenColor('--kb-border-strong'), |
60 | 72 | }, |
61 | 73 | semantic: { |
62 | | - success: 'var(--kb-color-success)', |
63 | | - warning: 'var(--kb-color-warning)', |
64 | | - error: 'var(--kb-color-error)', |
65 | | - info: 'var(--kb-color-info)', |
| 74 | + success: tokenColor('--kb-color-success'), |
| 75 | + warning: tokenColor('--kb-color-warning'), |
| 76 | + error: tokenColor('--kb-color-error'), |
| 77 | + info: tokenColor('--kb-color-info'), |
66 | 78 | }, |
67 | 79 | // shadcn/ui 兼容色 |
68 | | - background: 'var(--background)', |
69 | | - foreground: 'var(--foreground)', |
| 80 | + background: tokenColor('--background'), |
| 81 | + foreground: tokenColor('--foreground'), |
70 | 82 | card: { |
71 | | - DEFAULT: 'var(--card)', |
72 | | - foreground: 'var(--card-foreground)', |
| 83 | + DEFAULT: tokenColor('--card'), |
| 84 | + foreground: tokenColor('--card-foreground'), |
73 | 85 | }, |
74 | 86 | popover: { |
75 | | - DEFAULT: 'var(--popover)', |
76 | | - foreground: 'var(--popover-foreground)', |
| 87 | + DEFAULT: tokenColor('--popover'), |
| 88 | + foreground: tokenColor('--popover-foreground'), |
77 | 89 | }, |
78 | 90 | primary: { |
79 | | - DEFAULT: 'var(--primary)', |
80 | | - foreground: 'var(--primary-foreground)', |
| 91 | + DEFAULT: tokenColor('--primary'), |
| 92 | + foreground: tokenColor('--primary-foreground'), |
81 | 93 | }, |
82 | 94 | secondary: { |
83 | | - DEFAULT: 'var(--secondary)', |
84 | | - foreground: 'var(--secondary-foreground)', |
| 95 | + DEFAULT: tokenColor('--secondary'), |
| 96 | + foreground: tokenColor('--secondary-foreground'), |
85 | 97 | }, |
86 | 98 | muted: { |
87 | | - DEFAULT: 'var(--muted)', |
88 | | - foreground: 'var(--muted-foreground)', |
| 99 | + DEFAULT: tokenColor('--muted'), |
| 100 | + foreground: tokenColor('--muted-foreground'), |
89 | 101 | }, |
90 | 102 | destructive: { |
91 | | - DEFAULT: 'var(--destructive)', |
92 | | - foreground: 'var(--destructive-foreground)', |
| 103 | + DEFAULT: tokenColor('--destructive'), |
| 104 | + foreground: tokenColor('--destructive-foreground'), |
93 | 105 | }, |
94 | | - input: 'var(--input)', |
95 | | - ring: 'var(--ring)', |
| 106 | + input: tokenColor('--input'), |
| 107 | + ring: tokenColor('--ring'), |
96 | 108 | }, |
97 | 109 | fontFamily: { |
98 | 110 | sans: ['var(--kb-font-sans)'], |
|
0 commit comments