From bd6049b6c0927eb5faced097511780f282f8a194 Mon Sep 17 00:00:00 2001
From: Ariya Hidayat <ariya@metabase.com>
Date: Wed, 9 Feb 2022 21:55:46 -0800
Subject: [PATCH] Dashboard checkbox should honor reduced-motion (#20385)

---
 frontend/src/metabase/components/Swapper.jsx | 30 +++++++++++++++++---
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/frontend/src/metabase/components/Swapper.jsx b/frontend/src/metabase/components/Swapper.jsx
index 0b4cc5247a8..698e7493c04 100644
--- a/frontend/src/metabase/components/Swapper.jsx
+++ b/frontend/src/metabase/components/Swapper.jsx
@@ -2,6 +2,8 @@
 import React from "react";
 import { Motion, spring } from "react-motion";
 
+import { isReducedMotionPreferred } from "metabase/lib/dom";
+
 class Swapper extends React.Component {
   state = {
     hovered: false,
@@ -19,6 +21,11 @@ class Swapper extends React.Component {
     const { defaultElement, swappedElement, startSwapped } = this.props;
     const { hovered } = this.state;
 
+    const preferReducedMotion = isReducedMotionPreferred();
+    const springOpts = preferReducedMotion
+      ? { stiffness: 500 }
+      : { stiffness: 170 };
+
     return (
       <span
         onMouseEnter={() => this._onMouseEnter()}
@@ -31,12 +38,22 @@ class Swapper extends React.Component {
             scale: 1,
           }}
           style={{
-            scale: hovered || startSwapped ? spring(0) : spring(1),
+            scale:
+              hovered || startSwapped
+                ? spring(0, springOpts)
+                : spring(1, springOpts),
           }}
         >
           {({ scale }) => {
+            const snapScale = scale < 0.5 ? 0 : 1;
+            const _scale = preferReducedMotion ? snapScale : scale;
             return (
-              <span style={{ display: "block", transform: `scale(${scale})` }}>
+              <span
+                style={{
+                  display: "block",
+                  transform: `scale(${_scale})`,
+                }}
+              >
                 {defaultElement}
               </span>
             );
@@ -47,14 +64,19 @@ class Swapper extends React.Component {
             scale: 0,
           }}
           style={{
-            scale: hovered || startSwapped ? spring(1) : spring(0),
+            scale:
+              hovered || startSwapped
+                ? spring(1, springOpts)
+                : spring(0, springOpts),
           }}
         >
           {({ scale }) => {
+            const snapScale = scale < 0.5 ? 0 : 1;
+            const _scale = preferReducedMotion ? snapScale : scale;
             return (
               <span
                 className="absolute top left bottom right"
-                style={{ display: "block", transform: `scale(${scale})` }}
+                style={{ display: "block", transform: `scale(${_scale})` }}
               >
                 {swappedElement}
               </span>
-- 
GitLab