diff --git a/assets/stylesheets/App.css b/assets/stylesheets/App.css index 771e2964..b2e6e70b 100644 --- a/assets/stylesheets/App.css +++ b/assets/stylesheets/App.css @@ -124,6 +124,7 @@ .dashboard-navigation-fade { opacity: 1; visibility: visible; + /* Incoming chrome waits for the outgoing fade, then fades in. */ transition: opacity 0.2s ease 0.2s, visibility 0s linear 0.2s; @@ -133,9 +134,14 @@ opacity: 0; visibility: hidden; pointer-events: none; + /* + Visibility must use a non-zero duration on hide. A 0s visibility + transition makes WebKit apply hidden immediately, so opacity never + animates and the chrome glitches out instead of fading. + */ transition: opacity 0.2s ease 0s, - visibility 0s linear 0.2s; + visibility 0.2s linear 0s; } .dashboard-navigation-window-title { @@ -162,7 +168,7 @@ pointer-events: none; opacity: 1; /* Wait for outgoing chrome to finish fading before this line appears. */ - transition: opacity 0s ease 0s; + transition: opacity 0.2s ease 0s; } .dashboard-navigation-center-border-hidden { diff --git a/src/components/Dashboard/common/DashboardNavigation.jsx b/src/components/Dashboard/common/DashboardNavigation.jsx index 7c3dcda9..35efee2f 100644 --- a/src/components/Dashboard/common/DashboardNavigation.jsx +++ b/src/components/Dashboard/common/DashboardNavigation.jsx @@ -86,19 +86,40 @@ const NAV_BADGE_STYLE = { padding: 0, fontWeight: 600 } const NAV_UPDATE_TAG_STYLE = { cursor: 'pointer', margin: '2px 0 0 0' } const NAV_OVERFLOW_BUTTON_STYLE = { marginBottom: '4px' } +const NAV_FADE_MS = 200 + const navigationFadeClass = (visible) => `dashboard-navigation-fade${visible ? '' : ' dashboard-navigation-fade-hidden'}` +const useDelayedInactive = (visible) => { + const [inactive, setInactive] = useState(!visible) + + useEffect(() => { + if (visible) { + setInactive(false) + return undefined + } + + const timeoutId = window.setTimeout(() => setInactive(true), NAV_FADE_MS) + return () => window.clearTimeout(timeoutId) + }, [visible]) + + return inactive +} + const NavigationFade = memo(function NavigationFade({ visible, children, - style + style, + className }) { + const inactive = useDelayedInactive(visible) + return (