Skip to content

Commit 422341e

Browse files
committed
chore: upgrade Aside SidebarMenu
1 parent b1d17b0 commit 422341e

File tree

19 files changed

+291
-361
lines changed

19 files changed

+291
-361
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
display: inline-flex;
1717
align-items: center;
1818
gap: 4px;
19+
@media (max-width: 1280px) {
20+
display: none;
21+
}
1922
}
2023

2124
&__divider {

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

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ import { useLocaleSiteData, useLocation, useSite } from '@rspress/runtime';
22
import { useEffect } from 'react';
33

44
import './index.scss';
5+
import { Toc } from '@theme';
56
import { scrollToTarget } from '../../logic/sideEffects';
7+
import { useDynamicToc } from '../Toc/useDynamicToc';
68
import { ProgressCircle } from './ProgressCircle';
79
import { ScrollToTop } from './ScrollToTop';
8-
import { TocItem } from './TocItem';
9-
import { useActiveAnchor } from './useActiveAnchor';
10-
import { useDynamicToc } from './useDynamicToc';
1110
import { useReadPercent } from './useReadPercent';
1211

1312
export function Aside() {
@@ -21,13 +20,8 @@ export function Aside() {
2120
const headers = useDynamicToc();
2221
const [readPercent] = useReadPercent();
2322

24-
// For outline text highlight
25-
const baseHeaderLevel = 2;
26-
2723
const { pathname } = useLocation();
2824

29-
const activeAnchorId = useActiveAnchor(headers, readPercent === 100);
30-
3125
useEffect(() => {
3226
const decodedHash = decodeURIComponent(window.location.hash);
3327
console.log('decodedHash', decodedHash);
@@ -53,14 +47,7 @@ export function Aside() {
5347
<ProgressCircle percent={readPercent} size={14} strokeWidth={2} />
5448
</div>
5549
<nav className="rp-aside__toc">
56-
{headers.map((header, index) => (
57-
<TocItem
58-
key={`${header.depth}_${header.text}_${header.id}_${index}`}
59-
baseHeaderLevel={baseHeaderLevel}
60-
header={header}
61-
active={activeAnchorId === header.id}
62-
/>
63-
))}
50+
<Toc />
6451
</nav>
6552
<div className="rp-aside__divider" />
6653
<div className="rp-aside__bottom">

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type React from 'react';
44
import type { ComponentProps } from 'react';
55
import { getHref, useNavigate } from './useNavigate';
66
import './index.scss';
7+
import clsx from 'clsx';
78

89
export interface LinkProps extends ComponentProps<'a'> {
910
href?: string;
@@ -37,7 +38,7 @@ export function Link(props: LinkProps) {
3738
href={href}
3839
target="_blank"
3940
rel="noopener noreferrer"
40-
className={`rp-link ${className}`}
41+
className={clsx(className, 'rp-link')}
4142
>
4243
{children}
4344
</a>
@@ -46,7 +47,7 @@ export function Link(props: LinkProps) {
4647

4748
if (linkType === 'hashOnly') {
4849
return (
49-
<a {...props} href={href} className={`rp-link ${className}`}>
50+
<a {...props} href={href} className={clsx(className, 'rp-link')}>
5051
{children}
5152
</a>
5253
);
@@ -57,7 +58,7 @@ export function Link(props: LinkProps) {
5758
<a
5859
{...props}
5960
href={href}
60-
className={`rp-link ${className}`}
61+
className={`${className} rp-link`}
6162
onMouseEnter={event => {
6263
onMouseEnter?.(event);
6364
preloadLink(removeBaseHref);
@@ -90,7 +91,7 @@ export function Link(props: LinkProps) {
9091
<a
9192
{...props}
9293
href={withBaseHref}
93-
className={`rp-link ${className}`}
94+
className={clsx(className, 'rp-link')}
9495
onMouseEnter={event => {
9596
onMouseEnter?.(event);
9697
preloadLink(removeBaseHref);

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

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import { useSidebarDynamic } from '@rspress/runtime';
2-
import {
3-
type SidebarDivider as ISidebarDivider,
4-
type SidebarItem as ISidebarItem,
5-
type SidebarSectionHeader as ISidebarSectionHeader,
6-
inBrowser,
7-
type NormalizedSidebarGroup,
8-
type SidebarData,
2+
import type {
3+
SidebarDivider as ISidebarDivider,
4+
SidebarItem as ISidebarItem,
5+
SidebarSectionHeader as ISidebarSectionHeader,
6+
NormalizedSidebarGroup,
7+
SidebarData,
98
} from '@rspress/shared';
10-
import { useEffect } from 'react';
119
import { SidebarDivider } from './SidebarDivider';
1210
import { SidebarGroup } from './SidebarGroup';
1311
import { SidebarItem } from './SidebarItem';
@@ -18,33 +16,9 @@ import {
1816
isSidebarSectionHeader,
1917
} from './utils';
2018

21-
interface Props {
22-
isSidebarOpen?: boolean;
23-
}
24-
25-
export let bodyStyleOverflow: string;
26-
27-
export function Sidebar(props: Props) {
28-
const { isSidebarOpen } = props;
29-
19+
export function Sidebar() {
3020
const [sidebarData, setSidebarData] = useSidebarDynamic();
3121

32-
useEffect(() => {
33-
if (inBrowser()) {
34-
if (isSidebarOpen) {
35-
bodyStyleOverflow = document.body.style.overflow;
36-
document.body.style.overflow = 'hidden';
37-
} else {
38-
document.body.style.overflow = bodyStyleOverflow || '';
39-
}
40-
}
41-
return () => {
42-
if (inBrowser()) {
43-
document.body.style.overflow = bodyStyleOverflow || '';
44-
}
45-
};
46-
}, [isSidebarOpen]);
47-
4822
return (
4923
<SidebarList sidebarData={sidebarData} setSidebarData={setSidebarData} />
5024
);
Lines changed: 29 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,41 @@
1-
// Only appear on <1280px screen width
2-
.rspress-sidebar-menu {
1+
.rp-sidebar-menu {
2+
width: 100%;
3+
height: 100%;
34
display: flex;
5+
6+
padding: 0px 20px;
7+
48
justify-content: space-between;
59
align-items: center;
6-
border-bottom: 1px solid var(--rp-c-divider-light);
7-
// border-top: 1px solid var(--rp-c-divider-light);
8-
width: 100%;
9-
color: var(--rp-c-text-1);
1010
background-color: var(--rp-c-bg);
11-
padding-left: 10px;
12-
> button {
13-
background-color: transparent;
14-
padding: 12px;
15-
transition: color 0.5s;
16-
&:hover {
17-
color: var(--rp-c-text-3);
18-
}
19-
}
20-
21-
&:empty {
22-
display: none;
23-
}
24-
}
25-
26-
.rspress-sidebar-back-drop {
27-
position: fixed;
28-
top: 0;
29-
right: 0;
30-
bottom: 0;
31-
left: 0;
32-
z-index: var(--rp-z-index-backdrop);
33-
}
34-
35-
@media (min-width: 1280px) {
36-
.rspress-sidebar-menu {
37-
display: none;
38-
}
39-
}
11+
border-bottom: 1px solid var(--rp-c-divider-light);
4012

41-
@media (min-width: 960px) and (max-width: 1280px) {
42-
.rspress-sidebar-menu > button:first-child {
43-
display: none;
13+
// text
14+
font-size: 14px;
15+
font-style: normal;
16+
font-weight: 600;
17+
18+
&__left,
19+
&__right {
20+
display: flex;
21+
gap: 8px;
22+
align-items: center;
23+
height: 100%;
24+
background: transparent;
4425
}
4526

46-
.rspress-sidebar-menu-container.no-toc {
27+
@media (min-width: 1280px) {
4728
display: none;
4829
}
4930

50-
html:root:has(.rspress-sidebar-menu-container.no-toc) {
51-
--rp-sidebar-menu-height: 0px;
52-
}
53-
}
54-
55-
.rspress-local-toc-container {
56-
position: absolute;
57-
padding: 6px;
58-
margin-left: var(--rp-sidebar-width);
59-
border-radius: var(--rp-radius-small);
60-
top: calc(var(--rp-nav-height) - 14px);
61-
background-color: var(--rp-c-bg-soft);
62-
left: 20px;
63-
right: 20px;
64-
max-height: calc(100vh - var(--rp-nav-height) - 20px);
65-
overflow: scroll;
66-
box-shadow: var(--rp-shadow-1);
67-
border: 1px solid var(--rp-c-divider-light);
68-
opacity: 0;
69-
transform: translateY(-20px);
70-
visibility: hidden;
71-
transition: all 0.3s ease-out;
72-
73-
&-show {
74-
opacity: 1;
75-
transform: translateY(0);
76-
visibility: visible;
31+
&__mask {
32+
position: fixed;
33+
top: 0;
34+
right: 0;
35+
bottom: 0;
36+
left: 0;
37+
z-index: var(--rp-z-index-mask);
38+
backdrop-filter: blur(3px);
39+
background-color: color-mix(in srgb, var(--rp-c-bg) 60%, transparent);
7740
}
7841
}
79-
80-
.fly-in-enter {
81-
opacity: 0;
82-
transform: translateY(-16px);
83-
}
84-
85-
.fly-in-enter-active {
86-
opacity: 1;
87-
transform: translate3d(0, 0, 0);
88-
transition:
89-
opacity 300ms,
90-
transform 300ms;
91-
}
92-
93-
.fly-in-exit,
94-
.fly-in-exit-active {
95-
opacity: 0;
96-
transition: none;
97-
}

0 commit comments

Comments
 (0)