@@ -183,6 +183,12 @@ export interface DialogProps extends VibeComponentProps {
183183 * that may grow or shrink without a re-render being triggered.
184184 */
185185 observeContentResize ?: boolean ;
186+ /**
187+ * If true, provides a LayerProvider context for nested dialogs to render correctly.
188+ * This is useful when you have components that use Dialog internally (like Dropdown)
189+ * inside another Dialog, ensuring proper z-index stacking and click-outside behavior.
190+ */
191+ enableNestedDialogLayer ?: boolean ;
186192}
187193
188194export interface DialogState {
@@ -230,7 +236,8 @@ export default class Dialog extends PureComponent<DialogProps, DialogState> {
230236 shouldCallbackOnMount : false ,
231237 instantShowAndHide : false ,
232238 addKeyboardHideShowTriggersByDefault : false ,
233- observeContentResize : false
239+ observeContentResize : false ,
240+ enableNestedDialogLayer : false
234241 } ;
235242 private showTimeout : NodeJS . Timeout ;
236243 private hideTimeout : NodeJS . Timeout ;
@@ -559,6 +566,7 @@ export default class Dialog extends PureComponent<DialogProps, DialogState> {
559566 disableContainerScroll,
560567 containerSelector,
561568 observeContentResize,
569+ enableNestedDialogLayer,
562570 id,
563571 "data-testid" : dataTestId
564572 } = this . props ;
@@ -651,40 +659,44 @@ export default class Dialog extends PureComponent<DialogProps, DialogState> {
651659
652660 const mergedRef = chainRefFunctions ( [ ref , this . containerRef ] ) ;
653661
654- return (
655- < LayerProvider layerRef = { this . containerRef } >
656- < DialogContent
657- data-testid = { overrideDataTestId }
658- isReferenceHidden = { hideWhenReferenceHidden && isReferenceHidden }
659- onMouseEnter = { this . onDialogEnter }
660- onMouseLeave = { this . onDialogLeave }
661- onClickOutside = { this . onClickOutside }
662- onContextMenu = { this . onContextMenu }
663- onEsc = { this . onEsc }
664- animationType = { animationTypeCalculated }
665- position = { placement }
666- wrapperClassName = { wrapperClassName }
667- startingEdge = { startingEdge }
668- isOpen = { this . isShown ( ) }
669- showDelay = { showDelay }
670- styleObject = { style }
671- ref = { mergedRef }
672- onClick = { this . onContentClick }
673- hasTooltip = { ! ! tooltip }
674- containerSelector = { containerSelector }
675- disableContainerScroll = { disableContainerScroll }
676- >
677- { contentRendered }
678- { tooltip && (
679- < div
680- style = { arrowProps . style }
681- ref = { arrowProps . ref }
682- className = { cx ( styles . arrow , tooltipClassName ) }
683- data-placement = { placement }
684- />
685- ) }
686- </ DialogContent >
687- </ LayerProvider >
662+ const dialogContent = (
663+ < DialogContent
664+ data-testid = { overrideDataTestId }
665+ isReferenceHidden = { hideWhenReferenceHidden && isReferenceHidden }
666+ onMouseEnter = { this . onDialogEnter }
667+ onMouseLeave = { this . onDialogLeave }
668+ onClickOutside = { this . onClickOutside }
669+ onContextMenu = { this . onContextMenu }
670+ onEsc = { this . onEsc }
671+ animationType = { animationTypeCalculated }
672+ position = { placement }
673+ wrapperClassName = { wrapperClassName }
674+ startingEdge = { startingEdge }
675+ isOpen = { this . isShown ( ) }
676+ showDelay = { showDelay }
677+ styleObject = { style }
678+ ref = { mergedRef }
679+ onClick = { this . onContentClick }
680+ hasTooltip = { ! ! tooltip }
681+ containerSelector = { containerSelector }
682+ disableContainerScroll = { disableContainerScroll }
683+ >
684+ { contentRendered }
685+ { tooltip && (
686+ < div
687+ style = { arrowProps . style }
688+ ref = { arrowProps . ref }
689+ className = { cx ( styles . arrow , tooltipClassName ) }
690+ data-placement = { placement }
691+ />
692+ ) }
693+ </ DialogContent >
694+ ) ;
695+
696+ return enableNestedDialogLayer ? (
697+ < LayerProvider layerRef = { this . containerRef } > { dialogContent } </ LayerProvider >
698+ ) : (
699+ dialogContent
688700 ) ;
689701 } }
690702 </ Popper > ,
0 commit comments