diff --git a/apps/web-tdesign/src/bootstrap.ts b/apps/web-tdesign/src/bootstrap.ts index 732030e1a7e..5d07717c67c 100644 --- a/apps/web-tdesign/src/bootstrap.ts +++ b/apps/web-tdesign/src/bootstrap.ts @@ -5,6 +5,8 @@ import { registerLoadingDirective } from '@vben/common-ui/es/loading'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; +// import '@vben/styles/antd'; +// 引入组件库的少量全局样式变量 import { useTitle } from '@vueuse/core'; @@ -15,8 +17,6 @@ import { initSetupVbenForm } from './adapter/form'; import App from './app.vue'; import { router } from './router'; -// import '@vben/styles/antd'; -// 引入组件库的少量全局样式变量 import 'tdesign-vue-next/es/style/index.css'; async function bootstrap(namespace: string) { diff --git a/packages/@core/base/design/src/css/global.css b/packages/@core/base/design/src/css/global.css index d19990985ed..dc154fc7242 100644 --- a/packages/@core/base/design/src/css/global.css +++ b/packages/@core/base/design/src/css/global.css @@ -14,8 +14,9 @@ } html { - @apply text-foreground bg-background font-sans text-[100%]; + @apply text-foreground bg-background font-sans; + font-size: var(--font-size-base, 16px); font-variation-settings: normal; line-height: 1.15; text-size-adjust: 100%; diff --git a/packages/@core/base/design/src/design-tokens/default.css b/packages/@core/base/design/src/design-tokens/default.css index 64679f85420..4ce7ff9547f 100644 --- a/packages/@core/base/design/src/design-tokens/default.css +++ b/packages/@core/base/design/src/design-tokens/default.css @@ -93,6 +93,7 @@ /* 基本文字大小 */ --font-size-base: 16px; + --menu-font-size: calc(var(--font-size-base) * 0.875); /* =============component & UI============= */ diff --git a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap index a6452b39930..a3c0c31759d 100644 --- a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap +++ b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap @@ -113,6 +113,7 @@ exports[`defaultPreferences immutability test > should not modify the config obj "colorPrimary": "hsl(212 100% 45%)", "colorSuccess": "hsl(144 57% 58%)", "colorWarning": "hsl(42 84% 61%)", + "fontSize": 16, "mode": "dark", "radius": "0.5", "semiDarkHeader": false, diff --git a/packages/@core/preferences/src/config.ts b/packages/@core/preferences/src/config.ts index 5b8d7236398..d9977b1ef58 100644 --- a/packages/@core/preferences/src/config.ts +++ b/packages/@core/preferences/src/config.ts @@ -116,6 +116,7 @@ const defaultPreferences: Preferences = { colorWarning: 'hsl(42 84% 61%)', mode: 'dark', radius: '0.5', + fontSize: 16, semiDarkHeader: false, semiDarkSidebar: false, }, diff --git a/packages/@core/preferences/src/preferences.ts b/packages/@core/preferences/src/preferences.ts index 9ac8fb05484..7fb245e31b2 100644 --- a/packages/@core/preferences/src/preferences.ts +++ b/packages/@core/preferences/src/preferences.ts @@ -141,7 +141,10 @@ class PreferenceManager { private handleUpdates(updates: DeepPartial) { const themeUpdates = updates.theme || {}; const appUpdates = updates.app || {}; - if (themeUpdates && Object.keys(themeUpdates).length > 0) { + if ( + (themeUpdates && Object.keys(themeUpdates).length > 0) || + Reflect.has(themeUpdates, 'fontSize') + ) { updateCSSVariables(this.state); } diff --git a/packages/@core/preferences/src/types.ts b/packages/@core/preferences/src/types.ts index 9a4d94bdf09..17224b04883 100644 --- a/packages/@core/preferences/src/types.ts +++ b/packages/@core/preferences/src/types.ts @@ -239,6 +239,8 @@ interface ThemePreferences { colorSuccess: string; /** 警告色 */ colorWarning: string; + /** 字体大小(单位:px) */ + fontSize: number; /** 当前主题 */ mode: ThemeModeType; /** 圆角 */ diff --git a/packages/@core/preferences/src/update-css-variables.ts b/packages/@core/preferences/src/update-css-variables.ts index 0d3466a017d..6ee5f748c04 100644 --- a/packages/@core/preferences/src/update-css-variables.ts +++ b/packages/@core/preferences/src/update-css-variables.ts @@ -66,6 +66,19 @@ function updateCSSVariables(preferences: Preferences) { if (Reflect.has(theme, 'radius')) { document.documentElement.style.setProperty('--radius', `${radius}rem`); } + + // 更新字体大小 + if (Reflect.has(theme, 'fontSize')) { + const fontSize = theme.fontSize; + document.documentElement.style.setProperty( + '--font-size-base', + `${fontSize}px`, + ); + document.documentElement.style.setProperty( + '--menu-font-size', + `calc(${fontSize}px * 0.875)`, + ); + } } /** diff --git a/packages/@core/ui-kit/menu-ui/src/components/menu.vue b/packages/@core/ui-kit/menu-ui/src/components/menu.vue index 88760456747..237aff00aa4 100644 --- a/packages/@core/ui-kit/menu-ui/src/components/menu.vue +++ b/packages/@core/ui-kit/menu-ui/src/components/menu.vue @@ -388,7 +388,7 @@ $namespace: vben; padding: var(--menu-item-padding-y) var(--menu-item-padding-x); margin: 0 var(--menu-item-margin-x) var(--menu-item-margin-y) var(--menu-item-margin-x); - font-size: var(--menu-font-size); + font-size: var(--menu-font-size) !important; color: var(--menu-item-color); white-space: nowrap; text-decoration: none; @@ -433,6 +433,7 @@ $namespace: vben; max-width: var(--menu-title-width); overflow: hidden; text-overflow: ellipsis; + font-size: var(--menu-font-size) !important; white-space: nowrap; opacity: 1; } @@ -444,7 +445,7 @@ $namespace: vben; .#{$namespace}-menu__popup-container, .#{$namespace}-menu { --menu-title-width: 140px; - --menu-item-icon-size: 16px; + --menu-item-icon-size: var(--font-size-base, 16px); --menu-item-height: 38px; --menu-item-padding-y: 21px; --menu-item-padding-x: 12px; @@ -458,7 +459,6 @@ $namespace: vben; --menu-item-collapse-margin-x: 0px; --menu-item-radius: 0px; --menu-item-indent: 16px; - --menu-font-size: 14px; &.is-dark { --menu-background-color: hsl(var(--menu)); @@ -752,7 +752,7 @@ $namespace: vben; } .#{$namespace}-menu__icon { display: block; - font-size: 20px !important; + font-size: calc(var(--font-size-base, 16px) * 1.25) !important; transition: all 0.25s ease; } @@ -760,7 +760,7 @@ $namespace: vben; display: inline-flex; margin-top: 8px; margin-bottom: 0; - font-size: 12px; + font-size: calc(var(--font-size-base, 16px) * 0.75); font-weight: 400; line-height: normal; transition: all 0.25s ease; @@ -785,7 +785,7 @@ $namespace: vben; width: 100%; height: 100%; padding: 0 var(--menu-item-padding-x); - font-size: var(--menu-font-size); + font-size: var(--menu-font-size) !important; line-height: var(--menu-item-height); } } @@ -812,9 +812,14 @@ $namespace: vben; .#{$namespace}-sub-menu-content { height: var(--menu-item-height); + font-size: var(--menu-font-size) !important; @include menu-item; + * { + font-size: inherit !important; + } + &__icon-arrow { position: absolute; top: 50%; diff --git a/packages/@core/ui-kit/menu-ui/src/components/normal-menu/normal-menu.vue b/packages/@core/ui-kit/menu-ui/src/components/normal-menu/normal-menu.vue index e0947b00e2a..86e86c914ca 100644 --- a/packages/@core/ui-kit/menu-ui/src/components/normal-menu/normal-menu.vue +++ b/packages/@core/ui-kit/menu-ui/src/components/normal-menu/normal-menu.vue @@ -102,7 +102,7 @@ $namespace: vben; } .#{$namespace}-normal-menu__icon { - font-size: 20px; + font-size: calc(var(--font-size-base, 16px) * 1.25); } } @@ -146,14 +146,14 @@ $namespace: vben; &__icon { max-height: 20px; - font-size: 20px; + font-size: calc(var(--font-size-base, 16px) * 1.25); transition: all 0.25s ease; } &__name { margin-top: 8px; margin-bottom: 0; - font-size: 12px; + font-size: calc(var(--font-size-base, 16px) * 0.75); font-weight: 400; transition: all 0.25s ease; } diff --git a/packages/effects/layouts/src/widgets/preferences/blocks/index.ts b/packages/effects/layouts/src/widgets/preferences/blocks/index.ts index 59595dc480e..cdd6bb1db6a 100644 --- a/packages/effects/layouts/src/widgets/preferences/blocks/index.ts +++ b/packages/effects/layouts/src/widgets/preferences/blocks/index.ts @@ -15,5 +15,6 @@ export { default as GlobalShortcutKeys } from './shortcut-keys/global.vue'; export { default as SwitchItem } from './switch-item.vue'; export { default as BuiltinTheme } from './theme/builtin.vue'; export { default as ColorMode } from './theme/color-mode.vue'; +export { default as FontSize } from './theme/font-size.vue'; export { default as Radius } from './theme/radius.vue'; export { default as Theme } from './theme/theme.vue'; diff --git a/packages/effects/layouts/src/widgets/preferences/blocks/theme/font-size.vue b/packages/effects/layouts/src/widgets/preferences/blocks/theme/font-size.vue new file mode 100644 index 00000000000..b1aaa2d819c --- /dev/null +++ b/packages/effects/layouts/src/widgets/preferences/blocks/theme/font-size.vue @@ -0,0 +1,62 @@ + + + diff --git a/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue b/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue index 301004d6e6b..c88a9bc45d0 100644 --- a/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue +++ b/packages/effects/layouts/src/widgets/preferences/preferences-drawer.vue @@ -43,6 +43,7 @@ import { ColorMode, Content, Copyright, + FontSize, Footer, General, GlobalShortcutKeys, @@ -85,6 +86,7 @@ const themeColorPrimary = defineModel('themeColorPrimary'); const themeBuiltinType = defineModel('themeBuiltinType'); const themeMode = defineModel('themeMode'); const themeRadius = defineModel('themeRadius'); +const themeFontSize = defineModel('themeFontSize'); const themeSemiDarkSidebar = defineModel('themeSemiDarkSidebar'); const themeSemiDarkHeader = defineModel('themeSemiDarkHeader'); @@ -328,6 +330,9 @@ async function handleReset() { + + +