diff --git a/404.html b/404.html new file mode 100644 index 000000000..685c023d6 --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ + + + + + + 404 | Twikoo 文档 + + + + + + + + + + + +
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 000000000..fe1afcc6f --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +twikoo.js.org diff --git a/QQ_API.html b/QQ_API.html new file mode 100644 index 000000000..ec35441ac --- /dev/null +++ b/QQ_API.html @@ -0,0 +1,215 @@ + + + + + + QQ私有化部署文档 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

QQ私有化部署文档

1. 下载go-cq

前往go-cqhttp release下载对应系统版本。

2. 配置服务

解压

Windows下请使用自己熟悉的解压软件自行解压

Linux下在命令行中输入tar -xzvf [文件名] 使用

Windows 标准方法

双击,根据提示生成运行脚本go-cqhttp_*.exe

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置文件请参考下方config.yml

config.yml配置好后 再次双击运行脚本

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

Linux 标准方法

通过 SSH 连接到服务器

cd到解压目录

输入 , 运行 ./go-cqhttp

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置config.yml

yaml

+# go-cqhttp 默认配置文件
+
+account: # 账号相关
+  uin:  # QQ账号
+  password: '' # 密码为空时使用扫码登录
+  encrypt: false  # 是否开启密码加密
+  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
+  relogin: # 重连设置
+    delay: 3   # 首次重连延迟, 单位秒
+    interval: 3   # 重连间隔
+    max-times: 0  # 最大重连次数, 0为无限制
+
+  # 是否使用服务器下发的新地址进行重连
+  # 注意, 此设置可能导致在海外服务器上连接情况更差
+  use-sso-address: true
+
+heartbeat:
+  # 心跳频率, 单位秒
+  # -1 为关闭心跳
+  interval: 5
+
+message:
+  # 上报数据类型
+  # 可选: string,array
+  post-format: string
+  # 是否忽略无效的CQ码, 如果为假将原样发送
+  ignore-invalid-cqcode: false
+  # 是否强制分片发送消息
+  # 分片发送将会带来更快的速度
+  # 但是兼容性会有些问题
+  force-fragment: false
+  # 是否将url分片发送
+  fix-url: false
+  # 下载图片等请求网络代理
+  proxy-rewrite: ''
+  # 是否上报自身消息
+  report-self-message: false
+  # 移除服务端的Reply附带的At
+  remove-reply-at: false
+  # 为Reply附加更多信息
+  extra-reply-data: false
+
+output:
+  # 日志等级 trace,debug,info,warn,error
+  log-level: warn
+  # 是否启用 DEBUG
+  debug: false # 开启调试模式
+
+# 默认中间件锚点
+default-middlewares: &default
+  # 访问密钥, 强烈推荐在公网的服务器设置
+  access-token: ''
+  # 事件过滤器文件目录
+  filter: ''
+  # API限速设置
+  # 该设置为全局生效
+  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
+  # 目前该限速设置为令牌桶算法, 请参考:
+  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
+  rate-limit:
+    enabled: true # 是否启用限速
+    frequency: 1  # 令牌回复频率, 单位秒
+    bucket: 1     # 令牌桶大小
+
+database: # 数据库相关设置
+  leveldb:
+    # 是否启用内置leveldb数据库
+    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
+    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
+    enable: true
+
+# 连接服务列表
+servers:
+  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
+  #- http: # http 通信
+  #- ws:   # 正向 Websocket
+  #- ws-reverse: # 反向 Websocket
+  #- pprof: #性能分析服务器
+  # HTTP 通信设置
+  - http:
+      # 服务端监听地址
+      host: 127.0.0.1
+      # 服务端监听端口
+      port: 5700
+      # 反向HTTP超时时间, 单位秒
+      # 最小值为5,小于5将会忽略本项设置
+      timeout: 5
+      middlewares:
+        <<: *default # 引用默认中间件
+      # 反向HTTP POST地址列表
+      post:
+      #- url: '' # 地址
+      #  secret: ''           # 密钥
+      #- url: 127.0.0.1:5701 # 地址
+      #  secret: ''          # 密钥

+# go-cqhttp 默认配置文件
+
+account: # 账号相关
+  uin:  # QQ账号
+  password: '' # 密码为空时使用扫码登录
+  encrypt: false  # 是否开启密码加密
+  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
+  relogin: # 重连设置
+    delay: 3   # 首次重连延迟, 单位秒
+    interval: 3   # 重连间隔
+    max-times: 0  # 最大重连次数, 0为无限制
+
+  # 是否使用服务器下发的新地址进行重连
+  # 注意, 此设置可能导致在海外服务器上连接情况更差
+  use-sso-address: true
+
+heartbeat:
+  # 心跳频率, 单位秒
+  # -1 为关闭心跳
+  interval: 5
+
+message:
+  # 上报数据类型
+  # 可选: string,array
+  post-format: string
+  # 是否忽略无效的CQ码, 如果为假将原样发送
+  ignore-invalid-cqcode: false
+  # 是否强制分片发送消息
+  # 分片发送将会带来更快的速度
+  # 但是兼容性会有些问题
+  force-fragment: false
+  # 是否将url分片发送
+  fix-url: false
+  # 下载图片等请求网络代理
+  proxy-rewrite: ''
+  # 是否上报自身消息
+  report-self-message: false
+  # 移除服务端的Reply附带的At
+  remove-reply-at: false
+  # 为Reply附加更多信息
+  extra-reply-data: false
+
+output:
+  # 日志等级 trace,debug,info,warn,error
+  log-level: warn
+  # 是否启用 DEBUG
+  debug: false # 开启调试模式
+
+# 默认中间件锚点
+default-middlewares: &default
+  # 访问密钥, 强烈推荐在公网的服务器设置
+  access-token: ''
+  # 事件过滤器文件目录
+  filter: ''
+  # API限速设置
+  # 该设置为全局生效
+  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
+  # 目前该限速设置为令牌桶算法, 请参考:
+  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
+  rate-limit:
+    enabled: true # 是否启用限速
+    frequency: 1  # 令牌回复频率, 单位秒
+    bucket: 1     # 令牌桶大小
+
+database: # 数据库相关设置
+  leveldb:
+    # 是否启用内置leveldb数据库
+    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
+    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
+    enable: true
+
+# 连接服务列表
+servers:
+  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
+  #- http: # http 通信
+  #- ws:   # 正向 Websocket
+  #- ws-reverse: # 反向 Websocket
+  #- pprof: #性能分析服务器
+  # HTTP 通信设置
+  - http:
+      # 服务端监听地址
+      host: 127.0.0.1
+      # 服务端监听端口
+      port: 5700
+      # 反向HTTP超时时间, 单位秒
+      # 最小值为5,小于5将会忽略本项设置
+      timeout: 5
+      middlewares:
+        <<: *default # 引用默认中间件
+      # 反向HTTP POST地址列表
+      post:
+      #- url: '' # 地址
+      #  secret: ''           # 密钥
+      #- url: 127.0.0.1:5701 # 地址
+      #  secret: ''          # 密钥

再次运行./go-cqhttp

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

注意:将你配置的端口号在防火墙里面放行或者使用反向代理将你设置的端口绑定到域名

注意:公网使用一定要配置token

3. twikoo配置

在twikoo中QQ私有化API配置项填写如下内容

QQ号 http://你的IP地址:端口号(或者域名)/send_private_msg?user_id=QQ号?token=你配置的token

QQ群 http://你的IP地址:端口号(或者域名)/send_group_msg?token=你配置的token?group_id=群号

配置完成

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/api.html b/api.html new file mode 100644 index 000000000..9598e4dee --- /dev/null +++ b/api.html @@ -0,0 +1,133 @@ + + + + + + API 文档 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

API 文档

通过 Twikoo API,主题开发者可以实现一些特殊的功能,例如:在文章列表显示文章评论数,在首页显示最新评论,等。

调用 Twikoo API 前,不需要 执行 twikoo.init()

Get comments count

批量获取文章评论数。

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 不包含协议、域名、参数的文章路径列表,必传参数
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // 评论数是否包括回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回示例: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});
twikoo.getCommentsCount({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 不包含协议、域名、参数的文章路径列表,必传参数
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // 评论数是否包括回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回示例: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

Get recent comments

获取最新评论。

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  pageSize: 10, // 获取多少条,默认:10,最大:100
+  includeReply: false // 是否包括最新回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回 Array,包含最新评论的
+  //   * id:           评论 ID
+  //   * url:          评论地址
+  //   * nick:         昵称
+  //   * mailMd5:      邮箱的 MD5 值,可用于展示头像
+  //   * link:         网址
+  //   * comment:      HTML 格式的评论内容
+  //   * commentText:  纯文本格式的评论内容
+  //   * created:      评论时间,格式为毫秒级时间戳
+  //   * avatar:       头像地址(0.2.9 新增)
+  //   * relativeTime: 相对评论时间,如 “1 小时前”(0.2.9 新增)
+  // 返回示例: [ // 从新到旧顺序
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});
twikoo.getRecentComments({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  pageSize: 10, // 获取多少条,默认:10,最大:100
+  includeReply: false // 是否包括最新回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回 Array,包含最新评论的
+  //   * id:           评论 ID
+  //   * url:          评论地址
+  //   * nick:         昵称
+  //   * mailMd5:      邮箱的 MD5 值,可用于展示头像
+  //   * link:         网址
+  //   * comment:      HTML 格式的评论内容
+  //   * commentText:  纯文本格式的评论内容
+  //   * created:      评论时间,格式为毫秒级时间戳
+  //   * avatar:       头像地址(0.2.9 新增)
+  //   * relativeTime: 相对评论时间,如 “1 小时前”(0.2.9 新增)
+  // 返回示例: [ // 从新到旧顺序
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

On Twikoo loaded

Twikoo 成功挂载后的回调函数。
环境 ID 错误、网络异常、挂载失败等情况时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo 加载完成');
+});
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo 加载完成');
+});

On comment loaded

评论加载成功后的回调函数。
发表评论后自动刷新评论时、加载下一页评论时,也会触发。
评论加载失败时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('评论加载完成');
+  }
+});
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('评论加载完成');
+  }
+});

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/assets/QQ_API.md.e25600dc.js b/assets/QQ_API.md.e25600dc.js new file mode 100644 index 000000000..6046d711f --- /dev/null +++ b/assets/QQ_API.md.e25600dc.js @@ -0,0 +1,191 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.7d2df8c6.js";const d=JSON.parse('{"title":"QQ私有化部署文档","description":"","frontmatter":{},"headers":[],"relativePath":"QQ_API.md","filePath":"QQ_API.md","lastUpdated":null}'),p={name:"QQ_API.md"},o=l(`

QQ私有化部署文档

1. 下载go-cq

前往go-cqhttp release下载对应系统版本。

2. 配置服务

解压

Windows下请使用自己熟悉的解压软件自行解压

Linux下在命令行中输入tar -xzvf [文件名] 使用

Windows 标准方法

双击,根据提示生成运行脚本go-cqhttp_*.exe

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置文件请参考下方config.yml

config.yml配置好后 再次双击运行脚本

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

Linux 标准方法

通过 SSH 连接到服务器

cd到解压目录

输入 , 运行 ./go-cqhttp

[WARNING]: 尝试加载配置文件 config.yml 失败: 文件不存在 [INFO]: 默认配置文件已生成,请编辑 config.yml 后重启程序.

配置config.yml

yaml

+# go-cqhttp 默认配置文件
+
+account: # 账号相关
+  uin:  # QQ账号
+  password: '' # 密码为空时使用扫码登录
+  encrypt: false  # 是否开启密码加密
+  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
+  relogin: # 重连设置
+    delay: 3   # 首次重连延迟, 单位秒
+    interval: 3   # 重连间隔
+    max-times: 0  # 最大重连次数, 0为无限制
+
+  # 是否使用服务器下发的新地址进行重连
+  # 注意, 此设置可能导致在海外服务器上连接情况更差
+  use-sso-address: true
+
+heartbeat:
+  # 心跳频率, 单位秒
+  # -1 为关闭心跳
+  interval: 5
+
+message:
+  # 上报数据类型
+  # 可选: string,array
+  post-format: string
+  # 是否忽略无效的CQ码, 如果为假将原样发送
+  ignore-invalid-cqcode: false
+  # 是否强制分片发送消息
+  # 分片发送将会带来更快的速度
+  # 但是兼容性会有些问题
+  force-fragment: false
+  # 是否将url分片发送
+  fix-url: false
+  # 下载图片等请求网络代理
+  proxy-rewrite: ''
+  # 是否上报自身消息
+  report-self-message: false
+  # 移除服务端的Reply附带的At
+  remove-reply-at: false
+  # 为Reply附加更多信息
+  extra-reply-data: false
+
+output:
+  # 日志等级 trace,debug,info,warn,error
+  log-level: warn
+  # 是否启用 DEBUG
+  debug: false # 开启调试模式
+
+# 默认中间件锚点
+default-middlewares: &default
+  # 访问密钥, 强烈推荐在公网的服务器设置
+  access-token: ''
+  # 事件过滤器文件目录
+  filter: ''
+  # API限速设置
+  # 该设置为全局生效
+  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
+  # 目前该限速设置为令牌桶算法, 请参考:
+  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
+  rate-limit:
+    enabled: true # 是否启用限速
+    frequency: 1  # 令牌回复频率, 单位秒
+    bucket: 1     # 令牌桶大小
+
+database: # 数据库相关设置
+  leveldb:
+    # 是否启用内置leveldb数据库
+    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
+    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
+    enable: true
+
+# 连接服务列表
+servers:
+  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
+  #- http: # http 通信
+  #- ws:   # 正向 Websocket
+  #- ws-reverse: # 反向 Websocket
+  #- pprof: #性能分析服务器
+  # HTTP 通信设置
+  - http:
+      # 服务端监听地址
+      host: 127.0.0.1
+      # 服务端监听端口
+      port: 5700
+      # 反向HTTP超时时间, 单位秒
+      # 最小值为5,小于5将会忽略本项设置
+      timeout: 5
+      middlewares:
+        <<: *default # 引用默认中间件
+      # 反向HTTP POST地址列表
+      post:
+      #- url: '' # 地址
+      #  secret: ''           # 密钥
+      #- url: 127.0.0.1:5701 # 地址
+      #  secret: ''          # 密钥

+# go-cqhttp 默认配置文件
+
+account: # 账号相关
+  uin:  # QQ账号
+  password: '' # 密码为空时使用扫码登录
+  encrypt: false  # 是否开启密码加密
+  status: 0      # 在线状态 请参考 https://docs.go-cqhttp.org/guide/config.html#在线状态
+  relogin: # 重连设置
+    delay: 3   # 首次重连延迟, 单位秒
+    interval: 3   # 重连间隔
+    max-times: 0  # 最大重连次数, 0为无限制
+
+  # 是否使用服务器下发的新地址进行重连
+  # 注意, 此设置可能导致在海外服务器上连接情况更差
+  use-sso-address: true
+
+heartbeat:
+  # 心跳频率, 单位秒
+  # -1 为关闭心跳
+  interval: 5
+
+message:
+  # 上报数据类型
+  # 可选: string,array
+  post-format: string
+  # 是否忽略无效的CQ码, 如果为假将原样发送
+  ignore-invalid-cqcode: false
+  # 是否强制分片发送消息
+  # 分片发送将会带来更快的速度
+  # 但是兼容性会有些问题
+  force-fragment: false
+  # 是否将url分片发送
+  fix-url: false
+  # 下载图片等请求网络代理
+  proxy-rewrite: ''
+  # 是否上报自身消息
+  report-self-message: false
+  # 移除服务端的Reply附带的At
+  remove-reply-at: false
+  # 为Reply附加更多信息
+  extra-reply-data: false
+
+output:
+  # 日志等级 trace,debug,info,warn,error
+  log-level: warn
+  # 是否启用 DEBUG
+  debug: false # 开启调试模式
+
+# 默认中间件锚点
+default-middlewares: &default
+  # 访问密钥, 强烈推荐在公网的服务器设置
+  access-token: ''
+  # 事件过滤器文件目录
+  filter: ''
+  # API限速设置
+  # 该设置为全局生效
+  # 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
+  # 目前该限速设置为令牌桶算法, 请参考:
+  # https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
+  rate-limit:
+    enabled: true # 是否启用限速
+    frequency: 1  # 令牌回复频率, 单位秒
+    bucket: 1     # 令牌桶大小
+
+database: # 数据库相关设置
+  leveldb:
+    # 是否启用内置leveldb数据库
+    # 启用将会增加10-20MB的内存占用和一定的磁盘空间
+    # 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
+    enable: true
+
+# 连接服务列表
+servers:
+  # 添加方式,同一连接方式可添加多个,具体配置说明请查看文档
+  #- http: # http 通信
+  #- ws:   # 正向 Websocket
+  #- ws-reverse: # 反向 Websocket
+  #- pprof: #性能分析服务器
+  # HTTP 通信设置
+  - http:
+      # 服务端监听地址
+      host: 127.0.0.1
+      # 服务端监听端口
+      port: 5700
+      # 反向HTTP超时时间, 单位秒
+      # 最小值为5,小于5将会忽略本项设置
+      timeout: 5
+      middlewares:
+        <<: *default # 引用默认中间件
+      # 反向HTTP POST地址列表
+      post:
+      #- url: '' # 地址
+      #  secret: ''           # 密钥
+      #- url: 127.0.0.1:5701 # 地址
+      #  secret: ''          # 密钥

再次运行./go-cqhttp

[INFO]: 登录成功 欢迎使用: balabala

如出现需要认证的信息, 请自行认证设备。

此时, 基础配置完成

注意:将你配置的端口号在防火墙里面放行或者使用反向代理将你设置的端口绑定到域名

注意:公网使用一定要配置token

3. twikoo配置

在twikoo中QQ私有化API配置项填写如下内容

QQ号 http://你的IP地址:端口号(或者域名)/send_private_msg?user_id=QQ号?token=你配置的token

QQ群 http://你的IP地址:端口号(或者域名)/send_group_msg?token=你配置的token?group_id=群号

配置完成

`,33),e=[o];function c(t,r,E,y,i,A){return n(),a("div",null,e)}const u=s(p,[["render",c]]);export{d as __pageData,u as default}; diff --git a/assets/QQ_API.md.e25600dc.lean.js b/assets/QQ_API.md.e25600dc.lean.js new file mode 100644 index 000000000..838631b16 --- /dev/null +++ b/assets/QQ_API.md.e25600dc.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.7d2df8c6.js";const d=JSON.parse('{"title":"QQ私有化部署文档","description":"","frontmatter":{},"headers":[],"relativePath":"QQ_API.md","filePath":"QQ_API.md","lastUpdated":null}'),p={name:"QQ_API.md"},o=l("",33),e=[o];function c(t,r,E,y,i,A){return n(),a("div",null,e)}const u=s(p,[["render",c]]);export{d as __pageData,u as default}; diff --git a/assets/api.md.653ece4c.js b/assets/api.md.653ece4c.js new file mode 100644 index 000000000..b63cd686d --- /dev/null +++ b/assets/api.md.653ece4c.js @@ -0,0 +1,109 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.7d2df8c6.js";const m=JSON.parse('{"title":"API 文档","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),p={name:"api.md"},o=l(`

API 文档

通过 Twikoo API,主题开发者可以实现一些特殊的功能,例如:在文章列表显示文章评论数,在首页显示最新评论,等。

调用 Twikoo API 前,不需要 执行 twikoo.init()

Get comments count

批量获取文章评论数。

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 不包含协议、域名、参数的文章路径列表,必传参数
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // 评论数是否包括回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回示例: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});
twikoo.getCommentsCount({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  urls: [ // 不包含协议、域名、参数的文章路径列表,必传参数
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // 评论数是否包括回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回示例: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

Get recent comments

获取最新评论。

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  pageSize: 10, // 获取多少条,默认:10,最大:100
+  includeReply: false // 是否包括最新回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回 Array,包含最新评论的
+  //   * id:           评论 ID
+  //   * url:          评论地址
+  //   * nick:         昵称
+  //   * mailMd5:      邮箱的 MD5 值,可用于展示头像
+  //   * link:         网址
+  //   * comment:      HTML 格式的评论内容
+  //   * commentText:  纯文本格式的评论内容
+  //   * created:      评论时间,格式为毫秒级时间戳
+  //   * avatar:       头像地址(0.2.9 新增)
+  //   * relativeTime: 相对评论时间,如 “1 小时前”(0.2.9 新增)
+  // 返回示例: [ // 从新到旧顺序
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});
twikoo.getRecentComments({
+  envId: '您的环境id', // 环境 ID
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,如果您的环境地域不是上海,需传此参数
+  pageSize: 10, // 获取多少条,默认:10,最大:100
+  includeReply: false // 是否包括最新回复,默认:false
+}).then(function (res) {
+  console.log(res);
+  // 返回 Array,包含最新评论的
+  //   * id:           评论 ID
+  //   * url:          评论地址
+  //   * nick:         昵称
+  //   * mailMd5:      邮箱的 MD5 值,可用于展示头像
+  //   * link:         网址
+  //   * comment:      HTML 格式的评论内容
+  //   * commentText:  纯文本格式的评论内容
+  //   * created:      评论时间,格式为毫秒级时间戳
+  //   * avatar:       头像地址(0.2.9 新增)
+  //   * relativeTime: 相对评论时间,如 “1 小时前”(0.2.9 新增)
+  // 返回示例: [ // 从新到旧顺序
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  //   { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // 发生错误
+  console.error(err);
+});

On Twikoo loaded

Twikoo 成功挂载后的回调函数。
环境 ID 错误、网络异常、挂载失败等情况时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo 加载完成');
+});
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo 加载完成');
+});

On comment loaded

评论加载成功后的回调函数。
发表评论后自动刷新评论时、加载下一页评论时,也会触发。
评论加载失败时不会触发。

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('评论加载完成');
+  }
+});
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('评论加载完成');
+  }
+});
`,27),e=[o];function c(t,r,E,i,y,d){return n(),a("div",null,e)}const u=s(p,[["render",c]]);export{m as __pageData,u as default}; diff --git a/assets/api.md.653ece4c.lean.js b/assets/api.md.653ece4c.lean.js new file mode 100644 index 000000000..acccd0a47 --- /dev/null +++ b/assets/api.md.653ece4c.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.7d2df8c6.js";const m=JSON.parse('{"title":"API 文档","description":"","frontmatter":{},"headers":[],"relativePath":"api.md","filePath":"api.md","lastUpdated":null}'),p={name:"api.md"},o=l("",27),e=[o];function c(t,r,E,i,y,d){return n(),a("div",null,e)}const u=s(p,[["render",c]]);export{m as __pageData,u as default}; diff --git a/assets/app.b1c7ef61.js b/assets/app.b1c7ef61.js new file mode 100644 index 000000000..f8c9b532b --- /dev/null +++ b/assets/app.b1c7ef61.js @@ -0,0 +1 @@ +import{h as j,a2 as L,j as A,o as r,c as R,b as l,I as d,k as f,w as y,l as P,H as v,s as g,a3 as N,a4 as T,a5 as B,a6 as J,a7 as D,a8 as O,a9 as F,aa as I,ab as W,ac as G,W as V,d as S,u as U,y as Y,ad as $,ae as E,af as H,ag as M}from"./chunks/framework.7d2df8c6.js";import{t as w}from"./chunks/theme.7669522f.js";const Z={class:"comment-container"},K=f("link",{rel:"stylesheet",href:"https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css",integrity:"sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X",crossorigin:"anonymous"},null,-1),Q=f("link",{rel:"stylesheet",href:"https://cdn.staticfile.org/lightgallery/2.1.8/css/lightgallery.css"},null,-1),q=f("div",{id:"twikoo"},null,-1),z="https://twikoojsorg.imaegoo.com",k={__name:"Twikoo",setup(t){const e=j(null),n=L();function a(){try{twikoo.init({envId:z,onCommentLoaded:u})}catch{}}function u(){for(var s=document.getElementsByClassName("tk-content"),p=0;p0){for(var m=0;m{a(),b()}),(s,p)=>(r(),R("div",Z,[K,(r(),l(d("script"),{defer:"",src:"https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js",integrity:"sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4",crossorigin:"anonymous"})),(r(),l(d("script"),{defer:"",src:"https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js",integrity:"sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa",crossorigin:"anonymous"})),Q,(r(),l(d("script"),{src:"https://cdn.staticfile.org/lightgallery/2.1.8/lightgallery.min.js"})),q,(r(),l(d("script"),{src:"https://cdn.jsdelivr.net/npm/twikoo@1.6.22/dist/twikoo.all.min.js",ref_key:"twikooJs",ref:e},null,512))]))}};const X={class:"home-comment-container"},ee={__name:"Layout",setup(t){const{Layout:e}=w;return(n,a)=>(r(),l(P(e),null,{"home-features-after":y(()=>[f("div",X,[v(k)])]),"doc-after":y(()=>[v(k)]),_:1}))}},te={...w,Layout:ee};function C(t){if(t.extends){const e=C(t.extends);return{...e,...t,async enhanceApp(n){e.enhanceApp&&await e.enhanceApp(n),t.enhanceApp&&await t.enhanceApp(n)}}}return t}const i=C(te),ne=S({name:"VitePressApp",setup(){const{site:t}=U();return A(()=>{Y(()=>{document.documentElement.lang=t.value.lang,document.documentElement.dir=t.value.dir})}),$(),E(),H(),i.setup&&i.setup(),()=>M(i.Layout)}});async function ae(){const t=oe(),e=se();e.provide(T,t);const n=B(t.route);return e.provide(J,n),e.component("Content",D),e.component("ClientOnly",O),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get(){return n.frontmatter.value}},$params:{get(){return n.page.value.params}}}),i.enhanceApp&&await i.enhanceApp({app:e,router:t,siteData:F}),{app:e,router:t,data:n}}function se(){return I(ne)}function oe(){let t=g,e;return W(n=>{let a=G(n),u=null;return a&&(t&&(e=a),(t||e===a)&&(a=a.replace(/\.js$/,".lean.js")),u=V(()=>import(a),[])),g&&(t=!1),u},i.NotFound)}g&&ae().then(({app:t,router:e,data:n})=>{e.go().then(()=>{N(e.route,n.site),t.mount("#app")})});export{ae as createApp}; diff --git a/assets/backend.md.237bd45c.js b/assets/backend.md.237bd45c.js new file mode 100644 index 000000000..b43dc00e5 --- /dev/null +++ b/assets/backend.md.237bd45c.js @@ -0,0 +1,27 @@ +import{_ as e,o as l,c as t,Q as n}from"./chunks/framework.7d2df8c6.js";const s="/assets/mongodb-1.b467da78.png",o="/assets/mongodb-2.d2431ba3.png",a="/assets/mongodb-3.98ac6e22.png",p="/assets/netlify-1.c6c64abb.png",r="/assets/netlify-2.4f0d58e4.png",c="/assets/netlify-3.4f565e5d.png",i="/assets/netlify-4.1647e7f0.png",d="/assets/netlify-5.a29645d7.png",w=JSON.parse('{"title":"云函数部署","description":"","frontmatter":{},"headers":[],"relativePath":"backend.md","filePath":"backend.md","lastUpdated":null}'),y={name:"backend.md"},E=n(`

云函数部署

部署方式
推荐度描述
腾讯云一键部署★☆☆☆☆虽然方便,但是仅支持按量计费环境——也就是说,一键部署的环境,当免费资源用尽后,将会产生费用。且按量计费环境无法切换为包年包月环境。免费额度数据库读操作数只有 500 次 / 天,无法支撑 Twikoo 的运行需求
腾讯云手动部署★★☆☆☆手动部署到腾讯云云开发环境,在中国大陆访问速度较快。需要付费购买环境才能部署。
腾讯云命令行部署★☆☆☆☆仅针对有 Node.js 经验的开发者。
Vercel 部署★★★☆☆适用于想要免费部署的用户,在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度。
Railway 部署★★☆☆☆有免费额度但不足以支持一个月连续运行,部署简单,适合全球访问。
Zeabur 部署★☆☆☆☆需要绑定支付宝或信用卡,部署简单,适合中国大陆访问,免费计划环境随时可能会被删除。
Netlify 部署★★★★☆有充足的免费额度,中国大陆访问速度不错。
私有部署★★☆☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。
私有部署 (Docker)★★★☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。

腾讯云一键部署

  1. 点击以下按钮将 Twikoo 一键部署到云开发
    部署到云开发
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”

腾讯云手动部署

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐,点击“立即购买”,按提示创建好环境。

提示

  • 推荐创建上海环境。如选择广州环境,需要在 twikoo.init() 时额外指定环境 region: "ap-guangzhou"
  • 环境名称自由填写
  • 推荐选择计费方式包年包月,套餐版本基础版 1,超出免费额度不会收费
  • 如果提示选择“应用模板”,请选择“空模板”
  1. 进入云开发控制台
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  4. 进入环境-云函数,点击“新建云函数”
  5. 函数名称请填写:twikoo,创建方式请选择:空白函数,运行环境请选择:Nodejs 10.15,函数内存请选择:128MB,点击“下一步”
  6. 清空输入框中的示例代码,复制以下代码、粘贴到“函数代码”输入框中,点击“确定”
js
exports.main = require('twikoo-func').main
exports.main = require('twikoo-func').main
  1. 创建完成后,点击“twikoo"进入云函数详情页,进入“函数代码”标签,点击“文件 - 新建文件”,输入 package.json,回车
  2. 复制以下代码、粘贴到代码框中,点击“保存并安装依赖”
json
{ "dependencies": { "twikoo-func": "1.6.22" } }
{ "dependencies": { "twikoo-func": "1.6.22" } }

腾讯云命令行部署

注意

  • 请确保您已经安装了 Node.js
  • 请将命令、代码中“您的环境id”替换为您自己的环境id
  • 第 7 步会弹出浏览器要求授权,需在有图形界面的系统下进行
  • 请勿在 Termux 下操作。虽然可以部署成功,但是使用时会报错 [FUNCTIONS_EXECUTE_FAIL] Error: EACCES: permission denied, open '/var/user/index.js'

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐(一般 0 元套餐即可),点击“立即购买”,按提示创建好环境。
  2. 进入云开发控制台
  3. 进入环境-登录授权,启用“匿名登录”
  4. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  5. 克隆本仓库
sh
git clone https://github.com/twikoojs/twikoo.git # 或 git clone https://e.coding.net/imaegoo/twikoo/twikoo.git
+cd twikoo
git clone https://github.com/twikoojs/twikoo.git # 或 git clone https://e.coding.net/imaegoo/twikoo/twikoo.git
+cd twikoo

如果您没有安装 Git,也可以从 Release 页面下载最新的 Source code
如果您所在的地区访问 Github 速度慢,也可以尝试另一个仓库地址:https://imaegoo.coding.net/public/twikoo/twikoo/git

  1. 安装依赖项
sh
npm install -g yarn # 已安装 yarn 可以跳过此步
+yarn install
npm install -g yarn # 已安装 yarn 可以跳过此步
+yarn install
  1. 授权云开发环境(此命令会弹出浏览器要求授权,需在有图形界面的系统下进行)
sh
yarn run login
yarn run login
  1. 自动部署
sh
yarn deploy -e 您的环境id
yarn deploy -e 您的环境id

Vercel 部署

注意

Vercel 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

默认域名 *.vercel.app 在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度

查看视频教程

  1. 申请 MongoDB 账号
  2. 创建免费 MongoDB 数据库,区域推荐选择 AWS / N. Virginia (us-east-1)
  3. 在 Database Access 页面点击 Add New Database User 创建数据库用户,Authentication Method 选 Password,在 Password Authentication 下设置数据库用户名和密码,用户名和密码可包含数字和大小写字母,请勿包含特殊符号。点击 Database User Privileges 下方的 Add Built In Role,Select Role 选择 Atlas Admin,最后点击 Add User

  1. 在 Network Access 页面点击 Add IP Address,Access List Entry 输入 0.0.0.0/0(允许所有 IP 地址的连接),点击 Confirm

  1. 在 Database 页面点击 Connect,连接方式选择 Drivers,并记录数据库连接字符串,请将连接字符串中的 <username>:<password> 修改为刚刚创建的数据库 用户名:密码

  1. 申请 Vercel 账号
  2. 点击以下按钮将 Twikoo 一键部署到 Vercel

  1. 进入 Settings - Environment Variables,添加环境变量 MONGODB_URI,值为前面记录的数据库连接字符串
  2. 进入 Deployments , 然后在任意一项后面点击更多(三个点) , 然后点击Redeploy , 最后点击下面的Redeploy
  3. 进入 Overview,点击 Domains 下方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示
  4. Vercel Domains(包含 https:// 前缀,例如 https://xxx.vercel.app)即为您的环境 id

Railway 部署

注意

Railway 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Railway 申请并登录账号,点击 New Project - Provision MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Railway 点击 New - GitHub Repo - Configure GitHub App - 授权 GitHub - 选择刚才 fork 的仓库,等待部署完成
  4. 点开环境卡片 - Variables - New Variable,左边输入 PORT 右边输入 8080 然后点 Add
  5. 同样地,添加 MongoDB 相关环境变量 - New Variable - Add Reference - MONGO* - Add,重复步骤以添加 MONGOHOSTMONGOPASSWORDMONGOPORTMONGOUSERMONGO_URL 环境变量。
  6. 点开环境卡片 - Settings - Environment - Domains,绑定一个域名(例如 mytwikoo.up.railway.app
  7. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.up.railway.app

Zeabur 部署

注意

Zeabur 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Zeabur 申请并登录账号,点击部署新服务 - 部署其他服务 - 部署 MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Zeabur 点击部署新服务 - 部署你的源代码 - 授权 GitHub - 选择刚才 fork 的仓库,名称随意

无需配置数据库连接字符串! Zeabur 已自动配置

  1. 部署好后点开环境卡片 - 设置 - 域名,绑定一个域名(例如 mytwikoo.zeabur.app
  2. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.zeabur.app

Netlify 部署

注意

Netlify 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

Netlify 免费等级(Functions Level 0)支持每月 125,000 请求次数和 100 小时函数计算时长

  1. 申请 MongoDB 账号
  2. 创建免费 MongoDB 数据库,区域推荐选择 AWS / N. Virginia (us-east-1)
  3. 在 Database Access 页面点击 Add New Database User 创建数据库用户,Authentication Method 选 Password,在 Password Authentication 下设置数据库用户名和密码,用户名和密码可包含数字和大小写字母,请勿包含特殊符号。点击 Database User Privileges 下方的 Add Built In Role,Select Role 选择 Atlas Admin,最后点击 Add User

  1. 在 Network Access 页面点击 Add IP Address,Access List Entry 输入 0.0.0.0/0(允许所有 IP 地址的连接),点击 Confirm

  1. 在 Database 页面点击 Connect,连接方式选择 Drivers,并记录数据库连接字符串,请将连接字符串中的 <username>:<password> 修改为刚刚创建的数据库 用户名:密码

  1. 申请并登录 Netlify 账号,创建一个 Team
  2. 打开 twikoojs/twikoo-netlify 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Netlify,点击 Add new site - Import an existing project

  1. 点击 Deploy with GitHub,如果未授权 GitHub 账号,先授权,然后选择前面 fork 的 twikoo-netlify 项目

  1. 点击 Add environment variables - New variable,Key 输入 MONGODB_URI,Value 输入前面记录的数据库连接字符串,点击 Deploy twikoo-netlify

  1. 部署完成后,点击 Domain settings - 右侧 Options - Edit site name,可以设置属于自己的三级域名(https://xxx.netlify.app

  1. 进入 Site overview,点击上方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示

  1. 云函数地址(包含 https:// 前缀和 /.netlify/functions/twikoo 后缀,例如 https://xxx.netlify.app/.netlify/functions/twikoo)即为您的环境 id

私有部署

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署对服务器系统没有要求,Windows、Ubuntu、CentOS、macOS 等常用系统均支持。

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

  1. 服务端下载安装 Node.js
  2. 安装 Twikoo server: npm i -g tkserver
  3. 根据需要配置环境变量,所有的环境变量都是可选的
名称描述默认值
MONGODB_URIMongoDB 数据库连接字符串,不传则使用 lokijsnull
MONGO_URLMongoDB 数据库连接字符串,不传则使用 lokijsnull
TWIKOO_DATAlokijs 数据库存储路径./data
TWIKOO_PORT端口号8080
TWIKOO_THROTTLEIP 请求限流,当同一 IP 短时间内请求次数超过阈值将对该 IP 返回错误250
TWIKOO_LOCALHOST_ONLYtrue时只监听本地请求,使得 nginx 等服务器反代之后不暴露原始端口null
TWIKOO_LOG_LEVEL日志级别,支持 verbose / info / warn / errorinfo
TWIKOO_IP_HEADERS在一些特殊情况下使用,如使用了CloudFlare CDN 它会将请求 IP 写到请求头的 cf-connecting-ip 字段上,为了能够正确的获取请求 IP 你可以写成 ['headers.cf-connecting-ip'][]
  1. 启动 Twikoo server: tkserver
  2. 访问 http://服务端IP:8080 测试服务是否启动成功
  3. 配置前置代理实现 HTTPS 访问(可以用 Nginx、负载均衡或 Cloudflare 等)
  4. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://twikoo.yourdomain.com

提示

  1. Linux 服务器可以用 nohup tkserver >> tkserver.log 2>&1 & 命令后台启动
  2. 数据默认在 data 目录,请注意定期备份数据

私有部署 (Docker)

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

Docker

sh
docker run --name twikoo -e TWIKOO_THROTTLE=1000 -p 8080:8080 -v \${PWD}/data:/app/data -d imaegoo/twikoo
docker run --name twikoo -e TWIKOO_THROTTLE=1000 -p 8080:8080 -v \${PWD}/data:/app/data -d imaegoo/twikoo

Docker Compose

yml
version: '3'
+services:
+  twikoo:
+    image: imaegoo/twikoo
+    container_name: twikoo
+    restart: unless-stopped
+    ports:
+      - 8080:8080
+    environment:
+      TWIKOO_THROTTLE: 1000
+    volumes:
+      - ./data:/app/data
version: '3'
+services:
+  twikoo:
+    image: imaegoo/twikoo
+    container_name: twikoo
+    restart: unless-stopped
+    ports:
+      - 8080:8080
+    environment:
+      TWIKOO_THROTTLE: 1000
+    volumes:
+      - ./data:/app/data
`,75),h=[E];function u(g,k,b,m,f,v){return l(),t("div",null,h)}const C=e(y,[["render",u]]);export{w as __pageData,C as default}; diff --git a/assets/backend.md.237bd45c.lean.js b/assets/backend.md.237bd45c.lean.js new file mode 100644 index 000000000..991fbfb1a --- /dev/null +++ b/assets/backend.md.237bd45c.lean.js @@ -0,0 +1 @@ +import{_ as e,o as l,c as t,Q as n}from"./chunks/framework.7d2df8c6.js";const s="/assets/mongodb-1.b467da78.png",o="/assets/mongodb-2.d2431ba3.png",a="/assets/mongodb-3.98ac6e22.png",p="/assets/netlify-1.c6c64abb.png",r="/assets/netlify-2.4f0d58e4.png",c="/assets/netlify-3.4f565e5d.png",i="/assets/netlify-4.1647e7f0.png",d="/assets/netlify-5.a29645d7.png",w=JSON.parse('{"title":"云函数部署","description":"","frontmatter":{},"headers":[],"relativePath":"backend.md","filePath":"backend.md","lastUpdated":null}'),y={name:"backend.md"},E=n("",75),h=[E];function u(g,k,b,m,f,v){return l(),t("div",null,h)}const C=e(y,[["render",u]]);export{w as __pageData,C as default}; diff --git a/assets/chunks/VPAlgoliaSearchBox.ac78e499.js b/assets/chunks/VPAlgoliaSearchBox.ac78e499.js new file mode 100644 index 000000000..5ce11db12 --- /dev/null +++ b/assets/chunks/VPAlgoliaSearchBox.ac78e499.js @@ -0,0 +1,17 @@ +import{d as so,a2 as fo,K as mo,j as po,x as vo,O as ho,o as yo,c as go}from"./framework.7d2df8c6.js";import{u as bo}from"./theme.7669522f.js";/*! @docsearch/js 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */function un(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,r)}return n}function I(t){for(var e=1;e=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function se(t,e){return function(n){if(Array.isArray(n))return n}(t)||function(n,r){var o=n==null?null:typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"];if(o!=null){var i,a,u=[],c=!0,s=!1;try{for(o=o.call(n);!(c=(i=o.next()).done)&&(u.push(i.value),!r||u.length!==r);c=!0);}catch(l){s=!0,a=l}finally{try{c||o.return==null||o.return()}finally{if(s)throw a}}return u}}(t,e)||yr(t,e)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function ft(t){return function(e){if(Array.isArray(e))return Lt(e)}(t)||function(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}(t)||yr(t)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function yr(t,e){if(t){if(typeof t=="string")return Lt(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);return n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set"?Array.from(t):n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Lt(t,e):void 0}}function Lt(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n3)for(n=[n],i=3;i0?Ie(v.type,v.props,v.key,null,v.__v):v)!=null){if(v.__=n,v.__b=n.__b+1,(p=b[l])===null||p&&v.key==p.key&&v.type===p.type)b[l]=void 0;else for(m=0;m<_;m++){if((p=b[m])&&v.key==p.key&&v.type===p.type){b[m]=void 0;break}p=null}Yt(t,v,p=p||mt,o,i,a,u,c,s),d=v.__e,(m=v.ref)&&p.ref!=m&&(y||(y=[]),p.ref&&y.push(p.ref,null,v),y.push(m,v.__c||d,v)),d!=null?(h==null&&(h=d),typeof v.type=="function"&&v.__k!=null&&v.__k===p.__k?v.__d=c=wr(v,c,t):c=jr(t,v,p,b,d,c),s||n.type!=="option"?typeof n.type=="function"&&(n.__d=c):t.value=""):c&&p.__e==c&&c.parentNode!=t&&(c=We(p))}for(n.__e=h,l=_;l--;)b[l]!=null&&(typeof n.type=="function"&&b[l].__e!=null&&b[l].__e==n.__d&&(n.__d=We(r,l+1)),Ir(b[l],b[l]));if(y)for(l=0;l3)for(n=[n],i=3;i=n.__.length&&n.__.push({}),n.__[t]}function kr(t){return pe=1,Ar(xr,t)}function Ar(t,e,n){var r=Je(de++,2);return r.t=t,r.__c||(r.__=[n?n(e):xr(void 0,e),function(o){var i=r.t(r.__[0],o);r.__[0]!==i&&(r.__=[i,r.__[1]],r.__c.setState({}))}],r.__c=q),r.__}function Cr(t,e){var n=Je(de++,3);!w.__s&&Gt(n.__H,e)&&(n.__=t,n.__H=e,q.__H.__h.push(n))}function bn(t,e){var n=Je(de++,4);!w.__s&&Gt(n.__H,e)&&(n.__=t,n.__H=e,q.__h.push(n))}function Pt(t,e){var n=Je(de++,7);return Gt(n.__H,e)&&(n.__=t(),n.__H=e,n.__h=t),n.__}function Po(){Ht.forEach(function(t){if(t.__P)try{t.__H.__h.forEach(ct),t.__H.__h.forEach(Ut),t.__H.__h=[]}catch(e){t.__H.__h=[],w.__e(e,t.__v)}}),Ht=[]}w.__b=function(t){q=null,vn&&vn(t)},w.__r=function(t){dn&&dn(t),de=0;var e=(q=t.__c).__H;e&&(e.__h.forEach(ct),e.__h.forEach(Ut),e.__h=[])},w.diffed=function(t){hn&&hn(t);var e=t.__c;e&&e.__H&&e.__H.__h.length&&(Ht.push(e)!==1&&pn===w.requestAnimationFrame||((pn=w.requestAnimationFrame)||function(n){var r,o=function(){clearTimeout(i),_n&&cancelAnimationFrame(r),setTimeout(n)},i=setTimeout(o,100);_n&&(r=requestAnimationFrame(o))})(Po)),q=void 0},w.__c=function(t,e){e.some(function(n){try{n.__h.forEach(ct),n.__h=n.__h.filter(function(r){return!r.__||Ut(r)})}catch(r){e.some(function(o){o.__h&&(o.__h=[])}),e=[],w.__e(r,n.__v)}}),yn&&yn(t,e)},w.unmount=function(t){gn&&gn(t);var e=t.__c;if(e&&e.__H)try{e.__H.__.forEach(ct)}catch(n){w.__e(n,e.__v)}};var _n=typeof requestAnimationFrame=="function";function ct(t){var e=q;typeof t.__c=="function"&&t.__c(),q=e}function Ut(t){var e=q;t.__c=t.__(),q=e}function Gt(t,e){return!t||t.length!==e.length||e.some(function(n,r){return n!==t[r]})}function xr(t,e){return typeof e=="function"?e(t):e}function Nr(t,e){for(var n in e)t[n]=e[n];return t}function Ft(t,e){for(var n in t)if(n!=="__source"&&!(n in e))return!0;for(var r in e)if(r!=="__source"&&t[r]!==e[r])return!0;return!1}function Bt(t){this.props=t}(Bt.prototype=new K).isPureReactComponent=!0,Bt.prototype.shouldComponentUpdate=function(t,e){return Ft(this.props,t)||Ft(this.state,e)};var On=w.__b;w.__b=function(t){t.type&&t.type.__f&&t.ref&&(t.props.ref=t.ref,t.ref=null),On&&On(t)};var Io=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911,Sn=function(t,e){return t==null?null:$($(t).map(e))},Do={map:Sn,forEach:Sn,count:function(t){return t?$(t).length:0},only:function(t){var e=$(t);if(e.length!==1)throw"Children.only";return e[0]},toArray:$},ko=w.__e;function ut(){this.__u=0,this.t=null,this.__b=null}function Tr(t){var e=t.__.__c;return e&&e.__e&&e.__e(t)}function je(){this.u=null,this.o=null}w.__e=function(t,e,n){if(t.then){for(var r,o=e;o=o.__;)if((r=o.__c)&&r.__c)return e.__e==null&&(e.__e=n.__e,e.__k=n.__k),r.__c(t,e)}ko(t,e,n)},(ut.prototype=new K).__c=function(t,e){var n=e.__c,r=this;r.t==null&&(r.t=[]),r.t.push(n);var o=Tr(r.__v),i=!1,a=function(){i||(i=!0,n.componentWillUnmount=n.__c,o?o(u):u())};n.__c=n.componentWillUnmount,n.componentWillUnmount=function(){a(),n.__c&&n.__c()};var u=function(){if(!--r.__u){if(r.state.__e){var s=r.state.__e;r.__v.__k[0]=function m(p,v,d){return p&&(p.__v=null,p.__k=p.__k&&p.__k.map(function(h){return m(h,v,d)}),p.__c&&p.__c.__P===v&&(p.__e&&d.insertBefore(p.__e,p.__d),p.__c.__e=!0,p.__c.__P=d)),p}(s,s.__c.__P,s.__c.__O)}var l;for(r.setState({__e:r.__b=null});l=r.t.pop();)l.forceUpdate()}},c=e.__h===!0;r.__u++||c||r.setState({__e:r.__b=r.__v.__k[0]}),t.then(a,a)},ut.prototype.componentWillUnmount=function(){this.t=[]},ut.prototype.render=function(t,e){if(this.__b){if(this.__v.__k){var n=document.createElement("div"),r=this.__v.__k[0].__c;this.__v.__k[0]=function i(a,u,c){return a&&(a.__c&&a.__c.__H&&(a.__c.__H.__.forEach(function(s){typeof s.__c=="function"&&s.__c()}),a.__c.__H=null),(a=Nr({},a)).__c!=null&&(a.__c.__P===c&&(a.__c.__P=u),a.__c=null),a.__k=a.__k&&a.__k.map(function(s){return i(s,u,c)})),a}(this.__b,n,r.__O=r.__P)}this.__b=null}var o=e.__e&&W(X,null,t.fallback);return o&&(o.__h=null),[W(X,null,e.__e?null:t.children),o]};var wn=function(t,e,n){if(++n[1]===n[0]&&t.o.delete(e),t.props.revealOrder&&(t.props.revealOrder[0]!=="t"||!t.o.size))for(n=t.u;n;){for(;n.length>3;)n.pop()();if(n[1]>>1,1),e.i.removeChild(r)}}),Ke(W(Ao,{context:e.context},t.__v),e.l)):e.l&&e.componentWillUnmount()}function Rr(t,e){return W(Co,{__v:t,i:e})}(je.prototype=new K).__e=function(t){var e=this,n=Tr(e.__v),r=e.o.get(t);return r[0]++,function(o){var i=function(){e.props.revealOrder?(r.push(o),wn(e,t,r)):o()};n?n(i):i()}},je.prototype.render=function(t){this.u=null,this.o=new Map;var e=$(t.children);t.revealOrder&&t.revealOrder[0]==="b"&&e.reverse();for(var n=e.length;n--;)this.o.set(e[n],this.u=[1,0,this.u]);return t.children},je.prototype.componentDidUpdate=je.prototype.componentDidMount=function(){var t=this;this.o.forEach(function(e,n){wn(t,n,e)})};var qr=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,xo=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|fill|flood|font|glyph(?!R)|horiz|marker(?!H|W|U)|overline|paint|stop|strikethrough|stroke|text(?!L)|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,No=function(t){return(typeof Symbol<"u"&&Ve(Symbol())=="symbol"?/fil|che|rad/i:/fil|che|ra/i).test(t)};function Lr(t,e,n){return e.__k==null&&(e.textContent=""),Ke(t,e),typeof n=="function"&&n(),t?t.__c:null}K.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(t){Object.defineProperty(K.prototype,t,{configurable:!0,get:function(){return this["UNSAFE_"+t]},set:function(e){Object.defineProperty(this,t,{configurable:!0,writable:!0,value:e})}})});var jn=w.event;function To(){}function Ro(){return this.cancelBubble}function qo(){return this.defaultPrevented}w.event=function(t){return jn&&(t=jn(t)),t.persist=To,t.isPropagationStopped=Ro,t.isDefaultPrevented=qo,t.nativeEvent=t};var Mr,En={configurable:!0,get:function(){return this.class}},Pn=w.vnode;w.vnode=function(t){var e=t.type,n=t.props,r=n;if(typeof e=="string"){for(var o in r={},n){var i=n[o];o==="value"&&"defaultValue"in n&&i==null||(o==="defaultValue"&&"value"in n&&n.value==null?o="value":o==="download"&&i===!0?i="":/ondoubleclick/i.test(o)?o="ondblclick":/^onchange(textarea|input)/i.test(o+e)&&!No(n.type)?o="oninput":/^on(Ani|Tra|Tou|BeforeInp)/.test(o)?o=o.toLowerCase():xo.test(o)?o=o.replace(/[A-Z0-9]/,"-$&").toLowerCase():i===null&&(i=void 0),r[o]=i)}e=="select"&&r.multiple&&Array.isArray(r.value)&&(r.value=$(n.children).forEach(function(a){a.props.selected=r.value.indexOf(a.props.value)!=-1})),e=="select"&&r.defaultValue!=null&&(r.value=$(n.children).forEach(function(a){a.props.selected=r.multiple?r.defaultValue.indexOf(a.props.value)!=-1:r.defaultValue==a.props.value})),t.props=r}e&&n.class!=n.className&&(En.enumerable="className"in n,n.className!=null&&(r.class=n.className),Object.defineProperty(r,"className",En)),t.$$typeof=qr,Pn&&Pn(t)};var In=w.__r;w.__r=function(t){In&&In(t),Mr=t.__c};var Lo={ReactCurrentDispatcher:{current:{readContext:function(t){return Mr.__n[t.__c].props.value}}}};(typeof performance>"u"?"undefined":Ve(performance))=="object"&&typeof performance.now=="function"&&performance.now.bind(performance);function Dn(t){return!!t&&t.$$typeof===qr}var f={useState:kr,useReducer:Ar,useEffect:Cr,useLayoutEffect:bn,useRef:function(t){return pe=5,Pt(function(){return{current:t}},[])},useImperativeHandle:function(t,e,n){pe=6,bn(function(){typeof t=="function"?t(e()):t&&(t.current=e())},n==null?n:n.concat(t))},useMemo:Pt,useCallback:function(t,e){return pe=8,Pt(function(){return t},e)},useContext:function(t){var e=q.context[t.__c],n=Je(de++,9);return n.__c=t,e?(n.__==null&&(n.__=!0,e.sub(q)),e.props.value):t.__},useDebugValue:function(t,e){w.useDebugValue&&w.useDebugValue(e?e(t):t)},version:"16.8.0",Children:Do,render:Lr,hydrate:function(t,e,n){return Dr(t,e),typeof n=="function"&&n(),t?t.__c:null},unmountComponentAtNode:function(t){return!!t.__k&&(Ke(null,t),!0)},createPortal:Rr,createElement:W,createContext:function(t,e){var n={__c:e="__cC"+br++,__:t,Consumer:function(r,o){return r.children(o)},Provider:function(r){var o,i;return this.getChildContext||(o=[],(i={})[e]=this,this.getChildContext=function(){return i},this.shouldComponentUpdate=function(a){this.props.value!==a.value&&o.some(Mt)},this.sub=function(a){o.push(a);var u=a.componentWillUnmount;a.componentWillUnmount=function(){o.splice(o.indexOf(a),1),u&&u.call(a)}}),r.children}};return n.Provider.__=n.Consumer.contextType=n},createFactory:function(t){return W.bind(null,t)},cloneElement:function(t){return Dn(t)?Eo.apply(null,arguments):t},createRef:function(){return{current:null}},Fragment:X,isValidElement:Dn,findDOMNode:function(t){return t&&(t.base||t.nodeType===1&&t)||null},Component:K,PureComponent:Bt,memo:function(t,e){function n(o){var i=this.props.ref,a=i==o.ref;return!a&&i&&(i.call?i(null):i.current=null),e?!e(this.props,o)||!a:Ft(this.props,o)}function r(o){return this.shouldComponentUpdate=n,W(t,o)}return r.displayName="Memo("+(t.displayName||t.name)+")",r.prototype.isReactComponent=!0,r.__f=!0,r},forwardRef:function(t){function e(n,r){var o=Nr({},n);return delete o.ref,t(o,(r=n.ref||r)&&(Ve(r)!="object"||"current"in r)?r:null)}return e.$$typeof=Io,e.render=e,e.prototype.isReactComponent=e.__f=!0,e.displayName="ForwardRef("+(t.displayName||t.name)+")",e},unstable_batchedUpdates:function(t,e){return t(e)},StrictMode:X,Suspense:ut,SuspenseList:je,lazy:function(t){var e,n,r;function o(i){if(e||(e=t()).then(function(a){n=a.default||a},function(a){r=a}),r)throw r;if(!n)throw e;return W(n,i)}return o.displayName="Lazy",o.__f=!0,o},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:Lo};function Mo(){return f.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},f.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function Hr(){return f.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},f.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var Ho=["translations"];function Vt(){return Vt=Object.assign||function(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}var Bo=f.forwardRef(function(t,e){var n=t.translations,r=n===void 0?{}:n,o=Fo(t,Ho),i=r.buttonText,a=i===void 0?"Search":i,u=r.buttonAriaLabel,c=u===void 0?"Search":u,s=Uo(kr(null),2),l=s[0],m=s[1];return Cr(function(){typeof navigator<"u"&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?m("⌘"):m("Ctrl"))},[]),f.createElement("button",Vt({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:e}),f.createElement("span",{className:"DocSearch-Button-Container"},f.createElement(Hr,null),f.createElement("span",{className:"DocSearch-Button-Placeholder"},a)),f.createElement("span",{className:"DocSearch-Button-Keys"},l!==null&&f.createElement(f.Fragment,null,f.createElement("kbd",{className:"DocSearch-Button-Key"},l==="Ctrl"?f.createElement(Mo,null):l),f.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))});function Ur(t,e){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),i=0;it.length)&&(e=t.length);for(var n=0,r=new Array(e);nt.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function Nn(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,r)}return n}function ve(t){for(var e=1;e1&&arguments[1]!==void 0?arguments[1]:20,n=[],r=0;r=3||n===2&&r>=4||n===1&&r>=10);function i(a,u,c){if(o&&c!==void 0){var s=c[0].__autocomplete_algoliaCredentials,l={"X-Algolia-Application-Id":s.appId,"X-Algolia-API-Key":s.apiKey};t.apply(void 0,[a].concat(Ge(u),[{headers:l}]))}else t.apply(void 0,[a].concat(Ge(u)))}return{init:function(a,u){t("init",{appId:a,apiKey:u})},setUserToken:function(a){t("setUserToken",a)},clickedObjectIDsAfterSearch:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&i("clickedObjectIDsAfterSearch",Xe(u),u[0].items)},clickedObjectIDs:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&i("clickedObjectIDs",Xe(u),u[0].items)},clickedFilters:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&t.apply(void 0,["clickedFilters"].concat(u))},convertedObjectIDsAfterSearch:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&i("convertedObjectIDsAfterSearch",Xe(u),u[0].items)},convertedObjectIDs:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&i("convertedObjectIDs",Xe(u),u[0].items)},convertedFilters:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&t.apply(void 0,["convertedFilters"].concat(u))},viewedObjectIDs:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&u.reduce(function(s,l){var m=l.items,p=Br(l,Jo);return[].concat(Ge(s),Ge(Qo(ve(ve({},p),{},{objectIDs:(m==null?void 0:m.map(function(v){return v.objectID}))||p.objectIDs})).map(function(v){return{items:m,payload:v}})))},[]).forEach(function(s){var l=s.items;return i("viewedObjectIDs",[s.payload],l)})},viewedFilters:function(){for(var a=arguments.length,u=new Array(a),c=0;c0&&t.apply(void 0,["viewedFilters"].concat(u))}}}function Yo(t){var e=t.items.reduce(function(n,r){var o;return n[r.__autocomplete_indexName]=((o=n[r.__autocomplete_indexName])!==null&&o!==void 0?o:[]).concat(r),n},{});return Object.keys(e).map(function(n){return{index:n,items:e[n],algoliaSource:["autocomplete"]}})}function Dt(t){return t.objectID&&t.__autocomplete_indexName&&t.__autocomplete_queryID}function ke(t){return ke=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ke(t)}function ie(t){return function(e){if(Array.isArray(e))return kt(e)}(t)||function(e){if(typeof Symbol<"u"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}(t)||function(e,n){if(e){if(typeof e=="string")return kt(e,n);var r=Object.prototype.toString.call(e).slice(8,-1);if(r==="Object"&&e.constructor&&(r=e.constructor.name),r==="Map"||r==="Set")return Array.from(e);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return kt(e,n)}}(t)||function(){throw new TypeError(`Invalid attempt to spread non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function kt(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0&&ei({onItemsChange:r,items:p,insights:u,state:m}))}},0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(l){var m=l.setContext,p=l.onSelect,v=l.onActive;a("addAlgoliaAgent","insights-plugin"),m({algoliaInsightsPlugin:{__algoliaSearchParameters:{clickAnalytics:!0},insights:u}}),p(function(d){var h=d.item,y=d.state,b=d.event;Dt(h)&&o({state:y,event:b,insights:u,item:h,insightsEvents:[G({eventName:"Item Selected"},Cn({item:h,items:c.current}))]})}),v(function(d){var h=d.item,y=d.state,b=d.event;Dt(h)&&i({state:y,event:b,insights:u,item:h,insightsEvents:[G({eventName:"Item Active"},Cn({item:h,items:c.current}))]})})},onStateChange:function(l){var m=l.state;s({state:m})},__autocomplete_pluginOptions:t}}function lt(t,e){var n=e;return{then:function(r,o){return lt(t.then(et(r,n,t),et(o,n,t)),n)},catch:function(r){return lt(t.catch(et(r,n,t)),n)},finally:function(r){return r&&n.onCancelList.push(r),lt(t.finally(et(r&&function(){return n.onCancelList=[],r()},n,t)),n)},cancel:function(){n.isCanceled=!0;var r=n.onCancelList;n.onCancelList=[],r.forEach(function(o){o()})},isCanceled:function(){return n.isCanceled===!0}}}function Rn(t){return lt(t,{isCanceled:!1,onCancelList:[]})}function et(t,e,n){return t?function(r){return e.isCanceled?r:t(r)}:n}function qn(t,e,n,r){if(!n)return null;if(t<0&&(e===null||r!==null&&e===0))return n+t;var o=(e===null?-1:e)+t;return o<=-1||o>=n?r===null?null:0:o}function Ln(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,r)}return n}function Mn(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n0},reshape:function(i){return i.sources}},t),{},{id:(n=t.id)!==null&&n!==void 0?n:"autocomplete-".concat(Vo++),plugins:o,initialState:ae({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},t.initialState),onStateChange:function(i){var a;(a=t.onStateChange)===null||a===void 0||a.call(t,i),o.forEach(function(u){var c;return(c=u.onStateChange)===null||c===void 0?void 0:c.call(u,i)})},onSubmit:function(i){var a;(a=t.onSubmit)===null||a===void 0||a.call(t,i),o.forEach(function(u){var c;return(c=u.onSubmit)===null||c===void 0?void 0:c.call(u,i)})},onReset:function(i){var a;(a=t.onReset)===null||a===void 0||a.call(t,i),o.forEach(function(u){var c;return(c=u.onReset)===null||c===void 0?void 0:c.call(u,i)})},getSources:function(i){return Promise.all([].concat(ci(o.map(function(a){return a.getSources})),[t.getSources]).filter(Boolean).map(function(a){return function(u,c){var s=[];return Promise.resolve(u(c)).then(function(l){return Promise.all(l.filter(function(m){return!!m}).map(function(m){if(m.sourceId,s.includes(m.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(m.sourceId)," is not unique."));s.push(m.sourceId);var p={getItemInputValue:function(d){return d.state.query},getItemUrl:function(){},onSelect:function(d){(0,d.setIsOpen)(!1)},onActive:vt,onResolve:vt};Object.keys(p).forEach(function(d){p[d].__default=!0});var v=Mn(Mn({},p),m);return Promise.resolve(v)}))})}(a,i)})).then(function(a){return ze(a)}).then(function(a){return a.map(function(u){return ae(ae({},u),{},{onSelect:function(c){u.onSelect(c),e.forEach(function(s){var l;return(l=s.onSelect)===null||l===void 0?void 0:l.call(s,c)})},onActive:function(c){u.onActive(c),e.forEach(function(s){var l;return(l=s.onActive)===null||l===void 0?void 0:l.call(s,c)})},onResolve:function(c){u.onResolve(c),e.forEach(function(s){var l;return(l=s.onResolve)===null||l===void 0?void 0:l.call(s,c)})}})})})},navigator:ae({navigate:function(i){var a=i.itemUrl;r.location.assign(a)},navigateNewTab:function(i){var a=i.itemUrl,u=r.open(a,"_blank","noopener");u==null||u.focus()},navigateNewWindow:function(i){var a=i.itemUrl;r.open(a,"_blank","noopener")}},t.navigator)})}function Te(t){return Te=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Te(t)}function Bn(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,r)}return n}function nt(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}var Kn,xt,ot,we=null,zn=(Kn=-1,xt=-1,ot=void 0,function(t){var e=++Kn;return Promise.resolve(t).then(function(n){return ot&&e=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function Me(t){return Me=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Me(t)}var _i=["props","refresh","store"],Oi=["inputElement","formElement","panelElement"],Si=["inputElement"],wi=["inputElement","maxLength"],ji=["sourceIndex"],Ei=["sourceIndex"],Pi=["item","source","sourceIndex"];function $n(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,r)}return n}function R(t){for(var e=1;e=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function Di(t){var e=t.props,n=t.refresh,r=t.store,o=ne(t,_i),i=function(a,u){return u!==void 0?"".concat(a,"-").concat(u):a};return{getEnvironmentProps:function(a){var u=a.inputElement,c=a.formElement,s=a.panelElement;function l(m){!r.getState().isOpen&&r.pendingRequests.isEmpty()||m.target===u||[c,s].some(function(p){return v=p,d=m.target,v===d||v.contains(d);var v,d})===!1&&(r.dispatch("blur",null),e.debug||r.pendingRequests.cancelAll())}return R({onTouchStart:l,onMouseDown:l,onTouchMove:function(m){r.getState().isOpen!==!1&&u===e.environment.document.activeElement&&m.target!==u&&u.blur()}},ne(a,Oi))},getRootProps:function(a){return R({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-owns":r.getState().isOpen?"".concat(e.id,"-list"):void 0,"aria-labelledby":"".concat(e.id,"-label")},a)},getFormProps:function(a){return a.inputElement,R({action:"",noValidate:!0,role:"search",onSubmit:function(u){var c;u.preventDefault(),e.onSubmit(R({event:u,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),(c=a.inputElement)===null||c===void 0||c.blur()},onReset:function(u){var c;u.preventDefault(),e.onReset(R({event:u,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),(c=a.inputElement)===null||c===void 0||c.focus()}},ne(a,Si))},getLabelProps:function(a){var u=a||{},c=u.sourceIndex,s=ne(u,ji);return R({htmlFor:"".concat(i(e.id,c),"-input"),id:"".concat(i(e.id,c),"-label")},s)},getInputProps:function(a){var u;function c(y){(e.openOnFocus||r.getState().query)&&le(R({event:y,props:e,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var s=a||{},l=(s.inputElement,s.maxLength),m=l===void 0?512:l,p=ne(s,wi),v=fe(r.getState()),d=function(y){return!!(y&&y.match(ri))}(((u=e.environment.navigator)===null||u===void 0?void 0:u.userAgent)||""),h=v!=null&&v.itemUrl&&!d?"go":"search";return R({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&r.getState().activeItemId!==null?"".concat(e.id,"-item-").concat(r.getState().activeItemId):void 0,"aria-controls":r.getState().isOpen?"".concat(e.id,"-list"):void 0,"aria-labelledby":"".concat(e.id,"-label"),value:r.getState().completion||r.getState().query,id:"".concat(e.id,"-input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:h,spellCheck:"false",autoFocus:e.autoFocus,placeholder:e.placeholder,maxLength:m,type:"search",onChange:function(y){le(R({event:y,props:e,query:y.currentTarget.value.slice(0,m),refresh:n,store:r},o))},onKeyDown:function(y){(function(b){var _=b.event,S=b.props,O=b.refresh,g=b.store,P=bi(b,yi);if(_.key==="ArrowUp"||_.key==="ArrowDown"){var C=function(){var M=S.environment.document.getElementById("".concat(S.id,"-item-").concat(g.getState().activeItemId));M&&(M.scrollIntoViewIfNeeded?M.scrollIntoViewIfNeeded(!1):M.scrollIntoView(!1))},L=function(){var M=fe(g.getState());if(g.getState().activeItemId!==null&&M){var Ot=M.item,St=M.itemInputValue,$e=M.itemUrl,B=M.source;B.onActive(te({event:_,item:Ot,itemInputValue:St,itemUrl:$e,refresh:O,source:B,state:g.getState()},P))}};_.preventDefault(),g.getState().isOpen===!1&&(S.openOnFocus||g.getState().query)?le(te({event:_,props:S,query:g.getState().query,refresh:O,store:g},P)).then(function(){g.dispatch(_.key,{nextActiveItemId:S.defaultActiveItemId}),L(),setTimeout(C,0)}):(g.dispatch(_.key,{}),L(),C())}else if(_.key==="Escape")_.preventDefault(),g.dispatch(_.key,null),g.pendingRequests.cancelAll();else if(_.key==="Tab")g.dispatch("blur",null),g.pendingRequests.cancelAll();else if(_.key==="Enter"){if(g.getState().activeItemId===null||g.getState().collections.every(function(M){return M.items.length===0}))return void(S.debug||g.pendingRequests.cancelAll());_.preventDefault();var x=fe(g.getState()),k=x.item,N=x.itemInputValue,U=x.itemUrl,F=x.source;if(_.metaKey||_.ctrlKey)U!==void 0&&(F.onSelect(te({event:_,item:k,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P)),S.navigator.navigateNewTab({itemUrl:U,item:k,state:g.getState()}));else if(_.shiftKey)U!==void 0&&(F.onSelect(te({event:_,item:k,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P)),S.navigator.navigateNewWindow({itemUrl:U,item:k,state:g.getState()}));else if(!_.altKey){if(U!==void 0)return F.onSelect(te({event:_,item:k,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P)),void S.navigator.navigate({itemUrl:U,item:k,state:g.getState()});le(te({event:_,nextState:{isOpen:!1},props:S,query:N,refresh:O,store:g},P)).then(function(){F.onSelect(te({event:_,item:k,itemInputValue:N,itemUrl:U,refresh:O,source:F,state:g.getState()},P))})}}})(R({event:y,props:e,refresh:n,store:r},o))},onFocus:c,onBlur:vt,onClick:function(y){a.inputElement!==e.environment.document.activeElement||r.getState().isOpen||c(y)}},p)},getPanelProps:function(a){return R({onMouseDown:function(u){u.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},a)},getListProps:function(a){var u=a||{},c=u.sourceIndex,s=ne(u,Ei);return R({role:"listbox","aria-labelledby":"".concat(i(e.id,c),"-label"),id:"".concat(i(e.id,c),"-list")},s)},getItemProps:function(a){var u=a.item,c=a.source,s=a.sourceIndex,l=ne(a,Pi);return R({id:"".concat(i(e.id,s),"-item-").concat(u.__autocomplete_id),role:"option","aria-selected":r.getState().activeItemId===u.__autocomplete_id,onMouseMove:function(m){if(u.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",u.__autocomplete_id);var p=fe(r.getState());if(r.getState().activeItemId!==null&&p){var v=p.item,d=p.itemInputValue,h=p.itemUrl,y=p.source;y.onActive(R({event:m,item:v,itemInputValue:d,itemUrl:h,refresh:n,source:y,state:r.getState()},o))}}},onMouseDown:function(m){m.preventDefault()},onClick:function(m){var p=c.getItemInputValue({item:u,state:r.getState()}),v=c.getItemUrl({item:u,state:r.getState()});(v?Promise.resolve():le(R({event:m,nextState:{isOpen:!1},props:e,query:p,refresh:n,store:r},o))).then(function(){c.onSelect(R({event:m,item:u,itemInputValue:p,itemUrl:v,refresh:n,source:c,state:r.getState()},o))})}},l)}}}function He(t){return He=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(e){return typeof e}:function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},He(t)}function Qn(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,r)}return n}function ki(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function Yi(t){var e=t.translations,n=e===void 0?{}:e,r=Zi(t,$i),o=n.noResultsText,i=o===void 0?"No results for":o,a=n.suggestedQueryText,u=a===void 0?"Try searching for":a,c=n.reportMissingResultsText,s=c===void 0?"Believe this query should return results?":c,l=n.reportMissingResultsLinkText,m=l===void 0?"Let us know.":l,p=r.state.context.searchSuggestions;return f.createElement("div",{className:"DocSearch-NoResults"},f.createElement("div",{className:"DocSearch-Screen-Icon"},f.createElement(zi,null)),f.createElement("p",{className:"DocSearch-Title"},i,' "',f.createElement("strong",null,r.state.query),'"'),p&&p.length>0&&f.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},f.createElement("p",{className:"DocSearch-Help"},u,":"),f.createElement("ul",null,p.slice(0,3).reduce(function(v,d){return[].concat(Qi(v),[f.createElement("li",{key:d},f.createElement("button",{className:"DocSearch-Prefill",key:d,type:"button",onClick:function(){r.setQuery(d.toLowerCase()+" "),r.refresh(),r.inputRef.current.focus()}},d))])},[]))),r.getMissingResultsUrl&&f.createElement("p",{className:"DocSearch-Help"},"".concat(s," "),f.createElement("a",{href:r.getMissingResultsUrl({query:r.state.query}),target:"_blank",rel:"noopener noreferrer"},m)))}var Gi=["hit","attribute","tagName"];function er(t,e){var n=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(t,o).enumerable})),n.push.apply(n,r)}return n}function tr(t){for(var e=1;e=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function nr(t,e){return e.split(".").reduce(function(n,r){return n!=null&&n[r]?n[r]:null},t)}function ue(t){var e=t.hit,n=t.attribute,r=t.tagName;return W(r===void 0?"span":r,tr(tr({},ea(t,Gi)),{},{dangerouslySetInnerHTML:{__html:nr(e,"_snippetResult.".concat(n,".value"))||nr(e,n)}}))}function rr(t,e){return function(n){if(Array.isArray(n))return n}(t)||function(n,r){var o=n==null?null:typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"];if(o!=null){var i,a,u=[],c=!0,s=!1;try{for(o=o.call(n);!(c=(i=o.next()).done)&&(u.push(i.value),!r||u.length!==r);c=!0);}catch(l){s=!0,a=l}finally{try{c||o.return==null||o.return()}finally{if(s)throw a}}return u}}(t,e)||function(n,r){if(n){if(typeof n=="string")return or(n,r);var o=Object.prototype.toString.call(n).slice(8,-1);if(o==="Object"&&n.constructor&&(o=n.constructor.name),o==="Map"||o==="Set")return Array.from(n);if(o==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return or(n,r)}}(t,e)||function(){throw new TypeError(`Invalid attempt to destructure non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}()}function or(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n|<\/mark>)/g,ra=RegExp(zr.source);function Jr(t){var e,n,r=t;if(!r.__docsearch_parent&&!t._highlightResult)return t.hierarchy.lvl0;var o=((r.__docsearch_parent?(e=r.__docsearch_parent)===null||e===void 0||(e=e._highlightResult)===null||e===void 0||(e=e.hierarchy)===null||e===void 0?void 0:e.lvl0:(n=t._highlightResult)===null||n===void 0||(n=n.hierarchy)===null||n===void 0?void 0:n.lvl0)||{}).value;return o&&ra.test(o)?o.replace(zr,""):o}function Jt(){return Jt=Object.assign||function(t){for(var e=1;e=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function ca(t){var e=t.translations,n=e===void 0?{}:e,r=aa(t,ia),o=n.recentSearchesTitle,i=o===void 0?"Recent":o,a=n.noRecentSearchesText,u=a===void 0?"No recent searches":a,c=n.saveRecentSearchButtonTitle,s=c===void 0?"Save this search":c,l=n.removeRecentSearchButtonTitle,m=l===void 0?"Remove this search from history":l,p=n.favoriteSearchesTitle,v=p===void 0?"Favorite":p,d=n.removeFavoriteSearchButtonTitle,h=d===void 0?"Remove this search from favorites":d;return r.state.status==="idle"&&r.hasCollections===!1?r.disableUserPersonalization?null:f.createElement("div",{className:"DocSearch-StartScreen"},f.createElement("p",{className:"DocSearch-Help"},u)):r.hasCollections===!1?null:f.createElement("div",{className:"DocSearch-Dropdown-Container"},f.createElement(zt,ht({},r,{title:i,collection:r.state.collections[0],renderIcon:function(){return f.createElement("div",{className:"DocSearch-Hit-icon"},f.createElement(Hi,null))},renderAction:function(y){var b=y.item,_=y.runFavoriteTransition,S=y.runDeleteTransition;return f.createElement(f.Fragment,null,f.createElement("div",{className:"DocSearch-Hit-action"},f.createElement("button",{className:"DocSearch-Hit-action-button",title:s,type:"submit",onClick:function(O){O.preventDefault(),O.stopPropagation(),_(function(){r.favoriteSearches.add(b),r.recentSearches.remove(b),r.refresh()})}},f.createElement(Xn,null))),f.createElement("div",{className:"DocSearch-Hit-action"},f.createElement("button",{className:"DocSearch-Hit-action-button",title:m,type:"submit",onClick:function(O){O.preventDefault(),O.stopPropagation(),S(function(){r.recentSearches.remove(b),r.refresh()})}},f.createElement(Kt,null))))}})),f.createElement(zt,ht({},r,{title:v,collection:r.state.collections[1],renderIcon:function(){return f.createElement("div",{className:"DocSearch-Hit-icon"},f.createElement(Xn,null))},renderAction:function(y){var b=y.item,_=y.runDeleteTransition;return f.createElement("div",{className:"DocSearch-Hit-action"},f.createElement("button",{className:"DocSearch-Hit-action-button",title:h,type:"submit",onClick:function(S){S.preventDefault(),S.stopPropagation(),_(function(){r.favoriteSearches.remove(b),r.refresh()})}},f.createElement(Kt,null)))}})))}var ua=["translations"];function yt(){return yt=Object.assign||function(t){for(var e=1;e=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}var sa=f.memo(function(t){var e=t.translations,n=e===void 0?{}:e,r=la(t,ua);if(r.state.status==="error")return f.createElement(Ji,{translations:n==null?void 0:n.errorScreen});var o=r.state.collections.some(function(i){return i.items.length>0});return r.state.query?o===!1?f.createElement(Yi,yt({},r,{translations:n==null?void 0:n.noResultsScreen})):f.createElement(oa,r):f.createElement(ca,yt({},r,{hasCollections:o,translations:n==null?void 0:n.startScreen}))},function(t,e){return e.state.status==="loading"||e.state.status==="stalled"}),fa=["translations"];function gt(){return gt=Object.assign||function(t){for(var e=1;e=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function pa(t){var e=t.translations,n=e===void 0?{}:e,r=ma(t,fa),o=n.resetButtonTitle,i=o===void 0?"Clear the query":o,a=n.resetButtonAriaLabel,u=a===void 0?"Clear the query":a,c=n.cancelButtonText,s=c===void 0?"Cancel":c,l=n.cancelButtonAriaLabel,m=l===void 0?"Cancel":l,p=r.getFormProps({inputElement:r.inputRef.current}).onReset;return f.useEffect(function(){r.autoFocus&&r.inputRef.current&&r.inputRef.current.focus()},[r.autoFocus,r.inputRef]),f.useEffect(function(){r.isFromSelection&&r.inputRef.current&&r.inputRef.current.select()},[r.isFromSelection,r.inputRef]),f.createElement(f.Fragment,null,f.createElement("form",{className:"DocSearch-Form",onSubmit:function(v){v.preventDefault()},onReset:p},f.createElement("label",gt({className:"DocSearch-MagnifierLabel"},r.getLabelProps()),f.createElement(Hr,null)),f.createElement("div",{className:"DocSearch-LoadingIndicator"},f.createElement(Mi,null)),f.createElement("input",gt({className:"DocSearch-Input",ref:r.inputRef},r.getInputProps({inputElement:r.inputRef.current,autoFocus:r.autoFocus,maxLength:64}))),f.createElement("button",{type:"reset",title:i,className:"DocSearch-Reset","aria-label":u,hidden:!r.state.query},f.createElement(Kt,null))),f.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":m,onClick:r.onClose},s))}var va=["_highlightResult","_snippetResult"];function da(t,e){if(t==null)return{};var n,r,o=function(a,u){if(a==null)return{};var c,s,l={},m=Object.keys(a);for(s=0;s=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function ha(t){return function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch{return!1}}()===!1?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(e){return window.localStorage.setItem(t,JSON.stringify(e))},getItem:function(){var e=window.localStorage.getItem(t);return e?JSON.parse(e):[]}}}function cr(t){var e=t.key,n=t.limit,r=n===void 0?5:n,o=ha(e),i=o.getItem().slice(0,r);return{add:function(a){var u=a,c=(u._highlightResult,u._snippetResult,da(u,va)),s=i.findIndex(function(l){return l.objectID===c.objectID});s>-1&&i.splice(s,1),i.unshift(c),i=i.slice(0,r),o.setItem(i)},remove:function(a){i=i.filter(function(u){return u.objectID!==a.objectID}),o.setItem(i)},getAll:function(){return i}}}var ya=["facetName","facetQuery"];function ga(t){var e,n="algoliasearch-client-js-".concat(t.key),r=function(){return e===void 0&&(e=t.localStorage||window.localStorage),e},o=function(){return JSON.parse(r().getItem(n)||"{}")},i=function(u){r().setItem(n,JSON.stringify(u))},a=function(){var u=t.timeToLive?1e3*t.timeToLive:null,c=o(),s=Object.fromEntries(Object.entries(c).filter(function(m){return se(m,2)[1].timestamp!==void 0}));if(i(s),u){var l=Object.fromEntries(Object.entries(s).filter(function(m){var p=se(m,2)[1],v=new Date().getTime();return!(p.timestamp+u2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then(function(){a();var l=JSON.stringify(u);return o()[l]}).then(function(l){return Promise.all([l?l.value:c(),l!==void 0])}).then(function(l){var m=se(l,2),p=m[0],v=m[1];return Promise.all([p,v||s.miss(p)])}).then(function(l){return se(l,1)[0]})},set:function(u,c){return Promise.resolve().then(function(){var s=o();return s[JSON.stringify(u)]={timestamp:new Date().getTime(),value:c},r().setItem(n,JSON.stringify(s)),c})},delete:function(u){return Promise.resolve().then(function(){var c=o();delete c[JSON.stringify(u)],r().setItem(n,JSON.stringify(c))})},clear:function(){return Promise.resolve().then(function(){r().removeItem(n)})}}}function Ee(t){var e=ft(t.caches),n=e.shift();return n===void 0?{get:function(r,o){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return o().then(function(a){return Promise.all([a,i.miss(a)])}).then(function(a){return se(a,1)[0]})},set:function(r,o){return Promise.resolve(o)},delete:function(r){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(r,o){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(r,o,i).catch(function(){return Ee({caches:e}).get(r,o,i)})},set:function(r,o){return n.set(r,o).catch(function(){return Ee({caches:e}).set(r,o)})},delete:function(r){return n.delete(r).catch(function(){return Ee({caches:e}).delete(r)})},clear:function(){return n.clear().catch(function(){return Ee({caches:e}).clear()})}}}function Tt(){var t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{serializable:!0},e={};return{get:function(n,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{miss:function(){return Promise.resolve()}},i=JSON.stringify(n);if(i in e)return Promise.resolve(t.serializable?JSON.parse(e[i]):e[i]);var a=r(),u=o&&o.miss||function(){return Promise.resolve()};return a.then(function(c){return u(c)}).then(function(){return a})},set:function(n,r){return e[JSON.stringify(n)]=t.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(n){return delete e[JSON.stringify(n)],Promise.resolve()},clear:function(){return e={},Promise.resolve()}}}function ba(t){for(var e=t.length-1;e>0;e--){var n=Math.floor(Math.random()*(e+1)),r=t[e];t[e]=t[n],t[n]=r}return t}function $r(t,e){return e&&Object.keys(e).forEach(function(n){t[n]=e[n](t)}),t}function bt(t){for(var e=arguments.length,n=new Array(e>1?e-1:0),r=1;r0?r:void 0,timeout:n.timeout||e,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}var me={Read:1,Write:2,Any:3},Qr=1,_a=2,Zr=3;function Yr(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Qr;return I(I({},t),{},{status:e,lastUpdate:Date.now()})}function Gr(t){return typeof t=="string"?{protocol:"https",url:t,accept:me.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||me.Any}}var $t="GET",_t="POST";function Oa(t,e){return Promise.all(e.map(function(n){return t.get(n,function(){return Promise.resolve(Yr(n))})})).then(function(n){var r=n.filter(function(a){return function(u){return u.status===Qr||Date.now()-u.lastUpdate>12e4}(a)}),o=n.filter(function(a){return function(u){return u.status===Zr&&Date.now()-u.lastUpdate<=12e4}(a)}),i=[].concat(ft(r),ft(o));return{getTimeout:function(a,u){return(o.length===0&&a===0?1:o.length+3+a)*u},statelessHosts:i.length>0?i.map(function(a){return Gr(a)}):e}})}function lr(t,e,n,r){var o=[],i=function(p,v){if(!(p.method===$t||p.data===void 0&&v.data===void 0)){var d=Array.isArray(p.data)?p.data:I(I({},p.data),v.data);return JSON.stringify(d)}}(n,r),a=function(p,v){var d=I(I({},p.headers),v.headers),h={};return Object.keys(d).forEach(function(y){var b=d[y];h[y.toLowerCase()]=b}),h}(t,r),u=n.method,c=n.method!==$t?{}:I(I({},n.data),r.data),s=I(I(I({"x-algolia-agent":t.userAgent.value},t.queryParameters),c),r.queryParameters),l=0,m=function p(v,d){var h=v.pop();if(h===void 0)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:sr(o)};var y={data:i,headers:a,method:u,url:wa(h,n.path,s),connectTimeout:d(l,t.timeouts.connect),responseTimeout:d(l,r.timeout)},b=function(S){var O={request:y,response:S,host:h,triesLeft:v.length};return o.push(O),O},_={onSuccess:function(S){return function(O){try{return JSON.parse(O.content)}catch(g){throw function(P,C){return{name:"DeserializationError",message:P,response:C}}(g.message,O)}}(S)},onRetry:function(S){var O=b(S);return S.isTimedOut&&l++,Promise.all([t.logger.info("Retryable failure",eo(O)),t.hostsCache.set(h,Yr(h,S.isTimedOut?Zr:_a))]).then(function(){return p(v,d)})},onFail:function(S){throw b(S),function(O,g){var P=O.content,C=O.status,L=P;try{L=JSON.parse(P).message}catch{}return function(x,k,N){return{name:"ApiError",message:x,status:k,transporterStackTrace:N}}(L,C,g)}(S,sr(o))}};return t.requester.send(y).then(function(S){return function(O,g){return function(P){var C=P.status;return P.isTimedOut||function(L){var x=L.isTimedOut,k=L.status;return!x&&~~k==0}(P)||~~(C/100)!=2&&~~(C/100)!=4}(O)?g.onRetry(O):~~(O.status/100)==2?g.onSuccess(O):g.onFail(O)}(S,_)})};return Oa(t.hostsCache,e).then(function(p){return m(ft(p.statelessHosts).reverse(),p.getTimeout)})}function Sa(t){var e={value:"Algolia for JavaScript (".concat(t,")"),add:function(n){var r="; ".concat(n.segment).concat(n.version!==void 0?" (".concat(n.version,")"):"");return e.value.indexOf(r)===-1&&(e.value="".concat(e.value).concat(r)),e}};return e}function wa(t,e,n){var r=Xr(n),o="".concat(t.protocol,"://").concat(t.url,"/").concat(e.charAt(0)==="/"?e.substr(1):e);return r.length&&(o+="?".concat(r)),o}function Xr(t){return Object.keys(t).map(function(e){return bt("%s=%s",e,(n=t[e],Object.prototype.toString.call(n)==="[object Object]"||Object.prototype.toString.call(n)==="[object Array]"?JSON.stringify(t[e]):t[e]));var n}).join("&")}function sr(t){return t.map(function(e){return eo(e)})}function eo(t){var e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return I(I({},t),{},{request:I(I({},t.request),{},{headers:I(I({},t.request.headers),e)})})}var ja=function(t){var e=t.appId,n=function(i,a,u){var c={"x-algolia-api-key":u,"x-algolia-application-id":a};return{headers:function(){return i===st.WithinHeaders?c:{}},queryParameters:function(){return i===st.WithinQueryParameters?c:{}}}}(t.authMode!==void 0?t.authMode:st.WithinHeaders,e,t.apiKey),r=function(i){var a=i.hostsCache,u=i.logger,c=i.requester,s=i.requestsCache,l=i.responsesCache,m=i.timeouts,p=i.userAgent,v=i.hosts,d=i.queryParameters,h={hostsCache:a,logger:u,requester:c,requestsCache:s,responsesCache:l,timeouts:m,userAgent:p,headers:i.headers,queryParameters:d,hosts:v.map(function(y){return Gr(y)}),read:function(y,b){var _=ur(b,h.timeouts.read),S=function(){return lr(h,h.hosts.filter(function(g){return(g.accept&me.Read)!=0}),y,_)};if((_.cacheable!==void 0?_.cacheable:y.cacheable)!==!0)return S();var O={request:y,mappedRequestOptions:_,transporter:{queryParameters:h.queryParameters,headers:h.headers}};return h.responsesCache.get(O,function(){return h.requestsCache.get(O,function(){return h.requestsCache.set(O,S()).then(function(g){return Promise.all([h.requestsCache.delete(O),g])},function(g){return Promise.all([h.requestsCache.delete(O),Promise.reject(g)])}).then(function(g){var P=se(g,2);return P[0],P[1]})})},{miss:function(g){return h.responsesCache.set(O,g)}})},write:function(y,b){return lr(h,h.hosts.filter(function(_){return(_.accept&me.Write)!=0}),y,ur(b,h.timeouts.write))}};return h}(I(I({hosts:[{url:"".concat(e,"-dsn.algolia.net"),accept:me.Read},{url:"".concat(e,".algolia.net"),accept:me.Write}].concat(ba([{url:"".concat(e,"-1.algolianet.com")},{url:"".concat(e,"-2.algolianet.com")},{url:"".concat(e,"-3.algolianet.com")}]))},t),{},{headers:I(I(I({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),t.headers),queryParameters:I(I({},n.queryParameters()),t.queryParameters)})),o={transporter:r,appId:e,addAlgoliaAgent:function(i,a){r.userAgent.add({segment:i,version:a})},clearCache:function(){return Promise.all([r.requestsCache.clear(),r.responsesCache.clear()]).then(function(){})}};return $r(o,t.methods)},Ea=function(t){return function(e,n){return e.method===$t?t.transporter.read(e,n):t.transporter.write(e,n)}},to=function(t){return function(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r={transporter:t.transporter,appId:t.appId,indexName:e};return $r(r,n.methods)}},fr=function(t){return function(e,n){var r=e.map(function(o){return I(I({},o),{},{params:Xr(o.params||{})})});return t.transporter.read({method:_t,path:"1/indexes/*/queries",data:{requests:r},cacheable:!0},n)}},mr=function(t){return function(e,n){return Promise.all(e.map(function(r){var o=r.params,i=o.facetName,a=o.facetQuery,u=Oo(o,ya);return to(t)(r.indexName,{methods:{searchForFacetValues:no}}).searchForFacetValues(i,a,I(I({},n),u))}))}},Pa=function(t){return function(e,n,r){return t.transporter.read({method:_t,path:bt("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:n},cacheable:!0},r)}},Ia=function(t){return function(e,n){return t.transporter.read({method:_t,path:bt("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},n)}},no=function(t){return function(e,n,r){return t.transporter.read({method:_t,path:bt("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:n},cacheable:!0},r)}},Da=1,ka=2,Aa=3;function ro(t,e,n){var r,o={appId:t,apiKey:e,timeouts:{connect:1,read:2,write:30},requester:{send:function(i){return new Promise(function(a){var u=new XMLHttpRequest;u.open(i.method,i.url,!0),Object.keys(i.headers).forEach(function(m){return u.setRequestHeader(m,i.headers[m])});var c,s=function(m,p){return setTimeout(function(){u.abort(),a({status:0,content:p,isTimedOut:!0})},1e3*m)},l=s(i.connectTimeout,"Connection timeout");u.onreadystatechange=function(){u.readyState>u.OPENED&&c===void 0&&(clearTimeout(l),c=s(i.responseTimeout,"Socket timeout"))},u.onerror=function(){u.status===0&&(clearTimeout(l),clearTimeout(c),a({content:u.responseText||"Network request failed",status:u.status,isTimedOut:!1}))},u.onload=function(){clearTimeout(l),clearTimeout(c),a({content:u.responseText,status:u.status,isTimedOut:!1})},u.send(i.data)})}},logger:(r=Aa,{debug:function(i,a){return Da>=r&&console.debug(i,a),Promise.resolve()},info:function(i,a){return ka>=r&&console.info(i,a),Promise.resolve()},error:function(i,a){return console.error(i,a),Promise.resolve()}}),responsesCache:Tt(),requestsCache:Tt({serializable:!1}),hostsCache:Ee({caches:[ga({key:"".concat("4.19.1","-").concat(t)}),Tt()]}),userAgent:Sa("4.19.1").add({segment:"Browser",version:"lite"}),authMode:st.WithinQueryParameters};return ja(I(I(I({},o),n),{},{methods:{search:fr,searchForFacetValues:mr,multipleQueries:fr,multipleSearchForFacetValues:mr,customRequest:Ea,initIndex:function(i){return function(a){return to(i)(a,{methods:{search:Ia,searchForFacetValues:no,findAnswers:Pa}})}}}}))}ro.version="4.19.1";var Ca=["footer","searchBox"];function Be(){return Be=Object.assign||function(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n=0||(l[c]=a[c]);return l}(t,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(t,n)&&(o[n]=t[n])}return o}function Ra(t){var e=t.appId,n=t.apiKey,r=t.indexName,o=t.placeholder,i=o===void 0?"Search docs":o,a=t.searchParameters,u=t.maxResultsPerGroup,c=t.onClose,s=c===void 0?na:c,l=t.transformItems,m=l===void 0?ar:l,p=t.hitComponent,v=p===void 0?Li:p,d=t.resultsFooterComponent,h=d===void 0?function(){return null}:d,y=t.navigator,b=t.initialScrollY,_=b===void 0?0:b,S=t.transformSearchClient,O=S===void 0?ar:S,g=t.disableUserPersonalization,P=g!==void 0&&g,C=t.initialQuery,L=C===void 0?"":C,x=t.translations,k=x===void 0?{}:x,N=t.getMissingResultsUrl,U=t.insights,F=U!==void 0&&U,M=k.footer,Ot=k.searchBox,St=Ta(k,Ca),$e=Na(f.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),B=$e[0],oo=$e[1],Xt=f.useRef(null),wt=f.useRef(null),en=f.useRef(null),Qe=f.useRef(null),he=f.useRef(null),Q=f.useRef(10),tn=f.useRef(typeof window<"u"?window.getSelection().toString().slice(0,64):"").current,ee=f.useRef(L||tn).current,nn=function(j,D,T){return f.useMemo(function(){var H=ro(j,D);return H.addAlgoliaAgent("docsearch","3.5.2"),/docsearch.js \(.*\)/.test(H.transporter.userAgent.value)===!1&&H.addAlgoliaAgent("docsearch-react","3.5.2"),T(H)},[j,D,T])}(e,n,O),oe=f.useRef(cr({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(r),limit:10})).current,ye=f.useRef(cr({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(r),limit:oe.getAll().length===0?7:4})).current,ge=f.useCallback(function(j){if(!P){var D=j.type==="content"?j.__docsearch_parent:j;D&&oe.getAll().findIndex(function(T){return T.objectID===D.objectID})===-1&&ye.add(D)}},[oe,ye,P]),io=f.useCallback(function(j){if(B.context.algoliaInsightsPlugin&&j.__autocomplete_id){var D=j,T={eventName:"Item Selected",index:D.__autocomplete_indexName,items:[D],positions:[j.__autocomplete_id],queryID:D.__autocomplete_queryID};B.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(T)}},[B.context.algoliaInsightsPlugin]),be=f.useMemo(function(){return Ti({id:"docsearch",defaultActiveItemId:0,placeholder:i,openOnFocus:!0,initialState:{query:ee,context:{searchSuggestions:[]}},insights:F,navigator:y,onStateChange:function(j){oo(j.state)},getSources:function(j){var D=j.query,T=j.state,H=j.setContext,Z=j.setStatus;if(!D)return P?[]:[{sourceId:"recentSearches",onSelect:function(A){var V=A.item,_e=A.event;ge(V),at(_e)||s()},getItemUrl:function(A){return A.item.url},getItems:function(){return ye.getAll()}},{sourceId:"favoriteSearches",onSelect:function(A){var V=A.item,_e=A.event;ge(V),at(_e)||s()},getItemUrl:function(A){return A.item.url},getItems:function(){return oe.getAll()}}];var Y=!!F;return nn.search([{query:D,indexName:r,params:Rt({attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(Q.current),"hierarchy.lvl2:".concat(Q.current),"hierarchy.lvl3:".concat(Q.current),"hierarchy.lvl4:".concat(Q.current),"hierarchy.lvl5:".concat(Q.current),"hierarchy.lvl6:".concat(Q.current),"content:".concat(Q.current)],snippetEllipsisText:"…",highlightPreTag:"",highlightPostTag:"",hitsPerPage:20,clickAnalytics:Y},a)}]).catch(function(A){throw A.name==="RetryError"&&Z("error"),A}).then(function(A){var V=A.results[0],_e=V.hits,uo=V.nbHits,jt=ir(_e,function(Et){return Jr(Et)},u);T.context.searchSuggestions.length0&&(rn(),he.current&&he.current.focus())},[ee,rn]),f.useEffect(function(){function j(){if(wt.current){var D=.01*window.innerHeight;wt.current.style.setProperty("--docsearch-vh","".concat(D,"px"))}}return j(),window.addEventListener("resize",j),function(){window.removeEventListener("resize",j)}},[]),f.createElement("div",Be({ref:Xt},co({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container",B.status==="stalled"&&"DocSearch-Container--Stalled",B.status==="error"&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(j){j.target===j.currentTarget&&s()}}),f.createElement("div",{className:"DocSearch-Modal",ref:wt},f.createElement("header",{className:"DocSearch-SearchBar",ref:en},f.createElement(pa,Be({},be,{state:B,autoFocus:ee.length===0,inputRef:he,isFromSelection:!!ee&&ee===tn,translations:Ot,onClose:s}))),f.createElement("div",{className:"DocSearch-Dropdown",ref:Qe},f.createElement(sa,Be({},be,{indexName:r,state:B,hitComponent:v,resultsFooterComponent:h,disableUserPersonalization:P,recentSearches:ye,favoriteSearches:oe,inputRef:he,translations:St,getMissingResultsUrl:N,onItemClick:function(j,D){io(j),ge(j),at(D)||s()}}))),f.createElement("footer",{className:"DocSearch-Footer"},f.createElement(qi,{translations:M}))))}function Qt(){return Qt=Object.assign||function(t){for(var e=1;et.length)&&(e=t.length);for(var n=0,r=new Array(e);n1&&arguments[1]!==void 0?arguments[1]:window;return typeof e=="string"?n.document.querySelector(e):e}(t.container,t.environment))}const Ma={id:"docsearch"},Fa=so({__name:"VPAlgoliaSearchBox",props:{algolia:{}},setup(t){const e=t,n=fo(),r=mo(),{site:o,localeIndex:i,lang:a}=bo();po(u),vo(i,u);async function u(){var v,d;await ho();const l={...e.algolia,...(v=e.algolia.locales)==null?void 0:v[i.value]},m=((d=l.searchParameters)==null?void 0:d.facetFilters)??[],p=[...(Array.isArray(m)?m:[m]).filter(h=>!h.startsWith("lang:")),`lang:${a.value}`];c({...l,searchParameters:{...l.searchParameters,facetFilters:p}})}function c(l){const m=Object.assign({},l,{container:"#docsearch",navigator:{navigate({itemUrl:p}){const{pathname:v}=new URL(window.location.origin+p);r.path===v?window.location.assign(window.location.origin+p):n.go(p)}},transformItems(p){return p.map(v=>Object.assign({},v,{url:s(v.url)}))},hitComponent({hit:p,children:v}){return{__v:null,type:"a",ref:void 0,constructor:void 0,key:void 0,props:{href:p.url,children:v}}}});La(m)}function s(l){const{pathname:m,hash:p}=new URL(l,location.origin);return m.replace(/\.html$/,o.value.cleanUrls?"":".html")+p}return(l,m)=>(yo(),go("div",Ma))}});export{Fa as default}; diff --git a/assets/chunks/framework.7d2df8c6.js b/assets/chunks/framework.7d2df8c6.js new file mode 100644 index 000000000..137e0bb72 --- /dev/null +++ b/assets/chunks/framework.7d2df8c6.js @@ -0,0 +1,2 @@ +function cs(e,t){const n=Object.create(null),s=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const te={},pt=[],Oe=()=>{},Qo=()=>!1,Zo=/^on[^a-z]/,Ut=e=>Zo.test(e),as=e=>e.startsWith("onUpdate:"),le=Object.assign,us=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Go=Object.prototype.hasOwnProperty,J=(e,t)=>Go.call(e,t),D=Array.isArray,gt=e=>vn(e)==="[object Map]",Fr=e=>vn(e)==="[object Set]",W=e=>typeof e=="function",se=e=>typeof e=="string",bn=e=>typeof e=="symbol",ee=e=>e!==null&&typeof e=="object",Ir=e=>(ee(e)||W(e))&&W(e.then)&&W(e.catch),Mr=Object.prototype.toString,vn=e=>Mr.call(e),ei=e=>vn(e).slice(8,-1),Lr=e=>vn(e)==="[object Object]",fs=e=>se(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,It=cs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),wn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ti=/-(\w)/g,Le=wn(e=>e.replace(ti,(t,n)=>n?n.toUpperCase():"")),ni=/\B([A-Z])/g,at=wn(e=>e.replace(ni,"-$1").toLowerCase()),Cn=wn(e=>e.charAt(0).toUpperCase()+e.slice(1)),on=wn(e=>e?`on${Cn(e)}`:""),ct=(e,t)=>!Object.is(e,t),$n=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},si=e=>{const t=parseFloat(e);return isNaN(t)?e:t},ri=e=>{const t=se(e)?Number(e):NaN;return isNaN(t)?e:t};let $s;const Yn=()=>$s||($s=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ds(e){if(D(e)){const t={};for(let n=0;n{if(n){const s=n.split(ii);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function hs(e){let t="";if(se(e))t=e;else if(D(e))for(let n=0;nse(e)?e:e==null?"":D(e)||ee(e)&&(e.toString===Mr||!W(e.toString))?JSON.stringify(e,Hr,2):String(e),Hr=(e,t)=>t&&t.__v_isRef?Hr(e,t.value):gt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:Fr(t)?{[`Set(${t.size})`]:[...t.values()]}:ee(t)&&!D(t)&&!Lr(t)?String(t):t;let be;class fi{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=be;try{return be=this,t()}finally{be=n}}}on(){be=this}off(){be=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},jr=e=>(e.w&Xe)>0,Dr=e=>(e.n&Xe)>0,pi=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s{(d==="length"||!bn(d)&&d>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(i.get(n)),t){case"add":D(e)?fs(n)&&l.push(i.get("length")):(l.push(i.get(ot)),gt(e)&&l.push(i.get(Xn)));break;case"delete":D(e)||(l.push(i.get(ot)),gt(e)&&l.push(i.get(Xn)));break;case"set":gt(e)&&l.push(i.get(ot));break}if(l.length===1)l[0]&&Qn(l[0]);else{const c=[];for(const u of l)u&&c.push(...u);Qn(ps(c))}}function Qn(e,t){const n=D(e)?e:[...e];for(const s of n)s.computed&&Ds(s);for(const s of n)s.computed||Ds(s)}function Ds(e,t){(e!==Se||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function mi(e,t){var n;return(n=un.get(e))==null?void 0:n.get(t)}const yi=cs("__proto__,__v_isRef,__isVue"),Ur=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(bn)),Bs=_i();function _i(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=X(this);for(let o=0,i=this.length;o{e[t]=function(...n){Tt();const s=X(this)[t].apply(this,n);return At(),s}}),e}function bi(e){const t=X(this);return ye(t,"has",e),t.hasOwnProperty(e)}class Kr{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,s){const r=this._isReadonly,o=this._shallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return o;if(n==="__v_raw"&&s===(r?o?Ii:zr:o?qr:Vr).get(t))return t;const i=D(t);if(!r){if(i&&J(Bs,n))return Reflect.get(Bs,n,s);if(n==="hasOwnProperty")return bi}const l=Reflect.get(t,n,s);return(bn(n)?Ur.has(n):yi(n))||(r||ye(t,"get",n),o)?l:ae(l)?i&&fs(n)?l:l.value:ee(l)?r?Tn(l):xn(l):l}}class Wr extends Kr{constructor(t=!1){super(!1,t)}set(t,n,s,r){let o=t[n];if(vt(o)&&ae(o)&&!ae(s))return!1;if(!this._shallow&&(!fn(s)&&!vt(s)&&(o=X(o),s=X(s)),!D(t)&&ae(o)&&!ae(s)))return o.value=s,!0;const i=D(t)&&fs(n)?Number(n)e,En=e=>Reflect.getPrototypeOf(e);function zt(e,t,n=!1,s=!1){e=e.__v_raw;const r=X(e),o=X(t);n||(ct(t,o)&&ye(r,"get",t),ye(r,"get",o));const{has:i}=En(r),l=s?ms:n?bs:$t;if(i.call(r,t))return l(e.get(t));if(i.call(r,o))return l(e.get(o));e!==r&&e.get(t)}function Yt(e,t=!1){const n=this.__v_raw,s=X(n),r=X(e);return t||(ct(e,r)&&ye(s,"has",e),ye(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function Jt(e,t=!1){return e=e.__v_raw,!t&&ye(X(e),"iterate",ot),Reflect.get(e,"size",e)}function ks(e){e=X(e);const t=X(this);return En(t).has.call(t,e)||(t.add(e),je(t,"add",e,e)),this}function Us(e,t){t=X(t);const n=X(this),{has:s,get:r}=En(n);let o=s.call(n,e);o||(e=X(e),o=s.call(n,e));const i=r.call(n,e);return n.set(e,t),o?ct(t,i)&&je(n,"set",e,t):je(n,"add",e,t),this}function Ks(e){const t=X(this),{has:n,get:s}=En(t);let r=n.call(t,e);r||(e=X(e),r=n.call(t,e)),s&&s.call(t,e);const o=t.delete(e);return r&&je(t,"delete",e,void 0),o}function Ws(){const e=X(this),t=e.size!==0,n=e.clear();return t&&je(e,"clear",void 0,void 0),n}function Xt(e,t){return function(s,r){const o=this,i=o.__v_raw,l=X(i),c=t?ms:e?bs:$t;return!e&&ye(l,"iterate",ot),i.forEach((u,d)=>s.call(r,c(u),c(d),o))}}function Qt(e,t,n){return function(...s){const r=this.__v_raw,o=X(r),i=gt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,u=r[e](...s),d=n?ms:t?bs:$t;return!t&&ye(o,"iterate",c?Xn:ot),{next(){const{value:h,done:y}=u.next();return y?{value:h,done:y}:{value:l?[d(h[0]),d(h[1])]:d(h),done:y}},[Symbol.iterator](){return this}}}}function Be(e){return function(...t){return e==="delete"?!1:this}}function xi(){const e={get(o){return zt(this,o)},get size(){return Jt(this)},has:Yt,add:ks,set:Us,delete:Ks,clear:Ws,forEach:Xt(!1,!1)},t={get(o){return zt(this,o,!1,!0)},get size(){return Jt(this)},has:Yt,add:ks,set:Us,delete:Ks,clear:Ws,forEach:Xt(!1,!0)},n={get(o){return zt(this,o,!0)},get size(){return Jt(this,!0)},has(o){return Yt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Xt(!0,!1)},s={get(o){return zt(this,o,!0,!0)},get size(){return Jt(this,!0)},has(o){return Yt.call(this,o,!0)},add:Be("add"),set:Be("set"),delete:Be("delete"),clear:Be("clear"),forEach:Xt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(o=>{e[o]=Qt(o,!1,!1),n[o]=Qt(o,!0,!1),t[o]=Qt(o,!1,!0),s[o]=Qt(o,!0,!0)}),[e,n,t,s]}const[Ti,Ai,Si,Ri]=xi();function ys(e,t){const n=t?e?Ri:Si:e?Ai:Ti;return(s,r,o)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(J(n,r)&&r in s?n:s,r,o)}const Oi={get:ys(!1,!1)},Pi={get:ys(!1,!0)},Fi={get:ys(!0,!1)},Vr=new WeakMap,qr=new WeakMap,zr=new WeakMap,Ii=new WeakMap;function Mi(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Li(e){return e.__v_skip||!Object.isExtensible(e)?0:Mi(ei(e))}function xn(e){return vt(e)?e:_s(e,!1,wi,Oi,Vr)}function Ni(e){return _s(e,!1,Ei,Pi,qr)}function Tn(e){return _s(e,!0,Ci,Fi,zr)}function _s(e,t,n,s,r){if(!ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const o=r.get(e);if(o)return o;const i=Li(e);if(i===0)return e;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function mt(e){return vt(e)?mt(e.__v_raw):!!(e&&e.__v_isReactive)}function vt(e){return!!(e&&e.__v_isReadonly)}function fn(e){return!!(e&&e.__v_isShallow)}function Yr(e){return mt(e)||vt(e)}function X(e){const t=e&&e.__v_raw;return t?X(t):e}function Mt(e){return an(e,"__v_skip",!0),e}const $t=e=>ee(e)?xn(e):e,bs=e=>ee(e)?Tn(e):e;function vs(e){qe&&Se&&(e=X(e),kr(e.dep||(e.dep=ps())))}function ws(e,t){e=X(e);const n=e.dep;n&&Qn(n)}function ae(e){return!!(e&&e.__v_isRef===!0)}function fe(e){return Xr(e,!1)}function Jr(e){return Xr(e,!0)}function Xr(e,t){return ae(e)?e:new Hi(e,t)}class Hi{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:X(t),this._value=n?t:$t(t)}get value(){return vs(this),this._value}set value(t){const n=this.__v_isShallow||fn(t)||vt(t);t=n?t:X(t),ct(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:$t(t),ws(this))}}function Cs(e){return ae(e)?e.value:e}const $i={get:(e,t,n)=>Cs(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Qr(e){return mt(e)?e:new Proxy(e,$i)}class ji{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>vs(this),()=>ws(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Di(e){return new ji(e)}class Bi{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return mi(X(this._object),this._key)}}class ki{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Ui(e,t,n){return ae(e)?e:W(e)?new ki(e):ee(e)&&arguments.length>1?Ki(e,t,n):fe(e)}function Ki(e,t,n){const s=e[t];return ae(s)?s:new Bi(e,t,n)}class Wi{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new gs(t,()=>{this._dirty||(this._dirty=!0,ws(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=X(this);return vs(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Vi(e,t,n=!1){let s,r;const o=W(e);return o?(s=e,r=Oe):(s=e.get,r=e.set),new Wi(s,r,o||!r,n)}function ze(e,t,n,s){let r;try{r=s?e(...s):e()}catch(o){Kt(o,t,n)}return r}function xe(e,t,n,s){if(W(e)){const o=ze(e,t,n,s);return o&&Ir(o)&&o.catch(i=>{Kt(i,t,n)}),o}const r=[];for(let o=0;o>>1,r=de[s],o=Dt(r);oMe&&de.splice(t,1)}function Ji(e){D(e)?yt.push(...e):(!$e||!$e.includes(e,e.allowRecurse?nt+1:nt))&&yt.push(e),Gr()}function Vs(e,t=jt?Me+1:0){for(;tDt(n)-Dt(s)),nt=0;nt<$e.length;nt++)$e[nt]();$e=null,nt=0}}const Dt=e=>e.id==null?1/0:e.id,Xi=(e,t)=>{const n=Dt(e)-Dt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function eo(e){Zn=!1,jt=!0,de.sort(Xi);const t=Oe;try{for(Me=0;Mese(C)?C.trim():C)),h&&(r=n.map(si))}let l,c=s[l=on(t)]||s[l=on(Le(t))];!c&&o&&(c=s[l=on(at(t))]),c&&xe(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,xe(u,e,6,r)}}function to(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const o=e.emits;let i={},l=!1;if(!W(e)){const c=u=>{const d=to(u,t,!0);d&&(l=!0,le(i,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(ee(e)&&s.set(e,null),null):(D(o)?o.forEach(c=>i[c]=null):le(i,o),ee(e)&&s.set(e,i),i)}function Rn(e,t){return!e||!Ut(t)?!1:(t=t.slice(2).replace(/Once$/,""),J(e,t[0].toLowerCase()+t.slice(1))||J(e,at(t))||J(e,t))}let he=null,On=null;function hn(e){const t=he;return he=e,On=e&&e.type.__scopeId||null,t}function va(e){On=e}function wa(){On=null}function Zi(e,t=he,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&sr(-1);const o=hn(t);let i;try{i=e(...r)}finally{hn(o),s._d&&sr(1)}return i};return s._n=!0,s._c=!0,s._d=!0,s}function jn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:o,propsOptions:[i],slots:l,attrs:c,emit:u,render:d,renderCache:h,data:y,setupState:C,ctx:x,inheritAttrs:S}=e;let L,k;const B=hn(e);try{if(n.shapeFlag&4){const p=r||s;L=Ae(d.call(p,p,h,o,C,y,x)),k=c}else{const p=t;L=Ae(p.length>1?p(o,{attrs:c,slots:l,emit:u}):p(o,null)),k=t.props?c:Gi(c)}}catch(p){Ht.length=0,Kt(p,e,1),L=ne(ve)}let m=L;if(k&&S!==!1){const p=Object.keys(k),{shapeFlag:M}=m;p.length&&M&7&&(i&&p.some(as)&&(k=el(k,i)),m=Qe(m,k))}return n.dirs&&(m=Qe(m),m.dirs=m.dirs?m.dirs.concat(n.dirs):n.dirs),n.transition&&(m.transition=n.transition),L=m,hn(B),L}const Gi=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ut(n))&&((t||(t={}))[n]=e[n]);return t},el=(e,t)=>{const n={};for(const s in e)(!as(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function tl(e,t,n){const{props:s,children:r,component:o}=e,{props:i,children:l,patchFlag:c}=t,u=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?qs(s,i,u):!!i;if(c&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function no(e,t){t&&t.pendingBranch?D(e)?t.effects.push(...e):t.effects.push(e):Ji(e)}function so(e,t){return Pn(e,null,t)}function Ca(e,t){return Pn(e,null,{flush:"post"})}const Zt={};function Ye(e,t,n){return Pn(e,t,n)}function Pn(e,t,{immediate:n,deep:s,flush:r,onTrack:o,onTrigger:i}=te){var l;const c=$r()===((l=ie)==null?void 0:l.scope)?ie:null;let u,d=!1,h=!1;if(ae(e)?(u=()=>e.value,d=fn(e)):mt(e)?(u=()=>e,s=!0):D(e)?(h=!0,d=e.some(p=>mt(p)||fn(p)),u=()=>e.map(p=>{if(ae(p))return p.value;if(mt(p))return ht(p);if(W(p))return ze(p,c,2)})):W(e)?t?u=()=>ze(e,c,2):u=()=>{if(!(c&&c.isUnmounted))return y&&y(),xe(e,c,3,[C])}:u=Oe,t&&s){const p=u;u=()=>ht(p())}let y,C=p=>{y=B.onStop=()=>{ze(p,c,4)}},x;if(Et)if(C=Oe,t?n&&xe(t,c,3,[u(),h?[]:void 0,C]):u(),r==="sync"){const p=Ql();x=p.__watcherHandles||(p.__watcherHandles=[])}else return Oe;let S=h?new Array(e.length).fill(Zt):Zt;const L=()=>{if(B.active)if(t){const p=B.run();(s||d||(h?p.some((M,V)=>ct(M,S[V])):ct(p,S)))&&(y&&y(),xe(t,c,3,[p,S===Zt?void 0:h&&S[0]===Zt?[]:S,C]),S=p)}else B.run()};L.allowRecurse=!!t;let k;r==="sync"?k=L:r==="post"?k=()=>ge(L,c&&c.suspense):(L.pre=!0,c&&(L.id=c.uid),k=()=>Sn(L));const B=new gs(u,k);t?n?L():S=B.run():r==="post"?ge(B.run.bind(B),c&&c.suspense):B.run();const m=()=>{B.stop(),c&&c.scope&&us(c.scope.effects,B)};return x&&x.push(m),m}function rl(e,t,n){const s=this.proxy,r=se(e)?e.includes(".")?ro(s,e):()=>s[e]:e.bind(s,s);let o;W(t)?o=t:(o=t.handler,n=t);const i=ie;Ct(this);const l=Pn(r,o.bind(s),n);return i?Ct(i):it(),l}function ro(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r{ht(n,t)});else if(Lr(e))for(const n in e)ht(e[n],t);return e}function Ie(e,t,n,s){const r=e.dirs,o=t&&t.dirs;for(let i=0;i{e.isMounted=!0}),ao(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],oo={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:we,onEnter:we,onAfterEnter:we,onEnterCancelled:we,onBeforeLeave:we,onLeave:we,onAfterLeave:we,onLeaveCancelled:we,onBeforeAppear:we,onAppear:we,onAfterAppear:we,onAppearCancelled:we},il={name:"BaseTransition",props:oo,setup(e,{slots:t}){const n=Ln(),s=ol();let r;return()=>{const o=t.default&&lo(t.default(),!0);if(!o||!o.length)return;let i=o[0];if(o.length>1){for(const S of o)if(S.type!==ve){i=S;break}}const l=X(e),{mode:c}=l;if(s.isLeaving)return Dn(i);const u=zs(i);if(!u)return Dn(i);const d=Gn(u,l,s,n);es(u,d);const h=n.subTree,y=h&&zs(h);let C=!1;const{getTransitionKey:x}=u.type;if(x){const S=x();r===void 0?r=S:S!==r&&(r=S,C=!0)}if(y&&y.type!==ve&&(!st(u,y)||C)){const S=Gn(y,l,s,n);if(es(y,S),c==="out-in")return s.isLeaving=!0,S.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},Dn(i);c==="in-out"&&u.type!==ve&&(S.delayLeave=(L,k,B)=>{const m=io(s,y);m[String(y.key)]=y,L[We]=()=>{k(),L[We]=void 0,delete d.delayedLeave},d.delayedLeave=B})}return i}}},ll=il;function io(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Gn(e,t,n,s){const{appear:r,mode:o,persisted:i=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:h,onLeave:y,onAfterLeave:C,onLeaveCancelled:x,onBeforeAppear:S,onAppear:L,onAfterAppear:k,onAppearCancelled:B}=t,m=String(e.key),p=io(n,e),M=(w,F)=>{w&&xe(w,s,9,F)},V=(w,F)=>{const R=F[1];M(w,F),D(w)?w.every(Q=>Q.length<=1)&&R():w.length<=1&&R()},U={mode:o,persisted:i,beforeEnter(w){let F=l;if(!n.isMounted)if(r)F=S||l;else return;w[We]&&w[We](!0);const R=p[m];R&&st(e,R)&&R.el[We]&&R.el[We](),M(F,[w])},enter(w){let F=c,R=u,Q=d;if(!n.isMounted)if(r)F=L||c,R=k||u,Q=B||d;else return;let O=!1;const q=w[Gt]=oe=>{O||(O=!0,oe?M(Q,[w]):M(R,[w]),U.delayedLeave&&U.delayedLeave(),w[Gt]=void 0)};F?V(F,[w,q]):q()},leave(w,F){const R=String(e.key);if(w[Gt]&&w[Gt](!0),n.isUnmounting)return F();M(h,[w]);let Q=!1;const O=w[We]=q=>{Q||(Q=!0,F(),q?M(x,[w]):M(C,[w]),w[We]=void 0,p[R]===e&&delete p[R])};p[R]=e,y?V(y,[w,O]):O()},clone(w){return Gn(w,t,n,s)}};return U}function Dn(e){if(Wt(e))return e=Qe(e),e.children=null,e}function zs(e){return Wt(e)?e.children?e.children[0]:void 0:e}function es(e,t){e.shapeFlag&6&&e.component?es(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function lo(e,t=!1,n){let s=[],r=0;for(let o=0;o1)for(let o=0;ole({name:e.name},t,{setup:e}))():e}const _t=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Ea(e){W(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,timeout:o,suspensible:i=!0,onError:l}=e;let c=null,u,d=0;const h=()=>(d++,c=null,y()),y=()=>{let C;return c||(C=c=t().catch(x=>{if(x=x instanceof Error?x:new Error(String(x)),l)return new Promise((S,L)=>{l(x,()=>S(h()),()=>L(x),d+1)});throw x}).then(x=>C!==c&&c?c:(x&&(x.__esModule||x[Symbol.toStringTag]==="Module")&&(x=x.default),u=x,x)))};return xs({name:"AsyncComponentWrapper",__asyncLoader:y,get __asyncResolved(){return u},setup(){const C=ie;if(u)return()=>Bn(u,C);const x=B=>{c=null,Kt(B,C,13,!s)};if(i&&C.suspense||Et)return y().then(B=>()=>Bn(B,C)).catch(B=>(x(B),()=>s?ne(s,{error:B}):null));const S=fe(!1),L=fe(),k=fe(!!r);return r&&setTimeout(()=>{k.value=!1},r),o!=null&&setTimeout(()=>{if(!S.value&&!L.value){const B=new Error(`Async component timed out after ${o}ms.`);x(B),L.value=B}},o),y().then(()=>{S.value=!0,C.parent&&Wt(C.parent.vnode)&&Sn(C.parent.update)}).catch(B=>{x(B),L.value=B}),()=>{if(S.value&&u)return Bn(u,C);if(L.value&&s)return ne(s,{error:L.value});if(n&&!k.value)return ne(n)}}})}function Bn(e,t){const{ref:n,props:s,children:r,ce:o}=t.vnode,i=ne(e,s,r);return i.ref=n,i.ce=o,delete t.vnode.ce,i}const Wt=e=>e.type.__isKeepAlive;function cl(e,t){co(e,"a",t)}function al(e,t){co(e,"da",t)}function co(e,t,n=ie){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Fn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Wt(r.parent.vnode)&&ul(s,t,n,r),r=r.parent}}function ul(e,t,n,s){const r=Fn(t,e,s,!0);In(()=>{us(s[t],r)},n)}function Fn(e,t,n=ie,s=!1){if(n){const r=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;Tt(),Ct(n);const l=xe(t,n,e,i);return it(),At(),l});return s?r.unshift(o):r.push(o),o}}const De=e=>(t,n=ie)=>(!Et||e==="sp")&&Fn(e,(...s)=>t(...s),n),fl=De("bm"),St=De("m"),dl=De("bu"),hl=De("u"),ao=De("bum"),In=De("um"),pl=De("sp"),gl=De("rtg"),ml=De("rtc");function yl(e,t=ie){Fn("ec",e,t)}const Ts="components";function xa(e,t){return fo(Ts,e,!0,t)||e}const uo=Symbol.for("v-ndc");function Ta(e){return se(e)?fo(Ts,e,!1)||e:e||uo}function fo(e,t,n=!0,s=!1){const r=he||ie;if(r){const o=r.type;if(e===Ts){const l=Yl(o,!1);if(l&&(l===t||l===Le(t)||l===Cn(Le(t))))return o}const i=Ys(r[e]||o[e],t)||Ys(r.appContext[e],t);return!i&&s?o:i}}function Ys(e,t){return e&&(e[t]||e[Le(t)]||e[Cn(Le(t))])}function Aa(e,t,n,s){let r;const o=n&&n[s];if(D(e)||se(e)){r=new Array(e.length);for(let i=0,l=e.length;it(i,l,void 0,o&&o[l]));else{const i=Object.keys(e);r=new Array(i.length);for(let l=0,c=i.length;lyn(t)?!(t.type===ve||t.type===me&&!ho(t.children)):!0)?e:null}function Ra(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:on(s)]=e[s];return n}const ts=e=>e?Oo(e)?Ps(e)||e.proxy:ts(e.parent):null,Lt=le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>ts(e.parent),$root:e=>ts(e.root),$emit:e=>e.emit,$options:e=>As(e),$forceUpdate:e=>e.f||(e.f=()=>Sn(e.update)),$nextTick:e=>e.n||(e.n=An.bind(e.proxy)),$watch:e=>rl.bind(e)}),kn=(e,t)=>e!==te&&!e.__isScriptSetup&&J(e,t),_l={get({_:e},t){const{ctx:n,setupState:s,data:r,props:o,accessCache:i,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const C=i[t];if(C!==void 0)switch(C){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return o[t]}else{if(kn(s,t))return i[t]=1,s[t];if(r!==te&&J(r,t))return i[t]=2,r[t];if((u=e.propsOptions[0])&&J(u,t))return i[t]=3,o[t];if(n!==te&&J(n,t))return i[t]=4,n[t];ns&&(i[t]=0)}}const d=Lt[t];let h,y;if(d)return t==="$attrs"&&ye(e,"get",t),d(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&J(n,t))return i[t]=4,n[t];if(y=c.config.globalProperties,J(y,t))return y[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:o}=e;return kn(r,t)?(r[t]=n,!0):s!==te&&J(s,t)?(s[t]=n,!0):J(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:o}},i){let l;return!!n[i]||e!==te&&J(e,i)||kn(t,i)||(l=o[0])&&J(l,i)||J(s,i)||J(Lt,i)||J(r.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:J(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Oa(){return bl().slots}function bl(){const e=Ln();return e.setupContext||(e.setupContext=Fo(e))}function Js(e){return D(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let ns=!0;function vl(e){const t=As(e),n=e.proxy,s=e.ctx;ns=!1,t.beforeCreate&&Xs(t.beforeCreate,e,"bc");const{data:r,computed:o,methods:i,watch:l,provide:c,inject:u,created:d,beforeMount:h,mounted:y,beforeUpdate:C,updated:x,activated:S,deactivated:L,beforeDestroy:k,beforeUnmount:B,destroyed:m,unmounted:p,render:M,renderTracked:V,renderTriggered:U,errorCaptured:w,serverPrefetch:F,expose:R,inheritAttrs:Q,components:O,directives:q,filters:oe}=t;if(u&&wl(u,s,null),i)for(const z in i){const j=i[z];W(j)&&(s[z]=j.bind(n))}if(r){const z=r.call(n,n);ee(z)&&(e.data=xn(z))}if(ns=!0,o)for(const z in o){const j=o[z],Ne=W(j)?j.bind(n,n):W(j.get)?j.get.bind(n,n):Oe,Vt=!W(j)&&W(j.set)?j.set.bind(n):Oe,Ze=ce({get:Ne,set:Vt});Object.defineProperty(s,z,{enumerable:!0,configurable:!0,get:()=>Ze.value,set:Pe=>Ze.value=Pe})}if(l)for(const z in l)po(l[z],s,n,z);if(c){const z=W(c)?c.call(n):c;Reflect.ownKeys(z).forEach(j=>{Sl(j,z[j])})}d&&Xs(d,e,"c");function N(z,j){D(j)?j.forEach(Ne=>z(Ne.bind(n))):j&&z(j.bind(n))}if(N(fl,h),N(St,y),N(dl,C),N(hl,x),N(cl,S),N(al,L),N(yl,w),N(ml,V),N(gl,U),N(ao,B),N(In,p),N(pl,F),D(R))if(R.length){const z=e.exposed||(e.exposed={});R.forEach(j=>{Object.defineProperty(z,j,{get:()=>n[j],set:Ne=>n[j]=Ne})})}else e.exposed||(e.exposed={});M&&e.render===Oe&&(e.render=M),Q!=null&&(e.inheritAttrs=Q),O&&(e.components=O),q&&(e.directives=q)}function wl(e,t,n=Oe){D(e)&&(e=ss(e));for(const s in e){const r=e[s];let o;ee(r)?"default"in r?o=bt(r.from||s,r.default,!0):o=bt(r.from||s):o=bt(r),ae(o)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[s]=o}}function Xs(e,t,n){xe(D(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function po(e,t,n,s){const r=s.includes(".")?ro(n,s):()=>n[s];if(se(e)){const o=t[e];W(o)&&Ye(r,o)}else if(W(e))Ye(r,e.bind(n));else if(ee(e))if(D(e))e.forEach(o=>po(o,t,n,s));else{const o=W(e.handler)?e.handler.bind(n):t[e.handler];W(o)&&Ye(r,o,e)}}function As(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>pn(c,u,i,!0)),pn(c,t,i)),ee(t)&&o.set(t,c),c}function pn(e,t,n,s=!1){const{mixins:r,extends:o}=t;o&&pn(e,o,n,!0),r&&r.forEach(i=>pn(e,i,n,!0));for(const i in t)if(!(s&&i==="expose")){const l=Cl[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const Cl={data:Qs,props:Zs,emits:Zs,methods:Ft,computed:Ft,beforeCreate:pe,created:pe,beforeMount:pe,mounted:pe,beforeUpdate:pe,updated:pe,beforeDestroy:pe,beforeUnmount:pe,destroyed:pe,unmounted:pe,activated:pe,deactivated:pe,errorCaptured:pe,serverPrefetch:pe,components:Ft,directives:Ft,watch:xl,provide:Qs,inject:El};function Qs(e,t){return t?e?function(){return le(W(e)?e.call(this,this):e,W(t)?t.call(this,this):t)}:t:e}function El(e,t){return Ft(ss(e),ss(t))}function ss(e){if(D(e)){const t={};for(let n=0;n1)return n&&W(t)?t.call(s&&s.proxy):t}}function Rl(e,t,n,s=!1){const r={},o={};an(o,Mn,1),e.propsDefaults=Object.create(null),mo(e,t,r,o);for(const i in e.propsOptions[0])i in r||(r[i]=void 0);n?e.props=s?r:Ni(r):e.type.props?e.props=r:e.props=o,e.attrs=o}function Ol(e,t,n,s){const{props:r,attrs:o,vnode:{patchFlag:i}}=e,l=X(r),[c]=e.propsOptions;let u=!1;if((s||i>0)&&!(i&16)){if(i&8){const d=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,C]=yo(h,t,!0);le(i,y),C&&l.push(...C)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!o&&!c)return ee(e)&&s.set(e,pt),pt;if(D(o))for(let d=0;d-1,C[1]=S<0||x-1||J(C,"default"))&&l.push(h)}}}const u=[i,l];return ee(e)&&s.set(e,u),u}function Gs(e){return e[0]!=="$"}function er(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function tr(e,t){return er(e)===er(t)}function nr(e,t){return D(t)?t.findIndex(n=>tr(n,e)):W(t)&&tr(t,e)?0:-1}const _o=e=>e[0]==="_"||e==="$stable",Ss=e=>D(e)?e.map(Ae):[Ae(e)],Pl=(e,t,n)=>{if(t._n)return t;const s=Zi((...r)=>Ss(t(...r)),n);return s._c=!1,s},bo=(e,t,n)=>{const s=e._ctx;for(const r in e){if(_o(r))continue;const o=e[r];if(W(o))t[r]=Pl(r,o,s);else if(o!=null){const i=Ss(o);t[r]=()=>i}}},vo=(e,t)=>{const n=Ss(t);e.slots.default=()=>n},Fl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=X(t),an(t,"_",n)):bo(t,e.slots={})}else e.slots={},t&&vo(e,t);an(e.slots,Mn,1)},Il=(e,t,n)=>{const{vnode:s,slots:r}=e;let o=!0,i=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:(le(r,t),!n&&l===1&&delete r._):(o=!t.$stable,bo(t,r)),i=t}else t&&(vo(e,t),i={default:1});if(o)for(const l in r)!_o(l)&&i[l]==null&&delete r[l]};function mn(e,t,n,s,r=!1){if(D(e)){e.forEach((y,C)=>mn(y,t&&(D(t)?t[C]:t),n,s,r));return}if(_t(s)&&!r)return;const o=s.shapeFlag&4?Ps(s.component)||s.component.proxy:s.el,i=r?null:o,{i:l,r:c}=e,u=t&&t.r,d=l.refs===te?l.refs={}:l.refs,h=l.setupState;if(u!=null&&u!==c&&(se(u)?(d[u]=null,J(h,u)&&(h[u]=null)):ae(u)&&(u.value=null)),W(c))ze(c,l,12,[i,d]);else{const y=se(c),C=ae(c);if(y||C){const x=()=>{if(e.f){const S=y?J(h,c)?h[c]:d[c]:c.value;r?D(S)&&us(S,o):D(S)?S.includes(o)||S.push(o):y?(d[c]=[o],J(h,c)&&(h[c]=d[c])):(c.value=[o],e.k&&(d[e.k]=c.value))}else y?(d[c]=i,J(h,c)&&(h[c]=i)):C&&(c.value=i,e.k&&(d[e.k]=i))};i?(x.id=-1,ge(x,n)):x()}}}let ke=!1;const en=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",tn=e=>e.nodeType===8;function Ml(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:o,parentNode:i,remove:l,insert:c,createComment:u}}=e,d=(m,p)=>{if(!p.hasChildNodes()){n(null,m,p),dn(),p._vnode=m;return}ke=!1,h(p.firstChild,m,null,null,null),dn(),p._vnode=m,ke&&console.error("Hydration completed but contains mismatches.")},h=(m,p,M,V,U,w=!1)=>{const F=tn(m)&&m.data==="[",R=()=>S(m,p,M,V,U,F),{type:Q,ref:O,shapeFlag:q,patchFlag:oe}=p;let ue=m.nodeType;p.el=m,oe===-2&&(w=!1,p.dynamicChildren=null);let N=null;switch(Q){case wt:ue!==3?p.children===""?(c(p.el=r(""),i(m),m),N=m):N=R():(m.data!==p.children&&(ke=!0,m.data=p.children),N=o(m));break;case ve:if(ue!==8||F)if(m.tagName.toLowerCase()==="template"){const z=p.el.content.firstChild;k(z,m,M),p.el=m=z,N=o(m)}else N=R();else N=o(m);break;case Nt:if(F&&(m=o(m),ue=m.nodeType),ue===1||ue===3){N=m;const z=!p.children.length;for(let j=0;j{w=w||!!p.dynamicChildren;const{type:F,props:R,patchFlag:Q,shapeFlag:O,dirs:q,transition:oe}=p,ue=F==="input"&&q||F==="option";if(ue||Q!==-1){if(q&&Ie(p,null,M,"created"),R)if(ue||!w||Q&48)for(const j in R)(ue&&j.endsWith("value")||Ut(j)&&!It(j))&&s(m,j,null,R[j],!1,void 0,M);else R.onClick&&s(m,"onClick",null,R.onClick,!1,void 0,M);let N;(N=R&&R.onVnodeBeforeMount)&&Ce(N,M,p);let z=!1;if(B(m)){z=wo(V,oe)&&M&&M.vnode.props&&M.vnode.props.appear;const j=m.content.firstChild;z&&oe.beforeEnter(j),k(j,m,M),p.el=m=j}if(q&&Ie(p,null,M,"beforeMount"),((N=R&&R.onVnodeMounted)||q||z)&&no(()=>{N&&Ce(N,M,p),z&&oe.enter(m),q&&Ie(p,null,M,"mounted")},V),O&16&&!(R&&(R.innerHTML||R.textContent))){let j=C(m.firstChild,p,m,M,V,U,w);for(;j;){ke=!0;const Ne=j;j=j.nextSibling,l(Ne)}}else O&8&&m.textContent!==p.children&&(ke=!0,m.textContent=p.children)}return m.nextSibling},C=(m,p,M,V,U,w,F)=>{F=F||!!p.dynamicChildren;const R=p.children,Q=R.length;for(let O=0;O{const{slotScopeIds:F}=p;F&&(U=U?U.concat(F):F);const R=i(m),Q=C(o(m),p,R,M,V,U,w);return Q&&tn(Q)&&Q.data==="]"?o(p.anchor=Q):(ke=!0,c(p.anchor=u("]"),R,Q),Q)},S=(m,p,M,V,U,w)=>{if(ke=!0,p.el=null,w){const Q=L(m);for(;;){const O=o(m);if(O&&O!==Q)l(O);else break}}const F=o(m),R=i(m);return l(m),n(null,p,R,F,M,V,en(R),U),F},L=(m,p="[",M="]")=>{let V=0;for(;m;)if(m=o(m),m&&tn(m)&&(m.data===p&&V++,m.data===M)){if(V===0)return o(m);V--}return m},k=(m,p,M)=>{const V=p.parentNode;V&&V.replaceChild(m,p);let U=M;for(;U;)U.vnode.el===p&&(U.vnode.el=m,U.subTree.el=m),U=U.parent},B=m=>m.nodeType===1&&m.tagName.toLowerCase()==="template";return[d,h]}const ge=no;function Ll(e){return Nl(e,Ml)}function Nl(e,t){const n=Yn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:o,createElement:i,createText:l,createComment:c,setText:u,setElementText:d,parentNode:h,nextSibling:y,setScopeId:C=Oe,insertStaticContent:x}=e,S=(a,f,g,_=null,b=null,T=null,P=!1,E=null,A=!!f.dynamicChildren)=>{if(a===f)return;a&&!st(a,f)&&(_=qt(a),Pe(a,b,T,!0),a=null),f.patchFlag===-2&&(A=!1,f.dynamicChildren=null);const{type:v,ref:H,shapeFlag:I}=f;switch(v){case wt:L(a,f,g,_);break;case ve:k(a,f,g,_);break;case Nt:a==null&&B(f,g,_,P);break;case me:O(a,f,g,_,b,T,P,E,A);break;default:I&1?M(a,f,g,_,b,T,P,E,A):I&6?q(a,f,g,_,b,T,P,E,A):(I&64||I&128)&&v.process(a,f,g,_,b,T,P,E,A,ut)}H!=null&&b&&mn(H,a&&a.ref,T,f||a,!f)},L=(a,f,g,_)=>{if(a==null)s(f.el=l(f.children),g,_);else{const b=f.el=a.el;f.children!==a.children&&u(b,f.children)}},k=(a,f,g,_)=>{a==null?s(f.el=c(f.children||""),g,_):f.el=a.el},B=(a,f,g,_)=>{[a.el,a.anchor]=x(a.children,f,g,_,a.el,a.anchor)},m=({el:a,anchor:f},g,_)=>{let b;for(;a&&a!==f;)b=y(a),s(a,g,_),a=b;s(f,g,_)},p=({el:a,anchor:f})=>{let g;for(;a&&a!==f;)g=y(a),r(a),a=g;r(f)},M=(a,f,g,_,b,T,P,E,A)=>{P=P||f.type==="svg",a==null?V(f,g,_,b,T,P,E,A):F(a,f,b,T,P,E,A)},V=(a,f,g,_,b,T,P,E)=>{let A,v;const{type:H,props:I,shapeFlag:$,transition:K,dirs:Y}=a;if(A=a.el=i(a.type,T,I&&I.is,I),$&8?d(A,a.children):$&16&&w(a.children,A,null,_,b,T&&H!=="foreignObject",P,E),Y&&Ie(a,null,_,"created"),U(A,a,a.scopeId,P,_),I){for(const Z in I)Z!=="value"&&!It(Z)&&o(A,Z,null,I[Z],T,a.children,_,b,He);"value"in I&&o(A,"value",null,I.value),(v=I.onVnodeBeforeMount)&&Ce(v,_,a)}Y&&Ie(a,null,_,"beforeMount");const G=wo(b,K);G&&K.beforeEnter(A),s(A,f,g),((v=I&&I.onVnodeMounted)||G||Y)&&ge(()=>{v&&Ce(v,_,a),G&&K.enter(A),Y&&Ie(a,null,_,"mounted")},b)},U=(a,f,g,_,b)=>{if(g&&C(a,g),_)for(let T=0;T<_.length;T++)C(a,_[T]);if(b){let T=b.subTree;if(f===T){const P=b.vnode;U(a,P,P.scopeId,P.slotScopeIds,b.parent)}}},w=(a,f,g,_,b,T,P,E,A=0)=>{for(let v=A;v{const E=f.el=a.el;let{patchFlag:A,dynamicChildren:v,dirs:H}=f;A|=a.patchFlag&16;const I=a.props||te,$=f.props||te;let K;g&&Ge(g,!1),(K=$.onVnodeBeforeUpdate)&&Ce(K,g,f,a),H&&Ie(f,a,g,"beforeUpdate"),g&&Ge(g,!0);const Y=b&&f.type!=="foreignObject";if(v?R(a.dynamicChildren,v,E,g,_,Y,T):P||j(a,f,E,null,g,_,Y,T,!1),A>0){if(A&16)Q(E,f,I,$,g,_,b);else if(A&2&&I.class!==$.class&&o(E,"class",null,$.class,b),A&4&&o(E,"style",I.style,$.style,b),A&8){const G=f.dynamicProps;for(let Z=0;Z{K&&Ce(K,g,f,a),H&&Ie(f,a,g,"updated")},_)},R=(a,f,g,_,b,T,P)=>{for(let E=0;E{if(g!==_){if(g!==te)for(const E in g)!It(E)&&!(E in _)&&o(a,E,g[E],null,P,f.children,b,T,He);for(const E in _){if(It(E))continue;const A=_[E],v=g[E];A!==v&&E!=="value"&&o(a,E,v,A,P,f.children,b,T,He)}"value"in _&&o(a,"value",g.value,_.value)}},O=(a,f,g,_,b,T,P,E,A)=>{const v=f.el=a?a.el:l(""),H=f.anchor=a?a.anchor:l("");let{patchFlag:I,dynamicChildren:$,slotScopeIds:K}=f;K&&(E=E?E.concat(K):K),a==null?(s(v,g,_),s(H,g,_),w(f.children,g,H,b,T,P,E,A)):I>0&&I&64&&$&&a.dynamicChildren?(R(a.dynamicChildren,$,g,b,T,P,E),(f.key!=null||b&&f===b.subTree)&&Co(a,f,!0)):j(a,f,g,H,b,T,P,E,A)},q=(a,f,g,_,b,T,P,E,A)=>{f.slotScopeIds=E,a==null?f.shapeFlag&512?b.ctx.activate(f,g,_,P,A):oe(f,g,_,b,T,P,A):ue(a,f,A)},oe=(a,f,g,_,b,T,P)=>{const E=a.component=Wl(a,_,b);if(Wt(a)&&(E.ctx.renderer=ut),Vl(E),E.asyncDep){if(b&&b.registerDep(E,N),!a.el){const A=E.subTree=ne(ve);k(null,A,f,g)}return}N(E,a,f,g,b,T,P)},ue=(a,f,g)=>{const _=f.component=a.component;if(tl(a,f,g))if(_.asyncDep&&!_.asyncResolved){z(_,f,g);return}else _.next=f,Yi(_.update),_.update();else f.el=a.el,_.vnode=f},N=(a,f,g,_,b,T,P)=>{const E=()=>{if(a.isMounted){let{next:H,bu:I,u:$,parent:K,vnode:Y}=a,G=H,Z;Ge(a,!1),H?(H.el=Y.el,z(a,H,P)):H=Y,I&&$n(I),(Z=H.props&&H.props.onVnodeBeforeUpdate)&&Ce(Z,K,H,Y),Ge(a,!0);const re=jn(a),Te=a.subTree;a.subTree=re,S(Te,re,h(Te.el),qt(Te),a,b,T),H.el=re.el,G===null&&nl(a,re.el),$&&ge($,b),(Z=H.props&&H.props.onVnodeUpdated)&&ge(()=>Ce(Z,K,H,Y),b)}else{let H;const{el:I,props:$}=f,{bm:K,m:Y,parent:G}=a,Z=_t(f);if(Ge(a,!1),K&&$n(K),!Z&&(H=$&&$.onVnodeBeforeMount)&&Ce(H,G,f),Ge(a,!0),I&&Hn){const re=()=>{a.subTree=jn(a),Hn(I,a.subTree,a,b,null)};Z?f.type.__asyncLoader().then(()=>!a.isUnmounted&&re()):re()}else{const re=a.subTree=jn(a);S(null,re,g,_,a,b,T),f.el=re.el}if(Y&&ge(Y,b),!Z&&(H=$&&$.onVnodeMounted)){const re=f;ge(()=>Ce(H,G,re),b)}(f.shapeFlag&256||G&&_t(G.vnode)&&G.vnode.shapeFlag&256)&&a.a&&ge(a.a,b),a.isMounted=!0,f=g=_=null}},A=a.effect=new gs(E,()=>Sn(v),a.scope),v=a.update=()=>A.run();v.id=a.uid,Ge(a,!0),v()},z=(a,f,g)=>{f.component=a;const _=a.vnode.props;a.vnode=f,a.next=null,Ol(a,f.props,_,g),Il(a,f.children,g),Tt(),Vs(),At()},j=(a,f,g,_,b,T,P,E,A=!1)=>{const v=a&&a.children,H=a?a.shapeFlag:0,I=f.children,{patchFlag:$,shapeFlag:K}=f;if($>0){if($&128){Vt(v,I,g,_,b,T,P,E,A);return}else if($&256){Ne(v,I,g,_,b,T,P,E,A);return}}K&8?(H&16&&He(v,b,T),I!==v&&d(g,I)):H&16?K&16?Vt(v,I,g,_,b,T,P,E,A):He(v,b,T,!0):(H&8&&d(g,""),K&16&&w(I,g,_,b,T,P,E,A))},Ne=(a,f,g,_,b,T,P,E,A)=>{a=a||pt,f=f||pt;const v=a.length,H=f.length,I=Math.min(v,H);let $;for($=0;$H?He(a,b,T,!0,!1,I):w(f,g,_,b,T,P,E,A,I)},Vt=(a,f,g,_,b,T,P,E,A)=>{let v=0;const H=f.length;let I=a.length-1,$=H-1;for(;v<=I&&v<=$;){const K=a[v],Y=f[v]=A?Ve(f[v]):Ae(f[v]);if(st(K,Y))S(K,Y,g,null,b,T,P,E,A);else break;v++}for(;v<=I&&v<=$;){const K=a[I],Y=f[$]=A?Ve(f[$]):Ae(f[$]);if(st(K,Y))S(K,Y,g,null,b,T,P,E,A);else break;I--,$--}if(v>I){if(v<=$){const K=$+1,Y=K$)for(;v<=I;)Pe(a[v],b,T,!0),v++;else{const K=v,Y=v,G=new Map;for(v=Y;v<=$;v++){const _e=f[v]=A?Ve(f[v]):Ae(f[v]);_e.key!=null&&G.set(_e.key,v)}let Z,re=0;const Te=$-Y+1;let ft=!1,Ls=0;const Rt=new Array(Te);for(v=0;v=Te){Pe(_e,b,T,!0);continue}let Fe;if(_e.key!=null)Fe=G.get(_e.key);else for(Z=Y;Z<=$;Z++)if(Rt[Z-Y]===0&&st(_e,f[Z])){Fe=Z;break}Fe===void 0?Pe(_e,b,T,!0):(Rt[Fe-Y]=v+1,Fe>=Ls?Ls=Fe:ft=!0,S(_e,f[Fe],g,null,b,T,P,E,A),re++)}const Ns=ft?Hl(Rt):pt;for(Z=Ns.length-1,v=Te-1;v>=0;v--){const _e=Y+v,Fe=f[_e],Hs=_e+1{const{el:T,type:P,transition:E,children:A,shapeFlag:v}=a;if(v&6){Ze(a.component.subTree,f,g,_);return}if(v&128){a.suspense.move(f,g,_);return}if(v&64){P.move(a,f,g,ut);return}if(P===me){s(T,f,g);for(let I=0;IE.enter(T),b);else{const{leave:I,delayLeave:$,afterLeave:K}=E,Y=()=>s(T,f,g),G=()=>{I(T,()=>{Y(),K&&K()})};$?$(T,Y,G):G()}else s(T,f,g)},Pe=(a,f,g,_=!1,b=!1)=>{const{type:T,props:P,ref:E,children:A,dynamicChildren:v,shapeFlag:H,patchFlag:I,dirs:$}=a;if(E!=null&&mn(E,null,g,a,!0),H&256){f.ctx.deactivate(a);return}const K=H&1&&$,Y=!_t(a);let G;if(Y&&(G=P&&P.onVnodeBeforeUnmount)&&Ce(G,f,a),H&6)Xo(a.component,g,_);else{if(H&128){a.suspense.unmount(g,_);return}K&&Ie(a,null,f,"beforeUnmount"),H&64?a.type.remove(a,f,g,b,ut,_):v&&(T!==me||I>0&&I&64)?He(v,f,g,!1,!0):(T===me&&I&384||!b&&H&16)&&He(A,f,g),_&&Is(a)}(Y&&(G=P&&P.onVnodeUnmounted)||K)&&ge(()=>{G&&Ce(G,f,a),K&&Ie(a,null,f,"unmounted")},g)},Is=a=>{const{type:f,el:g,anchor:_,transition:b}=a;if(f===me){Jo(g,_);return}if(f===Nt){p(a);return}const T=()=>{r(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(a.shapeFlag&1&&b&&!b.persisted){const{leave:P,delayLeave:E}=b,A=()=>P(g,T);E?E(a.el,T,A):A()}else T()},Jo=(a,f)=>{let g;for(;a!==f;)g=y(a),r(a),a=g;r(f)},Xo=(a,f,g)=>{const{bum:_,scope:b,update:T,subTree:P,um:E}=a;_&&$n(_),b.stop(),T&&(T.active=!1,Pe(P,a,f,g)),E&&ge(E,f),ge(()=>{a.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},He=(a,f,g,_=!1,b=!1,T=0)=>{for(let P=T;Pa.shapeFlag&6?qt(a.component.subTree):a.shapeFlag&128?a.suspense.next():y(a.anchor||a.el),Ms=(a,f,g)=>{a==null?f._vnode&&Pe(f._vnode,null,null,!0):S(f._vnode||null,a,f,null,null,null,g),Vs(),dn(),f._vnode=a},ut={p:S,um:Pe,m:Ze,r:Is,mt:oe,mc:w,pc:j,pbc:R,n:qt,o:e};let Nn,Hn;return t&&([Nn,Hn]=t(ut)),{render:Ms,hydrate:Nn,createApp:Al(Ms,Nn)}}function Ge({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function wo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Co(e,t,n=!1){const s=e.children,r=t.children;if(D(s)&&D(r))for(let o=0;o>1,e[n[l]]0&&(t[s]=n[o-1]),n[o]=s)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}const $l=e=>e.__isTeleport,me=Symbol.for("v-fgt"),wt=Symbol.for("v-txt"),ve=Symbol.for("v-cmt"),Nt=Symbol.for("v-stc"),Ht=[];let Re=null;function Eo(e=!1){Ht.push(Re=e?null:[])}function jl(){Ht.pop(),Re=Ht[Ht.length-1]||null}let Bt=1;function sr(e){Bt+=e}function xo(e){return e.dynamicChildren=Bt>0?Re||pt:null,jl(),Bt>0&&Re&&Re.push(e),e}function Pa(e,t,n,s,r,o){return xo(So(e,t,n,s,r,o,!0))}function To(e,t,n,s,r){return xo(ne(e,t,n,s,r,!0))}function yn(e){return e?e.__v_isVNode===!0:!1}function st(e,t){return e.type===t.type&&e.key===t.key}const Mn="__vInternal",Ao=({key:e})=>e??null,ln=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||ae(e)||W(e)?{i:he,r:e,k:t,f:!!n}:e:null);function So(e,t=null,n=null,s=0,r=null,o=e===me?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Ao(t),ref:t&&ln(t),scopeId:On,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:he};return l?(Rs(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),Bt>0&&!i&&Re&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Re.push(c),c}const ne=Dl;function Dl(e,t=null,n=null,s=0,r=null,o=!1){if((!e||e===uo)&&(e=ve),yn(e)){const l=Qe(e,t,!0);return n&&Rs(l,n),Bt>0&&!o&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(Jl(e)&&(e=e.__vccOpts),t){t=Bl(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=hs(l)),ee(c)&&(Yr(c)&&!D(c)&&(c=le({},c)),t.style=ds(c))}const i=se(e)?1:sl(e)?128:$l(e)?64:ee(e)?4:W(e)?2:0;return So(e,t,n,s,r,i,o,!0)}function Bl(e){return e?Yr(e)||Mn in e?le({},e):e:null}function Qe(e,t,n=!1){const{props:s,ref:r,patchFlag:o,children:i}=e,l=t?kl(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Ao(l),ref:t&&t.ref?n&&r?D(r)?r.concat(ln(t)):[r,ln(t)]:ln(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==me?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Qe(e.ssContent),ssFallback:e.ssFallback&&Qe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Ro(e=" ",t=0){return ne(wt,null,e,t)}function Fa(e,t){const n=ne(Nt,null,e);return n.staticCount=t,n}function Ia(e="",t=!1){return t?(Eo(),To(ve,null,e)):ne(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?ne(ve):D(e)?ne(me,null,e.slice()):typeof e=="object"?Ve(e):ne(wt,null,String(e))}function Ve(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Qe(e)}function Rs(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(D(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Rs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Mn in t)?t._ctx=he:r===3&&he&&(he.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else W(t)?(t={default:t,_ctx:he},n=32):(t=String(t),s&64?(n=16,t=[Ro(t)]):n=8);e.children=t,e.shapeFlag|=n}function kl(...e){const t={};for(let n=0;nie||he;let Os,dt,rr="__VUE_INSTANCE_SETTERS__";(dt=Yn()[rr])||(dt=Yn()[rr]=[]),dt.push(e=>ie=e),Os=e=>{dt.length>1?dt.forEach(t=>t(e)):dt[0](e)};const Ct=e=>{Os(e),e.scope.on()},it=()=>{ie&&ie.scope.off(),Os(null)};function Oo(e){return e.vnode.shapeFlag&4}let Et=!1;function Vl(e,t=!1){Et=t;const{props:n,children:s}=e.vnode,r=Oo(e);Rl(e,n,r,t),Fl(e,s);const o=r?ql(e,t):void 0;return Et=!1,o}function ql(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Mt(new Proxy(e.ctx,_l));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Fo(e):null;Ct(e),Tt();const o=ze(s,e,0,[e.props,r]);if(At(),it(),Ir(o)){if(o.then(it,it),t)return o.then(i=>{or(e,i,t)}).catch(i=>{Kt(i,e,0)});e.asyncDep=o}else or(e,o,t)}else Po(e,t)}function or(e,t,n){W(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Qr(t)),Po(e,n)}let ir;function Po(e,t,n){const s=e.type;if(!e.render){if(!t&&ir&&!s.render){const r=s.template||As(e).template;if(r){const{isCustomElement:o,compilerOptions:i}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,u=le(le({isCustomElement:o,delimiters:l},i),c);s.render=ir(r,u)}}e.render=s.render||Oe}{Ct(e),Tt();try{vl(e)}finally{At(),it()}}}function zl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return ye(e,"get","$attrs"),t[n]}}))}function Fo(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return zl(e)},slots:e.slots,emit:e.emit,expose:t}}function Ps(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Qr(Mt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Lt)return Lt[n](e)},has(t,n){return n in t||n in Lt}}))}function Yl(e,t=!0){return W(e)?e.displayName||e.name:e.name||t&&e.__name}function Jl(e){return W(e)&&"__vccOpts"in e}const ce=(e,t)=>Vi(e,t,Et);function os(e,t,n){const s=arguments.length;return s===2?ee(t)&&!D(t)?yn(t)?ne(e,null,[t]):ne(e,t):ne(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&yn(n)&&(n=[n]),ne(e,t,n))}const Xl=Symbol.for("v-scx"),Ql=()=>bt(Xl),Zl="3.3.7",Gl="http://www.w3.org/2000/svg",rt=typeof document<"u"?document:null,lr=rt&&rt.createElement("template"),ec={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?rt.createElementNS(Gl,e):rt.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>rt.createTextNode(e),createComment:e=>rt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>rt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,o){const i=n?n.previousSibling:t.lastChild;if(r&&(r===o||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===o||!(r=r.nextSibling)););else{lr.innerHTML=s?`${e}`:e;const l=lr.content;if(s){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ue="transition",Ot="animation",kt=Symbol("_vtc"),Io=(e,{slots:t})=>os(ll,tc(e),t);Io.displayName="Transition";const Mo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Io.props=le({},oo,Mo);const et=(e,t=[])=>{D(e)?e.forEach(n=>n(...t)):e&&e(...t)},cr=e=>e?D(e)?e.some(t=>t.length>1):e.length>1:!1;function tc(e){const t={};for(const O in e)O in Mo||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:u=i,appearToClass:d=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:C=`${n}-leave-to`}=e,x=nc(r),S=x&&x[0],L=x&&x[1],{onBeforeEnter:k,onEnter:B,onEnterCancelled:m,onLeave:p,onLeaveCancelled:M,onBeforeAppear:V=k,onAppear:U=B,onAppearCancelled:w=m}=t,F=(O,q,oe)=>{tt(O,q?d:l),tt(O,q?u:i),oe&&oe()},R=(O,q)=>{O._isLeaving=!1,tt(O,h),tt(O,C),tt(O,y),q&&q()},Q=O=>(q,oe)=>{const ue=O?U:B,N=()=>F(q,O,oe);et(ue,[q,N]),ar(()=>{tt(q,O?c:o),Ke(q,O?d:l),cr(ue)||ur(q,s,S,N)})};return le(t,{onBeforeEnter(O){et(k,[O]),Ke(O,o),Ke(O,i)},onBeforeAppear(O){et(V,[O]),Ke(O,c),Ke(O,u)},onEnter:Q(!1),onAppear:Q(!0),onLeave(O,q){O._isLeaving=!0;const oe=()=>R(O,q);Ke(O,h),oc(),Ke(O,y),ar(()=>{O._isLeaving&&(tt(O,h),Ke(O,C),cr(p)||ur(O,s,L,oe))}),et(p,[O,oe])},onEnterCancelled(O){F(O,!1),et(m,[O])},onAppearCancelled(O){F(O,!0),et(w,[O])},onLeaveCancelled(O){R(O),et(M,[O])}})}function nc(e){if(e==null)return null;if(ee(e))return[Un(e.enter),Un(e.leave)];{const t=Un(e);return[t,t]}}function Un(e){return ri(e)}function Ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[kt]||(e[kt]=new Set)).add(t)}function tt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[kt];n&&(n.delete(t),n.size||(e[kt]=void 0))}function ar(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let sc=0;function ur(e,t,n,s){const r=e._endId=++sc,o=()=>{r===e._endId&&s()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=rc(e,t);if(!i)return s();const u=i+"end";let d=0;const h=()=>{e.removeEventListener(u,y),o()},y=C=>{C.target===e&&++d>=c&&h()};setTimeout(()=>{d(n[x]||"").split(", "),r=s(`${Ue}Delay`),o=s(`${Ue}Duration`),i=fr(r,o),l=s(`${Ot}Delay`),c=s(`${Ot}Duration`),u=fr(l,c);let d=null,h=0,y=0;t===Ue?i>0&&(d=Ue,h=i,y=o.length):t===Ot?u>0&&(d=Ot,h=u,y=c.length):(h=Math.max(i,u),d=h>0?i>u?Ue:Ot:null,y=d?d===Ue?o.length:c.length:0);const C=d===Ue&&/\b(transform|all)(,|$)/.test(s(`${Ue}Property`).toString());return{type:d,timeout:h,propCount:y,hasTransform:C}}function fr(e,t){for(;e.lengthdr(n)+dr(e[s])))}function dr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function oc(){return document.body.offsetHeight}function ic(e,t,n){const s=e[kt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const lc=Symbol("_vod");function cc(e,t,n){const s=e.style,r=se(n);if(n&&!r){if(t&&!se(t))for(const o in t)n[o]==null&&is(s,o,"");for(const o in n)is(s,o,n[o])}else{const o=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),lc in e&&(s.display=o)}}const hr=/\s*!important$/;function is(e,t,n){if(D(n))n.forEach(s=>is(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=ac(e,t);hr.test(n)?e.setProperty(at(s),n.replace(hr,""),"important"):e[s]=n}}const pr=["Webkit","Moz","ms"],Kn={};function ac(e,t){const n=Kn[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return Kn[t]=s;s=Cn(s);for(let r=0;rWn||(mc.then(()=>Wn=0),Wn=Date.now());function _c(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;xe(bc(s,n.value),t,5,[s])};return n.value=e,n.attached=yc(),n}function bc(e,t){if(D(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const _r=/^on[a-z]/,vc=(e,t,n,s,r=!1,o,i,l,c)=>{t==="class"?ic(e,s,r):t==="style"?cc(e,n,s):Ut(t)?as(t)||pc(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):wc(e,t,s,r))?fc(e,t,s,o,i,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),uc(e,t,s,r))};function wc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&_r.test(t)&&W(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||_r.test(t)&&se(n)?!1:t in e}const Cc=["ctrl","shift","alt","meta"],Ec={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Cc.some(n=>e[`${n}Key`]&&!t.includes(n))},Ma=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=at(n.key);if(t.some(r=>r===s||xc[r]===s))return e(n)},Tc=le({patchProp:vc},ec);let Vn,br=!1;function Ac(){return Vn=br?Vn:Ll(Tc),br=!0,Vn}const Na=(...e)=>{const t=Ac().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Sc(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Sc(e){return se(e)?document.querySelector(e):e}const Ha=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Rc="modulepreload",Oc=function(e){return"/"+e},vr={},$a=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=Oc(o),o in vr)return;vr[o]=!0;const i=o.endsWith(".css"),l=i?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const h=r[d];if(h.href===o&&(!i||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${l}`))return;const u=document.createElement("link");if(u.rel=i?"stylesheet":Rc,i||(u.as="script",u.crossOrigin=""),u.href=o,document.head.appendChild(u),i)return new Promise((d,h)=>{u.addEventListener("load",d),u.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},Pc=window.__VP_SITE_DATA__;function Fs(e){return $r()?(hi(e),!0):!1}function Je(e){return typeof e=="function"?e():Cs(e)}function ja(e,t){const n=(t==null?void 0:t.computedGetter)===!1?Cs:Je;return function(...s){return ce(()=>e.apply(this,s.map(r=>n(r))))}}const Lo=typeof window<"u"&&typeof document<"u",Fc=Object.prototype.toString,Ic=e=>Fc.call(e)==="[object Object]",No=()=>{},wr=Mc();function Mc(){var e;return Lo&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Lc(e,t){function n(...s){return new Promise((r,o)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(o)})}return n}const Ho=e=>e();function Nc(e=Ho){const t=fe(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...o)=>{t.value&&e(...o)};return{isActive:Tn(t),pause:n,resume:s,eventFilter:r}}function $o(...e){if(e.length!==1)return Ui(...e);const t=e[0];return typeof t=="function"?Tn(Di(()=>({get:t,set:No}))):fe(t)}function Hc(e,t,n={}){const{eventFilter:s=Ho,...r}=n;return Ye(e,Lc(s,t),r)}function $c(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=Nc(s);return{stop:Hc(e,t,{...r,eventFilter:o}),pause:i,resume:l,isActive:c}}function jc(e,t=!0){Ln()?St(e):t?e():An(e)}function jo(e){var t;const n=Je(e);return(t=n==null?void 0:n.$el)!=null?t:n}const xt=Lo?window:void 0;function _n(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=xt):[t,n,s,r]=e,!t)return No;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const o=[],i=()=>{o.forEach(d=>d()),o.length=0},l=(d,h,y,C)=>(d.addEventListener(h,y,C),()=>d.removeEventListener(h,y,C)),c=Ye(()=>[jo(t),Je(r)],([d,h])=>{if(i(),!d)return;const y=Ic(h)?{...h}:h;o.push(...n.flatMap(C=>s.map(x=>l(d,C,x,y))))},{immediate:!0,flush:"post"}),u=()=>{c(),i()};return Fs(u),u}function Dc(){const e=fe(!1);return Ln()&&St(()=>{e.value=!0}),e}function Bc(e){const t=Dc();return ce(()=>(t.value,!!e()))}function kc(e,t={}){const{window:n=xt}=t,s=Bc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const o=fe(!1),i=u=>{o.value=u.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",i):r.removeListener(i))},c=so(()=>{s.value&&(l(),r=n.matchMedia(Je(e)),"addEventListener"in r?r.addEventListener("change",i):r.addListener(i),o.value=r.matches)});return Fs(()=>{c(),l(),r=void 0}),o}const nn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},sn="__vueuse_ssr_handlers__",Uc=Kc();function Kc(){return sn in nn||(nn[sn]=nn[sn]||{}),nn[sn]}function Do(e,t){return Uc[e]||t}function Wc(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Vc={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Cr="vueuse-storage";function qc(e,t,n,s={}){var r;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:d,window:h=xt,eventFilter:y,onError:C=w=>{console.error(w)}}=s,x=(d?Jr:fe)(t);if(!n)try{n=Do("getDefaultStorage",()=>{var w;return(w=xt)==null?void 0:w.localStorage})()}catch(w){C(w)}if(!n)return x;const S=Je(t),L=Wc(S),k=(r=s.serializer)!=null?r:Vc[L],{pause:B,resume:m}=$c(x,()=>p(x.value),{flush:o,deep:i,eventFilter:y});return h&&l&&(_n(h,"storage",U),_n(h,Cr,V)),U(),x;function p(w){try{if(w==null)n.removeItem(e);else{const F=k.write(w),R=n.getItem(e);R!==F&&(n.setItem(e,F),h&&h.dispatchEvent(new CustomEvent(Cr,{detail:{key:e,oldValue:R,newValue:F,storageArea:n}})))}}catch(F){C(F)}}function M(w){const F=w?w.newValue:n.getItem(e);if(F==null)return c&&S!==null&&n.setItem(e,k.write(S)),S;if(!w&&u){const R=k.read(F);return typeof u=="function"?u(R,S):L==="object"&&!Array.isArray(R)?{...S,...R}:R}else return typeof F!="string"?F:k.read(F)}function V(w){U(w.detail)}function U(w){if(!(w&&w.storageArea!==n)){if(w&&w.key==null){x.value=S;return}if(!(w&&w.key!==e)){B();try{(w==null?void 0:w.newValue)!==k.write(x.value)&&(x.value=M(w))}catch(F){C(F)}finally{w?An(m):m()}}}}}function zc(e){return kc("(prefers-color-scheme: dark)",e)}function Yc(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=xt,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:d=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},y=zc({window:r}),C=ce(()=>y.value?"dark":"light"),x=c||(i==null?$o(s):qc(i,s,o,{window:r,listenToStorageChanges:l})),S=ce(()=>x.value==="auto"?C.value:x.value),L=Do("updateHTMLAttrs",(p,M,V)=>{const U=typeof p=="string"?r==null?void 0:r.document.querySelector(p):jo(p);if(!U)return;let w;if(d){w=r.document.createElement("style");const F="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";w.appendChild(document.createTextNode(F)),r.document.head.appendChild(w)}if(M==="class"){const F=V.split(/\s/g);Object.values(h).flatMap(R=>(R||"").split(/\s/g)).filter(Boolean).forEach(R=>{F.includes(R)?U.classList.add(R):U.classList.remove(R)})}else U.setAttribute(M,V);d&&(r.getComputedStyle(w).opacity,document.head.removeChild(w))});function k(p){var M;L(t,n,(M=h[p])!=null?M:p)}function B(p){e.onChanged?e.onChanged(p,k):k(p)}Ye(S,B,{flush:"post",immediate:!0}),jc(()=>B(S.value));const m=ce({get(){return u?x.value:S.value},set(p){x.value=p}});try{return Object.assign(m,{store:x,system:C,state:S})}catch{return m}}function Jc(e={}){const{valueDark:t="dark",valueLight:n=""}=e,s=Yc({...e,onChanged:(o,i)=>{var l;e.onChanged?(l=e.onChanged)==null||l.call(e,o==="dark",i,o):i(o)},modes:{dark:t,light:n}});return ce({get(){return s.value==="dark"},set(o){const i=o?"dark":"light";s.system.value===i?s.value="auto":s.value=i}})}function qn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Bo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}function Da(e,t=!1){const n=fe(t);let s=null,r;Ye($o(e),l=>{const c=qn(Je(l));if(c){const u=c;r=u.style.overflow,n.value&&(u.style.overflow="hidden")}},{immediate:!0});const o=()=>{const l=qn(Je(e));!l||n.value||(wr&&(s=_n(l,"touchmove",c=>{Xc(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=qn(Je(e));!l||!n.value||(wr&&(s==null||s()),l.style.overflow=r,n.value=!1)};return Fs(i),ce({get(){return n.value},set(l){l?o():i()}})}function Ba(e={}){const{window:t=xt}=e;if(!t)return{x:fe(0),y:fe(0)};const n=fe(t.scrollX),s=fe(t.scrollY);return _n(t,"scroll",()=>{n.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:n,y:s}}const ko=/^[a-z]+:/i,Qc="vitepress-theme-appearance",Uo=/#.*$/,Zc=/(index)?\.(md|html)$/,Ee=typeof document<"u",Ko={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Gc(e,t,n=!1){if(t===void 0)return!1;if(e=Er(`/${e}`),n)return new RegExp(t).test(e);if(Er(t)!==e)return!1;const s=t.match(Uo);return s?(Ee?location.hash:"")===s[0]:!0}function Er(e){return decodeURI(e).replace(Uo,"").replace(Zc,"")}function ea(e){return ko.test(e)}function ta(e,t){var s,r,o,i,l,c,u;const n=Object.keys(e.locales).find(d=>d!=="root"&&!ea(d)&&Gc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Vo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function Wo(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=na(e.title,s);return`${n}${r}`}function na(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function sa(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([o,i])=>o===n&&i[r[0]]===r[1])}function Vo(e,t){return[...e.filter(n=>!sa(t,n)),...t]}const ra=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,oa=/^[a-z]:/i;function xr(e){const t=oa.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ra,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ia=Symbol(),lt=Jr(Pc);function ka(e){const t=ce(()=>ta(lt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?fe(!0):n?Jc({storageKey:Qc,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):fe(!1);return{site:t,theme:ce(()=>t.value.themeConfig),page:ce(()=>e.data),frontmatter:ce(()=>e.data.frontmatter),params:ce(()=>e.data.params),lang:ce(()=>t.value.lang),dir:ce(()=>t.value.dir),localeIndex:ce(()=>t.value.localeIndex||"root"),title:ce(()=>Wo(t.value,e.data)),description:ce(()=>e.data.description||t.value.description),isDark:s}}function la(){const e=bt(ia);if(!e)throw new Error("vitepress data not properly injected in app");return e}function ca(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Tr(e){return ko.test(e)||!e.startsWith("/")?e:ca(lt.value.base,e)}function aa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ee){const n="/";t=xr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${xr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let cn=[];function Ua(e){cn.push(e),In(()=>{cn=cn.filter(t=>t!==e)})}const ua=Symbol(),qo="http://a.com",fa=()=>({path:"/",component:null,data:Ko});function Ka(e,t){const n=xn(fa()),s={route:n,go:r};async function r(l=Ee?location.href:"/"){var c,u;l=ls(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(Rr(l),await i(l),await((u=s.onAfterRouteChanged)==null?void 0:u.call(s,l)))}let o=null;async function i(l,c=0,u=!1){var y;if(await((y=s.onBeforePageLoad)==null?void 0:y.call(s,l))===!1)return;const d=new URL(l,qo),h=o=d.pathname;try{let C=await e(h);if(!C)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:x,__pageData:S}=C;if(!x)throw new Error(`Invalid route component: ${x}`);n.path=Ee?h:Tr(h),n.component=Mt(x),n.data=Mt(S),Ee&&An(()=>{let L=lt.value.base+S.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!lt.value.cleanUrls&&!L.endsWith("/")&&(L+=".html"),L!==d.pathname&&(d.pathname=L,l=L+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let k=null;try{k=document.getElementById(decodeURIComponent(d.hash).slice(1))}catch(B){console.warn(B)}if(k){Ar(k,d.hash);return}}window.scrollTo(0,c)})}}catch(C){if(!/fetch|Page not found/.test(C.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(C),!u)try{const x=await fetch(lt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await x.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Ee?h:Tr(h),n.component=t?Mt(t):null,n.data=Ko)}}return Ee&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const u=l.target.closest("a");if(u&&!u.closest(".vp-raw")&&(u instanceof SVGElement||!u.download)){const{target:d}=u,{href:h,origin:y,pathname:C,hash:x,search:S}=new URL(u.href instanceof SVGAnimatedString?u.href.animVal:u.href,u.baseURI),L=window.location,k=C.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!d&&y===L.origin&&!(k&&k[0]!==".html")&&(l.preventDefault(),C===L.pathname&&S===L.search?(x!==L.hash&&(history.pushState(null,"",x),window.dispatchEvent(new Event("hashchange"))),x?Ar(u,x,u.classList.contains("header-anchor")):(Rr(h),window.scrollTo(0,0))):r(h))}},{capture:!0}),window.addEventListener("popstate",l=>{i(ls(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function da(){const e=bt(ua);if(!e)throw new Error("useRouter() is called without provider.");return e}function zo(){return da().route}function Ar(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let u=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},r=lt.value.scrollOffset,o=0,i=24;if(typeof r=="object"&&"padding"in r&&(i=r.padding,r=r.selector),typeof r=="number")o=r;else if(typeof r=="string")o=Sr(r,i);else if(Array.isArray(r))for(const d of r){const h=Sr(d,i);if(h){o=h;break}}const l=parseInt(window.getComputedStyle(s).paddingTop,10),c=window.scrollY+s.getBoundingClientRect().top-o+l;requestAnimationFrame(u)}}function Sr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}function Rr(e){Ee&&e!==ls(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function ls(e){const t=new URL(e,qo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),lt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const Or=()=>cn.forEach(e=>e()),Wa=xs({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=zo(),{site:n}=la();return()=>os(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?os(t.component,{onVnodeMounted:Or,onVnodeUpdated:Or}):"404 Page Not Found"])}}),Va=xs({setup(e,{slots:t}){const n=fe(!1);return St(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function qa(){Ee&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const o=s.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(u=>u.classList.contains("active"));if(!i)return;const l=o.children[r];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function za(){if(Ee){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,o=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className);let l="";o.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),i&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),ha(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function ha(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function Ya(e,t){let n=[],s=!0;const r=o=>{if(s){s=!1;return}const i=o.map(Pr);n.forEach((l,c)=>{const u=i.findIndex(d=>d==null?void 0:d.isEqualNode(l??null));u!==-1?delete i[u]:(l==null||l.remove(),delete n[c])}),i.forEach(l=>l&&document.head.appendChild(l)),n=[...n,...i].filter(Boolean)};so(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],u=Wo(i,o);u!==document.title&&(document.title=u);const d=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==d&&h.setAttribute("content",d):Pr(["meta",{name:"description",content:d}]),r(Vo(i.head,ga(c)))})}function Pr([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&!t.async&&(s.async=!1),s}function pa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function ga(e){return e.filter(t=>!pa(t))}const zn=new Set,Yo=()=>document.createElement("link"),ma=e=>{const t=Yo();t.rel="prefetch",t.href=e,document.head.appendChild(t)},ya=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let rn;const _a=Ee&&(rn=Yo())&&rn.relList&&rn.relList.supports&&rn.relList.supports("prefetch")?ma:ya;function Ja(){if(!Ee||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!zn.has(c)){zn.add(c);const u=aa(c);u&&_a(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):zn.add(l))})})};St(s);const r=zo();Ye(()=>r.path,s),In(()=>{n&&n.disconnect()})}export{La as $,Ca as A,hl as B,xa as C,Aa as D,Jr as E,me as F,Ua as G,ne as H,Ta as I,ko as J,zo as K,kl as L,bt as M,ds as N,An as O,Ba as P,Fa as Q,Tn as R,ja as S,Io as T,Ui as U,Ea as V,$a as W,Da as X,Sl as Y,Ra as Z,Ha as _,Ro as a,Ma as a0,Oa as a1,da as a2,Ya as a3,ua as a4,ka as a5,ia as a6,Wa as a7,Va as a8,lt as a9,Na as aa,Ka as ab,aa as ac,Ja as ad,za as ae,qa as af,os as ag,To as b,Pa as c,xs as d,Ia as e,Tr as f,ce as g,fe as h,ea as i,St as j,So as k,Cs as l,wa as m,hs as n,Eo as o,va as p,Gc as q,Sa as r,Ee as s,ba as t,la as u,kc as v,Zi as w,Ye as x,so as y,In as z}; diff --git a/assets/chunks/katex.cb08556c.js b/assets/chunks/katex.cb08556c.js new file mode 100644 index 000000000..5768b2c3a --- /dev/null +++ b/assets/chunks/katex.cb08556c.js @@ -0,0 +1 @@ +const s="/assets/katex.7c72a6fb.png";export{s as _}; diff --git a/assets/chunks/readme-3.368c86c7.js b/assets/chunks/readme-3.368c86c7.js new file mode 100644 index 000000000..e9ceacd3b --- /dev/null +++ b/assets/chunks/readme-3.368c86c7.js @@ -0,0 +1 @@ +const s="/assets/logo.5707582f.png",a="/assets/readme-1.28a161f2.png",t="/assets/readme-2.36e8fa3b.png",e="/assets/readme-3.45bb1d93.jpg";export{s as _,a,t as b,e as c}; diff --git a/assets/chunks/theme.7669522f.js b/assets/chunks/theme.7669522f.js new file mode 100644 index 000000000..4960e70ca --- /dev/null +++ b/assets/chunks/theme.7669522f.js @@ -0,0 +1 @@ +import{d as g,o as a,c as i,r as u,n as T,a as x,t as S,_ as m,b as k,w as v,e as f,T as ue,u as He,i as ze,f as de,g as $,h as I,j as G,k as c,l,p as H,m as z,q as O,s as R,v as le,x as U,y as te,z as se,A as Pe,B as Ee,C as j,F as N,D as A,E as _e,G as Y,H as h,I as F,J as Ve,K as ne,L as Z,M as oe,N as De,O as Fe,P as we,Q as Oe,R as Ge,S as Ue,U as je,V as qe,W as Ke,X as Le,Y as Se,Z as Re,$ as We,a0 as Ye,a1 as Je}from"./framework.7d2df8c6.js";const Xe=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),i("span",{class:T(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[x(S(e.text),1)],!0)],2))}});const Ze=m(Xe,[["__scopeId","data-v-ea5b2908"]]),Qe={key:0,class:"VPBackdrop"},et=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),k(ue,{name:"fade"},{default:v(()=>[e.show?(a(),i("div",Qe)):f("",!0)]),_:1}))}});const tt=m(et,[["__scopeId","data-v-54a304ca"]]),y=He;function st(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function ie(s){return/^\//.test(s)?s:`/${s}`}function J(s){const{pathname:e,search:t,hash:n,protocol:o}=new URL(s,"http://a.com");if(ze(s)||s.startsWith("#")||!o.startsWith("http")||/\.(?!html|md)\w+($|\?)/i.test(s))return s;const{site:r}=y(),d=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${n}`);return de(d)}function X({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:r}=y(),d=$(()=>{var _,b;return{label:(_=t.value.locales[n.value])==null?void 0:_.label,link:((b=t.value.locales[n.value])==null?void 0:b.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:$(()=>Object.entries(t.value.locales).flatMap(([_,b])=>s&&d.value.label===b.label?[]:{text:b.label,link:nt(b.link||(_==="root"?"/":`/${_}/`),r.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function nt(s,e,t,n){return e?s.replace(/\/$/,"")+ie(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const ot=s=>(H("data-v-b9c0c15a"),s=s(),z(),s),at={class:"NotFound"},rt={class:"code"},lt={class:"title"},it=ot(()=>c("div",{class:"divider"},null,-1)),ct={class:"quote"},ut={class:"action"},dt=["href","aria-label"],_t=g({__name:"NotFound",setup(s){const{site:e,theme:t}=y(),{localeLinks:n}=X({removeCurrent:!1}),o=I("/");return G(()=>{var d;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((d=n.value.find(({link:p})=>p.startsWith(r)))==null?void 0:d.link)||n.value[0].link)}),(r,d)=>{var p,_,b,P,M;return a(),i("div",at,[c("p",rt,S(((p=l(t).notFound)==null?void 0:p.code)??"404"),1),c("h1",lt,S(((_=l(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),it,c("blockquote",ct,S(((b=l(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",ut,[c("a",{class:"link",href:l(de)(o.value),"aria-label":((P=l(t).notFound)==null?void 0:P.linkLabel)??"go to home"},S(((M=l(t).notFound)==null?void 0:M.linkText)??"Take me home"),9,dt)])])}}});const vt=m(_t,[["__scopeId","data-v-b9c0c15a"]]);function Me(s,e){if(Array.isArray(s))return Q(s);if(s==null)return[];e=ie(e);const t=Object.keys(s).sort((o,r)=>r.split("/").length-o.split("/").length).find(o=>e.startsWith(ie(o))),n=t?s[t]:[];return Array.isArray(n)?Q(n):Q(n.items,n.base)}function pt(s){const e=[];let t=0;for(const n in s){const o=s[n];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ht(s){const e=[];function t(n){for(const o of n)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(s),e}function ce(s,e){return Array.isArray(e)?e.some(t=>ce(s,t)):O(s,e.link)?!0:e.items?ce(s,e.items):!1}function Q(s,e){return[...s].map(t=>{const n={...t},o=n.base||e;return o&&n.link&&(n.link=o+n.link),n.items&&(n.items=Q(n.items,o)),n})}function E(){const{frontmatter:s,page:e,theme:t}=y(),n=le("(min-width: 960px)"),o=I(!1),r=$(()=>{const B=t.value.sidebar,L=e.value.relativePath;return B?Me(B,L):[]}),d=I(r.value);U(r,(B,L)=>{JSON.stringify(B)!==JSON.stringify(L)&&(d.value=r.value)});const p=$(()=>s.value.sidebar!==!1&&d.value.length>0&&s.value.layout!=="home"),_=$(()=>b?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),b=$(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),P=$(()=>p.value&&n.value),M=$(()=>p.value?pt(d.value):[]);function C(){o.value=!0}function w(){o.value=!1}function V(){o.value?w():C()}return{isOpen:o,sidebar:d,sidebarGroups:M,hasSidebar:p,hasAside:b,leftAside:_,isSidebarEnabled:P,open:C,close:w,toggle:V}}function ft(s,e){let t;te(()=>{t=s.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",n)}),se(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}const Ce=I(R?location.hash:"");R&&window.addEventListener("hashchange",()=>{Ce.value=location.hash});function mt(s){const{page:e}=y(),t=I(!1),n=$(()=>s.value.collapsed!=null),o=$(()=>!!s.value.link),r=I(!1),d=()=>{r.value=O(e.value.relativePath,s.value.link)};U([e,s,Ce],d),G(d);const p=$(()=>r.value?!0:s.value.items?ce(e.value.relativePath,s.value.items):!1),_=$(()=>!!(s.value.items&&s.value.items.length));te(()=>{t.value=!!(n.value&&s.value.collapsed)}),Pe(()=>{(r.value||p.value)&&(t.value=!1)});function b(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:p,hasChildren:_,toggle:b}}function gt(){const{hasSidebar:s}=E(),e=le("(min-width: 960px)"),t=le("(min-width: 1280px)");return{isAsideEnabled:$(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const bt=71;function ve(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function pe(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const n=Number(t.tagName[1]);return{title:kt(t),link:"#"+t.id,level:n}});return $t(e,s)}function kt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function $t(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[n,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;s=s.filter(d=>d.level>=n&&d.level<=o);const r=[];e:for(let d=0;d=0;_--){const b=s[_];if(b.level{requestAnimationFrame(r),window.addEventListener("scroll",n)}),Ee(()=>{d(location.hash)}),se(()=>{window.removeEventListener("scroll",n)});function r(){if(!t.value)return;const p=[].slice.call(s.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(w=>p.some(V=>V.hash===w.hash&&w.offsetParent!==null)),b=window.scrollY,P=window.innerHeight,M=document.body.offsetHeight,C=Math.abs(b+P-M)<1;if(_.length&&C){d(_[_.length-1].hash);return}for(let w=0;w<_.length;w++){const V=_[w],B=_[w+1],[L,q]=Pt(w,V,B);if(L){d(q);return}}}function d(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function $e(s){return s.parentElement.offsetTop-bt}function Pt(s,e,t){const n=window.scrollY;return s===0&&n===0?[!0,null]:n<$e(e)?[!1,null]:!t||n<$e(t)?[!0,e.hash]:[!1,null]}const Vt=["href","title"],wt=g({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(s){function e({target:t}){const n=t.href.split("#")[1],o=document.getElementById(decodeURIComponent(n));o==null||o.focus({preventScroll:!0})}return(t,n)=>{const o=j("VPDocOutlineItem",!0);return a(),i("ul",{class:T(t.root?"root":"nested")},[(a(!0),i(N,null,A(t.headers,({children:r,link:d,title:p})=>(a(),i("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:p},S(p),9,Vt),r!=null&&r.length?(a(),k(o,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}});const he=m(wt,[["__scopeId","data-v-463da30f"]]),Lt=s=>(H("data-v-3a6c4994"),s=s(),z(),s),St={class:"content"},Mt={class:"outline-title",role:"heading","aria-level":"2"},Ct={"aria-labelledby":"doc-outline-aria-label"},It=Lt(()=>c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Nt=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=y(),n=_e([]);Y(()=>{n.value=pe(e.value.outline??t.value.outline)});const o=I(),r=I();return yt(o,r),(d,p)=>(a(),i("div",{class:T(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",St,[c("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),c("div",Mt,S(l(ve)(l(t))),1),c("nav",Ct,[It,h(he,{headers:n.value,root:!0},null,8,["headers"])])])],2))}});const Tt=m(Nt,[["__scopeId","data-v-3a6c4994"]]),Bt={class:"VPDocAsideCarbonAds"},At=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),i("div",Bt,[h(l(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),xt=s=>(H("data-v-cb998dce"),s=s(),z(),s),Ht={class:"VPDocAside"},zt=xt(()=>c("div",{class:"spacer"},null,-1)),Et=g({__name:"VPDocAside",setup(s){const{theme:e}=y();return(t,n)=>(a(),i("div",Ht,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(Tt),u(t.$slots,"aside-outline-after",{},void 0,!0),zt,u(t.$slots,"aside-ads-before",{},void 0,!0),l(e).carbonAds?(a(),k(At,{key:0,"carbon-ads":l(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Dt=m(Et,[["__scopeId","data-v-cb998dce"]]);function Ft(){const{theme:s,page:e}=y();return $(()=>{const{text:t="Edit this page",pattern:n=""}=s.value.editLink||{};let o;return typeof n=="function"?o=n(e.value):o=n.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function Ot(){const{page:s,theme:e,frontmatter:t}=y();return $(()=>{var _,b,P,M,C,w,V,B;const n=Me(e.value.sidebar,s.value.relativePath),o=ht(n),r=o.findIndex(L=>O(s.value.relativePath,L.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,p=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((P=o[r-1])==null?void 0:P.docFooterText)??((M=o[r-1])==null?void 0:M.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((C=o[r-1])==null?void 0:C.link)},next:p?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((w=o[r+1])==null?void 0:w.docFooterText)??((V=o[r+1])==null?void 0:V.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((B=o[r+1])==null?void 0:B.link)}}})}const Gt={},Ut={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},jt=c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),qt=c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Kt=[jt,qt];function Rt(s,e){return a(),i("svg",Ut,Kt)}const Wt=m(Gt,[["render",Rt]]),D=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=$(()=>e.tag??(e.href?"a":"span")),n=$(()=>e.href&&Ve.test(e.href));return(o,r)=>(a(),k(F(t.value),{class:T(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?l(J)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:v(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Yt={class:"VPLastUpdated"},Jt=["datetime"],Xt=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=y(),r=$(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),d=$(()=>r.value.toISOString()),p=I("");return G(()=>{te(()=>{var _,b,P;p.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((P=e.value.lastUpdated)==null?void 0:P.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(_,b)=>{var P;return a(),i("p",Yt,[x(S(((P=l(e).lastUpdated)==null?void 0:P.text)||l(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},S(p.value),9,Jt)])}}});const Zt=m(Xt,[["__scopeId","data-v-19a7ae4e"]]),Qt={key:0,class:"VPDocFooter"},es={key:0,class:"edit-info"},ts={key:0,class:"edit-link"},ss={key:1,class:"last-updated"},ns={key:1,class:"prev-next"},os={class:"pager"},as=["href"],rs=["innerHTML"],ls=["innerHTML"],is={class:"pager"},cs=["href"],us=["innerHTML"],ds=["innerHTML"],_s=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=y(),o=Ft(),r=Ot(),d=$(()=>e.value.editLink&&n.value.editLink!==!1),p=$(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),_=$(()=>d.value||p.value||r.value.prev||r.value.next);return(b,P)=>{var M,C,w,V,B,L;return _.value?(a(),i("footer",Qt,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||p.value?(a(),i("div",es,[d.value?(a(),i("div",ts,[h(D,{class:"edit-link-button",href:l(o).url,"no-icon":!0},{default:v(()=>[h(Wt,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+S(l(o).text),1)]),_:1},8,["href"])])):f("",!0),p.value?(a(),i("div",ss,[h(Zt)])):f("",!0)])):f("",!0),(M=l(r).prev)!=null&&M.link||(C=l(r).next)!=null&&C.link?(a(),i("nav",ns,[c("div",os,[(w=l(r).prev)!=null&&w.link?(a(),i("a",{key:0,class:"pager-link prev",href:l(J)(l(r).prev.link)},[c("span",{class:"desc",innerHTML:((V=l(e).docFooter)==null?void 0:V.prev)||"Previous page"},null,8,rs),c("span",{class:"title",innerHTML:l(r).prev.text},null,8,ls)],8,as)):f("",!0)]),c("div",is,[(B=l(r).next)!=null&&B.link?(a(),i("a",{key:0,class:"pager-link next",href:l(J)(l(r).next.link)},[c("span",{class:"desc",innerHTML:((L=l(e).docFooter)==null?void 0:L.next)||"Next page"},null,8,us),c("span",{class:"title",innerHTML:l(r).next.text},null,8,ds)],8,cs)):f("",!0)])])):f("",!0)])):f("",!0)}}});const vs=m(_s,[["__scopeId","data-v-a2d931e4"]]),ps={},hs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},fs=c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),ms=[fs];function gs(s,e){return a(),i("svg",hs,ms)}const fe=m(ps,[["render",gs]]),bs={key:0,class:"VPDocOutlineDropdown"},ks={key:0,class:"items"},$s=g({__name:"VPDocOutlineDropdown",setup(s){const{frontmatter:e,theme:t}=y(),n=I(!1);Y(()=>{n.value=!1});const o=_e([]);return Y(()=>{o.value=pe(e.value.outline??t.value.outline)}),(r,d)=>o.value.length>0?(a(),i("div",bs,[c("button",{onClick:d[0]||(d[0]=p=>n.value=!n.value),class:T({open:n.value})},[x(S(l(ve)(l(t)))+" ",1),h(fe,{class:"icon"})],2),n.value?(a(),i("div",ks,[h(he,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const ys=m($s,[["__scopeId","data-v-95bb0785"]]),Ps=s=>(H("data-v-a3c25e27"),s=s(),z(),s),Vs={class:"container"},ws=Ps(()=>c("div",{class:"aside-curtain"},null,-1)),Ls={class:"aside-container"},Ss={class:"aside-content"},Ms={class:"content"},Cs={class:"content-container"},Is={class:"main"},Ns=g({__name:"VPDoc",setup(s){const{theme:e}=y(),t=ne(),{hasSidebar:n,hasAside:o,leftAside:r}=E(),d=$(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,_)=>{const b=j("Content");return a(),i("div",{class:T(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[u(p.$slots,"doc-top",{},void 0,!0),c("div",Vs,[l(o)?(a(),i("div",{key:0,class:T(["aside",{"left-aside":l(r)}])},[ws,c("div",Ls,[c("div",Ss,[h(Dt,null,{"aside-top":v(()=>[u(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",Ms,[c("div",Cs,[u(p.$slots,"doc-before",{},void 0,!0),h(ys),c("main",Is,[h(b,{class:T(["vp-doc",[d.value,l(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(vs,null,{"doc-footer-before":v(()=>[u(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(p.$slots,"doc-after",{},void 0,!0)])])]),u(p.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Ts=m(Ns,[["__scopeId","data-v-a3c25e27"]]),Bs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(s){const e=s,t=$(()=>e.href&&Ve.test(e.href)),n=$(()=>e.tag||e.href?"a":"button");return(o,r)=>(a(),k(F(n.value),{class:T(["VPButton",[o.size,o.theme]]),href:o.href?l(J)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:v(()=>[x(S(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const As=m(Bs,[["__scopeId","data-v-1e76fe75"]]),xs=["src","alt"],Hs=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=j("VPImage",!0);return e.image?(a(),i(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Z({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,xs)):(a(),i(N,{key:1},[h(n,Z({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(n,Z({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const ee=m(Hs,[["__scopeId","data-v-ab19afbb"]]),zs=s=>(H("data-v-5a3e9999"),s=s(),z(),s),Es={class:"container"},Ds={class:"main"},Fs={key:0,class:"name"},Os=["innerHTML"],Gs=["innerHTML"],Us=["innerHTML"],js={key:0,class:"actions"},qs={key:0,class:"image"},Ks={class:"image-container"},Rs=zs(()=>c("div",{class:"image-bg"},null,-1)),Ws=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=oe("hero-image-slot-exists");return(t,n)=>(a(),i("div",{class:T(["VPHero",{"has-image":t.image||l(e)}])},[c("div",Es,[c("div",Ds,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),i("h1",Fs,[c("span",{innerHTML:t.name,class:"clip"},null,8,Os)])):f("",!0),t.text?(a(),i("p",{key:1,innerHTML:t.text,class:"text"},null,8,Gs)):f("",!0),t.tagline?(a(),i("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Us)):f("",!0)],!0),t.actions?(a(),i("div",js,[(a(!0),i(N,null,A(t.actions,o=>(a(),i("div",{key:o.link,class:"action"},[h(As,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||l(e)?(a(),i("div",qs,[c("div",Ks,[Rs,u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(ee,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Ys=m(Ws,[["__scopeId","data-v-5a3e9999"]]),Js=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=y();return(t,n)=>l(e).hero?(a(),k(Ys,{key:0,class:"VPHomeHero",name:l(e).hero.name,text:l(e).hero.text,tagline:l(e).hero.tagline,image:l(e).hero.image,actions:l(e).hero.actions},{"home-hero-info":v(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":v(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Xs={},Zs={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Qs=c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),en=[Qs];function tn(s,e){return a(),i("svg",Zs,en)}const sn=m(Xs,[["render",tn]]),nn={class:"box"},on={key:0,class:"icon"},an=["innerHTML"],rn=["innerHTML"],ln=["innerHTML"],cn={key:4,class:"link-text"},un={class:"link-text-value"},dn=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),k(D,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:v(()=>[c("article",nn,[typeof e.icon=="object"&&e.icon.wrap?(a(),i("div",on,[h(ee,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(ee,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:2,class:"icon",innerHTML:e.icon},null,8,an)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,rn),e.details?(a(),i("p",{key:3,class:"details",innerHTML:e.details},null,8,ln)):f("",!0),e.linkText?(a(),i("div",cn,[c("p",un,[x(S(e.linkText)+" ",1),h(sn,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const _n=m(dn,[["__scopeId","data-v-ee984185"]]),vn={key:0,class:"VPFeatures"},pn={class:"container"},hn={class:"items"},fn=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=$(()=>{const n=e.features.length;if(n){if(n===2)return"grid-2";if(n===3)return"grid-3";if(n%3===0)return"grid-6";if(n>3)return"grid-4"}else return});return(n,o)=>n.features?(a(),i("div",vn,[c("div",pn,[c("div",hn,[(a(!0),i(N,null,A(n.features,r=>(a(),i("div",{key:r.title,class:T(["item",[t.value]])},[h(_n,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const mn=m(fn,[["__scopeId","data-v-b1eea84a"]]),gn=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=y();return(t,n)=>l(e).features?(a(),k(mn,{key:0,class:"VPHomeFeatures",features:l(e).features},null,8,["features"])):f("",!0)}}),bn={class:"VPHome"},kn=g({__name:"VPHome",setup(s){return(e,t)=>{const n=j("Content");return a(),i("div",bn,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Js,null,{"home-hero-info":v(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(gn),u(e.$slots,"home-features-after",{},void 0,!0),h(n)])}}});const $n=m(kn,[["__scopeId","data-v-20eabd3a"]]),yn={},Pn={class:"VPPage"};function Vn(s,e){const t=j("Content");return a(),i("div",Pn,[u(s.$slots,"page-top"),h(t),u(s.$slots,"page-bottom")])}const wn=m(yn,[["render",Vn]]),Ln=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=y(),{hasSidebar:n}=E();return(o,r)=>(a(),i("div",{class:T(["VPContent",{"has-sidebar":l(n),"is-home":l(t).layout==="home"}]),id:"VPContent"},[l(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(vt)],!0):l(t).layout==="page"?(a(),k(wn,{key:1},{"page-top":v(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(t).layout==="home"?(a(),k($n,{key:2},{"home-hero-before":v(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):l(t).layout&&l(t).layout!=="doc"?(a(),k(F(l(t).layout),{key:3})):(a(),k(Ts,{key:4},{"doc-top":v(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":v(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":v(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":v(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":v(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Sn=m(Ln,[["__scopeId","data-v-3cf691b6"]]),Mn={class:"container"},Cn=["innerHTML"],In=["innerHTML"],Nn=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=y(),{hasSidebar:n}=E();return(o,r)=>l(e).footer&&l(t).footer!==!1?(a(),i("footer",{key:0,class:T(["VPFooter",{"has-sidebar":l(n)}])},[c("div",Mn,[l(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:l(e).footer.message},null,8,Cn)):f("",!0),l(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:l(e).footer.copyright},null,8,In)):f("",!0)])],2)):f("",!0)}});const Tn=m(Nn,[["__scopeId","data-v-e4279f1c"]]),Bn={class:"header"},An={class:"outline"},xn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=y(),n=I(!1),o=I(0),r=I();Y(()=>{n.value=!1});function d(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function p(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),Fe(()=>{n.value=!1}))}function _(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:De({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),i("button",{key:0,onClick:d,class:T({open:n.value})},[x(S(l(ve)(l(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:_},S(l(t).returnToTopLabel||"Return to top"),1)),h(ue,{name:"flyout"},{default:v(()=>[n.value?(a(),i("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:p},[c("div",Bn,[c("a",{class:"top-link",href:"#",onClick:_},S(l(t).returnToTopLabel||"Return to top"),1)]),c("div",An,[h(he,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const Hn=m(xn,[["__scopeId","data-v-24251f6f"]]),zn={},En={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Dn=c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Fn=c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),On=c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Gn=c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Un=[Dn,Fn,On,Gn];function jn(s,e){return a(),i("svg",En,Un)}const qn=m(zn,[["render",jn]]),Kn=["aria-expanded"],Rn={class:"menu-text"},Wn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=y(),{hasSidebar:n}=E(),{y:o}=we(),r=_e([]),d=I(0);G(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Y(()=>{r.value=pe(t.value.outline??e.value.outline)});const p=$(()=>r.value.length===0&&!n.value),_=$(()=>({VPLocalNav:!0,fixed:p.value,"reached-top":o.value>=d.value}));return(b,P)=>l(t).layout!=="home"&&(!p.value||l(o)>=d.value)?(a(),i("div",{key:0,class:T(_.value)},[l(n)?(a(),i("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:P[0]||(P[0]=M=>b.$emit("open-menu"))},[h(qn,{class:"menu-icon"}),c("span",Rn,S(l(e).sidebarMenuLabel||"Menu"),1)],8,Kn)):f("",!0),h(Hn,{headers:r.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Yn=m(Wn,[["__scopeId","data-v-9e669cc1"]]);function Jn(){const s=I(!1);function e(){s.value=!0,window.addEventListener("resize",o)}function t(){s.value=!1,window.removeEventListener("resize",o)}function n(){s.value?t():e()}function o(){window.outerWidth>=768&&t()}const r=ne();return U(()=>r.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Xn={},Zn={class:"VPSwitch",type:"button",role:"switch"},Qn={class:"check"},eo={key:0,class:"icon"};function to(s,e){return a(),i("button",Zn,[c("span",Qn,[s.$slots.default?(a(),i("span",eo,[u(s.$slots,"default",{},void 0,!0)])):f("",!0)])])}const so=m(Xn,[["render",to],["__scopeId","data-v-1c29e291"]]),no={},oo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ao=c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),ro=[ao];function lo(s,e){return a(),i("svg",oo,ro)}const io=m(no,[["render",lo]]),co={},uo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_o=Oe('',9),vo=[_o];function po(s,e){return a(),i("svg",uo,vo)}const ho=m(co,[["render",po]]),fo=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e}=y(),t=oe("toggle-appearance",()=>{e.value=!e.value});return(n,o)=>(a(),k(so,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":l(e),onClick:l(t)},{default:v(()=>[h(ho,{class:"sun"}),h(io,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const me=m(fo,[["__scopeId","data-v-3329432d"]]),mo={key:0,class:"VPNavBarAppearance"},go=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=y();return(t,n)=>l(e).appearance&&l(e).appearance!=="force-dark"?(a(),i("div",mo,[h(me)])):f("",!0)}});const bo=m(go,[["__scopeId","data-v-283b26e9"]]),ge=I();let Ie=!1,re=0;function ko(s){const e=I(!1);if(R){!Ie&&$o(),re++;const t=U(ge,n=>{var o,r,d;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(r=s.onFocus)==null||r.call(s)):(e.value=!1,(d=s.onBlur)==null||d.call(s))});se(()=>{t(),re--,re||yo()})}return Ge(e)}function $o(){document.addEventListener("focusin",Ne),Ie=!0,ge.value=document.activeElement}function yo(){document.removeEventListener("focusin",Ne)}function Ne(){ge.value=document.activeElement}const Po={},Vo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Lo=[wo];function So(s,e){return a(),i("svg",Vo,Lo)}const Te=m(Po,[["render",So]]),Mo={},Co={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=c("circle",{cx:"12",cy:"12",r:"2"},null,-1),No=c("circle",{cx:"19",cy:"12",r:"2"},null,-1),To=c("circle",{cx:"5",cy:"12",r:"2"},null,-1),Bo=[Io,No,To];function Ao(s,e){return a(),i("svg",Co,Bo)}const xo=m(Mo,[["render",Ao]]),Ho={class:"VPMenuLink"},zo=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=y();return(t,n)=>(a(),i("div",Ho,[h(D,{class:T({active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:v(()=>[x(S(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const ae=m(zo,[["__scopeId","data-v-f51f088d"]]),Eo={class:"VPMenuGroup"},Do={key:0,class:"title"},Fo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",Eo,[e.text?(a(),i("p",Do,S(e.text),1)):f("",!0),(a(!0),i(N,null,A(e.items,n=>(a(),i(N,null,["link"in n?(a(),k(ae,{key:0,item:n},null,8,["item"])):f("",!0)],64))),256))]))}});const Oo=m(Fo,[["__scopeId","data-v-a6b0397c"]]),Go={class:"VPMenu"},Uo={key:0,class:"items"},jo=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),i("div",Go,[e.items?(a(),i("div",Uo,[(a(!0),i(N,null,A(e.items,n=>(a(),i(N,{key:n.text},["link"in n?(a(),k(ae,{key:0,item:n},null,8,["item"])):(a(),k(Oo,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const qo=m(jo,[["__scopeId","data-v-e42ed9b3"]]),Ko=["aria-expanded","aria-label"],Ro={key:0,class:"text"},Wo=["innerHTML"],Yo={class:"menu"},Jo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=I(!1),t=I();ko({el:t,onBlur:n});function n(){e.value=!1}return(o,r)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=d=>e.value=!0),onMouseleave:r[2]||(r[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:r[0]||(r[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),i("span",Ro,[o.icon?(a(),k(F(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),i("span",{key:1,innerHTML:o.button},null,8,Wo)):f("",!0),h(Te,{class:"text-icon"})])):(a(),k(xo,{key:1,class:"icon"}))],8,Ko),c("div",Yo,[h(qo,{items:o.items},{default:v(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const be=m(Jo,[["__scopeId","data-v-aa8de344"]]),Xo={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Zo=["href","aria-label","innerHTML"],Qo=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=$(()=>typeof e.icon=="object"?e.icon.svg:Xo[e.icon]);return(n,o)=>(a(),i("a",{class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Zo))}});const ea=m(Qo,[["__scopeId","data-v-16cf740a"]]),ta={class:"VPSocialLinks"},sa=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),i("div",ta,[(a(!0),i(N,null,A(e.links,({link:n,icon:o,ariaLabel:r})=>(a(),k(ea,{key:n,icon:o,link:n,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}});const ke=m(sa,[["__scopeId","data-v-e71e869c"]]),na={key:0,class:"group translations"},oa={class:"trans-title"},aa={key:1,class:"group"},ra={class:"item appearance"},la={class:"label"},ia={class:"appearance-action"},ca={key:2,class:"group"},ua={class:"item social-links"},da=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=y(),{localeLinks:n,currentLang:o}=X({correspondingLink:!0}),r=$(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,p)=>r.value?(a(),k(be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:v(()=>[l(n).length&&l(o).label?(a(),i("div",na,[c("p",oa,S(l(o).label),1),(a(!0),i(N,null,A(l(n),_=>(a(),k(ae,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),l(e).appearance?(a(),i("div",aa,[c("div",ra,[c("p",la,S(l(t).darkModeSwitchLabel||"Appearance"),1),c("div",ia,[h(me)])])])):f("",!0),l(t).socialLinks?(a(),i("div",ca,[c("div",ua,[h(ke,{class:"social-links-list",links:l(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const _a=m(da,[["__scopeId","data-v-c8c2ae4b"]]),va=s=>(H("data-v-6bee1efd"),s=s(),z(),s),pa=["aria-expanded"],ha=va(()=>c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)),fa=[ha],ma=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),i("button",{type:"button",class:T(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},fa,10,pa))}});const ga=m(ma,[["__scopeId","data-v-6bee1efd"]]),ba=["innerHTML"],ka=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=y();return(t,n)=>(a(),k(D,{class:T({VPNavBarMenuLink:!0,active:l(O)(l(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:v(()=>[c("span",{innerHTML:t.item.text},null,8,ba)]),_:1},8,["class","href","target","rel"]))}});const $a=m(ka,[["__scopeId","data-v-cb318fec"]]),ya=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=y(),n=r=>"link"in r?O(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(n),o=$(()=>n(e.item));return(r,d)=>(a(),k(be,{class:T({VPNavBarMenuGroup:!0,active:l(O)(l(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||o.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),Pa=s=>(H("data-v-f732b5d0"),s=s(),z(),s),Va={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wa=Pa(()=>c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),La=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=y();return(t,n)=>l(e).nav?(a(),i("nav",Va,[wa,(a(!0),i(N,null,A(l(e).nav,o=>(a(),i(N,{key:o.text},["link"in o?(a(),k($a,{key:0,item:o},null,8,["item"])):(a(),k(ya,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Sa=m(La,[["__scopeId","data-v-f732b5d0"]]);function Ma(s,e){const{localeIndex:t}=y();function n(o){var w,V;const r=o.split("."),d=s&&typeof s=="object",p=d&&((V=(w=s.locales)==null?void 0:w[t.value])==null?void 0:V.translations)||null,_=d&&s.translations||null;let b=p,P=_,M=e;const C=r.pop();for(const B of r){let L=null;const q=M==null?void 0:M[B];q&&(L=M=q);const W=P==null?void 0:P[B];W&&(L=P=W);const K=b==null?void 0:b[B];K&&(L=b=K),q||(M=L),W||(P=L),K||(b=L)}return(b==null?void 0:b[C])??(P==null?void 0:P[C])??(M==null?void 0:M[C])??""}return n}const Ca=["aria-label"],Ia={class:"DocSearch-Button-Container"},Na=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Ta={class:"DocSearch-Button-Placeholder"},Ba=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1),ye=g({__name:"VPNavBarSearchButton",setup(s){const{theme:e}=y(),t={button:{buttonText:"Search",buttonAriaLabel:"Search"}},n=Ue(Ma)(je(()=>{var o;return(o=e.value.search)==null?void 0:o.options}),t);return(o,r)=>(a(),i("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":l(n)("button.buttonAriaLabel")},[c("span",Ia,[Na,c("span",Ta,S(l(n)("button.buttonText")),1)]),Ba],8,Ca))}});const Aa={class:"VPNavBarSearch"},xa={id:"local-search"},Ha={key:1,id:"docsearch"},za=g({__name:"VPNavBarSearch",setup(s){const e=()=>null,t=qe(()=>Ke(()=>import("./VPAlgoliaSearchBox.ac78e499.js"),["assets/chunks/VPAlgoliaSearchBox.ac78e499.js","assets/chunks/framework.7d2df8c6.js"])),{theme:n}=y(),o=I(!1),r=I(!1),d=()=>{const C="VPAlgoliaPreconnect";(window.requestIdleCallback||setTimeout)(()=>{var B;const V=document.createElement("link");V.id=C,V.rel="preconnect",V.href=`https://${(((B=n.value.search)==null?void 0:B.options)??n.value.algolia).appId}-dsn.algolia.net`,V.crossOrigin="",document.head.appendChild(V)})};G(()=>{d();const C=V=>{(V.key.toLowerCase()==="k"&&(V.metaKey||V.ctrlKey)||!b(V)&&V.key==="/")&&(V.preventDefault(),p(),w())},w=()=>{window.removeEventListener("keydown",C)};window.addEventListener("keydown",C),se(w)});function p(){o.value||(o.value=!0,setTimeout(_,16))}function _(){const C=new Event("keydown");C.key="k",C.metaKey=!0,window.dispatchEvent(C),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||_()},16)}function b(C){const w=C.target,V=w.tagName;return w.isContentEditable||V==="INPUT"||V==="SELECT"||V==="TEXTAREA"}const P=I(!1),M="algolia";return(C,w)=>{var V;return a(),i("div",Aa,[l(M)==="local"?(a(),i(N,{key:0},[P.value?(a(),k(l(e),{key:0,onClose:w[0]||(w[0]=B=>P.value=!1)})):f("",!0),c("div",xa,[h(ye,{onClick:w[1]||(w[1]=B=>P.value=!0)})])],64)):l(M)==="algolia"?(a(),i(N,{key:1},[o.value?(a(),k(l(t),{key:0,algolia:((V=l(n).search)==null?void 0:V.options)??l(n).algolia,onVnodeBeforeMount:w[2]||(w[2]=B=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(a(),i("div",Ha,[h(ye,{onClick:p})]))],64)):f("",!0)])}}});const Ea=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=y();return(t,n)=>l(e).socialLinks?(a(),k(ke,{key:0,class:"VPNavBarSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}});const Da=m(Ea,[["__scopeId","data-v-ef6192dc"]]),Fa=["href"],Oa=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=y(),{hasSidebar:n}=E(),{currentLang:o}=X();return(r,d)=>(a(),i("div",{class:T(["VPNavBarTitle",{"has-sidebar":l(n)}])},[c("a",{class:"title",href:l(t).logoLink??l(J)(l(o).link)},[u(r.$slots,"nav-bar-title-before",{},void 0,!0),l(t).logo?(a(),k(ee,{key:0,class:"logo",image:l(t).logo},null,8,["image"])):f("",!0),l(t).siteTitle?(a(),i(N,{key:1},[x(S(l(t).siteTitle),1)],64)):l(t).siteTitle===void 0?(a(),i(N,{key:2},[x(S(l(e).title),1)],64)):f("",!0),u(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,Fa)],2))}});const Ga=m(Oa,[["__scopeId","data-v-2973dbb4"]]),Ua={},ja={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},qa=c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ka=c("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Ra=[qa,Ka];function Wa(s,e){return a(),i("svg",ja,Ra)}const Be=m(Ua,[["render",Wa]]),Ya={class:"items"},Ja={class:"title"},Xa=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=y(),{localeLinks:t,currentLang:n}=X({correspondingLink:!0});return(o,r)=>l(t).length&&l(n).label?(a(),k(be,{key:0,class:"VPNavBarTranslations",icon:Be,label:l(e).langMenuLabel||"Change language"},{default:v(()=>[c("div",Ya,[c("p",Ja,S(l(n).label),1),(a(!0),i(N,null,A(l(t),d=>(a(),k(ae,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const Za=m(Xa,[["__scopeId","data-v-ff4524ae"]]),Qa=s=>(H("data-v-f1abbc6e"),s=s(),z(),s),er={class:"container"},tr={class:"title"},sr={class:"content"},nr=Qa(()=>c("div",{class:"curtain"},null,-1)),or={class:"content-body"},ar=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=we(),{hasSidebar:t}=E(),{frontmatter:n}=y(),o=I({});return Pe(()=>{o.value={"has-sidebar":t.value,top:n.value.layout==="home"&&e.value===0}}),(r,d)=>(a(),i("div",{class:T(["VPNavBar",o.value])},[c("div",er,[c("div",tr,[h(Ga,null,{"nav-bar-title-before":v(()=>[u(r.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(r.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",sr,[nr,c("div",or,[u(r.$slots,"nav-bar-content-before",{},void 0,!0),h(za,{class:"search"}),h(Sa,{class:"menu"}),h(Za,{class:"translations"}),h(bo,{class:"appearance"}),h(Da,{class:"social-links"}),h(_a,{class:"extra"}),u(r.$slots,"nav-bar-content-after",{},void 0,!0),h(ga,{class:"hamburger",active:r.isScreenOpen,onClick:d[0]||(d[0]=p=>r.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const rr=m(ar,[["__scopeId","data-v-f1abbc6e"]]),lr={key:0,class:"VPNavScreenAppearance"},ir={class:"text"},cr=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=y();return(n,o)=>l(e).appearance?(a(),i("div",lr,[c("p",ir,S(l(t).darkModeSwitchLabel||"Appearance"),1),h(me)])):f("",!0)}});const ur=m(cr,[["__scopeId","data-v-0dc5cf49"]]),dr=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=oe("close-screen");return(t,n)=>(a(),k(D,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[x(S(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const _r=m(dr,[["__scopeId","data-v-fe523e3d"]]),vr={},pr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},hr=c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),fr=[hr];function mr(s,e){return a(),i("svg",pr,fr)}const gr=m(vr,[["render",mr]]),br=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=oe("close-screen");return(t,n)=>(a(),k(D,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:l(e)},{default:v(()=>[x(S(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const Ae=m(br,[["__scopeId","data-v-aea78dd1"]]),kr={class:"VPNavScreenMenuGroupSection"},$r={key:0,class:"title"},yr=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),i("div",kr,[e.text?(a(),i("p",$r,S(e.text),1)):f("",!0),(a(!0),i(N,null,A(e.items,n=>(a(),k(Ae,{key:n.text,item:n},null,8,["item"]))),128))]))}});const Pr=m(yr,[["__scopeId","data-v-f60dbfa7"]]),Vr=["aria-controls","aria-expanded"],wr={class:"button-text"},Lr=["id"],Sr={key:1,class:"group"},Mr=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=I(!1),n=$(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(r,d)=>(a(),i("div",{class:T(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[c("span",wr,S(r.text),1),h(gr,{class:"button-icon"})],8,Vr),c("div",{id:n.value,class:"items"},[(a(!0),i(N,null,A(r.items,p=>(a(),i(N,{key:p.text},["link"in p?(a(),i("div",{key:p.text,class:"item"},[h(Ae,{item:p},null,8,["item"])])):(a(),i("div",Sr,[h(Pr,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,Lr)],2))}});const Cr=m(Mr,[["__scopeId","data-v-c2c554ed"]]),Ir={key:0,class:"VPNavScreenMenu"},Nr=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=y();return(t,n)=>l(e).nav?(a(),i("nav",Ir,[(a(!0),i(N,null,A(l(e).nav,o=>(a(),i(N,{key:o.text},["link"in o?(a(),k(_r,{key:0,item:o},null,8,["item"])):(a(),k(Cr,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Tr=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=y();return(t,n)=>l(e).socialLinks?(a(),k(ke,{key:0,class:"VPNavScreenSocialLinks",links:l(e).socialLinks},null,8,["links"])):f("",!0)}}),Br={class:"list"},Ar=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=X({correspondingLink:!0}),n=I(!1);function o(){n.value=!n.value}return(r,d)=>l(e).length&&l(t).label?(a(),i("div",{key:0,class:T(["VPNavScreenTranslations",{open:n.value}])},[c("button",{class:"title",onClick:o},[h(Be,{class:"icon lang"}),x(" "+S(l(t).label)+" ",1),h(Te,{class:"icon chevron"})]),c("ul",Br,[(a(!0),i(N,null,A(l(e),p=>(a(),i("li",{key:p.link,class:"item"},[h(D,{class:"link",href:p.link},{default:v(()=>[x(S(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const xr=m(Ar,[["__scopeId","data-v-41505286"]]),Hr={class:"container"},zr=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=I(null),t=Le(R?document.body:null);return(n,o)=>(a(),k(ue,{name:"fade",onEnter:o[0]||(o[0]=r=>t.value=!0),onAfterLeave:o[1]||(o[1]=r=>t.value=!1)},{default:v(()=>[n.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Hr,[u(n.$slots,"nav-screen-content-before",{},void 0,!0),h(Nr,{class:"menu"}),h(xr,{class:"translations"}),h(ur,{class:"appearance"}),h(Tr,{class:"social-links"}),u(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Er=m(zr,[["__scopeId","data-v-57cce842"]]),Dr={key:0,class:"VPNav"},Fr=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Jn(),{frontmatter:o}=y(),r=$(()=>o.value.navbar!==!1);return Se("close-screen",t),te(()=>{R&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(d,p)=>r.value?(a(),i("header",Dr,[h(rr,{"is-screen-open":l(e),onToggleScreen:l(n)},{"nav-bar-title-before":v(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Er,{open:l(e)},{"nav-screen-content-before":v(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Or=m(Fr,[["__scopeId","data-v-7ad780c2"]]),Gr=s=>(H("data-v-bd01e0d5"),s=s(),z(),s),Ur=["role","tabindex"],jr=Gr(()=>c("div",{class:"indicator"},null,-1)),qr=["onKeydown"],Kr={key:1,class:"items"},Rr=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:r,hasActiveLink:d,hasChildren:p,toggle:_}=mt($(()=>e.item)),b=$(()=>p.value?"section":"div"),P=$(()=>o.value?"a":"div"),M=$(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),C=$(()=>o.value?void 0:"button"),w=$(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":r.value},{"has-active":d.value}]);function V(L){"key"in L&&L.key!=="Enter"||!e.item.link&&_()}function B(){e.item.link&&_()}return(L,q)=>{const W=j("VPSidebarItem",!0);return a(),k(F(b.value),{class:T(["VPSidebarItem",w.value])},{default:v(()=>[L.item.text?(a(),i("div",Z({key:0,class:"item",role:C.value},Re(L.item.items?{click:V,keydown:V}:{},!0),{tabindex:L.item.items&&0}),[jr,L.item.link?(a(),k(D,{key:0,tag:P.value,class:"link",href:L.item.link,rel:L.item.rel,target:L.item.target},{default:v(()=>[(a(),k(F(M.value),{class:"text",innerHTML:L.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(F(M.value),{key:1,class:"text",innerHTML:L.item.text},null,8,["innerHTML"])),L.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:We(B,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],40,qr)):f("",!0)],16,Ur)):f("",!0),L.item.items&&L.item.items.length?(a(),i("div",Kr,[L.depth<5?(a(!0),i(N,{key:0},A(L.item.items,K=>(a(),k(W,{key:K.text,item:K,depth:L.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Wr=m(Rr,[["__scopeId","data-v-bd01e0d5"]]),xe=s=>(H("data-v-ee2efba5"),s=s(),z(),s),Yr=xe(()=>c("div",{class:"curtain"},null,-1)),Jr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Xr=xe(()=>c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Zr=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=E(),n=s,o=I(null),r=Le(R?document.body:null);return U([n,o],()=>{var d;n.open?(r.value=!0,(d=o.value)==null||d.focus()):r.value=!1},{immediate:!0,flush:"post"}),(d,p)=>l(t)?(a(),i("aside",{key:0,class:T(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Ye(()=>{},["stop"]))},[Yr,c("nav",Jr,[Xr,u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(N,null,A(l(e),_=>(a(),i("div",{key:_.text,class:"group"},[h(Wr,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const Qr=m(Zr,[["__scopeId","data-v-ee2efba5"]]),el=g({__name:"VPSkipLink",setup(s){const e=ne(),t=I();U(()=>e.path,()=>t.value.focus());function n({target:o}){const r=document.getElementById(decodeURIComponent(o.hash).slice(1));if(r){const d=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",d)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",d),r.focus(),window.scrollTo(0,0)}}return(o,r)=>(a(),i(N,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}});const tl=m(el,[["__scopeId","data-v-c8291ffa"]]),sl=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=E(),o=ne();U(()=>o.path,n),ft(e,n);const{frontmatter:r}=y(),d=Je(),p=$(()=>!!d["home-hero-image"]);return Se("hero-image-slot-exists",p),(_,b)=>{const P=j("Content");return l(r).layout!==!1?(a(),i("div",{key:0,class:T(["Layout",l(r).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(tl),h(tt,{class:"backdrop",show:l(e),onClick:l(n)},null,8,["show","onClick"]),h(Or,null,{"nav-bar-title-before":v(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":v(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":v(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":v(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":v(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":v(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Yn,{open:l(e),onOpenMenu:l(t)},null,8,["open","onOpenMenu"]),h(Qr,{open:l(e)},{"sidebar-nav-before":v(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":v(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Sn,null,{"page-top":v(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":v(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":v(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":v(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":v(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":v(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":v(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":v(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":v(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":v(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":v(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":v(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":v(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":v(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":v(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":v(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":v(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":v(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":v(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":v(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Tn),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(P,{key:1}))}}});const nl=m(sl,[["__scopeId","data-v-9d8abc1e"]]);const al={Layout:nl,enhanceApp:({app:s})=>{s.component("Badge",Ze)}};export{al as t,y as u}; diff --git a/assets/cms.md.9922f3eb.js b/assets/cms.md.9922f3eb.js new file mode 100644 index 000000000..c7f496dba --- /dev/null +++ b/assets/cms.md.9922f3eb.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as s,k as e,a as o}from"./chunks/framework.7d2df8c6.js";const x=JSON.parse('{"title":"反垃圾","description":"","frontmatter":{},"headers":[],"relativePath":"cms.md","filePath":"cms.md","lastUpdated":null}'),c={name:"cms.md"},r=e("h1",{id:"反垃圾",tabindex:"-1"},[o("反垃圾 "),e("a",{class:"header-anchor",href:"#反垃圾","aria-label":'Permalink to "反垃圾"'},"​")],-1),n=e("p",null,[e("a",{href:"./faq.html#如何配置反垃圾"},"如何配置反垃圾?")],-1),d=[r,n];function l(i,_,m,h,p,f){return t(),s("div",null,d)}const k=a(c,[["render",l]]);export{x as __pageData,k as default}; diff --git a/assets/cms.md.9922f3eb.lean.js b/assets/cms.md.9922f3eb.lean.js new file mode 100644 index 000000000..c7f496dba --- /dev/null +++ b/assets/cms.md.9922f3eb.lean.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as s,k as e,a as o}from"./chunks/framework.7d2df8c6.js";const x=JSON.parse('{"title":"反垃圾","description":"","frontmatter":{},"headers":[],"relativePath":"cms.md","filePath":"cms.md","lastUpdated":null}'),c={name:"cms.md"},r=e("h1",{id:"反垃圾",tabindex:"-1"},[o("反垃圾 "),e("a",{class:"header-anchor",href:"#反垃圾","aria-label":'Permalink to "反垃圾"'},"​")],-1),n=e("p",null,[e("a",{href:"./faq.html#如何配置反垃圾"},"如何配置反垃圾?")],-1),d=[r,n];function l(i,_,m,h,p,f){return t(),s("div",null,d)}const k=a(c,[["render",l]]);export{x as __pageData,k as default}; diff --git a/assets/configuration.md.3456c64e.js b/assets/configuration.md.3456c64e.js new file mode 100644 index 000000000..14188799f --- /dev/null +++ b/assets/configuration.md.3456c64e.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as o,Q as r}from"./chunks/framework.7d2df8c6.js";const u=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"configuration.md","filePath":"configuration.md","lastUpdated":null}'),t={name:"configuration.md"},l=r('

配置

注意

因图形化配置界面已上线,此文档已废弃且不再维护,其中的内容可能已经过时

  • 配置是可选的,即使没有配置也可以使用。
  • 请确保 config 表的权限不是“所有用户可读”,以保证 SMTP 密码等信息不会泄露。
    不过放心,默认权限是安全的,您不需要更改。
  • 请将配置项放在一条数据记录中。

通用

SITE_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站

博客、站点名称。

SITE_URL

类型: String
默认值: null
必要性: false
示例: https://www.imaegoo.com

博客、站点地址。

BLOGGER_EMAIL

类型: String
默认值: null
必要性: false
示例: 12345@qq.com

博主的邮箱地址,用于邮件通知、博主标识。

反垃圾

AKISMET_KEY

类型: String
默认值: null
必要性: false
示例: 8651783ed123

反垃圾评论 API key。

微信通知

SC_SENDKEY

类型: String
默认值: null
必要性: false
示例: SCT1364TKdsiGjGvyAZNYDVnuHW12345

Server酱微信推送的 SCKEY

邮件通知

SENDER_EMAIL

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱地址。对于大多数邮箱服务商,SENDER_EMAIL 必须和 SMTP_USER 保持一致,否则无法发送邮件。

SENDER_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站评论提醒

邮件通知标题。

SMTP_SERVICE

类型: String
默认值: null
必要性: false
示例: qiye.aliyun

邮件通知邮箱服务商。
完整列表请参考:Supported services

SMTP_USER

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱用户名。

SMTP_PASS

类型: String
默认值: null
必要性: false
示例: password

邮件通知邮箱密码,QQ邮箱请填写授权码。

',36),c=[l];function d(i,n,s,h,b,p){return a(),o("div",null,c)}const _=e(t,[["render",d]]);export{u as __pageData,_ as default}; diff --git a/assets/configuration.md.3456c64e.lean.js b/assets/configuration.md.3456c64e.lean.js new file mode 100644 index 000000000..7a51dae66 --- /dev/null +++ b/assets/configuration.md.3456c64e.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as o,Q as r}from"./chunks/framework.7d2df8c6.js";const u=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"configuration.md","filePath":"configuration.md","lastUpdated":null}'),t={name:"configuration.md"},l=r("",36),c=[l];function d(i,n,s,h,b,p){return a(),o("div",null,c)}const _=e(t,[["render",d]]);export{u as __pageData,_ as default}; diff --git a/assets/en_api.md.859770f8.js b/assets/en_api.md.859770f8.js new file mode 100644 index 000000000..6ea3bb509 --- /dev/null +++ b/assets/en_api.md.859770f8.js @@ -0,0 +1,109 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.7d2df8c6.js";const h=JSON.parse('{"title":"API reference","description":"","frontmatter":{},"headers":[],"relativePath":"en/api.md","filePath":"en/api.md","lastUpdated":null}'),e={name:"en/api.md"},o=l(`

API reference

Through Twikoo API, theme developers can implement some special features, such as displaying the number of article comments in the article list, displaying the latest comments on the home page, etc.

It is not necessary to execute twikoo.init() before calling the Twikoo API.

Get comments count

Get the number of article comments in batch.

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: 'Environment ID', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  urls: [ // List of article paths without protocols, domains and parameters. It is a mandatory parameter
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // Whether the number of comments includes replies, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // example: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});
twikoo.getCommentsCount({
+  envId: 'Environment ID', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  urls: [ // List of article paths without protocols, domains and parameters. It is a mandatory parameter
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // Whether the number of comments includes replies, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // example: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

Get recent comments

Get the latest comments.

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  pageSize: 10, // Get how many bars, the default parameter is 10, the maximum parameter is 100
+  includeReply: false // Whether to include the latest reply, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // Returns Array with the latest comments
+  // * id: comment ID
+  // * url: address of the comment
+  // * nick: nickname
+  // * mailMd5: The MD5 value of the mailbox, which can be used to display the avatar
+  // * link: URL
+  // * comment: the content of the comment in HTML format
+  // * commentText: comment content in plain text format
+  // * created: comment time, in millisecond timestamp format
+  // * avatar: the address of the avatar (new in 0.2.9)
+  // * relativeTime: relative comment time, e.g. "1 hour ago" (new in 0.2.9)
+  // Return example: [ // order from new to old
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});
twikoo.getRecentComments({
+  envId: '您的环境id', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  pageSize: 10, // Get how many bars, the default parameter is 10, the maximum parameter is 100
+  includeReply: false // Whether to include the latest reply, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // Returns Array with the latest comments
+  // * id: comment ID
+  // * url: address of the comment
+  // * nick: nickname
+  // * mailMd5: The MD5 value of the mailbox, which can be used to display the avatar
+  // * link: URL
+  // * comment: the content of the comment in HTML format
+  // * commentText: comment content in plain text format
+  // * created: comment time, in millisecond timestamp format
+  // * avatar: the address of the avatar (new in 0.2.9)
+  // * relativeTime: relative comment time, e.g. "1 hour ago" (new in 0.2.9)
+  // Return example: [ // order from new to old
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

On Twikoo loaded

Callback function after Twikoo is successfully mounted.
It will not be triggered in case of environment ID error, network exception, mount failure, etc.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo is ready to go!');
+});
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo is ready to go!');
+});

On comment loaded

Callback function after comments are loaded successfully.
It will also be triggered when the comment is automatically refreshed after posting and when the next page of comments is loaded.
It will not be triggered when the comment fails to load.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('Comment loading complete');
+  }
+});
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('Comment loading complete');
+  }
+});
`,27),p=[o];function t(c,r,i,E,y,m){return n(),a("div",null,p)}const u=s(e,[["render",t]]);export{h as __pageData,u as default}; diff --git a/assets/en_api.md.859770f8.lean.js b/assets/en_api.md.859770f8.lean.js new file mode 100644 index 000000000..78c4a4bd2 --- /dev/null +++ b/assets/en_api.md.859770f8.lean.js @@ -0,0 +1 @@ +import{_ as s,o as n,c as a,Q as l}from"./chunks/framework.7d2df8c6.js";const h=JSON.parse('{"title":"API reference","description":"","frontmatter":{},"headers":[],"relativePath":"en/api.md","filePath":"en/api.md","lastUpdated":null}'),e={name:"en/api.md"},o=l("",27),p=[o];function t(c,r,i,E,y,m){return n(),a("div",null,p)}const u=s(e,[["render",t]]);export{h as __pageData,u as default}; diff --git a/assets/en_backend.md.9b42e72a.js b/assets/en_backend.md.9b42e72a.js new file mode 100644 index 000000000..ec851021a --- /dev/null +++ b/assets/en_backend.md.9b42e72a.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.7d2df8c6.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend.md","filePath":"en/backend.md","lastUpdated":null}'),n={name:"en/backend.md"};function c(r,o,s,d,p,_){return t(),a("div")}const m=e(n,[["render",c]]);export{l as __pageData,m as default}; diff --git a/assets/en_backend.md.9b42e72a.lean.js b/assets/en_backend.md.9b42e72a.lean.js new file mode 100644 index 000000000..ec851021a --- /dev/null +++ b/assets/en_backend.md.9b42e72a.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.7d2df8c6.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/backend.md","filePath":"en/backend.md","lastUpdated":null}'),n={name:"en/backend.md"};function c(r,o,s,d,p,_){return t(),a("div")}const m=e(n,[["render",c]]);export{l as __pageData,m as default}; diff --git a/assets/en_faq.md.0f998109.js b/assets/en_faq.md.0f998109.js new file mode 100644 index 000000000..157cc98d4 --- /dev/null +++ b/assets/en_faq.md.0f998109.js @@ -0,0 +1,33 @@ +import{_ as s}from"./chunks/katex.cb08556c.js";import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.7d2df8c6.js";const f=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq.md","filePath":"en/faq.md","lastUpdated":null}'),n={name:"en/faq.md"},l=o(`

FAQ

How do I change my avatar?

https://gravatar.com Register and set your avatar by email and leave the same email when commenting.

Visitors can also comment by entering their digital QQ email address and using their QQ avatar.

How do I change or reset the administrator password?

云开发控制台Edit the configuration, delete the config.ADMIN_PASS configuration item, and then go to the Twikoo administration panel to reset the password.

How to get the private key file of the admin panel?

  1. 环境-登录授权Click "Private Key Download" on the right of "Custom Login" to download the private key file
  2. Open the private key file with a text editor and copy all the contents
  3. Click the "pinion" (settings) icon in the comment window, paste the contents of the private key file, and set the administrator password

How to turn on article visit statistics?

You can add where you need to show the number of article visits:

html
<span id="twikoo_visitors">0</span>
<span id="twikoo_visitors">0</span>

to display the number of visits. We do not support site-wide visit statistics at the moment.

How can I test if the Akismet anti-spam configuration is in effect?

Please fill in viagra-test-123 as a nickname, or akismet-guaranteed-spam@example.com as an email address to post a comment, which will definitely be considered as a spam comment.

Note that due to the slow response time of the Akismet service (about 6 seconds), which affects the user experience, Twikoo adopts a "release first, detect later" policy, and spam comments will be visible for a short time after they are posted.

How are free resources calculated?

环境总览See resource usage. twikoo consumes database and cloud functions, both with a free usage of -

  • Database: 50,000 reads/day, 50,000 writes/day
  • Cloud functions: 40,000 GBs/month

The memory consumption of Twikoo cloud functions is constant at 0.1GB, which means that Twikoo cloud functions have a running time of up to 400,000 seconds per month, and the bottleneck of free resources is mainly in the daily read limit of the database. It is recommended that webmasters pay attention to the usage of free resources.

How do I enable Katex support?

Twikoo supports Katex formulas, but to limit the package size of Twikoo, Twikoo does not have the full Katex built-in, you need to load katex.js additionally in the page.

example

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

After loading, you can send $$c = \\pm\\sqrt{a^2 + b^2}$$ to test the effect.

katex

You can also pass in a custom katex configuration during twikoo.init, see Katex Auto-render Extension for details.

js
twikoo.init({
+  envId: 'Environment id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\\\(', right: '\\\\)', display: false },
+      { left: '\\\\[', right: '\\\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});
twikoo.init({
+  envId: 'Environment id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\\\(', right: '\\\\)', display: false },
+      { left: '\\\\[', right: '\\\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

How to configure anti-spam?

Using Tencent Cloud Content Security Service

Twikoo supports access to Tencent Cloud Text Content Detection, which uses deep learning technology to identify harmful content involving pornography, politics, terrorism, etc. It also supports user-configurable thesaurus to combat customized offending text.

Tencent Cloud text content detection is a paid service, offering a 1-month free trial, after which the price is 25 RMB per 10,000 entries. If you don't have high requirements for anti-spam comments, you can also use the free Akismet.

How to apply for Tencent Cloud Text Content Inspection?

  1. Visit Tencent Cloud Console - Text Content Security to open the text content security service
  2. Visit Tencent Cloud Console - User List, click New User, and click Quick Create.
  3. Enter the user name, select "Programmatic Access" as the access method, cancel "AdministratorAccess" as the user privilege, and only check the box "QcloudCMSFullAccess". QcloudCMSFullAccess".
  4. Click "Create User". 5.
  5. Copy the "SecretId" and "SecretKey" from the "Successful New User" page to the Twikoo administration panel Configure them in the "Anti-Spam" module
  6. Test the anti-spam effect

After success, webmasters can configure custom text content filtering in Tencent Cloud Console - Custom Library Management.

Using Akismet Anti-Spam Service

Akismet (Automattic Kismet) is a widely used spam filtering system by Matt Mullenweg, the founder of WordPress, Akismet is also the default plugin installed in WordPress and is very widely used. The goal of the design is to help blog sites to filter spam messages.

  1. Register akismet.com
  2. Select Akismet Personal subscription, copy the Akismet API Key and configure it in the Twikoo admin panel "Anti-Spam" module

Error encountered in login administration panel AUTH_INVALID_CUSTOM_LOGIN_TICKET

Generally, after configuring the login private key, the login private key is downloaded again, which causes the previously configured login private key to be invalid.
Solution: Go to Cloud Development Console, database, delete the config, and then reconfigure the private key.

Can't receive emails?

If it is a cloud function deployed by Vercel, please configure foreign mail service providers to avoid being judged as spam behavior by mail service providers. If it is other reasons, please go to Twikoo management panel, find mail test function, enter your personal mailbox and troubleshoot the reasons according to the test results.

In order to avoid performance problems caused by frequent mailbox checking, the mail configuration has a cache of about 10 minutes, if you are sure the configuration is fine but the test fails, you can wait for 10 minutes and then test again.

Vercel can't upload images?

The Tencent Cloud environment comes with cloud storage, so you can upload images directly in the Tencent Cloud environment, and the images are saved in the cloud storage. However, Vercel environment does not, the upload image function relies on third party image bed, please configure the image bed in the admin panel, Twikoo supports the following image bed:

BedAddressFeatures
qcloudNoneTencent Cloud environment comes with it, can be viewed in Cloud Development - Cloud Storage
7buhttps://7bu.topGo to No Bed, powered by 杜老师, no free packages
smmshttps://sm.msSMMS image bed, there is a free package, please register your account, IMAGE_CDN_TOKEN can be obtained in Dashboard
lsky-proPrivate DeploymentLankenGraphics 2.0 version, IMAGE_CDN please configure the URL address of the home page of the graph bed (such as https://7bu.top), IMAGE_CDN_TOKEN get way please refer to the tutorial 杜老师 said the graph bed: new version Go not to the bed Token acquisition and emptying, the format of the obtained token should be 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5)

Can it be deployed privately?

Yes.

`,47),r=[l];function p(i,c,d,h,y,u){return a(),t("div",null,r)}const g=e(n,[["render",p]]);export{f as __pageData,g as default}; diff --git a/assets/en_faq.md.0f998109.lean.js b/assets/en_faq.md.0f998109.lean.js new file mode 100644 index 000000000..9ceeaf304 --- /dev/null +++ b/assets/en_faq.md.0f998109.lean.js @@ -0,0 +1 @@ +import{_ as s}from"./chunks/katex.cb08556c.js";import{_ as e,o as a,c as t,Q as o}from"./chunks/framework.7d2df8c6.js";const f=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"en/faq.md","filePath":"en/faq.md","lastUpdated":null}'),n={name:"en/faq.md"},l=o("",47),r=[l];function p(i,c,d,h,y,u){return a(),t("div",null,r)}const g=e(n,[["render",p]]);export{f as __pageData,g as default}; diff --git a/assets/en_frontend.md.0a1db1d9.js b/assets/en_frontend.md.0a1db1d9.js new file mode 100644 index 000000000..1b2902f63 --- /dev/null +++ b/assets/en_frontend.md.0a1db1d9.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as n}from"./chunks/framework.7d2df8c6.js";const i=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend.md","filePath":"en/frontend.md","lastUpdated":null}'),a={name:"en/frontend.md"};function r(o,s,d,c,f,p){return t(),n("div")}const l=e(a,[["render",r]]);export{i as __pageData,l as default}; diff --git a/assets/en_frontend.md.0a1db1d9.lean.js b/assets/en_frontend.md.0a1db1d9.lean.js new file mode 100644 index 000000000..1b2902f63 --- /dev/null +++ b/assets/en_frontend.md.0a1db1d9.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as n}from"./chunks/framework.7d2df8c6.js";const i=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/frontend.md","filePath":"en/frontend.md","lastUpdated":null}'),a={name:"en/frontend.md"};function r(o,s,d,c,f,p){return t(),n("div")}const l=e(a,[["render",r]]);export{i as __pageData,l as default}; diff --git a/assets/en_index.md.ede44249.js b/assets/en_index.md.ede44249.js new file mode 100644 index 000000000..2d1e6fc5c --- /dev/null +++ b/assets/en_index.md.ede44249.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as i}from"./chunks/framework.7d2df8c6.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"A simple, safe, free comment system","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"A simple, safe, free comment system","hero":{"name":"Twikoo","text":"Comment system","tagline":"Simple, safe, free","actions":[{"theme":"brand","text":"Quick start","link":"/en/quick-start"},{"theme":"alt","text":"Introduction","link":"/en/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":null}'),o={name:"en/index.md"};function n(a,s,l,m,c,r){return t(),i("div")}const f=e(o,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/en_index.md.ede44249.lean.js b/assets/en_index.md.ede44249.lean.js new file mode 100644 index 000000000..2d1e6fc5c --- /dev/null +++ b/assets/en_index.md.ede44249.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as i}from"./chunks/framework.7d2df8c6.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"A simple, safe, free comment system","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"A simple, safe, free comment system","hero":{"name":"Twikoo","text":"Comment system","tagline":"Simple, safe, free","actions":[{"theme":"brand","text":"Quick start","link":"/en/quick-start"},{"theme":"alt","text":"Introduction","link":"/en/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"en/index.md","filePath":"en/index.md","lastUpdated":null}'),o={name:"en/index.md"};function n(a,s,l,m,c,r){return t(),i("div")}const f=e(o,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/en_intro.md.b281b522.js b/assets/en_intro.md.b281b522.js new file mode 100644 index 000000000..4becc84b4 --- /dev/null +++ b/assets/en_intro.md.b281b522.js @@ -0,0 +1,5 @@ +import{_ as e,a,b as t,c as o}from"./chunks/readme-3.368c86c7.js";import{_ as i,o as l,c as s,Q as n}from"./chunks/framework.7d2df8c6.js";const w=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/intro.md","filePath":"en/intro.md","lastUpdated":null}'),r={name:"en/intro.md"},p=n('Twikoo
       

A simple, safe, free comment system.
简体中文 | English

This document is for American English. This document has many bugs.

Features

Simple

  • Free Build.(Using CloudBase / Vercel / self-hosted as the commenting backend)
  • Simple Deployment.(Support CloudBase / Vercel one-click deployment)

Easy to use

  • Support reply, like.
  • No additional adaptations, support with light theme and dark theme use.
  • Support API , batch get article comment count, latest comments.
  • Visitors entering QQ number in the nickname field will automatically complete the QQ nickname and QQ email.
  • Visitors fill in the digital QQ e-mail, will use the QQ avatar as the comment avatar.
  • Support the comment to paste pictures.(Can be disabled)
  • Support inserting pictures.(Can be disabled)
  • Support 7bu image bed, Tencent CloudBase image bed.
  • Support inserting emoji.(Can be disabled)
  • Support Ctrl + Enter reply.
  • Comments are saved in draft in real time and will not be lost when refreshed.
  • Support Katex formulas.
  • Support for code highlighting by language.

Security

  • Privacy and information security. (sensitive fields (email, IP, environment configuration, etc.) are not leaked through Tencent cloud function control)
  • Support for Akismet spam comment detection.(View Details akismet.com
  • Support Tencent Cloud content security spam comment detection.(View Details Tencent Cloud Content Security
  • Support manual review mode.
  • Anti XSS Attack.
  • Support for limiting the maximum number of comments per IP per 10 minutes.

notification

  • E-mail(Visitors and Blogger)
  • Wechat(only Blogger, Server酱
  • QQ(only Blogger, Qmsg酱

Personalization

  • Background image.
  • the "blogger" logo text.
  • Notification Email Template.
  • Comment prompt message.(placeholder)
  • emoji(OwO 的数据格式
  • 【Nickname】 【Email】 【Website】 Required / Optional
  • Code highlighting theme.

Management

  • Embedded panel with password login to easily view comments, hide comments, delete comments and modify configuration.
  • Support to hide the management portal and show it by entering a secret code.
  • Support for importing comments from Valine, Artalk, Disqus.

Disadvantages

  • IE is not supported.

Preview

Comments

Comments

Management

Management

Notification

Notification

Quick Start

Deploy

View Details

If you want to get updates, make suggestions and participate in the test, welcome to join the discussion group:1080829142 (QQ)
1080829142

Special Thanks

Icon design:Maemo Lee

Release notes & plans

Update logs & Development Plan

Development

If you want to develop locally for a second time, you can refer to the following commands:

sh
yarn dev # (http://localhost:9820/demo.html)
+yarn lint 
+yarn build # (dist/twikoo.all.min.js)
yarn dev # (http://localhost:9820/demo.html)
+yarn lint 
+yarn build # (dist/twikoo.all.min.js)

If your changes can help more people, feel free to submit a Pull Request!

I18N

Support Simplified Chinese, Traditional Chinese, English. translate Pull Request.

License

FOSSA Status

`,47),c=[p];function m(h,d,u,g,f,b){return l(),s("div",null,c)}const _=i(r,[["render",m]]);export{w as __pageData,_ as default}; diff --git a/assets/en_intro.md.b281b522.lean.js b/assets/en_intro.md.b281b522.lean.js new file mode 100644 index 000000000..0136b876f --- /dev/null +++ b/assets/en_intro.md.b281b522.lean.js @@ -0,0 +1 @@ +import{_ as e,a,b as t,c as o}from"./chunks/readme-3.368c86c7.js";import{_ as i,o as l,c as s,Q as n}from"./chunks/framework.7d2df8c6.js";const w=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/intro.md","filePath":"en/intro.md","lastUpdated":null}'),r={name:"en/intro.md"},p=n("",47),c=[p];function m(h,d,u,g,f,b){return l(),s("div",null,c)}const _=i(r,[["render",m]]);export{w as __pageData,_ as default}; diff --git a/assets/en_link.md.c1f0a322.js b/assets/en_link.md.c1f0a322.js new file mode 100644 index 000000000..d51a0b8b6 --- /dev/null +++ b/assets/en_link.md.c1f0a322.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as n,k as e,a as s}from"./chunks/framework.7d2df8c6.js";const f=JSON.parse('{"title":"Links","description":"","frontmatter":{},"headers":[],"relativePath":"en/link.md","filePath":"en/link.md","lastUpdated":null}'),i={name:"en/link.md"},o=e("h1",{id:"links",tabindex:"-1"},[s("Links "),e("a",{class:"header-anchor",href:"#links","aria-label":'Permalink to "Links"'},"​")],-1),r=[o];function l(c,d,_,k,p,h){return t(),n("div",null,r)}const u=a(i,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/en_link.md.c1f0a322.lean.js b/assets/en_link.md.c1f0a322.lean.js new file mode 100644 index 000000000..d51a0b8b6 --- /dev/null +++ b/assets/en_link.md.c1f0a322.lean.js @@ -0,0 +1 @@ +import{_ as a,o as t,c as n,k as e,a as s}from"./chunks/framework.7d2df8c6.js";const f=JSON.parse('{"title":"Links","description":"","frontmatter":{},"headers":[],"relativePath":"en/link.md","filePath":"en/link.md","lastUpdated":null}'),i={name:"en/link.md"},o=e("h1",{id:"links",tabindex:"-1"},[s("Links "),e("a",{class:"header-anchor",href:"#links","aria-label":'Permalink to "Links"'},"​")],-1),r=[o];function l(c,d,_,k,p,h){return t(),n("div",null,r)}const u=a(i,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/en_quick-start.md.78b76bc9.js b/assets/en_quick-start.md.78b76bc9.js new file mode 100644 index 000000000..ed5c06915 --- /dev/null +++ b/assets/en_quick-start.md.78b76bc9.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,Q as s}from"./chunks/framework.7d2df8c6.js";const k=JSON.parse('{"title":"Quick start","description":"","frontmatter":{},"headers":[],"relativePath":"en/quick-start.md","filePath":"en/quick-start.md","lastUpdated":null}'),c={name:"en/quick-start.md"},i=s('

Quick start

Tip

The English document is being built. Please refer to the Chinese document.

',2),r=[i];function o(n,_,l,u,d,p){return e(),a("div",null,r)}const m=t(c,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/en_quick-start.md.78b76bc9.lean.js b/assets/en_quick-start.md.78b76bc9.lean.js new file mode 100644 index 000000000..daf3491a3 --- /dev/null +++ b/assets/en_quick-start.md.78b76bc9.lean.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as a,Q as s}from"./chunks/framework.7d2df8c6.js";const k=JSON.parse('{"title":"Quick start","description":"","frontmatter":{},"headers":[],"relativePath":"en/quick-start.md","filePath":"en/quick-start.md","lastUpdated":null}'),c={name:"en/quick-start.md"},i=s("",2),r=[i];function o(n,_,l,u,d,p){return e(),a("div",null,r)}const m=t(c,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/en_update.md.4ed189a6.js b/assets/en_update.md.4ed189a6.js new file mode 100644 index 000000000..4d6d72ef0 --- /dev/null +++ b/assets/en_update.md.4ed189a6.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.7d2df8c6.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/update.md","filePath":"en/update.md","lastUpdated":null}'),n={name:"en/update.md"};function r(o,s,d,p,c,_){return t(),a("div")}const m=e(n,[["render",r]]);export{l as __pageData,m as default}; diff --git a/assets/en_update.md.4ed189a6.lean.js b/assets/en_update.md.4ed189a6.lean.js new file mode 100644 index 000000000..4d6d72ef0 --- /dev/null +++ b/assets/en_update.md.4ed189a6.lean.js @@ -0,0 +1 @@ +import{_ as e,o as t,c as a}from"./chunks/framework.7d2df8c6.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"en/update.md","filePath":"en/update.md","lastUpdated":null}'),n={name:"en/update.md"};function r(o,s,d,p,c,_){return t(),a("div")}const m=e(n,[["render",r]]);export{l as __pageData,m as default}; diff --git a/assets/faq.md.966fba69.js b/assets/faq.md.966fba69.js new file mode 100644 index 000000000..27de98c34 --- /dev/null +++ b/assets/faq.md.966fba69.js @@ -0,0 +1,33 @@ +import{_ as s}from"./chunks/katex.cb08556c.js";import{_ as a,o as n,c as o,Q as l}from"./chunks/framework.7d2df8c6.js";const m=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":null}'),t={name:"faq.md"},e=l(`

常见问题

如何修改头像?

请前往 https://cravatar.cn 通过邮箱注册并设定头像,评论时,请留下相同的邮箱。

访客还可以通过输入数字 QQ 邮箱地址,使用 QQ 头像发表评论。

如何修改、重置管理员密码?

腾讯云请前往云开发控制台,Vercel 请前往 MongoDB,私有部署请直接编辑 data/db.json.1,编辑配置,删除 config.ADMIN_PASS 配置项,然后前往 Twikoo 管理面板重新设置密码。

如何获得管理面板的私钥文件?

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

如何开启文章访问量统计?

您可以在需要展示文章访问量的地方添加:

html
<span id="twikoo_visitors">0</span>
<span id="twikoo_visitors">0</span>

来展示访问量。暂不支持全站访问量统计。

如何启用 Katex 支持?

Twikoo 支持 Katex 公式,但为了限制 Twikoo 的包大小,Twikoo 没有内置完整的 Katex,您需要在页面中额外加载 katex.js

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

载入后,您可以发送 $$c = \\pm\\sqrt{a^2 + b^2}$$ 测试效果。

katex

您还可以在 twikoo.init 时传入自定义 katex 配置,详细配置请查看 Katex Auto-render Extension

js
twikoo.init({
+  envId: '您的环境id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\\\(', right: '\\\\)', display: false },
+      { left: '\\\\[', right: '\\\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});
twikoo.init({
+  envId: '您的环境id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\\\(', right: '\\\\)', display: false },
+      { left: '\\\\[', right: '\\\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

如何配置反垃圾?

使用腾讯云内容安全服务

Twikoo 支持接入腾讯云文本内容检测,使用深度学习技术,识别涉黄、涉政、涉恐等有害内容,同时支持用户配置词库,打击自定义的违规文本。

腾讯云文本内容检测是付费服务,提供 1 个月的免费试用,之后价格为 25 元/万条。如果您对反垃圾评论要求不高,也可以使用免费的 Akismet。

如何申请腾讯云文本内容检测

  1. 访问腾讯云控制台-文本内容安全,开通文本内容安全服务
  2. 访问腾讯云控制台-用户列表,点击新建用户,点击快速创建
  3. 输入用户名,访问方式选择“编程访问”,用户权限取消“AdministratorAccess”,只勾选“QcloudCMSFullAccess”
  4. 点击“创建用户”
  5. 复制“成功新建用户”页面的“SecretId”和“SecretKey”,到 Twikoo 管理面板“反垃圾”模块中配置
  6. 测试反垃圾效果

成功后,站长可以在腾讯云控制台-自定义库管理配置自定义文本内容过滤。

使用 Akismet 反垃圾服务

Akismet (Automattic Kismet) 是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的 WordPress 创始人 Matt Mullenweg,Akismet 也是 WordPress 默认安装的插件,其使用非常广泛,设计目标便是帮助博客网站来过滤垃圾留言。

  1. 注册 akismet.com
  2. 选择 Akismet Personal 订阅,复制得到的 Akismet API Key,到 Twikoo 管理面板“反垃圾”模块中配置

如何测试 Akismet 反垃圾配置是否生效?

请填写 viagra-test-123 作为昵称,或填写 akismet-guaranteed-spam@example.com 作为邮箱,发表评论,这条评论将一定会被视为垃圾评论。

需要注意的是,由于 Akismet 服务响应速度较慢(大约 6 秒),影响用户体验,Twikoo 采取 “先放行,后检测” 的策略,垃圾评论会在发表后短暂可见。

登录管理面板遇到错误 AUTH_INVALID_CUSTOM_LOGIN_TICKET

一般是配置好登录私钥之后,又重新下载了登录私钥,导致之前配置的登录私钥失效了。
解决方法:到云开发控制台,数据库,删掉 config,然后重新配置私钥。

收不到提醒邮件?

如果是 Vercel 部署的云函数,请配置国外邮件服务商,避免被邮件服务商判定为垃圾邮件行为。如果是其他原因,请前往 Twikoo 管理面板,找到邮件测试功能,输入个人邮箱,根据测试结果排查原因。

为了避免频繁检查邮箱带来的性能问题,邮件配置有 10 分钟左右的缓存,如果确定配置没有问题,但测试失败,可以等待 10 分钟后再测试。

由于博主发表评论时,不会通知博主,如果您想实际测试通知功能,请注销管理面板后用非博主邮箱发表或回复评论。

Vercel、私有部署无法上传图片?

腾讯云环境自带云存储,所以腾讯云环境下可以直接上传图片,图片保存在云存储中。然而 Vercel 环境没有,上传图片功能依赖第三方图床,请在管理面板中配置图床,Twikoo 支持以下图床:

图床地址特点
qcloud腾讯云环境自带,可在云开发 - 云存储中查看
7buhttps://7bu.top去不图床,由杜老师提供支持,无免费套餐
smmshttps://sm.msSMMS 图床,有免费套餐,请自行注册账号,IMAGE_CDN_TOKEN 可在 Dashboard 中获取
lsky-pro私有部署兰空图床 2.0 版本,IMAGE_CDN 请配置图床首页 URL 地址(如 https://7bu.top),IMAGE_CDN_TOKEN 获取方式请参考教程 杜老师说图床:新版本去不图床 Token 的获取与清空,获取到的 token 格式应为 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5

私有部署能连接自己的数据库吗?

Twikoo 私有部署版默认使用内置数据库:LokiJS 数据库,支持的数据库容量大约为 1 GB,不需要连接外部数据库,数据存储在启动 twikoo 时所在目录下的 data 目录,您可以直接复制该目录以完成数据备份。

如果您有 MongoDB 实例,可以连接 MongoDB 作为外部数据库,只需配置环境变量 MONGODB_URI 为数据库连接地址即可,如:mongodb://<username>:<password>@<host>/

`,44),p=[e];function r(c,E,i,y,d,h){return n(),o("div",null,p)}const k=a(t,[["render",r]]);export{m as __pageData,k as default}; diff --git a/assets/faq.md.966fba69.lean.js b/assets/faq.md.966fba69.lean.js new file mode 100644 index 000000000..1279fcd0e --- /dev/null +++ b/assets/faq.md.966fba69.lean.js @@ -0,0 +1 @@ +import{_ as s}from"./chunks/katex.cb08556c.js";import{_ as a,o as n,c as o,Q as l}from"./chunks/framework.7d2df8c6.js";const m=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"faq.md","filePath":"faq.md","lastUpdated":null}'),t={name:"faq.md"},e=l("",44),p=[e];function r(c,E,i,y,d,h){return n(),o("div",null,p)}const k=a(t,[["render",r]]);export{m as __pageData,k as default}; diff --git a/assets/frontend.md.58dfda7e.js b/assets/frontend.md.58dfda7e.js new file mode 100644 index 000000000..da418f47c --- /dev/null +++ b/assets/frontend.md.58dfda7e.js @@ -0,0 +1,35 @@ +import{_ as e,o as a,c as s,Q as o}from"./chunks/framework.7d2df8c6.js";const x=JSON.parse('{"title":"前端部署","description":"","frontmatter":{},"headers":[],"relativePath":"frontend.md","filePath":"frontend.md","lastUpdated":null}'),t={name:"frontend.md"},n=o(`

前端部署

在 Hexo 中使用

Hexo Butterfly 主题使用

请参考 Butterfly 安裝文檔(四) 主題配置-2 进行配置

Hexo Keep 主题使用

请参考 hexo-theme-keep/_config.yml 进行配置

Hexo Volantis 主题使用

请参考 hexo-theme-volantis/_config.yml 进行配置

Hexo Ayer 主题使用

请参考 hexo-theme-ayer/_config.yml 进行配置

Hexo NexT 主题使用

暂不支持 NexT 8 以下的版本,请先升级到 NexT 8。然后在 Hexo 项目根目录执行

sh
# For NexT version >= 8.0.0 && < 8.4.0
+npm install hexo-next-twikoo@1.0.0
+# For NexT version >= 8.4.0
+npm install hexo-next-twikoo@1.0.3
# For NexT version >= 8.0.0 && < 8.4.0
+npm install hexo-next-twikoo@1.0.0
+# For NexT version >= 8.4.0
+npm install hexo-next-twikoo@1.0.3

然后在配置中添加

yml
twikoo:
+  enable: true
+  visitor: true
+  envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  # region: ap-guangzhou # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
twikoo:
+  enable: true
+  visitor: true
+  envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  # region: ap-guangzhou # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填

Hexo Matery 主题使用

请参考 hexo-theme-matery/_config.yml 进行配置

Hexo Icarus 主题使用

请参考 基于腾讯云,给你的 Icarus 博客配上 Twikoo 评论系统 by 异次元de机智君💯

Hexo MengD(萌典) 主题使用

请参考 hexo-theme-MengD/_config.yml 进行配置

hexo-theme-fluid 主题使用

请参考 配置指南-评论 进行配置

hexo-theme-cards 主题使用

请参考 hexo-theme-cards/_config.yml 进行配置

maupassant-hexo 主题使用

请参考 maupassant-hexo/_config.yml 进行配置

hexo-theme-redefine 主题使用

请参考 Redefine 官方文档 #comment 进行配置

在 Hugo 中使用

hugo-theme-stack 主题使用

请参考 Comments | Stackhugo-theme-stack/config.yaml#L83 进行配置

FixIt 主题使用

请参考 入门篇 - FixIt #主题配置hugo-fixit/FixIt/config.toml#L613-L624 进行配置

通过 CDN 引入

提示

如果您使用的博客主题不支持 Twikoo,并且您不知道如何引入 Twikoo,您可以在 Github 提交适配请求

html
<div id="tcomment"></div>
+<script src="https://cdn.staticfile.org/twikoo/1.6.22/twikoo.all.min.js"></script>
+<script>
+twikoo.init({
+  envId: '您的环境id', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  el: '#tcomment', // 容器元素
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
+  // path: location.pathname, // 用于区分不同文章的自定义 js 路径,如果您的文章路径不是 location.pathname,需传此参数
+  // lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/twikoojs/twikoo/blob/main/src/client/utils/i18n/index.js
+})
+</script>
<div id="tcomment"></div>
+<script src="https://cdn.staticfile.org/twikoo/1.6.22/twikoo.all.min.js"></script>
+<script>
+twikoo.init({
+  envId: '您的环境id', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  el: '#tcomment', // 容器元素
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
+  // path: location.pathname, // 用于区分不同文章的自定义 js 路径,如果您的文章路径不是 location.pathname,需传此参数
+  // lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/twikoojs/twikoo/blob/main/src/client/utils/i18n/index.js
+})
+</script>

建议使用 CDN 引入 Twikoo 的用户在链接地址上锁定版本,以免将来 Twikoo 升级时受到非兼容性更新的影响。

更换 CDN 镜像

如果遇到默认 CDN 加载速度缓慢,可更换其他 CDN 镜像。以下为可供选择的公共 CDN,其中一些 CDN 可能需要数天时间同步最新版本:

  • https://cdn.staticfile.org/twikoo/1.6.22/twikoo.all.min.js
  • https://lib.baomitu.com/twikoo/1.6.22/twikoo.all.min.js
  • https://cdn.bootcdn.net/ajax/libs/twikoo/1.6.22/twikoo.all.min.js
  • https://cdn.jsdelivr.net/npm/twikoo@1.6.22/dist/twikoo.all.min.js

开启管理面板(腾讯云环境)

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

配置好登录私钥之后无需留存私钥文件,请勿再次下载登录私钥,否则会导致之前配置的登录私钥失效。

开启管理面板(非腾讯云环境)

点击评论窗口的“小齿轮”图标,设置管理员密码

`,46),l=[n];function r(p,c,h,i,m,u){return a(),s("div",null,l)}const y=e(t,[["render",r]]);export{x as __pageData,y as default}; diff --git a/assets/frontend.md.58dfda7e.lean.js b/assets/frontend.md.58dfda7e.lean.js new file mode 100644 index 000000000..79ba7bf98 --- /dev/null +++ b/assets/frontend.md.58dfda7e.lean.js @@ -0,0 +1 @@ +import{_ as e,o as a,c as s,Q as o}from"./chunks/framework.7d2df8c6.js";const x=JSON.parse('{"title":"前端部署","description":"","frontmatter":{},"headers":[],"relativePath":"frontend.md","filePath":"frontend.md","lastUpdated":null}'),t={name:"frontend.md"},n=o("",46),l=[n];function r(p,c,h,i,m,u){return a(),s("div",null,l)}const y=e(t,[["render",r]]);export{x as __pageData,y as default}; diff --git a/assets/index.md.1464a105.js b/assets/index.md.1464a105.js new file mode 100644 index 000000000..10d2d5ac3 --- /dev/null +++ b/assets/index.md.1464a105.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as i}from"./chunks/framework.7d2df8c6.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","hero":{"name":"Twikoo","text":"网站评论系统","tagline":"简洁、安全、免费","actions":[{"theme":"brand","text":"快速上手","link":"/quick-start"},{"theme":"alt","text":"简介","link":"/intro"},{"theme":"alt","text":"QQ 群","link":"https://jq.qq.com/?_wv=1027&k=2l9ZGIoL"},{"theme":"alt","text":"GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),o={name:"index.md"};function a(l,n,s,c,r,d){return e(),i("div")}const k=t(o,[["render",a]]);export{p as __pageData,k as default}; diff --git a/assets/index.md.1464a105.lean.js b/assets/index.md.1464a105.lean.js new file mode 100644 index 000000000..10d2d5ac3 --- /dev/null +++ b/assets/index.md.1464a105.lean.js @@ -0,0 +1 @@ +import{_ as t,o as e,c as i}from"./chunks/framework.7d2df8c6.js";const p=JSON.parse('{"title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","description":"","frontmatter":{"layout":"home","title":"Twikoo","titleTemplate":"一个简洁、安全、免费的静态网站评论系统","hero":{"name":"Twikoo","text":"网站评论系统","tagline":"简洁、安全、免费","actions":[{"theme":"brand","text":"快速上手","link":"/quick-start"},{"theme":"alt","text":"简介","link":"/intro"},{"theme":"alt","text":"QQ 群","link":"https://jq.qq.com/?_wv=1027&k=2l9ZGIoL"},{"theme":"alt","text":"GitHub","link":"https://github.com/twikoojs/twikoo"}],"image":{"src":"/twikoo-logo-home.png","alt":"Twikoo"}},"features":[{"icon":"🚀","title":"简单","details":"免费搭建,简单部署"},{"icon":"😃","title":"易用","details":"功能丰富,兼容性强"},{"icon":"🛡️","title":"安全","details":"隐私安全,内容安全"},{"icon":"⏰","title":"即时","details":"邮件提醒,即时消息推送"},{"icon":"🌈","title":"个性","details":"自定义背景图,博主标识"},{"icon":"⚙️","title":"便捷管理","details":"内嵌式管理面板,通过密码登录"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":null}'),o={name:"index.md"};function a(l,n,s,c,r,d){return e(),i("div")}const k=t(o,[["render",a]]);export{p as __pageData,k as default}; diff --git a/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 b/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 new file mode 100644 index 000000000..2a6872967 Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2 differ diff --git a/assets/inter-italic-cyrillic.ea42a392.woff2 b/assets/inter-italic-cyrillic.ea42a392.woff2 new file mode 100644 index 000000000..f64035158 Binary files /dev/null and b/assets/inter-italic-cyrillic.ea42a392.woff2 differ diff --git a/assets/inter-italic-greek-ext.4fbe9427.woff2 b/assets/inter-italic-greek-ext.4fbe9427.woff2 new file mode 100644 index 000000000..002189603 Binary files /dev/null and b/assets/inter-italic-greek-ext.4fbe9427.woff2 differ diff --git a/assets/inter-italic-greek.8f4463c4.woff2 b/assets/inter-italic-greek.8f4463c4.woff2 new file mode 100644 index 000000000..71c265f85 Binary files /dev/null and b/assets/inter-italic-greek.8f4463c4.woff2 differ diff --git a/assets/inter-italic-latin-ext.bd8920cc.woff2 b/assets/inter-italic-latin-ext.bd8920cc.woff2 new file mode 100644 index 000000000..9c1b9440e Binary files /dev/null and b/assets/inter-italic-latin-ext.bd8920cc.woff2 differ diff --git a/assets/inter-italic-latin.bd3b6f56.woff2 b/assets/inter-italic-latin.bd3b6f56.woff2 new file mode 100644 index 000000000..01fcf2072 Binary files /dev/null and b/assets/inter-italic-latin.bd3b6f56.woff2 differ diff --git a/assets/inter-italic-vietnamese.6ce511fb.woff2 b/assets/inter-italic-vietnamese.6ce511fb.woff2 new file mode 100644 index 000000000..e4f788ee0 Binary files /dev/null and b/assets/inter-italic-vietnamese.6ce511fb.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.e75737ce.woff2 b/assets/inter-roman-cyrillic-ext.e75737ce.woff2 new file mode 100644 index 000000000..28593ccb8 Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.e75737ce.woff2 differ diff --git a/assets/inter-roman-cyrillic.5f2c6c8c.woff2 b/assets/inter-roman-cyrillic.5f2c6c8c.woff2 new file mode 100644 index 000000000..a20adc161 Binary files /dev/null and b/assets/inter-roman-cyrillic.5f2c6c8c.woff2 differ diff --git a/assets/inter-roman-greek-ext.ab0619bc.woff2 b/assets/inter-roman-greek-ext.ab0619bc.woff2 new file mode 100644 index 000000000..e3b0be76d Binary files /dev/null and b/assets/inter-roman-greek-ext.ab0619bc.woff2 differ diff --git a/assets/inter-roman-greek.d5a6d92a.woff2 b/assets/inter-roman-greek.d5a6d92a.woff2 new file mode 100644 index 000000000..f790e047d Binary files /dev/null and b/assets/inter-roman-greek.d5a6d92a.woff2 differ diff --git a/assets/inter-roman-latin-ext.0030eebd.woff2 b/assets/inter-roman-latin-ext.0030eebd.woff2 new file mode 100644 index 000000000..715bd903b Binary files /dev/null and b/assets/inter-roman-latin-ext.0030eebd.woff2 differ diff --git a/assets/inter-roman-latin.2ed14f66.woff2 b/assets/inter-roman-latin.2ed14f66.woff2 new file mode 100644 index 000000000..a540b7afe Binary files /dev/null and b/assets/inter-roman-latin.2ed14f66.woff2 differ diff --git a/assets/inter-roman-vietnamese.14ce25a6.woff2 b/assets/inter-roman-vietnamese.14ce25a6.woff2 new file mode 100644 index 000000000..5a9f9cb9c Binary files /dev/null and b/assets/inter-roman-vietnamese.14ce25a6.woff2 differ diff --git a/assets/intro.md.35d8cb3f.js b/assets/intro.md.35d8cb3f.js new file mode 100644 index 000000000..8e126f9ff --- /dev/null +++ b/assets/intro.md.35d8cb3f.js @@ -0,0 +1,5 @@ +import{_ as a,a as e,b as t,c as r}from"./chunks/readme-3.368c86c7.js";import{_ as l,o as s,c as o,Q as i}from"./chunks/framework.7d2df8c6.js";const w=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"intro.md","filePath":"intro.md","lastUpdated":null}'),n={name:"intro.md"},h=i('Twikoo
       

一个简洁、安全、免费的静态网站评论系统。
A simple, safe, free comment system.

简体中文 | English

特色

简单

  • 免费搭建(使用云开发 / Vercel / 私有服务器作为评论后台)
  • 简单部署(支持云开发 / Vercel 一键部署)

易用

  • 支持回复、点赞
  • 无需额外适配,支持搭配浅色主题与深色主题使用
  • 支持 API 调用,批量获取文章评论数、最新评论
  • 访客在昵称栏输入 QQ 号,会自动补全 QQ 昵称和 QQ 邮箱
  • 访客填写数字 QQ 邮箱,会使用 QQ 头像作为评论头像
  • 支持评论框粘贴图片(可禁用)
  • 支持插入图片(可禁用)
  • 支持去不图床、云开发图床
  • 支持插入表情(可禁用)
  • 支持 Ctrl + Enter 快捷回复
  • 评论框内容实时保存草稿,刷新不会丢失
  • 支持 Katex 公式
  • 支持按语言的代码高亮

安全

  • 隐私信息安全(通过云函数控制敏感字段(邮箱、IP、环境配置等)不会泄露)
  • 支持 Akismet 垃圾评论检测(需自行注册 akismet.com
  • 支持腾讯云内容安全垃圾评论检测(需自行注册 腾讯云内容安全
  • 支持人工审核模式
  • 防 XSS 注入
  • 支持限制每个 IP 每 10 分钟最多发表多少条评论

即时

  • 支持邮件提醒(访客和博主)
  • 支持微信提醒(仅针对博主,基于 Server酱,需自行注册)
  • 支持 QQ 提醒(仅针对博主,基于 Qmsg酱,需自行注册)
  • 支持 QQ 提醒(针对博主QQ或者群,基于 go-cqhttp,需自己有服务器)

个性

  • 支持自定义评论框背景图片
  • 支持自定义“博主”标识文字
  • 支持自定义通知邮件模板
  • 支持自定义评论框提示信息(placeholder)
  • 支持自定义表情列表(兼容 OwO 的数据格式
  • 支持自定义【昵称】【邮箱】【网址】必填 / 选填
  • 支持自定义代码高亮主题

便捷管理

  • 内嵌式管理面板,通过密码登录,可方便地查看评论、隐藏评论、删除评论、修改配置
  • 支持隐藏管理入口,通过输入暗号显示
  • 支持从 Valine、Artalk、Disqus 导入评论

缺点

  • 不支持 IE

预览

评论

评论

评论管理

评论管理

推送通知

推送通知

交流群

如果你想获取更新动态、建言献策、参与测试,欢迎加入讨论群:
1080829142

浏览器支持

提示

技术原因,不兼容 IE

IE / Edge
IE / Edge
Firefox
Firefox
Chrome
Chrome
Safari
Safari
iOS Safari
iOS Safari
Edgelast versionlast versionlast versionlast version

Generated by browsers-support-badges

更新日志 & 开发计划

更新日志 & 开发计划

特别感谢

图标设计:Maemo Lee

开发

如果您想在本地二次开发,可以参考以下命令:

sh
yarn dev # 开发 (http://localhost:9820/demo.html)
+yarn lint # 代码检查
+yarn build # 编译 (dist/twikoo.all.min.js)
yarn dev # 开发 (http://localhost:9820/demo.html)
+yarn lint # 代码检查
+yarn build # 编译 (dist/twikoo.all.min.js)

如果您的改动能够帮助到更多人,欢迎提交 Pull Request!

国际化

支持简体中文、繁体中文、English。欢迎提交翻译 PR

许可

FOSSA Status

`,49),p=[h];function c(d,m,b,g,u,f){return s(),o("div",null,p)}const q=l(n,[["render",c]]);export{w as __pageData,q as default}; diff --git a/assets/intro.md.35d8cb3f.lean.js b/assets/intro.md.35d8cb3f.lean.js new file mode 100644 index 000000000..84f78ac83 --- /dev/null +++ b/assets/intro.md.35d8cb3f.lean.js @@ -0,0 +1 @@ +import{_ as a,a as e,b as t,c as r}from"./chunks/readme-3.368c86c7.js";import{_ as l,o as s,c as o,Q as i}from"./chunks/framework.7d2df8c6.js";const w=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"intro.md","filePath":"intro.md","lastUpdated":null}'),n={name:"intro.md"},h=i("",49),p=[h];function c(d,m,b,g,u,f){return s(),o("div",null,p)}const q=l(n,[["render",c]]);export{w as __pageData,q as default}; diff --git a/assets/katex.7c72a6fb.png b/assets/katex.7c72a6fb.png new file mode 100644 index 000000000..40bbfe75f Binary files /dev/null and b/assets/katex.7c72a6fb.png differ diff --git a/assets/link.md.cf6d607e.js b/assets/link.md.cf6d607e.js new file mode 100644 index 000000000..f618272d7 --- /dev/null +++ b/assets/link.md.cf6d607e.js @@ -0,0 +1 @@ +import{_ as e,o,c as t,Q as r}from"./chunks/framework.7d2df8c6.js";const k=JSON.parse('{"title":"相关文档","description":"","frontmatter":{},"headers":[],"relativePath":"link.md","filePath":"link.md","lastUpdated":null}'),a={name:"link.md"},l=r('

相关文档

',2),i=[l];function n(s,h,_,c,p,d){return o(),t("div",null,i)}const w=e(a,[["render",n]]);export{k as __pageData,w as default}; diff --git a/assets/link.md.cf6d607e.lean.js b/assets/link.md.cf6d607e.lean.js new file mode 100644 index 000000000..b23044a91 --- /dev/null +++ b/assets/link.md.cf6d607e.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as t,Q as r}from"./chunks/framework.7d2df8c6.js";const k=JSON.parse('{"title":"相关文档","description":"","frontmatter":{},"headers":[],"relativePath":"link.md","filePath":"link.md","lastUpdated":null}'),a={name:"link.md"},l=r("",2),i=[l];function n(s,h,_,c,p,d){return o(),t("div",null,i)}const w=e(a,[["render",n]]);export{k as __pageData,w as default}; diff --git a/assets/logo.5707582f.png b/assets/logo.5707582f.png new file mode 100644 index 000000000..2efeb5eca Binary files /dev/null and b/assets/logo.5707582f.png differ diff --git a/assets/mongodb-1.b467da78.png b/assets/mongodb-1.b467da78.png new file mode 100644 index 000000000..03120cd12 Binary files /dev/null and b/assets/mongodb-1.b467da78.png differ diff --git a/assets/mongodb-2.d2431ba3.png b/assets/mongodb-2.d2431ba3.png new file mode 100644 index 000000000..f746a45d6 Binary files /dev/null and b/assets/mongodb-2.d2431ba3.png differ diff --git a/assets/mongodb-3.98ac6e22.png b/assets/mongodb-3.98ac6e22.png new file mode 100644 index 000000000..3e3c38b12 Binary files /dev/null and b/assets/mongodb-3.98ac6e22.png differ diff --git a/assets/netlify-1.c6c64abb.png b/assets/netlify-1.c6c64abb.png new file mode 100644 index 000000000..6b5adf242 Binary files /dev/null and b/assets/netlify-1.c6c64abb.png differ diff --git a/assets/netlify-2.4f0d58e4.png b/assets/netlify-2.4f0d58e4.png new file mode 100644 index 000000000..e30ce5824 Binary files /dev/null and b/assets/netlify-2.4f0d58e4.png differ diff --git a/assets/netlify-3.4f565e5d.png b/assets/netlify-3.4f565e5d.png new file mode 100644 index 000000000..d086765d0 Binary files /dev/null and b/assets/netlify-3.4f565e5d.png differ diff --git a/assets/netlify-4.1647e7f0.png b/assets/netlify-4.1647e7f0.png new file mode 100644 index 000000000..118292159 Binary files /dev/null and b/assets/netlify-4.1647e7f0.png differ diff --git a/assets/netlify-5.a29645d7.png b/assets/netlify-5.a29645d7.png new file mode 100644 index 000000000..dcdd0e733 Binary files /dev/null and b/assets/netlify-5.a29645d7.png differ diff --git a/assets/quick-start.md.65db2e19.js b/assets/quick-start.md.65db2e19.js new file mode 100644 index 000000000..f3a5e0cb2 --- /dev/null +++ b/assets/quick-start.md.65db2e19.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as e,Q as o}from"./chunks/framework.7d2df8c6.js";const u=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"quick-start.md","filePath":"quick-start.md","lastUpdated":null}'),i={name:"quick-start.md"},r=o('

快速上手

Twikoo 分为云函数和前端两部分,若要在您的网站上集成 Twikoo,您需要同时部署云函数和前端,部署时请注意保持二者版本一致。

  • 云函数部署 有多种方式,请选择适合自己的部署平台。
  • 前端部署 有 2 种方式,如果您的网站主题支持 Twikoo,您只需在配置文件中指定 Twikoo 即可;如果您的网站主题不支持 Twikoo,您需要修改源码手动引入 Twikoo 的 js 文件并初始化。
  • 若您已部署旧版本 Twikoo,请参考 版本更新 升级云函数和前端版本。
',3),s=[r];function l(_,c,n,d,h,k){return a(),e("div",null,s)}const f=t(i,[["render",l]]);export{u as __pageData,f as default}; diff --git a/assets/quick-start.md.65db2e19.lean.js b/assets/quick-start.md.65db2e19.lean.js new file mode 100644 index 000000000..07d06fe43 --- /dev/null +++ b/assets/quick-start.md.65db2e19.lean.js @@ -0,0 +1 @@ +import{_ as t,o as a,c as e,Q as o}from"./chunks/framework.7d2df8c6.js";const u=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"quick-start.md","filePath":"quick-start.md","lastUpdated":null}'),i={name:"quick-start.md"},r=o("",3),s=[r];function l(_,c,n,d,h,k){return a(),e("div",null,s)}const f=t(i,[["render",l]]);export{u as __pageData,f as default}; diff --git a/assets/readme-1.28a161f2.png b/assets/readme-1.28a161f2.png new file mode 100644 index 000000000..1f6f3c280 Binary files /dev/null and b/assets/readme-1.28a161f2.png differ diff --git a/assets/readme-2.36e8fa3b.png b/assets/readme-2.36e8fa3b.png new file mode 100644 index 000000000..4752e3480 Binary files /dev/null and b/assets/readme-2.36e8fa3b.png differ diff --git a/assets/readme-3.45bb1d93.jpg b/assets/readme-3.45bb1d93.jpg new file mode 100644 index 000000000..5d33c487e Binary files /dev/null and b/assets/readme-3.45bb1d93.jpg differ diff --git a/assets/style.5f135469.css b/assets/style.5f135469.css new file mode 100644 index 000000000..0e72d209f --- /dev/null +++ b/assets/style.5f135469.css @@ -0,0 +1 @@ +@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-green-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-green-1);--vp-code-line-diff-remove-color: var(--vp-c-red-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red-1);--vp-code-line-warning-color: var(--vp-c-yellow-soft);--vp-code-line-error-color: var(--vp-c-red-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-brand-soft);--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-gray-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-brand-1);--vp-badge-tip-bg: var(--vp-c-brand-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{display:inline-block;margin:auto 2px -2px}mjx-container>svg{margin:auto}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-brand-1)}.custom-block.tip a:hover{color:var(--vp-c-brand-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-ea5b2908]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.vp-doc h1>.VPBadge[data-v-ea5b2908]{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge[data-v-ea5b2908]{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge[data-v-ea5b2908]{vertical-align:middle}.vp-doc h4>.VPBadge[data-v-ea5b2908],.vp-doc h5>.VPBadge[data-v-ea5b2908],.vp-doc h6>.VPBadge[data-v-ea5b2908]{vertical-align:middle;line-height:18px}.VPBadge.info[data-v-ea5b2908]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-ea5b2908]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-ea5b2908]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-ea5b2908]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-b9c0c15a]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-b9c0c15a]{padding:96px 32px 168px}}.code[data-v-b9c0c15a]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-b9c0c15a]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-b9c0c15a]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-b9c0c15a]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-b9c0c15a]{padding-top:20px}.link[data-v-b9c0c15a]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-b9c0c15a]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-463da30f]{position:relative;z-index:1}.nested[data-v-463da30f]{padding-left:16px}.outline-link[data-v-463da30f]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:400}.outline-link[data-v-463da30f]:hover,.outline-link.active[data-v-463da30f]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-463da30f]{padding-left:13px}.VPDocAsideOutline[data-v-3a6c4994]{display:none}.VPDocAsideOutline.has-outline[data-v-3a6c4994]{display:block}.content[data-v-3a6c4994]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-3a6c4994]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-3a6c4994]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-19a7ae4e]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-19a7ae4e]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-a2d931e4]{margin-top:64px}.edit-info[data-v-a2d931e4]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-a2d931e4]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-a2d931e4]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-a2d931e4]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-a2d931e4]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-a2d931e4]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-a2d931e4]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-a2d931e4]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-a2d931e4]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-a2d931e4]{margin-left:auto;text-align:right}.desc[data-v-a2d931e4]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-a2d931e4]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDocOutlineDropdown[data-v-95bb0785]{margin-bottom:48px}.VPDocOutlineDropdown button[data-v-95bb0785]{display:block;font-size:14px;font-weight:500;line-height:24px;border:1px solid var(--vp-c-border);padding:4px 12px;color:var(--vp-c-text-2);background-color:var(--vp-c-default-soft);border-radius:8px;transition:color .5s}.VPDocOutlineDropdown button[data-v-95bb0785]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-95bb0785]{color:var(--vp-c-text-1)}.icon[data-v-95bb0785]{display:inline-block;vertical-align:middle;width:16px;height:16px;fill:currentColor}[data-v-95bb0785] .outline-link{font-size:14px;font-weight:400}.open>.icon[data-v-95bb0785]{transform:rotate(90deg)}.items[data-v-95bb0785]{margin-top:12px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-a3c25e27]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:none}@media (min-width: 960px) and (max-width: 1279px){.VPDoc .VPDocOutlineDropdown[data-v-a3c25e27]{display:block}}@media (min-width: 768px){.VPDoc[data-v-a3c25e27]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-a3c25e27]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-a3c25e27]{display:flex;justify-content:center}.VPDoc .aside[data-v-a3c25e27]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-a3c25e27]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-a3c25e27]{max-width:1104px}}.container[data-v-a3c25e27]{margin:0 auto;width:100%}.aside[data-v-a3c25e27]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-a3c25e27]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-a3c25e27]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-a3c25e27]::-webkit-scrollbar{display:none}.aside-curtain[data-v-a3c25e27]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-a3c25e27]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-a3c25e27]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-a3c25e27]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-a3c25e27]{order:1;margin:0;min-width:640px}}.content-container[data-v-a3c25e27]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-a3c25e27]{max-width:688px}.external-link-icon-enabled[data-v-a3c25e27] :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.VPButton[data-v-1e76fe75]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-1e76fe75]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1e76fe75]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1e76fe75]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1e76fe75]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1e76fe75]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-1e76fe75]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-1e76fe75]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1e76fe75]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-1e76fe75]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-1e76fe75]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1e76fe75]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-1e76fe75]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-5a3e9999]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-5a3e9999]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-5a3e9999]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-5a3e9999]{flex-direction:row}}.main[data-v-5a3e9999]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-5a3e9999]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-5a3e9999]{text-align:left}}@media (min-width: 960px){.main[data-v-5a3e9999]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-5a3e9999]{max-width:592px}}.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0 auto}.name[data-v-5a3e9999]{color:var(--vp-home-hero-name-color)}.clip[data-v-5a3e9999]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-5a3e9999],.text[data-v-5a3e9999]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-5a3e9999],.VPHero.has-image .text[data-v-5a3e9999]{margin:0}}.tagline[data-v-5a3e9999]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-5a3e9999]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-5a3e9999]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-5a3e9999]{margin:0}}.actions[data-v-5a3e9999]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:center}@media (min-width: 640px){.actions[data-v-5a3e9999]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-5a3e9999]{justify-content:flex-start}}.action[data-v-5a3e9999]{flex-shrink:0;padding:6px}.image[data-v-5a3e9999]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-5a3e9999]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-5a3e9999]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-5a3e9999]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-5a3e9999]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-5a3e9999]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-5a3e9999]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-5a3e9999]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-5a3e9999]{width:320px;height:320px}}[data-v-5a3e9999] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-5a3e9999] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-5a3e9999] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-ee984185]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-ee984185]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-ee984185]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-ee984185]>.VPImage{margin-bottom:20px}.icon[data-v-ee984185]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-ee984185]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-ee984185]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-ee984185]{padding-top:8px}.link-text-value[data-v-ee984185]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-ee984185]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.VPHome[data-v-20eabd3a]{padding-bottom:96px}.VPHome[data-v-20eabd3a] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-20eabd3a]{padding-bottom:128px}}.VPContent[data-v-3cf691b6]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-3cf691b6]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-3cf691b6]{margin:0}@media (min-width: 960px){.VPContent[data-v-3cf691b6]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-3cf691b6]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-3cf691b6]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-e4279f1c]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-e4279f1c]{display:none}@media (min-width: 768px){.VPFooter[data-v-e4279f1c]{padding:32px}}.container[data-v-e4279f1c]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-e4279f1c],.copyright[data-v-e4279f1c]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-24251f6f]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-24251f6f]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-24251f6f]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-24251f6f]{color:var(--vp-c-text-1)}.icon[data-v-24251f6f]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-24251f6f] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-24251f6f]{transform:rotate(90deg)}.items[data-v-24251f6f]{position:absolute;top:64px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.header[data-v-24251f6f]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-24251f6f]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-24251f6f]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-24251f6f]{transition:all .2s ease-out}.flyout-leave-active[data-v-24251f6f]{transition:all .15s ease-in}.flyout-enter-from[data-v-24251f6f],.flyout-leave-to[data-v-24251f6f]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-9e669cc1]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--vp-c-gutter);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-9e669cc1]{position:fixed}.VPLocalNav.reached-top[data-v-9e669cc1]{border-top-color:transparent}@media (min-width: 960px){.VPLocalNav[data-v-9e669cc1]{display:none}}.menu[data-v-9e669cc1]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-9e669cc1]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-9e669cc1]{padding:0 32px}}.menu-icon[data-v-9e669cc1]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-9e669cc1]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-9e669cc1]{padding:12px 32px 11px}}.VPSwitch[data-v-1c29e291]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-1c29e291]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-1c29e291]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-1c29e291]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-1c29e291] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-1c29e291] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-3329432d]{opacity:1}.moon[data-v-3329432d],.dark .sun[data-v-3329432d]{opacity:0}.dark .moon[data-v-3329432d]{opacity:1}.dark .VPSwitchAppearance[data-v-3329432d] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-283b26e9]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-283b26e9]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f51f088d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f51f088d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f51f088d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f51f088d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-e42ed9b3]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-e42ed9b3] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-e42ed9b3] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-e42ed9b3] .group:last-child{padding-bottom:0}.VPMenu[data-v-e42ed9b3] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-e42ed9b3] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-e42ed9b3] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-e42ed9b3] .action{padding-left:24px}.VPFlyout[data-v-aa8de344]{position:relative}.VPFlyout[data-v-aa8de344]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-aa8de344]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-aa8de344]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-aa8de344]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-aa8de344]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-aa8de344],.button[aria-expanded=true]+.menu[data-v-aa8de344]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-aa8de344]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-aa8de344]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-aa8de344]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-aa8de344]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-aa8de344]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-aa8de344]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-aa8de344]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-16cf740a]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-16cf740a]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-16cf740a]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-c8c2ae4b]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-c8c2ae4b]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-c8c2ae4b]{display:none}}.trans-title[data-v-c8c2ae4b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-c8c2ae4b],.item.social-links[data-v-c8c2ae4b]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-c8c2ae4b]{min-width:176px}.appearance-action[data-v-c8c2ae4b]{margin-right:-2px}.social-links-list[data-v-c8c2ae4b]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-cb318fec]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-cb318fec],.VPNavBarMenuLink[data-v-cb318fec]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-f732b5d0]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-f732b5d0]{display:flex}}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-2973dbb4]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-2973dbb4]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-2973dbb4]{border-bottom-color:var(--vp-c-divider)}}[data-v-2973dbb4] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-ff4524ae]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-ff4524ae]{display:flex;align-items:center}}.title[data-v-ff4524ae]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-f1abbc6e]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap}@media (min-width: 768px){.VPNavBar[data-v-f1abbc6e]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-f1abbc6e]{padding:0}.VPNavBar[data-v-f1abbc6e]:not(.has-sidebar):not(.top){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-f1abbc6e]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-f1abbc6e],.container>.content[data-v-f1abbc6e]{pointer-events:none}.container[data-v-f1abbc6e] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-f1abbc6e]{max-width:100%}}.title[data-v-f1abbc6e]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-f1abbc6e]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-f1abbc6e]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-f1abbc6e]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-f1abbc6e]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-f1abbc6e]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-f1abbc6e]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-f1abbc6e]{position:relative;background-color:var(--vp-nav-bg-color)}}@media (max-width: 767px){.content-body[data-v-f1abbc6e]{column-gap:.5rem}}.menu+.translations[data-v-f1abbc6e]:before,.menu+.appearance[data-v-f1abbc6e]:before,.menu+.social-links[data-v-f1abbc6e]:before,.translations+.appearance[data-v-f1abbc6e]:before,.appearance+.social-links[data-v-f1abbc6e]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-f1abbc6e]:before,.translations+.appearance[data-v-f1abbc6e]:before{margin-right:16px}.appearance+.social-links[data-v-f1abbc6e]:before{margin-left:16px}.social-links[data-v-f1abbc6e]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-f1abbc6e]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenAppearance[data-v-0dc5cf49]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-0dc5cf49]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-fe523e3d]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-fe523e3d]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aea78dd1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-aea78dd1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-c2c554ed]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-c2c554ed]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-c2c554ed]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-c2c554ed]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-c2c554ed]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-c2c554ed]{transform:rotate(45deg)}.button[data-v-c2c554ed]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-c2c554ed]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-c2c554ed]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-c2c554ed]:first-child{padding-top:0}.group+.group[data-v-c2c554ed],.group+.item[data-v-c2c554ed]{padding-top:4px}.VPNavScreenTranslations[data-v-41505286]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-41505286]{height:auto}.title[data-v-41505286]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-41505286]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-41505286]{margin-right:8px}.icon.chevron[data-v-41505286]{margin-left:4px}.list[data-v-41505286]{padding:4px 0 0 24px}.link[data-v-41505286]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-57cce842]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-57cce842],.VPNavScreen.fade-leave-active[data-v-57cce842]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-57cce842],.VPNavScreen.fade-leave-active .container[data-v-57cce842]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-57cce842],.VPNavScreen.fade-leave-to[data-v-57cce842]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-57cce842],.VPNavScreen.fade-leave-to .container[data-v-57cce842]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-57cce842]{display:none}}.container[data-v-57cce842]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-57cce842],.menu+.appearance[data-v-57cce842],.translations+.appearance[data-v-57cce842]{margin-top:24px}.menu+.social-links[data-v-57cce842]{margin-top:16px}.appearance+.social-links[data-v-57cce842]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-bd01e0d5]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-bd01e0d5]{padding-bottom:10px}.item[data-v-bd01e0d5]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-bd01e0d5]{cursor:pointer}.indicator[data-v-bd01e0d5]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-bd01e0d5]{background-color:var(--vp-c-brand-1)}.link[data-v-bd01e0d5]{display:flex;align-items:center;flex-grow:1}.text[data-v-bd01e0d5]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-bd01e0d5]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-bd01e0d5],.VPSidebarItem.level-2 .text[data-v-bd01e0d5],.VPSidebarItem.level-3 .text[data-v-bd01e0d5],.VPSidebarItem.level-4 .text[data-v-bd01e0d5],.VPSidebarItem.level-5 .text[data-v-bd01e0d5]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.text[data-v-bd01e0d5],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-bd01e0d5]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-bd01e0d5],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-bd01e0d5]{color:var(--vp-c-brand-1)}.caret[data-v-bd01e0d5]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-bd01e0d5]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-bd01e0d5]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-bd01e0d5]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-bd01e0d5]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-bd01e0d5],.VPSidebarItem.level-2 .items[data-v-bd01e0d5],.VPSidebarItem.level-3 .items[data-v-bd01e0d5],.VPSidebarItem.level-4 .items[data-v-bd01e0d5],.VPSidebarItem.level-5 .items[data-v-bd01e0d5]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-bd01e0d5]{display:none}.VPSidebar[data-v-ee2efba5]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-ee2efba5]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-ee2efba5]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-ee2efba5]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-ee2efba5]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-ee2efba5]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-ee2efba5]{outline:0}.group+.group[data-v-ee2efba5]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-ee2efba5]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-9d8abc1e]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-843cc1b2]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-843cc1b2]{margin:0 auto;max-width:1152px}.love[data-v-843cc1b2]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-843cc1b2]{width:28px;height:28px;fill:currentColor}.message[data-v-843cc1b2]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-843cc1b2]{padding-top:32px}.action[data-v-843cc1b2]{padding-top:40px;text-align:center}.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-b1cfd8dc]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-b1cfd8dc-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-b1cfd8dc-s],.VPTeamMembers+.VPTeamPageSection[data-v-b1cfd8dc-s]{margin-top:96px}}.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-b1cfd8dc-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-3a0078bd]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-3a0078bd]{padding:32px}.VPTeamMembersItem.small .data[data-v-3a0078bd]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-3a0078bd]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-3a0078bd]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-3a0078bd]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-3a0078bd]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-3a0078bd]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-3a0078bd]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-3a0078bd]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-3a0078bd]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-3a0078bd]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-3a0078bd]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-3a0078bd]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-3a0078bd]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-3a0078bd]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-3a0078bd]{text-align:center}.avatar[data-v-3a0078bd]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-3a0078bd]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-3a0078bd]{margin:0;font-weight:600}.affiliation[data-v-3a0078bd]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-3a0078bd]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-3a0078bd]:hover{color:var(--vp-c-brand-1)}.desc[data-v-3a0078bd]{margin:0 auto}.desc[data-v-3a0078bd] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-3a0078bd]{display:flex;justify-content:center;height:56px}.sp-link[data-v-3a0078bd]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-3a0078bd]:hover,.sp .sp-link.link[data-v-3a0078bd]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-3a0078bd]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.shields{display:inline-block}.home-comment-container{position:relative;margin-top:64px;padding:0 24px}@media (min-width: 640px){.home-comment-container{padding:0 48px}}@media (min-width: 960px){.home-comment-container{padding:0 64px}}.home-comment-container .comment-container{margin:0 auto;max-width:1152px}.twikoo .el-loading-spinner .circular{margin-left:auto;margin-right:auto} diff --git a/assets/update.md.fd0f5639.js b/assets/update.md.fd0f5639.js new file mode 100644 index 000000000..ef8501b34 --- /dev/null +++ b/assets/update.md.fd0f5639.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,Q as t}from"./chunks/framework.7d2df8c6.js";const b=JSON.parse('{"title":"版本更新","description":"","frontmatter":{},"headers":[],"relativePath":"update.md","filePath":"update.md","lastUpdated":null}'),l={name:"update.md"},r=t('

版本更新

不同部署方式的更新方式也不同,请对号入座。更新部署成功后,请不要忘记同时更新前端的 Twikoo CDN 地址中的 x.x.x 数字版本号,使之与云函数版本号相同,然后部署网站。

针对腾讯云一键部署的更新方式

登录环境-我的应用,输入

  • 来源地址:https://github.com/twikoojs/twikoo/tree/main
  • 部署分支:main

应用目录无需填写,点击“确定”,部署完成。

针对腾讯云手动部署的更新方式

登录环境-云函数,点击 twikoo,点击函数代码,打开 package.json 文件,将 "twikoo-func": "x.x.x" 其中的版本号修改为最新版本号,点击“保存并安装依赖”即可。

提示

如果您的云函数是 1.0.0 之前的版本,因为 1.0.0 版本修改了部署步骤,请先参考手动部署,从第 5 步开始,重新创建云函数,再按照此步骤更新。

如果升级后出现无法读取评论列表,云函数报错,请在函数编辑页面,删除 node_modules 目录(删除需要半分钟左右,请耐心等待删除完成),再点击保存并安装依赖。如果仍然不能解决,请删除并重新创建 Twikoo 云函数。

针对腾讯云命令行部署的更新方式

进入 Twikoo 源码目录,执行以下命令更新现有的云函数

sh
yarn deploy -e 您的环境id
yarn deploy -e 您的环境id

针对 Vercel 部署的更新方式

  1. 进入 Vercel 仪表板 - twikoo - Settings - Git
  2. 点击 Connected Git Repository 下方的仓库地址
  3. 打开 package.json,点击编辑
  4. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  5. 部署会自动触发,可以回到 Vercel 仪表板,查看部署状态

针对 Railway 和 Zeabur 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-zeabur 的仓库
  2. 打开 package.json,点击编辑
  3. "tkserver": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对 Netlify 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-netlify 的仓库
  2. 打开 package.json,点击编辑
  3. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对私有部署的更新方式

  1. 停止旧版本 kill $(ps -ef | grep tkserver | grep -v 'grep' | awk '{print $2}')
  2. 拉取新版本 npm i -g tkserver@latest
  3. 启动新版本 nohup tkserver >> tkserver.log 2>&1 &

针对私有部署 (Docker) 的更新方式

  1. 拉取新版本 docker pull imaegoo/twikoo
  2. 停止旧版本容器 docker stop twikoo
  3. 删除旧版本容器 docker rm twikoo
  4. 启动新版本容器

自动更新

考虑到可用性和安全性问题,Twikoo 没有实现自动更新,也没有计划实现自动更新。如果您希望实现自动更新,可以参考 MHuiG 基于 Github 工作流的 twikoo-update 的实现方式。

',24),i=[r];function c(s,n,d,p,h,u){return o(),a("div",null,i)}const m=e(l,[["render",c]]);export{b as __pageData,m as default}; diff --git a/assets/update.md.fd0f5639.lean.js b/assets/update.md.fd0f5639.lean.js new file mode 100644 index 000000000..890939d82 --- /dev/null +++ b/assets/update.md.fd0f5639.lean.js @@ -0,0 +1 @@ +import{_ as e,o,c as a,Q as t}from"./chunks/framework.7d2df8c6.js";const b=JSON.parse('{"title":"版本更新","description":"","frontmatter":{},"headers":[],"relativePath":"update.md","filePath":"update.md","lastUpdated":null}'),l={name:"update.md"},r=t("",24),i=[r];function c(s,n,d,p,h,u){return o(),a("div",null,i)}const m=e(l,[["render",c]]);export{b as __pageData,m as default}; diff --git a/backend.html b/backend.html new file mode 100644 index 000000000..0130d4980 --- /dev/null +++ b/backend.html @@ -0,0 +1,51 @@ + + + + + + 云函数部署 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

云函数部署

部署方式
推荐度描述
腾讯云一键部署★☆☆☆☆虽然方便,但是仅支持按量计费环境——也就是说,一键部署的环境,当免费资源用尽后,将会产生费用。且按量计费环境无法切换为包年包月环境。免费额度数据库读操作数只有 500 次 / 天,无法支撑 Twikoo 的运行需求
腾讯云手动部署★★☆☆☆手动部署到腾讯云云开发环境,在中国大陆访问速度较快。需要付费购买环境才能部署。
腾讯云命令行部署★☆☆☆☆仅针对有 Node.js 经验的开发者。
Vercel 部署★★★☆☆适用于想要免费部署的用户,在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度。
Railway 部署★★☆☆☆有免费额度但不足以支持一个月连续运行,部署简单,适合全球访问。
Zeabur 部署★☆☆☆☆需要绑定支付宝或信用卡,部署简单,适合中国大陆访问,免费计划环境随时可能会被删除。
Netlify 部署★★★★☆有充足的免费额度,中国大陆访问速度不错。
私有部署★★☆☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。
私有部署 (Docker)★★★☆☆适用于有服务器的用户,需要自行申请 HTTPS 证书。

腾讯云一键部署

  1. 点击以下按钮将 Twikoo 一键部署到云开发
    部署到云开发
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”

腾讯云手动部署

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐,点击“立即购买”,按提示创建好环境。

提示

  • 推荐创建上海环境。如选择广州环境,需要在 twikoo.init() 时额外指定环境 region: "ap-guangzhou"
  • 环境名称自由填写
  • 推荐选择计费方式包年包月,套餐版本基础版 1,超出免费额度不会收费
  • 如果提示选择“应用模板”,请选择“空模板”
  1. 进入云开发控制台
  2. 进入环境-登录授权,启用“匿名登录”
  3. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  4. 进入环境-云函数,点击“新建云函数”
  5. 函数名称请填写:twikoo,创建方式请选择:空白函数,运行环境请选择:Nodejs 10.15,函数内存请选择:128MB,点击“下一步”
  6. 清空输入框中的示例代码,复制以下代码、粘贴到“函数代码”输入框中,点击“确定”
js
exports.main = require('twikoo-func').main
exports.main = require('twikoo-func').main
  1. 创建完成后,点击“twikoo"进入云函数详情页,进入“函数代码”标签,点击“文件 - 新建文件”,输入 package.json,回车
  2. 复制以下代码、粘贴到代码框中,点击“保存并安装依赖”
json
{ "dependencies": { "twikoo-func": "1.6.22" } }
{ "dependencies": { "twikoo-func": "1.6.22" } }

腾讯云命令行部署

注意

  • 请确保您已经安装了 Node.js
  • 请将命令、代码中“您的环境id”替换为您自己的环境id
  • 第 7 步会弹出浏览器要求授权,需在有图形界面的系统下进行
  • 请勿在 Termux 下操作。虽然可以部署成功,但是使用时会报错 [FUNCTIONS_EXECUTE_FAIL] Error: EACCES: permission denied, open '/var/user/index.js'

如果您打算部署到一个现有的云开发环境,请直接从第 3 步开始。

  1. 进入云开发CloudBase活动页面,滚动到“新用户专享”部分,选择适合的套餐(一般 0 元套餐即可),点击“立即购买”,按提示创建好环境。
  2. 进入云开发控制台
  3. 进入环境-登录授权,启用“匿名登录”
  4. 进入环境-安全配置,将网站域名添加到“WEB安全域名”
  5. 克隆本仓库
sh
git clone https://github.com/twikoojs/twikoo.git # 或 git clone https://e.coding.net/imaegoo/twikoo/twikoo.git
+cd twikoo
git clone https://github.com/twikoojs/twikoo.git # 或 git clone https://e.coding.net/imaegoo/twikoo/twikoo.git
+cd twikoo

如果您没有安装 Git,也可以从 Release 页面下载最新的 Source code
如果您所在的地区访问 Github 速度慢,也可以尝试另一个仓库地址:https://imaegoo.coding.net/public/twikoo/twikoo/git

  1. 安装依赖项
sh
npm install -g yarn # 已安装 yarn 可以跳过此步
+yarn install
npm install -g yarn # 已安装 yarn 可以跳过此步
+yarn install
  1. 授权云开发环境(此命令会弹出浏览器要求授权,需在有图形界面的系统下进行)
sh
yarn run login
yarn run login
  1. 自动部署
sh
yarn deploy -e 您的环境id
yarn deploy -e 您的环境id

Vercel 部署

注意

Vercel 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

默认域名 *.vercel.app 在中国大陆访问速度较慢甚至无法访问,绑定自己的域名可以提高访问速度

查看视频教程

  1. 申请 MongoDB 账号
  2. 创建免费 MongoDB 数据库,区域推荐选择 AWS / N. Virginia (us-east-1)
  3. 在 Database Access 页面点击 Add New Database User 创建数据库用户,Authentication Method 选 Password,在 Password Authentication 下设置数据库用户名和密码,用户名和密码可包含数字和大小写字母,请勿包含特殊符号。点击 Database User Privileges 下方的 Add Built In Role,Select Role 选择 Atlas Admin,最后点击 Add User

  1. 在 Network Access 页面点击 Add IP Address,Access List Entry 输入 0.0.0.0/0(允许所有 IP 地址的连接),点击 Confirm

  1. 在 Database 页面点击 Connect,连接方式选择 Drivers,并记录数据库连接字符串,请将连接字符串中的 <username>:<password> 修改为刚刚创建的数据库 用户名:密码

  1. 申请 Vercel 账号
  2. 点击以下按钮将 Twikoo 一键部署到 Vercel

  1. 进入 Settings - Environment Variables,添加环境变量 MONGODB_URI,值为前面记录的数据库连接字符串
  2. 进入 Deployments , 然后在任意一项后面点击更多(三个点) , 然后点击Redeploy , 最后点击下面的Redeploy
  3. 进入 Overview,点击 Domains 下方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示
  4. Vercel Domains(包含 https:// 前缀,例如 https://xxx.vercel.app)即为您的环境 id

Railway 部署

注意

Railway 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Railway 申请并登录账号,点击 New Project - Provision MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Railway 点击 New - GitHub Repo - Configure GitHub App - 授权 GitHub - 选择刚才 fork 的仓库,等待部署完成
  4. 点开环境卡片 - Variables - New Variable,左边输入 PORT 右边输入 8080 然后点 Add
  5. 同样地,添加 MongoDB 相关环境变量 - New Variable - Add Reference - MONGO* - Add,重复步骤以添加 MONGOHOSTMONGOPASSWORDMONGOPORTMONGOUSERMONGO_URL 环境变量。
  6. 点开环境卡片 - Settings - Environment - Domains,绑定一个域名(例如 mytwikoo.up.railway.app
  7. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.up.railway.app

Zeabur 部署

注意

Zeabur 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

请一定要创建 MongoDB,不创建 MongoDB 也能正常使用,但重新部署后数据会丢失!

  1. Zeabur 申请并登录账号,点击部署新服务 - 部署其他服务 - 部署 MongoDB,名称随意
  2. 打开 twikoojs/twikoo-zeabur 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Zeabur 点击部署新服务 - 部署你的源代码 - 授权 GitHub - 选择刚才 fork 的仓库,名称随意

无需配置数据库连接字符串! Zeabur 已自动配置

  1. 部署好后点开环境卡片 - 设置 - 域名,绑定一个域名(例如 mytwikoo.zeabur.app
  2. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://mytwikoo.zeabur.app

Netlify 部署

注意

Netlify 部署的环境需配合 1.4.0 以上版本的 twikoo.js 使用

Netlify 免费等级(Functions Level 0)支持每月 125,000 请求次数和 100 小时函数计算时长

  1. 申请 MongoDB 账号
  2. 创建免费 MongoDB 数据库,区域推荐选择 AWS / N. Virginia (us-east-1)
  3. 在 Database Access 页面点击 Add New Database User 创建数据库用户,Authentication Method 选 Password,在 Password Authentication 下设置数据库用户名和密码,用户名和密码可包含数字和大小写字母,请勿包含特殊符号。点击 Database User Privileges 下方的 Add Built In Role,Select Role 选择 Atlas Admin,最后点击 Add User

  1. 在 Network Access 页面点击 Add IP Address,Access List Entry 输入 0.0.0.0/0(允许所有 IP 地址的连接),点击 Confirm

  1. 在 Database 页面点击 Connect,连接方式选择 Drivers,并记录数据库连接字符串,请将连接字符串中的 <username>:<password> 修改为刚刚创建的数据库 用户名:密码

  1. 申请并登录 Netlify 账号,创建一个 Team
  2. 打开 twikoojs/twikoo-netlify 点击 fork 将仓库 fork 到自己的账号下
  3. 回到 Netlify,点击 Add new site - Import an existing project

  1. 点击 Deploy with GitHub,如果未授权 GitHub 账号,先授权,然后选择前面 fork 的 twikoo-netlify 项目

  1. 点击 Add environment variables - New variable,Key 输入 MONGODB_URI,Value 输入前面记录的数据库连接字符串,点击 Deploy twikoo-netlify

  1. 部署完成后,点击 Domain settings - 右侧 Options - Edit site name,可以设置属于自己的三级域名(https://xxx.netlify.app

  1. 进入 Site overview,点击上方的链接,如果环境配置正确,可以看到 “Twikoo 云函数运行正常” 的提示

  1. 云函数地址(包含 https:// 前缀和 /.netlify/functions/twikoo 后缀,例如 https://xxx.netlify.app/.netlify/functions/twikoo)即为您的环境 id

私有部署

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署对服务器系统没有要求,Windows、Ubuntu、CentOS、macOS 等常用系统均支持。

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

  1. 服务端下载安装 Node.js
  2. 安装 Twikoo server: npm i -g tkserver
  3. 根据需要配置环境变量,所有的环境变量都是可选的
名称描述默认值
MONGODB_URIMongoDB 数据库连接字符串,不传则使用 lokijsnull
MONGO_URLMongoDB 数据库连接字符串,不传则使用 lokijsnull
TWIKOO_DATAlokijs 数据库存储路径./data
TWIKOO_PORT端口号8080
TWIKOO_THROTTLEIP 请求限流,当同一 IP 短时间内请求次数超过阈值将对该 IP 返回错误250
TWIKOO_LOCALHOST_ONLYtrue时只监听本地请求,使得 nginx 等服务器反代之后不暴露原始端口null
TWIKOO_LOG_LEVEL日志级别,支持 verbose / info / warn / errorinfo
TWIKOO_IP_HEADERS在一些特殊情况下使用,如使用了CloudFlare CDN 它会将请求 IP 写到请求头的 cf-connecting-ip 字段上,为了能够正确的获取请求 IP 你可以写成 ['headers.cf-connecting-ip'][]
  1. 启动 Twikoo server: tkserver
  2. 访问 http://服务端IP:8080 测试服务是否启动成功
  3. 配置前置代理实现 HTTPS 访问(可以用 Nginx、负载均衡或 Cloudflare 等)
  4. 到博客配置文件中配置 envId 为 https:// 加域名(例如 https://twikoo.yourdomain.com

提示

  1. Linux 服务器可以用 nohup tkserver >> tkserver.log 2>&1 & 命令后台启动
  2. 数据默认在 data 目录,请注意定期备份数据

私有部署 (Docker)

注意

私有部署的环境需配合 1.6.0 或以上版本的 twikoo.js 使用

私有部署涉及终端操作、申请证书、配置反向代理或负载均衡等高级操作,如果对这些不太了解,建议优先选择其他方式部署。

Docker

sh
docker run --name twikoo -e TWIKOO_THROTTLE=1000 -p 8080:8080 -v ${PWD}/data:/app/data -d imaegoo/twikoo
docker run --name twikoo -e TWIKOO_THROTTLE=1000 -p 8080:8080 -v ${PWD}/data:/app/data -d imaegoo/twikoo

Docker Compose

yml
version: '3'
+services:
+  twikoo:
+    image: imaegoo/twikoo
+    container_name: twikoo
+    restart: unless-stopped
+    ports:
+      - 8080:8080
+    environment:
+      TWIKOO_THROTTLE: 1000
+    volumes:
+      - ./data:/app/data
version: '3'
+services:
+  twikoo:
+    image: imaegoo/twikoo
+    container_name: twikoo
+    restart: unless-stopped
+    ports:
+      - 8080:8080
+    environment:
+      TWIKOO_THROTTLE: 1000
+    volumes:
+      - ./data:/app/data

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/cms.html b/cms.html new file mode 100644 index 000000000..3b278d8ef --- /dev/null +++ b/cms.html @@ -0,0 +1,25 @@ + + + + + + 反垃圾 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/configuration.html b/configuration.html new file mode 100644 index 000000000..f8cf7ac7a --- /dev/null +++ b/configuration.html @@ -0,0 +1,25 @@ + + + + + + 配置 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

配置

注意

因图形化配置界面已上线,此文档已废弃且不再维护,其中的内容可能已经过时

  • 配置是可选的,即使没有配置也可以使用。
  • 请确保 config 表的权限不是“所有用户可读”,以保证 SMTP 密码等信息不会泄露。
    不过放心,默认权限是安全的,您不需要更改。
  • 请将配置项放在一条数据记录中。

通用

SITE_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站

博客、站点名称。

SITE_URL

类型: String
默认值: null
必要性: false
示例: https://www.imaegoo.com

博客、站点地址。

BLOGGER_EMAIL

类型: String
默认值: null
必要性: false
示例: 12345@qq.com

博主的邮箱地址,用于邮件通知、博主标识。

反垃圾

AKISMET_KEY

类型: String
默认值: null
必要性: false
示例: 8651783ed123

反垃圾评论 API key。

微信通知

SC_SENDKEY

类型: String
默认值: null
必要性: false
示例: SCT1364TKdsiGjGvyAZNYDVnuHW12345

Server酱微信推送的 SCKEY

邮件通知

SENDER_EMAIL

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱地址。对于大多数邮箱服务商,SENDER_EMAIL 必须和 SMTP_USER 保持一致,否则无法发送邮件。

SENDER_NAME

类型: String
默认值: null
必要性: false
示例: 虹墨空间站评论提醒

邮件通知标题。

SMTP_SERVICE

类型: String
默认值: null
必要性: false
示例: qiye.aliyun

邮件通知邮箱服务商。
完整列表请参考:Supported services

SMTP_USER

类型: String
默认值: null
必要性: false
示例: blog@imaegoo.com

邮件通知邮箱用户名。

SMTP_PASS

类型: String
默认值: null
必要性: false
示例: password

邮件通知邮箱密码,QQ邮箱请填写授权码。

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/api.html b/en/api.html new file mode 100644 index 000000000..aaf98edba --- /dev/null +++ b/en/api.html @@ -0,0 +1,133 @@ + + + + + + API reference | Twikoo Docs + + + + + + + + + + + + + + +
Skip to content

API reference

Through Twikoo API, theme developers can implement some special features, such as displaying the number of article comments in the article list, displaying the latest comments on the home page, etc.

It is not necessary to execute twikoo.init() before calling the Twikoo API.

Get comments count

Get the number of article comments in batch.

Version

>= 0.2.7

Example

js
twikoo.getCommentsCount({
+  envId: 'Environment ID', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  urls: [ // List of article paths without protocols, domains and parameters. It is a mandatory parameter
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // Whether the number of comments includes replies, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // example: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});
twikoo.getCommentsCount({
+  envId: 'Environment ID', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  urls: [ // List of article paths without protocols, domains and parameters. It is a mandatory parameter
+    '/2020/10/post-1.html',
+    '/2020/11/post-2.html',
+    '/2020/12/post-3.html'
+  ],
+  includeReply: false // Whether the number of comments includes replies, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // example: [
+  //   { url: '/2020/10/post-1.html', count: 10 },
+  //   { url: '/2020/11/post-2.html', count: 0 },
+  //   { url: '/2020/12/post-3.html', count: 20 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

Get recent comments

Get the latest comments.

Version

>= 0.2.7

Example

js
twikoo.getRecentComments({
+  envId: '您的环境id', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  pageSize: 10, // Get how many bars, the default parameter is 10, the maximum parameter is 100
+  includeReply: false // Whether to include the latest reply, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // Returns Array with the latest comments
+  // * id: comment ID
+  // * url: address of the comment
+  // * nick: nickname
+  // * mailMd5: The MD5 value of the mailbox, which can be used to display the avatar
+  // * link: URL
+  // * comment: the content of the comment in HTML format
+  // * commentText: comment content in plain text format
+  // * created: comment time, in millisecond timestamp format
+  // * avatar: the address of the avatar (new in 0.2.9)
+  // * relativeTime: relative comment time, e.g. "1 hour ago" (new in 0.2.9)
+  // Return example: [ // order from new to old
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});
twikoo.getRecentComments({
+  envId: '您的环境id', // Tencent CloudBase Environment ID
+  // region: 'ap-guangzhou', // Environment locale, default is ap-shanghai, if your environment locale is not Shanghai, you need to pass this parameter
+  pageSize: 10, // Get how many bars, the default parameter is 10, the maximum parameter is 100
+  includeReply: false // Whether to include the latest reply, the default parameter is false
+}).then(function (res) {
+  console.log(res);
+  // Returns Array with the latest comments
+  // * id: comment ID
+  // * url: address of the comment
+  // * nick: nickname
+  // * mailMd5: The MD5 value of the mailbox, which can be used to display the avatar
+  // * link: URL
+  // * comment: the content of the comment in HTML format
+  // * commentText: comment content in plain text format
+  // * created: comment time, in millisecond timestamp format
+  // * avatar: the address of the avatar (new in 0.2.9)
+  // * relativeTime: relative comment time, e.g. "1 hour ago" (new in 0.2.9)
+  // Return example: [ // order from new to old
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 },
+  // { id: '', url: '', nick: '', mailMd5: '', link: '', comment: '', commentText: '', created: 0 }
+  // ]
+}).catch(function (err) {
+  // If an error occurs
+  console.error(err);
+});

On Twikoo loaded

Callback function after Twikoo is successfully mounted.
It will not be triggered in case of environment ID error, network exception, mount failure, etc.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo is ready to go!');
+});
twikoo.init({
+  ......
+}).then(function () {
+  console.log('Twikoo is ready to go!');
+});

On comment loaded

Callback function after comments are loaded successfully.
It will also be triggered when the comment is automatically refreshed after posting and when the next page of comments is loaded.
It will not be triggered when the comment fails to load.

Version

>= 0.5.2

Example

js
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('Comment loading complete');
+  }
+});
twikoo.init({
+  ......,
+  onCommentLoaded: function () {
+    console.log('Comment loading complete');
+  }
+});

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/backend.html b/en/backend.html new file mode 100644 index 000000000..7d2102e1c --- /dev/null +++ b/en/backend.html @@ -0,0 +1,25 @@ + + + + + + Twikoo Docs | Twikoo Docs + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/faq.html b/en/faq.html new file mode 100644 index 000000000..a99d0dbe0 --- /dev/null +++ b/en/faq.html @@ -0,0 +1,58 @@ + + + + + + FAQ | Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content

FAQ

How do I change my avatar?

https://gravatar.com Register and set your avatar by email and leave the same email when commenting.

Visitors can also comment by entering their digital QQ email address and using their QQ avatar.

How do I change or reset the administrator password?

云开发控制台Edit the configuration, delete the config.ADMIN_PASS configuration item, and then go to the Twikoo administration panel to reset the password.

How to get the private key file of the admin panel?

  1. 环境-登录授权Click "Private Key Download" on the right of "Custom Login" to download the private key file
  2. Open the private key file with a text editor and copy all the contents
  3. Click the "pinion" (settings) icon in the comment window, paste the contents of the private key file, and set the administrator password

How to turn on article visit statistics?

You can add where you need to show the number of article visits:

html
<span id="twikoo_visitors">0</span>
<span id="twikoo_visitors">0</span>

to display the number of visits. We do not support site-wide visit statistics at the moment.

How can I test if the Akismet anti-spam configuration is in effect?

Please fill in viagra-test-123 as a nickname, or akismet-guaranteed-spam@example.com as an email address to post a comment, which will definitely be considered as a spam comment.

Note that due to the slow response time of the Akismet service (about 6 seconds), which affects the user experience, Twikoo adopts a "release first, detect later" policy, and spam comments will be visible for a short time after they are posted.

How are free resources calculated?

环境总览See resource usage. twikoo consumes database and cloud functions, both with a free usage of -

  • Database: 50,000 reads/day, 50,000 writes/day
  • Cloud functions: 40,000 GBs/month

The memory consumption of Twikoo cloud functions is constant at 0.1GB, which means that Twikoo cloud functions have a running time of up to 400,000 seconds per month, and the bottleneck of free resources is mainly in the daily read limit of the database. It is recommended that webmasters pay attention to the usage of free resources.

How do I enable Katex support?

Twikoo supports Katex formulas, but to limit the package size of Twikoo, Twikoo does not have the full Katex built-in, you need to load katex.js additionally in the page.

example

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

After loading, you can send $$c = \pm\sqrt{a^2 + b^2}$$ to test the effect.

katex

You can also pass in a custom katex configuration during twikoo.init, see Katex Auto-render Extension for details.

js
twikoo.init({
+  envId: 'Environment id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\(', right: '\\)', display: false },
+      { left: '\\[', right: '\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});
twikoo.init({
+  envId: 'Environment id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\(', right: '\\)', display: false },
+      { left: '\\[', right: '\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

How to configure anti-spam?

Using Tencent Cloud Content Security Service

Twikoo supports access to Tencent Cloud Text Content Detection, which uses deep learning technology to identify harmful content involving pornography, politics, terrorism, etc. It also supports user-configurable thesaurus to combat customized offending text.

Tencent Cloud text content detection is a paid service, offering a 1-month free trial, after which the price is 25 RMB per 10,000 entries. If you don't have high requirements for anti-spam comments, you can also use the free Akismet.

How to apply for Tencent Cloud Text Content Inspection?

  1. Visit Tencent Cloud Console - Text Content Security to open the text content security service
  2. Visit Tencent Cloud Console - User List, click New User, and click Quick Create.
  3. Enter the user name, select "Programmatic Access" as the access method, cancel "AdministratorAccess" as the user privilege, and only check the box "QcloudCMSFullAccess". QcloudCMSFullAccess".
  4. Click "Create User". 5.
  5. Copy the "SecretId" and "SecretKey" from the "Successful New User" page to the Twikoo administration panel Configure them in the "Anti-Spam" module
  6. Test the anti-spam effect

After success, webmasters can configure custom text content filtering in Tencent Cloud Console - Custom Library Management.

Using Akismet Anti-Spam Service

Akismet (Automattic Kismet) is a widely used spam filtering system by Matt Mullenweg, the founder of WordPress, Akismet is also the default plugin installed in WordPress and is very widely used. The goal of the design is to help blog sites to filter spam messages.

  1. Register akismet.com
  2. Select Akismet Personal subscription, copy the Akismet API Key and configure it in the Twikoo admin panel "Anti-Spam" module

Error encountered in login administration panel AUTH_INVALID_CUSTOM_LOGIN_TICKET

Generally, after configuring the login private key, the login private key is downloaded again, which causes the previously configured login private key to be invalid.
Solution: Go to Cloud Development Console, database, delete the config, and then reconfigure the private key.

Can't receive emails?

If it is a cloud function deployed by Vercel, please configure foreign mail service providers to avoid being judged as spam behavior by mail service providers. If it is other reasons, please go to Twikoo management panel, find mail test function, enter your personal mailbox and troubleshoot the reasons according to the test results.

In order to avoid performance problems caused by frequent mailbox checking, the mail configuration has a cache of about 10 minutes, if you are sure the configuration is fine but the test fails, you can wait for 10 minutes and then test again.

Vercel can't upload images?

The Tencent Cloud environment comes with cloud storage, so you can upload images directly in the Tencent Cloud environment, and the images are saved in the cloud storage. However, Vercel environment does not, the upload image function relies on third party image bed, please configure the image bed in the admin panel, Twikoo supports the following image bed:

BedAddressFeatures
qcloudNoneTencent Cloud environment comes with it, can be viewed in Cloud Development - Cloud Storage
7buhttps://7bu.topGo to No Bed, powered by 杜老师, no free packages
smmshttps://sm.msSMMS image bed, there is a free package, please register your account, IMAGE_CDN_TOKEN can be obtained in Dashboard
lsky-proPrivate DeploymentLankenGraphics 2.0 version, IMAGE_CDN please configure the URL address of the home page of the graph bed (such as https://7bu.top), IMAGE_CDN_TOKEN get way please refer to the tutorial 杜老师 said the graph bed: new version Go not to the bed Token acquisition and emptying, the format of the obtained token should be 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5)

Can it be deployed privately?

Yes.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/frontend.html b/en/frontend.html new file mode 100644 index 000000000..6fdc3738d --- /dev/null +++ b/en/frontend.html @@ -0,0 +1,25 @@ + + + + + + Twikoo Docs | Twikoo Docs + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/index.html b/en/index.html new file mode 100644 index 000000000..706422a11 --- /dev/null +++ b/en/index.html @@ -0,0 +1,25 @@ + + + + + + Twikoo | A simple, safe, free comment system + + + + + + + + + + + + + + +
Skip to content

Twikoo

Comment system

Simple, safe, free

Twikoo

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/intro.html b/en/intro.html new file mode 100644 index 000000000..bf8a1ad92 --- /dev/null +++ b/en/intro.html @@ -0,0 +1,30 @@ + + + + + + Twikoo Docs | Twikoo Docs + + + + + + + + + + + + + + + +
Skip to content
Twikoo
       

A simple, safe, free comment system.
简体中文 | English

This document is for American English. This document has many bugs.

Features

Simple

  • Free Build.(Using CloudBase / Vercel / self-hosted as the commenting backend)
  • Simple Deployment.(Support CloudBase / Vercel one-click deployment)

Easy to use

  • Support reply, like.
  • No additional adaptations, support with light theme and dark theme use.
  • Support API , batch get article comment count, latest comments.
  • Visitors entering QQ number in the nickname field will automatically complete the QQ nickname and QQ email.
  • Visitors fill in the digital QQ e-mail, will use the QQ avatar as the comment avatar.
  • Support the comment to paste pictures.(Can be disabled)
  • Support inserting pictures.(Can be disabled)
  • Support 7bu image bed, Tencent CloudBase image bed.
  • Support inserting emoji.(Can be disabled)
  • Support Ctrl + Enter reply.
  • Comments are saved in draft in real time and will not be lost when refreshed.
  • Support Katex formulas.
  • Support for code highlighting by language.

Security

  • Privacy and information security. (sensitive fields (email, IP, environment configuration, etc.) are not leaked through Tencent cloud function control)
  • Support for Akismet spam comment detection.(View Details akismet.com
  • Support Tencent Cloud content security spam comment detection.(View Details Tencent Cloud Content Security
  • Support manual review mode.
  • Anti XSS Attack.
  • Support for limiting the maximum number of comments per IP per 10 minutes.

notification

  • E-mail(Visitors and Blogger)
  • Wechat(only Blogger, Server酱
  • QQ(only Blogger, Qmsg酱

Personalization

  • Background image.
  • the "blogger" logo text.
  • Notification Email Template.
  • Comment prompt message.(placeholder)
  • emoji(OwO 的数据格式
  • 【Nickname】 【Email】 【Website】 Required / Optional
  • Code highlighting theme.

Management

  • Embedded panel with password login to easily view comments, hide comments, delete comments and modify configuration.
  • Support to hide the management portal and show it by entering a secret code.
  • Support for importing comments from Valine, Artalk, Disqus.

Disadvantages

  • IE is not supported.

Preview

Comments

Comments

Management

Management

Notification

Notification

Quick Start

Deploy

View Details

If you want to get updates, make suggestions and participate in the test, welcome to join the discussion group:1080829142 (QQ)
1080829142

Special Thanks

Icon design:Maemo Lee

Release notes & plans

Update logs & Development Plan

Development

If you want to develop locally for a second time, you can refer to the following commands:

sh
yarn dev # (http://localhost:9820/demo.html)
+yarn lint 
+yarn build # (dist/twikoo.all.min.js)
yarn dev # (http://localhost:9820/demo.html)
+yarn lint 
+yarn build # (dist/twikoo.all.min.js)

If your changes can help more people, feel free to submit a Pull Request!

I18N

Support Simplified Chinese, Traditional Chinese, English. translate Pull Request.

License

FOSSA Status

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/link.html b/en/link.html new file mode 100644 index 000000000..8d26361b0 --- /dev/null +++ b/en/link.html @@ -0,0 +1,25 @@ + + + + + + Links | Twikoo Docs + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/quick-start.html b/en/quick-start.html new file mode 100644 index 000000000..6179e2ebb --- /dev/null +++ b/en/quick-start.html @@ -0,0 +1,25 @@ + + + + + + Quick start | Twikoo Docs + + + + + + + + + + + + + + +
Skip to content

Quick start

Tip

The English document is being built. Please refer to the Chinese document.

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/en/update.html b/en/update.html new file mode 100644 index 000000000..7ecf4cbf7 --- /dev/null +++ b/en/update.html @@ -0,0 +1,25 @@ + + + + + + Twikoo Docs | Twikoo Docs + + + + + + + + + + + + + + +
Skip to content

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/faq.html b/faq.html new file mode 100644 index 000000000..d80935828 --- /dev/null +++ b/faq.html @@ -0,0 +1,58 @@ + + + + + + 常见问题 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content

常见问题

如何修改头像?

请前往 https://cravatar.cn 通过邮箱注册并设定头像,评论时,请留下相同的邮箱。

访客还可以通过输入数字 QQ 邮箱地址,使用 QQ 头像发表评论。

如何修改、重置管理员密码?

腾讯云请前往云开发控制台,Vercel 请前往 MongoDB,私有部署请直接编辑 data/db.json.1,编辑配置,删除 config.ADMIN_PASS 配置项,然后前往 Twikoo 管理面板重新设置密码。

如何获得管理面板的私钥文件?

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

如何开启文章访问量统计?

您可以在需要展示文章访问量的地方添加:

html
<span id="twikoo_visitors">0</span>
<span id="twikoo_visitors">0</span>

来展示访问量。暂不支持全站访问量统计。

如何启用 Katex 支持?

Twikoo 支持 Katex 公式,但为了限制 Twikoo 的包大小,Twikoo 没有内置完整的 Katex,您需要在页面中额外加载 katex.js

html
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>
<head>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
+  <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"></script>
+</head>

载入后,您可以发送 $$c = \pm\sqrt{a^2 + b^2}$$ 测试效果。

katex

您还可以在 twikoo.init 时传入自定义 katex 配置,详细配置请查看 Katex Auto-render Extension

js
twikoo.init({
+  envId: '您的环境id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\(', right: '\\)', display: false },
+      { left: '\\[', right: '\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});
twikoo.init({
+  envId: '您的环境id',
+  el: '#tcomment',
+  katex: {
+    delimiters: [
+      { left: '$$', right: '$$', display: true },
+      { left: '$', right: '$', display: false },
+      { left: '\\(', right: '\\)', display: false },
+      { left: '\\[', right: '\\]', display: true }
+    ],
+    throwOnError: false
+  }
+});

如何配置反垃圾?

使用腾讯云内容安全服务

Twikoo 支持接入腾讯云文本内容检测,使用深度学习技术,识别涉黄、涉政、涉恐等有害内容,同时支持用户配置词库,打击自定义的违规文本。

腾讯云文本内容检测是付费服务,提供 1 个月的免费试用,之后价格为 25 元/万条。如果您对反垃圾评论要求不高,也可以使用免费的 Akismet。

如何申请腾讯云文本内容检测

  1. 访问腾讯云控制台-文本内容安全,开通文本内容安全服务
  2. 访问腾讯云控制台-用户列表,点击新建用户,点击快速创建
  3. 输入用户名,访问方式选择“编程访问”,用户权限取消“AdministratorAccess”,只勾选“QcloudCMSFullAccess”
  4. 点击“创建用户”
  5. 复制“成功新建用户”页面的“SecretId”和“SecretKey”,到 Twikoo 管理面板“反垃圾”模块中配置
  6. 测试反垃圾效果

成功后,站长可以在腾讯云控制台-自定义库管理配置自定义文本内容过滤。

使用 Akismet 反垃圾服务

Akismet (Automattic Kismet) 是应用广泛的一个垃圾留言过滤系统,其作者是大名鼎鼎的 WordPress 创始人 Matt Mullenweg,Akismet 也是 WordPress 默认安装的插件,其使用非常广泛,设计目标便是帮助博客网站来过滤垃圾留言。

  1. 注册 akismet.com
  2. 选择 Akismet Personal 订阅,复制得到的 Akismet API Key,到 Twikoo 管理面板“反垃圾”模块中配置

如何测试 Akismet 反垃圾配置是否生效?

请填写 viagra-test-123 作为昵称,或填写 akismet-guaranteed-spam@example.com 作为邮箱,发表评论,这条评论将一定会被视为垃圾评论。

需要注意的是,由于 Akismet 服务响应速度较慢(大约 6 秒),影响用户体验,Twikoo 采取 “先放行,后检测” 的策略,垃圾评论会在发表后短暂可见。

登录管理面板遇到错误 AUTH_INVALID_CUSTOM_LOGIN_TICKET

一般是配置好登录私钥之后,又重新下载了登录私钥,导致之前配置的登录私钥失效了。
解决方法:到云开发控制台,数据库,删掉 config,然后重新配置私钥。

收不到提醒邮件?

如果是 Vercel 部署的云函数,请配置国外邮件服务商,避免被邮件服务商判定为垃圾邮件行为。如果是其他原因,请前往 Twikoo 管理面板,找到邮件测试功能,输入个人邮箱,根据测试结果排查原因。

为了避免频繁检查邮箱带来的性能问题,邮件配置有 10 分钟左右的缓存,如果确定配置没有问题,但测试失败,可以等待 10 分钟后再测试。

由于博主发表评论时,不会通知博主,如果您想实际测试通知功能,请注销管理面板后用非博主邮箱发表或回复评论。

Vercel、私有部署无法上传图片?

腾讯云环境自带云存储,所以腾讯云环境下可以直接上传图片,图片保存在云存储中。然而 Vercel 环境没有,上传图片功能依赖第三方图床,请在管理面板中配置图床,Twikoo 支持以下图床:

图床地址特点
qcloud腾讯云环境自带,可在云开发 - 云存储中查看
7buhttps://7bu.top去不图床,由杜老师提供支持,无免费套餐
smmshttps://sm.msSMMS 图床,有免费套餐,请自行注册账号,IMAGE_CDN_TOKEN 可在 Dashboard 中获取
lsky-pro私有部署兰空图床 2.0 版本,IMAGE_CDN 请配置图床首页 URL 地址(如 https://7bu.top),IMAGE_CDN_TOKEN 获取方式请参考教程 杜老师说图床:新版本去不图床 Token 的获取与清空,获取到的 token 格式应为 1|1bJbwlqBfnggmOMEZqXT5XusaIwqiZjCDs7r1Ob5

私有部署能连接自己的数据库吗?

Twikoo 私有部署版默认使用内置数据库:LokiJS 数据库,支持的数据库容量大约为 1 GB,不需要连接外部数据库,数据存储在启动 twikoo 时所在目录下的 data 目录,您可以直接复制该目录以完成数据备份。

如果您有 MongoDB 实例,可以连接 MongoDB 作为外部数据库,只需配置环境变量 MONGODB_URI 为数据库连接地址即可,如:mongodb://<username>:<password>@<host>/

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/frontend.html b/frontend.html new file mode 100644 index 000000000..35f4f2023 --- /dev/null +++ b/frontend.html @@ -0,0 +1,59 @@ + + + + + + 前端部署 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

前端部署

在 Hexo 中使用

Hexo Butterfly 主题使用

请参考 Butterfly 安裝文檔(四) 主題配置-2 进行配置

Hexo Keep 主题使用

请参考 hexo-theme-keep/_config.yml 进行配置

Hexo Volantis 主题使用

请参考 hexo-theme-volantis/_config.yml 进行配置

Hexo Ayer 主题使用

请参考 hexo-theme-ayer/_config.yml 进行配置

Hexo NexT 主题使用

暂不支持 NexT 8 以下的版本,请先升级到 NexT 8。然后在 Hexo 项目根目录执行

sh
# For NexT version >= 8.0.0 && < 8.4.0
+npm install hexo-next-twikoo@1.0.0
+# For NexT version >= 8.4.0
+npm install hexo-next-twikoo@1.0.3
# For NexT version >= 8.0.0 && < 8.4.0
+npm install hexo-next-twikoo@1.0.0
+# For NexT version >= 8.4.0
+npm install hexo-next-twikoo@1.0.3

然后在配置中添加

yml
twikoo:
+  enable: true
+  visitor: true
+  envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  # region: ap-guangzhou # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
twikoo:
+  enable: true
+  visitor: true
+  envId: xxxxxxxxxxxxxxx # 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  # region: ap-guangzhou # 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填

Hexo Matery 主题使用

请参考 hexo-theme-matery/_config.yml 进行配置

Hexo Icarus 主题使用

请参考 基于腾讯云,给你的 Icarus 博客配上 Twikoo 评论系统 by 异次元de机智君💯

Hexo MengD(萌典) 主题使用

请参考 hexo-theme-MengD/_config.yml 进行配置

hexo-theme-fluid 主题使用

请参考 配置指南-评论 进行配置

hexo-theme-cards 主题使用

请参考 hexo-theme-cards/_config.yml 进行配置

maupassant-hexo 主题使用

请参考 maupassant-hexo/_config.yml 进行配置

hexo-theme-redefine 主题使用

请参考 Redefine 官方文档 #comment 进行配置

在 Hugo 中使用

hugo-theme-stack 主题使用

请参考 Comments | Stackhugo-theme-stack/config.yaml#L83 进行配置

FixIt 主题使用

请参考 入门篇 - FixIt #主题配置hugo-fixit/FixIt/config.toml#L613-L624 进行配置

通过 CDN 引入

提示

如果您使用的博客主题不支持 Twikoo,并且您不知道如何引入 Twikoo,您可以在 Github 提交适配请求

html
<div id="tcomment"></div>
+<script src="https://cdn.staticfile.org/twikoo/1.6.22/twikoo.all.min.js"></script>
+<script>
+twikoo.init({
+  envId: '您的环境id', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  el: '#tcomment', // 容器元素
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
+  // path: location.pathname, // 用于区分不同文章的自定义 js 路径,如果您的文章路径不是 location.pathname,需传此参数
+  // lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/twikoojs/twikoo/blob/main/src/client/utils/i18n/index.js
+})
+</script>
<div id="tcomment"></div>
+<script src="https://cdn.staticfile.org/twikoo/1.6.22/twikoo.all.min.js"></script>
+<script>
+twikoo.init({
+  envId: '您的环境id', // 腾讯云环境填 envId;Vercel 环境填地址(https://xxx.vercel.app)
+  el: '#tcomment', // 容器元素
+  // region: 'ap-guangzhou', // 环境地域,默认为 ap-shanghai,腾讯云环境填 ap-shanghai 或 ap-guangzhou;Vercel 环境不填
+  // path: location.pathname, // 用于区分不同文章的自定义 js 路径,如果您的文章路径不是 location.pathname,需传此参数
+  // lang: 'zh-CN', // 用于手动设定评论区语言,支持的语言列表 https://github.com/twikoojs/twikoo/blob/main/src/client/utils/i18n/index.js
+})
+</script>

建议使用 CDN 引入 Twikoo 的用户在链接地址上锁定版本,以免将来 Twikoo 升级时受到非兼容性更新的影响。

更换 CDN 镜像

如果遇到默认 CDN 加载速度缓慢,可更换其他 CDN 镜像。以下为可供选择的公共 CDN,其中一些 CDN 可能需要数天时间同步最新版本:

  • https://cdn.staticfile.org/twikoo/1.6.22/twikoo.all.min.js
  • https://lib.baomitu.com/twikoo/1.6.22/twikoo.all.min.js
  • https://cdn.bootcdn.net/ajax/libs/twikoo/1.6.22/twikoo.all.min.js
  • https://cdn.jsdelivr.net/npm/twikoo@1.6.22/dist/twikoo.all.min.js

开启管理面板(腾讯云环境)

  1. 进入环境-登录授权,点击“自定义登录”右边的“私钥下载”,下载私钥文件
  2. 用文本编辑器打开私钥文件,复制全部内容
  3. 点击评论窗口的“小齿轮”图标,粘贴私钥文件内容,并设置管理员密码

配置好登录私钥之后无需留存私钥文件,请勿再次下载登录私钥,否则会导致之前配置的登录私钥失效。

开启管理面板(非腾讯云环境)

点击评论窗口的“小齿轮”图标,设置管理员密码

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 000000000..b7ecf2e12 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"quick-start.md":"65db2e19","en_backend.md":"9b42e72a","en_faq.md":"0f998109","en_frontend.md":"0a1db1d9","en_index.md":"ede44249","en_intro.md":"b281b522","en_link.md":"c1f0a322","backend.md":"237bd45c","en_update.md":"4ed189a6","faq.md":"966fba69","frontend.md":"58dfda7e","index.md":"1464a105","intro.md":"35d8cb3f","link.md":"cf6d607e","en_quick-start.md":"78b76bc9","qq_api.md":"e25600dc","api.md":"653ece4c","en_api.md":"859770f8","configuration.md":"3456c64e","cms.md":"9922f3eb","update.md":"fd0f5639"} diff --git a/index.html b/index.html new file mode 100644 index 000000000..a75b28ae2 --- /dev/null +++ b/index.html @@ -0,0 +1,25 @@ + + + + + + Twikoo | 一个简洁、安全、免费的静态网站评论系统 + + + + + + + + + + + + + + +
Skip to content

Twikoo

网站评论系统

简洁、安全、免费

Twikoo

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/intro.html b/intro.html new file mode 100644 index 000000000..0cef7f737 --- /dev/null +++ b/intro.html @@ -0,0 +1,30 @@ + + + + + + Twikoo 文档 | Twikoo 文档 + + + + + + + + + + + + + + + +
Skip to content
Twikoo
       

一个简洁、安全、免费的静态网站评论系统。
A simple, safe, free comment system.

简体中文 | English

特色

简单

  • 免费搭建(使用云开发 / Vercel / 私有服务器作为评论后台)
  • 简单部署(支持云开发 / Vercel 一键部署)

易用

  • 支持回复、点赞
  • 无需额外适配,支持搭配浅色主题与深色主题使用
  • 支持 API 调用,批量获取文章评论数、最新评论
  • 访客在昵称栏输入 QQ 号,会自动补全 QQ 昵称和 QQ 邮箱
  • 访客填写数字 QQ 邮箱,会使用 QQ 头像作为评论头像
  • 支持评论框粘贴图片(可禁用)
  • 支持插入图片(可禁用)
  • 支持去不图床、云开发图床
  • 支持插入表情(可禁用)
  • 支持 Ctrl + Enter 快捷回复
  • 评论框内容实时保存草稿,刷新不会丢失
  • 支持 Katex 公式
  • 支持按语言的代码高亮

安全

  • 隐私信息安全(通过云函数控制敏感字段(邮箱、IP、环境配置等)不会泄露)
  • 支持 Akismet 垃圾评论检测(需自行注册 akismet.com
  • 支持腾讯云内容安全垃圾评论检测(需自行注册 腾讯云内容安全
  • 支持人工审核模式
  • 防 XSS 注入
  • 支持限制每个 IP 每 10 分钟最多发表多少条评论

即时

  • 支持邮件提醒(访客和博主)
  • 支持微信提醒(仅针对博主,基于 Server酱,需自行注册)
  • 支持 QQ 提醒(仅针对博主,基于 Qmsg酱,需自行注册)
  • 支持 QQ 提醒(针对博主QQ或者群,基于 go-cqhttp,需自己有服务器)

个性

  • 支持自定义评论框背景图片
  • 支持自定义“博主”标识文字
  • 支持自定义通知邮件模板
  • 支持自定义评论框提示信息(placeholder)
  • 支持自定义表情列表(兼容 OwO 的数据格式
  • 支持自定义【昵称】【邮箱】【网址】必填 / 选填
  • 支持自定义代码高亮主题

便捷管理

  • 内嵌式管理面板,通过密码登录,可方便地查看评论、隐藏评论、删除评论、修改配置
  • 支持隐藏管理入口,通过输入暗号显示
  • 支持从 Valine、Artalk、Disqus 导入评论

缺点

  • 不支持 IE

预览

评论

评论

评论管理

评论管理

推送通知

推送通知

交流群

如果你想获取更新动态、建言献策、参与测试,欢迎加入讨论群:
1080829142

浏览器支持

提示

技术原因,不兼容 IE

IE / Edge
IE / Edge
Firefox
Firefox
Chrome
Chrome
Safari
Safari
iOS Safari
iOS Safari
Edgelast versionlast versionlast versionlast version

Generated by browsers-support-badges

更新日志 & 开发计划

更新日志 & 开发计划

特别感谢

图标设计:Maemo Lee

开发

如果您想在本地二次开发,可以参考以下命令:

sh
yarn dev # 开发 (http://localhost:9820/demo.html)
+yarn lint # 代码检查
+yarn build # 编译 (dist/twikoo.all.min.js)
yarn dev # 开发 (http://localhost:9820/demo.html)
+yarn lint # 代码检查
+yarn build # 编译 (dist/twikoo.all.min.js)

如果您的改动能够帮助到更多人,欢迎提交 Pull Request!

国际化

支持简体中文、繁体中文、English。欢迎提交翻译 PR

许可

FOSSA Status

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/link.html b/link.html new file mode 100644 index 000000000..184ba4055 --- /dev/null +++ b/link.html @@ -0,0 +1,25 @@ + + + + + + 相关文档 | Twikoo 文档 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/quick-start.html b/quick-start.html new file mode 100644 index 000000000..7313aaff2 --- /dev/null +++ b/quick-start.html @@ -0,0 +1,25 @@ + + + + + + 快速上手 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

快速上手

Twikoo 分为云函数和前端两部分,若要在您的网站上集成 Twikoo,您需要同时部署云函数和前端,部署时请注意保持二者版本一致。

  • 云函数部署 有多种方式,请选择适合自己的部署平台。
  • 前端部署 有 2 种方式,如果您的网站主题支持 Twikoo,您只需在配置文件中指定 Twikoo 即可;如果您的网站主题不支持 Twikoo,您需要修改源码手动引入 Twikoo 的 js 文件并初始化。
  • 若您已部署旧版本 Twikoo,请参考 版本更新 升级云函数和前端版本。

Released under the MIT License.

+ + + + \ No newline at end of file diff --git a/twikoo-logo-home.png b/twikoo-logo-home.png new file mode 100644 index 000000000..c92c67da2 Binary files /dev/null and b/twikoo-logo-home.png differ diff --git a/twikoo-logo-mini.png b/twikoo-logo-mini.png new file mode 100644 index 000000000..462134075 Binary files /dev/null and b/twikoo-logo-mini.png differ diff --git a/update.html b/update.html new file mode 100644 index 000000000..74acf79a7 --- /dev/null +++ b/update.html @@ -0,0 +1,25 @@ + + + + + + 版本更新 | Twikoo 文档 + + + + + + + + + + + + + + +
Skip to content

版本更新

不同部署方式的更新方式也不同,请对号入座。更新部署成功后,请不要忘记同时更新前端的 Twikoo CDN 地址中的 x.x.x 数字版本号,使之与云函数版本号相同,然后部署网站。

针对腾讯云一键部署的更新方式

登录环境-我的应用,输入

  • 来源地址:https://github.com/twikoojs/twikoo/tree/main
  • 部署分支:main

应用目录无需填写,点击“确定”,部署完成。

针对腾讯云手动部署的更新方式

登录环境-云函数,点击 twikoo,点击函数代码,打开 package.json 文件,将 "twikoo-func": "x.x.x" 其中的版本号修改为最新版本号,点击“保存并安装依赖”即可。

提示

如果您的云函数是 1.0.0 之前的版本,因为 1.0.0 版本修改了部署步骤,请先参考手动部署,从第 5 步开始,重新创建云函数,再按照此步骤更新。

如果升级后出现无法读取评论列表,云函数报错,请在函数编辑页面,删除 node_modules 目录(删除需要半分钟左右,请耐心等待删除完成),再点击保存并安装依赖。如果仍然不能解决,请删除并重新创建 Twikoo 云函数。

针对腾讯云命令行部署的更新方式

进入 Twikoo 源码目录,执行以下命令更新现有的云函数

sh
yarn deploy -e 您的环境id
yarn deploy -e 您的环境id

针对 Vercel 部署的更新方式

  1. 进入 Vercel 仪表板 - twikoo - Settings - Git
  2. 点击 Connected Git Repository 下方的仓库地址
  3. 打开 package.json,点击编辑
  4. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  5. 部署会自动触发,可以回到 Vercel 仪表板,查看部署状态

针对 Railway 和 Zeabur 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-zeabur 的仓库
  2. 打开 package.json,点击编辑
  3. "tkserver": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对 Netlify 部署的更新方式

  1. 登录 Github,找到部署时 fork 到自己账号下的名为 twikoo-netlify 的仓库
  2. 打开 package.json,点击编辑
  3. "twikoo-vercel": "latest" 其中的 latest 修改为最新版本号。点击 Commit changes
  4. 部署会自动触发

针对私有部署的更新方式

  1. 停止旧版本 kill $(ps -ef | grep tkserver | grep -v 'grep' | awk '{print $2}')
  2. 拉取新版本 npm i -g tkserver@latest
  3. 启动新版本 nohup tkserver >> tkserver.log 2>&1 &

针对私有部署 (Docker) 的更新方式

  1. 拉取新版本 docker pull imaegoo/twikoo
  2. 停止旧版本容器 docker stop twikoo
  3. 删除旧版本容器 docker rm twikoo
  4. 启动新版本容器

自动更新

考虑到可用性和安全性问题,Twikoo 没有实现自动更新,也没有计划实现自动更新。如果您希望实现自动更新,可以参考 MHuiG 基于 Github 工作流的 twikoo-update 的实现方式。

Released under the MIT License.

+ + + + \ No newline at end of file