Skip to content

Commit a14a063

Browse files
authored
feat(Dialog): add enableNestedDialogLayer prop (#3176)
1 parent dc38180 commit a14a063

File tree

1 file changed

+47
-35
lines changed

1 file changed

+47
-35
lines changed

packages/core/src/components/Dialog/Dialog.tsx

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

188194
export 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

Comments
 (0)