This is an automated email from the ASF dual-hosted git repository. VGalaxies pushed a commit to branch docusaurus-issue-103-preview in repository https://gitbox.apache.org/repos/asf/hugegraph-doc.git
commit 5d29caba88aa12851e7decfa724603d50e950792 Author: VGalaxies <[email protected]> AuthorDate: Tue May 5 12:04:35 2026 +0000 docs: migrate website to Docusaurus --- .github/workflows/docusaurus.yml | 45 +++ .github/workflows/hugo.yml | 58 ---- .gitignore | 3 + README.md | 64 ++--- content/cn/docs/clients/restful-api/_index.md | 2 +- content/cn/docs/clients/restful-api/auth.md | 2 +- content/cn/docs/clients/restful-api/edgelabel.md | 2 +- content/cn/docs/clients/restful-api/graphs.md | 4 +- content/cn/docs/clients/restful-api/gremlin.md | 4 +- content/cn/docs/clients/restful-api/indexlabel.md | 2 +- content/cn/docs/clients/restful-api/rebuild.md | 6 +- content/cn/docs/clients/restful-api/vertexlabel.md | 2 +- content/cn/docs/config/config-guide.md | 6 +- .../docs/quickstart/hugegraph/hugegraph-server.md | 2 +- content/en/community/_index.md | 2 +- content/en/docs/clients/restful-api/_index.md | 2 +- content/en/docs/clients/restful-api/auth.md | 2 +- content/en/docs/clients/restful-api/edgelabel.md | 2 +- content/en/docs/clients/restful-api/gremlin.md | 4 +- content/en/docs/clients/restful-api/indexlabel.md | 2 +- content/en/docs/clients/restful-api/rebuild.md | 6 +- content/en/docs/clients/restful-api/vertexlabel.md | 2 +- content/en/docs/config/config-guide.md | 2 +- .../docs/quickstart/hugegraph/hugegraph-server.md | 2 +- docusaurus.config.js | 223 +++++++++++++++ netlify.toml | 5 +- package.json | 46 ++-- scripts/validate-build.js | 38 +++ scripts/validate-content-inventory.js | 40 +++ scripts/validate-ui.js | 157 +++++++++++ sidebars-cn.js | 5 + sidebars-community-cn.js | 5 + sidebars-community.js | 5 + sidebars.js | 5 + src/css/custom.css | 304 +++++++++++++++++++++ src/markdown/frontMatter.js | 81 ++++++ src/pages/cn/index.js | 115 ++++++++ src/pages/index.js | 118 ++++++++ src/sidebars/buildSidebars.js | 145 ++++++++++ .../blog/images/images-server/agentic-abstract.png | Bin 0 -> 43130 bytes .../images/images-server/agentic-background.png | Bin 0 -> 68171 bytes static/blog/images/images-server/agentic-frame.png | Bin 0 -> 96995 bytes .../blog/images/images-server/agentic-lifeline.svg | 1 + .../blog/images/images-server/agentic-pydantic.png | Bin 0 -> 18853 bytes .../images/images-server/agentic-scheduler.png | Bin 0 -> 366031 bytes .../images/images-server/toplingdb-web-server.png | Bin 0 -> 176351 bytes .../images/images-server/toplingdb-yaml-ref.png | Bin 0 -> 99021 bytes static/docs/images/API-perf/v0.4.4/best.png | Bin 0 -> 36328 bytes static/docs/images/API-perf/v0.4.4/cpu-memory.png | Bin 0 -> 57282 bytes static/docs/images/API-perf/v0.4.4/ssd.png | Bin 0 -> 58867 bytes .../docs/images/API-perf/v0.4.4/threads-batch.png | Bin 0 -> 111282 bytes .../docs/images/API-perf/v0.4.4/threads-single.png | Bin 0 -> 117436 bytes .../API-perf/v0.5.6/cassandra/edge_batch.png | Bin 0 -> 237802 bytes .../API-perf/v0.5.6/cassandra/edge_id_query.png | Bin 0 -> 361191 bytes .../API-perf/v0.5.6/cassandra/edge_single.png | Bin 0 -> 364710 bytes .../API-perf/v0.5.6/cassandra/vertex_batch.png | Bin 0 -> 382379 bytes .../API-perf/v0.5.6/cassandra/vertex_id_query.png | Bin 0 -> 578106 bytes .../API-perf/v0.5.6/cassandra/vertex_single.png | Bin 0 -> 439086 bytes .../images/API-perf/v0.5.6/rocksdb/edge_batch.png | Bin 0 -> 321570 bytes .../API-perf/v0.5.6/rocksdb/edge_id_query.png | Bin 0 -> 383288 bytes .../images/API-perf/v0.5.6/rocksdb/edge_single.png | Bin 0 -> 403741 bytes .../API-perf/v0.5.6/rocksdb/vertex_batch.png | Bin 0 -> 334702 bytes .../API-perf/v0.5.6/rocksdb/vertex_id_query.png | Bin 0 -> 434422 bytes .../API-perf/v0.5.6/rocksdb/vertex_single.png | Bin 0 -> 431661 bytes static/docs/images/demo-graph-model.png | Bin 0 -> 68187 bytes static/docs/images/design/GraphCut.png | Bin 0 -> 37174 bytes static/docs/images/design/PropertyGraph.png | Bin 0 -> 126622 bytes static/docs/images/design/Self-loop.png | Bin 0 -> 24915 bytes .../docs/images/design/architectural-component.png | Bin 0 -> 96645 bytes .../docs/images/design/architectural-overview.png | Bin 0 -> 39763 bytes .../docs/images/design/architectural-revised.png | Bin 0 -> 338402 bytes static/docs/images/design1-1.png | Bin 0 -> 114454 bytes static/docs/images/design1-2.png | Bin 0 -> 50288 bytes static/docs/images/design1-3.png | Bin 0 -> 37174 bytes static/docs/images/design1-5.png | Bin 0 -> 160775 bytes static/docs/images/design1-6.png | Bin 0 -> 414106 bytes static/docs/images/design4-1.png | Bin 0 -> 39763 bytes static/docs/images/design5-1.png | Bin 0 -> 96645 bytes static/docs/images/design5-2.png | Bin 0 -> 51385 bytes static/docs/images/design5-3.png | Bin 0 -> 38773 bytes static/docs/images/design5-4.png | Bin 0 -> 21405 bytes static/docs/images/design5-5.png | Bin 0 -> 37633 bytes static/docs/images/favicon.ico | Bin 0 -> 1150 bytes static/docs/images/gradio-config.png | Bin 0 -> 115705 bytes static/docs/images/gradio-kg.png | Bin 0 -> 3931356 bytes static/docs/images/gradio-rag-1.png | Bin 0 -> 32135 bytes static/docs/images/gradio-rag-2.png | Bin 0 -> 59572 bytes static/docs/images/gradio-rag.png | Bin 0 -> 156454 bytes static/docs/images/graph-of-gods.png | Bin 0 -> 77311 bytes ...75\277\347\224\250\346\265\201\347\250\213.png" | Bin 0 -> 16501 bytes .../311\345\233\276\345\210\233\345\273\272.png" | Bin 0 -> 43330 bytes .../311\345\233\276\345\210\233\345\273\2722.png" | Bin 0 -> 32918 bytes .../312\345\233\276\350\256\277\351\227\256.png" | Bin 0 -> 18052 bytes .../313\345\233\276\347\256\241\347\220\206.png" | Bin 0 -> 44390 bytes ...25\260\346\215\256\345\205\245\345\217\243.png" | Bin 0 -> 16958 bytes ...61\236\346\200\247\345\210\233\345\273\272.png" | Bin 0 -> 47486 bytes ...1\236\346\200\247\345\210\233\345\273\2722.png" | Bin 0 -> 44974 bytes ...61\236\346\200\247\345\244\215\347\224\250.png" | Bin 0 -> 45206 bytes ...1\236\346\200\247\345\244\215\347\224\2502.png" | Bin 0 -> 38322 bytes ...41\266\347\202\271\345\210\233\345\273\272.png" | Bin 0 -> 50443 bytes ...1\266\347\202\271\345\210\233\345\273\2722.png" | Bin 0 -> 218874 bytes ...41\266\347\202\271\345\210\240\351\231\244.png" | Bin 0 -> 51380 bytes .../3241\350\276\271\345\210\233\345\273\272.png" | Bin 0 -> 44222 bytes .../3241\350\276\271\345\210\233\345\273\2722.png" | Bin 0 -> 54431 bytes ...57\274\345\205\245\345\205\245\345\217\243.png" | Bin 0 -> 14972 bytes ...10\233\345\273\272\344\273\273\345\212\241.png" | Bin 0 -> 37103 bytes ...70\212\344\274\240\346\226\207\344\273\266.png" | Bin 0 -> 37049 bytes ...56\276\347\275\256\346\230\240\345\260\204.png" | Bin 0 -> 48435 bytes ...6\276\347\275\256\346\230\240\345\260\2042.png" | Bin 0 -> 41622 bytes ...57\274\345\205\245\350\256\276\347\275\256.png" | Bin 0 -> 34369 bytes ...57\274\345\205\245\350\257\246\346\203\205.png" | Bin 0 -> 89644 bytes ...57\274\345\205\245\346\265\201\347\250\213.png" | Bin 0 -> 15988 bytes ...10\206\346\236\220\345\205\245\345\217\243.png" | Bin 0 -> 20590 bytes ...44\232\345\233\276\345\210\207\346\215\242.png" | Bin 0 -> 39777 bytes ...3\345\233\276\345\210\206\346\236\220-json.png" | Bin 0 -> 32487 bytes ...3\276\345\210\206\346\236\220-\345\233\276.png" | Bin 0 -> 178218 bytes ...0\206\346\236\220-\350\241\250\346\240\274.png" | Bin 0 -> 22507 bytes ...67\257\345\276\204\346\237\245\350\257\242.png" | Bin 0 -> 127765 bytes ...26\260\345\242\236\351\241\266\347\202\271.png" | Bin 0 -> 136834 bytes ...6\260\345\242\236\351\241\266\347\202\2712.png" | Bin 0 -> 79370 bytes .../images-hubble/347\346\224\266\350\227\217.png" | Bin 0 -> 25531 bytes ...56\241\347\220\206\345\205\245\345\217\243.png" | Bin 0 -> 21133 bytes ...73\273\345\212\241\345\210\227\350\241\250.png" | Bin 0 -> 62502 bytes .../353gremlin\344\273\273\345\212\241.png" | Bin 0 -> 29797 bytes .../353gremlin\344\273\273\345\212\2412.png" | Bin 0 -> 40644 bytes ...73\273\345\212\241\350\257\246\346\203\205.png" | Bin 0 -> 20009 bytes ...31\244\345\205\203\346\225\260\346\215\256.png" | Bin 0 -> 45397 bytes ...36\204\345\273\272\347\264\242\345\274\225.png" | Bin 0 -> 75735 bytes .../docs/images/images-server/31docker-option.jpg | Bin 0 -> 202402 bytes .../images-server/swagger-ui-set-auth-example.png | Bin 0 -> 144877 bytes .../swagger-ui-where-set-auth-example.png | Bin 0 -> 62142 bytes static/docs/images/images-server/swagger-ui.png | Bin 0 -> 319057 bytes static/docs/images/images-studio/add-schema.png | Bin 0 -> 240595 bytes static/docs/images/images-studio/example-2V-1E.png | Bin 0 -> 160832 bytes static/docs/images/images-studio/home-page.png | Bin 0 -> 55603 bytes static/docs/images/images-studio/show-graph.png | Bin 0 -> 140693 bytes static/docs/images/images-studio/show-json.png | Bin 0 -> 205466 bytes static/docs/images/images-studio/show-table.png | Bin 0 -> 243473 bytes static/docs/images/kg-uml.png | Bin 0 -> 49357 bytes static/docs/images/logo.png | Bin 0 -> 1286 bytes static/docs/images/ojdbc8.png | Bin 0 -> 440550 bytes static/docs/images/oracle-download.png | Bin 0 -> 165421 bytes static/docs/images/toolchain-test-mermaid-1.png | Bin 0 -> 120324 bytes static/docs/images/toolchain-test-mermaid-2.png | Bin 0 -> 30642 bytes static/img/apache-logo.svg | 210 ++++++++++++++ static/img/featured-background.jpg | Bin 0 -> 1370737 bytes static/img/hugegraph-logo.svg | 1 + 147 files changed, 1593 insertions(+), 139 deletions(-) diff --git a/.github/workflows/docusaurus.yml b/.github/workflows/docusaurus.yml new file mode 100644 index 00000000..d3e7b12e --- /dev/null +++ b/.github/workflows/docusaurus.yml @@ -0,0 +1,45 @@ +# Build and deploy the Docusaurus documentation site. +name: "Deploy site to pages (docusaurus)" + +on: + pull_request: + push: + branches-ignore: + - asf-site + - gh-pages + +jobs: + deploy: + runs-on: ubuntu-latest + permissions: + contents: write + pages: write + id-token: write + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Setup Node + uses: actions/setup-node@v3 + with: + node-version: "20" + + - name: Install dependencies + run: npm install + + - name: Build Site + run: npm run build + + - name: Deploy Site + uses: peaceiris/actions-gh-pages@v3 + if: ${{ github.ref == 'refs/heads/master' }} + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + # Refer: https://github.com/marketplace/actions/github-pages-action + publish_dir: ./build + publish_branch: asf-site + keep_files: true # A simple way to keep ".asf.yaml" file + commit_message: ${{ github.event.head_commit.message }} diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml deleted file mode 100644 index 17a1e185..00000000 --- a/.github/workflows/hugo.yml +++ /dev/null @@ -1,58 +0,0 @@ -# Sample workflow for building and deploying a Hugo site to GitHub Pages -name: "Deploy site to pages (hugo)" - -on: - pull_request: - push: - branches: ["master"] # Set a branch name to trigger deployment - -jobs: - deploy: - runs-on: ubuntu-latest - permissions: - contents: write - pages: write - id-token: write - concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - # Hugo steps - steps: - - uses: actions/checkout@v3 - with: - submodules: true # Fetch Hugo themes (true OR recursive) - fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - - - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: "16" - - - name: Setup Hugo - uses: peaceiris/actions-hugo@v2 - with: - hugo-version: '0.102.3' - extended: true - - - uses: actions/cache@v3 - with: - path: /tmp/hugo_cache - key: ${{ runner.os }}-hugomod-${{ hashFiles('**/go.sum') }} - restore-keys: | - ${{ runner.os }}-hugomod- - - - name: Check Links - run: bash dist/validate-links.sh - - - name: Build Site (minify) - run: npm i && hugo --minify - - - name: Deploy Site - uses: peaceiris/actions-gh-pages@v3 - if: ${{ github.ref == 'refs/heads/master' }} - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - # Refer: https://github.com/marketplace/actions/github-pages-action - publish_dir: ./public - publish_branch: asf-site - keep_files: true # A simple way to keep ".asf.yaml" file - commit_message: ${{ github.event.head_commit.message }} diff --git a/.gitignore b/.gitignore index 86f2983b..6956c29f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ public/ +build/ +.docusaurus/ +artifacts/ resources/ node_modules/ package-lock.json diff --git a/README.md b/README.md index 8f19005b..fe4ddce5 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [](https://deepwiki.com/apache/hugegraph-doc) [](LICENSE) -[](https://gohugo.io/) +[](https://docusaurus.io/) --- @@ -16,7 +16,7 @@ For the HugeGraph database project, visit [apache/hugegraph](https://github.com/ Only **3 steps** to run the documentation website locally: -**Prerequisites:** [Hugo Extended](https://github.com/gohugoio/hugo/releases) v0.95+ and Node.js v16+ +**Prerequisites:** Node.js v18+ ```bash # 1. Clone repository @@ -27,13 +27,10 @@ cd hugegraph-doc npm install # 3. Start development server (auto-reload) -hugo server +npm run start ``` -Open http://localhost:1313 to preview. - -> **Troubleshooting:** If you see `TOCSS: failed to transform "scss/main.scss"`, -> install Hugo **Extended** version, not the standard version. +Open http://localhost:3000 to preview. ## Repository Structure @@ -51,11 +48,10 @@ hugegraph-doc/ │ │ └── community/ # Community pages │ └── en/ # 🇺🇸 English documentation (mirrors cn/ structure) │ -├── themes/docsy/ # 🎨 Docsy theme (git submodule) -├── assets/ # 🖼️ Custom assets (fonts, images, scss) -├── layouts/ # 📐 Hugo template overrides -├── static/ # 📁 Static files -├── config.toml # ⚙️ Site configuration +├── src/ # 🎨 Docusaurus pages, CSS, and helpers +├── static/ # 📁 Static files served from site root +├── docusaurus.config.js # ⚙️ Site configuration +├── sidebars*.js # 🧭 Documentation sidebar configuration └── package.json # 📦 Node.js dependencies ``` @@ -74,22 +70,23 @@ hugegraph-doc/ |-------------|-------------| | **Bilingual Updates** | Update **BOTH** `content/cn/` and `content/en/` | | **PR Screenshots** | Include **before/after screenshots** in PR | -| **Markdown** | Use Markdown with Hugo front matter | +| **Markdown** | Use Markdown with front matter | ### Detailed Guide See [contribution.md](./contribution.md) for: -- Platform-specific Hugo installation -- Docsy theme customization +- Local development setup +- Docusaurus theme customization - Translation tips ## Commands | Command | Description | |---------|-------------| -| `hugo server` | Start dev server (hot reload) | -| `hugo --minify` | Build production to `./public/` | -| `hugo server -p 8080` | Custom port | +| `npm run start` | Start dev server (hot reload) | +| `npm run build` | Build production site to `./build/` | +| `npm run serve` | Serve the production build locally | +| `npm run validate` | Build, check content inventory, and run headless UI validation | --- @@ -103,7 +100,7 @@ See [contribution.md](./contribution.md) for: 只需 **3 步**即可在本地启动文档网站: -**前置条件:** [Hugo Extended](https://github.com/gohugoio/hugo/releases) v0.95+ 和 Node.js v16+ +**前置条件:** Node.js v18+ ```bash # 1. 克隆仓库 @@ -114,13 +111,10 @@ cd hugegraph-doc npm install # 3. 启动开发服务器(支持热重载) -hugo server +npm run start ``` -打开 http://localhost:1313 预览网站。 - -> **常见问题:** 如果遇到 `TOCSS: failed to transform "scss/main.scss"` 错误, -> 说明你需要安装 Hugo **Extended** 版本,而不是标准版本。 +打开 http://localhost:3000 预览网站。 ### 仓库结构 @@ -138,11 +132,10 @@ hugegraph-doc/ │ │ └── community/ # 社区页面 │ └── en/ # 🇺🇸 英文文档(与 cn/ 结构一致) │ -├── themes/docsy/ # 🎨 Docsy 主题 (git submodule) -├── assets/ # 🖼️ 自定义资源 (fonts, images, scss) -├── layouts/ # 📐 Hugo 模板覆盖 -├── static/ # 📁 静态文件 -├── config.toml # ⚙️ 站点配置 +├── src/ # 🎨 Docusaurus 页面、样式和辅助脚本 +├── static/ # 📁 站点根路径静态文件 +├── docusaurus.config.js # ⚙️ 站点配置 +├── sidebars*.js # 🧭 文档侧边栏配置 └── package.json # 📦 Node.js 依赖 ``` @@ -161,22 +154,23 @@ hugegraph-doc/ |------|------| | **双语更新** | 修改内容时需**同时更新** `content/cn/` 和 `content/en/` | | **PR 截图** | 提交 PR 时需附上修改**前后对比截图** | -| **Markdown** | 文档使用 Markdown 格式,带 Hugo front matter | +| **Markdown** | 文档使用 Markdown 格式,带 front matter | #### 详细指南 查看 [contribution.md](./contribution.md) 了解: -- 各平台 Hugo 安装方法 -- Docsy 主题定制 +- 本地开发环境配置 +- Docusaurus 主题定制 - 翻译技巧 ### 常用命令 | 命令 | 说明 | |------|------| -| `hugo server` | 启动开发服务器(热重载) | -| `hugo --minify` | 构建生产版本到 `./public/` | -| `hugo server -p 8080` | 指定端口 | +| `npm run start` | 启动开发服务器(热重载) | +| `npm run build` | 构建生产版本到 `./build/` | +| `npm run serve` | 本地预览生产构建 | +| `npm run validate` | 构建、检查内容清单并运行无头 UI 校验 | --- diff --git a/content/cn/docs/clients/restful-api/_index.md b/content/cn/docs/clients/restful-api/_index.md index 67097fa5..16ff54de 100644 --- a/content/cn/docs/clients/restful-api/_index.md +++ b/content/cn/docs/clients/restful-api/_index.md @@ -11,7 +11,7 @@ weight: 1 > - 默认图空间名称为 `DEFAULT`,可直接使用 > - 旧版本 doc 参考:[HugeGraph 1.5.x RESTful > API](https://github.com/apache/hugegraph-doc/tree/release-1.5.0) -除了下方的文档,你还可以通过 `localhost:8080/swagger-ui/index.html` 访问 `swagger-ui` 以查看 `RESTful API`。[示例可以参考此处](/cn/docs/quickstart/hugegraph/hugegraph-server#swaggerui-example) +除了下方的文档,你还可以通过 `localhost:8080/swagger-ui/index.html` 访问 `swagger-ui` 以查看 `RESTful API`。[示例可以参考此处](/cn/docs/quickstart/hugegraph/hugegraph-server/#62-请求-server) [comment]: <> (- Graph Schema) diff --git a/content/cn/docs/clients/restful-api/auth.md b/content/cn/docs/clients/restful-api/auth.md index ffcc7b92..c2713800 100644 --- a/content/cn/docs/clients/restful-api/auth.md +++ b/content/cn/docs/clients/restful-api/auth.md @@ -1049,7 +1049,7 @@ GET http://localhost:8080/graphspaces/DEFAULT/auth/accesses/S-69:all>-88>11>S-77 ### 10.7 图空间管理员(Manager)API -**重要提示**:在使用以下 API 之前,需要先创建图空间(graphspace)。请参考 [Graphspace API](./graphspace) 创建名为 `gs1` 的图空间。文档中的示例均假设已存在名为 `gs1` 的图空间 +**重要提示**:在使用以下 API 之前,需要先创建图空间(graphspace)。请参考 [Graphspace API](/cn/docs/clients/restful-api/graphspace/) 创建名为 `gs1` 的图空间。文档中的示例均假设已存在名为 `gs1` 的图空间 1. 图空间管理员 API 用于在 graphspace 维度给用户授予/回收管理员角色,并查询当前用户或其他用户在该 graphspace 下的角色信息。角色类型可取 `SPACE`、`SPACE_MEMBER`、`ADMIN` 。 diff --git a/content/cn/docs/clients/restful-api/edgelabel.md b/content/cn/docs/clients/restful-api/edgelabel.md index 33f1ad54..e0bf3815 100644 --- a/content/cn/docs/clients/restful-api/edgelabel.md +++ b/content/cn/docs/clients/restful-api/edgelabel.md @@ -311,4 +311,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelab 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/graphs.md b/content/cn/docs/clients/restful-api/graphs.md index 560efc61..5f2d94ea 100644 --- a/content/cn/docs/clients/restful-api/graphs.md +++ b/content/cn/docs/clients/restful-api/graphs.md @@ -175,7 +175,7 @@ POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph-xx **注意**!! 1. 在 1.7.0 版本中,动态创建图会导致 NPE 错误。该问题已在 [PR#2912](https://github.com/apache/hugegraph/pull/2912) 中修复。当前 master 版本和 1.7.0 之前的版本不受此问题影响。 -2. 1.7.0 及之前版本,如果 backend 是 hstore,必须在请求体加上 "task.scheduler_type": "distributed"。同时请确保 HugeGraph-Server 已正确配置 PD,参见 [HStore 配置](/cn/docs/quickstart/hugegraph/hugegraph-server/#511-分布式存储hstore)。 +2. 1.7.0 及之前版本,如果 backend 是 hstore,必须在请求体加上 "task.scheduler_type": "distributed"。同时请确保 HugeGraph-Server 已正确配置 PD,参见 [HStore 配置](/cn/docs/quickstart/hugegraph/hugegraph-server/#511-分布式存储-hstore)。 **RocksDB 示例:** @@ -508,4 +508,4 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/compact "local": "OK" } } -``` \ No newline at end of file +``` diff --git a/content/cn/docs/clients/restful-api/gremlin.md b/content/cn/docs/clients/restful-api/gremlin.md index 52642f56..ccf063be 100644 --- a/content/cn/docs/clients/restful-api/gremlin.md +++ b/content/cn/docs/clients/restful-api/gremlin.md @@ -234,7 +234,7 @@ POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/gremlin 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) **查询边** @@ -265,4 +265,4 @@ POST http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/gremlin 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/indexlabel.md b/content/cn/docs/clients/restful-api/indexlabel.md index 0a51d23f..9975258f 100644 --- a/content/cn/docs/clients/restful-api/indexlabel.md +++ b/content/cn/docs/clients/restful-api/indexlabel.md @@ -174,4 +174,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexla 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/rebuild.md b/content/cn/docs/clients/restful-api/rebuild.md index db6281ac..bdde3b49 100644 --- a/content/cn/docs/clients/restful-api/rebuild.md +++ b/content/cn/docs/clients/restful-api/rebuild.md @@ -31,7 +31,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/inde 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) #### 1.6.2 VertexLabel 对应的全部索引重建 @@ -57,7 +57,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/vert 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2`(其中"2"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) #### 1.6.3 EdgeLabel 对应的全部索引重建 @@ -83,4 +83,4 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/edge 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/3`(其中"3"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/3`(其中"3"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/clients/restful-api/vertexlabel.md b/content/cn/docs/clients/restful-api/vertexlabel.md index 9d15589f..2f8033f1 100644 --- a/content/cn/docs/clients/restful-api/vertexlabel.md +++ b/content/cn/docs/clients/restful-api/vertexlabel.md @@ -308,4 +308,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexl 注: -> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](./task) +> 可以通过`GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1`(其中"1"是 task_id)来查询异步任务的执行状态,更多[异步任务 RESTful API](/cn/docs/clients/restful-api/task/) diff --git a/content/cn/docs/config/config-guide.md b/content/cn/docs/config/config-guide.md index fed7ba85..0871474f 100644 --- a/content/cn/docs/config/config-guide.md +++ b/content/cn/docs/config/config-guide.md @@ -138,7 +138,7 @@ ssl: { - graphs:GremlinServer 启动时需要打开的图,该项是一个 map 结构,key 是图的名字,value 是该图的配置文件路径; - channelizer:GremlinServer 与客户端有两种通信方式,分别是 WebSocket 和 HTTP(默认)。如果选择 WebSocket, -用户可以通过 [Gremlin-Console](../clients/gremlin-console) 快速体验 HugeGraph 的特性,但是不支持大规模数据导入, +用户可以通过 [Gremlin-Console](/cn/docs/clients/gremlin-console/) 快速体验 HugeGraph 的特性,但是不支持大规模数据导入, 推荐使用 HTTP 的通信方式,HugeGraph 的外围组件都是基于 HTTP 实现的; 默认 GremlinServer 是服务在 localhost:8182,如果需要修改,配置 host、port 即可 @@ -146,7 +146,7 @@ ssl: { - host:部署 GremlinServer 机器的机器名或 IP,目前 HugeGraphServer 不支持分布式部署,且 GremlinServer 不直接暴露给用户; - port:部署 GremlinServer 机器的端口; -同时需要在 rest-server.properties 中增加对应的配置项 gremlinserver.url=http://host:port +同时需要在 rest-server.properties 中增加对应的配置项 `gremlinserver.url=http://host:port` ### 3 rest-server.properties @@ -215,7 +215,7 @@ memory_monitor.period=2000 > 注意:gremlin-server.yaml 和 rest-server.properties 都包含 graphs 配置项,而 > `init-store` 命令是根据 gremlin-server.yaml 的 graphs 下的图进行初始化的。 -> 配置项 gremlinserver.url 是 GremlinServer 为 RestServer 提供服务的 url,该配置项默认为 http://localhost:8182,如需修改,需要和 gremlin-server.yaml 中的 host 和 port 相匹配; +> 配置项 gremlinserver.url 是 GremlinServer 为 RestServer 提供服务的 url,该配置项默认为 `http://localhost:8182`,如需修改,需要和 gremlin-server.yaml 中的 host 和 port 相匹配; ### 4 hugegraph.properties diff --git a/content/cn/docs/quickstart/hugegraph/hugegraph-server.md b/content/cn/docs/quickstart/hugegraph/hugegraph-server.md index 2be45ba4..5257bc01 100644 --- a/content/cn/docs/quickstart/hugegraph/hugegraph-server.md +++ b/content/cn/docs/quickstart/hugegraph/hugegraph-server.md @@ -371,7 +371,7 @@ Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)....OK 提示的 url 与 `rest-server.properties` 中配置的 `restserver.url` 一致 -**ToplingDB (Beta)**: 作为 RocksDB 的高性能替代方案,配置方式请参考: [ToplingDB Quick Start]({{< ref path="/blog/hugegraph/toplingdb/toplingdb-quick-start.md" lang="cn">}}) +**ToplingDB (Beta)**: 作为 RocksDB 的高性能替代方案,配置方式请参考: [ToplingDB Quick Start](/cn/blog/2025/10/09/toplingdb-quick-start/) </details> diff --git a/content/en/community/_index.md b/content/en/community/_index.md index 1ae39a24..60332c9b 100644 --- a/content/en/community/_index.md +++ b/content/en/community/_index.md @@ -5,4 +5,4 @@ menu: weight: 40 --- -Visit the [Project Maturity]({{< relref "maturity" >}}) assessment. +Visit the [Project Maturity](/community/maturity/) assessment. diff --git a/content/en/docs/clients/restful-api/_index.md b/content/en/docs/clients/restful-api/_index.md index c5158247..2410b6ee 100644 --- a/content/en/docs/clients/restful-api/_index.md +++ b/content/en/docs/clients/restful-api/_index.md @@ -12,7 +12,7 @@ weight: 1 > - **Note**: Before version 1.5.0, the format of ids such as group/target was > similar to -69:grant. After version 1.7.0, the id and name were consistent, > such as admin [HugeGraph 1.5.x RESTful > API](https://github.com/apache/hugegraph-doc/tree/release-1.5.0) -Besides the documentation below, you can also open `swagger-ui` at `localhost:8080/swagger-ui/index.html` to explore the RESTful API. [Here is an example](/docs/quickstart/hugegraph/hugegraph-server#swaggerui-example) +Besides the documentation below, you can also open `swagger-ui` at `localhost:8080/swagger-ui/index.html` to explore the RESTful API. [Here is an example](/docs/quickstart/hugegraph/hugegraph-server/#62-request-server) [comment]: <> (- Graph Schema) diff --git a/content/en/docs/clients/restful-api/auth.md b/content/en/docs/clients/restful-api/auth.md index a3af6339..41651db3 100644 --- a/content/en/docs/clients/restful-api/auth.md +++ b/content/en/docs/clients/restful-api/auth.md @@ -1049,7 +1049,7 @@ GET http://localhost:8080/graphspaces/DEFAULT/auth/accesses/S-69:all>-88>11>S-77 ### 10.7 Graphspace Manager (Manager) API -> **Note**: Before using the following APIs, you need to create a graphspace first. For example, create a graphspace named `gs1` via the [Graphspace API](./graphspace). The examples below assume that `gs1` already exists. +> **Note**: Before using the following APIs, you need to create a graphspace first. For example, create a graphspace named `gs1` via the [Graphspace API](/docs/clients/restful-api/graphspace/). The examples below assume that `gs1` already exists. 1. The graphspace manager API is used to grant/revoke manager roles for users at the graphspace level, and to query the roles of the current user or other users in a graphspace. Supported role types include `SPACE`, `SPACE_MEMBER`, and `ADMIN`. diff --git a/content/en/docs/clients/restful-api/edgelabel.md b/content/en/docs/clients/restful-api/edgelabel.md index a452ec5e..a8fe4df9 100644 --- a/content/en/docs/clients/restful-api/edgelabel.md +++ b/content/en/docs/clients/restful-api/edgelabel.md @@ -311,4 +311,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/edgelab Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/clients/restful-api/gremlin.md b/content/en/docs/clients/restful-api/gremlin.md index 3b348e7c..4454b033 100644 --- a/content/en/docs/clients/restful-api/gremlin.md +++ b/content/en/docs/clients/restful-api/gremlin.md @@ -230,7 +230,7 @@ Note: Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). **Querying edges** @@ -261,4 +261,4 @@ Note: Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2` (where "2" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/2` (where "2" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/clients/restful-api/indexlabel.md b/content/en/docs/clients/restful-api/indexlabel.md index d56c156a..c419e91d 100644 --- a/content/en/docs/clients/restful-api/indexlabel.md +++ b/content/en/docs/clients/restful-api/indexlabel.md @@ -174,4 +174,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/indexla Note: -> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can query the execution status of an asynchronous task by using `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id). For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/clients/restful-api/rebuild.md b/content/en/docs/clients/restful-api/rebuild.md index ef76d6e4..6cb7d6e2 100644 --- a/content/en/docs/clients/restful-api/rebuild.md +++ b/content/en/docs/clients/restful-api/rebuild.md @@ -30,7 +30,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/inde ``` Note: -> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 1). See More [AsyncJob RESTfull API](./task) +> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 1). See More [AsyncJob RESTfull API](/docs/clients/restful-api/task/) #### 1.6.2 Rebulid all Indexs of VertexLabel @@ -56,7 +56,7 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/vert Note: -> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 2). See More [AsyncJob RESTfull API](./task) +> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 2). See More [AsyncJob RESTfull API](/docs/clients/restful-api/task/) #### 1.6.3 Rebulid all Indexs of EdgeLabel @@ -82,4 +82,4 @@ PUT http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/jobs/rebuild/edge Note: -> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 3). See More [AsyncJob RESTfull API](./task) \ No newline at end of file +> You can get the asynchronous job status by `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/${task_id}` (the task_id here should be 3). See More [AsyncJob RESTfull API](/docs/clients/restful-api/task/) \ No newline at end of file diff --git a/content/en/docs/clients/restful-api/vertexlabel.md b/content/en/docs/clients/restful-api/vertexlabel.md index 6e6388a7..493e3ce6 100644 --- a/content/en/docs/clients/restful-api/vertexlabel.md +++ b/content/en/docs/clients/restful-api/vertexlabel.md @@ -308,4 +308,4 @@ DELETE http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/schema/vertexl Note: -> You can use `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id) to query the execution status of the asynchronous task. For more information, refer to the [Asynchronous Task RESTful API](./task). +> You can use `GET http://localhost:8080/graphspaces/DEFAULT/graphs/hugegraph/tasks/1` (where "1" is the task_id) to query the execution status of the asynchronous task. For more information, refer to the [Asynchronous Task RESTful API](/docs/clients/restful-api/task/). diff --git a/content/en/docs/config/config-guide.md b/content/en/docs/config/config-guide.md index 8d5c3699..aef5ca09 100644 --- a/content/en/docs/config/config-guide.md +++ b/content/en/docs/config/config-guide.md @@ -137,7 +137,7 @@ ssl: { There are many configuration options mentioned above, but for now, let's focus on the following options: `channelizer` and `graphs`. - `graphs`: This option specifies the graphs that need to be opened when the GremlinServer starts. It is a map structure where the key is the name of the graph and the value is the configuration file path for that graph. -- `channelizer`: The GremlinServer supports two communication modes with clients: WebSocket and HTTP (default). If WebSocket is chosen, users can quickly experience the features of HugeGraph using [Gremlin-Console](../clients/gremlin-console), but it does not support importing large-scale data. It is recommended to use HTTP for communication, as all peripheral components of HugeGraph are implemented based on HTTP. +- `channelizer`: The GremlinServer supports two communication modes with clients: WebSocket and HTTP (default). If WebSocket is chosen, users can quickly experience the features of HugeGraph using [Gremlin-Console](/docs/clients/gremlin-console/), but it does not support importing large-scale data. It is recommended to use HTTP for communication, as all peripheral components of HugeGraph are implemented based on HTTP. By default, the GremlinServer serves at `localhost:8182`. If you need to modify it, configure the `host` and `port` settings. diff --git a/content/en/docs/quickstart/hugegraph/hugegraph-server.md b/content/en/docs/quickstart/hugegraph/hugegraph-server.md index 4197acbb..8dd2539a 100644 --- a/content/en/docs/quickstart/hugegraph/hugegraph-server.md +++ b/content/en/docs/quickstart/hugegraph/hugegraph-server.md @@ -406,7 +406,7 @@ Starting HugeGraphServer... Connecting to HugeGraphServer (http://127.0.0.1:8080/graphs)....OK ``` -**ToplingDB (Beta)**: As a high-performance alternative to RocksDB, please refer to the configuration guide: [ToplingDB Quick Start]({{< ref path="/blog/hugegraph/toplingdb/toplingdb-quick-start.md" lang="en">}}) +**ToplingDB (Beta)**: As a high-performance alternative to RocksDB, please refer to the configuration guide: [ToplingDB Quick Start](/blog/2025/10/09/toplingdb-quick-start/) </details> diff --git a/docusaurus.config.js b/docusaurus.config.js new file mode 100644 index 00000000..96b57f7d --- /dev/null +++ b/docusaurus.config.js @@ -0,0 +1,223 @@ +const hugoFrontMatter = require('./src/markdown/frontMatter'); + +const apacheLinks = [ + {label: 'Foundation', href: 'https://www.apache.org/'}, + {label: 'License', href: 'https://www.apache.org/licenses/'}, + {label: 'Events', href: 'https://www.apache.org/events/current-event.html'}, + {label: 'Privacy', href: 'https://privacy.apache.org/policies/privacy-policy-public.html'}, + {label: 'Security', href: 'https://www.apache.org/security/'}, + {label: 'Sponsorship', href: 'https://www.apache.org/foundation/sponsorship.html'}, + {label: 'Thanks', href: 'https://www.apache.org/foundation/thanks.html'}, + {label: 'Code of Conduct', href: 'https://www.apache.org/foundation/policies/conduct.html'}, +]; + +const docsExclude = ['**/_*/**', '**/SUMMARY.md', '**/*.test.{js,jsx,ts,tsx}', '**/__tests__/**']; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Apache HugeGraph', + tagline: 'A full-stack graph database ecosystem for OLTP, OLAP, and AI', + favicon: 'img/hugegraph-logo.svg', + + url: 'https://hugegraph.apache.org', + baseUrl: '/', + organizationName: 'apache', + projectName: 'hugegraph-doc', + trailingSlash: true, + + onBrokenLinks: 'throw', + onBrokenAnchors: 'throw', + onDuplicateRoutes: 'throw', + + markdown: { + format: 'md', + mermaid: true, + parseFrontMatter: hugoFrontMatter, + hooks: { + onBrokenMarkdownLinks: 'throw', + onBrokenMarkdownImages: 'throw', + }, + }, + + i18n: { + defaultLocale: 'en', + locales: ['en'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + path: 'content/en/docs', + routeBasePath: 'docs', + sidebarPath: require.resolve('./sidebars.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + blog: { + path: 'content/en/blog', + routeBasePath: 'blog', + include: ['**/*.md', '**/*.mdx'], + exclude: ['**/_index.md'], + blogSidebarTitle: 'All posts', + blogSidebarCount: 'ALL', + showReadingTime: true, + onUntruncatedBlogPosts: 'ignore', + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + }, + pages: { + path: 'src/pages', + }, + theme: { + customCss: require.resolve('./src/css/custom.css'), + }, + }), + ], + ], + + plugins: [ + [ + '@docusaurus/plugin-content-docs', + { + id: 'docs-cn', + path: 'content/cn/docs', + routeBasePath: 'cn/docs', + sidebarPath: require.resolve('./sidebars-cn.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + '@docusaurus/plugin-content-docs', + { + id: 'community', + path: 'content/en/community', + routeBasePath: 'community', + sidebarPath: require.resolve('./sidebars-community.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + '@docusaurus/plugin-content-docs', + { + id: 'community-cn', + path: 'content/cn/community', + routeBasePath: 'cn/community', + sidebarPath: require.resolve('./sidebars-community-cn.js'), + exclude: docsExclude, + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + showLastUpdateAuthor: false, + showLastUpdateTime: false, + }, + ], + [ + '@docusaurus/plugin-content-blog', + { + id: 'blog-cn', + path: 'content/cn/blog', + routeBasePath: 'cn/blog', + include: ['**/*.md', '**/*.mdx'], + exclude: ['**/_index.md'], + blogSidebarTitle: '所有文章', + blogSidebarCount: 'ALL', + showReadingTime: true, + onUntruncatedBlogPosts: 'ignore', + editUrl: 'https://github.com/apache/hugegraph-doc/edit/master/', + }, + ], + ], + + themes: ['@docusaurus/theme-mermaid'], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + colorMode: { + defaultMode: 'light', + respectPrefersColorScheme: true, + }, + navbar: { + title: 'Apache HugeGraph', + logo: { + alt: 'Apache HugeGraph logo', + src: 'img/hugegraph-logo.svg', + }, + items: [ + {to: '/docs/', label: 'Docs', position: 'left'}, + {to: '/blog/', label: 'Blog', position: 'left'}, + {to: '/community/', label: 'Community', position: 'left'}, + {to: '/docs/download/download/', label: 'Download', position: 'left'}, + { + label: 'ASF', + position: 'right', + items: apacheLinks, + }, + { + label: 'Language', + position: 'right', + className: 'navbar-language-dropdown', + items: [ + {label: 'English', to: '/'}, + {label: '中文', to: '/cn/'}, + ], + }, + { + href: 'https://github.com/apache/hugegraph', + label: 'GitHub', + position: 'right', + }, + ], + }, + footer: { + style: 'dark', + logo: { + alt: 'Apache Software Foundation logo', + src: 'img/apache-logo.svg', + href: 'https://www.apache.org/', + width: 220, + }, + links: [ + { + title: 'Project', + items: [ + {label: 'Documentation', to: '/docs/'}, + {label: 'Download', to: '/docs/download/download/'}, + {label: 'GitHub', href: 'https://github.com/apache/hugegraph'}, + {label: 'Issue Tracker', href: 'https://github.com/apache/hugegraph/issues'}, + ], + }, + { + title: 'Community', + items: [ + {label: 'Community', to: '/community/'}, + {label: 'Mailing List', href: 'mailto:[email protected]'}, + {label: 'ASF Slack', href: 'https://the-asf.slack.com/archives/C059UU2FJ23'}, + ], + }, + { + title: 'ASF', + items: apacheLinks, + }, + ], + copyright: `Copyright © ${new Date().getFullYear()} The Apache Software Foundation. Licensed under the Apache License, Version 2.0. Apache HugeGraph, HugeGraph, Apache, the Apache feather logo, and the Apache HugeGraph project logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.`, + }, + prism: { + additionalLanguages: ['bash', 'java', 'json', 'python', 'yaml'], + }, + tableOfContents: { + minHeadingLevel: 2, + maxHeadingLevel: 4, + }, + }), +}; + +module.exports = config; diff --git a/netlify.toml b/netlify.toml index 0e94ebab..2aaab7d6 100644 --- a/netlify.toml +++ b/netlify.toml @@ -1,3 +1,6 @@ [build] +command = "npm run build" +publish = "build" + [build.environment] -HUGO_VERSION = "0.88.1" +NODE_VERSION = "20" diff --git a/package.json b/package.json index 4b562815..d280f076 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,41 @@ { - "name": "tech-doc-hugo", - "version": "0.0.1", - "description": "Hugo theme for technical documentation.", - "main": "none.js", + "name": "apache-hugegraph-doc", + "version": "0.0.0", + "private": true, + "description": "Apache HugeGraph documentation website built with Docusaurus.", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "start": "docusaurus start --host 0.0.0.0", + "build": "docusaurus build", + "serve": "docusaurus serve --host 0.0.0.0", + "clear": "docusaurus clear", + "playwright:install": "playwright install chromium", + "validate:content": "node scripts/validate-content-inventory.js", + "validate:build": "npm run build && node scripts/validate-build.js && npm run validate:content", + "validate:ui": "node scripts/validate-ui.js", + "validate": "npm run validate:build && npm run validate:ui" }, "repository": { "type": "git", - "url": "git+https://github.com/google/docsy-example.git" + "url": "git+https://github.com/apache/hugegraph-doc.git" }, - "author": "", - "license": "ISC", + "license": "Apache-2.0", "bugs": { - "url": "https://github.com/google/docsy-example/issues" - }, - "homepage": "https://github.com/google/docsy-example#readme", - "devDependencies": { - "autoprefixer": "^10.4.0", - "postcss": "^8.3.7", - "postcss-cli": "^9.0.2" + "url": "https://github.com/apache/hugegraph-doc/issues" }, + "homepage": "https://hugegraph.apache.org/", "dependencies": { - "mermaid": "^10.9.5" + "@docusaurus/core": "3.10.1", + "@docusaurus/preset-classic": "3.10.1", + "@docusaurus/theme-mermaid": "3.10.1", + "@mermaid-js/layout-elk": "0.1.9", + "@mdx-js/react": "3.1.1", + "clsx": "2.1.1", + "mermaid": "11.10.1", + "prism-react-renderer": "2.4.1", + "react": "18.3.1", + "react-dom": "18.3.1" + }, + "devDependencies": { + "@playwright/test": "^1.52.0" } } diff --git a/scripts/validate-build.js b/scripts/validate-build.js new file mode 100644 index 00000000..473cf8dc --- /dev/null +++ b/scripts/validate-build.js @@ -0,0 +1,38 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); + +const repoRoot = path.resolve(__dirname, '..'); +const buildDir = path.join(repoRoot, 'build'); + +const expectedPages = [ + ['homepage', 'index.html', 'Apache HugeGraph'], + ['docs landing', 'docs/index.html', 'Apache HugeGraph Documentation'], + ['English deep docs page', 'docs/quickstart/hugegraph/hugegraph-server/index.html', 'HugeGraph-Server'], + ['Chinese docs landing', 'cn/docs/index.html', 'Apache HugeGraph 文档'], + ['Chinese deep docs page', 'cn/docs/quickstart/hugegraph/hugegraph-server/index.html', 'HugeGraph-Server'], + ['English blog', 'blog/index.html', 'Blog'], + ['Chinese blog', 'cn/blog/index.html', 'Blog'], + ['community', 'community/index.html', 'Community'], + ['community maturity', 'community/maturity/index.html', 'Apache Maturity Model'], +]; + +for (const [label, relPath, text] of expectedPages) { + const file = path.join(buildDir, relPath); + if (!fs.existsSync(file)) { + throw new Error(`Missing ${label}: ${relPath}`); + } + const html = fs.readFileSync(file, 'utf8'); + if (!html.includes(text)) { + throw new Error(`Expected ${label} to contain "${text}"`); + } +} + +const homepage = fs.readFileSync(path.join(buildDir, 'index.html'), 'utf8'); +for (const label of ['Foundation', 'License', 'Events', 'Privacy', 'Security', 'Sponsorship', 'Thanks', 'Code of Conduct']) { + if (!homepage.includes(label)) { + throw new Error(`Homepage is missing ASF menu label: ${label}`); + } +} + +console.log(`Build content OK: ${expectedPages.length} representative pages found.`); diff --git a/scripts/validate-content-inventory.js b/scripts/validate-content-inventory.js new file mode 100644 index 00000000..1969aa6f --- /dev/null +++ b/scripts/validate-content-inventory.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); +const {execFileSync} = require('child_process'); + +const repoRoot = path.resolve(__dirname, '..'); +const artifactDir = path.join(repoRoot, 'artifacts', 'validation'); + +function gitFiles() { + return execFileSync('git', ['ls-files', '*.md', '*.mdx'], { + cwd: repoRoot, + encoding: 'utf8', + }) + .trim() + .split('\n') + .filter(Boolean) + .sort(); +} + +function exists(relPath) { + return fs.existsSync(path.join(repoRoot, relPath)); +} + +fs.mkdirSync(artifactDir, {recursive: true}); + +const before = gitFiles(); +const missing = before.filter((file) => !exists(file)); + +const after = before.filter(exists); +fs.writeFileSync(path.join(artifactDir, 'md-inventory-before.txt'), `${before.join('\n')}\n`); +fs.writeFileSync(path.join(artifactDir, 'md-inventory-after.txt'), `${after.join('\n')}\n`); +fs.writeFileSync(path.join(artifactDir, 'md-inventory-missing.json'), `${JSON.stringify(missing, null, 2)}\n`); + +if (missing.length > 0) { + console.error(`Missing Markdown/MDX files:\n${missing.join('\n')}`); + process.exit(1); +} + +console.log(`Markdown inventory OK: ${before.length} original tracked .md/.mdx files still exist.`); +console.log(`Inventory artifacts: ${path.relative(repoRoot, artifactDir)}`); diff --git a/scripts/validate-ui.js b/scripts/validate-ui.js new file mode 100644 index 00000000..f68e663d --- /dev/null +++ b/scripts/validate-ui.js @@ -0,0 +1,157 @@ +#!/usr/bin/env node +const fs = require('fs'); +const path = require('path'); +const {spawn, spawnSync} = require('child_process'); +const {chromium} = require('playwright'); + +const repoRoot = path.resolve(__dirname, '..'); +const buildDir = path.join(repoRoot, 'build'); +const artifactDir = path.join(repoRoot, 'artifacts', 'playwright'); +const port = Number(process.env.DOCUSAURUS_TEST_PORT || 4173); +const baseUrl = `http://127.0.0.1:${port}`; + +function ensureBuild() { + if (fs.existsSync(path.join(buildDir, 'index.html'))) { + return; + } + const result = spawnSync('npm', ['run', 'build'], {cwd: repoRoot, stdio: 'inherit'}); + if (result.status !== 0) { + process.exit(result.status || 1); + } +} + +async function waitForServer(server) { + const deadline = Date.now() + 30000; + while (Date.now() < deadline) { + if (server.exitCode !== null) { + throw new Error(`Docusaurus server exited with code ${server.exitCode}`); + } + try { + const response = await fetch(baseUrl); + if (response.ok) { + return; + } + } catch { + await new Promise((resolve) => setTimeout(resolve, 250)); + } + } + throw new Error('Timed out waiting for Docusaurus test server'); +} + +async function expectVisible(locator, label) { + try { + await locator.first().waitFor({state: 'visible', timeout: 5000}); + } catch { + throw new Error(`${label} is not visible`); + } +} + +async function assertShell(page) { + await page.goto(`${baseUrl}/`, {waitUntil: 'networkidle'}); + await expectVisible(page.locator('nav.navbar'), 'top navigation'); + + const asfDropdown = page.locator('.navbar__item.dropdown', {hasText: 'ASF'}).first(); + await asfDropdown.hover(); + await page.waitForTimeout(200); + const asfText = await asfDropdown.textContent(); + for (const label of ['Foundation', 'License', 'Events', 'Privacy', 'Security', 'Sponsorship', 'Thanks', 'Code of Conduct']) { + if (!asfText.includes(label)) { + throw new Error(`ASF dropdown is missing ${label}`); + } + } + + const footer = page.locator('footer.footer'); + await footer.scrollIntoViewIfNeeded(); + await expectVisible(footer.locator('img[alt*="Apache Software Foundation"]'), 'Apache/ASF footer logo'); + const footerText = await footer.textContent(); + for (const text of ['Copyright', 'Apache License, Version 2.0', 'trademarks', 'The Apache Software Foundation']) { + if (!footerText.includes(text)) { + throw new Error(`Footer is missing "${text}"`); + } + } +} + +async function assertDocs(page) { + await page.goto(`${baseUrl}/docs/quickstart/hugegraph/hugegraph-server/`, {waitUntil: 'networkidle'}); + const sidebar = page.locator('aside.theme-doc-sidebar-container'); + await expectVisible(sidebar, 'docs sidebar'); + const quickStart = sidebar.getByText('Quick Start').first(); + await expectVisible(quickStart, 'docs sidebar Quick Start item'); +} + +async function assertMobileMenu(page) { + await page.setViewportSize({width: 390, height: 844}); + await page.goto(`${baseUrl}/`, {waitUntil: 'networkidle'}); + await page.locator('.navbar__toggle').click(); + const sidebar = page.locator('.navbar-sidebar'); + await expectVisible(sidebar, 'mobile navbar sidebar'); + const text = await sidebar.textContent(); + for (const label of ['Docs', 'Blog', 'Community', 'ASF']) { + if (!text.includes(label)) { + throw new Error(`Mobile menu is missing ${label}`); + } + } +} + +async function captureScreenshots(page) { + fs.mkdirSync(artifactDir, {recursive: true}); + const viewports = [ + ['desktop', {width: 1440, height: 900}], + ['mobile', {width: 390, height: 844}], + ]; + const pages = [ + ['homepage', '/'], + ['docs-landing', '/docs/'], + ['deep-docs', '/docs/quickstart/hugegraph/hugegraph-server/'], + ]; + + for (const [viewportName, viewport] of viewports) { + await page.setViewportSize(viewport); + for (const [name, route] of pages) { + await page.goto(`${baseUrl}${route}`, {waitUntil: 'networkidle'}); + await page.screenshot({ + path: path.join(artifactDir, `${name}-${viewportName}.png`), + fullPage: false, + }); + } + + await page.goto(`${baseUrl}/`, {waitUntil: 'networkidle'}); + await page.locator('footer.footer').scrollIntoViewIfNeeded(); + await page.screenshot({ + path: path.join(artifactDir, `footer-${viewportName}.png`), + fullPage: false, + }); + } +} + +async function main() { + ensureBuild(); + + const bin = path.join(repoRoot, 'node_modules', '.bin', 'docusaurus'); + const server = spawn(bin, ['serve', '--host', '127.0.0.1', '--port', String(port)], { + cwd: repoRoot, + stdio: ['ignore', 'pipe', 'pipe'], + }); + server.stdout.on('data', (data) => process.stdout.write(data)); + server.stderr.on('data', (data) => process.stderr.write(data)); + + try { + await waitForServer(server); + const browser = await chromium.launch(); + const page = await browser.newPage({viewport: {width: 1440, height: 900}}); + await assertShell(page); + await assertDocs(page); + await assertMobileMenu(page); + await captureScreenshots(page); + await browser.close(); + } finally { + server.kill('SIGTERM'); + } + + console.log(`UI validation OK. Screenshots: ${path.relative(repoRoot, artifactDir)}`); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/sidebars-cn.js b/sidebars-cn.js new file mode 100644 index 00000000..aa388017 --- /dev/null +++ b/sidebars-cn.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/cn/docs'), +}; diff --git a/sidebars-community-cn.js b/sidebars-community-cn.js new file mode 100644 index 00000000..4186b9c3 --- /dev/null +++ b/sidebars-community-cn.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/cn/community'), +}; diff --git a/sidebars-community.js b/sidebars-community.js new file mode 100644 index 00000000..c011961b --- /dev/null +++ b/sidebars-community.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/en/community'), +}; diff --git a/sidebars.js b/sidebars.js new file mode 100644 index 00000000..2164934e --- /dev/null +++ b/sidebars.js @@ -0,0 +1,5 @@ +const {buildSidebar} = require('./src/sidebars/buildSidebars'); + +module.exports = { + docsSidebar: buildSidebar('content/en/docs'), +}; diff --git a/src/css/custom.css b/src/css/custom.css new file mode 100644 index 00000000..e9ac76c9 --- /dev/null +++ b/src/css/custom.css @@ -0,0 +1,304 @@ +:root { + --ifm-color-primary: #b32025; + --ifm-color-primary-dark: #9f1c21; + --ifm-color-primary-darker: #8f191d; + --ifm-color-primary-darkest: #751418; + --ifm-color-primary-light: #c83b3f; + --ifm-color-primary-lighter: #d15256; + --ifm-color-primary-lightest: #df7477; + --ifm-font-family-base: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + --ifm-heading-font-family: var(--ifm-font-family-base); + --ifm-navbar-height: 4rem; + --ifm-global-radius: 8px; + --hugegraph-ink: #18212f; + --hugegraph-muted: #5f6877; + --hugegraph-border: #dfe4ec; + --hugegraph-band: #f6f8fb; + --hugegraph-accent: #117a8b; +} + +html[data-theme='dark'] { + --ifm-color-primary: #ff7a7e; + --ifm-background-color: #111827; + --ifm-navbar-background-color: #101723; + --hugegraph-ink: #f8fafc; + --hugegraph-muted: #c7ced8; + --hugegraph-border: #2b3545; + --hugegraph-band: #151f2c; +} + +.navbar { + border-bottom: 1px solid var(--hugegraph-border); + box-shadow: none; +} + +.navbar__brand { + font-weight: 700; +} + +.navbar__logo { + height: 2rem; + width: 2rem; +} + +.navbar__item.dropdown > .navbar__link::after { + margin-left: 0.4rem; +} + +.hugegraphHero { + align-items: center; + background-image: url('/img/featured-background.jpg'); + background-position: center; + background-size: cover; + color: #ffffff; + display: flex; + min-height: min(690px, 72vh); + overflow: hidden; + position: relative; +} + +.hugegraphHero__overlay { + background: rgba(11, 18, 29, 0.72); + inset: 0; + position: absolute; +} + +.hugegraphHero__content { + margin: 0 auto; + max-width: 1180px; + padding: 5rem 1.5rem 4rem; + position: relative; + width: 100%; +} + +.hugegraphHero h1 { + color: #ffffff; + font-size: 5.25rem; + letter-spacing: 0; + line-height: 1; + margin: 0 0 1.25rem; +} + +.hugegraphHero__lead { + color: #e8edf5; + font-size: 1.35rem; + line-height: 1.6; + max-width: 780px; +} + +.hugegraphHero__actions { + display: flex; + flex-wrap: wrap; + gap: 0.8rem; + margin-top: 2rem; +} + +.hugegraphHero .button--secondary { + --ifm-button-background-color: rgba(255, 255, 255, 0.12); + --ifm-button-border-color: rgba(255, 255, 255, 0.75); + --ifm-button-color: #ffffff; + color: #ffffff; +} + +.apacheEyebrow { + color: var(--ifm-color-primary); + font-size: 0.78rem; + font-weight: 700; + letter-spacing: 0; + margin-bottom: 0.65rem; + text-transform: uppercase; +} + +.hugegraphHero .apacheEyebrow { + color: #ffb5b8; +} + +.siteBand { + padding: 4.5rem 0; +} + +.siteBand--light { + background: var(--hugegraph-band); +} + +.sectionHeading { + margin-bottom: 2rem; + max-width: 760px; +} + +.sectionHeading h2, +.ecosystemLayout h2 { + color: var(--hugegraph-ink); + font-size: 2.65rem; + letter-spacing: 0; + line-height: 1.1; + margin: 0; +} + +.sectionHeading p, +.ecosystemLayout p { + color: var(--hugegraph-muted); +} + +.highlightGrid { + display: grid; + gap: 1rem; + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.productCard { + background: var(--ifm-background-surface-color); + border: 1px solid var(--hugegraph-border); + border-radius: 8px; + min-height: 230px; + padding: 1.5rem; +} + +.productCard h3 { + color: var(--hugegraph-ink); + font-size: 1.3rem; + letter-spacing: 0; +} + +.productCard p { + color: var(--hugegraph-muted); + line-height: 1.65; +} + +.productCard a { + font-weight: 700; +} + +.ecosystemLayout { + align-items: center; + display: grid; + gap: 3rem; + grid-template-columns: minmax(0, 0.9fr) minmax(320px, 1.1fr); +} + +.ecosystemMap { + border: 1px solid var(--hugegraph-border); + border-radius: 8px; + display: grid; + gap: 1px; + grid-template-columns: repeat(2, minmax(0, 1fr)); + overflow: hidden; +} + +.ecosystemNode { + background: var(--ifm-background-surface-color); + min-height: 150px; + padding: 1.25rem; +} + +.ecosystemNode strong, +.ecosystemNode span { + display: block; +} + +.ecosystemNode strong { + color: var(--hugegraph-ink); + font-size: 1.2rem; + margin-bottom: 0.6rem; +} + +.ecosystemNode span { + color: var(--hugegraph-muted); + line-height: 1.55; +} + +.ecosystemNode--5 { + grid-column: 1 / -1; +} + +.theme-doc-sidebar-container { + border-right-color: var(--hugegraph-border) !important; +} + +.theme-doc-sidebar-item-category-level-1 > .menu__list-item-collapsible .menu__link { + font-weight: 700; +} + +.markdown h1, +.markdown h2, +.markdown h3 { + letter-spacing: 0; +} + +.markdown table { + display: table; + width: 100%; +} + +.markdown img { + border: 1px solid var(--hugegraph-border); + border-radius: 8px; + max-width: 100%; +} + +.footer { + background: #14171f; +} + +.footer__logo { + background: #ffffff; + border-radius: 8px; + padding: 0.6rem; +} + +.footer__copyright { + color: #d7dce5; + margin: 1.5rem auto 0; + max-width: 1060px; +} + +@media (max-width: 996px) { + .hugegraphHero { + min-height: 68vh; + } + + .hugegraphHero h1 { + font-size: 4rem; + } + + .hugegraphHero__lead { + font-size: 1.2rem; + } + + .sectionHeading h2, + .ecosystemLayout h2 { + font-size: 2.2rem; + } + + .highlightGrid, + .ecosystemLayout { + grid-template-columns: 1fr; + } + + .ecosystemMap { + grid-template-columns: 1fr; + } + + .ecosystemNode--5 { + grid-column: auto; + } +} + +@media (max-width: 480px) { + .hugegraphHero__content { + padding: 4rem 1rem 3rem; + } + + .hugegraphHero h1 { + font-size: 3rem; + } + + .siteBand { + padding: 3rem 0; + } + + .productCard, + .ecosystemNode { + min-height: auto; + } +} diff --git a/src/markdown/frontMatter.js b/src/markdown/frontMatter.js new file mode 100644 index 00000000..de908ae0 --- /dev/null +++ b/src/markdown/frontMatter.js @@ -0,0 +1,81 @@ +const path = require('path'); +const {DEFAULT_PARSE_FRONT_MATTER} = require('@docusaurus/utils'); + +function indexSlug(filePath) { + if (path.basename(filePath) !== '_index.md') { + return undefined; + } + + const normalized = filePath.split(path.sep).join('/'); + const match = normalized.match(/content\/(?:en|cn)\/(?:docs|community)\/(.*)_index\.md$/); + if (!match) { + return undefined; + } + + const slug = match[1].replace(/\/$/, ''); + return slug ? `/${slug}` : '/'; +} + +function slugify(value) { + return String(value) + .trim() + .toLowerCase() + .replace(/&/g, ' and ') + .replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-') + .replace(/^-+|-+$/g, ''); +} + +function blogSlug(filePath, frontMatter) { + const normalized = filePath.split(path.sep).join('/'); + if (!normalized.includes('/content/en/blog/') && !normalized.includes('/content/cn/blog/')) { + return undefined; + } + if (!frontMatter.date) { + return undefined; + } + + const date = + frontMatter.date instanceof Date + ? frontMatter.date.toISOString().slice(0, 10) + : String(frontMatter.date).slice(0, 10); + const match = date.match(/^(\d{4})-(\d{2})-(\d{2})$/); + if (!match) { + return undefined; + } + + const [, year, month, day] = match; + const fallback = path.basename(filePath).replace(/\.mdx?$/i, ''); + return `/${year}/${month}/${day}/${slugify(frontMatter.title || fallback)}`; +} + +function legacyDocSlug(filePath) { + const normalized = filePath.split(path.sep).join('/'); + const match = normalized.match(/content\/(?:en|cn)\/docs\/download\/download\.md$/); + return match ? '/download/download' : undefined; +} + +module.exports = async function parseHugoFrontMatter(args) { + const parsed = await DEFAULT_PARSE_FRONT_MATTER(args); + parsed.frontMatter = parsed.frontMatter || {}; + const slug = indexSlug(args.filePath); + + if (slug && parsed.frontMatter.slug === undefined) { + parsed.frontMatter.slug = slug; + } + + const legacySlug = legacyDocSlug(args.filePath); + if (legacySlug && parsed.frontMatter.slug === undefined) { + parsed.frontMatter.slug = legacySlug; + } + + const postSlug = blogSlug(args.filePath, parsed.frontMatter); + if (postSlug && parsed.frontMatter.slug === undefined) { + parsed.frontMatter.slug = postSlug; + } + + if (parsed.frontMatter.linkTitle && parsed.frontMatter.sidebar_label === undefined) { + parsed.frontMatter.sidebar_label = parsed.frontMatter.linkTitle; + } + + return parsed; +}; diff --git a/src/pages/cn/index.js b/src/pages/cn/index.js new file mode 100644 index 00000000..80658588 --- /dev/null +++ b/src/pages/cn/index.js @@ -0,0 +1,115 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; + +const highlights = [ + { + title: '图数据库', + text: '面向 OLTP 场景的图存储与实时遍历,支持 REST、Gremlin 和 Cypher 访问。', + link: '/cn/docs/quickstart/hugegraph/hugegraph-server/', + }, + { + title: '图计算', + text: '通过 HugeGraph Computer 与 Vermeer 处理大规模图分析任务。', + link: '/cn/docs/quickstart/computing/hugegraph-computer/', + }, + { + title: '图智能', + text: 'GraphRAG、知识图谱构建以及图机器学习组件。', + link: '/cn/docs/quickstart/hugegraph-ai/', + }, +]; + +const components = [ + ['Server', '在线图查询核心引擎'], + ['Store / PD', '分布式存储与元数据调度'], + ['Toolchain', 'Loader、Hubble、客户端与运维工具'], + ['Computer', '分布式图分析与批处理'], + ['AI', 'LLM、RAG 与图机器学习集成'], +]; + +function HomepageHeader() { + return ( + <header className="hugegraphHero"> + <div className="hugegraphHero__overlay" /> + <div className="hugegraphHero__content"> + <p className="apacheEyebrow">Apache Software Foundation Project</p> + <h1>Apache HugeGraph</h1> + <p className="hugegraphHero__lead"> + 面向实时图查询、大规模图分析和 AI 应用的全栈图数据库生态系统。 + </p> + <div className="hugegraphHero__actions"> + <Link className="button button--primary button--lg" to="/cn/docs/"> + 阅读文档 + </Link> + <Link className="button button--secondary button--lg" to="/cn/docs/download/download/"> + 下载 + </Link> + </div> + </div> + </header> + ); +} + +function Highlights() { + return ( + <section className="siteBand siteBand--light"> + <div className="container"> + <div className="sectionHeading"> + <p className="apacheEyebrow">文档入口</p> + <h2>从你需要的技术栈开始</h2> + </div> + <div className="highlightGrid"> + {highlights.map((item) => ( + <article className="productCard" key={item.title}> + <h3>{item.title}</h3> + <p>{item.text}</p> + <Link to={item.link}>打开指南</Link> + </article> + ))} + </div> + </div> + </section> + ); +} + +function Ecosystem() { + return ( + <section className="siteBand"> + <div className="container ecosystemLayout"> + <div> + <p className="apacheEyebrow">HugeGraph 生态</p> + <h2>覆盖完整项目族的一站式文档</h2> + <p> + 新站点保留 HugeGraph Server、Store、PD、Toolchain、Computer 与 AI + 文档,并提供中英文导航。 + </p> + <Link className="button button--outline button--primary" to="/cn/community/"> + 社区 + </Link> + </div> + <div className="ecosystemMap" aria-label="HugeGraph ecosystem components"> + {components.map(([name, text], index) => ( + <div className={clsx('ecosystemNode', `ecosystemNode--${index + 1}`)} key={name}> + <strong>{name}</strong> + <span>{text}</span> + </div> + ))} + </div> + </div> + </section> + ); +} + +export default function HomeCn() { + return ( + <Layout title="Apache HugeGraph" description="Apache HugeGraph 中文文档。"> + <HomepageHeader /> + <main> + <Highlights /> + <Ecosystem /> + </main> + </Layout> + ); +} diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 00000000..eaf0aafd --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,118 @@ +import React from 'react'; +import clsx from 'clsx'; +import Layout from '@theme/Layout'; +import Link from '@docusaurus/Link'; + +const highlights = [ + { + title: 'Graph Database', + text: 'OLTP graph storage and real-time traversal with REST, Gremlin, and Cypher access paths.', + link: '/docs/quickstart/hugegraph/hugegraph-server/', + }, + { + title: 'Graph Computing', + text: 'OLAP processing for large graphs through HugeGraph Computer and Vermeer.', + link: '/docs/quickstart/computing/hugegraph-computer/', + }, + { + title: 'Graph AI', + text: 'GraphRAG, knowledge graph construction, and graph machine learning components.', + link: '/docs/quickstart/hugegraph-ai/', + }, +]; + +const components = [ + ['Server', 'Core graph engine for online graph queries'], + ['Store / PD', 'Distributed storage and placement metadata'], + ['Toolchain', 'Loader, Hubble, clients, and operational tools'], + ['Computer', 'Distributed graph analytics and batch processing'], + ['AI', 'LLM, RAG, and graph ML integrations'], +]; + +function HomepageHeader() { + return ( + <header className="hugegraphHero"> + <div className="hugegraphHero__overlay" /> + <div className="hugegraphHero__content"> + <p className="apacheEyebrow">Apache Software Foundation Project</p> + <h1>Apache HugeGraph</h1> + <p className="hugegraphHero__lead"> + A full-stack graph database ecosystem for real-time graph queries, + large-scale graph analytics, and AI applications. + </p> + <div className="hugegraphHero__actions"> + <Link className="button button--primary button--lg" to="/docs/"> + Read Documentation + </Link> + <Link className="button button--secondary button--lg" to="/docs/download/download/"> + Download + </Link> + </div> + </div> + </header> + ); +} + +function Highlights() { + return ( + <section className="siteBand siteBand--light"> + <div className="container"> + <div className="sectionHeading"> + <p className="apacheEyebrow">Documentation Entry Points</p> + <h2>Start from the part of the stack you need</h2> + </div> + <div className="highlightGrid"> + {highlights.map((item) => ( + <article className="productCard" key={item.title}> + <h3>{item.title}</h3> + <p>{item.text}</p> + <Link to={item.link}>Open guide</Link> + </article> + ))} + </div> + </div> + </section> + ); +} + +function Ecosystem() { + return ( + <section className="siteBand"> + <div className="container ecosystemLayout"> + <div> + <p className="apacheEyebrow">HugeGraph Ecosystem</p> + <h2>One documentation home for the full project family</h2> + <p> + The site keeps the existing HugeGraph Server, Store, PD, Toolchain, + Computer, and AI documentation together with bilingual navigation. + </p> + <Link className="button button--outline button--primary" to="/community/"> + Community + </Link> + </div> + <div className="ecosystemMap" aria-label="HugeGraph ecosystem components"> + {components.map(([name, text], index) => ( + <div className={clsx('ecosystemNode', `ecosystemNode--${index + 1}`)} key={name}> + <strong>{name}</strong> + <span>{text}</span> + </div> + ))} + </div> + </div> + </section> + ); +} + +export default function Home() { + return ( + <Layout + title="Apache HugeGraph" + description="Apache HugeGraph documentation for graph database, graph computing, and graph AI."> + <HomepageHeader /> + <main> + <Highlights /> + <Ecosystem /> + </main> + </Layout> + ); +} diff --git a/src/sidebars/buildSidebars.js b/src/sidebars/buildSidebars.js new file mode 100644 index 00000000..db26224c --- /dev/null +++ b/src/sidebars/buildSidebars.js @@ -0,0 +1,145 @@ +const fs = require('fs'); +const path = require('path'); + +const SKIP_DIRS = new Set(['images', 'scripts', 'styles']); +const SKIP_FILES = new Set(['SUMMARY.md']); + +const SECTION_ORDER = [ + 'introduction', + 'download', + 'quickstart', + 'config', + 'clients', + 'guides', + 'language', + 'performance', + 'contribution-guidelines', + 'changelog', +]; + +function readFrontMatter(filePath) { + const text = fs.readFileSync(filePath, 'utf8'); + const match = text.match(/^---\n([\s\S]*?)\n---/); + if (!match) { + return {}; + } + + const data = {}; + for (const line of match[1].split('\n')) { + const item = line.match(/^([A-Za-z_][A-Za-z0-9_]*):\s*(.*)$/); + if (!item) { + continue; + } + data[item[1]] = item[2].replace(/^['"]|['"]$/g, ''); + } + return data; +} + +function labelFromPath(filePath, fallback) { + const fm = readFrontMatter(filePath); + return fm.linkTitle || fm.title || fallback; +} + +function weight(filePath, name) { + const fm = fs.existsSync(filePath) ? readFrontMatter(filePath) : {}; + if (fm.weight !== undefined && !Number.isNaN(Number(fm.weight))) { + return Number(fm.weight); + } + const sectionIndex = SECTION_ORDER.indexOf(name); + return sectionIndex === -1 ? 1000 : sectionIndex; +} + +function stripExtension(fileName) { + return fileName.replace(/\.mdx?$/i, ''); +} + +function docId(relPath) { + return stripExtension(relPath).split(path.sep).join('/'); +} + +function titleCase(value) { + return value + .replace(/[-_]+/g, ' ') + .replace(/\b\w/g, (char) => char.toUpperCase()); +} + +function sortEntries(baseDir, relDir, entries) { + return entries.sort((a, b) => { + const aPath = path.join(baseDir, relDir, a.name, a.isDirectory() ? '_index.md' : ''); + const bPath = path.join(baseDir, relDir, b.name, b.isDirectory() ? '_index.md' : ''); + const aWeight = weight(a.isDirectory() ? aPath : path.join(baseDir, relDir, a.name), stripExtension(a.name)); + const bWeight = weight(b.isDirectory() ? bPath : path.join(baseDir, relDir, b.name), stripExtension(b.name)); + if (aWeight !== bWeight) { + return aWeight - bWeight; + } + return a.name.localeCompare(b.name); + }); +} + +function buildDirectory(baseDir, relDir = '') { + const dir = path.join(baseDir, relDir); + const entries = fs.readdirSync(dir, {withFileTypes: true}); + + const files = sortEntries( + baseDir, + relDir, + entries.filter( + (entry) => + entry.isFile() && + /\.mdx?$/i.test(entry.name) && + entry.name !== '_index.md' && + !SKIP_FILES.has(entry.name), + ), + ).map((entry) => ({ + type: 'doc', + id: docId(path.join(relDir, entry.name)), + label: labelFromPath(path.join(baseDir, relDir, entry.name), titleCase(stripExtension(entry.name))), + })); + + const dirs = sortEntries( + baseDir, + relDir, + entries.filter((entry) => entry.isDirectory() && !SKIP_DIRS.has(entry.name)), + ).map((entry) => buildCategory(baseDir, path.join(relDir, entry.name))); + + return [...dirs, ...files]; +} + +function buildCategory(baseDir, relDir) { + const indexFile = path.join(baseDir, relDir, '_index.md'); + const label = fs.existsSync(indexFile) + ? labelFromPath(indexFile, titleCase(path.basename(relDir))) + : titleCase(path.basename(relDir)); + const category = { + type: 'category', + label, + collapsible: true, + collapsed: true, + items: buildDirectory(baseDir, relDir), + }; + + if (fs.existsSync(indexFile)) { + category.link = { + type: 'doc', + id: docId(path.join(relDir, '_index.md')), + }; + } + + return category; +} + +function buildSidebar(baseDir) { + const items = []; + const rootIndex = path.join(baseDir, '_index.md'); + if (fs.existsSync(rootIndex)) { + items.push({ + type: 'doc', + id: '_index', + label: labelFromPath(rootIndex, 'Documentation'), + }); + } + items.push(...buildDirectory(baseDir)); + return items; +} + +module.exports = {buildSidebar}; diff --git a/static/blog/images/images-server/agentic-abstract.png b/static/blog/images/images-server/agentic-abstract.png new file mode 100644 index 00000000..4703cc43 Binary files /dev/null and b/static/blog/images/images-server/agentic-abstract.png differ diff --git a/static/blog/images/images-server/agentic-background.png b/static/blog/images/images-server/agentic-background.png new file mode 100644 index 00000000..8d01f796 Binary files /dev/null and b/static/blog/images/images-server/agentic-background.png differ diff --git a/static/blog/images/images-server/agentic-frame.png b/static/blog/images/images-server/agentic-frame.png new file mode 100644 index 00000000..7fddf769 Binary files /dev/null and b/static/blog/images/images-server/agentic-frame.png differ diff --git a/static/blog/images/images-server/agentic-lifeline.svg b/static/blog/images/images-server/agentic-lifeline.svg new file mode 100644 index 00000000..010b19a9 --- /dev/null +++ b/static/blog/images/images-server/agentic-lifeline.svg @@ -0,0 +1 @@ +<svg aria-roledescription="sequence" role="graphics-document document" viewBox="-50 -10 1378.5 2189" style="max-width: 1378.5px;" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" width="100%" id="mermaid-1762185155961"><g><rect class="actor actor-bottom" ry="3" rx="3" name="Node" height="65" width="150" stroke="#666" fill="#eaeaea" y="2103" x="1128.5"/><text style="text-anchor: middle; font-size: 16px; font-weight: 400;" class="actor actor-box" alignment-base [...] \ No newline at end of file diff --git a/static/blog/images/images-server/agentic-pydantic.png b/static/blog/images/images-server/agentic-pydantic.png new file mode 100644 index 00000000..26d9c169 Binary files /dev/null and b/static/blog/images/images-server/agentic-pydantic.png differ diff --git a/static/blog/images/images-server/agentic-scheduler.png b/static/blog/images/images-server/agentic-scheduler.png new file mode 100644 index 00000000..1b4c960e Binary files /dev/null and b/static/blog/images/images-server/agentic-scheduler.png differ diff --git a/static/blog/images/images-server/toplingdb-web-server.png b/static/blog/images/images-server/toplingdb-web-server.png new file mode 100644 index 00000000..aa475ff3 Binary files /dev/null and b/static/blog/images/images-server/toplingdb-web-server.png differ diff --git a/static/blog/images/images-server/toplingdb-yaml-ref.png b/static/blog/images/images-server/toplingdb-yaml-ref.png new file mode 100644 index 00000000..07476def Binary files /dev/null and b/static/blog/images/images-server/toplingdb-yaml-ref.png differ diff --git a/static/docs/images/API-perf/v0.4.4/best.png b/static/docs/images/API-perf/v0.4.4/best.png new file mode 100644 index 00000000..2aa751a8 Binary files /dev/null and b/static/docs/images/API-perf/v0.4.4/best.png differ diff --git a/static/docs/images/API-perf/v0.4.4/cpu-memory.png b/static/docs/images/API-perf/v0.4.4/cpu-memory.png new file mode 100644 index 00000000..05fb760d Binary files /dev/null and b/static/docs/images/API-perf/v0.4.4/cpu-memory.png differ diff --git a/static/docs/images/API-perf/v0.4.4/ssd.png b/static/docs/images/API-perf/v0.4.4/ssd.png new file mode 100644 index 00000000..46b4de1e Binary files /dev/null and b/static/docs/images/API-perf/v0.4.4/ssd.png differ diff --git a/static/docs/images/API-perf/v0.4.4/threads-batch.png b/static/docs/images/API-perf/v0.4.4/threads-batch.png new file mode 100644 index 00000000..410fdc65 Binary files /dev/null and b/static/docs/images/API-perf/v0.4.4/threads-batch.png differ diff --git a/static/docs/images/API-perf/v0.4.4/threads-single.png b/static/docs/images/API-perf/v0.4.4/threads-single.png new file mode 100644 index 00000000..b2a28259 Binary files /dev/null and b/static/docs/images/API-perf/v0.4.4/threads-single.png differ diff --git a/static/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png b/static/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png new file mode 100644 index 00000000..a3bfb33a Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/cassandra/edge_batch.png differ diff --git a/static/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png b/static/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png new file mode 100644 index 00000000..e8d9ce6c Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/cassandra/edge_id_query.png differ diff --git a/static/docs/images/API-perf/v0.5.6/cassandra/edge_single.png b/static/docs/images/API-perf/v0.5.6/cassandra/edge_single.png new file mode 100644 index 00000000..6cdf74b4 Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/cassandra/edge_single.png differ diff --git a/static/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png b/static/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png new file mode 100644 index 00000000..e69a9e78 Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/cassandra/vertex_batch.png differ diff --git a/static/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png b/static/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png new file mode 100644 index 00000000..efb4702b Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/cassandra/vertex_id_query.png differ diff --git a/static/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png b/static/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png new file mode 100644 index 00000000..e411da21 Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/cassandra/vertex_single.png differ diff --git a/static/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png b/static/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png new file mode 100644 index 00000000..d1639c98 Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/rocksdb/edge_batch.png differ diff --git a/static/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png b/static/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png new file mode 100644 index 00000000..bf34321c Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/rocksdb/edge_id_query.png differ diff --git a/static/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png b/static/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png new file mode 100644 index 00000000..67b011e3 Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/rocksdb/edge_single.png differ diff --git a/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png b/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png new file mode 100644 index 00000000..ce3d54e6 Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_batch.png differ diff --git a/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png b/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png new file mode 100644 index 00000000..db20de6b Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_id_query.png differ diff --git a/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png b/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png new file mode 100644 index 00000000..2378cc06 Binary files /dev/null and b/static/docs/images/API-perf/v0.5.6/rocksdb/vertex_single.png differ diff --git a/static/docs/images/demo-graph-model.png b/static/docs/images/demo-graph-model.png new file mode 100644 index 00000000..b7071125 Binary files /dev/null and b/static/docs/images/demo-graph-model.png differ diff --git a/static/docs/images/design/GraphCut.png b/static/docs/images/design/GraphCut.png new file mode 100644 index 00000000..adf3852d Binary files /dev/null and b/static/docs/images/design/GraphCut.png differ diff --git a/static/docs/images/design/PropertyGraph.png b/static/docs/images/design/PropertyGraph.png new file mode 100644 index 00000000..12dbde1d Binary files /dev/null and b/static/docs/images/design/PropertyGraph.png differ diff --git a/static/docs/images/design/Self-loop.png b/static/docs/images/design/Self-loop.png new file mode 100644 index 00000000..274a8b89 Binary files /dev/null and b/static/docs/images/design/Self-loop.png differ diff --git a/static/docs/images/design/architectural-component.png b/static/docs/images/design/architectural-component.png new file mode 100644 index 00000000..c4e7117b Binary files /dev/null and b/static/docs/images/design/architectural-component.png differ diff --git a/static/docs/images/design/architectural-overview.png b/static/docs/images/design/architectural-overview.png new file mode 100644 index 00000000..c6b9a8e8 Binary files /dev/null and b/static/docs/images/design/architectural-overview.png differ diff --git a/static/docs/images/design/architectural-revised.png b/static/docs/images/design/architectural-revised.png new file mode 100644 index 00000000..2316ebf9 Binary files /dev/null and b/static/docs/images/design/architectural-revised.png differ diff --git a/static/docs/images/design1-1.png b/static/docs/images/design1-1.png new file mode 100644 index 00000000..27609f76 Binary files /dev/null and b/static/docs/images/design1-1.png differ diff --git a/static/docs/images/design1-2.png b/static/docs/images/design1-2.png new file mode 100644 index 00000000..5c56dc51 Binary files /dev/null and b/static/docs/images/design1-2.png differ diff --git a/static/docs/images/design1-3.png b/static/docs/images/design1-3.png new file mode 100644 index 00000000..adf3852d Binary files /dev/null and b/static/docs/images/design1-3.png differ diff --git a/static/docs/images/design1-5.png b/static/docs/images/design1-5.png new file mode 100644 index 00000000..c52397f1 Binary files /dev/null and b/static/docs/images/design1-5.png differ diff --git a/static/docs/images/design1-6.png b/static/docs/images/design1-6.png new file mode 100644 index 00000000..e9e885d0 Binary files /dev/null and b/static/docs/images/design1-6.png differ diff --git a/static/docs/images/design4-1.png b/static/docs/images/design4-1.png new file mode 100644 index 00000000..c6b9a8e8 Binary files /dev/null and b/static/docs/images/design4-1.png differ diff --git a/static/docs/images/design5-1.png b/static/docs/images/design5-1.png new file mode 100644 index 00000000..c4e7117b Binary files /dev/null and b/static/docs/images/design5-1.png differ diff --git a/static/docs/images/design5-2.png b/static/docs/images/design5-2.png new file mode 100644 index 00000000..8785ce8b Binary files /dev/null and b/static/docs/images/design5-2.png differ diff --git a/static/docs/images/design5-3.png b/static/docs/images/design5-3.png new file mode 100644 index 00000000..e7359a67 Binary files /dev/null and b/static/docs/images/design5-3.png differ diff --git a/static/docs/images/design5-4.png b/static/docs/images/design5-4.png new file mode 100644 index 00000000..3ce55112 Binary files /dev/null and b/static/docs/images/design5-4.png differ diff --git a/static/docs/images/design5-5.png b/static/docs/images/design5-5.png new file mode 100644 index 00000000..b7645b88 Binary files /dev/null and b/static/docs/images/design5-5.png differ diff --git a/static/docs/images/favicon.ico b/static/docs/images/favicon.ico new file mode 100644 index 00000000..53f0191e Binary files /dev/null and b/static/docs/images/favicon.ico differ diff --git a/static/docs/images/gradio-config.png b/static/docs/images/gradio-config.png new file mode 100644 index 00000000..b5a28252 Binary files /dev/null and b/static/docs/images/gradio-config.png differ diff --git a/static/docs/images/gradio-kg.png b/static/docs/images/gradio-kg.png new file mode 100644 index 00000000..825c1933 Binary files /dev/null and b/static/docs/images/gradio-kg.png differ diff --git a/static/docs/images/gradio-rag-1.png b/static/docs/images/gradio-rag-1.png new file mode 100644 index 00000000..0a4df78c Binary files /dev/null and b/static/docs/images/gradio-rag-1.png differ diff --git a/static/docs/images/gradio-rag-2.png b/static/docs/images/gradio-rag-2.png new file mode 100644 index 00000000..ee24cc43 Binary files /dev/null and b/static/docs/images/gradio-rag-2.png differ diff --git a/static/docs/images/gradio-rag.png b/static/docs/images/gradio-rag.png new file mode 100644 index 00000000..855ed655 Binary files /dev/null and b/static/docs/images/gradio-rag.png differ diff --git a/static/docs/images/graph-of-gods.png b/static/docs/images/graph-of-gods.png new file mode 100644 index 00000000..616c9f79 Binary files /dev/null and b/static/docs/images/graph-of-gods.png differ diff --git "a/static/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" "b/static/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" new file mode 100644 index 00000000..c2c902cd Binary files /dev/null and "b/static/docs/images/images-hubble/2\345\271\263\345\217\260\344\275\277\347\224\250\346\265\201\347\250\213.png" differ diff --git "a/static/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" "b/static/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" new file mode 100644 index 00000000..b44bd14c Binary files /dev/null and "b/static/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\272.png" differ diff --git "a/static/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" "b/static/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" new file mode 100644 index 00000000..2ad9c529 Binary files /dev/null and "b/static/docs/images/images-hubble/311\345\233\276\345\210\233\345\273\2722.png" differ diff --git "a/static/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" "b/static/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" new file mode 100644 index 00000000..6c1b7913 Binary files /dev/null and "b/static/docs/images/images-hubble/312\345\233\276\350\256\277\351\227\256.png" differ diff --git "a/static/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" "b/static/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" new file mode 100644 index 00000000..dd98d97f Binary files /dev/null and "b/static/docs/images/images-hubble/313\345\233\276\347\256\241\347\220\206.png" differ diff --git "a/static/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" "b/static/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" new file mode 100644 index 00000000..3004ed0d Binary files /dev/null and "b/static/docs/images/images-hubble/321\345\205\203\346\225\260\346\215\256\345\205\245\345\217\243.png" differ diff --git "a/static/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" "b/static/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" new file mode 100644 index 00000000..5da69a18 Binary files /dev/null and "b/static/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\272.png" differ diff --git "a/static/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" "b/static/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" new file mode 100644 index 00000000..8b277fb1 Binary files /dev/null and "b/static/docs/images/images-hubble/3221\345\261\236\346\200\247\345\210\233\345\273\2722.png" differ diff --git "a/static/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" "b/static/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" new file mode 100644 index 00000000..634ae136 Binary files /dev/null and "b/static/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\250.png" differ diff --git "a/static/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" "b/static/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" new file mode 100644 index 00000000..ef0054d0 Binary files /dev/null and "b/static/docs/images/images-hubble/3222\345\261\236\346\200\247\345\244\215\347\224\2502.png" differ diff --git "a/static/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" "b/static/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" new file mode 100644 index 00000000..0a43bfd6 Binary files /dev/null and "b/static/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\272.png" differ diff --git "a/static/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" "b/static/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" new file mode 100644 index 00000000..339c89e3 Binary files /dev/null and "b/static/docs/images/images-hubble/3231\351\241\266\347\202\271\345\210\233\345\273\2722.png" differ diff --git "a/static/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" "b/static/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" new file mode 100644 index 00000000..0ef343f5 Binary files /dev/null and "b/static/docs/images/images-hubble/3233\351\241\266\347\202\271\345\210\240\351\231\244.png" differ diff --git "a/static/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" "b/static/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" new file mode 100644 index 00000000..545e6050 Binary files /dev/null and "b/static/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\272.png" differ diff --git "a/static/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" "b/static/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" new file mode 100644 index 00000000..ac536c88 Binary files /dev/null and "b/static/docs/images/images-hubble/3241\350\276\271\345\210\233\345\273\2722.png" differ diff --git "a/static/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" "b/static/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" new file mode 100644 index 00000000..caf203f5 Binary files /dev/null and "b/static/docs/images/images-hubble/331\345\257\274\345\205\245\345\205\245\345\217\243.png" differ diff --git "a/static/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" "b/static/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" new file mode 100644 index 00000000..109aa482 Binary files /dev/null and "b/static/docs/images/images-hubble/332\345\210\233\345\273\272\344\273\273\345\212\241.png" differ diff --git "a/static/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" "b/static/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" new file mode 100644 index 00000000..ae738f97 Binary files /dev/null and "b/static/docs/images/images-hubble/333\344\270\212\344\274\240\346\226\207\344\273\266.png" differ diff --git "a/static/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" "b/static/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" new file mode 100644 index 00000000..7d5ac74a Binary files /dev/null and "b/static/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\204.png" differ diff --git "a/static/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" "b/static/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" new file mode 100644 index 00000000..26d7b56e Binary files /dev/null and "b/static/docs/images/images-hubble/334\350\256\276\347\275\256\346\230\240\345\260\2042.png" differ diff --git "a/static/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" "b/static/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" new file mode 100644 index 00000000..98913365 Binary files /dev/null and "b/static/docs/images/images-hubble/335\345\257\274\345\205\245\350\256\276\347\275\256.png" differ diff --git "a/static/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" "b/static/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" new file mode 100644 index 00000000..1bb36aa2 Binary files /dev/null and "b/static/docs/images/images-hubble/335\345\257\274\345\205\245\350\257\246\346\203\205.png" differ diff --git "a/static/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" "b/static/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" new file mode 100644 index 00000000..604ac360 Binary files /dev/null and "b/static/docs/images/images-hubble/33\345\257\274\345\205\245\346\265\201\347\250\213.png" differ diff --git "a/static/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" "b/static/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" new file mode 100644 index 00000000..fdaac4dc Binary files /dev/null and "b/static/docs/images/images-hubble/341\345\210\206\346\236\220\345\205\245\345\217\243.png" differ diff --git "a/static/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" "b/static/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" new file mode 100644 index 00000000..c4814610 Binary files /dev/null and "b/static/docs/images/images-hubble/342\345\244\232\345\233\276\345\210\207\346\215\242.png" differ diff --git "a/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" "b/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" new file mode 100644 index 00000000..712ffb91 Binary files /dev/null and "b/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-json.png" differ diff --git "a/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" "b/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" new file mode 100644 index 00000000..59214e32 Binary files /dev/null and "b/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\345\233\276.png" differ diff --git "a/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" "b/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" new file mode 100644 index 00000000..2cdc6ad6 Binary files /dev/null and "b/static/docs/images/images-hubble/343\345\233\276\345\210\206\346\236\220-\350\241\250\346\240\274.png" differ diff --git "a/static/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" "b/static/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" new file mode 100644 index 00000000..0ede7322 Binary files /dev/null and "b/static/docs/images/images-hubble/345\345\256\232\345\210\266\350\267\257\345\276\204\346\237\245\350\257\242.png" differ diff --git "a/static/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" "b/static/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" new file mode 100644 index 00000000..3487fb5b Binary files /dev/null and "b/static/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\271.png" differ diff --git "a/static/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" "b/static/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" new file mode 100644 index 00000000..1c8fc91b Binary files /dev/null and "b/static/docs/images/images-hubble/346\346\226\260\345\242\236\351\241\266\347\202\2712.png" differ diff --git "a/static/docs/images/images-hubble/347\346\224\266\350\227\217.png" "b/static/docs/images/images-hubble/347\346\224\266\350\227\217.png" new file mode 100644 index 00000000..bf8ca10c Binary files /dev/null and "b/static/docs/images/images-hubble/347\346\224\266\350\227\217.png" differ diff --git "a/static/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" "b/static/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" new file mode 100644 index 00000000..383d72eb Binary files /dev/null and "b/static/docs/images/images-hubble/351\344\273\273\345\212\241\347\256\241\347\220\206\345\205\245\345\217\243.png" differ diff --git "a/static/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" "b/static/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" new file mode 100644 index 00000000..6cf016f5 Binary files /dev/null and "b/static/docs/images/images-hubble/352\344\273\273\345\212\241\345\210\227\350\241\250.png" differ diff --git "a/static/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" "b/static/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" new file mode 100644 index 00000000..d260959f Binary files /dev/null and "b/static/docs/images/images-hubble/353gremlin\344\273\273\345\212\241.png" differ diff --git "a/static/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" "b/static/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" new file mode 100644 index 00000000..9bb49f46 Binary files /dev/null and "b/static/docs/images/images-hubble/353gremlin\344\273\273\345\212\2412.png" differ diff --git "a/static/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" "b/static/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" new file mode 100644 index 00000000..8d96130f Binary files /dev/null and "b/static/docs/images/images-hubble/355\344\273\273\345\212\241\350\257\246\346\203\205.png" differ diff --git "a/static/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" "b/static/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" new file mode 100644 index 00000000..4ec32dbc Binary files /dev/null and "b/static/docs/images/images-hubble/355\345\210\240\351\231\244\345\205\203\346\225\260\346\215\256.png" differ diff --git "a/static/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" "b/static/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" new file mode 100644 index 00000000..61d0c87e Binary files /dev/null and "b/static/docs/images/images-hubble/355\346\236\204\345\273\272\347\264\242\345\274\225.png" differ diff --git a/static/docs/images/images-server/31docker-option.jpg b/static/docs/images/images-server/31docker-option.jpg new file mode 100644 index 00000000..67db0fcc Binary files /dev/null and b/static/docs/images/images-server/31docker-option.jpg differ diff --git a/static/docs/images/images-server/swagger-ui-set-auth-example.png b/static/docs/images/images-server/swagger-ui-set-auth-example.png new file mode 100644 index 00000000..2ef357d0 Binary files /dev/null and b/static/docs/images/images-server/swagger-ui-set-auth-example.png differ diff --git a/static/docs/images/images-server/swagger-ui-where-set-auth-example.png b/static/docs/images/images-server/swagger-ui-where-set-auth-example.png new file mode 100644 index 00000000..1e13bf72 Binary files /dev/null and b/static/docs/images/images-server/swagger-ui-where-set-auth-example.png differ diff --git a/static/docs/images/images-server/swagger-ui.png b/static/docs/images/images-server/swagger-ui.png new file mode 100644 index 00000000..87a15481 Binary files /dev/null and b/static/docs/images/images-server/swagger-ui.png differ diff --git a/static/docs/images/images-studio/add-schema.png b/static/docs/images/images-studio/add-schema.png new file mode 100644 index 00000000..9bec32e6 Binary files /dev/null and b/static/docs/images/images-studio/add-schema.png differ diff --git a/static/docs/images/images-studio/example-2V-1E.png b/static/docs/images/images-studio/example-2V-1E.png new file mode 100644 index 00000000..e9d13a68 Binary files /dev/null and b/static/docs/images/images-studio/example-2V-1E.png differ diff --git a/static/docs/images/images-studio/home-page.png b/static/docs/images/images-studio/home-page.png new file mode 100644 index 00000000..fb46571b Binary files /dev/null and b/static/docs/images/images-studio/home-page.png differ diff --git a/static/docs/images/images-studio/show-graph.png b/static/docs/images/images-studio/show-graph.png new file mode 100644 index 00000000..a1b90dde Binary files /dev/null and b/static/docs/images/images-studio/show-graph.png differ diff --git a/static/docs/images/images-studio/show-json.png b/static/docs/images/images-studio/show-json.png new file mode 100644 index 00000000..f82e402c Binary files /dev/null and b/static/docs/images/images-studio/show-json.png differ diff --git a/static/docs/images/images-studio/show-table.png b/static/docs/images/images-studio/show-table.png new file mode 100644 index 00000000..786b8045 Binary files /dev/null and b/static/docs/images/images-studio/show-table.png differ diff --git a/static/docs/images/kg-uml.png b/static/docs/images/kg-uml.png new file mode 100644 index 00000000..d823e7f8 Binary files /dev/null and b/static/docs/images/kg-uml.png differ diff --git a/static/docs/images/logo.png b/static/docs/images/logo.png new file mode 100644 index 00000000..12df76ac Binary files /dev/null and b/static/docs/images/logo.png differ diff --git a/static/docs/images/ojdbc8.png b/static/docs/images/ojdbc8.png new file mode 100644 index 00000000..b6d095d7 Binary files /dev/null and b/static/docs/images/ojdbc8.png differ diff --git a/static/docs/images/oracle-download.png b/static/docs/images/oracle-download.png new file mode 100644 index 00000000..357db40e Binary files /dev/null and b/static/docs/images/oracle-download.png differ diff --git a/static/docs/images/toolchain-test-mermaid-1.png b/static/docs/images/toolchain-test-mermaid-1.png new file mode 100644 index 00000000..d7dd096a Binary files /dev/null and b/static/docs/images/toolchain-test-mermaid-1.png differ diff --git a/static/docs/images/toolchain-test-mermaid-2.png b/static/docs/images/toolchain-test-mermaid-2.png new file mode 100644 index 00000000..d8e38c1b Binary files /dev/null and b/static/docs/images/toolchain-test-mermaid-2.png differ diff --git a/static/img/apache-logo.svg b/static/img/apache-logo.svg new file mode 100644 index 00000000..620694c5 --- /dev/null +++ b/static/img/apache-logo.svg @@ -0,0 +1,210 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 7127.6 2890" enable-background="new 0 0 7127.6 2890" xml:space="preserve"> +<path fill="#6D6E71" d="M7104.7,847.8c15.3,15.3,22.9,33.7,22.9,55.2c0,21.5-7.6,39.9-22.9,55.4c-15.3,15.4-33.8,23.1-55.6,23.1 + c-21.8,0-40.2-7.6-55.4-22.9c-15.1-15.3-22.7-33.7-22.7-55.2c0-21.5,7.6-39.9,22.9-55.4c15.3-15.4,33.7-23.1,55.4-23.1 + C7070.9,824.9,7089.4,832.5,7104.7,847.8z M7098.1,951.9c13.3-13.6,20-29.8,20-48.7s-6.6-35-19.8-48.5 + c-13.2-13.4-29.4-20.1-48.6-20.1c-19.2,0-35.4,6.7-48.7,20.2c-13.3,13.5-19.9,29.7-19.9,48.7c0,19,6.6,35.2,19.7,48.6 + c13.1,13.4,29.3,20.1,48.5,20.1S7084.7,965.4,7098.1,951.9z M7087.1,888.1c0,14-6.1,22.8-18.4,26.4l22.5,30.5h-18.2l-20.3-28.3 + h-18.6v28.3h-14.7v-84.6h31.8c12.8,0,22,2.2,27.6,6.6C7084.4,871.4,7087.1,878.4,7087.1,888.1z M7068.2,900c3-2.4,4.4-6.5,4.4-12 + c0-5.5-1.5-9.4-4.5-11.6c-3-2.2-8.4-3.2-16-3.2h-18v30.5h17.5C7059.7,903.6,7065.3,902.4,7068.2,900z"/> +<path fill="#6D6E71" d="M1803.6,499.8v155.4h-20V499.8h-56.8v-19.2h133.9v19.2H1803.6z"/> +<path fill="#6D6E71" d="M2082.2,655.2v-76.9h-105.2v76.9h-20V480.5h20v78.9h105.2v-78.9h20v174.7H2082.2z"/> +<path fill="#6D6E71" d="M2241.4,499.8v57.4h88.1v19.2h-88.1v59.8h101.8v19h-121.8V480.5H2340v19.2H2241.4z"/> +<path fill="#D22128" d="M1574.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H1574.5z M2032.6,970 + l-205.1,493.2h404.7L2032.6,970z"/> +<path fill="#D22128" d="M2596.9,1852.4V854.8H3010c171.4,0,295.1,158.8,295.1,313.3c0,163-115.2,316.1-286.6,316.1h-324.6v368.1 + H2596.9z M2693.9,1397.1h318.9c118,0,193.9-108.2,193.9-229c0-125.1-92.7-226.2-202.3-226.2h-310.5V1397.1z"/> +<path fill="#D22128" d="M3250.5,1852.4l417.3-997.6h80.1l417.3,997.6h-105.4l-129.3-311.9h-448.2l-127.9,311.9H3250.5z M3708.6,970 + l-205.1,493.2h404.7L3708.6,970z"/> +<path fill="#D22128" d="M4637.3,849.1c177,0,306.3,89.9,368.1,217.8l-78.7,47.8c-63.2-132.1-186.9-177-295.1-177 + c-238.9,0-369.5,213.6-369.5,414.5c0,220.6,161.6,420.1,373.7,420.1c112.4,0,244.5-56.2,307.7-185.5l81.5,42.1 + c-64.6,148.9-241.7,231.8-394.8,231.8c-274,0-466.5-261.3-466.5-514.2C4163.8,1106.3,4336.6,849.1,4637.3,849.1z"/> +<path fill="#D22128" d="M5949.1,854.8v997.6h-98.4v-466.5h-591.5v466.5h-96.9V854.8h96.9v444h591.5v-444H5949.1z"/> +<path fill="#D22128" d="M6844.6,1765.2v87.1h-670.2V854.8H6832v87.1h-560.6v359.7h489v82.9h-489v380.8H6844.6z"/> +<path fill="#6D6E71" d="M1667.6,2063.6c11.8,3.5,22.2,8.3,31,14.2l-10.3,22.6c-9-6-18.6-10.4-28.9-13.4c-10.2-2.9-20-4.4-29.2-4.4 + c-13.6,0-24.5,2.4-32.6,7.3c-8.1,4.9-12.2,11.8-12.2,20.7c0,7.6,2.3,14,6.8,19c4.5,5,10.2,8.9,17,11.7c6.8,2.8,16.1,6,28,9.6 + c14.4,4.6,26,8.9,34.7,12.9c8.8,4,16.3,9.9,22.5,17.8c6.2,7.8,9.3,18.2,9.3,31c0,11.7-3.2,21.8-9.5,30.6 + c-6.3,8.7-15.3,15.5-26.8,20.3c-11.6,4.8-24.9,7.2-40,7.2c-15.1,0-29.7-2.9-43.9-8.7c-14.2-5.8-26.4-13.6-36.6-23.4l10.7-21.6 + c9.6,9.4,20.7,16.7,33.3,21.9c12.6,5.2,24.8,7.8,36.8,7.8c15.3,0,27.3-3,36.1-8.9c8.8-5.9,13.2-13.9,13.2-23.9 + c0-7.8-2.3-14.3-6.9-19.4c-4.6-5.1-10.3-9-17.1-11.9c-6.8-2.8-16.1-6-28-9.6c-14.2-4.2-25.7-8.3-34.6-12.2 + c-8.9-3.9-16.4-9.7-22.5-17.5c-6.1-7.7-9.2-17.9-9.2-30.6c0-10.9,3-20.4,9-28.6c6-8.2,14.6-14.6,25.6-19.1 + c11.1-4.5,23.8-6.8,38.2-6.8C1643.8,2058.3,1655.7,2060.1,1667.6,2063.6z"/> +<path fill="#6D6E71" d="M1980.1,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C1944.8,2058.6,1963.2,2063.3,1980.1,2072.8z M1881.9,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C1909.4,2081.5,1895.1,2085.2,1881.9,2092.7z"/> +<path fill="#6D6E71" d="M2186.5,2082.4v74h98.4v23.2h-98.4v90.2h-24.1v-210.6h133.8v23.2H2186.5z"/> +<path fill="#6D6E71" d="M2491.6,2082.4v187.4h-24.1v-187.4h-68.4v-23.2h161.4v23.2H2491.6z"/> +<path fill="#6D6E71" d="M2871.8,2269.8l-56.8-177.4l-57.6,177.4h-24.5l-70.5-210.6h25.9l57.9,182.7l57.1-182.4l24.1-0.3l57.7,182.7 + l57.1-182.7h25l-70.6,210.6H2871.8z"/> +<path fill="#6D6E71" d="M3087.3,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6h-26.1l-23.5-53.2H3087.3z M3144.5,2086.6 + l-46.9,106.8h94.4L3144.5,2086.6z"/> +<path fill="#6D6E71" d="M3461.1,2202.7c-6,0.4-10.7,0.6-14.1,0.6h-56v66.5H3367v-210.6h80c26.2,0,46.6,6.2,61.2,18.5 + c14.5,12.3,21.8,29.8,21.8,52.3c0,17.2-4.1,31.7-12.2,43.3c-8.1,11.6-19.8,20-35,25l49.2,71.5h-27.3L3461.1,2202.7z M3491.3,2167.6 + c10.3-8.4,15.5-20.8,15.5-37c0-15.9-5.2-27.9-15.5-36c-10.3-8.1-25.1-12.2-44.3-12.2h-56v97.8h56 + C3466.2,2180.2,3481,2176,3491.3,2167.6z"/> +<path fill="#6D6E71" d="M3688.3,2082.4v69.2h106.2v23.2h-106.2v72.1h122.8v22.9h-146.9v-210.6h142.9v23.2H3688.3z"/> +<path fill="#6D6E71" d="M4147,2082.4v74h98.4v23.2H4147v90.2h-24.1v-210.6h133.8v23.2H4147z"/> +<path fill="#6D6E71" d="M4523.3,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C4488.1,2058.6,4506.5,2063.3,4523.3,2072.8z M4425.2,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C4452.6,2081.5,4438.3,2085.2,4425.2,2092.7z"/> +<path fill="#6D6E71" d="M4854.7,2247.7c-15.7,15.5-37.3,23.3-64.8,23.3c-27.7,0-49.4-7.8-65.1-23.3c-15.7-15.5-23.6-37-23.6-64.6 + v-124h24.1v124c0,20.3,5.8,36.1,17.3,47.5c11.6,11.4,27.3,17.1,47.3,17.1c20.1,0,35.8-5.7,47.1-17c11.4-11.3,17-27.2,17-47.7v-124 + h24.1v124C4878.2,2210.7,4870.4,2232.2,4854.7,2247.7z"/> +<path fill="#6D6E71" d="M5169.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H5169.5z"/> +<path fill="#6D6E71" d="M5478.4,2073.1c16.4,9.3,29.4,21.9,38.9,37.9c9.6,16,14.3,33.9,14.3,53.5s-4.8,37.6-14.3,53.6 + c-9.5,16.1-22.6,28.7-39.3,37.9c-16.6,9.2-35.2,13.8-55.5,13.8h-84.3v-210.6h85.2C5443.7,2059.2,5462,2063.8,5478.4,2073.1z + M5362.3,2246.9h61.4c15.5,0,29.6-3.5,42.3-10.6c12.7-7.1,22.8-16.9,30.2-29.5c7.4-12.5,11.1-26.5,11.1-42 + c0-15.5-3.8-29.4-11.3-41.9c-7.5-12.5-17.7-22.3-30.6-29.6c-12.8-7.2-27-10.9-42.6-10.9h-60.5V2246.9z"/> +<path fill="#6D6E71" d="M5668.6,2216.6l-23.5,53.2h-25.6l94.4-210.6h25l94.1,210.6H5807l-23.5-53.2H5668.6z M5725.8,2086.6 + l-46.9,106.8h94.4L5725.8,2086.6z"/> +<path fill="#6D6E71" d="M5991,2082.4v187.4H5967v-187.4h-68.4v-23.2h161.4v23.2H5991z"/> +<path fill="#6D6E71" d="M6175.9,2269.8v-210.6h24.1v210.6H6175.9z"/> +<path fill="#6D6E71" d="M6493.7,2072.8c16.8,9.4,30.2,22.3,40,38.4c9.8,16.2,14.8,33.9,14.8,53.3c0,19.5-4.9,37.4-14.8,53.6 + c-9.8,16.3-23.2,29.1-40,38.6c-16.8,9.5-35.3,14.3-55.2,14.3c-20.3,0-38.8-4.7-55.7-14.3c-16.8-9.5-30.2-22.4-40-38.6 + c-9.8-16.3-14.8-34.1-14.8-53.6c0-19.5,4.9-37.3,14.8-53.5c9.8-16.2,23.2-29,40-38.3c16.8-9.4,35.4-14,55.7-14 + C6458.5,2058.6,6476.9,2063.3,6493.7,2072.8z M6395.6,2092.7c-13.1,7.4-23.6,17.5-31.4,30.1c-7.8,12.6-11.8,26.5-11.8,41.7 + c0,15.3,3.9,29.3,11.8,42c7.8,12.7,18.3,22.8,31.4,30.2c13.1,7.4,27.4,11.1,42.9,11.1c15.5,0,29.7-3.7,42.7-11.1 + c13-7.4,23.3-17.4,31.1-30.2c7.7-12.7,11.6-26.7,11.6-42s-3.9-29.2-11.6-41.8c-7.7-12.6-18.1-22.6-31.1-30 + c-13-7.4-27.2-11.2-42.6-11.2C6423,2081.5,6408.8,2085.2,6395.6,2092.7z"/> +<path fill="#6D6E71" d="M6826.5,2269.8l-126.3-169.1v169.1h-24.1v-210.6h25l126.3,169.3v-169.3h23.8v210.6H6826.5z"/> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-4516.6152" y1="-2338.7222" x2="-4108.4111" y2="-1861.3982" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#F69923"/> + <stop offset="0.3123" style="stop-color:#F79A23"/> + <stop offset="0.8383" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M1230.1,13.7c-45.3,26.8-120.6,102.5-210.5,212.3l82.6,155.9c58-82.9,116.9-157.5,176.3-221.2 + c4.6-5.1,7-7.5,7-7.5c-2.3,2.5-4.6,5-7,7.5c-19.2,21.2-77.5,89.2-165.5,224.4c84.7-4.2,214.9-21.6,321.1-39.7 + c31.6-177-31-258-31-258S1323.4-41.4,1230.1,13.7z"/> +<path fill="none" d="M1090.2,903.1c0.6-0.1,1.2-0.2,1.8-0.3l-11.9,1.3c-0.7,0.3-1.4,0.7-2.1,1 + C1082.1,904.4,1086.2,903.7,1090.2,903.1z"/> +<path fill="none" d="M1005.9,1182.3c-6.7,1.5-13.7,2.7-20.7,3.7C992.3,1185,999.2,1183.8,1005.9,1182.3z"/> +<path fill="none" d="M432.9,1808.8c0.9-2.3,1.8-4.7,2.6-7c18.2-48,36.2-94.7,54-140.1c20-51,39.8-100.4,59.3-148.3 + c20.6-50.4,40.9-99.2,60.9-146.3c21-49.4,41.7-97,62-142.8c16.5-37.3,32.8-73.4,48.9-108.3c5.4-11.7,10.7-23.2,16-34.6 + c10.5-22.7,21-44.8,31.3-66.5c9.5-20,19-39.6,28.3-58.8c3.1-6.4,6.2-12.8,9.3-19.1c0.5-1,1-2,1.5-3.1l-10.2,1.1l-8-15.9 + c-0.8,1.6-1.6,3.1-2.4,4.6c-14.5,28.8-28.9,57.9-43.1,87.2c-8.2,16.9-16.4,34-24.6,51c-22.6,47.4-44.8,95.2-66.6,143.3 + c-22.1,48.6-43.7,97.5-64.9,146.5c-20.8,48.1-41.3,96.2-61.2,144.2c-20,48-39.5,95.7-58.5,143.2c-19.9,49.5-39.2,98.7-58,147.2 + c-4.2,10.9-8.5,21.9-12.7,32.8c-15,39.2-29.7,77.8-44,116l12.7,25.1l11.4-1.2c0.4-1.1,0.8-2.3,1.3-3.4 + C396.7,1905.4,414.9,1856.4,432.9,1808.8z"/> +<path fill="none" d="M980,1186.8L980,1186.8c0.1,0,0.1,0,0.1-0.1C980.1,1186.8,980.1,1186.8,980,1186.8z"/> +<path fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path opacity="0.35" fill="#BE202E" d="M952.6,1323c-10.6,1.9-21.4,3.8-32.5,5.7c-0.1,0-0.1,0.1-0.2,0.1c5.6-0.8,11.2-1.7,16.6-2.6 + C942,1325.2,947.3,1324.1,952.6,1323z"/> +<path fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1c1.8-0.2,3.5-0.5,5.2-0.8 + c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.3,1186.7C980.2,1186.7,980.2,1186.7,980.3,1186.7c-0.1,0.1-0.2,0.1-0.2,0.1 + c1.8-0.2,3.5-0.5,5.2-0.8c7-1,13.9-2.2,20.7-3.7C997.5,1183.8,989,1185.2,980.3,1186.7L980.3,1186.7L980.3,1186.7z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-7537.7339" y1="-2391.4075" x2="-4625.4141" y2="-2391.4075" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M858.6,784.7c25.1-46.9,50.5-92.8,76.2-137.4c26.7-46.4,53.7-91.3,80.9-134.7 + c1.6-2.6,3.2-5.2,4.8-7.7c27-42.7,54.2-83.7,81.6-122.9L1019.5,226c-6.2,7.6-12.5,15.3-18.8,23.2c-23.8,29.7-48.6,61.6-73.9,95.5 + c-28.6,38.2-58,78.9-87.8,121.7c-27.6,39.5-55.5,80.9-83.5,123.7c-23.8,36.5-47.7,74-71.4,112.5c-0.9,1.4-1.8,2.9-2.6,4.3 + l107.5,212.3C811.8,873.6,835.1,828.7,858.6,784.7z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-7186.1777" y1="-2099.3059" x2="-5450.7183" y2="-2099.3059" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M369,1981c-14.2,39.1-28.5,78.9-42.9,119.6c-0.2,0.6-0.4,1.2-0.6,1.8c-2,5.7-4.1,11.5-6.1,17.2 + c-9.7,27.4-18,52.1-37.3,108.2c31.7,14.5,57.1,52.5,81.1,95.6c-2.6-44.7-21-86.6-56.2-119.1c156.1,7,290.6-32.4,360.1-146.6 + c6.2-10.2,11.9-20.9,17-32.2c-31.6,40.1-70.8,57.1-144.5,53c-0.2,0.1-0.3,0.1-0.5,0.2c0.2-0.1,0.3-0.1,0.5-0.2 + c108.6-48.6,163.1-95.3,211.2-172.6c11.4-18.3,22.5-38.4,33.8-60.6c-94.9,97.5-205,125.3-320.9,104.2l-86.9,9.5 + C374.4,1966.3,371.7,1973.6,369,1981z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2418.5454" x2="-4461.8428" y2="-2418.5454" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M409.6,1786.3c18.8-48.5,38.1-97.7,58-147.2c19-47.4,38.5-95.2,58.5-143.2 + c20-48,40.4-96.1,61.2-144.2c21.2-49,42.9-97.8,64.9-146.5c21.8-48.1,44-95.9,66.6-143.3c8.1-17.1,16.3-34.1,24.6-51 + c14.2-29.3,28.6-58.4,43.1-87.2c0.8-1.6,1.6-3.1,2.4-4.6L681.4,706.8c-1.8,2.9-3.5,5.8-5.3,8.6c-25.1,40.9-50,82.7-74.4,125.4 + c-24.7,43.1-49,87.1-72.7,131.7c-20,37.6-39.6,75.6-58.6,113.9c-3.8,7.8-7.6,15.5-11.3,23.2c-23.4,48.2-44.6,94.8-63.7,139.5 + c-21.7,50.7-40.7,99.2-57.5,145.1c-11,30.2-21,59.4-30.1,87.4c-7.5,24-14.7,47.9-21.5,71.8c-16,56.3-29.9,112.4-41.2,168.3 + L353,1935.1c14.3-38.1,28.9-76.8,44-116C401.1,1808.2,405.4,1797.3,409.6,1786.3z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-7161.7642" y1="-2379.1431" x2="-5631.2524" y2="-2379.1431" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0" style="stop-color:#282662"/> + <stop offset="9.548390e-02" style="stop-color:#662E8D"/> + <stop offset="0.7882" style="stop-color:#9F2064"/> + <stop offset="0.9487" style="stop-color:#CD2032"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M243.5,1729.4c-13.6,68.2-23.2,136.2-28,203.8c-0.2,2.4-0.4,4.7-0.5,7.1 + c-33.7-54-124-106.8-123.8-106.2c64.6,93.7,113.7,186.7,120.9,278c-34.6,7.1-82-3.2-136.8-23.3c57.1,52.5,100,67,116.7,70.9 + c-52.5,3.3-107.1,39.3-162.1,80.8c80.5-32.8,145.5-45.8,192.1-35.3C148.1,2414.2,74.1,2645,0,2890c22.7-6.7,36.2-21.9,43.9-42.6 + c13.2-44.4,100.8-335.6,238-718.2c3.9-10.9,7.8-21.8,11.8-32.9c1.1-3,2.2-6.1,3.3-9.2c14.5-40.1,29.5-81.1,45.1-122.9 + c3.5-9.5,7.1-19,10.7-28.6c0.1-0.2,0.1-0.4,0.2-0.6l-107.9-213.2C244.6,1724.4,244,1726.9,243.5,1729.4z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2117.1309" x2="-4461.8428" y2="-2117.1309" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M805.6,937c-3.1,6.3-6.2,12.7-9.3,19.1c-9.3,19.2-18.8,38.8-28.3,58.8 + c-10.3,21.7-20.7,43.9-31.3,66.5c-5.3,11.4-10.6,22.9-16,34.6c-16.1,35-32.4,71.1-48.9,108.3c-20.3,45.8-41,93.4-62,142.8 + c-20,47.1-40.3,95.9-60.9,146.3c-19.5,47.9-39.3,97.3-59.3,148.3c-17.8,45.4-35.9,92.1-54,140.1c-0.9,2.3-1.8,4.7-2.6,7 + c-18,47.6-36.2,96.6-54.6,146.8c-0.4,1.1-0.8,2.3-1.3,3.4l86.9-9.5c-1.7-0.3-3.5-0.5-5.2-0.9c103.9-13,242.1-90.6,331.4-186.5 + c41.1-44.2,78.5-96.3,113-157.3c25.7-45.4,49.8-95.8,72.8-151.5c20.1-48.7,39.4-101.4,58-158.6c-23.9,12.6-51.2,21.8-81.4,28.2 + c-5.3,1.1-10.7,2.2-16.1,3.1c-5.5,1-11,1.8-16.6,2.6l0,0l0,0c0.1,0,0.1-0.1,0.2-0.1c96.9-37.3,158-109.2,202.4-197.4 + c-25.5,17.4-66.9,40.1-116.6,51.1c-6.7,1.5-13.7,2.7-20.7,3.7c-1.7,0.3-3.5,0.6-5.2,0.8l0,0l0,0c0.1,0,0.1,0,0.1-0.1 + c0,0,0.1,0,0.1,0l0,0c33.6-14.1,62-29.8,86.6-48.4c5.3-4,10.4-8.1,15.3-12.3c7.5-6.5,14.7-13.3,21.5-20.5c4.4-4.6,8.6-9.3,12.7-14.2 + c9.6-11.5,18.7-23.9,27.1-37.3c2.6-4.1,5.1-8.3,7.6-12.6c3.2-6.2,6.3-12.3,9.3-18.3c13.5-27.2,24.4-51.5,33-72.8 + c4.3-10.6,8.1-20.5,11.3-29.7c1.3-3.7,2.5-7.2,3.7-10.6c3.4-10.2,6.2-19.3,8.4-27.3c3.3-12,5.3-21.5,6.4-28.4l0,0l0,0 + c-3.3,2.6-7.1,5.2-11.3,7.7c-29.3,17.5-79.5,33.4-119.9,40.8l79.8-8.8l-79.8,8.8c-0.6,0.1-1.2,0.2-1.8,0.3c-4,0.7-8.1,1.3-12.2,2 + c0.7-0.3,1.4-0.7,2.1-1l-273,29.9C806.6,935,806.1,936,805.6,937z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-7554.8232" y1="-2132.0981" x2="-4642.5034" y2="-2132.0981" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_7_)" d="M1112.9,385.1c-24.3,37.3-50.8,79.6-79.4,127.5c-1.5,2.5-3,5.1-4.5,7.6 + c-24.6,41.5-50.8,87.1-78.3,137c-23.8,43.1-48.5,89.3-74.3,139c-22.4,43.3-45.6,89.2-69.4,137.8l273-29.9 + c79.5-36.6,115.1-69.7,149.6-117.6c9.2-13.2,18.4-27,27.5-41.3c28-43.8,55.6-92,80.1-139.9c23.7-46.3,44.7-92.2,60.7-133.5 + c10.2-26.3,18.4-50.8,24.1-72.3c5-19,8.9-36.9,11.9-54.1C1327.9,363.5,1197.6,380.9,1112.9,385.1z"/> +<path fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path opacity="0.35" fill="#BE202E" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2027.484" x2="-4461.8433" y2="-2027.484" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_8_)" d="M936.5,1326.1c-5.5,1-11,1.8-16.6,2.6l0,0C925.5,1328,931,1327.1,936.5,1326.1z"/> +<path fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path opacity="0.35" fill="#BE202E" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-7374.1626" y1="-2037.7417" x2="-4461.8433" y2="-2037.7417" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_9_)" d="M980,1186.8c1.8-0.2,3.5-0.5,5.2-0.8C983.5,1186.3,981.8,1186.6,980,1186.8L980,1186.8z"/> +<path fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<path opacity="0.35" fill="#BE202E" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7 + L980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-5738.0635" y1="-2039.799" x2="-5094.3457" y2="-2039.799" gradientTransform="matrix(0.4226 -0.9063 0.9063 0.4226 5117.8774 -2859.9343)"> + <stop offset="0.3233" style="stop-color:#9E2064"/> + <stop offset="0.6302" style="stop-color:#C92037"/> + <stop offset="0.7514" style="stop-color:#CD2335"/> + <stop offset="1" style="stop-color:#E97826"/> +</linearGradient> +<path fill="url(#SVGID_10_)" d="M980.2,1186.7C980.2,1186.7,980.2,1186.7,980.2,1186.7L980.2,1186.7L980.2,1186.7L980.2,1186.7 + C980.2,1186.7,980.2,1186.7,980.2,1186.7z"/> +</svg> diff --git a/static/img/featured-background.jpg b/static/img/featured-background.jpg new file mode 100644 index 00000000..8efa5cad Binary files /dev/null and b/static/img/featured-background.jpg differ diff --git a/static/img/hugegraph-logo.svg b/static/img/hugegraph-logo.svg new file mode 100644 index 00000000..a59ddad3 --- /dev/null +++ b/static/img/hugegraph-logo.svg @@ -0,0 +1 @@ +<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 16 16"><defs><style>.logo-cls-1{fill:none;stroke:#fff;stroke-miterlimit:10;stroke-width:0.5px;opacity:0.3;}.logo-cls-2{fill:#229efa;}.logo-cls-3{fill:#9948f7;}.logo-cls-4{fill:#33bc7a;}.logo-cls-5{fill:url(#未命名的渐变_3);}.logo-cls-6{fill:url(#未命名的渐变_13);}.logo-cls-7{fill:url(#未命名的渐变_11);}</style><linearGradient id="未命名的渐变_3" x1="6.16" y1="14.63" x2="6.16" y2="6.01" grad [...] \ No newline at end of file
