Skip to content

Commit ad4d7eb

Browse files
committed
feat(website): add core website components and content - Add App with theme context - Add project structure and sample code - Add Home page and icons
1 parent 5fa5727 commit ad4d7eb

File tree

6 files changed

+802
-17
lines changed

6 files changed

+802
-17
lines changed

office-website/src/App.tsx

Lines changed: 64 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
import React from 'react';
2-
import { ThemeProvider } from 'styled-components';
3-
import { theme } from './styles/Theme';
4-
import GlobalStyles from './styles/GlobalStyles';
1+
import React, { useState, useEffect, useContext } from 'react';
52
import Header from './components/Header';
63
import Hero from './components/Hero';
74
import Features from './components/Features';
@@ -10,22 +7,72 @@ import Installation from './components/Installation';
107
import TypescriptSupport from './components/TypescriptSupport';
118
import Community from './components/Community';
129
import Footer from './components/Footer';
10+
import { ThemeProvider } from 'styled-components';
11+
import { lightTheme, darkTheme } from './styles/Theme';
12+
import GlobalStyles from './styles/GlobalStyles';
13+
14+
// 创建主题上下文
15+
export const ThemeContext = React.createContext({
16+
isDarkMode: true,
17+
toggleTheme: () => {},
18+
});
19+
20+
// 提供一个钩子函数用于获取主题上下文
21+
export const useTheme = () => useContext(ThemeContext);
1322

1423
const App: React.FC = () => {
24+
// 主题状态
25+
const [isDarkMode, setIsDarkMode] = useState(true);
26+
27+
// 切换主题函数
28+
const toggleTheme = () => {
29+
setIsDarkMode(!isDarkMode);
30+
localStorage.setItem('darkMode', (!isDarkMode).toString());
31+
};
32+
33+
// 从本地存储获取主题设置
34+
useEffect(() => {
35+
const savedDarkMode = localStorage.getItem('darkMode');
36+
if (savedDarkMode !== null) {
37+
setIsDarkMode(savedDarkMode === 'true');
38+
} else {
39+
// 如果没有保存过设置,则检查系统偏好
40+
const prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
41+
setIsDarkMode(prefersDarkMode);
42+
}
43+
}, []);
44+
45+
useEffect(() => {
46+
// 更新页面滚动位置
47+
window.scrollTo(0, 0);
48+
49+
// 监听浏览器历史变化
50+
const handlePopState = () => {
51+
// 移除与 currentPage 相关的逻辑
52+
window.scrollTo(0, 0);
53+
};
54+
55+
window.addEventListener('popstate', handlePopState);
56+
return () => window.removeEventListener('popstate', handlePopState);
57+
}, []);
58+
1559
return (
16-
<ThemeProvider theme={theme}>
17-
<GlobalStyles />
18-
<Header />
19-
<main>
20-
<Hero />
21-
<Features />
22-
<WorkflowDemo />
23-
<Installation />
24-
<TypescriptSupport />
25-
<Community />
26-
</main>
27-
<Footer />
28-
</ThemeProvider>
60+
<ThemeContext.Provider value={{ isDarkMode, toggleTheme }}>
61+
<ThemeProvider theme={isDarkMode ? darkTheme : lightTheme}>
62+
<GlobalStyles />
63+
64+
<div>
65+
<Header />
66+
<Hero />
67+
<Features />
68+
<WorkflowDemo />
69+
<Installation />
70+
<TypescriptSupport />
71+
<Community />
72+
<Footer />
73+
</div>
74+
</ThemeProvider>
75+
</ThemeContext.Provider>
2976
);
3077
};
3178

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// 项目目录结构的常量文件,用于VSCodeSidebar组件中展示
2+
3+
// 文件类型枚举
4+
export enum FileType {
5+
TYPESCRIPT = 'typescript',
6+
JAVASCRIPT = 'javascript'
7+
}
8+
9+
// 文件项接口
10+
export interface FileItem {
11+
name: string;
12+
type: 'file' | 'folder';
13+
active?: boolean;
14+
expanded?: boolean;
15+
badge?: string;
16+
children?: FileItem[];
17+
}
18+
19+
// 项目结构
20+
export const PROJECT_STRUCTURE: FileItem[] = [
21+
{
22+
name: 'typescript-userscript-template',
23+
type: 'folder',
24+
expanded: true,
25+
children: [
26+
{
27+
name: 'dist',
28+
type: 'folder',
29+
expanded: false,
30+
children: [
31+
{
32+
name: 'index.js',
33+
type: 'file',
34+
active: true
35+
}
36+
]
37+
},
38+
{
39+
name: 'src',
40+
type: 'folder',
41+
expanded: true,
42+
children: [
43+
{
44+
name: 'index.ts',
45+
type: 'file'
46+
},
47+
{
48+
name: 'userscript.ts',
49+
type: 'file'
50+
},
51+
{
52+
name: 'gm_api_utils.ts',
53+
type: 'file'
54+
}
55+
]
56+
},
57+
{
58+
name: '.gitignore',
59+
type: 'file'
60+
},
61+
{
62+
name: 'package.json',
63+
type: 'file',
64+
badge: 'npm'
65+
},
66+
{
67+
name: 'README.md',
68+
type: 'file'
69+
},
70+
{
71+
name: 'tsconfig.json',
72+
type: 'file'
73+
},
74+
{
75+
name: 'webpack.config.js',
76+
type: 'file'
77+
}
78+
]
79+
}
80+
];

0 commit comments

Comments
 (0)