diff --git a/.devops/实验一.yml b/.devops/实验一.yml
deleted file mode 100644
index 233e38e..0000000
--- a/.devops/实验一.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-version: 2
-name: 实验一
-description: ""
-global:
- concurrent: 1
-trigger:
- webhook: gitlink@1.0.0
- event:
- - ref: push
- ruleset-operator: AND
-workflow:
- - ref: start
- name: 开始
- task: start
- - ref: docker_image_build_0
- name: docker镜像构建
- task: docker_image_build@1.6.0
- input:
- docker_username: ((nudt_devops.nudt_devops))
- docker_password: ((nudt_devops.nudt_devops))
- image_name: '"registry.cn-guangzhou.aliyuncs.com/nudt_devops/gitlink_help_center_group5"'
- image_tag: '"latest"'
- registry_address: '"registry.cn-guangzhou.aliyuncs.com"'
- docker_file: '"Dockerfile"'
- docker_build_path: '"."'
- workspace: git_clone_0.git_path
- image_push: true
- build_args: '""'
- needs:
- - git_clone_0
- - ref: git_clone_0
- name: git clone
- task: git_clone@1.2.9
- input:
- username: ((ganshihao21.ganshihao21_user))
- password: ((ganshihao21.ganshihao21))
- remote_url: '"https://gitlink.org.cn/shuaihao/gitlink_help_center.git"'
- ref: '"refs/heads/master"'
- commit_id: '""'
- depth: 1
- needs:
- - start
- - ref: ssh_cmd_0
- name: ssh执行命令
- task: ssh_cmd@1.1.1
- input:
- ssh_pass: ((ssh_key.ssh_key))
- ssh_ip: '"47.96.164.145"'
- ssh_port: '"22"'
- ssh_user: '"root"'
- ssh_cmd: '"docker stop ghc_group5 && docker rm ghc_group5 && docker pull
- registry.cn-guangzhou.aliyuncs.com/nudt_devops/gitlink_help_center_group5:latest
- && docker run -d -p 3000:3000 --name ghc_group5
- registry.cn-guangzhou.aliyuncs.com/nudt_devops/gitlink_help_center_group5:latest"'
- needs:
- - docker_image_build_0
- - ref: end
- name: 结束
- task: end
- needs:
- - ssh_cmd_0
-
diff --git a/.devops/未命名项目.yml b/.devops/未命名项目.yml
deleted file mode 100644
index 540e9f7..0000000
--- a/.devops/未命名项目.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-version: 2
-name: 未命名项目
-description: ""
-global:
- concurrent: 1
-trigger:
- webhook: gitlink@1.0.0
- event:
- - ref: push
- ruleset-operator: AND
-workflow:
- - ref: start
- name: 开始
- task: start
- - ref: git_clone_0
- name: git clone
- task: git_clone@1.2.9
- input:
- username: ((ganshihao21.ganshihao21_user))
- password: ((ganshihao21.ganshihao21))
- remote_url: '"https://gitlink.org.cn/ganshihao21/reposync.git"'
- ref: '"refs/heads/master"'
- commit_id: '""'
- depth: 1
- needs:
- - start
- - ref: docker_image_build_0
- name: docker镜像构建
- task: docker_image_build@1.6.0
- input:
- docker_username: ((nudt_devops.nudt_devops))
- docker_password: ((nudt_devops.nudt_devops))
- image_name: '"registry.cn-guangzhou.aliyuncs.com/nudt_devops/reposync_group5"'
- image_tag: '"latest"'
- registry_address: '"registry.cn-guangzhou.aliyuncs.com"'
- docker_file: '"Dockerfile"'
- docker_build_path: '"."'
- workspace: git_clone_0.git_path
- image_push: true
- build_args: '""'
- needs:
- - git_clone_0
- - ref: ssh_cmd_0
- name: ssh执行命令
- task: ssh_cmd@1.1.1
- input:
- ssh_pass: ((ssh_key.ssh_key))
- ssh_ip: '"47.96.164.145"'
- ssh_port: '"22"'
- ssh_user: '"root"'
- ssh_cmd: '"docker stop abc_group5 && docker rm abc_group5 && docker pull
- registry.cn-guangzhou.aliyuncs.com/nudt_devops/reposync_group5:latest &&
- docker run -d -p 3000:3000 --name abc_group5
- registry.cn-guangzhou.aliyuncs.com/nudt_devops/reposync_group5:latest"'
- needs:
- - docker_image_build_0
- - ref: end
- name: 结束
- task: end
- needs:
- - ssh_cmd_0
-
diff --git a/.devops/自动部署.yml b/.devops/自动部署.yml
new file mode 100644
index 0000000..daa790e
--- /dev/null
+++ b/.devops/自动部署.yml
@@ -0,0 +1,58 @@
+ version: 2
+ name: 自动部署
+ description: ""
+ global:
+ concurrent: 1
+ trigger:
+ webhook: gitlink@1.0.0
+ event:
+ - ref: push
+ ruleset-operator: AND
+ workflow:
+ - ref: start
+ name: 开始
+ task: start
+ - ref: git_clone_0
+ name: git clone
+ task: git_clone@1.2.9
+ input:
+ username: ((gitlink_help_center.ylly_git_user))
+ password: ((gitlink_help_center.ylly_git_pass))
+ remote_url: '"https://gitlink.org.cn/ylly/gitlink_help_center.git"'
+ ref: '"refs/heads/master"'
+ commit_id: '""'
+ depth: 1
+ needs:
+ - start
+ - ref: docker_image_build_0
+ name: docker镜像构建
+ task: docker_image_build@1.6.0
+ input:
+ docker_username: ((gitlink_help_center.acr_username))
+ docker_password: ((gitlink_help_center.acr_password))
+ image_name: '"crpi-3vrif0lgpchh92c8.cn-hangzhou.personal.cr.aliyuncs.com/ylly/gitlink_help_center"'
+ image_tag: '"latest"'
+ registry_address: '"crpi-3vrif0lgpchh92c8.cn-hangzhou.personal.cr.aliyuncs.com"'
+ docker_file: '"Dockerfile"'
+ docker_build_path: '"."'
+ workspace: git_clone_0.git_path
+ image_push: true
+ build_args: '""'
+ needs:
+ - git_clone_0
+ - ref: ssh_cmd_0
+ name: ssh执行命令
+ task: ssh_cmd@1.1.1
+ input:
+ ssh_pass: ((gitlink_help_center.ecs_ssh_key))
+ ssh_ip: '"223.6.254.149"'
+ ssh_port: '"22"'
+ ssh_user: '"root"'
+ ssh_cmd: '"docker stop ghc_ylly;docker rm ghc_ylly;docker pull crpi-3vrif0lgpchh92c8.cn-hangzhou.personal.cr.aliyuncs.com/ylly/gitlink_help_center:latest;docker run -d -p 3000:3000 --name ghc_ylly crpi-3vrif0lgpchh92c8.cn-hangzhou.personal.cr.aliyuncs.com/ylly/gitlink_help_center:latest"'
+ needs:
+ - docker_image_build_0
+ - ref: end
+ name: 结束
+ task: end
+ needs:
+ - ssh_cmd_0
diff --git a/Dockerfile b/Dockerfile
index 09b6efe..1486f33 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,10 +1,7 @@
-FROM node:18-alpine
-LABEL maintainer="yuankaifneg <2894340009@qq.com>"
-
+FROM crpi-3vrif0lgpchh92c8.cn-hangzhou.personal.cr.aliyuncs.com/ylly/node:20-alpine
WORKDIR /gitlink_help_center
-
COPY ./ /gitlink_help_center/
-
-RUN yarn install
+RUN npm install --legacy-peer-deps
+RUN mkdir -p node_modules/webpackbar && echo '{"name":"webpackbar","version":"0.0.0","main":"index.js"}' > node_modules/webpackbar/package.json && echo 'class WebpackBar{constructor(){}apply(){}}module.exports=WebpackBar;' > node_modules/webpackbar/index.js
RUN npm run build -- --locale zh-cn
CMD ["npm", "run", "serve"]
diff --git a/docs/intro.md b/docs/intro.md
index f8aec7a..6af4c2e 100644
--- a/docs/intro.md
+++ b/docs/intro.md
@@ -6,7 +6,7 @@ slug: /
---
# 关于GitLink
-GitLink(确实开源)是CCF官方指定的开源创新服务平台,旨在以“为开源创新服务”为使命,以“成为开源创新的汇聚地”为愿景,秉承“创新、开放、协作、共享”的价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新工科人才培养的开源创新生态!
+GitLink(确实开源)是CCF官方指定的开源创新服务平台,旨在以"为开源创新服务"为使命,以"成为开源创新的汇聚地"为愿景,秉承"创新、开放、协作、共享"的价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新工科人才培养的开源创新生态!

@@ -18,7 +18,9 @@ GitLink(确实开源)是CCF官方指定的开源创新服务平台,旨在
- **多层次代码分析**:支持代码溯源分析、许可证风险分析、开源漏洞检测和加固建议;
- **多维度用户画像**:支持开发活动统计、贡献日历、能力建模、角色与专业定位分析。
-# 帮助文档
+---
+
+# 全部文档
帮助文档有助于您全面了解GitLink平台,让我们一起为开源创新贡献力量!
-
\ No newline at end of file
+
+
+---
+
+# 快速入口
+
+
+
按 Ctrl + K 搜索文档,或从下方热门内容开始
+
+
+
diff --git a/docs/个人主页建站/建站工具.md b/docs/个人主页建站/建站工具.md
index 80604fb..b393c3a 100644
--- a/docs/个人主页建站/建站工具.md
+++ b/docs/个人主页建站/建站工具.md
@@ -48,7 +48,7 @@ url: "http://KingChan.gitlink.net"
将值改成 个人建站服务中显示的网站地址,
例如: 现在有一个网站地址为 http://KingChan.gitlink.net
-那么 _config.toml 中的 url应该为 http://KingChan.gitlink.net
+那么 _config.yml 中的 url应该为 http://KingChan.gitlink.net

diff --git a/docs/个人主页建站/站点创建流程.md b/docs/个人主页建站/站点创建流程.md
index 7a73db6..64bf9a8 100644
--- a/docs/个人主页建站/站点创建流程.md
+++ b/docs/个人主页建站/站点创建流程.md
@@ -8,7 +8,7 @@ sidebar_position: 1

-点击左测面板中 个人建站 - 我的站点
+点击左侧面板中 个人建站 - 我的站点

diff --git a/docs/代码库管理/WebIDE.md b/docs/代码库管理/WebIDE.md
index 33b3b06..491108d 100644
--- a/docs/代码库管理/WebIDE.md
+++ b/docs/代码库管理/WebIDE.md
@@ -38,4 +38,8 @@ sidebar_position: 9
### **9. 代码在线运行**
● 集成了基于 skypack 的更加轻量的 CodeSwing 插件,可以在极速版去运行前端代码。
● 集成了基于 Pyodide 的 Code-Runner-For-Web 插件,可以将 Python 的运行搬到浏览器上。
-
\ No newline at end of file
+
+
+```markdown
+ > 更多关于 WebIDE 的背景介绍和核心能力说明,请参阅 [第三方服务 - WebIDE](/第三方服务/WebIDE)。
+ ```
\ No newline at end of file
diff --git a/docs/代码库管理/代码提交.md b/docs/代码库管理/代码提交.md
index 441021c..72f7df7 100644
--- a/docs/代码库管理/代码提交.md
+++ b/docs/代码库管理/代码提交.md
@@ -5,7 +5,7 @@ sidebar_position: 3
### **1. 代码提交入口**
用户可以通过项目代码库中间的文件下的“上传文件”按键来上传文件。

-
+
### **2. 上传文件**
-进入上传文件页面后,如下图所示,拖动文件,选择提交变更的分支的单击”创建项目“按键即可完成创建。
+进入上传文件页面后,如下图所示,拖动文件,选择提交变更的分支的单击”提交变更“按键即可完成提交。

\ No newline at end of file
diff --git a/docs/代码库管理/分支管理.md b/docs/代码库管理/分支管理.md
index ff803a5..72efd0b 100644
--- a/docs/代码库管理/分支管理.md
+++ b/docs/代码库管理/分支管理.md
@@ -5,9 +5,9 @@ sidebar_position: 5
### **1. 查看分支**
在代码库栏下,如下图所示,用户可以点击代码库分支从而查看当前项目的所有分支,并且选择对其进行操作。

-
+
### **2. 合并分支**
-在“和并请求(PR)”下点击“新建合并请求”后,
+在“合并请求(PR)”下点击“新建合并请求”后,

如下图所示,用户可以选择源分支与目标分支以及填写分支信息后提交分支合并请求。

\ No newline at end of file
diff --git a/docs/代码库管理/成员管理.md b/docs/代码库管理/成员管理.md
index cbf6199..d1ba3dc 100644
--- a/docs/代码库管理/成员管理.md
+++ b/docs/代码库管理/成员管理.md
@@ -5,19 +5,19 @@ sidebar_position: 7
### **1. 成员管理入口**
在仓库主页,点击“仓库设置”按键,再点击”成员管理“按键,即可进入成员管理模块,如下图所示。

-
+
### **2. 筛选、搜索项目成员**
进入成员管理模块后,可以通过”角色筛选“按键来筛选项目成员类型,通过”搜索“按键可以检索具体的项目成员,如下图所示。

-
-### **3. 筛选、搜索项目成员**
+
+### **3. 添加项目成员**
进入成员管理模块后,可以通过”添加成员“按键来添加项目成员,左侧搜索框检索到具体用户并选中后,单击”添加成员“按键即可成功添加项目成员。

-
+
### **4. 项目成员权限管理**
进入成员管理模块后,单击项目成员右侧的角色栏,可以选择赋予该名项目成员的权限等级,如下图所示。

-
+
### **5. 删除项目成员**
-进入成员管理模块后,单击项目成员右侧的”删除“按键,可以删除改名项目成员,如下图所示。
+进入成员管理模块后,单击项目成员右侧的”删除“按键,可以删除该名项目成员,如下图所示。

diff --git a/docs/合并请求/代码评审.md b/docs/合并请求/代码评审.md
index 6f99645..e057584 100644
--- a/docs/合并请求/代码评审.md
+++ b/docs/合并请求/代码评审.md
@@ -1,13 +1,13 @@
---
sidebar_label: '代码评审'
-sidebar_position: 3
+sidebar_position: 4
---
# 代码评审
### **1. 进入代码评审**
如下图所示,点击“代码评审”按钮可以进入代码评审

-
+
### **2. 代码评审界面**
如下图所示,用户可以在该界面下查看该PR操作要合并的新的代码,并对其进行评审。

diff --git a/docs/合并请求/合并模式简介.md b/docs/合并请求/合并模式简介.md
index c8d0750..76ec003 100644
--- a/docs/合并请求/合并模式简介.md
+++ b/docs/合并请求/合并模式简介.md
@@ -1,6 +1,6 @@
---
sidebar_label: '合并模式简介'
-sidebar_position: 4
+sidebar_position: 3
---
# 合并模式简介
diff --git a/docs/快速开始/创建第一个开源项目.md b/docs/快速开始/创建第一个开源项目.md
index b18cc64..78a81a7 100644
--- a/docs/快速开始/创建第一个开源项目.md
+++ b/docs/快速开始/创建第一个开源项目.md
@@ -3,7 +3,7 @@ sidebar_label: '创建第一个开源项目'
sidebar_position: 2
---
-# 创建第一个开源项目
+# 创建我的第一个开源项目
## 1. 新建项目
diff --git a/docs/快速开始/提交第一行代码.md b/docs/快速开始/提交第一行代码.md
index 1436b02..9222014 100644
--- a/docs/快速开始/提交第一行代码.md
+++ b/docs/快速开始/提交第一行代码.md
@@ -19,4 +19,4 @@ sidebar_position: 3
## 3. 代码更新成功
-提交成功后代码代码更新成功。
\ No newline at end of file
+提交成功后代码更新成功。
\ No newline at end of file
diff --git a/docs/疑修/疑修列表.md b/docs/疑修/疑修列表.md
index 5ac8734..638b38c 100644
--- a/docs/疑修/疑修列表.md
+++ b/docs/疑修/疑修列表.md
@@ -1,6 +1,6 @@
---
sidebar_label: '疑修列表'
-sidebar_position: 4
+sidebar_position: 2
---
# 疑修列表
diff --git a/docs/疑修/疑修创建.md b/docs/疑修/疑修创建.md
index 0c2d9fe..4f351d7 100644
--- a/docs/疑修/疑修创建.md
+++ b/docs/疑修/疑修创建.md
@@ -1,6 +1,6 @@
---
sidebar_label: '疑修创建'
-sidebar_position: 2
+sidebar_position: 3
---
# 疑修创建
@@ -18,4 +18,3 @@ sidebar_position: 2

-
diff --git a/docs/疑修/疑修状态变更.md b/docs/疑修/疑修状态变更.md
index 7984618..2ad7d3b 100644
--- a/docs/疑修/疑修状态变更.md
+++ b/docs/疑修/疑修状态变更.md
@@ -1,6 +1,6 @@
---
sidebar_label: '疑修状态变更'
-sidebar_position: 3
+sidebar_position: 4
---
# 疑修状态变更
diff --git a/docs/疑修/疑修简介.md b/docs/疑修/疑修简介.md
index fec3dc0..c8911ce 100644
--- a/docs/疑修/疑修简介.md
+++ b/docs/疑修/疑修简介.md
@@ -12,6 +12,6 @@ sidebar_position: 1
1. **疑修**是一个可以追踪开发任务进度的帖子,因此支持参与者回复与评论等功能,见 ***评论及操作记录*** 一节;
-2. **疑修**的默认类型(标记)包括缺陷、功能、任务、支持、周报等,具体见 ***标记管理*** 一节;
+2. **疑修**的默认类型(标记)包括缺陷、功能、疑问、支持、任务、协助、搁置、文档、测试、重复等,具体见 ***标记管理*** 一节;
3. 可以为**疑修**设置开始和结束时间,并指定负责解决该任务的负责人,在疑修截止日期的前一天,系统将自动为任务的发布者和被指派人发送提醒消息。
diff --git a/docs/第三方服务/WebIDE.md b/docs/第三方服务/WebIDE.md
index ac974e1..bb76cd6 100644
--- a/docs/第三方服务/WebIDE.md
+++ b/docs/第三方服务/WebIDE.md
@@ -119,4 +119,8 @@ Gitlink 代码阅读场景虽然接入极速版 IDE 编辑器,但文件树、
随着 Webassembly 技术的发展,一些后端语言也可以运行在浏览器里,在 2021 年 Google IO 大会上,StackBlitz 展示了他们最近做的技术:WebContainer,该能力可以将语言运行时编译为 Webassembly 从而运行在浏览器上。Code-Runner-For-Web 插件结合 Pyodide,已经将 Python 的运行搬到了浏览器上,新版极速版也默认集成了该插件。

-Python代码运行
\ No newline at end of file
+Python代码运行
+
+```markdown
+ > 本文档介绍 WebIDE 的技术背景和核心能力。如需了解 WebIDE 的快速上手操作,请参阅 [代码库管理 - WebIDE](/代码库管理/WebIDE)。
+ ```
\ No newline at end of file
diff --git a/docs/组织管理/组织简介.md b/docs/组织管理/组织简介.md
index f12bc3a..64636ae 100644
--- a/docs/组织管理/组织简介.md
+++ b/docs/组织管理/组织简介.md
@@ -25,4 +25,4 @@ sidebar_position: 1
## 作为组织成员
-您可以通过组织与无限数量的人在多个项目中协作,与志同道合的人一起,通过分工和写作,参与开发流程,发布或处理问题。
+您可以通过组织与无限数量的人在多个项目中协作,与志同道合的人一起,通过分工和协作,参与开发流程,发布或处理问题。
diff --git a/docs/维基/模板导入及导出.md b/docs/维基/模板导入及导出.md
index 8245753..c161183 100644
--- a/docs/维基/模板导入及导出.md
+++ b/docs/维基/模板导入及导出.md
@@ -3,7 +3,7 @@ sidebar_label: '模板导入及导出'
sidebar_position: 2
---
-# 确实开源帮助中心
+# 模板的导入及导出
## 模板的导入及导出管理
#### 1.模板导入
diff --git a/docs/维基/维基页面管理.md b/docs/维基/维基页面管理.md
index 976a092..e364801 100644
--- a/docs/维基/维基页面管理.md
+++ b/docs/维基/维基页面管理.md
@@ -4,7 +4,7 @@ sidebar_position: 1
---
-# 确实开源帮助中心
+# 维基界面管理
## 维基界面管理
#### 1.维基界面
diff --git a/docs/通知/通知简介.md b/docs/通知/通知简介.md
index 278389b..9f48aeb 100644
--- a/docs/通知/通知简介.md
+++ b/docs/通知/通知简介.md
@@ -3,7 +3,7 @@ sidebar_label: '通知简介'
sidebar_position: 1
---
-# 确实开源帮助中心
+# 通知简介
## 通知简介
#### 1.通知类型
@@ -25,5 +25,5 @@ GitLink将通知分为“系统通知”和“@我”的两种类型:
-点击通知按钮可以进入消息通知界面,“我的通知”界面可以进行“进查看未读消息”和“所有消息一键已读”的选择。
+点击通知按钮可以进入消息通知界面,“我的通知”界面可以进行“仅查看未读消息”和“所有消息一键已读”的选择。

\ No newline at end of file
diff --git a/docs/通知/通知设置.md b/docs/通知/通知设置.md
index bfde209..e7ea304 100644
--- a/docs/通知/通知设置.md
+++ b/docs/通知/通知设置.md
@@ -4,7 +4,7 @@ sidebar_position: 2
---
-# 确实开源帮助中心
+# 通知设置
## 通知设置
#### 1.进入通知设置界面
diff --git a/docusaurus.config.js b/docusaurus.config.js
index 424ef17..a0b9d31 100644
--- a/docusaurus.config.js
+++ b/docusaurus.config.js
@@ -13,10 +13,13 @@ module.exports = {
baseUrl: '/',
onBrokenLinks: 'warn',
onBrokenMarkdownLinks: 'warn',
+ markdown: {
+ format: 'md',
+ },
favicon: 'img/icon.ico',
organizationName: 'luffyZh', // Usually your GitHub org/user name.
projectName: 'docusaurus-luffyzh-website', // Usually your repo name.
- scripts: [],
+ scripts: ['/js/search-no-result.js'],
// stylesheets: ['styles/dark-mode.css'],
themeConfig: {
docs:{
diff --git a/i18n/en/code.json b/i18n/en/code.json
new file mode 100644
index 0000000..31e60a1
--- /dev/null
+++ b/i18n/en/code.json
@@ -0,0 +1,11 @@
+{
+ "helpFeedback.title": {
+ "message": "Have questions about this doc?"
+ },
+ "helpFeedback.description": {
+ "message": "Post your question on the GitLink forum, and our community and official team will help you out."
+ },
+ "helpFeedback.forumButton": {
+ "message": "Ask on Forum"
+ }
+}
diff --git a/i18n/zh-CN/code.json b/i18n/zh-CN/code.json
index c753757..550d9a8 100644
--- a/i18n/zh-CN/code.json
+++ b/i18n/zh-CN/code.json
@@ -836,5 +836,14 @@
"theme.unlistedContent.message": {
"message": "此页面未列出。搜索引擎不会索引它,只有拥有直链的用户才能访问它。",
"description": "The unlisted content banner message"
+ },
+ "helpFeedback.title": {
+ "message": "对这篇文档有疑问?"
+ },
+ "helpFeedback.description": {
+ "message": "欢迎到 GitLink 论坛发帖提问,社区成员和官方团队会协助解答。"
+ },
+ "helpFeedback.forumButton": {
+ "message": "去论坛提问"
}
}
diff --git a/package-lock.json b/package-lock.json
index d3f4f45..b15fb46 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,32 +1,34 @@
{
"name": "docusaurus",
- "version": "0.0.0",
+ "version": "3.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "docusaurus",
- "version": "0.0.0",
+ "version": "3.0.0",
"dependencies": {
- "@cmfcmf/docusaurus-search-local": "1.1.0",
"@docusaurus/core": "3.9.2",
"@docusaurus/plugin-client-redirects": "3.9.2",
"@docusaurus/preset-classic": "3.9.2",
"@easyops-cn/docusaurus-search-local": "^0.35.0",
"@mdx-js/react": "^3.1.1",
"@node-rs/jieba": "^1.7.0",
+ "cheerio": "1.0.0-rc.12",
"clsx": "1.2.1",
"docusaurus-gtm-plugin": "0.0.2",
"docusaurus-plugin-image-zoom": "1.0.1",
+ "html2pdf.js": "^0.14.0",
"or": "^0.2.0",
"prism-react-renderer": "^1.3.5",
"prismjs": "^1.30.0",
"react": "18.2.0",
"react-dom": "18.2.0",
- "react-modal": "3.16.1"
+ "react-modal": "3.16.1",
+ "turndown": "^7.2.4"
},
"engines": {
- "node": ">=14.18.1 <=18.x"
+ "node": ">=18.x"
}
},
"node_modules/@algolia/abtesting": {
@@ -73,89 +75,6 @@
"node": ">= 14.0.0"
}
},
- "node_modules/@algolia/autocomplete-core": {
- "version": "1.19.6",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.6.tgz",
- "integrity": "sha512-6EoD7PeM2WBq5GY1jm0gGonDW2JVU4BaHT9tAwDcaPkc6gYIRZeY7X7aFuwdRvk9R/jwsh8sz4flDao0+Kua6g==",
- "dependencies": {
- "@algolia/autocomplete-plugin-algolia-insights": "1.19.6",
- "@algolia/autocomplete-shared": "1.19.6"
- }
- },
- "node_modules/@algolia/autocomplete-js": {
- "version": "1.19.6",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.19.6.tgz",
- "integrity": "sha512-rHYKT6P+2FZ1+7a1/JtWIuCmfioOt5eXsAcri6XTYsSutl3BIh8s2e98kbvjbhLfwEuuVDWtST1hdAY2pQdrKw==",
- "dependencies": {
- "@algolia/autocomplete-core": "1.19.6",
- "@algolia/autocomplete-preset-algolia": "1.19.6",
- "@algolia/autocomplete-shared": "1.19.6",
- "htm": "^3.1.1",
- "preact": "^10.13.2"
- },
- "peerDependencies": {
- "@algolia/client-search": ">= 4.5.1 < 6",
- "algoliasearch": ">= 4.9.1 < 6"
- }
- },
- "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
- "version": "1.19.6",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.6.tgz",
- "integrity": "sha512-VD53DBixhEwDvOB00D03DtBVhh5crgb1N0oH3QTscfYk4TpBH+CKrwmN/XrN/VdJAdP+4K6SgwLii/3OwM9dHw==",
- "dependencies": {
- "@algolia/autocomplete-shared": "1.19.6"
- },
- "peerDependencies": {
- "search-insights": ">= 1 < 3"
- }
- },
- "node_modules/@algolia/autocomplete-preset-algolia": {
- "version": "1.19.6",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.19.6.tgz",
- "integrity": "sha512-/uQlHGK5Q2x5Nvrp3W7JMg4YNGG/ygkHtQLTltDbkpd45wnhV9jUiQA6aCnBed9cq0BXhOJZRxh1zGVZ3yRhBg==",
- "dependencies": {
- "@algolia/autocomplete-shared": "1.19.6"
- },
- "peerDependencies": {
- "@algolia/client-search": ">= 4.9.1 < 6",
- "algoliasearch": ">= 4.9.1 < 6"
- }
- },
- "node_modules/@algolia/autocomplete-shared": {
- "version": "1.19.6",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.6.tgz",
- "integrity": "sha512-DG1n2B6XQw6DWB5veO4RuzQ/N2oGNpG+sSzGT7gUbi7WhF+jN57abcv2QhB5flXZ0NgddE1i6h7dZuQmYBEorQ==",
- "peerDependencies": {
- "@algolia/client-search": ">= 4.9.1 < 6",
- "algoliasearch": ">= 4.9.1 < 6"
- }
- },
- "node_modules/@algolia/autocomplete-theme-classic": {
- "version": "1.19.6",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.19.6.tgz",
- "integrity": "sha512-lJg8fGK7ucuapoCwFqciTAvAOb7lI/BgWXN0VP+nW/oG0xtig6FvJz/XXxHxfvfVWLCfDvmW5Dw+vEAnbxXiFA=="
- },
- "node_modules/@algolia/cache-browser-local-storage": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.27.0.tgz",
- "integrity": "sha512-YGog2s57sO20lvpa+hv5XLAAmiTI1kHsCMRtPVfiaOdIQnvRla21lfH08onqEbZihOPVI8GULwt79zQB2ymKzg==",
- "dependencies": {
- "@algolia/cache-common": "4.27.0"
- }
- },
- "node_modules/@algolia/cache-common": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.27.0.tgz",
- "integrity": "sha512-Sr8zjNXj82p6lO4W9CdzfF0m0/9h/H6VAdSHOTtimm/cTzXIYXRI2IZq7+Nt2ljJ7Ukx+7dIFcxQjE57eQSPsw=="
- },
- "node_modules/@algolia/cache-in-memory": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.27.0.tgz",
- "integrity": "sha512-abgMRTcVD0IllNvMM9JFhxtyLn1v6Ey7mQ7+BGS3JCzvkCX7KZqlS0BIuVUDgx9sPIfOeNsG/awGzMmP50TwZw==",
- "dependencies": {
- "@algolia/cache-common": "4.27.0"
- }
- },
"node_modules/@algolia/client-abtesting": {
"version": "5.49.1",
"resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.49.1.tgz",
@@ -200,36 +119,6 @@
"node": ">= 14.0.0"
}
},
- "node_modules/@algolia/client-account": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.27.0.tgz",
- "integrity": "sha512-sSHxwrKTKJrwfoR/LcQJZfmiWJcM5d9Rp7afMChxOcdGdkSdIwrNBC8SCcHRenA3GsZ6mg+j6px7KWYxJ34btA==",
- "dependencies": {
- "@algolia/client-common": "4.27.0",
- "@algolia/client-search": "4.27.0",
- "@algolia/transporter": "4.27.0"
- }
- },
- "node_modules/@algolia/client-analytics": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.27.0.tgz",
- "integrity": "sha512-MqIDyxODljn9ZC4oqjQD0kez2a4zjIJ9ywA/b7cIiUiK/tDjZNTVjYd9WXMKQlXnWUwfrfXJZClVVqN1iCXS+Q==",
- "dependencies": {
- "@algolia/client-common": "4.27.0",
- "@algolia/client-search": "4.27.0",
- "@algolia/requester-common": "4.27.0",
- "@algolia/transporter": "4.27.0"
- }
- },
- "node_modules/@algolia/client-common": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.27.0.tgz",
- "integrity": "sha512-ZrT6l/YPQgyIUuBCxcYPeXol2VBLUMuNb1rKXrm6z1f/iTiwqtnEEb16/6CC11+Re0ZGXrdcMVrgDRrzveQ1aQ==",
- "dependencies": {
- "@algolia/requester-common": "4.27.0",
- "@algolia/transporter": "4.27.0"
- }
- },
"node_modules/@algolia/client-insights": {
"version": "5.49.1",
"resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.49.1.tgz",
@@ -274,16 +163,6 @@
"node": ">= 14.0.0"
}
},
- "node_modules/@algolia/client-personalization": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.27.0.tgz",
- "integrity": "sha512-OZqaFFVm+10hAlmxpiTWi/o2n+YKBESbSqSy2yXAumPH/kaK4moJHFblbh8IkV3KZR0lLm4hzPtn8Q2nWNiDUA==",
- "dependencies": {
- "@algolia/client-common": "4.27.0",
- "@algolia/requester-common": "4.27.0",
- "@algolia/transporter": "4.27.0"
- }
- },
"node_modules/@algolia/client-query-suggestions": {
"version": "5.49.1",
"resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.49.1.tgz",
@@ -328,16 +207,6 @@
"node": ">= 14.0.0"
}
},
- "node_modules/@algolia/client-search": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.27.0.tgz",
- "integrity": "sha512-qmX/f67ay0eZ4V5Io8fWWOcUVo/gqre2yei1PnmEhQU2Gul6ushg25QnNrfu4BODiRrw1rwYveZaLCiHvcUxrQ==",
- "dependencies": {
- "@algolia/client-common": "4.27.0",
- "@algolia/requester-common": "4.27.0",
- "@algolia/transporter": "4.27.0"
- }
- },
"node_modules/@algolia/events": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz",
@@ -387,19 +256,6 @@
"node": ">= 14.0.0"
}
},
- "node_modules/@algolia/logger-common": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.27.0.tgz",
- "integrity": "sha512-pIrmQRXtDV+zTMVXKtKCosC2rWhn0F0TdUeb9etA6RiAz6jY6bY6f0+JX7YekDK09SnmZMLIyUa7Jci+Ied9bw=="
- },
- "node_modules/@algolia/logger-console": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.27.0.tgz",
- "integrity": "sha512-UWvta8BxsR/u5z9eI088mOSLQaGtmoCtXeN3DYJurlxAdJwPuKtEb5+433kxA6/E9f2/JgoW89KZ1vNP9pcHBQ==",
- "dependencies": {
- "@algolia/logger-common": "4.27.0"
- }
- },
"node_modules/@algolia/monitoring": {
"version": "1.49.1",
"resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.49.1.tgz",
@@ -444,37 +300,6 @@
"node": ">= 14.0.0"
}
},
- "node_modules/@algolia/recommend": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.27.0.tgz",
- "integrity": "sha512-CFy54xDjrsazPi3KN04yPmLRDT72AKokc3RLOdWQvG0/uEUjj7dhWqe9qenxpL4ydsjO7S1eY5YqmX+uMGonlg==",
- "dependencies": {
- "@algolia/cache-browser-local-storage": "4.27.0",
- "@algolia/cache-common": "4.27.0",
- "@algolia/cache-in-memory": "4.27.0",
- "@algolia/client-common": "4.27.0",
- "@algolia/client-search": "4.27.0",
- "@algolia/logger-common": "4.27.0",
- "@algolia/logger-console": "4.27.0",
- "@algolia/requester-browser-xhr": "4.27.0",
- "@algolia/requester-common": "4.27.0",
- "@algolia/requester-node-http": "4.27.0",
- "@algolia/transporter": "4.27.0"
- }
- },
- "node_modules/@algolia/requester-browser-xhr": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.27.0.tgz",
- "integrity": "sha512-dTenMBIIpyp5o3C2ZnfbsuSlD/lL9jPkk6T+2+qm38fyw2nf49ANbcHFE79NgiGrnmw7QrYveCs9NIP3Wk4v6g==",
- "dependencies": {
- "@algolia/requester-common": "4.27.0"
- }
- },
- "node_modules/@algolia/requester-common": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.27.0.tgz",
- "integrity": "sha512-VC3prAQVgWTubMStb3mJz6i61Hqbtagi2LeIbgNtoFJFff3XZDcAaO1D5r0GYl2+DrB2VzUHnQXbkiuI+HHYyg=="
- },
"node_modules/@algolia/requester-fetch": {
"version": "5.49.1",
"resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.49.1.tgz",
@@ -494,24 +319,6 @@
"node": ">= 14.0.0"
}
},
- "node_modules/@algolia/requester-node-http": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.27.0.tgz",
- "integrity": "sha512-y8nUqaUQeSOQ5oaNo0b2QPznyBFW9LoIwljyUphJ+gUZpU6O/j2/C8ovoqDpIe6J0etqHg5RCcBizrCFZuLpyw==",
- "dependencies": {
- "@algolia/requester-common": "4.27.0"
- }
- },
- "node_modules/@algolia/transporter": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.27.0.tgz",
- "integrity": "sha512-PvSbELU4VjN3xSX79ki+zIdOGhTxyJXWvRDzkUjfTx2iNfPWDdTjzKbP1o+268coJztxrkuBwJz90Urek7o1Kw==",
- "dependencies": {
- "@algolia/cache-common": "4.27.0",
- "@algolia/logger-common": "4.27.0",
- "@algolia/requester-common": "4.27.0"
- }
- },
"node_modules/@babel/code-frame": {
"version": "7.29.0",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
@@ -2140,30 +1947,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@cmfcmf/docusaurus-search-local": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@cmfcmf/docusaurus-search-local/-/docusaurus-search-local-1.1.0.tgz",
- "integrity": "sha512-0IVb/aA0IK8ZlktuxmgXmluXfcSpo6Vdd2nG21y1aOH9nVYnPP231Dn0H8Ng9Qf9ronQQCDWHnuWpYOr9rUrEQ==",
- "dependencies": {
- "@algolia/autocomplete-js": "^1.8.2",
- "@algolia/autocomplete-theme-classic": "^1.8.2",
- "@algolia/client-search": "^4.12.0",
- "algoliasearch": "^4.12.0",
- "cheerio": "^1.0.0-rc.9",
- "clsx": "^1.1.1",
- "lunr-languages": "^1.4.0",
- "mark.js": "^8.11.1"
- },
- "peerDependencies": {
- "@docusaurus/core": "^2.0.0",
- "nodejieba": "^2.5.0"
- },
- "peerDependenciesMeta": {
- "nodejieba": {
- "optional": true
- }
- }
- },
"node_modules/@colors/colors": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
@@ -3758,44 +3541,6 @@
"react-dom": "^18.0.0 || ^19.0.0"
}
},
- "node_modules/@docusaurus/plugin-content-blog/node_modules/cheerio": {
- "version": "1.0.0-rc.12",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
- "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
- "dependencies": {
- "cheerio-select": "^2.1.0",
- "dom-serializer": "^2.0.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "htmlparser2": "^8.0.1",
- "parse5": "^7.0.0",
- "parse5-htmlparser2-tree-adapter": "^7.0.0"
- },
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
- }
- },
- "node_modules/@docusaurus/plugin-content-blog/node_modules/htmlparser2": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
- "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "entities": "^4.4.0"
- }
- },
"node_modules/@docusaurus/plugin-content-docs": {
"version": "3.9.2",
"resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.9.2.tgz",
@@ -7881,6 +7626,12 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/@mixmark-io/domino": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz",
+ "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==",
+ "license": "BSD-2-Clause"
+ },
"node_modules/@napi-rs/wasm-runtime": {
"version": "0.2.12",
"resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
@@ -8873,6 +8624,12 @@
"@types/node": "*"
}
},
+ "node_modules/@types/pako": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz",
+ "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==",
+ "license": "MIT"
+ },
"node_modules/@types/parse-json": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
@@ -8894,6 +8651,13 @@
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
"integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="
},
+ "node_modules/@types/raf": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz",
+ "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/@types/range-parser": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
@@ -8992,6 +8756,13 @@
"@types/node": "*"
}
},
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/@types/unist": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
@@ -9306,28 +9077,6 @@
"ajv": "^8.8.2"
}
},
- "node_modules/algoliasearch": {
- "version": "4.27.0",
- "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.27.0.tgz",
- "integrity": "sha512-C88C5grLa5VOCp9eYZJt+q99ik7yNdm92l7Q9+4XK0Md8kL05Lg8l2v9ZVX0uMW3mH9pAFxMMXlLOvqNumA4lw==",
- "dependencies": {
- "@algolia/cache-browser-local-storage": "4.27.0",
- "@algolia/cache-common": "4.27.0",
- "@algolia/cache-in-memory": "4.27.0",
- "@algolia/client-account": "4.27.0",
- "@algolia/client-analytics": "4.27.0",
- "@algolia/client-common": "4.27.0",
- "@algolia/client-personalization": "4.27.0",
- "@algolia/client-search": "4.27.0",
- "@algolia/logger-common": "4.27.0",
- "@algolia/logger-console": "4.27.0",
- "@algolia/recommend": "4.27.0",
- "@algolia/requester-browser-xhr": "4.27.0",
- "@algolia/requester-common": "4.27.0",
- "@algolia/requester-node-http": "4.27.0",
- "@algolia/transporter": "4.27.0"
- }
- },
"node_modules/algoliasearch-helper": {
"version": "3.28.0",
"resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.28.0.tgz",
@@ -9650,6 +9399,15 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
+ "node_modules/base64-arraybuffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+ "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
"node_modules/baseline-browser-mapping": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
@@ -9997,6 +9755,26 @@
}
]
},
+ "node_modules/canvg": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz",
+ "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "@types/raf": "^3.4.0",
+ "core-js": "^3.8.3",
+ "raf": "^3.4.1",
+ "regenerator-runtime": "^0.13.7",
+ "rgbcolor": "^1.0.1",
+ "stackblur-canvas": "^2.0.0",
+ "svg-pathdata": "^6.0.3"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
"node_modules/ccount": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
@@ -10066,24 +9844,21 @@
}
},
"node_modules/cheerio": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz",
- "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "license": "MIT",
"dependencies": {
"cheerio-select": "^2.1.0",
"dom-serializer": "^2.0.0",
"domhandler": "^5.0.3",
- "domutils": "^3.2.2",
- "encoding-sniffer": "^0.2.1",
- "htmlparser2": "^10.1.0",
- "parse5": "^7.3.0",
- "parse5-htmlparser2-tree-adapter": "^7.1.0",
- "parse5-parser-stream": "^7.1.2",
- "undici": "^7.19.0",
- "whatwg-mimetype": "^4.0.0"
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
},
"engines": {
- "node": ">=20.18.1"
+ "node": ">= 6"
},
"funding": {
"url": "https://github.com/cheeriojs/cheerio?sponsor=1"
@@ -10698,6 +10473,15 @@
"postcss": "^8.4"
}
},
+ "node_modules/css-line-break": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
+ "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
+ "license": "MIT",
+ "dependencies": {
+ "utrie": "^1.0.2"
+ }
+ },
"node_modules/css-loader": {
"version": "6.11.0",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
@@ -11352,6 +11136,15 @@
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
+ "node_modules/dompurify": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.2.tgz",
+ "integrity": "sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==",
+ "license": "(MPL-2.0 OR Apache-2.0)",
+ "optionalDependencies": {
+ "@types/trusted-types": "^2.0.7"
+ }
+ },
"node_modules/domutils": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
@@ -11469,18 +11262,6 @@
"node": ">= 0.8"
}
},
- "node_modules/encoding-sniffer": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
- "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
- "dependencies": {
- "iconv-lite": "^0.6.3",
- "whatwg-encoding": "^3.1.1"
- },
- "funding": {
- "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
- }
- },
"node_modules/end-of-stream": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
@@ -11965,6 +11746,17 @@
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
},
+ "node_modules/fast-png": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz",
+ "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/pako": "^2.0.3",
+ "iobuffer": "^5.3.2",
+ "pako": "^2.1.0"
+ }
+ },
"node_modules/fast-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz",
@@ -12022,6 +11814,12 @@
"node": ">=0.4.0"
}
},
+ "node_modules/fflate": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz",
+ "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==",
+ "license": "MIT"
+ },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -13087,11 +12885,6 @@
"safe-buffer": "~5.1.0"
}
},
- "node_modules/htm": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz",
- "integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ=="
- },
"node_modules/html-entities": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
@@ -13219,10 +13012,34 @@
"node": ">=12"
}
},
+ "node_modules/html2canvas": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz",
+ "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==",
+ "license": "MIT",
+ "dependencies": {
+ "css-line-break": "^2.1.0",
+ "text-segmentation": "^1.0.3"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/html2pdf.js": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/html2pdf.js/-/html2pdf.js-0.14.0.tgz",
+ "integrity": "sha512-yvNJgE/8yru2UeGflkPdjW8YEY+nDH5X7/2WG4uiuSCwYiCp8PZ8EKNiTAa6HxJ1NjC51fZSIEq6xld5CADKBQ==",
+ "license": "MIT",
+ "dependencies": {
+ "dompurify": "^3.3.1",
+ "html2canvas": "^1.0.0",
+ "jspdf": "^4.0.0"
+ }
+ },
"node_modules/htmlparser2": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
- "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
@@ -13230,22 +13047,12 @@
"url": "https://github.com/sponsors/fb55"
}
],
+ "license": "MIT",
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.3",
- "domutils": "^3.2.2",
- "entities": "^7.0.1"
- }
- },
- "node_modules/htmlparser2/node_modules/entities": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
- "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
}
},
"node_modules/http-cache-semantics": {
@@ -13357,17 +13164,6 @@
"node": ">=10.18"
}
},
- "node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/icss-utils": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
@@ -13503,6 +13299,12 @@
"loose-envify": "^1.0.0"
}
},
+ "node_modules/iobuffer": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz",
+ "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==",
+ "license": "MIT"
+ },
"node_modules/ipaddr.js": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.3.0.tgz",
@@ -14000,6 +13802,23 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jspdf": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz",
+ "integrity": "sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.28.6",
+ "fast-png": "^6.2.0",
+ "fflate": "^0.8.1"
+ },
+ "optionalDependencies": {
+ "canvg": "^3.0.11",
+ "core-js": "^3.6.0",
+ "dompurify": "^3.3.1",
+ "html2canvas": "^1.0.0-rc.5"
+ }
+ },
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -17027,6 +16846,12 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/pako": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
+ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==",
+ "license": "(MIT AND Zlib)"
+ },
"node_modules/param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -17115,17 +16940,6 @@
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "node_modules/parse5-parser-stream": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
- "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
- "dependencies": {
- "parse5": "^7.0.0"
- },
- "funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
- }
- },
"node_modules/parse5/node_modules/entities": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
@@ -17223,6 +17037,13 @@
"node": ">=8"
}
},
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -18625,15 +18446,6 @@
"postcss": "^8.4.31"
}
},
- "node_modules/preact": {
- "version": "10.28.4",
- "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.4.tgz",
- "integrity": "sha512-uKFfOHWuSNpRFVTnljsCluEFq57OKT+0QdOiQo8XWnQ/pSvg7OpX5eNOejELXJMWy+BwM2nobz0FkvzmnpCNsQ==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/preact"
- }
- },
"node_modules/prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
@@ -18837,6 +18649,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -19325,6 +19147,13 @@
"node": ">=4"
}
},
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/regexpu-core": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
@@ -19760,6 +19589,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/rgbcolor": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz",
+ "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==",
+ "license": "MIT OR SEE LICENSE IN FEEL-FREE.md",
+ "optional": true,
+ "engines": {
+ "node": ">= 0.8.15"
+ }
+ },
"node_modules/rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -19901,13 +19740,6 @@
"url": "https://opencollective.com/webpack"
}
},
- "node_modules/search-insights": {
- "version": "2.17.3",
- "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
- "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==",
- "license": "MIT",
- "peer": true
- },
"node_modules/section-matter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
@@ -20466,6 +20298,16 @@
"integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
"deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility"
},
+ "node_modules/stackblur-canvas": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz",
+ "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.14"
+ }
+ },
"node_modules/state-toggle": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
@@ -20672,6 +20514,16 @@
"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
"integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
},
+ "node_modules/svg-pathdata": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz",
+ "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/svgo": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz",
@@ -20797,6 +20649,15 @@
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
},
+ "node_modules/text-segmentation": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
+ "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
+ "license": "MIT",
+ "dependencies": {
+ "utrie": "^1.0.2"
+ }
+ },
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -20944,6 +20805,19 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
+ "node_modules/turndown": {
+ "version": "7.2.4",
+ "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.4.tgz",
+ "integrity": "sha512-I8yFsfRzmzK0WV1pNNOA4A7y4RDfFxPRxb3t+e3ui14qSGOxGtiSP6GjeX+Y6CHb7HYaFj7ECUD7VE5kQMZWGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@mixmark-io/domino": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=18",
+ "npm": ">=9"
+ }
+ },
"node_modules/type-fest": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
@@ -20994,28 +20868,6 @@
"is-typedarray": "^1.0.0"
}
},
- "node_modules/typescript": {
- "version": "5.9.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
- "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
- "license": "Apache-2.0",
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/undici": {
- "version": "7.22.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz",
- "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==",
- "engines": {
- "node": ">=20.18.1"
- }
- },
"node_modules/undici-types": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
@@ -21527,6 +21379,15 @@
"node": ">= 0.4.0"
}
},
+ "node_modules/utrie": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
+ "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
+ "license": "MIT",
+ "dependencies": {
+ "base64-arraybuffer": "^1.0.2"
+ }
+ },
"node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
@@ -22025,26 +21886,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/whatwg-encoding": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
- "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
- "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
- "dependencies": {
- "iconv-lite": "0.6.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/whatwg-mimetype": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
- "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/package.json b/package.json
index 460521b..c6d84d3 100644
--- a/package.json
+++ b/package.json
@@ -14,22 +14,24 @@
"write-heading-ids": "docusaurus write-heading-ids"
},
"dependencies": {
- "@cmfcmf/docusaurus-search-local": "1.1.0",
"@docusaurus/core": "3.9.2",
"@docusaurus/plugin-client-redirects": "3.9.2",
"@docusaurus/preset-classic": "3.9.2",
"@easyops-cn/docusaurus-search-local": "^0.35.0",
"@mdx-js/react": "^3.1.1",
"@node-rs/jieba": "^1.7.0",
+ "cheerio": "1.0.0-rc.12",
"clsx": "1.2.1",
"docusaurus-gtm-plugin": "0.0.2",
"docusaurus-plugin-image-zoom": "1.0.1",
+ "html2pdf.js": "^0.14.0",
"or": "^0.2.0",
"prism-react-renderer": "^1.3.5",
"prismjs": "^1.30.0",
"react": "18.2.0",
"react-dom": "18.2.0",
- "react-modal": "3.16.1"
+ "react-modal": "3.16.1",
+ "turndown": "^7.2.4"
},
"browserslist": {
"production": [
diff --git a/src/components/AIAssistant/index.jsx b/src/components/AIAssistant/index.jsx
new file mode 100644
index 0000000..ac46e4d
--- /dev/null
+++ b/src/components/AIAssistant/index.jsx
@@ -0,0 +1,129 @@
+import React, { useState, useRef, useEffect } from 'react';
+import styles from './index.module.css';
+
+const API_URL = 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions';
+const API_KEY = 'sk-5d5e8096f98547aebb37e3525029372f';
+const MODEL = 'qwen-turbo';
+
+const SYSTEM_PROMPT = `你是GitLink帮助中心的AI助手。你的职责是帮助用户解答关于GitLink平台的问题,包括:
+- 代码仓库管理(创建、克隆、分支管理)
+- 合并请求(PR)的创建和审核
+- 疑修(Issue)的使用
+- DevOps流水线(引擎)的配置和使用
+- Webhook配置
+- 组织和团队管理
+- 其他GitLink平台功能
+
+请用简洁友好的中文回答问题。如果不确定,请建议用户访问GitLink帮助中心文档或论坛。`;
+
+export default function AIAssistant() {
+ const [open, setOpen] = useState(false);
+ const [messages, setMessages] = useState([
+ { role: 'assistant', content: '你好!我是GitLink AI助手,有什么可以帮助你的吗?' }
+ ]);
+ const [input, setInput] = useState('');
+ const [loading, setLoading] = useState(false);
+ const msgEndRef = useRef(null);
+
+ useEffect(() => {
+ msgEndRef.current?.scrollIntoView({ behavior: 'smooth' });
+ }, [messages]);
+
+ async function handleSend() {
+ const text = input.trim();
+ if (!text || loading) return;
+
+ const userMsg = { role: 'user', content: text };
+ const newMessages = [...messages, userMsg];
+ setMessages(newMessages);
+ setInput('');
+ setLoading(true);
+
+ try {
+ const res = await fetch(API_URL, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${API_KEY}`,
+ },
+ body: JSON.stringify({
+ model: MODEL,
+ messages: [
+ { role: 'system', content: SYSTEM_PROMPT },
+ ...newMessages.map(m => ({ role: m.role, content: m.content })),
+ ],
+ }),
+ });
+
+ const data = await res.json();
+ const reply = data.choices?.[0]?.message?.content || '抱歉,我暂时无法回答,请稍后再试。';
+ setMessages(prev => [...prev, { role: 'assistant', content: reply }]);
+ } catch {
+ setMessages(prev => [...prev, { role: 'assistant', content: '网络请求失败,请检查网络连接后重试。' }]);
+ }
+ setLoading(false);
+ }
+
+ function handleKeyDown(e) {
+ if (e.key === 'Enter' && !e.shiftKey) {
+ e.preventDefault();
+ handleSend();
+ }
+ }
+
+ return (
+ <>
+ {!open && (
+
+ )}
+
+ {open && (
+
+
+ AI 助手
+
+
+
+
+ {messages.map((msg, i) => (
+
+ ))}
+ {loading && (
+
+ )}
+
+
+
+
+
setInput(e.target.value)}
+ onKeyDown={handleKeyDown}
+ placeholder="输入你的问题..."
+ disabled={loading}
+ />
+
+
+
+ )}
+ >
+ );
+}
diff --git a/src/components/AIAssistant/index.module.css b/src/components/AIAssistant/index.module.css
new file mode 100644
index 0000000..bb570a6
--- /dev/null
+++ b/src/components/AIAssistant/index.module.css
@@ -0,0 +1,220 @@
+/* 悬浮按钮 */
+.fab {
+ position: fixed;
+ bottom: 2rem;
+ left: 2rem;
+ z-index: 998;
+ width: 48px;
+ height: 48px;
+ border: none;
+ border-radius: 50%;
+ background: #466aff;
+ color: #fff;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 2px 12px rgba(70, 106, 255, 0.4);
+ transition: background 0.2s, transform 0.2s, box-shadow 0.2s;
+}
+
+.fab:hover {
+ background: #3651d9;
+ transform: scale(1.08);
+ box-shadow: 0 4px 16px rgba(70, 106, 255, 0.5);
+}
+
+html[data-theme='dark'] .fab {
+ background: #5b7aff;
+ box-shadow: 0 2px 12px rgba(91, 122, 255, 0.3);
+}
+
+html[data-theme='dark'] .fab:hover {
+ background: #7b9aff;
+}
+
+/* 聊天面板 */
+.panel {
+ position: fixed;
+ bottom: 2rem;
+ left: 2rem;
+ z-index: 999;
+ width: 360px;
+ height: 480px;
+ border-radius: 12px;
+ background: #fff;
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+}
+
+html[data-theme='dark'] .panel {
+ background: #1e1e2e;
+ box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5);
+}
+
+/* 头部 */
+.header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 12px 16px;
+ background: #466aff;
+ color: #fff;
+ font-weight: 600;
+ font-size: 15px;
+}
+
+.closeBtn {
+ background: none;
+ border: none;
+ color: #fff;
+ cursor: pointer;
+ padding: 2px;
+ opacity: 0.8;
+ transition: opacity 0.2s;
+}
+
+.closeBtn:hover {
+ opacity: 1;
+}
+
+/* 消息区 */
+.messages {
+ flex: 1;
+ overflow-y: auto;
+ padding: 12px;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+}
+
+.msg {
+ max-width: 85%;
+ padding: 8px 12px;
+ border-radius: 10px;
+ font-size: 14px;
+ line-height: 1.5;
+ word-break: break-word;
+}
+
+.userMsg {
+ align-self: flex-end;
+ background: #466aff;
+ color: #fff;
+ border-bottom-right-radius: 2px;
+}
+
+.aiMsg {
+ align-self: flex-start;
+ background: #f0f2f5;
+ color: #333;
+ border-bottom-left-radius: 2px;
+}
+
+html[data-theme='dark'] .aiMsg {
+ background: #2a2a3e;
+ color: #ddd;
+}
+
+/* 打字动画 */
+.typing {
+ display: flex;
+ gap: 4px;
+ padding: 4px 0;
+}
+
+.typing span {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: #999;
+ animation: blink 1.2s infinite;
+}
+
+.typing span:nth-child(2) { animation-delay: 0.2s; }
+.typing span:nth-child(3) { animation-delay: 0.4s; }
+
+@keyframes blink {
+ 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
+ 30% { opacity: 1; transform: translateY(-3px); }
+}
+
+/* 输入区 */
+.inputArea {
+ display: flex;
+ gap: 8px;
+ padding: 10px 12px;
+ border-top: 1px solid #eee;
+ background: #fafafa;
+}
+
+html[data-theme='dark'] .inputArea {
+ border-top-color: #333;
+ background: #1a1a2e;
+}
+
+.inputArea input {
+ flex: 1;
+ border: 1px solid #ddd;
+ border-radius: 8px;
+ padding: 8px 12px;
+ font-size: 14px;
+ outline: none;
+ transition: border-color 0.2s;
+ background: #fff;
+ color: #333;
+}
+
+html[data-theme='dark'] .inputArea input {
+ background: #2a2a3e;
+ border-color: #444;
+ color: #ddd;
+}
+
+.inputArea input:focus {
+ border-color: #466aff;
+}
+
+.sendBtn {
+ width: 38px;
+ height: 38px;
+ border: none;
+ border-radius: 8px;
+ background: #466aff;
+ color: #fff;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: background 0.2s;
+ flex-shrink: 0;
+}
+
+.sendBtn:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+}
+
+.sendBtn:not(:disabled):hover {
+ background: #3651d9;
+}
+
+/* 移动端适配 */
+@media (max-width: 480px) {
+ .panel {
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 70vh;
+ border-radius: 12px 12px 0 0;
+ }
+
+ .fab {
+ left: 1.2rem;
+ bottom: 1.2rem;
+ width: 44px;
+ height: 44px;
+ }
+}
diff --git a/src/components/BackToTop/index.jsx b/src/components/BackToTop/index.jsx
new file mode 100644
index 0000000..87ceda7
--- /dev/null
+++ b/src/components/BackToTop/index.jsx
@@ -0,0 +1,40 @@
+import React, { useState, useEffect } from 'react';
+import styles from './index.module.css';
+
+export default function BackToTop() {
+ const [visible, setVisible] = useState(false);
+
+ useEffect(() => {
+ function handleScroll() {
+ setVisible(window.scrollY > 300);
+ }
+ window.addEventListener('scroll', handleScroll, { passive: true });
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ const handleClick = () => {
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+ };
+
+ return (
+
+ );
+}
diff --git a/src/components/BackToTop/index.module.css b/src/components/BackToTop/index.module.css
new file mode 100644
index 0000000..2335b5e
--- /dev/null
+++ b/src/components/BackToTop/index.module.css
@@ -0,0 +1,52 @@
+.backToTop {
+ position: fixed;
+ bottom: 2rem;
+ right: 2rem;
+ z-index: 999;
+ width: 44px;
+ height: 44px;
+ border: none;
+ border-radius: 50%;
+ background: #466aff;
+ color: #fff;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 2px 10px rgba(70, 106, 255, 0.35);
+ transition: background 0.2s, box-shadow 0.2s, transform 0.2s, opacity 0.3s, visibility 0.3s;
+ opacity: 0;
+ visibility: hidden;
+ transform: translateY(10px);
+}
+
+.visible {
+ opacity: 1;
+ visibility: visible;
+ transform: translateY(0);
+}
+
+.backToTop:hover {
+ background: #3651d9;
+ box-shadow: 0 4px 14px rgba(70, 106, 255, 0.45);
+ transform: translateY(-2px);
+}
+
+html[data-theme='dark'] .backToTop {
+ background: #466aff;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4);
+}
+
+html[data-theme='dark'] .backToTop:hover {
+ background: #5b7aff;
+ box-shadow: 0 4px 14px rgba(70, 106, 255, 0.35);
+}
+
+@media (max-width: 480px) {
+ .backToTop {
+ bottom: 1.2rem;
+ right: 1.2rem;
+ width: 40px;
+ height: 40px;
+ }
+}
diff --git a/src/components/ExportButton/index.jsx b/src/components/ExportButton/index.jsx
new file mode 100644
index 0000000..61ae50c
--- /dev/null
+++ b/src/components/ExportButton/index.jsx
@@ -0,0 +1,155 @@
+import React, { useState, useRef, useEffect } from 'react';
+import styles from './index.module.css';
+
+const FORMATS = [
+ { key: 'pdf', label: 'PDF', desc: '适合打印和离线阅读' },
+ { key: 'markdown', label: 'Markdown', desc: '可编辑的 Markdown 文件' },
+ { key: 'html', label: 'HTML', desc: '保留样式的网页文件' },
+ { key: 'txt', label: 'TXT', desc: '纯文本文件' },
+];
+
+function getDocTitle() {
+ const h1 = document.querySelector('article header h1');
+ return h1 ? h1.textContent.trim() : document.title;
+}
+
+function getArticleContent() {
+ return document.querySelector('article .markdown') || document.querySelector('article');
+}
+
+function downloadFile(filename, content, mimeType) {
+ const blob = new Blob([content], { type: mimeType });
+ const url = URL.createObjectURL(blob);
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = filename;
+ document.body.appendChild(a);
+ a.click();
+ document.body.removeChild(a);
+ URL.revokeObjectURL(url);
+}
+
+async function exportPDF(element, title) {
+ const html2pdf = (await import('html2pdf.js')).default;
+ html2pdf()
+ .set({
+ margin: [15, 15, 15, 15],
+ filename: `${title}.pdf`,
+ image: { type: 'jpeg', quality: 0.98 },
+ html2canvas: { scale: 2, useCORS: true },
+ jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },
+ })
+ .from(element)
+ .save();
+}
+
+async function exportMarkdown(element, title) {
+ const TurndownService = (await import('turndown')).default;
+ const turndown = new TurndownService({
+ headingStyle: 'atx',
+ codeBlockStyle: 'fenced',
+ });
+ const md = `# ${title}\n\n${turndown.turndown(element.innerHTML)}`;
+ downloadFile(`${title}.md`, md, 'text/markdown;charset=utf-8');
+}
+
+function exportHTML(element, title) {
+ const html = `
+
+
+
+
+ ${title}
+
+
+
+ ${title}
+ ${element.innerHTML}
+
+`;
+ downloadFile(`${title}.html`, html, 'text/html;charset=utf-8');
+}
+
+function exportTXT(element, title) {
+ const text = `${title}\n${'='.repeat(title.length)}\n\n${element.innerText}`;
+ downloadFile(`${title}.txt`, text, 'text/plain;charset=utf-8');
+}
+
+const handlers = { pdf: exportPDF, markdown: exportMarkdown, html: exportHTML, txt: exportTXT };
+
+export default function ExportButton() {
+ const [open, setOpen] = useState(false);
+ const [loading, setLoading] = useState(false);
+ const ref = useRef(null);
+
+ useEffect(() => {
+ function handleClickOutside(e) {
+ if (ref.current && !ref.current.contains(e.target)) {
+ setOpen(false);
+ }
+ }
+ document.addEventListener('mousedown', handleClickOutside);
+ return () => document.removeEventListener('mousedown', handleClickOutside);
+ }, []);
+
+ async function handleExport(format) {
+ setOpen(false);
+ const content = getArticleContent();
+ if (!content) return;
+ setLoading(true);
+ try {
+ await handlers[format](content, getDocTitle());
+ } catch (err) {
+ console.error('Export failed:', err);
+ } finally {
+ setLoading(false);
+ }
+ }
+
+ return (
+
+
+
+ {open && (
+
+ {FORMATS.map((f) => (
+ - handleExport(f.key)}>
+ {f.label}
+ {f.desc}
+
+ ))}
+
+ )}
+
+
+ );
+}
diff --git a/src/components/ExportButton/index.module.css b/src/components/ExportButton/index.module.css
new file mode 100644
index 0000000..1e55460
--- /dev/null
+++ b/src/components/ExportButton/index.module.css
@@ -0,0 +1,129 @@
+.wrapper {
+ margin: 1rem 0 0;
+ display: flex;
+ justify-content: flex-end;
+}
+
+.exportBtn {
+ position: relative;
+}
+
+.button {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 8px 16px;
+ border: 1px solid #d1d5db;
+ border-radius: 6px;
+ background: #fff;
+ color: #374151;
+ font-size: 0.875rem;
+ font-weight: 500;
+ cursor: pointer;
+ transition: border-color 0.2s, color 0.2s, box-shadow 0.2s;
+ line-height: 1;
+ font-family: inherit;
+}
+
+.button:hover {
+ border-color: #466aff;
+ color: #466aff;
+ box-shadow: 0 2px 6px rgba(70, 106, 255, 0.15);
+}
+
+.button:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+}
+
+html[data-theme='dark'] .button {
+ background: rgba(255, 255, 255, 0.06);
+ border-color: rgba(255, 255, 255, 0.15);
+ color: #d1d5db;
+}
+
+html[data-theme='dark'] .button:hover {
+ border-color: #466aff;
+ color: #6b8cff;
+ box-shadow: 0 2px 6px rgba(70, 106, 255, 0.25);
+}
+
+.icon {
+ width: 16px;
+ height: 16px;
+ flex-shrink: 0;
+}
+
+.arrow {
+ font-size: 10px;
+ opacity: 0.6;
+}
+
+.dropdown {
+ position: absolute;
+ right: 0;
+ top: calc(100% + 6px);
+ min-width: 220px;
+ margin: 0;
+ padding: 6px 0;
+ list-style: none;
+ background: #fff;
+ border: 1px solid #e5e7eb;
+ border-radius: 8px;
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
+ z-index: 100;
+}
+
+html[data-theme='dark'] .dropdown {
+ background: #1e2535;
+ border-color: rgba(255, 255, 255, 0.1);
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
+}
+
+.item {
+ display: flex;
+ align-items: baseline;
+ gap: 10px;
+ padding: 10px 16px;
+ cursor: pointer;
+ transition: background 0.15s;
+}
+
+.item:hover {
+ background: #f3f4f6;
+}
+
+html[data-theme='dark'] .item:hover {
+ background: rgba(255, 255, 255, 0.06);
+}
+
+.formatLabel {
+ font-size: 0.875rem;
+ font-weight: 600;
+ color: #1f2937;
+ white-space: nowrap;
+}
+
+html[data-theme='dark'] .formatLabel {
+ color: #e3e5e8;
+}
+
+.formatDesc {
+ font-size: 0.75rem;
+ color: #9ca3af;
+ white-space: nowrap;
+}
+
+html[data-theme='dark'] .formatDesc {
+ color: #6b7280;
+}
+
+@media (max-width: 480px) {
+ .wrapper {
+ justify-content: center;
+ }
+
+ .dropdown {
+ right: -30px;
+ }
+}
diff --git a/src/components/HelpFeedback/index.jsx b/src/components/HelpFeedback/index.jsx
new file mode 100644
index 0000000..06d6338
--- /dev/null
+++ b/src/components/HelpFeedback/index.jsx
@@ -0,0 +1,36 @@
+import React from 'react';
+import Translate from '@docusaurus/Translate';
+import styles from './index.module.css';
+
+const FORUM_URL = 'https://forum.gitlink.org.cn';
+
+export default function HelpFeedback() {
+ return (
+
+
+
+
+
+ 对这篇文档有疑问?
+
+
+
+
+ 欢迎到 GitLink 论坛发帖提问,社区成员和官方团队会协助解答。
+
+
+
+
+
+ 去论坛提问
+
+
+
+
+ );
+}
diff --git a/src/components/HelpFeedback/index.module.css b/src/components/HelpFeedback/index.module.css
new file mode 100644
index 0000000..0be6343
--- /dev/null
+++ b/src/components/HelpFeedback/index.module.css
@@ -0,0 +1,79 @@
+.wrapper {
+ margin: 2rem 0 1rem;
+}
+
+.card {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 1.5rem;
+ padding: 1.25rem 1.5rem;
+ border: 1px solid #e2e5ea;
+ border-radius: 8px;
+ background: #f7f8fa;
+}
+
+html[data-theme='dark'] .card {
+ background: rgba(255, 255, 255, 0.05);
+ border-color: rgba(255, 255, 255, 0.1);
+}
+
+.content {
+ flex: 1;
+ min-width: 0;
+}
+
+.title {
+ font-size: 0.95rem;
+ font-weight: 600;
+ margin: 0 0 0.25rem;
+ color: #1b2440;
+}
+
+html[data-theme='dark'] .title {
+ color: #e3e5e8;
+}
+
+.desc {
+ font-size: 0.875rem;
+ margin: 0;
+ color: #6b7280;
+ line-height: 1.5;
+}
+
+html[data-theme='dark'] .desc {
+ color: #9ca3af;
+}
+
+.button {
+ display: inline-flex;
+ align-items: center;
+ flex-shrink: 0;
+ padding: 0.5rem 1.25rem;
+ background: #466aff;
+ color: #fff;
+ border-radius: 6px;
+ font-size: 0.875rem;
+ font-weight: 500;
+ text-decoration: none;
+ white-space: nowrap;
+ transition: background 0.2s;
+}
+
+.button:hover {
+ background: #3651d9;
+ color: #fff;
+ text-decoration: none;
+}
+
+@media (max-width: 640px) {
+ .card {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .button {
+ width: 100%;
+ justify-content: center;
+ }
+}
diff --git a/src/components/ReadingProgress/index.jsx b/src/components/ReadingProgress/index.jsx
new file mode 100644
index 0000000..b6ab0b3
--- /dev/null
+++ b/src/components/ReadingProgress/index.jsx
@@ -0,0 +1,27 @@
+import React, { useState, useEffect } from 'react';
+import styles from './index.module.css';
+
+export default function ReadingProgress() {
+ const [progress, setProgress] = useState(0);
+
+ useEffect(() => {
+ function handleScroll() {
+ const scrollTop = window.scrollY;
+ const docHeight = document.documentElement.scrollHeight - window.innerHeight;
+ if (docHeight > 0) {
+ setProgress((scrollTop / docHeight) * 100);
+ }
+ }
+ window.addEventListener('scroll', handleScroll, { passive: true });
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ return (
+
+
+ {progress > 0 && (
+
{Math.round(progress)}%
+ )}
+
+ );
+}
diff --git a/src/components/ReadingProgress/index.module.css b/src/components/ReadingProgress/index.module.css
new file mode 100644
index 0000000..0370293
--- /dev/null
+++ b/src/components/ReadingProgress/index.module.css
@@ -0,0 +1,44 @@
+.wrapper {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 9999;
+ height: 3px;
+ background: rgba(70, 106, 255, 0.1);
+}
+
+.progressBar {
+ height: 3px;
+ background: linear-gradient(90deg, #466aff, #6b8aff);
+ transition: width 0.1s ease-out;
+ box-shadow: 0 0 4px rgba(70, 106, 255, 0.4);
+}
+
+.percent {
+ position: fixed;
+ top: 6px;
+ right: 12px;
+ font-size: 12px;
+ font-weight: 600;
+ color: #466aff;
+ background: rgba(255, 255, 255, 0.9);
+ padding: 2px 6px;
+ border-radius: 4px;
+ line-height: 1;
+ transition: opacity 0.2s;
+}
+
+html[data-theme='dark'] .wrapper {
+ background: rgba(91, 122, 255, 0.15);
+}
+
+html[data-theme='dark'] .progressBar {
+ background: linear-gradient(90deg, #5b7aff, #8aa5ff);
+ box-shadow: 0 0 6px rgba(91, 122, 255, 0.5);
+}
+
+html[data-theme='dark'] .percent {
+ color: #8aa5ff;
+ background: rgba(30, 30, 40, 0.9);
+}
diff --git a/src/css/custom.css b/src/css/custom.css
index 01ab68e..84d6405 100644
--- a/src/css/custom.css
+++ b/src/css/custom.css
@@ -44,6 +44,10 @@ html[data-theme=light] .menu{
html[data-theme='dark'] .docusaurus-highlight-code-line {
background-color: rgba(0, 0, 0, 0.3);
}
+.navbar__search {
+ position: relative;
+}
+
.navbar__search span[role='listbox']{
background-color: #33416b;
}
@@ -148,4 +152,157 @@ html[data-theme='dark'] .docusaurus-highlight-code-line {
.widget{
display: none!important;
opacity: 0;
+}
+
+/* ===== 搜索无结果引导(集成在搜索下拉框内)===== */
+.search-no-result-guide {
+ padding: 10px 14px;
+}
+
+.search-no-result-guide .sr-guide-title {
+ font-size: 0.85rem;
+ font-weight: 600;
+ color: #e3e5e8;
+ margin-bottom: 8px;
+}
+
+.search-no-result-guide .sr-guide-footer {
+ font-size: 0.8rem;
+ color: #9ca3af;
+ margin-top: 8px;
+}
+
+.search-no-result-guide .sr-guide-chips {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 10px;
+}
+
+.search-no-result-guide .sr-guide-chip {
+ display: inline-block;
+ padding: 4px 12px;
+ border: 1px solid #4b5563;
+ border-radius: 16px;
+ color: #d1d5db;
+ text-decoration: none;
+ font-size: 0.8rem;
+ transition: border-color 0.2s, color 0.2s;
+ background: rgba(255, 255, 255, 0.06);
+}
+
+.search-no-result-guide .sr-guide-chip:hover {
+ border-color: #6b8cff;
+ color: #6b8cff;
+ text-decoration: none;
+}
+
+.search-no-result-guide .sr-guide-link {
+ color: #6b8cff;
+ text-decoration: none;
+ font-weight: 500;
+}
+
+.search-no-result-guide .sr-guide-link:hover {
+ text-decoration: underline;
+}
+
+/* ===== 首页快速入口 ===== */
+.home-hero {
+ margin: 1.5rem 0;
+ text-align: center;
+}
+
+.home-hero-text {
+ font-size: 0.95rem;
+ color: #6b7280;
+ margin: 0;
+}
+
+.home-hero-text kbd {
+ display: inline-block;
+ padding: 0.15em 0.45em;
+ font-size: 0.85em;
+ font-family: inherit;
+ border: 1px solid #d1d5db;
+ border-radius: 4px;
+ background: #f3f4f6;
+ color: #374151;
+ line-height: 1.4;
+}
+
+html[data-theme='dark'] .home-hero-text {
+ color: #9ca3af;
+}
+
+html[data-theme='dark'] .home-hero-text kbd {
+ border-color: #4b5563;
+ background: rgba(255, 255, 255, 0.08);
+ color: #d1d5db;
+}
+
+.home-popular {
+ margin: 1.5rem 0 1rem;
+}
+
+.home-popular-title {
+ font-size: 1.1rem;
+ font-weight: 600;
+ margin-bottom: 0.75rem;
+}
+
+.home-popular-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 0.75rem;
+}
+
+.home-popular-card {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.75rem 1rem;
+ border: 1px solid #e5e7eb;
+ border-radius: 8px;
+ text-decoration: none !important;
+ color: #1f2937 !important;
+ font-size: 0.9rem;
+ font-weight: 500;
+ transition: border-color 0.2s, box-shadow 0.2s;
+ background: #fff;
+}
+
+.home-popular-card:hover {
+ border-color: #466aff;
+ box-shadow: 0 2px 8px rgba(70, 106, 255, 0.12);
+ color: #466aff !important;
+ text-decoration: none !important;
+}
+
+.home-popular-icon {
+ font-size: 1.15rem;
+ flex-shrink: 0;
+}
+
+html[data-theme='dark'] .home-popular-card {
+ background: rgba(255, 255, 255, 0.04);
+ border-color: rgba(255, 255, 255, 0.1);
+ color: #e5e7eb !important;
+}
+
+html[data-theme='dark'] .home-popular-card:hover {
+ border-color: #466aff;
+ color: #6b8cff !important;
+}
+
+@media (max-width: 768px) {
+ .home-popular-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 480px) {
+ .home-popular-grid {
+ grid-template-columns: 1fr;
+ }
}
\ No newline at end of file
diff --git a/src/theme/DocItem/Footer/index.js b/src/theme/DocItem/Footer/index.js
new file mode 100644
index 0000000..2cf220e
--- /dev/null
+++ b/src/theme/DocItem/Footer/index.js
@@ -0,0 +1,14 @@
+import React from 'react';
+import Footer from '@theme-original/DocItem/Footer';
+import HelpFeedback from '@site/src/components/HelpFeedback';
+import ExportButton from '@site/src/components/ExportButton';
+
+export default function FooterWrapper(props) {
+ return (
+ <>
+
+
+
+ >
+ );
+}
diff --git a/src/theme/Root.js b/src/theme/Root.js
new file mode 100644
index 0000000..0ab3e59
--- /dev/null
+++ b/src/theme/Root.js
@@ -0,0 +1,16 @@
+import React from 'react';
+import Root from '@theme-original/Root';
+import BackToTop from '@site/src/components/BackToTop';
+import ReadingProgress from '@site/src/components/ReadingProgress';
+import AIAssistant from '@site/src/components/AIAssistant';
+
+export default function RootWrapper(props) {
+ return (
+ <>
+
+
+
+
+ >
+ );
+}
diff --git a/static/js/search-no-result.js b/static/js/search-no-result.js
new file mode 100644
index 0000000..02c0b2e
--- /dev/null
+++ b/static/js/search-no-result.js
@@ -0,0 +1,157 @@
+(function () {
+ 'use strict';
+
+ var GUIDE_ID = 'search-no-result-guide';
+ var timer = null;
+ var pollTimer = null;
+
+ function getLang() {
+ return (document.documentElement.lang || 'zh-CN').startsWith('en') ? 'en' : 'zh';
+ }
+
+ function createGuide() {
+ var lang = getLang();
+ var guide = document.createElement('div');
+ guide.id = GUIDE_ID;
+ guide.className = 'search-no-result-guide';
+
+ if (lang === 'en') {
+ guide.innerHTML =
+ 'Try these popular docs:
' +
+ '' +
+ '';
+ } else {
+ guide.innerHTML =
+ '试试浏览这些热门文档:
' +
+ '' +
+ '';
+ }
+
+ return guide;
+ }
+
+ function removeGuide() {
+ var guide = document.getElementById(GUIDE_ID);
+ if (guide) guide.remove();
+ if (pollTimer) { clearInterval(pollTimer); pollTimer = null; }
+ }
+
+ function hasResults() {
+ var listbox = document.querySelector('[role="listbox"]');
+ if (!listbox) return false;
+
+ // 检查是否有除了我们引导之外的子元素
+ var hasOtherChildren = false;
+ var children = listbox.children;
+ for (var i = 0; i < children.length; i++) {
+ if (children[i].id !== GUIDE_ID) { hasOtherChildren = true; break; }
+ }
+ if (!hasOtherChildren) return false;
+
+ // 有子元素,但如果是无结果文字说明仍是无结果状态
+ var text = (listbox.textContent || '').trim();
+ if (text.includes('没有找到') || text.includes('没有结果') ||
+ text.includes('No results') || text.includes('未找到')) {
+ return false;
+ }
+
+ return true;
+ }
+
+ function showGuide() {
+ if (document.getElementById(GUIDE_ID)) return;
+
+ var listbox = document.querySelector('[role="listbox"]');
+ if (!listbox) return;
+
+ // 安全检查:如果此时已经有结果了,不要替换
+ if (hasResults()) return;
+
+ listbox.innerHTML = '';
+ listbox.appendChild(createGuide());
+
+ if (pollTimer) clearInterval(pollTimer);
+ pollTimer = setInterval(function () {
+ var input = document.querySelector('.navbar__search input');
+ if (!input || input.value.trim().length === 0) { removeGuide(); return; }
+ if (hasResults()) { removeGuide(); }
+ }, 300);
+ }
+
+ function check() {
+ removeGuide();
+ clearTimeout(timer);
+
+ timer = setTimeout(function () {
+ var input = document.querySelector('.navbar__search input');
+ if (!input || input.value.trim().length === 0) return;
+ if (!hasResults()) {
+ showGuide();
+ }
+ }, 800);
+ }
+
+ function onInput(e) {
+ if (!e.target.closest('.navbar__search')) return;
+ check();
+ }
+
+ // 搜索框已有文字时点击搜索框:反复检查,等插件渲染完再决定
+ function onFocus(e) {
+ if (!e.target.closest('.navbar__search input')) return;
+ if (e.target.value.trim().length === 0) return;
+
+ var attempts = 0;
+ var maxAttempts = 6;
+
+ function checkFocus() {
+ if (hasResults()) return; // 结果出现了,不用引导
+ var input = document.querySelector('.navbar__search input');
+ if (!input || input.value.trim().length === 0) return;
+ attempts++;
+ if (attempts < maxAttempts) {
+ setTimeout(checkFocus, 300);
+ } else if (!hasResults()) {
+ showGuide();
+ }
+ }
+
+ setTimeout(checkFocus, 400);
+ }
+
+ function onClickOutside(e) {
+ var guide = document.getElementById(GUIDE_ID);
+ if (!guide) return;
+ var searchEl = document.querySelector('.navbar__search');
+ if (searchEl && !searchEl.contains(e.target)) { removeGuide(); }
+ }
+
+ function init() {
+ document.addEventListener('input', onInput, true);
+ document.addEventListener('focus', onFocus, true);
+ document.addEventListener('click', onClickOutside, true);
+ document.addEventListener('keydown', function (e) {
+ if (e.key === 'Escape') removeGuide();
+ });
+ }
+
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', init);
+ } else {
+ init();
+ }
+})();
diff --git a/versioned_docs/version-1.1.0/intro.md b/versioned_docs/version-1.1.0/intro.md
index 80ca077..6af4c2e 100644
--- a/versioned_docs/version-1.1.0/intro.md
+++ b/versioned_docs/version-1.1.0/intro.md
@@ -6,7 +6,7 @@ slug: /
---
# 关于GitLink
-GitLink(确实开源)是CCF官方指定的开源创新服务平台,旨在以“为开源创新服务”为使命,以“成为开源创新的汇聚地”为愿景,秉承“创新、开放、协作、共享”的价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新工科人才培养的开源创新生态!
+GitLink(确实开源)是CCF官方指定的开源创新服务平台,旨在以"为开源创新服务"为使命,以"成为开源创新的汇聚地"为愿景,秉承"创新、开放、协作、共享"的价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新工科人才培养的开源创新生态!

@@ -18,7 +18,9 @@ GitLink(确实开源)是CCF官方指定的开源创新服务平台,旨在
- **多层次代码分析**:支持代码溯源分析、许可证风险分析、开源漏洞检测和加固建议;
- **多维度用户画像**:支持开发活动统计、贡献日历、能力建模、角色与专业定位分析。
-# 帮助文档
+---
+
+# 全部文档
帮助文档有助于您全面了解GitLink平台,让我们一起为开源创新贡献力量!
-
\ No newline at end of file
+
+
+---
+
+# 快速入口
+
+
+
按 Ctrl + K 搜索文档,或从下方热门内容开始
+
+
+
diff --git a/versioned_docs/version-1.1.0/代码库管理/成员管理.md b/versioned_docs/version-1.1.0/代码库管理/成员管理.md
index 2edb5ef..88be4ee 100644
--- a/versioned_docs/version-1.1.0/代码库管理/成员管理.md
+++ b/versioned_docs/version-1.1.0/代码库管理/成员管理.md
@@ -5,19 +5,19 @@ sidebar_position: 7
### **1. 成员管理入口**
在仓库主页,点击“仓库设置”按键,再点击”成员管理“按键,即可进入成员管理模块,如下图所示。

-
+
### **2. 筛选、搜索项目成员**
进入成员管理模块后,可以通过”角色筛选“按键来筛选项目成员类型,通过”搜索“按键可以检索具体的项目成员,如下图所示。

-
-### **3. 筛选、搜索项目成员**
+
+### **3. 添加项目成员**
进入成员管理模块后,可以通过”添加成员“按键来添加项目成员,左侧搜索框检索到具体用户并选中后,单击”添加成员“按键即可成功添加项目成员。

-
+
### **4. 项目成员权限管理**
进入成员管理模块后,单击项目成员右侧的角色栏,可以选择赋予该名项目成员的权限等级,如下图所示。

-
+
### **5. 删除项目成员**
-进入成员管理模块后,单击项目成员右侧的”删除“按键,可以删除改名项目成员,如下图所示。
+进入成员管理模块后,单击项目成员右侧的”删除“按键,可以删除该名项目成员,如下图所示。

diff --git a/versioned_docs/version-1.1.0/快速开始/提交第一行代码.md b/versioned_docs/version-1.1.0/快速开始/提交第一行代码.md
index 1436b02..9222014 100644
--- a/versioned_docs/version-1.1.0/快速开始/提交第一行代码.md
+++ b/versioned_docs/version-1.1.0/快速开始/提交第一行代码.md
@@ -19,4 +19,4 @@ sidebar_position: 3
## 3. 代码更新成功
-提交成功后代码代码更新成功。
\ No newline at end of file
+提交成功后代码更新成功。
\ No newline at end of file