@@ -64,6 +64,23 @@ export class GlPopover extends GlElement {
6464 delegatesFocus : true ,
6565 } ;
6666
67+ /** static registry to track all open popovers */
68+ private static readonly openPopovers = new Set < GlPopover > ( ) ;
69+
70+ private static closeOthers ( openingPopover : GlPopover ) : void {
71+ for ( const popover of GlPopover . openPopovers ) {
72+ if (
73+ popover === openingPopover ||
74+ // Check if the popover contains the opening popover
75+ Boolean ( popover . compareDocumentPosition ( openingPopover ) & Node . DOCUMENT_POSITION_CONTAINS )
76+ ) {
77+ continue ;
78+ }
79+
80+ void popover . hide ( ) ;
81+ }
82+ }
83+
6784 static override styles = [
6885 scrollableBase ,
6986 css `
@@ -228,6 +245,10 @@ export class GlPopover extends GlElement {
228245 window . removeEventListener ( 'webview-blur' , this . handleWebviewBlur , false ) ;
229246 document . removeEventListener ( 'keydown' , this . handleDocumentKeyDown ) ;
230247 document . removeEventListener ( 'mousedown' , this . handleWebviewMouseDown ) ;
248+
249+ // Remove this popover from the registry when it's disconnected
250+ GlPopover . openPopovers . delete ( this ) ;
251+
231252 super . disconnectedCallback ( ) ;
232253 }
233254
@@ -286,7 +307,13 @@ export class GlPopover extends GlElement {
286307 }
287308 if ( this . open ) return undefined ;
288309
310+ // Close other popovers before showing this one, unless this popover is a descendant of an open popover
311+ GlPopover . closeOthers ( this ) ;
312+
289313 this . open = true ;
314+ // Add this popover to the registry when it's opened
315+ GlPopover . openPopovers . add ( this ) ;
316+
290317 return waitForEvent ( this , 'gl-popover-after-show' ) ;
291318 }
292319
@@ -296,6 +323,9 @@ export class GlPopover extends GlElement {
296323 if ( ! this . open ) return undefined ;
297324
298325 this . open = false ;
326+ // Remove this popover from the registry when it's closed
327+ GlPopover . openPopovers . delete ( this ) ;
328+
299329 return waitForEvent ( this , 'gl-popover-after-hide' ) ;
300330 }
301331
0 commit comments