diff --git a/apps/web-antd/src/router/routes/modules/vben.ts b/apps/web-antd/src/router/routes/modules/vben.ts index 2d1a50de..21d0c58e 100644 --- a/apps/web-antd/src/router/routes/modules/vben.ts +++ b/apps/web-antd/src/router/routes/modules/vben.ts @@ -12,7 +12,7 @@ const routes: RouteRecordRaw[] = [ badgeType: 'dot', icon: VBEN_LOGO_URL, order: 9999, - title: 'Vben Admin', + title: 'Vben', }, name: 'AboutLayout', path: '/vben-admin', diff --git a/internal/tailwind-config/src/index.ts b/internal/tailwind-config/src/index.ts index 247d518d..620e2552 100644 --- a/internal/tailwind-config/src/index.ts +++ b/internal/tailwind-config/src/index.ts @@ -27,6 +27,8 @@ packages.forEach((pkg) => { const shadcnUiColors = { accent: { DEFAULT: 'hsl(var(--accent))', + dark: 'hsl(var(--accent-dark))', + 'dark-hover': 'hsl(var(--accent-dark-hover))', foreground: 'hsl(var(--accent-foreground))', hover: 'hsl(var(--accent-hover))', }, @@ -34,17 +36,23 @@ const shadcnUiColors = { DEFAULT: 'hsl(var(--background))', content: 'hsl(var(--background-content))', }, - border: 'hsl(var(--border))', + border: { + DEFAULT: 'hsl(var(--border))', + dark: 'hsl(var(--border-dark))', + }, card: { DEFAULT: 'hsl(var(--card))', foreground: 'hsl(var(--card-foreground))', }, destructive: { - ...createColorsPattern('destructive'), + ...createColorsPalette('destructive'), DEFAULT: 'hsl(var(--destructive))', }, - foreground: 'hsl(var(--foreground))', + foreground: { + DEFAULT: 'hsl(var(--foreground))', + dark: 'hsl(var(--foreground-dark))', + }, input: { DEFAULT: 'hsl(var(--input))', @@ -59,7 +67,7 @@ const shadcnUiColors = { foreground: 'hsl(var(--popover-foreground))', }, primary: { - ...createColorsPattern('primary'), + ...createColorsPalette('primary'), DEFAULT: 'hsl(var(--primary))', }, @@ -76,7 +84,7 @@ const customColors = { DEFAULT: 'hsl(var(--authentication))', }, green: { - ...createColorsPattern('green'), + ...createColorsPalette('green'), foreground: 'hsl(var(--success-foreground))', }, heavy: { @@ -88,19 +96,19 @@ const customColors = { }, overlay: 'hsl(var(--overlay))', red: { - ...createColorsPattern('red'), + ...createColorsPalette('red'), foreground: 'hsl(var(--destructive-foreground))', }, success: { - ...createColorsPattern('success'), + ...createColorsPalette('success'), DEFAULT: 'hsl(var(--success))', }, warning: { - ...createColorsPattern('warning'), + ...createColorsPalette('warning'), DEFAULT: 'hsl(var(--warning))', }, yellow: { - ...createColorsPattern('yellow'), + ...createColorsPalette('yellow'), foreground: 'hsl(var(--warning-foreground))', }, }; @@ -189,7 +197,31 @@ export default { }, } as Config; -function createColorsPattern(name: string) { +function createColorsPalette(name: string) { + // backgroundLightest: '#EFF6FF', // Tailwind CSS 默认的 `blue-50` + // backgroundLighter: '#DBEAFE', // Tailwind CSS 默认的 `blue-100` + // backgroundLight: '#BFDBFE', // Tailwind CSS 默认的 `blue-200` + // borderLight: '#93C5FD', // Tailwind CSS 默认的 `blue-300` + // border: '#60A5FA', // Tailwind CSS 默认的 `blue-400` + // main: '#3B82F6', // Tailwind CSS 默认的 `blue-500` + // hover: '#2563EB', // Tailwind CSS 默认的 `blue-600` + // active: '#1D4ED8', // Tailwind CSS 默认的 `blue-700` + // backgroundDark: '#1E40AF', // Tailwind CSS 默认的 `blue-800` + // backgroundDarker: '#1E3A8A', // Tailwind CSS 默认的 `blue-900` + // backgroundDarkest: '#172554', // Tailwind CSS 默认的 `blue-950` + + // • backgroundLightest (#EFF6FF): 适用于最浅的背景色,可能用于非常轻微的阴影或卡片的背景。 + // • backgroundLighter (#DBEAFE): 适用于略浅的背景色,通常用于次要背景或略浅的区域。 + // • backgroundLight (#BFDBFE): 适用于浅色背景,可能用于输入框或表单区域的背景。 + // • borderLight (#93C5FD): 适用于浅色边框,可能用于输入框或卡片的边框。 + // • border (#60A5FA): 适用于普通边框,可能用于按钮或卡片的边框。 + // • main (#3B82F6): 适用于主要的主题色,通常用于按钮、链接或主要的强调色。 + // • hover (#2563EB): 适用于鼠标悬停状态下的颜色,例如按钮悬停时的背景色或边框色。 + // • active (#1D4ED8): 适用于激活状态下的颜色,例如按钮按下时的背景色或边框色。 + // • backgroundDark (#1E40AF): 适用于深色背景,可能用于主要按钮或深色卡片背景。 + // • backgroundDarker (#1E3A8A): 适用于更深的背景,通常用于头部导航栏或页脚。 + // • backgroundDarkest (#172554): 适用于最深的背景,可能用于非常深色的区域或极端对比色。 + return { 50: `hsl(var(--${name}-50))`, 100: `hsl(var(--${name}-100))`, @@ -199,18 +231,29 @@ function createColorsPattern(name: string) { 500: `hsl(var(--${name}-500))`, 600: `hsl(var(--${name}-600))`, 700: `hsl(var(--${name}-700))`, - 800: `hsl(var(--${name}-800))`, - 900: `hsl(var(--${name}-900))`, - 950: `hsl(var(--${name}-950))`, - active: `hsl(var(--${name}-600))`, - background: `hsl(var(--${name}-50))`, - 'background-hover': `hsl(var(--${name}-100))`, - border: `hsl(var(--${name}-200))`, - 'border-hover': `hsl(var(--${name}-300))`, + // 800: `hsl(var(--${name}-800))`, + // 900: `hsl(var(--${name}-900))`, + // 950: `hsl(var(--${name}-950))`, + // 激活状态下的颜色,适用于按钮按下时的背景色或边框色。 + active: `hsl(var(--${name}-700))`, + // 浅色背景,适用于输入框或表单区域的背景。 + 'background-light': `hsl(var(--${name}-200))`, + // 适用于略浅的背景色,通常用于次要背景或略浅的区域。 + 'background-lighter': `hsl(var(--${name}-100))`, + // 最浅的背景色,适用于非常轻微的阴影或卡片的背景。 + 'background-lightest': `hsl(var(--${name}-50))`, + // 适用于普通边框,可能用于按钮或卡片的边框。 + border: `hsl(var(--${name}-400))`, + // 浅色边框,适用于输入框或卡片的边框。 + 'border-light': `hsl(var(--${name}-300))`, foreground: `hsl(var(--${name}-foreground))`, - hover: `hsl(var(--${name}-400))`, - text: `hsl(var(--${name}-800))`, - 'text-active': `hsl(var(--${name}-900))`, - 'text-hover': `hsl(var(--${name}-700))`, + // 鼠标悬停状态下的颜色,适用于按钮悬停时的背景色或边框色。 + hover: `hsl(var(--${name}-600))`, + // 主色文本 + text: `hsl(var(--${name}-500))`, + // 主色文本激活态 + 'text-active': `hsl(var(--${name}-700))`, + // 主色文本悬浮态 + 'text-hover': `hsl(var(--${name}-600))`, }; } diff --git a/packages/@core/forward/preferences/src/preferences.ts b/packages/@core/forward/preferences/src/preferences.ts index 57e474d1..ae8cb118 100644 --- a/packages/@core/forward/preferences/src/preferences.ts +++ b/packages/@core/forward/preferences/src/preferences.ts @@ -174,18 +174,18 @@ class PreferenceManager { if (colorPrimary) { document.documentElement.style.setProperty( '--primary', - colorVariables['--primary-600'], + colorVariables['--primary-500'], ); } - if (colorVariables['--green-600']) { - colorVariables['--success'] = colorVariables['--green-600']; + if (colorVariables['--green-500']) { + colorVariables['--success'] = colorVariables['--green-500']; } - if (colorVariables['--yellow-600']) { - colorVariables['--warning'] = colorVariables['--yellow-600']; + if (colorVariables['--yellow-500']) { + colorVariables['--warning'] = colorVariables['--yellow-500']; } - if (colorVariables['--red-600']) { - colorVariables['--destructive'] = colorVariables['--red-600']; + if (colorVariables['--red-500']) { + colorVariables['--destructive'] = colorVariables['--red-500']; } updateCSSVariables(colorVariables); } diff --git a/packages/@core/shared/hooks/build.config.ts b/packages/@core/hooks/build.config.ts similarity index 100% rename from packages/@core/shared/hooks/build.config.ts rename to packages/@core/hooks/build.config.ts diff --git a/packages/@core/shared/hooks/package.json b/packages/@core/hooks/package.json similarity index 85% rename from packages/@core/shared/hooks/package.json rename to packages/@core/hooks/package.json index 4a57317e..f969ebd5 100644 --- a/packages/@core/shared/hooks/package.json +++ b/packages/@core/hooks/package.json @@ -36,8 +36,12 @@ } }, "dependencies": { + "@vben-core/constants": "workspace:*", + "@vben-core/toolkit": "workspace:*", + "@vueuse/core": "^10.11.0", "radix-vue": "^1.9.1", - "sortablejs": "^1.15.2" + "sortablejs": "^1.15.2", + "vue": "^3.4.31" }, "devDependencies": { "@types/sortablejs": "^1.15.8" diff --git a/packages/@core/shared/hooks/src/index.ts b/packages/@core/hooks/src/index.ts similarity index 82% rename from packages/@core/shared/hooks/src/index.ts rename to packages/@core/hooks/src/index.ts index 301da1ce..f2abfedf 100644 --- a/packages/@core/shared/hooks/src/index.ts +++ b/packages/@core/hooks/src/index.ts @@ -1,3 +1,4 @@ +export * from './use-content-height'; export * from './use-namespace'; export * from './use-sortable'; export { diff --git a/packages/@core/hooks/src/use-content-height.ts b/packages/@core/hooks/src/use-content-height.ts new file mode 100644 index 00000000..529a9fef --- /dev/null +++ b/packages/@core/hooks/src/use-content-height.ts @@ -0,0 +1,45 @@ +import { computed, onMounted, ref, watch } from 'vue'; + +import { CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT } from '@vben-core/constants'; +import { getElementVisibleHeight } from '@vben-core/toolkit'; + +import { useCssVar, useDebounceFn, useWindowSize } from '@vueuse/core'; +/** + * @zh_CN 获取内容高度(可视区域,不包含滚动条) + */ +function useContentHeight() { + const contentHeight = useCssVar(CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT); + + const contentStyles = computed(() => { + return { + height: `var(${CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT})`, + }; + }); + + return { contentHeight, contentStyles }; +} + +/** + * @zh_CN 创建内容高度监听 + */ +function useContentHeightListener() { + const contentElement = ref(null); + + const { height, width } = useWindowSize(); + const contentHeight = useCssVar(CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT); + const debouncedCalcHeight = useDebounceFn(() => { + contentHeight.value = `${getElementVisibleHeight(contentElement.value)}px`; + }, 200); + + watch([height, width], () => { + debouncedCalcHeight(); + }); + + onMounted(() => { + debouncedCalcHeight(); + }); + + return { contentElement }; +} + +export { useContentHeight, useContentHeightListener }; diff --git a/packages/@core/shared/hooks/src/use-namespace.ts b/packages/@core/hooks/src/use-namespace.ts similarity index 100% rename from packages/@core/shared/hooks/src/use-namespace.ts rename to packages/@core/hooks/src/use-namespace.ts diff --git a/packages/@core/shared/hooks/src/use-sortable.test.ts b/packages/@core/hooks/src/use-sortable.test.ts similarity index 100% rename from packages/@core/shared/hooks/src/use-sortable.test.ts rename to packages/@core/hooks/src/use-sortable.test.ts diff --git a/packages/@core/shared/hooks/src/use-sortable.ts b/packages/@core/hooks/src/use-sortable.ts similarity index 100% rename from packages/@core/shared/hooks/src/use-sortable.ts rename to packages/@core/hooks/src/use-sortable.ts diff --git a/packages/@core/shared/hooks/tsconfig.json b/packages/@core/hooks/tsconfig.json similarity index 100% rename from packages/@core/shared/hooks/tsconfig.json rename to packages/@core/hooks/tsconfig.json diff --git a/packages/@core/shared/constants/src/global.ts b/packages/@core/shared/constants/src/global.ts new file mode 100644 index 00000000..402b962d --- /dev/null +++ b/packages/@core/shared/constants/src/global.ts @@ -0,0 +1,15 @@ +// --vben-content-client-height + +/** + * @zh_CN CSS 变量前缀 + * @en_US CSS variable prefix + */ +const CSS_VARIABLE_PREFIX = '--vben'; + +/** + * @zh_CN 布局内容高度 css变量 + * @en_US Layout content height + */ +const CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT = `${CSS_VARIABLE_PREFIX}-content-height`; + +export { CSS_VARIABLE_LAYOUT_CONTENT_HEIGHT, CSS_VARIABLE_PREFIX }; diff --git a/packages/@core/shared/constants/src/index.ts b/packages/@core/shared/constants/src/index.ts index dfad89cb..976def69 100644 --- a/packages/@core/shared/constants/src/index.ts +++ b/packages/@core/shared/constants/src/index.ts @@ -1,22 +1,2 @@ -/** - * @zh_CN GITHUB 仓库地址 - */ -const VBEN_GITHUB_URL = 'https://github.com/vbenjs/vue-vben-admin'; - -/** - * @zh_CN 文档地址 - */ -const VBEN_DOC_URL = 'https://doc.vben.pro'; - -/** - * @zh_CN Vben Logo - */ -const VBEN_LOGO_URL = - 'https://cdn.jsdelivr.net/npm/@vbenjs/static-source@0.1.3/source/logo-v1.webp'; - -/** - * @zh_CN Vben Admin 首页地址 - */ -const VBEN_PREVIEW_URL = 'https://vben.pro'; - -export { VBEN_DOC_URL, VBEN_GITHUB_URL, VBEN_LOGO_URL, VBEN_PREVIEW_URL }; +export * from './global'; +export * from './vben'; diff --git a/packages/@core/shared/constants/src/vben.ts b/packages/@core/shared/constants/src/vben.ts new file mode 100644 index 00000000..dfad89cb --- /dev/null +++ b/packages/@core/shared/constants/src/vben.ts @@ -0,0 +1,22 @@ +/** + * @zh_CN GITHUB 仓库地址 + */ +const VBEN_GITHUB_URL = 'https://github.com/vbenjs/vue-vben-admin'; + +/** + * @zh_CN 文档地址 + */ +const VBEN_DOC_URL = 'https://doc.vben.pro'; + +/** + * @zh_CN Vben Logo + */ +const VBEN_LOGO_URL = + 'https://cdn.jsdelivr.net/npm/@vbenjs/static-source@0.1.3/source/logo-v1.webp'; + +/** + * @zh_CN Vben Admin 首页地址 + */ +const VBEN_PREVIEW_URL = 'https://vben.pro'; + +export { VBEN_DOC_URL, VBEN_GITHUB_URL, VBEN_LOGO_URL, VBEN_PREVIEW_URL }; diff --git a/packages/@core/shared/design/src/design-tokens/dark/index.css b/packages/@core/shared/design/src/design-tokens/dark/index.css index 0e7735be..824d5570 100644 --- a/packages/@core/shared/design/src/design-tokens/dark/index.css +++ b/packages/@core/shared/design/src/design-tokens/dark/index.css @@ -56,7 +56,7 @@ --heavy-foreground: var(--accent-foreground); /* Default border color */ - --border: 215 27.9% 16.9%; + --border: 240 3.7% 15.9%; /* Border color for inputs such as ,