feat: 新增主题颜色选择

This commit is contained in:
MTrun 2022-03-12 18:46:51 +08:00
parent ddc005ec10
commit a4c14c39b3
14 changed files with 8682 additions and 28 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,3 @@
import ThemeColorSelect from './index.vue';
export { ThemeColorSelect };

View File

@ -0,0 +1,215 @@
<template>
<n-button quaternary @click="modelShow = true" title="颜色">
<n-icon size="20" :depth="1">
<ColorWandIcon />
</n-icon>
</n-button>
<n-modal v-model:show="modelShow">
<div class="go-system-color-setting">
<n-space justify="space-between">
<n-h3 class="title">主题颜色选择</n-h3>
<n-icon size="20" class="go-cursor-pointer" @click="modelShow = false">
<CloseIcon />
</n-icon>
</n-space>
<n-divider />
<div class="model-content">
<n-scrollbar>
<div class="content-left">
<n-grid x-gap="12" cols="2 600:3 1150:4 1600: 5">
<n-gi
class="content-left-item go-transition-quick"
v-for="(item, index) in appThemeList"
:key="index"
@click="colorSelectHandle(item)"
>
<n-space>
<div
class="content-left-item-color"
:style="{ backgroundColor: item.hex }"
/>
<n-space vertical>
<n-space>
<span :style="{ color: item.hex }">
{{ item.name }}
</span>
<span class="Pinyin-upper">
{{ item.pinyin.toUpperCase() }}
</span>
</n-space>
<n-text>
{{ item.hex }}
<n-divider vertical />
{{
`rgb(${item.RGB[0]}, ${item.RGB[0]}, ${item.RGB[0]})`
}}
</n-text>
</n-space>
</n-space>
</n-gi>
</n-grid>
</div>
</n-scrollbar>
<div class="content-right">
<div class="color-name-detail">
<n-text v-if="appThemeDetail" class="color-name">
{{ appThemeDetail.name }}
</n-text>
<n-text v-else="appThemeDetail" class="color-name">
中国色
</n-text>
<n-text v-if="appThemeDetail" class="color-name-Pinyin">
{{ appThemeDetail.pinyin.toUpperCase() }}
</n-text>
<div
v-if="appThemeDetail"
class="select-color"
:style="{ backgroundColor: designStore.appTheme }"
/>
</div>
<img :src="themeColorLogo" />
</div>
</div>
<div class="model-footer">
中国色列表来自于
<n-a href="http://zhongguose.com">
http://zhongguose.com
</n-a>
</div>
</div>
</n-modal>
</template>
<script lang="ts" setup>
import { ref, computed } from 'vue'
import { useDesignStore } from '@/store/modules/designStore/designStore'
import { AppThemeColorType } from '@/store/modules/designStore/designStore.d'
import { icon } from '@/plugins'
import themeColorLogo from '@/assets/images/exception/theme-color.png'
const { ColorWandIcon, CloseIcon } = icon.ionicons5
const designStore = useDesignStore()
const modelShow = ref(false)
const { appThemeList } = designStore
const appThemeDetail = computed(() => {
console.log(designStore.getAppThemeDetail)
return designStore.getAppThemeDetail
})
const colorSelectHandle = (color: AppThemeColorType) => {
designStore.setAppColor(color)
}
</script>
<style lang="scss" scoped>
$height: 85vh;
@include go('system-color-setting') {
position: relative;
display: flex;
flex-direction: column;
width: 90%;
min-width: 1000px;
padding: 20px 25px;
height: $height;
border-radius: 15px;
overflow: hidden;
@extend .go-background-filter;
@include hover-border-color('background-color5');
.title {
margin: 0;
}
.model-content {
flex: 1;
height: calc(#{$height} - 40px - 48px - 36px);
/* 左侧 */
.content-left {
display: flex;
flex-wrap: wrap;
margin-right: 300px;
/* 每个项 */
&-item {
position: relative;
display: flex;
margin-bottom: 20px;
padding: 10px 20px;
border-radius: 5px;
cursor: pointer;
border: 1px solid rgba(0, 0, 0, 0);
&:hover {
@include hover-border-color('background-color5');
}
&::after {
content: '';
z-index: -1;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0.7;
overflow: hidden;
border-radius: 5px;
@extend .go-background-filter-shallow;
}
&-color {
width: 8px;
height: 40px;
border-radius: 2px;
}
.Pinyin-upper {
font-size: 8px;
}
}
}
/* 右侧 */
.content-right {
position: absolute;
display: flex;
align-items: center;
justify-content: flex-end;
width: 300px;
height: 100%;
right: 50px;
top: 0px;
.color-name-detail {
display: flex;
flex-direction: column;
align-items: center;
margin-right: 40px;
.go-flex-items-center {
flex-direction: column;
}
.select-color {
margin-top: 20px;
width: 100px;
height: 20px;
border-radius: 3px;
background-image: url('~@/assets/images/exception/texture.png');
}
.color-name {
font-family: serif;
font-size: 80px;
color: #fff;
margin: 0 auto;
display: block;
width: 110px;
text-align: center;
background-position: center top;
background-repeat: no-repeat;
}
.color-name-Pinyin {
text-align: center;
font-family: Georgia;
font-size: 16px;
}
}
}
}
.model-footer {
text-align: end;
}
}
</style>

View File

@ -14,6 +14,7 @@
<slot name="ri-left"> </slot> <slot name="ri-left"> </slot>
<LangSelect /> <LangSelect />
<ThemeSelect /> <ThemeSelect />
<ThemeColorSelect />
<slot name="ri-right"> </slot> <slot name="ri-right"> </slot>
</n-space> </n-space>
</div> </div>
@ -24,6 +25,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ThemeSelect } from '@/components/ThemeSelect' import { ThemeSelect } from '@/components/ThemeSelect'
import { LangSelect } from '@/components/LangSelect' import { LangSelect } from '@/components/LangSelect'
import { ThemeColorSelect } from '@/components/ThemeColorSelect'
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -46,7 +46,8 @@ DesktopOutline as DesktopOutlineIcon,
Cut as CutIcon, Cut as CutIcon,
Square as SquareIcon, Square as SquareIcon,
ColorPalette as ColorPaletteIcon, ColorPalette as ColorPaletteIcon,
Leaf as LeafIcon Leaf as LeafIcon,
ColorWand as ColorWandIcon
} from '@vicons/ionicons5' } from '@vicons/ionicons5'
import { import {
@ -167,7 +168,9 @@ const ionicons5 = {
ColorPaletteIcon, ColorPaletteIcon,
ZAxisIcon, ZAxisIcon,
// 气球 // 气球
LeafIcon LeafIcon,
// 颜色
ColorWandIcon
} }
const carbon = { const carbon = {

File diff suppressed because it is too large Load Diff

View File

@ -1,35 +1,18 @@
import { LangEnum } from '@/enums/styleEnum' import { LangEnum } from '@/enums/styleEnum'
import designColor from './designColor.json'
// 默认语言 // 默认语言
export const lang = LangEnum.zh export const lang = LangEnum.zh
// 主体色 // 主体色
export const appThemeList: string[] = [ export const appThemeList = designColor
'#2d8cf0',
'#0960bd',
'#0084f4',
'#009688',
'#536dfe',
'#ff5c93',
'#ee4f12',
'#0096c7',
'#9c27b0',
'#ff9800',
'#FF3D68',
'#00C1D4',
'#71EFA3',
'#171010',
'#78DEC7',
'#1768AC',
'#FB9300',
'#FC5404'
]
export const theme = { export const theme = {
// 默认是否开启深色主题 // 默认是否开启深色主题
darkTheme: true, darkTheme: true,
//系统主题色 //默认主题色
appTheme: '#51d6a9', appTheme: '#51d6a9',
appThemeDetail: null,
//系统内置主题色列表 //系统内置主题色列表
appThemeList appThemeList
} }

View File

@ -1,12 +1,21 @@
import { ThemeEnum } from '@/enums/styleEnum' import { ThemeEnum } from '@/enums/styleEnum'
export type AppThemeColorType = {
CMYK: number[]
RGB: number[]
hex: string
name: string
pinyin: string
}
export interface DesignStateType { export interface DesignStateType {
// 是否是深色主题 // 是否是深色主题
darkTheme: boolean darkTheme: boolean
// 主题名称 // 主题名称
themeName: ThemeEnum themeName: ThemeEnum
//系统风格 //色号
appTheme: string appTheme: string
appThemeDetail: AppThemeColorType | null
//系统内置风格 //系统内置风格
appThemeList: string[] appThemeList: AppThemeColorType[]
} }

View File

@ -1,13 +1,13 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import { theme } from '@/settings/designSetting' import { theme } from '@/settings/designSetting'
import { DesignStateType } from './designStore.d' import { DesignStateType, AppThemeColorType } from './designStore.d'
import { setLocalStorage, getLocalStorage } from '@/utils' import { setLocalStorage, getLocalStorage } from '@/utils'
import { StorageEnum } from '@/enums/storageEnum' import { StorageEnum } from '@/enums/storageEnum'
import { ThemeEnum } from '@/enums/styleEnum' import { ThemeEnum } from '@/enums/styleEnum'
const { GO_DESIGN_STORE } = StorageEnum const { GO_DESIGN_STORE } = StorageEnum
const { darkTheme, appTheme, appThemeList } = theme const { darkTheme, appTheme, appThemeList, appThemeDetail } = theme
const storageDesign = getLocalStorage(GO_DESIGN_STORE) const storageDesign = getLocalStorage(GO_DESIGN_STORE)
@ -21,6 +21,7 @@ export const useDesignStore = defineStore({
themeName: (darkTheme && ThemeEnum.dark) || ThemeEnum.light, themeName: (darkTheme && ThemeEnum.dark) || ThemeEnum.light,
// 颜色色号 // 颜色色号
appTheme, appTheme,
appThemeDetail,
// 颜色列表 // 颜色列表
appThemeList, appThemeList,
}, },
@ -31,15 +32,24 @@ export const useDesignStore = defineStore({
getAppTheme(): string { getAppTheme(): string {
return this.appTheme return this.appTheme
}, },
getAppThemeList(): string[] { getAppThemeDetail(): AppThemeColorType | null {
return this.appThemeDetail
},
getAppThemeList(): AppThemeColorType[] {
return this.appThemeList return this.appThemeList
} }
}, },
actions: { actions: {
// 切换主题
changeTheme(): void { changeTheme(): void {
this.darkTheme = !this.darkTheme this.darkTheme = !this.darkTheme
this.themeName = this.darkTheme ? ThemeEnum.dark : ThemeEnum.light this.themeName = this.darkTheme ? ThemeEnum.dark : ThemeEnum.light
setLocalStorage(GO_DESIGN_STORE, this.$state) setLocalStorage(GO_DESIGN_STORE, this.$state)
}, },
// 设置颜色
setAppColor(color: AppThemeColorType): void {
this.appTheme = color.hex
this.appThemeDetail = color
}
} }
}) })

View File

@ -17,6 +17,7 @@ $dark: (
background-color5-shallow: $--color-dark-bg-5-shallow, background-color5-shallow: $--color-dark-bg-5-shallow,
// 毛玻璃背景 // 毛玻璃背景
filter-color: $--filter-color-login-dark, filter-color: $--filter-color-login-dark,
filter-color-shallow: $--filter-color-login-dark-shallow,
//渐变背景 //渐变背景
background-image: background-image:
linear-gradient(120deg, $--color-dark-bg-1 0%, $--color-dark-bg-1 100%), linear-gradient(120deg, $--color-dark-bg-1 0%, $--color-dark-bg-1 100%),

View File

@ -19,6 +19,7 @@ $light: (
background-color5-shallow: $--color-light-bg-5-shallow, background-color5-shallow: $--color-light-bg-5-shallow,
// 毛玻璃背景 // 毛玻璃背景
filter-color: $--filter-color-login-light, filter-color: $--filter-color-login-light,
filter-color-shallow: $--filter-color-login-light-shallow,
//渐变背景 //渐变背景
background-image: background-image:
linear-gradient(120deg, $--color-light-bg 0%, $--color-light-bg 100%), linear-gradient(120deg, $--color-light-bg 0%, $--color-light-bg 100%),

View File

@ -53,6 +53,13 @@
box-shadow: $--border-shadow; box-shadow: $--border-shadow;
} }
// 毛玻璃
.go-background-filter-shallow {
backdrop-filter: $--filter-blur-base;
@include filter-bg-color('filter-color-shallow');
box-shadow: $--border-shadow;
}
// 边框圆角 // 边框圆角
.go-border-radius { .go-border-radius {
border-radius: $--border-radius-base; border-radius: $--border-radius-base;

View File

@ -54,7 +54,9 @@ $--footer-height: 50px;
$--filter-blur-base: blur(20px); $--filter-blur-base: blur(20px);
// 毛玻璃 // 毛玻璃
$--filter-color-login-dark: rgba(35,35,36, 0.7); $--filter-color-login-dark: rgba(35,35,36, 0.7);
$--filter-color-login-dark-shallow: rgba(35,35,36, 0.3);
$--filter-color-login-light: rgba(240, 240, 240, 0.7); $--filter-color-login-light: rgba(240, 240, 240, 0.7);
$--filter-color-login-light-shallow: rgba(240, 240, 240, 0.3);
// 边框 // 边框
$--border-radius-base: 8px; $--border-radius-base: 8px;