diff --git a/docs/src/components/common-ui/vben-drawer.md b/docs/src/components/common-ui/vben-drawer.md index 43cb9889c..044208555 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 diff --git a/docs/src/components/common-ui/vben-modal.md b/docs/src/components/common-ui/vben-modal.md index 45204bffa..f3e2a17bb 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 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 d2825bd61..c43677d3e 100644 --- a/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts +++ b/packages/@core/ui-kit/popup-ui/src/drawer/drawer.ts @@ -85,12 +85,16 @@ export interface DrawerProps { * 是否自动聚焦 */ openAutoFocus?: boolean; + /** + * 弹窗遮罩模糊效果 + */ + overlayBlur?: number; + /** * 抽屉位置 * @default right */ placement?: DrawerPlacement; - /** * 是否显示取消按钮 * @default true 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 30687bd34..1b1a4a509 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.ts b/packages/@core/ui-kit/popup-ui/src/modal/modal.ts index e69019fb4..14225e8c7 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 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 4e7d7ca78..ae02a245a 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 67bf64a68..bf91f7e92 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 @@ -25,6 +25,7 @@ const props = withDefaults( closeClass?: ClassType; modal?: boolean; open?: boolean; + overlayBlur?: number; showClose?: boolean; zIndex?: number; } @@ -82,7 +83,12 @@ defineExpose({ emits('close')" /> diff --git a/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetContent.vue b/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetContent.vue index f8e22168c..4ab6231ce 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetContent.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/ui/sheet/SheetContent.vue @@ -17,6 +17,7 @@ interface SheetContentProps extends DialogContentProps { class?: any; modal?: boolean; open?: boolean; + overlayBlur?: number; side?: SheetVariants['side']; zIndex?: number; } @@ -75,12 +76,23 @@ function onAnimationEnd(event: AnimationEvent) { - + diff --git a/playground/src/views/examples/drawer/base-demo.vue b/playground/src/views/examples/drawer/base-demo.vue index ffa5e3900..11c65130c 100644 --- a/playground/src/views/examples/drawer/base-demo.vue +++ b/playground/src/views/examples/drawer/base-demo.vue @@ -7,6 +7,9 @@ const [Drawer, drawerApi] = useVbenDrawer({ onCancel() { drawerApi.close(); }, + onClosed() { + drawerApi.setState({ overlayBlur: 0, placement: 'right' }); + }, onConfirm() { message.info('onConfirm'); // drawerApi.close(); diff --git a/playground/src/views/examples/drawer/index.vue b/playground/src/views/examples/drawer/index.vue index d50aeb227..7773240d7 100644 --- a/playground/src/views/examples/drawer/index.vue +++ b/playground/src/views/examples/drawer/index.vue @@ -45,6 +45,10 @@ function openBaseDrawer(placement: DrawerPlacement = 'right') { baseDrawerApi.setState({ placement }).open(); } +function openBlurDrawer() { + baseDrawerApi.setState({ overlayBlur: 5 }).open(); +} + function openInContentDrawer(placement: DrawerPlacement = 'right') { const state: Partial = { class: '', placement }; if (placement === 'top') { @@ -124,6 +128,9 @@ function openFormDrawer() { 顶部打开 + + 遮罩层模糊效果 + diff --git a/playground/src/views/examples/modal/blur-demo.vue b/playground/src/views/examples/modal/blur-demo.vue new file mode 100644 index 000000000..432ce0da0 --- /dev/null +++ b/playground/src/views/examples/modal/blur-demo.vue @@ -0,0 +1,23 @@ + + + + 调整滑块来改变遮罩层模糊程度:{{ blur }} + + + diff --git a/playground/src/views/examples/modal/index.vue b/playground/src/views/examples/modal/index.vue index 4b35f598b..8d26b8be4 100644 --- a/playground/src/views/examples/modal/index.vue +++ b/playground/src/views/examples/modal/index.vue @@ -6,6 +6,7 @@ import { Button, Card, Flex } from 'ant-design-vue'; import DocButton from '../doc-button.vue'; import AutoHeightDemo from './auto-height-demo.vue'; import BaseDemo from './base-demo.vue'; +import BlurDemo from './blur-demo.vue'; import DragDemo from './drag-demo.vue'; import DynamicDemo from './dynamic-demo.vue'; import FormModalDemo from './form-modal-demo.vue'; @@ -47,6 +48,10 @@ const [NestedModal, nestedModalApi] = useVbenModal({ connectedComponent: NestedDemo, }); +const [BlurModal, blurModalApi] = useVbenModal({ + connectedComponent: BlurDemo, +}); + function openBaseModal() { baseModalApi.open(); } @@ -80,6 +85,10 @@ function openNestedModal() { nestedModalApi.open(); } +function openBlurModal() { + blurModalApi.open(); +} + function handleUpdateTitle() { dynamicModalApi.setState({ title: '外部动态标题' }).open(); } @@ -111,6 +120,7 @@ function openFormModal() { + 一个基础的弹窗示例 @@ -176,6 +186,13 @@ function openFormModal() { 打开嵌套弹窗 + + + 遮罩层应用类似毛玻璃的模糊效果 + + 打开弹窗 + +
调整滑块来改变遮罩层模糊程度:{{ blur }}
一个基础的弹窗示例
遮罩层应用类似毛玻璃的模糊效果