Skip to content

Commit 954596a

Browse files
authored
Hide tooltip when popover (ActionMenu) is activated (#3823)
1 parent 47d051d commit 954596a

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

.changeset/stupid-toes-find.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@primer/view-components': patch
3+
---
4+
5+
Tooltip: Prevents tooltip from appearing when popover (e.g. ActionMenu) is opened

app/components/primer/alpha/tool_tip.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)