Animations, GIFs and the globe now move for every reader
Build / Build (push) Successful in 33s

decePub no longer looks at the system's "reduce motion" setting, so everything moves the same way whatever it says:
- a GIF video in a post plays by itself, muted and looping, instead of waiting for a tap; it now also starts on a page
  just opened, before the first tap, where the browser used to hold it still;
- animated custom emoji move in the emoji picker instead of showing a still picture;
- the globe turns by itself while no located post is in view, flies to the posts, and its pulses, arcs and Sun move;
- going back to the top of a feed scrolls smoothly;
- tooltips, dropdowns, menus, folding sections, toasts, loading spinners, placeholders, progress bars, radio buttons
  and ratings keep their animations: the build now takes daisyUI's reduce-motion rules out of the stylesheet
  (tools/css/motion.py, run after every Tailwind build, in watch mode too).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W4YtEKqxKjKyHkFzuRVMNA
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-11-09 20:48:47 +01:00
1 parent eb4ea2947c
commit 697b2c8897
11 files changed
+113 -55

No files matched your search

+4 -10
View File
@@ -108,6 +108,10 @@ document.addEventListener("click", event => {
window.logFromJs(e.message, "openThread")
}
})
document.addEventListener("loadstart", event => {
if (event.target instanceof HTMLVideoElement && event.target.hasAttribute("muted"))
event.target.muted = true
}, { capture: true })
// The Back button (a popstate) as opposed to the app's own navigation: Blazor's location-changing handlers can't tell
// them apart, and MainLayout lets Back close an open overlay but lets the app's navigation through. Registered for the
// capture phase, so it runs before Blazor's own listener.
@@ -136,16 +140,6 @@ window.revealActive = strip => {
window.logFromJs(e.message, "revealActive")
}
}
// the reader asked for less motion: what would move by itself (a gifv) waits for a tap
window.prefersReducedMotion = () => {
try {
return window.matchMedia("(prefers-reduced-motion: reduce)").matches
} catch (e) {
console.error(e)
window.logFromJs(e.message, "prefersReducedMotion")
return false
}
}
// text put on the clipboard (the recovery codes of two-factor sign-in); false when the browser refused it
window.copyText = async text => {
try {