diff --git a/404.html b/404.html new file mode 100644 index 00000000..ae9675bf --- /dev/null +++ b/404.html @@ -0,0 +1,24 @@ + + + + + + 404 | Kotori + + + + + + + + + + + + + +
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.
+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..b433c451 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +https://kotori.js.org \ No newline at end of file diff --git a/advanced/index.html b/advanced/index.html new file mode 100644 index 00000000..296e7491 --- /dev/null +++ b/advanced/index.html @@ -0,0 +1,27 @@ + + + + + + Kotori + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/api/index.html b/api/index.html new file mode 100644 index 00000000..480bd67d --- /dev/null +++ b/api/index.html @@ -0,0 +1,27 @@ + + + + + + Kotori + + + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/assets/advanced_index.md.Dxlz8-x0.js b/assets/advanced_index.md.Dxlz8-x0.js new file mode 100644 index 00000000..d438492e --- /dev/null +++ b/assets/advanced_index.md.Dxlz8-x0.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t}from"./chunks/framework.Dy019jra.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/index.md","filePath":"advanced/index.md","lastUpdated":1707642172000}'),d={name:"advanced/index.md"};function n(c,r,o,s,i,p){return t(),a("div")}const f=e(d,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/advanced_index.md.Dxlz8-x0.lean.js b/assets/advanced_index.md.Dxlz8-x0.lean.js new file mode 100644 index 00000000..d438492e --- /dev/null +++ b/assets/advanced_index.md.Dxlz8-x0.lean.js @@ -0,0 +1 @@ +import{_ as e,c as a,o as t}from"./chunks/framework.Dy019jra.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"advanced/index.md","filePath":"advanced/index.md","lastUpdated":1707642172000}'),d={name:"advanced/index.md"};function n(c,r,o,s,i,p){return t(),a("div")}const f=e(d,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/api_index.md.D6BHDtnL.js b/assets/api_index.md.D6BHDtnL.js new file mode 100644 index 00000000..730a29c5 --- /dev/null +++ b/assets/api_index.md.D6BHDtnL.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.Dy019jra.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/index.md","filePath":"api/index.md","lastUpdated":1707642172000}'),n={name:"api/index.md"};function r(i,o,s,d,c,p){return a(),t("div")}const f=e(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/api_index.md.D6BHDtnL.lean.js b/assets/api_index.md.D6BHDtnL.lean.js new file mode 100644 index 00000000..730a29c5 --- /dev/null +++ b/assets/api_index.md.D6BHDtnL.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.Dy019jra.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"api/index.md","filePath":"api/index.md","lastUpdated":1707642172000}'),n={name:"api/index.md"};function r(i,o,s,d,c,p){return a(),t("div")}const f=e(n,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/app.BWOJOnn0.js b/assets/app.BWOJOnn0.js new file mode 100644 index 00000000..3a6a4f01 --- /dev/null +++ b/assets/app.BWOJOnn0.js @@ -0,0 +1,7 @@ +import{j as o,a3 as p,a4 as u,a5 as c,a6 as l,a7 as f,a8 as d,a9 as m,aa as h,ab as A,ac as g,ad as v,d as P,u as w,l as y,z as C,ae as R,af as _,ag as b,a2 as E}from"./chunks/framework.Dy019jra.js";import{R as D}from"./chunks/theme.5WXmHJfx.js";function i(e){if(e.extends){const a=i(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=i(D),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=w();return y(()=>{C(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),_(),b(),s.setup&&s.setup(),()=>E(s.Layout)}});async function j(){const e=O(),a=L();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function L(){return h(T)}function O(){let e=o,a;return A(t=>{let n=g(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=v(()=>import(n),__vite__mapDeps([]))),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{p(a.route,t.site),e.mount("#app")})});export{j as createApp}; +function __vite__mapDeps(indexes) { + if (!__vite__mapDeps.viteFileDeps) { + __vite__mapDeps.viteFileDeps = [] + } + return indexes.map((i) => __vite__mapDeps.viteFileDeps[i]) +} diff --git a/assets/basic_config.md.Df_mXSQf.js b/assets/basic_config.md.Df_mXSQf.js new file mode 100644 index 00000000..cad8f3a9 --- /dev/null +++ b/assets/basic_config.md.Df_mXSQf.js @@ -0,0 +1,44 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"配置详解","description":"","frontmatter":{},"headers":[],"relativePath":"basic/config.md","filePath":"basic/config.md","lastUpdated":1707642172000}'),l={name:"basic/config.md"},t=n(`

配置详解

前面一节已对 kotori.yml 有了大概认识,本节内容将更为全面的介绍它。kotori.yml 是一个 Kotori 程序的核心配置文件,它一般位于 Kotori 根目录,与 package.json 文件同级,使用 YAML 格式。

关于 YAML 格式的语法与规范请参考 YAML 入门教程

以下是将先前的配置片段集中在一起的例子(仅作参考请勿直接复制):

yaml
global:
+  lang: zh_CN
+  command-prefix: /
+  dirs:
+    - ./node_modules/
+    - ./node_modules/@kotori-bot/
+    # 上面为默认配置的加载目录
+    - ./node_modules/@custom-scope/
+    - ./test_modules
+
+adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720
+
+  kisaki:
+    extends: qq
+    appid: "xxxx"
+    secret: "xxxxx"
+    master: 2333
+    retry: 10
+
+plugin:
+  console:
+ filter: {}
+    test: 1
+
+  menu:
+    alias: cd
+    keywords: [ 菜单, 功能, 帮助]
+    content: 菜单 | 小鳥%break%/menu - 查看BOT菜单%break%/hitokoto - 获取一条一言%break%ByHotaru

global.lang

定义全局使用的语言,目前仅支持英语、日语、台湾语、中文四门语言。

typescript
type LocaleType = 'en_US' | 'ja_JP' | 'zh_TW' | 'zh_CN';

global['command-prefix']

定义全局使用的命令前缀。

global.dirs

定义需要加载的模块目录。

global.filter

定义全局使用的过滤器,目前过滤器功能正在实现中,该项暂时无实际效果。

adapter

定义 Bot。

typescript
interface AdapterConfig {
+  extends: string;
+  master?: number;
+  lang?: langType;
+  'command-prefix'?: string;
+  [propName: string]?: unknown;
+}

AdapterConfig.extends

定义该 Bot 使用的适配器。

AdapterConfig.master

定义该 Bot 的最高管理员 id(即该用户在平台的 id)。

AdapterConfig.lang

定义该 Bot 使用的语言。

AdapterConfig['command-prefix']

定义该 Bot 使用的命令前缀。

AdapterConfig[propName]

除去以上由 Kotori 内部定义的配置项,extends 中指定的适配器一般会额外定义配置项用于 Bot 内部,这些配置项也可能不存在或为可选,具体请参考该模块的详情页。

plugin

定义插件的配置项。

typescript
interface PluginConfig {
+  filter?: {};
+  [propName: string]?: unknown;
+}

PluginConfig.filter

定义该插件使用的过滤器。

PluginConfig[propName]

类似于 AdapterConfig 中的 [propName],该插件也可能会定义一些配置项用于插件内部,具体请参考该模块的详情页。

`,45),p=[t];function e(h,k,r,d,o,g){return a(),i("div",null,p)}const y=s(l,[["render",e]]);export{c as __pageData,y as default}; diff --git a/assets/basic_config.md.Df_mXSQf.lean.js b/assets/basic_config.md.Df_mXSQf.lean.js new file mode 100644 index 00000000..8ed77659 --- /dev/null +++ b/assets/basic_config.md.Df_mXSQf.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"配置详解","description":"","frontmatter":{},"headers":[],"relativePath":"basic/config.md","filePath":"basic/config.md","lastUpdated":1707642172000}'),l={name:"basic/config.md"},t=n("",45),p=[t];function e(h,k,r,d,o,g){return a(),i("div",null,p)}const y=s(l,[["render",e]]);export{c as __pageData,y as default}; diff --git a/assets/basic_introduce.md.Dwzi7PBK.js b/assets/basic_introduce.md.Dwzi7PBK.js new file mode 100644 index 00000000..77b670ae --- /dev/null +++ b/assets/basic_introduce.md.Dwzi7PBK.js @@ -0,0 +1 @@ +import{d as h,o as s,c as n,m as e,k as l,_ as p,J as d,a as t,V as u}from"./chunks/framework.Dy019jra.js";const _=h({__name:"Voice",setup(r){function a(){new Audio("/assets/kotori.mp3").play()}return(o,i)=>(s(),n("span",null,[e("input",{type:"image",src:"https://cn.vitejs.dev/voice.svg#voice",onClick:i[0]||(i[0]=c=>a()),class:"voice",style:{"background-color":"rgb(243, 244, 245)",border:"none",padding:"3px","border-radius":"4px","vertical-align":"bottom",height:"1.5em",width:"1.5em"}})]))}}),g=["href","title"],m=["src","alt"],b=h({__name:"NpmBadge",props:{package:{type:String,required:!0},distTag:{type:String,required:!1,default:"latest"}},setup(r){const a=r,o=l(()=>`https://www.npmjs.com/package/${a.package}`),i=l(()=>a.distTag?`${a.package}@${a.distTag}`:a.package),c=l(()=>`https://badgen.net/npm/v/${a.package}/${a.distTag}?label=${encodeURIComponent(i.value)}`);return(C,V)=>(s(),n("a",{class:"npm-badge",href:o.value,title:r.package,target:"_blank",rel:"noopener noreferrer"},[e("img",{src:c.value,alt:r.package},null,8,m)],8,g))}}),f=p(b,[["__scopeId","data-v-8bf061d3"]]),k=e("h1",{id:"简介",tabindex:"-1"},[t("简介 "),e("a",{class:"header-anchor",href:"#简介","aria-label":'Permalink to "简介"'},"​")],-1),v=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,[e("code",null,"KotoriV1"),t(" 文档正在建设并完善中")])],-1),q=e("hr",null,null,-1),x=e("p",null,[t("kotori 是一个"),e("strong",null,"跨平台、解耦合、现代化"),t("于一体的聊天机器人框架,运行于 Node.js 环境,使用 TypeScript 语言开发。")],-1),T=e("h2",{id:"概述",tabindex:"-1"},[t("概述 "),e("a",{class:"header-anchor",href:"#概述","aria-label":'Permalink to "概述"'},"​")],-1),P=e("code",null,"/kotoliː/",-1),N=e("a",{href:"http://key.visualarts.gr.jp/",target:"_blank",rel:"noreferrer"},"Key 公式",-1),y=e("a",{href:"https://bgm.tv/subject/4022",target:"_blank",rel:"noreferrer"},"《Rewrite》",-1),K=e("a",{href:"https://bgm.tv/character/12063",target:"_blank",rel:"noreferrer"},"神户小鸟",-1),S=u('

特点

扩展支持

平台

数据库(待支持)

你是?

',9),I=JSON.parse('{"title":"简介","description":"","frontmatter":{},"headers":[],"relativePath":"basic/introduce.md","filePath":"basic/introduce.md","lastUpdated":1707642172000}'),$={name:"basic/introduce.md"},j=Object.assign($,{setup(r){return(a,o)=>(s(),n("div",null,[k,d(f,{package:"kotori-bot"}),v,q,x,T,e("p",null,[t("「Kotori」是一个罗马字,在日语中是「ことり」(小鳥)的意思,发音为 "),P,t(),d(_),t(",该名字取自于 "),N,t(" 的游戏 "),y,t(" 中主要女性角色之一:"),K,t(" (神戸(かんべ) 小鳥(ことり))。 借助 Kotori,可快速搭建一个多平台、功能强大的聊天机器人应用,通过安装不同模块为 Kotori 扩展功能、玩法和个性化配置等。同时,Kotori 为开发者提供了现成的 Cli 用于模块开发与 Kotori 二次开发。")]),S]))}});export{I as __pageData,j as default}; diff --git a/assets/basic_introduce.md.Dwzi7PBK.lean.js b/assets/basic_introduce.md.Dwzi7PBK.lean.js new file mode 100644 index 00000000..0612c63e --- /dev/null +++ b/assets/basic_introduce.md.Dwzi7PBK.lean.js @@ -0,0 +1 @@ +import{d as h,o as s,c as n,m as e,k as l,_ as p,J as d,a as t,V as u}from"./chunks/framework.Dy019jra.js";const _=h({__name:"Voice",setup(r){function a(){new Audio("/assets/kotori.mp3").play()}return(o,i)=>(s(),n("span",null,[e("input",{type:"image",src:"https://cn.vitejs.dev/voice.svg#voice",onClick:i[0]||(i[0]=c=>a()),class:"voice",style:{"background-color":"rgb(243, 244, 245)",border:"none",padding:"3px","border-radius":"4px","vertical-align":"bottom",height:"1.5em",width:"1.5em"}})]))}}),g=["href","title"],m=["src","alt"],b=h({__name:"NpmBadge",props:{package:{type:String,required:!0},distTag:{type:String,required:!1,default:"latest"}},setup(r){const a=r,o=l(()=>`https://www.npmjs.com/package/${a.package}`),i=l(()=>a.distTag?`${a.package}@${a.distTag}`:a.package),c=l(()=>`https://badgen.net/npm/v/${a.package}/${a.distTag}?label=${encodeURIComponent(i.value)}`);return(C,V)=>(s(),n("a",{class:"npm-badge",href:o.value,title:r.package,target:"_blank",rel:"noopener noreferrer"},[e("img",{src:c.value,alt:r.package},null,8,m)],8,g))}}),f=p(b,[["__scopeId","data-v-8bf061d3"]]),k=e("h1",{id:"简介",tabindex:"-1"},[t("简介 "),e("a",{class:"header-anchor",href:"#简介","aria-label":'Permalink to "简介"'},"​")],-1),v=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,[e("code",null,"KotoriV1"),t(" 文档正在建设并完善中")])],-1),q=e("hr",null,null,-1),x=e("p",null,[t("kotori 是一个"),e("strong",null,"跨平台、解耦合、现代化"),t("于一体的聊天机器人框架,运行于 Node.js 环境,使用 TypeScript 语言开发。")],-1),T=e("h2",{id:"概述",tabindex:"-1"},[t("概述 "),e("a",{class:"header-anchor",href:"#概述","aria-label":'Permalink to "概述"'},"​")],-1),P=e("code",null,"/kotoliː/",-1),N=e("a",{href:"http://key.visualarts.gr.jp/",target:"_blank",rel:"noreferrer"},"Key 公式",-1),y=e("a",{href:"https://bgm.tv/subject/4022",target:"_blank",rel:"noreferrer"},"《Rewrite》",-1),K=e("a",{href:"https://bgm.tv/character/12063",target:"_blank",rel:"noreferrer"},"神户小鸟",-1),S=u("",9),I=JSON.parse('{"title":"简介","description":"","frontmatter":{},"headers":[],"relativePath":"basic/introduce.md","filePath":"basic/introduce.md","lastUpdated":1707642172000}'),$={name:"basic/introduce.md"},j=Object.assign($,{setup(r){return(a,o)=>(s(),n("div",null,[k,d(f,{package:"kotori-bot"}),v,q,x,T,e("p",null,[t("「Kotori」是一个罗马字,在日语中是「ことり」(小鳥)的意思,发音为 "),P,t(),d(_),t(",该名字取自于 "),N,t(" 的游戏 "),y,t(" 中主要女性角色之一:"),K,t(" (神戸(かんべ) 小鳥(ことり))。 借助 Kotori,可快速搭建一个多平台、功能强大的聊天机器人应用,通过安装不同模块为 Kotori 扩展功能、玩法和个性化配置等。同时,Kotori 为开发者提供了现成的 Cli 用于模块开发与 Kotori 二次开发。")]),S]))}});export{I as __pageData,j as default}; diff --git a/assets/basic_modules.md.BM1hIfQJ.js b/assets/basic_modules.md.BM1hIfQJ.js new file mode 100644 index 00000000..d922e689 --- /dev/null +++ b/assets/basic_modules.md.BM1hIfQJ.js @@ -0,0 +1,35 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const g=JSON.parse('{"title":"模块安装","description":"","frontmatter":{},"headers":[],"relativePath":"basic/modules.md","filePath":"basic/modules.md","lastUpdated":1707642172000}'),t={name:"basic/modules.md"},e=n(`

模块安装

介绍

模块(Modules) 是 Kotori 的重要组成部分之一,通过使用模块以扩展各式各样的功能。

模块根据功能与应用范围不同,主要分为以下三大类型:

寻找模块

Kotori 模块中心 内收录了大部分 Kotori 模块。选择所需模块,在详情页中会有插件的基础信息、介绍、使用说明、配置说明等。

下载与安装

此处以「QQ 适配器服务模块」(@kotori-bot/kotori-plugin-adapter-qq)为例。

模块的包名除去 @xxx/ 的部分(如果有),会有一段相似的开始字段,将其称之为「模块前缀」。通过模块前缀可判断模块类型,如「kotori-plugin-adapter-xxx」表示适配器服务,「kotori-plugin-database-xxx」表示数据库服务,「kotori-plugin-xxx」表示插件自定义服务,详细内容请参考 开发文档 - 插件范式

使用包管理工具

复制模块详情页里中的安装指令,或手动输入对应模块的 npm 包名,在 Kotori 根目录运行:

bash
pnpm install @kotori-bot/kotori-plugin-adapter-qq

手动下载安装

该方法仅在必要情况下建议使用。

在模块详情页里跳转至对应的 npm 地址或 GitHub 地址,下载模块的构建产物。 解压压缩包并移动至 Kotori 根目录下的 ./modules/ 内。

GitHub 仓库中存有模块的源码,在当前阶段,你应下载并使用模块的构建产物而非源码。

务必确保解压后的模块文件夹仅有一层文件夹而非多层,否则将无法识别与加载模块。

添加加载目录

模块安装在 ./modules 目录内请忽略该步骤。

通过包管理工具安装的模块一般会安装在 Kotori 根目录下的 ./node_modules/ 内,如若插件包名带有 @xxx/ 的前缀,表示为包的命名空间,上述示例模块中的「@kotori-bot/」为 Kotori 官方包的命名空间,表示官方模块,其余的命名空间或无命名空间的模块为社区模块

所有未安装在 ./modules/ 都应配置 kotori.ymlglobal.dirs 项以设置额外的加载根目录,但对于 ./node_modules/@kotori-bot/ 命名空间已经存在于 Kotori.yml 默认配置中,因此无需担心。

对于其它安装目录或命名空间则需手动添加到 Kotori.yml 中,如:

对应配置为:

yaml
global:
+  dirs:
+    - ./node_modules/
+    - ./node_modules/@kotori-bot/
+    # 上面为默认配置的加载目录
+    - ./node_modules/@custom-scope/
+    - ./test_modules

配置模块

根据安装的模块类型不同,配置策略也将不同。

插件

插件配置数据应写在 kotori.ymlplugin.<plugin-name> 项下,其中 <plugin-name> 为插件名字,不应含有包的命名空间与模块前缀,值必须是一个对象。插件的配置项由插件本身提供与指定,并非所有插件本身都会提供配置项。一般地,有提供配置项的插件内都会有一套默认配置,因此不配置也可以正常运行插件。插件的配置和说明可参考该插件的详情页,此处以 「菜单插件」(@kotori-bot/kotori-plugin-menu)为例,在详情页查看配置说明后在 kotori.yml 中配置相关内容:

yaml
plugin:
+  menu:
+    alias: cd
+    keywords: [菜单, 功能, 帮助]
+    content: 菜单 | 小鳥%break%/menu - 查看BOT菜单%break%/hitokoto - 获取一条一言%break%ByHotaru

适配器

适配器配置数据应写在 kotori.ymladapter[instanceName] 项下,其中 instanceName 为适配器实例(以下简称「Bot」)名字应由小写英语字母、数字、连字符([a-z0-9])组成,值必须是一个对象。适配器的配置数据不会作用于适配器模块,Kotori 会根据配置数据创建对应 Bot。对于适配器的配置,必须提供一些必要配置项才能确保实例的正常运行,其中有部分配置项由 Kotori 内部定义,如:

yaml
adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333

「cmd-test」是该 Bot 的名字也是在 kotori 程序运行中的唯一标识符,不可重复。extends 用于指定该实例使用的适配器,值为适配器模块的包名除去命名空间与适配器服务前缀的字符串,如:使用「@kotori-bot/kotori-plugin-adapter-qq」适配器,则应填入「qq」。master 用于指定该实例的最高管理员(Admin),值类型可为数字或字符串,非必填。 除去由 Kotori 内部定义的配置项以外,一般还需要填入该适配器要求传入的必要配置项。

yaml
adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720

cmd 适配器即「@kotori-bot/kotori-plugin-adapter-cmd」,属于 kotori 预装模块之一,为 kotori 程序当前所在控制台提供聊天交互功能,也是最方便的测试机器人的场所(但并不推荐,因为只支持文字交互,模块开发有更好的测试场所选择,详细内容请参考 开发文档 - 项目构建)。

不过此处使用的 cmd 适配器定义的配置项均有默认值因此为可选。接着使用「@kotori-bot/kotori-plugin-adapter-qq」适配器再创建一个 Bot:

yaml
adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720
+
+  kisaki:
+    extends: qq
+    appid: 'xxxx'
+    secret: 'xxxxx'
+    master: 2333
+    retry: 10

查看 QQ 适配器的详情页面可知,appidsecret 为其定义的必要配置项,retry 为其定义的可选配置项,关于 QQ 适配器的具体使用与配置项含义请查看其插件详情页。

关于 Kotori.yml 的详细介绍请参考 配置详解

`,41),l=[e];function p(h,k,o,d,r,c){return a(),i("div",null,l)}const y=s(t,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/basic_modules.md.BM1hIfQJ.lean.js b/assets/basic_modules.md.BM1hIfQJ.lean.js new file mode 100644 index 00000000..4e5569d7 --- /dev/null +++ b/assets/basic_modules.md.BM1hIfQJ.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const g=JSON.parse('{"title":"模块安装","description":"","frontmatter":{},"headers":[],"relativePath":"basic/modules.md","filePath":"basic/modules.md","lastUpdated":1707642172000}'),t={name:"basic/modules.md"},e=n("",41),l=[e];function p(h,k,o,d,r,c){return a(),i("div",null,l)}const y=s(t,[["render",p]]);export{g as __pageData,y as default}; diff --git a/assets/basic_start.md.BcMzOQtP.js b/assets/basic_start.md.BcMzOQtP.js new file mode 100644 index 00000000..32865ded --- /dev/null +++ b/assets/basic_start.md.BcMzOQtP.js @@ -0,0 +1,21 @@ +import{_ as s,c as a,o as i,V as n}from"./chunks/framework.Dy019jra.js";const E=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"basic/start.md","filePath":"basic/start.md","lastUpdated":1707642172000}'),t={name:"basic/start.md"},l=n(`

快速开始

安装 Node.js

前往 Node.js 官网 根据系统版本选择对应的安装方式,确保 Node.js 版本 >= 17.9.0。输入以下命令确认安装成功:

bash
node -v
+npm -v

下载 Kotori

一键安装脚本

该内容待更新....

使用 Git

bash
git clone https://github.com/kotori/kotori.git

使用 pnpm 安装依赖

Kotori 基于 pnpm 的 Monorepo 进行开发,因此需要先安装 pnpm:

bash
npm install pnpm -g

进入到 Kotori 根目录并使用 pnpm 安装所有依赖:

bash
cd ./kotori-bot-master
+pnpm install

配置 kotori.yml

使用文本编辑器打开位于 Kotori 根目录的 kotori.yml,当前你还无需对该文件配置进行必要的改动。

yaml
global:
+  lang: zh_CN
+  command-prefix: /
+  dirs:
+    - ./node_modules/
+    - ./node_modules/@kotori-bot/
+
+adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720
+
+plugin:
+  console:
+    test: 1

关于 kotori.yml 的详细介绍请参考 配置详解

运行 Kotori

bash
pnpm start
bash
pnpm dev
`,23),e=[l];function h(p,k,o,r,d,c){return i(),a("div",null,e)}const y=s(t,[["render",h]]);export{E as __pageData,y as default}; diff --git a/assets/basic_start.md.BcMzOQtP.lean.js b/assets/basic_start.md.BcMzOQtP.lean.js new file mode 100644 index 00000000..5afd21d8 --- /dev/null +++ b/assets/basic_start.md.BcMzOQtP.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,V as n}from"./chunks/framework.Dy019jra.js";const E=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"basic/start.md","filePath":"basic/start.md","lastUpdated":1707642172000}'),t={name:"basic/start.md"},l=n("",23),e=[l];function h(p,k,o,r,d,c){return i(),a("div",null,e)}const y=s(t,[["render",h]]);export{E as __pageData,y as default}; diff --git a/assets/basic_usage.md.CgIyI17j.js b/assets/basic_usage.md.CgIyI17j.js new file mode 100644 index 00000000..a9516b71 --- /dev/null +++ b/assets/basic_usage.md.CgIyI17j.js @@ -0,0 +1,45 @@ +import{_ as i,c as a,o as s,V as l}from"./chunks/framework.Dy019jra.js";const g=JSON.parse('{"title":"立即使用","description":"","frontmatter":{},"headers":[],"relativePath":"basic/usage.md","filePath":"basic/usage.md","lastUpdated":1707642172000}'),t={name:"basic/usage.md"},e=l(`

立即使用

TIP

本篇适用于想立即体验基于 Kotori 搭建的 Bot 实际效果、或单纯想使用由官方提供的各平台 Bot 服务的平台用户。


服务平台

目前共提供 1 个平台、两个 Bot:

QQ

Kanbe Kotori(小鳥一号)

小鳥二号

基于 Onebot 标准的 go-cqhttp 项目(@Kotori-bot/kotori-plugin-adapter-onebot)。相比于官方 QQ 机器人,第三方 QQ 机器人拥有着更健全的基础功能,权限使用上几乎无任何限制,缺点是因某种原因导致 go-cqhttp 等第三方 QQ 机器人项目跑路或归档,稳定性低于官方机器人。

立即使用:Kotori 交流群

小鳥三号

基于 Tencent 官方 API(@Kotori-bot/kotori-plugin-adapter-qq)。相比于第三方 QQ 机器人,限制较多(不可发送主动消息、URL 需备案等),但稳定性较高,其余功能与「小鳥二号」基本一致。

立即使用:Kotori 交流群

Telegram

Discord

Bot 申请

除了加入官方群或添加 Bot 账户直接使用以外,也可以申请对应平台的 Bot 接入到你自己的群聊。

申请链接:Github Issues

请仔细查看说明并填写信息,一般在 24 小时内处理完毕 issue。

功能一览

以下展示并非全部功能。

@kotori-bot/kotori-plugin-core

@kotori-bot/kotori-plugin-help

@kotori-bot/kotori-plugin-menu

/menu 查看 BOT 菜单 别名:cd

kotori-plugin-random-img

kotori-plugin-bangumi

bash
/bgm 素晴日
+> 原名:素晴らしき日々~不連続存在~公式ビジュアルアーカイヴ
+中文名:素晴之日 不连续的存在 Official Visual Archive
+介绍:人気アダルトゲームブランド「ケロQ」から、実に6年ぶりに発売された新作『素晴らしき日々 ~不連続存在~』。その魅力をギュッと閉じ込めたファン必携の一冊。描き下ろしイラスト&原作を担当したSCA-自(すかぢ)氏の新作書き下ろしテキスト満載でお届け。
+标签:素晴らしき日々 设定集 电波 神作 素晴日 公式书 2010 百合 FanBook 悬疑 画集 画集・設定資料集 推理 VFB
+详情:https://bgm.tv/subject/8318
+[image]

kotori-plugin-bilibili

kotori-plugin-hitokoto

bash
/hitokoto
+> 如果人们不相信数学简单,那是因为他们没有意识到人生有多复杂。——冯诺依曼
+类型:俗语

kotori-plugin-mediawiki

bash
/wiki 月社妃
+> 标题:月社妃
+内容:月社妃(日语:月社(つきやしろ) 妃(きさき))是由ウグイスカグラ所制作的18禁galgame《纸上的魔法使》及其衍生作品的登场角色。是主人公四条琉璃的同胞妹妹。
+https://mzh.moegirl.org.cn/.php?curid=384932
+来源:萌娘百科

kotori-plugin-github

bash
/github kotorijs/kotori
+> 地址:kotorijs/kotori
+描述:Cross platform, decoupled, and modernized ChatBot framework base on NodeJS
+语言:TypeScript
+所有者:kotorijs
+创建时间:
+2023-06-14T11:45:16Z
+最后更新时间:2023-12-31T15:28:10Z
+最后推送时间:2024-01-14T09:48:13Z
+开源协议:GNU General Public License v3.0

kotori-plugin-music

bash
/music 夢水の調べ
+> 歌曲ID:2077744375
+歌曲标题:夢水の調べ
+歌曲作者:おはる
+歌曲下载:http://music.163.com/song/media/outer/url?id=2077744375.mp3
+歌曲封面:[image]

kotori-plugin-weather

bash
/weather 北京
+> 城市:北京市
+日期:周四
+温度:-6~4℃
+天气:晴
+风度:南风-2级
+空气质量:良
+
+日期:周五
+温度:-5~0℃
+天气:阴
+风度:东风-1级
+空气质量:良
+
+日期:周六
+温度:-8~0℃
+天气:阴
+风度:东北风-1级
+空气质量:良
`,49),o=[e];function n(h,p,r,k,d,c){return s(),a("div",null,o)}const b=i(t,[["render",n]]);export{g as __pageData,b as default}; diff --git a/assets/basic_usage.md.CgIyI17j.lean.js b/assets/basic_usage.md.CgIyI17j.lean.js new file mode 100644 index 00000000..7d8363d5 --- /dev/null +++ b/assets/basic_usage.md.CgIyI17j.lean.js @@ -0,0 +1 @@ +import{_ as i,c as a,o as s,V as l}from"./chunks/framework.Dy019jra.js";const g=JSON.parse('{"title":"立即使用","description":"","frontmatter":{},"headers":[],"relativePath":"basic/usage.md","filePath":"basic/usage.md","lastUpdated":1707642172000}'),t={name:"basic/usage.md"},e=l("",49),o=[e];function n(h,p,r,k,d,c){return s(),a("div",null,o)}const b=i(t,[["render",n]]);export{g as __pageData,b as default}; diff --git a/assets/chunks/framework.Dy019jra.js b/assets/chunks/framework.Dy019jra.js new file mode 100644 index 00000000..f27d7902 --- /dev/null +++ b/assets/chunks/framework.Dy019jra.js @@ -0,0 +1,17 @@ +/** +* @vue/shared v3.4.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function gs(e,t){const n=new Set(e.split(","));return t?s=>n.has(s.toLowerCase()):s=>n.has(s)}const te={},mt=[],xe=()=>{},io=()=>!1,Ut=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),ms=e=>e.startsWith("onUpdate:"),ie=Object.assign,_s=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},oo=Object.prototype.hasOwnProperty,X=(e,t)=>oo.call(e,t),B=Array.isArray,_t=e=>bn(e)==="[object Map]",Fr=e=>bn(e)==="[object Set]",k=e=>typeof e=="function",ne=e=>typeof e=="string",St=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",$r=e=>(Z(e)||k(e))&&k(e.then)&&k(e.catch),Hr=Object.prototype.toString,bn=e=>Hr.call(e),lo=e=>bn(e).slice(8,-1),jr=e=>bn(e)==="[object Object]",ys=e=>ne(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,yt=gs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),vn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},co=/-(\w)/g,Me=vn(e=>e.replace(co,(t,n)=>n?n.toUpperCase():"")),ao=/\B([A-Z])/g,at=vn(e=>e.replace(ao,"-$1").toLowerCase()),wn=vn(e=>e.charAt(0).toUpperCase()+e.slice(1)),on=vn(e=>e?`on${wn(e)}`:""),Qe=(e,t)=>!Object.is(e,t),Vn=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},uo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},fo=e=>{const t=ne(e)?Number(e):NaN;return isNaN(t)?e:t};let Us;const Vr=()=>Us||(Us=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function bs(e){if(B(e)){const t={};for(let n=0;n{if(n){const s=n.split(po);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function vs(e){let t="";if(ne(e))t=e;else if(B(e))for(let n=0;nne(e)?e:e==null?"":B(e)||Z(e)&&(e.toString===Hr||!k(e.toString))?JSON.stringify(e,Br,2):String(e),Br=(e,t)=>t&&t.__v_isRef?Br(e,t.value):_t(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Dn(s,i)+" =>"]=r,n),{})}:Fr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Dn(n))}:St(t)?Dn(t):Z(t)&&!B(t)&&!jr(t)?String(t):t,Dn=(e,t="")=>{var n;return St(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.4.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let be;class bo{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=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),ft()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=Ge,n=ot;try{return Ge=!0,ot=this,this._runnings++,ks(this),this.fn()}finally{Ks(this),this._runnings--,ot=n,Ge=t}}stop(){var t;this.active&&(ks(this),Ks(this),(t=this.onStop)==null||t.call(this),this.active=!1)}}function Eo(e){return e.value}function ks(e){e._trackId++,e._depsLength=0}function Ks(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},un=new WeakMap,lt=Symbol(""),ss=Symbol("");function _e(e,t,n){if(Ge&&ot){let s=un.get(e);s||un.set(e,s=new Map);let r=s.get(n);r||s.set(n,r=Gr(()=>s.delete(n))),Wr(ot,r)}}function $e(e,t,n,s,r,i){const o=un.get(e);if(!o)return;let l=[];if(t==="clear")l=[...o.values()];else if(n==="length"&&B(e)){const c=Number(s);o.forEach((u,d)=>{(d==="length"||!St(d)&&d>=c)&&l.push(u)})}else switch(n!==void 0&&l.push(o.get(n)),t){case"add":B(e)?ys(n)&&l.push(o.get("length")):(l.push(o.get(lt)),_t(e)&&l.push(o.get(ss)));break;case"delete":B(e)||(l.push(o.get(lt)),_t(e)&&l.push(o.get(ss)));break;case"set":_t(e)&&l.push(o.get(lt));break}Es();for(const c of l)c&&qr(c,4);Cs()}function Co(e,t){var n;return(n=un.get(e))==null?void 0:n.get(t)}const xo=gs("__proto__,__v_isRef,__isVue"),zr=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(St)),Ws=So();function So(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const s=Y(this);for(let i=0,o=this.length;i{e[t]=function(...n){ut(),Es();const s=Y(this)[t].apply(this,n);return Cs(),ft(),s}}),e}function To(e){const t=Y(this);return _e(t,"has",e),t.hasOwnProperty(e)}class Xr{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,s){const r=this._isReadonly,i=this._shallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Vo:Zr:i?Qr:Jr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=B(t);if(!r){if(o&&X(Ws,n))return Reflect.get(Ws,n,s);if(n==="hasOwnProperty")return To}const l=Reflect.get(t,n,s);return(St(n)?zr.has(n):xo(n))||(r||_e(t,"get",n),i)?l:de(l)?o&&ys(n)?l:l.value:Z(l)?r?xn(l):Cn(l):l}}class Yr extends Xr{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._shallow){const c=Ct(i);if(!fn(s)&&!Ct(s)&&(i=Y(i),s=Y(s)),!B(t)&&de(i)&&!de(s))return c?!1:(i.value=s,!0)}const o=B(t)&&ys(n)?Number(n)e,En=e=>Reflect.getPrototypeOf(e);function qt(e,t,n=!1,s=!1){e=e.__v_raw;const r=Y(e),i=Y(t);n||(Qe(t,i)&&_e(r,"get",t),_e(r,"get",i));const{has:o}=En(r),l=s?xs:n?As:Ht;if(o.call(r,t))return l(e.get(t));if(o.call(r,i))return l(e.get(i));e!==r&&e.get(t)}function Gt(e,t=!1){const n=this.__v_raw,s=Y(n),r=Y(e);return t||(Qe(e,r)&&_e(s,"has",e),_e(s,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function zt(e,t=!1){return e=e.__v_raw,!t&&_e(Y(e),"iterate",lt),Reflect.get(e,"size",e)}function qs(e){e=Y(e);const t=Y(this);return En(t).has.call(t,e)||(t.add(e),$e(t,"add",e,e)),this}function Gs(e,t){t=Y(t);const n=Y(this),{has:s,get:r}=En(n);let i=s.call(n,e);i||(e=Y(e),i=s.call(n,e));const o=r.call(n,e);return n.set(e,t),i?Qe(t,o)&&$e(n,"set",e,t):$e(n,"add",e,t),this}function zs(e){const t=Y(this),{has:n,get:s}=En(t);let r=n.call(t,e);r||(e=Y(e),r=n.call(t,e)),s&&s.call(t,e);const i=t.delete(e);return r&&$e(t,"delete",e,void 0),i}function Xs(){const e=Y(this),t=e.size!==0,n=e.clear();return t&&$e(e,"clear",void 0,void 0),n}function Xt(e,t){return function(s,r){const i=this,o=i.__v_raw,l=Y(o),c=t?xs:e?As:Ht;return!e&&_e(l,"iterate",lt),o.forEach((u,d)=>s.call(r,c(u),c(d),i))}}function Yt(e,t,n){return function(...s){const r=this.__v_raw,i=Y(r),o=_t(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),d=n?xs:t?As:Ht;return!t&&_e(i,"iterate",c?ss:lt),{next(){const{value:h,done:m}=u.next();return m?{value:h,done:m}:{value:l?[d(h[0]),d(h[1])]:d(h),done:m}},[Symbol.iterator](){return this}}}}function Ve(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Io(){const e={get(i){return qt(this,i)},get size(){return zt(this)},has:Gt,add:qs,set:Gs,delete:zs,clear:Xs,forEach:Xt(!1,!1)},t={get(i){return qt(this,i,!1,!0)},get size(){return zt(this)},has:Gt,add:qs,set:Gs,delete:zs,clear:Xs,forEach:Xt(!1,!0)},n={get(i){return qt(this,i,!0)},get size(){return zt(this,!0)},has(i){return Gt.call(this,i,!0)},add:Ve("add"),set:Ve("set"),delete:Ve("delete"),clear:Ve("clear"),forEach:Xt(!0,!1)},s={get(i){return qt(this,i,!0,!0)},get size(){return zt(this,!0)},has(i){return Gt.call(this,i,!0)},add:Ve("add"),set:Ve("set"),delete:Ve("delete"),clear:Ve("clear"),forEach:Xt(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Yt(i,!1,!1),n[i]=Yt(i,!0,!1),t[i]=Yt(i,!1,!0),s[i]=Yt(i,!0,!0)}),[e,n,t,s]}const[Po,Mo,No,Fo]=Io();function Ss(e,t){const n=t?e?Fo:No:e?Mo:Po;return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(X(n,r)&&r in s?n:s,r,i)}const $o={get:Ss(!1,!1)},Ho={get:Ss(!1,!0)},jo={get:Ss(!0,!1)},Jr=new WeakMap,Qr=new WeakMap,Zr=new WeakMap,Vo=new WeakMap;function Do(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Bo(e){return e.__v_skip||!Object.isExtensible(e)?0:Do(lo(e))}function Cn(e){return Ct(e)?e:Ts(e,!1,Ro,$o,Jr)}function Uo(e){return Ts(e,!1,Lo,Ho,Qr)}function xn(e){return Ts(e,!0,Oo,jo,Zr)}function Ts(e,t,n,s,r){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=Bo(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function bt(e){return Ct(e)?bt(e.__v_raw):!!(e&&e.__v_isReactive)}function Ct(e){return!!(e&&e.__v_isReadonly)}function fn(e){return!!(e&&e.__v_isShallow)}function ei(e){return bt(e)||Ct(e)}function Y(e){const t=e&&e.__v_raw;return t?Y(t):e}function Lt(e){return Object.isExtensible(e)&&an(e,"__v_skip",!0),e}const Ht=e=>Z(e)?Cn(e):e,As=e=>Z(e)?xn(e):e;class ti{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new ws(()=>t(this._value),()=>It(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=Y(this);return(!t._cacheable||t.effect.dirty)&&Qe(t._value,t._value=t.effect.run())&&It(t,4),Rs(t),t.effect._dirtyLevel>=2&&It(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function ko(e,t,n=!1){let s,r;const i=k(e);return i?(s=e,r=xe):(s=e.get,r=e.set),new ti(s,r,i||!r,n)}function Rs(e){var t;Ge&&ot&&(e=Y(e),Wr(ot,(t=e.dep)!=null?t:e.dep=Gr(()=>e.dep=void 0,e instanceof ti?e:void 0)))}function It(e,t=4,n){e=Y(e);const s=e.dep;s&&qr(s,t)}function de(e){return!!(e&&e.__v_isRef===!0)}function me(e){return si(e,!1)}function ni(e){return si(e,!0)}function si(e,t){return de(e)?e:new Ko(e,t)}class Ko{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Y(t),this._value=n?t:Ht(t)}get value(){return Rs(this),this._value}set value(t){const n=this.__v_isShallow||fn(t)||Ct(t);t=n?t:Y(t),Qe(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Ht(t),It(this,4))}}function ri(e){return de(e)?e.value:e}const Wo={get:(e,t,n)=>ri(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return de(r)&&!de(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function ii(e){return bt(e)?e:new Proxy(e,Wo)}class qo{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:s}=t(()=>Rs(this),()=>It(this));this._get=n,this._set=s}get value(){return this._get()}set value(t){this._set(t)}}function Go(e){return new qo(e)}class zo{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 Co(Y(this._object),this._key)}}class Xo{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Yo(e,t,n){return de(e)?e:k(e)?new Xo(e):Z(e)&&arguments.length>1?Jo(e,t,n):me(e)}function Jo(e,t,n){const s=e[t];return de(s)?s:new zo(e,t,n)}/** +* @vue/runtime-core v3.4.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function ze(e,t,n,s){let r;try{r=s?e(...s):e()}catch(i){Sn(i,t,n)}return r}function Se(e,t,n,s){if(k(e)){const i=ze(e,t,n,s);return i&&$r(i)&&i.catch(o=>{Sn(o,t,n)}),i}const r=[];for(let i=0;i>>1,r=ue[s],i=Vt(r);iPe&&ue.splice(t,1)}function tl(e){B(e)?vt.push(...e):(!ke||!ke.includes(e,e.allowRecurse?rt+1:rt))&&vt.push(e),li()}function Ys(e,t,n=jt?Pe+1:0){for(;nVt(n)-Vt(s));if(vt.length=0,ke){ke.push(...t);return}for(ke=t,rt=0;rte.id==null?1/0:e.id,nl=(e,t)=>{const n=Vt(e)-Vt(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function ci(e){rs=!1,jt=!0,ue.sort(nl);try{for(Pe=0;Pene(w)?w.trim():w)),h&&(r=n.map(uo))}let l,c=s[l=on(t)]||s[l=on(Me(t))];!c&&i&&(c=s[l=on(at(t))]),c&&Se(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,Se(u,e,6,r)}}function ai(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!k(e)){const c=u=>{const d=ai(u,t,!0);d&&(l=!0,ie(o,d))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(Z(e)&&s.set(e,null),null):(B(i)?i.forEach(c=>o[c]=null):ie(o,i),Z(e)&&s.set(e,o),o)}function An(e,t){return!e||!Ut(t)?!1:(t=t.slice(2).replace(/Once$/,""),X(e,t[0].toLowerCase()+t.slice(1))||X(e,at(t))||X(e,t))}let fe=null,Rn=null;function hn(e){const t=fe;return fe=e,Rn=e&&e.type.__scopeId||null,t}function $a(e){Rn=e}function Ha(){Rn=null}function rl(e,t=fe,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&cr(-1);const i=hn(t);let o;try{o=e(...r)}finally{hn(i),s._d&&cr(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function Bn(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:i,propsOptions:[o],slots:l,attrs:c,emit:u,render:d,renderCache:h,data:m,setupState:w,ctx:L,inheritAttrs:M}=e;let V,W;const J=hn(e);try{if(n.shapeFlag&4){const _=r||s,N=_;V=Ae(d.call(N,_,h,i,w,m,L)),W=c}else{const _=t;V=Ae(_.length>1?_(i,{attrs:c,slots:l,emit:u}):_(i,null)),W=t.props?c:il(c)}}catch(_){Ft.length=0,Sn(_,e,1),V=ae(ve)}let p=V;if(W&&M!==!1){const _=Object.keys(W),{shapeFlag:N}=p;_.length&&N&7&&(o&&_.some(ms)&&(W=ol(W,o)),p=Ze(p,W))}return n.dirs&&(p=Ze(p),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&(p.transition=n.transition),V=p,hn(J),V}const il=e=>{let t;for(const n in e)(n==="class"||n==="style"||Ut(n))&&((t||(t={}))[n]=e[n]);return t},ol=(e,t)=>{const n={};for(const s in e)(!ms(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function ll(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Js(s,o,u):!!o;if(c&8){const d=t.dynamicProps;for(let h=0;he.__isSuspense;function di(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):tl(e)}const ul=Symbol.for("v-scx"),fl=()=>Et(ul);function hi(e,t){return On(e,null,t)}function Da(e,t){return On(e,null,{flush:"post"})}const Jt={};function Xe(e,t,n){return On(e,t,n)}function On(e,t,{immediate:n,deep:s,flush:r,once:i,onTrack:o,onTrigger:l}=te){if(t&&i){const I=t;t=(...D)=>{I(...D),N()}}const c=ce,u=I=>s===!0?I:pt(I,s===!1?1:void 0);let d,h=!1,m=!1;if(de(e)?(d=()=>e.value,h=fn(e)):bt(e)?(d=()=>u(e),h=!0):B(e)?(m=!0,h=e.some(I=>bt(I)||fn(I)),d=()=>e.map(I=>{if(de(I))return I.value;if(bt(I))return u(I);if(k(I))return ze(I,c,2)})):k(e)?t?d=()=>ze(e,c,2):d=()=>(w&&w(),Se(e,c,3,[L])):d=xe,t&&s){const I=d;d=()=>pt(I())}let w,L=I=>{w=p.onStop=()=>{ze(I,c,4),w=p.onStop=void 0}},M;if(Fn)if(L=xe,t?n&&Se(t,c,3,[d(),m?[]:void 0,L]):d(),r==="sync"){const I=fl();M=I.__watcherHandles||(I.__watcherHandles=[])}else return xe;let V=m?new Array(e.length).fill(Jt):Jt;const W=()=>{if(!(!p.active||!p.dirty))if(t){const I=p.run();(s||h||(m?I.some((D,R)=>Qe(D,V[R])):Qe(I,V)))&&(w&&w(),Se(t,c,3,[I,V===Jt?void 0:m&&V[0]===Jt?[]:V,L]),V=I)}else p.run()};W.allowRecurse=!!t;let J;r==="sync"?J=W:r==="post"?J=()=>pe(W,c&&c.suspense):(W.pre=!0,c&&(W.id=c.uid),J=()=>Ls(W));const p=new ws(d,xe,J),_=Ur(),N=()=>{p.stop(),_&&_s(_.effects,p)};return t?n?W():V=p.run():r==="post"?pe(p.run.bind(p),c&&c.suspense):p.run(),M&&M.push(N),N}function dl(e,t,n){const s=this.proxy,r=ne(e)?e.includes(".")?pi(s,e):()=>s[e]:e.bind(s,s);let i;k(t)?i=t:(i=t.handler,n=t);const o=kt(this),l=On(r,i.bind(s),n);return o(),l}function pi(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;r0){if(n>=t)return e;n++}if(s=s||new Set,s.has(e))return e;if(s.add(e),de(e))pt(e.value,t,n,s);else if(B(e))for(let r=0;r{pt(r,t,n,s)});else if(jr(e))for(const r in e)pt(e[r],t,n,s);return e}function Ie(e,t,n,s){const r=e.dirs,i=t&&t.dirs;for(let o=0;o{e.isMounted=!0}),vi(()=>{e.isUnmounting=!0}),e}const we=[Function,Array],gi={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},pl={name:"BaseTransition",props:gi,setup(e,{slots:t}){const n=Nn(),s=hl();let r;return()=>{const i=t.default&&_i(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const M of i)if(M.type!==ve){o=M;break}}const l=Y(e),{mode:c}=l;if(s.isLeaving)return Un(o);const u=Zs(o);if(!u)return Un(o);const d=is(u,l,s,n);os(u,d);const h=n.subTree,m=h&&Zs(h);let w=!1;const{getTransitionKey:L}=u.type;if(L){const M=L();r===void 0?r=M:M!==r&&(r=M,w=!0)}if(m&&m.type!==ve&&(!it(u,m)||w)){const M=is(m,l,s,n);if(os(m,M),c==="out-in")return s.isLeaving=!0,M.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Un(o);c==="in-out"&&u.type!==ve&&(M.delayLeave=(V,W,J)=>{const p=mi(s,m);p[String(m.key)]=m,V[Ke]=()=>{W(),V[Ke]=void 0,delete d.delayedLeave},d.delayedLeave=J})}return o}}},gl=pl;function mi(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 is(e,t,n,s){const{appear:r,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:c,onAfterEnter:u,onEnterCancelled:d,onBeforeLeave:h,onLeave:m,onAfterLeave:w,onLeaveCancelled:L,onBeforeAppear:M,onAppear:V,onAfterAppear:W,onAppearCancelled:J}=t,p=String(e.key),_=mi(n,e),N=(R,T)=>{R&&Se(R,s,9,T)},I=(R,T)=>{const S=T[1];N(R,T),B(R)?R.every(K=>K.length<=1)&&S():R.length<=1&&S()},D={mode:i,persisted:o,beforeEnter(R){let T=l;if(!n.isMounted)if(r)T=M||l;else return;R[Ke]&&R[Ke](!0);const S=_[p];S&&it(e,S)&&S.el[Ke]&&S.el[Ke](),N(T,[R])},enter(R){let T=c,S=u,K=d;if(!n.isMounted)if(r)T=V||c,S=W||u,K=J||d;else return;let O=!1;const q=R[Qt]=re=>{O||(O=!0,re?N(K,[R]):N(S,[R]),D.delayedLeave&&D.delayedLeave(),R[Qt]=void 0)};T?I(T,[R,q]):q()},leave(R,T){const S=String(e.key);if(R[Qt]&&R[Qt](!0),n.isUnmounting)return T();N(h,[R]);let K=!1;const O=R[Ke]=q=>{K||(K=!0,T(),q?N(L,[R]):N(w,[R]),R[Ke]=void 0,_[S]===e&&delete _[S])};_[S]=e,m?I(m,[R,O]):O()},clone(R){return is(R,t,n,s)}};return D}function Un(e){if(Ln(e))return e=Ze(e),e.children=null,e}function Zs(e){return Ln(e)?e.children?e.children[0]:void 0:e}function os(e,t){e.shapeFlag&6&&e.component?os(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 _i(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;i!!e.type.__asyncLoader,Ln=e=>e.type.__isKeepAlive;function ml(e,t){bi(e,"a",t)}function _l(e,t){bi(e,"da",t)}function bi(e,t,n=ce){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(In(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Ln(r.parent.vnode)&&yl(s,t,n,r),r=r.parent}}function yl(e,t,n,s){const r=In(t,e,s,!0);Pn(()=>{_s(s[t],r)},n)}function In(e,t,n=ce,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;ut();const l=kt(n),c=Se(t,n,e,o);return l(),ft(),c});return s?r.unshift(i):r.push(i),i}}const je=e=>(t,n=ce)=>(!Fn||e==="sp")&&In(e,(...s)=>t(...s),n),bl=je("bm"),Tt=je("m"),vl=je("bu"),wl=je("u"),vi=je("bum"),Pn=je("um"),El=je("sp"),Cl=je("rtg"),xl=je("rtc");function Sl(e,t=ce){In("ec",e,t)}function Ba(e,t,n,s){let r;const i=n&&n[s];if(B(e)||ne(e)){r=new Array(e.length);for(let o=0,l=e.length;ot(o,l,void 0,i&&i[l]));else{const o=Object.keys(e);r=new Array(o.length);for(let l=0,c=o.length;lmn(t)?!(t.type===ve||t.type===ge&&!wi(t.children)):!0)?e:null}function ka(e,t){const n={};for(const s in e)n[t&&/[A-Z]/.test(s)?`on:${s}`:on(s)]=e[s];return n}const ls=e=>e?ji(e)?Fs(e)||e.proxy:ls(e.parent):null,Pt=ie(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=>ls(e.parent),$root:e=>ls(e.root),$emit:e=>e.emit,$options:e=>Ps(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,Ls(e.update)}),$nextTick:e=>e.n||(e.n=Tn.bind(e.proxy)),$watch:e=>dl.bind(e)}),kn=(e,t)=>e!==te&&!e.__isScriptSetup&&X(e,t),Tl={get({_:e},t){const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const w=o[t];if(w!==void 0)switch(w){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(kn(s,t))return o[t]=1,s[t];if(r!==te&&X(r,t))return o[t]=2,r[t];if((u=e.propsOptions[0])&&X(u,t))return o[t]=3,i[t];if(n!==te&&X(n,t))return o[t]=4,n[t];cs&&(o[t]=0)}}const d=Pt[t];let h,m;if(d)return t==="$attrs"&&_e(e,"get",t),d(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==te&&X(n,t))return o[t]=4,n[t];if(m=c.config.globalProperties,X(m,t))return m[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return kn(r,t)?(r[t]=n,!0):s!==te&&X(s,t)?(s[t]=n,!0):X(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==te&&X(e,o)||kn(t,o)||(l=i[0])&&X(l,o)||X(s,o)||X(Pt,o)||X(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:X(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ka(){return Al().slots}function Al(){const e=Nn();return e.setupContext||(e.setupContext=Di(e))}function er(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let cs=!0;function Rl(e){const t=Ps(e),n=e.proxy,s=e.ctx;cs=!1,t.beforeCreate&&tr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:d,beforeMount:h,mounted:m,beforeUpdate:w,updated:L,activated:M,deactivated:V,beforeDestroy:W,beforeUnmount:J,destroyed:p,unmounted:_,render:N,renderTracked:I,renderTriggered:D,errorCaptured:R,serverPrefetch:T,expose:S,inheritAttrs:K,components:O,directives:q,filters:re}=t;if(u&&Ol(u,s,null),o)for(const z in o){const $=o[z];k($)&&(s[z]=$.bind(n))}if(r){const z=r.call(n,n);Z(z)&&(e.data=Cn(z))}if(cs=!0,i)for(const z in i){const $=i[z],Ne=k($)?$.bind(n,n):k($.get)?$.get.bind(n,n):xe,Kt=!k($)&&k($.set)?$.set.bind(n):xe,et=se({get:Ne,set:Kt});Object.defineProperty(s,z,{enumerable:!0,configurable:!0,get:()=>et.value,set:Oe=>et.value=Oe})}if(l)for(const z in l)Ei(l[z],s,n,z);if(c){const z=k(c)?c.call(n):c;Reflect.ownKeys(z).forEach($=>{Fl($,z[$])})}d&&tr(d,e,"c");function H(z,$){B($)?$.forEach(Ne=>z(Ne.bind(n))):$&&z($.bind(n))}if(H(bl,h),H(Tt,m),H(vl,w),H(wl,L),H(ml,M),H(_l,V),H(Sl,R),H(xl,I),H(Cl,D),H(vi,J),H(Pn,_),H(El,T),B(S))if(S.length){const z=e.exposed||(e.exposed={});S.forEach($=>{Object.defineProperty(z,$,{get:()=>n[$],set:Ne=>n[$]=Ne})})}else e.exposed||(e.exposed={});N&&e.render===xe&&(e.render=N),K!=null&&(e.inheritAttrs=K),O&&(e.components=O),q&&(e.directives=q)}function Ol(e,t,n=xe){B(e)&&(e=as(e));for(const s in e){const r=e[s];let i;Z(r)?"default"in r?i=Et(r.from||s,r.default,!0):i=Et(r.from||s):i=Et(r),de(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function tr(e,t,n){Se(B(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ei(e,t,n,s){const r=s.includes(".")?pi(n,s):()=>n[s];if(ne(e)){const i=t[e];k(i)&&Xe(r,i)}else if(k(e))Xe(r,e.bind(n));else if(Z(e))if(B(e))e.forEach(i=>Ei(i,t,n,s));else{const i=k(e.handler)?e.handler.bind(n):t[e.handler];k(i)&&Xe(r,i,e)}}function Ps(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>pn(c,u,o,!0)),pn(c,t,o)),Z(t)&&i.set(t,c),c}function pn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&pn(e,i,n,!0),r&&r.forEach(o=>pn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Ll[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Ll={data:nr,props:sr,emits:sr,methods:Ot,computed:Ot,beforeCreate:he,created:he,beforeMount:he,mounted:he,beforeUpdate:he,updated:he,beforeDestroy:he,beforeUnmount:he,destroyed:he,unmounted:he,activated:he,deactivated:he,errorCaptured:he,serverPrefetch:he,components:Ot,directives:Ot,watch:Pl,provide:nr,inject:Il};function nr(e,t){return t?e?function(){return ie(k(e)?e.call(this,this):e,k(t)?t.call(this,this):t)}:t:e}function Il(e,t){return Ot(as(e),as(t))}function as(e){if(B(e)){const t={};for(let n=0;n1)return n&&k(t)?t.call(s&&s.proxy):t}}function $l(e,t,n,s=!1){const r={},i={};an(i,Mn,1),e.propsDefaults=Object.create(null),xi(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Uo(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Hl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=Y(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const d=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[m,w]=Si(h,t,!0);ie(o,m),w&&l.push(...w)};!n&&t.mixins.length&&t.mixins.forEach(d),e.extends&&d(e.extends),e.mixins&&e.mixins.forEach(d)}if(!i&&!c)return Z(e)&&s.set(e,mt),mt;if(B(i))for(let d=0;d-1,w[1]=M<0||L-1||X(w,"default"))&&l.push(h)}}}const u=[o,l];return Z(e)&&s.set(e,u),u}function rr(e){return e[0]!=="$"&&!yt(e)}function ir(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function or(e,t){return ir(e)===ir(t)}function lr(e,t){return B(t)?t.findIndex(n=>or(n,e)):k(t)&&or(t,e)?0:-1}const Ti=e=>e[0]==="_"||e==="$stable",Ms=e=>B(e)?e.map(Ae):[Ae(e)],jl=(e,t,n)=>{if(t._n)return t;const s=rl((...r)=>Ms(t(...r)),n);return s._c=!1,s},Ai=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Ti(r))continue;const i=e[r];if(k(i))t[r]=jl(r,i,s);else if(i!=null){const o=Ms(i);t[r]=()=>o}}},Ri=(e,t)=>{const n=Ms(t);e.slots.default=()=>n},Vl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=Y(t),an(t,"_",n)):Ai(t,e.slots={})}else e.slots={},t&&Ri(e,t);an(e.slots,Mn,1)},Dl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(ie(r,t),!n&&l===1&&delete r._):(i=!t.$stable,Ai(t,r)),o=t}else t&&(Ri(e,t),o={default:1});if(i)for(const l in r)!Ti(l)&&o[l]==null&&delete r[l]};function gn(e,t,n,s,r=!1){if(B(e)){e.forEach((m,w)=>gn(m,t&&(B(t)?t[w]:t),n,s,r));return}if(wt(s)&&!r)return;const i=s.shapeFlag&4?Fs(s.component)||s.component.proxy:s.el,o=r?null:i,{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&&(ne(u)?(d[u]=null,X(h,u)&&(h[u]=null)):de(u)&&(u.value=null)),k(c))ze(c,l,12,[o,d]);else{const m=ne(c),w=de(c);if(m||w){const L=()=>{if(e.f){const M=m?X(h,c)?h[c]:d[c]:c.value;r?B(M)&&_s(M,i):B(M)?M.includes(i)||M.push(i):m?(d[c]=[i],X(h,c)&&(h[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else m?(d[c]=o,X(h,c)&&(h[c]=o)):w&&(c.value=o,e.k&&(d[e.k]=o))};o?(L.id=-1,pe(L,n)):L()}}}let De=!1;const Bl=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Ul=e=>e.namespaceURI.includes("MathML"),Zt=e=>{if(Bl(e))return"svg";if(Ul(e))return"mathml"},en=e=>e.nodeType===8;function kl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,d=(p,_)=>{if(!_.hasChildNodes()){n(null,p,_),dn(),_._vnode=p;return}De=!1,h(_.firstChild,p,null,null,null),dn(),_._vnode=p,De&&console.error("Hydration completed but contains mismatches.")},h=(p,_,N,I,D,R=!1)=>{const T=en(p)&&p.data==="[",S=()=>M(p,_,N,I,D,T),{type:K,ref:O,shapeFlag:q,patchFlag:re}=_;let le=p.nodeType;_.el=p,re===-2&&(R=!1,_.dynamicChildren=null);let H=null;switch(K){case xt:le!==3?_.children===""?(c(_.el=r(""),o(p),p),H=p):H=S():(p.data!==_.children&&(De=!0,p.data=_.children),H=i(p));break;case ve:J(p)?(H=i(p),W(_.el=p.content.firstChild,p,N)):le!==8||T?H=S():H=i(p);break;case Nt:if(T&&(p=i(p),le=p.nodeType),le===1||le===3){H=p;const z=!_.children.length;for(let $=0;$<_.staticCount;$++)z&&(_.children+=H.nodeType===1?H.outerHTML:H.data),$===_.staticCount-1&&(_.anchor=H),H=i(H);return T?i(H):H}else S();break;case ge:T?H=L(p,_,N,I,D,R):H=S();break;default:if(q&1)(le!==1||_.type.toLowerCase()!==p.tagName.toLowerCase())&&!J(p)?H=S():H=m(p,_,N,I,D,R);else if(q&6){_.slotScopeIds=D;const z=o(p);if(T?H=V(p):en(p)&&p.data==="teleport start"?H=V(p,p.data,"teleport end"):H=i(p),t(_,z,null,N,I,Zt(z),R),wt(_)){let $;T?($=ae(ge),$.anchor=H?H.previousSibling:z.lastChild):$=p.nodeType===3?Hi(""):ae("div"),$.el=p,_.component.subTree=$}}else q&64?le!==8?H=S():H=_.type.hydrate(p,_,N,I,D,R,e,w):q&128&&(H=_.type.hydrate(p,_,N,I,Zt(o(p)),D,R,e,h))}return O!=null&&gn(O,null,I,_),H},m=(p,_,N,I,D,R)=>{R=R||!!_.dynamicChildren;const{type:T,props:S,patchFlag:K,shapeFlag:O,dirs:q,transition:re}=_,le=T==="input"||T==="option";if(le||K!==-1){q&&Ie(_,null,N,"created");let H=!1;if(J(p)){H=Oi(I,re)&&N&&N.vnode.props&&N.vnode.props.appear;const $=p.content.firstChild;H&&re.beforeEnter($),W($,p,N),_.el=p=$}if(O&16&&!(S&&(S.innerHTML||S.textContent))){let $=w(p.firstChild,_,p,N,I,D,R);for(;$;){De=!0;const Ne=$;$=$.nextSibling,l(Ne)}}else O&8&&p.textContent!==_.children&&(De=!0,p.textContent=_.children);if(S)if(le||!R||K&48)for(const $ in S)(le&&($.endsWith("value")||$==="indeterminate")||Ut($)&&!yt($)||$[0]===".")&&s(p,$,null,S[$],void 0,void 0,N);else S.onClick&&s(p,"onClick",null,S.onClick,void 0,void 0,N);let z;(z=S&&S.onVnodeBeforeMount)&&Ee(z,N,_),q&&Ie(_,null,N,"beforeMount"),((z=S&&S.onVnodeMounted)||q||H)&&di(()=>{z&&Ee(z,N,_),H&&re.enter(p),q&&Ie(_,null,N,"mounted")},I)}return p.nextSibling},w=(p,_,N,I,D,R,T)=>{T=T||!!_.dynamicChildren;const S=_.children,K=S.length;for(let O=0;O{const{slotScopeIds:T}=_;T&&(D=D?D.concat(T):T);const S=o(p),K=w(i(p),_,S,N,I,D,R);return K&&en(K)&&K.data==="]"?i(_.anchor=K):(De=!0,c(_.anchor=u("]"),S,K),K)},M=(p,_,N,I,D,R)=>{if(De=!0,_.el=null,R){const K=V(p);for(;;){const O=i(p);if(O&&O!==K)l(O);else break}}const T=i(p),S=o(p);return l(p),n(null,_,S,T,N,I,Zt(S),D),T},V=(p,_="[",N="]")=>{let I=0;for(;p;)if(p=i(p),p&&en(p)&&(p.data===_&&I++,p.data===N)){if(I===0)return i(p);I--}return p},W=(p,_,N)=>{const I=_.parentNode;I&&I.replaceChild(p,_);let D=N;for(;D;)D.vnode.el===_&&(D.vnode.el=D.subTree.el=p),D=D.parent},J=p=>p.nodeType===1&&p.tagName.toLowerCase()==="template";return[d,h]}const pe=di;function Kl(e){return Wl(e,kl)}function Wl(e,t){const n=Vr();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:d,parentNode:h,nextSibling:m,setScopeId:w=xe,insertStaticContent:L}=e,M=(a,f,g,y=null,b=null,C=null,A=void 0,E=null,x=!!f.dynamicChildren)=>{if(a===f)return;a&&!it(a,f)&&(y=Wt(a),Oe(a,b,C,!0),a=null),f.patchFlag===-2&&(x=!1,f.dynamicChildren=null);const{type:v,ref:P,shapeFlag:j}=f;switch(v){case xt:V(a,f,g,y);break;case ve:W(a,f,g,y);break;case Nt:a==null&&J(f,g,y,A);break;case ge:O(a,f,g,y,b,C,A,E,x);break;default:j&1?N(a,f,g,y,b,C,A,E,x):j&6?q(a,f,g,y,b,C,A,E,x):(j&64||j&128)&&v.process(a,f,g,y,b,C,A,E,x,dt)}P!=null&&b&&gn(P,a&&a.ref,C,f||a,!f)},V=(a,f,g,y)=>{if(a==null)s(f.el=l(f.children),g,y);else{const b=f.el=a.el;f.children!==a.children&&u(b,f.children)}},W=(a,f,g,y)=>{a==null?s(f.el=c(f.children||""),g,y):f.el=a.el},J=(a,f,g,y)=>{[a.el,a.anchor]=L(a.children,f,g,y,a.el,a.anchor)},p=({el:a,anchor:f},g,y)=>{let b;for(;a&&a!==f;)b=m(a),s(a,g,y),a=b;s(f,g,y)},_=({el:a,anchor:f})=>{let g;for(;a&&a!==f;)g=m(a),r(a),a=g;r(f)},N=(a,f,g,y,b,C,A,E,x)=>{f.type==="svg"?A="svg":f.type==="math"&&(A="mathml"),a==null?I(f,g,y,b,C,A,E,x):T(a,f,b,C,A,E,x)},I=(a,f,g,y,b,C,A,E)=>{let x,v;const{props:P,shapeFlag:j,transition:F,dirs:U}=a;if(x=a.el=o(a.type,C,P&&P.is,P),j&8?d(x,a.children):j&16&&R(a.children,x,null,y,b,Kn(a,C),A,E),U&&Ie(a,null,y,"created"),D(x,a,a.scopeId,A,y),P){for(const Q in P)Q!=="value"&&!yt(Q)&&i(x,Q,null,P[Q],C,a.children,y,b,Fe);"value"in P&&i(x,"value",null,P.value,C),(v=P.onVnodeBeforeMount)&&Ee(v,y,a)}U&&Ie(a,null,y,"beforeMount");const G=Oi(b,F);G&&F.beforeEnter(x),s(x,f,g),((v=P&&P.onVnodeMounted)||G||U)&&pe(()=>{v&&Ee(v,y,a),G&&F.enter(x),U&&Ie(a,null,y,"mounted")},b)},D=(a,f,g,y,b)=>{if(g&&w(a,g),y)for(let C=0;C{for(let v=x;v{const E=f.el=a.el;let{patchFlag:x,dynamicChildren:v,dirs:P}=f;x|=a.patchFlag&16;const j=a.props||te,F=f.props||te;let U;if(g&&tt(g,!1),(U=F.onVnodeBeforeUpdate)&&Ee(U,g,f,a),P&&Ie(f,a,g,"beforeUpdate"),g&&tt(g,!0),v?S(a.dynamicChildren,v,E,g,y,Kn(f,b),C):A||$(a,f,E,null,g,y,Kn(f,b),C,!1),x>0){if(x&16)K(E,f,j,F,g,y,b);else if(x&2&&j.class!==F.class&&i(E,"class",null,F.class,b),x&4&&i(E,"style",j.style,F.style,b),x&8){const G=f.dynamicProps;for(let Q=0;Q{U&&Ee(U,g,f,a),P&&Ie(f,a,g,"updated")},y)},S=(a,f,g,y,b,C,A)=>{for(let E=0;E{if(g!==y){if(g!==te)for(const E in g)!yt(E)&&!(E in y)&&i(a,E,g[E],null,A,f.children,b,C,Fe);for(const E in y){if(yt(E))continue;const x=y[E],v=g[E];x!==v&&E!=="value"&&i(a,E,v,x,A,f.children,b,C,Fe)}"value"in y&&i(a,"value",g.value,y.value,A)}},O=(a,f,g,y,b,C,A,E,x)=>{const v=f.el=a?a.el:l(""),P=f.anchor=a?a.anchor:l("");let{patchFlag:j,dynamicChildren:F,slotScopeIds:U}=f;U&&(E=E?E.concat(U):U),a==null?(s(v,g,y),s(P,g,y),R(f.children||[],g,P,b,C,A,E,x)):j>0&&j&64&&F&&a.dynamicChildren?(S(a.dynamicChildren,F,g,b,C,A,E),(f.key!=null||b&&f===b.subTree)&&Li(a,f,!0)):$(a,f,g,P,b,C,A,E,x)},q=(a,f,g,y,b,C,A,E,x)=>{f.slotScopeIds=E,a==null?f.shapeFlag&512?b.ctx.activate(f,g,y,A,x):re(f,g,y,b,C,A,x):le(a,f,x)},re=(a,f,g,y,b,C,A)=>{const E=a.component=ec(a,y,b);if(Ln(a)&&(E.ctx.renderer=dt),tc(E),E.asyncDep){if(b&&b.registerDep(E,H),!a.el){const x=E.subTree=ae(ve);W(null,x,f,g)}}else H(E,a,f,g,b,C,A)},le=(a,f,g)=>{const y=f.component=a.component;if(ll(a,f,g))if(y.asyncDep&&!y.asyncResolved){z(y,f,g);return}else y.next=f,el(y.update),y.effect.dirty=!0,y.update();else f.el=a.el,y.vnode=f},H=(a,f,g,y,b,C,A)=>{const E=()=>{if(a.isMounted){let{next:P,bu:j,u:F,parent:U,vnode:G}=a;{const ht=Ii(a);if(ht){P&&(P.el=G.el,z(a,P,A)),ht.asyncDep.then(()=>{a.isUnmounted||E()});return}}let Q=P,ee;tt(a,!1),P?(P.el=G.el,z(a,P,A)):P=G,j&&Vn(j),(ee=P.props&&P.props.onVnodeBeforeUpdate)&&Ee(ee,U,P,G),tt(a,!0);const oe=Bn(a),Te=a.subTree;a.subTree=oe,M(Te,oe,h(Te.el),Wt(Te),a,b,C),P.el=oe.el,Q===null&&cl(a,oe.el),F&&pe(F,b),(ee=P.props&&P.props.onVnodeUpdated)&&pe(()=>Ee(ee,U,P,G),b)}else{let P;const{el:j,props:F}=f,{bm:U,m:G,parent:Q}=a,ee=wt(f);if(tt(a,!1),U&&Vn(U),!ee&&(P=F&&F.onVnodeBeforeMount)&&Ee(P,Q,f),tt(a,!0),j&&jn){const oe=()=>{a.subTree=Bn(a),jn(j,a.subTree,a,b,null)};ee?f.type.__asyncLoader().then(()=>!a.isUnmounted&&oe()):oe()}else{const oe=a.subTree=Bn(a);M(null,oe,g,y,a,b,C),f.el=oe.el}if(G&&pe(G,b),!ee&&(P=F&&F.onVnodeMounted)){const oe=f;pe(()=>Ee(P,Q,oe),b)}(f.shapeFlag&256||Q&&wt(Q.vnode)&&Q.vnode.shapeFlag&256)&&a.a&&pe(a.a,b),a.isMounted=!0,f=g=y=null}},x=a.effect=new ws(E,xe,()=>Ls(v),a.scope),v=a.update=()=>{x.dirty&&x.run()};v.id=a.uid,tt(a,!0),v()},z=(a,f,g)=>{f.component=a;const y=a.vnode.props;a.vnode=f,a.next=null,Hl(a,f.props,y,g),Dl(a,f.children,g),ut(),Ys(a),ft()},$=(a,f,g,y,b,C,A,E,x=!1)=>{const v=a&&a.children,P=a?a.shapeFlag:0,j=f.children,{patchFlag:F,shapeFlag:U}=f;if(F>0){if(F&128){Kt(v,j,g,y,b,C,A,E,x);return}else if(F&256){Ne(v,j,g,y,b,C,A,E,x);return}}U&8?(P&16&&Fe(v,b,C),j!==v&&d(g,j)):P&16?U&16?Kt(v,j,g,y,b,C,A,E,x):Fe(v,b,C,!0):(P&8&&d(g,""),U&16&&R(j,g,y,b,C,A,E,x))},Ne=(a,f,g,y,b,C,A,E,x)=>{a=a||mt,f=f||mt;const v=a.length,P=f.length,j=Math.min(v,P);let F;for(F=0;FP?Fe(a,b,C,!0,!1,j):R(f,g,y,b,C,A,E,x,j)},Kt=(a,f,g,y,b,C,A,E,x)=>{let v=0;const P=f.length;let j=a.length-1,F=P-1;for(;v<=j&&v<=F;){const U=a[v],G=f[v]=x?We(f[v]):Ae(f[v]);if(it(U,G))M(U,G,g,null,b,C,A,E,x);else break;v++}for(;v<=j&&v<=F;){const U=a[j],G=f[F]=x?We(f[F]):Ae(f[F]);if(it(U,G))M(U,G,g,null,b,C,A,E,x);else break;j--,F--}if(v>j){if(v<=F){const U=F+1,G=UF)for(;v<=j;)Oe(a[v],b,C,!0),v++;else{const U=v,G=v,Q=new Map;for(v=G;v<=F;v++){const ye=f[v]=x?We(f[v]):Ae(f[v]);ye.key!=null&&Q.set(ye.key,v)}let ee,oe=0;const Te=F-G+1;let ht=!1,Vs=0;const At=new Array(Te);for(v=0;v=Te){Oe(ye,b,C,!0);continue}let Le;if(ye.key!=null)Le=Q.get(ye.key);else for(ee=G;ee<=F;ee++)if(At[ee-G]===0&&it(ye,f[ee])){Le=ee;break}Le===void 0?Oe(ye,b,C,!0):(At[Le-G]=v+1,Le>=Vs?Vs=Le:ht=!0,M(ye,f[Le],g,null,b,C,A,E,x),oe++)}const Ds=ht?ql(At):mt;for(ee=Ds.length-1,v=Te-1;v>=0;v--){const ye=G+v,Le=f[ye],Bs=ye+1{const{el:C,type:A,transition:E,children:x,shapeFlag:v}=a;if(v&6){et(a.component.subTree,f,g,y);return}if(v&128){a.suspense.move(f,g,y);return}if(v&64){A.move(a,f,g,dt);return}if(A===ge){s(C,f,g);for(let j=0;jE.enter(C),b);else{const{leave:j,delayLeave:F,afterLeave:U}=E,G=()=>s(C,f,g),Q=()=>{j(C,()=>{G(),U&&U()})};F?F(C,G,Q):Q()}else s(C,f,g)},Oe=(a,f,g,y=!1,b=!1)=>{const{type:C,props:A,ref:E,children:x,dynamicChildren:v,shapeFlag:P,patchFlag:j,dirs:F}=a;if(E!=null&&gn(E,null,g,a,!0),P&256){f.ctx.deactivate(a);return}const U=P&1&&F,G=!wt(a);let Q;if(G&&(Q=A&&A.onVnodeBeforeUnmount)&&Ee(Q,f,a),P&6)ro(a.component,g,y);else{if(P&128){a.suspense.unmount(g,y);return}U&&Ie(a,null,f,"beforeUnmount"),P&64?a.type.remove(a,f,g,b,dt,y):v&&(C!==ge||j>0&&j&64)?Fe(v,f,g,!1,!0):(C===ge&&j&384||!b&&P&16)&&Fe(x,f,g),y&&Hs(a)}(G&&(Q=A&&A.onVnodeUnmounted)||U)&&pe(()=>{Q&&Ee(Q,f,a),U&&Ie(a,null,f,"unmounted")},g)},Hs=a=>{const{type:f,el:g,anchor:y,transition:b}=a;if(f===ge){so(g,y);return}if(f===Nt){_(a);return}const C=()=>{r(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(a.shapeFlag&1&&b&&!b.persisted){const{leave:A,delayLeave:E}=b,x=()=>A(g,C);E?E(a.el,C,x):x()}else C()},so=(a,f)=>{let g;for(;a!==f;)g=m(a),r(a),a=g;r(f)},ro=(a,f,g)=>{const{bum:y,scope:b,update:C,subTree:A,um:E}=a;y&&Vn(y),b.stop(),C&&(C.active=!1,Oe(A,a,f,g)),E&&pe(E,f),pe(()=>{a.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},Fe=(a,f,g,y=!1,b=!1,C=0)=>{for(let A=C;Aa.shapeFlag&6?Wt(a.component.subTree):a.shapeFlag&128?a.suspense.next():m(a.anchor||a.el);let $n=!1;const js=(a,f,g)=>{a==null?f._vnode&&Oe(f._vnode,null,null,!0):M(f._vnode||null,a,f,null,null,null,g),$n||($n=!0,Ys(),dn(),$n=!1),f._vnode=a},dt={p:M,um:Oe,m:et,r:Hs,mt:re,mc:R,pc:$,pbc:S,n:Wt,o:e};let Hn,jn;return t&&([Hn,jn]=t(dt)),{render:js,hydrate:Hn,createApp:Nl(js,Hn)}}function Kn({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function tt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Oi(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Li(e,t,n=!1){const s=e.children,r=t.children;if(B(s)&&B(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function Ii(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ii(t)}const Gl=e=>e.__isTeleport,ge=Symbol.for("v-fgt"),xt=Symbol.for("v-txt"),ve=Symbol.for("v-cmt"),Nt=Symbol.for("v-stc"),Ft=[];let Re=null;function Pi(e=!1){Ft.push(Re=e?null:[])}function zl(){Ft.pop(),Re=Ft[Ft.length-1]||null}let Dt=1;function cr(e){Dt+=e}function Mi(e){return e.dynamicChildren=Dt>0?Re||mt:null,zl(),Dt>0&&Re&&Re.push(e),e}function Wa(e,t,n,s,r,i){return Mi($i(e,t,n,s,r,i,!0))}function Ni(e,t,n,s,r){return Mi(ae(e,t,n,s,r,!0))}function mn(e){return e?e.__v_isVNode===!0:!1}function it(e,t){return e.type===t.type&&e.key===t.key}const Mn="__vInternal",Fi=({key:e})=>e??null,ln=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ne(e)||de(e)||k(e)?{i:fe,r:e,k:t,f:!!n}:e:null);function $i(e,t=null,n=null,s=0,r=null,i=e===ge?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Fi(t),ref:t&&ln(t),scopeId:Rn,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:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:fe};return l?(Ns(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ne(n)?8:16),Dt>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const ae=Xl;function Xl(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===ui)&&(e=ve),mn(e)){const l=Ze(e,t,!0);return n&&Ns(l,n),Dt>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(ic(e)&&(e=e.__vccOpts),t){t=Yl(t);let{class:l,style:c}=t;l&&!ne(l)&&(t.class=vs(l)),Z(c)&&(ei(c)&&!B(c)&&(c=ie({},c)),t.style=bs(c))}const o=ne(e)?1:al(e)?128:Gl(e)?64:Z(e)?4:k(e)?2:0;return $i(e,t,n,s,r,o,i,!0)}function Yl(e){return e?ei(e)||Mn in e?ie({},e):e:null}function Ze(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Jl(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Fi(l),ref:t&&t.ref?n&&r?B(r)?r.concat(ln(t)):[r,ln(t)]:ln(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ge?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Ze(e.ssContent),ssFallback:e.ssFallback&&Ze(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Hi(e=" ",t=0){return ae(xt,null,e,t)}function qa(e,t){const n=ae(Nt,null,e);return n.staticCount=t,n}function Ga(e="",t=!1){return t?(Pi(),Ni(ve,null,e)):ae(ve,null,e)}function Ae(e){return e==null||typeof e=="boolean"?ae(ve):B(e)?ae(ge,null,e.slice()):typeof e=="object"?We(e):ae(xt,null,String(e))}function We(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Ze(e)}function Ns(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Ns(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Mn in t)?t._ctx=fe:r===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else k(t)?(t={default:t,_ctx:fe},n=32):(t=String(t),s&64?(n=16,t=[Hi(t)]):n=8);e.children=t,e.shapeFlag|=n}function Jl(...e){const t={};for(let n=0;nce||fe;let _n,fs;{const e=Vr(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};_n=t("__VUE_INSTANCE_SETTERS__",n=>ce=n),fs=t("__VUE_SSR_SETTERS__",n=>Fn=n)}const kt=e=>{const t=ce;return _n(e),e.scope.on(),()=>{e.scope.off(),_n(t)}},ar=()=>{ce&&ce.scope.off(),_n(null)};function ji(e){return e.vnode.shapeFlag&4}let Fn=!1;function tc(e,t=!1){t&&fs(t);const{props:n,children:s}=e.vnode,r=ji(e);$l(e,n,r,t),Vl(e,s);const i=r?nc(e,t):void 0;return t&&fs(!1),i}function nc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Lt(new Proxy(e.ctx,Tl));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?Di(e):null,i=kt(e);ut();const o=ze(s,e,0,[e.props,r]);if(ft(),i(),$r(o)){if(o.then(ar,ar),t)return o.then(l=>{ur(e,l,t)}).catch(l=>{Sn(l,e,0)});e.asyncDep=o}else ur(e,o,t)}else Vi(e,t)}function ur(e,t,n){k(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=ii(t)),Vi(e,n)}let fr;function Vi(e,t,n){const s=e.type;if(!e.render){if(!t&&fr&&!s.render){const r=s.template||Ps(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,u=ie(ie({isCustomElement:i,delimiters:l},o),c);s.render=fr(r,u)}}e.render=s.render||xe}{const r=kt(e);ut();try{Rl(e)}finally{ft(),r()}}}function sc(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return _e(e,"get","$attrs"),t[n]}}))}function Di(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return sc(e)},slots:e.slots,emit:e.emit,expose:t}}function Fs(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(ii(Lt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Pt)return Pt[n](e)},has(t,n){return n in t||n in Pt}}))}function rc(e,t=!0){return k(e)?e.displayName||e.name:e.name||t&&e.__name}function ic(e){return k(e)&&"__vccOpts"in e}const se=(e,t)=>ko(e,t,Fn);function ds(e,t,n){const s=arguments.length;return s===2?Z(t)&&!B(t)?mn(t)?ae(e,null,[t]):ae(e,t):ae(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&mn(n)&&(n=[n]),ae(e,t,n))}const oc="3.4.18";/** +* @vue/runtime-dom v3.4.18 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const lc="http://www.w3.org/2000/svg",cc="http://www.w3.org/1998/Math/MathML",qe=typeof document<"u"?document:null,dr=qe&&qe.createElement("template"),ac={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==="svg"?qe.createElementNS(lc,e):t==="mathml"?qe.createElementNS(cc,e):qe.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>qe.createTextNode(e),createComment:e=>qe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>qe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{dr.innerHTML=s==="svg"?`${e}`:s==="mathml"?`${e}`:e;const l=dr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Be="transition",Rt="animation",Bt=Symbol("_vtc"),Bi=(e,{slots:t})=>ds(gl,uc(e),t);Bi.displayName="Transition";const Ui={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};Bi.props=ie({},gi,Ui);const nt=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},hr=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function uc(e){const t={};for(const O in e)O in Ui||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:d=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:m=`${n}-leave-active`,leaveToClass:w=`${n}-leave-to`}=e,L=fc(r),M=L&&L[0],V=L&&L[1],{onBeforeEnter:W,onEnter:J,onEnterCancelled:p,onLeave:_,onLeaveCancelled:N,onBeforeAppear:I=W,onAppear:D=J,onAppearCancelled:R=p}=t,T=(O,q,re)=>{st(O,q?d:l),st(O,q?u:o),re&&re()},S=(O,q)=>{O._isLeaving=!1,st(O,h),st(O,w),st(O,m),q&&q()},K=O=>(q,re)=>{const le=O?D:J,H=()=>T(q,O,re);nt(le,[q,H]),pr(()=>{st(q,O?c:i),Ue(q,O?d:l),hr(le)||gr(q,s,M,H)})};return ie(t,{onBeforeEnter(O){nt(W,[O]),Ue(O,i),Ue(O,o)},onBeforeAppear(O){nt(I,[O]),Ue(O,c),Ue(O,u)},onEnter:K(!1),onAppear:K(!0),onLeave(O,q){O._isLeaving=!0;const re=()=>S(O,q);Ue(O,h),pc(),Ue(O,m),pr(()=>{O._isLeaving&&(st(O,h),Ue(O,w),hr(_)||gr(O,s,V,re))}),nt(_,[O,re])},onEnterCancelled(O){T(O,!1),nt(p,[O])},onAppearCancelled(O){T(O,!0),nt(R,[O])},onLeaveCancelled(O){S(O),nt(N,[O])}})}function fc(e){if(e==null)return null;if(Z(e))return[Wn(e.enter),Wn(e.leave)];{const t=Wn(e);return[t,t]}}function Wn(e){return fo(e)}function Ue(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Bt]||(e[Bt]=new Set)).add(t)}function st(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Bt];n&&(n.delete(t),n.size||(e[Bt]=void 0))}function pr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let dc=0;function gr(e,t,n,s){const r=e._endId=++dc,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=hc(e,t);if(!o)return s();const u=o+"end";let d=0;const h=()=>{e.removeEventListener(u,m),i()},m=w=>{w.target===e&&++d>=c&&h()};setTimeout(()=>{d(n[L]||"").split(", "),r=s(`${Be}Delay`),i=s(`${Be}Duration`),o=mr(r,i),l=s(`${Rt}Delay`),c=s(`${Rt}Duration`),u=mr(l,c);let d=null,h=0,m=0;t===Be?o>0&&(d=Be,h=o,m=i.length):t===Rt?u>0&&(d=Rt,h=u,m=c.length):(h=Math.max(o,u),d=h>0?o>u?Be:Rt:null,m=d?d===Be?i.length:c.length:0);const w=d===Be&&/\b(transform|all)(,|$)/.test(s(`${Be}Property`).toString());return{type:d,timeout:h,propCount:m,hasTransform:w}}function mr(e,t){for(;e.length_r(n)+_r(e[s])))}function _r(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function pc(){return document.body.offsetHeight}function gc(e,t,n){const s=e[Bt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const yr=Symbol("_vod"),mc=Symbol(""),_c=/(^|;)\s*display\s*:/;function yc(e,t,n){const s=e.style,r=ne(n),i=s.display;let o=!1;if(n&&!r){if(t&&!ne(t))for(const l in t)n[l]==null&&hs(s,l,"");for(const l in n)l==="display"&&(o=!0),hs(s,l,n[l])}else if(r){if(t!==n){const l=s[mc];l&&(n+=";"+l),s.cssText=n,o=_c.test(n)}}else t&&e.removeAttribute("style");yr in e&&(e[yr]=o?s.display:"",s.display=i)}const br=/\s*!important$/;function hs(e,t,n){if(B(n))n.forEach(s=>hs(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=bc(e,t);br.test(n)?e.setProperty(at(s),n.replace(br,""),"important"):e[s]=n}}const vr=["Webkit","Moz","ms"],qn={};function bc(e,t){const n=qn[t];if(n)return n;let s=Me(t);if(s!=="filter"&&s in e)return qn[t]=s;s=wn(s);for(let r=0;rGn||(Tc.then(()=>Gn=0),Gn=Date.now());function Rc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Se(Oc(s,n.value),t,5,[s])};return n.value=e,n.attached=Ac(),n}function Oc(e,t){if(B(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 xr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Lc=(e,t,n,s,r,i,o,l,c)=>{const u=r==="svg";t==="class"?gc(e,s,u):t==="style"?yc(e,n,s):Ut(t)?ms(t)||xc(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ic(e,t,s,u))?wc(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),vc(e,t,s,u))};function Ic(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&xr(t)&&k(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return xr(t)&&ne(n)?!1:t in e}const Pc=["ctrl","shift","alt","meta"],Mc={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)=>Pc.some(n=>e[`${n}Key`]&&!t.includes(n))},za=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=at(r.key);if(t.some(o=>o===i||Nc[o]===i))return e(r)})},Fc=ie({patchProp:Lc},ac);let zn,Sr=!1;function $c(){return zn=Sr?zn:Kl(Fc),Sr=!0,zn}const Ya=(...e)=>{const t=$c().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=jc(s);if(r)return n(r,!0,Hc(r))},t};function Hc(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function jc(e){return ne(e)?document.querySelector(e):e}const Ja=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},Vc="modulepreload",Dc=function(e){return"/"+e},Tr={},Qa=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){const i=document.getElementsByTagName("link");r=Promise.all(n.map(o=>{if(o=Dc(o),o in Tr)return;Tr[o]=!0;const l=o.endsWith(".css"),c=l?'[rel="stylesheet"]':"";if(!!s)for(let h=i.length-1;h>=0;h--){const m=i[h];if(m.href===o&&(!l||m.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${c}`))return;const d=document.createElement("link");if(d.rel=l?"stylesheet":Vc,l||(d.as="script",d.crossOrigin=""),d.href=o,document.head.appendChild(d),l)return new Promise((h,m)=>{d.addEventListener("load",h),d.addEventListener("error",()=>m(new Error(`Unable to preload CSS for ${o}`)))})}))}return r.then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})},Bc=window.__VP_SITE_DATA__;function $s(e){return Ur()?(wo(e),!0):!1}function Ye(e){return typeof e=="function"?e():ri(e)}const ki=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Uc=Object.prototype.toString,kc=e=>Uc.call(e)==="[object Object]",$t=()=>{},ps=Kc();function Kc(){var e,t;return ki&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Wc(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Ki=e=>e();function qc(e=Ki){const t=me(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:xn(t),pause:n,resume:s,eventFilter:r}}function Gc(e){return e||Nn()}function Wi(...e){if(e.length!==1)return Yo(...e);const t=e[0];return typeof t=="function"?xn(Go(()=>({get:t,set:$t}))):me(t)}function zc(e,t,n={}){const{eventFilter:s=Ki,...r}=n;return Xe(e,Wc(s,t),r)}function Xc(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=qc(s);return{stop:zc(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function qi(e,t=!0,n){Gc()?Tt(e,n):t?e():Tn(e)}function gt(e){var t;const n=Ye(e);return(t=n==null?void 0:n.$el)!=null?t:n}const He=ki?window:void 0;function Je(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=He):[t,n,s,r]=e,!t)return $t;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(d=>d()),i.length=0},l=(d,h,m,w)=>(d.addEventListener(h,m,w),()=>d.removeEventListener(h,m,w)),c=Xe(()=>[gt(t),Ye(r)],([d,h])=>{if(o(),!d)return;const m=kc(h)?{...h}:h;i.push(...n.flatMap(w=>s.map(L=>l(d,w,L,m))))},{immediate:!0,flush:"post"}),u=()=>{c(),o()};return $s(u),u}let Ar=!1;function Za(e,t,n={}){const{window:s=He,ignore:r=[],capture:i=!0,detectIframe:o=!1}=n;if(!s)return $t;ps&&!Ar&&(Ar=!0,Array.from(s.document.body.children).forEach(m=>m.addEventListener("click",$t)),s.document.documentElement.addEventListener("click",$t));let l=!0;const c=m=>r.some(w=>{if(typeof w=="string")return Array.from(s.document.querySelectorAll(w)).some(L=>L===m.target||m.composedPath().includes(L));{const L=gt(w);return L&&(m.target===L||m.composedPath().includes(L))}}),d=[Je(s,"click",m=>{const w=gt(e);if(!(!w||w===m.target||m.composedPath().includes(w))){if(m.detail===0&&(l=!c(m)),!l){l=!0;return}t(m)}},{passive:!0,capture:i}),Je(s,"pointerdown",m=>{const w=gt(e);l=!c(m)&&!!(w&&!m.composedPath().includes(w))},{passive:!0}),o&&Je(s,"blur",m=>{setTimeout(()=>{var w;const L=gt(e);((w=s.document.activeElement)==null?void 0:w.tagName)==="IFRAME"&&!(L!=null&&L.contains(s.document.activeElement))&&t(m)},0)})].filter(Boolean);return()=>d.forEach(m=>m())}function Yc(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function eu(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=He,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=Yc(t);return Je(r,i,d=>{d.repeat&&Ye(l)||c(d)&&n(d)},o)}function Jc(){const e=me(!1);return Nn()&&Tt(()=>{e.value=!0}),e}function Qc(e){const t=Jc();return se(()=>(t.value,!!e()))}function Zc(e,t={}){const{window:n=He}=t,s=Qc(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=me(!1),o=u=>{i.value=u.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=hi(()=>{s.value&&(l(),r=n.matchMedia(Ye(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return $s(()=>{c(),l(),r=void 0}),i}const tn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},nn="__vueuse_ssr_handlers__",ea=ta();function ta(){return nn in tn||(tn[nn]=tn[nn]||{}),tn[nn]}function Gi(e,t){return ea[e]||t}function na(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 sa={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()}},Rr="vueuse-storage";function ra(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:d,window:h=He,eventFilter:m,onError:w=T=>{console.error(T)},initOnMounted:L}=s,M=(d?ni:me)(typeof t=="function"?t():t);if(!n)try{n=Gi("getDefaultStorage",()=>{var T;return(T=He)==null?void 0:T.localStorage})()}catch(T){w(T)}if(!n)return M;const V=Ye(t),W=na(V),J=(r=s.serializer)!=null?r:sa[W],{pause:p,resume:_}=Xc(M,()=>N(M.value),{flush:i,deep:o,eventFilter:m});return h&&l&&qi(()=>{Je(h,"storage",R),Je(h,Rr,D),L&&R()}),L||R(),M;function N(T){try{if(T==null)n.removeItem(e);else{const S=J.write(T),K=n.getItem(e);K!==S&&(n.setItem(e,S),h&&h.dispatchEvent(new CustomEvent(Rr,{detail:{key:e,oldValue:K,newValue:S,storageArea:n}})))}}catch(S){w(S)}}function I(T){const S=T?T.newValue:n.getItem(e);if(S==null)return c&&V!=null&&n.setItem(e,J.write(V)),V;if(!T&&u){const K=J.read(S);return typeof u=="function"?u(K,V):W==="object"&&!Array.isArray(K)?{...V,...K}:K}else return typeof S!="string"?S:J.read(S)}function D(T){R(T.detail)}function R(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){M.value=V;return}if(!(T&&T.key!==e)){p();try{(T==null?void 0:T.newValue)!==J.write(M.value)&&(M.value=I(T))}catch(S){w(S)}finally{T?Tn(_):_()}}}}}function zi(e){return Zc("(prefers-color-scheme: dark)",e)}function ia(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=He,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:d=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},m=zi({window:r}),w=se(()=>m.value?"dark":"light"),L=c||(o==null?Wi(s):ra(o,s,i,{window:r,listenToStorageChanges:l})),M=se(()=>L.value==="auto"?w.value:L.value),V=Gi("updateHTMLAttrs",(_,N,I)=>{const D=typeof _=="string"?r==null?void 0:r.document.querySelector(_):gt(_);if(!D)return;let R;if(d&&(R=r.document.createElement("style"),R.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),r.document.head.appendChild(R)),N==="class"){const T=I.split(/\s/g);Object.values(h).flatMap(S=>(S||"").split(/\s/g)).filter(Boolean).forEach(S=>{T.includes(S)?D.classList.add(S):D.classList.remove(S)})}else D.setAttribute(N,I);d&&(r.getComputedStyle(R).opacity,document.head.removeChild(R))});function W(_){var N;V(t,n,(N=h[_])!=null?N:_)}function J(_){e.onChanged?e.onChanged(_,W):W(_)}Xe(M,J,{flush:"post",immediate:!0}),qi(()=>J(M.value));const p=se({get(){return u?L.value:M.value},set(_){L.value=_}});try{return Object.assign(p,{store:L,system:w,state:M})}catch{return p}}function oa(e={}){const{valueDark:t="dark",valueLight:n="",window:s=He}=e,r=ia({...e,onChanged:(l,c)=>{var u;e.onChanged?(u=e.onChanged)==null||u.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=se(()=>r.system?r.system.value:zi({window:s}).value?"dark":"light");return se({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}function Xn(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Xi(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const sn=new WeakMap;function tu(e,t=!1){const n=me(t);let s=null,r;Xe(Wi(e),l=>{const c=Xn(Ye(l));if(c){const u=c;sn.get(u)||sn.set(u,r),n.value&&(u.style.overflow="hidden")}},{immediate:!0});const i=()=>{const l=Xn(Ye(e));!l||n.value||(ps&&(s=Je(l,"touchmove",c=>{la(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{var l;const c=Xn(Ye(e));!c||!n.value||(ps&&(s==null||s()),c.style.overflow=(l=sn.get(c))!=null?l:"",sn.delete(c),n.value=!1)};return $s(o),se({get(){return n.value},set(l){l?i():o()}})}function nu(e={}){const{window:t=He,behavior:n="auto"}=e;if(!t)return{x:me(0),y:me(0)};const s=me(t.scrollX),r=me(t.scrollY),i=se({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),o=se({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return Je(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}var Yn={BASE_URL:"/",MODE:"production",DEV:!1,PROD:!0,SSR:!1},ca={};const Yi=/^(?:[a-z]+:|\/\/)/i,aa="vitepress-theme-appearance",ua=/#.*$/,fa=/[?#].*$/,da=/(?:(^|\/)index)?\.(?:md|html)$/,Ce=typeof document<"u",Ji={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function ha(e,t,n=!1){if(t===void 0)return!1;if(e=Or(`/${e}`),n)return new RegExp(t).test(e);if(Or(t)!==e)return!1;const s=t.match(ua);return s?(Ce?location.hash:"")===s[0]:!0}function Or(e){return decodeURI(e).replace(fa,"").replace(da,"$1")}function pa(e){return Yi.test(e)}function ga(e,t){var s,r,i,o,l,c,u;const n=Object.keys(e.locales).find(d=>d!=="root"&&!pa(d)&&ha(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:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Zi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function Qi(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=ma(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function ma(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function _a(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function Zi(e,t){return[...e.filter(n=>!_a(t,n)),...t]}const ya=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ba=/^[a-z]:/i;function Lr(e){const t=ba.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(ya,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Jn=new Set;function va(e){if(Jn.size===0){const n=typeof process=="object"&&ca.VITE_EXTRA_EXTENSIONS||(Yn==null?void 0:Yn.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>Jn.add(s))}const t=e.split(".").pop();return t==null||!Jn.has(t.toLowerCase())}const wa=Symbol(),ct=ni(Bc);function su(e){const t=se(()=>ga(ct.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?me(!0):n?oa({storageKey:aa,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):me(!1);return{site:t,theme:se(()=>t.value.themeConfig),page:se(()=>e.data),frontmatter:se(()=>e.data.frontmatter),params:se(()=>e.data.params),lang:se(()=>t.value.lang),dir:se(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:se(()=>t.value.localeIndex||"root"),title:se(()=>Qi(t.value,e.data)),description:se(()=>e.data.description||t.value.description),isDark:s}}function Ea(){const e=Et(wa);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ca(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Ir(e){return Yi.test(e)||!e.startsWith("/")?e:Ca(ct.value.base,e)}function xa(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Ce){const n="/";t=Lr(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=`./${Lr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let cn=[];function ru(e){cn.push(e),Pn(()=>{cn=cn.filter(t=>t!==e)})}function Sa(){let e=ct.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=Pr(e,n);else if(Array.isArray(e))for(const s of e){const r=Pr(s,n);if(r){t=r;break}}return t}function Pr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Ta=Symbol(),eo="http://a.com",Aa=()=>({path:"/",component:null,data:Ji});function iu(e,t){const n=Cn(Aa()),s={route:n,go:r};async function r(l=Ce?location.href:"/"){var c,u;l=yn(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(Nr(l),await o(l),await((u=s.onAfterRouteChanged)==null?void 0:u.call(s,l)))}let i=null;async function o(l,c=0,u=!1){var m;if(await((m=s.onBeforePageLoad)==null?void 0:m.call(s,l))===!1)return;const d=new URL(l,eo),h=i=d.pathname;try{let w=await e(h);if(!w)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:L,__pageData:M}=w;if(!L)throw new Error(`Invalid route component: ${L}`);n.path=Ce?h:Ir(h),n.component=Lt(L),n.data=Lt(M),Ce&&Tn(()=>{let V=ct.value.base+M.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ct.value.cleanUrls&&!V.endsWith("/")&&(V+=".html"),V!==d.pathname&&(d.pathname=V,l=V+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(d.hash).slice(1))}catch(J){console.warn(J)}if(W){Mr(W,d.hash);return}}window.scrollTo(0,c)})}}catch(w){if(!/fetch|Page not found/.test(w.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(w),!u)try{const L=await fetch(ct.value.base+"hashmap.json");window.__VP_HASH_MAP__=await L.json(),await o(l,c,!0);return}catch{}i===h&&(i=null,n.path=Ce?h:Ir(h),n.component=t?Lt(t):null,n.data=Ji)}}return Ce&&(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:m,pathname:w,hash:L,search:M}=new URL(u.href instanceof SVGAnimatedString?u.href.animVal:u.href,u.baseURI),V=window.location;!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!d&&m===V.origin&&va(w)&&(l.preventDefault(),w===V.pathname&&M===V.search?(L!==V.hash&&(history.pushState(null,"",L),window.dispatchEvent(new Event("hashchange"))),L?Mr(u,L,u.classList.contains("header-anchor")):(Nr(h),window.scrollTo(0,0))):r(h))}},{capture:!0}),window.addEventListener("popstate",async l=>{var c;await o(yn(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Ra(){const e=Et(Ta);if(!e)throw new Error("useRouter() is called without provider.");return e}function to(){return Ra().route}function Mr(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 r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-Sa()+i;requestAnimationFrame(r)}}function Nr(e){Ce&&yn(e)!==yn(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function yn(e){const t=new URL(e,eo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ct.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 Qn=()=>cn.forEach(e=>e()),ou=yi({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=to(),{site:n}=Ea();return()=>ds(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?ds(t.component,{onVnodeMounted:Qn,onVnodeUpdated:Qn,onVnodeUnmounted:Qn}):"404 Page Not Found"])}}),lu=yi({setup(e,{slots:t}){const n=me(!1);return Tt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function cu(){Ce&&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 i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(u=>u.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.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 au(){if(Ce){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,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(d=>d.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),Oa(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const d=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,d)})}})}}async function Oa(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 uu(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=Zn(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(Zn);s.forEach((l,c)=>{const u=o.findIndex(d=>d==null?void 0:d.isEqualNode(l??null));u!==-1?delete o[u]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};hi(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=Qi(o,i);u!==document.title&&(document.title=u);const d=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==d&&h.setAttribute("content",d):Zn(["meta",{name:"description",content:d}]),r(Zi(o.head,Ia(c)))})}function Zn([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 La(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Ia(e){return e.filter(t=>!La(t))}const es=new Set,no=()=>document.createElement("link"),Pa=e=>{const t=no();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Ma=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let rn;const Na=Ce&&(rn=no())&&rn.relList&&rn.relList.supports&&rn.relList.supports("prefetch")?Pa:Ma;function fu(){if(!Ce||!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(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!es.has(c)){es.add(c);const u=xa(c);u&&Na(u)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):es.add(l))})})};Tt(s);const r=to();Xe(()=>r.path,s),Pn(()=>{n&&n.disconnect()})}export{ka as $,Pn as A,Da as B,wl as C,Sa as D,ja as E,ge as F,Ba as G,ni as H,ru as I,ae as J,Va as K,Yi as L,to as M,Jl as N,Et as O,Za as P,eu as Q,bs as R,Tn as S,Bi as T,nu as U,qa as V,xn as W,tu as X,Fl as Y,Xa as Z,Ja as _,Hi as a,za as a0,Ka as a1,ds as a2,uu as a3,Ta as a4,su as a5,wa as a6,ou as a7,lu as a8,ct as a9,Ya as aa,iu as ab,xa as ac,Qa as ad,fu as ae,au as af,cu as ag,Ni as b,Wa as c,yi as d,Ga as e,va as f,Ir as g,me as h,pa as i,Ce as j,se as k,Tt as l,$i as m,vs as n,Pi as o,ri as p,$a as q,Ua as r,Ha as s,Fa as t,Ea as u,ha as v,rl as w,Zc as x,Xe as y,hi as z}; diff --git a/assets/chunks/theme.5WXmHJfx.js b/assets/chunks/theme.5WXmHJfx.js new file mode 100644 index 00000000..72884719 --- /dev/null +++ b/assets/chunks/theme.5WXmHJfx.js @@ -0,0 +1 @@ +import{d as g,o as a,c as l,r as c,n as I,a as H,t as V,b as $,w as h,T as de,e as _,_ as m,u as Oe,i as Ue,f as xe,g as ve,h as L,j as K,k,l as G,m as d,p as r,q as E,s as F,v as x,x as ie,y as j,z as X,A as he,B as we,C as Ge,D as je,E as R,F as T,G as A,H as Pe,I as ee,J as f,K as U,L as Ve,M as te,N as J,O as se,P as Re,Q as qe,R as Ke,S as We,U as Le,V as Ye,W as Je,X as Se,Y as Me,Z as Ze,$ as Qe,a0 as Xe,a1 as et,a2 as tt}from"./framework.Dy019jra.js";const st=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),l("span",{class:I(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[H(V(e.text),1)])],2))}}),ot={key:0,class:"VPBackdrop"},nt=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),$(de,{name:"fade"},{default:h(()=>[e.show?(a(),l("div",ot)):_("",!0)]),_:1}))}}),at=m(nt,[["__scopeId","data-v-a647fe67"]]),P=Oe;function rt(s,e){let t,n=!1;return()=>{t&&clearTimeout(t),n?t=setTimeout(s,e):(s(),(n=!0)&&setTimeout(()=>n=!1,e))}}function le(s){return/^\//.test(s)?s:`/${s}`}function pe(s){const{pathname:e,search:t,hash:n,protocol:o}=new URL(s,"http://a.com");if(Ue(s)||s.startsWith("#")||!o.startsWith("http")||!xe(e))return s;const{site:i}=P(),u=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${n}`);return ve(u)}const fe=L(K?location.hash:"");K&&window.addEventListener("hashchange",()=>{fe.value=location.hash});function W({removeCurrent:s=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:n,page:o,theme:i}=P(),u=k(()=>{var v,b;return{label:(v=t.value.locales[n.value])==null?void 0:v.label,link:((b=t.value.locales[n.value])==null?void 0:b.link)||(n.value==="root"?"/":`/${n.value}/`)}});return{localeLinks:k(()=>Object.entries(t.value.locales).flatMap(([v,b])=>s&&u.value.label===b.label?[]:{text:b.label,link:it(b.link||(v==="root"?"/":`/${v}/`),i.value.i18nRouting!==!1&&e,o.value.relativePath.slice(u.value.link.length-1),!t.value.cleanUrls)+fe.value})),currentLang:u}}function it(s,e,t,n){return e?s.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,n?".html":"")):s}const lt=s=>(E("data-v-51e8273c"),s=s(),F(),s),ct={class:"NotFound"},ut={class:"code"},dt={class:"title"},vt=lt(()=>d("div",{class:"divider"},null,-1)),ht={class:"quote"},pt={class:"action"},ft=["href","aria-label"],_t=g({__name:"NotFound",setup(s){const{site:e,theme:t}=P(),{localeLinks:n}=W({removeCurrent:!1}),o=L("/");return G(()=>{var u;const i=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((u=n.value.find(({link:p})=>p.startsWith(i)))==null?void 0:u.link)||n.value[0].link)}),(i,u)=>{var p,v,b,y,w;return a(),l("div",ct,[d("p",ut,V(((p=r(t).notFound)==null?void 0:p.code)??"404"),1),d("h1",dt,V(((v=r(t).notFound)==null?void 0:v.title)??"PAGE NOT FOUND"),1),vt,d("blockquote",ht,V(((b=r(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),d("div",pt,[d("a",{class:"link",href:r(ve)(o.value),"aria-label":((y=r(t).notFound)==null?void 0:y.linkLabel)??"go to home"},V(((w=r(t).notFound)==null?void 0:w.linkText)??"Take me home"),9,ft)])])}}}),mt=m(_t,[["__scopeId","data-v-51e8273c"]]);function Ce(s,e){if(Array.isArray(s))return Z(s);if(s==null)return[];e=le(e);const t=Object.keys(s).sort((o,i)=>i.split("/").length-o.split("/").length).find(o=>e.startsWith(le(o))),n=t?s[t]:[];return Array.isArray(n)?Z(n):Z(n.items,n.base)}function gt(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 $t(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)):x(s,e.link)?!0:e.items?ce(s,e.items):!1}function Z(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=Z(n.items,o)),n})}function D(){const{frontmatter:s,page:e,theme:t}=P(),n=ie("(min-width: 960px)"),o=L(!1),i=k(()=>{const B=t.value.sidebar,S=e.value.relativePath;return B?Ce(B,S):[]}),u=L(i.value);j(i,(B,S)=>{JSON.stringify(B)!==JSON.stringify(S)&&(u.value=i.value)});const p=k(()=>s.value.sidebar!==!1&&u.value.length>0&&s.value.layout!=="home"),v=k(()=>b?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),b=k(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),y=k(()=>p.value&&n.value),w=k(()=>p.value?gt(u.value):[]);function M(){o.value=!0}function C(){o.value=!1}function N(){o.value?C():M()}return{isOpen:o,sidebar:u,sidebarGroups:w,hasSidebar:p,hasAside:b,leftAside:v,isSidebarEnabled:y,open:M,close:C,toggle:N}}function kt(s,e){let t;X(()=>{t=s.value?document.activeElement:void 0}),G(()=>{window.addEventListener("keyup",n)}),he(()=>{window.removeEventListener("keyup",n)});function n(o){o.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}function bt(s){const{page:e}=P(),t=L(!1),n=k(()=>s.value.collapsed!=null),o=k(()=>!!s.value.link),i=L(!1),u=()=>{i.value=x(e.value.relativePath,s.value.link)};j([e,s,fe],u),G(u);const p=k(()=>i.value?!0:s.value.items?ce(e.value.relativePath,s.value.items):!1),v=k(()=>!!(s.value.items&&s.value.items.length));X(()=>{t.value=!!(n.value&&s.value.collapsed)}),we(()=>{(i.value||p.value)&&(t.value=!1)});function b(){n.value&&(t.value=!t.value)}return{collapsed:t,collapsible:n,isLink:o,isActiveLink:i,hasActiveLink:p,hasChildren:v,toggle:b}}function yt(){const{hasSidebar:s}=D(),e=ie("(min-width: 960px)"),t=ie("(min-width: 1280px)");return{isAsideEnabled:k(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const ue=[];function Ie(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function _e(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{element:t,title:wt(t),link:"#"+t.id,level:n}});return Pt(e,s)}function wt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pt(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(u=>u.level>=n&&u.level<=o),ue.length=0;for(const{element:u,link:p}of s)ue.push({element:u,link:p});const i=[];e:for(let u=0;u=0;v--){const b=s[v];if(b.level{requestAnimationFrame(i),window.addEventListener("scroll",n)}),Ge(()=>{u(location.hash)}),he(()=>{window.removeEventListener("scroll",n)});function i(){if(!t.value)return;const p=window.scrollY,v=window.innerHeight,b=document.body.offsetHeight,y=Math.abs(p+v-b)<1,w=ue.map(({element:C,link:N})=>({link:N,top:Lt(C)})).filter(({top:C})=>!Number.isNaN(C)).sort((C,N)=>C.top-N.top);if(!w.length){u(null);return}if(p<1){u(null);return}if(y){u(w[w.length-1].link);return}let M=null;for(const{link:C,top:N}of w){if(N>p+je()+4)break;M=C}u(M)}function u(p){o&&o.classList.remove("active"),p==null?o=null:o=s.value.querySelector(`a[href="${decodeURIComponent(p)}"]`);const v=o;v?(v.classList.add("active"),e.value.style.top=v.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function Lt(s){let e=0;for(;s!==document.body;){if(s===null)return NaN;e+=s.offsetTop,s=s.offsetParent}return e}const St=["href","title"],Mt=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=R("VPDocOutlineItem",!0);return a(),l("ul",{class:I(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),l(T,null,A(t.headers,({children:i,link:u,title:p})=>(a(),l("li",null,[d("a",{class:"outline-link",href:u,onClick:e,title:p},V(p),9,St),i!=null&&i.length?(a(),$(o,{key:0,headers:i},null,8,["headers"])):_("",!0)]))),256))],2)}}}),Te=m(Mt,[["__scopeId","data-v-8fe0d742"]]),Ct=s=>(E("data-v-bd526c66"),s=s(),F(),s),It={class:"content"},Tt={class:"outline-title",role:"heading","aria-level":"2"},Nt={"aria-labelledby":"doc-outline-aria-label"},Bt=Ct(()=>d("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),At=g({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=P(),n=Pe([]);ee(()=>{n.value=_e(e.value.outline??t.value.outline)});const o=L(),i=L();return Vt(o,i),(u,p)=>(a(),l("div",{class:I(["VPDocAsideOutline",{"has-outline":n.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[d("div",It,[d("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),d("div",Tt,V(r(Ie)(r(t))),1),d("nav",Nt,[Bt,f(Te,{headers:n.value,root:!0},null,8,["headers"])])])],2))}}),Ht=m(At,[["__scopeId","data-v-bd526c66"]]),zt={class:"VPDocAsideCarbonAds"},Et=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,n)=>(a(),l("div",zt,[f(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Ft=s=>(E("data-v-b4b15dc4"),s=s(),F(),s),Dt={class:"VPDocAside"},Ot=Ft(()=>d("div",{class:"spacer"},null,-1)),Ut=g({__name:"VPDocAside",setup(s){const{theme:e}=P();return(t,n)=>(a(),l("div",Dt,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),f(Ht),c(t.$slots,"aside-outline-after",{},void 0,!0),Ot,c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),$(Et,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):_("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),xt=m(Ut,[["__scopeId","data-v-b4b15dc4"]]);function Gt(){const{theme:s,page:e}=P();return k(()=>{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 jt(){const{page:s,theme:e,frontmatter:t}=P();return k(()=>{var v,b,y,w,M,C,N,B;const n=Ce(e.value.sidebar,s.value.relativePath),o=$t(n),i=o.findIndex(S=>x(s.value.relativePath,S.link)),u=((v=e.value.docFooter)==null?void 0:v.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:u?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((y=o[i-1])==null?void 0:y.docFooterText)??((w=o[i-1])==null?void 0:w.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((M=o[i-1])==null?void 0:M.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)??((C=o[i+1])==null?void 0:C.docFooterText)??((N=o[i+1])==null?void 0:N.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((B=o[i+1])==null?void 0:B.link)}}})}const Rt={},qt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kt=d("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),Wt=d("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),Yt=[Kt,Wt];function Jt(s,e){return a(),l("svg",qt,Yt)}const Zt=m(Rt,[["render",Jt]]),z=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=k(()=>e.tag??(e.href?"a":"span")),n=k(()=>e.href&&Ve.test(e.href));return(o,i)=>(a(),$(U(t.value),{class:I(["VPLink",{link:o.href,"vp-external-link-icon":n.value,"no-icon":o.noIcon}]),href:o.href?r(pe)(o.href):void 0,target:o.target??(n.value?"_blank":void 0),rel:o.rel??(n.value?"noreferrer":void 0)},{default:h(()=>[c(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Qt={class:"VPLastUpdated"},Xt=["datetime"],es=g({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,frontmatter:n,lang:o}=P(),i=k(()=>new Date(n.value.lastUpdated??t.value.lastUpdated)),u=k(()=>i.value.toISOString()),p=L("");return G(()=>{X(()=>{var v,b,y;p.value=new Intl.DateTimeFormat((b=(v=e.value.lastUpdated)==null?void 0:v.formatOptions)!=null&&b.forceLocale?o.value:void 0,((y=e.value.lastUpdated)==null?void 0:y.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(i.value)})}),(v,b)=>{var y;return a(),l("p",Qt,[H(V(((y=r(e).lastUpdated)==null?void 0:y.text)||r(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:u.value},V(p.value),9,Xt)])}}}),ts=m(es,[["__scopeId","data-v-f6cc7dc0"]]),ss={key:0,class:"VPDocFooter"},os={key:0,class:"edit-info"},ns={key:0,class:"edit-link"},as={key:1,class:"last-updated"},rs={key:1,class:"prev-next"},is={class:"pager"},ls=["innerHTML"],cs=["innerHTML"],us={class:"pager"},ds=["innerHTML"],vs=["innerHTML"],hs=g({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:n}=P(),o=Gt(),i=jt(),u=k(()=>e.value.editLink&&n.value.editLink!==!1),p=k(()=>t.value.lastUpdated&&n.value.lastUpdated!==!1),v=k(()=>u.value||p.value||i.value.prev||i.value.next);return(b,y)=>{var w,M,C,N;return v.value?(a(),l("footer",ss,[c(b.$slots,"doc-footer-before",{},void 0,!0),u.value||p.value?(a(),l("div",os,[u.value?(a(),l("div",ns,[f(z,{class:"edit-link-button",href:r(o).url,"no-icon":!0},{default:h(()=>[f(Zt,{class:"edit-link-icon","aria-label":"edit icon"}),H(" "+V(r(o).text),1)]),_:1},8,["href"])])):_("",!0),p.value?(a(),l("div",as,[f(ts)])):_("",!0)])):_("",!0),(w=r(i).prev)!=null&&w.link||(M=r(i).next)!=null&&M.link?(a(),l("nav",rs,[d("div",is,[(C=r(i).prev)!=null&&C.link?(a(),$(z,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:h(()=>{var B;return[d("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.prev)||"Previous page"},null,8,ls),d("span",{class:"title",innerHTML:r(i).prev.text},null,8,cs)]}),_:1},8,["href"])):_("",!0)]),d("div",us,[(N=r(i).next)!=null&&N.link?(a(),$(z,{key:0,class:"pager-link next",href:r(i).next.link},{default:h(()=>{var B;return[d("span",{class:"desc",innerHTML:((B=r(e).docFooter)==null?void 0:B.next)||"Next page"},null,8,ds),d("span",{class:"title",innerHTML:r(i).next.text},null,8,vs)]}),_:1},8,["href"])):_("",!0)])])):_("",!0)])):_("",!0)}}}),ps=m(hs,[["__scopeId","data-v-09851fe2"]]),fs=s=>(E("data-v-a2c60ea6"),s=s(),F(),s),_s={class:"container"},ms=fs(()=>d("div",{class:"aside-curtain"},null,-1)),gs={class:"aside-container"},$s={class:"aside-content"},ks={class:"content"},bs={class:"content-container"},ys={class:"main"},ws=g({__name:"VPDoc",setup(s){const{theme:e}=P(),t=te(),{hasSidebar:n,hasAside:o,leftAside:i}=D(),u=k(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(p,v)=>{const b=R("Content");return a(),l("div",{class:I(["VPDoc",{"has-sidebar":r(n),"has-aside":r(o)}])},[c(p.$slots,"doc-top",{},void 0,!0),d("div",_s,[r(o)?(a(),l("div",{key:0,class:I(["aside",{"left-aside":r(i)}])},[ms,d("div",gs,[d("div",$s,[f(xt,null,{"aside-top":h(()=>[c(p.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(p.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(p.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(p.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(p.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(p.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):_("",!0),d("div",ks,[d("div",bs,[c(p.$slots,"doc-before",{},void 0,!0),d("main",ys,[f(b,{class:I(["vp-doc",[u.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),f(ps,null,{"doc-footer-before":h(()=>[c(p.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(p.$slots,"doc-after",{},void 0,!0)])])]),c(p.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Ps=m(ws,[["__scopeId","data-v-a2c60ea6"]]),Vs=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(s){const e=s,t=k(()=>e.href&&Ve.test(e.href)),n=k(()=>e.tag||e.href?"a":"button");return(o,i)=>(a(),$(U(n.value),{class:I(["VPButton",[o.size,o.theme]]),href:o.href?r(pe)(o.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:h(()=>[H(V(o.text),1)]),_:1},8,["class","href","target","rel"]))}}),Ls=m(Vs,[["__scopeId","data-v-d78902cb"]]),Ss=["src","alt"],Ms=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const n=R("VPImage",!0);return e.image?(a(),l(T,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),l("img",J({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(ve)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Ss)):(a(),l(T,{key:1},[f(n,J({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),f(n,J({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):_("",!0)}}}),Q=m(Ms,[["__scopeId","data-v-1496cb03"]]),Cs=s=>(E("data-v-261d8488"),s=s(),F(),s),Is={class:"container"},Ts={class:"main"},Ns={key:0,class:"name"},Bs=["innerHTML"],As=["innerHTML"],Hs=["innerHTML"],zs={key:0,class:"actions"},Es={key:0,class:"image"},Fs={class:"image-container"},Ds=Cs(()=>d("div",{class:"image-bg"},null,-1)),Os=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=se("hero-image-slot-exists");return(t,n)=>(a(),l("div",{class:I(["VPHero",{"has-image":t.image||r(e)}])},[d("div",Is,[d("div",Ts,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),l("h1",Ns,[d("span",{innerHTML:t.name,class:"clip"},null,8,Bs)])):_("",!0),t.text?(a(),l("p",{key:1,innerHTML:t.text,class:"text"},null,8,As)):_("",!0),t.tagline?(a(),l("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Hs)):_("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),l("div",zs,[(a(!0),l(T,null,A(t.actions,o=>(a(),l("div",{key:o.link,class:"action"},[f(Ls,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link,target:o.target,rel:o.rel},null,8,["theme","text","href","target","rel"])]))),128))])):_("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),l("div",Es,[d("div",Fs,[Ds,c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),$(Q,{key:0,class:"image-src",image:t.image},null,8,["image"])):_("",!0)],!0)])])):_("",!0)])],2))}}),Us=m(Os,[["__scopeId","data-v-261d8488"]]),xs=g({__name:"VPHomeHero",setup(s){const{frontmatter:e}=P();return(t,n)=>r(e).hero?(a(),$(Us,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":h(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":h(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":h(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":h(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":h(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):_("",!0)}}),Gs={},js={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Rs=d("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),qs=[Rs];function Ks(s,e){return a(),l("svg",js,qs)}const Ws=m(Gs,[["render",Ks]]),Ys={class:"box"},Js={key:0,class:"icon"},Zs=["innerHTML"],Qs=["innerHTML"],Xs=["innerHTML"],eo={key:4,class:"link-text"},to={class:"link-text-value"},so=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),$(z,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:h(()=>[d("article",Ys,[typeof e.icon=="object"&&e.icon.wrap?(a(),l("div",Js,[f(Q,{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(),$(Q,{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(),l("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Zs)):_("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Qs),e.details?(a(),l("p",{key:3,class:"details",innerHTML:e.details},null,8,Xs)):_("",!0),e.linkText?(a(),l("div",eo,[d("p",to,[H(V(e.linkText)+" ",1),f(Ws,{class:"link-text-icon"})])])):_("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),oo=m(so,[["__scopeId","data-v-0fb825d6"]]),no={key:0,class:"VPFeatures"},ao={class:"container"},ro={class:"items"},io=g({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=k(()=>{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(),l("div",no,[d("div",ao,[d("div",ro,[(a(!0),l(T,null,A(n.features,i=>(a(),l("div",{key:i.title,class:I(["item",[t.value]])},[f(oo,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):_("",!0)}}),lo=m(io,[["__scopeId","data-v-ee5d2e6d"]]),co=g({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=P();return(t,n)=>r(e).features?(a(),$(lo,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):_("",!0)}}),uo={class:"VPHome"},vo=g({__name:"VPHome",setup(s){return(e,t)=>{const n=R("Content");return a(),l("div",uo,[c(e.$slots,"home-hero-before",{},void 0,!0),f(xs,null,{"home-hero-info-before":h(()=>[c(e.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(e.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(e.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(e.$slots,"home-hero-after",{},void 0,!0),c(e.$slots,"home-features-before",{},void 0,!0),f(co),c(e.$slots,"home-features-after",{},void 0,!0),f(n)])}}}),ho=m(vo,[["__scopeId","data-v-a3390ded"]]),po={},fo={class:"VPPage"};function _o(s,e){const t=R("Content");return a(),l("div",fo,[c(s.$slots,"page-top"),f(t),c(s.$slots,"page-bottom")])}const mo=m(po,[["render",_o]]),go=g({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=P(),{hasSidebar:n}=D();return(o,i)=>(a(),l("div",{class:I(["VPContent",{"has-sidebar":r(n),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(o.$slots,"not-found",{key:0},()=>[f(mt)],!0):r(t).layout==="page"?(a(),$(mo,{key:1},{"page-top":h(()=>[c(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),$(ho,{key:2},{"home-hero-before":h(()=>[c(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(o.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(o.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(o.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),$(U(r(t).layout),{key:3})):(a(),$(Ps,{key:4},{"doc-top":h(()=>[c(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":h(()=>[c(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":h(()=>[c(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":h(()=>[c(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":h(()=>[c(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),$o=m(go,[["__scopeId","data-v-bec94311"]]),ko={class:"container"},bo=["innerHTML"],yo=["innerHTML"],wo=g({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=D();return(o,i)=>r(e).footer&&r(t).footer!==!1?(a(),l("footer",{key:0,class:I(["VPFooter",{"has-sidebar":r(n)}])},[d("div",ko,[r(e).footer.message?(a(),l("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,bo)):_("",!0),r(e).footer.copyright?(a(),l("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,yo)):_("",!0)])],2)):_("",!0)}}),Po=m(wo,[["__scopeId","data-v-05135069"]]);function Ne(){const{theme:s,frontmatter:e}=P(),t=Pe([]),n=k(()=>t.value.length>0);return ee(()=>{t.value=_e(e.value.outline??s.value.outline)}),{headers:t,hasLocalNav:n}}const Vo={},Lo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},So=d("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),Mo=[So];function Co(s,e){return a(),l("svg",Lo,Mo)}const Be=m(Vo,[["render",Co]]),Io={class:"header"},To={class:"outline"},No=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=P(),n=L(!1),o=L(0),i=L(),u=L();Re(i,()=>{n.value=!1}),qe("Escape",()=>{n.value=!1}),ee(()=>{n.value=!1});function p(){n.value=!n.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function v(y){y.target.classList.contains("outline-link")&&(u.value&&(u.value.style.transition="none"),We(()=>{n.value=!1}))}function b(){n.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(y,w)=>(a(),l("div",{class:"VPLocalNavOutlineDropdown",style:Ke({"--vp-vh":o.value+"px"}),ref_key:"main",ref:i},[y.headers.length>0?(a(),l("button",{key:0,onClick:p,class:I({open:n.value})},[H(V(r(Ie)(r(t)))+" ",1),f(Be,{class:"icon"})],2)):(a(),l("button",{key:1,onClick:b},V(r(t).returnToTopLabel||"Return to top"),1)),f(de,{name:"flyout"},{default:h(()=>[n.value?(a(),l("div",{key:0,ref_key:"items",ref:u,class:"items",onClick:v},[d("div",Io,[d("a",{class:"top-link",href:"#",onClick:b},V(r(t).returnToTopLabel||"Return to top"),1)]),d("div",To,[f(Te,{headers:y.headers},null,8,["headers"])])],512)):_("",!0)]),_:1})],4))}}),Bo=m(No,[["__scopeId","data-v-ba6e1eeb"]]),Ao={},Ho={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},zo=d("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),Eo=d("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),Fo=d("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),Do=d("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),Oo=[zo,Eo,Fo,Do];function Uo(s,e){return a(),l("svg",Ho,Oo)}const xo=m(Ao,[["render",Uo]]),Go={class:"container"},jo=["aria-expanded"],Ro={class:"menu-text"},qo=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=P(),{hasSidebar:n}=D(),{headers:o}=Ne(),{y:i}=Le(),u=L(0);G(()=>{u.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ee(()=>{o.value=_e(t.value.outline??e.value.outline)});const p=k(()=>o.value.length===0),v=k(()=>p.value&&!n.value),b=k(()=>({VPLocalNav:!0,"has-sidebar":n.value,empty:p.value,fixed:v.value}));return(y,w)=>r(t).layout!=="home"&&(!v.value||r(i)>=u.value)?(a(),l("div",{key:0,class:I(b.value)},[d("div",Go,[r(n)?(a(),l("button",{key:0,class:"menu","aria-expanded":y.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=M=>y.$emit("open-menu"))},[f(xo,{class:"menu-icon"}),d("span",Ro,V(r(e).sidebarMenuLabel||"Menu"),1)],8,jo)):_("",!0),f(Bo,{headers:r(o),navHeight:u.value},null,8,["headers","navHeight"])])],2)):_("",!0)}}),Ko=m(qo,[["__scopeId","data-v-f2da8727"]]);function Wo(){const s=L(!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 i=te();return j(()=>i.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:n}}const Yo={},Jo={class:"VPSwitch",type:"button",role:"switch"},Zo={class:"check"},Qo={key:0,class:"icon"};function Xo(s,e){return a(),l("button",Jo,[d("span",Zo,[s.$slots.default?(a(),l("span",Qo,[c(s.$slots,"default",{},void 0,!0)])):_("",!0)])])}const en=m(Yo,[["render",Xo],["__scopeId","data-v-46b6d778"]]),tn={},sn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},on=d("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),nn=[on];function an(s,e){return a(),l("svg",sn,nn)}const rn=m(tn,[["render",an]]),ln={},cn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},un=Ye('',9),dn=[un];function vn(s,e){return a(),l("svg",cn,dn)}const hn=m(ln,[["render",vn]]),pn=g({__name:"VPSwitchAppearance",setup(s){const{isDark:e,theme:t}=P(),n=se("toggle-appearance",()=>{e.value=!e.value}),o=k(()=>e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme");return(i,u)=>(a(),$(en,{title:o.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(n)},{default:h(()=>[f(hn,{class:"sun"}),f(rn,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),me=m(pn,[["__scopeId","data-v-ceefbc95"]]),fn={key:0,class:"VPNavBarAppearance"},_n=g({__name:"VPNavBarAppearance",setup(s){const{site:e}=P();return(t,n)=>r(e).appearance&&r(e).appearance!=="force-dark"?(a(),l("div",fn,[f(me)])):_("",!0)}}),mn=m(_n,[["__scopeId","data-v-36bc17bf"]]),ge=L();let Ae=!1,re=0;function gn(s){const e=L(!1);if(K){!Ae&&$n(),re++;const t=j(ge,n=>{var o,i,u;n===s.el.value||(o=s.el.value)!=null&&o.contains(n)?(e.value=!0,(i=s.onFocus)==null||i.call(s)):(e.value=!1,(u=s.onBlur)==null||u.call(s))});he(()=>{t(),re--,re||kn()})}return Je(e)}function $n(){document.addEventListener("focusin",He),Ae=!0,ge.value=document.activeElement}function kn(){document.removeEventListener("focusin",He)}function He(){ge.value=document.activeElement}const bn={},yn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wn=d("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),Pn=[wn];function Vn(s,e){return a(),l("svg",yn,Pn)}const ze=m(bn,[["render",Vn]]),Ln={},Sn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Mn=d("circle",{cx:"12",cy:"12",r:"2"},null,-1),Cn=d("circle",{cx:"19",cy:"12",r:"2"},null,-1),In=d("circle",{cx:"5",cy:"12",r:"2"},null,-1),Tn=[Mn,Cn,In];function Nn(s,e){return a(),l("svg",Sn,Tn)}const Bn=m(Ln,[["render",Nn]]),An={class:"VPMenuLink"},Hn=g({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),l("div",An,[f(z,{class:I({active:r(x)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:h(()=>[H(V(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),oe=m(Hn,[["__scopeId","data-v-f4766ae3"]]),zn={class:"VPMenuGroup"},En={key:0,class:"title"},Fn=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),l("div",zn,[e.text?(a(),l("p",En,V(e.text),1)):_("",!0),(a(!0),l(T,null,A(e.items,n=>(a(),l(T,null,["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):_("",!0)],64))),256))]))}}),Dn=m(Fn,[["__scopeId","data-v-ed3b36e8"]]),On={class:"VPMenu"},Un={key:0,class:"items"},xn=g({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),l("div",On,[e.items?(a(),l("div",Un,[(a(!0),l(T,null,A(e.items,n=>(a(),l(T,{key:n.text},["link"in n?(a(),$(oe,{key:0,item:n},null,8,["item"])):(a(),$(Dn,{key:1,text:n.text,items:n.items},null,8,["text","items"]))],64))),128))])):_("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Gn=m(xn,[["__scopeId","data-v-65bf37b0"]]),jn=["aria-expanded","aria-label"],Rn={key:0,class:"text"},qn=["innerHTML"],Kn={class:"menu"},Wn=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=L(!1),t=L();gn({el:t,onBlur:n});function n(){e.value=!1}return(o,i)=>(a(),l("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=u=>e.value=!0),onMouseleave:i[2]||(i[2]=u=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:i[0]||(i[0]=u=>e.value=!e.value)},[o.button||o.icon?(a(),l("span",Rn,[o.icon?(a(),$(U(o.icon),{key:0,class:"option-icon"})):_("",!0),o.button?(a(),l("span",{key:1,innerHTML:o.button},null,8,qn)):_("",!0),f(ze,{class:"text-icon"})])):(a(),$(Bn,{key:1,class:"icon"}))],8,jn),d("div",Kn,[f(Gn,{items:o.items},{default:h(()=>[c(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),$e=m(Wn,[["__scopeId","data-v-a1f9f724"]]),Yn={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',npm:'npm',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Jn=["href","aria-label","innerHTML"],Zn=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=k(()=>typeof e.icon=="object"?e.icon.svg:Yn[e.icon]);return(n,o)=>(a(),l("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,Jn))}}),Qn=m(Zn,[["__scopeId","data-v-830361a1"]]),Xn={class:"VPSocialLinks"},ea=g({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),l("div",Xn,[(a(!0),l(T,null,A(e.links,({link:n,icon:o,ariaLabel:i})=>(a(),$(Qn,{key:n,icon:o,link:n,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),ke=m(ea,[["__scopeId","data-v-d3597f0d"]]),ta={key:0,class:"group translations"},sa={class:"trans-title"},oa={key:1,class:"group"},na={class:"item appearance"},aa={class:"label"},ra={class:"appearance-action"},ia={key:2,class:"group"},la={class:"item social-links"},ca=g({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=P(),{localeLinks:n,currentLang:o}=W({correspondingLink:!0}),i=k(()=>n.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(u,p)=>i.value?(a(),$($e,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:h(()=>[r(n).length&&r(o).label?(a(),l("div",ta,[d("p",sa,V(r(o).label),1),(a(!0),l(T,null,A(r(n),v=>(a(),$(oe,{key:v.link,item:v},null,8,["item"]))),128))])):_("",!0),r(e).appearance&&r(e).appearance!=="force-dark"?(a(),l("div",oa,[d("div",na,[d("p",aa,V(r(t).darkModeSwitchLabel||"Appearance"),1),d("div",ra,[f(me)])])])):_("",!0),r(t).socialLinks?(a(),l("div",ia,[d("div",la,[f(ke,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):_("",!0)]),_:1})):_("",!0)}}),ua=m(ca,[["__scopeId","data-v-7cc6feae"]]),da=s=>(E("data-v-c2ec009a"),s=s(),F(),s),va=["aria-expanded"],ha=da(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),pa=[ha],fa=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),l("button",{type:"button",class:I(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=n=>e.$emit("click"))},pa,10,va))}}),_a=m(fa,[["__scopeId","data-v-c2ec009a"]]),ma=["innerHTML"],ga=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=P();return(t,n)=>(a(),$(z,{class:I({VPNavBarMenuLink:!0,active:r(x)(r(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:h(()=>[d("span",{innerHTML:t.item.text},null,8,ma)]),_:1},8,["class","href","target","rel"]))}}),$a=m(ga,[["__scopeId","data-v-0b3cba30"]]),ka=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=P(),n=i=>"link"in i?x(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(n),o=k(()=>n(e.item));return(i,u)=>(a(),$($e,{class:I({VPNavBarMenuGroup:!0,active:r(x)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||o.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),ba=s=>(E("data-v-c656c3ac"),s=s(),F(),s),ya={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},wa=ba(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Pa=g({__name:"VPNavBarMenu",setup(s){const{theme:e}=P();return(t,n)=>r(e).nav?(a(),l("nav",ya,[wa,(a(!0),l(T,null,A(r(e).nav,o=>(a(),l(T,{key:o.text},["link"in o?(a(),$($a,{key:0,item:o},null,8,["item"])):(a(),$(ka,{key:1,item:o},null,8,["item"]))],64))),128))])):_("",!0)}}),Va=m(Pa,[["__scopeId","data-v-c656c3ac"]]);function La(s){const{localeIndex:e,theme:t}=P();function n(o){var N,B,S;const i=o.split("."),u=(N=t.value.search)==null?void 0:N.options,p=u&&typeof u=="object",v=p&&((S=(B=u.locales)==null?void 0:B[e.value])==null?void 0:S.translations)||null,b=p&&u.translations||null;let y=v,w=b,M=s;const C=i.pop();for(const Y of i){let O=null;const q=M==null?void 0:M[Y];q&&(O=M=q);const ne=w==null?void 0:w[Y];ne&&(O=w=ne);const ae=y==null?void 0:y[Y];ae&&(O=y=ae),q||(M=O),ne||(w=O),ae||(y=O)}return(y==null?void 0:y[C])??(w==null?void 0:w[C])??(M==null?void 0:M[C])??""}return n}const Sa=["aria-label"],Ma={class:"DocSearch-Button-Container"},Ca=d("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[d("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),Ia={class:"DocSearch-Button-Placeholder"},Ta=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1),be=g({__name:"VPNavBarSearchButton",setup(s){const t=La({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(n,o)=>(a(),l("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[d("span",Ma,[Ca,d("span",Ia,V(r(t)("button.buttonText")),1)]),Ta],8,Sa))}}),Na={class:"VPNavBarSearch"},Ba={id:"local-search"},Aa={key:1,id:"docsearch"},Ha=g({__name:"VPNavBarSearch",setup(s){const e=()=>null,t=()=>null,{theme:n}=P(),o=L(!1),i=L(!1);G(()=>{});function u(){o.value||(o.value=!0,setTimeout(p,16))}function p(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||p()},16)}const v=L(!1),b="";return(y,w)=>{var M;return a(),l("div",Na,[r(b)==="local"?(a(),l(T,{key:0},[v.value?(a(),$(r(e),{key:0,onClose:w[0]||(w[0]=C=>v.value=!1)})):_("",!0),d("div",Ba,[f(be,{onClick:w[1]||(w[1]=C=>v.value=!0)})])],64)):r(b)==="algolia"?(a(),l(T,{key:1},[o.value?(a(),$(r(t),{key:0,algolia:((M=r(n).search)==null?void 0:M.options)??r(n).algolia,onVnodeBeforeMount:w[2]||(w[2]=C=>i.value=!0)},null,8,["algolia"])):_("",!0),i.value?_("",!0):(a(),l("div",Aa,[f(be,{onClick:u})]))],64)):_("",!0)])}}}),za=g({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>r(e).socialLinks?(a(),$(ke,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):_("",!0)}}),Ea=m(za,[["__scopeId","data-v-af1fb2ec"]]),Fa=["href","rel","target"],Da={key:1},Oa={key:2},Ua=g({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=P(),{hasSidebar:n}=D(),{currentLang:o}=W(),i=k(()=>{var v;return typeof t.value.logoLink=="string"?t.value.logoLink:(v=t.value.logoLink)==null?void 0:v.link}),u=k(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.rel}),p=k(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.target});return(v,b)=>(a(),l("div",{class:I(["VPNavBarTitle",{"has-sidebar":r(n)}])},[d("a",{class:"title",href:i.value??r(pe)(r(o).link),rel:u.value,target:p.value},[c(v.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),$(Q,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):_("",!0),r(t).siteTitle?(a(),l("span",Da,V(r(t).siteTitle),1)):r(t).siteTitle===void 0?(a(),l("span",Oa,V(r(e).title),1)):_("",!0),c(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,Fa)],2))}}),xa=m(Ua,[["__scopeId","data-v-bdace926"]]),Ga={},ja={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ra=d("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),qa=d("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),Ka=[Ra,qa];function Wa(s,e){return a(),l("svg",ja,Ka)}const Ee=m(Ga,[["render",Wa]]),Ya={class:"items"},Ja={class:"title"},Za=g({__name:"VPNavBarTranslations",setup(s){const{theme:e}=P(),{localeLinks:t,currentLang:n}=W({correspondingLink:!0});return(o,i)=>r(t).length&&r(n).label?(a(),$($e,{key:0,class:"VPNavBarTranslations",icon:Ee,label:r(e).langMenuLabel||"Change language"},{default:h(()=>[d("div",Ya,[d("p",Ja,V(r(n).label),1),(a(!0),l(T,null,A(r(t),u=>(a(),$(oe,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):_("",!0)}}),Qa=m(Za,[["__scopeId","data-v-73748009"]]),Xa=s=>(E("data-v-0c13c512"),s=s(),F(),s),er={class:"wrapper"},tr={class:"container"},sr={class:"title"},or={class:"content"},nr={class:"content-body"},ar=Xa(()=>d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1)),rr=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const{y:e}=Le(),{hasSidebar:t}=D(),{hasLocalNav:n}=Ne(),{frontmatter:o}=P(),i=L({});return we(()=>{i.value={"has-sidebar":t.value,"has-local-nav":n.value,top:o.value.layout==="home"&&e.value===0}}),(u,p)=>(a(),l("div",{class:I(["VPNavBar",i.value])},[d("div",er,[d("div",tr,[d("div",sr,[f(xa,null,{"nav-bar-title-before":h(()=>[c(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(u.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",or,[d("div",nr,[c(u.$slots,"nav-bar-content-before",{},void 0,!0),f(Ha,{class:"search"}),f(Va,{class:"menu"}),f(Qa,{class:"translations"}),f(mn,{class:"appearance"}),f(Ea,{class:"social-links"}),f(ua,{class:"extra"}),c(u.$slots,"nav-bar-content-after",{},void 0,!0),f(_a,{class:"hamburger",active:u.isScreenOpen,onClick:p[0]||(p[0]=v=>u.$emit("toggle-screen"))},null,8,["active"])])])])]),ar],2))}}),ir=m(rr,[["__scopeId","data-v-0c13c512"]]),lr={key:0,class:"VPNavScreenAppearance"},cr={class:"text"},ur=g({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=P();return(n,o)=>r(e).appearance&&r(e).appearance!=="force-dark"?(a(),l("div",lr,[d("p",cr,V(r(t).darkModeSwitchLabel||"Appearance"),1),f(me)])):_("",!0)}}),dr=m(ur,[["__scopeId","data-v-93411559"]]),vr=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=se("close-screen");return(t,n)=>(a(),$(z,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:h(()=>[H(V(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),hr=m(vr,[["__scopeId","data-v-087cdc5c"]]),pr={},fr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},_r=d("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),mr=[_r];function gr(s,e){return a(),l("svg",fr,mr)}const $r=m(pr,[["render",gr]]),kr=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=se("close-screen");return(t,n)=>(a(),$(z,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:r(e)},{default:h(()=>[H(V(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Fe=m(kr,[["__scopeId","data-v-2e83d2e4"]]),br={class:"VPNavScreenMenuGroupSection"},yr={key:0,class:"title"},wr=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),l("div",br,[e.text?(a(),l("p",yr,V(e.text),1)):_("",!0),(a(!0),l(T,null,A(e.items,n=>(a(),$(Fe,{key:n.text,item:n},null,8,["item"]))),128))]))}}),Pr=m(wr,[["__scopeId","data-v-73af5b34"]]),Vr=["aria-controls","aria-expanded"],Lr=["innerHTML"],Sr=["id"],Mr={key:1,class:"group"},Cr=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=L(!1),n=k(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(i,u)=>(a(),l("div",{class:I(["VPNavScreenMenuGroup",{open:t.value}])},[d("button",{class:"button","aria-controls":n.value,"aria-expanded":t.value,onClick:o},[d("span",{class:"button-text",innerHTML:i.text},null,8,Lr),f($r,{class:"button-icon"})],8,Vr),d("div",{id:n.value,class:"items"},[(a(!0),l(T,null,A(i.items,p=>(a(),l(T,{key:p.text},["link"in p?(a(),l("div",{key:p.text,class:"item"},[f(Fe,{item:p},null,8,["item"])])):(a(),l("div",Mr,[f(Pr,{text:p.text,items:p.items},null,8,["text","items"])]))],64))),128))],8,Sr)],2))}}),Ir=m(Cr,[["__scopeId","data-v-8e0c44cb"]]),Tr={key:0,class:"VPNavScreenMenu"},Nr=g({__name:"VPNavScreenMenu",setup(s){const{theme:e}=P();return(t,n)=>r(e).nav?(a(),l("nav",Tr,[(a(!0),l(T,null,A(r(e).nav,o=>(a(),l(T,{key:o.text},["link"in o?(a(),$(hr,{key:0,item:o},null,8,["item"])):(a(),$(Ir,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):_("",!0)}}),Br=g({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=P();return(t,n)=>r(e).socialLinks?(a(),$(ke,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):_("",!0)}}),Ar={class:"list"},Hr=g({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=W({correspondingLink:!0}),n=L(!1);function o(){n.value=!n.value}return(i,u)=>r(e).length&&r(t).label?(a(),l("div",{key:0,class:I(["VPNavScreenTranslations",{open:n.value}])},[d("button",{class:"title",onClick:o},[f(Ee,{class:"icon lang"}),H(" "+V(r(t).label)+" ",1),f(ze,{class:"icon chevron"})]),d("ul",Ar,[(a(!0),l(T,null,A(r(e),p=>(a(),l("li",{key:p.link,class:"item"},[f(z,{class:"link",href:p.link},{default:h(()=>[H(V(p.text),1)]),_:2},1032,["href"])]))),128))])],2)):_("",!0)}}),zr=m(Hr,[["__scopeId","data-v-0a66c669"]]),Er={class:"container"},Fr=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=L(null),t=Se(K?document.body:null);return(n,o)=>(a(),$(de,{name:"fade",onEnter:o[0]||(o[0]=i=>t.value=!0),onAfterLeave:o[1]||(o[1]=i=>t.value=!1)},{default:h(()=>[n.open?(a(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[d("div",Er,[c(n.$slots,"nav-screen-content-before",{},void 0,!0),f(Nr,{class:"menu"}),f(zr,{class:"translations"}),f(dr,{class:"appearance"}),f(Br,{class:"social-links"}),c(n.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):_("",!0)]),_:3}))}}),Dr=m(Fr,[["__scopeId","data-v-da863be4"]]),Or={key:0,class:"VPNav"},Ur=g({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:n}=Wo(),{frontmatter:o}=P(),i=k(()=>o.value.navbar!==!1);return Me("close-screen",t),X(()=>{K&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(u,p)=>i.value?(a(),l("header",Or,[f(ir,{"is-screen-open":r(e),onToggleScreen:r(n)},{"nav-bar-title-before":h(()=>[c(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(u.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),f(Dr,{open:r(e)},{"nav-screen-content-before":h(()=>[c(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):_("",!0)}}),xr=m(Ur,[["__scopeId","data-v-53ded626"]]),Gr=s=>(E("data-v-c0c1a422"),s=s(),F(),s),jr=["role","tabindex"],Rr=Gr(()=>d("div",{class:"indicator"},null,-1)),qr={key:1,class:"items"},Kr=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:n,isLink:o,isActiveLink:i,hasActiveLink:u,hasChildren:p,toggle:v}=bt(k(()=>e.item)),b=k(()=>p.value?"section":"div"),y=k(()=>o.value?"a":"div"),w=k(()=>p.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),M=k(()=>o.value?void 0:"button"),C=k(()=>[[`level-${e.depth}`],{collapsible:n.value},{collapsed:t.value},{"is-link":o.value},{"is-active":i.value},{"has-active":u.value}]);function N(S){"key"in S&&S.key!=="Enter"||!e.item.link&&v()}function B(){e.item.link&&v()}return(S,Y)=>{const O=R("VPSidebarItem",!0);return a(),$(U(b.value),{class:I(["VPSidebarItem",C.value])},{default:h(()=>[S.item.text?(a(),l("div",J({key:0,class:"item",role:M.value},Qe(S.item.items?{click:N,keydown:N}:{},!0),{tabindex:S.item.items&&0}),[Rr,S.item.link?(a(),$(z,{key:0,tag:y.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:h(()=>[(a(),$(U(w.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),$(U(w.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null?(a(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:B,onKeydown:Ze(B,["enter"]),tabindex:"0"},[f(Be,{class:"caret-icon"})],32)):_("",!0)],16,jr)):_("",!0),S.item.items&&S.item.items.length?(a(),l("div",qr,[S.depth<5?(a(!0),l(T,{key:0},A(S.item.items,q=>(a(),$(O,{key:q.text,item:q,depth:S.depth+1},null,8,["item","depth"]))),128)):_("",!0)])):_("",!0)]),_:1},8,["class"])}}}),Wr=m(Kr,[["__scopeId","data-v-c0c1a422"]]),De=s=>(E("data-v-ba8faffd"),s=s(),F(),s),Yr=De(()=>d("div",{class:"curtain"},null,-1)),Jr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Zr=De(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Qr=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=D(),n=s,o=L(null),i=Se(K?document.body:null);return j([n,o],()=>{var u;n.open?(i.value=!0,(u=o.value)==null||u.focus()):i.value=!1},{immediate:!0,flush:"post"}),(u,p)=>r(t)?(a(),l("aside",{key:0,class:I(["VPSidebar",{open:u.open}]),ref_key:"navEl",ref:o,onClick:p[0]||(p[0]=Xe(()=>{},["stop"]))},[Yr,d("nav",Jr,[Zr,c(u.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),l(T,null,A(r(e),v=>(a(),l("div",{key:v.text,class:"group"},[f(Wr,{item:v,depth:0},null,8,["item"])]))),128)),c(u.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):_("",!0)}}),Xr=m(Qr,[["__scopeId","data-v-ba8faffd"]]),ei=g({__name:"VPSkipLink",setup(s){const e=te(),t=L();j(()=>e.path,()=>t.value.focus());function n({target:o}){const i=document.getElementById(decodeURIComponent(o.hash).slice(1));if(i){const u=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",u)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",u),i.focus(),window.scrollTo(0,0)}}return(o,i)=>(a(),l(T,null,[d("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:n}," Skip to content ")],64))}}),ti=m(ei,[["__scopeId","data-v-076c9da4"]]),si=g({__name:"Layout",setup(s){const{isOpen:e,open:t,close:n}=D(),o=te();j(()=>o.path,n),kt(e,n);const{frontmatter:i}=P(),u=et(),p=k(()=>!!u["home-hero-image"]);return Me("hero-image-slot-exists",p),(v,b)=>{const y=R("Content");return r(i).layout!==!1?(a(),l("div",{key:0,class:I(["Layout",r(i).pageClass])},[c(v.$slots,"layout-top",{},void 0,!0),f(ti),f(at,{class:"backdrop",show:r(e),onClick:r(n)},null,8,["show","onClick"]),f(xr,null,{"nav-bar-title-before":h(()=>[c(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":h(()=>[c(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":h(()=>[c(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":h(()=>[c(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":h(()=>[c(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":h(()=>[c(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),f(Ko,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),f(Xr,{open:r(e)},{"sidebar-nav-before":h(()=>[c(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":h(()=>[c(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),f($o,null,{"page-top":h(()=>[c(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":h(()=>[c(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":h(()=>[c(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":h(()=>[c(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":h(()=>[c(v.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":h(()=>[c(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":h(()=>[c(v.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":h(()=>[c(v.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":h(()=>[c(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":h(()=>[c(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":h(()=>[c(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":h(()=>[c(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":h(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":h(()=>[c(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":h(()=>[c(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":h(()=>[c(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":h(()=>[c(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":h(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":h(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":h(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":h(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":h(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":h(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),f(Po),c(v.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),$(y,{key:1}))}}}),oi=m(si,[["__scopeId","data-v-f76875ae"]]),ye={Layout:oi,enhanceApp:({app:s})=>{s.component("Badge",st)}},ai={extends:ye,Layout:()=>tt(ye.Layout,null,{}),enhanceApp({app:s,router:e,siteData:t}){}};export{ai as R}; diff --git a/assets/guide_adapter_adapter.md.CPaS6z3t.js b/assets/guide_adapter_adapter.md.CPaS6z3t.js new file mode 100644 index 00000000..3846cf81 --- /dev/null +++ b/assets/guide_adapter_adapter.md.CPaS6z3t.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as d}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"实现适配器类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/adapter.md","filePath":"guide/adapter/adapter.md","lastUpdated":1707642172000}'),s={name:"guide/adapter/adapter.md"},o=e("h1",{id:"实现适配器类",tabindex:"-1"},[d("实现适配器类 "),e("a",{class:"header-anchor",href:"#实现适配器类","aria-label":'Permalink to "实现适配器类"'},"​")],-1),c=[o];function n(i,p,_,l,m,h){return r(),t("div",null,c)}const x=a(s,[["render",n]]);export{u as __pageData,x as default}; diff --git a/assets/guide_adapter_adapter.md.CPaS6z3t.lean.js b/assets/guide_adapter_adapter.md.CPaS6z3t.lean.js new file mode 100644 index 00000000..3846cf81 --- /dev/null +++ b/assets/guide_adapter_adapter.md.CPaS6z3t.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as d}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"实现适配器类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/adapter.md","filePath":"guide/adapter/adapter.md","lastUpdated":1707642172000}'),s={name:"guide/adapter/adapter.md"},o=e("h1",{id:"实现适配器类",tabindex:"-1"},[d("实现适配器类 "),e("a",{class:"header-anchor",href:"#实现适配器类","aria-label":'Permalink to "实现适配器类"'},"​")],-1),c=[o];function n(i,p,_,l,m,h){return r(),t("div",null,c)}const x=a(s,[["render",n]]);export{u as __pageData,x as default}; diff --git a/assets/guide_adapter_api.md.hdpKQFFf.js b/assets/guide_adapter_api.md.hdpKQFFf.js new file mode 100644 index 00000000..82623f2b --- /dev/null +++ b/assets/guide_adapter_api.md.hdpKQFFf.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"实现接口类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/api.md","filePath":"guide/adapter/api.md","lastUpdated":1707642172000}'),d={name:"guide/adapter/api.md"},o=e("h1",{id:"实现接口类",tabindex:"-1"},[s("实现接口类 "),e("a",{class:"header-anchor",href:"#实现接口类","aria-label":'Permalink to "实现接口类"'},"​")],-1),i=[o];function c(n,p,_,l,m,h){return r(),t("div",null,i)}const x=a(d,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_adapter_api.md.hdpKQFFf.lean.js b/assets/guide_adapter_api.md.hdpKQFFf.lean.js new file mode 100644 index 00000000..82623f2b --- /dev/null +++ b/assets/guide_adapter_api.md.hdpKQFFf.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"实现接口类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/api.md","filePath":"guide/adapter/api.md","lastUpdated":1707642172000}'),d={name:"guide/adapter/api.md"},o=e("h1",{id:"实现接口类",tabindex:"-1"},[s("实现接口类 "),e("a",{class:"header-anchor",href:"#实现接口类","aria-label":'Permalink to "实现接口类"'},"​")],-1),i=[o];function c(n,p,_,l,m,h){return r(),t("div",null,i)}const x=a(d,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_adapter_custom.md.CfwlDg0J.js b/assets/guide_adapter_custom.md.CfwlDg0J.js new file mode 100644 index 00000000..8c20ec9b --- /dev/null +++ b/assets/guide_adapter_custom.md.CfwlDg0J.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"自定义服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/custom.md","filePath":"guide/adapter/custom.md","lastUpdated":1707642172000}'),r={name:"guide/adapter/custom.md"},c=e("h1",{id:"自定义服务",tabindex:"-1"},[o("自定义服务 "),e("a",{class:"header-anchor",href:"#自定义服务","aria-label":'Permalink to "自定义服务"'},"​")],-1),d=[c];function n(i,m,p,_,l,u){return s(),t("div",null,d)}const x=a(r,[["render",n]]);export{f as __pageData,x as default}; diff --git a/assets/guide_adapter_custom.md.CfwlDg0J.lean.js b/assets/guide_adapter_custom.md.CfwlDg0J.lean.js new file mode 100644 index 00000000..8c20ec9b --- /dev/null +++ b/assets/guide_adapter_custom.md.CfwlDg0J.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"自定义服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/custom.md","filePath":"guide/adapter/custom.md","lastUpdated":1707642172000}'),r={name:"guide/adapter/custom.md"},c=e("h1",{id:"自定义服务",tabindex:"-1"},[o("自定义服务 "),e("a",{class:"header-anchor",href:"#自定义服务","aria-label":'Permalink to "自定义服务"'},"​")],-1),d=[c];function n(i,m,p,_,l,u){return s(),t("div",null,d)}const x=a(r,[["render",n]]);export{f as __pageData,x as default}; diff --git a/assets/guide_adapter_database.md.Ci773K7V.js b/assets/guide_adapter_database.md.Ci773K7V.js new file mode 100644 index 00000000..0747331f --- /dev/null +++ b/assets/guide_adapter_database.md.Ci773K7V.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s,m as a,a as d}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"数据库服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/database.md","filePath":"guide/adapter/database.md","lastUpdated":1707642172000}'),r={name:"guide/adapter/database.md"},o=a("h1",{id:"数据库服务",tabindex:"-1"},[d("数据库服务 "),a("a",{class:"header-anchor",href:"#数据库服务","aria-label":'Permalink to "数据库服务"'},"​")],-1),c=[o];function n(i,p,_,l,m,h){return s(),t("div",null,c)}const b=e(r,[["render",n]]);export{u as __pageData,b as default}; diff --git a/assets/guide_adapter_database.md.Ci773K7V.lean.js b/assets/guide_adapter_database.md.Ci773K7V.lean.js new file mode 100644 index 00000000..0747331f --- /dev/null +++ b/assets/guide_adapter_database.md.Ci773K7V.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as s,m as a,a as d}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"数据库服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/database.md","filePath":"guide/adapter/database.md","lastUpdated":1707642172000}'),r={name:"guide/adapter/database.md"},o=a("h1",{id:"数据库服务",tabindex:"-1"},[d("数据库服务 "),a("a",{class:"header-anchor",href:"#数据库服务","aria-label":'Permalink to "数据库服务"'},"​")],-1),c=[o];function n(i,p,_,l,m,h){return s(),t("div",null,c)}const b=e(r,[["render",n]]);export{u as __pageData,b as default}; diff --git a/assets/guide_adapter_elements.md.DPNHKdQ5.js b/assets/guide_adapter_elements.md.DPNHKdQ5.js new file mode 100644 index 00000000..0bd13fc9 --- /dev/null +++ b/assets/guide_adapter_elements.md.DPNHKdQ5.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as r}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"实现元素类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/elements.md","filePath":"guide/adapter/elements.md","lastUpdated":1707642172000}'),d={name:"guide/adapter/elements.md"},n=e("h1",{id:"实现元素类",tabindex:"-1"},[r("实现元素类 "),e("a",{class:"header-anchor",href:"#实现元素类","aria-label":'Permalink to "实现元素类"'},"​")],-1),o=[n];function c(i,l,m,p,_,h){return s(),t("div",null,o)}const x=a(d,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_adapter_elements.md.DPNHKdQ5.lean.js b/assets/guide_adapter_elements.md.DPNHKdQ5.lean.js new file mode 100644 index 00000000..0bd13fc9 --- /dev/null +++ b/assets/guide_adapter_elements.md.DPNHKdQ5.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as r}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"实现元素类","description":"","frontmatter":{},"headers":[],"relativePath":"guide/adapter/elements.md","filePath":"guide/adapter/elements.md","lastUpdated":1707642172000}'),d={name:"guide/adapter/elements.md"},n=e("h1",{id:"实现元素类",tabindex:"-1"},[r("实现元素类 "),e("a",{class:"header-anchor",href:"#实现元素类","aria-label":'Permalink to "实现元素类"'},"​")],-1),o=[n];function c(i,l,m,p,_,h){return s(),t("div",null,o)}const x=a(d,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_base_command.md.CvTXbNFZ.js b/assets/guide_base_command.md.CvTXbNFZ.js new file mode 100644 index 00000000..9d11945b --- /dev/null +++ b/assets/guide_base_command.md.CvTXbNFZ.js @@ -0,0 +1,21 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"指令注册","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/command.md","filePath":"guide/base/command.md","lastUpdated":1707642172000}'),t={name:"guide/base/command.md"},h=n(`

指令注册

引入

在上一节中学习了事件系统的使用,现在通过 on_message 事件实现一个小功能:

typescript
ctx.on('on_message', (session) => {
+	if (!session.message.startWith('/')) return;
+	const command = session.message.slice(1);
+	if (command === 'echo') {
+		const content = command.slice(5);
+		session.send(content ? content : '输入内容为空');
+	} else if (command === 'time') {
+		session.send(\`现在的时间是 \${new Date().getTime()}\`);
+	} else {
+		session.send('未知的指令');
+	}
+});

当收到「/echo xxx」消息时将发送 「xxx」;当收到「/time」消息时将发送当前时间戳;两者都不是时发送「未知的指令」。然而当结果越来越多后,if...else 语句也会越来越多,显然,这是十分糟糕的。尽管可以考虑将条件内容作为键、结果处理包装成回调函数作为值,以键值对形式装进一个对象或者 Map 中,然后遍历执行。但是当条件越来越复杂时,字符串的键远无法满足需求,同时也可能有相当一部分内容仅在私聊或者群聊下可用,其次,参数的处理也需要在结果处理内部中完成,这是十分复杂与繁琐的,因此便有入了本节内容。

基本使用

指令(Command) 是 Kotori 的核心功能,也是最常见的交互方式,指令实质是 Kotori 内部对 on_message 事件的再处理与封装,这点与下一节中将学习的中间件是一致的,因此也可以看作是一个事件处理的语法糖。通过 ctx.command() 可注册一条指令,参数为指令模板字符,返回 Command 实例对象,实例上有着若干方法用于装饰该指令,其返回值同样为当前指令的实例对象。

typescript
ctx.command('echo <...content>').action((data) => data.args.join(' '));
+ctx.command('time')
+	.action(() => {
+		const time = new Date().getTime();
+		return time;
+});

指令模板字符

typescript
ctx.command('bar');
+ctx.command('car <arg1> <arg2>');
+ctx.command('dar <arg1> [arg2] [arg3=value]');
+ctx.command('ear [arg1:number=1] [...args:string] - 指令描述');

上述演示了指令模板字符的基本格式。

  • 尖括号 <> 表示必要参数,方括号 [] 为可选参数
  • 括号内部内容格式是 参数名:参数类型,参数名应为小写字母与数字([a-z0-9])组成,参数类型可省略,默认 string,支持的类型有:stringnumberboolean
  • 可选参数中可在参数类型后添加 =值 设置默认参数
  • 参数中可在参数名前添加 ... 设置剩余参数,与 TypeScript 不同的是,剩余参数的类型不需要加上数组表示
  • 在指令模板字符最后添加 - 指令描述 设置指令描述
  • 指令内容为截止到第一个参数出现之前的字符串(不含空格)
  • 参数名应尽量语义化;剩余参数应在所有参数最后面;应仅在可选参数中设置默认参数;必要参数应在可选参数之前;指令模板字符不应包含指令前缀

指令选项

通过 Command.option() 设置指令选项,第一个参数为该选项的缩写名,第二个参数为选模板字符,可设置多个指令选项。

typescript
ctx.command('bar')
+	.options()

指令处理

通过 Command.action() 设置指令的回调函数,回调函数中第一个参数为 argsoptions 两个键组成的对象,类型分别为 (string | number | boolean)[]Record<string, string | number | boolean>,分别代表输入的参数值与选项值。每个指令仅可设置一个回调函数。

options 中的键为对应选项的全名而非缩写名。

typescript
`,19),k=[h];function l(p,e,E,d,r,g){return a(),i("div",null,k)}const y=s(t,[["render",l]]);export{c as __pageData,y as default}; diff --git a/assets/guide_base_command.md.CvTXbNFZ.lean.js b/assets/guide_base_command.md.CvTXbNFZ.lean.js new file mode 100644 index 00000000..c9abbfbe --- /dev/null +++ b/assets/guide_base_command.md.CvTXbNFZ.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"指令注册","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/command.md","filePath":"guide/base/command.md","lastUpdated":1707642172000}'),t={name:"guide/base/command.md"},h=n("",19),k=[h];function l(p,e,E,d,r,g){return a(),i("div",null,k)}const y=s(t,[["render",l]]);export{c as __pageData,y as default}; diff --git a/assets/guide_base_events.md.D1LHe1qC.js b/assets/guide_base_events.md.D1LHe1qC.js new file mode 100644 index 00000000..c00ab370 --- /dev/null +++ b/assets/guide_base_events.md.D1LHe1qC.js @@ -0,0 +1,64 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"事件系统","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/events.md","filePath":"guide/base/events.md","lastUpdated":1707642172000}'),t={name:"guide/base/events.md"},h=n(`

事件系统

事件系统(Events) 的上游是事件订阅者模式(Events Emiter),该设计模式与事件系统共同构成了 Kotori 的基础,Kotori 内部通过订阅事件保持各部分间的联系和协作任务。同时也有来自各个聊天平台的事件,通过订阅这些事件能实现丰富多样的功能。

订阅事件

事件系统的使用方法与常规的事件订阅者一致,通过 ctx.on() 订阅一个事件,第一个参数为事件名,第二个参数为回调函数,事件被触发时事件数据将作为实际参数传给回调函数。

typescript
import { MessageScope } from 'kotori-bot'
+
+// ...
+
+ctx.on('on_message', (session) => {
+	if (session.message !== '你是谁') return;
+	if (session.type === MessageScope.GROUP) {
+		session.api.sendGroupMsg('是 Kotori!', session.groupId);
+	} else {
+		session.api.sendPrivateMsg('是 Kotori!', session.userId);	
+	}
+});

从上述代码中可以看出,当收到消息时,如果不是「你是谁」则立即退出,执行完毕。如果是则判断 session.type 的值,调用相应的发送消息接口发送「是 Kotori!」。根据语义化命名可知:session.type 为消息类型,值是一个 MessageScope 枚举值,分为 「GROUP」(群聊)和「PRIVATE」(私聊);session.apiApi 的实例对象,提供了多种与聊天平台交互的接口,此处用到的 sendG丨groupMsgsendPrivateMsg 分别是发送群聊消息与发送私聊消息,第一个参数为消息内容,第二个参数分别为群聊 id 与用户 id。

id 一般为对应聊天平台提供的 id/uid,叫法不一,值类型为 string 或 number。如当你收到由适配器 @kotori-bot/kotori-plugin-adapter-onebot 发出的消息时,groupId 为 QQ 群号,userId 为 QQ 号。

上面的代码每次都需要判断消息类型再执行相应方法,显得有点繁琐,因此 kotori 提供了一个语法糖:

typescript
ctx.on('on_message', (session) => {
+	if (session.message !== '你是谁') return;
+		session.send('是 Kotori!');	
+	}
+});

使用 session.send() 只需要传入消息内容即可,消息类型判断和传入相应 id 的工作已在该方法内部完成。session 上还有不少与之类似的语法糖,将在后面章节中逐一提到,也因如此,session.send() 在实际开发中使用率并不高,因为它对后续内容而言依旧很繁琐。

取消订阅事件

正如订阅事件是「on」,取消订阅事件则是「off」。ctx.off() 的使用方法与 ctx.on() 一致。

typescript

+const handle = (session: Session['on_message']) => {
+	ctx.off('on_message', handle);
+	// ...
+}
+
+ctx.on('on_message', handle);

上述代码中,触发事件后会立即取消订阅事件,意味着它只会被触发一次。ctx.on() 在执行后会返回取消订阅自己的方法,因此可以这样简化:

typescript
const off = ctx.on('on_message', (session) => {
+	off();
+	// ...
+});

使用 ctx.once() 再进一步简化:

typescript
ctx.once('on_message', (session) => {
+	// ...
+});

工作流程与上面一致,通过 ctx.once() 订阅事件,在触发后会立即取消订阅。

使用 ctx.offAll() 取消订阅指定事件名下所有事件:

typescript
ctx.once('on_message', (session) => {
+	// ...
+});
+
+ctx.once('on_message', (session) => {
+	// ...
+});
+
+ctx.on('on_message', (session) => {
+	if (session.message === '消失吧!') return;
+		ctx.ofAll('on_message');
+	}
+});

在第三个回调函数中,当收到消息「消失吧!」时将取消订阅所有 on_message 事件。

事件类型

Kotori 中事件类型大致分为三类:

  • 系统事件(System Event):与生命周期和适配器有关的事件,回调函数中的参数名一般为 data
  • 会话事件(Session Event):与聊天平台有关的事件,回调函数中的参数名一般为 session
  • 自定义事件(Custom Event):由模块定义的事件,一般用于模块内部或多个模块间通信,参数量不固定。

系统事件

常见的系统事件有:

  • ready :当加载完所有模块时触发
  • dispose :当 Kotori 关闭时触发
  • status :当 Bot 的在线状态改变时触发

通过 status 实现 Bot 上线后自动发送消息给最高管理员:

typescript
ctx.on('status', (data) => {
+	if (data.status !== 'online') return;
+	const { api, config } = data.adapter;
+	api.sendPrivateMsg('上线了!', config.master);
+});

由于 status 是由适配器发出的系统事件,它并没有类似于会话事件中的 session.send(),因此只能使用最原始的办法发送消息。status 的事件数据中仅有两个值,一个是 data.status 表示当前在线状态(「online」或「offline」),data.adapter 为目标 Bot,Bot 上有 adapter.apiadapter.config,前者等价于会话事件中的 session.api,后者为 Bot 配置,来自于 kotori.yml

会话事件

常见的会话事件有:

  • on_message :当收到消息时触发
  • on_recall :当有消息撤回时触发
  • on_group_increase :当群人数增加时触发

通过 on_group_increase 实现群欢迎:

typescript
ctx.on('on_group_increase', (session) => {
+	session.send(\`因为遇见了\${session.el.at(session.userId)},我的世界才充满颜色!\`);
+});

其中 session.elsession.api 类似,是 Elements 的实例对象,它提供了用于转换消息元素的接口,如 session.el.at() 传入用户 id 转换成艾特消息,session.el.image() 传入图片 URL 转换成图片消息。当然,并不是所有聊天平台都支持所有的消息元素,应以具体聊天平台为准。

自定义事件与发出事件

得益于 TypeScript 有着 声明合并(Declaration Merging) 的特性,在模块中可通过其实现自定义事件的局部声明。

typescript
declare module 'kotori-bot' {
+	interface EventsMapping {
+		custom_event1(data: string): void;
+	}
+}
+
+ctx.on('custom_event1', (data) => {
+	ctx.logger.debug(data);
+});

Kotori 中所有事件均定义在 EventsMapping 接口上。custom_event1 事件触发后将打印事件数据。ctx.logger 是一个日志打印工具,ctx.logger.debug() 意味着打印内容仅在 dev 模式下运行 Kotori 可见。然而,订阅事件后,事件却从来没有发出,因此需要发出事件:

typescript
// ...
+
+ctx.emit('custom_event1', '这是事件数据');
+ctx.emit('custom_event1', '这里也是事件数据');

ctx.emit() 第一个参数为事件名,然后为剩余参数,剩余参数与该事件参数一一对应。虽然 Kotori 中系统事件与会话事件的参数均只有一个,但是可以在自定义事件中实现任意多个参数:

typescript
declare module 'kotori-bot' {
+	interface EventsMapping {
+		custom_event2(arg1: string, arg2: number, arg3: boolean): void;
+		custom_event3(...args: any[]): void;
+	}
+}
+
+ctx.emit('custom_event2', 'string', 42, true);
+ctx.emit('custom_event3', 'string1', 'string2', 233, 2333, {value: 42});

一般地,自定义事件应只用于单个模块内部,用于多个模块间相互通信传输数据时,每个涉及模块应先加载定义自定义事件的模块,以免出现类型定义的问题。

`,44),p=[h];function k(l,e,E,d,r,g){return a(),i("div",null,p)}const y=s(t,[["render",k]]);export{c as __pageData,y as default}; diff --git a/assets/guide_base_events.md.D1LHe1qC.lean.js b/assets/guide_base_events.md.D1LHe1qC.lean.js new file mode 100644 index 00000000..c96739a7 --- /dev/null +++ b/assets/guide_base_events.md.D1LHe1qC.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"事件系统","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/events.md","filePath":"guide/base/events.md","lastUpdated":1707642172000}'),t={name:"guide/base/events.md"},h=n("",44),p=[h];function k(l,e,E,d,r,g){return a(),i("div",null,p)}const y=s(t,[["render",k]]);export{c as __pageData,y as default}; diff --git a/assets/guide_base_middleware.md.PKeNh_IF.js b/assets/guide_base_middleware.md.PKeNh_IF.js new file mode 100644 index 00000000..a9c58825 --- /dev/null +++ b/assets/guide_base_middleware.md.PKeNh_IF.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as d,m as e,a as r}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"中间件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/middleware.md","filePath":"guide/base/middleware.md","lastUpdated":1707642172000}'),s={name:"guide/base/middleware.md"},o=e("h1",{id:"中间件",tabindex:"-1"},[r("中间件 "),e("a",{class:"header-anchor",href:"#中间件","aria-label":'Permalink to "中间件"'},"​")],-1),i=[o];function c(n,l,m,_,p,h){return d(),t("div",null,i)}const b=a(s,[["render",c]]);export{u as __pageData,b as default}; diff --git a/assets/guide_base_middleware.md.PKeNh_IF.lean.js b/assets/guide_base_middleware.md.PKeNh_IF.lean.js new file mode 100644 index 00000000..a9c58825 --- /dev/null +++ b/assets/guide_base_middleware.md.PKeNh_IF.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as d,m as e,a as r}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"中间件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/middleware.md","filePath":"guide/base/middleware.md","lastUpdated":1707642172000}'),s={name:"guide/base/middleware.md"},o=e("h1",{id:"中间件",tabindex:"-1"},[r("中间件 "),e("a",{class:"header-anchor",href:"#中间件","aria-label":'Permalink to "中间件"'},"​")],-1),i=[o];function c(n,l,m,_,p,h){return d(),t("div",null,i)}const b=a(s,[["render",c]]);export{u as __pageData,b as default}; diff --git a/assets/guide_base_regexp.md.5V-1qgk-.js b/assets/guide_base_regexp.md.5V-1qgk-.js new file mode 100644 index 00000000..d7a70f34 --- /dev/null +++ b/assets/guide_base_regexp.md.5V-1qgk-.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as s}from"./chunks/framework.Dy019jra.js";const x=JSON.parse('{"title":"正则匹配","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/regexp.md","filePath":"guide/base/regexp.md","lastUpdated":1707642172000}'),o={name:"guide/base/regexp.md"},d=e("h1",{id:"正则匹配",tabindex:"-1"},[s("正则匹配 "),e("a",{class:"header-anchor",href:"#正则匹配","aria-label":'Permalink to "正则匹配"'},"​")],-1),c=[d];function n(i,p,_,l,m,h){return r(),t("div",null,c)}const g=a(o,[["render",n]]);export{x as __pageData,g as default}; diff --git a/assets/guide_base_regexp.md.5V-1qgk-.lean.js b/assets/guide_base_regexp.md.5V-1qgk-.lean.js new file mode 100644 index 00000000..d7a70f34 --- /dev/null +++ b/assets/guide_base_regexp.md.5V-1qgk-.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as r,m as e,a as s}from"./chunks/framework.Dy019jra.js";const x=JSON.parse('{"title":"正则匹配","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/regexp.md","filePath":"guide/base/regexp.md","lastUpdated":1707642172000}'),o={name:"guide/base/regexp.md"},d=e("h1",{id:"正则匹配",tabindex:"-1"},[s("正则匹配 "),e("a",{class:"header-anchor",href:"#正则匹配","aria-label":'Permalink to "正则匹配"'},"​")],-1),c=[d];function n(i,p,_,l,m,h){return r(),t("div",null,c)}const g=a(o,[["render",n]]);export{x as __pageData,g as default}; diff --git a/assets/guide_base_schedule.md.Bgo9T4LD.js b/assets/guide_base_schedule.md.Bgo9T4LD.js new file mode 100644 index 00000000..df6b4e68 --- /dev/null +++ b/assets/guide_base_schedule.md.Bgo9T4LD.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as d}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"计划任务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/schedule.md","filePath":"guide/base/schedule.md","lastUpdated":1707642172000}'),c={name:"guide/base/schedule.md"},o=e("h1",{id:"计划任务",tabindex:"-1"},[d("计划任务 "),e("a",{class:"header-anchor",href:"#计划任务","aria-label":'Permalink to "计划任务"'},"​")],-1),r=[o];function n(i,l,_,h,p,u){return s(),t("div",null,r)}const b=a(c,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/guide_base_schedule.md.Bgo9T4LD.lean.js b/assets/guide_base_schedule.md.Bgo9T4LD.lean.js new file mode 100644 index 00000000..df6b4e68 --- /dev/null +++ b/assets/guide_base_schedule.md.Bgo9T4LD.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as d}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"计划任务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/base/schedule.md","filePath":"guide/base/schedule.md","lastUpdated":1707642172000}'),c={name:"guide/base/schedule.md"},o=e("h1",{id:"计划任务",tabindex:"-1"},[d("计划任务 "),e("a",{class:"header-anchor",href:"#计划任务","aria-label":'Permalink to "计划任务"'},"​")],-1),r=[o];function n(i,l,_,h,p,u){return s(),t("div",null,r)}const b=a(c,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/guide_extend_database.md.CNO_RCKh.js b/assets/guide_extend_database.md.CNO_RCKh.js new file mode 100644 index 00000000..6f60fb9f --- /dev/null +++ b/assets/guide_extend_database.md.CNO_RCKh.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as d}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"数据库","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/database.md","filePath":"guide/extend/database.md","lastUpdated":1707642172000}'),o={name:"guide/extend/database.md"},r=e("h1",{id:"数据库",tabindex:"-1"},[d("数据库 "),e("a",{class:"header-anchor",href:"#数据库","aria-label":'Permalink to "数据库"'},"​")],-1),n=[r];function c(i,_,l,p,m,h){return s(),t("div",null,n)}const x=a(o,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_database.md.CNO_RCKh.lean.js b/assets/guide_extend_database.md.CNO_RCKh.lean.js new file mode 100644 index 00000000..6f60fb9f --- /dev/null +++ b/assets/guide_extend_database.md.CNO_RCKh.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as d}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"数据库","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/database.md","filePath":"guide/extend/database.md","lastUpdated":1707642172000}'),o={name:"guide/extend/database.md"},r=e("h1",{id:"数据库",tabindex:"-1"},[d("数据库 "),e("a",{class:"header-anchor",href:"#数据库","aria-label":'Permalink to "数据库"'},"​")],-1),n=[r];function c(i,_,l,p,m,h){return s(),t("div",null,n)}const x=a(o,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_filter.md.CWzl_4Ib.js b/assets/guide_extend_filter.md.CWzl_4Ib.js new file mode 100644 index 00000000..a1e8879c --- /dev/null +++ b/assets/guide_extend_filter.md.CWzl_4Ib.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"滤器","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/filter.md","filePath":"guide/extend/filter.md","lastUpdated":1707642172000}'),d={name:"guide/extend/filter.md"},o=e("h1",{id:"滤器",tabindex:"-1"},[s("滤器 "),e("a",{class:"header-anchor",href:"#滤器","aria-label":'Permalink to "滤器"'},"​")],-1),n=[o];function i(c,l,_,f,p,m){return r(),a("div",null,n)}const x=t(d,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_filter.md.CWzl_4Ib.lean.js b/assets/guide_extend_filter.md.CWzl_4Ib.lean.js new file mode 100644 index 00000000..a1e8879c --- /dev/null +++ b/assets/guide_extend_filter.md.CWzl_4Ib.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as r,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"滤器","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/filter.md","filePath":"guide/extend/filter.md","lastUpdated":1707642172000}'),d={name:"guide/extend/filter.md"},o=e("h1",{id:"滤器",tabindex:"-1"},[s("滤器 "),e("a",{class:"header-anchor",href:"#滤器","aria-label":'Permalink to "滤器"'},"​")],-1),n=[o];function i(c,l,_,f,p,m){return r(),a("div",null,n)}const x=t(d,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_i18n.md.DZqqnwvM.js b/assets/guide_extend_i18n.md.DZqqnwvM.js new file mode 100644 index 00000000..6c48db23 --- /dev/null +++ b/assets/guide_extend_i18n.md.DZqqnwvM.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as n,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/i18n.md","filePath":"guide/extend/i18n.md","lastUpdated":1707642172000}'),d={name:"guide/extend/i18n.md"},o=e("h1",{id:"国际化",tabindex:"-1"},[s("国际化 "),e("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化"'},"​")],-1),r=[o];function i(c,_,l,p,m,h){return n(),a("div",null,r)}const x=t(d,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_i18n.md.DZqqnwvM.lean.js b/assets/guide_extend_i18n.md.DZqqnwvM.lean.js new file mode 100644 index 00000000..6c48db23 --- /dev/null +++ b/assets/guide_extend_i18n.md.DZqqnwvM.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as n,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"国际化","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/i18n.md","filePath":"guide/extend/i18n.md","lastUpdated":1707642172000}'),d={name:"guide/extend/i18n.md"},o=e("h1",{id:"国际化",tabindex:"-1"},[s("国际化 "),e("a",{class:"header-anchor",href:"#国际化","aria-label":'Permalink to "国际化"'},"​")],-1),r=[o];function i(c,_,l,p,m,h){return n(),a("div",null,r)}const x=t(d,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_internal.md.Be4CBysu.js b/assets/guide_extend_internal.md.Be4CBysu.js new file mode 100644 index 00000000..dce20f52 --- /dev/null +++ b/assets/guide_extend_internal.md.Be4CBysu.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as n,m as e,a as r}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"内部接口","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/internal.md","filePath":"guide/extend/internal.md","lastUpdated":1707642172000}'),s={name:"guide/extend/internal.md"},d=e("h1",{id:"内部接口",tabindex:"-1"},[r("内部接口 "),e("a",{class:"header-anchor",href:"#内部接口","aria-label":'Permalink to "内部接口"'},"​")],-1),o=[d];function i(c,l,_,p,m,h){return n(),a("div",null,o)}const x=t(s,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_internal.md.Be4CBysu.lean.js b/assets/guide_extend_internal.md.Be4CBysu.lean.js new file mode 100644 index 00000000..dce20f52 --- /dev/null +++ b/assets/guide_extend_internal.md.Be4CBysu.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o as n,m as e,a as r}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"内部接口","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/internal.md","filePath":"guide/extend/internal.md","lastUpdated":1707642172000}'),s={name:"guide/extend/internal.md"},d=e("h1",{id:"内部接口",tabindex:"-1"},[r("内部接口 "),e("a",{class:"header-anchor",href:"#内部接口","aria-label":'Permalink to "内部接口"'},"​")],-1),o=[d];function i(c,l,_,p,m,h){return n(),a("div",null,o)}const x=t(s,[["render",i]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_logger.md.BgYPW8uO.js b/assets/guide_extend_logger.md.BgYPW8uO.js new file mode 100644 index 00000000..a361b986 --- /dev/null +++ b/assets/guide_extend_logger.md.BgYPW8uO.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"日志打印","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/logger.md","filePath":"guide/extend/logger.md","lastUpdated":1707642172000}'),s={name:"guide/extend/logger.md"},d=e("h1",{id:"日志打印",tabindex:"-1"},[r("日志打印 "),e("a",{class:"header-anchor",href:"#日志打印","aria-label":'Permalink to "日志打印"'},"​")],-1),n=[d];function c(i,l,_,g,p,m){return o(),a("div",null,n)}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/guide_extend_logger.md.BgYPW8uO.lean.js b/assets/guide_extend_logger.md.BgYPW8uO.lean.js new file mode 100644 index 00000000..a361b986 --- /dev/null +++ b/assets/guide_extend_logger.md.BgYPW8uO.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as r}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"日志打印","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/logger.md","filePath":"guide/extend/logger.md","lastUpdated":1707642172000}'),s={name:"guide/extend/logger.md"},d=e("h1",{id:"日志打印",tabindex:"-1"},[r("日志打印 "),e("a",{class:"header-anchor",href:"#日志打印","aria-label":'Permalink to "日志打印"'},"​")],-1),n=[d];function c(i,l,_,g,p,m){return o(),a("div",null,n)}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/guide_extend_tools.md.DvrPWCpH.js b/assets/guide_extend_tools.md.DvrPWCpH.js new file mode 100644 index 00000000..368ca5c9 --- /dev/null +++ b/assets/guide_extend_tools.md.DvrPWCpH.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"工具函数","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/tools.md","filePath":"guide/extend/tools.md","lastUpdated":1707642172000}'),d={name:"guide/extend/tools.md"},r=e("h1",{id:"工具函数",tabindex:"-1"},[s("工具函数 "),e("a",{class:"header-anchor",href:"#工具函数","aria-label":'Permalink to "工具函数"'},"​")],-1),n=[r];function c(i,l,_,p,m,h){return o(),a("div",null,n)}const x=t(d,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_extend_tools.md.DvrPWCpH.lean.js b/assets/guide_extend_tools.md.DvrPWCpH.lean.js new file mode 100644 index 00000000..368ca5c9 --- /dev/null +++ b/assets/guide_extend_tools.md.DvrPWCpH.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as s}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"工具函数","description":"","frontmatter":{},"headers":[],"relativePath":"guide/extend/tools.md","filePath":"guide/extend/tools.md","lastUpdated":1707642172000}'),d={name:"guide/extend/tools.md"},r=e("h1",{id:"工具函数",tabindex:"-1"},[s("工具函数 "),e("a",{class:"header-anchor",href:"#工具函数","aria-label":'Permalink to "工具函数"'},"​")],-1),n=[r];function c(i,l,_,p,m,h){return o(),a("div",null,n)}const x=t(d,[["render",c]]);export{u as __pageData,x as default}; diff --git a/assets/guide_modules_context.md.BqjfvHTT.js b/assets/guide_modules_context.md.BqjfvHTT.js new file mode 100644 index 00000000..b9522cec --- /dev/null +++ b/assets/guide_modules_context.md.BqjfvHTT.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as s}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"上下文","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/context.md","filePath":"guide/modules/context.md","lastUpdated":1707642172000}'),c={name:"guide/modules/context.md"},d=e("h1",{id:"上下文",tabindex:"-1"},[s("上下文 "),e("a",{class:"header-anchor",href:"#上下文","aria-label":'Permalink to "上下文"'},"​")],-1),n=[d];function r(i,l,_,m,p,u){return o(),a("div",null,n)}const x=t(c,[["render",r]]);export{f as __pageData,x as default}; diff --git a/assets/guide_modules_context.md.BqjfvHTT.lean.js b/assets/guide_modules_context.md.BqjfvHTT.lean.js new file mode 100644 index 00000000..b9522cec --- /dev/null +++ b/assets/guide_modules_context.md.BqjfvHTT.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,o,m as e,a as s}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"上下文","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/context.md","filePath":"guide/modules/context.md","lastUpdated":1707642172000}'),c={name:"guide/modules/context.md"},d=e("h1",{id:"上下文",tabindex:"-1"},[s("上下文 "),e("a",{class:"header-anchor",href:"#上下文","aria-label":'Permalink to "上下文"'},"​")],-1),n=[d];function r(i,l,_,m,p,u){return o(),a("div",null,n)}const x=t(c,[["render",r]]);export{f as __pageData,x as default}; diff --git a/assets/guide_modules_lifecycle.md.CtUUVpzs.js b/assets/guide_modules_lifecycle.md.CtUUVpzs.js new file mode 100644 index 00000000..6838d599 --- /dev/null +++ b/assets/guide_modules_lifecycle.md.CtUUVpzs.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as c,m as e,a as s}from"./chunks/framework.Dy019jra.js";const h=JSON.parse('{"title":"生命周期","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/lifecycle.md","filePath":"guide/modules/lifecycle.md","lastUpdated":1707642172000}'),o={name:"guide/modules/lifecycle.md"},d=e("h1",{id:"生命周期",tabindex:"-1"},[s("生命周期 "),e("a",{class:"header-anchor",href:"#生命周期","aria-label":'Permalink to "生命周期"'},"​")],-1),l=[d];function r(i,n,_,m,f,p){return c(),t("div",null,l)}const x=a(o,[["render",r]]);export{h as __pageData,x as default}; diff --git a/assets/guide_modules_lifecycle.md.CtUUVpzs.lean.js b/assets/guide_modules_lifecycle.md.CtUUVpzs.lean.js new file mode 100644 index 00000000..6838d599 --- /dev/null +++ b/assets/guide_modules_lifecycle.md.CtUUVpzs.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as c,m as e,a as s}from"./chunks/framework.Dy019jra.js";const h=JSON.parse('{"title":"生命周期","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/lifecycle.md","filePath":"guide/modules/lifecycle.md","lastUpdated":1707642172000}'),o={name:"guide/modules/lifecycle.md"},d=e("h1",{id:"生命周期",tabindex:"-1"},[s("生命周期 "),e("a",{class:"header-anchor",href:"#生命周期","aria-label":'Permalink to "生命周期"'},"​")],-1),l=[d];function r(i,n,_,m,f,p){return c(),t("div",null,l)}const x=a(o,[["render",r]]);export{h as __pageData,x as default}; diff --git a/assets/guide_modules_plugin.md.DId8fkF7.js b/assets/guide_modules_plugin.md.DId8fkF7.js new file mode 100644 index 00000000..3c6cecc6 --- /dev/null +++ b/assets/guide_modules_plugin.md.DId8fkF7.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"插件范式","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/plugin.md","filePath":"guide/modules/plugin.md","lastUpdated":1707642172000}'),d={name:"guide/modules/plugin.md"},n=e("h1",{id:"插件范式",tabindex:"-1"},[o("插件范式 "),e("a",{class:"header-anchor",href:"#插件范式","aria-label":'Permalink to "插件范式"'},"​")],-1),r=[n];function i(c,l,p,u,_,m){return s(),t("div",null,r)}const g=a(d,[["render",i]]);export{f as __pageData,g as default}; diff --git a/assets/guide_modules_plugin.md.DId8fkF7.lean.js b/assets/guide_modules_plugin.md.DId8fkF7.lean.js new file mode 100644 index 00000000..3c6cecc6 --- /dev/null +++ b/assets/guide_modules_plugin.md.DId8fkF7.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"插件范式","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/plugin.md","filePath":"guide/modules/plugin.md","lastUpdated":1707642172000}'),d={name:"guide/modules/plugin.md"},n=e("h1",{id:"插件范式",tabindex:"-1"},[o("插件范式 "),e("a",{class:"header-anchor",href:"#插件范式","aria-label":'Permalink to "插件范式"'},"​")],-1),r=[n];function i(c,l,p,u,_,m){return s(),t("div",null,r)}const g=a(d,[["render",i]]);export{f as __pageData,g as default}; diff --git a/assets/guide_modules_schema.md.D2O0zqIT.js b/assets/guide_modules_schema.md.D2O0zqIT.js new file mode 100644 index 00000000..bb91c1d6 --- /dev/null +++ b/assets/guide_modules_schema.md.D2O0zqIT.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"动态检查","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/schema.md","filePath":"guide/modules/schema.md","lastUpdated":1707642172000}'),c={name:"guide/modules/schema.md"},d=e("h1",{id:"动态检查",tabindex:"-1"},[o("动态检查 "),e("a",{class:"header-anchor",href:"#动态检查","aria-label":'Permalink to "动态检查"'},"​")],-1),r=[d];function n(i,m,l,_,h,p){return s(),t("div",null,r)}const x=a(c,[["render",n]]);export{f as __pageData,x as default}; diff --git a/assets/guide_modules_schema.md.D2O0zqIT.lean.js b/assets/guide_modules_schema.md.D2O0zqIT.lean.js new file mode 100644 index 00000000..bb91c1d6 --- /dev/null +++ b/assets/guide_modules_schema.md.D2O0zqIT.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as o}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"动态检查","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/schema.md","filePath":"guide/modules/schema.md","lastUpdated":1707642172000}'),c={name:"guide/modules/schema.md"},d=e("h1",{id:"动态检查",tabindex:"-1"},[o("动态检查 "),e("a",{class:"header-anchor",href:"#动态检查","aria-label":'Permalink to "动态检查"'},"​")],-1),r=[d];function n(i,m,l,_,h,p){return s(),t("div",null,r)}const x=a(c,[["render",n]]);export{f as __pageData,x as default}; diff --git a/assets/guide_modules_service.md.f93Srqk2.js b/assets/guide_modules_service.md.f93Srqk2.js new file mode 100644 index 00000000..a9174ed7 --- /dev/null +++ b/assets/guide_modules_service.md.f93Srqk2.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as r}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"依赖与服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/service.md","filePath":"guide/modules/service.md","lastUpdated":1707642172000}'),o={name:"guide/modules/service.md"},c=e("h1",{id:"依赖与服务",tabindex:"-1"},[r("依赖与服务 "),e("a",{class:"header-anchor",href:"#依赖与服务","aria-label":'Permalink to "依赖与服务"'},"​")],-1),d=[c];function i(n,l,_,m,p,u){return s(),t("div",null,d)}const v=a(o,[["render",i]]);export{f as __pageData,v as default}; diff --git a/assets/guide_modules_service.md.f93Srqk2.lean.js b/assets/guide_modules_service.md.f93Srqk2.lean.js new file mode 100644 index 00000000..a9174ed7 --- /dev/null +++ b/assets/guide_modules_service.md.f93Srqk2.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as s,m as e,a as r}from"./chunks/framework.Dy019jra.js";const f=JSON.parse('{"title":"依赖与服务","description":"","frontmatter":{},"headers":[],"relativePath":"guide/modules/service.md","filePath":"guide/modules/service.md","lastUpdated":1707642172000}'),o={name:"guide/modules/service.md"},c=e("h1",{id:"依赖与服务",tabindex:"-1"},[r("依赖与服务 "),e("a",{class:"header-anchor",href:"#依赖与服务","aria-label":'Permalink to "依赖与服务"'},"​")],-1),d=[c];function i(n,l,_,m,p,u){return s(),t("div",null,d)}const v=a(o,[["render",i]]);export{f as __pageData,v as default}; diff --git a/assets/guide_nav.md.DNOOSt65.js b/assets/guide_nav.md.DNOOSt65.js new file mode 100644 index 00000000..7a5aa01a --- /dev/null +++ b/assets/guide_nav.md.DNOOSt65.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,V as r}from"./chunks/framework.Dy019jra.js";const S=JSON.parse('{"title":"前言","description":"","frontmatter":{},"headers":[],"relativePath":"guide/nav.md","filePath":"guide/nav.md","lastUpdated":1707642172000}'),o={name:"guide/nav.md"},i=r('

前言

TIP

阅读本章前请确保你已阅读完毕 使用指南

前置要求

拥有一定的 JavaScript 与 Node.js 知识基础。

Kotori 运行于 Node.js 环境,因此开发 Kotori 模块前掌握 JavaScript 与 Node.js 基础内容是必然的。此处推荐几个文档:

基于 TypeScript 与现代化 ECMAScript 开发。

TypeScript 是 JavaScript 的超集,TypeScript 在继承了 JavaScript 全部特性的同时,为弱类型动态语言的 JavaScript 提供了一个独立且强大的类型系统。同时,使用 TypeScript 基本意味着使用 ESModule 与现代化的 JavaScript 语法与规范,这是 Kotori 三大特点之一。理论上在 Kotori 程序的生产环境中可正常运行由 JavaScript 直接编写的模块,但 Kotori 本身便使用 TypeScript 开发,因此更推荐你使用 TypeScript 用于你的模块开发,尽管这并不是必须的。

读后

  • 接口文档 用于全面了解与查阅 Kotori 提供的所有公开 API。
  • 深入了解 Kotori 的开发历程、版本记录、运行流程、设计构思、设计参考等。
',11),c=[i];function p(l,s,n,d,h,_){return e(),t("div",null,c)}const f=a(o,[["render",p]]);export{S as __pageData,f as default}; diff --git a/assets/guide_nav.md.DNOOSt65.lean.js b/assets/guide_nav.md.DNOOSt65.lean.js new file mode 100644 index 00000000..6909ceb3 --- /dev/null +++ b/assets/guide_nav.md.DNOOSt65.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,o as e,V as r}from"./chunks/framework.Dy019jra.js";const S=JSON.parse('{"title":"前言","description":"","frontmatter":{},"headers":[],"relativePath":"guide/nav.md","filePath":"guide/nav.md","lastUpdated":1707642172000}'),o={name:"guide/nav.md"},i=r("",11),c=[i];function p(l,s,n,d,h,_){return e(),t("div",null,c)}const f=a(o,[["render",p]]);export{S as __pageData,f as default}; diff --git a/assets/guide_start_environment.md.DvzuNbxb.js b/assets/guide_start_environment.md.DvzuNbxb.js new file mode 100644 index 00000000..ca5d560f --- /dev/null +++ b/assets/guide_start_environment.md.DvzuNbxb.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,V as i}from"./chunks/framework.Dy019jra.js";const _=JSON.parse('{"title":"环境搭建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/environment.md","filePath":"guide/start/environment.md","lastUpdated":1707642172000}'),r={name:"guide/start/environment.md"},o=i('

环境搭建

Node.js & pnpm

使用指南 中你已安装并部署了 Node.js 环境与 pnpm,此处不再赘述。

Git & GitHub

Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。版本控制可方便的实现协作开发、版本回退等,其重要性对每一位开发者都是不言而喻。GitHub 是一个面向开源及私有软件项目的托管平台,拥有着全球最大的开源社区,使用 Git 可轻松将你的项目推送至 GitHub 远程仓库,你与你的项目也将成为开源社区的一份子。Git 与 GitHub 具体使用流程此处不逐一赘述。

IDE & Editor

显然 Kotori 并不属于 Web 前端的范畴,但依旧隶属于 JavaScript 生态,因此推荐 世界上最好的 Web 开发 IDE 「Visual Studio Code」(以下简称「VSC」)。虽然 VSC 本质上只是文本编辑器,但因其强大的扩展商店使其能做到大部分 IDE 的功能,当然你也可以根据你的喜好选择,如:

  • WebStorm
',9),n=[o];function s(d,l,p,h,m,c){return a(),e("div",null,n)}const b=t(r,[["render",s]]);export{_ as __pageData,b as default}; diff --git a/assets/guide_start_environment.md.DvzuNbxb.lean.js b/assets/guide_start_environment.md.DvzuNbxb.lean.js new file mode 100644 index 00000000..7d580388 --- /dev/null +++ b/assets/guide_start_environment.md.DvzuNbxb.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as a,V as i}from"./chunks/framework.Dy019jra.js";const _=JSON.parse('{"title":"环境搭建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/environment.md","filePath":"guide/start/environment.md","lastUpdated":1707642172000}'),r={name:"guide/start/environment.md"},o=i("",9),n=[o];function s(d,l,p,h,m,c){return a(),e("div",null,n)}const b=t(r,[["render",s]]);export{_ as __pageData,b as default}; diff --git a/assets/guide_start_publish.md.yDVLNJhc.js b/assets/guide_start_publish.md.yDVLNJhc.js new file mode 100644 index 00000000..4c44c2db --- /dev/null +++ b/assets/guide_start_publish.md.yDVLNJhc.js @@ -0,0 +1,33 @@ +import{_ as s,c as a,o as i,V as e}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"模块发布","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/publish.md","filePath":"guide/start/publish.md","lastUpdated":1707642172000}'),n={name:"guide/start/publish.md"},t=e(`

模块发布

当开发完毕模块后,可以将它发布至社区,一个 Kotori 模块一般会同时发布到如下三个平台:

  • npmjs.org
  • Kotori 模块中心
  • 开源社区:GitHub 优先级(重要程度):npm > 模块中心 > 开源社区。每一个公开的 Kotori 模块都应发布至 npm 并作为模块的主要获取途径。Kotori 使用 GPL-3.0 协议,该协议要求 Kotori 的所有模块及其二次开发项目也必须使用 GPL-3.0 协议且开源,因此发布到开源社区是必要的,开源行为本身也是一种无私奉献、共享知识和回馈社区的体现。

构建产物

「构建产物」在 JavaScript 生态中指将源码(Kotori 模块开发中一般为 TypeScript 文件)进行处理以适用于生产环境中(处理过程一般有 TypeScript 转为 JavaScript、向下兼容语法、压缩代码等)。JavaScript 生态中构建工具非常多,你可以选择喜欢的构建工具并自习配置,当然如果你对此并不了解也可以使用 Kotori 默认的构建方式(通过TypeScript 自带的 tsc 程序),在你的模块根目录中输入以下指令:

bash
pnpm build

一般地,你将会发现在模块根目录出现了一个 lib 文件夹,这在上一节已有提到,它是构建产物的输出目录,有必要的话可在 tsconfig.json 文件中更改:

json
{
+	// ...
+  "compilerOptions": {
+    "rootDir": "./src", // 输入目录
+    "outDir": "./lib" // 输出目录
+    // ...
+  }
+}

关于 tsconfig.json 的更多内容:TypeScript Documentation

文件忽略

对于模块发布主要分为发布构建产物(publish)与发布源码(push),两种情况下需要发布的文件内容会有些许不同,因此便引入了「文件忽略」。

.npmignore

用于指定在使用 publish 时忽略的文件与文件夹,在模块根目录创建一个 .npmignore 文件:

int
node_modules
+src
+test
+
+tsconfig.json
+!README.md

实际上在 publish 时只需要附带少数文件即可,而 .npmignore 采用的是黑名单机制显得很繁琐,因此 Kotori 模块的默认模板中并未使用该方式也并不推荐。

package.files

在上一节的 package.json 示例中会发现有一个以字符串数组为值的 files 配置项,其用于指定在使用 publish 时需要附带的文件与文件夹。

typescript
{
+	"files": ["lib", "LICENSE", "README.md"],
+}

files 配置项优先级高于 .npmignore,其直接写在 package.json 中显得十分简洁也会减少整个模块目录的文件冗余。

.gitignore

不同于前两者,.gitignore 用于指定在使用 Git 进行 push 时需要忽略的文件,语法与 .npmignore 类似,同样位于模块根目录:

ini
node_modules
+dist
+lib
+.husky/_
+
+.vscode/*
+.vs/*
+!.vscode/extensions.json
+
+*.tgz
+tsconfig.tsbuildinfo
+*.log
+
+kotori.dev.yml

发布构建产物

使用工作区开发时,需确保当前为待发布模块根目录。首先检查 npm 源是否为 http://registry.npmjs.org

bash
npm config get registry
+# If not:
+# npm config set registry=http://registry.npmjs.org

前往 npmjs.org 注册账号,然后根据提示在浏览器内登录:

bash
npm login

当一切就绪时:

bash
npm publish

一般地,访问 npm 个人页即可查看刚才发布的插件: kotori-plugin-my-project

发布源码

使用 Git 前务必先配置好你的账号、邮箱和与 GitHub 通信的 ssh,可参考 手把手教你配置 git 和 git 仓库 。使用工作区开发时,可选择发布整个工作区也可仅发布单个模块,切换到相应的目录即可。首先在 GitHub New 页面创建一个远程仓库,接着在本地仓库中关联到该远程仓库:

bash
git remote add origin git@github.com:kotorijs/kotori-plugin-my-project

提交并推送至远程仓库

bash
git add .
+git commit -m 'feat: create a project'
+git push origin master

当然,你也可以为本次提交添加一个 tag:

bash
git tag v1.0.0
+git push --tags

收录至模块市场

该内容待更新....

放在最后

`,41),p=[t];function l(h,o,r,c,d,k){return i(),a("div",null,p)}const E=s(n,[["render",l]]);export{u as __pageData,E as default}; diff --git a/assets/guide_start_publish.md.yDVLNJhc.lean.js b/assets/guide_start_publish.md.yDVLNJhc.lean.js new file mode 100644 index 00000000..c062634a --- /dev/null +++ b/assets/guide_start_publish.md.yDVLNJhc.lean.js @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,V as e}from"./chunks/framework.Dy019jra.js";const u=JSON.parse('{"title":"模块发布","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/publish.md","filePath":"guide/start/publish.md","lastUpdated":1707642172000}'),n={name:"guide/start/publish.md"},t=e("",41),p=[t];function l(h,o,r,c,d,k){return i(),a("div",null,p)}const E=s(n,[["render",l]]);export{u as __pageData,E as default}; diff --git a/assets/guide_start_setup.md.0v96gqG3.js b/assets/guide_start_setup.md.0v96gqG3.js new file mode 100644 index 00000000..fe33b3a3 --- /dev/null +++ b/assets/guide_start_setup.md.0v96gqG3.js @@ -0,0 +1,127 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"项目构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/setup.md","filePath":"guide/start/setup.md","lastUpdated":1707642172000}'),t={name:"guide/start/setup.md"},p=n(`

项目构建

基于 create-kotori 直接构建

create-kotori」是专用于构建 Kotori 模块的 Cli 工具。

  • 命令语法:create-kotori <project-name>
bash
pnpm init kotori@latest my-project

除此之外,也可以将其安装在全局使用:

bash
npm install create-kotori -g
+create-kotori my-project

基于 Kotori 源码构建

亦称为「工作区开发」,该方法适用于有一定 Node.js 开发经验的开发者,并不推荐新人使用。使用该方法可同时开发多个插件,也可在开发当前插件时安装使用其它插件,同时可以便捷的修改与调试 Kotori 源码并进行二次开发。使用 Git 直接克隆 Kotorijs/kotori 仓库的源码:

bash
git clone https://github.com/kotorijs/kotori.git

此处默认克隆的是主分支下的代码,也可以选择克隆 dev 分支,该内容将在 进阶开发中 详细说明。进入根目录并使用 pnpm 安装依赖:

bash
cd ./kotori-bot-master
+pnpm install

./modules/ 目录下使用 create-kotori 创建一个模块:

bash
cd ./modules/
+pnpm init kotori@latest my-project
+cd ./my-project/

项目结构

text
my-project
+├── kotori.yml
+├── package.json
+├── tsconfig.json
+├── LICENSE
+├── README.md
+├── .gitignore
+├── node_modules
+├── lib
+│   ├── index.js
+│   ├── index.d.ts
+│   ├── ...
+├── locales
+│   ├── en_US.json
+│   ├── ja_JP.json
+│   ├── zh_CN.json
+│ └── zh_TW.json
+└── src
+    ├── config.ts
+    ├── index.ts
+    ├── types.ts

kotori.yml 仅在直接构建时存在于模块根目录,工作区开发下将位于工作区的根目录。

  • kotori.yml Kotori 配置文件
  • kotori.dev.yml Kotori Dev 模式下配置文件
  • package.json 包信息文件
  • tsconfig.json TypeScript 配置文件
  • LICENSE 协议文件
  • README.md 自述文件
  • .gitignore git 忽略文件
  • lib 构建产物输出目录(前端为 dist,后端为 lib
  • locales 国际化文件夹,将在后面的章节中讲解
  • src 工程文件夹,代码存放处
    • cofig.ts 默认配置数据文件
    • index.ts 整个模块的入口文件
    • types.ts 公共类型文件

package.json

以下为默认创建的 package.json

json
{
+  "name": "kotori-plugin-my-project",
+  "version": "1.0.0",
+  "description": "This is my first Kotori plugin",
+  "main": "lib/.js",
+  "scripts": {
+    "build": "tsc --build"
+  },
+  "license": "GPL-3.0",
+  "keywords": ["kotori-plugin"],
+  "files": ["lib", "LICENSE", "README.md"],
+  "peerDependencies": {
+    "kotori-bot": "1.1.0"
+  }
+}

添加一些非必要配置项以完善包信息:

json
{
+  "author": "Himeno <biyuehuya@gmail.com>",
+  "bugs": {
+    "url": "https://github.com/kotorijs/my-project/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/kotorijs/my-project.git"
+  },
+  "homepage": "https://github.com/kotorijs/my-project/"
+}

添加用于传给 Kotori 的元数据:

json
{
+  "kotori": {
+    "enforce": "pre",
+    "meta": {
+      "languages": ["en_US", "ja_JP", "zh_TW", "zh_CN"]
+    }
+  }
+}

一个合法的 Kotori 模块其 package.json 需要满足一系列来自 Kotori 的约定,Kotori 程序只有在其合法时才会加载该模块。不过当前你无需关心这个问题,元数据与 package.json 约定将放在「模块化」章节中讲解。以下是该 package.json 的完整效果:

json
{
+    "name": "kotori-plugin-my-project",
+    "version": "1.0.0",
+    "description": "This is my first Kotori plugin",
+    "main": "lib/.js",
+    "scripts": {
+        "build": "tsc --build"
+    },
+    "license": "GPL-3.0",
+    "keywords": [
+        "kotori-plugin"
+    ],
+    "files": [
+        "lib",
+        "LICENSE",
+        "README.md"
+    ],
+    ,
+    "peerDependencies": {
+        "kotori-bot": "1.1.0"
+    },
+    "author": "Himeno <biyuehuya@gmail.com>",
+    "bugs": {
+        "url": "https://github.com/kotorijs/my-project/issues"
+    },
+    "repository": {
+        "type": "git",
+        "url": "git+https://github.com/kotorijs/my-project.git"
+    },
+    "homepage": "https://github.com/kotorijs/my-project/",
+    "kotori": {
+        "enforce": "pre",
+        "meta": {
+            "languages": [
+                "en_US",
+                "ja_JP",
+                "zh_TW",
+                "zh_CN"
+            ]
+        }
+    }
+}

关于 package.json 的默认配置项与更多信息请参考 npm Docs

index.ts

以下为默认创建的 index.ts,当前你还无需理解其具体含义:

typescript
import type { Context } from 'kotori-bot';
+import config from './config.ts';
+import types from './types.ts';
+
+export function main(ctx: Context) {
+  ctx
+    .command('echo <content> [num:number=3]')
+    .action((data, message) => {
+      ctx.logger.debug(data, data.args[0]);
+      ctx.logger.debug(message);
+      return [
+        \`返回消息:~%message%\`,
+        {
+          message: data.args[0],
+        },
+      ];
+    })
+    .alias('print')
+    .scope('group');
+
+  ctx.regexp(/^(.*)#print$/, match => match[1]);
+
+  ctx.command('ison').action((_, events) => {
+    if (events.api.adapter.config.master === events.userId) return \`在的哟主人~\`;
+    return '你是...谁?';
+  });
+}

模块测试

在入门教程中提到过使用「@kotori-bot/kotori-plugin-adapter-cmd」适配器可以在命令行中测试指令,但命令行本身仅支持纯文字交互因此并不友好也不便于开发者调试。同样的,Kotori 已默认安装「@kotori-bot/kotori-plugin-adapter-sandbox」适配器,它提供了一个极为方便、全面的机器人沙盒测试环境,只需在 kotori.yml 中设置该适配器即可:

yaml
adapter:
+ developer:
+  extends: sandbox
+  master: 1
+  port: 2333

运行模式

运行模式分为 「生产模式(Build)」与「开发模式(Dev)」两种:

  • Build 模式将显示更少的日志输出,有利于减少不必要信息方便用户使用;Dev 模式会有详尽的错误日志与开发日志输出,有利于开发者快速找到问题。
  • Build 模式有更牢固的错误捕获与进程守护,长期运行更加稳定;Dev 模式下在遇到某些关键性错误时会退出整个 Kotori 程序。
  • Dev 模式会有实时的代码文件变动监听与模块自动重载(热更新),为开发者提供犹如前端开发般的便捷体验。
  • Dev 模式能够直接运行 TypeScript 文件,在加载模块时会优先检测模块文件夹内是否有 src/.ts
  • Build 模式下读取 kotori.yml,Dev 模式下读取 kotori.dev.yml,两者用法与实际效果均一致,旨在区分不同模式下不同配置。

从 Dev 模式下启动 Kotori:

bash
pnpm dev

在浏览器中打开 http://localhost:2333 即可进入沙盒环境,输入 /echo Hello,Kotori! 以查看效果:

show

`,41),l=[p];function h(k,e,E,o,r,d){return a(),i("div",null,l)}const y=s(t,[["render",h]]);export{c as __pageData,y as default}; diff --git a/assets/guide_start_setup.md.0v96gqG3.lean.js b/assets/guide_start_setup.md.0v96gqG3.lean.js new file mode 100644 index 00000000..b0df9b22 --- /dev/null +++ b/assets/guide_start_setup.md.0v96gqG3.lean.js @@ -0,0 +1 @@ +import{_ as s,c as i,o as a,V as n}from"./chunks/framework.Dy019jra.js";const c=JSON.parse('{"title":"项目构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/start/setup.md","filePath":"guide/start/setup.md","lastUpdated":1707642172000}'),t={name:"guide/start/setup.md"},p=n("",41),l=[p];function h(k,e,E,o,r,d){return a(),i("div",null,l)}const y=s(t,[["render",h]]);export{c as __pageData,y as default}; diff --git a/assets/index.md.JPAfID5X.js b/assets/index.md.JPAfID5X.js new file mode 100644 index 00000000..d2b76491 --- /dev/null +++ b/assets/index.md.JPAfID5X.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.Dy019jra.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"image":{"src":"/favicon.svg","alt":"KotoriBot"},"name":"小鳥 · KotoriBot","tagline":"基于 NodeJS + TypeScript 的聊天机器人框架","actions":[{"theme":"brand","text":"开始使用👉","link":"/basic/introduce"},{"theme":"alt","text":"发行下载🐦","link":"https://github.com/kotorijs/kotori/releases"}]},"features":[{"icon":"🚀","title":"跨平台","details":"得益于模块化支持,通过编写各种模块实现不同的功能与聊天平台接入"},{"icon":"🧩","title":"解耦合","details":"基于控制反转与面向切面编程思想,减少代码冗余与复杂度"},{"icon":"🛠️","title":"现代化","details":"使用现代化的 ECMAScript 语法规范与强大的 TypeScript 类型支持"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1707712895000}'),o={name:"index.md"};function a(r,n,s,c,d,l){return i(),e("div")}const _=t(o,[["render",a]]);export{m as __pageData,_ as default}; diff --git a/assets/index.md.JPAfID5X.lean.js b/assets/index.md.JPAfID5X.lean.js new file mode 100644 index 00000000..d2b76491 --- /dev/null +++ b/assets/index.md.JPAfID5X.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.Dy019jra.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"image":{"src":"/favicon.svg","alt":"KotoriBot"},"name":"小鳥 · KotoriBot","tagline":"基于 NodeJS + TypeScript 的聊天机器人框架","actions":[{"theme":"brand","text":"开始使用👉","link":"/basic/introduce"},{"theme":"alt","text":"发行下载🐦","link":"https://github.com/kotorijs/kotori/releases"}]},"features":[{"icon":"🚀","title":"跨平台","details":"得益于模块化支持,通过编写各种模块实现不同的功能与聊天平台接入"},{"icon":"🧩","title":"解耦合","details":"基于控制反转与面向切面编程思想,减少代码冗余与复杂度"},{"icon":"🛠️","title":"现代化","details":"使用现代化的 ECMAScript 语法规范与强大的 TypeScript 类型支持"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1707712895000}'),o={name:"index.md"};function a(r,n,s,c,d,l){return i(),e("div")}const _=t(o,[["render",a]]);export{m as __pageData,_ as default}; diff --git a/assets/inter-italic-cyrillic-ext.5XJwZIOp.woff2 b/assets/inter-italic-cyrillic-ext.5XJwZIOp.woff2 new file mode 100644 index 00000000..2a687296 Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.5XJwZIOp.woff2 differ diff --git a/assets/inter-italic-cyrillic.D6csxwjC.woff2 b/assets/inter-italic-cyrillic.D6csxwjC.woff2 new file mode 100644 index 00000000..f6403515 Binary files /dev/null and b/assets/inter-italic-cyrillic.D6csxwjC.woff2 differ diff --git a/assets/inter-italic-greek-ext.CHOfFY1k.woff2 b/assets/inter-italic-greek-ext.CHOfFY1k.woff2 new file mode 100644 index 00000000..00218960 Binary files /dev/null and b/assets/inter-italic-greek-ext.CHOfFY1k.woff2 differ diff --git a/assets/inter-italic-greek.9J96vYpw.woff2 b/assets/inter-italic-greek.9J96vYpw.woff2 new file mode 100644 index 00000000..71c265f8 Binary files /dev/null and b/assets/inter-italic-greek.9J96vYpw.woff2 differ diff --git a/assets/inter-italic-latin-ext.BGcWXLrn.woff2 b/assets/inter-italic-latin-ext.BGcWXLrn.woff2 new file mode 100644 index 00000000..9c1b9440 Binary files /dev/null and b/assets/inter-italic-latin-ext.BGcWXLrn.woff2 differ diff --git a/assets/inter-italic-latin.DbsTr1gm.woff2 b/assets/inter-italic-latin.DbsTr1gm.woff2 new file mode 100644 index 00000000..01fcf207 Binary files /dev/null and b/assets/inter-italic-latin.DbsTr1gm.woff2 differ diff --git a/assets/inter-italic-vietnamese.DHNAd7Wr.woff2 b/assets/inter-italic-vietnamese.DHNAd7Wr.woff2 new file mode 100644 index 00000000..e4f788ee Binary files /dev/null and b/assets/inter-italic-vietnamese.DHNAd7Wr.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.DxP3Awbn.woff2 b/assets/inter-roman-cyrillic-ext.DxP3Awbn.woff2 new file mode 100644 index 00000000..28593ccb Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.DxP3Awbn.woff2 differ diff --git a/assets/inter-roman-cyrillic.CMhn1ESj.woff2 b/assets/inter-roman-cyrillic.CMhn1ESj.woff2 new file mode 100644 index 00000000..a20adc16 Binary files /dev/null and b/assets/inter-roman-cyrillic.CMhn1ESj.woff2 differ diff --git a/assets/inter-roman-greek-ext.D0mI3NpI.woff2 b/assets/inter-roman-greek-ext.D0mI3NpI.woff2 new file mode 100644 index 00000000..e3b0be76 Binary files /dev/null and b/assets/inter-roman-greek-ext.D0mI3NpI.woff2 differ diff --git a/assets/inter-roman-greek.JvnBZ4YD.woff2 b/assets/inter-roman-greek.JvnBZ4YD.woff2 new file mode 100644 index 00000000..f790e047 Binary files /dev/null and b/assets/inter-roman-greek.JvnBZ4YD.woff2 differ diff --git a/assets/inter-roman-latin-ext.ZlYT4o7i.woff2 b/assets/inter-roman-latin-ext.ZlYT4o7i.woff2 new file mode 100644 index 00000000..715bd903 Binary files /dev/null and b/assets/inter-roman-latin-ext.ZlYT4o7i.woff2 differ diff --git a/assets/inter-roman-latin.Bu8hRsVA.woff2 b/assets/inter-roman-latin.Bu8hRsVA.woff2 new file mode 100644 index 00000000..a540b7af Binary files /dev/null and b/assets/inter-roman-latin.Bu8hRsVA.woff2 differ diff --git a/assets/inter-roman-vietnamese.ClpjcLMQ.woff2 b/assets/inter-roman-vietnamese.ClpjcLMQ.woff2 new file mode 100644 index 00000000..5a9f9cb9 Binary files /dev/null and b/assets/inter-roman-vietnamese.ClpjcLMQ.woff2 differ diff --git a/assets/kotori.mp3 b/assets/kotori.mp3 new file mode 100644 index 00000000..3359a0da Binary files /dev/null and b/assets/kotori.mp3 differ diff --git a/assets/modules_index.md.CS1b5-RE.js b/assets/modules_index.md.CS1b5-RE.js new file mode 100644 index 00000000..de3d569b --- /dev/null +++ b/assets/modules_index.md.CS1b5-RE.js @@ -0,0 +1 @@ +import{d as p,h as c,o as a,c as n,F as f,G as g,m as e,t as i,a as d,e as y,J as k}from"./chunks/framework.Dy019jra.js";const b={key:0,align:"center"},j={key:1},w={key:0},x={key:0},N=e("h2",null,"Kotori | 模块中心",-1),$=["href"],A={key:1},O={key:0},V=e("h3",null,"元信息",-1),B=e("strong",null," 作者:",-1),C=e("strong",null," 协议:",-1),D=e("strong",null," 最新版本:",-1),F=e("strong",null," 最后更新:",-1),G=e("h3",null,"下载:",-1),J=["href"],L={key:0},P=["href"],S={key:1},E={key:1,align:"center"},I=p({__name:"Modules",setup(m){const _=o=>o.split("#").length>1?o.split("#")[1]:"",u=c(!0),r=c(_(location.href));setInterval(()=>{const o=_(location.href);r.value!==o&&(r.value=o,v())},500);const s=c(null),l=c(null),v=async()=>{const o=await(await fetch("/data.json")).json();if(r.value){const h=o.filter(t=>t.name===r.value);if(h.length>0){s.value=h[0];try{const t=await(await fetch(`https://registry.npmjs.org/${r.value}`)).json();t.name&&(l.value=t)}catch(t){console.log(t)}}u.value=!1}else s.value=o,u.value=!1};return v(),(o,h)=>u.value?(a(),n("div",b,"loading...")):(a(),n("div",j,[s.value&&typeof s.value=="object"?(a(),n("div",w,[Array.isArray(s.value)?(a(),n("div",x,[N,(a(!0),n(f,null,g(s.value,t=>(a(),n("div",{key:t.name},[e("a",{href:`/modules/#${t.name}`,target:"_blank"},[e("h2",null,i(t.name),1)],8,$),e("span",null,i(t.description),1)]))),128))])):(a(),n("div",A,[e("h2",null,i(s.value.name),1),e("span",null,i(s.value.description),1),l.value?(a(),n("div",O,[V,e("li",null,[B,d(" "+i(Array.isArray(l.value.author)?l.value.author.map(t=>t.name).join(" "):l.value.author.name),1)]),e("li",null,[C,d(i(l.value.license),1)]),e("li",null,[D,d("v"+i(l.value["dist-tags"].latest),1)]),e("li",null,[F,d(i(Object.values(l.value.time)[Object.keys(l.value.time).length-1]),1)]),G,e("li",null,[e("a",{href:`https://www.npmjs.com/package/${s.value.name}`,target:"_blank"},"npm",8,J)]),s.value.github?(a(),n("li",L,[e("a",{href:`https://github.com/${s.value.github}`,target:"_blank"},"Github",8,P)])):y("",!0)])):(a(),n("div",S,"未在 npm 找到该包或访问 npm 失败"))]))])):(a(),n("div",E,"未找到需要的模块 "+i(r.value),1))]))}}),T=JSON.parse('{"title":"","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"modules/index.md","filePath":"modules/index.md","lastUpdated":1707642172000}'),K={name:"modules/index.md"},U=Object.assign(K,{setup(m){return(_,u)=>(a(),n("div",null,[k(I)]))}});export{T as __pageData,U as default}; diff --git a/assets/modules_index.md.CS1b5-RE.lean.js b/assets/modules_index.md.CS1b5-RE.lean.js new file mode 100644 index 00000000..de3d569b --- /dev/null +++ b/assets/modules_index.md.CS1b5-RE.lean.js @@ -0,0 +1 @@ +import{d as p,h as c,o as a,c as n,F as f,G as g,m as e,t as i,a as d,e as y,J as k}from"./chunks/framework.Dy019jra.js";const b={key:0,align:"center"},j={key:1},w={key:0},x={key:0},N=e("h2",null,"Kotori | 模块中心",-1),$=["href"],A={key:1},O={key:0},V=e("h3",null,"元信息",-1),B=e("strong",null," 作者:",-1),C=e("strong",null," 协议:",-1),D=e("strong",null," 最新版本:",-1),F=e("strong",null," 最后更新:",-1),G=e("h3",null,"下载:",-1),J=["href"],L={key:0},P=["href"],S={key:1},E={key:1,align:"center"},I=p({__name:"Modules",setup(m){const _=o=>o.split("#").length>1?o.split("#")[1]:"",u=c(!0),r=c(_(location.href));setInterval(()=>{const o=_(location.href);r.value!==o&&(r.value=o,v())},500);const s=c(null),l=c(null),v=async()=>{const o=await(await fetch("/data.json")).json();if(r.value){const h=o.filter(t=>t.name===r.value);if(h.length>0){s.value=h[0];try{const t=await(await fetch(`https://registry.npmjs.org/${r.value}`)).json();t.name&&(l.value=t)}catch(t){console.log(t)}}u.value=!1}else s.value=o,u.value=!1};return v(),(o,h)=>u.value?(a(),n("div",b,"loading...")):(a(),n("div",j,[s.value&&typeof s.value=="object"?(a(),n("div",w,[Array.isArray(s.value)?(a(),n("div",x,[N,(a(!0),n(f,null,g(s.value,t=>(a(),n("div",{key:t.name},[e("a",{href:`/modules/#${t.name}`,target:"_blank"},[e("h2",null,i(t.name),1)],8,$),e("span",null,i(t.description),1)]))),128))])):(a(),n("div",A,[e("h2",null,i(s.value.name),1),e("span",null,i(s.value.description),1),l.value?(a(),n("div",O,[V,e("li",null,[B,d(" "+i(Array.isArray(l.value.author)?l.value.author.map(t=>t.name).join(" "):l.value.author.name),1)]),e("li",null,[C,d(i(l.value.license),1)]),e("li",null,[D,d("v"+i(l.value["dist-tags"].latest),1)]),e("li",null,[F,d(i(Object.values(l.value.time)[Object.keys(l.value.time).length-1]),1)]),G,e("li",null,[e("a",{href:`https://www.npmjs.com/package/${s.value.name}`,target:"_blank"},"npm",8,J)]),s.value.github?(a(),n("li",L,[e("a",{href:`https://github.com/${s.value.github}`,target:"_blank"},"Github",8,P)])):y("",!0)])):(a(),n("div",S,"未在 npm 找到该包或访问 npm 失败"))]))])):(a(),n("div",E,"未找到需要的模块 "+i(r.value),1))]))}}),T=JSON.parse('{"title":"","description":"","frontmatter":{"editLink":false},"headers":[],"relativePath":"modules/index.md","filePath":"modules/index.md","lastUpdated":1707642172000}'),K={name:"modules/index.md"},U=Object.assign(K,{setup(m){return(_,u)=>(a(),n("div",null,[k(I)]))}});export{T as __pageData,U as default}; diff --git a/assets/style.DIFeedaF.css b/assets/style.DIFeedaF.css new file mode 100644 index 00000000..91113824 --- /dev/null +++ b/assets/style.DIFeedaF.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.CMhn1ESj.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.DxP3Awbn.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.JvnBZ4YD.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.D0mI3NpI.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.Bu8hRsVA.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.ZlYT4o7i.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.ClpjcLMQ.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.D6csxwjC.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.5XJwZIOp.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.9J96vYpw.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.CHOfFY1k.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.DbsTr1gm.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.BGcWXLrn.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.DHNAd7Wr.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-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .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-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .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-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-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);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-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}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}: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-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-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-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-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-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-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-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-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-default-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-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-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);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,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-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-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-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,.custom-block.warning a:hover>code{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,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-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,.custom-block.details a:hover>code{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;-webkit-user-select:none;user-select:none}.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 span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.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{background-color:var(--vp-c-bg);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:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.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{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)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-a647fe67]{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-a647fe67],.VPBackdrop.fade-leave-to[data-v-a647fe67]{opacity:0}.VPBackdrop.fade-leave-active[data-v-a647fe67]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-a647fe67]{display:none}}.NotFound[data-v-51e8273c]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-51e8273c]{padding:96px 32px 168px}}.code[data-v-51e8273c]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-51e8273c]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-51e8273c]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-51e8273c]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-51e8273c]{padding-top:20px}.link[data-v-51e8273c]{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-51e8273c]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-8fe0d742]{position:relative;z-index:1}.nested[data-v-8fe0d742]{padding-right:16px;padding-left:16px}.outline-link[data-v-8fe0d742]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-8fe0d742]:hover,.outline-link.active[data-v-8fe0d742]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-8fe0d742]{padding-left:13px}.VPDocAsideOutline[data-v-bd526c66]{display:none}.VPDocAsideOutline.has-outline[data-v-bd526c66]{display:block}.content[data-v-bd526c66]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-bd526c66]{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-bd526c66]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-b4b15dc4]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-b4b15dc4]{flex-grow:1}.VPDocAside[data-v-b4b15dc4] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-b4b15dc4] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-b4b15dc4] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-f6cc7dc0]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-f6cc7dc0]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-09851fe2]{margin-top:64px}.edit-info[data-v-09851fe2]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-09851fe2]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-09851fe2]{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-09851fe2]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-09851fe2]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-09851fe2]{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-09851fe2]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-09851fe2]{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-09851fe2]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-09851fe2]{margin-left:auto;text-align:right}.desc[data-v-09851fe2]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-09851fe2]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-a2c60ea6]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-a2c60ea6]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-a2c60ea6]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-a2c60ea6]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-a2c60ea6]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-a2c60ea6]{display:flex;justify-content:center}.VPDoc .aside[data-v-a2c60ea6]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-a2c60ea6]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-a2c60ea6]{max-width:1104px}}.container[data-v-a2c60ea6]{margin:0 auto;width:100%}.aside[data-v-a2c60ea6]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-a2c60ea6]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-a2c60ea6]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-a2c60ea6]::-webkit-scrollbar{display:none}.aside-curtain[data-v-a2c60ea6]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-a2c60ea6]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-a2c60ea6]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-a2c60ea6]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-a2c60ea6]{order:1;margin:0;min-width:640px}}.content-container[data-v-a2c60ea6]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-a2c60ea6]{max-width:688px}.VPButton[data-v-d78902cb]{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-d78902cb]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-d78902cb]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-d78902cb]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-d78902cb]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-d78902cb]: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-d78902cb]: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-d78902cb]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-d78902cb]: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-d78902cb]: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-d78902cb]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-d78902cb]: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-d78902cb]: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-1496cb03]{display:none}.dark .VPImage.light[data-v-1496cb03]{display:none}.VPHero[data-v-261d8488]{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-261d8488]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-261d8488]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-261d8488]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-261d8488]{flex-direction:row}}.main[data-v-261d8488]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-261d8488]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-261d8488]{text-align:left}}@media (min-width: 960px){.main[data-v-261d8488]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-261d8488]{max-width:592px}}.name[data-v-261d8488],.text[data-v-261d8488]{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-261d8488],.VPHero.has-image .text[data-v-261d8488]{margin:0 auto}.name[data-v-261d8488]{color:var(--vp-home-hero-name-color)}.clip[data-v-261d8488]{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-261d8488],.text[data-v-261d8488]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-261d8488],.text[data-v-261d8488]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-261d8488],.VPHero.has-image .text[data-v-261d8488]{margin:0}}.tagline[data-v-261d8488]{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-261d8488]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-261d8488]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-261d8488]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-261d8488]{margin:0}}.actions[data-v-261d8488]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-261d8488]{justify-content:center}@media (min-width: 640px){.actions[data-v-261d8488]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-261d8488]{justify-content:flex-start}}.action[data-v-261d8488]{flex-shrink:0;padding:6px}.image[data-v-261d8488]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-261d8488]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-261d8488]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-261d8488]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-261d8488]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-261d8488]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-261d8488]{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-261d8488]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-261d8488]{width:320px;height:320px}}[data-v-261d8488] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-261d8488] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-261d8488] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-0fb825d6]{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-0fb825d6]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-0fb825d6]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-0fb825d6]>.VPImage{margin-bottom:20px}.icon[data-v-0fb825d6]{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-0fb825d6]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-0fb825d6]{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-0fb825d6]{padding-top:8px}.link-text-value[data-v-0fb825d6]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-0fb825d6]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-ee5d2e6d]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-ee5d2e6d]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-ee5d2e6d]{padding:0 64px}}.container[data-v-ee5d2e6d]{margin:0 auto;max-width:1152px}.items[data-v-ee5d2e6d]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-ee5d2e6d]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-ee5d2e6d],.item.grid-4[data-v-ee5d2e6d],.item.grid-6[data-v-ee5d2e6d]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-ee5d2e6d],.item.grid-4[data-v-ee5d2e6d]{width:50%}.item.grid-3[data-v-ee5d2e6d],.item.grid-6[data-v-ee5d2e6d]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-ee5d2e6d]{width:25%}}.VPHome[data-v-a3390ded]{padding-bottom:96px}.VPHome[data-v-a3390ded] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-a3390ded]{padding-bottom:128px}}.VPContent[data-v-bec94311]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-bec94311]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-bec94311]{margin:0}@media (min-width: 960px){.VPContent[data-v-bec94311]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-bec94311]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-bec94311]{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-05135069]{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-05135069]{display:none}.VPFooter[data-v-05135069] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-05135069] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-05135069]{padding:32px}}.container[data-v-05135069]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-05135069],.copyright[data-v-05135069]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-ba6e1eeb]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-ba6e1eeb]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-ba6e1eeb]{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-ba6e1eeb]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-ba6e1eeb]{color:var(--vp-c-text-1)}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-ba6e1eeb]{font-size:14px}}.icon[data-v-ba6e1eeb]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}.open>.icon[data-v-ba6e1eeb]{transform:rotate(90deg)}.items[data-v-ba6e1eeb]{position:absolute;top:40px;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)}@media (min-width: 960px){.items[data-v-ba6e1eeb]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-ba6e1eeb]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-ba6e1eeb]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-ba6e1eeb]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-ba6e1eeb]{transition:all .2s ease-out}.flyout-leave-active[data-v-ba6e1eeb]{transition:all .15s ease-in}.flyout-enter-from[data-v-ba6e1eeb],.flyout-leave-to[data-v-ba6e1eeb]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-f2da8727]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);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-f2da8727]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-f2da8727]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-f2da8727]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-f2da8727]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-f2da8727]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-f2da8727]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-f2da8727]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-f2da8727]{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-f2da8727]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-f2da8727]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-f2da8727]{display:none}}.menu-icon[data-v-f2da8727]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-f2da8727]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-f2da8727]{padding:12px 32px 11px}}.VPSwitch[data-v-46b6d778]{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-46b6d778]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-46b6d778]{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-46b6d778]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-46b6d778] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-46b6d778] svg{fill:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-ceefbc95]{opacity:1}.moon[data-v-ceefbc95],.dark .sun[data-v-ceefbc95]{opacity:0}.dark .moon[data-v-ceefbc95]{opacity:1}.dark .VPSwitchAppearance[data-v-ceefbc95] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-36bc17bf]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-36bc17bf]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f4766ae3]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f4766ae3]{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-f4766ae3]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f4766ae3]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-ed3b36e8]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-ed3b36e8]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-ed3b36e8]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-ed3b36e8]{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-65bf37b0]{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-65bf37b0] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-65bf37b0] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-65bf37b0] .group:last-child{padding-bottom:0}.VPMenu[data-v-65bf37b0] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-65bf37b0] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-65bf37b0] .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-65bf37b0] .action{padding-left:24px}.VPFlyout[data-v-a1f9f724]{position:relative}.VPFlyout[data-v-a1f9f724]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-a1f9f724]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-a1f9f724]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-a1f9f724]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-a1f9f724]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-a1f9f724],.button[aria-expanded=true]+.menu[data-v-a1f9f724]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-a1f9f724]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-a1f9f724]{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-a1f9f724]{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-a1f9f724]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-a1f9f724]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-a1f9f724]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-a1f9f724]{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-830361a1]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-830361a1]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-830361a1]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-d3597f0d]{display:flex;justify-content:center}.VPNavBarExtra[data-v-7cc6feae]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-7cc6feae]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-7cc6feae]{display:none}}.trans-title[data-v-7cc6feae]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-7cc6feae],.item.social-links[data-v-7cc6feae]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-7cc6feae]{min-width:176px}.appearance-action[data-v-7cc6feae]{margin-right:-2px}.social-links-list[data-v-7cc6feae]{margin:-4px -8px}.VPNavBarHamburger[data-v-c2ec009a]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-c2ec009a]{display:none}}.container[data-v-c2ec009a]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-c2ec009a]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-c2ec009a]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-c2ec009a]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-c2ec009a]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-c2ec009a]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-c2ec009a]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-c2ec009a],.VPNavBarHamburger.active:hover .middle[data-v-c2ec009a],.VPNavBarHamburger.active:hover .bottom[data-v-c2ec009a]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-c2ec009a],.middle[data-v-c2ec009a],.bottom[data-v-c2ec009a]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-c2ec009a]{top:0;left:0;transform:translate(0)}.middle[data-v-c2ec009a]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-c2ec009a]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-0b3cba30]{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-0b3cba30],.VPNavBarMenuLink[data-v-0b3cba30]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-c656c3ac]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-c656c3ac]{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:#0003;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:#0003;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-af1fb2ec]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-af1fb2ec]{display:flex;align-items:center}}.title[data-v-bdace926]{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-bdace926]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-bdace926]{border-bottom-color:var(--vp-c-divider)}}[data-v-bdace926] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-73748009]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-73748009]{display:flex;align-items:center}}.title[data-v-73748009]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-0c13c512]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .5s}.VPNavBar.has-local-nav[data-v-0c13c512]{background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar.has-local-nav[data-v-0c13c512]{background-color:transparent}.VPNavBar[data-v-0c13c512]:not(.has-sidebar):not(.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-0c13c512]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-0c13c512]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-0c13c512]{padding:0}}.container[data-v-0c13c512]{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-0c13c512],.container>.content[data-v-0c13c512]{pointer-events:none}.container[data-v-0c13c512] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-0c13c512]{max-width:100%}}.title[data-v-0c13c512]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-0c13c512]{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-0c13c512]{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-0c13c512]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-0c13c512]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-0c13c512]{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-0c13c512]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.top) .content-body[data-v-0c13c512]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.top) .content-body[data-v-0c13c512]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-0c13c512]{column-gap:.5rem}}.menu+.translations[data-v-0c13c512]:before,.menu+.appearance[data-v-0c13c512]:before,.menu+.social-links[data-v-0c13c512]:before,.translations+.appearance[data-v-0c13c512]:before,.appearance+.social-links[data-v-0c13c512]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-0c13c512]:before,.translations+.appearance[data-v-0c13c512]:before{margin-right:16px}.appearance+.social-links[data-v-0c13c512]:before{margin-left:16px}.social-links[data-v-0c13c512]{margin-right:-8px}.divider[data-v-0c13c512]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-0c13c512]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-0c13c512]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-0c13c512]{width:100%;height:1px;transition:background-color .5s}.VPNavBar.has-local-nav .divider-line[data-v-0c13c512]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.top) .divider-line[data-v-0c13c512]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.top) .divider[data-v-0c13c512]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-93411559]{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-93411559]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-087cdc5c]{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-087cdc5c]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-2e83d2e4]{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-2e83d2e4]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-73af5b34]{display:block}.title[data-v-73af5b34]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-8e0c44cb]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-8e0c44cb]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-8e0c44cb]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-8e0c44cb]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-8e0c44cb]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-8e0c44cb]{transform:rotate(45deg)}.button[data-v-8e0c44cb]{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-8e0c44cb]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-8e0c44cb]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-8e0c44cb]:first-child{padding-top:0}.group+.group[data-v-8e0c44cb],.group+.item[data-v-8e0c44cb]{padding-top:4px}.VPNavScreenTranslations[data-v-0a66c669]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-0a66c669]{height:auto}.title[data-v-0a66c669]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-0a66c669]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-0a66c669]{margin-right:8px}.icon.chevron[data-v-0a66c669]{margin-left:4px}.list[data-v-0a66c669]{padding:4px 0 0 24px}.link[data-v-0a66c669]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-da863be4]{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-da863be4],.VPNavScreen.fade-leave-active[data-v-da863be4]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-da863be4],.VPNavScreen.fade-leave-active .container[data-v-da863be4]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-da863be4],.VPNavScreen.fade-leave-to[data-v-da863be4]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-da863be4],.VPNavScreen.fade-leave-to .container[data-v-da863be4]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-da863be4]{display:none}}.container[data-v-da863be4]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-da863be4],.menu+.appearance[data-v-da863be4],.translations+.appearance[data-v-da863be4]{margin-top:24px}.menu+.social-links[data-v-da863be4]{margin-top:16px}.appearance+.social-links[data-v-da863be4]{margin-top:16px}.VPNav[data-v-53ded626]{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-53ded626]{position:fixed}}.VPSidebarItem.level-0[data-v-c0c1a422]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-c0c1a422]{padding-bottom:10px}.item[data-v-c0c1a422]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-c0c1a422]{cursor:pointer}.indicator[data-v-c0c1a422]{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-c0c1a422],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-c0c1a422],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-c0c1a422],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-c0c1a422]{background-color:var(--vp-c-brand-1)}.link[data-v-c0c1a422]{display:flex;align-items:center;flex-grow:1}.text[data-v-c0c1a422]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-c0c1a422]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-c0c1a422],.VPSidebarItem.level-2 .text[data-v-c0c1a422],.VPSidebarItem.level-3 .text[data-v-c0c1a422],.VPSidebarItem.level-4 .text[data-v-c0c1a422],.VPSidebarItem.level-5 .text[data-v-c0c1a422]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-c0c1a422],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-c0c1a422],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-c0c1a422],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-c0c1a422],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-c0c1a422],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-c0c1a422]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-c0c1a422],.VPSidebarItem.level-1.has-active>.item>.text[data-v-c0c1a422],.VPSidebarItem.level-2.has-active>.item>.text[data-v-c0c1a422],.VPSidebarItem.level-3.has-active>.item>.text[data-v-c0c1a422],.VPSidebarItem.level-4.has-active>.item>.text[data-v-c0c1a422],.VPSidebarItem.level-5.has-active>.item>.text[data-v-c0c1a422],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-c0c1a422],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-c0c1a422],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-c0c1a422],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-c0c1a422],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-c0c1a422],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-c0c1a422]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-c0c1a422],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-c0c1a422],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-c0c1a422],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-c0c1a422],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-c0c1a422],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-c0c1a422]{color:var(--vp-c-brand-1)}.caret[data-v-c0c1a422]{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-c0c1a422]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-c0c1a422]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-c0c1a422]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-c0c1a422]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-c0c1a422],.VPSidebarItem.level-2 .items[data-v-c0c1a422],.VPSidebarItem.level-3 .items[data-v-c0c1a422],.VPSidebarItem.level-4 .items[data-v-c0c1a422],.VPSidebarItem.level-5 .items[data-v-c0c1a422]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-c0c1a422]{display:none}.VPSidebar[data-v-ba8faffd]{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-ba8faffd]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-ba8faffd]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-ba8faffd]{padding-top:var(--vp-nav-height);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-ba8faffd]{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-ba8faffd]{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-ba8faffd]{outline:0}.group+.group[data-v-ba8faffd]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-ba8faffd]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSkipLink[data-v-076c9da4]{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-076c9da4]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-076c9da4]{top:14px;left:16px}}.Layout[data-v-f76875ae]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-ae36660a]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-ae36660a]{margin:0 auto;max-width:1152px}.love[data-v-ae36660a]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-ae36660a]{width:28px;height:28px;fill:currentColor}.message[data-v-ae36660a]{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-ae36660a]{padding-top:32px}.action[data-v-ae36660a]{padding-top:40px;text-align:center}.VPTeamPage[data-v-9c003eee]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-9c003eee]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-9c003eee-s],.VPTeamMembers+.VPTeamPageSection[data-v-9c003eee-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-9c003eee-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-9c003eee-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-9c003eee-s],.VPTeamMembers+.VPTeamPageSection[data-v-9c003eee-s]{margin-top:96px}}.VPTeamMembers[data-v-9c003eee-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-9c003eee-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-9c003eee-s]{padding:0 64px}}.VPTeamPageTitle[data-v-4f7870d0]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-4f7870d0]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-4f7870d0]{padding:80px 64px 48px}}.title[data-v-4f7870d0]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-4f7870d0]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-4f7870d0]{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-4f7870d0]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-ca70d5dc]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-ca70d5dc]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-ca70d5dc]{padding:0 64px}}.title[data-v-ca70d5dc]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-ca70d5dc]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-ca70d5dc]{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-ca70d5dc]{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-ca70d5dc]{padding-top:40px}.VPTeamMembersItem[data-v-886f94f6]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-886f94f6]{padding:32px}.VPTeamMembersItem.small .data[data-v-886f94f6]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-886f94f6]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-886f94f6]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-886f94f6]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-886f94f6]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-886f94f6]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-886f94f6]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-886f94f6]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-886f94f6]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-886f94f6]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-886f94f6]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-886f94f6]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-886f94f6]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-886f94f6]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-886f94f6]{text-align:center}.avatar[data-v-886f94f6]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-886f94f6]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-886f94f6]{margin:0;font-weight:600}.affiliation[data-v-886f94f6]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-886f94f6]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-886f94f6]:hover{color:var(--vp-c-brand-1)}.desc[data-v-886f94f6]{margin:0 auto}.desc[data-v-886f94f6] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-886f94f6]{display:flex;justify-content:center;height:56px}.sp-link[data-v-886f94f6]{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-886f94f6]:hover,.sp .sp-link.link[data-v-886f94f6]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-886f94f6]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-32b146f9]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-32b146f9]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-32b146f9]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-32b146f9]{max-width:876px}.VPTeamMembers.medium .container[data-v-32b146f9]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-32b146f9]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-32b146f9]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-32b146f9]{max-width:760px}.container[data-v-32b146f9]{display:grid;gap:24px;margin:0 auto;max-width:1152px}: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-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-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)}:root{--vp-home-hero-name-color: transparent;--vp-home-hero-name-background: -webkit-linear-gradient( 120deg, #bd34fe 30%, #41d1ff );--vp-home-hero-image-background-image: linear-gradient( -45deg, #bd34fe 50%, #47caff 50% );--vp-home-hero-image-filter: blur(40px)}@media (min-width: 640px){:root{--vp-home-hero-image-filter: blur(56px)}}@media (min-width: 960px){:root{--vp-home-hero-image-filter: blur(72px)}}:root{--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)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand-1) !important}.npm-badge[data-v-8bf061d3]{margin-right:.5rem} diff --git a/basic/config.html b/basic/config.html new file mode 100644 index 00000000..550836cf --- /dev/null +++ b/basic/config.html @@ -0,0 +1,70 @@ + + + + + + 配置详解 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

配置详解

前面一节已对 kotori.yml 有了大概认识,本节内容将更为全面的介绍它。kotori.yml 是一个 Kotori 程序的核心配置文件,它一般位于 Kotori 根目录,与 package.json 文件同级,使用 YAML 格式。

关于 YAML 格式的语法与规范请参考 YAML 入门教程

以下是将先前的配置片段集中在一起的例子(仅作参考请勿直接复制):

yaml
global:
+  lang: zh_CN
+  command-prefix: /
+  dirs:
+    - ./node_modules/
+    - ./node_modules/@kotori-bot/
+    # 上面为默认配置的加载目录
+    - ./node_modules/@custom-scope/
+    - ./test_modules
+
+adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720
+
+  kisaki:
+    extends: qq
+    appid: "xxxx"
+    secret: "xxxxx"
+    master: 2333
+    retry: 10
+
+plugin:
+  console:
+ filter: {}
+    test: 1
+
+  menu:
+    alias: cd
+    keywords: [ 菜单, 功能, 帮助]
+    content: 菜单 | 小鳥%break%/menu - 查看BOT菜单%break%/hitokoto - 获取一条一言%break%ByHotaru

global.lang

定义全局使用的语言,目前仅支持英语、日语、台湾语、中文四门语言。

  • 值:LocaleType
  • 默认值:'en_US'
typescript
type LocaleType = 'en_US' | 'ja_JP' | 'zh_TW' | 'zh_CN';

global['command-prefix']

定义全局使用的命令前缀。

  • 值:string
  • 默认值: '/'

global.dirs

定义需要加载的模块目录。

  • 值:string[]
  • 默认值:['./node_modules/', './node_modules/@kotori-bot/']

global.filter

定义全局使用的过滤器,目前过滤器功能正在实现中,该项暂时无实际效果。

  • 值:{}
  • 默认值:{}

adapter

定义 Bot。

  • 值:{ [botName: string]: AdapterConfig }
  • 默认值:{}
  • botName:Bot 的唯一标识符,可自定义,建议仅使用小写英语字母、数字、连字符字符([a-z0-9-])
typescript
interface AdapterConfig {
+  extends: string;
+  master?: number;
+  lang?: langType;
+  'command-prefix'?: string;
+  [propName: string]?: unknown;
+}

AdapterConfig.extends

定义该 Bot 使用的适配器。

  • 值:string
  • 可选:否

AdapterConfig.master

定义该 Bot 的最高管理员 id(即该用户在平台的 id)。

  • 值:string | number
  • 可选:是

AdapterConfig.lang

定义该 Bot 使用的语言。

  • 值:LocaleType
  • 默认值:继承自 global.lang

AdapterConfig['command-prefix']

定义该 Bot 使用的命令前缀。

  • 值:string
  • 默认值: 继承自 global['command-prefix']

AdapterConfig[propName]

除去以上由 Kotori 内部定义的配置项,extends 中指定的适配器一般会额外定义配置项用于 Bot 内部,这些配置项也可能不存在或为可选,具体请参考该模块的详情页。

plugin

定义插件的配置项。

  • 值:{ [pluginName: string]: PluginConfig }
  • 默认值:{}
  • pluginName:模块的 id,去掉该模块包名中的命名空间与模块前缀(Kotori-plugin-)部分
typescript
interface PluginConfig {
+  filter?: {};
+  [propName: string]?: unknown;
+}

PluginConfig.filter

定义该插件使用的过滤器。

  • 值:{}
  • 默认值:{}

PluginConfig[propName]

类似于 AdapterConfig 中的 [propName],该插件也可能会定义一些配置项用于插件内部,具体请参考该模块的详情页。

+ + + + \ No newline at end of file diff --git a/basic/introduce.html b/basic/introduce.html new file mode 100644 index 00000000..03e63a9a --- /dev/null +++ b/basic/introduce.html @@ -0,0 +1,27 @@ + + + + + + 简介 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

简介

kotori-bot

WARNING

KotoriV1 文档正在建设并完善中


kotori 是一个跨平台、解耦合、现代化于一体的聊天机器人框架,运行于 Node.js 环境,使用 TypeScript 语言开发。

概述

「Kotori」是一个罗马字,在日语中是「ことり」(小鳥)的意思,发音为 /kotoliː/ ,该名字取自于 Key 公式 的游戏 《Rewrite》 中主要女性角色之一:神户小鸟 (神戸(かんべ) 小鳥(ことり))。 借助 Kotori,可快速搭建一个多平台、功能强大的聊天机器人应用,通过安装不同模块为 Kotori 扩展功能、玩法和个性化配置等。同时,Kotori 为开发者提供了现成的 Cli 用于模块开发与 Kotori 二次开发。

特点

  • 跨平台 得益于模块化支持,通过编写各种模块实现不同的功能与聊天平台接入

  • 解耦合 基于控制反转(IOC)与面向切面编程(AOP)思想,减少代码冗余与复杂度

  • 现代化 使用现代化的 ECMAScript 语法规范与强大的 TypeScript 类型支持

扩展支持

平台

  • QQ(基于 Tencent 官方 API)
  • QQ(基于 Onebot 标准的 go-cqhttp 项目)
  • CMD 命令行 即将支持:
  • Telegram
  • Kook/开黑啦
  • MinecraftBedrock(基于 Websocket)
  • WeChat/微信
  • Discord

数据库(待支持)

  • Memory
  • Sqlite
  • Mysql

你是?

  • 框架用户,使用 Kotori 搭建自己的机器人:快速开始
  • 平台用户,使用官方提供的现成机器人:立即使用
  • 开发者
    • 模块开发者,开发 Kotori 模块:开发文档
    • Node.js 开发者,将 Kotori 作为依赖开发自己的项目:接口文档
+ + + + \ No newline at end of file diff --git a/basic/modules.html b/basic/modules.html new file mode 100644 index 00000000..12fb88b3 --- /dev/null +++ b/basic/modules.html @@ -0,0 +1,61 @@ + + + + + + 模块安装 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

模块安装

介绍

模块(Modules) 是 Kotori 的重要组成部分之一,通过使用模块以扩展各式各样的功能。

模块根据功能与应用范围不同,主要分为以下三大类型:

  • 插件(Plugin):为用户提供多种功能、玩法、扩展,数量最多的类型
  • 服务(Service):用于提供封装好的接口
  • 适配器(Adapter):用于接入各个聊天平台

寻找模块

Kotori 模块中心 内收录了大部分 Kotori 模块。选择所需模块,在详情页中会有插件的基础信息、介绍、使用说明、配置说明等。

下载与安装

此处以「QQ 适配器服务模块」(@kotori-bot/kotori-plugin-adapter-qq)为例。

模块的包名除去 @xxx/ 的部分(如果有),会有一段相似的开始字段,将其称之为「模块前缀」。通过模块前缀可判断模块类型,如「kotori-plugin-adapter-xxx」表示适配器服务,「kotori-plugin-database-xxx」表示数据库服务,「kotori-plugin-xxx」表示插件自定义服务,详细内容请参考 开发文档 - 插件范式

使用包管理工具

复制模块详情页里中的安装指令,或手动输入对应模块的 npm 包名,在 Kotori 根目录运行:

bash
pnpm install @kotori-bot/kotori-plugin-adapter-qq

手动下载安装

该方法仅在必要情况下建议使用。

在模块详情页里跳转至对应的 npm 地址或 GitHub 地址,下载模块的构建产物。 解压压缩包并移动至 Kotori 根目录下的 ./modules/ 内。

GitHub 仓库中存有模块的源码,在当前阶段,你应下载并使用模块的构建产物而非源码。

务必确保解压后的模块文件夹仅有一层文件夹而非多层,否则将无法识别与加载模块。

添加加载目录

模块安装在 ./modules 目录内请忽略该步骤。

通过包管理工具安装的模块一般会安装在 Kotori 根目录下的 ./node_modules/ 内,如若插件包名带有 @xxx/ 的前缀,表示为包的命名空间,上述示例模块中的「@kotori-bot/」为 Kotori 官方包的命名空间,表示官方模块,其余的命名空间或无命名空间的模块为社区模块

所有未安装在 ./modules/ 都应配置 kotori.ymlglobal.dirs 项以设置额外的加载根目录,但对于 ./node_modules/@kotori-bot/ 命名空间已经存在于 Kotori.yml 默认配置中,因此无需担心。

对于其它安装目录或命名空间则需手动添加到 Kotori.yml 中,如:

  • 使用包管理工具安装一个命名空间为 @custom-scope/ 的模块
  • 将模块安装在 Kotori 根目录下的 ./test_modules/

对应配置为:

yaml
global:
+  dirs:
+    - ./node_modules/
+    - ./node_modules/@kotori-bot/
+    # 上面为默认配置的加载目录
+    - ./node_modules/@custom-scope/
+    - ./test_modules

配置模块

根据安装的模块类型不同,配置策略也将不同。

插件

插件配置数据应写在 kotori.ymlplugin.<plugin-name> 项下,其中 <plugin-name> 为插件名字,不应含有包的命名空间与模块前缀,值必须是一个对象。插件的配置项由插件本身提供与指定,并非所有插件本身都会提供配置项。一般地,有提供配置项的插件内都会有一套默认配置,因此不配置也可以正常运行插件。插件的配置和说明可参考该插件的详情页,此处以 「菜单插件」(@kotori-bot/kotori-plugin-menu)为例,在详情页查看配置说明后在 kotori.yml 中配置相关内容:

yaml
plugin:
+  menu:
+    alias: cd
+    keywords: [菜单, 功能, 帮助]
+    content: 菜单 | 小鳥%break%/menu - 查看BOT菜单%break%/hitokoto - 获取一条一言%break%ByHotaru

适配器

适配器配置数据应写在 kotori.ymladapter[instanceName] 项下,其中 instanceName 为适配器实例(以下简称「Bot」)名字应由小写英语字母、数字、连字符([a-z0-9])组成,值必须是一个对象。适配器的配置数据不会作用于适配器模块,Kotori 会根据配置数据创建对应 Bot。对于适配器的配置,必须提供一些必要配置项才能确保实例的正常运行,其中有部分配置项由 Kotori 内部定义,如:

yaml
adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333

「cmd-test」是该 Bot 的名字也是在 kotori 程序运行中的唯一标识符,不可重复。extends 用于指定该实例使用的适配器,值为适配器模块的包名除去命名空间与适配器服务前缀的字符串,如:使用「@kotori-bot/kotori-plugin-adapter-qq」适配器,则应填入「qq」。master 用于指定该实例的最高管理员(Admin),值类型可为数字或字符串,非必填。 除去由 Kotori 内部定义的配置项以外,一般还需要填入该适配器要求传入的必要配置项。

yaml
adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720

cmd 适配器即「@kotori-bot/kotori-plugin-adapter-cmd」,属于 kotori 预装模块之一,为 kotori 程序当前所在控制台提供聊天交互功能,也是最方便的测试机器人的场所(但并不推荐,因为只支持文字交互,模块开发有更好的测试场所选择,详细内容请参考 开发文档 - 项目构建)。

不过此处使用的 cmd 适配器定义的配置项均有默认值因此为可选。接着使用「@kotori-bot/kotori-plugin-adapter-qq」适配器再创建一个 Bot:

yaml
adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720
+
+  kisaki:
+    extends: qq
+    appid: 'xxxx'
+    secret: 'xxxxx'
+    master: 2333
+    retry: 10

查看 QQ 适配器的详情页面可知,appidsecret 为其定义的必要配置项,retry 为其定义的可选配置项,关于 QQ 适配器的具体使用与配置项含义请查看其插件详情页。

关于 Kotori.yml 的详细介绍请参考 配置详解

+ + + + \ No newline at end of file diff --git a/basic/start.html b/basic/start.html new file mode 100644 index 00000000..6db47875 --- /dev/null +++ b/basic/start.html @@ -0,0 +1,47 @@ + + + + + + 快速开始 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

快速开始

安装 Node.js

前往 Node.js 官网 根据系统版本选择对应的安装方式,确保 Node.js 版本 >= 17.9.0。输入以下命令确认安装成功:

bash
node -v
+npm -v

下载 Kotori

一键安装脚本

该内容待更新....

使用 Git

bash
git clone https://github.com/kotori/kotori.git

使用 pnpm 安装依赖

Kotori 基于 pnpm 的 Monorepo 进行开发,因此需要先安装 pnpm:

bash
npm install pnpm -g

进入到 Kotori 根目录并使用 pnpm 安装所有依赖:

bash
cd ./kotori-bot-master
+pnpm install

配置 kotori.yml

使用文本编辑器打开位于 Kotori 根目录的 kotori.yml,当前你还无需对该文件配置进行必要的改动。

yaml
global:
+  lang: zh_CN
+  command-prefix: /
+  dirs:
+    - ./node_modules/
+    - ./node_modules/@kotori-bot/
+
+adapter:
+  cmd-test:
+    extends: cmd
+    master: 2333
+    nickname: Kotarou
+    age: 18
+    sex: male
+    self-id: 720
+
+plugin:
+  console:
+    test: 1

关于 kotori.yml 的详细介绍请参考 配置详解

运行 Kotori

  • 生产模式运行:
bash
pnpm start
  • 开发模式运行:
bash
pnpm dev
+ + + + \ No newline at end of file diff --git a/basic/usage.html b/basic/usage.html new file mode 100644 index 00000000..fd5da569 --- /dev/null +++ b/basic/usage.html @@ -0,0 +1,71 @@ + + + + + + 立即使用 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

立即使用

TIP

本篇适用于想立即体验基于 Kotori 搭建的 Bot 实际效果、或单纯想使用由官方提供的各平台 Bot 服务的平台用户。


服务平台

目前共提供 1 个平台、两个 Bot:

QQ

Kanbe Kotori(小鳥一号)

小鳥二号

基于 Onebot 标准的 go-cqhttp 项目(@Kotori-bot/kotori-plugin-adapter-onebot)。相比于官方 QQ 机器人,第三方 QQ 机器人拥有着更健全的基础功能,权限使用上几乎无任何限制,缺点是因某种原因导致 go-cqhttp 等第三方 QQ 机器人项目跑路或归档,稳定性低于官方机器人。

立即使用:Kotori 交流群

小鳥三号

基于 Tencent 官方 API(@Kotori-bot/kotori-plugin-adapter-qq)。相比于第三方 QQ 机器人,限制较多(不可发送主动消息、URL 需备案等),但稳定性较高,其余功能与「小鳥二号」基本一致。

立即使用:Kotori 交流群

Telegram

Discord

Bot 申请

除了加入官方群或添加 Bot 账户直接使用以外,也可以申请对应平台的 Bot 接入到你自己的群聊。

申请链接:Github Issues

请仔细查看说明并填写信息,一般在 24 小时内处理完毕 issue。

功能一览

以下展示并非全部功能。

@kotori-bot/kotori-plugin-core

  • /core 查看实例统计信息
  • /bot 查看当前 bot 信息与运行状态
  • /bots 查看所有 bot 信息与运行状态
  • /version 查看版本信息
  • /about 帮助信息
  • /update 检查更新

@kotori-bot/kotori-plugin-help

  • /help [command] 查看指令帮助信息

@kotori-bot/kotori-plugin-menu

/menu 查看 BOT 菜单 别名:cd

kotori-plugin-random-img

  • /sex [tags] Pixiv 图片
  • /sexh HuliImg 图片
  • /bing 必应每日图
  • /day 60s 带你看世界
  • /earth 实时地球
  • /china 实时中国

kotori-plugin-bangumi

  • /bgm <content> [order:number=1] 番组计划搜索游戏/动漫
  • /bgmc 获取番组计划今日放送
bash
/bgm 素晴日
+> 原名:素晴らしき日々~不連続存在~公式ビジュアルアーカイヴ
+中文名:素晴之日 不连续的存在 Official Visual Archive
+介绍:人気アダルトゲームブランド「ケロQ」から、実に6年ぶりに発売された新作『素晴らしき日々 ~不連続存在~』。その魅力をギュッと閉じ込めたファン必携の一冊。描き下ろしイラスト&原作を担当したSCA-自(すかぢ)氏の新作書き下ろしテキスト満載でお届け。
+标签:素晴らしき日々 设定集 电波 神作 素晴日 公式书 2010 百合 FanBook 悬疑 画集 画集・設定資料集 推理 VFB
+详情:https://bgm.tv/subject/8318
+[image]

kotori-plugin-bilibili

  • /bili <bvid> Bilibili 视频信息查询
  • /bilier <uid> Bilibili 用户信息查询

kotori-plugin-hitokoto

  • /hitokotos 随机语录
  • /hitokoto 获取一条一言
bash
/hitokoto
+> 如果人们不相信数学简单,那是因为他们没有意识到人生有多复杂。——冯诺依曼
+类型:俗语

kotori-plugin-mediawiki

  • /wiki <content> [order] 搜索 MediaWiki
  • /wikil 查看 MediaWiki 列表
bash
/wiki 月社妃
+> 标题:月社妃
+内容:月社妃(日语:月社(つきやしろ) 妃(きさき))是由ウグイスカグラ所制作的18禁galgame《纸上的魔法使》及其衍生作品的登场角色。是主人公四条琉璃的同胞妹妹。
+https://mzh.moegirl.org.cn/.php?curid=384932
+来源:萌娘百科

kotori-plugin-github

  • /github <repository> 查询 Github 仓库信息
bash
/github kotorijs/kotori
+> 地址:kotorijs/kotori
+描述:Cross platform, decoupled, and modernized ChatBot framework base on NodeJS
+语言:TypeScript
+所有者:kotorijs
+创建时间:
+2023-06-14T11:45:16Z
+最后更新时间:2023-12-31T15:28:10Z
+最后推送时间:2024-01-14T09:48:13Z
+开源协议:GNU General Public License v3.0

kotori-plugin-music

  • /music <name> [order:number=1] 网易云点歌 序号默认为 1,填 0 显示歌曲列表
bash
/music 夢水の調べ
+> 歌曲ID:2077744375
+歌曲标题:夢水の調べ
+歌曲作者:おはる
+歌曲下载:http://music.163.com/song/media/outer/url?id=2077744375.mp3
+歌曲封面:[image]

kotori-plugin-weather

  • /weather <area> 查询城市天气
bash
/weather 北京
+> 城市:北京市
+日期:周四
+温度:-6~4℃
+天气:晴
+风度:南风-2级
+空气质量:良
+
+日期:周五
+温度:-5~0℃
+天气:阴
+风度:东风-1级
+空气质量:良
+
+日期:周六
+温度:-8~0℃
+天气:阴
+风度:东北风-1级
+空气质量:良
+ + + + \ No newline at end of file diff --git a/data.json b/data.json new file mode 100644 index 00000000..750c8f83 --- /dev/null +++ b/data.json @@ -0,0 +1,14 @@ +[ + { + "name": "@kotori-bot/kotori-plugin-adapter-onebot", + "description": "基于 Onebot 标准的 go-cqhttp 项目的适配器" + }, + { + "name": "@kotori-bot/kotori-plugin-adapter-qq", + "description": "基于 Tencent 官方 API 的适配器" + }, + { + "name": "@kotori-bot/kotori-plugin-menu", + "description": "菜单插件" + } +] diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 00000000..02f64fa5 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,81 @@ + + + + + + + + + + diff --git a/guide/adapter/adapter.html b/guide/adapter/adapter.html new file mode 100644 index 00000000..f3e0f25d --- /dev/null +++ b/guide/adapter/adapter.html @@ -0,0 +1,27 @@ + + + + + + 实现适配器类 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/adapter/api.html b/guide/adapter/api.html new file mode 100644 index 00000000..8069154a --- /dev/null +++ b/guide/adapter/api.html @@ -0,0 +1,27 @@ + + + + + + 实现接口类 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/adapter/custom.html b/guide/adapter/custom.html new file mode 100644 index 00000000..13f3511c --- /dev/null +++ b/guide/adapter/custom.html @@ -0,0 +1,27 @@ + + + + + + 自定义服务 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/adapter/database.html b/guide/adapter/database.html new file mode 100644 index 00000000..51e960a4 --- /dev/null +++ b/guide/adapter/database.html @@ -0,0 +1,27 @@ + + + + + + 数据库服务 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/adapter/elements.html b/guide/adapter/elements.html new file mode 100644 index 00000000..365bb5c1 --- /dev/null +++ b/guide/adapter/elements.html @@ -0,0 +1,27 @@ + + + + + + 实现元素类 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/base/command.html b/guide/base/command.html new file mode 100644 index 00000000..944b4b5f --- /dev/null +++ b/guide/base/command.html @@ -0,0 +1,47 @@ + + + + + + 指令注册 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

指令注册

引入

在上一节中学习了事件系统的使用,现在通过 on_message 事件实现一个小功能:

typescript
ctx.on('on_message', (session) => {
+	if (!session.message.startWith('/')) return;
+	const command = session.message.slice(1);
+	if (command === 'echo') {
+		const content = command.slice(5);
+		session.send(content ? content : '输入内容为空');
+	} else if (command === 'time') {
+		session.send(`现在的时间是 ${new Date().getTime()}`);
+	} else {
+		session.send('未知的指令');
+	}
+});

当收到「/echo xxx」消息时将发送 「xxx」;当收到「/time」消息时将发送当前时间戳;两者都不是时发送「未知的指令」。然而当结果越来越多后,if...else 语句也会越来越多,显然,这是十分糟糕的。尽管可以考虑将条件内容作为键、结果处理包装成回调函数作为值,以键值对形式装进一个对象或者 Map 中,然后遍历执行。但是当条件越来越复杂时,字符串的键远无法满足需求,同时也可能有相当一部分内容仅在私聊或者群聊下可用,其次,参数的处理也需要在结果处理内部中完成,这是十分复杂与繁琐的,因此便有入了本节内容。

基本使用

指令(Command) 是 Kotori 的核心功能,也是最常见的交互方式,指令实质是 Kotori 内部对 on_message 事件的再处理与封装,这点与下一节中将学习的中间件是一致的,因此也可以看作是一个事件处理的语法糖。通过 ctx.command() 可注册一条指令,参数为指令模板字符,返回 Command 实例对象,实例上有着若干方法用于装饰该指令,其返回值同样为当前指令的实例对象。

typescript
ctx.command('echo <...content>').action((data) => data.args.join(' '));
+ctx.command('time')
+	.action(() => {
+		const time = new Date().getTime();
+		return time;
+});

指令模板字符

typescript
ctx.command('bar');
+ctx.command('car <arg1> <arg2>');
+ctx.command('dar <arg1> [arg2] [arg3=value]');
+ctx.command('ear [arg1:number=1] [...args:string] - 指令描述');

上述演示了指令模板字符的基本格式。

  • 尖括号 <> 表示必要参数,方括号 [] 为可选参数
  • 括号内部内容格式是 参数名:参数类型,参数名应为小写字母与数字([a-z0-9])组成,参数类型可省略,默认 string,支持的类型有:stringnumberboolean
  • 可选参数中可在参数类型后添加 =值 设置默认参数
  • 参数中可在参数名前添加 ... 设置剩余参数,与 TypeScript 不同的是,剩余参数的类型不需要加上数组表示
  • 在指令模板字符最后添加 - 指令描述 设置指令描述
  • 指令内容为截止到第一个参数出现之前的字符串(不含空格)
  • 参数名应尽量语义化;剩余参数应在所有参数最后面;应仅在可选参数中设置默认参数;必要参数应在可选参数之前;指令模板字符不应包含指令前缀

指令选项

通过 Command.option() 设置指令选项,第一个参数为该选项的缩写名,第二个参数为选模板字符,可设置多个指令选项。

typescript
ctx.command('bar')
+	.options()

指令处理

通过 Command.action() 设置指令的回调函数,回调函数中第一个参数为 argsoptions 两个键组成的对象,类型分别为 (string | number | boolean)[]Record<string, string | number | boolean>,分别代表输入的参数值与选项值。每个指令仅可设置一个回调函数。

options 中的键为对应选项的全名而非缩写名。

typescript
+ + + + \ No newline at end of file diff --git a/guide/base/events.html b/guide/base/events.html new file mode 100644 index 00000000..06aa62a0 --- /dev/null +++ b/guide/base/events.html @@ -0,0 +1,90 @@ + + + + + + 事件系统 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

事件系统

事件系统(Events) 的上游是事件订阅者模式(Events Emiter),该设计模式与事件系统共同构成了 Kotori 的基础,Kotori 内部通过订阅事件保持各部分间的联系和协作任务。同时也有来自各个聊天平台的事件,通过订阅这些事件能实现丰富多样的功能。

订阅事件

事件系统的使用方法与常规的事件订阅者一致,通过 ctx.on() 订阅一个事件,第一个参数为事件名,第二个参数为回调函数,事件被触发时事件数据将作为实际参数传给回调函数。

typescript
import { MessageScope } from 'kotori-bot'
+
+// ...
+
+ctx.on('on_message', (session) => {
+	if (session.message !== '你是谁') return;
+	if (session.type === MessageScope.GROUP) {
+		session.api.sendGroupMsg('是 Kotori!', session.groupId);
+	} else {
+		session.api.sendPrivateMsg('是 Kotori!', session.userId);	
+	}
+});

从上述代码中可以看出,当收到消息时,如果不是「你是谁」则立即退出,执行完毕。如果是则判断 session.type 的值,调用相应的发送消息接口发送「是 Kotori!」。根据语义化命名可知:session.type 为消息类型,值是一个 MessageScope 枚举值,分为 「GROUP」(群聊)和「PRIVATE」(私聊);session.apiApi 的实例对象,提供了多种与聊天平台交互的接口,此处用到的 sendG丨groupMsgsendPrivateMsg 分别是发送群聊消息与发送私聊消息,第一个参数为消息内容,第二个参数分别为群聊 id 与用户 id。

id 一般为对应聊天平台提供的 id/uid,叫法不一,值类型为 string 或 number。如当你收到由适配器 @kotori-bot/kotori-plugin-adapter-onebot 发出的消息时,groupId 为 QQ 群号,userId 为 QQ 号。

上面的代码每次都需要判断消息类型再执行相应方法,显得有点繁琐,因此 kotori 提供了一个语法糖:

typescript
ctx.on('on_message', (session) => {
+	if (session.message !== '你是谁') return;
+		session.send('是 Kotori!');	
+	}
+});

使用 session.send() 只需要传入消息内容即可,消息类型判断和传入相应 id 的工作已在该方法内部完成。session 上还有不少与之类似的语法糖,将在后面章节中逐一提到,也因如此,session.send() 在实际开发中使用率并不高,因为它对后续内容而言依旧很繁琐。

取消订阅事件

正如订阅事件是「on」,取消订阅事件则是「off」。ctx.off() 的使用方法与 ctx.on() 一致。

typescript

+const handle = (session: Session['on_message']) => {
+	ctx.off('on_message', handle);
+	// ...
+}
+
+ctx.on('on_message', handle);

上述代码中,触发事件后会立即取消订阅事件,意味着它只会被触发一次。ctx.on() 在执行后会返回取消订阅自己的方法,因此可以这样简化:

typescript
const off = ctx.on('on_message', (session) => {
+	off();
+	// ...
+});

使用 ctx.once() 再进一步简化:

typescript
ctx.once('on_message', (session) => {
+	// ...
+});

工作流程与上面一致,通过 ctx.once() 订阅事件,在触发后会立即取消订阅。

使用 ctx.offAll() 取消订阅指定事件名下所有事件:

typescript
ctx.once('on_message', (session) => {
+	// ...
+});
+
+ctx.once('on_message', (session) => {
+	// ...
+});
+
+ctx.on('on_message', (session) => {
+	if (session.message === '消失吧!') return;
+		ctx.ofAll('on_message');
+	}
+});

在第三个回调函数中,当收到消息「消失吧!」时将取消订阅所有 on_message 事件。

事件类型

Kotori 中事件类型大致分为三类:

  • 系统事件(System Event):与生命周期和适配器有关的事件,回调函数中的参数名一般为 data
  • 会话事件(Session Event):与聊天平台有关的事件,回调函数中的参数名一般为 session
  • 自定义事件(Custom Event):由模块定义的事件,一般用于模块内部或多个模块间通信,参数量不固定。

系统事件

常见的系统事件有:

  • ready :当加载完所有模块时触发
  • dispose :当 Kotori 关闭时触发
  • status :当 Bot 的在线状态改变时触发

通过 status 实现 Bot 上线后自动发送消息给最高管理员:

typescript
ctx.on('status', (data) => {
+	if (data.status !== 'online') return;
+	const { api, config } = data.adapter;
+	api.sendPrivateMsg('上线了!', config.master);
+});

由于 status 是由适配器发出的系统事件,它并没有类似于会话事件中的 session.send(),因此只能使用最原始的办法发送消息。status 的事件数据中仅有两个值,一个是 data.status 表示当前在线状态(「online」或「offline」),data.adapter 为目标 Bot,Bot 上有 adapter.apiadapter.config,前者等价于会话事件中的 session.api,后者为 Bot 配置,来自于 kotori.yml

会话事件

常见的会话事件有:

  • on_message :当收到消息时触发
  • on_recall :当有消息撤回时触发
  • on_group_increase :当群人数增加时触发

通过 on_group_increase 实现群欢迎:

typescript
ctx.on('on_group_increase', (session) => {
+	session.send(`因为遇见了${session.el.at(session.userId)},我的世界才充满颜色!`);
+});

其中 session.elsession.api 类似,是 Elements 的实例对象,它提供了用于转换消息元素的接口,如 session.el.at() 传入用户 id 转换成艾特消息,session.el.image() 传入图片 URL 转换成图片消息。当然,并不是所有聊天平台都支持所有的消息元素,应以具体聊天平台为准。

自定义事件与发出事件

得益于 TypeScript 有着 声明合并(Declaration Merging) 的特性,在模块中可通过其实现自定义事件的局部声明。

typescript
declare module 'kotori-bot' {
+	interface EventsMapping {
+		custom_event1(data: string): void;
+	}
+}
+
+ctx.on('custom_event1', (data) => {
+	ctx.logger.debug(data);
+});

Kotori 中所有事件均定义在 EventsMapping 接口上。custom_event1 事件触发后将打印事件数据。ctx.logger 是一个日志打印工具,ctx.logger.debug() 意味着打印内容仅在 dev 模式下运行 Kotori 可见。然而,订阅事件后,事件却从来没有发出,因此需要发出事件:

typescript
// ...
+
+ctx.emit('custom_event1', '这是事件数据');
+ctx.emit('custom_event1', '这里也是事件数据');

ctx.emit() 第一个参数为事件名,然后为剩余参数,剩余参数与该事件参数一一对应。虽然 Kotori 中系统事件与会话事件的参数均只有一个,但是可以在自定义事件中实现任意多个参数:

typescript
declare module 'kotori-bot' {
+	interface EventsMapping {
+		custom_event2(arg1: string, arg2: number, arg3: boolean): void;
+		custom_event3(...args: any[]): void;
+	}
+}
+
+ctx.emit('custom_event2', 'string', 42, true);
+ctx.emit('custom_event3', 'string1', 'string2', 233, 2333, {value: 42});

一般地,自定义事件应只用于单个模块内部,用于多个模块间相互通信传输数据时,每个涉及模块应先加载定义自定义事件的模块,以免出现类型定义的问题。

+ + + + \ No newline at end of file diff --git a/guide/base/middleware.html b/guide/base/middleware.html new file mode 100644 index 00000000..1dc56524 --- /dev/null +++ b/guide/base/middleware.html @@ -0,0 +1,27 @@ + + + + + + 中间件 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/base/regexp.html b/guide/base/regexp.html new file mode 100644 index 00000000..a3927985 --- /dev/null +++ b/guide/base/regexp.html @@ -0,0 +1,27 @@ + + + + + + 正则匹配 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/base/schedule.html b/guide/base/schedule.html new file mode 100644 index 00000000..0ed6fc10 --- /dev/null +++ b/guide/base/schedule.html @@ -0,0 +1,27 @@ + + + + + + 计划任务 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/extend/database.html b/guide/extend/database.html new file mode 100644 index 00000000..75466e27 --- /dev/null +++ b/guide/extend/database.html @@ -0,0 +1,27 @@ + + + + + + 数据库 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/extend/filter.html b/guide/extend/filter.html new file mode 100644 index 00000000..40bf74e8 --- /dev/null +++ b/guide/extend/filter.html @@ -0,0 +1,27 @@ + + + + + + 滤器 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/extend/i18n.html b/guide/extend/i18n.html new file mode 100644 index 00000000..6d70964b --- /dev/null +++ b/guide/extend/i18n.html @@ -0,0 +1,27 @@ + + + + + + 国际化 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/extend/internal.html b/guide/extend/internal.html new file mode 100644 index 00000000..5682f131 --- /dev/null +++ b/guide/extend/internal.html @@ -0,0 +1,27 @@ + + + + + + 内部接口 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/extend/logger.html b/guide/extend/logger.html new file mode 100644 index 00000000..bff1a42d --- /dev/null +++ b/guide/extend/logger.html @@ -0,0 +1,27 @@ + + + + + + 日志打印 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/extend/tools.html b/guide/extend/tools.html new file mode 100644 index 00000000..7ddaa89a --- /dev/null +++ b/guide/extend/tools.html @@ -0,0 +1,27 @@ + + + + + + 工具函数 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/modules/context.html b/guide/modules/context.html new file mode 100644 index 00000000..4aab8d65 --- /dev/null +++ b/guide/modules/context.html @@ -0,0 +1,27 @@ + + + + + + 上下文 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/modules/lifecycle.html b/guide/modules/lifecycle.html new file mode 100644 index 00000000..07dfd22f --- /dev/null +++ b/guide/modules/lifecycle.html @@ -0,0 +1,27 @@ + + + + + + 生命周期 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/modules/plugin.html b/guide/modules/plugin.html new file mode 100644 index 00000000..ba8acc3a --- /dev/null +++ b/guide/modules/plugin.html @@ -0,0 +1,27 @@ + + + + + + 插件范式 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/modules/schema.html b/guide/modules/schema.html new file mode 100644 index 00000000..ad81ccd3 --- /dev/null +++ b/guide/modules/schema.html @@ -0,0 +1,27 @@ + + + + + + 动态检查 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/modules/service.html b/guide/modules/service.html new file mode 100644 index 00000000..72eb84a5 --- /dev/null +++ b/guide/modules/service.html @@ -0,0 +1,27 @@ + + + + + + 依赖与服务 | Kotori + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/nav.html b/guide/nav.html new file mode 100644 index 00000000..46c090c4 --- /dev/null +++ b/guide/nav.html @@ -0,0 +1,27 @@ + + + + + + 前言 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

前言

TIP

阅读本章前请确保你已阅读完毕 使用指南

前置要求

拥有一定的 JavaScript 与 Node.js 知识基础。

Kotori 运行于 Node.js 环境,因此开发 Kotori 模块前掌握 JavaScript 与 Node.js 基础内容是必然的。此处推荐几个文档:

基于 TypeScript 与现代化 ECMAScript 开发。

TypeScript 是 JavaScript 的超集,TypeScript 在继承了 JavaScript 全部特性的同时,为弱类型动态语言的 JavaScript 提供了一个独立且强大的类型系统。同时,使用 TypeScript 基本意味着使用 ESModule 与现代化的 JavaScript 语法与规范,这是 Kotori 三大特点之一。理论上在 Kotori 程序的生产环境中可正常运行由 JavaScript 直接编写的模块,但 Kotori 本身便使用 TypeScript 开发,因此更推荐你使用 TypeScript 用于你的模块开发,尽管这并不是必须的。

读后

  • 接口文档 用于全面了解与查阅 Kotori 提供的所有公开 API。
  • 深入了解 Kotori 的开发历程、版本记录、运行流程、设计构思、设计参考等。
+ + + + \ No newline at end of file diff --git a/guide/start/environment.html b/guide/start/environment.html new file mode 100644 index 00000000..8966607c --- /dev/null +++ b/guide/start/environment.html @@ -0,0 +1,27 @@ + + + + + + 环境搭建 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

环境搭建

Node.js & pnpm

使用指南 中你已安装并部署了 Node.js 环境与 pnpm,此处不再赘述。

Git & GitHub

Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。版本控制可方便的实现协作开发、版本回退等,其重要性对每一位开发者都是不言而喻。GitHub 是一个面向开源及私有软件项目的托管平台,拥有着全球最大的开源社区,使用 Git 可轻松将你的项目推送至 GitHub 远程仓库,你与你的项目也将成为开源社区的一份子。Git 与 GitHub 具体使用流程此处不逐一赘述。

IDE & Editor

显然 Kotori 并不属于 Web 前端的范畴,但依旧隶属于 JavaScript 生态,因此推荐 世界上最好的 Web 开发 IDE 「Visual Studio Code」(以下简称「VSC」)。虽然 VSC 本质上只是文本编辑器,但因其强大的扩展商店使其能做到大部分 IDE 的功能,当然你也可以根据你的喜好选择,如:

  • WebStorm
+ + + + \ No newline at end of file diff --git a/guide/start/publish.html b/guide/start/publish.html new file mode 100644 index 00000000..2bbcb55f --- /dev/null +++ b/guide/start/publish.html @@ -0,0 +1,59 @@ + + + + + + 模块发布 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

模块发布

当开发完毕模块后,可以将它发布至社区,一个 Kotori 模块一般会同时发布到如下三个平台:

  • npmjs.org
  • Kotori 模块中心
  • 开源社区:GitHub 优先级(重要程度):npm > 模块中心 > 开源社区。每一个公开的 Kotori 模块都应发布至 npm 并作为模块的主要获取途径。Kotori 使用 GPL-3.0 协议,该协议要求 Kotori 的所有模块及其二次开发项目也必须使用 GPL-3.0 协议且开源,因此发布到开源社区是必要的,开源行为本身也是一种无私奉献、共享知识和回馈社区的体现。

构建产物

「构建产物」在 JavaScript 生态中指将源码(Kotori 模块开发中一般为 TypeScript 文件)进行处理以适用于生产环境中(处理过程一般有 TypeScript 转为 JavaScript、向下兼容语法、压缩代码等)。JavaScript 生态中构建工具非常多,你可以选择喜欢的构建工具并自习配置,当然如果你对此并不了解也可以使用 Kotori 默认的构建方式(通过TypeScript 自带的 tsc 程序),在你的模块根目录中输入以下指令:

bash
pnpm build

一般地,你将会发现在模块根目录出现了一个 lib 文件夹,这在上一节已有提到,它是构建产物的输出目录,有必要的话可在 tsconfig.json 文件中更改:

json
{
+	// ...
+  "compilerOptions": {
+    "rootDir": "./src", // 输入目录
+    "outDir": "./lib" // 输出目录
+    // ...
+  }
+}

关于 tsconfig.json 的更多内容:TypeScript Documentation

文件忽略

对于模块发布主要分为发布构建产物(publish)与发布源码(push),两种情况下需要发布的文件内容会有些许不同,因此便引入了「文件忽略」。

.npmignore

用于指定在使用 publish 时忽略的文件与文件夹,在模块根目录创建一个 .npmignore 文件:

int
node_modules
+src
+test
+
+tsconfig.json
+!README.md

实际上在 publish 时只需要附带少数文件即可,而 .npmignore 采用的是黑名单机制显得很繁琐,因此 Kotori 模块的默认模板中并未使用该方式也并不推荐。

package.files

在上一节的 package.json 示例中会发现有一个以字符串数组为值的 files 配置项,其用于指定在使用 publish 时需要附带的文件与文件夹。

typescript
{
+	"files": ["lib", "LICENSE", "README.md"],
+}

files 配置项优先级高于 .npmignore,其直接写在 package.json 中显得十分简洁也会减少整个模块目录的文件冗余。

.gitignore

不同于前两者,.gitignore 用于指定在使用 Git 进行 push 时需要忽略的文件,语法与 .npmignore 类似,同样位于模块根目录:

ini
node_modules
+dist
+lib
+.husky/_
+
+.vscode/*
+.vs/*
+!.vscode/extensions.json
+
+*.tgz
+tsconfig.tsbuildinfo
+*.log
+
+kotori.dev.yml

发布构建产物

使用工作区开发时,需确保当前为待发布模块根目录。首先检查 npm 源是否为 http://registry.npmjs.org

bash
npm config get registry
+# If not:
+# npm config set registry=http://registry.npmjs.org

前往 npmjs.org 注册账号,然后根据提示在浏览器内登录:

bash
npm login

当一切就绪时:

bash
npm publish

一般地,访问 npm 个人页即可查看刚才发布的插件: kotori-plugin-my-project

发布源码

使用 Git 前务必先配置好你的账号、邮箱和与 GitHub 通信的 ssh,可参考 手把手教你配置 git 和 git 仓库 。使用工作区开发时,可选择发布整个工作区也可仅发布单个模块,切换到相应的目录即可。首先在 GitHub New 页面创建一个远程仓库,接着在本地仓库中关联到该远程仓库:

bash
git remote add origin git@github.com:kotorijs/kotori-plugin-my-project

提交并推送至远程仓库

bash
git add .
+git commit -m 'feat: create a project'
+git push origin master

当然,你也可以为本次提交添加一个 tag:

bash
git tag v1.0.0
+git push --tags

收录至模块市场

该内容待更新....

放在最后

+ + + + \ No newline at end of file diff --git a/guide/start/setup.html b/guide/start/setup.html new file mode 100644 index 00000000..18955d42 --- /dev/null +++ b/guide/start/setup.html @@ -0,0 +1,153 @@ + + + + + + 项目构建 | Kotori + + + + + + + + + + + + + + + + +
Skip to content

项目构建

基于 create-kotori 直接构建

create-kotori」是专用于构建 Kotori 模块的 Cli 工具。

  • 命令语法:create-kotori <project-name>
bash
pnpm init kotori@latest my-project

除此之外,也可以将其安装在全局使用:

bash
npm install create-kotori -g
+create-kotori my-project

基于 Kotori 源码构建

亦称为「工作区开发」,该方法适用于有一定 Node.js 开发经验的开发者,并不推荐新人使用。使用该方法可同时开发多个插件,也可在开发当前插件时安装使用其它插件,同时可以便捷的修改与调试 Kotori 源码并进行二次开发。使用 Git 直接克隆 Kotorijs/kotori 仓库的源码:

bash
git clone https://github.com/kotorijs/kotori.git

此处默认克隆的是主分支下的代码,也可以选择克隆 dev 分支,该内容将在 进阶开发中 详细说明。进入根目录并使用 pnpm 安装依赖:

bash
cd ./kotori-bot-master
+pnpm install

./modules/ 目录下使用 create-kotori 创建一个模块:

bash
cd ./modules/
+pnpm init kotori@latest my-project
+cd ./my-project/

项目结构

text
my-project
+├── kotori.yml
+├── package.json
+├── tsconfig.json
+├── LICENSE
+├── README.md
+├── .gitignore
+├── node_modules
+├── lib
+│   ├── index.js
+│   ├── index.d.ts
+│   ├── ...
+├── locales
+│   ├── en_US.json
+│   ├── ja_JP.json
+│   ├── zh_CN.json
+│ └── zh_TW.json
+└── src
+    ├── config.ts
+    ├── index.ts
+    ├── types.ts

kotori.yml 仅在直接构建时存在于模块根目录,工作区开发下将位于工作区的根目录。

  • kotori.yml Kotori 配置文件
  • kotori.dev.yml Kotori Dev 模式下配置文件
  • package.json 包信息文件
  • tsconfig.json TypeScript 配置文件
  • LICENSE 协议文件
  • README.md 自述文件
  • .gitignore git 忽略文件
  • lib 构建产物输出目录(前端为 dist,后端为 lib
  • locales 国际化文件夹,将在后面的章节中讲解
  • src 工程文件夹,代码存放处
    • cofig.ts 默认配置数据文件
    • index.ts 整个模块的入口文件
    • types.ts 公共类型文件

package.json

以下为默认创建的 package.json

json
{
+  "name": "kotori-plugin-my-project",
+  "version": "1.0.0",
+  "description": "This is my first Kotori plugin",
+  "main": "lib/.js",
+  "scripts": {
+    "build": "tsc --build"
+  },
+  "license": "GPL-3.0",
+  "keywords": ["kotori-plugin"],
+  "files": ["lib", "LICENSE", "README.md"],
+  "peerDependencies": {
+    "kotori-bot": "1.1.0"
+  }
+}

添加一些非必要配置项以完善包信息:

json
{
+  "author": "Himeno <biyuehuya@gmail.com>",
+  "bugs": {
+    "url": "https://github.com/kotorijs/my-project/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/kotorijs/my-project.git"
+  },
+  "homepage": "https://github.com/kotorijs/my-project/"
+}

添加用于传给 Kotori 的元数据:

json
{
+  "kotori": {
+    "enforce": "pre",
+    "meta": {
+      "languages": ["en_US", "ja_JP", "zh_TW", "zh_CN"]
+    }
+  }
+}

一个合法的 Kotori 模块其 package.json 需要满足一系列来自 Kotori 的约定,Kotori 程序只有在其合法时才会加载该模块。不过当前你无需关心这个问题,元数据与 package.json 约定将放在「模块化」章节中讲解。以下是该 package.json 的完整效果:

json
{
+    "name": "kotori-plugin-my-project",
+    "version": "1.0.0",
+    "description": "This is my first Kotori plugin",
+    "main": "lib/.js",
+    "scripts": {
+        "build": "tsc --build"
+    },
+    "license": "GPL-3.0",
+    "keywords": [
+        "kotori-plugin"
+    ],
+    "files": [
+        "lib",
+        "LICENSE",
+        "README.md"
+    ],
+    ,
+    "peerDependencies": {
+        "kotori-bot": "1.1.0"
+    },
+    "author": "Himeno <biyuehuya@gmail.com>",
+    "bugs": {
+        "url": "https://github.com/kotorijs/my-project/issues"
+    },
+    "repository": {
+        "type": "git",
+        "url": "git+https://github.com/kotorijs/my-project.git"
+    },
+    "homepage": "https://github.com/kotorijs/my-project/",
+    "kotori": {
+        "enforce": "pre",
+        "meta": {
+            "languages": [
+                "en_US",
+                "ja_JP",
+                "zh_TW",
+                "zh_CN"
+            ]
+        }
+    }
+}

关于 package.json 的默认配置项与更多信息请参考 npm Docs

index.ts

以下为默认创建的 index.ts,当前你还无需理解其具体含义:

typescript
import type { Context } from 'kotori-bot';
+import config from './config.ts';
+import types from './types.ts';
+
+export function main(ctx: Context) {
+  ctx
+    .command('echo <content> [num:number=3]')
+    .action((data, message) => {
+      ctx.logger.debug(data, data.args[0]);
+      ctx.logger.debug(message);
+      return [
+        `返回消息:~%message%`,
+        {
+          message: data.args[0],
+        },
+      ];
+    })
+    .alias('print')
+    .scope('group');
+
+  ctx.regexp(/^(.*)#print$/, match => match[1]);
+
+  ctx.command('ison').action((_, events) => {
+    if (events.api.adapter.config.master === events.userId) return `在的哟主人~`;
+    return '你是...谁?';
+  });
+}

模块测试

在入门教程中提到过使用「@kotori-bot/kotori-plugin-adapter-cmd」适配器可以在命令行中测试指令,但命令行本身仅支持纯文字交互因此并不友好也不便于开发者调试。同样的,Kotori 已默认安装「@kotori-bot/kotori-plugin-adapter-sandbox」适配器,它提供了一个极为方便、全面的机器人沙盒测试环境,只需在 kotori.yml 中设置该适配器即可:

yaml
adapter:
+ developer:
+  extends: sandbox
+  master: 1
+  port: 2333

运行模式

运行模式分为 「生产模式(Build)」与「开发模式(Dev)」两种:

  • Build 模式将显示更少的日志输出,有利于减少不必要信息方便用户使用;Dev 模式会有详尽的错误日志与开发日志输出,有利于开发者快速找到问题。
  • Build 模式有更牢固的错误捕获与进程守护,长期运行更加稳定;Dev 模式下在遇到某些关键性错误时会退出整个 Kotori 程序。
  • Dev 模式会有实时的代码文件变动监听与模块自动重载(热更新),为开发者提供犹如前端开发般的便捷体验。
  • Dev 模式能够直接运行 TypeScript 文件,在加载模块时会优先检测模块文件夹内是否有 src/.ts
  • Build 模式下读取 kotori.yml,Dev 模式下读取 kotori.dev.yml,两者用法与实际效果均一致,旨在区分不同模式下不同配置。

从 Dev 模式下启动 Kotori:

bash
pnpm dev

在浏览器中打开 http://localhost:2333 即可进入沙盒环境,输入 /echo Hello,Kotori! 以查看效果:

show

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 00000000..6a6ff36e --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"guide_nav.md":"DNOOSt65","basic_start.md":"BcMzOQtP","guide_adapter_custom.md":"CfwlDg0J","basic_config.md":"Df_mXSQf","basic_usage.md":"CgIyI17j","guide_adapter_adapter.md":"CPaS6z3t","guide_adapter_api.md":"hdpKQFFf","basic_introduce.md":"Dwzi7PBK","guide_start_publish.md":"yDVLNJhc","guide_adapter_database.md":"Ci773K7V","guide_adapter_elements.md":"DPNHKdQ5","advanced_index.md":"Dxlz8-x0","guide_modules_lifecycle.md":"CtUUVpzs","guide_base_events.md":"D1LHe1qC","guide_modules_schema.md":"D2O0zqIT","guide_base_command.md":"CvTXbNFZ","guide_base_regexp.md":"5V-1qgk-","guide_extend_database.md":"CNO_RCKh","index.md":"JPAfID5X","guide_base_schedule.md":"Bgo9T4LD","guide_base_middleware.md":"PKeNh_IF","guide_modules_context.md":"BqjfvHTT","guide_extend_tools.md":"DvrPWCpH","modules_index.md":"CS1b5-RE","guide_extend_logger.md":"BgYPW8uO","guide_start_environment.md":"DvzuNbxb","guide_start_setup.md":"0v96gqG3","guide_extend_internal.md":"Be4CBysu","guide_extend_i18n.md":"DZqqnwvM","guide_modules_service.md":"f93Srqk2","basic_modules.md":"BM1hIfQJ","guide_modules_plugin.md":"DId8fkF7","api_index.md":"D6BHDtnL","guide_extend_filter.md":"CWzl_4Ib"} diff --git a/index.html b/index.html new file mode 100644 index 00000000..98bcb3da --- /dev/null +++ b/index.html @@ -0,0 +1,27 @@ + + + + + + Kotori + + + + + + + + + + + + + + + + +
Skip to content

小鳥 · KotoriBot

基于 NodeJS + TypeScript 的聊天机器人框架

KotoriBot
+ + + + \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 00000000..2bc3c132 Binary files /dev/null and b/logo.png differ diff --git a/modules/index.html b/modules/index.html new file mode 100644 index 00000000..80107007 --- /dev/null +++ b/modules/index.html @@ -0,0 +1,27 @@ + + + + + + Kotori + + + + + + + + + + + + + + + + +
Skip to content

最后更新:

+ + + + \ No newline at end of file