@@ -174,6 +174,7 @@ class ToolTipElement extends HTMLElement {
174174 #side: AnchorSide = 'outside-bottom'
175175 #allowUpdatePosition = false
176176 #showReason: 'focus' | 'mouse' = 'mouse'
177+ #isControlsPopoverOpen = false
177178 get showReason ( ) {
178179 return this . #showReason
179180 }
@@ -247,20 +248,28 @@ class ToolTipElement extends HTMLElement {
247248 if ( ! this . control ) return
248249 const showing = isPopoverOpen ( this )
249250
251+ // Track when the control's popover (e.g an ActionMenu) is opened/closed
252+ if ( event . type === 'beforetoggle' && event . currentTarget !== this ) {
253+ this . #isControlsPopoverOpen = ( event as ToggleEvent ) . newState === 'open'
254+ }
255+
250256 // Ensures that tooltip stays open when hovering between tooltip and element
251257 // WCAG Success Criterion 1.4.13 Hoverable
252258 const shouldShow =
253- event . type === 'mouseenter' ||
254- // Only show tooltip on focus if running in headless browser (for tests) or if focus ring
255- // is visible (i.e. if user is using keyboard navigation)
256- ( event . type === 'focus' && ( navigator . webdriver || this . control . matches ( ':focus-visible' ) ) )
259+ ( event . type === 'mouseenter' ||
260+ // Only show tooltip on focus if running in headless browser (for tests) or if focus ring
261+ // is visible (i.e. if user is using keyboard navigation)
262+ ( event . type === 'focus' && ( navigator . webdriver || this . control . matches ( ':focus-visible' ) ) ) ) &&
263+ // Don't show tooltip if the control's popover is open (e.g. an ActionMenu)
264+ ! this . #isControlsPopoverOpen
257265 const isMouseLeaveFromButton =
258266 event . type === 'mouseleave' &&
259267 ( event as MouseEvent ) . relatedTarget !== this . control &&
260268 ( event as MouseEvent ) . relatedTarget !== this
261269 const isEscapeKeydown = event . type === 'keydown' && ( event as KeyboardEvent ) . key === 'Escape'
262270 const isMouseDownOnButton = event . type === 'mousedown' && event . currentTarget === this . control
263- const isOpeningOtherPopover = event . type === 'beforetoggle' && event . currentTarget !== this
271+ const isOpeningOtherPopover =
272+ event . type === 'beforetoggle' && event . currentTarget !== this && ( event as ToggleEvent ) . newState === 'open'
264273 const shouldHide = isMouseLeaveFromButton || isEscapeKeydown || isMouseDownOnButton || isOpeningOtherPopover
265274
266275 if ( showing && isEscapeKeydown ) {
0 commit comments