From 970a49e2a5e42b14d9fafe33955da6aa8cd6f879 Mon Sep 17 00:00:00 2001 From: bietiaop <1527109126@qq.com> Date: Sat, 8 Feb 2025 23:05:48 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=8C=AA=E5=92=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webui/src/api/BaseInfo.ts | 10 +- src/webui/src/helper/config.ts | 293 +-------------------------------- src/webui/src/types/theme.ts | 260 +++++++++++++++++++++++++++++ src/webui/src/utils/object.ts | 22 +++ 4 files changed, 294 insertions(+), 291 deletions(-) create mode 100644 src/webui/src/types/theme.ts create mode 100644 src/webui/src/utils/object.ts diff --git a/src/webui/src/api/BaseInfo.ts b/src/webui/src/api/BaseInfo.ts index 43df485b..a7d3c514 100644 --- a/src/webui/src/api/BaseInfo.ts +++ b/src/webui/src/api/BaseInfo.ts @@ -14,13 +14,13 @@ export const QQVersionHandler: RequestHandler = (_, res) => { sendSuccess(res, data); }; -export const GetThemeConfigHandler: RequestHandler = (_, res) => { - const data = WebUiConfig.GetTheme(); +export const GetThemeConfigHandler: RequestHandler = async (_, res) => { + const data = await WebUiConfig.GetTheme(); sendSuccess(res, data); }; -export const SetThemeConfigHandler: RequestHandler = (req, res) => { +export const SetThemeConfigHandler: RequestHandler = async (req, res) => { const { theme } = req.body; - const data = WebUiConfig.UpdateTheme(theme); - sendSuccess(res, data); + await WebUiConfig.UpdateTheme(theme); + sendSuccess(res, { message: '更新成功' }); }; diff --git a/src/webui/src/helper/config.ts b/src/webui/src/helper/config.ts index 4cb9c6b9..a21b3639 100644 --- a/src/webui/src/helper/config.ts +++ b/src/webui/src/helper/config.ts @@ -5,6 +5,9 @@ import fs, { constants } from 'node:fs/promises'; import { resolve } from 'node:path'; +import { deepMerge } from '../utils/object'; +import { themeType } from '../types/theme'; + // 限制尝试端口的次数,避免死循环 // 定义配置的类型 @@ -14,285 +17,7 @@ const WebUiConfigSchema = Type.Object({ token: Type.String({ default: 'napcat' }), loginRate: Type.Number({ default: 10 }), autoLoginAccount: Type.String({ default: '' }), - theme: Type.Object( - { - dark: Type.Object( - { - '--heroui-background': Type.String({ default: '0 0% 0%' }), - '--heroui-foreground-50': Type.String({ default: '240 5.88% 10%' }), - '--heroui-foreground-100': Type.String({ default: '240 3.7% 15.88%' }), - '--heroui-foreground-200': Type.String({ default: '240 5.26% 26.08%' }), - '--heroui-foreground-300': Type.String({ default: '240 5.2% 33.92%' }), - '--heroui-foreground-400': Type.String({ default: '240 3.83% 46.08%' }), - '--heroui-foreground-500': Type.String({ default: '240 5.03% 64.9%' }), - '--heroui-foreground-600': Type.String({ default: '240 4.88% 83.92%' }), - '--heroui-foreground-700': Type.String({ default: '240 5.88% 90%' }), - '--heroui-foreground-800': Type.String({ default: '240 4.76% 95.88%' }), - '--heroui-foreground-900': Type.String({ default: '0 0% 98.04%' }), - '--heroui-foreground': Type.String({ default: '210 5.56% 92.94%' }), - '--heroui-focus': Type.String({ default: '212.01999999999998 100% 46.67%' }), - '--heroui-overlay': Type.String({ default: '0 0% 0%' }), - '--heroui-divider': Type.String({ default: '0 0% 100%' }), - '--heroui-divider-opacity': Type.String({ default: '0.15' }), - '--heroui-content1': Type.String({ default: '240 5.88% 10%' }), - '--heroui-content1-foreground': Type.String({ default: '0 0% 98.04%' }), - '--heroui-content2': Type.String({ default: '240 3.7% 15.88%' }), - '--heroui-content2-foreground': Type.String({ default: '240 4.76% 95.88%' }), - '--heroui-content3': Type.String({ default: '240 5.26% 26.08%' }), - '--heroui-content3-foreground': Type.String({ default: '240 5.88% 90%' }), - '--heroui-content4': Type.String({ default: '240 5.2% 33.92%' }), - '--heroui-content4-foreground': Type.String({ default: '240 4.88% 83.92%' }), - '--heroui-default-50': Type.String({ default: '240 5.88% 10%' }), - '--heroui-default-100': Type.String({ default: '240 3.7% 15.88%' }), - '--heroui-default-200': Type.String({ default: '240 5.26% 26.08%' }), - '--heroui-default-300': Type.String({ default: '240 5.2% 33.92%' }), - '--heroui-default-400': Type.String({ default: '240 3.83% 46.08%' }), - '--heroui-default-500': Type.String({ default: '240 5.03% 64.9%' }), - '--heroui-default-600': Type.String({ default: '240 4.88% 83.92%' }), - '--heroui-default-700': Type.String({ default: '240 5.88% 90%' }), - '--heroui-default-800': Type.String({ default: '240 4.76% 95.88%' }), - '--heroui-default-900': Type.String({ default: '0 0% 98.04%' }), - '--heroui-default-foreground': Type.String({ default: '0 0% 100%' }), - '--heroui-default': Type.String({ default: '240 5.26% 26.08%' }), - '--heroui-danger-50': Type.String({ default: '301.89 82.61% 22.55%' }), - '--heroui-danger-100': Type.String({ default: '308.18 76.39% 28.24%' }), - '--heroui-danger-200': Type.String({ default: '313.85 70.65% 36.08%' }), - '--heroui-danger-300': Type.String({ default: '319.73 65.64% 44.51%' }), - '--heroui-danger-400': Type.String({ default: '325.82 69.62% 53.53%' }), - '--heroui-danger-500': Type.String({ default: '331.82 75% 65.49%' }), - '--heroui-danger-600': Type.String({ default: '337.84 83.46% 73.92%' }), - '--heroui-danger-700': Type.String({ default: '343.42 90.48% 83.53%' }), - '--heroui-danger-800': Type.String({ default: '350.53 90.48% 91.76%' }), - '--heroui-danger-900': Type.String({ default: '324 90.91% 95.69%' }), - '--heroui-danger-foreground': Type.String({ default: '0 0% 100%' }), - '--heroui-danger': Type.String({ default: '325.82 69.62% 53.53%' }), - '--heroui-primary-50': Type.String({ default: '340 84.91% 10.39%' }), - '--heroui-primary-100': Type.String({ default: '339.33 86.54% 20.39%' }), - '--heroui-primary-200': Type.String({ default: '339.11 85.99% 30.78%' }), - '--heroui-primary-300': Type.String({ default: '339 86.54% 40.78%' }), - '--heroui-primary-400': Type.String({ default: '339.2 90.36% 51.18%' }), - '--heroui-primary-500': Type.String({ default: '339 90% 60.78%' }), - '--heroui-primary-600': Type.String({ default: '339.11 90.6% 70.78%' }), - '--heroui-primary-700': Type.String({ default: '339.33 90% 80.39%' }), - '--heroui-primary-800': Type.String({ default: '340 91.84% 90.39%' }), - '--heroui-primary-900': Type.String({ default: '339.13 92% 95.1%' }), - '--heroui-primary-foreground': Type.String({ default: '0 0% 100%' }), - '--heroui-primary': Type.String({ default: '339.2 90.36% 51.18%' }), - // 新增 secondary - '--heroui-secondary-50': Type.String({ default: '270 66.67% 9.41%' }), - '--heroui-secondary-100': Type.String({ default: '270 66.67% 18.82%' }), - '--heroui-secondary-200': Type.String({ default: '270 66.67% 28.24%' }), - '--heroui-secondary-300': Type.String({ default: '270 66.67% 37.65%' }), - '--heroui-secondary-400': Type.String({ default: '270 66.67% 47.06%' }), - '--heroui-secondary-500': Type.String({ default: '270 59.26% 57.65%' }), - '--heroui-secondary-600': Type.String({ default: '270 59.26% 68.24%' }), - '--heroui-secondary-700': Type.String({ default: '270 59.26% 78.82%' }), - '--heroui-secondary-800': Type.String({ default: '270 59.26% 89.41%' }), - '--heroui-secondary-900': Type.String({ default: '270 61.54% 94.9%' }), - '--heroui-secondary-foreground': Type.String({ default: '0 0% 100%' }), - '--heroui-secondary': Type.String({ default: '270 59.26% 57.65%' }), - // 新增 success - '--heroui-success-50': Type.String({ default: '145.71 77.78% 8.82%' }), - '--heroui-success-100': Type.String({ default: '146.2 79.78% 17.45%' }), - '--heroui-success-200': Type.String({ default: '145.79 79.26% 26.47%' }), - '--heroui-success-300': Type.String({ default: '146.01 79.89% 35.1%' }), - '--heroui-success-400': Type.String({ default: '145.96 79.46% 43.92%' }), - '--heroui-success-500': Type.String({ default: '146.01 62.45% 55.1%' }), - '--heroui-success-600': Type.String({ default: '145.79 62.57% 66.47%' }), - '--heroui-success-700': Type.String({ default: '146.2 61.74% 77.45%' }), - '--heroui-success-800': Type.String({ default: '145.71 61.4% 88.82%' }), - '--heroui-success-900': Type.String({ default: '146.67 64.29% 94.51%' }), - '--heroui-success-foreground': Type.String({ default: '0 0% 0%' }), - '--heroui-success': Type.String({ default: '145.96 79.46% 43.92%' }), - // 新增 warning - '--heroui-warning-50': Type.String({ default: '37.14 75% 10.98%' }), - '--heroui-warning-100': Type.String({ default: '37.14 75% 21.96%' }), - '--heroui-warning-200': Type.String({ default: '36.96 73.96% 33.14%' }), - '--heroui-warning-300': Type.String({ default: '37.01 74.22% 44.12%' }), - '--heroui-warning-400': Type.String({ default: '37.03 91.27% 55.1%' }), - '--heroui-warning-500': Type.String({ default: '37.01 91.26% 64.12%' }), - '--heroui-warning-600': Type.String({ default: '36.96 91.24% 73.14%' }), - '--heroui-warning-700': Type.String({ default: '37.14 91.3% 81.96%' }), - '--heroui-warning-800': Type.String({ default: '37.14 91.3% 90.98%' }), - '--heroui-warning-900': Type.String({ default: '54.55 91.67% 95.29%' }), - '--heroui-warning-foreground': Type.String({ default: '0 0% 0%' }), - '--heroui-warning': Type.String({ default: '37.03 91.27% 55.1%' }), - // 其它配置 - '--heroui-code-background': Type.String({ default: '240 5.56% 7.06%' }), - '--heroui-strong': Type.String({ default: '190.14 94.67% 44.12%' }), - '--heroui-code-mdx': Type.String({ default: '190.14 94.67% 44.12%' }), - '--heroui-divider-weight': Type.String({ default: '1px' }), - '--heroui-disabled-opacity': Type.String({ default: '.5' }), - '--heroui-font-size-tiny': Type.String({ default: '0.75rem' }), - '--heroui-font-size-small': Type.String({ default: '0.875rem' }), - '--heroui-font-size-medium': Type.String({ default: '1rem' }), - '--heroui-font-size-large': Type.String({ default: '1.125rem' }), - '--heroui-line-height-tiny': Type.String({ default: '1rem' }), - '--heroui-line-height-small': Type.String({ default: '1.25rem' }), - '--heroui-line-height-medium': Type.String({ default: '1.5rem' }), - '--heroui-line-height-large': Type.String({ default: '1.75rem' }), - '--heroui-radius-small': Type.String({ default: '8px' }), - '--heroui-radius-medium': Type.String({ default: '12px' }), - '--heroui-radius-large': Type.String({ default: '14px' }), - '--heroui-border-width-small': Type.String({ default: '1px' }), - '--heroui-border-width-medium': Type.String({ default: '2px' }), - '--heroui-border-width-large': Type.String({ default: '3px' }), - '--heroui-box-shadow-small': Type.String({ - default: - '0px 0px 5px 0px rgba(0, 0, 0, .05), 0px 2px 10px 0px rgba(0, 0, 0, .2), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - }), - '--heroui-box-shadow-medium': Type.String({ - default: - '0px 0px 15px 0px rgba(0, 0, 0, .06), 0px 2px 30px 0px rgba(0, 0, 0, .22), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - }), - '--heroui-box-shadow-large': Type.String({ - default: - '0px 0px 30px 0px rgba(0, 0, 0, .07), 0px 30px 60px 0px rgba(0, 0, 0, .26), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', - }), - '--heroui-hover-opacity': Type.String({ default: '.9' }), - }, - { default: {} } - ), - light: Type.Object( - { - '--heroui-background': Type.String({ default: '0 0% 100%' }), - '--heroui-foreground-50': Type.String({ default: '240 5.88% 95%' }), - '--heroui-foreground-100': Type.String({ default: '240 3.7% 90%' }), - '--heroui-foreground-200': Type.String({ default: '240 5.26% 80%' }), - '--heroui-foreground-300': Type.String({ default: '240 5.2% 70%' }), - '--heroui-foreground-400': Type.String({ default: '240 3.83% 60%' }), - '--heroui-foreground-500': Type.String({ default: '240 5.03% 50%' }), - '--heroui-foreground-600': Type.String({ default: '240 4.88% 40%' }), - '--heroui-foreground-700': Type.String({ default: '240 5.88% 30%' }), - '--heroui-foreground-800': Type.String({ default: '240 4.76% 20%' }), - '--heroui-foreground-900': Type.String({ default: '0 0% 10%' }), - '--heroui-foreground': Type.String({ default: '210 5.56% 7.06%' }), - '--heroui-focus': Type.String({ default: '212.01999999999998 100% 53.33%' }), - '--heroui-overlay': Type.String({ default: '0 0% 100%' }), - '--heroui-divider': Type.String({ default: '0 0% 0%' }), - '--heroui-divider-opacity': Type.String({ default: '0.85' }), - '--heroui-content1': Type.String({ default: '240 5.88% 95%' }), - '--heroui-content1-foreground': Type.String({ default: '0 0% 10%' }), - '--heroui-content2': Type.String({ default: '240 3.7% 90%' }), - '--heroui-content2-foreground': Type.String({ default: '240 4.76% 20%' }), - '--heroui-content3': Type.String({ default: '240 5.26% 80%' }), - '--heroui-content3-foreground': Type.String({ default: '240 5.88% 30%' }), - '--heroui-content4': Type.String({ default: '240 5.2% 70%' }), - '--heroui-content4-foreground': Type.String({ default: '240 4.88% 40%' }), - '--heroui-default-50': Type.String({ default: '240 5.88% 95%' }), - '--heroui-default-100': Type.String({ default: '240 3.7% 90%' }), - '--heroui-default-200': Type.String({ default: '240 5.26% 80%' }), - '--heroui-default-300': Type.String({ default: '240 5.2% 70%' }), - '--heroui-default-400': Type.String({ default: '240 3.83% 60%' }), - '--heroui-default-500': Type.String({ default: '240 5.03% 50%' }), - '--heroui-default-600': Type.String({ default: '240 4.88% 40%' }), - '--heroui-default-700': Type.String({ default: '240 5.88% 30%' }), - '--heroui-default-800': Type.String({ default: '240 4.76% 20%' }), - '--heroui-default-900': Type.String({ default: '0 0% 10%' }), - '--heroui-default-foreground': Type.String({ default: '0 0% 0%' }), - '--heroui-default': Type.String({ default: '240 5.26% 80%' }), - '--heroui-danger-50': Type.String({ default: '324 90.91% 95.69%' }), - '--heroui-danger-100': Type.String({ default: '350.53 90.48% 91.76%' }), - '--heroui-danger-200': Type.String({ default: '343.42 90.48% 83.53%' }), - '--heroui-danger-300': Type.String({ default: '337.84 83.46% 73.92%' }), - '--heroui-danger-400': Type.String({ default: '331.82 75% 65.49%' }), - '--heroui-danger-500': Type.String({ default: '325.82 69.62% 53.53%' }), - '--heroui-danger-600': Type.String({ default: '319.73 65.64% 44.51%' }), - '--heroui-danger-700': Type.String({ default: '313.85 70.65% 36.08%' }), - '--heroui-danger-800': Type.String({ default: '308.18 76.39% 28.24%' }), - '--heroui-danger-900': Type.String({ default: '301.89 82.61% 22.55%' }), - '--heroui-danger-foreground': Type.String({ default: '0 0% 100%' }), - '--heroui-danger': Type.String({ default: '325.82 69.62% 53.53%' }), - '--heroui-primary-50': Type.String({ default: '339.13 92% 95.1%' }), - '--heroui-primary-100': Type.String({ default: '340 91.84% 90.39%' }), - '--heroui-primary-200': Type.String({ default: '339.33 90% 80.39%' }), - '--heroui-primary-300': Type.String({ default: '339.11 90.6% 70.78%' }), - '--heroui-primary-400': Type.String({ default: '339 90% 60.78%' }), - '--heroui-primary-500': Type.String({ default: '339.2 90.36% 51.18%' }), - '--heroui-primary-600': Type.String({ default: '339 86.54% 40.78%' }), - '--heroui-primary-700': Type.String({ default: '339.11 85.99% 30.78%' }), - '--heroui-primary-800': Type.String({ default: '339.33 86.54% 20.39%' }), - '--heroui-primary-900': Type.String({ default: '340 84.91% 10.39%' }), - '--heroui-primary-foreground': Type.String({ default: '0 0% 100%' }), - '--heroui-primary': Type.String({ default: '339.2 90.36% 51.18%' }), - // 新增 secondary - '--heroui-secondary-50': Type.String({ default: '270 61.54% 94.9%' }), - '--heroui-secondary-100': Type.String({ default: '270 59.26% 89.41%' }), - '--heroui-secondary-200': Type.String({ default: '270 59.26% 78.82%' }), - '--heroui-secondary-300': Type.String({ default: '270 59.26% 68.24%' }), - '--heroui-secondary-400': Type.String({ default: '270 59.26% 57.65%' }), - '--heroui-secondary-500': Type.String({ default: '270 66.67% 47.06%' }), - '--heroui-secondary-600': Type.String({ default: '270 66.67% 37.65%' }), - '--heroui-secondary-700': Type.String({ default: '270 66.67% 28.24%' }), - '--heroui-secondary-800': Type.String({ default: '270 66.67% 18.82%' }), - '--heroui-secondary-900': Type.String({ default: '270 66.67% 9.41%' }), - '--heroui-secondary-foreground': Type.String({ default: '0 0% 100%' }), - '--heroui-secondary': Type.String({ default: '270 66.67% 47.06%' }), - // 新增 success - '--heroui-success-50': Type.String({ default: '146.67 64.29% 94.51%' }), - '--heroui-success-100': Type.String({ default: '145.71 61.4% 88.82%' }), - '--heroui-success-200': Type.String({ default: '146.2 61.74% 77.45%' }), - '--heroui-success-300': Type.String({ default: '145.79 62.57% 66.47%' }), - '--heroui-success-400': Type.String({ default: '146.01 62.45% 55.1%' }), - '--heroui-success-500': Type.String({ default: '145.96 79.46% 43.92%' }), - '--heroui-success-600': Type.String({ default: '146.01 79.89% 35.1%' }), - '--heroui-success-700': Type.String({ default: '145.79 79.26% 26.47%' }), - '--heroui-success-800': Type.String({ default: '146.2 79.78% 17.45%' }), - '--heroui-success-900': Type.String({ default: '145.71 77.78% 8.82%' }), - '--heroui-success-foreground': Type.String({ default: '0 0% 0%' }), - '--heroui-success': Type.String({ default: '145.96 79.46% 43.92%' }), - // 新增 warning - '--heroui-warning-50': Type.String({ default: '54.55 91.67% 95.29%' }), - '--heroui-warning-100': Type.String({ default: '37.14 91.3% 90.98%' }), - '--heroui-warning-200': Type.String({ default: '37.14 91.3% 81.96%' }), - '--heroui-warning-300': Type.String({ default: '36.96 91.24% 73.14%' }), - '--heroui-warning-400': Type.String({ default: '37.01 91.26% 64.12%' }), - '--heroui-warning-500': Type.String({ default: '37.03 91.27% 55.1%' }), - '--heroui-warning-600': Type.String({ default: '37.01 74.22% 44.12%' }), - '--heroui-warning-700': Type.String({ default: '36.96 73.96% 33.14%' }), - '--heroui-warning-800': Type.String({ default: '37.14 75% 21.96%' }), - '--heroui-warning-900': Type.String({ default: '37.14 75% 10.98%' }), - '--heroui-warning-foreground': Type.String({ default: '0 0% 0%' }), - '--heroui-warning': Type.String({ default: '37.03 91.27% 55.1%' }), - // 其它配置 - '--heroui-code-background': Type.String({ default: '221.25 17.39% 18.04%' }), - '--heroui-strong': Type.String({ default: '316.95 100% 65.29%' }), - '--heroui-code-mdx': Type.String({ default: '316.95 100% 65.29%' }), - '--heroui-divider-weight': Type.String({ default: '1px' }), - '--heroui-disabled-opacity': Type.String({ default: '.5' }), - '--heroui-font-size-tiny': Type.String({ default: '0.75rem' }), - '--heroui-font-size-small': Type.String({ default: '0.875rem' }), - '--heroui-font-size-medium': Type.String({ default: '1rem' }), - '--heroui-font-size-large': Type.String({ default: '1.125rem' }), - '--heroui-line-height-tiny': Type.String({ default: '1rem' }), - '--heroui-line-height-small': Type.String({ default: '1.25rem' }), - '--heroui-line-height-medium': Type.String({ default: '1.5rem' }), - '--heroui-line-height-large': Type.String({ default: '1.75rem' }), - '--heroui-radius-small': Type.String({ default: '8px' }), - '--heroui-radius-medium': Type.String({ default: '12px' }), - '--heroui-radius-large': Type.String({ default: '14px' }), - '--heroui-border-width-small': Type.String({ default: '1px' }), - '--heroui-border-width-medium': Type.String({ default: '2px' }), - '--heroui-border-width-large': Type.String({ default: '3px' }), - '--heroui-box-shadow-small': Type.String({ - default: - '0px 0px 5px 0px rgba(0, 0, 0, .02), 0px 2px 10px 0px rgba(0, 0, 0, .06), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - }), - '--heroui-box-shadow-medium': Type.String({ - default: - '0px 0px 15px 0px rgba(0, 0, 0, .03), 0px 2px 30px 0px rgba(0, 0, 0, .08), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - }), - '--heroui-box-shadow-large': Type.String({ - default: - '0px 0px 30px 0px rgba(0, 0, 0, .04), 0px 30px 60px 0px rgba(0, 0, 0, .12), 0px 0px 1px 0px rgba(0, 0, 0, .3)', - }), - '--heroui-hover-opacity': Type.String({ default: '.8' }), - }, - { default: {} } - ), - }, - { default: {} } - ), + theme: themeType, }); export type WebUiConfigType = Static; @@ -352,7 +77,8 @@ export class WebUiConfigWrapper { async UpdateWebUIConfig(newConfig: Partial): Promise { const configPath = resolve(webUiPathWrapper.configPath, './webui.json'); const currentConfig = await this.GetWebUIConfig(); - const updatedConfig = this.validateAndApplyDefaults({ ...currentConfig, ...newConfig }); + const mergedConfig = deepMerge({ ...currentConfig }, newConfig); + const updatedConfig = this.validateAndApplyDefaults(mergedConfig); await this.writeConfig(configPath, updatedConfig); this.WebUiConfigData = updatedConfig; } @@ -442,12 +168,7 @@ export class WebUiConfigWrapper { // 获取主题内容 async GetTheme(): Promise { const config = await this.GetWebUIConfig(); - if (!config.theme || Object.keys(config.theme).length === 0) { - const defaultConfig = this.validateAndApplyDefaults({}); - config.theme = defaultConfig.theme; - // 更新配置文件中的 theme 字段 - await this.UpdateWebUIConfig({ theme: config.theme }); - } + return config.theme; } diff --git a/src/webui/src/types/theme.ts b/src/webui/src/types/theme.ts new file mode 100644 index 00000000..593eb96c --- /dev/null +++ b/src/webui/src/types/theme.ts @@ -0,0 +1,260 @@ +import { Type } from '@sinclair/typebox'; + +export const themeType = Type.Object( + { + dark: Type.Record(Type.String(), Type.String()), + light: Type.Record(Type.String(), Type.String()), + }, + { + default: { + dark: { + '--heroui-background': '0 0% 0%', + '--heroui-foreground-50': '240 5.88% 10%', + '--heroui-foreground-100': '240 3.7% 15.88%', + '--heroui-foreground-200': '240 5.26% 26.08%', + '--heroui-foreground-300': '240 5.2% 33.92%', + '--heroui-foreground-400': '240 3.83% 46.08%', + '--heroui-foreground-500': '240 5.03% 64.9%', + '--heroui-foreground-600': '240 4.88% 83.92%', + '--heroui-foreground-700': '240 5.88% 90%', + '--heroui-foreground-800': '240 4.76% 95.88%', + '--heroui-foreground-900': '0 0% 98.04%', + '--heroui-foreground': '210 5.56% 92.94%', + '--heroui-focus': '212.01999999999998 100% 46.67%', + '--heroui-overlay': '0 0% 0%', + '--heroui-divider': '0 0% 100%', + '--heroui-divider-opacity': '0.15', + '--heroui-content1': '240 5.88% 10%', + '--heroui-content1-foreground': '0 0% 98.04%', + '--heroui-content2': '240 3.7% 15.88%', + '--heroui-content2-foreground': '240 4.76% 95.88%', + '--heroui-content3': '240 5.26% 26.08%', + '--heroui-content3-foreground': '240 5.88% 90%', + '--heroui-content4': '240 5.2% 33.92%', + '--heroui-content4-foreground': '240 4.88% 83.92%', + '--heroui-default-50': '240 5.88% 10%', + '--heroui-default-100': '240 3.7% 15.88%', + '--heroui-default-200': '240 5.26% 26.08%', + '--heroui-default-300': '240 5.2% 33.92%', + '--heroui-default-400': '240 3.83% 46.08%', + '--heroui-default-500': '240 5.03% 64.9%', + '--heroui-default-600': '240 4.88% 83.92%', + '--heroui-default-700': '240 5.88% 90%', + '--heroui-default-800': '240 4.76% 95.88%', + '--heroui-default-900': '0 0% 98.04%', + '--heroui-default-foreground': '0 0% 100%', + '--heroui-default': '240 5.26% 26.08%', + '--heroui-danger-50': '301.89 82.61% 22.55%', + '--heroui-danger-100': '308.18 76.39% 28.24%', + '--heroui-danger-200': '313.85 70.65% 36.08%', + '--heroui-danger-300': '319.73 65.64% 44.51%', + '--heroui-danger-400': '325.82 69.62% 53.53%', + '--heroui-danger-500': '331.82 75% 65.49%', + '--heroui-danger-600': '337.84 83.46% 73.92%', + '--heroui-danger-700': '343.42 90.48% 83.53%', + '--heroui-danger-800': '350.53 90.48% 91.76%', + '--heroui-danger-900': '324 90.91% 95.69%', + '--heroui-danger-foreground': '0 0% 100%', + '--heroui-danger': '325.82 69.62% 53.53%', + '--heroui-primary-50': '340 84.91% 10.39%', + '--heroui-primary-100': '339.33 86.54% 20.39%', + '--heroui-primary-200': '339.11 85.99% 30.78%', + '--heroui-primary-300': '339 86.54% 40.78%', + '--heroui-primary-400': '339.2 90.36% 51.18%', + '--heroui-primary-500': '339 90% 60.78%', + '--heroui-primary-600': '339.11 90.6% 70.78%', + '--heroui-primary-700': '339.33 90% 80.39%', + '--heroui-primary-800': '340 91.84% 90.39%', + '--heroui-primary-900': '339.13 92% 95.1%', + '--heroui-primary-foreground': '0 0% 100%', + '--heroui-primary': '339.2 90.36% 51.18%', + '--heroui-secondary-50': '270 66.67% 9.41%', + '--heroui-secondary-100': '270 66.67% 18.82%', + '--heroui-secondary-200': '270 66.67% 28.24%', + '--heroui-secondary-300': '270 66.67% 37.65%', + '--heroui-secondary-400': '270 66.67% 47.06%', + '--heroui-secondary-500': '270 59.26% 57.65%', + '--heroui-secondary-600': '270 59.26% 68.24%', + '--heroui-secondary-700': '270 59.26% 78.82%', + '--heroui-secondary-800': '270 59.26% 89.41%', + '--heroui-secondary-900': '270 61.54% 94.9%', + '--heroui-secondary-foreground': '0 0% 100%', + '--heroui-secondary': '270 59.26% 57.65%', + '--heroui-success-50': '145.71 77.78% 8.82%', + '--heroui-success-100': '146.2 79.78% 17.45%', + '--heroui-success-200': '145.79 79.26% 26.47%', + '--heroui-success-300': '146.01 79.89% 35.1%', + '--heroui-success-400': '145.96 79.46% 43.92%', + '--heroui-success-500': '146.01 62.45% 55.1%', + '--heroui-success-600': '145.79 62.57% 66.47%', + '--heroui-success-700': '146.2 61.74% 77.45%', + '--heroui-success-800': '145.71 61.4% 88.82%', + '--heroui-success-900': '146.67 64.29% 94.51%', + '--heroui-success-foreground': '0 0% 0%', + '--heroui-success': '145.96 79.46% 43.92%', + '--heroui-warning-50': '37.14 75% 10.98%', + '--heroui-warning-100': '37.14 75% 21.96%', + '--heroui-warning-200': '36.96 73.96% 33.14%', + '--heroui-warning-300': '37.01 74.22% 44.12%', + '--heroui-warning-400': '37.03 91.27% 55.1%', + '--heroui-warning-500': '37.01 91.26% 64.12%', + '--heroui-warning-600': '36.96 91.24% 73.14%', + '--heroui-warning-700': '37.14 91.3% 81.96%', + '--heroui-warning-800': '37.14 91.3% 90.98%', + '--heroui-warning-900': '54.55 91.67% 95.29%', + '--heroui-warning-foreground': '0 0% 0%', + '--heroui-warning': '37.03 91.27% 55.1%', + '--heroui-code-background': '240 5.56% 7.06%', + '--heroui-strong': '190.14 94.67% 44.12%', + '--heroui-code-mdx': '190.14 94.67% 44.12%', + '--heroui-divider-weight': '1px', + '--heroui-disabled-opacity': '.5', + '--heroui-font-size-tiny': '0.75rem', + '--heroui-font-size-small': '0.875rem', + '--heroui-font-size-medium': '1rem', + '--heroui-font-size-large': '1.125rem', + '--heroui-line-height-tiny': '1rem', + '--heroui-line-height-small': '1.25rem', + '--heroui-line-height-medium': '1.5rem', + '--heroui-line-height-large': '1.75rem', + '--heroui-radius-small': '8px', + '--heroui-radius-medium': '12px', + '--heroui-radius-large': '14px', + '--heroui-border-width-small': '1px', + '--heroui-border-width-medium': '2px', + '--heroui-border-width-large': '3px', + '--heroui-box-shadow-small': + '0px 0px 5px 0px rgba(0, 0, 0, .05), 0px 2px 10px 0px rgba(0, 0, 0, .2), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-box-shadow-medium': + '0px 0px 15px 0px rgba(0, 0, 0, .06), 0px 2px 30px 0px rgba(0, 0, 0, .22), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-box-shadow-large': + '0px 0px 30px 0px rgba(0, 0, 0, .07), 0px 30px 60px 0px rgba(0, 0, 0, .26), inset 0px 0px 1px 0px hsla(0, 0%, 100%, .15)', + '--heroui-hover-opacity': '.9', + }, + light: { + '--heroui-background': '0 0% 100%', + '--heroui-foreground-50': '240 5.88% 95%', + '--heroui-foreground-100': '240 3.7% 90%', + '--heroui-foreground-200': '240 5.26% 80%', + '--heroui-foreground-300': '240 5.2% 70%', + '--heroui-foreground-400': '240 3.83% 60%', + '--heroui-foreground-500': '240 5.03% 50%', + '--heroui-foreground-600': '240 4.88% 40%', + '--heroui-foreground-700': '240 5.88% 30%', + '--heroui-foreground-800': '240 4.76% 20%', + '--heroui-foreground-900': '0 0% 10%', + '--heroui-foreground': '210 5.56% 7.06%', + '--heroui-focus': '212.01999999999998 100% 53.33%', + '--heroui-overlay': '0 0% 100%', + '--heroui-divider': '0 0% 0%', + '--heroui-divider-opacity': '0.85', + '--heroui-content1': '240 5.88% 95%', + '--heroui-content1-foreground': '0 0% 10%', + '--heroui-content2': '240 3.7% 90%', + '--heroui-content2-foreground': '240 4.76% 20%', + '--heroui-content3': '240 5.26% 80%', + '--heroui-content3-foreground': '240 5.88% 30%', + '--heroui-content4': '240 5.2% 70%', + '--heroui-content4-foreground': '240 4.88% 40%', + '--heroui-default-50': '240 5.88% 95%', + '--heroui-default-100': '240 3.7% 90%', + '--heroui-default-200': '240 5.26% 80%', + '--heroui-default-300': '240 5.2% 70%', + '--heroui-default-400': '240 3.83% 60%', + '--heroui-default-500': '240 5.03% 50%', + '--heroui-default-600': '240 4.88% 40%', + '--heroui-default-700': '240 5.88% 30%', + '--heroui-default-800': '240 4.76% 20%', + '--heroui-default-900': '0 0% 10%', + '--heroui-default-foreground': '0 0% 0%', + '--heroui-default': '240 5.26% 80%', + '--heroui-danger-50': '324 90.91% 95.69%', + '--heroui-danger-100': '350.53 90.48% 91.76%', + '--heroui-danger-200': '343.42 90.48% 83.53%', + '--heroui-danger-300': '337.84 83.46% 73.92%', + '--heroui-danger-400': '331.82 75% 65.49%', + '--heroui-danger-500': '325.82 69.62% 53.53%', + '--heroui-danger-600': '319.73 65.64% 44.51%', + '--heroui-danger-700': '313.85 70.65% 36.08%', + '--heroui-danger-800': '308.18 76.39% 28.24%', + '--heroui-danger-900': '301.89 82.61% 22.55%', + '--heroui-danger-foreground': '0 0% 100%', + '--heroui-danger': '325.82 69.62% 53.53%', + '--heroui-primary-50': '339.13 92% 95.1%', + '--heroui-primary-100': '340 91.84% 90.39%', + '--heroui-primary-200': '339.33 90% 80.39%', + '--heroui-primary-300': '339.11 90.6% 70.78%', + '--heroui-primary-400': '339 90% 60.78%', + '--heroui-primary-500': '339.2 90.36% 51.18%', + '--heroui-primary-600': '339 86.54% 40.78%', + '--heroui-primary-700': '339.11 85.99% 30.78%', + '--heroui-primary-800': '339.33 86.54% 20.39%', + '--heroui-primary-900': '340 84.91% 10.39%', + '--heroui-primary-foreground': '0 0% 100%', + '--heroui-primary': '339.2 90.36% 51.18%', + '--heroui-secondary-50': '270 61.54% 94.9%', + '--heroui-secondary-100': '270 59.26% 89.41%', + '--heroui-secondary-200': '270 59.26% 78.82%', + '--heroui-secondary-300': '270 59.26% 68.24%', + '--heroui-secondary-400': '270 59.26% 57.65%', + '--heroui-secondary-500': '270 66.67% 47.06%', + '--heroui-secondary-600': '270 66.67% 37.65%', + '--heroui-secondary-700': '270 66.67% 28.24%', + '--heroui-secondary-800': '270 66.67% 18.82%', + '--heroui-secondary-900': '270 66.67% 9.41%', + '--heroui-secondary-foreground': '0 0% 100%', + '--heroui-secondary': '270 66.67% 47.06%', + '--heroui-success-50': '146.67 64.29% 94.51%', + '--heroui-success-100': '145.71 61.4% 88.82%', + '--heroui-success-200': '146.2 61.74% 77.45%', + '--heroui-success-300': '145.79 62.57% 66.47%', + '--heroui-success-400': '146.01 62.45% 55.1%', + '--heroui-success-500': '145.96 79.46% 43.92%', + '--heroui-success-600': '146.01 79.89% 35.1%', + '--heroui-success-700': '145.79 79.26% 26.47%', + '--heroui-success-800': '146.2 79.78% 17.45%', + '--heroui-success-900': '145.71 77.78% 8.82%', + '--heroui-success-foreground': '0 0% 0%', + '--heroui-success': '145.96 79.46% 43.92%', + '--heroui-warning-50': '54.55 91.67% 95.29%', + '--heroui-warning-100': '37.14 91.3% 90.98%', + '--heroui-warning-200': '37.14 91.3% 81.96%', + '--heroui-warning-300': '36.96 91.24% 73.14%', + '--heroui-warning-400': '37.01 91.26% 64.12%', + '--heroui-warning-500': '37.03 91.27% 55.1%', + '--heroui-warning-600': '37.01 74.22% 44.12%', + '--heroui-warning-700': '36.96 73.96% 33.14%', + '--heroui-warning-800': '37.14 75% 21.96%', + '--heroui-warning-900': '37.14 75% 10.98%', + '--heroui-warning-foreground': '0 0% 0%', + '--heroui-warning': '37.03 91.27% 55.1%', + '--heroui-code-background': '221.25 17.39% 18.04%', + '--heroui-strong': '316.95 100% 65.29%', + '--heroui-code-mdx': '316.95 100% 65.29%', + '--heroui-divider-weight': '1px', + '--heroui-disabled-opacity': '.5', + '--heroui-font-size-tiny': '0.75rem', + '--heroui-font-size-small': '0.875rem', + '--heroui-font-size-medium': '1rem', + '--heroui-font-size-large': '1.125rem', + '--heroui-line-height-tiny': '1rem', + '--heroui-line-height-small': '1.25rem', + '--heroui-line-height-medium': '1.5rem', + '--heroui-line-height-large': '1.75rem', + '--heroui-radius-small': '8px', + '--heroui-radius-medium': '12px', + '--heroui-radius-large': '14px', + '--heroui-border-width-small': '1px', + '--heroui-border-width-medium': '2px', + '--heroui-border-width-large': '3px', + '--heroui-box-shadow-small': + '0px 0px 5px 0px rgba(0, 0, 0, .02), 0px 2px 10px 0px rgba(0, 0, 0, .06), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-box-shadow-medium': + '0px 0px 15px 0px rgba(0, 0, 0, .03), 0px 2px 30px 0px rgba(0, 0, 0, .08), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-box-shadow-large': + '0px 0px 30px 0px rgba(0, 0, 0, .04), 0px 30px 60px 0px rgba(0, 0, 0, .12), 0px 0px 1px 0px rgba(0, 0, 0, .3)', + '--heroui-hover-opacity': '.8', + }, + }, + } +); diff --git a/src/webui/src/utils/object.ts b/src/webui/src/utils/object.ts new file mode 100644 index 00000000..e0fe8b55 --- /dev/null +++ b/src/webui/src/utils/object.ts @@ -0,0 +1,22 @@ +export function deepMerge>(target: T, source: Partial): T { + for (const key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + // 如果 source[key] 为 undefined,则跳过(保留 target[key]) + if (source[key] === undefined) { + continue; + } + if ( + target[key] !== undefined && + typeof target[key] === 'object' && + !Array.isArray(target[key]) && + typeof source[key] === 'object' && + !Array.isArray(source[key]) + ) { + target[key] = deepMerge({ ...target[key] }, source[key]!) as T[Extract]; + } else { + target[key] = source[key]! as T[Extract]; + } + } + } + return target; +}