@@ -10,6 +10,7 @@ import React, {
1010} from 'react'
1111import ReactDOM from 'react-dom'
1212import { noop } from 'lodash-es'
13+ import { document } from 'ssr-window'
1314
1415/* Internal dependencies */
1516import useMergeRefs from '../../hooks/useMergeRefs'
@@ -28,9 +29,9 @@ export const OVERLAY_TEST_ID = 'ch-design-system-overlay'
2829
2930const ESCAPE_KEY = 'Escape'
3031const rootElement =
31- document . getElementById ( 'main' ) ||
32- document . getElementById ( 'root' ) ||
33- document . getElementsByTagName ( 'body' ) [ 0 ] as HTMLElement
32+ document . getElementById ! ( 'main' ) ||
33+ document . getElementById ! ( 'root' ) ||
34+ document . getElementById ! ( '__next' ) as HTMLElement
3435
3536function listen < K extends keyof HTMLElementEventMap > ( element : any , eventName : K , handler : EventHandler < K > ) {
3637 if ( ! element ) return noop
@@ -59,6 +60,7 @@ function getOverlayTranslation({
5960 placement,
6061 marginX,
6162 marginY,
63+ keepInContainer,
6264} : GetOverlayTranslatationProps ) : React . CSSProperties {
6365 if ( target ) {
6466 const {
@@ -120,16 +122,18 @@ function getOverlayTranslation({
120122 break
121123 }
122124
123- const isOverTop = targetTop + translateY < rootTop
124- const isOverBottom = targetTop + translateY + overlayHeight > rootTop + rootHeight
125- const isOverLeft = targetLeft + translateX < rootLeft
126- const isOverRight = targetLeft + translateX + overlayWidth > rootLeft + rootWidth
125+ if ( keepInContainer ) {
126+ const isOverTop = targetTop + translateY < rootTop
127+ const isOverBottom = targetTop + translateY + overlayHeight > rootTop + rootHeight
128+ const isOverLeft = targetLeft + translateX < rootLeft
129+ const isOverRight = targetLeft + translateX + overlayWidth > rootLeft + rootWidth
127130
128- if ( isOverTop || isOverBottom ) {
129- translateY = targetHeight - translateY - overlayHeight
130- }
131- if ( isOverLeft || isOverRight ) {
132- translateX = targetWidth - translateX - overlayWidth
131+ if ( isOverTop || isOverBottom ) {
132+ translateY = targetHeight - translateY - overlayHeight
133+ }
134+ if ( isOverLeft || isOverRight ) {
135+ translateX = targetWidth - translateX - overlayWidth
136+ }
133137 }
134138
135139 const transform = `translate(${ translateX } px, ${ translateY } px)`
@@ -144,10 +148,11 @@ function getOverlayStyle({
144148 placement,
145149 marginX,
146150 marginY,
151+ keepInContainer,
147152} : GetOverlayStyleProps ) : React . CSSProperties {
148153 if ( target ) {
149154 const overlayPositionStyle = getOverlayPosition ( { target } )
150- const overlayTranslateStyle = getOverlayTranslation ( { target, overlay, placement, marginX, marginY } )
155+ const overlayTranslateStyle = getOverlayTranslation ( { target, overlay, placement, marginX, marginY, keepInContainer } )
151156
152157 const combinedStyle = {
153158 ...overlayPositionStyle ,
@@ -175,6 +180,7 @@ function Overlay(
175180 placement = OverlayPosition . LeftCenter ,
176181 marginX = 0 ,
177182 marginY = 0 ,
183+ keepInContainer = false ,
178184 children,
179185 onHide = noop ,
180186 ...otherProps
@@ -273,6 +279,7 @@ function Overlay(
273279 placement,
274280 marginX,
275281 marginY,
282+ keepInContainer,
276283 } )
277284 setOverlayStyle ( tempOverlayStyle )
278285 setIsHidden ( false )
@@ -283,7 +290,7 @@ function Overlay(
283290 }
284291 }
285292 return noop
286- } , [ show , marginX , marginY , placement , target ] )
293+ } , [ show , marginX , marginY , placement , target , keepInContainer ] )
287294
288295 if ( ! show ) return null
289296
0 commit comments