diff --git a/package.json b/package.json index fc8f058b..73b29f47 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,15 @@ "stylelint": { "extends": "stylelint-config-recommended-scss", "rules": { - "no-descending-specificity": null + "no-descending-specificity": null, + "media-feature-name-no-unknown": [ + true, + { + "ignoreMediaFeatureNames": [ + "prefers-reduced-motion" + ] + } + ] } }, "eslintConfig": { diff --git a/src/components/layers/Collapse.jsx b/src/components/layers/Collapse.jsx new file mode 100644 index 00000000..aeaa09b0 --- /dev/null +++ b/src/components/layers/Collapse.jsx @@ -0,0 +1,30 @@ +import React from 'react' +import PropTypes from 'prop-types' +import Collapse from 'react-collapse' +import accessibility from '../../libs/accessibility' + + +export default class CollapseAlt extends React.Component { + static propTypes = { + isActive: PropTypes.bool.isRequired, + children: PropTypes.element.isRequired + } + + render() { + if (accessibility.reducedMotionEnabled()) { + return ( +
+ {this.props.children} +
+ ) + } + else { + return ( + + {this.props.children} + + ) + } + } +} + diff --git a/src/components/layers/LayerEditorGroup.jsx b/src/components/layers/LayerEditorGroup.jsx index 46788769..e132dd59 100644 --- a/src/components/layers/LayerEditorGroup.jsx +++ b/src/components/layers/LayerEditorGroup.jsx @@ -1,7 +1,8 @@ import React from 'react' import PropTypes from 'prop-types' -import Collapse from 'react-collapse' import Collapser from './Collapser' +import Collapse from './Collapse' + export default class LayerEditorGroup extends React.Component { static propTypes = { @@ -22,7 +23,7 @@ export default class LayerEditorGroup extends React.Component { - +
{this.props.children}
diff --git a/src/libs/accessibility.js b/src/libs/accessibility.js new file mode 100644 index 00000000..095e9538 --- /dev/null +++ b/src/libs/accessibility.js @@ -0,0 +1,12 @@ +import lodash from 'lodash' + + +// Throttle for 3 seconds so when a user enables it they don't have to refresh the page. +const reducedMotionEnabled = lodash.throttle(() => { + return window.matchMedia("(prefers-reduced-motion: reduce)").matches +}, 3000); + + +export default { + reducedMotionEnabled +} diff --git a/src/styles/_input.scss b/src/styles/_input.scss index da3cccff..90e84ed3 100644 --- a/src/styles/_input.scss +++ b/src/styles/_input.scss @@ -125,6 +125,10 @@ border-width: 2px; border-color: $color-gray; transition: background-color 0.1s ease-out; + + @media screen and (prefers-reduced-motion: reduce) { + transition-duration: 0ms; + } } &-icon { diff --git a/src/styles/_layer.scss b/src/styles/_layer.scss index 08cbd457..e3855eab 100644 --- a/src/styles/_layer.scss +++ b/src/styles/_layer.scss @@ -43,6 +43,10 @@ -webkit-transition: opacity 600ms, visibility 600ms; transition: opacity 600ms, visibility 600ms; + @media screen and (prefers-reduced-motion: reduce) { + transition-duration: 0; + } + @include flex-row; }