diff --git a/groups.io/css/application-ab47fef79b718ba05bf14c1f606f129f.css b/groups.io/css/application-07b87eb5d00416f24d1d9fb6b4e4ed02.css similarity index 99% rename from groups.io/css/application-ab47fef79b718ba05bf14c1f606f129f.css rename to groups.io/css/application-07b87eb5d00416f24d1d9fb6b4e4ed02.css index 42e61ca05..1555e030b 100644 --- a/groups.io/css/application-ab47fef79b718ba05bf14c1f606f129f.css +++ b/groups.io/css/application-07b87eb5d00416f24d1d9fb6b4e4ed02.css @@ -3764,7 +3764,8 @@ table.table-fixed { } .hashtag-label-white { - background-color: #fff; + --hashtag-bg: #fff; + background-color: var(--hashtag-bg); border-color: #ccc; } @@ -3776,171 +3777,213 @@ table.table-fixed { } .hashtag-label-green-lantern { - background-color: #61b16c; + --hashtag-bg: #61b16c; + background-color: var(--hashtag-bg); } .hashtag-label-cucumber { - background-color: #91d09a; + --hashtag-bg: #91d09a; + background-color: var(--hashtag-bg); } .hashtag-label-cerulean-blue { - background-color: #4191d6; + --hashtag-bg: #4191d6; + background-color: var(--hashtag-bg); } .hashtag-label-bluejean { - background-color: #8ec2ee; + --hashtag-bg: #8ec2ee; + background-color: var(--hashtag-bg); } .hashtag-label-capri-blue { - background-color: #88ddf7; + --hashtag-bg: #88ddf7; + background-color: var(--hashtag-bg); } .hashtag-label-aquamute { - background-color: #60d2b8; + --hashtag-bg: #60d2b8; + background-color: var(--hashtag-bg); } .hashtag-label-emerald-green { - background-color: #11adb1; + --hashtag-bg: #11adb1; + background-color: var(--hashtag-bg); } .hashtag-label-apricot { - background-color: #fe904b; + --hashtag-bg: #fe904b; + background-color: var(--hashtag-bg); } .hashtag-label-orange { - background-color: #faa849; + --hashtag-bg: #faa849; + background-color: var(--hashtag-bg); } .hashtag-label-yellow { - background-color: #fecd0f; + --hashtag-bg: #fecd0f; + background-color: var(--hashtag-bg); } .hashtag-label-cherry-blossom { - background-color: #f96ab0; + --hashtag-bg: #f96ab0; + background-color: var(--hashtag-bg); } .hashtag-label-peony { - background-color: #fb9bc4; + --hashtag-bg: #fb9bc4; + background-color: var(--hashtag-bg); } .hashtag-label-tomato { - background-color: #f85347; + --hashtag-bg: #f85347; + background-color: var(--hashtag-bg); } .hashtag-label-melon { - background-color: #fa8287; + --hashtag-bg: #fa8287; + background-color: var(--hashtag-bg); } .hashtag-label-orchid { - background-color: #df6cca; + --hashtag-bg: #df6cca; + background-color: var(--hashtag-bg); } .hashtag-label-pink { - background-color: #f39de4; + --hashtag-bg: #f39de4; + background-color: var(--hashtag-bg); } .hashtag-label-lilac { - background-color: #9f8cd5; + --hashtag-bg: #9f8cd5; + background-color: var(--hashtag-bg); } .hashtag-label-purple { - background-color: #837fd5; + --hashtag-bg: #837fd5; + background-color: var(--hashtag-bg); } .hashtag-label-dark-grey { - background-color: #4c4c4c; + --hashtag-bg: #4c4c4c; + background-color: var(--hashtag-bg); } .hashtag-label-light-grey { - background-color: #8c8c8c; + --hashtag-bg: #8c8c8c; + background-color: var(--hashtag-bg); } .hashtag-label-military { - background-color: #938953; + --hashtag-bg: #938953; + background-color: var(--hashtag-bg); } .hashtag-label-light-brown { - background-color: #c4bd97; + --hashtag-bg: #c4bd97; + background-color: var(--hashtag-bg); } .hashtag-label-moss-green { - background-color: #93ad59; + --hashtag-bg: #93ad59; + background-color: var(--hashtag-bg); } .hashtag-label-grey-blue { - background-color: #83adb5; + --hashtag-bg: #83adb5; + background-color: var(--hashtag-bg); } .hashtag-label-green-sage { - background-color: #9fc4ac; + --hashtag-bg: #9fc4ac; + background-color: var(--hashtag-bg); } .hashtag-label-sage { - background-color: #89bfbd; + --hashtag-bg: #89bfbd; + background-color: var(--hashtag-bg); } .hashtag-label-blush { - background-color: #ee836f; + --hashtag-bg: #ee836f; + background-color: var(--hashtag-bg); } .hashtag-label-mustard { - background-color: #cb9228; + --hashtag-bg: #cb9228; + background-color: var(--hashtag-bg); } .hashtag-label-mulbery { - background-color: #d55d75; + --hashtag-bg: #d55d75; + background-color: var(--hashtag-bg); } .hashtag-label-dusty-mauve { - background-color: #655251; + --hashtag-bg: #655251; + background-color: var(--hashtag-bg); } .hashtag-label-dark-orange { - background-color: #e76239; + --hashtag-bg: #e76239; + background-color: var(--hashtag-bg); } .hashtag-label-burnt-yellow { - background-color: #dab71f; + --hashtag-bg: #dab71f; + background-color: var(--hashtag-bg); } .hashtag-label-antique-pink { - background-color: #e5b9b7; + --hashtag-bg: #e5b9b7; + background-color: var(--hashtag-bg); } .hashtag-label-lips { - background-color: #c97586; + --hashtag-bg: #c97586; + background-color: var(--hashtag-bg); } .hashtag-label-terracotta { - background-color: #a7605f; + --hashtag-bg: #a7605f; + background-color: var(--hashtag-bg); } .hashtag-label-cloudy-blue { - background-color: #6381b4; + --hashtag-bg: #6381b4; + background-color: var(--hashtag-bg); } .hashtag-label-purple-grey { - background-color: #8593ab; + --hashtag-bg: #8593ab; + background-color: var(--hashtag-bg); } .hashtag-label-light-lilac { - background-color: #ccc1d9; + --hashtag-bg: #ccc1d9; + background-color: var(--hashtag-bg); } .hashtag-label-grape { - background-color: #5e3c58; + --hashtag-bg: #5e3c58; + background-color: var(--hashtag-bg); } .hashtag-label-purple-blue { - background-color: #4853a1; + --hashtag-bg: #4853a1; + background-color: var(--hashtag-bg); } .hashtag-label-sky { - background-color: #9cc7df; + --hashtag-bg: #9cc7df; + background-color: var(--hashtag-bg); } .hashtag-label-beige { - background-color: #dcc39c; + --hashtag-bg: #dcc39c; + background-color: var(--hashtag-bg); } .hashtag-box-white { @@ -8145,6 +8188,9 @@ body.dark-mode .feed-section-title i { margin-left: 4px; margin-top: 2px; display: inline-block; + /* Match the topic list's pills; the badge's 0.75em would otherwise + scale down from the 12px meta column. */ + font-size: 12px; } /* /feed empty state shown when the user has no groups with recent @@ -8343,6 +8389,7 @@ body.dark-mode input[type="file"], body.dark-mode textarea, body.dark-mode input[type="password"] { background-color: var(--dark-mode-input-color); + color: var(--dark-mode-text-color); } body.dark-mode .Xmce-widget, @@ -9666,6 +9713,14 @@ body.dark-mode .empty-state-title { * is retuned instead. */ +/* BS5's reboot turns on smooth scrolling for the whole document; BS3 had + * none. With it on, the browser's scroll restoration on Back animates up the + * page being left while htmx fetches the history entry, so returning from an + * expanded topic crawls up the messages before the topic list appears. */ +:root { + scroll-behavior: auto; +} + /* BS3 navbars carry no vertical padding and declare min-height: 50px; * BS5's .5rem paddings make the bar 66px, sliding content (body * padding-top: 60px) underneath it. Zeroing the padding is what restores @@ -10495,6 +10550,33 @@ fieldset:disabled .btn:hover { line-height: 1; } +/* Hashtag pills keep their colours on hover, focus and while their menu is + * open. BS3's .btn:hover changed only the text colour; BS5's state rules + * repaint the background from --bs-btn-hover-bg (transparent on a bare .btn) + * and the text from the body colour, so the pill vanished into the page. The + * anchor pills (a.badge) likewise took BS5's link-hover colour where BS3's + * a.label:hover kept white text. */ +.btn.hashtag-btn:is(:hover, :focus-visible, :active, .show), +a.badge[class*="hashtag-label-"]:hover, +a.badge[class*="hashtag-label-"]:focus { + background-color: var(--hashtag-bg); + border-color: transparent; + color: #fff; +} + +.btn.hashtag-btn.hashtag-label-white:is(:hover, :focus-visible, :active, .show), +a.badge.hashtag-label-white:hover, +a.badge.hashtag-label-white:focus { + border-color: #ccc; + color: #333; +} + +body.dark-mode .btn.hashtag-btn:is(:hover, :focus-visible, :active, .show), +body.dark-mode a.badge[class*="hashtag-label-"]:hover, +body.dark-mode a.badge[class*="hashtag-label-"]:focus { + color: var(--dark-mode-reverse-text-color); +} + /* The app's btn-default is light grey (#ccc, dark text; groupsio.css:808); * converted pages emit btn-secondary, which BS5 paints dark slate. Repaint * it to the app palette via the button variables, light and dark mode. */ diff --git a/groups.io/g/MTFHRT/wiki/29602.html b/groups.io/g/MTFHRT/wiki/29602.html index 7af8f32dc..70ae8b66e 100644 --- a/groups.io/g/MTFHRT/wiki/29602.html +++ b/groups.io/g/MTFHRT/wiki/29602.html @@ -152,7 +152,7 @@ gioReport({ msg: "bundle-load-failure", url: src, - client_id: "web.app01-g2.1039741.1790128634955905443" + client_id: "web.app01-g2.1848399.1790735630893435672" }); }; if (window.__gioBundleErr) { @@ -173,7 +173,7 @@ console.log("stack:", errorObj.stack); stack = errorObj.stack; } - console.log("client_id:", "web.app01-g2.1039741.1790128634955905443"); + console.log("client_id:", "web.app01-g2.1848399.1790735630893435672"); console.log("last_error:", lastError); console.log("stack:", stack); } @@ -228,7 +228,7 @@ column: column, stack: stack, last_error: lastError, - client_id: "web.app01-g2.1039741.1790128634955905443" + client_id: "web.app01-g2.1848399.1790735630893435672" }); lastError = errorMessage; return true; @@ -239,7 +239,7 @@ - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -312,6 +312,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -328,7 +341,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -312,6 +312,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -328,7 +341,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -312,6 +312,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -328,7 +341,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -312,6 +312,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -328,7 +341,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -312,6 +312,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -328,7 +341,7 @@ }, true); - + - + MTFHRT@groups.io | Wiki @@ -313,6 +313,19 @@ if (bar) bar.classList.remove('active'); }); + // Bootstrap appends an open tooltip to , outside the content HTMX + // replaces, so clicking a boosted link while its tooltip shows would leave + // the tooltip stranded on the new page. Dispose of the open tooltips + // whose triggers are about to be swapped out. + document.addEventListener('htmx:beforeSwap', function(evt) { + var target = evt.detail && evt.detail.target; + if (!target || typeof bootstrap === 'undefined') return; + target.querySelectorAll('[aria-describedby^="tooltip"]').forEach(function(el) { + var tip = bootstrap.Tooltip.getInstance(el); + if (tip) tip.dispose(); + }); + }); + // Haptic feedback on mobile-native chrome taps: bottom-nav tabs, back // chevron, and the navbar overflow action slot. Uses the shared helpers // from qtutils/appfunctions.qtpl — they no-op on non-Capacitor runtimes, @@ -329,7 +342,7 @@ }, true); - +