From 29fa46276d6bf69b5b87880c476c6f778c2820bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20Louison?= Date: Mon, 21 Apr 2025 17:42:55 +0200 Subject: [PATCH] feat(App): add global `portal` prop (#3688) Co-authored-by: Benjamin Canac --- src/runtime/components/App.vue | 10 +++++++- src/runtime/components/ContextMenu.vue | 2 +- src/runtime/components/ContextMenuContent.vue | 8 ++++--- src/runtime/components/Drawer.vue | 6 +++-- src/runtime/components/DropdownMenu.vue | 2 +- .../components/DropdownMenuContent.vue | 8 ++++--- src/runtime/components/InputMenu.vue | 6 +++-- src/runtime/components/Modal.vue | 6 +++-- src/runtime/components/Popover.vue | 6 +++-- src/runtime/components/Select.vue | 6 +++-- src/runtime/components/SelectMenu.vue | 6 +++-- src/runtime/components/Slideover.vue | 6 +++-- src/runtime/components/Toaster.vue | 8 ++++--- src/runtime/components/Tooltip.vue | 6 +++-- src/runtime/composables/usePortal.ts | 24 +++++++++++++++++++ 15 files changed, 82 insertions(+), 28 deletions(-) create mode 100644 src/runtime/composables/usePortal.ts diff --git a/src/runtime/components/App.vue b/src/runtime/components/App.vue index 8f478c72..36ac69e0 100644 --- a/src/runtime/components/App.vue +++ b/src/runtime/components/App.vue @@ -6,6 +6,7 @@ export interface AppProps extends Omit + portal?: string | HTMLElement } export interface AppSlots { @@ -22,10 +23,14 @@ import { toRef, useId, provide } from 'vue' import { ConfigProvider, TooltipProvider, useForwardProps } from 'reka-ui' import { reactivePick } from '@vueuse/core' import { localeContextInjectionKey } from '../composables/useLocale' +import { portalTargetInjectionKey } from '../composables/usePortal' import UToaster from './Toaster.vue' import UOverlayProvider from './OverlayProvider.vue' -const props = defineProps>() +const props = withDefaults(defineProps>(), { + portal: 'body' +}) + defineSlots() const configProviderProps = useForwardProps(reactivePick(props, 'scrollBody')) @@ -34,6 +39,9 @@ const toasterProps = toRef(() => props.toaster) const locale = toRef(() => props.locale) provide(localeContextInjectionKey, locale) + +const portal = toRef(() => props.portal) +provide(portalTargetInjectionKey, portal)