~cytrogen/masto-fe

bc69d48652e431b06a1fff2c3fd0a67b54d23f81 — Cytrogen 14 days ago 9cde97c
Cherry-pick PR #104: Reduced motion accessibility

Adds prefers-reduced-motion support via JS body class detection and
CSS animation gating. Will be rewritten to pure CSS approach.

From: Moiety (https://codeberg.org/superseriousbusiness/masto-fe-standalone/pulls/104)
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='{&quot;locale&quot;:&quot;en&quot;}' id='mastodon'>
</div>
</body>