-
v0.3.17 Stable
released this
2026-06-11 17:19:09 -07:00 | 13 commits to main since this releasegotifyBoard v0.3.17
What's fixed
Dark-theme toast countdown bar (take three)
v0.3.16 swapped the bar's animated property from
transform: scaleXto
width, on the theory that a WebView compositing layer was hiding the
transformed bar undercolor-scheme: dark. That theory was wrong — the
bar was still invisible during the timer and only appeared (frozen) on
hover.Real root cause: the rAF arming pattern
(progressArmed: false → requestAnimationFrame → true) relied on the
browser painting two distinct React frames — first the "snap to full
width, no transition" frame, then the "width 0%, transition Nms linear"
frame — to seed the transition. React 19's concurrent renderer can
collapse those two state updates into a single render, skipping the
seed frame, so the transition starts and ends atwidth: 0%(an
invisible no-op). Light theme happened to win the race occasionally;
dark theme didn't.Fix: throw out the React-controlled transition entirely and use a
straight CSS@keyframes toast-countdownanimation (the same pattern
the always-working undo-delete bar uses). Scrubbing the bar to its
current position is handled with a negativeanimation-delayequal to
the elapsed time; pause-on-hover is just
animation-play-state: paused. No React state, no rAF, no transition
seeding — the browser owns the timeline.Files changed
src/components/notifications/ToastCard.tsx— replaced the
progressArmed/useState/useEffect/rAF block + the
width-transition JSX with a CSS-animation div; removed the now-unused
useEffect/useStateimports.src/styles/globals.css— added@keyframes toast-countdown(100% →
0%). The existingprefers-reduced-motion: reduceoverride at
.toast-countdown-barstill suppresses it.
Verification
npm run typecheck,npm run lint,npm test— all green (24 files,
221 tests).- The CSS keyframe approach is the same one used by
.undo-countdown-bar(globals.css), which has been working in dark
theme since it shipped, so the fix has high prior confidence.
Rollback
If this needs to be reverted,
git revertthe Phase 61 commit and
re-deploy v0.3.16 (still on Gitea releases at tagv0.3.16). The
updater manifest's Linux entries can be repointed by re-running
scripts/patch-latest-json.mjswith the v0.3.16 URLs + signatures.Downloads