Compare commits

..

1 Commits

Author SHA1 Message Date
Jürgen Mummert e1a426bde4 Handle skipped view transition promises in event filter 2026-04-05 13:40:57 +02:00
@@ -132,6 +132,7 @@
const animationMs = 220; const animationMs = 220;
let hideTimers = new WeakMap(); let hideTimers = new WeakMap();
const supportsViewTransitions = typeof document.startViewTransition === 'function'; const supportsViewTransitions = typeof document.startViewTransition === 'function';
let activeViewTransition = null;
let isViewTransitionMutation = false; let isViewTransitionMutation = false;
let currentFilter = { type: 'all', value: '' }; let currentFilter = { type: 'all', value: '' };
let suppressedChangeEvents = 0; let suppressedChangeEvents = 0;
@@ -142,8 +143,13 @@
return; return;
} }
if (activeViewTransition) {
mutation();
return;
}
try { try {
document.startViewTransition(() => { const transition = document.startViewTransition(() => {
isViewTransitionMutation = true; isViewTransitionMutation = true;
try { try {
@@ -152,6 +158,26 @@
isViewTransitionMutation = false; isViewTransitionMutation = false;
} }
}); });
activeViewTransition = transition;
transition.ready.catch(() => {
// Can reject when the transition is skipped.
});
transition.updateCallbackDone.catch(() => {
// Keep skipped/aborted update callbacks from surfacing as uncaught.
});
transition.finished
.catch(() => {
// Browsers can skip overlapping transitions; ignore these rejections.
})
.finally(() => {
if (activeViewTransition === transition) {
activeViewTransition = null;
}
});
} catch (error) { } catch (error) {
mutation(); mutation();
} }
@@ -293,13 +319,7 @@
clearHideTimer(eventItem); clearHideTimer(eventItem);
if (eventItem.hidden) { if (eventItem.hidden) {
if (supportsViewTransitions && !isViewTransitionMutation) { eventItem.hidden = false;
runWithLayoutTransition(() => {
eventItem.hidden = false;
});
} else {
eventItem.hidden = false;
}
} }
requestAnimationFrame(() => { requestAnimationFrame(() => {
@@ -312,13 +332,7 @@
eventItem.classList.add('is-filtered-out'); eventItem.classList.add('is-filtered-out');
const timer = window.setTimeout(() => { const timer = window.setTimeout(() => {
if (supportsViewTransitions && !isViewTransitionMutation) { eventItem.hidden = true;
runWithLayoutTransition(() => {
eventItem.hidden = true;
});
} else {
eventItem.hidden = true;
}
hideTimers.delete(eventItem); hideTimers.delete(eventItem);
}, animationMs); }, animationMs);