@@ -13,6 +13,7 @@ import {
13
13
useRole ,
14
14
} from '@floating-ui/react' ;
15
15
import React , { useCallback , useRef , useState } from 'react' ;
16
+ import { createPortal } from 'react-dom' ;
16
17
17
18
import styles from './PopButton.module.css' ;
18
19
@@ -23,9 +24,10 @@ interface NewPopProps {
23
24
} & React . RefAttributes < HTMLButtonElement >
24
25
> ;
25
26
Menu : React . ComponentType < { close : ( ) => void } > ;
27
+ menuContainer ?: React . RefObject < HTMLDivElement > ;
26
28
}
27
29
28
- const PopButton : React . FC < NewPopProps > = ( { Button, Menu } ) => {
30
+ const PopButton : React . FC < NewPopProps > = ( { Button, Menu, menuContainer } ) => {
29
31
const [ isOpen , setIsOpen ] = useState ( false ) ;
30
32
const toggle = useCallback ( ( ) => setIsOpen ( ( v ) => ! v ) , [ ] ) ;
31
33
const close = useCallback ( ( ) => setIsOpen ( false ) , [ ] ) ;
@@ -45,30 +47,34 @@ const PopButton: React.FC<NewPopProps> = ({ Button, Menu }) => {
45
47
46
48
const { getReferenceProps, getFloatingProps } = useInteractions ( [ click , dismiss , role ] ) ;
47
49
50
+ const FloatingMenu = isOpen && (
51
+ < FloatingFocusManager context = { context } >
52
+ < div
53
+ ref = { refs . setFloating }
54
+ className = { styles . container }
55
+ style = { {
56
+ position : strategy ,
57
+ top : y ?? 0 ,
58
+ left : x ?? 0 ,
59
+ width : 'max-content' ,
60
+ } }
61
+ { ...getFloatingProps ( ) }
62
+ >
63
+ < FloatingArrow ref = { arrowRef } context = { context } height = { 10 } width = { 20 } fill = "white" />
64
+ < div className = { containerClass } >
65
+ < Menu close = { close } />
66
+ </ div >
67
+ </ div >
68
+ </ FloatingFocusManager >
69
+ ) ;
70
+
71
+ const Portal = menuContainer ?. current && createPortal ( FloatingMenu , menuContainer . current ) ;
72
+
48
73
return (
49
74
< >
50
75
< Button toggle = { toggle } ref = { refs . setReference } { ...getReferenceProps ( ) } />
51
76
52
- { isOpen && (
53
- < FloatingFocusManager context = { context } >
54
- < div
55
- ref = { refs . setFloating }
56
- className = { styles . container }
57
- style = { {
58
- position : strategy ,
59
- top : y ?? 0 ,
60
- left : x ?? 0 ,
61
- width : 'max-content' ,
62
- } }
63
- { ...getFloatingProps ( ) }
64
- >
65
- < FloatingArrow ref = { arrowRef } context = { context } height = { 10 } width = { 20 } fill = "white" />
66
- < div className = { styles . content } >
67
- < Menu close = { close } />
68
- </ div >
69
- </ div >
70
- </ FloatingFocusManager >
71
- ) }
77
+ { Portal || FloatingMenu }
72
78
</ >
73
79
) ;
74
80
} ;
0 commit comments