Skip to content

Commit 04a4848

Browse files
committed
chore: upgrade Aside SidebarMenu
1 parent 28c0502 commit 04a4848

File tree

7 files changed

+51
-60
lines changed

7 files changed

+51
-60
lines changed

packages/theme-default/src/components/Aside/index.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
border-left: 1px solid var(--rp-c-divider-light);
55
padding-left: 20px;
66

7+
max-width: calc(100vh - var(--rp-nav-height) - var(--rp-sidebar-menu-height));
8+
// padding-bottom: 100px;
9+
710
&__title {
811
font-size: 14px;
912
font-weight: 700;

packages/theme-default/src/components/Aside/index.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@ import { useLocaleSiteData, useLocation, useSite } from '@rspress/runtime';
22
import { Toc } from '@theme';
33
import { useEffect } from 'react';
44
import { scrollToTarget } from '../../logic/sideEffects';
5-
import { useDynamicToc } from '../Toc/useDynamicToc';
6-
import './index.scss';
75
import { ReadPercent } from '../ReadPercent';
6+
import './index.scss';
87
import { ScrollToTop } from './ScrollToTop';
98

109
export function Aside() {
@@ -15,8 +14,6 @@ export function Aside() {
1514
const outlineTitle =
1615
localesData?.outlineTitle || themeConfig?.outlineTitle || 'ON THIS PAGE';
1716

18-
const headers = useDynamicToc();
19-
2017
const { pathname } = useLocation();
2118

2219
useEffect(() => {
@@ -33,10 +30,6 @@ export function Aside() {
3330
}
3431
}, [pathname]);
3532

36-
if (headers.length === 0) {
37-
return <></>;
38-
}
39-
4033
return (
4134
<div className="rp-aside">
4235
<div className="rp-aside__title">

packages/theme-default/src/components/NewNav/index.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
flex-shrink: 0;
55
border-bottom: 1px solid var(--rp-c-divider-light);
66
background: var(--rp-c-bg);
7-
transition: background 0.4s;
87
color: var(--rp-c-text-1);
98

109
--rp-nav-padding-x: 20px;

packages/theme-default/src/components/SidebarMenu/index.tsx

Lines changed: 2 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import { useLocaleSiteData, useLocation, useSite } from '@rspress/runtime';
22
import MenuIcon from '@theme-assets/menu';
3-
import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock';
43
import { forwardRef, useEffect, useRef } from 'react';
54
import { useUISwitch } from '../../layout/Layout/useUISwitch';
5+
import { ReadPercent } from '../ReadPercent';
66
import { SvgWrapper } from '../SvgWrapper';
7-
import { useDynamicToc } from '../Toc/useDynamicToc';
87
import './index.scss';
9-
import { ReadPercent } from '../ReadPercent';
108

119
/* Top Menu, only displayed on <1280px screen width */
1210
export const SidebarMenu = forwardRef(
@@ -62,32 +60,6 @@ export const SidebarMenu = forwardRef(
6260
}
6361
}, [hash]);
6462

65-
useEffect(() => {
66-
sidebarMenuRef.current &&
67-
(isAsideOpen || isSidebarOpen) &&
68-
disableBodyScroll(sidebarMenuRef.current, {
69-
reserveScrollBarGap: true,
70-
});
71-
return () => {
72-
clearAllBodyScrollLocks();
73-
};
74-
}, [isSidebarOpen, isAsideOpen]);
75-
76-
useEffect(() => {
77-
sidebarMenuRef.current &&
78-
isAsideOpen &&
79-
disableBodyScroll(sidebarMenuRef.current, {
80-
reserveScrollBarGap: true,
81-
});
82-
return () => {
83-
clearAllBodyScrollLocks();
84-
};
85-
}, [isAsideOpen]);
86-
87-
const toc = useDynamicToc();
88-
89-
const hasToc = toc.length > 0;
90-
9163
return (
9264
<>
9365
<div
@@ -111,7 +83,7 @@ export const SidebarMenu = forwardRef(
11183
<span>Menu</span>
11284
</button>
11385
)}
114-
{uiSwitch?.showAside && hasToc && (
86+
{uiSwitch?.showAside && (
11587
<button
11688
type="button"
11789
onClickCapture={e => {

packages/theme-default/src/components/SidebarMenu/useClickOutside.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ function useClickOutside(
1919
handler(event);
2020
return;
2121
};
22-
document.addEventListener('click', listener);
22+
document.addEventListener('mousedown', listener);
23+
document.addEventListener('touchstart', listener);
2324
return () => {
24-
document.removeEventListener('click', listener);
25+
document.removeEventListener('mousedown', listener);
26+
document.removeEventListener('touchstart', listener);
2527
};
2628
}, [ref, handler]);
2729
}

packages/theme-default/src/components/SidebarMenu/useSidebarMenu.tsx

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { useRef, useState } from 'react';
1+
import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock';
2+
import { useEffect, useMemo, useRef, useState } from 'react';
23
import { SidebarMenu } from '.';
34
import { useClickOutside } from './useClickOutside';
45

@@ -10,22 +11,37 @@ function useSidebarMenu() {
1011
const sidebarLayoutRef = useRef<HTMLDivElement>(null);
1112
const asideLayoutRef = useRef<HTMLDivElement>(null);
1213

14+
// only sidebar, body scroll lock can not work in iOS safari in aside
15+
useEffect(() => {
16+
sidebarMenuRef.current &&
17+
isSidebarOpen &&
18+
disableBodyScroll(sidebarMenuRef.current, {
19+
reserveScrollBarGap: true,
20+
allowTouchMove: () => true,
21+
});
22+
return () => {
23+
clearAllBodyScrollLocks();
24+
};
25+
}, [isSidebarOpen]);
26+
1327
useClickOutside([sidebarMenuRef, sidebarLayoutRef], () => {
1428
setIsSidebarOpen(false);
1529
});
1630
useClickOutside([sidebarMenuRef, asideLayoutRef], () => {
1731
setIsAsideOpen(false);
1832
});
1933

20-
const sidebarMenu = (
21-
<SidebarMenu
22-
isSidebarOpen={isSidebarOpen}
23-
onIsSidebarOpenChange={setIsSidebarOpen}
24-
isAsideOpen={isAsideOpen}
25-
onIsAsideOpenChange={setIsAsideOpen}
26-
ref={sidebarMenuRef}
27-
/>
28-
);
34+
const sidebarMenu = useMemo(() => {
35+
return (
36+
<SidebarMenu
37+
isSidebarOpen={isSidebarOpen}
38+
onIsSidebarOpenChange={setIsSidebarOpen}
39+
isAsideOpen={isAsideOpen}
40+
onIsAsideOpenChange={setIsAsideOpen}
41+
ref={sidebarMenuRef}
42+
/>
43+
);
44+
}, [isAsideOpen, isSidebarOpen, setIsAsideOpen, setIsSidebarOpen]);
2945

3046
return {
3147
sidebarMenu,

packages/theme-default/src/layout/DocLayout/index.scss

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@
6666
padding: var(--rp-sidebar-padding);
6767
border-right: 1px solid var(--rp-c-divider-light);
6868

69-
overflow-x: auto;
70-
overflow-y: scroll;
69+
overflow: auto scroll;
7170

7271
// postion
7372
position: sticky;
@@ -95,8 +94,7 @@
9594

9695
padding-top: var(--rp-content-padding-y);
9796

98-
overflow-x: hidden;
99-
overflow-y: auto;
97+
overflow: hidden scroll;
10098
scrollbar-width: none;
10199
max-height: calc(100vh - var(--rp-nav-height));
102100
}
@@ -186,12 +184,20 @@
186184
}
187185
.rp-doc-layout {
188186
&__sidebar {
189-
height: 100vh;
190-
max-width: 100vh;
191-
187+
z-index: var(--rp-z-index-sidebar);
192188
position: fixed;
193-
top: unset;
194-
bottom: 0;
189+
top: var(--rp-nav-height);
190+
right: 0;
191+
192+
margin-top: var(--rp-sidebar-menu-height);
193+
height: calc(
194+
100vh - var(--rp-nav-height) - var(--rp-sidebar-menu-height)
195+
);
196+
197+
padding: var(--rp-sidebar-padding) var(--rp-sidebar-padding)
198+
calc(var(--rp-sidebar-padding) + 100px) var(--rp-sidebar-padding);
199+
200+
overflow: auto scroll;
195201

196202
background: var(--rp-c-bg);
197203
opacity: 0;

0 commit comments

Comments
 (0)