-
{
- const list = [{ index: 30, name: 'user-dropdown' }];
+ const list = [{ index: 100, name: 'user-dropdown' }];
if (preferences.widget.globalSearch) {
list.push({
index: 5,
name: 'global-search',
});
}
- if (preferences.widget.themeToggle) {
+
+ if (
+ preferences.app.enablePreferences &&
+ preferences.app.preferencesButtonPosition === 'header'
+ ) {
list.push({
index: 10,
+ name: 'preferences',
+ });
+ }
+ if (preferences.widget.themeToggle) {
+ list.push({
+ index: 15,
name: 'theme-toggle',
});
}
if (preferences.widget.languageToggle) {
list.push({
- index: 15,
+ index: 20,
name: 'language-toggle',
});
}
if (preferences.widget.fullscreen) {
list.push({
- index: 20,
+ index: 25,
name: 'fullscreen',
});
}
if (preferences.widget.notification) {
list.push({
- index: 25,
+ index: 30,
name: 'notification',
});
}
@@ -66,6 +81,7 @@ const rightSlots = computed(() => {
});
return list.sort((a, b) => a.index - b.index);
});
+
const leftSlots = computed(() => {
const list: any[] = [];
@@ -108,8 +124,12 @@ const leftSlots = computed(() => {
class="mr-4"
/>
+
+
+
+
-
+
diff --git a/packages/effects/layouts/src/basic/layout.vue b/packages/effects/layouts/src/basic/layout.vue
index d82fb6b9..d2323000 100644
--- a/packages/effects/layouts/src/basic/layout.vue
+++ b/packages/effects/layouts/src/basic/layout.vue
@@ -41,17 +41,19 @@ const {
isSideMixedNav,
layout,
sidebarCollapsed,
+ theme,
} = usePreferences();
const userStore = useUserStore();
const { updateWatermark } = useWatermark();
const lockStore = useLockStore();
-const headerMenuTheme = computed(() => {
- return isDark.value ? 'dark' : 'light';
+const sidebarTheme = computed(() => {
+ const dark = isDark.value || preferences.theme.semiDarkSidebar;
+ return dark ? 'dark' : 'light';
});
-const theme = computed(() => {
- const dark = isDark.value || preferences.theme.semiDarkMenu;
+const headerTheme = computed(() => {
+ const dark = isDark.value || preferences.theme.semiDarkHeader;
return dark ? 'dark' : 'light';
});
@@ -160,6 +162,7 @@ const headerSlots = computed(() => {
:footer-fixed="preferences.footer.fixed"
:header-hidden="preferences.header.hidden"
:header-mode="preferences.header.mode"
+ :header-theme="headerTheme"
:header-toggle-sidebar-button="preferences.widget.sidebarToggle"
:header-visible="preferences.header.enable"
:is-mobile="preferences.app.isMobile"
@@ -170,8 +173,7 @@ const headerSlots = computed(() => {
:sidebar-expand-on-hover="preferences.sidebar.expandOnHover"
:sidebar-extra-collapse="preferences.sidebar.extraCollapse"
:sidebar-hidden="preferences.sidebar.hidden"
- :sidebar-semi-dark="preferences.theme.semiDarkMenu"
- :sidebar-theme="theme"
+ :sidebar-theme="sidebarTheme"
:sidebar-width="preferences.sidebar.width"
:tabbar-enable="preferences.tabbar.enable"
:tabbar-height="preferences.tabbar.height"
@@ -192,14 +194,6 @@ const headerSlots = computed(() => {
updatePreferences({ sidebar: { extraCollapse: value } })
"
>
-
-
-
-
-
-
-
-
{
:collapsed="logoCollapsed"
:src="preferences.logo.source"
:text="preferences.app.name"
- :theme="showHeaderNav ? headerMenuTheme : theme"
+ :theme="showHeaderNav ? headerTheme : theme"
/>
@@ -230,7 +224,7 @@ const headerSlots = computed(() => {
:default-active="headerActive"
:menus="wrapperMenus(headerMenus)"
:rounded="isMenuRounded"
- :theme="headerMenuTheme"
+ :theme="headerTheme"
class="w-full"
mode="horizontal"
@select="handleMenuSelect"
@@ -256,7 +250,7 @@ const headerSlots = computed(() => {
:default-active="sidebarActive"
:menus="wrapperMenus(sidebarMenus)"
:rounded="isMenuRounded"
- :theme="theme"
+ :theme="sidebarTheme"
mode="vertical"
@select="handleMenuSelect"
/>
@@ -267,7 +261,7 @@ const headerSlots = computed(() => {
:active-path="extraActiveMenu"
:menus="wrapperMenus(headerMenus)"
:rounded="isMenuRounded"
- :theme="theme"
+ :theme="sidebarTheme"
@default-select="handleDefaultSelect"
@enter="handleMenuMouseEnter"
@select="handleMixedMenuSelect"
@@ -280,7 +274,7 @@ const headerSlots = computed(() => {
:collapse="preferences.sidebar.extraCollapse"
:menus="wrapperMenus(extraMenus)"
:rounded="isMenuRounded"
- :theme="theme"
+ :theme="sidebarTheme"
/>
@@ -325,6 +319,19 @@ const headerSlots = computed(() => {
+
+
+
+
+
diff --git a/packages/effects/layouts/src/iframe/iframe-router-view.vue b/packages/effects/layouts/src/iframe/iframe-router-view.vue
index e1bb6293..0e45ed96 100644
--- a/packages/effects/layouts/src/iframe/iframe-router-view.vue
+++ b/packages/effects/layouts/src/iframe/iframe-router-view.vue
@@ -6,7 +6,7 @@ import { useRoute } from 'vue-router';
import { preferences } from '@vben/preferences';
import { useTabbarStore } from '@vben/stores';
-import { Spinner } from '@vben-core/shadcn-ui';
+import { VbenSpinner } from '@vben-core/shadcn-ui';
defineOptions({ name: 'IFrameRouterView' });
@@ -73,7 +73,7 @@ function showSpinning(index: number) {
v-show="routeShow(item)"
class="relative size-full"
>
-
+
diff --git a/packages/effects/layouts/src/widgets/preferences/index.ts b/packages/effects/layouts/src/widgets/preferences/index.ts
index f5e7a961..0a7d32cc 100644
--- a/packages/effects/layouts/src/widgets/preferences/index.ts
+++ b/packages/effects/layouts/src/widgets/preferences/index.ts
@@ -1,2 +1,3 @@
export { default as Preferences } from './preferences.vue';
+export { default as PreferencesButton } from './preferences-button.vue';
export * from './use-open-preferences';
diff --git a/packages/effects/layouts/src/widgets/preferences/preferences-button.vue b/packages/effects/layouts/src/widgets/preferences/preferences-button.vue
new file mode 100644
index 00000000..301e6454
--- /dev/null
+++ b/packages/effects/layouts/src/widgets/preferences/preferences-button.vue
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
diff --git a/packages/effects/layouts/src/widgets/preferences/preferences-sheet.vue b/packages/effects/layouts/src/widgets/preferences/preferences-sheet.vue
index 954d5e1c..76fb6793 100644
--- a/packages/effects/layouts/src/widgets/preferences/preferences-sheet.vue
+++ b/packages/effects/layouts/src/widgets/preferences/preferences-sheet.vue
@@ -7,13 +7,14 @@ import type {
LayoutHeaderModeType,
LayoutType,
NavigationStyleType,
+ PreferencesButtonPositionType,
ThemeModeType,
} from '@vben/types';
import type { SegmentedItem } from '@vben-core/shadcn-ui';
import { computed, ref } from 'vue';
-import { Copy, RotateCw, Settings2 } from '@vben/icons';
+import { Copy, RotateCw, Settings } from '@vben/icons';
import { $t, loadLocaleMessages } from '@vben/locales';
import {
clearPreferencesCache,
@@ -63,6 +64,9 @@ const appColorWeakMode = defineModel
('appColorWeakMode');
const appContentCompact = defineModel('appContentCompact');
const appWatermark = defineModel('appWatermark');
const appEnableCheckUpdates = defineModel('appEnableCheckUpdates');
+const appPreferencesButtonPosition = defineModel(
+ 'appPreferencesButtonPosition',
+);
const transitionProgress = defineModel('transitionProgress');
const transitionName = defineModel('transitionName');
@@ -73,7 +77,8 @@ const themeColorPrimary = defineModel('themeColorPrimary');
const themeBuiltinType = defineModel('themeBuiltinType');
const themeMode = defineModel('themeMode');
const themeRadius = defineModel('themeRadius');
-const themeSemiDarkMenu = defineModel('themeSemiDarkMenu');
+const themeSemiDarkSidebar = defineModel('themeSemiDarkSidebar');
+const themeSemiDarkHeader = defineModel('themeSemiDarkHeader');
const sidebarEnable = defineModel('sidebarEnable');
const sidebarWidth = defineModel('sidebarWidth');
@@ -219,19 +224,21 @@ async function handleReset() {
-
+
-
-
-
+
+
+
+
+
@@ -274,7 +281,8 @@ async function handleReset() {
@@ -356,6 +364,9 @@ async function handleReset() {
{
});
-
+
+
+
+
+
diff --git a/packages/effects/request/package.json b/packages/effects/request/package.json
index 9bf432c1..fec3f5a0 100644
--- a/packages/effects/request/package.json
+++ b/packages/effects/request/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/request",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/packages/icons/README.md b/packages/icons/README.md
index 784830d5..bc50d25e 100644
--- a/packages/icons/README.md
+++ b/packages/icons/README.md
@@ -9,7 +9,7 @@
```bash
# 进入目标应用目录,例如 apps/xxxx-app
# cd apps/xxxx-app
-pnpm add @vben/icons --workspace
+pnpm add @vben/icons
```
### 使用
diff --git a/packages/icons/package.json b/packages/icons/package.json
index b0592f82..c7c242f9 100644
--- a/packages/icons/package.json
+++ b/packages/icons/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/icons",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/packages/locales/package.json b/packages/locales/package.json
index 59436d8a..48d5c565 100644
--- a/packages/locales/package.json
+++ b/packages/locales/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/locales",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/packages/locales/src/langs/en-US.json b/packages/locales/src/langs/en-US.json
index 08f20425..90afe51b 100644
--- a/packages/locales/src/langs/en-US.json
+++ b/packages/locales/src/langs/en-US.json
@@ -179,6 +179,11 @@
"dynamicTitle": "Dynamic Title",
"watermark": "Watermark",
"checkUpdates": "Periodic update check",
+ "position": {
+ "title": "Preferences Postion",
+ "header": "Header",
+ "fixed": "Fixed"
+ },
"sidebar": {
"title": "Sidebar",
"width": "Width",
@@ -243,7 +248,8 @@
"radius": "Radius",
"light": "Light",
"dark": "Dark",
- "darkMenu": "Semi Dark Menu",
+ "darkSidebar": "Semi Dark Sidebar",
+ "darkHeader": "Semi Dark Header",
"weakMode": "Weak Mode",
"grayMode": "Gray Mode",
"builtin": {
diff --git a/packages/locales/src/langs/zh-CN.json b/packages/locales/src/langs/zh-CN.json
index ec4bb080..16cee8fd 100644
--- a/packages/locales/src/langs/zh-CN.json
+++ b/packages/locales/src/langs/zh-CN.json
@@ -179,6 +179,11 @@
"dynamicTitle": "动态标题",
"watermark": "水印",
"checkUpdates": "定时检查更新",
+ "position": {
+ "title": "偏好设置位置",
+ "header": "顶栏",
+ "fixed": "固定"
+ },
"sidebar": {
"title": "侧边栏",
"width": "宽度",
@@ -243,7 +248,8 @@
"radius": "圆角",
"light": "浅色",
"dark": "深色",
- "darkMenu": "深色菜单",
+ "darkSidebar": "深色侧边栏",
+ "darkHeader": "深色顶栏",
"weakMode": "色弱模式",
"grayMode": "灰色模式",
"builtin": {
diff --git a/packages/preferences/package.json b/packages/preferences/package.json
index 2d90b182..c5f95808 100644
--- a/packages/preferences/package.json
+++ b/packages/preferences/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/preferences",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/packages/stores/package.json b/packages/stores/package.json
index 9e8f2bf0..98dce743 100644
--- a/packages/stores/package.json
+++ b/packages/stores/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/stores",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/packages/styles/README.md b/packages/styles/README.md
index a28612ca..4826446a 100644
--- a/packages/styles/README.md
+++ b/packages/styles/README.md
@@ -9,7 +9,7 @@
```bash
# 进入目标应用目录,例如 apps/xxxx-app
# cd apps/xxxx-app
-pnpm add @vben/styles --workspace
+pnpm add @vben/styles
```
### 使用
diff --git a/packages/styles/package.json b/packages/styles/package.json
index 046cc04c..cfe9df1f 100644
--- a/packages/styles/package.json
+++ b/packages/styles/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/styles",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/packages/types/README.md b/packages/types/README.md
index fc8b871c..f796f31c 100644
--- a/packages/types/README.md
+++ b/packages/types/README.md
@@ -9,7 +9,7 @@
```bash
# 进入目标应用目录,例如 apps/xxxx-app
# cd apps/xxxx-app
-pnpm add @vben/types --workspace
+pnpm add @vben/types
```
### 使用
diff --git a/packages/types/package.json b/packages/types/package.json
index fd079372..f75ec214 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/types",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/packages/utils/README.md b/packages/utils/README.md
index f4877ac2..f06068ae 100644
--- a/packages/utils/README.md
+++ b/packages/utils/README.md
@@ -9,7 +9,7 @@
```bash
# 进入目标应用目录,例如 apps/xxxx-app
# cd apps/xxxx-app
-pnpm add @vben/utils --workspace
+pnpm add @vben/utils
```
### 使用
diff --git a/packages/utils/package.json b/packages/utils/package.json
index 7815ff1c..8ea244cb 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/utils",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://github.com/vbenjs/vue-vben-admin",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/playground/package.json b/playground/package.json
index 03413e1d..2181dbb1 100644
--- a/playground/package.json
+++ b/playground/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/playground",
- "version": "5.0.1",
+ "version": "5.1.0",
"homepage": "https://vben.pro",
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
"repository": {
diff --git a/scripts/turbo-run/package.json b/scripts/turbo-run/package.json
index 5d35b37e..3a2465f2 100644
--- a/scripts/turbo-run/package.json
+++ b/scripts/turbo-run/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/turbo-run",
- "version": "5.0.1",
+ "version": "5.1.0",
"private": true,
"license": "MIT",
"type": "module",
diff --git a/scripts/vsh/package.json b/scripts/vsh/package.json
index fcbd74cb..42f9d77c 100644
--- a/scripts/vsh/package.json
+++ b/scripts/vsh/package.json
@@ -1,6 +1,6 @@
{
"name": "@vben/vsh",
- "version": "5.0.1",
+ "version": "5.1.0",
"private": true,
"license": "MIT",
"type": "module",