Skip to content

Commit 1d1b148

Browse files
committed
refactor(projects): combine theme tokens and theme settings. close #379
1 parent 958d0ba commit 1d1b148

File tree

7 files changed

+77
-34
lines changed

7 files changed

+77
-34
lines changed

src/components/common/dark-mode-container.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ defineProps<Props>();
99
</script>
1010

1111
<template>
12-
<div class="bg-container text-base_text transition-300" :class="{ 'bg-inverted text-#1f1f1f': inverted }">
12+
<div class="bg-container text-base-text transition-300" :class="{ 'bg-inverted text-#1f1f1f': inverted }">
1313
<slot></slot>
1414
</div>
1515
</template>

src/layouts/modules/theme-drawer/components/setting-item.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ defineProps<Props>();
1414
<template>
1515
<div class="w-full flex-y-center justify-between">
1616
<div>
17-
<span class="pr-8px text-base_text">{{ label }}</span>
17+
<span class="pr-8px text-base-text">{{ label }}</span>
1818
<slot name="suffix"></slot>
1919
</div>
2020
<slot></slot>

src/store/modules/theme/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,11 @@ export const useThemeStore = defineStore(SetupStoreId.Theme, () => {
125125

126126
/** Setup theme vars to html */
127127
function setupThemeVarsToHtml() {
128-
const { themeTokens, darkThemeTokens } = createThemeToken(themeColors.value, settings.value.recommendColor);
128+
const { themeTokens, darkThemeTokens } = createThemeToken(
129+
themeColors.value,
130+
settings.value.tokens,
131+
settings.value.recommendColor
132+
);
129133
addThemeVarsToHtml(themeTokens, darkThemeTokens);
130134
}
131135

src/store/modules/theme/shared.ts

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,39 +30,40 @@ export function initThemeSettings() {
3030
}
3131

3232
/**
33-
* Create theme token
33+
* create theme token css vars value by theme settings
3434
*
3535
* @param colors Theme colors
36+
* @param tokens Theme setting tokens
3637
* @param [recommended=false] Use recommended color. Default is `false`
3738
*/
38-
export function createThemeToken(colors: App.Theme.ThemeColor, recommended = false) {
39+
export function createThemeToken(
40+
colors: App.Theme.ThemeColor,
41+
tokens?: App.Theme.ThemeSetting['tokens'],
42+
recommended = false
43+
) {
3944
const paletteColors = createThemePaletteColors(colors, recommended);
4045

41-
const themeTokens: App.Theme.ThemeToken = {
46+
const { light, dark } = tokens || themeSettings.tokens;
47+
48+
const themeTokens: App.Theme.ThemeTokenCSSVars = {
4249
colors: {
4350
...paletteColors,
4451
nprogress: paletteColors.primary,
45-
container: 'rgb(255, 255, 255)',
46-
layout: 'rgb(247, 250, 252)',
47-
inverted: 'rgb(0, 20, 40)',
48-
base_text: 'rgb(31, 31, 31)'
52+
...light.colors
4953
},
5054
boxShadow: {
51-
header: '0 1px 2px rgb(0, 21, 41, 0.08)',
52-
sider: '2px 0 8px 0 rgb(29, 35, 41, 0.05)',
53-
tab: '0 1px 2px rgb(0, 21, 41, 0.08)'
55+
...light.boxShadow
5456
}
5557
};
5658

57-
const darkThemeTokens: App.Theme.ThemeToken = {
59+
const darkThemeTokens: App.Theme.ThemeTokenCSSVars = {
5860
colors: {
5961
...themeTokens.colors,
60-
container: 'rgb(28, 28, 28)',
61-
layout: 'rgb(18, 18, 18)',
62-
base_text: 'rgb(224, 224, 224)'
62+
...dark?.colors
6363
},
6464
boxShadow: {
65-
...themeTokens.boxShadow
65+
...themeTokens.boxShadow,
66+
...dark?.boxShadow
6667
}
6768
};
6869

src/theme/settings.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,28 @@ export const themeSettings: App.Theme.ThemeSetting = {
4646
fixed: false,
4747
height: 48,
4848
right: true
49+
},
50+
tokens: {
51+
light: {
52+
colors: {
53+
container: 'rgb(255, 255, 255)',
54+
layout: 'rgb(247, 250, 252)',
55+
inverted: 'rgb(0, 20, 40)',
56+
'base-text': 'rgb(31, 31, 31)'
57+
},
58+
boxShadow: {
59+
header: '0 1px 2px rgb(0, 21, 41, 0.08)',
60+
sider: '2px 0 8px 0 rgb(29, 35, 41, 0.05)',
61+
tab: '0 1px 2px rgb(0, 21, 41, 0.08)'
62+
}
63+
},
64+
dark: {
65+
colors: {
66+
container: 'rgb(28, 28, 28)',
67+
layout: 'rgb(18, 18, 18)',
68+
'base-text': 'rgb(224, 224, 224)'
69+
}
70+
}
4971
}
5072
};
5173

src/theme/vars.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ function createColorPaletteVars() {
1818
const colorPaletteVars = createColorPaletteVars();
1919

2020
/** Theme vars */
21-
export const themeVars: App.Theme.ThemeToken = {
21+
export const themeVars: App.Theme.ThemeTokenCSSVars = {
2222
colors: {
2323
...colorPaletteVars,
2424
nprogress: 'rgb(var(--nprogress-color))',
2525
container: 'rgb(var(--container-bg-color))',
2626
layout: 'rgb(var(--layout-bg-color))',
2727
inverted: 'rgb(var(--inverted-bg-color))',
28-
base_text: 'rgb(var(--base-text-color))'
28+
'base-text': 'rgb(var(--base-text-color))'
2929
},
3030
boxShadow: {
3131
header: 'var(--header-box-shadow)',

src/typings/app.d.ts

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,6 @@ declare namespace App {
44
namespace Theme {
55
type ColorPaletteNumber = import('@sa/color').ColorPaletteNumber;
66

7-
/** Theme token */
8-
type ThemeToken = {
9-
colors: ThemeTokenColor;
10-
boxShadow: {
11-
header: string;
12-
sider: string;
13-
tab: string;
14-
};
15-
};
16-
177
/** Theme setting */
188
interface ThemeSetting {
199
/** Theme scheme */
@@ -97,6 +87,13 @@ declare namespace App {
9787
/** Whether float the footer to the right when the layout is 'horizontal-mix' */
9888
right: boolean;
9989
};
90+
/** define some theme settings tokens, will transform to css variables */
91+
tokens: {
92+
light: ThemeSettingToken;
93+
dark?: {
94+
[K in keyof ThemeSettingToken]?: Partial<ThemeSettingToken[K]>;
95+
};
96+
};
10097
}
10198

10299
interface OtherColor {
@@ -118,14 +115,33 @@ declare namespace App {
118115

119116
type BaseToken = Record<string, Record<string, string>>;
120117

121-
interface ThemeTokenColor extends ThemePaletteColor {
122-
nprogress: string;
118+
interface ThemeSettingTokenColor {
119+
/** the progress bar color, if not set, will use the primary color */
120+
nprogress?: string;
123121
container: string;
124122
layout: string;
125123
inverted: string;
126-
base_text: string;
127-
[key: string]: string;
124+
'base-text': string;
125+
}
126+
127+
interface ThemeSettingTokenBoxShadow {
128+
header: string;
129+
sider: string;
130+
tab: string;
131+
}
132+
133+
interface ThemeSettingToken {
134+
colors: ThemeSettingTokenColor;
135+
boxShadow: ThemeSettingTokenBoxShadow;
128136
}
137+
138+
type ThemeTokenColor = ThemePaletteColor & ThemeSettingTokenColor;
139+
140+
/** Theme token CSS variables */
141+
type ThemeTokenCSSVars = {
142+
colors: ThemeTokenColor & { [key: string]: string };
143+
boxShadow: ThemeSettingTokenBoxShadow & { [key: string]: string };
144+
};
129145
}
130146

131147
/** Global namespace */

0 commit comments

Comments
 (0)