Skip to content

Commit 6c711da

Browse files
committed
Use builtin Tabs/Tab component to replace CodeDemo tabs
1 parent c256a29 commit 6c711da

File tree

4 files changed

+41
-104
lines changed

4 files changed

+41
-104
lines changed

rspress.config.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,15 @@ export default defineConfig({
1010
light: '/aiscript-logo.svg',
1111
dark: '/aiscript-logo.svg',
1212
},
13+
route: {
14+
cleanUrls: true,
15+
},
1316
builderPlugins: [pluginYaml()],
1417
themeConfig: {
1518
footer: {
16-
message:
17-
'<p>AIScript Community &copy; 2025.</p>',
18-
},
19+
message: '<p>AIScript Community &copy; 2025.</p>',
20+
},
21+
lastUpdated: true,
1922
prevPageText: 'Prev Page',
2023
nextPageText: 'Next Page',
2124
socialLinks: [

theme/components/code-demo/index.module.scss

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
.codeDemo {
2-
margin: 2rem auto;
32
max-width: 100%;
4-
padding: 1rem;
53
border-radius: 8px;
64
overflow: hidden;
75

@@ -12,42 +10,6 @@
1210
}
1311
}
1412

15-
.filenameBar {
16-
display: flex;
17-
gap: 2px;
18-
padding: 0 0.5rem;
19-
background-color: #ecf0f7;
20-
border-top-left-radius: 8px;
21-
border-top-right-radius: 8px;
22-
}
23-
24-
.filenameTab {
25-
padding: 0.75rem 1.25rem;
26-
font-family: system-ui, -apple-system, sans-serif;
27-
font-size: 0.9rem;
28-
color: #666;
29-
background: transparent;
30-
border: none;
31-
cursor: pointer;
32-
transition: all 0.2s ease;
33-
34-
&:hover {
35-
color: #333;
36-
background-color: rgba(0, 0, 0, 0.05);
37-
}
38-
39-
&.active {
40-
color: #8B5CF6;
41-
background-color: #f7f8fa;
42-
font-weight: 500;
43-
}
44-
45-
@media screen and (max-width: 768px) {
46-
padding: 0.5rem 0.75rem;
47-
font-size: 0.75rem;
48-
}
49-
}
50-
5113
.codeContainer {
5214
background-color: #f7f8fa;
5315
border-radius: 8px;
@@ -61,16 +23,6 @@
6123
border-top-left-radius: 0;
6224
border-top-right-radius: 0;
6325
}
64-
65-
&:has(+ .filename) {
66-
border-top-left-radius: 0;
67-
border-top-right-radius: 0;
68-
}
69-
}
70-
71-
.pre {
72-
margin: 0;
73-
padding: 1.5rem;
7426
}
7527

7628
.code {

theme/components/code-demo/index.tsx

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,43 +11,24 @@ import styles from './index.module.scss';
1111

1212
interface CodeDemoProps {
1313
code: string;
14-
filename?: string;
1514
width?: string | number;
1615
height?: string | number;
1716
language?: string;
18-
codeDemos?: Array<{ code: string; filename?: string }>;
19-
activeIndex?: number;
20-
onTabChange?: (index: number) => void;
2117
}
2218

2319
const CodeDemo: FC<CodeDemoProps> = ({
2420
code,
25-
filename,
2621
width = '800px',
2722
height,
28-
language = 'rust',
29-
codeDemos = [],
30-
activeIndex = 0,
31-
onTabChange
23+
language = 'rust'
3224
}) => {
3325
return (
3426
<div className={styles.codeDemo} style={{ maxWidth: width }}>
35-
<div className={styles.filenameBar}>
36-
{codeDemos.map((demo, index) => (
37-
<button
38-
key={index}
39-
className={`${styles.filenameTab} ${index === activeIndex ? styles.active : ''}`}
40-
onClick={() => onTabChange?.(index)}
41-
>
42-
{demo.filename || `Example ${index + 1}`}
43-
</button>
44-
))}
45-
</div>
4627
<div className={styles.codeContainer} style={{ height }}>
4728
<SyntaxHighlighter
48-
language="javascript"
29+
language={language}
4930
style={style}
50-
customStyle={{ margin: 0, padding: '1.5rem', background: 'transparent' }}
31+
customStyle={{ margin: 0, padding: '0.6rem', background: 'transparent' }}
5132
codeTagProps={{
5233
className: styles.code
5334
}}
Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,48 @@
1-
import { useState, type FC } from 'react';
1+
import { type FC } from 'react';
2+
import { Tab, Tabs } from 'rspress/theme';
23
import CodeDemo from '../code-demo';
34
import styles from './index.module.scss';
45

56
interface CodeDemoItem {
6-
code: string;
7-
filename?: string;
7+
code: string;
8+
filename?: string;
89
}
910

1011
interface FeatureDemoProps {
11-
title: string;
12-
description: string;
13-
codeDemos: CodeDemoItem[];
14-
isReversed?: boolean;
12+
title: string;
13+
description: string;
14+
codeDemos: CodeDemoItem[];
15+
isReversed?: boolean;
1516
}
1617

1718
const FeatureDemo: FC<FeatureDemoProps> = ({
18-
title,
19-
description,
20-
codeDemos,
21-
isReversed = false,
19+
title,
20+
description,
21+
codeDemos,
22+
isReversed = false,
2223
}) => {
23-
const [activeIndex, setActiveIndex] = useState(0);
24-
const activeDemo = codeDemos[activeIndex];
24+
return (
25+
<div className={styles.featureDemo}>
26+
<div className={`${styles.container} ${isReversed ? styles.reversed : ''}`}>
27+
<div className={styles.content}>
28+
<h2 className={styles.title}>{title}</h2>
29+
<p className={styles.description}>{description}</p>
30+
</div>
31+
<div className={styles.codeWrapper}>
32+
<Tabs>
33+
{codeDemos.map((demo) => (
34+
<Tab key={demo.filename} label={demo.filename}>
35+
<CodeDemo
36+
code={demo.code}
37+
/>
38+
</Tab>
39+
))}
40+
</Tabs>
2541

26-
return (
27-
<div className={styles.featureDemo}>
28-
<div className={`${styles.container} ${isReversed ? styles.reversed : ''}`}>
29-
<div className={styles.content}>
30-
<h2 className={styles.title}>{title}</h2>
31-
<p className={styles.description}>{description}</p>
42+
</div>
43+
</div>
3244
</div>
33-
<div className={styles.codeWrapper}>
34-
<CodeDemo
35-
code={activeDemo.code}
36-
filename={activeDemo.filename}
37-
codeDemos={codeDemos}
38-
activeIndex={activeIndex}
39-
onTabChange={setActiveIndex}
40-
/>
41-
</div>
42-
</div>
43-
</div>
44-
);
45+
);
4546
};
4647

4748
export default FeatureDemo;

0 commit comments

Comments
 (0)