diff options
author | silverwind <me@silverwind.io> | 2023-05-11 07:40:54 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-11 05:40:54 +0000 |
commit | bcd0733a64012c50ed3d61305be290d1d523d252 (patch) | |
tree | b9f94968eeef856befdc8fc4ab6aae1a5b4d955d /web_src/js/modules | |
parent | 3d9ed62f4aee91f5281c6ff47053d6ecafe3fd9b (diff) | |
download | gitea-bcd0733a64012c50ed3d61305be290d1d523d252.tar.gz gitea-bcd0733a64012c50ed3d61305be290d1d523d252.zip |
Only show one tippy at a time (#24648)
Because our tippy instances have an `interactiveBorder`, it's possible
to bring up two instances at once, which is undesirable.
<img width="256" alt="Screenshot 2023-05-10 at 23 03 04"
src="https://github.com/go-gitea/gitea/assets/115237/3a9a1775-78c1-46d4-a8a5-503ab7dca0d8">
Prevent this by keeping track of visible tippy instances and hiding
others when one is shown. Tippy also has the [singleton
addon](https://atomiks.github.io/tippyjs/v6/addons/#singleton) for the
same purpose, but it's unsuitable to us because we don't init all
tooltips at once.
Diffstat (limited to 'web_src/js/modules')
-rw-r--r-- | web_src/js/modules/tippy.js | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/web_src/js/modules/tippy.js b/web_src/js/modules/tippy.js index 6cec95d766..3a8c7e09c2 100644 --- a/web_src/js/modules/tippy.js +++ b/web_src/js/modules/tippy.js @@ -1,5 +1,7 @@ import tippy from 'tippy.js'; +const visibleInstances = new Set(); + export function createTippy(target, opts = {}) { const instance = tippy(target, { appendTo: document.body, @@ -9,6 +11,18 @@ export function createTippy(target, opts = {}) { interactiveBorder: 20, ignoreAttributes: true, maxWidth: 500, // increase over default 350px + onHide: (instance) => { + visibleInstances.delete(instance); + }, + onDestroy: (instance) => { + visibleInstances.delete(instance); + }, + onShow: (instance) => { + for (const visibleInstance of visibleInstances) { + visibleInstance.hide(); // hide other instances + } + visibleInstances.add(instance); + }, arrow: `<svg width="16" height="7"><path d="m0 7 8-7 8 7Z" class="tippy-svg-arrow-outer"/><path d="m0 8 8-7 8 7Z" class="tippy-svg-arrow-inner"/></svg>`, ...(opts?.role && {theme: opts.role}), ...opts, |