• v0.3.17 Stable

    eugene released this 2026-06-11 17:19:09 -07:00 | 13 commits to main since this release

    gotifyBoard v0.3.17

    What's fixed

    Dark-theme toast countdown bar (take three)

    v0.3.16 swapped the bar's animated property from transform: scaleX to
    width, on the theory that a WebView compositing layer was hiding the
    transformed bar under color-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 at width: 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-countdown animation (the same pattern
    the always-working undo-delete bar uses). Scrubbing the bar to its
    current position is handled with a negative animation-delay equal 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/useState imports.
    • src/styles/globals.css — added @keyframes toast-countdown (100% →
      0%). The existing prefers-reduced-motion: reduce override at
      .toast-countdown-bar still 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 revert the Phase 61 commit and
    re-deploy v0.3.16 (still on Gitea releases at tag v0.3.16). The
    updater manifest's Linux entries can be repointed by re-running
    scripts/patch-latest-json.mjs with the v0.3.16 URLs + signatures.

    Downloads