mirror of
https://gitee.com/dapppp/ruoyi-plus-vben5.git
synced 2026-03-30 07:03:23 +08:00
Merge branch 'main' of https://github.com/vbenjs/vue-vben-admin
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
Vben Admin 数据 mock 服务,没有对接任何的数据库,所有数据都是模拟的,用于前端开发时提供数据支持。由于 sqlite 安装需要在本地进行编译,所以这里接口是直接返回的。线上环境不再提供mock集成,可自行部署服务或者对接真实数据,同步 mock.js等工具有一些限制,比如上传文件不行、无法模拟复杂的逻辑等,所以这里使用了 真是的后端服务来实现。唯一麻烦的是本地需要同时启动后端服务和前端服务,但是这样可以更好的模拟真实环境。
|
Vben Admin 数据 mock 服务,没有对接任何的数据库,所有数据都是模拟的,用于前端开发时提供数据支持。线上环境不再提供mock集成,可自行部署服务或者对接真实数据,mock.js 等工具有一些限制,比如上传文件不行、无法模拟复杂的逻辑等,所以这里使用了真实的后端服务来实现。唯一麻烦的是本地需要同时启动后端服务和前端服务,但是这样可以更好的模拟真实环境。
|
||||||
|
|
||||||
## Running the app
|
## Running the app
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/web-antd",
|
"name": "@vben/web-antd",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/web-ele",
|
"name": "@vben/web-ele",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/web-naive",
|
"name": "@vben/web-naive",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/docs",
|
"name": "@vben/docs",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "vitepress build",
|
"build": "vitepress build",
|
||||||
|
|||||||
@@ -189,6 +189,7 @@ const defaultPreferences: Preferences = {
|
|||||||
locale: 'zh-CN',
|
locale: 'zh-CN',
|
||||||
loginExpiredMode: 'modal',
|
loginExpiredMode: 'modal',
|
||||||
name: 'Vben Admin',
|
name: 'Vben Admin',
|
||||||
|
preferencesButtonPosition: 'fixed',
|
||||||
watermark: false,
|
watermark: false,
|
||||||
},
|
},
|
||||||
breadcrumb: {
|
breadcrumb: {
|
||||||
@@ -260,7 +261,8 @@ const defaultPreferences: Preferences = {
|
|||||||
colorWarning: 'hsl(42 84% 61%)',
|
colorWarning: 'hsl(42 84% 61%)',
|
||||||
mode: 'dark',
|
mode: 'dark',
|
||||||
radius: '0.5',
|
radius: '0.5',
|
||||||
semiDarkMenu: true,
|
semiDarkHeader: false,
|
||||||
|
semiDarkSidebar: true,
|
||||||
},
|
},
|
||||||
transition: {
|
transition: {
|
||||||
enable: true,
|
enable: true,
|
||||||
@@ -318,6 +320,8 @@ interface AppPreferences {
|
|||||||
loginExpiredMode: LoginExpiredModeType;
|
loginExpiredMode: LoginExpiredModeType;
|
||||||
/** 应用名 */
|
/** 应用名 */
|
||||||
name: string;
|
name: string;
|
||||||
|
/** 偏好设置按钮位置 */
|
||||||
|
preferencesButtonPosition: PreferencesButtonPositionType;
|
||||||
/**
|
/**
|
||||||
* @zh_CN 是否开启水印
|
* @zh_CN 是否开启水印
|
||||||
*/
|
*/
|
||||||
@@ -452,8 +456,10 @@ interface ThemePreferences {
|
|||||||
mode: ThemeModeType;
|
mode: ThemeModeType;
|
||||||
/** 圆角 */
|
/** 圆角 */
|
||||||
radius: string;
|
radius: string;
|
||||||
|
/** 是否开启半深色header(只在theme='light'时生效) */
|
||||||
|
semiDarkHeader: boolean;
|
||||||
/** 是否开启半深色菜单(只在theme='light'时生效) */
|
/** 是否开启半深色菜单(只在theme='light'时生效) */
|
||||||
semiDarkMenu: boolean;
|
semiDarkSidebar: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TransitionPreferences {
|
interface TransitionPreferences {
|
||||||
|
|||||||
@@ -107,9 +107,6 @@ css 变量内的颜色,必须使用 `hsl` 格式,如 `0 0% 100%`,不需要
|
|||||||
/* 基本文字大小 */
|
/* 基本文字大小 */
|
||||||
--font-size-base: 16px;
|
--font-size-base: 16px;
|
||||||
|
|
||||||
/* 主体内容背景色 */
|
|
||||||
--content: 240 11% 96%;
|
|
||||||
|
|
||||||
/* =============component & UI============= */
|
/* =============component & UI============= */
|
||||||
|
|
||||||
/* menu */
|
/* menu */
|
||||||
@@ -117,6 +114,9 @@ css 变量内的颜色,必须使用 `hsl` 格式,如 `0 0% 100%`,不需要
|
|||||||
--sidebar-deep: 210 11.11% 96.47%;
|
--sidebar-deep: 210 11.11% 96.47%;
|
||||||
--menu: var(--sidebar);
|
--menu: var(--sidebar);
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
--header: 0 0% 100%;
|
||||||
|
|
||||||
accent-color: var(--primary);
|
accent-color: var(--primary);
|
||||||
color-scheme: light;
|
color-scheme: light;
|
||||||
}
|
}
|
||||||
@@ -206,14 +206,12 @@ css 变量内的颜色,必须使用 `hsl` 格式,如 `0 0% 100%`,不需要
|
|||||||
/* 基本文字大小 */
|
/* 基本文字大小 */
|
||||||
--font-size-base: 16px;
|
--font-size-base: 16px;
|
||||||
|
|
||||||
/* 主体内容背景色 */
|
|
||||||
--content: 240 11% 96%;
|
|
||||||
|
|
||||||
/* =============component & UI============= */
|
/* =============component & UI============= */
|
||||||
|
|
||||||
--sidebar: 222.34deg 10.43% 12.27%;
|
--sidebar: 222.34deg 10.43% 12.27%;
|
||||||
--sidebar-deep: 220deg 13.06% 9%;
|
--sidebar-deep: 220deg 13.06% 9%;
|
||||||
--menu: var(--sidebar);
|
--menu: var(--sidebar);
|
||||||
|
--header: 222.34deg 10.43% 12.27%;
|
||||||
|
|
||||||
color-scheme: dark;
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
@@ -228,7 +226,6 @@ css 变量内的颜色,必须使用 `hsl` 格式,如 `0 0% 100%`,不需要
|
|||||||
### 默认主题下:
|
### 默认主题下:
|
||||||
|
|
||||||
```css
|
```css
|
||||||
/* */
|
|
||||||
:root {
|
:root {
|
||||||
/* Background color for <Card /> */
|
/* Background color for <Card /> */
|
||||||
--card: 0 0% 30%;
|
--card: 0 0% 30%;
|
||||||
@@ -238,10 +235,11 @@ css 变量内的颜色,必须使用 `hsl` 格式,如 `0 0% 100%`,不需要
|
|||||||
### 黑暗模式下
|
### 黑暗模式下
|
||||||
|
|
||||||
```css
|
```css
|
||||||
/* */
|
.dark,
|
||||||
:root {
|
.dark[data-theme='custom'],
|
||||||
|
.dark[data-theme='default'] {
|
||||||
/* Background color for <Card /> */
|
/* Background color for <Card /> */
|
||||||
--card: 0 0% 30%;
|
--card: 222.34deg 10.43% 12.27%;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -333,7 +331,7 @@ type BuiltinThemeType =
|
|||||||
|
|
||||||
/* 主体区域背景色 */
|
/* 主体区域背景色 */
|
||||||
--background-deep: 210 11.11% 96.47%;
|
--background-deep: 210 11.11% 96.47%;
|
||||||
--foreground: 210 6% 21%;
|
--foreground: 222 84% 5%;
|
||||||
|
|
||||||
/* Background color for <Card /> */
|
/* Background color for <Card /> */
|
||||||
--card: 0 0% 100%;
|
--card: 0 0% 100%;
|
||||||
@@ -344,8 +342,12 @@ type BuiltinThemeType =
|
|||||||
--popover-foreground: 222.2 84% 4.9%;
|
--popover-foreground: 222.2 84% 4.9%;
|
||||||
|
|
||||||
/* Muted backgrounds such as <TabsList />, <Skeleton /> and <Switch /> */
|
/* Muted backgrounds such as <TabsList />, <Skeleton /> and <Switch /> */
|
||||||
--muted: 210 40% 96.1%;
|
|
||||||
--muted-foreground: 215.4 16.3% 46.9%;
|
/* --muted: 210 40% 96.1%;
|
||||||
|
--muted-foreground: 215.4 16.3% 46.9%; */
|
||||||
|
|
||||||
|
--muted: 240 4.8% 95.9%;
|
||||||
|
--muted-foreground: 240 3.8% 46.1%;
|
||||||
|
|
||||||
/* 主题颜色 */
|
/* 主题颜色 */
|
||||||
|
|
||||||
@@ -403,16 +405,16 @@ type BuiltinThemeType =
|
|||||||
/* 基本文字大小 */
|
/* 基本文字大小 */
|
||||||
--font-size-base: 16px;
|
--font-size-base: 16px;
|
||||||
|
|
||||||
/* 主体内容背景色 */
|
|
||||||
--content: 240 11% 96%;
|
|
||||||
|
|
||||||
/* =============component & UI============= */
|
/* =============component & UI============= */
|
||||||
|
|
||||||
/* menu */
|
/* menu */
|
||||||
--sidebar: 0 0% 100%;
|
--sidebar: 0 0% 100%;
|
||||||
--sidebar-deep: 210 11.11% 96.47%;
|
--sidebar-deep: 0 0% 100%;
|
||||||
--menu: var(--sidebar);
|
--menu: var(--sidebar);
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
--header: 0 0% 100%;
|
||||||
|
|
||||||
accent-color: var(--primary);
|
accent-color: var(--primary);
|
||||||
color-scheme: light;
|
color-scheme: light;
|
||||||
}
|
}
|
||||||
@@ -717,8 +719,13 @@ type BuiltinThemeType =
|
|||||||
--popover-foreground: 210 40% 98%;
|
--popover-foreground: 210 40% 98%;
|
||||||
|
|
||||||
/* Muted backgrounds such as <TabsList />, <Skeleton /> and <Switch /> */
|
/* Muted backgrounds such as <TabsList />, <Skeleton /> and <Switch /> */
|
||||||
--muted: 220deg 6.82% 17.25%;
|
|
||||||
--muted-foreground: 215 20.2% 65.1%;
|
/* --muted: 220deg 6.82% 17.25%; */
|
||||||
|
|
||||||
|
/* --muted-foreground: 215 20.2% 65.1%; */
|
||||||
|
|
||||||
|
--muted: 240 3.7% 15.9%;
|
||||||
|
--muted-foreground: 240 5% 64.9%;
|
||||||
|
|
||||||
/* 主题颜色 */
|
/* 主题颜色 */
|
||||||
|
|
||||||
@@ -745,16 +752,16 @@ type BuiltinThemeType =
|
|||||||
--secondary-foreground: 0 0% 98%;
|
--secondary-foreground: 0 0% 98%;
|
||||||
|
|
||||||
/* Used for accents such as hover effects on <DropdownMenuItem>, <SelectItem>...etc */
|
/* Used for accents such as hover effects on <DropdownMenuItem>, <SelectItem>...etc */
|
||||||
--accent: 0deg 0% 100% / 8%;
|
--accent: 216 5% 19%;
|
||||||
--accent-hover: 0deg 0% 100% / 12%;
|
--accent-hover: 216 5% 24%;
|
||||||
--accent-foreground: 0 0% 98%;
|
--accent-foreground: 0 0% 98%;
|
||||||
|
|
||||||
/* Darker color */
|
/* Darker color */
|
||||||
--heavy: 0deg 0% 100% / 12%;
|
--heavy: 216 5% 24%;
|
||||||
--heavy-foreground: var(--accent-foreground);
|
--heavy-foreground: var(--accent-foreground);
|
||||||
|
|
||||||
/* Default border color */
|
/* Default border color */
|
||||||
--border: 240 3.7% 15.9%;
|
--border: 240 3.7% 22%;
|
||||||
|
|
||||||
/* Border color for inputs such as <Input />, <Select />, <Textarea /> */
|
/* Border color for inputs such as <Input />, <Select />, <Textarea /> */
|
||||||
--input: 0deg 0% 100% / 10%;
|
--input: 0deg 0% 100% / 10%;
|
||||||
@@ -775,15 +782,15 @@ type BuiltinThemeType =
|
|||||||
/* 基本文字大小 */
|
/* 基本文字大小 */
|
||||||
--font-size-base: 16px;
|
--font-size-base: 16px;
|
||||||
|
|
||||||
/* 主体内容背景色 */
|
|
||||||
--content: 240 11% 96%;
|
|
||||||
|
|
||||||
/* =============component & UI============= */
|
/* =============component & UI============= */
|
||||||
|
|
||||||
--sidebar: 222.34deg 10.43% 12.27%;
|
--sidebar: 222.34deg 10.43% 12.27%;
|
||||||
--sidebar-deep: 220deg 13.06% 9%;
|
--sidebar-deep: 220deg 13.06% 9%;
|
||||||
--menu: var(--sidebar);
|
--menu: var(--sidebar);
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
--header: 222.34deg 10.43% 12.27%;
|
||||||
|
|
||||||
color-scheme: dark;
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -810,6 +817,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 263.4 70% 50.4%;
|
--ring: 263.4 70% 50.4%;
|
||||||
--sidebar: 224 71.4% 4.1%;
|
--sidebar: 224 71.4% 4.1%;
|
||||||
--sidebar-deep: 224 71.4% 4.1%;
|
--sidebar-deep: 224 71.4% 4.1%;
|
||||||
|
--header: 224 71.4% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='pink'],
|
.dark[data-theme='pink'],
|
||||||
@@ -835,6 +843,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 346.8 77.2% 49.8%;
|
--ring: 346.8 77.2% 49.8%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='rose'],
|
.dark[data-theme='rose'],
|
||||||
@@ -860,6 +869,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 0 72.2% 50.6%;
|
--ring: 0 72.2% 50.6%;
|
||||||
--sidebar: 0 0% 3.9%;
|
--sidebar: 0 0% 3.9%;
|
||||||
--sidebar-deep: 0 0% 3.9%;
|
--sidebar-deep: 0 0% 3.9%;
|
||||||
|
--header: 0 0% 3.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='sky-blue'],
|
.dark[data-theme='sky-blue'],
|
||||||
@@ -885,6 +895,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 224.3 76.3% 48%;
|
--ring: 224.3 76.3% 48%;
|
||||||
--sidebar: 222.2 84% 4.9%;
|
--sidebar: 222.2 84% 4.9%;
|
||||||
--sidebar-deep: 222.2 84% 4.9%;
|
--sidebar-deep: 222.2 84% 4.9%;
|
||||||
|
--header: 222.2 84% 4.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='deep-blue'],
|
.dark[data-theme='deep-blue'],
|
||||||
@@ -910,6 +921,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 224.3 76.3% 48%;
|
--ring: 224.3 76.3% 48%;
|
||||||
--sidebar: 222.2 84% 4.9%;
|
--sidebar: 222.2 84% 4.9%;
|
||||||
--sidebar-deep: 222.2 84% 4.9%;
|
--sidebar-deep: 222.2 84% 4.9%;
|
||||||
|
--header: 222.2 84% 4.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='green'],
|
.dark[data-theme='green'],
|
||||||
@@ -935,6 +947,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 142.4 71.8% 29.2%;
|
--ring: 142.4 71.8% 29.2%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='deep-green'],
|
.dark[data-theme='deep-green'],
|
||||||
@@ -960,6 +973,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 142.4 71.8% 29.2%;
|
--ring: 142.4 71.8% 29.2%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='orange'],
|
.dark[data-theme='orange'],
|
||||||
@@ -985,6 +999,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 20.5 90.2% 48.2%;
|
--ring: 20.5 90.2% 48.2%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='yellow'],
|
.dark[data-theme='yellow'],
|
||||||
@@ -1010,6 +1025,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 35.5 91.7% 32.9%;
|
--ring: 35.5 91.7% 32.9%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='zinc'],
|
.dark[data-theme='zinc'],
|
||||||
@@ -1035,6 +1051,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 240 4.9% 83.9%;
|
--ring: 240 4.9% 83.9%;
|
||||||
--sidebar: 240 10% 3.9%;
|
--sidebar: 240 10% 3.9%;
|
||||||
--sidebar-deep: 240 10% 3.9%;
|
--sidebar-deep: 240 10% 3.9%;
|
||||||
|
--header: 240 4.9% 83.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='neutral'],
|
.dark[data-theme='neutral'],
|
||||||
@@ -1060,6 +1077,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 0 0% 83.1%;
|
--ring: 0 0% 83.1%;
|
||||||
--sidebar: 0 0% 3.9%;
|
--sidebar: 0 0% 3.9%;
|
||||||
--sidebar-deep: 0 0% 3.9%;
|
--sidebar-deep: 0 0% 3.9%;
|
||||||
|
--header: 0 0% 3.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='slate'],
|
.dark[data-theme='slate'],
|
||||||
@@ -1085,6 +1103,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 212.7 26.8% 83.9;
|
--ring: 212.7 26.8% 83.9;
|
||||||
--sidebar: 222.2 84% 4.9%;
|
--sidebar: 222.2 84% 4.9%;
|
||||||
--sidebar-deep: 222.2 84% 4.9%;
|
--sidebar-deep: 222.2 84% 4.9%;
|
||||||
|
--header: 222.2 84% 4.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='gray'],
|
.dark[data-theme='gray'],
|
||||||
@@ -1110,6 +1129,7 @@ type BuiltinThemeType =
|
|||||||
--ring: 216 12.2% 83.9%;
|
--ring: 216 12.2% 83.9%;
|
||||||
--sidebar: 224 71.4% 4.1%;
|
--sidebar: 224 71.4% 4.1%;
|
||||||
--sidebar-deep: 224 71.4% 4.1%;
|
--sidebar-deep: 224 71.4% 4.1%;
|
||||||
|
--header: 224 71.4% 4.1%;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -1198,6 +1218,50 @@ export const overridesPreferences = defineOverridesPreferences({
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 自定义侧边栏颜色
|
||||||
|
|
||||||
|
侧边栏颜色通过`--sidebar`变量来配置
|
||||||
|
|
||||||
|
### 默认主题下:
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
--sidebar: 0 0% 100%;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 黑暗模式下
|
||||||
|
|
||||||
|
```css
|
||||||
|
.dark,
|
||||||
|
.dark[data-theme='custom'],
|
||||||
|
.dark[data-theme='default'] {
|
||||||
|
--sidebar: 222.34deg 10.43% 12.27%;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 自定义顶栏颜色
|
||||||
|
|
||||||
|
侧边栏颜色通过`--header`变量来配置
|
||||||
|
|
||||||
|
### 默认主题下:
|
||||||
|
|
||||||
|
```css
|
||||||
|
:root {
|
||||||
|
--header: 0 0% 100%;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 黑暗模式下
|
||||||
|
|
||||||
|
```css
|
||||||
|
.dark,
|
||||||
|
.dark[data-theme='custom'],
|
||||||
|
.dark[data-theme='default'] {
|
||||||
|
--header: 222.34deg 10.43% 12.27%;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## 色弱模式
|
## 色弱模式
|
||||||
|
|
||||||
一般用于特殊场景,将设置为色弱模式,你可以在`preferences.ts`中进行配置:
|
一般用于特殊场景,将设置为色弱模式,你可以在`preferences.ts`中进行配置:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/commitlint-config",
|
"name": "@vben/commitlint-config",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/stylelint-config",
|
"name": "@vben/stylelint-config",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/node-utils",
|
"name": "@vben/node-utils",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import ora, { Ora } from 'ora';
|
import ora, { type Ora } from 'ora';
|
||||||
|
|
||||||
interface SpinnerOptions {
|
interface SpinnerOptions {
|
||||||
failedText?: string;
|
failedText?: string;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/tailwind-config",
|
"name": "@vben/tailwind-config",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
|||||||
@@ -80,6 +80,9 @@ const customColors = {
|
|||||||
...createColorsPalette('green'),
|
...createColorsPalette('green'),
|
||||||
foreground: 'hsl(var(--success-foreground))',
|
foreground: 'hsl(var(--success-foreground))',
|
||||||
},
|
},
|
||||||
|
header: {
|
||||||
|
DEFAULT: 'hsl(var(--header))',
|
||||||
|
},
|
||||||
heavy: {
|
heavy: {
|
||||||
DEFAULT: 'hsl(var(--heavy))',
|
DEFAULT: 'hsl(var(--heavy))',
|
||||||
foreground: 'hsl(var(--heavy-foreground))',
|
foreground: 'hsl(var(--heavy-foreground))',
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/tsconfig",
|
"name": "@vben/tsconfig",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/vite-config",
|
"name": "@vben/vite-config",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vben-admin-pro",
|
"name": "vben-admin-pro",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"monorepo",
|
"monorepo",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/design",
|
"name": "@vben-core/design",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -52,12 +52,12 @@
|
|||||||
--secondary-foreground: 0 0% 98%;
|
--secondary-foreground: 0 0% 98%;
|
||||||
|
|
||||||
/* Used for accents such as hover effects on <DropdownMenuItem>, <SelectItem>...etc */
|
/* Used for accents such as hover effects on <DropdownMenuItem>, <SelectItem>...etc */
|
||||||
--accent: 240 3.7% 15.9%;
|
--accent: 216 5% 19%;
|
||||||
--accent-hover: 240 3.7% 20.9%;
|
--accent-hover: 216 5% 24%;
|
||||||
--accent-foreground: 0 0% 98%;
|
--accent-foreground: 0 0% 98%;
|
||||||
|
|
||||||
/* Darker color */
|
/* Darker color */
|
||||||
--heavy: 240 3.7% 20.9%;
|
--heavy: 216 5% 24%;
|
||||||
--heavy-foreground: var(--accent-foreground);
|
--heavy-foreground: var(--accent-foreground);
|
||||||
|
|
||||||
/* Default border color */
|
/* Default border color */
|
||||||
@@ -82,15 +82,15 @@
|
|||||||
/* 基本文字大小 */
|
/* 基本文字大小 */
|
||||||
--font-size-base: 16px;
|
--font-size-base: 16px;
|
||||||
|
|
||||||
/* 主体内容背景色 */
|
|
||||||
--content: 240 11% 96%;
|
|
||||||
|
|
||||||
/* =============component & UI============= */
|
/* =============component & UI============= */
|
||||||
|
|
||||||
--sidebar: 222.34deg 10.43% 12.27%;
|
--sidebar: 222.34deg 10.43% 12.27%;
|
||||||
--sidebar-deep: 220deg 13.06% 9%;
|
--sidebar-deep: 220deg 13.06% 9%;
|
||||||
--menu: var(--sidebar);
|
--menu: var(--sidebar);
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
--header: 222.34deg 10.43% 12.27%;
|
||||||
|
|
||||||
color-scheme: dark;
|
color-scheme: dark;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,6 +117,7 @@
|
|||||||
--ring: 263.4 70% 50.4%;
|
--ring: 263.4 70% 50.4%;
|
||||||
--sidebar: 224 71.4% 4.1%;
|
--sidebar: 224 71.4% 4.1%;
|
||||||
--sidebar-deep: 224 71.4% 4.1%;
|
--sidebar-deep: 224 71.4% 4.1%;
|
||||||
|
--header: 224 71.4% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='pink'],
|
.dark[data-theme='pink'],
|
||||||
@@ -142,6 +143,7 @@
|
|||||||
--ring: 346.8 77.2% 49.8%;
|
--ring: 346.8 77.2% 49.8%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='rose'],
|
.dark[data-theme='rose'],
|
||||||
@@ -167,6 +169,7 @@
|
|||||||
--ring: 0 72.2% 50.6%;
|
--ring: 0 72.2% 50.6%;
|
||||||
--sidebar: 0 0% 3.9%;
|
--sidebar: 0 0% 3.9%;
|
||||||
--sidebar-deep: 0 0% 3.9%;
|
--sidebar-deep: 0 0% 3.9%;
|
||||||
|
--header: 0 0% 3.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='sky-blue'],
|
.dark[data-theme='sky-blue'],
|
||||||
@@ -192,6 +195,7 @@
|
|||||||
--ring: 224.3 76.3% 48%;
|
--ring: 224.3 76.3% 48%;
|
||||||
--sidebar: 222.2 84% 4.9%;
|
--sidebar: 222.2 84% 4.9%;
|
||||||
--sidebar-deep: 222.2 84% 4.9%;
|
--sidebar-deep: 222.2 84% 4.9%;
|
||||||
|
--header: 222.2 84% 4.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='deep-blue'],
|
.dark[data-theme='deep-blue'],
|
||||||
@@ -217,6 +221,7 @@
|
|||||||
--ring: 224.3 76.3% 48%;
|
--ring: 224.3 76.3% 48%;
|
||||||
--sidebar: 222.2 84% 4.9%;
|
--sidebar: 222.2 84% 4.9%;
|
||||||
--sidebar-deep: 222.2 84% 4.9%;
|
--sidebar-deep: 222.2 84% 4.9%;
|
||||||
|
--header: 222.2 84% 4.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='green'],
|
.dark[data-theme='green'],
|
||||||
@@ -242,6 +247,7 @@
|
|||||||
--ring: 142.4 71.8% 29.2%;
|
--ring: 142.4 71.8% 29.2%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='deep-green'],
|
.dark[data-theme='deep-green'],
|
||||||
@@ -267,6 +273,7 @@
|
|||||||
--ring: 142.4 71.8% 29.2%;
|
--ring: 142.4 71.8% 29.2%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='orange'],
|
.dark[data-theme='orange'],
|
||||||
@@ -292,6 +299,7 @@
|
|||||||
--ring: 20.5 90.2% 48.2%;
|
--ring: 20.5 90.2% 48.2%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='yellow'],
|
.dark[data-theme='yellow'],
|
||||||
@@ -317,6 +325,7 @@
|
|||||||
--ring: 35.5 91.7% 32.9%;
|
--ring: 35.5 91.7% 32.9%;
|
||||||
--sidebar: 20 14.3% 4.1%;
|
--sidebar: 20 14.3% 4.1%;
|
||||||
--sidebar-deep: 20 14.3% 4.1%;
|
--sidebar-deep: 20 14.3% 4.1%;
|
||||||
|
--header: 20 14.3% 4.1%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='zinc'],
|
.dark[data-theme='zinc'],
|
||||||
@@ -342,6 +351,7 @@
|
|||||||
--ring: 240 4.9% 83.9%;
|
--ring: 240 4.9% 83.9%;
|
||||||
--sidebar: 240 10% 3.9%;
|
--sidebar: 240 10% 3.9%;
|
||||||
--sidebar-deep: 240 10% 3.9%;
|
--sidebar-deep: 240 10% 3.9%;
|
||||||
|
--header: 240 4.9% 83.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='neutral'],
|
.dark[data-theme='neutral'],
|
||||||
@@ -367,6 +377,7 @@
|
|||||||
--ring: 0 0% 83.1%;
|
--ring: 0 0% 83.1%;
|
||||||
--sidebar: 0 0% 3.9%;
|
--sidebar: 0 0% 3.9%;
|
||||||
--sidebar-deep: 0 0% 3.9%;
|
--sidebar-deep: 0 0% 3.9%;
|
||||||
|
--header: 0 0% 3.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='slate'],
|
.dark[data-theme='slate'],
|
||||||
@@ -392,6 +403,7 @@
|
|||||||
--ring: 212.7 26.8% 83.9;
|
--ring: 212.7 26.8% 83.9;
|
||||||
--sidebar: 222.2 84% 4.9%;
|
--sidebar: 222.2 84% 4.9%;
|
||||||
--sidebar-deep: 222.2 84% 4.9%;
|
--sidebar-deep: 222.2 84% 4.9%;
|
||||||
|
--header: 222.2 84% 4.9%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dark[data-theme='gray'],
|
.dark[data-theme='gray'],
|
||||||
@@ -417,4 +429,5 @@
|
|||||||
--ring: 216 12.2% 83.9%;
|
--ring: 216 12.2% 83.9%;
|
||||||
--sidebar: 224 71.4% 4.1%;
|
--sidebar: 224 71.4% 4.1%;
|
||||||
--sidebar-deep: 224 71.4% 4.1%;
|
--sidebar-deep: 224 71.4% 4.1%;
|
||||||
|
--header: 224 71.4% 4.1%;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
/* 主体区域背景色 */
|
/* 主体区域背景色 */
|
||||||
--background-deep: 210 11.11% 96.47%;
|
--background-deep: 210 11.11% 96.47%;
|
||||||
--foreground: 222 84% 5%;
|
--foreground: 210 6% 21%;
|
||||||
|
|
||||||
/* Background color for <Card /> */
|
/* Background color for <Card /> */
|
||||||
--card: 0 0% 100%;
|
--card: 0 0% 100%;
|
||||||
@@ -82,16 +82,16 @@
|
|||||||
/* 基本文字大小 */
|
/* 基本文字大小 */
|
||||||
--font-size-base: 16px;
|
--font-size-base: 16px;
|
||||||
|
|
||||||
/* 主体内容背景色 */
|
|
||||||
--content: 240 11% 96%;
|
|
||||||
|
|
||||||
/* =============component & UI============= */
|
/* =============component & UI============= */
|
||||||
|
|
||||||
/* menu */
|
/* menu */
|
||||||
--sidebar: 0 0% 100%;
|
--sidebar: 0 0% 100%;
|
||||||
--sidebar-deep: 210 11.11% 96.47%;
|
--sidebar-deep: 0 0% 100%;
|
||||||
--menu: var(--sidebar);
|
--menu: var(--sidebar);
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
--header: 0 0% 100%;
|
||||||
|
|
||||||
accent-color: var(--primary);
|
accent-color: var(--primary);
|
||||||
color-scheme: light;
|
color-scheme: light;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/icons",
|
"name": "@vben-core/icons",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ export {
|
|||||||
RotateCw,
|
RotateCw,
|
||||||
Search,
|
Search,
|
||||||
SearchX,
|
SearchX,
|
||||||
Settings2,
|
Settings,
|
||||||
Sun,
|
Sun,
|
||||||
SunMoon,
|
SunMoon,
|
||||||
SwatchBook,
|
SwatchBook,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/shared",
|
"name": "@vben-core/shared",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/typings",
|
"name": "@vben-core/typings",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
8
packages/@core/base/typings/src/app.d.ts
vendored
8
packages/@core/base/typings/src/app.d.ts
vendored
@@ -7,6 +7,13 @@ type LayoutType =
|
|||||||
|
|
||||||
type ThemeModeType = 'auto' | 'dark' | 'light';
|
type ThemeModeType = 'auto' | 'dark' | 'light';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 偏好设置按钮位置
|
||||||
|
* fixed 固定在右侧
|
||||||
|
* header 顶栏
|
||||||
|
*/
|
||||||
|
type PreferencesButtonPositionType = 'fixed' | 'header';
|
||||||
|
|
||||||
type BuiltinThemeType =
|
type BuiltinThemeType =
|
||||||
| 'custom'
|
| 'custom'
|
||||||
| 'deep-blue'
|
| 'deep-blue'
|
||||||
@@ -92,6 +99,7 @@ export type {
|
|||||||
LoginExpiredModeType,
|
LoginExpiredModeType,
|
||||||
NavigationStyleType,
|
NavigationStyleType,
|
||||||
PageTransitionType,
|
PageTransitionType,
|
||||||
|
PreferencesButtonPositionType,
|
||||||
TabsStyleType,
|
TabsStyleType,
|
||||||
ThemeModeType,
|
ThemeModeType,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/composables",
|
"name": "@vben-core/composables",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/preferences",
|
"name": "@vben-core/preferences",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ const defaultPreferences: Preferences = {
|
|||||||
locale: 'zh-CN',
|
locale: 'zh-CN',
|
||||||
loginExpiredMode: 'modal',
|
loginExpiredMode: 'modal',
|
||||||
name: 'Vben Admin',
|
name: 'Vben Admin',
|
||||||
|
preferencesButtonPosition: 'fixed',
|
||||||
watermark: false,
|
watermark: false,
|
||||||
},
|
},
|
||||||
breadcrumb: {
|
breadcrumb: {
|
||||||
@@ -90,7 +91,8 @@ const defaultPreferences: Preferences = {
|
|||||||
colorWarning: 'hsl(42 84% 61%)',
|
colorWarning: 'hsl(42 84% 61%)',
|
||||||
mode: 'auto',
|
mode: 'auto',
|
||||||
radius: '0.5',
|
radius: '0.5',
|
||||||
semiDarkMenu: true,
|
semiDarkHeader: false,
|
||||||
|
semiDarkSidebar: true,
|
||||||
},
|
},
|
||||||
transition: {
|
transition: {
|
||||||
enable: true,
|
enable: true,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import type {
|
|||||||
LoginExpiredModeType,
|
LoginExpiredModeType,
|
||||||
NavigationStyleType,
|
NavigationStyleType,
|
||||||
PageTransitionType,
|
PageTransitionType,
|
||||||
|
PreferencesButtonPositionType,
|
||||||
TabsStyleType,
|
TabsStyleType,
|
||||||
ThemeModeType,
|
ThemeModeType,
|
||||||
} from '@vben-core/typings';
|
} from '@vben-core/typings';
|
||||||
@@ -49,6 +50,8 @@ interface AppPreferences {
|
|||||||
loginExpiredMode: LoginExpiredModeType;
|
loginExpiredMode: LoginExpiredModeType;
|
||||||
/** 应用名 */
|
/** 应用名 */
|
||||||
name: string;
|
name: string;
|
||||||
|
/** 偏好设置按钮位置 */
|
||||||
|
preferencesButtonPosition: PreferencesButtonPositionType;
|
||||||
/**
|
/**
|
||||||
* @zh_CN 是否开启水印
|
* @zh_CN 是否开启水印
|
||||||
*/
|
*/
|
||||||
@@ -183,8 +186,10 @@ interface ThemePreferences {
|
|||||||
mode: ThemeModeType;
|
mode: ThemeModeType;
|
||||||
/** 圆角 */
|
/** 圆角 */
|
||||||
radius: string;
|
radius: string;
|
||||||
|
/** 是否开启半深色header(只在theme='light'时生效) */
|
||||||
|
semiDarkHeader: boolean;
|
||||||
/** 是否开启半深色菜单(只在theme='light'时生效) */
|
/** 是否开启半深色菜单(只在theme='light'时生效) */
|
||||||
semiDarkMenu: boolean;
|
semiDarkSidebar: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TransitionPreferences {
|
interface TransitionPreferences {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/layout-ui",
|
"name": "@vben-core/layout-ui",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ interface Props {
|
|||||||
* 侧边菜单宽度
|
* 侧边菜单宽度
|
||||||
*/
|
*/
|
||||||
sidebarWidth: number;
|
sidebarWidth: number;
|
||||||
|
/**
|
||||||
|
* 主题
|
||||||
|
*/
|
||||||
|
theme: string | undefined;
|
||||||
/**
|
/**
|
||||||
* 宽度
|
* 宽度
|
||||||
*/
|
*/
|
||||||
@@ -76,15 +80,16 @@ function handleToggleMenu() {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<header
|
<header
|
||||||
|
:class="theme"
|
||||||
:style="style"
|
:style="style"
|
||||||
class="border-border bg-background top-0 flex w-full flex-[0_0_auto] items-center border-b transition-[margin-top] duration-200"
|
class="border-border bg-header top-0 flex w-full flex-[0_0_auto] items-center border-b transition-[margin-top] duration-200"
|
||||||
>
|
>
|
||||||
<div v-if="slots.logo" :style="logoStyle">
|
<div v-if="slots.logo" :style="logoStyle">
|
||||||
<slot name="logo"></slot>
|
<slot name="logo"></slot>
|
||||||
</div>
|
</div>
|
||||||
<VbenIconButton
|
<VbenIconButton
|
||||||
v-if="showToggleBtn || isMobile"
|
v-if="showToggleBtn || isMobile"
|
||||||
class="my-0 ml-2 mr-1 rounded"
|
class="my-0 ml-2 mr-1 rounded-md"
|
||||||
@click="handleToggleMenu"
|
@click="handleToggleMenu"
|
||||||
>
|
>
|
||||||
<Menu class="size-4" />
|
<Menu class="size-4" />
|
||||||
|
|||||||
@@ -24,9 +24,8 @@ interface Props {
|
|||||||
domVisible?: boolean;
|
domVisible?: boolean;
|
||||||
/**
|
/**
|
||||||
* 扩展区域宽度
|
* 扩展区域宽度
|
||||||
* @default 180
|
|
||||||
*/
|
*/
|
||||||
extraWidth?: number;
|
extraWidth: number;
|
||||||
/**
|
/**
|
||||||
* 固定扩展区域
|
* 固定扩展区域
|
||||||
* @default false
|
* @default false
|
||||||
@@ -69,13 +68,12 @@ interface Props {
|
|||||||
/**
|
/**
|
||||||
* 主题
|
* 主题
|
||||||
*/
|
*/
|
||||||
theme?: string;
|
theme: string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 宽度
|
* 宽度
|
||||||
* @default 180
|
|
||||||
*/
|
*/
|
||||||
width?: number;
|
width: number;
|
||||||
/**
|
/**
|
||||||
* zIndex
|
* zIndex
|
||||||
* @default 0
|
* @default 0
|
||||||
@@ -87,7 +85,6 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
collapseHeight: 42,
|
collapseHeight: 42,
|
||||||
collapseWidth: 48,
|
collapseWidth: 48,
|
||||||
domVisible: true,
|
domVisible: true,
|
||||||
extraWidth: 180,
|
|
||||||
fixedExtra: false,
|
fixedExtra: false,
|
||||||
isSidebarMixed: false,
|
isSidebarMixed: false,
|
||||||
marginTop: 0,
|
marginTop: 0,
|
||||||
@@ -95,8 +92,6 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
paddingTop: 0,
|
paddingTop: 0,
|
||||||
show: true,
|
show: true,
|
||||||
showCollapseButton: true,
|
showCollapseButton: true,
|
||||||
theme: 'dark',
|
|
||||||
width: 180,
|
|
||||||
zIndex: 0,
|
zIndex: 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -181,10 +176,8 @@ const extraContentStyle = computed((): CSSProperties => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const collapseStyle = computed((): CSSProperties => {
|
const collapseStyle = computed((): CSSProperties => {
|
||||||
const { collapseHeight } = props;
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
height: `${collapseHeight}px`,
|
height: `${props.collapseHeight}px`,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
41
packages/@core/ui-kit/layout-ui/src/hooks/use-layout.ts
Normal file
41
packages/@core/ui-kit/layout-ui/src/hooks/use-layout.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import type { LayoutType } from '@vben-core/typings';
|
||||||
|
|
||||||
|
import type { VbenLayoutProps } from '../vben-layout';
|
||||||
|
|
||||||
|
import { computed } from 'vue';
|
||||||
|
|
||||||
|
export function useLayout(props: VbenLayoutProps) {
|
||||||
|
const currentLayout = computed(() =>
|
||||||
|
props.isMobile ? 'sidebar-nav' : (props.layout as LayoutType),
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否全屏显示content,不需要侧边、底部、顶部、tab区域
|
||||||
|
*/
|
||||||
|
const isFullContent = computed(() => currentLayout.value === 'full-content');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否侧边混合模式
|
||||||
|
*/
|
||||||
|
const isSidebarMixedNav = computed(
|
||||||
|
() => currentLayout.value === 'sidebar-mixed-nav',
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为头部导航模式
|
||||||
|
*/
|
||||||
|
const isHeaderNav = computed(() => currentLayout.value === 'header-nav');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为混合导航模式
|
||||||
|
*/
|
||||||
|
const isMixedNav = computed(() => currentLayout.value === 'mixed-nav');
|
||||||
|
|
||||||
|
return {
|
||||||
|
currentLayout,
|
||||||
|
isFullContent,
|
||||||
|
isHeaderNav,
|
||||||
|
isMixedNav,
|
||||||
|
isSidebarMixedNav,
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -62,12 +62,6 @@ interface VbenLayoutProps {
|
|||||||
* @default 48
|
* @default 48
|
||||||
*/
|
*/
|
||||||
headerHeight?: number;
|
headerHeight?: number;
|
||||||
/**
|
|
||||||
* header高度增加高度
|
|
||||||
* 在顶部存在导航时,额外加高header高度
|
|
||||||
* @default 10
|
|
||||||
*/
|
|
||||||
headerHeightOffset?: number;
|
|
||||||
/**
|
/**
|
||||||
* 顶栏是否隐藏
|
* 顶栏是否隐藏
|
||||||
* @default false
|
* @default false
|
||||||
@@ -78,6 +72,10 @@ interface VbenLayoutProps {
|
|||||||
* @default 'fixed'
|
* @default 'fixed'
|
||||||
*/
|
*/
|
||||||
headerMode?: LayoutHeaderModeType;
|
headerMode?: LayoutHeaderModeType;
|
||||||
|
/**
|
||||||
|
* header 顶栏主题
|
||||||
|
*/
|
||||||
|
headerTheme?: ThemeModeType;
|
||||||
/**
|
/**
|
||||||
* 是否显示header切换侧边栏按钮
|
* 是否显示header切换侧边栏按钮
|
||||||
* @default
|
* @default
|
||||||
@@ -133,11 +131,6 @@ interface VbenLayoutProps {
|
|||||||
* @default 80
|
* @default 80
|
||||||
*/
|
*/
|
||||||
sidebarMixedWidth?: number;
|
sidebarMixedWidth?: number;
|
||||||
/**
|
|
||||||
* 侧边栏是否半深色
|
|
||||||
* @default false
|
|
||||||
*/
|
|
||||||
sidebarSemiDark?: boolean;
|
|
||||||
/**
|
/**
|
||||||
* 侧边栏
|
* 侧边栏
|
||||||
* @default dark
|
* @default dark
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import {
|
|||||||
LayoutSidebar,
|
LayoutSidebar,
|
||||||
LayoutTabbar,
|
LayoutTabbar,
|
||||||
} from './components';
|
} from './components';
|
||||||
|
import { useLayout } from './hooks/use-layout';
|
||||||
|
|
||||||
interface Props extends VbenLayoutProps {}
|
interface Props extends VbenLayoutProps {}
|
||||||
|
|
||||||
@@ -32,7 +33,6 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
footerFixed: true,
|
footerFixed: true,
|
||||||
footerHeight: 32,
|
footerHeight: 32,
|
||||||
headerHeight: 50,
|
headerHeight: 50,
|
||||||
headerHeightOffset: 10,
|
|
||||||
headerHidden: false,
|
headerHidden: false,
|
||||||
headerMode: 'fixed',
|
headerMode: 'fixed',
|
||||||
headerToggleSidebarButton: true,
|
headerToggleSidebarButton: true,
|
||||||
@@ -43,7 +43,6 @@ const props = withDefaults(defineProps<Props>(), {
|
|||||||
sidebarExtraCollapsedWidth: 60,
|
sidebarExtraCollapsedWidth: 60,
|
||||||
sidebarHidden: false,
|
sidebarHidden: false,
|
||||||
sidebarMixedWidth: 80,
|
sidebarMixedWidth: 80,
|
||||||
sidebarSemiDark: true,
|
|
||||||
sidebarTheme: 'dark',
|
sidebarTheme: 'dark',
|
||||||
sidebarWidth: 180,
|
sidebarWidth: 180,
|
||||||
sideCollapseWidth: 60,
|
sideCollapseWidth: 60,
|
||||||
@@ -73,57 +72,23 @@ const {
|
|||||||
|
|
||||||
const { y: mouseY } = useMouse({ target: contentRef, type: 'client' });
|
const { y: mouseY } = useMouse({ target: contentRef, type: 'client' });
|
||||||
|
|
||||||
const realLayout = computed(() =>
|
const {
|
||||||
props.isMobile ? 'sidebar-nav' : props.layout,
|
currentLayout,
|
||||||
);
|
isFullContent,
|
||||||
|
isHeaderNav,
|
||||||
/**
|
isMixedNav,
|
||||||
* 是否全屏显示content,不需要侧边、底部、顶部、tab区域
|
isSidebarMixedNav,
|
||||||
*/
|
} = useLayout(props);
|
||||||
const fullContent = computed(() => realLayout.value === 'full-content');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否侧边混合模式
|
|
||||||
*/
|
|
||||||
const isSidebarMixedNav = computed(
|
|
||||||
() => realLayout.value === 'sidebar-mixed-nav',
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否为头部导航模式
|
|
||||||
*/
|
|
||||||
const isHeaderNav = computed(() => realLayout.value === 'header-nav');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否为混合导航模式
|
|
||||||
*/
|
|
||||||
const isMixedNav = computed(() => realLayout.value === 'mixed-nav');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 顶栏是否自动隐藏
|
* 顶栏是否自动隐藏
|
||||||
*/
|
*/
|
||||||
const isHeaderAutoMode = computed(() => props.headerMode === 'auto');
|
const isHeaderAutoMode = computed(() => props.headerMode === 'auto');
|
||||||
|
|
||||||
/**
|
|
||||||
* header区域高度
|
|
||||||
*/
|
|
||||||
const getHeaderHeight = computed(() => {
|
|
||||||
const { headerHeight, headerHeightOffset } = props;
|
|
||||||
|
|
||||||
// if (!headerVisible) {
|
|
||||||
// return 0;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// 顶部存在导航时,增加10
|
|
||||||
const offset = isMixedNav.value || isHeaderNav.value ? headerHeightOffset : 0;
|
|
||||||
|
|
||||||
return headerHeight + offset;
|
|
||||||
});
|
|
||||||
|
|
||||||
const headerWrapperHeight = computed(() => {
|
const headerWrapperHeight = computed(() => {
|
||||||
let height = 0;
|
let height = 0;
|
||||||
if (props.headerVisible && !props.headerHidden) {
|
if (props.headerVisible && !props.headerHidden) {
|
||||||
height += getHeaderHeight.value;
|
height += props.headerHeight;
|
||||||
}
|
}
|
||||||
if (props.tabbarEnable) {
|
if (props.tabbarEnable) {
|
||||||
height += props.tabbarHeight;
|
height += props.tabbarHeight;
|
||||||
@@ -151,8 +116,8 @@ const sidebarEnableState = computed(() => {
|
|||||||
* 侧边区域离顶部高度
|
* 侧边区域离顶部高度
|
||||||
*/
|
*/
|
||||||
const sidebarMarginTop = computed(() => {
|
const sidebarMarginTop = computed(() => {
|
||||||
const { isMobile } = props;
|
const { headerHeight, isMobile } = props;
|
||||||
return isMixedNav.value && !isMobile ? getHeaderHeight.value : 0;
|
return isMixedNav.value && !isMobile ? headerHeight : 0;
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -195,30 +160,13 @@ const sidebarExtraWidth = computed(() => {
|
|||||||
/**
|
/**
|
||||||
* 是否侧边栏模式,包含混合侧边
|
* 是否侧边栏模式,包含混合侧边
|
||||||
*/
|
*/
|
||||||
const isSideMode = computed(() =>
|
const isSideMode = computed(
|
||||||
['mixed-nav', 'sidebar-mixed-nav', 'sidebar-nav'].includes(realLayout.value),
|
() =>
|
||||||
|
currentLayout.value === 'mixed-nav' ||
|
||||||
|
currentLayout.value === 'sidebar-mixed-nav' ||
|
||||||
|
currentLayout.value === 'sidebar-nav',
|
||||||
);
|
);
|
||||||
|
|
||||||
const showSidebar = computed(() => {
|
|
||||||
// if (isMixedNav.value && !props.sideHidden) {
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
return isSideMode.value && sidebarEnable.value;
|
|
||||||
});
|
|
||||||
|
|
||||||
const sidebarFace = computed(() => {
|
|
||||||
const { sidebarSemiDark, sidebarTheme } = props;
|
|
||||||
const isDark = sidebarTheme === 'dark' || sidebarSemiDark;
|
|
||||||
return {
|
|
||||||
theme: isDark ? 'dark' : 'light',
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 遮罩可见性
|
|
||||||
*/
|
|
||||||
const maskVisible = computed(() => !sidebarCollapse.value && props.isMobile);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* header fixed值
|
* header fixed值
|
||||||
*/
|
*/
|
||||||
@@ -232,13 +180,25 @@ const headerFixed = computed(() => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const showSidebar = computed(() => {
|
||||||
|
// if (isMixedNav.value && !props.sideHidden) {
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
return isSideMode.value && sidebarEnable.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 遮罩可见性
|
||||||
|
*/
|
||||||
|
const maskVisible = computed(() => !sidebarCollapse.value && props.isMobile);
|
||||||
|
|
||||||
const mainStyle = computed(() => {
|
const mainStyle = computed(() => {
|
||||||
let width = '100%';
|
let width = '100%';
|
||||||
let sidebarAndExtraWidth = 'unset';
|
let sidebarAndExtraWidth = 'unset';
|
||||||
if (
|
if (
|
||||||
headerFixed.value &&
|
headerFixed.value &&
|
||||||
realLayout.value !== 'header-nav' &&
|
currentLayout.value !== 'header-nav' &&
|
||||||
realLayout.value !== 'mixed-nav' &&
|
currentLayout.value !== 'mixed-nav' &&
|
||||||
showSidebar.value &&
|
showSidebar.value &&
|
||||||
!props.isMobile
|
!props.isMobile
|
||||||
) {
|
) {
|
||||||
@@ -253,7 +213,7 @@ const mainStyle = computed(() => {
|
|||||||
? getSideCollapseWidth.value
|
? getSideCollapseWidth.value
|
||||||
: props.sidebarMixedWidth;
|
: props.sidebarMixedWidth;
|
||||||
const sideWidth = sidebarExtraCollapse.value
|
const sideWidth = sidebarExtraCollapse.value
|
||||||
? getSideCollapseWidth.value
|
? props.sidebarExtraCollapsedWidth
|
||||||
: props.sidebarWidth;
|
: props.sidebarWidth;
|
||||||
|
|
||||||
// 100% - 侧边菜单混合宽度 - 菜单宽度
|
// 100% - 侧边菜单混合宽度 - 菜单宽度
|
||||||
@@ -312,7 +272,7 @@ const contentStyle = computed((): CSSProperties => {
|
|||||||
return {
|
return {
|
||||||
marginTop:
|
marginTop:
|
||||||
fixed &&
|
fixed &&
|
||||||
!fullContent.value &&
|
!isFullContent.value &&
|
||||||
!headerIsHidden.value &&
|
!headerIsHidden.value &&
|
||||||
(!isHeaderAutoMode.value || scrollY.value < headerWrapperHeight.value)
|
(!isHeaderAutoMode.value || scrollY.value < headerWrapperHeight.value)
|
||||||
? `${headerWrapperHeight.value}px`
|
? `${headerWrapperHeight.value}px`
|
||||||
@@ -330,11 +290,11 @@ const headerZIndex = computed(() => {
|
|||||||
const headerWrapperStyle = computed((): CSSProperties => {
|
const headerWrapperStyle = computed((): CSSProperties => {
|
||||||
const fixed = headerFixed.value;
|
const fixed = headerFixed.value;
|
||||||
return {
|
return {
|
||||||
height: fullContent.value ? '0' : `${headerWrapperHeight.value}px`,
|
height: isFullContent.value ? '0' : `${headerWrapperHeight.value}px`,
|
||||||
left: isMixedNav.value ? 0 : mainStyle.value.sidebarAndExtraWidth,
|
left: isMixedNav.value ? 0 : mainStyle.value.sidebarAndExtraWidth,
|
||||||
position: fixed ? 'fixed' : 'static',
|
position: fixed ? 'fixed' : 'static',
|
||||||
top:
|
top:
|
||||||
headerIsHidden.value || fullContent.value
|
headerIsHidden.value || isFullContent.value
|
||||||
? `-${headerWrapperHeight.value}px`
|
? `-${headerWrapperHeight.value}px`
|
||||||
: 0,
|
: 0,
|
||||||
width: mainStyle.value.width,
|
width: mainStyle.value.width,
|
||||||
@@ -403,7 +363,10 @@ watch(
|
|||||||
watch(
|
watch(
|
||||||
[() => props.headerMode, () => mouseY.value],
|
[() => props.headerMode, () => mouseY.value],
|
||||||
() => {
|
() => {
|
||||||
if (!isHeaderAutoMode.value || isMixedNav.value || fullContent.value) {
|
if (!isHeaderAutoMode.value || isMixedNav.value || isFullContent.value) {
|
||||||
|
if (props.headerMode !== 'auto-scroll') {
|
||||||
|
headerIsHidden.value = false;
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
headerIsHidden.value = true;
|
headerIsHidden.value = true;
|
||||||
@@ -439,7 +402,7 @@ watch(
|
|||||||
if (
|
if (
|
||||||
props.headerMode !== 'auto-scroll' ||
|
props.headerMode !== 'auto-scroll' ||
|
||||||
isMixedNav.value ||
|
isMixedNav.value ||
|
||||||
fullContent.value
|
isFullContent.value
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -465,8 +428,6 @@ function handleOpenMenu() {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="relative flex min-h-full w-full">
|
<div class="relative flex min-h-full w-full">
|
||||||
<slot name="preferences"></slot>
|
|
||||||
<slot name="floating-groups"></slot>
|
|
||||||
<LayoutSidebar
|
<LayoutSidebar
|
||||||
v-if="sidebarEnableState"
|
v-if="sidebarEnableState"
|
||||||
v-model:collapse="sidebarCollapse"
|
v-model:collapse="sidebarCollapse"
|
||||||
@@ -478,12 +439,12 @@ function handleOpenMenu() {
|
|||||||
:dom-visible="!isMobile"
|
:dom-visible="!isMobile"
|
||||||
:extra-width="sidebarExtraWidth"
|
:extra-width="sidebarExtraWidth"
|
||||||
:fixed-extra="sidebarExpandOnHover"
|
:fixed-extra="sidebarExpandOnHover"
|
||||||
:header-height="isMixedNav ? 0 : getHeaderHeight"
|
:header-height="isMixedNav ? 0 : headerHeight"
|
||||||
:is-sidebar-mixed="isSidebarMixedNav"
|
:is-sidebar-mixed="isSidebarMixedNav"
|
||||||
:margin-top="sidebarMarginTop"
|
:margin-top="sidebarMarginTop"
|
||||||
:mixed-width="sidebarMixedWidth"
|
:mixed-width="sidebarMixedWidth"
|
||||||
:show="showSidebar"
|
:show="showSidebar"
|
||||||
:theme="sidebarFace.theme"
|
:theme="sidebarTheme"
|
||||||
:width="getSidebarWidth"
|
:width="getSidebarWidth"
|
||||||
:z-index="sidebarZIndex"
|
:z-index="sidebarZIndex"
|
||||||
@leave="() => emit('sideMouseLeave')"
|
@leave="() => emit('sideMouseLeave')"
|
||||||
@@ -518,12 +479,13 @@ function handleOpenMenu() {
|
|||||||
<LayoutHeader
|
<LayoutHeader
|
||||||
v-if="headerVisible"
|
v-if="headerVisible"
|
||||||
:full-width="!isSideMode"
|
:full-width="!isSideMode"
|
||||||
:height="getHeaderHeight"
|
:height="headerHeight"
|
||||||
:is-mixed-nav="isMixedNav"
|
:is-mixed-nav="isMixedNav"
|
||||||
:is-mobile="isMobile"
|
:is-mobile="isMobile"
|
||||||
:show="!fullContent && !headerHidden"
|
:show="!isFullContent && !headerHidden"
|
||||||
:show-toggle-btn="showHeaderToggleButton"
|
:show-toggle-btn="showHeaderToggleButton"
|
||||||
:sidebar-width="sidebarWidth"
|
:sidebar-width="sidebarWidth"
|
||||||
|
:theme="headerTheme"
|
||||||
:width="mainStyle.width"
|
:width="mainStyle.width"
|
||||||
:z-index="headerZIndex"
|
:z-index="headerZIndex"
|
||||||
@open-menu="handleOpenMenu"
|
@open-menu="handleOpenMenu"
|
||||||
@@ -563,7 +525,7 @@ function handleOpenMenu() {
|
|||||||
v-if="footerEnable"
|
v-if="footerEnable"
|
||||||
:fixed="footerFixed"
|
:fixed="footerFixed"
|
||||||
:height="footerHeight"
|
:height="footerHeight"
|
||||||
:show="!fullContent"
|
:show="!isFullContent"
|
||||||
:width="footerWidth"
|
:width="footerWidth"
|
||||||
:z-index="zIndex"
|
:z-index="zIndex"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/menu-ui",
|
"name": "@vben-core/menu-ui",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -479,8 +479,8 @@ $namespace: vben;
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.is-horizontal:not(.is-rounded) {
|
&.is-horizontal:not(.is-rounded) {
|
||||||
--menu-item-height: 60px;
|
--menu-item-height: 40px;
|
||||||
--menu-item-radius: 0px;
|
--menu-item-radius: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.is-horizontal.is-rounded {
|
&.is-horizontal.is-rounded {
|
||||||
@@ -498,13 +498,13 @@ $namespace: vben;
|
|||||||
--menu-background-color: transparent;
|
--menu-background-color: transparent;
|
||||||
|
|
||||||
&.is-dark {
|
&.is-dark {
|
||||||
--menu-item-hover-color: var(--foreground);
|
--menu-item-hover-color: hsl(var(--accent-foreground));
|
||||||
--menu-item-hover-background-color: hsl(var(--accent));
|
--menu-item-hover-background-color: hsl(var(--accent));
|
||||||
--menu-item-active-color: hsl(var(--foreground));
|
--menu-item-active-color: hsl(var(--accent-foreground));
|
||||||
--menu-item-active-background-color: hsl(var(--accent));
|
--menu-item-active-background-color: hsl(var(--accent));
|
||||||
--menu-submenu-active-color: hsl(var(--foreground));
|
--menu-submenu-active-color: hsl(var(--foreground));
|
||||||
--menu-submenu-active-background-color: hsl(var(--accent));
|
--menu-submenu-active-background-color: hsl(var(--accent));
|
||||||
--menu-submenu-hover-color: hsl(var(--foreground));
|
--menu-submenu-hover-color: hsl(var(--accent-foreground));
|
||||||
--menu-submenu-hover-background-color: hsl(var(--accent));
|
--menu-submenu-hover-background-color: hsl(var(--accent));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,7 +514,7 @@ $namespace: vben;
|
|||||||
--menu-item-hover-background-color: hsl(var(--accent));
|
--menu-item-hover-background-color: hsl(var(--accent));
|
||||||
--menu-item-hover-color: hsl(var(--primary));
|
--menu-item-hover-color: hsl(var(--primary));
|
||||||
--menu-submenu-active-color: hsl(var(--primary));
|
--menu-submenu-active-color: hsl(var(--primary));
|
||||||
--menu-submenu-active-background-color: hsl(var(--primary) / 30%);
|
--menu-submenu-active-background-color: hsl(var(--primary) / 15%);
|
||||||
--menu-submenu-hover-color: hsl(var(--primary));
|
--menu-submenu-hover-color: hsl(var(--primary));
|
||||||
--menu-submenu-hover-background-color: hsl(var(--accent));
|
--menu-submenu-hover-background-color: hsl(var(--accent));
|
||||||
}
|
}
|
||||||
@@ -776,7 +776,7 @@ $namespace: vben;
|
|||||||
&.is-active {
|
&.is-active {
|
||||||
div[data-state='open'] > .#{$namespace}-sub-menu-content,
|
div[data-state='open'] > .#{$namespace}-sub-menu-content,
|
||||||
> .#{$namespace}-sub-menu-content {
|
> .#{$namespace}-sub-menu-content {
|
||||||
font-weight: 500;
|
// font-weight: 500;
|
||||||
color: var(--menu-submenu-active-color);
|
color: var(--menu-submenu-active-color);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/shadcn-ui",
|
"name": "@vben-core/shadcn-ui",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export * from './scrollbar';
|
|||||||
export * from './segmented';
|
export * from './segmented';
|
||||||
export * from './sheet';
|
export * from './sheet';
|
||||||
export * from './spinner';
|
export * from './spinner';
|
||||||
|
export * from './swap';
|
||||||
export * from './tooltip';
|
export * from './tooltip';
|
||||||
export * from './ui/alert-dialog';
|
export * from './ui/alert-dialog';
|
||||||
export * from './ui/avatar';
|
export * from './ui/avatar';
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
export { default as Spinner } from './spinner.vue';
|
export { default as VbenSpinner } from './spinner.vue';
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
export { default as VbenSwap } from './swap.vue';
|
||||||
126
packages/@core/ui-kit/shadcn-ui/src/components/swap/swap.vue
Normal file
126
packages/@core/ui-kit/shadcn-ui/src/components/swap/swap.vue
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
interface Props {
|
||||||
|
/**
|
||||||
|
* @zh_CN 交换模式
|
||||||
|
*/
|
||||||
|
mode?: 'flip' | 'rotate';
|
||||||
|
/**
|
||||||
|
* @zh_CN 开启时的样式
|
||||||
|
*/
|
||||||
|
offClass?: string;
|
||||||
|
/**
|
||||||
|
* @zh_CN 关闭时的样式
|
||||||
|
*/
|
||||||
|
onClass?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
name: 'Swap',
|
||||||
|
});
|
||||||
|
|
||||||
|
withDefaults(defineProps<Props>(), {
|
||||||
|
mode: 'rotate',
|
||||||
|
onClass: '',
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<label
|
||||||
|
:class="{
|
||||||
|
'swap-flip': mode === 'flip',
|
||||||
|
'swap-rotate': mode === 'rotate',
|
||||||
|
}"
|
||||||
|
class="swap"
|
||||||
|
>
|
||||||
|
<input class="hidden" type="checkbox" />
|
||||||
|
|
||||||
|
<div :class="onClass" class="swap-on">
|
||||||
|
<slot name="swap-on"></slot>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div :class="offClass" class="swap-off">
|
||||||
|
<slot name="swap-off"></slot>
|
||||||
|
</div>
|
||||||
|
</label>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.swap {
|
||||||
|
@apply relative inline-grid cursor-pointer select-none place-content-center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap > * {
|
||||||
|
@apply col-start-1 row-start-1 duration-300 ease-out;
|
||||||
|
|
||||||
|
transition-property: transform, opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap-rotate .swap-on,
|
||||||
|
.swap-rotate .swap-indeterminate,
|
||||||
|
.swap-rotate input:indeterminate ~ .swap-on {
|
||||||
|
@apply rotate-45;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap-rotate input:checked ~ .swap-off,
|
||||||
|
.swap-active:where(.swap-rotate) .swap-off,
|
||||||
|
.swap-rotate input:indeterminate ~ .swap-off {
|
||||||
|
@apply -rotate-45;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap-rotate input:checked ~ .swap-on,
|
||||||
|
.swap-active:where(.swap-rotate) .swap-on,
|
||||||
|
.swap-rotate input:indeterminate ~ .swap-indeterminate {
|
||||||
|
@apply rotate-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap-flip {
|
||||||
|
transform-style: preserve-3d;
|
||||||
|
perspective: 16em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap-flip .swap-on,
|
||||||
|
.swap-flip .swap-indeterminate,
|
||||||
|
.swap-flip input:indeterminate ~ .swap-on {
|
||||||
|
@apply opacity-100;
|
||||||
|
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
backface-visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap-flip input:checked ~ .swap-off,
|
||||||
|
.swap-active:where(.swap-flip) .swap-off,
|
||||||
|
.swap-flip input:indeterminate ~ .swap-off {
|
||||||
|
@apply opacity-100;
|
||||||
|
|
||||||
|
transform: rotateY(-180deg);
|
||||||
|
backface-visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap-flip input:checked ~ .swap-on,
|
||||||
|
.swap-active:where(.swap-flip) .swap-on,
|
||||||
|
.swap-flip input:indeterminate ~ .swap-indeterminate {
|
||||||
|
transform: rotateY(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap input {
|
||||||
|
@apply appearance-none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap .swap-on,
|
||||||
|
.swap .swap-indeterminate,
|
||||||
|
.swap input:indeterminate ~ .swap-on {
|
||||||
|
@apply opacity-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap input:checked ~ .swap-off,
|
||||||
|
.swap-active .swap-off,
|
||||||
|
.swap input:indeterminate ~ .swap-off {
|
||||||
|
@apply opacity-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.swap input:checked ~ .swap-on,
|
||||||
|
.swap-active .swap-on,
|
||||||
|
.swap input:indeterminate ~ .swap-indeterminate {
|
||||||
|
@apply opacity-100;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -30,7 +30,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
|
|||||||
<template>
|
<template>
|
||||||
<DialogPortal>
|
<DialogPortal>
|
||||||
<DialogOverlay
|
<DialogOverlay
|
||||||
class="data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 border-border fixed inset-0 z-[1000] grid place-items-center overflow-y-auto bg-black/80"
|
class="data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 border-border fixed inset-0 z-[1000] grid place-items-center overflow-y-auto border bg-black/80"
|
||||||
>
|
>
|
||||||
<DialogContent
|
<DialogContent
|
||||||
:class="
|
:class="
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, type HTMLAttributes } from 'vue';
|
import { computed } from 'vue';
|
||||||
|
|
||||||
import { cn } from '@vben-core/shared';
|
import { cn } from '@vben-core/shared';
|
||||||
|
|
||||||
@@ -11,7 +11,7 @@ import {
|
|||||||
} from 'radix-vue';
|
} from 'radix-vue';
|
||||||
|
|
||||||
const props = withDefaults(
|
const props = withDefaults(
|
||||||
defineProps<{ class?: HTMLAttributes['class'] } & HoverCardContentProps>(),
|
defineProps<{ class?: any } & HoverCardContentProps>(),
|
||||||
{
|
{
|
||||||
sideOffset: 4,
|
sideOffset: 4,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ export const sheetVariants = cva(
|
|||||||
variants: {
|
variants: {
|
||||||
side: {
|
side: {
|
||||||
bottom:
|
bottom:
|
||||||
'inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
|
'inset-x-0 bottom-0 border-t border-border data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom',
|
||||||
left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',
|
left: 'inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm',
|
||||||
right:
|
right:
|
||||||
'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',
|
'inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm',
|
||||||
top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
|
top: 'inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import type { HTMLAttributes } from 'vue';
|
|||||||
import { cva, type VariantProps } from 'class-variance-authority';
|
import { cva, type VariantProps } from 'class-variance-authority';
|
||||||
|
|
||||||
export const toastVariants = cva(
|
export const toastVariants = cva(
|
||||||
'group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
|
'group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border border-border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
|
||||||
{
|
{
|
||||||
defaultVariants: {
|
defaultVariants: {
|
||||||
variant: 'default',
|
variant: 'default',
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
|
|||||||
v-bind="{ ...forwarded, ...$attrs }"
|
v-bind="{ ...forwarded, ...$attrs }"
|
||||||
:class="
|
:class="
|
||||||
cn(
|
cn(
|
||||||
'bg-accent text-accent-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border z-[1000] overflow-hidden rounded-sm px-4 py-2 text-xs shadow-md',
|
'bg-accent text-accent-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 border-border shadow-float z-[1000] overflow-hidden rounded-sm border px-4 py-2 text-xs',
|
||||||
props.class,
|
props.class,
|
||||||
)
|
)
|
||||||
"
|
"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben-core/tabs-ui",
|
"name": "@vben-core/tabs-ui",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ function scrollIntoView() {
|
|||||||
<!-- divider -->
|
<!-- divider -->
|
||||||
<div
|
<div
|
||||||
v-if="i !== 0 && tab.key !== active"
|
v-if="i !== 0 && tab.key !== active"
|
||||||
class="tabs-chrome__divider bg-foreground/80 absolute left-[var(--gap)] top-1/2 z-0 h-4 w-[1px] translate-y-[-50%] transition-all"
|
class="tabs-chrome__divider bg-foreground/60 absolute left-[var(--gap)] top-1/2 z-0 h-4 w-[1px] translate-y-[-50%] transition-all"
|
||||||
></div>
|
></div>
|
||||||
<!-- background -->
|
<!-- background -->
|
||||||
<div
|
<div
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# 进入目标应用目录,例如 apps/xxxx-app
|
# 进入目标应用目录,例如 apps/xxxx-app
|
||||||
# cd apps/xxxx-app
|
# cd apps/xxxx-app
|
||||||
pnpm add @vben/constants --workspace
|
pnpm add @vben/constants
|
||||||
```
|
```
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/constants",
|
"name": "@vben/constants",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/access",
|
"name": "@vben/access",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/chart-ui",
|
"name": "@vben/chart-ui",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/common-ui",
|
"name": "@vben/common-ui",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# 进入目标应用目录,例如 apps/xxxx-app
|
# 进入目标应用目录,例如 apps/xxxx-app
|
||||||
# cd apps/xxxx-app
|
# cd apps/xxxx-app
|
||||||
pnpm add @vben/hooks --workspace
|
pnpm add @vben/hooks
|
||||||
```
|
```
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/hooks",
|
"name": "@vben/hooks",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/layouts",
|
"name": "@vben/layouts",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { RouterView } from 'vue-router';
|
|||||||
import { useContentHeight } from '@vben/hooks';
|
import { useContentHeight } from '@vben/hooks';
|
||||||
import { preferences, usePreferences } from '@vben/preferences';
|
import { preferences, usePreferences } from '@vben/preferences';
|
||||||
import { storeToRefs, useTabbarStore } from '@vben/stores';
|
import { storeToRefs, useTabbarStore } from '@vben/stores';
|
||||||
import { Spinner } from '@vben-core/shadcn-ui';
|
import { VbenSpinner } from '@vben-core/shadcn-ui';
|
||||||
|
|
||||||
import { IFrameRouterView } from '../../iframe';
|
import { IFrameRouterView } from '../../iframe';
|
||||||
import { useContentSpinner } from './use-content-spinner';
|
import { useContentSpinner } from './use-content-spinner';
|
||||||
@@ -86,7 +86,7 @@ function transformComponent(
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="relative h-full">
|
<div class="relative h-full">
|
||||||
<Spinner
|
<VbenSpinner
|
||||||
v-if="preferences.transition.loading"
|
v-if="preferences.transition.loading"
|
||||||
:spinning="spinning"
|
:spinning="spinning"
|
||||||
:style="contentStyles"
|
:style="contentStyles"
|
||||||
|
|||||||
@@ -5,7 +5,12 @@ import { preferences, usePreferences } from '@vben/preferences';
|
|||||||
import { useAccessStore } from '@vben/stores';
|
import { useAccessStore } from '@vben/stores';
|
||||||
import { VbenFullScreen } from '@vben-core/shadcn-ui';
|
import { VbenFullScreen } from '@vben-core/shadcn-ui';
|
||||||
|
|
||||||
import { GlobalSearch, LanguageToggle, ThemeToggle } from '../../widgets';
|
import {
|
||||||
|
GlobalSearch,
|
||||||
|
LanguageToggle,
|
||||||
|
PreferencesButton,
|
||||||
|
ThemeToggle,
|
||||||
|
} from '../../widgets';
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
/**
|
/**
|
||||||
@@ -26,34 +31,44 @@ const accessStore = useAccessStore();
|
|||||||
const { globalSearchShortcutKey } = usePreferences();
|
const { globalSearchShortcutKey } = usePreferences();
|
||||||
const slots = useSlots();
|
const slots = useSlots();
|
||||||
const rightSlots = computed(() => {
|
const rightSlots = computed(() => {
|
||||||
const list = [{ index: 30, name: 'user-dropdown' }];
|
const list = [{ index: 100, name: 'user-dropdown' }];
|
||||||
if (preferences.widget.globalSearch) {
|
if (preferences.widget.globalSearch) {
|
||||||
list.push({
|
list.push({
|
||||||
index: 5,
|
index: 5,
|
||||||
name: 'global-search',
|
name: 'global-search',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (preferences.widget.themeToggle) {
|
|
||||||
|
if (
|
||||||
|
preferences.app.enablePreferences &&
|
||||||
|
preferences.app.preferencesButtonPosition === 'header'
|
||||||
|
) {
|
||||||
list.push({
|
list.push({
|
||||||
index: 10,
|
index: 10,
|
||||||
|
name: 'preferences',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (preferences.widget.themeToggle) {
|
||||||
|
list.push({
|
||||||
|
index: 15,
|
||||||
name: 'theme-toggle',
|
name: 'theme-toggle',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (preferences.widget.languageToggle) {
|
if (preferences.widget.languageToggle) {
|
||||||
list.push({
|
list.push({
|
||||||
index: 15,
|
index: 20,
|
||||||
name: 'language-toggle',
|
name: 'language-toggle',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (preferences.widget.fullscreen) {
|
if (preferences.widget.fullscreen) {
|
||||||
list.push({
|
list.push({
|
||||||
index: 20,
|
index: 25,
|
||||||
name: 'fullscreen',
|
name: 'fullscreen',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (preferences.widget.notification) {
|
if (preferences.widget.notification) {
|
||||||
list.push({
|
list.push({
|
||||||
index: 25,
|
index: 30,
|
||||||
name: 'notification',
|
name: 'notification',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -66,6 +81,7 @@ const rightSlots = computed(() => {
|
|||||||
});
|
});
|
||||||
return list.sort((a, b) => a.index - b.index);
|
return list.sort((a, b) => a.index - b.index);
|
||||||
});
|
});
|
||||||
|
|
||||||
const leftSlots = computed(() => {
|
const leftSlots = computed(() => {
|
||||||
const list: any[] = [];
|
const list: any[] = [];
|
||||||
|
|
||||||
@@ -108,8 +124,12 @@ const leftSlots = computed(() => {
|
|||||||
class="mr-4"
|
class="mr-4"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
<template v-else-if="slot.name === 'preferences'">
|
||||||
|
<PreferencesButton class="mr-2" />
|
||||||
|
</template>
|
||||||
<template v-else-if="slot.name === 'theme-toggle'">
|
<template v-else-if="slot.name === 'theme-toggle'">
|
||||||
<ThemeToggle class="mr-2" />
|
<ThemeToggle class="mr-2 mt-[2px]" />
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="slot.name === 'language-toggle'">
|
<template v-else-if="slot.name === 'language-toggle'">
|
||||||
<LanguageToggle class="mr-2" />
|
<LanguageToggle class="mr-2" />
|
||||||
|
|||||||
@@ -41,17 +41,19 @@ const {
|
|||||||
isSideMixedNav,
|
isSideMixedNav,
|
||||||
layout,
|
layout,
|
||||||
sidebarCollapsed,
|
sidebarCollapsed,
|
||||||
|
theme,
|
||||||
} = usePreferences();
|
} = usePreferences();
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const { updateWatermark } = useWatermark();
|
const { updateWatermark } = useWatermark();
|
||||||
const lockStore = useLockStore();
|
const lockStore = useLockStore();
|
||||||
|
|
||||||
const headerMenuTheme = computed(() => {
|
const sidebarTheme = computed(() => {
|
||||||
return isDark.value ? 'dark' : 'light';
|
const dark = isDark.value || preferences.theme.semiDarkSidebar;
|
||||||
|
return dark ? 'dark' : 'light';
|
||||||
});
|
});
|
||||||
|
|
||||||
const theme = computed(() => {
|
const headerTheme = computed(() => {
|
||||||
const dark = isDark.value || preferences.theme.semiDarkMenu;
|
const dark = isDark.value || preferences.theme.semiDarkHeader;
|
||||||
return dark ? 'dark' : 'light';
|
return dark ? 'dark' : 'light';
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -160,6 +162,7 @@ const headerSlots = computed(() => {
|
|||||||
:footer-fixed="preferences.footer.fixed"
|
:footer-fixed="preferences.footer.fixed"
|
||||||
:header-hidden="preferences.header.hidden"
|
:header-hidden="preferences.header.hidden"
|
||||||
:header-mode="preferences.header.mode"
|
:header-mode="preferences.header.mode"
|
||||||
|
:header-theme="headerTheme"
|
||||||
:header-toggle-sidebar-button="preferences.widget.sidebarToggle"
|
:header-toggle-sidebar-button="preferences.widget.sidebarToggle"
|
||||||
:header-visible="preferences.header.enable"
|
:header-visible="preferences.header.enable"
|
||||||
:is-mobile="preferences.app.isMobile"
|
:is-mobile="preferences.app.isMobile"
|
||||||
@@ -170,8 +173,7 @@ const headerSlots = computed(() => {
|
|||||||
:sidebar-expand-on-hover="preferences.sidebar.expandOnHover"
|
:sidebar-expand-on-hover="preferences.sidebar.expandOnHover"
|
||||||
:sidebar-extra-collapse="preferences.sidebar.extraCollapse"
|
:sidebar-extra-collapse="preferences.sidebar.extraCollapse"
|
||||||
:sidebar-hidden="preferences.sidebar.hidden"
|
:sidebar-hidden="preferences.sidebar.hidden"
|
||||||
:sidebar-semi-dark="preferences.theme.semiDarkMenu"
|
:sidebar-theme="sidebarTheme"
|
||||||
:sidebar-theme="theme"
|
|
||||||
:sidebar-width="preferences.sidebar.width"
|
:sidebar-width="preferences.sidebar.width"
|
||||||
:tabbar-enable="preferences.tabbar.enable"
|
:tabbar-enable="preferences.tabbar.enable"
|
||||||
:tabbar-height="preferences.tabbar.height"
|
:tabbar-height="preferences.tabbar.height"
|
||||||
@@ -192,14 +194,6 @@ const headerSlots = computed(() => {
|
|||||||
updatePreferences({ sidebar: { extraCollapse: value } })
|
updatePreferences({ sidebar: { extraCollapse: value } })
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<template v-if="preferences.app.enablePreferences" #preferences>
|
|
||||||
<Preferences @clear-preferences-and-logout="clearPreferencesAndLogout" />
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<template #floating-groups>
|
|
||||||
<VbenBackTop />
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<!-- logo -->
|
<!-- logo -->
|
||||||
<template #logo>
|
<template #logo>
|
||||||
<VbenLogo
|
<VbenLogo
|
||||||
@@ -208,7 +202,7 @@ const headerSlots = computed(() => {
|
|||||||
:collapsed="logoCollapsed"
|
:collapsed="logoCollapsed"
|
||||||
:src="preferences.logo.source"
|
:src="preferences.logo.source"
|
||||||
:text="preferences.app.name"
|
:text="preferences.app.name"
|
||||||
:theme="showHeaderNav ? headerMenuTheme : theme"
|
:theme="showHeaderNav ? headerTheme : theme"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<!-- 头部区域 -->
|
<!-- 头部区域 -->
|
||||||
@@ -230,7 +224,7 @@ const headerSlots = computed(() => {
|
|||||||
:default-active="headerActive"
|
:default-active="headerActive"
|
||||||
:menus="wrapperMenus(headerMenus)"
|
:menus="wrapperMenus(headerMenus)"
|
||||||
:rounded="isMenuRounded"
|
:rounded="isMenuRounded"
|
||||||
:theme="headerMenuTheme"
|
:theme="headerTheme"
|
||||||
class="w-full"
|
class="w-full"
|
||||||
mode="horizontal"
|
mode="horizontal"
|
||||||
@select="handleMenuSelect"
|
@select="handleMenuSelect"
|
||||||
@@ -256,7 +250,7 @@ const headerSlots = computed(() => {
|
|||||||
:default-active="sidebarActive"
|
:default-active="sidebarActive"
|
||||||
:menus="wrapperMenus(sidebarMenus)"
|
:menus="wrapperMenus(sidebarMenus)"
|
||||||
:rounded="isMenuRounded"
|
:rounded="isMenuRounded"
|
||||||
:theme="theme"
|
:theme="sidebarTheme"
|
||||||
mode="vertical"
|
mode="vertical"
|
||||||
@select="handleMenuSelect"
|
@select="handleMenuSelect"
|
||||||
/>
|
/>
|
||||||
@@ -267,7 +261,7 @@ const headerSlots = computed(() => {
|
|||||||
:active-path="extraActiveMenu"
|
:active-path="extraActiveMenu"
|
||||||
:menus="wrapperMenus(headerMenus)"
|
:menus="wrapperMenus(headerMenus)"
|
||||||
:rounded="isMenuRounded"
|
:rounded="isMenuRounded"
|
||||||
:theme="theme"
|
:theme="sidebarTheme"
|
||||||
@default-select="handleDefaultSelect"
|
@default-select="handleDefaultSelect"
|
||||||
@enter="handleMenuMouseEnter"
|
@enter="handleMenuMouseEnter"
|
||||||
@select="handleMixedMenuSelect"
|
@select="handleMixedMenuSelect"
|
||||||
@@ -280,7 +274,7 @@ const headerSlots = computed(() => {
|
|||||||
:collapse="preferences.sidebar.extraCollapse"
|
:collapse="preferences.sidebar.extraCollapse"
|
||||||
:menus="wrapperMenus(extraMenus)"
|
:menus="wrapperMenus(extraMenus)"
|
||||||
:rounded="isMenuRounded"
|
:rounded="isMenuRounded"
|
||||||
:theme="theme"
|
:theme="sidebarTheme"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
<template #side-extra-title>
|
<template #side-extra-title>
|
||||||
@@ -325,6 +319,19 @@ const headerSlots = computed(() => {
|
|||||||
<Transition v-if="preferences.widget.lockScreen" name="slide-up">
|
<Transition v-if="preferences.widget.lockScreen" name="slide-up">
|
||||||
<slot v-if="lockStore.isLockScreen" name="lock-screen"></slot>
|
<slot v-if="lockStore.isLockScreen" name="lock-screen"></slot>
|
||||||
</Transition>
|
</Transition>
|
||||||
|
|
||||||
|
<template
|
||||||
|
v-if="
|
||||||
|
preferences.app.enablePreferences &&
|
||||||
|
preferences.app.preferencesButtonPosition === 'fixed'
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<Preferences
|
||||||
|
class="z-100 fixed bottom-20 right-0"
|
||||||
|
@clear-preferences-and-logout="clearPreferencesAndLogout"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<VbenBackTop />
|
||||||
</template>
|
</template>
|
||||||
</VbenAdminLayout>
|
</VbenAdminLayout>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { useRoute } from 'vue-router';
|
|||||||
|
|
||||||
import { preferences } from '@vben/preferences';
|
import { preferences } from '@vben/preferences';
|
||||||
import { useTabbarStore } from '@vben/stores';
|
import { useTabbarStore } from '@vben/stores';
|
||||||
import { Spinner } from '@vben-core/shadcn-ui';
|
import { VbenSpinner } from '@vben-core/shadcn-ui';
|
||||||
|
|
||||||
defineOptions({ name: 'IFrameRouterView' });
|
defineOptions({ name: 'IFrameRouterView' });
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ function showSpinning(index: number) {
|
|||||||
v-show="routeShow(item)"
|
v-show="routeShow(item)"
|
||||||
class="relative size-full"
|
class="relative size-full"
|
||||||
>
|
>
|
||||||
<Spinner :spinning="showSpinning(index)" />
|
<VbenSpinner :spinning="showSpinning(index)" />
|
||||||
<iframe
|
<iframe
|
||||||
:src="item.meta.iframeSrc as string"
|
:src="item.meta.iframeSrc as string"
|
||||||
class="size-full"
|
class="size-full"
|
||||||
|
|||||||
@@ -54,9 +54,6 @@ const styleItems = computed((): SelectOption[] => [
|
|||||||
<SwitchItem v-model="tabbarDragable" :disabled="!tabbarEnable">
|
<SwitchItem v-model="tabbarDragable" :disabled="!tabbarEnable">
|
||||||
{{ $t('preferences.tabbar.dragable') }}
|
{{ $t('preferences.tabbar.dragable') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
<SelectItem v-model="tabbarStyleType" :items="styleItems">
|
|
||||||
{{ $t('preferences.tabbar.styleType.title') }}
|
|
||||||
</SelectItem>
|
|
||||||
<SwitchItem v-model="tabbarShowIcon" :disabled="!tabbarEnable">
|
<SwitchItem v-model="tabbarShowIcon" :disabled="!tabbarEnable">
|
||||||
{{ $t('preferences.tabbar.icon') }}
|
{{ $t('preferences.tabbar.icon') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
@@ -69,4 +66,7 @@ const styleItems = computed((): SelectOption[] => [
|
|||||||
<SwitchItem v-model="tabbarShowMaximize" :disabled="!tabbarEnable">
|
<SwitchItem v-model="tabbarShowMaximize" :disabled="!tabbarEnable">
|
||||||
{{ $t('preferences.tabbar.showMaximize') }}
|
{{ $t('preferences.tabbar.showMaximize') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
|
<SelectItem v-model="tabbarStyleType" :items="styleItems">
|
||||||
|
{{ $t('preferences.tabbar.styleType.title') }}
|
||||||
|
</SelectItem>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import type { SelectOption } from '@vben/types';
|
||||||
|
|
||||||
|
import { computed } from 'vue';
|
||||||
|
|
||||||
import { $t } from '@vben/locales';
|
import { $t } from '@vben/locales';
|
||||||
|
|
||||||
|
import SelectItem from '../select-item.vue';
|
||||||
import SwitchItem from '../switch-item.vue';
|
import SwitchItem from '../switch-item.vue';
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
@@ -14,6 +19,20 @@ const widgetNotification = defineModel<boolean>('widgetNotification');
|
|||||||
const widgetThemeToggle = defineModel<boolean>('widgetThemeToggle');
|
const widgetThemeToggle = defineModel<boolean>('widgetThemeToggle');
|
||||||
const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
|
const widgetSidebarToggle = defineModel<boolean>('widgetSidebarToggle');
|
||||||
const widgetLockScreen = defineModel<boolean>('widgetLockScreen');
|
const widgetLockScreen = defineModel<boolean>('widgetLockScreen');
|
||||||
|
const appPreferencesButtonPosition = defineModel<string>(
|
||||||
|
'appPreferencesButtonPosition',
|
||||||
|
);
|
||||||
|
|
||||||
|
const positionItems = computed((): SelectOption[] => [
|
||||||
|
{
|
||||||
|
label: $t('preferences.position.header'),
|
||||||
|
value: 'header',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: $t('preferences.position.fixed'),
|
||||||
|
value: 'fixed',
|
||||||
|
},
|
||||||
|
]);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -38,4 +57,7 @@ const widgetLockScreen = defineModel<boolean>('widgetLockScreen');
|
|||||||
<SwitchItem v-model="widgetSidebarToggle">
|
<SwitchItem v-model="widgetSidebarToggle">
|
||||||
{{ $t('preferences.widget.sidebarToggle') }}
|
{{ $t('preferences.widget.sidebarToggle') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
|
<SelectItem v-model="appPreferencesButtonPosition" :items="positionItems">
|
||||||
|
{{ $t('preferences.position.title') }}
|
||||||
|
</SelectItem>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -13,9 +13,8 @@ defineOptions({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const modelValue = defineModel<string>({ default: 'auto' });
|
const modelValue = defineModel<string>({ default: 'auto' });
|
||||||
const themeSemiDarkMenu = defineModel<boolean>('themeSemiDarkMenu', {
|
const themeSemiDarkSidebar = defineModel<boolean>('themeSemiDarkSidebar');
|
||||||
default: true,
|
const themeSemiDarkHeader = defineModel<boolean>('themeSemiDarkHeader');
|
||||||
});
|
|
||||||
|
|
||||||
const THEME_PRESET: Array<{ icon: Component; name: ThemeModeType }> = [
|
const THEME_PRESET: Array<{ icon: Component; name: ThemeModeType }> = [
|
||||||
{
|
{
|
||||||
@@ -71,11 +70,14 @@ function nameView(name: string) {
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<SwitchItem
|
<SwitchItem
|
||||||
v-model="themeSemiDarkMenu"
|
v-model="themeSemiDarkSidebar"
|
||||||
:disabled="modelValue === 'dark'"
|
:disabled="modelValue === 'dark'"
|
||||||
class="mt-6"
|
class="mt-6"
|
||||||
>
|
>
|
||||||
{{ $t('preferences.theme.darkMenu') }}
|
{{ $t('preferences.theme.darkSidebar') }}
|
||||||
|
</SwitchItem>
|
||||||
|
<SwitchItem v-model="themeSemiDarkHeader" :disabled="modelValue === 'dark'">
|
||||||
|
{{ $t('preferences.theme.darkHeader') }}
|
||||||
</SwitchItem>
|
</SwitchItem>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
export { default as Preferences } from './preferences.vue';
|
export { default as Preferences } from './preferences.vue';
|
||||||
|
export { default as PreferencesButton } from './preferences-button.vue';
|
||||||
export * from './use-open-preferences';
|
export * from './use-open-preferences';
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { Settings } from '@vben/icons';
|
||||||
|
import { VbenIconButton } from '@vben-core/shadcn-ui';
|
||||||
|
|
||||||
|
import Preferences from './preferences.vue';
|
||||||
|
</script>
|
||||||
|
<template>
|
||||||
|
<Preferences>
|
||||||
|
<VbenIconButton>
|
||||||
|
<Settings class="size-4" />
|
||||||
|
</VbenIconButton>
|
||||||
|
</Preferences>
|
||||||
|
</template>
|
||||||
@@ -7,13 +7,14 @@ import type {
|
|||||||
LayoutHeaderModeType,
|
LayoutHeaderModeType,
|
||||||
LayoutType,
|
LayoutType,
|
||||||
NavigationStyleType,
|
NavigationStyleType,
|
||||||
|
PreferencesButtonPositionType,
|
||||||
ThemeModeType,
|
ThemeModeType,
|
||||||
} from '@vben/types';
|
} from '@vben/types';
|
||||||
import type { SegmentedItem } from '@vben-core/shadcn-ui';
|
import type { SegmentedItem } from '@vben-core/shadcn-ui';
|
||||||
|
|
||||||
import { computed, ref } from 'vue';
|
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 { $t, loadLocaleMessages } from '@vben/locales';
|
||||||
import {
|
import {
|
||||||
clearPreferencesCache,
|
clearPreferencesCache,
|
||||||
@@ -63,6 +64,9 @@ const appColorWeakMode = defineModel<boolean>('appColorWeakMode');
|
|||||||
const appContentCompact = defineModel<ContentCompactType>('appContentCompact');
|
const appContentCompact = defineModel<ContentCompactType>('appContentCompact');
|
||||||
const appWatermark = defineModel<boolean>('appWatermark');
|
const appWatermark = defineModel<boolean>('appWatermark');
|
||||||
const appEnableCheckUpdates = defineModel<boolean>('appEnableCheckUpdates');
|
const appEnableCheckUpdates = defineModel<boolean>('appEnableCheckUpdates');
|
||||||
|
const appPreferencesButtonPosition = defineModel<PreferencesButtonPositionType>(
|
||||||
|
'appPreferencesButtonPosition',
|
||||||
|
);
|
||||||
|
|
||||||
const transitionProgress = defineModel<boolean>('transitionProgress');
|
const transitionProgress = defineModel<boolean>('transitionProgress');
|
||||||
const transitionName = defineModel<string>('transitionName');
|
const transitionName = defineModel<string>('transitionName');
|
||||||
@@ -73,7 +77,8 @@ const themeColorPrimary = defineModel<string>('themeColorPrimary');
|
|||||||
const themeBuiltinType = defineModel<BuiltinThemeType>('themeBuiltinType');
|
const themeBuiltinType = defineModel<BuiltinThemeType>('themeBuiltinType');
|
||||||
const themeMode = defineModel<ThemeModeType>('themeMode');
|
const themeMode = defineModel<ThemeModeType>('themeMode');
|
||||||
const themeRadius = defineModel<string>('themeRadius');
|
const themeRadius = defineModel<string>('themeRadius');
|
||||||
const themeSemiDarkMenu = defineModel<boolean>('themeSemiDarkMenu');
|
const themeSemiDarkSidebar = defineModel<boolean>('themeSemiDarkSidebar');
|
||||||
|
const themeSemiDarkHeader = defineModel<boolean>('themeSemiDarkHeader');
|
||||||
|
|
||||||
const sidebarEnable = defineModel<boolean>('sidebarEnable');
|
const sidebarEnable = defineModel<boolean>('sidebarEnable');
|
||||||
const sidebarWidth = defineModel<number>('sidebarWidth');
|
const sidebarWidth = defineModel<number>('sidebarWidth');
|
||||||
@@ -219,19 +224,21 @@ async function handleReset() {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="z-100 fixed right-0 top-1/2">
|
<div>
|
||||||
<VbenSheet
|
<VbenSheet
|
||||||
v-model:open="openPreferences"
|
v-model:open="openPreferences"
|
||||||
:description="$t('preferences.subtitle')"
|
:description="$t('preferences.subtitle')"
|
||||||
:title="$t('preferences.title')"
|
:title="$t('preferences.title')"
|
||||||
>
|
>
|
||||||
<template #trigger>
|
<template #trigger>
|
||||||
<VbenButton
|
<slot name="trigger">
|
||||||
:title="$t('preferences.title')"
|
<VbenButton
|
||||||
class="bg-primary flex-col-center h-10 w-10 cursor-pointer rounded-l-lg rounded-r-none border-none"
|
:title="$t('preferences.title')"
|
||||||
>
|
class="bg-primary flex-col-center size-10 cursor-pointer rounded-l-lg rounded-r-none border-none"
|
||||||
<Settings2 class="size-5" />
|
>
|
||||||
</VbenButton>
|
<Settings class="size-5" />
|
||||||
|
</VbenButton>
|
||||||
|
</slot>
|
||||||
</template>
|
</template>
|
||||||
<template #extra>
|
<template #extra>
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
@@ -274,7 +281,8 @@ async function handleReset() {
|
|||||||
<Block :title="$t('preferences.theme.title')">
|
<Block :title="$t('preferences.theme.title')">
|
||||||
<Theme
|
<Theme
|
||||||
v-model="themeMode"
|
v-model="themeMode"
|
||||||
v-model:theme-semi-dark-menu="themeSemiDarkMenu"
|
v-model:theme-semi-dark-header="themeSemiDarkHeader"
|
||||||
|
v-model:theme-semi-dark-sidebar="themeSemiDarkSidebar"
|
||||||
/>
|
/>
|
||||||
</Block>
|
</Block>
|
||||||
<Block :title="$t('preferences.theme.builtin.title')">
|
<Block :title="$t('preferences.theme.builtin.title')">
|
||||||
@@ -356,6 +364,9 @@ async function handleReset() {
|
|||||||
</Block>
|
</Block>
|
||||||
<Block :title="$t('preferences.widget.title')">
|
<Block :title="$t('preferences.widget.title')">
|
||||||
<Widget
|
<Widget
|
||||||
|
v-model:app-preferences-button-position="
|
||||||
|
appPreferencesButtonPosition
|
||||||
|
"
|
||||||
v-model:widget-fullscreen="widgetFullscreen"
|
v-model:widget-fullscreen="widgetFullscreen"
|
||||||
v-model:widget-global-search="widgetGlobalSearch"
|
v-model:widget-global-search="widgetGlobalSearch"
|
||||||
v-model:widget-language-toggle="widgetLanguageToggle"
|
v-model:widget-language-toggle="widgetLanguageToggle"
|
||||||
|
|||||||
@@ -47,5 +47,9 @@ const listen = computed(() => {
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<PreferencesSheet v-bind="attrs" v-on="listen" />
|
<PreferencesSheet v-bind="attrs" v-on="listen">
|
||||||
|
<template #trigger>
|
||||||
|
<slot></slot>
|
||||||
|
</template>
|
||||||
|
</PreferencesSheet>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/request",
|
"name": "@vben/request",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# 进入目标应用目录,例如 apps/xxxx-app
|
# 进入目标应用目录,例如 apps/xxxx-app
|
||||||
# cd apps/xxxx-app
|
# cd apps/xxxx-app
|
||||||
pnpm add @vben/icons --workspace
|
pnpm add @vben/icons
|
||||||
```
|
```
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/icons",
|
"name": "@vben/icons",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/locales",
|
"name": "@vben/locales",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -179,6 +179,11 @@
|
|||||||
"dynamicTitle": "Dynamic Title",
|
"dynamicTitle": "Dynamic Title",
|
||||||
"watermark": "Watermark",
|
"watermark": "Watermark",
|
||||||
"checkUpdates": "Periodic update check",
|
"checkUpdates": "Periodic update check",
|
||||||
|
"position": {
|
||||||
|
"title": "Preferences Postion",
|
||||||
|
"header": "Header",
|
||||||
|
"fixed": "Fixed"
|
||||||
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"title": "Sidebar",
|
"title": "Sidebar",
|
||||||
"width": "Width",
|
"width": "Width",
|
||||||
@@ -243,7 +248,8 @@
|
|||||||
"radius": "Radius",
|
"radius": "Radius",
|
||||||
"light": "Light",
|
"light": "Light",
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"darkMenu": "Semi Dark Menu",
|
"darkSidebar": "Semi Dark Sidebar",
|
||||||
|
"darkHeader": "Semi Dark Header",
|
||||||
"weakMode": "Weak Mode",
|
"weakMode": "Weak Mode",
|
||||||
"grayMode": "Gray Mode",
|
"grayMode": "Gray Mode",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
|
|||||||
@@ -179,6 +179,11 @@
|
|||||||
"dynamicTitle": "动态标题",
|
"dynamicTitle": "动态标题",
|
||||||
"watermark": "水印",
|
"watermark": "水印",
|
||||||
"checkUpdates": "定时检查更新",
|
"checkUpdates": "定时检查更新",
|
||||||
|
"position": {
|
||||||
|
"title": "偏好设置位置",
|
||||||
|
"header": "顶栏",
|
||||||
|
"fixed": "固定"
|
||||||
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"title": "侧边栏",
|
"title": "侧边栏",
|
||||||
"width": "宽度",
|
"width": "宽度",
|
||||||
@@ -243,7 +248,8 @@
|
|||||||
"radius": "圆角",
|
"radius": "圆角",
|
||||||
"light": "浅色",
|
"light": "浅色",
|
||||||
"dark": "深色",
|
"dark": "深色",
|
||||||
"darkMenu": "深色菜单",
|
"darkSidebar": "深色侧边栏",
|
||||||
|
"darkHeader": "深色顶栏",
|
||||||
"weakMode": "色弱模式",
|
"weakMode": "色弱模式",
|
||||||
"grayMode": "灰色模式",
|
"grayMode": "灰色模式",
|
||||||
"builtin": {
|
"builtin": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/preferences",
|
"name": "@vben/preferences",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/stores",
|
"name": "@vben/stores",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# 进入目标应用目录,例如 apps/xxxx-app
|
# 进入目标应用目录,例如 apps/xxxx-app
|
||||||
# cd apps/xxxx-app
|
# cd apps/xxxx-app
|
||||||
pnpm add @vben/styles --workspace
|
pnpm add @vben/styles
|
||||||
```
|
```
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/styles",
|
"name": "@vben/styles",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# 进入目标应用目录,例如 apps/xxxx-app
|
# 进入目标应用目录,例如 apps/xxxx-app
|
||||||
# cd apps/xxxx-app
|
# cd apps/xxxx-app
|
||||||
pnpm add @vben/types --workspace
|
pnpm add @vben/types
|
||||||
```
|
```
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/types",
|
"name": "@vben/types",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
```bash
|
```bash
|
||||||
# 进入目标应用目录,例如 apps/xxxx-app
|
# 进入目标应用目录,例如 apps/xxxx-app
|
||||||
# cd apps/xxxx-app
|
# cd apps/xxxx-app
|
||||||
pnpm add @vben/utils --workspace
|
pnpm add @vben/utils
|
||||||
```
|
```
|
||||||
|
|
||||||
### 使用
|
### 使用
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/utils",
|
"name": "@vben/utils",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
"homepage": "https://github.com/vbenjs/vue-vben-admin",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/playground",
|
"name": "@vben/playground",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"homepage": "https://vben.pro",
|
"homepage": "https://vben.pro",
|
||||||
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
"bugs": "https://github.com/vbenjs/vue-vben-admin/issues",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/turbo-run",
|
"name": "@vben/turbo-run",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@vben/vsh",
|
"name": "@vben/vsh",
|
||||||
"version": "5.0.1",
|
"version": "5.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
|||||||
Reference in New Issue
Block a user