Compare commits

..

5 Commits

Author SHA1 Message Date
Jürgen Mummert 7541c12f66 Add subtle hidden-based event filter animation 2026-04-05 14:01:30 +02:00
Jürgen Mummert e8fd218c74 Remove view transitions and restore hidden-only event filtering 2026-04-05 13:58:54 +02:00
Jürgen Mummert 5f652530ed Scope view transitions to event list and prevent page shift 2026-04-05 13:55:44 +02:00
Jürgen Mummert 11b927b91f Fix event filter transition jank and restore layout animation 2026-04-05 13:46:00 +02:00
Jürgen Mummert e1a426bde4 Handle skipped view transition promises in event filter 2026-04-05 13:40:57 +02:00
@@ -38,17 +38,18 @@
</div>
<style>
.event-filter-target-list {
view-transition-name: event-filter-list;
.event-filter-target-list > .event {
opacity: 1;
transform: translateY(0);
transition: opacity 180ms ease, transform 180ms ease;
transition-behavior: allow-discrete;
will-change: opacity, transform;
}
@media (prefers-reduced-motion: no-preference) {
::view-transition-group(event-filter-list),
::view-transition-old(event-filter-list),
::view-transition-new(event-filter-list) {
animation-duration: 240ms;
animation-timing-function: ease;
}
.event-filter-target-list > .event.is-filtered-out {
opacity: 0;
transform: translateY(6px);
pointer-events: none;
}
</style>
@@ -129,34 +130,11 @@
const stateStorageKey = 'event-filter-state';
const stateQueryKey = 'event_filter';
const animationMs = 220;
const animationMs = 180;
let hideTimers = new WeakMap();
const supportsViewTransitions = typeof document.startViewTransition === 'function';
let isViewTransitionMutation = false;
let currentFilter = { type: 'all', value: '' };
let suppressedChangeEvents = 0;
const runWithLayoutTransition = (mutation) => {
if (!supportsViewTransitions) {
mutation();
return;
}
try {
document.startViewTransition(() => {
isViewTransitionMutation = true;
try {
mutation();
} finally {
isViewTransitionMutation = false;
}
});
} catch (error) {
mutation();
}
};
const hasOptionValue = (selectElement, value) => {
if (!selectElement) {
return false;
@@ -291,16 +269,7 @@
const showEvent = (eventItem) => {
clearHideTimer(eventItem);
if (eventItem.hidden) {
if (supportsViewTransitions && !isViewTransitionMutation) {
runWithLayoutTransition(() => {
eventItem.hidden = false;
});
} else {
eventItem.hidden = false;
}
}
eventItem.hidden = false;
requestAnimationFrame(() => {
eventItem.classList.remove('is-filtered-out');
@@ -312,14 +281,7 @@
eventItem.classList.add('is-filtered-out');
const timer = window.setTimeout(() => {
if (supportsViewTransitions && !isViewTransitionMutation) {
runWithLayoutTransition(() => {
eventItem.hidden = true;
});
} else {
eventItem.hidden = true;
}
eventItem.hidden = true;
hideTimers.delete(eventItem);
}, animationMs);
@@ -411,14 +373,12 @@
currentFilter = filterState;
setActiveControl(filterState);
runWithLayoutTransition(() => {
events.forEach((eventItem) => {
if (matches(eventItem, filterState)) {
showEvent(eventItem);
} else {
hideEvent(eventItem);
}
});
events.forEach((eventItem) => {
if (matches(eventItem, filterState)) {
showEvent(eventItem);
} else {
hideEvent(eventItem);
}
});
updateStatus(filterState);