M app/javascript/flavours/glitch/main.jsx => app/javascript/flavours/glitch/main.jsx +2 -0
@@ 5,6 5,7 @@ import Mastodon from "flavours/glitch/containers/mastodon";
import { me } from "flavours/glitch/initial_state";
import * as perf from "flavours/glitch/performance";
import ready from "flavours/glitch/ready";
+import { setReducedMotionBodyClass } from "flavours/glitch/utils/accessibility";
import { store } from "flavours/glitch/store";
/**
@@ 12,6 13,7 @@ import { store } from "flavours/glitch/store";
*/
function main() {
perf.start("main()");
+ setReducedMotionBodyClass();
return ready(async () => {
const mountNode = document.getElementById("mastodon");
A app/javascript/flavours/glitch/utils/accessibility.js => app/javascript/flavours/glitch/utils/accessibility.js +26 -0
@@ 0,0 1,26 @@
+import ready from "../ready";
+
+ready(() => {
+ setReducedMotionBodyClass();
+});
+
+export function setMediaQueryBodyClass(query, className) {
+ if (query.matches) {
+ document.body.classList.add(className.true);
+ document.body.classList.remove(className.false);
+ } else {
+ document.body.classList.add(className.false);
+ document.body.classList.remove(className.true);
+ }
+}
+
+export function setReducedMotionBodyClass() {
+ const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
+ const className = {
+ true: "reduce-motion",
+ false: "no-reduce-motion",
+ };
+
+ setMediaQueryBodyClass(prefersReducedMotion, className);
+ prefersReducedMotion.addEventListener("change", () => setReducedMotionBodyClass(prefersReducedMotion));
+}
M public/index.html => public/index.html +1 -1
@@ 26,7 26,7 @@
<script src="/packs/js/flavours/glitch/home.js"></script>
</head>
-<body class='app-body no-reduce-motion system-font'>
+<body class='app-body system-font'>
<div class='app-holder' data-props='{"locale":"en"}' id='mastodon'>
</div>
</body>