hover fix

This commit is contained in:
Mateusz Gruszczyński
2026-05-03 23:57:56 +02:00
parent 23452ed2ad
commit 366a2262d9

View File

@@ -24,6 +24,8 @@
const hasActiveProfile = !!window.PYTORRENT?.activeProfile; const hasActiveProfile = !!window.PYTORRENT?.activeProfile;
let firstRunSetupShown = false; let firstRunSetupShown = false;
const activeOperations = new Map(); const activeOperations = new Map();
// Note: Keeps live filter tooltips stable while the pointer is over a filter button.
const filterTooltipState = new WeakMap();
function toast(msg, type="secondary") { const h=$('toastHost'); if(!h) return; const el=document.createElement('div'); el.className=`toast-item text-bg-${type}`; el.innerHTML=esc(msg); h.appendChild(el); setTimeout(()=>el.remove(),3500); } function toast(msg, type="secondary") { const h=$('toastHost'); if(!h) return; const el=document.createElement('div'); el.className=`toast-item text-bg-${type}`; el.innerHTML=esc(msg); h.appendChild(el); setTimeout(()=>el.remove(),3500); }
function setBusy(on){ pendingBusy += on ? 1 : -1; if(pendingBusy<0) pendingBusy=0; $('globalLoader')?.classList.toggle('d-none', pendingBusy===0); $('busyBadge')?.classList.toggle('d-none', pendingBusy===0); } function setBusy(on){ pendingBusy += on ? 1 : -1; if(pendingBusy<0) pendingBusy=0; $('globalLoader')?.classList.toggle('d-none', pendingBusy===0); $('busyBadge')?.classList.toggle('d-none', pendingBusy===0); }
@@ -93,6 +95,41 @@
} }
return lines.join('\n'); return lines.join('\n');
} }
function applyFilterTooltip(button, tooltip, ariaLabel){
if(tooltip){
button.title = tooltip;
button.setAttribute('aria-label', ariaLabel);
} else {
button.removeAttribute('title');
button.removeAttribute('aria-label');
}
}
function ensureStableFilterTooltip(button){
if(filterTooltipState.has(button)) return filterTooltipState.get(button);
const state = {hovering:false, pending:null};
filterTooltipState.set(button, state);
button.addEventListener('mouseenter', () => {
state.hovering = true;
state.pending = null;
});
button.addEventListener('mouseleave', () => {
state.hovering = false;
if(state.pending){
applyFilterTooltip(button, state.pending.tooltip, state.pending.ariaLabel);
state.pending = null;
}
});
return state;
}
// Note: Freezes tooltip content during hover; the next hover receives the newest live summary.
function setStableFilterTooltip(button, tooltip, ariaLabel){
const state = ensureStableFilterTooltip(button);
if(state.hovering){
state.pending = {tooltip, ariaLabel};
return;
}
applyFilterTooltip(button, tooltip, ariaLabel);
}
function setFilterSummary(type){ function setFilterSummary(type){
const el=$(FILTER_COUNT_IDS[type]); const el=$(FILTER_COUNT_IDS[type]);
if(!el) return; if(!el) return;
@@ -102,13 +139,8 @@
el.innerHTML=`<span class="filter-count">${esc(bucket.count||0)}</span>${meta?`<span class="filter-meta">${esc(meta)}</span>`:''}`; el.innerHTML=`<span class="filter-count">${esc(bucket.count||0)}</span>${meta?`<span class="filter-meta">${esc(meta)}</span>`:''}`;
const button=el.closest('.filter'); const button=el.closest('.filter');
if(button){ if(button){
if(tooltip){ const ariaLabel = tooltip ? `${button.dataset.filter || type}: ${tooltip.replace(/\n/g, ', ')}` : '';
button.title=tooltip; setStableFilterTooltip(button, tooltip, ariaLabel);
button.setAttribute('aria-label', `${button.dataset.filter || type}: ${tooltip.replace(/\n/g, ', ')}`);
} else {
button.removeAttribute('title');
button.removeAttribute('aria-label');
}
} }
} }
function labelNames(value){ return String(value||'').split(/[,;|]+/).map(x=>x.trim()).filter(Boolean).filter((x,i,a)=>a.indexOf(x)===i); } function labelNames(value){ return String(value||'').split(/[,;|]+/).map(x=>x.trim()).filter(Boolean).filter((x,i,a)=>a.indexOf(x)===i); }