From 978ae70e44781da6bc3982052f551b5bf9d2dc59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Wed, 17 Sep 2025 02:58:39 +0800 Subject: [PATCH] feat: new style --- internal/apps/mysql/app.go | 6 +- internal/apps/php/app.go | 8 +- internal/http/request/app.go | 4 + internal/service/app.go | 30 ++--- internal/service/monitor.go | 4 + renovate.json | 4 +- web/index.html | 1 - web/package.json | 3 +- web/pnpm-lock.yaml | 104 +++++++++++++++--- web/public/loading/index.css | 2 +- web/public/loading/index.js | 9 -- web/settings/theme.json | 7 -- web/src/api/apps/mysql/index.ts | 4 +- web/src/api/apps/php/index.ts | 8 +- web/src/api/panel/app/index.ts | 2 +- web/src/assets/images/logo.png | Bin 6894 -> 8700 bytes web/src/components/common/AppProvider.vue | 19 ---- web/src/components/common/PathSelector.vue | 2 +- web/src/layout/header/IndexView.vue | 2 - .../layout/header/components/ThemeSetting.vue | 21 ---- .../layout/sidebar/components/SideMenu.vue | 7 +- web/src/layout/tab/IndexView.vue | 7 +- web/src/router/guard/app-install-guard.ts | 38 ++++--- web/src/store/modules/theme/helpers.ts | 68 +----------- web/src/store/modules/theme/index.ts | 14 +-- web/src/styles/index.scss | 4 - web/src/utils/common/naiveTools.ts | 3 +- web/src/views/app/IndexView.vue | 13 +-- web/src/views/apps/codeserver/IndexView.vue | 19 ++-- web/src/views/apps/docker/IndexView.vue | 19 ++-- web/src/views/apps/fail2ban/IndexView.vue | 81 +++++++------- web/src/views/apps/gitea/IndexView.vue | 19 ++-- web/src/views/apps/memcached/IndexView.vue | 19 ++-- web/src/views/apps/minio/IndexView.vue | 14 +-- web/src/views/apps/mysql/IndexView.vue | 53 +++------ web/src/views/apps/nginx/IndexView.vue | 36 +++--- web/src/views/apps/php/PhpView.vue | 88 +++++++-------- web/src/views/apps/phpmyadmin/IndexView.vue | 33 +++--- web/src/views/apps/podman/IndexView.vue | 36 +++--- web/src/views/apps/postgresql/IndexView.vue | 48 ++++---- web/src/views/apps/pureftpd/IndexView.vue | 25 ++--- web/src/views/apps/redis/IndexView.vue | 19 ++-- web/src/views/apps/rsync/IndexView.vue | 32 ++---- web/src/views/apps/s3fs/IndexView.vue | 10 +- web/src/views/apps/supervisor/IndexView.vue | 44 ++++---- web/src/views/backup/ListView.vue | 2 +- web/src/views/cert/IndexView.vue | 2 +- web/src/views/dashboard/IndexView.vue | 19 ++-- web/src/views/dashboard/UpdateView.vue | 10 +- web/src/views/file/ListTable.vue | 2 +- web/src/views/setting/SettingBase.vue | 4 +- web/src/views/setting/TokenModal.vue | 4 +- web/src/views/task/CreateModal.vue | 2 +- web/src/views/toolbox/BenchmarkView.vue | 29 ++--- web/src/views/website/EditView.vue | 87 +++++++-------- web/src/views/website/SettingView.vue | 93 ++++++++++------ web/types/theme.d.ts | 14 --- web/uno.config.ts | 27 +---- 58 files changed, 550 insertions(+), 734 deletions(-) delete mode 100644 web/public/loading/index.js delete mode 100644 web/src/layout/header/components/ThemeSetting.vue diff --git a/internal/apps/mysql/app.go b/internal/apps/mysql/app.go index 48948932..73868a3b 100644 --- a/internal/apps/mysql/app.go +++ b/internal/apps/mysql/app.go @@ -37,7 +37,7 @@ func (s *App) Route(r chi.Router) { r.Get("/load", s.Load) r.Get("/config", s.GetConfig) r.Post("/config", s.UpdateConfig) - r.Post("/clear_error_log", s.ClearErrorLog) + r.Post("/clear_log", s.ClearLog) r.Get("/slow_log", s.SlowLog) r.Post("/clear_slow_log", s.ClearSlowLog) r.Get("/root_password", s.GetRootPassword) @@ -159,8 +159,8 @@ func (s *App) Load(w http.ResponseWriter, r *http.Request) { service.Success(w, load) } -// ClearErrorLog 清空错误日志 -func (s *App) ClearErrorLog(w http.ResponseWriter, r *http.Request) { +// ClearLog 清空日志 +func (s *App) ClearLog(w http.ResponseWriter, r *http.Request) { if err := systemctl.LogClear("mysqld"); err != nil { service.Error(w, http.StatusInternalServerError, "%v", err) return diff --git a/internal/apps/php/app.go b/internal/apps/php/app.go index a4078081..874272d1 100644 --- a/internal/apps/php/app.go +++ b/internal/apps/php/app.go @@ -46,9 +46,9 @@ func (s *App) Route(version uint) func(r chi.Router) { r.Get("/fpm_config", php.GetFPMConfig) r.Post("/fpm_config", php.UpdateFPMConfig) r.Get("/load", php.Load) - r.Get("/error_log", php.ErrorLog) + r.Get("/log", php.Log) r.Get("/slow_log", php.SlowLog) - r.Post("/clear_error_log", php.ClearErrorLog) + r.Post("/clear_log", php.ClearLog) r.Post("/clear_slow_log", php.ClearSlowLog) r.Get("/extensions", php.ExtensionList) r.Post("/extensions", php.InstallExtension) @@ -169,7 +169,7 @@ func (s *App) Load(w http.ResponseWriter, r *http.Request) { service.Success(w, loads) } -func (s *App) ErrorLog(w http.ResponseWriter, r *http.Request) { +func (s *App) Log(w http.ResponseWriter, r *http.Request) { service.Success(w, fmt.Sprintf("%s/server/php/%d/var/log/php-fpm.log", app.Root, s.version)) } @@ -177,7 +177,7 @@ func (s *App) SlowLog(w http.ResponseWriter, r *http.Request) { service.Success(w, fmt.Sprintf("%s/server/php/%d/var/log/slow.log", app.Root, s.version)) } -func (s *App) ClearErrorLog(w http.ResponseWriter, r *http.Request) { +func (s *App) ClearLog(w http.ResponseWriter, r *http.Request) { if _, err := shell.Execf("cat /dev/null > %s/server/php/%d/var/log/php-fpm.log", app.Root, s.version); err != nil { service.Error(w, http.StatusInternalServerError, "%v", err) return diff --git a/internal/http/request/app.go b/internal/http/request/app.go index 84d6794f..15066eb8 100644 --- a/internal/http/request/app.go +++ b/internal/http/request/app.go @@ -9,6 +9,10 @@ type AppSlug struct { Slug string `json:"slug" form:"slug" validate:"required"` } +type AppSlugs struct { + Slugs string `json:"slugs" form:"slugs" validate:"required"` +} + type AppUpdateShow struct { Slug string `json:"slug" form:"slug" validate:"required|exists:apps,slug"` Show bool `json:"show" form:"show"` diff --git a/internal/service/app.go b/internal/service/app.go index bb4bdd9f..1828eaa0 100644 --- a/internal/service/app.go +++ b/internal/service/app.go @@ -2,6 +2,7 @@ package service import ( "net/http" + "strings" "github.com/leonelquinteros/gotext" "github.com/libtnb/chix" @@ -144,28 +145,27 @@ func (s *AppService) UpdateShow(w http.ResponseWriter, r *http.Request) { } func (s *AppService) IsInstalled(w http.ResponseWriter, r *http.Request) { - req, err := Bind[request.AppSlug](r) + req, err := Bind[request.AppSlugs](r) if err != nil { Error(w, http.StatusUnprocessableEntity, "%v", err) return } - app, err := s.appRepo.Get(req.Slug) - if err != nil { - Error(w, http.StatusInternalServerError, "%v", err) - return + flag := false + slugs := strings.Split(req.Slugs, ",") + for _, item := range slugs { + installed, err := s.appRepo.IsInstalled(item) + if err != nil { + Error(w, http.StatusInternalServerError, "%v", err) + return + } + if installed { + flag = true + break + } } - installed, err := s.appRepo.IsInstalled(req.Slug) - if err != nil { - Error(w, http.StatusInternalServerError, "%v", err) - return - } - - Success(w, chix.M{ - "name": app.Name, - "installed": installed, - }) + Success(w, flag) } func (s *AppService) UpdateCache(w http.ResponseWriter, r *http.Request) { diff --git a/internal/service/monitor.go b/internal/service/monitor.go index ab31fcca..d13a9a04 100644 --- a/internal/service/monitor.go +++ b/internal/service/monitor.go @@ -68,6 +68,10 @@ func (s *MonitorService) List(w http.ResponseWriter, r *http.Request) { Error(w, http.StatusInternalServerError, "%v", err) return } + if len(monitors) == 0 { + Success(w, types.MonitorData{}) + return + } var list types.MonitorData var bytesSent uint64 diff --git a/renovate.json b/renovate.json index 4afcdae2..27077a70 100644 --- a/renovate.json +++ b/renovate.json @@ -29,5 +29,7 @@ "automerge": true } ], - "ignoreDeps": [] + "ignoreDeps": [ + "monaco-editor" + ] } diff --git a/web/index.html b/web/index.html index 294b95c5..29a01472 100644 --- a/web/index.html +++ b/web/index.html @@ -23,7 +23,6 @@
<%= title %>
- diff --git a/web/package.json b/web/package.json index e4db4a25..b0b5d412 100644 --- a/web/package.json +++ b/web/package.json @@ -65,6 +65,7 @@ "@types/luxon": "^3.6.2", "@types/node": "^22.15.21", "@types/node-forge": "^1.3.11", + "@typescript/native-preview": "7.0.0-dev.20250904.1", "@unocss/eslint-config": "^66.1.2", "@vitejs/plugin-vue": "^6.0.0", "@vue/eslint-config-prettier": "^10.2.0", @@ -75,7 +76,7 @@ "eslint": "^9.27.0", "eslint-plugin-vue": "^10.1.0", "md-editor-v3": "^6.0.0", - "monaco-editor": "^0.53.0", + "monaco-editor": "0.52.2", "naive-ui": "^2.41.0", "npm-run-all2": "^8.0.4", "prettier": "^3.5.3", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 3e98657f..ffa4ea91 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -19,7 +19,7 @@ importers: version: 5.2.7 '@guolao/vue-monaco-editor': specifier: ^1.5.5 - version: 1.5.5(monaco-editor@0.53.0)(vue@3.5.21(typescript@5.9.2)) + version: 1.5.5(monaco-editor@0.52.2)(vue@3.5.21(typescript@5.9.2)) '@vavt/copy2clipboard': specifier: ^1.0.3 version: 1.0.3 @@ -123,6 +123,9 @@ importers: '@types/node-forge': specifier: ^1.3.11 version: 1.3.14 + '@typescript/native-preview': + specifier: 7.0.0-dev.20250904.1 + version: 7.0.0-dev.20250904.1 '@unocss/eslint-config': specifier: ^66.1.2 version: 66.5.1(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2) @@ -154,8 +157,8 @@ importers: specifier: ^6.0.0 version: 6.0.1(vue@3.5.21(typescript@5.9.2)) monaco-editor: - specifier: ^0.53.0 - version: 0.53.0 + specifier: 0.52.2 + version: 0.52.2 naive-ui: specifier: ^2.41.0 version: 2.43.1(vue@3.5.21(typescript@5.9.2)) @@ -1063,9 +1066,6 @@ packages: '@types/node@22.18.4': resolution: {integrity: sha512-UJdblFqXymSBhmZf96BnbisoFIr8ooiiBRMolQgg77Ea+VM37jXw76C2LQr9n8wm9+i/OvlUlW6xSvqwzwqznw==} - '@types/trusted-types@1.0.6': - resolution: {integrity: sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==} - '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} @@ -1128,6 +1128,53 @@ packages: resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-1rt4DhERW1VM4OwWYVIrCp1k1S4kpZAxzbCnprNinVJInhHexY2K0FFD9IGXKWSRANHg/OmJRQYTEoDKM6pqNw==} + engines: {node: '>=20.6.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-d2DMQnsXAkZDDk9bU/FhY/D74tbMAkboIGb+hq7kIIgOVcxOswhwLFZ/ajW/9NTesktz8Z14t40Ber+/Pny25A==} + engines: {node: '>=20.6.0'} + cpu: [x64] + os: [darwin] + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-+fv13RDSk+7wFYY846q5ig7X6G07JT7wbajk6p4rELXTIfS1c6gRHGhODETCfFVaPziP4IlvqyinNP8F8wc9uQ==} + engines: {node: '>=20.6.0'} + cpu: [arm64] + os: [linux] + + '@typescript/native-preview-linux-arm@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-YyfTK1SGmfeDJv6G3vSmVxjM914Xio7O57NzRKOyEQnmBT5tdXTzeWgkjrUh1jE8wCUu0f0ZZ+xDTwgys+E2ug==} + engines: {node: '>=20.6.0'} + cpu: [arm] + os: [linux] + + '@typescript/native-preview-linux-x64@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-BjWJI42cUUilIyQHZpQQeSjC/Ifj/UaIf4oj6lRHDcg5qgLHWe5bAUxuNjE6i7wi+TTN9YxUvBDkMAcm/hI8wg==} + engines: {node: '>=20.6.0'} + cpu: [x64] + os: [linux] + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-rPv/mVaneZTuFESk/zDg3dFiZjpdipVMcLaF10Ns1fIyWdZ0ja79Ufm1eCFbk8KFNEX2dEx+vFEvD9n4bhEneg==} + engines: {node: '>=20.6.0'} + cpu: [arm64] + os: [win32] + + '@typescript/native-preview-win32-x64@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-+twwqKYEv5UdZX5FRaBo0bDQgw/uPQjU3hqaqaO0Dhp1Ou8Ce4oi5hgwauB1j29JwBbvOi9/yoEcjsjT2Wsaxw==} + engines: {node: '>=20.6.0'} + cpu: [x64] + os: [win32] + + '@typescript/native-preview@7.0.0-dev.20250904.1': + resolution: {integrity: sha512-IzPzhumNsWsIg4Kmt0y+0b2BBtsvD17rDmKj78yNeU3AsuA6xignQ5eDkFtRmLdGPVZwa8Yg5zPcJRFln98Ocw==} + engines: {node: '>=20.6.0'} + hasBin: true + '@unocss/astro@66.5.1': resolution: {integrity: sha512-f17+xfyBZ9prFx4jda3D9ngOigjO8btHsR3uG7WeDQPW6OBdhETfIGdXs8WD99J/3A3LJtk7J0u9p121S+RE8Q==} peerDependencies: @@ -2561,8 +2608,8 @@ packages: resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==} hasBin: true - monaco-editor@0.53.0: - resolution: {integrity: sha512-0WNThgC6CMWNXXBxTbaYYcunj08iB5rnx4/G56UOPeL9UVIUGGHA1GR0EWIh9Ebabj7NpCRawQ5b0hfN1jQmYQ==} + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -4133,10 +4180,10 @@ snapshots: '@fontsource-variable/jetbrains-mono@5.2.7': {} - '@guolao/vue-monaco-editor@1.5.5(monaco-editor@0.53.0)(vue@3.5.21(typescript@5.9.2))': + '@guolao/vue-monaco-editor@1.5.5(monaco-editor@0.52.2)(vue@3.5.21(typescript@5.9.2))': dependencies: '@monaco-editor/loader': 1.5.0 - monaco-editor: 0.53.0 + monaco-editor: 0.52.2 vue: 3.5.21(typescript@5.9.2) vue-demi: 0.14.10(vue@3.5.21(typescript@5.9.2)) @@ -4506,8 +4553,6 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/trusted-types@1.0.6': {} - '@types/web-bluetooth@0.0.21': {} '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.35.0(jiti@2.5.1))(typescript@5.9.2)': @@ -4603,6 +4648,37 @@ snapshots: '@typescript-eslint/types': 8.43.0 eslint-visitor-keys: 4.2.1 + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20250904.1': + optional: true + + '@typescript/native-preview-darwin-x64@7.0.0-dev.20250904.1': + optional: true + + '@typescript/native-preview-linux-arm64@7.0.0-dev.20250904.1': + optional: true + + '@typescript/native-preview-linux-arm@7.0.0-dev.20250904.1': + optional: true + + '@typescript/native-preview-linux-x64@7.0.0-dev.20250904.1': + optional: true + + '@typescript/native-preview-win32-arm64@7.0.0-dev.20250904.1': + optional: true + + '@typescript/native-preview-win32-x64@7.0.0-dev.20250904.1': + optional: true + + '@typescript/native-preview@7.0.0-dev.20250904.1': + optionalDependencies: + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20250904.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20250904.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20250904.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20250904.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20250904.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20250904.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20250904.1 + '@unocss/astro@66.5.1(vite@7.1.5(@types/node@22.18.4)(jiti@2.5.1)(sass@1.92.1)(terser@5.44.0)(tsx@4.20.5))': dependencies: '@unocss/core': 66.5.1 @@ -6242,9 +6318,7 @@ snapshots: dependencies: commander: 14.0.1 - monaco-editor@0.53.0: - dependencies: - '@types/trusted-types': 1.0.6 + monaco-editor@0.52.2: {} mrmime@2.0.1: {} diff --git a/web/public/loading/index.css b/web/public/loading/index.css index efab6c21..f07128ba 100644 --- a/web/public/loading/index.css +++ b/web/public/loading/index.css @@ -42,7 +42,7 @@ position: absolute; height: 16px; width: 16px; - background-color: var(--primary-color); + background-color: #333333; border-radius: 8px; -webkit-animation: loadingPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; animation: loadingPulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; diff --git a/web/public/loading/index.js b/web/public/loading/index.js deleted file mode 100644 index 2f35ef88..00000000 --- a/web/public/loading/index.js +++ /dev/null @@ -1,9 +0,0 @@ -function addThemeColorCssVars() { - const key = '__THEME_COLOR__' - const defaultColor = '#00BFFF' - const themeColor = window.localStorage.getItem(key) || defaultColor - const cssVars = `--primary-color: ${themeColor}` - document.documentElement.style.cssText = cssVars -} - -addThemeColorCssVars() diff --git a/web/settings/theme.json b/web/settings/theme.json index 017eb2a7..a8d46296 100644 --- a/web/settings/theme.json +++ b/web/settings/theme.json @@ -14,13 +14,6 @@ "visible": true, "height": 60 }, - "primaryColor": "#00BFFF", - "otherColor": { - "info": "#2080F0", - "success": "#18A058", - "warning": "#F0A020", - "error": "#D03050" - }, "locale": "zh_CN", "name": "AcePanel" } diff --git a/web/src/api/apps/mysql/index.ts b/web/src/api/apps/mysql/index.ts index 5f76e241..508d64c1 100644 --- a/web/src/api/apps/mysql/index.ts +++ b/web/src/api/apps/mysql/index.ts @@ -7,8 +7,8 @@ export default { config: (): any => http.Get('/apps/mysql/config'), // 保存配置 saveConfig: (config: string): any => http.Post('/apps/mysql/config', { config }), - // 清空错误日志 - clearErrorLog: (): any => http.Post('/apps/mysql/clear_error_log'), + // 清空日志 + clearLog: (): any => http.Post('/apps/mysql/clear_log'), // 获取慢查询日志 slowLog: (): any => http.Get('/apps/mysql/slow_log'), // 清空慢查询日志 diff --git a/web/src/api/apps/php/index.ts b/web/src/api/apps/php/index.ts index 8c105060..5f488c62 100644 --- a/web/src/api/apps/php/index.ts +++ b/web/src/api/apps/php/index.ts @@ -15,10 +15,10 @@ export default { http.Post(`/apps/php${version}/fpm_config`, { config }), // 负载状态 load: (version: number): any => http.Get(`/apps/php${version}/load`), - // 获取错误日志 - errorLog: (version: number): any => http.Get(`/apps/php${version}/error_log`), - // 清空错误日志 - clearErrorLog: (version: number): any => http.Post(`/apps/php${version}/clear_error_log`), + // 获取日志 + log: (version: number): any => http.Get(`/apps/php${version}/log`), + // 清空日志 + clearLog: (version: number): any => http.Post(`/apps/php${version}/clear_log`), // 获取慢日志 slowLog: (version: number): any => http.Get(`/apps/php${version}/slow_log`), // 清空慢日志 diff --git a/web/src/api/panel/app/index.ts b/web/src/api/panel/app/index.ts index 840f79d6..416b925e 100644 --- a/web/src/api/panel/app/index.ts +++ b/web/src/api/panel/app/index.ts @@ -13,7 +13,7 @@ export default { // 设置首页显示 updateShow: (slug: string, show: boolean): any => http.Post('/app/update_show', { slug, show }), // 应用是否已安装 - isInstalled: (slug: string): any => http.Get('/app/is_installed', { params: { slug } }), + isInstalled: (slugs: string): any => http.Get('/app/is_installed', { params: { slugs } }), // 更新缓存 updateCache: (): any => http.Get('/app/update_cache') } diff --git a/web/src/assets/images/logo.png b/web/src/assets/images/logo.png index a7b17565001ed1878f85d11678a93083b2f934bb..63f1c08df375d688899bc5d7095b75071c2db706 100755 GIT binary patch literal 8700 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 L)mAB2vJCxyKW64f literal 6894 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 import { useThemeStore } from '@/store' -import { kebabCase } from 'lodash-es' -import type { GlobalThemeOverrides } from 'naive-ui' - -type ThemeVars = Exclude -type ThemeVarsKeys = keyof ThemeVars const themeStore = useThemeStore() -watch( - () => themeStore.naiveThemeOverrides.common, - (common) => { - for (const key in common) { - useCssVar(`--${kebabCase(key)}`, document.documentElement).value = - common[key as ThemeVarsKeys] || '' - if (key === 'primaryColor') - window.localStorage.setItem('__THEME_COLOR__', common[key as ThemeVarsKeys] || '') - } - }, - { immediate: true } -) - watch( () => themeStore.darkMode, (newValue) => { @@ -48,7 +30,6 @@ onBeforeUnmount(() => {