mirror of
https://github.com/facebook/docusaurus.git
synced 2025-07-18 09:07:57 +02:00
fix(theme): fix collapsible sidebar behavior when prefers-reduced-motion (#8971)
This commit is contained in:
parent
3170515c89
commit
905fe7f4b4
4 changed files with 20 additions and 6 deletions
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
import React, {type ReactNode, useState, useCallback} from 'react';
|
import React, {type ReactNode, useState, useCallback} from 'react';
|
||||||
import clsx from 'clsx';
|
import clsx from 'clsx';
|
||||||
import {ThemeClassNames} from '@docusaurus/theme-common';
|
import {prefersReducedMotion, ThemeClassNames} from '@docusaurus/theme-common';
|
||||||
import {useDocsSidebar} from '@docusaurus/theme-common/internal';
|
import {useDocsSidebar} from '@docusaurus/theme-common/internal';
|
||||||
import {useLocation} from '@docusaurus/router';
|
import {useLocation} from '@docusaurus/router';
|
||||||
import DocSidebar from '@theme/DocSidebar';
|
import DocSidebar from '@theme/DocSidebar';
|
||||||
|
@ -40,6 +40,11 @@ export default function DocRootLayoutSidebar({
|
||||||
if (hiddenSidebar) {
|
if (hiddenSidebar) {
|
||||||
setHiddenSidebar(false);
|
setHiddenSidebar(false);
|
||||||
}
|
}
|
||||||
|
// onTransitionEnd won't fire when sidebar animation is disabled
|
||||||
|
// fixes https://github.com/facebook/docusaurus/issues/8918
|
||||||
|
if (!hiddenSidebar && prefersReducedMotion()) {
|
||||||
|
setHiddenSidebar(true);
|
||||||
|
}
|
||||||
setHiddenSidebarContainer((value) => !value);
|
setHiddenSidebarContainer((value) => !value);
|
||||||
}, [setHiddenSidebarContainer, hiddenSidebar]);
|
}, [setHiddenSidebarContainer, hiddenSidebar]);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ import React, {
|
||||||
type ReactNode,
|
type ReactNode,
|
||||||
} from 'react';
|
} from 'react';
|
||||||
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
|
import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment';
|
||||||
|
import {prefersReducedMotion} from '../../utils/accessibilityUtils';
|
||||||
|
|
||||||
const DefaultAnimationEasing = 'ease-in-out';
|
const DefaultAnimationEasing = 'ease-in-out';
|
||||||
|
|
||||||
|
@ -65,10 +66,6 @@ function applyCollapsedStyle(el: HTMLElement, collapsed: boolean) {
|
||||||
el.style.height = collapsedStyles.height;
|
el.style.height = collapsedStyles.height;
|
||||||
}
|
}
|
||||||
|
|
||||||
function userPrefersReducedMotion(): boolean {
|
|
||||||
return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Lex111: Dynamic transition duration is used in Material design, this technique
|
Lex111: Dynamic transition duration is used in Material design, this technique
|
||||||
is good for a large number of items.
|
is good for a large number of items.
|
||||||
|
@ -76,7 +73,7 @@ https://material.io/archive/guidelines/motion/duration-easing.html#duration-easi
|
||||||
https://github.com/mui-org/material-ui/blob/e724d98eba018e55e1a684236a2037e24bcf050c/packages/material-ui/src/styles/createTransitions.js#L40-L43
|
https://github.com/mui-org/material-ui/blob/e724d98eba018e55e1a684236a2037e24bcf050c/packages/material-ui/src/styles/createTransitions.js#L40-L43
|
||||||
*/
|
*/
|
||||||
function getAutoHeightDuration(height: number) {
|
function getAutoHeightDuration(height: number) {
|
||||||
if (userPrefersReducedMotion()) {
|
if (prefersReducedMotion()) {
|
||||||
// Not using 0 because it prevents onTransitionEnd to fire and bubble up :/
|
// Not using 0 because it prevents onTransitionEnd to fire and bubble up :/
|
||||||
// See https://github.com/facebook/docusaurus/pull/8906
|
// See https://github.com/facebook/docusaurus/pull/8906
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -45,6 +45,8 @@ export {useCollapsible, Collapsible} from './components/Collapsible';
|
||||||
|
|
||||||
export {ThemeClassNames} from './utils/ThemeClassNames';
|
export {ThemeClassNames} from './utils/ThemeClassNames';
|
||||||
|
|
||||||
|
export {prefersReducedMotion} from './utils/accessibilityUtils';
|
||||||
|
|
||||||
export {
|
export {
|
||||||
useIsomorphicLayoutEffect,
|
useIsomorphicLayoutEffect,
|
||||||
useEvent,
|
useEvent,
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function prefersReducedMotion(): boolean {
|
||||||
|
return window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue