Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(theme-common): fix issue in tab scroll position restoration on tab click #8628

Merged
merged 2 commits into from Feb 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -222,7 +222,10 @@ export function useScrollPositionBlocker(): {
);

useLayoutEffect(() => {
nextLayoutEffectCallbackRef.current?.();
// Queuing permits to restore scroll position after all useLayoutEffect
// have run, and yet preserve the sync nature of the scroll restoration
// See https://github.com/facebook/docusaurus/issues/8625
queueMicrotask(() => nextLayoutEffectCallbackRef.current?.());
});

return {
Expand Down
6 changes: 4 additions & 2 deletions packages/docusaurus-theme-common/src/utils/tabsUtils.tsx
Expand Up @@ -8,11 +8,11 @@
import React, {
isValidElement,
useCallback,
useEffect,
useState,
useMemo,
type ReactNode,
type ReactElement,
useLayoutEffect,
} from 'react';
import {useHistory} from '@docusaurus/router';
import {useQueryStringValue} from '@docusaurus/theme-common/internal';
Expand Down Expand Up @@ -246,7 +246,9 @@ export function useTabs(props: TabsProps): {
}
return value;
})();
useEffect(() => {
// Sync in a layout/sync effect is important, for useScrollPositionBlocker
// See https://github.com/facebook/docusaurus/issues/8625
useLayoutEffect(() => {
if (valueToSync) {
setSelectedValue(valueToSync);
}
Expand Down
26 changes: 26 additions & 0 deletions website/_dogfooding/_pages tests/tabs-tests.mdx
Expand Up @@ -20,3 +20,29 @@ export const isMacOS = typeof window !== 'undefined' && navigator.platform.start
</Tabs>
</BrowserWindow>
```

## Tabs sync with different heights

```mdx-code-block
<Tabs groupId="operating-systems">
<TabItem value="win" label="Windows">
Use Ctrl + C to copy.
</TabItem>
<TabItem value="mac" label="macOS">
very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text very long text
</TabItem>
</Tabs>
```

```mdx-code-block
<Tabs groupId="operating-systems">
<TabItem value="win" label="Windows">
Use Ctrl + V to paste.
</TabItem>
<TabItem value="mac" label="macOS">
Use Command + V to paste.
</TabItem>
</Tabs>
```

When clicking tabs above, they should stay under cursor and we should adjust the scroll position.