Skip to content

Commit bb99f47

Browse files
JusterZhuclaude
andcommitted
feat: add Corporate Wall, OSS Partners, Outsourcing, and Paid Consulting pages
- Add /corporate-wall: 4 companies using GeneralUpdate in production - Add /oss-partners: 7 open-source ecosystem partner projects - Add /outsourcing: software outsourcing services page - Add /paid-consulting: paid consulting for GeneralUpdate & .NET - Update contact page: remove GitHub Issues, Sponsorship, Email sections; add QR code contact card - Update navbar: add new menu items with i18n translations Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 593e420 commit bb99f47

10 files changed

Lines changed: 652 additions & 70 deletions

File tree

website/docusaurus.config.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,31 @@ const config = {
9090
docId: 'doc/GeneralSpacestation',
9191
label: 'GeneralSpacestation',
9292
},
93+
{
94+
to: '/outsourcing',
95+
label: '软件外包服务',
96+
},
97+
{
98+
to: '/paid-consulting',
99+
label: '付费咨询',
100+
},
93101
],
94102
},
95103
{
96104
to: '/contact',
97105
label: '联系方式',
98106
position: 'right',
99107
},
108+
{
109+
to: '/corporate-wall',
110+
label: '企业墙',
111+
position: 'right',
112+
},
113+
{
114+
to: '/oss-partners',
115+
label: '开源生态伙伴',
116+
position: 'right',
117+
},
100118
{
101119
href: 'https://github.com/GeneralLibrary',
102120
label: 'GitHub',

website/i18n/en/docusaurus-theme-classic/navbar.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,21 @@
2626
"item.label.GeneralSpacestation": {
2727
"message": "GeneralSpacestation",
2828
"description": "Navbar item with label GeneralSpacestation"
29+
},
30+
"item.label.软件外包服务": {
31+
"message": "Software Outsourcing",
32+
"description": "Navbar item with label 软件外包服务"
33+
},
34+
"item.label.企业墙": {
35+
"message": "Corporate Wall",
36+
"description": "Navbar item with label 企业墙"
37+
},
38+
"item.label.开源生态伙伴": {
39+
"message": "OSS Partners",
40+
"description": "Navbar item with label 开源生态伙伴"
41+
},
42+
"item.label.付费咨询": {
43+
"message": "Paid Consultation",
44+
"description": "Navbar item with label 付费咨询"
2945
}
3046
}

website/i18n/zh-Hans/docusaurus-theme-classic/navbar.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,21 @@
2626
"item.label.GeneralSpacestation": {
2727
"message": "GeneralSpacestation",
2828
"description": "Navbar item with label GeneralSpacestation"
29+
},
30+
"item.label.软件外包服务": {
31+
"message": "软件外包服务",
32+
"description": "Navbar item with label 软件外包服务"
33+
},
34+
"item.label.企业墙": {
35+
"message": "企业墙",
36+
"description": "Navbar item with label 企业墙"
37+
},
38+
"item.label.开源生态伙伴": {
39+
"message": "开源生态伙伴",
40+
"description": "Navbar item with label 开源生态伙伴"
41+
},
42+
"item.label.付费咨询": {
43+
"message": "付费咨询",
44+
"description": "Navbar item with label 付费咨询"
2945
}
3046
}

website/src/pages/contact.js

Lines changed: 18 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import Layout from '@theme/Layout';
33
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
44
import Heading from '@theme/Heading';
5+
import contactImg from '@site/docs/doc/imgs/contact.png';
56

67
export default function Contact() {
78
const {i18n} = useDocusaurusContext();
@@ -24,6 +25,23 @@ export default function Contact() {
2425

2526
<div style={{display: 'flex', flexDirection: 'column', gap: '2rem'}}>
2627

28+
{/* ── 联系方式 ── */}
29+
<div style={{
30+
border: '1px solid var(--ifm-color-emphasis-300)',
31+
borderRadius: '8px',
32+
padding: '1.5rem',
33+
}}>
34+
<Heading as="h3">{isEn ? 'Contact' : '联系方式'}</Heading>
35+
<p style={{color: 'var(--ifm-color-secondary-darkest)', marginBottom: '1rem'}}>
36+
{isEn
37+
? 'Scan the QR code below to contact us.'
38+
: '扫描下方二维码联系我们。'}
39+
</p>
40+
<div style={{textAlign: 'center'}}>
41+
<img src={contactImg} alt={isEn ? 'Contact QR Code' : '联系方式二维码'} style={{maxWidth: '100%', borderRadius: '8px'}} />
42+
</div>
43+
</div>
44+
2745
{/* ── QQ 群 ── */}
2846
<div style={{
2947
border: '1px solid var(--ifm-color-emphasis-300)',
@@ -52,57 +70,6 @@ export default function Contact() {
5270
</p>
5371
</div>
5472

55-
{/* ── GitHub Issues ── */}
56-
<div style={{
57-
border: '1px solid var(--ifm-color-emphasis-300)',
58-
borderRadius: '8px',
59-
padding: '1.5rem',
60-
}}>
61-
<Heading as="h3">GitHub Issues</Heading>
62-
<p style={{margin: 0}}>
63-
<a href="https://github.com/GeneralLibrary/GeneralUpdate/issues" target="_blank" rel="noopener">
64-
github.com/GeneralLibrary/GeneralUpdate/issues
65-
</a>
66-
</p>
67-
<p style={{color: 'var(--ifm-color-secondary-darkest)', marginTop: '0.5rem'}}>
68-
{isEn
69-
? 'Submit bug reports, feature requests, or ask questions on GitHub. Issues are publicly visible and help everyone.'
70-
: '提交 Bug 报告、功能建议或问题答疑。Issue 公开可见,帮助所有人。'}
71-
</p>
72-
</div>
73-
74-
{/* ── Email ── */}
75-
<div style={{
76-
border: '1px solid var(--ifm-color-emphasis-300)',
77-
borderRadius: '8px',
78-
padding: '1.5rem',
79-
}}>
80-
<Heading as="h3">{isEn ? 'Email' : '邮箱'}</Heading>
81-
<p style={{margin: 0}}>
82-
<a href="mailto:zhuzhen723723@outlook.com">zhuzhen723723@outlook.com</a>
83-
</p>
84-
<p style={{color: 'var(--ifm-color-secondary-darkest)', marginTop: '0.5rem'}}>
85-
{isEn
86-
? 'For business inquiries, private questions, or one-on-one paid consultations.'
87-
: '商务合作、私密问题或一对一付费咨询。'}
88-
</p>
89-
</div>
90-
91-
{/* ── 付费咨询 ── */}
92-
<div style={{
93-
border: '1px solid var(--ifm-color-emphasis-300)',
94-
borderRadius: '8px',
95-
padding: '1.5rem',
96-
background: 'var(--ifm-color-warning-contrast-background)',
97-
}}>
98-
<Heading as="h3">{isEn ? 'Paid Consultation' : '付费咨询'}</Heading>
99-
<p style={{margin: 0, color: 'var(--ifm-color-secondary-darkest)'}}>
100-
{isEn
101-
? 'Due to the large number of individual communications, the author\'s time and energy are limited. One-on-one technical support and customized secondary development require paid consultation. Please state your purpose when adding (WeChat recommended, idle chats are refused).'
102-
: '由于单独沟通人数过多作者时间精力有限,一对一技术支持和定制化二次开发需付费咨询。加好友请注明来意(推荐微信,拒绝闲聊)。'}
103-
</p>
104-
</div>
105-
10673
{/* ── 企业墙 ── */}
10774
<div style={{
10875
border: '1px solid var(--ifm-color-emphasis-300)',
@@ -117,25 +84,6 @@ export default function Contact() {
11784
</p>
11885
</div>
11986

120-
{/* ── 赞助 ── */}
121-
<div style={{
122-
border: '1px solid var(--ifm-color-emphasis-300)',
123-
borderRadius: '8px',
124-
padding: '1.5rem',
125-
}}>
126-
<Heading as="h3">{isEn ? 'Sponsorship' : '赞助一下'}</Heading>
127-
<p style={{color: 'var(--ifm-color-secondary-darkest)'}}>
128-
{isEn
129-
? 'All community donations will be used for the development of open-source projects and to reward code contributors. Sponsors\' company logos will be displayed on the project website. Your sponsorship will help us improve quality, add features, and provide a better user experience.'
130-
: '所有的社区捐赠将用于开源项目的发展建设和奖励代码贡献者。赞助者的公司标志将展示在项目网站上。您的赞助将帮助我们提高项目质量、增加更多功能、提供更好的用户体验。'}
131-
</p>
132-
<p style={{color: 'var(--ifm-color-secondary-darkest)', fontSize: '0.9rem', fontStyle: 'italic'}}>
133-
{isEn
134-
? 'Code contributors: please contact the email above to claim your rewards.'
135-
: '代码贡献者请联系上方邮箱领取奖励。'}
136-
</p>
137-
</div>
138-
13987
</div>
14088
</main>
14189
</Layout>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import React from 'react';
2+
import Layout from '@theme/Layout';
3+
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
4+
import Heading from '@theme/Heading';
5+
import styles from './corporate-wall.module.css';
6+
7+
function CompanyCard({ name, description, descriptionEn }) {
8+
const {i18n} = useDocusaurusContext();
9+
const isEn = i18n.currentLocale === 'en';
10+
return (
11+
<div className={styles.card}>
12+
<div className={styles.cardHeader}>
13+
<h3 className={styles.cardName}>{name}</h3>
14+
</div>
15+
<p className={styles.cardDesc}>
16+
{isEn ? descriptionEn : description}
17+
</p>
18+
</div>
19+
);
20+
}
21+
22+
export default function CorporateWall() {
23+
const {i18n} = useDocusaurusContext();
24+
const isEn = i18n.currentLocale === 'en';
25+
26+
const companies = [
27+
{
28+
name: '天津云度科技',
29+
description: '专注于云计算与数字化转型,在多条产品线中集成 GeneralUpdate 实现客户端自动更新。',
30+
descriptionEn: 'Focused on cloud computing and digital transformation, integrating GeneralUpdate across multiple product lines for automatic client updates.',
31+
},
32+
{
33+
name: '上海铱泓科技',
34+
description: '致力于开源 UI 组件库研发,旗下 Semi.Avalonia 和 Ursa.Avalonia 等优秀开源项目被广泛使用。',
35+
descriptionEn: 'Dedicated to open-source UI component library development, with excellent projects like Semi.Avalonia and Ursa.Avalonia widely adopted.',
36+
},
37+
{
38+
name: '天津****化工工程有限公司',
39+
description: '将 GeneralUpdate 应用于工业自动化系统的客户端升级管理。',
40+
descriptionEn: 'Using GeneralUpdate for client upgrade management in industrial automation systems.',
41+
},
42+
{
43+
name: '沈阳**汽车科技有限公司',
44+
description: '在车载智能终端软件更新中采用 GeneralUpdate 解决方案。',
45+
descriptionEn: 'Adopting GeneralUpdate solutions for software updates in automotive intelligent terminals.',
46+
},
47+
];
48+
49+
const title = isEn ? 'Corporate Wall' : '企业墙';
50+
const description = isEn
51+
? 'Companies using GeneralUpdate in production'
52+
: '在生产环境中使用 GeneralUpdate 的企业';
53+
54+
return (
55+
<Layout title={title} description={description}>
56+
<main className={styles.page}>
57+
<Heading as="h1" className={styles.pageTitle}>
58+
{title}
59+
</Heading>
60+
<p className={styles.pageSubtitle}>
61+
{isEn
62+
? 'Special thanks to the following companies using GeneralUpdate in production.'
63+
: '感谢以下企业在生产环境中使用 GeneralUpdate。'}
64+
</p>
65+
<div className={styles.cardGrid}>
66+
{companies.map((c, i) => <CompanyCard key={i} {...c} />)}
67+
</div>
68+
</main>
69+
</Layout>
70+
);
71+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
/* ════════════════════════════════════════════════════════════════
2+
CORPORATE WALL — Card Grid Layout
3+
════════════════════════════════════════════════════════════════ */
4+
5+
/* ── Page layout ── */
6+
.page {
7+
max-width: 1000px;
8+
margin: 0 auto;
9+
padding: 4rem 2rem;
10+
}
11+
12+
.pageTitle {
13+
font-size: 2.5rem;
14+
font-weight: 900;
15+
text-align: center;
16+
margin-bottom: 1rem;
17+
font-family: 'Courier New', monospace;
18+
text-transform: uppercase;
19+
letter-spacing: 3px;
20+
color: var(--ifm-color-primary-darkest);
21+
}
22+
23+
.pageSubtitle {
24+
text-align: center;
25+
color: var(--ifm-color-secondary-darkest);
26+
margin-bottom: 3rem;
27+
font-size: 1.1rem;
28+
}
29+
30+
/* ── Card grid ── */
31+
.cardGrid {
32+
display: grid;
33+
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
34+
gap: 2rem;
35+
}
36+
37+
/* ── Individual card ── */
38+
.card {
39+
background: var(--ifm-card-background-color, #fff);
40+
border: 3px solid var(--ifm-color-emphasis-300);
41+
border-radius: 12px;
42+
padding: 1.5rem;
43+
box-shadow: 6px 6px 0 rgba(0, 0, 0, 0.08);
44+
transition: all 0.3s ease;
45+
}
46+
47+
.card:hover {
48+
transform: translate(-4px, -4px);
49+
box-shadow: 10px 10px 0 rgba(0, 0, 0, 0.12);
50+
border-color: var(--ifm-color-primary);
51+
}
52+
53+
/* ── Card header: company name top-left ── */
54+
.cardHeader {
55+
margin-bottom: 0.75rem;
56+
}
57+
58+
.cardName {
59+
font-size: 1.3rem;
60+
font-weight: 800;
61+
margin: 0;
62+
color: var(--ifm-color-primary-darkest);
63+
font-family: 'Courier New', monospace;
64+
}
65+
66+
/* ── Description ── */
67+
.cardDesc {
68+
font-size: 0.95rem;
69+
line-height: 1.6;
70+
color: var(--ifm-color-emphasis-700);
71+
margin: 0;
72+
}
73+
74+
/* ════════════════════════════════════════════════════════════════
75+
DARK MODE
76+
════════════════════════════════════════════════════════════════ */
77+
[data-theme='dark'] .card {
78+
background: var(--ifm-background-surface-color);
79+
border-color: rgba(93, 173, 226, 0.25);
80+
box-shadow: 6px 6px 0 rgba(93, 173, 226, 0.1);
81+
}
82+
83+
[data-theme='dark'] .card:hover {
84+
box-shadow: 10px 10px 0 rgba(93, 173, 226, 0.2);
85+
border-color: var(--ifm-color-primary);
86+
}
87+
88+
[data-theme='dark'] .cardName {
89+
color: var(--ifm-color-primary-lightest);
90+
}
91+
92+
[data-theme='dark'] .cardDesc {
93+
color: var(--ifm-color-secondary-darkest);
94+
}
95+
96+
[data-theme='dark'] .pageTitle {
97+
color: var(--ifm-color-primary-lightest);
98+
}
99+
100+
/* ════════════════════════════════════════════════════════════════
101+
RESPONSIVE
102+
════════════════════════════════════════════════════════════════ */
103+
@media screen and (max-width: 768px) {
104+
.cardGrid {
105+
grid-template-columns: 1fr;
106+
}
107+
.pageTitle {
108+
font-size: 2rem;
109+
}
110+
}

0 commit comments

Comments
 (0)