This is an automated email from the ASF dual-hosted git repository.
chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fory-site.git
The following commit(s) were added to refs/heads/main by this push:
new 34a1a026aa new fory website homepage (#460)
34a1a026aa is described below
commit 34a1a026aa7c84e2f802d7bd47c0e93a4457912c
Author: Shawn Yang <[email protected]>
AuthorDate: Sun May 31 14:06:25 2026 +0800
new fory website homepage (#460)
<img width="2838" height="1606" alt="image"
src="https://github.com/user-attachments/assets/c095cc4d-0468-49a1-973d-639422d6bd57"
/>
---
docs/start/install.md | 16 +-
docusaurus.config.ts | 14 +-
.../docusaurus-plugin-content-blog/options.json | 6 +-
.../docusaurus-plugin-content-docs/current.json | 4 +
.../current/guide/xlang/_category_.json | 2 +-
.../current/start/install.md | 16 +-
.../{version-0.15.json => version-0.10.json} | 8 +-
.../{version-0.15.json => version-0.11.json} | 8 +-
.../{version-0.15.json => version-0.12.json} | 8 +-
.../{version-0.15.json => version-0.13.json} | 8 +-
.../{version-0.15.json => version-0.14.json} | 12 +-
.../version-0.14/guide/xlang/_category_.json | 2 +-
.../version-0.15.json | 4 +
.../version-0.15/guide/xlang/_category_.json | 2 +-
.../{version-0.15.json => version-0.16.json} | 8 +-
.../version-0.16/guide/xlang/_category_.json | 2 +-
.../{version-0.15.json => version-0.17.json} | 8 +-
.../version-0.17/guide/xlang/_category_.json | 2 +-
.../{version-0.15.json => version-1.0.0.json} | 8 +-
.../version-1.0.0/guide/xlang/_category_.json | 2 +-
.../version-1.0.0/start/install.md | 16 +-
i18n/zh-CN/docusaurus-theme-classic/navbar.json | 4 +
src/components/home/HomepageLanding.module.css | 951 +++++++++++++++++++++
src/components/home/HomepageLanding.tsx | 848 ++++++++++++++++++
src/css/custom.css | 111 ++-
src/pages/index.tsx | 51 +-
versioned_docs/version-1.0.0/start/install.md | 16 +-
27 files changed, 1978 insertions(+), 159 deletions(-)
diff --git a/docs/start/install.md b/docs/start/install.md
index 68b2720c2b..9888849b21 100644
--- a/docs/start/install.md
+++ b/docs/start/install.md
@@ -112,26 +112,18 @@ Or use `cargo add`:
cargo add [email protected]
```
-## JavaScript
+## JavaScript / TypeScript
-The JavaScript packages are not published to npm yet.
-
-Install and build them from source for now:
+Install the published JavaScript package from npm:
```bash
-git clone https://github.com/apache/fory.git
-cd fory/javascript
-npm install
-npm run build
+npm install @apache-fory/core
```
-After building from source, use `@apache-fory/core` and optionally
`@apache-fory/hps` in your project or workspace setup.
-
Optional native acceleration requires Node.js 20+:
```bash
-cd packages/hps
-npm run build
+npm install @apache-fory/hps
```
## Dart
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index cb420ac5c4..bc633dfc4a 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -135,32 +135,32 @@ const config: Config = {
{
type: 'docSidebar',
sidebarId: 'docsSidebar',
- position: 'right',
+ position: 'left',
label: 'Docs',
},
{
type: 'docSidebar',
sidebarId: 'specificationSidebar',
- position: 'right',
+ position: 'left',
label: 'Specification',
},
{
type: 'docSidebar',
sidebarId: 'communitySidebar',
- position: 'right',
+ position: 'left',
label: 'Community',
},
{
to: '/user',
label: 'Users',
- position: "right",
+ position: "left",
},
{
- position: 'right',
+ position: 'left',
to: '/download',
label: 'Download',
},
- { to: '/blog', label: 'Blog', position: 'right' },
+ { to: '/blog', label: 'Blog', position: 'left' },
{
type: 'dropdown',
label: 'ASF',
@@ -284,7 +284,7 @@ const config: Config = {
prism: {
theme: prismThemes.github,
darkTheme: prismThemes.dracula,
- additionalLanguages: ["java", "javascript", "rust", "cpp", "c", "bash",
"scala", "python", "protobuf", "json"]
+ additionalLanguages: ["java", "javascript", "rust", "cpp", "c", "bash",
"scala", "python", "protobuf", "json", "csharp", "dart"]
},
} satisfies Preset.ThemeConfig,
};
diff --git a/i18n/zh-CN/docusaurus-plugin-content-blog/options.json
b/i18n/zh-CN/docusaurus-plugin-content-blog/options.json
index e19dda4ea0..5c8adf5733 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-blog/options.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-blog/options.json
@@ -1,14 +1,14 @@
{
"title": {
- "message": "Blog",
+ "message": "博客",
"description": "The title for the blog used in SEO"
},
"description": {
- "message": "Blog",
+ "message": "博客",
"description": "The description for the blog used in SEO"
},
"sidebar.title": {
- "message": "All our posts",
+ "message": "全部文章",
"description": "The label for the left sidebar"
}
}
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/current.json
index ac5312509b..3b078ce794 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/current.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current.json
@@ -18,5 +18,9 @@
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
+ },
+ "sidebar.docsSidebar.category.Cross Language": {
+ "message": "跨语言",
+ "description": "The label for category Cross Language in sidebar
docsSidebar"
}
}
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/xlang/_category_.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/xlang/_category_.json
index ab2d183de0..a42db26905 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/xlang/_category_.json
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/guide/xlang/_category_.json
@@ -1,5 +1,5 @@
{
- "label": "Cross Language",
+ "label": "跨语言",
"position": 12,
"collapsible": true,
"collapsed": true
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/start/install.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/current/start/install.md
index 6737454dfd..8c5da2d260 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/start/install.md
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/start/install.md
@@ -112,26 +112,18 @@ fory = "1.0.0"
cargo add [email protected]
```
-## JavaScript
+## JavaScript / TypeScript
-JavaScript 包尚未发布到 npm。
-
-目前请先从源码安装并构建:
+从 npm 安装已发布的 JavaScript 包:
```bash
-git clone https://github.com/apache/fory.git
-cd fory/javascript
-npm install
-npm run build
+npm install @apache-fory/core
```
-完成源码构建后,再在你的项目或 workspace 配置中使用 `@apache-fory/core`,并按需启用 `@apache-fory/hps`。
-
可选的原生加速需要 Node.js 20+:
```bash
-cd packages/hps
-npm run build
+npm install @apache-fory/hps
```
## Dart
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.10.json
similarity index 65%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-0.10.json
index 5134c6519e..c16c7978a6 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.10.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "0.10",
+ "description": "The label for version 0.10"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -11,10 +11,6 @@
"message": "快速开始",
"description": "The label for category Start in sidebar docsSidebar"
},
- "sidebar.docsSidebar.category.Schema IDL & Compiler": {
- "message": "Schema IDL 与编译器",
- "description": "The label for category Schema IDL & Compiler in sidebar
docsSidebar"
- },
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.11.json
similarity index 65%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-0.11.json
index 5134c6519e..479c48eabc 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.11.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "0.11",
+ "description": "The label for version 0.11"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -11,10 +11,6 @@
"message": "快速开始",
"description": "The label for category Start in sidebar docsSidebar"
},
- "sidebar.docsSidebar.category.Schema IDL & Compiler": {
- "message": "Schema IDL 与编译器",
- "description": "The label for category Schema IDL & Compiler in sidebar
docsSidebar"
- },
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.12.json
similarity index 65%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-0.12.json
index 5134c6519e..0517e14e43 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.12.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "0.12",
+ "description": "The label for version 0.12"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -11,10 +11,6 @@
"message": "快速开始",
"description": "The label for category Start in sidebar docsSidebar"
},
- "sidebar.docsSidebar.category.Schema IDL & Compiler": {
- "message": "Schema IDL 与编译器",
- "description": "The label for category Schema IDL & Compiler in sidebar
docsSidebar"
- },
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.13.json
similarity index 65%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-0.13.json
index 5134c6519e..bda1c19225 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.13.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "0.13",
+ "description": "The label for version 0.13"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -11,10 +11,6 @@
"message": "快速开始",
"description": "The label for category Start in sidebar docsSidebar"
},
- "sidebar.docsSidebar.category.Schema IDL & Compiler": {
- "message": "Schema IDL 与编译器",
- "description": "The label for category Schema IDL & Compiler in sidebar
docsSidebar"
- },
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.14.json
similarity index 66%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-0.14.json
index 5134c6519e..831321514c 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.14.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "0.14",
+ "description": "The label for version 0.14"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -11,12 +11,12 @@
"message": "快速开始",
"description": "The label for category Start in sidebar docsSidebar"
},
- "sidebar.docsSidebar.category.Schema IDL & Compiler": {
- "message": "Schema IDL 与编译器",
- "description": "The label for category Schema IDL & Compiler in sidebar
docsSidebar"
- },
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
+ },
+ "sidebar.docsSidebar.category.Cross Language": {
+ "message": "跨语言",
+ "description": "The label for category Cross Language in sidebar
docsSidebar"
}
}
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.14/guide/xlang/_category_.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.14/guide/xlang/_category_.json
index bd191529c6..399fce1c5c 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.14/guide/xlang/_category_.json
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.14/guide/xlang/_category_.json
@@ -1,5 +1,5 @@
{
- "label": "Cross Language",
+ "label": "跨语言",
"position": 9,
"collapsible": true,
"collapsed": true
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
index 5134c6519e..df901d9199 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
@@ -18,5 +18,9 @@
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
+ },
+ "sidebar.docsSidebar.category.Cross Language": {
+ "message": "跨语言",
+ "description": "The label for category Cross Language in sidebar
docsSidebar"
}
}
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/guide/xlang/_category_.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/guide/xlang/_category_.json
index bd191529c6..399fce1c5c 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/guide/xlang/_category_.json
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15/guide/xlang/_category_.json
@@ -1,5 +1,5 @@
{
- "label": "Cross Language",
+ "label": "跨语言",
"position": 9,
"collapsible": true,
"collapsed": true
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.16.json
similarity index 74%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-0.16.json
index 5134c6519e..7eb728cb7c 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.16.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "0.16",
+ "description": "The label for version 0.16"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -18,5 +18,9 @@
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
+ },
+ "sidebar.docsSidebar.category.Cross Language": {
+ "message": "跨语言",
+ "description": "The label for category Cross Language in sidebar
docsSidebar"
}
}
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.16/guide/xlang/_category_.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.16/guide/xlang/_category_.json
index bd191529c6..399fce1c5c 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.16/guide/xlang/_category_.json
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.16/guide/xlang/_category_.json
@@ -1,5 +1,5 @@
{
- "label": "Cross Language",
+ "label": "跨语言",
"position": 9,
"collapsible": true,
"collapsed": true
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.17.json
similarity index 74%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-0.17.json
index 5134c6519e..6af2578b12 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.17.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "0.17",
+ "description": "The label for version 0.17"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -18,5 +18,9 @@
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
+ },
+ "sidebar.docsSidebar.category.Cross Language": {
+ "message": "跨语言",
+ "description": "The label for category Cross Language in sidebar
docsSidebar"
}
}
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.17/guide/xlang/_category_.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.17/guide/xlang/_category_.json
index ab2d183de0..a42db26905 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.17/guide/xlang/_category_.json
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.17/guide/xlang/_category_.json
@@ -1,5 +1,5 @@
{
- "label": "Cross Language",
+ "label": "跨语言",
"position": 12,
"collapsible": true,
"collapsed": true
diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0.json
similarity index 74%
copy from i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
copy to i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0.json
index 5134c6519e..d7481e51df 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-0.15.json
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0.json
@@ -1,7 +1,7 @@
{
"version.label": {
- "message": "0.15",
- "description": "The label for version 0.15"
+ "message": "1.0.0",
+ "description": "The label for version 1.0.0"
},
"sidebar.docsSidebar.category.Introduction": {
"message": "Apache Fory 介绍",
@@ -18,5 +18,9 @@
"sidebar.docsSidebar.category.Guide": {
"message": "用户指南",
"description": "The label for category Guide in sidebar docsSidebar"
+ },
+ "sidebar.docsSidebar.category.Cross Language": {
+ "message": "跨语言",
+ "description": "The label for category Cross Language in sidebar
docsSidebar"
}
}
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/guide/xlang/_category_.json
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/guide/xlang/_category_.json
index ab2d183de0..a42db26905 100644
---
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/guide/xlang/_category_.json
+++
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/guide/xlang/_category_.json
@@ -1,5 +1,5 @@
{
- "label": "Cross Language",
+ "label": "跨语言",
"position": 12,
"collapsible": true,
"collapsed": true
diff --git
a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/start/install.md
b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/start/install.md
index 6737454dfd..8c5da2d260 100644
--- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/start/install.md
+++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-1.0.0/start/install.md
@@ -112,26 +112,18 @@ fory = "1.0.0"
cargo add [email protected]
```
-## JavaScript
+## JavaScript / TypeScript
-JavaScript 包尚未发布到 npm。
-
-目前请先从源码安装并构建:
+从 npm 安装已发布的 JavaScript 包:
```bash
-git clone https://github.com/apache/fory.git
-cd fory/javascript
-npm install
-npm run build
+npm install @apache-fory/core
```
-完成源码构建后,再在你的项目或 workspace 配置中使用 `@apache-fory/core`,并按需启用 `@apache-fory/hps`。
-
可选的原生加速需要 Node.js 20+:
```bash
-cd packages/hps
-npm run build
+npm install @apache-fory/hps
```
## Dart
diff --git a/i18n/zh-CN/docusaurus-theme-classic/navbar.json
b/i18n/zh-CN/docusaurus-theme-classic/navbar.json
index 6234e0c414..9ce8dbddca 100644
--- a/i18n/zh-CN/docusaurus-theme-classic/navbar.json
+++ b/i18n/zh-CN/docusaurus-theme-classic/navbar.json
@@ -27,6 +27,10 @@
"message": "社区",
"description": "Navbar item with label Community"
},
+ "item.label.Users": {
+ "message": "用户",
+ "description": "Navbar item with label Users"
+ },
"item.label.Download": {
"message": "下载",
"description": "Navbar item with label Download"
diff --git a/src/components/home/HomepageLanding.module.css
b/src/components/home/HomepageLanding.module.css
new file mode 100644
index 0000000000..17ae436506
--- /dev/null
+++ b/src/components/home/HomepageLanding.module.css
@@ -0,0 +1,951 @@
+.homepage {
+ background: var(--ifm-background-color);
+ color: var(--ifm-font-color-base);
+ --fory-border: #e4e8f0;
+ --fory-card-shadow: 0 18px 50px rgba(31, 41, 55, 0.1);
+ --fory-code-bg: #f7f9fc;
+ --fory-muted: #667085;
+ --fory-soft-band: #f7f9fc;
+ --fory-surface: #ffffff;
+}
+
+.hero {
+ align-items: center;
+ background:
+ linear-gradient(90deg, rgba(255, 112, 1, 0.055), transparent 32%),
+ linear-gradient(180deg, var(--ifm-background-color), #f9fafb);
+ display: grid;
+ gap: 2rem;
+ grid-template-columns: minmax(0, 0.9fr) minmax(440px, 0.82fr);
+ min-height: 560px;
+ padding: 4rem max(2rem, calc((100vw - 1180px) / 2)) 4rem;
+}
+
+.heroContent {
+ max-width: 690px;
+}
+
+.eyebrow,
+.sectionHeader span,
+.performanceCopy span {
+ color: var(--ifm-color-primary);
+ display: inline-block;
+ font-size: 0.78rem;
+ font-weight: 800;
+ letter-spacing: 0;
+ margin-bottom: 0.8rem;
+ text-transform: uppercase;
+}
+
+.hero h1,
+.sectionHeader h2,
+.performanceCopy h2,
+.ecosystem h2 {
+ font-size: 3.65rem;
+ line-height: 1.02;
+ margin: 0;
+}
+
+.heroSubtitle {
+ color: var(--ifm-color-emphasis-800);
+ font-size: 1.2rem;
+ line-height: 1.72;
+ margin: 1.35rem 0 0;
+ max-width: 650px;
+}
+
+.heroActions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.75rem;
+ margin-top: 2rem;
+}
+
+.primaryButton,
+.secondaryButton,
+.ghostButton {
+ align-items: center;
+ border-radius: 8px;
+ display: inline-flex;
+ font-weight: 700;
+ justify-content: center;
+ min-width: 11.25rem;
+ min-height: 44px;
+ padding: 0.7rem 1.1rem;
+ text-decoration: none;
+ transition: border-color 160ms ease, background 160ms ease, color 160ms
ease, transform 160ms ease;
+}
+
+.primaryButton:hover,
+.secondaryButton:hover,
+.ghostButton:hover {
+ text-decoration: none;
+ transform: translateY(-1px);
+}
+
+.primaryButton {
+ background: var(--ifm-color-primary);
+ border: 1px solid var(--ifm-color-primary);
+ color: #fff;
+}
+
+.primaryButton::after {
+ content: "\2192";
+ font-size: 1.05rem;
+ line-height: 1;
+ margin-left: 0.45rem;
+}
+
+.primaryButton:hover {
+ background: var(--ifm-color-primary-dark);
+ color: #fff;
+}
+
+.secondaryButton {
+ background: var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-300);
+ color: var(--ifm-font-color-base);
+}
+
+.secondaryButton:hover {
+ border-color: var(--ifm-color-primary);
+ color: var(--ifm-color-primary);
+}
+
+.ghostButton {
+ background: var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-300);
+ color: var(--ifm-font-color-base);
+}
+
+.ghostButton:hover {
+ border-color: var(--ifm-color-primary);
+ color: var(--ifm-color-primary);
+}
+
+.runtimeTitleRow span {
+ display: block;
+ font-size: 1rem;
+}
+
+.surfacePanel {
+ justify-self: end;
+ max-width: 540px;
+ min-width: 0;
+ width: 100%;
+}
+
+.surfaceOptions {
+ display: grid;
+ gap: 0.85rem;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+.surfaceOption {
+ --surface-accent: var(--ifm-color-primary);
+ --surface-badge-bg: rgba(255, 112, 1, 0.09);
+ --surface-badge-border: rgba(255, 112, 1, 0.2);
+ --surface-wash: rgba(255, 112, 1, 0.045);
+ align-items: flex-start;
+ background:
+ linear-gradient(180deg, var(--surface-wash), rgba(255, 255, 255, 0) 74px),
+ var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-200);
+ border-top: 1px solid var(--surface-badge-border);
+ border-radius: 8px;
+ color: var(--ifm-font-color-base);
+ display: grid;
+ gap: 0.7rem;
+ min-height: 136px;
+ padding: 1rem;
+ text-decoration: none;
+ transition: background 160ms ease, border-color 160ms ease, box-shadow 160ms
ease, transform 160ms ease;
+}
+
+.surfaceOption:nth-child(2) {
+ --surface-accent: #0f766e;
+ --surface-badge-bg: rgba(15, 118, 110, 0.09);
+ --surface-badge-border: rgba(15, 118, 110, 0.18);
+ --surface-wash: rgba(15, 118, 110, 0.045);
+}
+
+.surfaceOption:nth-child(3) {
+ --surface-accent: #2563eb;
+ --surface-badge-bg: rgba(37, 99, 235, 0.08);
+ --surface-badge-border: rgba(37, 99, 235, 0.16);
+ --surface-wash: rgba(37, 99, 235, 0.04);
+}
+
+.surfaceOption:nth-child(4) {
+ --surface-accent: #475569;
+ --surface-badge-bg: rgba(71, 85, 105, 0.08);
+ --surface-badge-border: rgba(71, 85, 105, 0.16);
+ --surface-wash: rgba(71, 85, 105, 0.035);
+}
+
+.surfaceOption:hover {
+ border-color: var(--surface-accent);
+ box-shadow: 0 14px 34px rgba(31, 41, 55, 0.08);
+ color: var(--ifm-font-color-base);
+ text-decoration: none;
+ transform: translateY(-1px);
+}
+
+.surfaceOptionBadge {
+ background: var(--surface-badge-bg);
+ border: 1px solid var(--surface-badge-border);
+ border-radius: 999px;
+ color: var(--surface-accent);
+ display: inline-flex;
+ font-size: 0.72rem;
+ font-weight: 900;
+ justify-content: center;
+ max-width: max-content;
+ padding: 0.25rem 0.45rem;
+ text-align: center;
+}
+
+.surfaceOptionBody {
+ display: grid;
+ gap: 0.35rem;
+ min-width: 0;
+}
+
+.surfaceOptionBody strong {
+ font-size: 1.02rem;
+ font-weight: 800;
+ line-height: 1.25;
+}
+
+.surfaceOptionBody small {
+ color: var(--ifm-color-emphasis-800);
+ font-size: 0.82rem;
+ line-height: 1.45;
+}
+
+.quickStart,
+.capabilities,
+.schemaIdl,
+.useCases {
+ padding: 5rem max(2rem, calc((100vw - 1180px) / 2));
+}
+
+.sectionHeader {
+ margin: 0 auto 2rem;
+ max-width: 760px;
+ text-align: center;
+}
+
+.sectionHeader h2,
+.performanceCopy h2,
+.ecosystem h2 {
+ font-size: 2.35rem;
+ line-height: 1.12;
+}
+
+.sectionHeader p,
+.performanceCopy p,
+.ecosystem p {
+ color: var(--ifm-color-emphasis-800);
+ font-size: 1.04rem;
+ line-height: 1.7;
+ margin: 1rem 0 0;
+}
+
+.runtimeShell {
+ background: var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-200);
+ border-radius: 8px;
+ box-shadow: 0 16px 40px rgba(31, 41, 55, 0.07);
+ overflow: hidden;
+}
+
+.runtimeTabs {
+ background: var(--fory-soft-band);
+ border-bottom: 1px solid var(--ifm-color-emphasis-200);
+ display: flex;
+ gap: 0.5rem;
+ overflow-x: auto;
+ padding: 0.75rem;
+}
+
+.runtimeTab,
+.runtimeTabActive {
+ border: 1px solid transparent;
+ border-radius: 999px;
+ cursor: pointer;
+ flex: 0 0 auto;
+ font-weight: 800;
+ min-height: 36px;
+ padding: 0.45rem 0.8rem;
+ transition: background 150ms ease, border-color 150ms ease, color 150ms ease;
+}
+
+.runtimeTab {
+ background: var(--ifm-background-color);
+ color: var(--ifm-color-emphasis-800);
+}
+
+.runtimeTab:hover {
+ border-color: var(--ifm-color-primary);
+ color: var(--ifm-color-primary);
+}
+
+.runtimeTabActive {
+ background: rgba(255, 112, 1, 0.11);
+ border-color: rgba(255, 112, 1, 0.35);
+ color: var(--ifm-color-primary-dark);
+}
+
+.runtimeDetail {
+ display: grid;
+ gap: 0;
+ grid-template-columns: minmax(300px, 0.72fr) minmax(0, 1fr);
+}
+
+.runtimeSummary {
+ border-right: 1px solid var(--ifm-color-emphasis-200);
+ padding: 1.4rem;
+}
+
+.runtimeTitleRow {
+ align-items: center;
+ display: flex;
+ gap: 1rem;
+ justify-content: space-between;
+}
+
+.runtimeTitleRow span {
+ font-size: 1.45rem;
+ font-weight: 900;
+}
+
+.runtimeGuideButton {
+ align-items: center;
+ border: 1px solid var(--ifm-color-emphasis-300);
+ border-radius: 8px;
+ color: var(--ifm-color-emphasis-900);
+ display: inline-flex;
+ flex: 0 0 auto;
+ font-size: 0.84rem;
+ font-weight: 800;
+ justify-content: center;
+ min-height: 2.35rem;
+ padding: 0.48rem 0.85rem;
+ text-decoration: none;
+ transition:
+ border-color 160ms ease,
+ color 160ms ease,
+ transform 160ms ease,
+ box-shadow 160ms ease;
+}
+
+.runtimeGuideButton:hover {
+ border-color: rgba(255, 117, 54, 0.48);
+ box-shadow: 0 10px 24px rgba(17, 24, 39, 0.08);
+ color: var(--ifm-color-primary);
+ transform: translateY(-1px);
+ text-decoration: none;
+}
+
+.runtimeSummary p {
+ color: var(--ifm-color-emphasis-800);
+ line-height: 1.65;
+ margin: 0.9rem 0 1.25rem;
+}
+
+.installBlock,
+.codeBlock {
+ min-width: 0;
+}
+
+.blockLabel {
+ color: var(--ifm-color-emphasis-700);
+ font-size: 0.76rem;
+ font-weight: 900;
+ margin-bottom: 0.55rem;
+ text-transform: uppercase;
+}
+
+.installBlock :global(.theme-code-block),
+.codeBlock :global(.theme-code-block) {
+ background: var(--fory-code-bg);
+ border: 1px solid var(--fory-border);
+ border-radius: 8px;
+ box-shadow: none;
+ margin: 0;
+}
+
+.installBlock :global(pre.prism-code),
+.codeBlock :global(pre.prism-code) {
+ background: var(--fory-code-bg) !important;
+ color: #111827;
+ font-size: 0.84rem;
+ line-height: 1.58;
+ padding: 1rem;
+}
+
+.codeBlock {
+ padding: 1.4rem;
+}
+
+.capabilities {
+ background: var(--fory-soft-band);
+}
+
+.capabilityGrid {
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.capabilityCard {
+ background: var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-200);
+ border-radius: 8px;
+ color: inherit;
+ min-height: 220px;
+ padding: 1.25rem;
+ text-decoration: none;
+ transition: border-color 160ms ease, transform 160ms ease, box-shadow 160ms
ease;
+}
+
+.capabilityCard:hover {
+ border-color: var(--ifm-color-primary);
+ box-shadow: 0 12px 35px rgba(16, 24, 39, 0.08);
+ color: inherit;
+ text-decoration: none;
+ transform: translateY(-2px);
+}
+
+.capabilityCard > span {
+ background: rgba(20, 184, 166, 0.12);
+ border: 1px solid rgba(20, 184, 166, 0.28);
+ border-radius: 999px;
+ color: #0f766e;
+ display: inline-flex;
+ font-size: 0.72rem;
+ font-weight: 900;
+ padding: 0.25rem 0.55rem;
+}
+
+.capabilityCard h3 {
+ font-size: 1.18rem;
+ margin: 1rem 0 0.65rem;
+}
+
+.capabilityCard p {
+ color: var(--ifm-color-emphasis-800);
+ line-height: 1.65;
+ margin: 0;
+}
+
+.schemaIdl {
+ background: linear-gradient(180deg, var(--fory-soft-band),
var(--ifm-background-color));
+}
+
+.schemaLayout {
+ align-items: center;
+ display: grid;
+ gap: 1.4rem;
+ grid-template-columns: minmax(0, 0.84fr) minmax(480px, 1fr);
+}
+
+.schemaCopy {
+ align-self: center;
+ max-width: 520px;
+}
+
+.schemaCopy h2 {
+ font-size: 2.35rem;
+ line-height: 1.12;
+ margin: 0;
+}
+
+.schemaCopy > p {
+ color: var(--ifm-color-emphasis-800);
+ font-size: 1.04rem;
+ line-height: 1.7;
+ margin: 1rem 0 0;
+}
+
+.schemaFeatureList {
+ display: grid;
+ gap: 0.85rem;
+ margin: 1.8rem 0 1.4rem;
+}
+
+.schemaFeature {
+ align-items: flex-start;
+ background:
+ linear-gradient(90deg, rgba(255, 112, 1, 0.055), transparent 44%),
+ var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-200);
+ border-radius: 8px;
+ display: grid;
+ gap: 0.85rem;
+ grid-template-columns: 42px minmax(0, 1fr);
+ padding: 0.95rem;
+}
+
+.schemaFeature > span {
+ align-items: center;
+ background: rgba(255, 112, 1, 0.11);
+ border-radius: 7px;
+ color: var(--ifm-color-primary);
+ display: inline-flex;
+ font-size: 0.78rem;
+ font-weight: 900;
+ height: 34px;
+ justify-content: center;
+}
+
+.schemaFeature h3 {
+ font-size: 1rem;
+ margin: 0 0 0.35rem;
+}
+
+.schemaFeature p {
+ color: var(--ifm-color-emphasis-800);
+ font-size: 0.9rem;
+ line-height: 1.55;
+ margin: 0;
+}
+
+.schemaActions {
+ display: grid;
+ gap: 0.75rem;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.schemaActionButton {
+ align-items: center;
+ border: 1px solid var(--ifm-color-emphasis-300);
+ border-radius: 8px;
+ color: var(--ifm-color-emphasis-900);
+ display: inline-flex;
+ font-size: 0.9rem;
+ font-weight: 800;
+ justify-content: center;
+ min-height: 2.6rem;
+ padding: 0.58rem 0.9rem;
+ text-align: center;
+ text-decoration: none;
+ transition:
+ border-color 160ms ease,
+ color 160ms ease,
+ transform 160ms ease,
+ box-shadow 160ms ease;
+}
+
+.schemaActionButton:hover {
+ border-color: rgba(255, 117, 54, 0.5);
+ box-shadow: 0 10px 22px rgba(17, 24, 39, 0.08);
+ color: var(--ifm-color-primary);
+ text-decoration: none;
+ transform: translateY(-1px);
+}
+
+.schemaPreview {
+ align-self: center;
+ background: var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-200);
+ border-radius: 8px;
+ box-shadow: 0 16px 40px rgba(31, 41, 55, 0.07);
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ overflow: hidden;
+}
+
+.schemaPreviewHeader {
+ align-items: center;
+ border-bottom: 1px solid var(--ifm-color-emphasis-200);
+ display: flex;
+ gap: 1rem;
+ justify-content: space-between;
+ padding: 0.85rem 1rem;
+}
+
+.schemaPreviewHeader span {
+ color: var(--fory-muted);
+ font-size: 0.82rem;
+ font-weight: 800;
+}
+
+.schemaPreviewHeader strong {
+ color: var(--ifm-color-primary);
+ font-size: 0.8rem;
+ text-transform: uppercase;
+}
+
+.schemaPreview :global(.theme-code-block) {
+ background: var(--fory-code-bg);
+ border-radius: 0;
+ box-shadow: none;
+ margin: 0;
+}
+
+.schemaPreview :global(pre.prism-code) {
+ background: var(--fory-code-bg) !important;
+ font-size: 0.86rem;
+ line-height: 1.55;
+ margin: 0;
+ min-height: 0;
+ overflow: visible;
+ padding: 0;
+}
+
+.schemaPreview :global(pre.prism-code > code) {
+ padding: 1.2rem !important;
+}
+
+.performance {
+ align-items: center;
+ display: grid;
+ gap: 2rem;
+ grid-template-columns: minmax(0, 0.8fr) minmax(420px, 1fr);
+ padding: 5rem max(2rem, calc((100vw - 1180px) / 2));
+}
+
+.performanceCopy {
+ max-width: 560px;
+}
+
+.performanceCopy .secondaryButton {
+ margin-top: 1.4rem;
+}
+
+.performanceCards {
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+.performanceCard {
+ background: var(--ifm-background-surface-color);
+ border: 1px solid var(--ifm-color-emphasis-200);
+ border-radius: 8px;
+ padding: 1.2rem;
+}
+
+.performanceCard strong {
+ color: var(--ifm-color-primary);
+ display: block;
+ font-size: 1.28rem;
+ line-height: 1.15;
+}
+
+.performanceCard p {
+ color: var(--ifm-color-emphasis-800);
+ font-size: 0.9rem;
+ line-height: 1.55;
+ margin: 0.75rem 0 0;
+}
+
+.useCaseGrid {
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.useCaseCard {
+ border: 1px solid var(--ifm-color-emphasis-200);
+ border-radius: 8px;
+ padding: 1.25rem;
+}
+
+.useCaseCard h3 {
+ font-size: 1.14rem;
+ margin: 0 0 0.65rem;
+}
+
+.useCaseCard p {
+ color: var(--ifm-color-emphasis-800);
+ line-height: 1.65;
+ margin: 0;
+}
+
+.ecosystem {
+ background: var(--ifm-background-color);
+ border-top: 1px solid var(--fory-border);
+ color: var(--ifm-font-color-base);
+ padding: 5rem max(2rem, calc((100vw - 1180px) / 2));
+}
+
+.ecosystemHeader {
+ max-width: 760px;
+}
+
+.ecosystem p {
+ color: var(--ifm-color-emphasis-800);
+ max-width: 680px;
+}
+
+.adoptionGrid {
+ display: grid;
+ gap: 1rem;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ margin-top: 2rem;
+}
+
+.adoptionCard {
+ background: #ffffff;
+ border: 1px solid var(--fory-border);
+ border-left: 3px solid rgba(255, 112, 1, 0.65);
+ border-radius: 8px;
+ color: var(--ifm-font-color-base);
+ display: flex;
+ flex-direction: column;
+ gap: 0.95rem;
+ min-height: 0;
+ padding: 1.05rem;
+ text-decoration: none;
+ transition: background 160ms ease, border-color 160ms ease, box-shadow 160ms
ease, transform 160ms ease;
+}
+
+.adoptionCard:hover {
+ background: rgba(255, 112, 1, 0.045);
+ border-color: var(--ifm-color-primary);
+ box-shadow: 0 14px 36px rgba(31, 41, 55, 0.08);
+ color: var(--ifm-font-color-base);
+ text-decoration: none;
+ transform: translateY(-2px);
+}
+
+.adoptionHeaderRow {
+ align-items: center;
+ display: flex;
+ gap: 0.75rem;
+}
+
+.adoptionStep {
+ align-items: center;
+ background: rgba(255, 112, 1, 0.1);
+ border-radius: 7px;
+ color: var(--ifm-color-primary);
+ display: inline-flex;
+ font-size: 0.76rem;
+ font-weight: 900;
+ height: 34px;
+ justify-content: center;
+ width: 34px;
+}
+
+.adoptionHeaderRow h3 {
+ color: var(--ifm-font-color-base);
+ font-size: 1rem;
+ font-weight: 900;
+ line-height: 1.25;
+ margin: 0;
+}
+
+.adoptionCard p {
+ color: var(--ifm-color-emphasis-800);
+ font-size: 0.9rem;
+ line-height: 1.58;
+ margin: 0;
+}
+
+.adoptionButton {
+ align-items: center;
+ align-self: flex-start;
+ border: 1px solid var(--ifm-color-emphasis-300);
+ border-radius: 8px;
+ color: var(--ifm-color-emphasis-900);
+ display: inline-flex;
+ font-size: 0.86rem;
+ font-weight: 800;
+ margin-top: auto;
+ min-height: 2.45rem;
+ padding: 0.55rem 0.86rem;
+ text-decoration: none;
+ transition:
+ border-color 160ms ease,
+ color 160ms ease,
+ transform 160ms ease,
+ box-shadow 160ms ease;
+}
+
+.adoptionButton:hover {
+ border-color: rgba(255, 117, 54, 0.5);
+ box-shadow: 0 10px 22px rgba(17, 24, 39, 0.08);
+ color: var(--ifm-color-primary);
+ text-decoration: none;
+ transform: translateY(-1px);
+}
+
+[data-theme="dark"] .hero {
+ background:
+ linear-gradient(90deg, rgba(255, 112, 1, 0.12), transparent 34%),
+ linear-gradient(180deg, #10141d, var(--ifm-background-color));
+}
+
+[data-theme="dark"] .homepage {
+ --fory-border: #283244;
+ --fory-card-shadow: none;
+ --fory-code-bg: #151d2b;
+ --fory-muted: #aeb8c8;
+ --fory-soft-band: #111827;
+ --fory-surface: #172033;
+}
+
+[data-theme="dark"] .runtimeShell,
+[data-theme="dark"] .capabilityCard,
+[data-theme="dark"] .schemaFeature,
+[data-theme="dark"] .schemaPreview,
+[data-theme="dark"] .performanceCard,
+[data-theme="dark"] .useCaseCard,
+[data-theme="dark"] .adoptionCard {
+ box-shadow: none;
+}
+
+[data-theme="dark"] .runtimeTabActive {
+ background: rgba(255, 112, 1, 0.18);
+ color: #ffb27a;
+}
+
+[data-theme="dark"] .capabilityCard > span {
+ color: #99f6e4;
+}
+
+[data-theme="dark"] .surfaceOption {
+ background:
+ linear-gradient(180deg, var(--surface-wash), rgba(23, 32, 51, 0) 74px),
+ #172033;
+ border-color: rgba(148, 163, 184, 0.24);
+}
+
+[data-theme="dark"] .surfaceOption:hover {
+ border-color: var(--surface-accent);
+}
+
+[data-theme="dark"] .ecosystem {
+ background: var(--ifm-background-color);
+ border-top-color: var(--fory-border);
+}
+
+[data-theme="dark"] .adoptionCard {
+ background: #172033;
+}
+
+@media (max-width: 1100px) {
+ .hero,
+ .schemaLayout,
+ .performance {
+ grid-template-columns: 1fr;
+ }
+
+ .hero {
+ min-height: auto;
+ }
+
+ .surfacePanel {
+ justify-self: start;
+ max-width: 640px;
+ }
+
+ .performanceCopy {
+ max-width: none;
+ }
+
+ .schemaCopy {
+ max-width: 760px;
+ }
+
+ .schemaPreview :global(pre.prism-code) {
+ min-height: auto;
+ }
+}
+
+@media (max-width: 996px) {
+ .hero,
+ .quickStart,
+ .capabilities,
+ .schemaIdl,
+ .performance,
+ .useCases,
+ .ecosystem {
+ padding-left: 1rem;
+ padding-right: 1rem;
+ }
+
+ .hero {
+ padding-top: 3.5rem;
+ }
+
+ .hero h1 {
+ font-size: 2.55rem;
+ }
+
+ .sectionHeader h2,
+ .schemaCopy h2,
+ .performanceCopy h2,
+ .ecosystem h2 {
+ font-size: 2rem;
+ }
+
+ .capabilityGrid,
+ .performanceCards,
+ .useCaseGrid,
+ .adoptionGrid {
+ grid-template-columns: 1fr;
+ }
+
+ .runtimeDetail {
+ grid-template-columns: 1fr;
+ }
+
+ .runtimeSummary {
+ border-bottom: 1px solid var(--ifm-color-emphasis-200);
+ border-right: 0;
+ }
+
+}
+
+@media (max-width: 560px) {
+ .hero h1 {
+ font-size: 2.18rem;
+ }
+
+ .heroSubtitle,
+ .sectionHeader p,
+ .performanceCopy p,
+ .ecosystem p {
+ font-size: 0.98rem;
+ }
+
+ .heroActions {
+ align-items: stretch;
+ flex-direction: column;
+ }
+
+ .primaryButton,
+ .secondaryButton,
+ .ghostButton {
+ width: 100%;
+ }
+
+ .runtimeTitleRow {
+ align-items: flex-start;
+ flex-direction: column;
+ }
+
+ .schemaActions {
+ grid-template-columns: 1fr;
+ }
+
+ .surfaceOption {
+ grid-template-columns: 1fr;
+ }
+
+ .surfaceOptions {
+ grid-template-columns: 1fr;
+ }
+
+ .installBlock :global(pre.prism-code),
+ .codeBlock :global(pre.prism-code),
+ .schemaPreview :global(pre.prism-code) {
+ font-size: 0.78rem;
+ }
+}
diff --git a/src/components/home/HomepageLanding.tsx
b/src/components/home/HomepageLanding.tsx
new file mode 100644
index 0000000000..a66de6e623
--- /dev/null
+++ b/src/components/home/HomepageLanding.tsx
@@ -0,0 +1,848 @@
+import React, { useMemo, useState } from "react";
+import Link from "@docusaurus/Link";
+import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
+import CodeBlock from "@theme/CodeBlock";
+import styles from "./HomepageLanding.module.css";
+
+type RuntimeId =
+ | "java"
+ | "python"
+ | "rust"
+ | "go"
+ | "cpp"
+ | "javascript"
+ | "csharp"
+ | "swift"
+ | "dart"
+ | "scala"
+ | "kotlin";
+
+type RuntimeExample = {
+ id: RuntimeId;
+ label: string;
+ install: string;
+ installLanguage: string;
+ codeLanguage: string;
+ code: string;
+ guide: string;
+ summary: string;
+};
+
+type Copy = {
+ heroEyebrow: string;
+ heroTitle: string;
+ heroSubtitle: string;
+ heroPrimary: string;
+ heroSecondary: string;
+ heroGithub: string;
+ quickEyebrow: string;
+ quickTitle: string;
+ quickSubtitle: string;
+ installLabel: string;
+ codeLabel: string;
+ guideLabel: string;
+ capabilitiesEyebrow: string;
+ capabilitiesTitle: string;
+ capabilitiesSubtitle: string;
+ schemaEyebrow: string;
+ schemaTitle: string;
+ schemaSubtitle: string;
+ performanceEyebrow: string;
+ performanceTitle: string;
+ performanceSubtitle: string;
+ benchmarkCta: string;
+ useCasesEyebrow: string;
+ useCasesTitle: string;
+ useCasesSubtitle: string;
+ ecosystemTitle: string;
+ ecosystemSubtitle: string;
+};
+
+const copies: Record<"en" | "zh", Copy> = {
+ en: {
+ heroEyebrow: "Apache Fory™ - Blazingly-Fast Multi-language Serialization",
+ heroTitle: "Apache Fory™",
+ heroSubtitle:
+ "A blazingly-fast multi-language serialization framework for idiomatic
domain objects, Schema IDL, and cross-language data exchange.",
+ heroPrimary: "Get Started",
+ heroSecondary: "View Docs",
+ heroGithub: "View GitHub",
+ quickEyebrow: "Quick start",
+ quickTitle: "Start from idiomatic domain objects.",
+ quickSubtitle:
+ "Create a native object in your language, then serialize and deserialize
it with one-line Fory calls.",
+ installLabel: "Install",
+ codeLabel: "Serialize / deserialize",
+ guideLabel: "Open guide",
+ capabilitiesEyebrow: "Core capabilities",
+ capabilitiesTitle: "What Fory is built to handle.",
+ capabilitiesSubtitle:
+ "Fory brings together cross-language serialization, idiomatic object
support, Schema IDL/code generation, reference tracking, schema evolution, and
row-format access.",
+ schemaEyebrow: "Schema IDL",
+ schemaTitle: "Model contracts that still understand object graphs.",
+ schemaSubtitle:
+ "Fory IDL starts with familiar message definitions, then adds unions and
reference-aware fields for data models that ordinary IDLs tend to flatten.",
+ performanceEyebrow: "Performance",
+ performanceTitle: "Designed for high-throughput serialization paths.",
+ performanceSubtitle:
+ "Fory combines efficient binary encoding with highly optimized
serializers, from JIT compilation to statically generated code.",
+ benchmarkCta: "View full benchmark charts",
+ useCasesEyebrow: "Data boundaries",
+ useCasesTitle: "Match Fory to each data boundary.",
+ useCasesSubtitle:
+ "Use one serialization layer, but choose the payload surface by the
boundary your data crosses.",
+ ecosystemTitle: "Adopt Fory without changing the object model.",
+ ecosystemSubtitle:
+ "Choose the wire mode for each boundary, promote shared models into Fory
IDL when contracts need to last, then validate the exact path with per-language
benchmarks.",
+ },
+ zh: {
+ heroEyebrow: "Apache Fory™ - 高性能多语言序列化",
+ heroTitle: "Apache Fory™",
+ heroSubtitle:
+ "一个面向惯用领域对象、Schema IDL 和跨语言数据交换的高性能多语言序列化框架。",
+ heroPrimary: "开始使用",
+ heroSecondary: "查看文档",
+ heroGithub: "查看 GitHub",
+ quickEyebrow: "快速开始",
+ quickTitle: "从惯用领域对象开始。",
+ quickSubtitle:
+ "用你的语言创建原生对象,然后分别通过一行 Fory 调用完成序列化和反序列化。",
+ installLabel: "安装",
+ codeLabel: "序列化 / 反序列化",
+ guideLabel: "打开指南",
+ capabilitiesEyebrow: "核心能力",
+ capabilitiesTitle: "Fory 面向这些问题而设计。",
+ capabilitiesSubtitle:
+ "Fory 将跨语言序列化、惯用对象支持、Schema IDL/codegen、引用跟踪、Schema 演进和 row-format
访问组合在一起。",
+ schemaEyebrow: "Schema IDL",
+ schemaTitle: "理解对象图的模型契约。",
+ schemaSubtitle:
+ "Fory IDL 从熟悉的 message 定义开始,并提供 union 与引用感知字段,表达普通 IDL 容易压平的对象模型。",
+ performanceEyebrow: "性能",
+ performanceTitle: "面向高吞吐序列化路径而设计。",
+ performanceSubtitle:
+ "Fory 结合高效二进制编码和高度优化的 serializer,从 JIT 编译到静态生成代码。",
+ benchmarkCta: "查看完整性能图表",
+ useCasesEyebrow: "数据边界",
+ useCasesTitle: "让 Fory 匹配每一种数据边界。",
+ useCasesSubtitle:
+ "使用同一层序列化能力,但根据数据跨越的边界选择不同 payload 表面。",
+ ecosystemTitle: "不改变对象模型地采用 Fory。",
+ ecosystemSubtitle:
+ "按数据边界选择 wire mode;当模型需要长期维护时推进到 Fory IDL;上线前用多语言 Benchmark 验证实际路径。",
+ },
+};
+
+const runtimeExamples: RuntimeExample[] = [
+ {
+ id: "java",
+ label: "Java",
+ installLanguage: "xml",
+ install: `<dependency>
+ <groupId>org.apache.fory</groupId>
+ <artifactId>fory-core</artifactId>
+ <version>1.0.0</version>
+</dependency>`,
+ codeLanguage: "java",
+ guide: "/docs/guide/java/",
+ summary: "Java supports xlang and native modes, JIT serializers, schema
evolution, and Java-native object graph features.",
+ code: `import org.apache.fory.Fory;
+
+public record Person(String name, int age) {}
+
+Fory fory = Fory.builder()
+ .withXlang(true)
+ .build();
+fory.register(Person.class, "Person");
+
+byte[] bytes = fory.serialize(new Person("Alice", 30));
+Person out = (Person) fory.deserialize(bytes);`,
+ },
+ {
+ id: "python",
+ label: "Python",
+ installLanguage: "bash",
+ install: `pip install pyfory`,
+ codeLanguage: "python",
+ guide: "/docs/guide/python/",
+ summary: "pyfory supports xlang, Python native mode, dataclasses, row
format, and out-of-band buffers.",
+ code: `from dataclasses import dataclass
+import pyfory
+
+@dataclass
+class Person:
+ name: str
+ age: pyfory.Int32
+
+fory = pyfory.Fory(xlang=True)
+fory.register(Person, typename="Person")
+
+data = fory.serialize(Person("Alice", 30))
+out = fory.deserialize(data)`,
+ },
+ {
+ id: "rust",
+ label: "Rust",
+ installLanguage: "bash",
+ install: `cargo add [email protected]`,
+ codeLanguage: "rust",
+ guide: "/docs/guide/rust/",
+ summary: "Rust uses derive macros for type-safe structs and supports both
xlang and native payloads.",
+ code: `use fory::{Error, Fory, ForyStruct};
+
+#[derive(ForyStruct, Debug, PartialEq)]
+struct Person {
+ name: String,
+ age: i32,
+}
+
+fn main() -> Result<(), Error> {
+ let mut fory = Fory::builder().xlang(true).build();
+ fory.register_by_name::<Person>("", "Person")?;
+
+ let bytes = fory.serialize(&Person { name: "Alice".into(), age: 30 })?;
+ let out: Person = fory.deserialize(&bytes)?;
+ Ok(())
+}`,
+ },
+ {
+ id: "go",
+ label: "Go",
+ installLanguage: "bash",
+ install: `go get github.com/apache/fory/go/fory`,
+ codeLanguage: "go",
+ guide: "/docs/guide/go/",
+ summary: "Go supports xlang and native modes with exported structs,
circular references, and schema-aware serializers.",
+ code: `type Person struct {
+ Name string
+ Age int32
+}
+
+f := fory.New(fory.WithXlang(true))
+_ = f.RegisterStructByName(Person{}, "Person")
+
+payload, _ := f.Serialize(&Person{Name: "Alice", Age: 30})
+var out Person
+_ = f.Deserialize(payload, &out)`,
+ },
+ {
+ id: "cpp",
+ label: "C++",
+ installLanguage: "cmake",
+ install: `FetchContent_Declare(
+ fory
+ GIT_REPOSITORY https://github.com/apache/fory.git
+ GIT_TAG v1.0.0
+ SOURCE_SUBDIR cpp
+)`,
+ codeLanguage: "cpp",
+ guide: "/docs/guide/cpp/",
+ summary: "C++17 support covers xlang/native payloads, macro-based type
registration, and row-format APIs.",
+ code: `struct Person {
+ std::string name;
+ int32_t age;
+
+ bool operator==(const Person& other) const {
+ return name == other.name && age == other.age;
+ }
+};
+FORY_STRUCT(Person, name, age);
+
+auto fory = Fory::builder().xlang(true).track_ref(false).build();
+fory.register_struct<Person>("Person");
+
+auto bytes = fory.serialize(Person{"Alice", 30}).value();
+auto out = fory.deserialize<Person>(bytes).value();`,
+ },
+ {
+ id: "javascript",
+ label: "JavaScript",
+ installLanguage: "bash",
+ install: `npm install @apache-fory/core`,
+ codeLanguage: "typescript",
+ guide: "/docs/guide/javascript/",
+ summary: "JavaScript/TypeScript is xlang-only, schema-driven, and runs in
Node.js or browsers.",
+ code: `import Fory, { Type } from "@apache-fory/core";
+
+const personType = Type.struct(
+ { typeName: "Person" },
+ { name: Type.string(), age: Type.int32() },
+);
+
+const fory = new Fory();
+const { serialize, deserialize } = fory.register(personType);
+
+const payload = serialize({ name: "Alice", age: 30 });
+const out = deserialize(payload);`,
+ },
+ {
+ id: "csharp",
+ label: "C#",
+ installLanguage: "bash",
+ install: `dotnet add package Apache.Fory --version 1.0.0`,
+ codeLanguage: "csharp",
+ guide: "/docs/guide/csharp/",
+ summary: ".NET support uses source-generated serializers for Fory structs,
enums, and unions.",
+ code: `using Apache.Fory;
+
+[ForyStruct]
+public sealed class Person
+{
+ public string Name { get; set; } = "";
+ public int Age { get; set; }
+}
+
+Fory fory = Fory.Builder().Build();
+fory.Register<Person>("Person");
+
+byte[] payload = fory.Serialize(new Person { Name = "Alice", Age = 30 });
+Person out = fory.Deserialize<Person>(payload);`,
+ },
+ {
+ id: "swift",
+ label: "Swift",
+ installLanguage: "swift",
+ install: `.package(url: "https://github.com/apache/fory.git", exact:
"1.0.0")`,
+ codeLanguage: "swift",
+ guide: "/docs/guide/swift/",
+ summary: "Swift uses @ForyStruct, @ForyEnum, and @ForyUnion macros for
xlang-compatible models.",
+ code: `import Fory
+
+@ForyStruct
+struct Person: Equatable {
+ var name: String = ""
+ var age: Int32 = 0
+}
+
+let fory = Fory()
+try fory.register(Person.self, name: "Person")
+
+let payload = try fory.serialize(Person(name: "Alice", age: 30))
+let out: Person = try fory.deserialize(payload)`,
+ },
+ {
+ id: "dart",
+ label: "Dart",
+ installLanguage: "yaml",
+ install: `dependencies:
+ fory: ^1.0.0
+
+dev_dependencies:
+ build_runner: ^2.4.13`,
+ codeLanguage: "dart",
+ guide: "/docs/guide/dart/",
+ summary: "Dart uses generated serializers across Dart VM, Flutter, AOT,
and web targets.",
+ code: `import 'package:fory/fory.dart';
+
+part 'person.fory.dart';
+
+@ForyStruct()
+class Person {
+ Person();
+ String name = "";
+
+ @ForyField(type: Int32Type())
+ int age = 0;
+}
+
+final fory = Fory();
+PersonForyModule.register(
+ fory,
+ Person,
+ namespace: '',
+ typeName: 'Person',
+);
+
+final payload = fory.serialize(Person()..name = "Alice"..age = 30);
+final out = fory.deserialize<Person>(payload);`,
+ },
+ {
+ id: "scala",
+ label: "Scala",
+ installLanguage: "sbt",
+ install: `libraryDependencies += "org.apache.fory" %% "fory-scala" %
"1.0.0"`,
+ codeLanguage: "scala",
+ guide: "/docs/guide/scala/",
+ summary: "Scala builds on Fory Java with optimized serializers for case
classes, collections, tuples, and Option.",
+ code: `import org.apache.fory.scala.ForyScala
+
+case class Person(name: String, age: Int)
+
+val fory = ForyScala.builder()
+ .withXlang(true)
+ .build()
+fory.register(classOf[Person], "Person")
+
+val payload = fory.serialize(Person("Alice", 30))
+val out = fory.deserialize(payload).asInstanceOf[Person]`,
+ },
+ {
+ id: "kotlin",
+ label: "Kotlin",
+ installLanguage: "kotlin",
+ install: `implementation("org.apache.fory:fory-kotlin:1.0.0")
+ksp("org.apache.fory:fory-kotlin-ksp:1.0.0")`,
+ codeLanguage: "kotlin",
+ guide: "/docs/guide/kotlin/",
+ summary: "Kotlin adds data-class support, Android guidance, and KSP static
serializers for xlang/schema mode.",
+ code: `import org.apache.fory.kotlin.ForyKotlin
+
+data class Person(val name: String, val age: Int)
+
+val fory = ForyKotlin.builder()
+ .withXlang(true)
+ .requireClassRegistration(true)
+ .buildThreadSafeFory()
+fory.register(Person::class.java, "Person")
+
+val payload = fory.serialize(Person("Alice", 30))
+val out = fory.deserialize(payload) as Person`,
+ },
+];
+
+const capabilities = [
+ {
+ title: "Cross-language encoding",
+ zhTitle: "跨语言编码",
+ label: "XLANG",
+ description:
+ "Serialize in one supported runtime and deserialize in another with the
xlang wire format.",
+ zhDescription: "通过 xlang 线格式,在一个受支持运行时序列化,在另一个运行时反序列化。",
+ link: "/docs/guide/xlang/",
+ },
+ {
+ title: "Domain objects first",
+ zhTitle: "领域对象优先",
+ label: "OBJECTS",
+ description:
+ "Work with Java classes, Python dataclasses, Go structs, Rust/C++
structs, and generated or annotated models.",
+ zhDescription: "直接使用 Java 类、Python dataclass、Go struct、Rust/C++
struct,以及生成或注解模型。",
+ link: "/docs/start/usage",
+ },
+ {
+ title: "Reference-aware Schema IDL",
+ zhTitle: "支持引用语义的 Schema IDL",
+ label: "IDL",
+ description:
+ "Define schemas once with optional fields, refs, IDs, unions, and
services, then generate native code.",
+ zhDescription: "一次定义 optional、ref、ID、union 和 service 等 schema,再生成各语言原生代码。",
+ link: "/docs/compiler/",
+ },
+ {
+ title: "Row-format random access",
+ zhTitle: "Row format 随机访问",
+ label: "ROW",
+ description:
+ "Read fields, arrays, and nested values without deserializing the whole
object; integrate with Arrow where supported.",
+ zhDescription: "无需反序列化完整对象即可读取字段、数组和嵌套值,并在支持语言中对接 Arrow。",
+ link: "/docs/guide/xlang/row_format",
+ },
+ {
+ title: "Optimized runtimes",
+ zhTitle: "运行时优化",
+ label: "FAST",
+ description:
+ "Use Java/JavaScript JIT serializers, Rust/C++/Swift macros, C# source
generators, Kotlin KSP, and Dart build_runner output.",
+ zhDescription:
+ "使用 Java/JavaScript JIT serializer、Rust/C++/Swift macro、C# source
generator、Kotlin KSP 和 Dart build_runner 输出。",
+ link: "/docs/guide/java/",
+ },
+ {
+ title: "Broad platform support",
+ zhTitle: "多运行时生态",
+ label: "MULTI",
+ description:
+ "Use Fory from Java, Python, C++, Go, Rust, JavaScript/TypeScript, C#,
Swift, Dart, Scala, Kotlin, and Android.",
+ zhDescription:
+ "覆盖
Java、Python、C++、Go、Rust、JavaScript/TypeScript、C#、Swift、Dart、Scala、Kotlin 和
Android。",
+ link: "/docs/start/usage",
+ },
+];
+
+const heroSurfaces = [
+ {
+ label: "Idiomatic",
+ zhLabel: "惯用",
+ title: "Idiomatic Objects",
+ zhTitle: "惯用对象",
+ text: "Serialize existing domain objects inside one runtime.",
+ zhText: "在单一运行时内序列化已有领域对象。",
+ link: "/docs/start/usage",
+ },
+ {
+ label: "XLANG",
+ zhLabel: "XLANG",
+ title: "Cross-language Encoding",
+ zhTitle: "跨语言编码",
+ text: "Unified cross-language type system and binary encoding.",
+ zhText: "统一的跨语言类型系统与二进制编码。",
+ link: "/docs/guide/xlang/",
+ },
+ {
+ label: "IDL",
+ zhLabel: "IDL",
+ title: "Reference-aware IDL",
+ zhTitle: "引用感知 IDL",
+ text: "Define shared contracts with refs, unions, and native code
generation.",
+ zhText: "用 refs、unions 和原生代码生成定义共享契约。",
+ link: "/docs/compiler/",
+ },
+ {
+ label: "FAST",
+ zhLabel: "FAST",
+ title: "High Performance",
+ zhTitle: "高性能",
+ text: "Highly optimized JIT and statically generated serializers.",
+ zhText: "高度优化的 JIT serializer 与静态生成 serializer。",
+ link: "/docs/introduction/benchmark",
+ },
+];
+
+const schemaExamples = [
+ {
+ title: "Message Type",
+ zhTitle: "Message 类型",
+ text: "Define structured data types with typed fields, field IDs, and
explicit optional fields.",
+ zhText: "用 typed fields、字段 ID 和明确的 optional 字段定义结构化数据类型。",
+ },
+ {
+ title: "Union Type",
+ zhTitle: "Union 类型",
+ text: "Map one-of-several cases to tagged unions, and to native union or
sum types where supported.",
+ zhText: "把 one-of-several case 映射为 tagged union;在支持的语言中生成原生 union 或 sum
type。",
+ code: `message Dog [id=104] {
+ string name = 1;
+ int32 bark_volume = 2;
+}
+
+message Cat [id=105] {
+ string name = 1;
+ int32 lives = 2;
+}
+
+union Animal [id=106] {
+ Dog dog = 1;
+ Cat cat = 2;
+}`,
+ },
+ {
+ title: "Circular References",
+ zhTitle: "循环引用",
+ text: "Use ref-tracked fields when the same object can be shared or a
graph contains cycles.",
+ zhText: "当对象会被共享,或图结构中存在环时,用 ref 字段保留引用语义。",
+ code: `message Node {
+ string value = 1;
+ ref Node parent = 2;
+ list<ref Node> children = 3;
+}`,
+ },
+];
+
+const schemaPreviewCode = `package example;\n\n${schemaExamples
+ .flatMap((item) => item.code ? [item.code] : [])
+ .join("\n\n")}`;
+
+const schemaLinks = [
+ {
+ label: "IDL Overview",
+ zhLabel: "IDL 概览",
+ link: "/docs/compiler/",
+ },
+ {
+ label: "Compiler Guide",
+ zhLabel: "编译器指南",
+ link: "/docs/compiler/compiler_guide",
+ },
+ {
+ label: "Generated Code",
+ zhLabel: "生成代码",
+ link: "/docs/compiler/generated_code",
+ },
+];
+
+const performanceCards = [
+ {
+ value: "Optimized Serializers",
+ zhValue: "优化 Serializer",
+ text: "Use JIT serializers, source generators, macros, KSP, and
build_runner where each runtime supports them.",
+ zhText: "在各运行时使用 JIT serializer、source generator、macro、KSP 和
build_runner。",
+ },
+ {
+ value: "Efficient Encoding",
+ zhValue: "高效编码",
+ text: "Encode typed objects into an efficient binary format for fast
serialization and deserialization.",
+ zhText: "将类型化对象编码为面向快速序列化和反序列化的高效二进制格式。",
+ },
+];
+
+const useCases = [
+ {
+ title: "Language boundary",
+ zhTitle: "语言边界",
+ text: "Use xlang when services in different languages need to exchange the
same typed payload directly.",
+ zhText: "当不同语言服务需要直接交换同一份类型化载荷时,使用 xlang。",
+ },
+ {
+ title: "Runtime boundary",
+ zhTitle: "运行时边界",
+ text: "Use native mode when objects stay inside one runtime and object
graph fidelity matters.",
+ zhText: "当对象只在同一运行时内流转,且对象图语义重要时,使用 native mode。",
+ },
+ {
+ title: "Read boundary",
+ zhTitle: "读取边界",
+ text: "Use row format for partial reads and analytics workloads that
should not rebuild whole objects.",
+ zhText: "当部分读取和分析类工作负载不应重建完整对象时,使用 row format。",
+ },
+];
+
+const adoptionPaths = [
+ {
+ label: "01",
+ title: "Choose the wire mode",
+ zhTitle: "选择 wire mode",
+ text: "Use xlang for portable payloads shared across languages; use native
mode for same-runtime traffic that needs broader runtime-specific object
models.",
+ zhText: "跨语言共享 payload 时使用 xlang;同运行时流量需要更完整的语言对象模型时使用 native mode。",
+ cta: "Usage guide",
+ zhCta: "使用指南",
+ action: "Usage guide",
+ zhAction: "使用指南",
+ link: "/docs/start/usage",
+ },
+ {
+ label: "02",
+ title: "Promote shared contracts",
+ zhTitle: "沉淀共享契约",
+ text: "Define Fory IDL once, generate type-safe native models across
languages, and use optional fields, refs, unions, or services when contracts
evolve.",
+ zhText: "用 Fory IDL 定义一次模型,生成多语言类型安全代码;契约演进时使用 optional、ref、union 或
service。",
+ cta: "Schema IDL guide",
+ zhCta: "Schema IDL",
+ action: "Schema IDL guide",
+ zhAction: "Schema IDL 指南",
+ link: "/docs/compiler/",
+ },
+ {
+ label: "03",
+ title: "Benchmark the rollout path",
+ zhTitle: "验证上线路径",
+ text: "Compare serialization throughput, deserialization throughput,
payload size, and reproduction steps for the runtime you plan to ship.",
+ zhText: "按计划上线的运行时对比序列化/反序列化吞吐、payload 大小和复现实验步骤。",
+ cta: "Benchmark charts",
+ zhCta: "Benchmark",
+ action: "Benchmark charts",
+ zhAction: "Benchmark 图表",
+ link: "/docs/introduction/benchmark",
+ },
+];
+
+function langKey(locale?: string): "en" | "zh" {
+ return locale === "zh-CN" ? "zh" : "en";
+}
+
+function HomepageLanding(): JSX.Element {
+ const {
+ i18n: { currentLocale },
+ } = useDocusaurusContext();
+ const copy = copies[langKey(currentLocale)];
+ const isZh = langKey(currentLocale) === "zh";
+ const [selectedRuntime, setSelectedRuntime] = useState<RuntimeId>("java");
+
+ const selected = useMemo(
+ () => runtimeExamples.find((item) => item.id === selectedRuntime) ??
runtimeExamples[0],
+ [selectedRuntime],
+ );
+
+ return (
+ <main className={styles.homepage}>
+ <section className={styles.hero}>
+ <div className={styles.heroContent}>
+ <div className={styles.eyebrow}>{copy.heroEyebrow}</div>
+ <h1>{copy.heroTitle}</h1>
+ <p className={styles.heroSubtitle}>{copy.heroSubtitle}</p>
+ <div className={styles.heroActions}>
+ <Link className={styles.primaryButton} to="/docs/start/install">
+ {copy.heroPrimary}
+ </Link>
+ <Link className={styles.secondaryButton}
to="/docs/introduction/overview">
+ {copy.heroSecondary}
+ </Link>
+ <Link className={styles.ghostButton}
to="https://github.com/apache/fory">
+ {copy.heroGithub}
+ </Link>
+ </div>
+ </div>
+
+ <div className={styles.surfacePanel} aria-label={isZh ? "Fory 文档入口" :
"Fory documentation paths"}>
+ <div className={styles.surfaceOptions}>
+ {heroSurfaces.map((item) => (
+ <Link className={styles.surfaceOption} key={item.title}
to={item.link}>
+ <span className={styles.surfaceOptionBadge}>{isZh ?
item.zhLabel : item.label}</span>
+ <span className={styles.surfaceOptionBody}>
+ <strong>{isZh ? item.zhTitle : item.title}</strong>
+ <small>{isZh ? item.zhText : item.text}</small>
+ </span>
+ </Link>
+ ))}
+ </div>
+ </div>
+ </section>
+
+ <section className={styles.capabilities}>
+ <div className={styles.sectionHeader}>
+ <span>{copy.capabilitiesEyebrow}</span>
+ <h2>{copy.capabilitiesTitle}</h2>
+ <p>{copy.capabilitiesSubtitle}</p>
+ </div>
+ <div className={styles.capabilityGrid}>
+ {capabilities.map((item) => (
+ <Link className={styles.capabilityCard} key={item.title}
to={item.link}>
+ <span>{item.label}</span>
+ <h3>{isZh ? item.zhTitle : item.title}</h3>
+ <p>{isZh ? item.zhDescription : item.description}</p>
+ </Link>
+ ))}
+ </div>
+ </section>
+
+ <section className={styles.quickStart}>
+ <div className={styles.sectionHeader}>
+ <span>{copy.quickEyebrow}</span>
+ <h2>{copy.quickTitle}</h2>
+ <p>{copy.quickSubtitle}</p>
+ </div>
+
+ <div className={styles.runtimeShell}>
+ <div className={styles.runtimeTabs} role="tablist"
aria-label="Runtime examples">
+ {runtimeExamples.map((runtime) => (
+ <button
+ aria-selected={runtime.id === selectedRuntime}
+ className={runtime.id === selectedRuntime ?
styles.runtimeTabActive : styles.runtimeTab}
+ key={runtime.id}
+ onClick={() => setSelectedRuntime(runtime.id)}
+ role="tab"
+ type="button"
+ >
+ {runtime.label}
+ </button>
+ ))}
+ </div>
+
+ <div className={styles.runtimeDetail}>
+ <div className={styles.runtimeSummary}>
+ <div className={styles.runtimeTitleRow}>
+ <span>{selected.label}</span>
+ <Link className={styles.runtimeGuideButton}
to={selected.guide}>
+ {isZh ? `${selected.label} 指南` : `${selected.label} Guide`}
+ </Link>
+ </div>
+ <p>{selected.summary}</p>
+ <div className={styles.installBlock}>
+ <div className={styles.blockLabel}>{copy.installLabel}</div>
+ <CodeBlock
language={selected.installLanguage}>{selected.install}</CodeBlock>
+ </div>
+ </div>
+
+ <div className={styles.codeBlock}>
+ <div className={styles.blockLabel}>{copy.codeLabel}</div>
+ <CodeBlock
language={selected.codeLanguage}>{selected.code}</CodeBlock>
+ </div>
+ </div>
+ </div>
+ </section>
+
+ <section className={styles.schemaIdl}>
+ <div className={styles.schemaLayout}>
+ <div className={styles.schemaCopy}>
+ <span className={styles.eyebrow}>{copy.schemaEyebrow}</span>
+ <h2>{copy.schemaTitle}</h2>
+ <p>{copy.schemaSubtitle}</p>
+ <div className={styles.schemaFeatureList}>
+ {schemaExamples.map((item, index) => (
+ <article className={styles.schemaFeature} key={item.title}>
+ <span>{String(index + 1).padStart(2, "0")}</span>
+ <div>
+ <h3>{isZh ? item.zhTitle : item.title}</h3>
+ <p>{isZh ? item.zhText : item.text}</p>
+ </div>
+ </article>
+ ))}
+ </div>
+ <div className={styles.schemaActions}>
+ {schemaLinks.map((item) => (
+ <Link className={styles.schemaActionButton} key={item.link}
to={item.link}>
+ {isZh ? item.zhLabel : item.label}
+ </Link>
+ ))}
+ </div>
+ </div>
+ <div className={styles.schemaPreview} aria-label={copy.schemaTitle}>
+ <div className={styles.schemaPreviewHeader}>
+ <span>model.fdl</span>
+ <strong>Fory IDL</strong>
+ </div>
+ <CodeBlock language="protobuf">{schemaPreviewCode}</CodeBlock>
+ </div>
+ </div>
+ </section>
+
+ <section className={styles.performance}>
+ <div className={styles.performanceCopy}>
+ <span>{copy.performanceEyebrow}</span>
+ <h2>{copy.performanceTitle}</h2>
+ <p>{copy.performanceSubtitle}</p>
+ <Link className={styles.secondaryButton}
to="/docs/introduction/benchmark">
+ {copy.benchmarkCta}
+ </Link>
+ </div>
+ <div className={styles.performanceCards}>
+ {performanceCards.map((item) => (
+ <div className={styles.performanceCard} key={item.value}>
+ <strong>{isZh ? item.zhValue : item.value}</strong>
+ <p>{isZh ? item.zhText : item.text}</p>
+ </div>
+ ))}
+ </div>
+ </section>
+
+ <section className={styles.useCases}>
+ <div className={styles.sectionHeader}>
+ <span>{copy.useCasesEyebrow}</span>
+ <h2>{copy.useCasesTitle}</h2>
+ <p>{copy.useCasesSubtitle}</p>
+ </div>
+ <div className={styles.useCaseGrid}>
+ {useCases.map((item) => (
+ <article className={styles.useCaseCard} key={item.title}>
+ <h3>{isZh ? item.zhTitle : item.title}</h3>
+ <p>{isZh ? item.zhText : item.text}</p>
+ </article>
+ ))}
+ </div>
+ </section>
+
+ <section className={styles.ecosystem}>
+ <div className={styles.ecosystemHeader}>
+ <span className={styles.eyebrow}>{isZh ? "采用路径" : "Adoption
path"}</span>
+ <h2>{copy.ecosystemTitle}</h2>
+ <p>{copy.ecosystemSubtitle}</p>
+ </div>
+ <div className={styles.adoptionGrid}>
+ {adoptionPaths.map((item) => (
+ <article className={styles.adoptionCard} key={item.title}>
+ <div className={styles.adoptionHeaderRow}>
+ <span className={styles.adoptionStep}>{item.label}</span>
+ <h3>{isZh ? item.zhTitle : item.title}</h3>
+ </div>
+ <p>{isZh ? item.zhText : item.text}</p>
+ <Link className={styles.adoptionButton} to={item.link}>
+ {isZh ? item.zhAction : item.action}
+ </Link>
+ </article>
+ ))}
+ </div>
+ </section>
+ </main>
+ );
+}
+
+export default HomepageLanding;
diff --git a/src/css/custom.css b/src/css/custom.css
index f9cd9fa6b5..b410ab702e 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -6,6 +6,8 @@
/* You can override the default Infima variables here. */
:root {
+ --fory-layout-width: 1180px;
+ --ifm-navbar-height: 4rem;
--ifm-color-primary: #ff6f01d2;
--ifm-color-primary-dark: #FF7001;
--ifm-color-primary-darker: #FF7001;
@@ -29,33 +31,86 @@
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
}
-.navbar__logo {
- height: 2.25rem;
-}
-
@media (min-width: 997px) {
.navbar {
- padding-left: calc(
- var(--fory-doc-sidebar-inset) +
- var(--ifm-menu-link-padding-horizontal)
- );
+ padding-left: 2rem;
+ padding-right: 2rem;
}
+
+ .navbar__inner {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: var(--fory-layout-width);
+ }
+
+.navbar__brand {
+ margin-right: 1.5rem;
+ }
+}
+
+.navbar {
+ --ifm-navbar-link-color: #4b5563;
+ --ifm-navbar-link-hover-color: #f26322;
+ box-shadow: 0 1px 0 rgba(15, 23, 42, .06);
+}
+
+.navbar__brand {
+ flex-shrink: 0;
+ min-width: max-content;
+}
+
+.navbar__logo {
+ flex-shrink: 0;
+ height: 2rem;
}
.navbar__item {
- font-size: .95rem;
+ font-size: .9375rem;
+ font-weight: 600;
margin-right: 0;
}
.navbar__link {
- font-size: .95rem;
+ color: var(--ifm-navbar-link-color);
+ font-size: .9375rem;
padding-left: .55rem;
padding-right: .55rem;
}
+.navbar__items--right .dropdown > .navbar__link {
+ color: var(--ifm-navbar-link-color);
+ font-size: .9375rem;
+ font-weight: 600;
+}
+
+.navbar__link:hover,
+.navbar__link--active,
+.navbar__items--right .dropdown > .navbar__link:hover {
+ color: var(--ifm-navbar-link-hover-color);
+}
+
+.navbar__search-input {
+ background-color: #f5f7fa;
+ border: 1px solid #edf0f5;
+ color: #475569;
+ font-size: .9375rem;
+ height: 2.125rem;
+}
+
+.navbar__search-input::placeholder {
+ color: #9aa4b2;
+}
+
+.navbar .clean-btn {
+ color: #5f6875;
+}
+
+.navbar .clean-btn:hover {
+ color: var(--ifm-navbar-link-hover-color);
+}
.header-github-link:hover {
- opacity: 0.6;
+ opacity: 1;
}
.header-github-link::before {
@@ -65,6 +120,7 @@
display: flex;
background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24'
xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12
0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577
0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633
17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236
1.07 1.835 2.809 1.305
3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93
0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.52 [...]
no-repeat;
+ opacity: .7;
}
[data-theme='dark'] .header-github-link::before {
@@ -72,6 +128,26 @@
no-repeat;
}
+[data-theme='dark'] .navbar {
+ --ifm-navbar-link-color: #c8d0dc;
+ --ifm-navbar-link-hover-color: #ff9a4f;
+ box-shadow: 0 1px 0 rgba(255, 255, 255, .08);
+}
+
+[data-theme='dark'] .navbar__search-input {
+ background-color: rgba(255, 255, 255, .07);
+ border-color: rgba(255, 255, 255, .1);
+ color: #d7dee9;
+}
+
+[data-theme='dark'] .navbar__search-input::placeholder {
+ color: #8e99a8;
+}
+
+[data-theme='dark'] .navbar .clean-btn {
+ color: #c8d0dc;
+}
+
.footer__copyright {
font-size: .7em;
}
@@ -166,6 +242,13 @@
}
@media (min-width: 997px) {
+ [class*="docRoot_"] {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: none;
+ width: calc(100% - 4rem);
+ }
+
.theme-doc-breadcrumbs,
.theme-doc-footer,
.pagination-nav,
@@ -241,6 +324,12 @@
padding: .75rem .75rem .75rem var(--fory-doc-sidebar-inset);
}
+@media (min-width: 997px) {
+ .theme-doc-sidebar-menu {
+ padding-left: max(.75rem, calc((100vw - var(--fory-layout-width)) / 2 -
.5rem));
+ }
+}
+
.menu__link {
border-radius: 6px;
font-size: .96rem;
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index 9af67f8801..fc049d8dd5 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -1,42 +1,11 @@
-import React, { useEffect } from "react";
+import React from "react";
import Layout from "@theme/Layout";
import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
-import useIsBrowser from "@docusaurus/useIsBrowser";
import { translate } from "@docusaurus/Translate";
-import HomepageHeader from "./home/components/HomepageHeader";
-import HomepageFeatures from "./home/components/HomepageFeatures";
-import HomePageLanguageCard from "./home/components/HomePageLanguageCard";
-import HomepageCodeDisplay from "./home/components/HomepageCodeDisplay";
-import HomepageFoot from "./home/components/HomepageFoot";
-import useAOS from "../hooks/useAOS";
+import HomepageLanding from "../components/home/HomepageLanding";
export default function App() {
- const isBrowser = useIsBrowser();
const { siteConfig } = useDocusaurusContext();
- const pathname = isBrowser && window.location.pathname;
-
- const handleNavClass = () => {
- if (isBrowser) {
- try {
- const nav = document.getElementsByTagName("nav")[0];
- if (!nav) return;
- const classList = nav.classList;
- if (pathname === "/" || pathname === "/zh-CN/") {
- classList.add("index-nav");
- } else {
- classList.remove("index-nav");
- }
- } catch (error) {
- console.error("处理导航栏类名时出错:", error);
- }
- }
- };
-
- useEffect(() => {
- handleNavClass();
- }, [isBrowser, pathname]);
-
- useAOS();
const metaDescription = translate({
id: "homepage.metaDescription",
@@ -46,21 +15,7 @@ export default function App() {
return (
<Layout title={`${siteConfig.title}`} description={metaDescription}>
- <main>
- <HomepageHeader />
- <div data-aos="fade-up" data-aos-delay="10">
- <HomepageFeatures />
- </div>
- <div data-aos="fade-up" data-aos-delay="10">
- <HomePageLanguageCard />
- </div>
- <div data-aos="fade-up" data-aos-delay="10">
- <HomepageCodeDisplay />
- </div>
- <div data-aos="fade-up" data-aos-delay="10">
- <HomepageFoot />
- </div>
- </main>
+ <HomepageLanding />
</Layout>
);
}
diff --git a/versioned_docs/version-1.0.0/start/install.md
b/versioned_docs/version-1.0.0/start/install.md
index 68b2720c2b..9888849b21 100644
--- a/versioned_docs/version-1.0.0/start/install.md
+++ b/versioned_docs/version-1.0.0/start/install.md
@@ -112,26 +112,18 @@ Or use `cargo add`:
cargo add [email protected]
```
-## JavaScript
+## JavaScript / TypeScript
-The JavaScript packages are not published to npm yet.
-
-Install and build them from source for now:
+Install the published JavaScript package from npm:
```bash
-git clone https://github.com/apache/fory.git
-cd fory/javascript
-npm install
-npm run build
+npm install @apache-fory/core
```
-After building from source, use `@apache-fory/core` and optionally
`@apache-fory/hps` in your project or workspace setup.
-
Optional native acceleration requires Node.js 20+:
```bash
-cd packages/hps
-npm run build
+npm install @apache-fory/hps
```
## Dart
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]