Skip to content

Commit ce97b04

Browse files
authored
feat: 新增侧边栏颜色切换 (#681)
* fix: 修复Header元素偏移的问题 * fix: 修复i18n未引用的问题 * feat: 新增侧边栏颜色模式 * chore: 移除侧边栏模式跟随系统 * feat: 换种展示方式
1 parent b9095ce commit ce97b04

File tree

9 files changed

+67
-16
lines changed

9 files changed

+67
-16
lines changed

src/config/style.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export default {
55
mode: 'light',
66
layout: 'side',
77
splitMenu: false,
8+
sideMode: 'light',
89
isFooterAside: false,
910
isSidebarFixed: true,
1011
isHeaderFixed: true,

src/layouts/components/Header.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,6 @@ const navToHelper = () => {
238238
display: flex;
239239
align-items: normal;
240240
line-height: 0;
241-
padding-left: var(--td-comp-margin-xl);
242241
}
243242
244243
.header-logo-container {

src/layouts/components/LayoutSideNav.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
:layout="settingStore.layout"
66
:is-fixed="settingStore.isSidebarFixed"
77
:menu="sideMenu"
8-
:theme="settingStore.displayMode"
8+
:theme="settingStore.displaySideMode"
99
:is-compact="settingStore.isSidebarCompact"
1010
/>
1111
</template>

src/layouts/components/SideNav.vue

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
<t-menu :class="menuCls" :theme="theme" :value="active" :collapsed="collapsed" :default-expanded="defaultExpanded">
44
<template #logo>
55
<span v-if="showLogo" :class="`${prefix}-side-nav-logo-wrapper`" @click="goHome">
6-
<component :is="getLogo()" :class="`${prefix}-side-nav-logo-${collapsed ? 't' : 'tdesign'}-logo`" />
6+
<component :is="getLogo()" :class="logoCls" />
77
</span>
88
</template>
99
<menu-content :nav-data="menu" />
1010
<template #operations>
11-
<span class="version-container"> {{ !collapsed ? 'TDesign Starter' : '' }} {{ pgk.version }} </span>
11+
<span :class="versionCls"> {{ !collapsed ? 'TDesign Starter' : '' }} {{ pgk.version }} </span>
1212
</template>
1313
</t-menu>
1414
<div :class="`${prefix}-side-nav-placeholder${collapsed ? '-hidden' : ''}`"></div>
@@ -75,6 +75,10 @@ const defaultExpanded = computed(() => {
7575
return union(expanded, parentPath === '' ? [] : [parentPath]);
7676
});
7777
78+
const sideMode = computed(() => {
79+
const { theme } = props;
80+
return theme === 'dark';
81+
});
7882
const sideNavCls = computed(() => {
7983
const { isCompact } = props;
8084
return [
@@ -84,7 +88,22 @@ const sideNavCls = computed(() => {
8488
},
8589
];
8690
});
87-
91+
const logoCls = computed(() => {
92+
return [
93+
`${prefix}-side-nav-logo-${collapsed.value ? 't' : 'tdesign'}-logo`,
94+
{
95+
[`${prefix}-side-nav-dark`]: sideMode.value,
96+
},
97+
];
98+
});
99+
const versionCls = computed(() => {
100+
return [
101+
`version-container`,
102+
{
103+
[`${prefix}-side-nav-dark`]: sideMode.value,
104+
},
105+
];
106+
});
88107
const menuCls = computed(() => {
89108
const { showLogo, isFixed, layout } = props;
90109
return [

src/layouts/setting.vue

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
</t-popup>
5353
</div>
5454
</t-radio-group>
55-
5655
<div class="setting-group-title">{{ $t('layout.setting.navigationLayout') }}</div>
5756
<t-radio-group v-model="formData.layout">
5857
<div v-for="(item, index) in LAYOUT_OPTION" :key="index" class="setting-layout-drawer">
@@ -62,15 +61,24 @@
6261
</div>
6362
</t-radio-group>
6463

65-
<t-form-item v-show="formData.layout === 'mix'" label="分割菜单(混合模式下有效)" name="splitMenu">
64+
<t-form-item v-show="formData.layout === 'mix'" :label="$t('layout.setting.splitMenu')" name="splitMenu">
6665
<t-switch v-model="formData.splitMenu" />
6766
</t-form-item>
68-
69-
<t-form-item v-show="formData.layout === 'mix'" label="固定 Sidebar" name="isSidebarFixed">
67+
<t-form-item
68+
v-show="formData.layout === 'mix'"
69+
:label="$t('layout.setting.fixedSidebar')"
70+
name="isSidebarFixed"
71+
>
7072
<t-switch v-model="formData.isSidebarFixed" />
7173
</t-form-item>
7274

7375
<div class="setting-group-title">{{ $t('layout.setting.element.title') }}</div>
76+
<t-form-item :label="$t('layout.setting.sideMode')" name="sideMode">
77+
<t-radio-group v-model="formData.sideMode" class="side-mode-radio">
78+
<t-radio-button key="light" value="light" :label="$t('layout.setting.theme.options.light')" />
79+
<t-radio-button key="dark" value="dark" :label="$t('layout.setting.theme.options.dark')" />
80+
</t-radio-group>
81+
</t-form-item>
7482
<t-form-item
7583
v-show="formData.layout === 'side'"
7684
:label="$t('layout.setting.element.showHeader')"
@@ -295,6 +303,10 @@ watchEffect(() => {
295303
width: 100%;
296304
justify-content: space-between;
297305
align-items: center;
306+
307+
&.side-mode-radio {
308+
justify-content: end;
309+
}
298310
}
299311
300312
.t-radio-group.t-size-m .t-radio-button {

src/locales/lang/en_US/layout.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export default {
3333
},
3434
},
3535
navigationLayout: 'Navigation Layout',
36+
sideMode: 'Side Menu Mode',
3637
splitMenu: 'Split Menu(Only Mix mode)',
3738
fixedSidebar: 'Fixed Sidebar',
3839
element: {

src/locales/lang/zh_CN/layout.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ export default {
3333
},
3434
},
3535
navigationLayout: '导航布局',
36+
sideMode: '侧边栏模式',
3637
splitMenu: '分割菜单(混合模式下有效)',
3738
fixedSidebar: '固定侧边栏',
3839
element: {

src/store/modules/setting.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,36 @@ export const useSettingStore = defineStore('setting', {
3333
}
3434
return state.mode as 'dark' | 'light';
3535
},
36+
displaySideMode: (state): 'dark' | 'light' => {
37+
return state.sideMode as 'dark' | 'light';
38+
},
3639
},
3740
actions: {
3841
async changeMode(mode: 'dark' | 'light' | 'auto') {
3942
let theme = mode;
4043

4144
if (mode === 'auto') {
42-
const media = window.matchMedia('(prefers-color-scheme:dark)');
43-
if (media.matches) {
44-
theme = 'dark';
45-
} else {
46-
theme = 'light';
47-
}
45+
theme = this.getMediaColor();
4846
}
4947
const isDarkMode = theme === 'dark';
5048

5149
document.documentElement.setAttribute('theme-mode', isDarkMode ? 'dark' : '');
5250

5351
this.chartColors = isDarkMode ? DARK_CHART_COLORS : LIGHT_CHART_COLORS;
5452
},
53+
async changeSideMode(mode: 'dark' | 'light') {
54+
const isDarkMode = mode === 'dark';
55+
56+
document.documentElement.setAttribute('side-mode', isDarkMode ? 'dark' : '');
57+
},
58+
getMediaColor() {
59+
const media = window.matchMedia('(prefers-color-scheme:dark)');
60+
61+
if (media.matches) {
62+
return 'dark';
63+
}
64+
return 'light';
65+
},
5566
changeBrandTheme(brandTheme: string) {
5667
const mode = this.displayMode;
5768
// 以主题色加显示模式作为键
@@ -79,6 +90,9 @@ export const useSettingStore = defineStore('setting', {
7990
if (key === 'mode') {
8091
this.changeMode(payload[key]);
8192
}
93+
if (key === 'sideMode') {
94+
this.changeSideMode(payload[key]);
95+
}
8296
if (key === 'brandTheme') {
8397
this.changeBrandTheme(payload[key]);
8498
}

src/style/layout.less

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@
163163
}
164164

165165
&-logo-tdesign-logo {
166-
padding: 0 var(--td-comp-paddingLR-xl);
166+
margin-right: var(--td-comp-margin-xxxl);
167167
height: var(--td-comp-size-s);
168168
width: 100%;
169169
color: var(--td-text-color-primary);
@@ -176,6 +176,10 @@
176176
}
177177
}
178178

179+
&-side-nav-dark {
180+
color: var(--td-font-white-1) !important;
181+
}
182+
179183
&-side-nav-placeholder {
180184
flex: 1 1 232px;
181185
min-width: 232px;

0 commit comments

Comments
 (0)