diff --git a/js/content.js b/js/content.js index e7d06c2..8c0c180 100644 --- a/js/content.js +++ b/js/content.js @@ -4354,7 +4354,7 @@ function populateAnnouncements() { } announcement.innerHTML = ` -
+
${removeIcons ? "" : ` @@ -4551,14 +4551,20 @@ function markAs(item, element, makeComplete) { // call in the background for persistence. item.planner_override = item.planner_override || {}; item.planner_override.marked_complete = completeState; - element.style.transform = "translate(100%)"; - element.style.opacity = "0"; - // fire confetti only when marking complete (not when unmarking) + // fire confetti only when marking complete (not when unmarking). + // Must happen BEFORE the slide-out transform below: the burst measures + // the element with getBoundingClientRect(), which reflects transforms — + // measuring after translate(100%) would place the origin one full card + // width to the right (off screen) whenever the transform applies + // instantly, i.e. on cards without a transition (announcements). if (completeState) { try { createConfettiBurst(element); } catch (e) { console.error('confetti trigger error', e); } } + element.style.transform = "translate(100%)"; + element.style.opacity = "0"; + // update progress rings immediately so they animate while the item slides/fades const progressPlaceholder = document.getElementById("better-todo-progress-placeholder"); if (progressPlaceholder && typeof assignments?.then === 'function' && progressRingsEnabled()) {