diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-antd/src/bootstrap.ts index f842021c..43b6f787 100644 --- a/apps/web-antd/src/bootstrap.ts +++ b/apps/web-antd/src/bootstrap.ts @@ -1,6 +1,7 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; +import { initTippy } from '@vben/common-ui'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; @@ -33,6 +34,9 @@ async function bootstrap(namespace: string) { // 安装权限指令 registerAccessDirective(app); + // 初始化 tippy + initTippy(app); + // 配置路由及路由守卫 app.use(router); diff --git a/apps/web-ele/src/bootstrap.ts b/apps/web-ele/src/bootstrap.ts index ad1dce0f..9cdb0863 100644 --- a/apps/web-ele/src/bootstrap.ts +++ b/apps/web-ele/src/bootstrap.ts @@ -1,6 +1,7 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; +import { initTippy } from '@vben/common-ui'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; @@ -32,6 +33,9 @@ async function bootstrap(namespace: string) { // 安装权限指令 registerAccessDirective(app); + // 初始化 tippy + initTippy(app); + // 配置路由及路由守卫 app.use(router); diff --git a/apps/web-naive/src/bootstrap.ts b/apps/web-naive/src/bootstrap.ts index 40416d82..d4172b28 100644 --- a/apps/web-naive/src/bootstrap.ts +++ b/apps/web-naive/src/bootstrap.ts @@ -1,6 +1,7 @@ import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; +import { initTippy } from '@vben/common-ui'; import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; @@ -28,6 +29,9 @@ async function bootstrap(namespace: string) { // 安装权限指令 registerAccessDirective(app); + // 初始化 tippy + initTippy(app); + // 配置路由及路由守卫 app.use(router); diff --git a/docs/src/components/common-ui/vben-drawer.md b/docs/src/components/common-ui/vben-drawer.md index e2409daa..04420855 100644 --- a/docs/src/components/common-ui/vben-drawer.md +++ b/docs/src/components/common-ui/vben-drawer.md @@ -101,6 +101,7 @@ const [Drawer, drawerApi] = useVbenDrawer({ | footerClass | modal底部区域的class | `string` | - | | headerClass | modal顶部区域的class | `string` | - | | zIndex | 抽屉的ZIndex层级 | `number` | `1000` | +| overlayBlur | 遮罩模糊度 | `number` | - | ::: info appendToMain @@ -133,13 +134,13 @@ const [Drawer, drawerApi] = useVbenDrawer({ | close-icon | 关闭按钮图标 | | extra | 额外内容(标题右侧) | -### modalApi +### drawerApi -| 事件名 | 描述 | 类型 | +| 方法 | 描述 | 类型 | | --- | --- | --- | -| setState | 动态设置弹窗状态属性 | `setState(props) \| setState((prev)=>(props))` | +| setState | 动态设置弹窗状态属性 | `(((prev: ModalState) => Partial)\| Partial)=>drawerApi` | | open | 打开弹窗 | `()=>void` | | close | 关闭弹窗 | `()=>void` | -| setData | 设置共享数据 | `(data:T)=>void` | +| setData | 设置共享数据 | `(data:T)=>drawerApi` | | getData | 获取共享数据 | `()=>T` | | useStore | 获取可响应式状态 | - | diff --git a/docs/src/components/common-ui/vben-modal.md b/docs/src/components/common-ui/vben-modal.md index 9e422d18..f3e2a17b 100644 --- a/docs/src/components/common-ui/vben-modal.md +++ b/docs/src/components/common-ui/vben-modal.md @@ -111,6 +111,7 @@ const [Modal, modalApi] = useVbenModal({ | headerClass | modal顶部区域的class | `string` | - | | bordered | 是否显示border | `boolean` | `false` | | zIndex | 弹窗的ZIndex层级 | `number` | `1000` | +| overlayBlur | 遮罩模糊度 | `number` | - | ::: info appendToMain @@ -143,11 +144,11 @@ const [Modal, modalApi] = useVbenModal({ ### modalApi -| 事件名 | 描述 | 类型 | +| 方法 | 描述 | 类型 | | --- | --- | --- | -| setState | 动态设置弹窗状态属性 | `setState(props) \| setState((prev)=>(props))` | +| setState | 动态设置弹窗状态属性 | `(((prev: ModalState) => Partial)\| Partial)=>modalApi` | | open | 打开弹窗 | `()=>void` | | close | 关闭弹窗 | `()=>void` | -| setData | 设置共享数据 | `(data:T)=>void` | +| setData | 设置共享数据 | `(data:T)=>modalApi` | | getData | 获取共享数据 | `()=>T` | | useStore | 获取可响应式状态 | - | diff --git a/docs/src/demos/vben-drawer/dynamic/index.vue b/docs/src/demos/vben-drawer/dynamic/index.vue index ad7e6565..95464023 100644 --- a/docs/src/demos/vben-drawer/dynamic/index.vue +++ b/docs/src/demos/vben-drawer/dynamic/index.vue @@ -13,8 +13,7 @@ function open() { } function handleUpdateTitle() { - drawerApi.setState({ title: '外部动态标题' }); - drawerApi.open(); + drawerApi.setState({ title: '外部动态标题' }).open(); } diff --git a/docs/src/demos/vben-drawer/shared-data/index.vue b/docs/src/demos/vben-drawer/shared-data/index.vue index 04885f15..fef6cb05 100644 --- a/docs/src/demos/vben-drawer/shared-data/index.vue +++ b/docs/src/demos/vben-drawer/shared-data/index.vue @@ -9,11 +9,12 @@ const [Drawer, drawerApi] = useVbenDrawer({ }); function open() { - drawerApi.setData({ - content: '外部传递的数据 content', - payload: '外部传递的数据 payload', - }); - drawerApi.open(); + drawerApi + .setData({ + content: '外部传递的数据 content', + payload: '外部传递的数据 payload', + }) + .open(); } diff --git a/docs/src/demos/vben-modal/dynamic/index.vue b/docs/src/demos/vben-modal/dynamic/index.vue index 718e532b..1b025545 100644 --- a/docs/src/demos/vben-modal/dynamic/index.vue +++ b/docs/src/demos/vben-modal/dynamic/index.vue @@ -13,8 +13,7 @@ function openModal() { } function handleUpdateTitle() { - modalApi.setState({ title: '外部动态标题' }); - modalApi.open(); + modalApi.setState({ title: '外部动态标题' }).open(); } diff --git a/docs/src/demos/vben-modal/shared-data/index.vue b/docs/src/demos/vben-modal/shared-data/index.vue index 58c35e24..91afeb70 100644 --- a/docs/src/demos/vben-modal/shared-data/index.vue +++ b/docs/src/demos/vben-modal/shared-data/index.vue @@ -9,11 +9,12 @@ const [Modal, modalApi] = useVbenModal({ }); function openModal() { - modalApi.setData({ - content: '外部传递的数据 content', - payload: '外部传递的数据 payload', - }); - modalApi.open(); + modalApi + .setData({ + content: '外部传递的数据 content', + payload: '外部传递的数据 payload', + }) + .open(); } diff --git a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap index 81df9682..486bf048 100644 --- a/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap +++ b/packages/@core/preferences/__tests__/__snapshots__/config.test.ts.snap @@ -80,6 +80,7 @@ exports[`defaultPreferences immutability test > should not modify the config obj "enable": true, "height": 38, "keepAlive": true, + "middleClickToClose": false, "persist": true, "showIcon": true, "showMaximize": true, diff --git a/packages/@core/preferences/src/config.ts b/packages/@core/preferences/src/config.ts index fcf03f80..df6d69ca 100644 --- a/packages/@core/preferences/src/config.ts +++ b/packages/@core/preferences/src/config.ts @@ -80,6 +80,7 @@ const defaultPreferences: Preferences = { enable: true, height: 38, keepAlive: true, + middleClickToClose: false, persist: true, showIcon: true, showMaximize: true, diff --git a/packages/@core/preferences/src/types.ts b/packages/@core/preferences/src/types.ts index f8b35242..b554b219 100644 --- a/packages/@core/preferences/src/types.ts +++ b/packages/@core/preferences/src/types.ts @@ -168,6 +168,8 @@ interface TabbarPreferences { height: number; /** 开启标签页缓存功能 */ keepAlive: boolean; + /** 是否点击中键时关闭标签 */ + middleClickToClose: boolean; /** 是否持久化标签 */ persist: boolean; /** 是否开启多标签页图标 */ diff --git a/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts b/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts index bc5c1dac..bbba08ff 100644 --- a/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts +++ b/packages/@core/ui-kit/popup-ui/src/drawer/drawer-api.ts @@ -4,6 +4,12 @@ import { Store } from '@vben-core/shared/store'; import { bindMethods, isFunction } from '@vben-core/shared/utils'; export class DrawerApi { + // 共享数据 + public sharedData: Record<'payload', any> = { + payload: {}, + }; + public store: Store; + private api: Pick< DrawerApiOptions, | 'onBeforeClose' @@ -13,16 +19,10 @@ export class DrawerApi { | 'onOpenChange' | 'onOpened' >; + // private prevState!: DrawerState; private state!: DrawerState; - // 共享数据 - public sharedData: Record<'payload', any> = { - payload: {}, - }; - - public store: Store; - constructor(options: DrawerApiOptions = {}) { const { connectedComponent: _, @@ -149,6 +149,7 @@ export class DrawerApi { setData(payload: T) { this.sharedData.payload = payload; + return this; } setState( @@ -161,5 +162,6 @@ export class DrawerApi { } else { this.store.setState((prev) => ({ ...prev, ...stateOrFn })); } + return this; } } diff --git a/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts b/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts index 34c2e17d..c43677d3 100644 --- a/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts +++ b/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts @@ -1,6 +1,7 @@ -import type { ClassType } from '@vben-core/typings'; import type { Component, Ref } from 'vue'; +import type { ClassType } from '@vben-core/typings'; + import type { DrawerApi } from './drawer-api'; export type DrawerPlacement = 'bottom' | 'left' | 'right' | 'top'; @@ -84,12 +85,16 @@ export interface DrawerProps { * 是否自动聚焦 */ openAutoFocus?: boolean; + /** + * 弹窗遮罩模糊效果 + */ + overlayBlur?: number; + /** * 抽屉位置 * @default right */ placement?: DrawerPlacement; - /** * 是否显示取消按钮 * @default true @@ -123,11 +128,11 @@ export interface DrawerState extends DrawerProps { sharedData?: Record; } -export type ExtendedDrawerApi = { +export type ExtendedDrawerApi = DrawerApi & { useStore: >( selector?: (state: NoInfer) => T, ) => Readonly>; -} & DrawerApi; +}; export interface DrawerApiOptions extends DrawerState { /** diff --git a/packages/@core/ui-kit/popup-ui/src/drawer/drawer.vue b/packages/@core/ui-kit/popup-ui/src/drawer/drawer.vue index 30687bd3..1b1a4a50 100644 --- a/packages/@core/ui-kit/popup-ui/src/drawer/drawer.vue +++ b/packages/@core/ui-kit/popup-ui/src/drawer/drawer.vue @@ -68,6 +68,7 @@ const { loading: showLoading, modal, openAutoFocus, + overlayBlur, placement, showCancelButton, showConfirmButton, @@ -140,6 +141,7 @@ const getAppendTo = computed(() => { :open="state?.isOpen" :side="placement" :z-index="zIndex" + :overlay-blur="overlayBlur" @close-auto-focus="handleFocusOutside" @closed="() => drawerApi?.onClosed()" @escape-key-down="escapeKeyDown" diff --git a/packages/@core/ui-kit/popup-ui/src/modal/modal-api.ts b/packages/@core/ui-kit/popup-ui/src/modal/modal-api.ts index d2f89dc3..c401793c 100644 --- a/packages/@core/ui-kit/popup-ui/src/modal/modal-api.ts +++ b/packages/@core/ui-kit/popup-ui/src/modal/modal-api.ts @@ -4,6 +4,12 @@ import { Store } from '@vben-core/shared/store'; import { bindMethods, isFunction } from '@vben-core/shared/utils'; export class ModalApi { + // 共享数据 + public sharedData: Record<'payload', any> = { + payload: {}, + }; + public store: Store; + private api: Pick< ModalApiOptions, | 'onBeforeClose' @@ -13,16 +19,10 @@ export class ModalApi { | 'onOpenChange' | 'onOpened' >; + // private prevState!: ModalState; private state!: ModalState; - // 共享数据 - public sharedData: Record<'payload', any> = { - payload: {}, - }; - - public store: Store; - constructor(options: ModalApiOptions = {}) { const { connectedComponent: _, @@ -159,6 +159,7 @@ export class ModalApi { setData(payload: T) { this.sharedData.payload = payload; + return this; } setState( @@ -171,5 +172,6 @@ export class ModalApi { } else { this.store.setState((prev) => ({ ...prev, ...stateOrFn })); } + return this; } } diff --git a/packages/@core/ui-kit/popup-ui/src/modal/modal.ts b/packages/@core/ui-kit/popup-ui/src/modal/modal.ts index e30fc808..14225e8c 100644 --- a/packages/@core/ui-kit/popup-ui/src/modal/modal.ts +++ b/packages/@core/ui-kit/popup-ui/src/modal/modal.ts @@ -99,6 +99,10 @@ export interface ModalProps { * 是否自动聚焦 */ openAutoFocus?: boolean; + /** + * 弹窗遮罩模糊效果 + */ + overlayBlur?: number; /** * 是否显示取消按钮 * @default true @@ -132,11 +136,11 @@ export interface ModalState extends ModalProps { sharedData?: Record; } -export type ExtendedModalApi = { +export type ExtendedModalApi = ModalApi & { useStore: >( selector?: (state: NoInfer) => T, ) => Readonly>; -} & ModalApi; +}; export interface ModalApiOptions extends ModalState { /** diff --git a/packages/@core/ui-kit/popup-ui/src/modal/modal.vue b/packages/@core/ui-kit/popup-ui/src/modal/modal.vue index 4e7d7ca7..ae02a245 100644 --- a/packages/@core/ui-kit/popup-ui/src/modal/modal.vue +++ b/packages/@core/ui-kit/popup-ui/src/modal/modal.vue @@ -77,6 +77,7 @@ const { loading: showLoading, modal, openAutoFocus, + overlayBlur, showCancelButton, showConfirmButton, title, @@ -196,6 +197,7 @@ const getAppendTo = computed(() => { :open="state?.isOpen" :show-close="closable" :z-index="zIndex" + :overlay-blur="overlayBlur" close-class="top-3" @close-auto-focus="handleFocusOutside" @closed="() => modalApi?.onClosed()" diff --git a/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogContent.vue b/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogContent.vue index d1733069..bf91f7e9 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogContent.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/ui/dialog/DialogContent.vue @@ -1,8 +1,12 @@