瀏覽代碼

perf: theme

xiaoxian521 3 年之前
父節點
當前提交
5070568b89

+ 1 - 0
package.json

@@ -29,6 +29,7 @@
   ],
   "dependencies": {
     "@amap/amap-jsapi-loader": "^1.0.1",
+    "@ctrl/tinycolor": "^3.4.0",
     "@element-plus/icons-vue": "^0.2.4",
     "@fortawesome/fontawesome-svg-core": "^1.2.36",
     "@fortawesome/free-solid-svg-icons": "^5.15.4",

+ 10 - 0
pnpm-lock.yaml

@@ -4,6 +4,7 @@ specifiers:
   "@amap/amap-jsapi-loader": ^1.0.1
   "@commitlint/cli": 13.1.0
   "@commitlint/config-conventional": 13.1.0
+  "@ctrl/tinycolor": ^3.4.0
   "@element-plus/icons-vue": ^0.2.4
   "@fortawesome/fontawesome-svg-core": ^1.2.36
   "@fortawesome/free-solid-svg-icons": ^5.15.4
@@ -89,6 +90,7 @@ specifiers:
 
 dependencies:
   "@amap/amap-jsapi-loader": 1.0.1
+  "@ctrl/tinycolor": 3.4.0
   "@element-plus/icons-vue": 0.2.4_vue@3.2.24
   "@fortawesome/fontawesome-svg-core": 1.2.36
   "@fortawesome/free-solid-svg-icons": 5.15.4
@@ -785,6 +787,14 @@ packages:
       chalk: 4.1.2
     dev: true
 
+  /@ctrl/tinycolor/3.4.0:
+    resolution:
+      {
+        integrity: sha512-JZButFdZ1+/xAfpguQHoabIXkcqRRKpMrWKBkpEZZyxfY9C1DpADFB8PEqGSTeFr135SaTRfKqGKx5xSCLI7ZQ==
+      }
+    engines: { node: ">=10" }
+    dev: false
+
   /@element-plus/icons-vue/0.2.4_vue@3.2.24:
     resolution:
       {

+ 3 - 1
src/layout/components/setting/index.vue

@@ -21,6 +21,7 @@ import { debounce } from "/@/utils/debounce";
 import darkIcon from "/@/assets/svg/dark.svg";
 import { themeColorsType } from "../../types";
 import { useAppStoreHook } from "/@/store/modules/app";
+import { shadeBgColor } from "../../theme/element-plus";
 import { useEpThemeStoreHook } from "/@/store/modules/epTheme";
 import { storageLocal, storageSession } from "/@/utils/storage";
 import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
@@ -29,6 +30,7 @@ import { toggleTheme } from "@zougt/vite-plugin-theme-preprocessor/dist/browser-
 
 const router = useRouter();
 const { isSelect } = useCssModule();
+const body = document.documentElement as HTMLElement;
 const instance =
   getCurrentInstance().appContext.app.config.globalProperties.$storage;
 
@@ -260,13 +262,13 @@ function setLayoutThemeColor(theme: string) {
 const setEpThemeColor = (color: string) => {
   writeNewStyle(createNewStyle(color));
   useEpThemeStoreHook().setEpThemeColor(color);
+  body.style.setProperty("--el-color-primary-active", shadeBgColor(color));
 };
 
 let dataTheme = ref<boolean>(instance.layout.darkMode);
 
 // 日间、夜间主题切换
 function dataThemeChange() {
-  const body = document.documentElement as HTMLElement;
   if (dataTheme.value) {
     body.setAttribute("data-theme", "dark");
     setLayoutThemeColor("light");

+ 6 - 0
src/layout/theme/element-plus.ts

@@ -1,6 +1,7 @@
 /* 动态改变element-plus主题色 */
 import rgbHex from "rgb-hex";
 import color from "css-color-function";
+import { TinyColor } from "@ctrl/tinycolor";
 import epCss from "element-plus/dist/index.css";
 
 // 色值表
@@ -72,3 +73,8 @@ const getStyleTemplate = (data: string): string => {
   });
   return data;
 };
+
+// 自动计算hover和active颜色 https://element-plus.gitee.io/zh-CN/component/button.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%9C%E8%89%B2-%E6%B5%8B%E8%AF%95%E7%89%88
+export const shadeBgColor = (color: string): string => {
+  return new TinyColor(color).shade(10).toString();
+};

+ 2 - 2
src/router/types.ts

@@ -2,8 +2,8 @@ import { RouteLocationNormalized } from "vue-router";
 
 export interface toRouteType extends RouteLocationNormalized {
   meta: {
-    keepAlive: boolean;
+    keepAlive?: boolean;
     refreshRedirect: string;
-    dynamicLevel: string;
+    dynamicLevel?: string;
   };
 }

+ 27 - 0
src/style/element-plus.scss

@@ -35,3 +35,30 @@
 .is-dark {
   z-index: 99999 !important;
 }
+
+/* 动态改变cssvar 用于主题切换 https://github.com/element-plus/element-plus/issues/4856#issuecomment-1000174357 */
+.el-button--primary {
+  --el-button-bg-color: var(--el-color-primary) !important;
+  --el-button-border-color: var(--el-color-primary) !important;
+  --el-button-hover-bg-color: var(--el-color-primary-light-2) !important;
+  --el-button-hover-border-color: var(--el-color-primary-light-2) !important;
+  --el-button-active-bg-color: var(--el-color-primary-active) !important;
+  --el-button-active-border-color: var(--el-color-primary-active) !important;
+}
+
+/* nprogress适配ep的primary */
+#nprogress {
+  & .bar {
+    background-color: var(--el-color-primary) !important;
+  }
+
+  & .peg {
+    box-shadow: 0 0 10px var(--el-color-primary),
+      0 0 5px var(--el-color-primary) !important;
+  }
+
+  & .spinner-icon {
+    border-top-color: var(--el-color-primary);
+    border-left-color: var(--el-color-primary);
+  }
+}

+ 2 - 2
src/utils/http/README.md

@@ -18,8 +18,8 @@ http.request('get', '/xxx?message=' + msg);
 import { http } from "/@/utils/http";
 
 // params传参
-http.request('get', '/xxx', { params: param });
+http.request('post', '/xxx', { params: param });
 
 // data传参
-http.request('get', '/xxx', { data: param });
+http.request('post', '/xxx', { data: param });
 ```