@@ -731,6 +731,7 @@ export function FloatingFocusManager(props: FloatingFocusManagerProps): React.JS
731731
732732 const doc = ownerDocument ( floatingFocusElement ) ;
733733 const previouslyFocusedElement = activeElement ( doc ) ;
734+ const openedProgrammatically = openInteractionTypeRef . current == null ;
734735
735736 addPreviouslyFocusedElement ( previouslyFocusedElement ) ;
736737
@@ -793,15 +794,22 @@ export function FloatingFocusManager(props: FloatingFocusManagerProps): React.JS
793794 resolvedReturnFocusValue = true ;
794795 }
795796
796- if ( typeof resolvedReturnFocusValue === 'boolean' ) {
797- if ( domReference ?. isConnected ) {
798- return domReference ;
799- }
800-
801- return getPreviouslyFocusedElement ( ) || null ;
797+ const connectedReference = domReference ?. isConnected ? domReference : null ;
798+ let previouslyFocusedReturnElement = previouslyFocusedElement ;
799+ if (
800+ ! previouslyFocusedReturnElement ?. isConnected ||
801+ getNodeName ( previouslyFocusedReturnElement ) === 'body'
802+ ) {
803+ previouslyFocusedReturnElement = getPreviouslyFocusedElement ( ) || null ;
802804 }
803805
804- const fallback = domReference ?. isConnected ? domReference : getPreviouslyFocusedElement ( ) ;
806+ const fallback = openedProgrammatically
807+ ? previouslyFocusedReturnElement || connectedReference
808+ : connectedReference || previouslyFocusedReturnElement ;
809+
810+ if ( typeof resolvedReturnFocusValue === 'boolean' ) {
811+ return fallback ;
812+ }
805813
806814 return resolveRef ( resolvedReturnFocusValue ) || fallback || null ;
807815 }
@@ -850,6 +858,7 @@ export function FloatingFocusManager(props: FloatingFocusManagerProps): React.JS
850858 floating ,
851859 floatingFocusElement ,
852860 returnFocusRef ,
861+ openInteractionTypeRef ,
853862 events ,
854863 tree ,
855864 domReference ,
0 commit comments