diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..1fa3a16 --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ + + + + + + 404 | Satori + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..1ee87ba --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +satori.js.org diff --git a/assets/app.Bwm5ngVj.js b/assets/app.Bwm5ngVj.js new file mode 100644 index 0000000..5bbca41 --- /dev/null +++ b/assets/app.Bwm5ngVj.js @@ -0,0 +1 @@ +import{R as p}from"./chunks/theme.D83hjUQE.js";import{a2 as o,a8 as u,a9 as l,aa as c,ab as f,ac as d,ad as m,ae as h,af as g,ag as A,ah as P,e as v,G as w,o as y,M as C,ai as R,aj as b,ak as E,al as S}from"./chunks/framework.K8kzz9Vz.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(p),T=v({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(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function j(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(l,e);const t=c(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),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:h}),{app:a,router:e,data:t}}function D(){return g(T)}function _(){let e=o,a;return A(t=>{let n=P(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&j().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{j as createApp}; diff --git a/assets/chunks/framework.K8kzz9Vz.js b/assets/chunks/framework.K8kzz9Vz.js new file mode 100644 index 0000000..6be28e7 --- /dev/null +++ b/assets/chunks/framework.K8kzz9Vz.js @@ -0,0 +1,18 @@ +/** +* @vue/shared v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function As(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Z={},xt=[],Ue=()=>{},Eo=()=>!1,Jt=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Rs=e=>e.startsWith("onUpdate:"),le=Object.assign,Os=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Co=Object.prototype.hasOwnProperty,z=(e,t)=>Co.call(e,t),B=Array.isArray,St=e=>Tn(e)==="[object Map]",jr=e=>Tn(e)==="[object Set]",q=e=>typeof e=="function",re=e=>typeof e=="string",Ye=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",Vr=e=>(ne(e)||q(e))&&q(e.then)&&q(e.catch),Ur=Object.prototype.toString,Tn=e=>Ur.call(e),To=e=>Tn(e).slice(8,-1),Br=e=>Tn(e)==="[object Object]",Ms=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Et=As(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),An=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ao=/-(\w)/g,Le=An(e=>e.replace(Ao,(t,n)=>n?n.toUpperCase():"")),Ro=/\B([A-Z])/g,st=An(e=>e.replace(Ro,"-$1").toLowerCase()),Rn=An(e=>e.charAt(0).toUpperCase()+e.slice(1)),hn=An(e=>e?`on${Rn(e)}`:""),et=(e,t)=>!Object.is(e,t),qn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Oo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Mo=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let Js;const On=()=>Js||(Js=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Is(e){if(B(e)){const t={};for(let n=0;n{if(n){const s=n.split(Lo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function Ls(e){let t="";if(re(e))t=e;else if(B(e))for(let n=0;n!!(e&&e.__v_isRef===!0),Do=e=>re(e)?e:e==null?"":B(e)||ne(e)&&(e.toString===Ur||!q(e.toString))?Kr(e)?Do(e.value):JSON.stringify(e,qr,2):String(e),qr=(e,t)=>Kr(t)?qr(e,t.value):St(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[Gn(s,i)+" =>"]=r,n),{})}:jr(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Gn(n))}:Ye(t)?Gn(t):ne(t)&&!B(t)&&!Br(t)?String(t):t,Gn=(e,t="")=>{var n;return Ye(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let be;class $o{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=be,!t&&be&&(this.index=(be.scopes||(be.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(Dt){let t=Dt;for(Dt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Ht;){let t=Ht;for(Ht=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function zr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Qr(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),Fs(s),Vo(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function hs(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Zr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Zr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ut))return;e.globalVersion=Ut;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!hs(e)){e.flags&=-3;return}const n=te,s=Ne;te=e,Ne=!0;try{zr(e);const r=e.fn(e._value);(t.version===0||et(r,e._value))&&(e._value=r,t.version++)}catch(r){throw t.version++,r}finally{te=n,Ne=s,Qr(e),e.flags&=-3}}function Fs(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Fs(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Vo(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ne=!0;const ei=[];function rt(){ei.push(Ne),Ne=!1}function it(){const e=ei.pop();Ne=e===void 0?!0:e}function zs(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Ut=0;class Uo{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Mn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!te||!Ne||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new Uo(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,ti(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=s)}return n}trigger(t){this.version++,Ut++,this.notify(t)}notify(t){Ps();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ns()}}}function ti(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)ti(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const vn=new WeakMap,dt=Symbol(""),ps=Symbol(""),Bt=Symbol("");function me(e,t,n){if(Ne&&te){let s=vn.get(e);s||vn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new Mn),r.map=s,r.key=n),r.track()}}function Ke(e,t,n,s,r,i){const o=vn.get(e);if(!o){Ut++;return}const l=c=>{c&&c.trigger()};if(Ps(),t==="clear")o.forEach(l);else{const c=B(e),u=c&&Ms(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,v)=>{(v==="length"||v===Bt||!Ye(v)&&v>=a)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(Bt)),t){case"add":c?u&&l(o.get("length")):(l(o.get(dt)),St(e)&&l(o.get(ps)));break;case"delete":c||(l(o.get(dt)),St(e)&&l(o.get(ps)));break;case"set":St(e)&&l(o.get(dt));break}}Ns()}function Bo(e,t){const n=vn.get(e);return n&&n.get(t)}function _t(e){const t=J(e);return t===e?t:(me(t,"iterate",Bt),Ie(e)?t:t.map(ye))}function In(e){return me(e=J(e),"iterate",Bt),e}const ko={__proto__:null,[Symbol.iterator](){return Xn(this,Symbol.iterator,ye)},concat(...e){return _t(this).concat(...e.map(t=>B(t)?_t(t):t))},entries(){return Xn(this,"entries",e=>(e[1]=ye(e[1]),e))},every(e,t){return Be(this,"every",e,t,void 0,arguments)},filter(e,t){return Be(this,"filter",e,t,n=>n.map(ye),arguments)},find(e,t){return Be(this,"find",e,t,ye,arguments)},findIndex(e,t){return Be(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Be(this,"findLast",e,t,ye,arguments)},findLastIndex(e,t){return Be(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Be(this,"forEach",e,t,void 0,arguments)},includes(...e){return Jn(this,"includes",e)},indexOf(...e){return Jn(this,"indexOf",e)},join(e){return _t(this).join(e)},lastIndexOf(...e){return Jn(this,"lastIndexOf",e)},map(e,t){return Be(this,"map",e,t,void 0,arguments)},pop(){return Lt(this,"pop")},push(...e){return Lt(this,"push",e)},reduce(e,...t){return Qs(this,"reduce",e,t)},reduceRight(e,...t){return Qs(this,"reduceRight",e,t)},shift(){return Lt(this,"shift")},some(e,t){return Be(this,"some",e,t,void 0,arguments)},splice(...e){return Lt(this,"splice",e)},toReversed(){return _t(this).toReversed()},toSorted(e){return _t(this).toSorted(e)},toSpliced(...e){return _t(this).toSpliced(...e)},unshift(...e){return Lt(this,"unshift",e)},values(){return Xn(this,"values",ye)}};function Xn(e,t,n){const s=In(e),r=s[t]();return s!==e&&!Ie(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const Wo=Array.prototype;function Be(e,t,n,s,r,i){const o=In(e),l=o!==e&&!Ie(e),c=o[t];if(c!==Wo[t]){const h=c.apply(e,i);return l?ye(h):h}let u=n;o!==e&&(l?u=function(h,v){return n.call(this,ye(h),v,e)}:n.length>2&&(u=function(h,v){return n.call(this,h,v,e)}));const a=c.call(o,u,s);return l&&r?r(a):a}function Qs(e,t,n,s){const r=In(e);let i=n;return r!==e&&(Ie(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,ye(l),c,e)}),r[t](i,...s)}function Jn(e,t,n){const s=J(e);me(s,"iterate",Bt);const r=s[t](...n);return(r===-1||r===!1)&&$s(n[0])?(n[0]=J(n[0]),s[t](...n)):r}function Lt(e,t,n=[]){rt(),Ps();const s=J(e)[t].apply(e,n);return Ns(),it(),s}const Ko=As("__proto__,__v_isRef,__isVue"),ni=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ye));function qo(e){Ye(e)||(e=String(e));const t=J(this);return me(t,"has",e),t.hasOwnProperty(e)}class si{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;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?nl:li:i?oi:ii).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=B(t);if(!r){let c;if(o&&(c=ko[n]))return c;if(n==="hasOwnProperty")return qo}const l=Reflect.get(t,n,ae(t)?t:s);return(Ye(n)?ni.has(n):Ko(n))||(r||me(t,"get",n),i)?l:ae(l)?o&&Ms(n)?l:l.value:ne(l)?r?Pn(l):Ln(l):l}}class ri extends si{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=yt(i);if(!Ie(s)&&!yt(s)&&(i=J(i),s=J(s)),!B(t)&&ae(i)&&!ae(s))return c?!1:(i.value=s,!0)}const o=B(t)&&Ms(n)?Number(n)e,tn=e=>Reflect.getPrototypeOf(e);function zo(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=St(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),a=n?gs:t?ms:ye;return!t&&me(i,"iterate",c?ps:dt),{next(){const{value:h,done:v}=u.next();return v?{value:h,done:v}:{value:l?[a(h[0]),a(h[1])]:a(h),done:v}},[Symbol.iterator](){return this}}}}function nn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Qo(e,t){const n={get(r){const i=this.__v_raw,o=J(i),l=J(r);e||(et(r,l)&&me(o,"get",r),me(o,"get",l));const{has:c}=tn(o),u=t?gs:e?ms:ye;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&me(J(r),"iterate",dt),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=J(i),l=J(r);return e||(et(r,l)&&me(o,"has",r),me(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=J(l),u=t?gs:e?ms:ye;return!e&&me(c,"iterate",dt),l.forEach((a,h)=>r.call(i,u(a),u(h),o))}};return le(n,e?{add:nn("add"),set:nn("set"),delete:nn("delete"),clear:nn("clear")}:{add(r){!t&&!Ie(r)&&!yt(r)&&(r=J(r));const i=J(this);return tn(i).has.call(i,r)||(i.add(r),Ke(i,"add",r,r)),this},set(r,i){!t&&!Ie(i)&&!yt(i)&&(i=J(i));const o=J(this),{has:l,get:c}=tn(o);let u=l.call(o,r);u||(r=J(r),u=l.call(o,r));const a=c.call(o,r);return o.set(r,i),u?et(i,a)&&Ke(o,"set",r,i):Ke(o,"add",r,i),this},delete(r){const i=J(this),{has:o,get:l}=tn(i);let c=o.call(i,r);c||(r=J(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&Ke(i,"delete",r,void 0),u},clear(){const r=J(this),i=r.size!==0,o=r.clear();return i&&Ke(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=zo(r,e,t)}),n}function Hs(e,t){const n=Qo(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(z(n,r)&&r in s?n:s,r,i)}const Zo={get:Hs(!1,!1)},el={get:Hs(!1,!0)},tl={get:Hs(!0,!1)};const ii=new WeakMap,oi=new WeakMap,li=new WeakMap,nl=new WeakMap;function sl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function rl(e){return e.__v_skip||!Object.isExtensible(e)?0:sl(To(e))}function Ln(e){return yt(e)?e:Ds(e,!1,Yo,Zo,ii)}function il(e){return Ds(e,!1,Jo,el,oi)}function Pn(e){return Ds(e,!0,Xo,tl,li)}function Ds(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=rl(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function ht(e){return yt(e)?ht(e.__v_raw):!!(e&&e.__v_isReactive)}function yt(e){return!!(e&&e.__v_isReadonly)}function Ie(e){return!!(e&&e.__v_isShallow)}function $s(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function pn(e){return!z(e,"__v_skip")&&Object.isExtensible(e)&&kr(e,"__v_skip",!0),e}const ye=e=>ne(e)?Ln(e):e,ms=e=>ne(e)?Pn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function de(e){return ai(e,!1)}function ci(e){return ai(e,!0)}function ai(e,t){return ae(e)?e:new ol(e,t)}class ol{constructor(t,n){this.dep=new Mn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:ye(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ie(t)||yt(t);t=s?t:J(t),et(t,n)&&(this._rawValue=t,this._value=s?t:ye(t),this.dep.trigger())}}function fi(e){return ae(e)?e.value:e}const ll={get:(e,t,n)=>t==="__v_raw"?e:fi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function ui(e){return ht(e)?e:new Proxy(e,ll)}class cl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Mn,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function al(e){return new cl(e)}class fl{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Bo(J(this._object),this._key)}}class ul{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function dl(e,t,n){return ae(e)?e:q(e)?new ul(e):ne(e)&&arguments.length>1?hl(e,t,n):de(e)}function hl(e,t,n){const s=e[t];return ae(s)?s:new fl(e,t,n)}class pl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Mn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ut-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return Jr(this,!0),!0}get value(){const t=this.dep.track();return Zr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function gl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new pl(s,r,n)}const sn={},_n=new WeakMap;let ft;function ml(e,t=!1,n=ft){if(n){let s=_n.get(n);s||_n.set(n,s=[]),s.push(e)}}function yl(e,t,n=Z){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=p=>r?p:Ie(p)||r===!1||r===0?qe(p,1):qe(p);let a,h,v,x,L=!1,O=!1;if(ae(e)?(h=()=>e.value,L=Ie(e)):ht(e)?(h=()=>u(e),L=!0):B(e)?(O=!0,L=e.some(p=>ht(p)||Ie(p)),h=()=>e.map(p=>{if(ae(p))return p.value;if(ht(p))return u(p);if(q(p))return c?c(p,2):p()})):q(e)?t?h=c?()=>c(e,2):e:h=()=>{if(v){rt();try{v()}finally{it()}}const p=ft;ft=a;try{return c?c(e,3,[x]):e(x)}finally{ft=p}}:h=Ue,t&&r){const p=h,A=r===!0?1/0:r;h=()=>qe(p(),A)}const G=Gr(),U=()=>{a.stop(),G&&G.active&&Os(G.effects,a)};if(i&&t){const p=t;t=(...A)=>{p(...A),U()}}let W=O?new Array(e.length).fill(sn):sn;const g=p=>{if(!(!(a.flags&1)||!a.dirty&&!p))if(t){const A=a.run();if(r||L||(O?A.some(($,j)=>et($,W[j])):et(A,W))){v&&v();const $=ft;ft=a;try{const j=[A,W===sn?void 0:O&&W[0]===sn?[]:W,x];c?c(t,3,j):t(...j),W=A}finally{ft=$}}}else a.run()};return l&&l(g),a=new Yr(h),a.scheduler=o?()=>o(g,!1):g,x=p=>ml(p,!1,a),v=a.onStop=()=>{const p=_n.get(a);if(p){if(c)c(p,4);else for(const A of p)A();_n.delete(a)}},t?s?g(!0):W=a.run():o?o(g.bind(null,!0),!0):a.run(),U.pause=a.pause.bind(a),U.resume=a.resume.bind(a),U.stop=U,U}function qe(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,ae(e))qe(e.value,t,n);else if(B(e))for(let s=0;s{qe(s,t,n)});else if(Br(e)){for(const s in e)qe(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&qe(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function zt(e,t,n,s){try{return s?e(...s):e()}catch(r){Nn(r,t,n)}}function He(e,t,n,s){if(q(e)){const r=zt(e,t,n,s);return r&&Vr(r)&&r.catch(i=>{Nn(i,t,n)}),r}if(B(e)){const r=[];for(let i=0;i>>1,r=we[s],i=kt(r);i=kt(n)?we.push(e):we.splice(_l(t),0,e),e.flags|=1,hi()}}function hi(){bn||(bn=di.then(pi))}function bl(e){B(e)?Ct.push(...e):ze&&e.id===-1?ze.splice(wt+1,0,e):e.flags&1||(Ct.push(e),e.flags|=1),hi()}function Zs(e,t,n=je+1){for(;nkt(n)-kt(s));if(Ct.length=0,ze){ze.push(...t);return}for(ze=t,wt=0;wte.id==null?e.flags&2?-1:1/0:e.id;function pi(e){try{for(je=0;je{s._d&&ur(-1);const i=xn(t);let o;try{o=e(...r)}finally{xn(i),s._d&&ur(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function za(e,t){if(ce===null)return e;const n=Bn(ce),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,Qe=Symbol("_leaveCb"),rn=Symbol("_enterCb");function Sl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ot(()=>{e.isMounted=!0}),Ci(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],yi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},vi=e=>{const t=e.subTree;return t.component?vi(t.component):t},El={name:"BaseTransition",props:yi,setup(e,{slots:t}){const n=Un(),s=Sl();return()=>{const r=t.default&&wi(t.default(),!0);if(!r||!r.length)return;const i=_i(r),o=J(e),{mode:l}=o;if(s.isLeaving)return zn(i);const c=er(i);if(!c)return zn(i);let u=ys(c,o,s,n,h=>u=h);c.type!==ve&&Wt(c,u);let a=n.subTree&&er(n.subTree);if(a&&a.type!==ve&&!ut(c,a)&&vi(n).type!==ve){let h=ys(a,o,s,n);if(Wt(a,h),l==="out-in"&&c.type!==ve)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},zn(i);l==="in-out"&&c.type!==ve?h.delayLeave=(v,x,L)=>{const O=bi(s,a);O[String(a.key)]=a,v[Qe]=()=>{x(),v[Qe]=void 0,delete u.delayedLeave,a=void 0},u.delayedLeave=()=>{L(),delete u.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function _i(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ve){t=n;break}}return t}const Cl=El;function bi(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 ys(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:v,onLeave:x,onAfterLeave:L,onLeaveCancelled:O,onBeforeAppear:G,onAppear:U,onAfterAppear:W,onAppearCancelled:g}=t,p=String(e.key),A=bi(n,e),$=(I,_)=>{I&&He(I,s,9,_)},j=(I,_)=>{const P=_[1];$(I,_),B(I)?I.every(b=>b.length<=1)&&P():I.length<=1&&P()},K={mode:o,persisted:l,beforeEnter(I){let _=c;if(!n.isMounted)if(i)_=G||c;else return;I[Qe]&&I[Qe](!0);const P=A[p];P&&ut(e,P)&&P.el[Qe]&&P.el[Qe](),$(_,[I])},enter(I){let _=u,P=a,b=h;if(!n.isMounted)if(i)_=U||u,P=W||a,b=g||h;else return;let V=!1;const se=I[rn]=ie=>{V||(V=!0,ie?$(b,[I]):$(P,[I]),K.delayedLeave&&K.delayedLeave(),I[rn]=void 0)};_?j(_,[I,se]):se()},leave(I,_){const P=String(e.key);if(I[rn]&&I[rn](!0),n.isUnmounting)return _();$(v,[I]);let b=!1;const V=I[Qe]=se=>{b||(b=!0,_(),se?$(O,[I]):$(L,[I]),I[Qe]=void 0,A[P]===e&&delete A[P])};A[P]=e,x?j(x,[I,V]):V()},clone(I){const _=ys(I,t,n,s,r);return r&&r(_),_}};return K}function zn(e){if(Hn(e))return e=nt(e),e.children=null,e}function er(e){if(!Hn(e))return mi(e.type)&&e.children?_i(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function Wt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Wt(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 wi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iKt(L,t&&(B(t)?t[O]:t),n,s,r));return}if(pt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Kt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Bn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,a=l.refs===Z?l.refs={}:l.refs,h=l.setupState,v=J(h),x=h===Z?()=>!1:L=>z(v,L);if(u!=null&&u!==c&&(re(u)?(a[u]=null,x(u)&&(h[u]=null)):ae(u)&&(u.value=null)),q(c))zt(c,l,12,[o,a]);else{const L=re(c),O=ae(c);if(L||O){const G=()=>{if(e.f){const U=L?x(c)?h[c]:a[c]:c.value;r?B(U)&&Os(U,i):B(U)?U.includes(i)||U.push(i):L?(a[c]=[i],x(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else L?(a[c]=o,x(c)&&(h[c]=o)):O&&(c.value=o,e.k&&(a[e.k]=o))};o?(G.id=-1,Te(G,n)):G()}}}let tr=!1;const bt=()=>{tr||(console.error("Hydration completed but contains mismatches."),tr=!0)},Tl=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Al=e=>e.namespaceURI.includes("MathML"),on=e=>{if(e.nodeType===1){if(Tl(e))return"svg";if(Al(e))return"mathml"}},ln=e=>e.nodeType===8;function Rl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:u}}=e,a=(g,p)=>{if(!p.hasChildNodes()){n(null,g,p),wn(),p._vnode=g;return}h(p.firstChild,g,null,null,null),wn(),p._vnode=g},h=(g,p,A,$,j,K=!1)=>{K=K||!!p.dynamicChildren;const I=ln(g)&&g.data==="[",_=()=>O(g,p,A,$,j,I),{type:P,ref:b,shapeFlag:V,patchFlag:se}=p;let ie=g.nodeType;p.el=g,se===-2&&(K=!1,p.dynamicChildren=null);let H=null;switch(P){case gt:ie!==3?p.children===""?(c(p.el=r(""),o(g),g),H=g):H=_():(g.data!==p.children&&(bt(),g.data=p.children),H=i(g));break;case ve:W(g)?(H=i(g),U(p.el=g.content.firstChild,g,A)):ie!==8||I?H=_():H=i(g);break;case jt:if(I&&(g=i(g),ie=g.nodeType),ie===1||ie===3){H=g;const Y=!p.children.length;for(let F=0;F{K=K||!!p.dynamicChildren;const{type:I,props:_,patchFlag:P,shapeFlag:b,dirs:V,transition:se}=p,ie=I==="input"||I==="option";if(ie||P!==-1){V&&Ve(p,null,A,"created");let H=!1;if(W(g)){H=Ui(null,se)&&A&&A.vnode.props&&A.vnode.props.appear;const F=g.content.firstChild;H&&se.beforeEnter(F),U(F,g,A),p.el=g=F}if(b&16&&!(_&&(_.innerHTML||_.textContent))){let F=x(g.firstChild,p,g,A,$,j,K);for(;F;){cn(g,1)||bt();const fe=F;F=F.nextSibling,l(fe)}}else if(b&8){let F=p.children;F[0]===` +`&&(g.tagName==="PRE"||g.tagName==="TEXTAREA")&&(F=F.slice(1)),g.textContent!==F&&(cn(g,0)||bt(),g.textContent=p.children)}if(_){if(ie||!K||P&48){const F=g.tagName.includes("-");for(const fe in _)(ie&&(fe.endsWith("value")||fe==="indeterminate")||Jt(fe)&&!Et(fe)||fe[0]==="."||F)&&s(g,fe,null,_[fe],void 0,A)}else if(_.onClick)s(g,"onClick",null,_.onClick,void 0,A);else if(P&4&&ht(_.style))for(const F in _.style)_.style[F]}let Y;(Y=_&&_.onVnodeBeforeMount)&&Oe(Y,A,p),V&&Ve(p,null,A,"beforeMount"),((Y=_&&_.onVnodeMounted)||V||H)&&Xi(()=>{Y&&Oe(Y,A,p),H&&se.enter(g),V&&Ve(p,null,A,"mounted")},$)}return g.nextSibling},x=(g,p,A,$,j,K,I)=>{I=I||!!p.dynamicChildren;const _=p.children,P=_.length;for(let b=0;b{const{slotScopeIds:I}=p;I&&(j=j?j.concat(I):I);const _=o(g),P=x(i(g),p,_,A,$,j,K);return P&&ln(P)&&P.data==="]"?i(p.anchor=P):(bt(),c(p.anchor=u("]"),_,P),P)},O=(g,p,A,$,j,K)=>{if(cn(g.parentElement,1)||bt(),p.el=null,K){const P=G(g);for(;;){const b=i(g);if(b&&b!==P)l(b);else break}}const I=i(g),_=o(g);return l(g),n(null,p,_,I,A,$,on(_),j),A&&(A.vnode.el=p.el,Gi(A,p.el)),I},G=(g,p="[",A="]")=>{let $=0;for(;g;)if(g=i(g),g&&ln(g)&&(g.data===p&&$++,g.data===A)){if($===0)return i(g);$--}return g},U=(g,p,A)=>{const $=p.parentNode;$&&$.replaceChild(g,p);let j=A;for(;j;)j.vnode.el===p&&(j.vnode.el=j.subTree.el=g),j=j.parent},W=g=>g.nodeType===1&&g.tagName==="TEMPLATE";return[a,h]}const nr="data-allow-mismatch",Ol={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function cn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(nr);)e=e.parentElement;const n=e&&e.getAttribute(nr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:n.split(",").includes(Ol[t])}}On().requestIdleCallback;On().cancelIdleCallback;const pt=e=>!!e.type.__asyncLoader,Hn=e=>e.type.__isKeepAlive;function Ml(e,t){Ei(e,"a",t)}function Il(e,t){Ei(e,"da",t)}function Ei(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Dn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Hn(r.parent.vnode)&&Ll(s,t,n,r),r=r.parent}}function Ll(e,t,n,s){const r=Dn(t,e,s,!0);$n(()=>{Os(s[t],r)},n)}function Dn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{rt();const l=Qt(n),c=He(t,n,e,o);return l(),it(),c});return s?r.unshift(i):r.push(i),i}}const Xe=e=>(t,n=ue)=>{(!Yt||e==="sp")&&Dn(e,(...s)=>t(...s),n)},Pl=Xe("bm"),Ot=Xe("m"),Nl=Xe("bu"),Fl=Xe("u"),Ci=Xe("bum"),$n=Xe("um"),Hl=Xe("sp"),Dl=Xe("rtg"),$l=Xe("rtc");function jl(e,t=ue){Dn("ec",e,t)}const Ti="components";function Qa(e,t){return Ri(Ti,e,!0,t)||e}const Ai=Symbol.for("v-ndc");function Za(e){return re(e)?Ri(Ti,e,!1)||e:e||Ai}function Ri(e,t,n=!0,s=!1){const r=ce||ue;if(r){const i=r.type;{const l=Sc(i,!1);if(l&&(l===t||l===Le(t)||l===Rn(Le(t))))return i}const o=sr(r[e]||i[e],t)||sr(r.appContext[e],t);return!o&&s?i:o}}function sr(e,t){return e&&(e[t]||e[Le(t)]||e[Rn(Le(t))])}function ef(e,t,n,s){let r;const i=n,o=B(e);if(o||re(e)){const l=o&&ht(e);let c=!1;l&&(c=!Ie(e),e=In(e)),r=new Array(e.length);for(let u=0,a=e.length;ut(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;cGt(t)?!(t.type===ve||t.type===xe&&!Oi(t.children)):!0)?e:null}function nf(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:hn(s)]=e[s];return n}const vs=e=>e?eo(e)?Bn(e):vs(e.parent):null,$t=le(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>vs(e.parent),$root:e=>vs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Vs(e),$forceUpdate:e=>e.f||(e.f=()=>{js(e.update)}),$nextTick:e=>e.n||(e.n=Fn.bind(e.proxy)),$watch:e=>lc.bind(e)}),Qn=(e,t)=>e!==Z&&!e.__isScriptSetup&&z(e,t),Vl={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let u;if(t[0]!=="$"){const x=o[t];if(x!==void 0)switch(x){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Qn(s,t))return o[t]=1,s[t];if(r!==Z&&z(r,t))return o[t]=2,r[t];if((u=e.propsOptions[0])&&z(u,t))return o[t]=3,i[t];if(n!==Z&&z(n,t))return o[t]=4,n[t];_s&&(o[t]=0)}}const a=$t[t];let h,v;if(a)return t==="$attrs"&&me(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==Z&&z(n,t))return o[t]=4,n[t];if(v=c.config.globalProperties,z(v,t))return v[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Qn(r,t)?(r[t]=n,!0):s!==Z&&z(s,t)?(s[t]=n,!0):z(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!==Z&&z(e,o)||Qn(t,o)||(l=i[0])&&z(l,o)||z(s,o)||z($t,o)||z(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function sf(){return Ul().slots}function Ul(){const e=Un();return e.setupContext||(e.setupContext=no(e))}function rr(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let _s=!0;function Bl(e){const t=Vs(e),n=e.proxy,s=e.ctx;_s=!1,t.beforeCreate&&ir(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:a,beforeMount:h,mounted:v,beforeUpdate:x,updated:L,activated:O,deactivated:G,beforeDestroy:U,beforeUnmount:W,destroyed:g,unmounted:p,render:A,renderTracked:$,renderTriggered:j,errorCaptured:K,serverPrefetch:I,expose:_,inheritAttrs:P,components:b,directives:V,filters:se}=t;if(u&&kl(u,s,null),o)for(const Y in o){const F=o[Y];q(F)&&(s[Y]=F.bind(n))}if(r){const Y=r.call(n,n);ne(Y)&&(e.data=Ln(Y))}if(_s=!0,i)for(const Y in i){const F=i[Y],fe=q(F)?F.bind(n,n):q(F.get)?F.get.bind(n,n):Ue,Zt=!q(F)&&q(F.set)?F.set.bind(n):Ue,ot=oe({get:fe,set:Zt});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>ot.value,set:De=>ot.value=De})}if(l)for(const Y in l)Mi(l[Y],s,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(F=>{Xl(F,Y[F])})}a&&ir(a,e,"c");function H(Y,F){B(F)?F.forEach(fe=>Y(fe.bind(n))):F&&Y(F.bind(n))}if(H(Pl,h),H(Ot,v),H(Nl,x),H(Fl,L),H(Ml,O),H(Il,G),H(jl,K),H($l,$),H(Dl,j),H(Ci,W),H($n,p),H(Hl,I),B(_))if(_.length){const Y=e.exposed||(e.exposed={});_.forEach(F=>{Object.defineProperty(Y,F,{get:()=>n[F],set:fe=>n[F]=fe})})}else e.exposed||(e.exposed={});A&&e.render===Ue&&(e.render=A),P!=null&&(e.inheritAttrs=P),b&&(e.components=b),V&&(e.directives=V),I&&Si(e)}function kl(e,t,n=Ue){B(e)&&(e=bs(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=At(r.from||s,r.default,!0):i=At(r.from||s):i=At(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function ir(e,t,n){He(B(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Mi(e,t,n,s){let r=s.includes(".")?Ki(n,s):()=>n[s];if(re(e)){const i=t[e];q(i)&&Fe(r,i)}else if(q(e))Fe(r,e.bind(n));else if(ne(e))if(B(e))e.forEach(i=>Mi(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Fe(r,i,e)}}function Vs(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=>Sn(c,u,o,!0)),Sn(c,t,o)),ne(t)&&i.set(t,c),c}function Sn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Sn(e,i,n,!0),r&&r.forEach(o=>Sn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Wl[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Wl={data:or,props:lr,emits:lr,methods:Ft,computed:Ft,beforeCreate:_e,created:_e,beforeMount:_e,mounted:_e,beforeUpdate:_e,updated:_e,beforeDestroy:_e,beforeUnmount:_e,destroyed:_e,unmounted:_e,activated:_e,deactivated:_e,errorCaptured:_e,serverPrefetch:_e,components:Ft,directives:Ft,watch:ql,provide:or,inject:Kl};function or(e,t){return t?e?function(){return le(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function Kl(e,t){return Ft(bs(e),bs(t))}function bs(e){if(B(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}const Li={},Pi=()=>Object.create(Li),Ni=e=>Object.getPrototypeOf(e)===Li;function Jl(e,t,n,s=!1){const r={},i=Pi();e.propsDefaults=Object.create(null),Fi(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:il(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function zl(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[v,x]=Hi(h,t,!0);le(o,v),x&&l.push(...x)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return ne(e)&&s.set(e,xt),xt;if(B(i))for(let a=0;ae[0]==="_"||e==="$stable",Us=e=>B(e)?e.map(Me):[Me(e)],Zl=(e,t,n)=>{if(t._n)return t;const s=wl((...r)=>Us(t(...r)),n);return s._c=!1,s},$i=(e,t,n)=>{const s=e._ctx;for(const r in e){if(Di(r))continue;const i=e[r];if(q(i))t[r]=Zl(r,i,s);else if(i!=null){const o=Us(i);t[r]=()=>o}}},ji=(e,t)=>{const n=Us(t);e.slots.default=()=>n},Vi=(e,t,n)=>{for(const s in t)(n||s!=="_")&&(e[s]=t[s])},ec=(e,t,n)=>{const s=e.slots=Pi();if(e.vnode.shapeFlag&32){const r=t._;r?(Vi(s,t,n),n&&kr(s,"_",r,!0)):$i(t,s)}else t&&ji(e,t)},tc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=Z;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Vi(r,t,n):(i=!t.$stable,$i(t,r)),o=t}else t&&(ji(e,t),o={default:1});if(i)for(const l in r)!Di(l)&&o[l]==null&&delete r[l]},Te=Xi;function nc(e){return sc(e,Rl)}function sc(e,t){const n=On();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:a,parentNode:h,nextSibling:v,setScopeId:x=Ue,insertStaticContent:L}=e,O=(f,d,m,S=null,y=null,w=null,R=void 0,T=null,C=!!d.dynamicChildren)=>{if(f===d)return;f&&!ut(f,d)&&(S=en(f),De(f,y,w,!0),f=null),d.patchFlag===-2&&(C=!1,d.dynamicChildren=null);const{type:E,ref:D,shapeFlag:M}=d;switch(E){case gt:G(f,d,m,S);break;case ve:U(f,d,m,S);break;case jt:f==null&&W(d,m,S,R);break;case xe:b(f,d,m,S,y,w,R,T,C);break;default:M&1?A(f,d,m,S,y,w,R,T,C):M&6?V(f,d,m,S,y,w,R,T,C):(M&64||M&128)&&E.process(f,d,m,S,y,w,R,T,C,vt)}D!=null&&y&&Kt(D,f&&f.ref,w,d||f,!d)},G=(f,d,m,S)=>{if(f==null)s(d.el=l(d.children),m,S);else{const y=d.el=f.el;d.children!==f.children&&u(y,d.children)}},U=(f,d,m,S)=>{f==null?s(d.el=c(d.children||""),m,S):d.el=f.el},W=(f,d,m,S)=>{[f.el,f.anchor]=L(f.children,d,m,S,f.el,f.anchor)},g=({el:f,anchor:d},m,S)=>{let y;for(;f&&f!==d;)y=v(f),s(f,m,S),f=y;s(d,m,S)},p=({el:f,anchor:d})=>{let m;for(;f&&f!==d;)m=v(f),r(f),f=m;r(d)},A=(f,d,m,S,y,w,R,T,C)=>{d.type==="svg"?R="svg":d.type==="math"&&(R="mathml"),f==null?$(d,m,S,y,w,R,T,C):I(f,d,y,w,R,T,C)},$=(f,d,m,S,y,w,R,T)=>{let C,E;const{props:D,shapeFlag:M,transition:N,dirs:k}=f;if(C=f.el=o(f.type,w,D&&D.is,D),M&8?a(C,f.children):M&16&&K(f.children,C,null,S,y,Zn(f,w),R,T),k&&Ve(f,null,S,"created"),j(C,f,f.scopeId,R,S),D){for(const ee in D)ee!=="value"&&!Et(ee)&&i(C,ee,null,D[ee],w,S);"value"in D&&i(C,"value",null,D.value,w),(E=D.onVnodeBeforeMount)&&Oe(E,S,f)}k&&Ve(f,null,S,"beforeMount");const X=Ui(y,N);X&&N.beforeEnter(C),s(C,d,m),((E=D&&D.onVnodeMounted)||X||k)&&Te(()=>{E&&Oe(E,S,f),X&&N.enter(C),k&&Ve(f,null,S,"mounted")},y)},j=(f,d,m,S,y)=>{if(m&&x(f,m),S)for(let w=0;w{for(let E=C;E{const T=d.el=f.el;let{patchFlag:C,dynamicChildren:E,dirs:D}=d;C|=f.patchFlag&16;const M=f.props||Z,N=d.props||Z;let k;if(m&<(m,!1),(k=N.onVnodeBeforeUpdate)&&Oe(k,m,d,f),D&&Ve(d,f,m,"beforeUpdate"),m&<(m,!0),(M.innerHTML&&N.innerHTML==null||M.textContent&&N.textContent==null)&&a(T,""),E?_(f.dynamicChildren,E,T,m,S,Zn(d,y),w):R||F(f,d,T,null,m,S,Zn(d,y),w,!1),C>0){if(C&16)P(T,M,N,m,y);else if(C&2&&M.class!==N.class&&i(T,"class",null,N.class,y),C&4&&i(T,"style",M.style,N.style,y),C&8){const X=d.dynamicProps;for(let ee=0;ee{k&&Oe(k,m,d,f),D&&Ve(d,f,m,"updated")},S)},_=(f,d,m,S,y,w,R)=>{for(let T=0;T{if(d!==m){if(d!==Z)for(const w in d)!Et(w)&&!(w in m)&&i(f,w,d[w],null,y,S);for(const w in m){if(Et(w))continue;const R=m[w],T=d[w];R!==T&&w!=="value"&&i(f,w,T,R,y,S)}"value"in m&&i(f,"value",d.value,m.value,y)}},b=(f,d,m,S,y,w,R,T,C)=>{const E=d.el=f?f.el:l(""),D=d.anchor=f?f.anchor:l("");let{patchFlag:M,dynamicChildren:N,slotScopeIds:k}=d;k&&(T=T?T.concat(k):k),f==null?(s(E,m,S),s(D,m,S),K(d.children||[],m,D,y,w,R,T,C)):M>0&&M&64&&N&&f.dynamicChildren?(_(f.dynamicChildren,N,m,y,w,R,T),(d.key!=null||y&&d===y.subTree)&&Bi(f,d,!0)):F(f,d,m,D,y,w,R,T,C)},V=(f,d,m,S,y,w,R,T,C)=>{d.slotScopeIds=T,f==null?d.shapeFlag&512?y.ctx.activate(d,m,S,R,C):se(d,m,S,y,w,R,C):ie(f,d,C)},se=(f,d,m,S,y,w,R)=>{const T=f.component=_c(f,S,y);if(Hn(f)&&(T.ctx.renderer=vt),bc(T,!1,R),T.asyncDep){if(y&&y.registerDep(T,H,R),!f.el){const C=T.subTree=he(ve);U(null,C,d,m)}}else H(T,f,d,m,y,w,R)},ie=(f,d,m)=>{const S=d.component=f.component;if(dc(f,d,m))if(S.asyncDep&&!S.asyncResolved){Y(S,d,m);return}else S.next=d,S.update();else d.el=f.el,S.vnode=d},H=(f,d,m,S,y,w,R)=>{const T=()=>{if(f.isMounted){let{next:M,bu:N,u:k,parent:X,vnode:ee}=f;{const Ee=ki(f);if(Ee){M&&(M.el=ee.el,Y(f,M,R)),Ee.asyncDep.then(()=>{f.isUnmounted||T()});return}}let Q=M,Se;lt(f,!1),M?(M.el=ee.el,Y(f,M,R)):M=ee,N&&qn(N),(Se=M.props&&M.props.onVnodeBeforeUpdate)&&Oe(Se,X,M,ee),lt(f,!0);const pe=es(f),Pe=f.subTree;f.subTree=pe,O(Pe,pe,h(Pe.el),en(Pe),f,y,w),M.el=pe.el,Q===null&&Gi(f,pe.el),k&&Te(k,y),(Se=M.props&&M.props.onVnodeUpdated)&&Te(()=>Oe(Se,X,M,ee),y)}else{let M;const{el:N,props:k}=d,{bm:X,m:ee,parent:Q,root:Se,type:pe}=f,Pe=pt(d);if(lt(f,!1),X&&qn(X),!Pe&&(M=k&&k.onVnodeBeforeMount)&&Oe(M,Q,d),lt(f,!0),N&&Kn){const Ee=()=>{f.subTree=es(f),Kn(N,f.subTree,f,y,null)};Pe&&pe.__asyncHydrate?pe.__asyncHydrate(N,f,Ee):Ee()}else{Se.ce&&Se.ce._injectChildStyle(pe);const Ee=f.subTree=es(f);O(null,Ee,m,S,f,y,w),d.el=Ee.el}if(ee&&Te(ee,y),!Pe&&(M=k&&k.onVnodeMounted)){const Ee=d;Te(()=>Oe(M,Q,Ee),y)}(d.shapeFlag&256||Q&&pt(Q.vnode)&&Q.vnode.shapeFlag&256)&&f.a&&Te(f.a,y),f.isMounted=!0,d=m=S=null}};f.scope.on();const C=f.effect=new Yr(T);f.scope.off();const E=f.update=C.run.bind(C),D=f.job=C.runIfDirty.bind(C);D.i=f,D.id=f.uid,C.scheduler=()=>js(D),lt(f,!0),E()},Y=(f,d,m)=>{d.component=f;const S=f.vnode.props;f.vnode=d,f.next=null,zl(f,d.props,S,m),tc(f,d.children,m),rt(),Zs(f),it()},F=(f,d,m,S,y,w,R,T,C=!1)=>{const E=f&&f.children,D=f?f.shapeFlag:0,M=d.children,{patchFlag:N,shapeFlag:k}=d;if(N>0){if(N&128){Zt(E,M,m,S,y,w,R,T,C);return}else if(N&256){fe(E,M,m,S,y,w,R,T,C);return}}k&8?(D&16&&Mt(E,y,w),M!==E&&a(m,M)):D&16?k&16?Zt(E,M,m,S,y,w,R,T,C):Mt(E,y,w,!0):(D&8&&a(m,""),k&16&&K(M,m,S,y,w,R,T,C))},fe=(f,d,m,S,y,w,R,T,C)=>{f=f||xt,d=d||xt;const E=f.length,D=d.length,M=Math.min(E,D);let N;for(N=0;ND?Mt(f,y,w,!0,!1,M):K(d,m,S,y,w,R,T,C,M)},Zt=(f,d,m,S,y,w,R,T,C)=>{let E=0;const D=d.length;let M=f.length-1,N=D-1;for(;E<=M&&E<=N;){const k=f[E],X=d[E]=C?Ze(d[E]):Me(d[E]);if(ut(k,X))O(k,X,m,null,y,w,R,T,C);else break;E++}for(;E<=M&&E<=N;){const k=f[M],X=d[N]=C?Ze(d[N]):Me(d[N]);if(ut(k,X))O(k,X,m,null,y,w,R,T,C);else break;M--,N--}if(E>M){if(E<=N){const k=N+1,X=kN)for(;E<=M;)De(f[E],y,w,!0),E++;else{const k=E,X=E,ee=new Map;for(E=X;E<=N;E++){const Ce=d[E]=C?Ze(d[E]):Me(d[E]);Ce.key!=null&&ee.set(Ce.key,E)}let Q,Se=0;const pe=N-X+1;let Pe=!1,Ee=0;const It=new Array(pe);for(E=0;E=pe){De(Ce,y,w,!0);continue}let $e;if(Ce.key!=null)$e=ee.get(Ce.key);else for(Q=X;Q<=N;Q++)if(It[Q-X]===0&&ut(Ce,d[Q])){$e=Q;break}$e===void 0?De(Ce,y,w,!0):(It[$e-X]=E+1,$e>=Ee?Ee=$e:Pe=!0,O(Ce,d[$e],m,null,y,w,R,T,C),Se++)}const Ys=Pe?rc(It):xt;for(Q=Ys.length-1,E=pe-1;E>=0;E--){const Ce=X+E,$e=d[Ce],Xs=Ce+1{const{el:w,type:R,transition:T,children:C,shapeFlag:E}=f;if(E&6){ot(f.component.subTree,d,m,S);return}if(E&128){f.suspense.move(d,m,S);return}if(E&64){R.move(f,d,m,vt);return}if(R===xe){s(w,d,m);for(let M=0;MT.enter(w),y);else{const{leave:M,delayLeave:N,afterLeave:k}=T,X=()=>s(w,d,m),ee=()=>{M(w,()=>{X(),k&&k()})};N?N(w,X,ee):ee()}else s(w,d,m)},De=(f,d,m,S=!1,y=!1)=>{const{type:w,props:R,ref:T,children:C,dynamicChildren:E,shapeFlag:D,patchFlag:M,dirs:N,cacheIndex:k}=f;if(M===-2&&(y=!1),T!=null&&Kt(T,null,m,f,!0),k!=null&&(d.renderCache[k]=void 0),D&256){d.ctx.deactivate(f);return}const X=D&1&&N,ee=!pt(f);let Q;if(ee&&(Q=R&&R.onVnodeBeforeUnmount)&&Oe(Q,d,f),D&6)So(f.component,m,S);else{if(D&128){f.suspense.unmount(m,S);return}X&&Ve(f,null,d,"beforeUnmount"),D&64?f.type.remove(f,d,m,vt,S):E&&!E.hasOnce&&(w!==xe||M>0&&M&64)?Mt(E,d,m,!1,!0):(w===xe&&M&384||!y&&D&16)&&Mt(C,d,m),S&&qs(f)}(ee&&(Q=R&&R.onVnodeUnmounted)||X)&&Te(()=>{Q&&Oe(Q,d,f),X&&Ve(f,null,d,"unmounted")},m)},qs=f=>{const{type:d,el:m,anchor:S,transition:y}=f;if(d===xe){xo(m,S);return}if(d===jt){p(f);return}const w=()=>{r(m),y&&!y.persisted&&y.afterLeave&&y.afterLeave()};if(f.shapeFlag&1&&y&&!y.persisted){const{leave:R,delayLeave:T}=y,C=()=>R(m,w);T?T(f.el,w,C):C()}else w()},xo=(f,d)=>{let m;for(;f!==d;)m=v(f),r(f),f=m;r(d)},So=(f,d,m)=>{const{bum:S,scope:y,job:w,subTree:R,um:T,m:C,a:E}=f;ar(C),ar(E),S&&qn(S),y.stop(),w&&(w.flags|=8,De(R,f,d,m)),T&&Te(T,d),Te(()=>{f.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&f.asyncDep&&!f.asyncResolved&&f.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Mt=(f,d,m,S=!1,y=!1,w=0)=>{for(let R=w;R{if(f.shapeFlag&6)return en(f.component.subTree);if(f.shapeFlag&128)return f.suspense.next();const d=v(f.anchor||f.el),m=d&&d[xl];return m?v(m):d};let kn=!1;const Gs=(f,d,m)=>{f==null?d._vnode&&De(d._vnode,null,null,!0):O(d._vnode||null,f,d,null,null,null,m),d._vnode=f,kn||(kn=!0,Zs(),wn(),kn=!1)},vt={p:O,um:De,m:ot,r:qs,mt:se,mc:K,pc:F,pbc:_,n:en,o:e};let Wn,Kn;return t&&([Wn,Kn]=t(vt)),{render:Gs,hydrate:Wn,createApp:Yl(Gs,Wn)}}function Zn({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 lt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ui(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Bi(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 ki(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ki(t)}function ar(e){if(e)for(let t=0;tAt(ic);function Wi(e,t){return jn(e,null,t)}function rf(e,t){return jn(e,null,{flush:"post"})}function Fe(e,t,n){return jn(e,t,n)}function jn(e,t,n=Z){const{immediate:s,deep:r,flush:i,once:o}=n,l=le({},n),c=t&&s||!t&&i!=="post";let u;if(Yt){if(i==="sync"){const x=oc();u=x.__watcherHandles||(x.__watcherHandles=[])}else if(!c){const x=()=>{};return x.stop=Ue,x.resume=Ue,x.pause=Ue,x}}const a=ue;l.call=(x,L,O)=>He(x,a,L,O);let h=!1;i==="post"?l.scheduler=x=>{Te(x,a&&a.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(x,L)=>{L?x():js(x)}),l.augmentJob=x=>{t&&(x.flags|=4),h&&(x.flags|=2,a&&(x.id=a.uid,x.i=a))};const v=yl(e,t,l);return Yt&&(u?u.push(v):c&&v()),v}function lc(e,t,n){const s=this.proxy,r=re(e)?e.includes(".")?Ki(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=Qt(this),l=jn(r,i.bind(s),n);return o(),l}function Ki(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Le(t)}Modifiers`]||e[`${st(t)}Modifiers`];function ac(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Z;let r=n;const i=t.startsWith("update:"),o=i&&cc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>re(a)?a.trim():a)),o.number&&(r=n.map(Oo)));let l,c=s[l=hn(t)]||s[l=hn(Le(t))];!c&&i&&(c=s[l=hn(st(t))]),c&&He(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,He(u,e,6,r)}}function qi(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(!q(e)){const c=u=>{const a=qi(u,t,!0);a&&(l=!0,le(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ne(e)&&s.set(e,null),null):(B(i)?i.forEach(c=>o[c]=null):le(o,i),ne(e)&&s.set(e,o),o)}function Vn(e,t){return!e||!Jt(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,st(t))||z(e,t))}function es(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:a,props:h,data:v,setupState:x,ctx:L,inheritAttrs:O}=e,G=xn(e);let U,W;try{if(n.shapeFlag&4){const p=r||s,A=p;U=Me(u.call(A,p,a,h,x,v,L)),W=l}else{const p=t;U=Me(p.length>1?p(h,{attrs:l,slots:o,emit:c}):p(h,null)),W=t.props?l:fc(l)}}catch(p){Vt.length=0,Nn(p,e,1),U=he(ve)}let g=U;if(W&&O!==!1){const p=Object.keys(W),{shapeFlag:A}=g;p.length&&A&7&&(i&&p.some(Rs)&&(W=uc(W,i)),g=nt(g,W,!1,!0))}return n.dirs&&(g=nt(g,null,!1,!0),g.dirs=g.dirs?g.dirs.concat(n.dirs):n.dirs),n.transition&&Wt(g,n.transition),U=g,xn(G),U}const fc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Jt(n))&&((t||(t={}))[n]=e[n]);return t},uc=(e,t)=>{const n={};for(const s in e)(!Rs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function dc(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?fr(s,o,u):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function Xi(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):bl(e)}const xe=Symbol.for("v-fgt"),gt=Symbol.for("v-txt"),ve=Symbol.for("v-cmt"),jt=Symbol.for("v-stc"),Vt=[];let Ae=null;function xs(e=!1){Vt.push(Ae=e?null:[])}function hc(){Vt.pop(),Ae=Vt[Vt.length-1]||null}let qt=1;function ur(e,t=!1){qt+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function Ji(e){return e.dynamicChildren=qt>0?Ae||xt:null,hc(),qt>0&&Ae&&Ae.push(e),e}function of(e,t,n,s,r,i){return Ji(Qi(e,t,n,s,r,i,!0))}function Ss(e,t,n,s,r){return Ji(he(e,t,n,s,r,!0))}function Gt(e){return e?e.__v_isVNode===!0:!1}function ut(e,t){return e.type===t.type&&e.key===t.key}const zi=({key:e})=>e??null,gn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||ae(e)||q(e)?{i:ce,r:e,k:t,f:!!n}:e:null);function Qi(e,t=null,n=null,s=0,r=null,i=e===xe?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&zi(t),ref:t&&gn(t),scopeId:gi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ce};return l?(Bs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),qt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const he=pc;function pc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Ai)&&(e=ve),Gt(e)){const l=nt(e,t,!0);return n&&Bs(l,n),qt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(Ec(e)&&(e=e.__vccOpts),t){t=gc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=Ls(l)),ne(c)&&($s(c)&&!B(c)&&(c=le({},c)),t.style=Is(c))}const o=re(e)?1:Yi(e)?128:mi(e)?64:ne(e)?4:q(e)?2:0;return Qi(e,t,n,s,r,o,i,!0)}function gc(e){return e?$s(e)||Ni(e)?le({},e):e:null}function nt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?mc(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&zi(u),ref:t&&t.ref?n&&i?B(i)?i.concat(gn(t)):[i,gn(t)]:gn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==xe?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Wt(a,c.clone(a)),a}function Zi(e=" ",t=0){return he(gt,null,e,t)}function lf(e,t){const n=he(jt,null,e);return n.staticCount=t,n}function cf(e="",t=!1){return t?(xs(),Ss(ve,null,e)):he(ve,null,e)}function Me(e){return e==null||typeof e=="boolean"?he(ve):B(e)?he(xe,null,e.slice()):Gt(e)?Ze(e):he(gt,null,String(e))}function Ze(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function Bs(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),Bs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!Ni(t)?t._ctx=ce:r===3&&ce&&(ce.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:ce},n=32):(t=String(t),s&64?(n=16,t=[Zi(t)]):n=8);e.children=t,e.shapeFlag|=n}function mc(...e){const t={};for(let n=0;nue||ce;let En,Es;{const e=On(),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)}};En=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Es=t("__VUE_SSR_SETTERS__",n=>Yt=n)}const Qt=e=>{const t=ue;return En(e),e.scope.on(),()=>{e.scope.off(),En(t)}},dr=()=>{ue&&ue.scope.off(),En(null)};function eo(e){return e.vnode.shapeFlag&4}let Yt=!1;function bc(e,t=!1,n=!1){t&&Es(t);const{props:s,children:r}=e.vnode,i=eo(e);Jl(e,s,i,t),ec(e,r,n);const o=i?wc(e,t):void 0;return t&&Es(!1),o}function wc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Vl);const{setup:s}=n;if(s){rt();const r=e.setupContext=s.length>1?no(e):null,i=Qt(e),o=zt(s,e,0,[e.props,r]),l=Vr(o);if(it(),i(),(l||e.sp)&&!pt(e)&&Si(e),l){if(o.then(dr,dr),t)return o.then(c=>{hr(e,c,t)}).catch(c=>{Nn(c,e,0)});e.asyncDep=o}else hr(e,o,t)}else to(e,t)}function hr(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=ui(t)),to(e,n)}let pr;function to(e,t,n){const s=e.type;if(!e.render){if(!t&&pr&&!s.render){const r=s.template||Vs(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,u=le(le({isCustomElement:i,delimiters:l},o),c);s.render=pr(r,u)}}e.render=s.render||Ue}{const r=Qt(e);rt();try{Bl(e)}finally{it(),r()}}}const xc={get(e,t){return me(e,"get",""),e[t]}};function no(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,xc),slots:e.slots,emit:e.emit,expose:t}}function Bn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(ui(pn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in $t)return $t[n](e)},has(t,n){return n in t||n in $t}})):e.proxy}function Sc(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Ec(e){return q(e)&&"__vccOpts"in e}const oe=(e,t)=>gl(e,t,Yt);function Cs(e,t,n){const s=arguments.length;return s===2?ne(t)&&!B(t)?Gt(t)?he(e,null,[t]):he(e,t):he(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Gt(n)&&(n=[n]),he(e,t,n))}const Cc="3.5.13";/** +* @vue/runtime-dom v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Ts;const gr=typeof window<"u"&&window.trustedTypes;if(gr)try{Ts=gr.createPolicy("vue",{createHTML:e=>e})}catch{}const so=Ts?e=>Ts.createHTML(e):e=>e,Tc="http://www.w3.org/2000/svg",Ac="http://www.w3.org/1998/Math/MathML",We=typeof document<"u"?document:null,mr=We&&We.createElement("template"),Rc={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"?We.createElementNS(Tc,e):t==="mathml"?We.createElementNS(Ac,e):n?We.createElement(e,{is:n}):We.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>We.createTextNode(e),createComment:e=>We.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>We.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{mr.innerHTML=so(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=mr.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]}},Je="transition",Pt="animation",Xt=Symbol("_vtc"),ro={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},Oc=le({},yi,ro),Mc=e=>(e.displayName="Transition",e.props=Oc,e),af=Mc((e,{slots:t})=>Cs(Cl,Ic(e),t)),ct=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},yr=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function Ic(e){const t={};for(const b in e)b in ro||(t[b]=e[b]);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:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:x=`${n}-leave-to`}=e,L=Lc(r),O=L&&L[0],G=L&&L[1],{onBeforeEnter:U,onEnter:W,onEnterCancelled:g,onLeave:p,onLeaveCancelled:A,onBeforeAppear:$=U,onAppear:j=W,onAppearCancelled:K=g}=t,I=(b,V,se,ie)=>{b._enterCancelled=ie,at(b,V?a:l),at(b,V?u:o),se&&se()},_=(b,V)=>{b._isLeaving=!1,at(b,h),at(b,x),at(b,v),V&&V()},P=b=>(V,se)=>{const ie=b?j:W,H=()=>I(V,b,se);ct(ie,[V,H]),vr(()=>{at(V,b?c:i),ke(V,b?a:l),yr(ie)||_r(V,s,O,H)})};return le(t,{onBeforeEnter(b){ct(U,[b]),ke(b,i),ke(b,o)},onBeforeAppear(b){ct($,[b]),ke(b,c),ke(b,u)},onEnter:P(!1),onAppear:P(!0),onLeave(b,V){b._isLeaving=!0;const se=()=>_(b,V);ke(b,h),b._enterCancelled?(ke(b,v),xr()):(xr(),ke(b,v)),vr(()=>{b._isLeaving&&(at(b,h),ke(b,x),yr(p)||_r(b,s,G,se))}),ct(p,[b,se])},onEnterCancelled(b){I(b,!1,void 0,!0),ct(g,[b])},onAppearCancelled(b){I(b,!0,void 0,!0),ct(K,[b])},onLeaveCancelled(b){_(b),ct(A,[b])}})}function Lc(e){if(e==null)return null;if(ne(e))return[ts(e.enter),ts(e.leave)];{const t=ts(e);return[t,t]}}function ts(e){return Mo(e)}function ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Xt]||(e[Xt]=new Set)).add(t)}function at(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Xt];n&&(n.delete(t),n.size||(e[Xt]=void 0))}function vr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Pc=0;function _r(e,t,n,s){const r=e._endId=++Pc,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=Nc(e,t);if(!o)return s();const u=o+"end";let a=0;const h=()=>{e.removeEventListener(u,v),i()},v=x=>{x.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[L]||"").split(", "),r=s(`${Je}Delay`),i=s(`${Je}Duration`),o=br(r,i),l=s(`${Pt}Delay`),c=s(`${Pt}Duration`),u=br(l,c);let a=null,h=0,v=0;t===Je?o>0&&(a=Je,h=o,v=i.length):t===Pt?u>0&&(a=Pt,h=u,v=c.length):(h=Math.max(o,u),a=h>0?o>u?Je:Pt:null,v=a?a===Je?i.length:c.length:0);const x=a===Je&&/\b(transform|all)(,|$)/.test(s(`${Je}Property`).toString());return{type:a,timeout:h,propCount:v,hasTransform:x}}function br(e,t){for(;e.lengthwr(n)+wr(e[s])))}function wr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function xr(){return document.body.offsetHeight}function Fc(e,t,n){const s=e[Xt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Cn=Symbol("_vod"),io=Symbol("_vsh"),ff={beforeMount(e,{value:t},{transition:n}){e[Cn]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Nt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Nt(e,!0),s.enter(e)):s.leave(e,()=>{Nt(e,!1)}):Nt(e,t))},beforeUnmount(e,{value:t}){Nt(e,t)}};function Nt(e,t){e.style.display=t?e[Cn]:"none",e[io]=!t}const Hc=Symbol(""),Dc=/(^|;)\s*display\s*:/;function $c(e,t,n){const s=e.style,r=re(n);let i=!1;if(n&&!r){if(t)if(re(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&mn(s,l,"")}else for(const o in t)n[o]==null&&mn(s,o,"");for(const o in n)o==="display"&&(i=!0),mn(s,o,n[o])}else if(r){if(t!==n){const o=s[Hc];o&&(n+=";"+o),s.cssText=n,i=Dc.test(n)}}else t&&e.removeAttribute("style");Cn in e&&(e[Cn]=i?s.display:"",e[io]&&(s.display="none"))}const Sr=/\s*!important$/;function mn(e,t,n){if(B(n))n.forEach(s=>mn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=jc(e,t);Sr.test(n)?e.setProperty(st(s),n.replace(Sr,""),"important"):e[s]=n}}const Er=["Webkit","Moz","ms"],ns={};function jc(e,t){const n=ns[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return ns[t]=s;s=Rn(s);for(let r=0;rss||(Wc.then(()=>ss=0),ss=Date.now());function qc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;He(Gc(s,n.value),t,5,[s])};return n.value=e,n.attached=Kc(),n}function Gc(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 Mr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Yc=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?Fc(e,s,o):t==="style"?$c(e,n,s):Jt(t)?Rs(t)||Bc(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Xc(e,t,s,o))?(Ar(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Tr(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!re(s))?Ar(e,Le(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Tr(e,t,s,o))};function Xc(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Mr(t)&&q(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 Mr(t)&&re(n)?!1:t in e}const Jc=["ctrl","shift","alt","meta"],zc={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)=>Jc.some(n=>e[`${n}Key`]&&!t.includes(n))},uf=(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=st(r.key);if(t.some(o=>o===i||Qc[o]===i))return e(r)})},Zc=le({patchProp:Yc},Rc);let rs,Ir=!1;function ea(){return rs=Ir?rs:nc(Zc),Ir=!0,rs}const hf=(...e)=>{const t=ea().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=na(s);if(r)return n(r,!0,ta(r))},t};function ta(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function na(e){return re(e)?document.querySelector(e):e}const pf=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},sa=window.__VP_SITE_DATA__;function ks(e){return Gr()?(jo(e),!0):!1}function tt(e){return typeof e=="function"?e():fi(e)}const oo=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const ra=Object.prototype.toString,ia=e=>ra.call(e)==="[object Object]",lo=()=>{},Lr=oa();function oa(){var e,t;return oo&&((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 la(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 co=e=>e();function ca(e=co){const t=de(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:Pn(t),pause:n,resume:s,eventFilter:r}}function aa(e){return Un()}function ao(...e){if(e.length!==1)return dl(...e);const t=e[0];return typeof t=="function"?Pn(al(()=>({get:t,set:lo}))):de(t)}function fa(e,t,n={}){const{eventFilter:s=co,...r}=n;return Fe(e,la(s,t),r)}function ua(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=ca(s);return{stop:fa(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function Ws(e,t=!0,n){aa()?Ot(e,n):t?e():Fn(e)}const Ge=oo?window:void 0;function fo(e){var t;const n=tt(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Rt(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=Ge):[t,n,s,r]=e,!t)return lo;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,v,x)=>(a.addEventListener(h,v,x),()=>a.removeEventListener(h,v,x)),c=Fe(()=>[fo(t),tt(r)],([a,h])=>{if(o(),!a)return;const v=ia(h)?{...h}:h;i.push(...n.flatMap(x=>s.map(L=>l(a,x,L,v))))},{immediate:!0,flush:"post"}),u=()=>{c(),o()};return ks(u),u}function da(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function gf(...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=Ge,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=da(t);return Rt(r,i,a=>{a.repeat&&tt(l)||c(a)&&n(a)},o)}function ha(){const e=de(!1),t=Un();return t&&Ot(()=>{e.value=!0},t),e}function pa(e){const t=ha();return oe(()=>(t.value,!!e()))}function uo(e,t={}){const{window:n=Ge}=t,s=pa(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=de(!1),o=u=>{i.value=u.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=Wi(()=>{s.value&&(l(),r=n.matchMedia(tt(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return ks(()=>{c(),l(),r=void 0}),i}const an=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},fn="__vueuse_ssr_handlers__",ga=ma();function ma(){return fn in an||(an[fn]=an[fn]||{}),an[fn]}function ho(e,t){return ga[e]||t}function Ks(e){return uo("(prefers-color-scheme: dark)",e)}function ya(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 va={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()}},Pr="vueuse-storage";function _a(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:u=!1,shallow:a,window:h=Ge,eventFilter:v,onError:x=_=>{console.error(_)},initOnMounted:L}=s,O=(a?ci:de)(typeof t=="function"?t():t);if(!n)try{n=ho("getDefaultStorage",()=>{var _;return(_=Ge)==null?void 0:_.localStorage})()}catch(_){x(_)}if(!n)return O;const G=tt(t),U=ya(G),W=(r=s.serializer)!=null?r:va[U],{pause:g,resume:p}=ua(O,()=>$(O.value),{flush:i,deep:o,eventFilter:v});h&&l&&Ws(()=>{n instanceof Storage?Rt(h,"storage",K):Rt(h,Pr,I),L&&K()}),L||K();function A(_,P){if(h){const b={key:e,oldValue:_,newValue:P,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",b):new CustomEvent(Pr,{detail:b}))}}function $(_){try{const P=n.getItem(e);if(_==null)A(P,null),n.removeItem(e);else{const b=W.write(_);P!==b&&(n.setItem(e,b),A(P,b))}}catch(P){x(P)}}function j(_){const P=_?_.newValue:n.getItem(e);if(P==null)return c&&G!=null&&n.setItem(e,W.write(G)),G;if(!_&&u){const b=W.read(P);return typeof u=="function"?u(b,G):U==="object"&&!Array.isArray(b)?{...G,...b}:b}else return typeof P!="string"?P:W.read(P)}function K(_){if(!(_&&_.storageArea!==n)){if(_&&_.key==null){O.value=G;return}if(!(_&&_.key!==e)){g();try{(_==null?void 0:_.newValue)!==W.write(O.value)&&(O.value=j(_))}catch(P){x(P)}finally{_?Fn(p):p()}}}}function I(_){K(_.detail)}return O}const ba="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function wa(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=Ge,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:u,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},v=Ks({window:r}),x=oe(()=>v.value?"dark":"light"),L=c||(o==null?ao(s):_a(o,s,i,{window:r,listenToStorageChanges:l})),O=oe(()=>L.value==="auto"?x.value:L.value),G=ho("updateHTMLAttrs",(p,A,$)=>{const j=typeof p=="string"?r==null?void 0:r.document.querySelector(p):fo(p);if(!j)return;const K=new Set,I=new Set;let _=null;if(A==="class"){const b=$.split(/\s/g);Object.values(h).flatMap(V=>(V||"").split(/\s/g)).filter(Boolean).forEach(V=>{b.includes(V)?K.add(V):I.add(V)})}else _={key:A,value:$};if(K.size===0&&I.size===0&&_===null)return;let P;a&&(P=r.document.createElement("style"),P.appendChild(document.createTextNode(ba)),r.document.head.appendChild(P));for(const b of K)j.classList.add(b);for(const b of I)j.classList.remove(b);_&&j.setAttribute(_.key,_.value),a&&(r.getComputedStyle(P).opacity,document.head.removeChild(P))});function U(p){var A;G(t,n,(A=h[p])!=null?A:p)}function W(p){e.onChanged?e.onChanged(p,U):U(p)}Fe(O,W,{flush:"post",immediate:!0}),Ws(()=>W(O.value));const g=oe({get(){return u?L.value:O.value},set(p){L.value=p}});try{return Object.assign(g,{store:L,system:x,state:O})}catch{return g}}function xa(e={}){const{valueDark:t="dark",valueLight:n="",window:s=Ge}=e,r=wa({...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=oe(()=>r.system?r.system.value:Ks({window:s}).value?"dark":"light");return oe({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}function is(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function po(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 os=new WeakMap;function mf(e,t=!1){const n=de(t);let s=null,r="";Fe(ao(e),l=>{const c=is(tt(l));if(c){const u=c;if(os.get(u)||os.set(u,u.style.overflow),u.style.overflow!=="hidden"&&(r=u.style.overflow),u.style.overflow==="hidden")return n.value=!0;if(n.value)return u.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=is(tt(e));!l||n.value||(Lr&&(s=Rt(l,"touchmove",c=>{Sa(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=is(tt(e));!l||!n.value||(Lr&&(s==null||s()),l.style.overflow=r,os.delete(l),n.value=!1)};return ks(o),oe({get(){return n.value},set(l){l?i():o()}})}function yf(e={}){const{window:t=Ge,behavior:n="auto"}=e;if(!t)return{x:de(0),y:de(0)};const s=de(t.scrollX),r=de(t.scrollY),i=oe({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),o=oe({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return Rt(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function vf(e={}){const{window:t=Ge,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=de(n),c=de(s),u=()=>{t&&(o==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(u(),Ws(u),Rt("resize",u,{passive:!0}),r){const a=uo("(orientation: portrait)");Fe(a,()=>u())}return{width:l,height:c}}const ls={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var cs={};const go=/^(?:[a-z]+:|\/\/)/i,Ea="vitepress-theme-appearance",Ca=/#.*$/,Ta=/[?#].*$/,Aa=/(?:(^|\/)index)?\.(?:md|html)$/,ge=typeof document<"u",mo={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Ra(e,t,n=!1){if(t===void 0)return!1;if(e=Nr(`/${e}`),n)return new RegExp(t).test(e);if(Nr(t)!==e)return!1;const s=t.match(Ca);return s?(ge?location.hash:"")===s[0]:!0}function Nr(e){return decodeURI(e).replace(Ta,"").replace(Aa,"$1")}function Oa(e){return go.test(e)}function Ma(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Oa(n)&&Ra(t,`/${n}/`,!0))||"root"}function Ia(e,t){var s,r,i,o,l,c,u;const n=Ma(e,t);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:vo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(u=e.locales[n])==null?void 0:u.themeConfig}})}function yo(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=La(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function La(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Pa(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 vo(e,t){return[...e.filter(n=>!Pa(t,n)),...t]}const Na=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Fa=/^[a-z]:/i;function Fr(e){const t=Fa.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Na,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const as=new Set;function Ha(e){if(as.size===0){const n=typeof process=="object"&&(cs==null?void 0:cs.VITE_EXTRA_EXTENSIONS)||(ls==null?void 0:ls.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=>as.add(s))}const t=e.split(".").pop();return t==null||!as.has(t.toLowerCase())}const Da=Symbol(),mt=ci(sa);function _f(e){const t=oe(()=>Ia(mt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?de(!0):n==="force-auto"?Ks():n?xa({storageKey:Ea,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):de(!1),r=de(ge?location.hash:"");return ge&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Fe(()=>e.data,()=>{r.value=ge?location.hash:""}),{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>yo(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:s,hash:oe(()=>r.value)}}function $a(){const e=At(Da);if(!e)throw new Error("vitepress data not properly injected in app");return e}function ja(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function Hr(e){return go.test(e)||!e.startsWith("/")?e:ja(mt.value.base,e)}function Va(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ge){const n="/";t=Fr(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=`./${Fr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let yn=[];function bf(e){yn.push(e),$n(()=>{yn=yn.filter(t=>t!==e)})}function Ua(){let e=mt.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=Dr(e,n);else if(Array.isArray(e))for(const s of e){const r=Dr(s,n);if(r){t=r;break}}return t}function Dr(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const Ba=Symbol(),_o="http://a.com",ka=()=>({path:"/",component:null,data:mo});function wf(e,t){const n=Ln(ka()),s={route:n,go:r};async function r(l=ge?location.href:"/"){var c,u;l=fs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ge&&l!==fs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",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 v,x;if(await((v=s.onBeforePageLoad)==null?void 0:v.call(s,l))===!1)return;const a=new URL(l,_o),h=i=a.pathname;try{let L=await e(h);if(!L)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:O,__pageData:G}=L;if(!O)throw new Error(`Invalid route component: ${O}`);await((x=s.onAfterPageLoad)==null?void 0:x.call(s,l)),n.path=ge?h:Hr(h),n.component=pn(O),n.data=pn(G),ge&&Fn(()=>{let U=mt.value.base+G.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!mt.value.cleanUrls&&!U.endsWith("/")&&(U+=".html"),U!==a.pathname&&(a.pathname=U,l=U+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(g){console.warn(g)}if(W){$r(W,a.hash);return}}window.scrollTo(0,c)})}}catch(L){if(!/fetch|Page not found/.test(L.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(L),!u)try{const O=await fetch(mt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await O.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=ge?h:Hr(h),n.component=t?pn(t):null;const O=ge?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...mo,relativePath:O}}}}return ge&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const u=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(u==null)return;const{href:a,origin:h,pathname:v,hash:x,search:L}=new URL(u,c.baseURI),O=new URL(location.href);h===O.origin&&Ha(v)&&(l.preventDefault(),v===O.pathname&&L===O.search?(x!==O.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:O.href,newURL:a}))),x?$r(c,x,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(fs(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 Wa(){const e=At(Ba);if(!e)throw new Error("useRouter() is called without provider.");return e}function bo(){return Wa().route}function $r(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-Ua()+i;requestAnimationFrame(r)}}function fs(e){const t=new URL(e,_o);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),mt.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 un=()=>yn.forEach(e=>e()),xf=xi({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=bo(),{frontmatter:n,site:s}=$a();return Fe(n,un,{deep:!0,flush:"post"}),()=>Cs(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Cs(t.component,{onVnodeMounted:un,onVnodeUpdated:un,onVnodeUnmounted:un}):"404 Page Not Found"])}}),Sf=xi({setup(e,{slots:t}){const n=de(!1);return Ot(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Ef(){ge&&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 Cf(){if(ge){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(a=>a.remove());let u=c.textContent||"";o&&(u=u.replace(/^ *(\$|>) /gm,"").trim()),Ka(u).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function Ka(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 Tf(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=us(l);for(const u of document.head.children)if(u.isEqualNode(c)){s.push(u);return}});return}const o=i.map(us);s.forEach((l,c)=>{const u=o.findIndex(a=>a==null?void 0:a.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)};Wi(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],u=yo(o,i);u!==document.title&&(document.title=u);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):us(["meta",{name:"description",content:a}]),r(vo(o.head,Ga(c)))})}function us([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==null&&(s.async=!1),s}function qa(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Ga(e){return e.filter(t=>!qa(t))}const ds=new Set,wo=()=>document.createElement("link"),Ya=e=>{const t=wo();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Xa=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let dn;const Ja=ge&&(dn=wo())&&dn.relList&&dn.relList.supports&&dn.relList.supports("prefetch")?Ya:Xa;function Af(){if(!ge||!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(!ds.has(c)){ds.add(c);const u=Va(c);u&&Ja(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):ds.add(l))})})};Ot(s);const r=bo();Fe(()=>r.path,s),$n(()=>{n&&n.disconnect()})}export{vf as $,Ln as A,Fl as B,tf as C,Za as D,cf as E,xe as F,$a as G,Oa as H,Ha as I,Hr as J,Ra as K,uo as L,Wi as M,$n as N,rf as O,Ua as P,Qa as Q,ef as R,Do as S,af as T,bf as U,go as V,Zi as W,bo as X,sf as Y,mc as Z,pf as _,Pn as a,gf as a0,yf as a1,ge as a2,mf as a3,nf as a4,df as a5,uf as a6,lf as a7,Tf as a8,Ba as a9,_f as aa,Da as ab,xf as ac,Sf as ad,mt as ae,hf as af,wf as ag,Va as ah,Af as ai,Cf as aj,Ef as ak,Cs as al,Gr as b,jo as c,oe as d,xi as e,Ci as f,Un as g,xs as h,At as i,Ss as j,wl as k,za as l,Qi as m,Fn as n,Ot as o,Ls as p,Is as q,de as r,ci as s,dl as t,fi as u,ff as v,Fe as w,of as x,he as y,Xl as z}; diff --git a/assets/chunks/theme.D83hjUQE.js b/assets/chunks/theme.D83hjUQE.js new file mode 100644 index 0000000..9a6385a --- /dev/null +++ b/assets/chunks/theme.D83hjUQE.js @@ -0,0 +1 @@ +import{u as i,o as q,n as oe,r as V,a as Qe,w as W,g as he,b as Ze,c as xe,s as Ce,d as S,i as ee,e as k,f as Ae,t as je,h as r,j as P,k as f,l as Ct,v as At,m as p,p as C,q as re,T as _e,x as d,y as $,F as O,z as le,A as et,B as tt,C as v,D as J,E as y,G as Ee,H as Et,I as Ht,J as He,K as se,L as Le,M as be,N as Ie,O as ge,P as It,Q as te,R as j,S as H,_ as T,U as ke,V as nt,W as Z,X as ie,Y as ot,Z as x,$ as Bt,a0 as Ot,a1 as st,a2 as ye,a3 as at,a4 as Dt,a5 as Ft,a6 as rt}from"./framework.K8kzz9Vz.js";function zt(n){return Ze()?(xe(n),!0):!1}function $e(n){return typeof n=="function"?n():i(n)}const Wt=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const jt=Object.prototype.toString,Gt=n=>jt.call(n)==="[object Object]",Rt=()=>{};function Ut(n,e){function t(...o){return new Promise((s,a)=>{Promise.resolve(n(()=>e.apply(this,o),{fn:e,thisArg:this,args:o})).then(s).catch(a)})}return t}const lt=n=>n();function Kt(n=lt){const e=V(!0);function t(){e.value=!1}function o(){e.value=!0}const s=(...a)=>{e.value&&n(...a)};return{isActive:Qe(e),pause:t,resume:o,eventFilter:s}}function qt(n){return he()}function Jt(n,e,t={}){const{eventFilter:o=lt,...s}=t;return W(n,Ut(o,e),s)}function Yt(n,e,t={}){const{eventFilter:o,...s}=t,{eventFilter:a,pause:l,resume:c,isActive:u}=Kt(o);return{stop:Jt(n,e,{...s,eventFilter:a}),pause:l,resume:c,isActive:u}}function Xt(n,e=!0,t){qt()?q(n,t):e?n():oe(n)}const fe=Wt?window:void 0;function Qt(n){var e;const t=$e(n);return(e=t==null?void 0:t.$el)!=null?e:t}function Ge(...n){let e,t,o,s;if(typeof n[0]=="string"||Array.isArray(n[0])?([t,o,s]=n,e=fe):[e,t,o,s]=n,!e)return Rt;Array.isArray(t)||(t=[t]),Array.isArray(o)||(o=[o]);const a=[],l=()=>{a.forEach(g=>g()),a.length=0},c=(g,m,h,N)=>(g.addEventListener(m,h,N),()=>g.removeEventListener(m,h,N)),u=W(()=>[Qt(e),$e(s)],([g,m])=>{if(l(),!g)return;const h=Gt(m)?{...m}:m;a.push(...t.flatMap(N=>o.map(b=>c(g,N,b,h))))},{immediate:!0,flush:"post"}),_=()=>{u(),l()};return zt(_),_}const de=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ve="__vueuse_ssr_handlers__",Zt=xt();function xt(){return ve in de||(de[ve]=de[ve]||{}),de[ve]}function en(n,e){return Zt[n]||e}function tn(n){return n==null?"any":n instanceof Set?"set":n instanceof Map?"map":n instanceof Date?"date":typeof n=="boolean"?"boolean":typeof n=="string"?"string":typeof n=="object"?"object":Number.isNaN(n)?"any":"number"}const nn={boolean:{read:n=>n==="true",write:n=>String(n)},object:{read:n=>JSON.parse(n),write:n=>JSON.stringify(n)},number:{read:n=>Number.parseFloat(n),write:n=>String(n)},any:{read:n=>n,write:n=>String(n)},string:{read:n=>n,write:n=>String(n)},map:{read:n=>new Map(JSON.parse(n)),write:n=>JSON.stringify(Array.from(n.entries()))},set:{read:n=>new Set(JSON.parse(n)),write:n=>JSON.stringify(Array.from(n))},date:{read:n=>new Date(n),write:n=>n.toISOString()}},Re="vueuse-storage";function on(n,e,t,o={}){var s;const{flush:a="pre",deep:l=!0,listenToStorageChanges:c=!0,writeDefaults:u=!0,mergeDefaults:_=!1,shallow:g,window:m=fe,eventFilter:h,onError:N=E=>{console.error(E)},initOnMounted:b}=o,w=(g?Ce:V)(typeof e=="function"?e():e);if(!t)try{t=en("getDefaultStorage",()=>{var E;return(E=fe)==null?void 0:E.localStorage})()}catch(E){N(E)}if(!t)return w;const L=$e(e),I=tn(L),B=(s=o.serializer)!=null?s:nn[I],{pause:R,resume:U}=Yt(w,()=>D(w.value),{flush:a,deep:l,eventFilter:h});m&&c&&Xt(()=>{t instanceof Storage?Ge(m,"storage",M):Ge(m,Re,K),b&&M()}),b||M();function Y(E,F){if(m){const G={key:n,oldValue:E,newValue:F,storageArea:t};m.dispatchEvent(t instanceof Storage?new StorageEvent("storage",G):new CustomEvent(Re,{detail:G}))}}function D(E){try{const F=t.getItem(n);if(E==null)Y(F,null),t.removeItem(n);else{const G=B.write(E);F!==G&&(t.setItem(n,G),Y(F,G))}}catch(F){N(F)}}function z(E){const F=E?E.newValue:t.getItem(n);if(F==null)return u&&L!=null&&t.setItem(n,B.write(L)),L;if(!E&&_){const G=B.read(F);return typeof _=="function"?_(G,L):I==="object"&&!Array.isArray(G)?{...L,...G}:G}else return typeof F!="string"?F:B.read(F)}function M(E){if(!(E&&E.storageArea!==t)){if(E&&E.key==null){w.value=L;return}if(!(E&&E.key!==n)){R();try{(E==null?void 0:E.newValue)!==B.write(w.value)&&(w.value=z(E))}catch(F){N(F)}finally{E?oe(U):U()}}}}function K(E){M(E.detail)}return w}function sn(n,e,t={}){const{window:o=fe}=t;return on(n,e,o==null?void 0:o.localStorage,t)}function it(n){return Ze()?(xe(n),!0):!1}function ct(n){return typeof n=="function"?n():i(n)}const ut=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const an=Object.prototype.toString,dt=n=>an.call(n)==="[object Object]",rn=()=>{};function we(n){var e;const t=ct(n);return(e=t==null?void 0:t.$el)!=null?e:t}const vt=ut?window:void 0;function Ve(...n){let e,t,o,s;if(typeof n[0]=="string"||Array.isArray(n[0])?([t,o,s]=n,e=vt):[e,t,o,s]=n,!e)return rn;Array.isArray(t)||(t=[t]),Array.isArray(o)||(o=[o]);const a=[],l=()=>{a.forEach(g=>g()),a.length=0},c=(g,m,h,N)=>(g.addEventListener(m,h,N),()=>g.removeEventListener(m,h,N)),u=W(()=>[we(e),ct(s)],([g,m])=>{if(l(),!g)return;const h=dt(m)?{...m}:m;a.push(...t.flatMap(N=>o.map(b=>c(g,N,b,h))))},{immediate:!0,flush:"post"}),_=()=>{u(),l()};return it(_),_}function ln(){const n=V(!1),e=he();return e&&q(()=>{n.value=!0},e),n}function cn(n){const e=ln();return S(()=>(e.value,!!n()))}function un(n,e,t={}){const{window:o=vt,...s}=t;let a;const l=cn(()=>o&&"ResizeObserver"in o),c=()=>{a&&(a.disconnect(),a=void 0)},u=S(()=>Array.isArray(n)?n.map(m=>we(m)):[we(n)]),_=W(u,m=>{if(c(),l.value&&o){a=new ResizeObserver(e);for(const h of m)h&&a.observe(h,s)}},{immediate:!0,flush:"post"}),g=()=>{c(),_()};return it(g),{isSupported:l,stop:g}}const pt=Symbol("scrollbarContextKey"),ae=4,dn={vertical:{offset:"offsetHeight",scroll:"scrollTop",scrollSize:"scrollHeight",size:"height",key:"vertical",axis:"Y",client:"clientY",direction:"top"},horizontal:{offset:"offsetWidth",scroll:"scrollLeft",scrollSize:"scrollWidth",size:"width",key:"horizontal",axis:"X",client:"clientX",direction:"left"}},vn=({move:n,size:e,bar:t})=>({[t.size]:e,transform:`translate${t.axis}(${n}%)`});function Ue(n,e="px"){if(!n)return"";if(typeof n=="number"||pn(n))return`${n}${e}`;if(typeof n=="string")return n}const pn=n=>typeof n!="string"?!1:!Number.isNaN(Number(n));class fn extends Error{constructor(e){super(e),this.name="ElementPlusError"}}function mn(n,e){throw new fn(`[${n}] ${e}`)}const hn=Symbol(""),Ke=V();function _n(n,e=void 0){const t=he()?ee(hn,Ke):Ke;return S(()=>{var o;return((o=t.value)==null?void 0:o[n])??e})}const bn="el",gn="is-",ne=(n,e,t,o,s)=>{let a=`${n}-${e}`;return t&&(a+=`-${t}`),o&&(a+=`__${o}`),s&&(a+=`--${s}`),a},ft=n=>{const e=_n("namespace",bn);return{namespace:e,b:(b="")=>ne(e.value,n,b,"",""),e:b=>b?ne(e.value,n,"",b,""):"",m:b=>b?ne(e.value,n,"","",b):"",be:(b,w)=>b&&w?ne(e.value,n,b,w,""):"",em:(b,w)=>b&&w?ne(e.value,n,"",b,w):"",bm:(b,w)=>b&&w?ne(e.value,n,b,"",w):"",bem:(b,w,L)=>b&&w&&L?ne(e.value,n,b,w,L):"",is:(b,...w)=>{const L=w.length>=1?w[0]:!0;return b&&L?`${gn}${b}`:""},cssVar:b=>{const w={};for(const L in b)b[L]&&(w[`--${e.value}-${L}`]=b[L]);return w},cssVarName:b=>`--${e.value}-${b}`,cssVarBlock:b=>{const w={};for(const L in b)b[L]&&(w[`--${e.value}-${n}-${L}`]=b[L]);return w},cssVarBlockName:b=>`--${e.value}-${n}-${b}`}},kn={vertical:Boolean,size:String,move:Number,ratio:{type:Number,required:!0},always:Boolean},yn="Thumb",qe=k({__name:"thumb",props:kn,setup(n){const e=n,t=ee(pt),o=ft("scrollbar");t||mn(yn,"can not inject scrollbar context");const s=V(),a=V(),l=V({}),c=V(!1);let u=!1,_=!1,g=ut?document.onselectstart:null;const m=S(()=>dn[e.vertical?"vertical":"horizontal"]),h=S(()=>vn({size:e.size,move:e.move,bar:m.value})),N=S(()=>s.value[m.value.offset]**2/t.wrapElement[m.value.scrollSize]/e.ratio/a.value[m.value.offset]),b=D=>{var M;if(D.stopPropagation(),D.ctrlKey||[1,2].includes(D.button))return;(M=window.getSelection())==null||M.removeAllRanges(),L(D);const z=D.currentTarget;z&&(l.value[m.value.axis]=z[m.value.offset]-(D[m.value.client]-z.getBoundingClientRect()[m.value.direction]))},w=D=>{if(!a.value||!s.value||!t.wrapElement)return;const z=Math.abs(D.target.getBoundingClientRect()[m.value.direction]-D[m.value.client]),M=a.value[m.value.offset]/2,K=(z-M)*100*N.value/s.value[m.value.offset];t.wrapElement[m.value.scroll]=K*t.wrapElement[m.value.scrollSize]/100},L=D=>{D.stopImmediatePropagation(),u=!0,document.addEventListener("mousemove",I),document.addEventListener("mouseup",B),g=document.onselectstart,document.onselectstart=()=>!1},I=D=>{if(!s.value||!a.value||u===!1)return;const z=l.value[m.value.axis];if(!z)return;const M=(s.value.getBoundingClientRect()[m.value.direction]-D[m.value.client])*-1,K=a.value[m.value.offset]-z,E=(M-K)*100*N.value/s.value[m.value.offset];t.wrapElement[m.value.scroll]=E*t.wrapElement[m.value.scrollSize]/100},B=()=>{u=!1,l.value[m.value.axis]=0,document.removeEventListener("mousemove",I),document.removeEventListener("mouseup",B),Y(),_&&(c.value=!1)},R=()=>{_=!1,c.value=!!e.size},U=()=>{_=!0,c.value=u};Ae(()=>{Y(),document.removeEventListener("mouseup",B)});const Y=()=>{document.onselectstart!==g&&(document.onselectstart=g)};return Ve(je(t,"scrollbarElement"),"mousemove",R),Ve(je(t,"scrollbarElement"),"mouseleave",U),(D,z)=>(r(),P(_e,{name:i(o).b("fade")},{default:f(()=>[Ct(p("div",{ref_key:"instance",ref:s,class:C([i(o).e("bar"),i(o).is(m.value.key)]),onMousedown:w},[p("div",{ref_key:"thumb",ref:a,class:C(i(o).e("thumb")),style:re(h.value),onMousedown:b},null,38)],34),[[At,D.always||c.value]])]),_:1},8,["name"]))}}),$n={always:{type:Boolean,default:!0},width:String,height:String,ratioX:{type:Number,default:1},ratioY:{type:Number,default:1}},Sn=k({__name:"bar",props:$n,setup(n,{expose:e}){const t=n,o=V(0),s=V(0);return e({handleScroll:l=>{if(l){const c=l.offsetHeight-ae,u=l.offsetWidth-ae;s.value=l.scrollTop*100/c*t.ratioY,o.value=l.scrollLeft*100/u*t.ratioX}}}),(l,c)=>(r(),d(O,null,[$(qe,{move:o.value,ratio:l.ratioX,size:l.width,always:l.always},null,8,["move","ratio","size","always"]),$(qe,{move:s.value,ratio:l.ratioY,size:l.height,vertical:"",always:l.always},null,8,["move","ratio","size","always"])],64))}}),Pn={height:{type:[String,Number],default:""},maxHeight:{type:[String,Number],default:""},native:{type:Boolean,default:!1},wrapStyle:{type:[String,Object,Array],default:""},wrapClass:{type:[String,Array],default:""},viewClass:{type:[String,Array],default:""},viewStyle:{type:[String,Array,Object],default:""},noresize:Boolean,tag:{type:String,default:"div"},always:Boolean,minSize:{type:Number,default:20}},Ln={scroll:({scrollTop:n,scrollLeft:e})=>[n,e].every(t=>typeof t=="number")},wn={name:"ElScrollbar"},Vn=k({...wn,props:Pn,emits:Ln,setup(n,{expose:e,emit:t}){const o=n,s=t,a=ft("scrollbar");let l,c;const u=V(),_=V(),g=V(),m=V("0"),h=V("0"),N=V(),b=V(1),w=V(1),L=S(()=>{const M={};return o.height&&(M.height=Ue(o.height)),o.maxHeight&&(M.maxHeight=Ue(o.maxHeight)),[o.wrapStyle,M]}),I=S(()=>[o.wrapClass,a.e("wrap"),{[a.em("wrap","hidden-default")]:!o.native}]),B=S(()=>[a.e("view"),o.viewClass]),R=()=>{var M;_.value&&((M=N.value)==null||M.handleScroll(_.value),s("scroll",{scrollTop:_.value.scrollTop,scrollLeft:_.value.scrollLeft}))};function U(M,K){dt(M)?_.value.scrollTo(M):typeof M=="number"&&typeof K=="number"&&_.value.scrollTo(M,K)}const Y=M=>{typeof M=="number"&&(_.value.scrollTop=M)},D=M=>{typeof M=="number"&&(_.value.scrollLeft=M)},z=()=>{if(!_.value)return;const M=_.value.offsetHeight-ae,K=_.value.offsetWidth-ae,E=M**2/_.value.scrollHeight,F=K**2/_.value.scrollWidth,G=Math.max(E,o.minSize),ue=Math.max(F,o.minSize);b.value=E/(M-E)/(G/(M-G)),w.value=F/(K-F)/(ue/(K-ue)),h.value=G+aeo.noresize,M=>{M?(l==null||l(),c==null||c()):({stop:l}=un(g,z),c=Ve("resize",z))},{immediate:!0}),W(()=>[o.maxHeight,o.height],()=>{o.native||oe(()=>{var M;z(),_.value&&((M=N.value)==null||M.handleScroll(_.value))})}),le(pt,et({scrollbarElement:u,wrapElement:_})),q(()=>{o.native||oe(()=>{z()})}),tt(()=>z()),e({wrapRef:_,update:z,scrollTo:U,setScrollTop:Y,setScrollLeft:D,handleScroll:R}),(M,K)=>(r(),d("div",{ref_key:"scrollbarRef",ref:u,class:C(i(a).b())},[p("div",{ref_key:"wrapRef",ref:_,class:C(I.value),style:re(L.value),onScroll:R},[(r(),P(J(M.tag),{ref_key:"resizeRef",ref:g,class:C(B.value),style:re(M.viewStyle)},{default:f(()=>[v(M.$slots,"default")]),_:3},8,["class","style"]))],38),M.native?y("",!0):(r(),P(Sn,{key:0,ref_key:"barRef",ref:N,height:h.value,width:m.value,always:M.always,"ratio-x":w.value,"ratio-y":b.value},null,8,["height","width","always","ratio-x","ratio-y"]))],2))}}),A=Ee;function Tn(n,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(n,e):(n(),(o=!0)&&setTimeout(()=>o=!1,e))}}function Te(n){return/^\//.test(n)?n:`/${n}`}function Be(n){const{pathname:e,search:t,hash:o,protocol:s}=new URL(n,"http://a.com");if(Et(n)||n.startsWith("#")||!s.startsWith("http")||!Ht(e))return n;const{site:a}=A(),l=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,a.value.cleanUrls?"":".html")}${t}${o}`);return He(l)}function mt(n,e){if(Array.isArray(n))return pe(n);if(n==null)return[];e=Te(e);const t=Object.keys(n).sort((s,a)=>a.split("/").length-s.split("/").length).find(s=>e.startsWith(Te(s))),o=t?n[t]:[];return Array.isArray(o)?pe(o):pe(o.items,o.base)}function Nn(n){const e=[];let t=0;for(const o in n){const s=n[o];if(s.items){t=e.push(s);continue}e[t]||e.push({items:[]}),e[t].items.push(s)}return e}function Mn(n){const e=[];function t(o){for(const s of o)s.text&&s.link&&e.push({text:s.text,link:s.link,docFooterText:s.docFooterText}),s.items&&t(s.items)}return t(n),e}function Ne(n,e){return Array.isArray(e)?e.some(t=>Ne(n,t)):se(n,e.link)?!0:e.items?Ne(n,e.items):!1}function pe(n,e){return[...n].map(t=>{const o={...t},s=o.base||e;return s&&o.link&&(o.link=s+o.link),o.items&&(o.items=pe(o.items,s)),o})}function X(){const{frontmatter:n,page:e,theme:t}=A(),o=Le("(min-width: 960px)"),s=V(!1),a=S(()=>{const w=t.value.sidebar,L=e.value.relativePath;return w?mt(w,L):[]}),l=V(a.value);W(a,(w,L)=>{JSON.stringify(w)!==JSON.stringify(L)&&(l.value=a.value)});const c=S(()=>n.value.sidebar!==!1&&l.value.length>0&&n.value.layout!=="home"),u=S(()=>_?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),_=S(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),g=S(()=>c.value&&o.value),m=S(()=>c.value?Nn(l.value):[]);function h(){s.value=!0}function N(){s.value=!1}function b(){s.value?N():h()}return{isOpen:s,sidebar:l,sidebarGroups:m,hasSidebar:c,hasAside:_,leftAside:u,isSidebarEnabled:g,open:h,close:N,toggle:b}}function ht(n,e){let t;be(()=>{t=n.value?document.activeElement:void 0}),q(()=>{window.addEventListener("keyup",o)}),Ie(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function Cn(n){const{page:e,hash:t}=A(),o=V(!1),s=S(()=>n.value.collapsed!=null),a=S(()=>!!n.value.link),l=V(!1),c=()=>{l.value=se(e.value.relativePath,n.value.link)};W([e,n,t],c),q(c);const u=S(()=>l.value?!0:n.value.items?Ne(e.value.relativePath,n.value.items):!1),_=S(()=>!!(n.value.items&&n.value.items.length));be(()=>{o.value=!!(s.value&&n.value.collapsed)}),ge(()=>{(l.value||u.value)&&(o.value=!1)});function g(){s.value&&(o.value=!o.value)}return{collapsed:o,collapsible:s,isLink:a,isActiveLink:l,hasActiveLink:u,hasChildren:_,toggle:g}}function An(){const{hasSidebar:n}=X(),e=Le("(min-width: 960px)"),t=Le("(min-width: 1280px)");return{isAsideEnabled:S(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Me=[];function _t(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function En(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,s]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return Bn(n,o,s)}function Hn(n,e){const{isAsideEnabled:t}=An(),o=Tn(a,100);let s=null;q(()=>{requestAnimationFrame(a),window.addEventListener("scroll",o)}),tt(()=>{l(location.hash)}),Ie(()=>{window.removeEventListener("scroll",o)});function a(){if(!t.value)return;const c=window.scrollY,u=window.innerHeight,_=document.body.offsetHeight,g=Math.abs(c+u-_)<1,m=Me.map(({element:N,link:b})=>({link:b,top:In(N)})).filter(({top:N})=>!Number.isNaN(N)).sort((N,b)=>N.top-b.top);if(!m.length){l(null);return}if(c<1){l(null);return}if(g){l(m[m.length-1].link);return}let h=null;for(const{link:N,top:b}of m){if(b>c+It()+4)break;h=N}l(h)}function l(c){s&&s.classList.remove("active"),c==null?s=null:s=n.value.querySelector(`a[href="${decodeURIComponent(c)}"]`);const u=s;u?(u.classList.add("active"),e.value.style.top=u.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function In(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}function Bn(n,e,t){Me.length=0;const o=[],s=[];return n.forEach(a=>{const l={...a,children:[]};let c=s[s.length-1];for(;c&&c.level>=l.level;)s.pop(),c=s[s.length-1];if(l.element.classList.contains("ignore-header")||c&&"shouldIgnore"in c){s.push({level:l.level,shouldIgnore:!0});return}l.level>t||l.levelt.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:Dn(t),link:"#"+t.id,level:o}});return En(e,n)}const On=["badge","VPBadge","header-anchor","ignore-header"];function Dn(n){let e="";for(const t of n.childNodes)if(t.nodeType===Node.ELEMENT_NODE){if(On.some(o=>t.classList.contains(o)))continue;e+=t.textContent}else t.nodeType===Node.TEXT_NODE&&(e+=t.textContent.replace(/(\w+)\(.+?\)(\s|$).*/,"$1()"));return e.trim()}const Fn=["href","title"],zn=k({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(n){function e({target:t}){const o=t.href.split("#")[1],s=document.getElementById(decodeURIComponent(o));s==null||s.focus({preventScroll:!0})}return(t,o)=>{const s=te("VPDocOutlineItem",!0);return r(),d("ul",{class:C(["VPDocOutlineItem",t.root?"root":"nested"])},[(r(!0),d(O,null,j(t.headers,({children:a,link:l,title:c})=>(r(),d("li",null,[p("a",{class:"outline-link",href:l,onClick:e,title:c},H(c),9,Fn),a!=null&&a.length?(r(),P(s,{key:0,headers:a},null,8,["headers"])):y("",!0)]))),256))],2)}}}),bt=T(zn,[["__scopeId","data-v-53c99d69"]]),Wn={class:"content"},jn={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},Gn=k({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=A(),o=Ce([]);ke(()=>{o.value=Oe(e.value.outline??t.value.outline)});const s=V(),a=V();return Hn(s,a),(l,c)=>(r(),d("nav",{"aria-labelledby":"doc-outline-aria-label",class:C(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s},[p("div",Wn,[p("div",{class:"outline-marker",ref_key:"marker",ref:a},null,512),p("div",jn,H(i(_t)(i(t))),1),$(bt,{headers:o.value,root:!0},null,8,["headers"])])],2))}}),Rn=T(Gn,[["__scopeId","data-v-f610f197"]]),Un={class:"VPDocAsideCarbonAds"},Kn=k({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,o)=>(r(),d("div",Un,[$(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),qn={class:"VPDocAside"},Jn=k({__name:"VPDocAside",setup(n){const{theme:e}=A();return(t,o)=>(r(),d("div",qn,[v(t.$slots,"aside-top",{},void 0,!0),v(t.$slots,"aside-outline-before",{},void 0,!0),$(Rn),v(t.$slots,"aside-outline-after",{},void 0,!0),o[0]||(o[0]=p("div",{class:"spacer"},null,-1)),v(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(r(),P(Kn,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):y("",!0),v(t.$slots,"aside-ads-after",{},void 0,!0),v(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Yn=T(Jn,[["__scopeId","data-v-cb998dce"]]);function Xn(){const{theme:n,page:e}=A();return S(()=>{const{text:t="Edit this page",pattern:o=""}=n.value.editLink||{},{relativePath:s}=e.value;let a=o.replace(/:path/g,s);return n.value.crowdin&&(a=a.replace(/:id/g,n.value.crowdin[s.split("/").slice(1).join("/")])),{url:a,text:t}})}function Qn(){const{page:n,theme:e,frontmatter:t}=A();return S(()=>{var _,g,m,h,N,b,w,L;const o=mt(e.value.sidebar,n.value.relativePath),s=Mn(o),a=Zn(s,I=>I.link.replace(/[?#].*$/,"")),l=a.findIndex(I=>se(n.value.relativePath,I.link)),c=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,u=((g=e.value.docFooter)==null?void 0:g.next)===!1&&!t.value.next||t.value.next===!1;return{prev:c?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((m=a[l-1])==null?void 0:m.docFooterText)??((h=a[l-1])==null?void 0:h.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((N=a[l-1])==null?void 0:N.link)},next:u?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((b=a[l+1])==null?void 0:b.docFooterText)??((w=a[l+1])==null?void 0:w.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((L=a[l+1])==null?void 0:L.link)}}})}function Zn(n,e){const t=new Set;return n.filter(o=>{const s=e(o);return t.has(s)?!1:t.add(s)})}const Q=k({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=S(()=>e.tag??(e.href?"a":"span")),o=S(()=>e.href&&nt.test(e.href)||e.target==="_blank");return(s,a)=>(r(),P(J(t.value),{class:C(["VPLink",{link:s.href,"vp-external-link-icon":o.value,"no-icon":s.noIcon}]),href:s.href?i(Be)(s.href):void 0,target:s.target??(o.value?"_blank":void 0),rel:s.rel??(o.value?"noreferrer":void 0)},{default:f(()=>[v(s.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),xn={class:"VPLastUpdated"},eo=["datetime"],to=k({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,lang:o}=A(),s=S(()=>new Date(t.value.lastUpdated)),a=S(()=>s.value.toISOString()),l=V("");return q(()=>{be(()=>{var c,u,_;l.value=new Intl.DateTimeFormat((u=(c=e.value.lastUpdated)==null?void 0:c.formatOptions)!=null&&u.forceLocale?o.value:void 0,((_=e.value.lastUpdated)==null?void 0:_.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(s.value)})}),(c,u)=>{var _;return r(),d("p",xn,[Z(H(((_=i(e).lastUpdated)==null?void 0:_.text)||i(e).lastUpdatedText||"Last updated")+": ",1),p("time",{datetime:a.value},H(l.value),9,eo)])}}}),no=T(to,[["__scopeId","data-v-1bb0c8a8"]]),oo={key:0,class:"VPDocFooter"},so={key:0,class:"edit-info"},ao={key:0,class:"edit-link"},ro={key:1,class:"last-updated"},lo={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},io={class:"pager"},co=["innerHTML"],uo=["innerHTML"],vo={class:"pager"},po=["innerHTML"],fo=["innerHTML"],mo=k({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:o}=A(),s=Xn(),a=Qn(),l=S(()=>e.value.editLink&&o.value.editLink!==!1),c=S(()=>t.value.lastUpdated),u=S(()=>l.value||c.value||a.value.prev||a.value.next);return(_,g)=>{var m,h,N,b;return u.value?(r(),d("footer",oo,[v(_.$slots,"doc-footer-before",{},void 0,!0),l.value||c.value?(r(),d("div",so,[l.value?(r(),d("div",ao,[$(Q,{class:"edit-link-button",href:i(s).url,"no-icon":!0},{default:f(()=>[g[0]||(g[0]=p("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),Z(" "+H(i(s).text),1)]),_:1},8,["href"])])):y("",!0),c.value?(r(),d("div",ro,[$(no)])):y("",!0)])):y("",!0),(m=i(a).prev)!=null&&m.link||(h=i(a).next)!=null&&h.link?(r(),d("nav",lo,[g[1]||(g[1]=p("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),p("div",io,[(N=i(a).prev)!=null&&N.link?(r(),P(Q,{key:0,class:"pager-link prev",href:i(a).prev.link},{default:f(()=>{var w;return[p("span",{class:"desc",innerHTML:((w=i(e).docFooter)==null?void 0:w.prev)||"Previous page"},null,8,co),p("span",{class:"title",innerHTML:i(a).prev.text},null,8,uo)]}),_:1},8,["href"])):y("",!0)]),p("div",vo,[(b=i(a).next)!=null&&b.link?(r(),P(Q,{key:0,class:"pager-link next",href:i(a).next.link},{default:f(()=>{var w;return[p("span",{class:"desc",innerHTML:((w=i(e).docFooter)==null?void 0:w.next)||"Next page"},null,8,po),p("span",{class:"title",innerHTML:i(a).next.text},null,8,fo)]}),_:1},8,["href"])):y("",!0)])])):y("",!0)])):y("",!0)}}}),ho=T(mo,[["__scopeId","data-v-1bcd8184"]]),_o={class:"container"},bo={class:"aside-container"},go={class:"aside-content"},ko={class:"content"},yo={class:"content-container"},$o={class:"main"},So=k({__name:"VPDoc",setup(n){const{theme:e}=A(),t=ie(),{hasSidebar:o,hasAside:s,leftAside:a}=X(),l=S(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(c,u)=>{const _=te("Content");return r(),d("div",{class:C(["VPDoc",{"has-sidebar":i(o),"has-aside":i(s)}])},[v(c.$slots,"doc-top",{},void 0,!0),p("div",_o,[i(s)?(r(),d("div",{key:0,class:C(["aside",{"left-aside":i(a)}])},[u[0]||(u[0]=p("div",{class:"aside-curtain"},null,-1)),p("div",bo,[p("div",go,[$(Yn,null,{"aside-top":f(()=>[v(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[v(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[v(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[v(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[v(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[v(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):y("",!0),p("div",ko,[p("div",yo,[v(c.$slots,"doc-before",{},void 0,!0),p("main",$o,[$(_,{class:C(["vp-doc",[l.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),$(ho,null,{"doc-footer-before":f(()=>[v(c.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),v(c.$slots,"doc-after",{},void 0,!0)])])]),v(c.$slots,"doc-bottom",{},void 0,!0)],2)}}}),gt=T(So,[["__scopeId","data-v-e6f2a212"]]),Po={class:"spoiler"},Lo=k({__name:"spoiler",props:{text:{type:String}},setup(n){return(e,t)=>(r(),d("span",Po,[v(e.$slots,"default",{},()=>[Z(H(n.text),1)],!0)]))}}),wo=T(Lo,[["__scopeId","data-v-4b7f368a"]]),Vo=["src"],To={class:"nickname"},No={class:"message-box"},Mo=k({__name:"chat-message",props:{nickname:{},color:{},avatar:{}},setup(n,{expose:e}){const t={Alice:"#cc0066",Bob:"#00994d",Carol:"#1e90ff",Dave:"#f4a460"},o={Koishi:"https://koishi.chat/logo.png"},s=n,a=V(!1),l=V(!1),c=V(!1),u=V(),_=S(()=>s.color||t[s.nickname]),g=S(()=>s.avatar||o[s.nickname]);function m(){let I;for(const B of document.querySelectorAll(".chat-message")){if(B===u.value)return I;I=B}}W(l,I=>{if(!I)return a.value=!1;const B=m();if(!B||B.getBoundingClientRect().bottom<0)return N();const U=B.__vue__.exposed;U.moving.value||!U.shown.value?U.onappear(N):N()});let h=()=>{};function N(){a.value=!0,c.value=!0,setTimeout(()=>{c.value=!1,h()},100)}function b(){u.value.getBoundingClientRect().top{u.value.__vue__=w,b(),addEventListener("scroll",b),addEventListener("resize",b)}),Ae(()=>{removeEventListener("scroll",b),removeEventListener("resize",b)}),(I,B)=>(r(),d("div",{ref_key:"root",ref:u,class:C(["chat-message",{shown:a.value}])},[g.value?(r(),d("img",{key:0,class:"avatar",src:g.value},null,8,Vo)):(r(),d("div",{key:1,class:"avatar",style:re({backgroundColor:_.value})},H(I.nickname[0]),5)),p("div",To,H(I.nickname),1),p("div",No,[v(I.$slots,"default",{},()=>[B[0]||(B[0]=Z(" "))])])],2))}}),Co={props:{controls:Boolean,title:String},data:()=>({tab:"default"}),computed:{mini(){return!this.controls&&!this.title}}},Ao={class:"controls"},Eo={class:"title"},Ho={key:0,class:"title-text"},Io={class:"content"};function Bo(n,e,t,o,s,a){return r(),d("div",{class:C(["panel-view",{mini:a.mini}])},[p("div",Ao,[e[0]||(e[0]=p("div",{class:"circle red"},null,-1)),e[1]||(e[1]=p("div",{class:"circle yellow"},null,-1)),e[2]||(e[2]=p("div",{class:"circle green"},null,-1)),p("div",Eo,[t.title?(r(),d("span",Ho,H(t.title),1)):y("",!0)])]),p("div",Io,[v(n.$slots,"default")])],2)}const Oo=T(Co,[["render",Bo]]),Do={class:"tab-select"},Fo={class:"header"},zo=["onClick"],Wo=k({__name:"tab-select",setup(n){const e=ot(),t=S(()=>Object.keys(e).filter(s=>s.startsWith("tab-")).map(s=>s.slice(4))),o=Pl(t);return(s,a)=>(r(),d("div",Do,[p("div",Fo,[(r(!0),d(O,null,j(t.value,l=>(r(),d("span",{key:l,class:C({active:i(o)===l}),onClick:c=>o.value=l},[v(s.$slots,"title-"+l,{},()=>[Z(H(l),1)])],10,zo))),128))]),v(s.$slots,"tab-"+i(o))]))}}),jo=k({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(r(),d("span",{class:C(["VPBadge",e.type])},[v(e.$slots,"default",{},()=>[Z(H(e.text),1)])],2))}}),Go={key:0,class:"VPBackdrop"},Ro=k({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(r(),P(_e,{name:"fade"},{default:f(()=>[e.show?(r(),d("div",Go)):y("",!0)]),_:1}))}}),kt=T(Ro,[["__scopeId","data-v-54a304ca"]]);function ce({correspondingLink:n=!1}={}){const{site:e,localeIndex:t,page:o,theme:s,hash:a}=A(),l=S(()=>{var u,_;return{label:(u=e.value.locales[t.value])==null?void 0:u.label,link:((_=e.value.locales[t.value])==null?void 0:_.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:S(()=>Object.entries(e.value.locales).flatMap(([u,_])=>l.value.label===_.label?[]:{text:_.label,link:Uo(_.link||(u==="root"?"/":`/${u}/`),s.value.i18nRouting!==!1&&n,o.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+a.value})),currentLang:l}}function Uo(n,e,t,o){return e?n.replace(/\/$/,"")+Te(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):n}const Ko={class:"NotFound"},qo={class:"code"},Jo={class:"title"},Yo={class:"quote"},Xo={class:"action"},Qo=["href","aria-label"],Zo=k({__name:"NotFound",setup(n){const{theme:e}=A(),{currentLang:t}=ce();return(o,s)=>{var a,l,c,u,_;return r(),d("div",Ko,[p("p",qo,H(((a=i(e).notFound)==null?void 0:a.code)??"404"),1),p("h1",Jo,H(((l=i(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),s[0]||(s[0]=p("div",{class:"divider"},null,-1)),p("blockquote",Yo,H(((c=i(e).notFound)==null?void 0:c.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),p("div",Xo,[p("a",{class:"link",href:i(He)(i(t).link),"aria-label":((u=i(e).notFound)==null?void 0:u.linkLabel)??"go to home"},H(((_=i(e).notFound)==null?void 0:_.linkText)??"Take me home"),9,Qo)])])}}}),xo=T(Zo,[["__scopeId","data-v-6ff51ddd"]]),es=k({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(n){const e=n,t=S(()=>e.href&&nt.test(e.href)),o=S(()=>e.tag||(e.href?"a":"button"));return(s,a)=>(r(),P(J(o.value),{class:C(["VPButton",[s.size,s.theme]]),href:s.href?i(Be)(s.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:f(()=>[Z(H(s.text),1)]),_:1},8,["class","href","target","rel"]))}}),ts=T(es,[["__scopeId","data-v-93dc4167"]]),ns=["src","alt"],os=k({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const o=te("VPImage",!0);return e.image?(r(),d(O,{key:0},[typeof e.image=="string"||"src"in e.image?(r(),d("img",x({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(He)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,ns)):(r(),d(O,{key:1},[$(o,x({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),$(o,x({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):y("",!0)}}}),me=T(os,[["__scopeId","data-v-ab19afbb"]]),ss={class:"container"},as={class:"main"},rs={key:0,class:"name"},ls=["innerHTML"],is=["innerHTML"],cs=["innerHTML"],us={key:0,class:"actions"},ds={key:0,class:"image"},vs={class:"image-container"},ps=k({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=ee("hero-image-slot-exists");return(t,o)=>(r(),d("div",{class:C(["VPHero",{"has-image":t.image||i(e)}])},[p("div",ss,[p("div",as,[v(t.$slots,"home-hero-info-before",{},void 0,!0),v(t.$slots,"home-hero-info",{},()=>[t.name?(r(),d("h1",rs,[p("span",{innerHTML:t.name,class:"clip"},null,8,ls)])):y("",!0),t.text?(r(),d("p",{key:1,innerHTML:t.text,class:"text"},null,8,is)):y("",!0),t.tagline?(r(),d("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,cs)):y("",!0)],!0),v(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(r(),d("div",us,[(r(!0),d(O,null,j(t.actions,s=>(r(),d("div",{key:s.link,class:"action"},[$(ts,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link,target:s.target,rel:s.rel},null,8,["theme","text","href","target","rel"])]))),128))])):y("",!0),v(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||i(e)?(r(),d("div",ds,[p("div",vs,[o[0]||(o[0]=p("div",{class:"image-bg"},null,-1)),v(t.$slots,"home-hero-image",{},()=>[t.image?(r(),P(me,{key:0,class:"image-src",image:t.image},null,8,["image"])):y("",!0)],!0)])])):y("",!0)])],2))}}),fs=T(ps,[["__scopeId","data-v-b10c5094"]]),ms=k({__name:"VPHomeHero",setup(n){const{frontmatter:e}=A();return(t,o)=>i(e).hero?(r(),P(fs,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info-before":f(()=>[v(t.$slots,"home-hero-info-before")]),"home-hero-info":f(()=>[v(t.$slots,"home-hero-info")]),"home-hero-info-after":f(()=>[v(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":f(()=>[v(t.$slots,"home-hero-actions-after")]),"home-hero-image":f(()=>[v(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):y("",!0)}}),hs={class:"box"},_s={key:0,class:"icon"},bs=["innerHTML"],gs=["innerHTML"],ks=["innerHTML"],ys={key:4,class:"link-text"},$s={class:"link-text-value"},Ss=k({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(r(),P(Q,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:f(()=>[p("article",hs,[typeof e.icon=="object"&&e.icon.wrap?(r(),d("div",_s,[$(me,{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"?(r(),P(me,{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?(r(),d("div",{key:2,class:"icon",innerHTML:e.icon},null,8,bs)):y("",!0),p("h2",{class:"title",innerHTML:e.title},null,8,gs),e.details?(r(),d("p",{key:3,class:"details",innerHTML:e.details},null,8,ks)):y("",!0),e.linkText?(r(),d("div",ys,[p("p",$s,[Z(H(e.linkText)+" ",1),t[0]||(t[0]=p("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):y("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Ps=T(Ss,[["__scopeId","data-v-bd37d1a2"]]),Ls={key:0,class:"VPFeatures"},ws={class:"container"},Vs={class:"items"},Ts=k({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=S(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,s)=>o.features?(r(),d("div",Ls,[p("div",ws,[p("div",Vs,[(r(!0),d(O,null,j(o.features,a=>(r(),d("div",{key:a.title,class:C(["item",[t.value]])},[$(Ps,{icon:a.icon,title:a.title,details:a.details,link:a.link,"link-text":a.linkText,rel:a.rel,target:a.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):y("",!0)}}),Ns=T(Ts,[["__scopeId","data-v-b1eea84a"]]),Ms=k({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=A();return(t,o)=>i(e).features?(r(),P(Ns,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):y("",!0)}}),Cs=k({__name:"VPHomeContent",setup(n){const{width:e}=Bt({initialWidth:0,includeScrollbar:!1});return(t,o)=>(r(),d("div",{class:"vp-doc container",style:re(i(e)?{"--vp-offset":`calc(50% - ${i(e)/2}px)`}:{})},[v(t.$slots,"default",{},void 0,!0)],4))}}),As=T(Cs,[["__scopeId","data-v-c141a4bd"]]),Es={class:"VPHome"},Hs=k({__name:"VPHome",setup(n){const{frontmatter:e}=A();return(t,o)=>{const s=te("Content");return r(),d("div",Es,[v(t.$slots,"home-hero-before",{},void 0,!0),$(ms,null,{"home-hero-info-before":f(()=>[v(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[v(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[v(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[v(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[v(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),v(t.$slots,"home-hero-after",{},void 0,!0),v(t.$slots,"home-features-before",{},void 0,!0),$(Ms),v(t.$slots,"home-features-after",{},void 0,!0),i(e).markdownStyles!==!1?(r(),P(As,{key:0},{default:f(()=>[$(s)]),_:1})):(r(),P(s,{key:1}))])}}}),Is=T(Hs,[["__scopeId","data-v-07b1ad08"]]),Bs={},Os={class:"VPPage"};function Ds(n,e){const t=te("Content");return r(),d("div",Os,[v(n.$slots,"page-top"),$(t),v(n.$slots,"page-bottom")])}const Fs=T(Bs,[["render",Ds]]),zs=k({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=A(),{hasSidebar:o}=X();return(s,a)=>(r(),d("div",{class:C(["VPContent",{"has-sidebar":i(o),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?v(s.$slots,"not-found",{key:0},()=>[$(xo)],!0):i(t).layout==="page"?(r(),P(Fs,{key:1},{"page-top":f(()=>[v(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[v(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(r(),P(Is,{key:2},{"home-hero-before":f(()=>[v(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[v(s.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[v(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[v(s.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[v(s.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[v(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[v(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[v(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[v(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(r(),P(J(i(t).layout),{key:3})):(r(),P(gt,{key:4},{"doc-top":f(()=>[v(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[v(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":f(()=>[v(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[v(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[v(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":f(()=>[v(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":f(()=>[v(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[v(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[v(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[v(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":f(()=>[v(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Ws=T(zs,[["__scopeId","data-v-9a6c75ad"]]),js={class:"container"},Gs=["innerHTML"],Rs=["innerHTML"],Us=k({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=A(),{hasSidebar:o}=X();return(s,a)=>i(e).footer&&i(t).footer!==!1?(r(),d("footer",{key:0,class:C(["VPFooter",{"has-sidebar":i(o)}])},[p("div",js,[i(e).footer.message?(r(),d("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,Gs)):y("",!0),i(e).footer.copyright?(r(),d("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,Rs)):y("",!0)])],2)):y("",!0)}}),yt=T(Us,[["__scopeId","data-v-566314d4"]]);function Ks(){const{theme:n,frontmatter:e}=A(),t=Ce([]),o=S(()=>t.value.length>0);return ke(()=>{t.value=Oe(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:o}}const qs={class:"menu-text"},Js={class:"header"},Ys={class:"outline"},Xs=k({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=A(),o=V(!1),s=V(0),a=V(),l=V();function c(m){var h;(h=a.value)!=null&&h.contains(m.target)||(o.value=!1)}W(o,m=>{if(m){document.addEventListener("click",c);return}document.removeEventListener("click",c)}),Ot("Escape",()=>{o.value=!1}),ke(()=>{o.value=!1});function u(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function _(m){m.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),oe(()=>{o.value=!1}))}function g(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(m,h)=>(r(),d("div",{class:"VPLocalNavOutlineDropdown",style:re({"--vp-vh":s.value+"px"}),ref_key:"main",ref:a},[m.headers.length>0?(r(),d("button",{key:0,onClick:u,class:C({open:o.value})},[p("span",qs,H(i(_t)(i(t))),1),h[0]||(h[0]=p("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(r(),d("button",{key:1,onClick:g},H(i(t).returnToTopLabel||"Return to top"),1)),$(_e,{name:"flyout"},{default:f(()=>[o.value?(r(),d("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:_},[p("div",Js,[p("a",{class:"top-link",href:"#",onClick:g},H(i(t).returnToTopLabel||"Return to top"),1)]),p("div",Ys,[$(bt,{headers:m.headers},null,8,["headers"])])],512)):y("",!0)]),_:1})],4))}}),Qs=T(Xs,[["__scopeId","data-v-883964e0"]]),Zs={class:"container"},xs=["aria-expanded"],ea={class:"menu-text"},ta=k({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=A(),{hasSidebar:o}=X(),{headers:s}=Ks(),{y:a}=st(),l=V(0);q(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),ke(()=>{s.value=Oe(t.value.outline??e.value.outline)});const c=S(()=>s.value.length===0),u=S(()=>c.value&&!o.value),_=S(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:c.value,fixed:u.value}));return(g,m)=>i(t).layout!=="home"&&(!u.value||i(a)>=l.value)?(r(),d("div",{key:0,class:C(_.value)},[p("div",Zs,[i(o)?(r(),d("button",{key:0,class:"menu","aria-expanded":g.open,"aria-controls":"VPSidebarNav",onClick:m[0]||(m[0]=h=>g.$emit("open-menu"))},[m[1]||(m[1]=p("span",{class:"vpi-align-left menu-icon"},null,-1)),p("span",ea,H(i(e).sidebarMenuLabel||"Menu"),1)],8,xs)):y("",!0),$(Qs,{headers:i(s),navHeight:l.value},null,8,["headers","navHeight"])])],2)):y("",!0)}}),$t=T(ta,[["__scopeId","data-v-2488c25a"]]);function na(){const n=V(!1);function e(){n.value=!0,window.addEventListener("resize",s)}function t(){n.value=!1,window.removeEventListener("resize",s)}function o(){n.value?t():e()}function s(){window.outerWidth>=768&&t()}const a=ie();return W(()=>a.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:o}}const oa={},sa={class:"VPSwitch",type:"button",role:"switch"},aa={class:"check"},ra={key:0,class:"icon"};function la(n,e){return r(),d("button",sa,[p("span",aa,[n.$slots.default?(r(),d("span",ra,[v(n.$slots,"default",{},void 0,!0)])):y("",!0)])])}const ia=T(oa,[["render",la],["__scopeId","data-v-b4ccac88"]]),ca=k({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=A(),o=ee("toggle-appearance",()=>{e.value=!e.value}),s=V("");return ge(()=>{s.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(a,l)=>(r(),P(ia,{title:s.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(o)},{default:f(()=>l[0]||(l[0]=[p("span",{class:"vpi-sun sun"},null,-1),p("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),De=T(ca,[["__scopeId","data-v-be9742d9"]]),ua={key:0,class:"VPNavBarAppearance"},da=k({__name:"VPNavBarAppearance",setup(n){const{site:e}=A();return(t,o)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(r(),d("div",ua,[$(De)])):y("",!0)}}),va=T(da,[["__scopeId","data-v-3f90c1a5"]]),Fe=V();let St=!1,Pe=0;function pa(n){const e=V(!1);if(ye){!St&&fa(),Pe++;const t=W(Fe,o=>{var s,a,l;o===n.el.value||(s=n.el.value)!=null&&s.contains(o)?(e.value=!0,(a=n.onFocus)==null||a.call(n)):(e.value=!1,(l=n.onBlur)==null||l.call(n))});Ie(()=>{t(),Pe--,Pe||ma()})}return Qe(e)}function fa(){document.addEventListener("focusin",Pt),St=!0,Fe.value=document.activeElement}function ma(){document.removeEventListener("focusin",Pt)}function Pt(){Fe.value=document.activeElement}const ha={class:"VPMenuLink"},_a=["innerHTML"],ba=k({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=A();return(t,o)=>(r(),d("div",ha,[$(Q,{class:C({active:i(se)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,_a)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),Se=T(ba,[["__scopeId","data-v-7eeeb2dc"]]),ga={class:"VPMenuGroup"},ka={key:0,class:"title"},ya=k({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(r(),d("div",ga,[e.text?(r(),d("p",ka,H(e.text),1)):y("",!0),(r(!0),d(O,null,j(e.items,o=>(r(),d(O,null,["link"in o?(r(),P(Se,{key:0,item:o},null,8,["item"])):y("",!0)],64))),256))]))}}),$a=T(ya,[["__scopeId","data-v-a6b0397c"]]),Sa={class:"VPMenu"},Pa={key:0,class:"items"},La=k({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(r(),d("div",Sa,[e.items?(r(),d("div",Pa,[(r(!0),d(O,null,j(e.items,o=>(r(),d(O,{key:JSON.stringify(o)},["link"in o?(r(),P(Se,{key:0,item:o},null,8,["item"])):"component"in o?(r(),P(J(o.component),x({key:1,ref_for:!0},o.props),null,16)):(r(),P($a,{key:2,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):y("",!0),v(e.$slots,"default",{},void 0,!0)]))}}),wa=T(La,[["__scopeId","data-v-20ed86d6"]]),Va=["aria-expanded","aria-label"],Ta={key:0,class:"text"},Na=["innerHTML"],Ma={key:1,class:"vpi-more-horizontal icon"},Ca={class:"menu"},Aa=k({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=V(!1),t=V();pa({el:t,onBlur:o});function o(){e.value=!1}return(s,a)=>(r(),d("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:a[1]||(a[1]=l=>e.value=!0),onMouseleave:a[2]||(a[2]=l=>e.value=!1)},[p("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:a[0]||(a[0]=l=>e.value=!e.value)},[s.button||s.icon?(r(),d("span",Ta,[s.icon?(r(),d("span",{key:0,class:C([s.icon,"option-icon"])},null,2)):y("",!0),s.button?(r(),d("span",{key:1,innerHTML:s.button},null,8,Na)):y("",!0),a[3]||(a[3]=p("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(r(),d("span",Ma))],8,Va),p("div",Ca,[$(wa,{items:s.items},{default:f(()=>[v(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ze=T(Aa,[["__scopeId","data-v-bfe7971f"]]),Ea=["href","aria-label","innerHTML"],Ha=k({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=V();q(async()=>{var a;await oe();const s=(a=t.value)==null?void 0:a.children[0];s instanceof HTMLElement&&s.className.startsWith("vpi-social-")&&(getComputedStyle(s).maskImage||getComputedStyle(s).webkitMaskImage)==="none"&&s.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const o=S(()=>typeof e.icon=="object"?e.icon.svg:``);return(s,a)=>(r(),d("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:o.value},null,8,Ea))}}),Ia=T(Ha,[["__scopeId","data-v-60a9a2d3"]]),Ba={class:"VPSocialLinks"},Oa=k({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(r(),d("div",Ba,[(r(!0),d(O,null,j(e.links,({link:o,icon:s,ariaLabel:a})=>(r(),P(Ia,{key:o,icon:s,link:o,ariaLabel:a},null,8,["icon","link","ariaLabel"]))),128))]))}}),We=T(Oa,[["__scopeId","data-v-e71e869c"]]),Da={key:0,class:"group translations"},Fa={class:"trans-title"},za={key:1,class:"group"},Wa={class:"item appearance"},ja={class:"label"},Ga={class:"appearance-action"},Ra={key:2,class:"group"},Ua={class:"item social-links"},Ka=k({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=A(),{localeLinks:o,currentLang:s}=ce({correspondingLink:!0}),a=S(()=>o.value.length&&s.value.label||e.value.appearance||t.value.socialLinks);return(l,c)=>a.value?(r(),P(ze,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:f(()=>[i(o).length&&i(s).label?(r(),d("div",Da,[p("p",Fa,H(i(s).label),1),(r(!0),d(O,null,j(i(o),u=>(r(),P(Se,{key:u.link,item:u},null,8,["item"]))),128))])):y("",!0),i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(r(),d("div",za,[p("div",Wa,[p("p",ja,H(i(t).darkModeSwitchLabel||"Appearance"),1),p("div",Ga,[$(De)])])])):y("",!0),i(t).socialLinks?(r(),d("div",Ra,[p("div",Ua,[$(We,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):y("",!0)]),_:1})):y("",!0)}}),qa=T(Ka,[["__scopeId","data-v-f953d92f"]]),Ja=["aria-expanded"],Ya=k({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(r(),d("button",{type:"button",class:C(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},t[1]||(t[1]=[p("span",{class:"container"},[p("span",{class:"top"}),p("span",{class:"middle"}),p("span",{class:"bottom"})],-1)]),10,Ja))}}),Xa=T(Ya,[["__scopeId","data-v-6bee1efd"]]),Qa=["innerHTML"],Za=k({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=A();return(t,o)=>(r(),P(Q,{class:C({VPNavBarMenuLink:!0,active:i(se)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,Qa)]),_:1},8,["class","href","target","rel","no-icon"]))}}),xa=T(Za,[["__scopeId","data-v-815115f5"]]),er=k({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=A(),o=a=>"component"in a?!1:"link"in a?se(t.value.relativePath,a.link,!!e.item.activeMatch):a.items.some(o),s=S(()=>o(e.item));return(a,l)=>(r(),P(ze,{class:C({VPNavBarMenuGroup:!0,active:i(se)(i(t).relativePath,a.item.activeMatch,!!a.item.activeMatch)||s.value}),button:a.item.text,items:a.item.items},null,8,["class","button","items"]))}}),tr={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},nr=k({__name:"VPNavBarMenu",setup(n){const{theme:e}=A();return(t,o)=>i(e).nav?(r(),d("nav",tr,[o[0]||(o[0]=p("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(r(!0),d(O,null,j(i(e).nav,s=>(r(),d(O,{key:JSON.stringify(s)},["link"in s?(r(),P(xa,{key:0,item:s},null,8,["item"])):"component"in s?(r(),P(J(s.component),x({key:1,ref_for:!0},s.props),null,16)):(r(),P(er,{key:2,item:s},null,8,["item"]))],64))),128))])):y("",!0)}}),or=T(nr,[["__scopeId","data-v-afb2845e"]]);function sr(n){const{localeIndex:e,theme:t}=A();function o(s){var b,w,L;const a=s.split("."),l=(b=t.value.search)==null?void 0:b.options,c=l&&typeof l=="object",u=c&&((L=(w=l.locales)==null?void 0:w[e.value])==null?void 0:L.translations)||null,_=c&&l.translations||null;let g=u,m=_,h=n;const N=a.pop();for(const I of a){let B=null;const R=h==null?void 0:h[I];R&&(B=h=R);const U=m==null?void 0:m[I];U&&(B=m=U);const Y=g==null?void 0:g[I];Y&&(B=g=Y),R||(h=B),U||(m=B),Y||(g=B)}return(g==null?void 0:g[N])??(m==null?void 0:m[N])??(h==null?void 0:h[N])??""}return o}const ar=["aria-label"],rr={class:"DocSearch-Button-Container"},lr={class:"DocSearch-Button-Placeholder"},Je=k({__name:"VPNavBarSearchButton",setup(n){const t=sr({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,s)=>(r(),d("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[p("span",rr,[s[0]||(s[0]=p("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),p("span",lr,H(i(t)("button.buttonText")),1)]),s[1]||(s[1]=p("span",{class:"DocSearch-Button-Keys"},[p("kbd",{class:"DocSearch-Button-Key"}),p("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,ar))}}),ir={class:"VPNavBarSearch"},cr={id:"local-search"},ur={key:1,id:"docsearch"},dr=k({__name:"VPNavBarSearch",setup(n){const e=()=>null,t=()=>null,{theme:o}=A(),s=V(!1),a=V(!1);q(()=>{});function l(){s.value||(s.value=!0,setTimeout(c,16))}function c(){const g=new Event("keydown");g.key="k",g.metaKey=!0,window.dispatchEvent(g),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||c()},16)}const u=V(!1),_="";return(g,m)=>{var h;return r(),d("div",ir,[i(_)==="local"?(r(),d(O,{key:0},[u.value?(r(),P(i(e),{key:0,onClose:m[0]||(m[0]=N=>u.value=!1)})):y("",!0),p("div",cr,[$(Je,{onClick:m[1]||(m[1]=N=>u.value=!0)})])],64)):i(_)==="algolia"?(r(),d(O,{key:1},[s.value?(r(),P(i(t),{key:0,algolia:((h=i(o).search)==null?void 0:h.options)??i(o).algolia,onVnodeBeforeMount:m[2]||(m[2]=N=>a.value=!0)},null,8,["algolia"])):y("",!0),a.value?y("",!0):(r(),d("div",ur,[$(Je,{onClick:l})]))],64)):y("",!0)])}}}),vr=k({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=A();return(t,o)=>i(e).socialLinks?(r(),P(We,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):y("",!0)}}),pr=T(vr,[["__scopeId","data-v-ef6192dc"]]),fr=["href","rel","target"],mr=["innerHTML"],hr={key:2},_r=k({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=A(),{hasSidebar:o}=X(),{currentLang:s}=ce(),a=S(()=>{var u;return typeof t.value.logoLink=="string"?t.value.logoLink:(u=t.value.logoLink)==null?void 0:u.link}),l=S(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.rel}),c=S(()=>{var u;return typeof t.value.logoLink=="string"||(u=t.value.logoLink)==null?void 0:u.target});return(u,_)=>(r(),d("div",{class:C(["VPNavBarTitle",{"has-sidebar":i(o)}])},[p("a",{class:"title",href:a.value??i(Be)(i(s).link),rel:l.value,target:c.value},[v(u.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(r(),P(me,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):y("",!0),i(t).siteTitle?(r(),d("span",{key:1,innerHTML:i(t).siteTitle},null,8,mr)):i(t).siteTitle===void 0?(r(),d("span",hr,H(i(e).title),1)):y("",!0),v(u.$slots,"nav-bar-title-after",{},void 0,!0)],8,fr)],2))}}),br=T(_r,[["__scopeId","data-v-9f43907a"]]),gr={class:"items"},kr={class:"title"},yr=k({__name:"VPNavBarTranslations",setup(n){const{theme:e}=A(),{localeLinks:t,currentLang:o}=ce({correspondingLink:!0});return(s,a)=>i(t).length&&i(o).label?(r(),P(ze,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:i(e).langMenuLabel||"Change language"},{default:f(()=>[p("div",gr,[p("p",kr,H(i(o).label),1),(r(!0),d(O,null,j(i(t),l=>(r(),P(Se,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):y("",!0)}}),$r=T(yr,[["__scopeId","data-v-acee064b"]]),Sr={class:"wrapper"},Pr={class:"container"},Lr={class:"title"},wr={class:"content"},Vr={class:"content-body"},Tr=k({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const e=n,{y:t}=st(),{hasSidebar:o}=X(),{frontmatter:s}=A(),a=V({});return ge(()=>{a.value={"has-sidebar":o.value,home:s.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,c)=>(r(),d("div",{class:C(["VPNavBar",a.value])},[p("div",Sr,[p("div",Pr,[p("div",Lr,[$(br,null,{"nav-bar-title-before":f(()=>[v(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[v(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),p("div",wr,[p("div",Vr,[v(l.$slots,"nav-bar-content-before",{},void 0,!0),$(dr,{class:"search"}),$(or,{class:"menu"}),$($r,{class:"translations"}),$(va,{class:"appearance"}),$(pr,{class:"social-links"}),$(qa,{class:"extra"}),v(l.$slots,"nav-bar-content-after",{},void 0,!0),$(Xa,{class:"hamburger",active:l.isScreenOpen,onClick:c[0]||(c[0]=u=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),c[1]||(c[1]=p("div",{class:"divider"},[p("div",{class:"divider-line"})],-1))],2))}}),Nr=T(Tr,[["__scopeId","data-v-9fd4d1dd"]]),Mr={key:0,class:"VPNavScreenAppearance"},Cr={class:"text"},Ar=k({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=A();return(o,s)=>i(e).appearance&&i(e).appearance!=="force-dark"&&i(e).appearance!=="force-auto"?(r(),d("div",Mr,[p("p",Cr,H(i(t).darkModeSwitchLabel||"Appearance"),1),$(De)])):y("",!0)}}),Er=T(Ar,[["__scopeId","data-v-a3e2920d"]]),Hr=["innerHTML"],Ir=k({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=ee("close-screen");return(t,o)=>(r(),P(Q,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,Hr)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Br=T(Ir,[["__scopeId","data-v-fa963d97"]]),Or=["innerHTML"],Dr=k({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=ee("close-screen");return(t,o)=>(r(),P(Q,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:i(e)},{default:f(()=>[p("span",{innerHTML:t.item.text},null,8,Or)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Lt=T(Dr,[["__scopeId","data-v-e04f3e85"]]),Fr={class:"VPNavScreenMenuGroupSection"},zr={key:0,class:"title"},Wr=k({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(r(),d("div",Fr,[e.text?(r(),d("p",zr,H(e.text),1)):y("",!0),(r(!0),d(O,null,j(e.items,o=>(r(),P(Lt,{key:o.text,item:o},null,8,["item"]))),128))]))}}),jr=T(Wr,[["__scopeId","data-v-f60dbfa7"]]),Gr=["aria-controls","aria-expanded"],Rr=["innerHTML"],Ur=["id"],Kr={key:0,class:"item"},qr={key:1,class:"item"},Jr={key:2,class:"group"},Yr=k({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=V(!1),o=S(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){t.value=!t.value}return(a,l)=>(r(),d("div",{class:C(["VPNavScreenMenuGroup",{open:t.value}])},[p("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:s},[p("span",{class:"button-text",innerHTML:a.text},null,8,Rr),l[0]||(l[0]=p("span",{class:"vpi-plus button-icon"},null,-1))],8,Gr),p("div",{id:o.value,class:"items"},[(r(!0),d(O,null,j(a.items,c=>(r(),d(O,{key:JSON.stringify(c)},["link"in c?(r(),d("div",Kr,[$(Lt,{item:c},null,8,["item"])])):"component"in c?(r(),d("div",qr,[(r(),P(J(c.component),x({ref_for:!0},c.props,{"screen-menu":""}),null,16))])):(r(),d("div",Jr,[$(jr,{text:c.text,items:c.items},null,8,["text","items"])]))],64))),128))],8,Ur)],2))}}),Xr=T(Yr,[["__scopeId","data-v-d99bfeec"]]),Qr={key:0,class:"VPNavScreenMenu"},Zr=k({__name:"VPNavScreenMenu",setup(n){const{theme:e}=A();return(t,o)=>i(e).nav?(r(),d("nav",Qr,[(r(!0),d(O,null,j(i(e).nav,s=>(r(),d(O,{key:JSON.stringify(s)},["link"in s?(r(),P(Br,{key:0,item:s},null,8,["item"])):"component"in s?(r(),P(J(s.component),x({key:1,ref_for:!0},s.props,{"screen-menu":""}),null,16)):(r(),P(Xr,{key:2,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):y("",!0)}}),xr=k({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=A();return(t,o)=>i(e).socialLinks?(r(),P(We,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):y("",!0)}}),el={class:"list"},tl=k({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=ce({correspondingLink:!0}),o=V(!1);function s(){o.value=!o.value}return(a,l)=>i(e).length&&i(t).label?(r(),d("div",{key:0,class:C(["VPNavScreenTranslations",{open:o.value}])},[p("button",{class:"title",onClick:s},[l[0]||(l[0]=p("span",{class:"vpi-languages icon lang"},null,-1)),Z(" "+H(i(t).label)+" ",1),l[1]||(l[1]=p("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),p("ul",el,[(r(!0),d(O,null,j(i(e),c=>(r(),d("li",{key:c.link,class:"item"},[$(Q,{class:"link",href:c.link},{default:f(()=>[Z(H(c.text),1)]),_:2},1032,["href"])]))),128))])],2)):y("",!0)}}),nl=T(tl,[["__scopeId","data-v-516e4bc3"]]),ol={class:"container"},sl=k({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=V(null),t=at(ye?document.body:null);return(o,s)=>(r(),P(_e,{name:"fade",onEnter:s[0]||(s[0]=a=>t.value=!0),onAfterLeave:s[1]||(s[1]=a=>t.value=!1)},{default:f(()=>[o.open?(r(),d("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[p("div",ol,[v(o.$slots,"nav-screen-content-before",{},void 0,!0),$(Zr,{class:"menu"}),$(nl,{class:"translations"}),$(Er,{class:"appearance"}),$(xr,{class:"social-links"}),v(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):y("",!0)]),_:3}))}}),al=T(sl,[["__scopeId","data-v-2dd6d0c7"]]),rl={key:0,class:"VPNav"},ll=k({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=na(),{frontmatter:s}=A(),a=S(()=>s.value.navbar!==!1);return le("close-screen",t),be(()=>{ye&&document.documentElement.classList.toggle("hide-nav",!a.value)}),(l,c)=>a.value?(r(),d("header",rl,[$(Nr,{"is-screen-open":i(e),onToggleScreen:i(o)},{"nav-bar-title-before":f(()=>[v(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[v(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[v(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[v(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),$(al,{open:i(e)},{"nav-screen-content-before":f(()=>[v(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[v(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):y("",!0)}}),wt=T(ll,[["__scopeId","data-v-7ad780c2"]]),il=["role","tabindex"],cl={key:1,class:"items"},ul=k({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:o,isLink:s,isActiveLink:a,hasActiveLink:l,hasChildren:c,toggle:u}=Cn(S(()=>e.item)),_=S(()=>c.value?"section":"div"),g=S(()=>s.value?"a":"div"),m=S(()=>c.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),h=S(()=>s.value?void 0:"button"),N=S(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":s.value},{"is-active":a.value},{"has-active":l.value}]);function b(L){"key"in L&&L.key!=="Enter"||!e.item.link&&u()}function w(){e.item.link&&u()}return(L,I)=>{const B=te("VPSidebarItem",!0);return r(),P(J(_.value),{class:C(["VPSidebarItem",N.value])},{default:f(()=>[L.item.text?(r(),d("div",x({key:0,class:"item",role:h.value},Dt(L.item.items?{click:b,keydown:b}:{},!0),{tabindex:L.item.items&&0}),[I[1]||(I[1]=p("div",{class:"indicator"},null,-1)),L.item.link?(r(),P(Q,{key:0,tag:g.value,class:"link",href:L.item.link,rel:L.item.rel,target:L.item.target},{default:f(()=>[(r(),P(J(m.value),{class:"text",innerHTML:L.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(r(),P(J(m.value),{key:1,class:"text",innerHTML:L.item.text},null,8,["innerHTML"])),L.item.collapsed!=null&&L.item.items&&L.item.items.length?(r(),d("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:w,onKeydown:Ft(w,["enter"]),tabindex:"0"},I[0]||(I[0]=[p("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):y("",!0)],16,il)):y("",!0),L.item.items&&L.item.items.length?(r(),d("div",cl,[L.depth<5?(r(!0),d(O,{key:0},j(L.item.items,R=>(r(),P(B,{key:R.text,item:R,depth:L.depth+1},null,8,["item","depth"]))),128)):y("",!0)])):y("",!0)]),_:1},8,["class"])}}}),Vt=T(ul,[["__scopeId","data-v-edd2eed8"]]),dl=k({__name:"VPSidebarGroup",props:{items:{}},setup(n){const e=V(!0);let t=null;return q(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),Ae(()=>{t!=null&&(clearTimeout(t),t=null)}),(o,s)=>(r(!0),d(O,null,j(o.items,a=>(r(),d("div",{key:a.text,class:C(["group",{"no-transition":e.value}])},[$(Vt,{item:a,depth:0},null,8,["item"])],2))),128))}}),vl=T(dl,[["__scopeId","data-v-51288d80"]]),pl={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},fl=k({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=X(),o=n,s=V(null),a=at(ye?document.body:null);W([o,s],()=>{var c;o.open?(a.value=!0,(c=s.value)==null||c.focus()):a.value=!1},{immediate:!0,flush:"post"});const l=V(0);return W(e,()=>{l.value+=1},{deep:!0}),(c,u)=>i(t)?(r(),d("aside",{key:0,class:C(["VPSidebar",{open:c.open}]),ref_key:"navEl",ref:s,onClick:u[0]||(u[0]=rt(()=>{},["stop"]))},[u[2]||(u[2]=p("div",{class:"curtain"},null,-1)),p("nav",pl,[u[1]||(u[1]=p("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),v(c.$slots,"sidebar-nav-before",{},void 0,!0),(r(),P(vl,{items:i(e),key:l.value},null,8,["items"])),v(c.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):y("",!0)}}),ml=T(fl,[["__scopeId","data-v-42c4c606"]]),hl=k({__name:"VPSkipLink",setup(n){const e=ie(),t=V();W(()=>e.path,()=>t.value.focus());function o({target:s}){const a=document.getElementById(decodeURIComponent(s.hash).slice(1));if(a){const l=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",l)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",l),a.focus(),window.scrollTo(0,0)}}return(s,a)=>(r(),d(O,null,[p("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),p("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Tt=T(hl,[["__scopeId","data-v-c8291ffa"]]),_l=k({__name:"Layout",setup(n){const{isOpen:e,open:t,close:o}=X(),s=ie();W(()=>s.path,o),ht(e,o);const{frontmatter:a}=A(),l=ot(),c=S(()=>!!l["home-hero-image"]);return le("hero-image-slot-exists",c),(u,_)=>{const g=te("Content");return i(a).layout!==!1?(r(),d("div",{key:0,class:C(["Layout",i(a).pageClass])},[v(u.$slots,"layout-top",{},void 0,!0),$(Tt),$(kt,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),$(wt,null,{"nav-bar-title-before":f(()=>[v(u.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":f(()=>[v(u.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":f(()=>[v(u.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":f(()=>[v(u.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":f(()=>[v(u.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":f(()=>[v(u.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),$($t,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),$(ml,{open:i(e)},{"sidebar-nav-before":f(()=>[v(u.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[v(u.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),$(Ws,null,{"page-top":f(()=>[v(u.$slots,"page-top",{},void 0,!0)]),"page-bottom":f(()=>[v(u.$slots,"page-bottom",{},void 0,!0)]),"not-found":f(()=>[v(u.$slots,"not-found",{},void 0,!0)]),"home-hero-before":f(()=>[v(u.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":f(()=>[v(u.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":f(()=>[v(u.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":f(()=>[v(u.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":f(()=>[v(u.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":f(()=>[v(u.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":f(()=>[v(u.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":f(()=>[v(u.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":f(()=>[v(u.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":f(()=>[v(u.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":f(()=>[v(u.$slots,"doc-before",{},void 0,!0)]),"doc-after":f(()=>[v(u.$slots,"doc-after",{},void 0,!0)]),"doc-top":f(()=>[v(u.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":f(()=>[v(u.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":f(()=>[v(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":f(()=>[v(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":f(()=>[v(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":f(()=>[v(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":f(()=>[v(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":f(()=>[v(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),$(yt),v(u.$slots,"layout-bottom",{},void 0,!0)],2)):(r(),P(g,{key:1}))}}}),bl=T(_l,[["__scopeId","data-v-d8b57b2d"]]),Ye={Layout:bl,enhanceApp:({app:n})=>{n.component("Badge",jo)}},gl={class:"vp-sidebar-nav"},kl={class:"group"},yl=k({__name:"sidebar",props:{open:{type:Boolean}},setup(n){const{hasSidebar:e,sidebarGroups:t}=X(),o=n,s=V(null);return ge(async()=>{var a;o.open&&(await oe(),(a=s.value)==null||a.wrapRef.focus())}),(a,l)=>{const c=te("ElScrollbar");return i(e)?(r(),P(c,{key:0,tag:"aside",class:C(["VPSidebar",{open:a.open}]),"view-class":"vp-sidebar-view",ref_key:"navEl",ref:s,onClick:l[0]||(l[0]=rt(()=>{},["stop"]))},{default:f(()=>[l[1]||(l[1]=p("div",{class:"curtain"},null,-1)),p("nav",gl,[v(a.$slots,"sidebar-nav-before"),(r(!0),d(O,null,j(i(t),u=>(r(),d("div",kl,[$(Vt,{item:u,depth:0},null,8,["item"])]))),256)),v(a.$slots,"sidebar-nav-after")])]),_:3},8,["class"])):y("",!0)}}}),$l=k({__name:"Layout",setup(n){const{isOpen:e,open:t,close:o,hasSidebar:s}=X(),a=ie();W(()=>a.path,o),ht(e,o),le("close-sidebar",o),le("is-sidebar-open",e);const{frontmatter:l}=Ee(),c=ee(Nt),u=S(()=>{var m;return c.layouts[(m=l.value.layout)==null?void 0:m.toLowerCase()]||c.layouts.default}),_=S(()=>({"has-sidebar":s.value})),g=S(()=>({[`layout-${l.value.layout}`]:l.value.layout}));return(m,h)=>(r(),d("div",{class:C(["Layout",g.value])},[$(Tt),$(kt,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),$(wt,null,{"nav-bar-title-before":f(()=>h[0]||(h[0]=[])),"nav-bar-title-after":f(()=>h[1]||(h[1]=[])),"nav-bar-content-before":f(()=>h[2]||(h[2]=[])),"nav-bar-content-after":f(()=>h[3]||(h[3]=[])),"nav-screen-content-before":f(()=>h[4]||(h[4]=[])),"nav-screen-content-after":f(()=>h[5]||(h[5]=[])),_:1}),$($t,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),$(yl,{open:i(e)},{"sidebar-nav-before":f(()=>[v(m.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":f(()=>[v(m.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),p("div",{class:C(["VPContent",_.value]),id:"VPContent"},[(r(),P(J(u.value),null,{"doc-footer-before":f(()=>h[6]||(h[6]=[])),"doc-before":f(()=>h[7]||(h[7]=[])),"doc-after":f(()=>h[8]||(h[8]=[])),"aside-top":f(()=>h[9]||(h[9]=[])),"aside-bottom":f(()=>h[10]||(h[10]=[])),"aside-outline-before":f(()=>h[11]||(h[11]=[])),"aside-outline-after":f(()=>h[12]||(h[12]=[])),"aside-ads-before":f(()=>h[13]||(h[13]=[])),"aside-ads-after":f(()=>h[14]||(h[14]=[])),_:1}))],2),$(yt)],2))}}),Sl=T($l,[["__scopeId","data-v-c1849dc6"]]),Nt=Symbol.for("theme-config"),Mt=Symbol.for("client-config");function Pl(n){const e=ee(Mt);return S({get:()=>{const t=$e(n);return e.tabs.find(o=>t.includes(o))||t[0]},set:t=>{const o=e.tabs.indexOf(t);o>=0&&e.tabs.splice(o,1),e.tabs.unshift(t)}})}const Xe=1;function Ll(n){const e=sn("koishi.docs.config",{});return e.value.version!==Xe?e.value={...n,version:Xe}:e.value={...n,...e.value},et(e.value)}const wl=(n={})=>({...Ye,Layout:Sl,...n,enhanceApp(e){var o;Ye.enhanceApp(e),e.app.component("ElScrollbar",Vn),e.app.component("Spoiler",wo),e.app.component("ChatMessage",Mo),e.app.component("ChatPanel",Oo),e.app.component("TabSelect",Wo);const t={default:gt};for(const s in n.layouts)t[s.toLowerCase()]=n.layouts[s];e.app.provide(Nt,{layouts:t}),e.app.provide(Mt,Ll({tabs:[]})),(o=n.enhanceApp)==null||o.call(n,e)}}),Vl={class:"home"},Tl={class:"screen"},Nl={class:"desc"},Ml={class:"actions"},Cl=["href"],Al={key:0,class:"footer",target:"_blank",rel:"noopener noreferrer",href:"https://beian.miit.gov.cn/"},El=k({__name:"VPHome",setup(n){const{frontmatter:e}=Ee(),t=V(!1);return q(()=>{window.location.href.includes("satori.chat")&&(t.value=!0)}),(o,s)=>(r(),d("div",Vl,[p("div",Tl,[s[0]||(s[0]=p("h1",null,"Satori",-1)),p("p",Nl,H(i(e).home.description),1),p("div",Ml,[p("a",{class:"action-button secondary",href:i(e).links.starter},H(i(e).home.primary),9,Cl)])]),t.value?(r(),d("a",Al,"苏ICP备2022025524号-2")):y("",!0)]))}}),Hl=T(El,[["__scopeId","data-v-b7c0548e"]]),Bl=wl({layouts:{home:Hl}});export{Bl as R}; diff --git a/assets/en-US_index.md.Byxaj5LD.js b/assets/en-US_index.md.Byxaj5LD.js new file mode 100644 index 0000000..621d839 --- /dev/null +++ b/assets/en-US_index.md.Byxaj5LD.js @@ -0,0 +1 @@ +import{_ as e,x as t,h as n}from"./chunks/framework.K8kzz9Vz.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","links":{"starter":"/en-US/protocol/"},"home":{"primary":"Get Started","description":"THE UNIVERSAL MESSENGER PROTOCOL"}},"headers":[],"relativePath":"en-US/index.md","filePath":"en-US/index.md"}'),r={name:"en-US/index.md"};function a(o,s,i,c,d,p){return n(),t("div")}const l=e(r,[["render",a]]);export{_ as __pageData,l as default}; diff --git a/assets/en-US_index.md.Byxaj5LD.lean.js b/assets/en-US_index.md.Byxaj5LD.lean.js new file mode 100644 index 0000000..621d839 --- /dev/null +++ b/assets/en-US_index.md.Byxaj5LD.lean.js @@ -0,0 +1 @@ +import{_ as e,x as t,h as n}from"./chunks/framework.K8kzz9Vz.js";const _=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","links":{"starter":"/en-US/protocol/"},"home":{"primary":"Get Started","description":"THE UNIVERSAL MESSENGER PROTOCOL"}},"headers":[],"relativePath":"en-US/index.md","filePath":"en-US/index.md"}'),r={name:"en-US/index.md"};function a(o,s,i,c,d,p){return n(),t("div")}const l=e(r,[["render",a]]);export{_ as __pageData,l as default}; diff --git a/assets/en-US_introduction.md.C9m_p_Hl.js b/assets/en-US_introduction.md.C9m_p_Hl.js new file mode 100644 index 0000000..bee4419 --- /dev/null +++ b/assets/en-US_introduction.md.C9m_p_Hl.js @@ -0,0 +1 @@ +import{_ as n,x as o,m as e,W as r,h as a}from"./chunks/framework.K8kzz9Vz.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/introduction.md","filePath":"en-US/introduction.md"}'),i={name:"en-US/introduction.md"};function d(c,t,s,u,l,m){return a(),o("div",null,t[0]||(t[0]=[e("h1",{id:"introduction",tabindex:"-1"},[r("Introduction "),e("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1)]))}const _=n(i,[["render",d]]);export{f as __pageData,_ as default}; diff --git a/assets/en-US_introduction.md.C9m_p_Hl.lean.js b/assets/en-US_introduction.md.C9m_p_Hl.lean.js new file mode 100644 index 0000000..bee4419 --- /dev/null +++ b/assets/en-US_introduction.md.C9m_p_Hl.lean.js @@ -0,0 +1 @@ +import{_ as n,x as o,m as e,W as r,h as a}from"./chunks/framework.K8kzz9Vz.js";const f=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/introduction.md","filePath":"en-US/introduction.md"}'),i={name:"en-US/introduction.md"};function d(c,t,s,u,l,m){return a(),o("div",null,t[0]||(t[0]=[e("h1",{id:"introduction",tabindex:"-1"},[r("Introduction "),e("a",{class:"header-anchor",href:"#introduction","aria-label":'Permalink to "Introduction"'},"​")],-1)]))}const _=n(i,[["render",d]]);export{f as __pageData,_ as default}; diff --git a/assets/en-US_protocol_api.md.CNy0V_5r.js b/assets/en-US_protocol_api.md.CNy0V_5r.js new file mode 100644 index 0000000..87b1bc9 --- /dev/null +++ b/assets/en-US_protocol_api.md.CNy0V_5r.js @@ -0,0 +1 @@ +import{_ as e,x as a,a7 as o,h as n}from"./chunks/framework.K8kzz9Vz.js";const m=JSON.parse('{"title":"HTTP API","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/api.md","filePath":"en-US/protocol/api.md"}'),r={name:"en-US/protocol/api.md"};function i(d,t,s,c,p,h){return n(),a("div",null,t[0]||(t[0]=[o('

HTTP API

Pagination

Some API may return a list of items. In this case, the response will be a List object:

FIELDTYPEDESCRIPTION
dataarraylist of items
nextstringtoken for the next page

You can use the next token to get the next page of items. If next is nullable, it means that there are no more items.

',5)]))}const f=e(r,[["render",i]]);export{m as __pageData,f as default}; diff --git a/assets/en-US_protocol_api.md.CNy0V_5r.lean.js b/assets/en-US_protocol_api.md.CNy0V_5r.lean.js new file mode 100644 index 0000000..87b1bc9 --- /dev/null +++ b/assets/en-US_protocol_api.md.CNy0V_5r.lean.js @@ -0,0 +1 @@ +import{_ as e,x as a,a7 as o,h as n}from"./chunks/framework.K8kzz9Vz.js";const m=JSON.parse('{"title":"HTTP API","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/api.md","filePath":"en-US/protocol/api.md"}'),r={name:"en-US/protocol/api.md"};function i(d,t,s,c,p,h){return n(),a("div",null,t[0]||(t[0]=[o('

HTTP API

Pagination

Some API may return a list of items. In this case, the response will be a List object:

FIELDTYPEDESCRIPTION
dataarraylist of items
nextstringtoken for the next page

You can use the next token to get the next page of items. If next is nullable, it means that there are no more items.

',5)]))}const f=e(r,[["render",i]]);export{m as __pageData,f as default}; diff --git a/assets/en-US_protocol_index.md.CKnCis19.js b/assets/en-US_protocol_index.md.CKnCis19.js new file mode 100644 index 0000000..053e25f --- /dev/null +++ b/assets/en-US_protocol_index.md.CKnCis19.js @@ -0,0 +1 @@ +import{_ as t,x as r,m as e,W as a,h as n}from"./chunks/framework.K8kzz9Vz.js";const u=JSON.parse('{"title":"Overview","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/index.md","filePath":"en-US/protocol/index.md"}'),s={name:"en-US/protocol/index.md"};function i(l,o,d,c,v,m){return n(),r("div",null,o[0]||(o[0]=[e("h1",{id:"overview",tabindex:"-1"},[a("Overview "),e("a",{class:"header-anchor",href:"#overview","aria-label":'Permalink to "Overview"'},"​")],-1),e("p",null,"The Satori protocol is designed to be simple and easy to use. It is based around three layers of communication:",-1),e("ul",null,[e("li",null,"an HTTP API for bots to communicate with the server"),e("li",null,"a WebSocket API for bots to receive events from the server"),e("li",null,"a WebHook API for the server to send events to bots")],-1)]))}const f=t(s,[["render",i]]);export{u as __pageData,f as default}; diff --git a/assets/en-US_protocol_index.md.CKnCis19.lean.js b/assets/en-US_protocol_index.md.CKnCis19.lean.js new file mode 100644 index 0000000..053e25f --- /dev/null +++ b/assets/en-US_protocol_index.md.CKnCis19.lean.js @@ -0,0 +1 @@ +import{_ as t,x as r,m as e,W as a,h as n}from"./chunks/framework.K8kzz9Vz.js";const u=JSON.parse('{"title":"Overview","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/index.md","filePath":"en-US/protocol/index.md"}'),s={name:"en-US/protocol/index.md"};function i(l,o,d,c,v,m){return n(),r("div",null,o[0]||(o[0]=[e("h1",{id:"overview",tabindex:"-1"},[a("Overview "),e("a",{class:"header-anchor",href:"#overview","aria-label":'Permalink to "Overview"'},"​")],-1),e("p",null,"The Satori protocol is designed to be simple and easy to use. It is based around three layers of communication:",-1),e("ul",null,[e("li",null,"an HTTP API for bots to communicate with the server"),e("li",null,"a WebSocket API for bots to receive events from the server"),e("li",null,"a WebHook API for the server to send events to bots")],-1)]))}const f=t(s,[["render",i]]);export{u as __pageData,f as default}; diff --git a/assets/en-US_protocol_message.md.YNq4Bb9W.js b/assets/en-US_protocol_message.md.YNq4Bb9W.js new file mode 100644 index 0000000..e06cd9f --- /dev/null +++ b/assets/en-US_protocol_message.md.YNq4Bb9W.js @@ -0,0 +1 @@ +import{_ as s,x as t,m as a,W as o,h as r}from"./chunks/framework.K8kzz9Vz.js";const f=JSON.parse('{"title":"Message","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/message.md","filePath":"en-US/protocol/message.md"}'),n={name:"en-US/protocol/message.md"};function c(m,e,l,d,i,p){return r(),t("div",null,e[0]||(e[0]=[a("h1",{id:"message",tabindex:"-1"},[o("Message "),a("a",{class:"header-anchor",href:"#message","aria-label":'Permalink to "Message"'},"​")],-1)]))}const _=s(n,[["render",c]]);export{f as __pageData,_ as default}; diff --git a/assets/en-US_protocol_message.md.YNq4Bb9W.lean.js b/assets/en-US_protocol_message.md.YNq4Bb9W.lean.js new file mode 100644 index 0000000..e06cd9f --- /dev/null +++ b/assets/en-US_protocol_message.md.YNq4Bb9W.lean.js @@ -0,0 +1 @@ +import{_ as s,x as t,m as a,W as o,h as r}from"./chunks/framework.K8kzz9Vz.js";const f=JSON.parse('{"title":"Message","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/message.md","filePath":"en-US/protocol/message.md"}'),n={name:"en-US/protocol/message.md"};function c(m,e,l,d,i,p){return r(),t("div",null,e[0]||(e[0]=[a("h1",{id:"message",tabindex:"-1"},[o("Message "),a("a",{class:"header-anchor",href:"#message","aria-label":'Permalink to "Message"'},"​")],-1)]))}const _=s(n,[["render",c]]);export{f as __pageData,_ as default}; diff --git a/assets/en-US_protocol_webhook.md.B2rAIltw.js b/assets/en-US_protocol_webhook.md.B2rAIltw.js new file mode 100644 index 0000000..4ab46bc --- /dev/null +++ b/assets/en-US_protocol_webhook.md.B2rAIltw.js @@ -0,0 +1 @@ +import{_ as t,x as a,m as o,W as r,h as n}from"./chunks/framework.K8kzz9Vz.js";const b=JSON.parse('{"title":"Webhook","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/webhook.md","filePath":"en-US/protocol/webhook.md"}'),s={name:"en-US/protocol/webhook.md"};function c(h,e,l,d,i,p){return n(),a("div",null,e[0]||(e[0]=[o("h1",{id:"webhook",tabindex:"-1"},[r("Webhook "),o("a",{class:"header-anchor",href:"#webhook","aria-label":'Permalink to "Webhook"'},"​")],-1)]))}const m=t(s,[["render",c]]);export{b as __pageData,m as default}; diff --git a/assets/en-US_protocol_webhook.md.B2rAIltw.lean.js b/assets/en-US_protocol_webhook.md.B2rAIltw.lean.js new file mode 100644 index 0000000..4ab46bc --- /dev/null +++ b/assets/en-US_protocol_webhook.md.B2rAIltw.lean.js @@ -0,0 +1 @@ +import{_ as t,x as a,m as o,W as r,h as n}from"./chunks/framework.K8kzz9Vz.js";const b=JSON.parse('{"title":"Webhook","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/webhook.md","filePath":"en-US/protocol/webhook.md"}'),s={name:"en-US/protocol/webhook.md"};function c(h,e,l,d,i,p){return n(),a("div",null,e[0]||(e[0]=[o("h1",{id:"webhook",tabindex:"-1"},[r("Webhook "),o("a",{class:"header-anchor",href:"#webhook","aria-label":'Permalink to "Webhook"'},"​")],-1)]))}const m=t(s,[["render",c]]);export{b as __pageData,m as default}; diff --git a/assets/en-US_protocol_websocket.md.C2-bu5ot.js b/assets/en-US_protocol_websocket.md.C2-bu5ot.js new file mode 100644 index 0000000..12144c0 --- /dev/null +++ b/assets/en-US_protocol_websocket.md.C2-bu5ot.js @@ -0,0 +1 @@ +import{_ as o,x as a,m as t,W as r,h as s}from"./chunks/framework.K8kzz9Vz.js";const m=JSON.parse('{"title":"WebSocket","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/websocket.md","filePath":"en-US/protocol/websocket.md"}'),c={name:"en-US/protocol/websocket.md"};function n(l,e,d,i,p,k){return s(),a("div",null,e[0]||(e[0]=[t("h1",{id:"websocket",tabindex:"-1"},[r("WebSocket "),t("a",{class:"header-anchor",href:"#websocket","aria-label":'Permalink to "WebSocket"'},"​")],-1)]))}const f=o(c,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/en-US_protocol_websocket.md.C2-bu5ot.lean.js b/assets/en-US_protocol_websocket.md.C2-bu5ot.lean.js new file mode 100644 index 0000000..12144c0 --- /dev/null +++ b/assets/en-US_protocol_websocket.md.C2-bu5ot.lean.js @@ -0,0 +1 @@ +import{_ as o,x as a,m as t,W as r,h as s}from"./chunks/framework.K8kzz9Vz.js";const m=JSON.parse('{"title":"WebSocket","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/protocol/websocket.md","filePath":"en-US/protocol/websocket.md"}'),c={name:"en-US/protocol/websocket.md"};function n(l,e,d,i,p,k){return s(),a("div",null,e[0]||(e[0]=[t("h1",{id:"websocket",tabindex:"-1"},[r("WebSocket "),t("a",{class:"header-anchor",href:"#websocket","aria-label":'Permalink to "WebSocket"'},"​")],-1)]))}const f=o(c,[["render",n]]);export{m as __pageData,f as default}; diff --git a/assets/en-US_resources_channel.md.CRWrGFlY.js b/assets/en-US_resources_channel.md.CRWrGFlY.js new file mode 100644 index 0000000..fa2d04c --- /dev/null +++ b/assets/en-US_resources_channel.md.CRWrGFlY.js @@ -0,0 +1 @@ +import{_ as i,x as h,a7 as n,m as e,y as d,k as r,W as a,Q as o,h as s}from"./chunks/framework.K8kzz9Vz.js";const P=JSON.parse('{"title":"Channel","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/channel.md","filePath":"en-US/resources/channel.md"}'),u={name:"en-US/resources/channel.md"};function b(c,t,f,p,g,m){const l=o("badge");return s(),h("div",null,[t[6]||(t[6]=n('

Channel

Definition

Channel

FIELDTYPEDESCRIPTION
idstringchannel ID
namestringchannel name

API

Get Channel

',6)),e("ul",null,[e("li",null,[d(l,null,{default:r(()=>t[0]||(t[0]=[a("POST")])),_:1}),t[1]||(t[1]=a()),t[2]||(t[2]=e("code",null,"/v1/channel.get",-1))])]),t[7]||(t[7]=n('
FIELDTYPEDESCRIPTION
channel_idstringchannel ID

Get a channel by ID. Returns a channel object.

bot.getChannelList(guildId, next?)

',3)),e("ul",null,[e("li",null,[d(l,null,{default:r(()=>t[3]||(t[3]=[a("POST")])),_:1}),t[4]||(t[4]=a()),t[5]||(t[5]=e("code",null,"/v1/channel.list",-1))])]),t[8]||(t[8]=n('
FIELDTYPEDESCRIPTION
guild_idstringguild ID
nextstringpagination token

Get channels in a guild. Returns a list of channel objects.

',2))])}const I=i(u,[["render",b]]);export{P as __pageData,I as default}; diff --git a/assets/en-US_resources_channel.md.CRWrGFlY.lean.js b/assets/en-US_resources_channel.md.CRWrGFlY.lean.js new file mode 100644 index 0000000..fa2d04c --- /dev/null +++ b/assets/en-US_resources_channel.md.CRWrGFlY.lean.js @@ -0,0 +1 @@ +import{_ as i,x as h,a7 as n,m as e,y as d,k as r,W as a,Q as o,h as s}from"./chunks/framework.K8kzz9Vz.js";const P=JSON.parse('{"title":"Channel","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/channel.md","filePath":"en-US/resources/channel.md"}'),u={name:"en-US/resources/channel.md"};function b(c,t,f,p,g,m){const l=o("badge");return s(),h("div",null,[t[6]||(t[6]=n('

Channel

Definition

Channel

FIELDTYPEDESCRIPTION
idstringchannel ID
namestringchannel name

API

Get Channel

',6)),e("ul",null,[e("li",null,[d(l,null,{default:r(()=>t[0]||(t[0]=[a("POST")])),_:1}),t[1]||(t[1]=a()),t[2]||(t[2]=e("code",null,"/v1/channel.get",-1))])]),t[7]||(t[7]=n('
FIELDTYPEDESCRIPTION
channel_idstringchannel ID

Get a channel by ID. Returns a channel object.

bot.getChannelList(guildId, next?)

',3)),e("ul",null,[e("li",null,[d(l,null,{default:r(()=>t[3]||(t[3]=[a("POST")])),_:1}),t[4]||(t[4]=a()),t[5]||(t[5]=e("code",null,"/v1/channel.list",-1))])]),t[8]||(t[8]=n('
FIELDTYPEDESCRIPTION
guild_idstringguild ID
nextstringpagination token

Get channels in a guild. Returns a list of channel objects.

',2))])}const I=i(u,[["render",b]]);export{P as __pageData,I as default}; diff --git a/assets/en-US_resources_guild.md.DMqzKr6J.js b/assets/en-US_resources_guild.md.DMqzKr6J.js new file mode 100644 index 0000000..5ef1795 --- /dev/null +++ b/assets/en-US_resources_guild.md.DMqzKr6J.js @@ -0,0 +1 @@ +import{_ as r,x as n,a7 as a,m as e,y as l,k as o,W as d,Q as u,h as s}from"./chunks/framework.K8kzz9Vz.js";const c=JSON.parse('{"title":"Guild","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/guild.md","filePath":"en-US/resources/guild.md"}'),g={name:"en-US/resources/guild.md"};function h(b,t,m,p,f,I){const i=u("badge");return s(),n("div",null,[t[6]||(t[6]=a('

Guild

Definition

Guild

FIELDTYPEDESCRIPTION
idstringguild ID
namestringguild name

API

bot.getGuild(guildId)

',6)),e("ul",null,[e("li",null,[l(i,null,{default:o(()=>t[0]||(t[0]=[d("POST")])),_:1}),t[1]||(t[1]=d()),t[2]||(t[2]=e("code",null,"/v1/guild.get",-1))])]),t[7]||(t[7]=a('
FIELDTYPEDESCRIPTION
guild_idstringguild ID

Get a guild by ID. Returns a guild object.

bot.getGuildList(next?)

',3)),e("ul",null,[e("li",null,[l(i,null,{default:o(()=>t[3]||(t[3]=[d("POST")])),_:1}),t[4]||(t[4]=d()),t[5]||(t[5]=e("code",null,"/v1/guild.list",-1))])]),t[8]||(t[8]=a('
FIELDTYPEDESCRIPTION
nextstringpagination token

Get guilds where the current user is a member. Returns a list of partial guild objects.

bot.handleGuildRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理来自群组的邀请。

',5))])}const x=r(g,[["render",h]]);export{c as __pageData,x as default}; diff --git a/assets/en-US_resources_guild.md.DMqzKr6J.lean.js b/assets/en-US_resources_guild.md.DMqzKr6J.lean.js new file mode 100644 index 0000000..5ef1795 --- /dev/null +++ b/assets/en-US_resources_guild.md.DMqzKr6J.lean.js @@ -0,0 +1 @@ +import{_ as r,x as n,a7 as a,m as e,y as l,k as o,W as d,Q as u,h as s}from"./chunks/framework.K8kzz9Vz.js";const c=JSON.parse('{"title":"Guild","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/guild.md","filePath":"en-US/resources/guild.md"}'),g={name:"en-US/resources/guild.md"};function h(b,t,m,p,f,I){const i=u("badge");return s(),n("div",null,[t[6]||(t[6]=a('

Guild

Definition

Guild

FIELDTYPEDESCRIPTION
idstringguild ID
namestringguild name

API

bot.getGuild(guildId)

',6)),e("ul",null,[e("li",null,[l(i,null,{default:o(()=>t[0]||(t[0]=[d("POST")])),_:1}),t[1]||(t[1]=d()),t[2]||(t[2]=e("code",null,"/v1/guild.get",-1))])]),t[7]||(t[7]=a('
FIELDTYPEDESCRIPTION
guild_idstringguild ID

Get a guild by ID. Returns a guild object.

bot.getGuildList(next?)

',3)),e("ul",null,[e("li",null,[l(i,null,{default:o(()=>t[3]||(t[3]=[d("POST")])),_:1}),t[4]||(t[4]=d()),t[5]||(t[5]=e("code",null,"/v1/guild.list",-1))])]),t[8]||(t[8]=a('
FIELDTYPEDESCRIPTION
nextstringpagination token

Get guilds where the current user is a member. Returns a list of partial guild objects.

bot.handleGuildRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理来自群组的邀请。

',5))])}const x=r(g,[["render",h]]);export{c as __pageData,x as default}; diff --git a/assets/en-US_resources_member.md.CSvkrGgF.js b/assets/en-US_resources_member.md.CSvkrGgF.js new file mode 100644 index 0000000..3454301 --- /dev/null +++ b/assets/en-US_resources_member.md.CSvkrGgF.js @@ -0,0 +1,5 @@ +import{_ as i,x as s,a7 as t,h as a}from"./chunks/framework.K8kzz9Vz.js";const c=JSON.parse('{"title":"群组成员 (GuildMember)","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/member.md","filePath":"en-US/resources/member.md"}'),l={name:"en-US/resources/member.md"};function r(o,e,d,n,g,h){return a(),s("div",null,e[0]||(e[0]=[t(`

群组成员 (GuildMember)

类型定义

ts
interface GuildMember {
+  user: User
+  nick?: string
+  avatar?: string
+}

API

bot.getGuildMember(guildId, userId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • 返回值: Promise<GuildMember> 群成员信息

获取群成员信息。

bot.getGuildMemberList(guildId, next?)

  • guildId: string 群组 ID
  • next: string 分页令牌
  • 返回值: Promise<List<GuildMember>> 群成员列表

获取群成员列表。

bot.kickGuildMember(guildId, userId, permanent?)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • permanent: boolean 是否永久踢出 (用户无法再次加入群组)
  • 返回值: Promise<void>

将某个用户踢出群组。

bot.muteGuildMember(guildId, userId, duration?, reason?)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • duration: number 禁言时长 (毫秒)
  • reason: string 禁言说明
  • 返回值: Promise<void>

将某个用户禁言。如果传入的禁言时长为 0 则表示解除禁言。

bot.handleGuildMemberRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理加群请求。

`,19)]))}const m=i(l,[["render",r]]);export{c as __pageData,m as default}; diff --git a/assets/en-US_resources_member.md.CSvkrGgF.lean.js b/assets/en-US_resources_member.md.CSvkrGgF.lean.js new file mode 100644 index 0000000..3454301 --- /dev/null +++ b/assets/en-US_resources_member.md.CSvkrGgF.lean.js @@ -0,0 +1,5 @@ +import{_ as i,x as s,a7 as t,h as a}from"./chunks/framework.K8kzz9Vz.js";const c=JSON.parse('{"title":"群组成员 (GuildMember)","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/member.md","filePath":"en-US/resources/member.md"}'),l={name:"en-US/resources/member.md"};function r(o,e,d,n,g,h){return a(),s("div",null,e[0]||(e[0]=[t(`

群组成员 (GuildMember)

类型定义

ts
interface GuildMember {
+  user: User
+  nick?: string
+  avatar?: string
+}

API

bot.getGuildMember(guildId, userId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • 返回值: Promise<GuildMember> 群成员信息

获取群成员信息。

bot.getGuildMemberList(guildId, next?)

  • guildId: string 群组 ID
  • next: string 分页令牌
  • 返回值: Promise<List<GuildMember>> 群成员列表

获取群成员列表。

bot.kickGuildMember(guildId, userId, permanent?)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • permanent: boolean 是否永久踢出 (用户无法再次加入群组)
  • 返回值: Promise<void>

将某个用户踢出群组。

bot.muteGuildMember(guildId, userId, duration?, reason?)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • duration: number 禁言时长 (毫秒)
  • reason: string 禁言说明
  • 返回值: Promise<void>

将某个用户禁言。如果传入的禁言时长为 0 则表示解除禁言。

bot.handleGuildMemberRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理加群请求。

`,19)]))}const m=i(l,[["render",r]]);export{c as __pageData,m as default}; diff --git a/assets/en-US_resources_message.md.CFI9AOBn.js b/assets/en-US_resources_message.md.CFI9AOBn.js new file mode 100644 index 0000000..ca9b17c --- /dev/null +++ b/assets/en-US_resources_message.md.CFI9AOBn.js @@ -0,0 +1,8 @@ +import{_ as e,x as a,a7 as i,h as t}from"./chunks/framework.K8kzz9Vz.js";const p=JSON.parse('{"title":"消息 (Message)","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/message.md","filePath":"en-US/resources/message.md"}'),n={name:"en-US/resources/message.md"};function l(o,s,d,r,g,h){return t(),a("div",null,s[0]||(s[0]=[i(`

消息 (Message)

类型定义

ts
interface Message {
+  isDirect: boolean
+  channelId: string
+  messageId: string
+  userId: string
+  content: string
+  timestamp?: number
+}

API

bot.sendMessage(channelId, content, guildId?)

  • channelId: string 频道 ID
  • content: Fragment 要发送的内容
  • guildId: string 群组 ID
  • 返回值: Promise<string[]> 发送的消息 ID

向特定频道发送消息。

WARNING

只要你能够获取到会话对象,你就不应使用此 API,而应该使用 session.send()。一些平台会将主动发送的消息同被动接收后回复的消息区分开来,甚至可能限制主动消息的发送,因此使用 session.send() 总是有更好的可靠性。

TIP

bot.sendMessage() 既可以发送群聊消息,也可以发送私聊消息。当发送私聊消息时,其与 bot.sendPrivateMessage() 的区别在于前者传入的是频道 ID,而后者传入的是用户 ID。

bot.sendPrivateMessage(userId, content)

  • userId: string 对方 ID
  • content: Fragment 要发送的内容
  • 返回值: Promise<string[]> 发送的消息 ID

向特定用户发送私聊消息。

bot.getMessage(channelId, messageId)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • 返回值: Promise<Message>

获取特定消息。

bot.deleteMessage(channelId, messageId)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • 返回值: Promise<void>

撤回特定消息。

bot.editMessage(channelId, messageId, content)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • content: Fragment 要发送的内容
  • 返回值: Promise<void>

修改特定消息。

bot.getMessageList(channelId, next?)

  • channelId: string 频道 ID
  • next: string 分页令牌
  • 返回值: Promise<List<Message>> 消息列表

获取频道消息列表。

`,24)]))}const k=e(n,[["render",l]]);export{p as __pageData,k as default}; diff --git a/assets/en-US_resources_message.md.CFI9AOBn.lean.js b/assets/en-US_resources_message.md.CFI9AOBn.lean.js new file mode 100644 index 0000000..ca9b17c --- /dev/null +++ b/assets/en-US_resources_message.md.CFI9AOBn.lean.js @@ -0,0 +1,8 @@ +import{_ as e,x as a,a7 as i,h as t}from"./chunks/framework.K8kzz9Vz.js";const p=JSON.parse('{"title":"消息 (Message)","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/message.md","filePath":"en-US/resources/message.md"}'),n={name:"en-US/resources/message.md"};function l(o,s,d,r,g,h){return t(),a("div",null,s[0]||(s[0]=[i(`

消息 (Message)

类型定义

ts
interface Message {
+  isDirect: boolean
+  channelId: string
+  messageId: string
+  userId: string
+  content: string
+  timestamp?: number
+}

API

bot.sendMessage(channelId, content, guildId?)

  • channelId: string 频道 ID
  • content: Fragment 要发送的内容
  • guildId: string 群组 ID
  • 返回值: Promise<string[]> 发送的消息 ID

向特定频道发送消息。

WARNING

只要你能够获取到会话对象,你就不应使用此 API,而应该使用 session.send()。一些平台会将主动发送的消息同被动接收后回复的消息区分开来,甚至可能限制主动消息的发送,因此使用 session.send() 总是有更好的可靠性。

TIP

bot.sendMessage() 既可以发送群聊消息,也可以发送私聊消息。当发送私聊消息时,其与 bot.sendPrivateMessage() 的区别在于前者传入的是频道 ID,而后者传入的是用户 ID。

bot.sendPrivateMessage(userId, content)

  • userId: string 对方 ID
  • content: Fragment 要发送的内容
  • 返回值: Promise<string[]> 发送的消息 ID

向特定用户发送私聊消息。

bot.getMessage(channelId, messageId)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • 返回值: Promise<Message>

获取特定消息。

bot.deleteMessage(channelId, messageId)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • 返回值: Promise<void>

撤回特定消息。

bot.editMessage(channelId, messageId, content)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • content: Fragment 要发送的内容
  • 返回值: Promise<void>

修改特定消息。

bot.getMessageList(channelId, next?)

  • channelId: string 频道 ID
  • next: string 分页令牌
  • 返回值: Promise<List<Message>> 消息列表

获取频道消息列表。

`,24)]))}const k=e(n,[["render",l]]);export{p as __pageData,k as default}; diff --git a/assets/en-US_resources_reaction.md.C0mS_FzD.js b/assets/en-US_resources_reaction.md.C0mS_FzD.js new file mode 100644 index 0000000..ab094e9 --- /dev/null +++ b/assets/en-US_resources_reaction.md.C0mS_FzD.js @@ -0,0 +1 @@ +import{_ as n,x as i,m as t,W as o,y as r,k as s,a7 as d,Q as l,h as c}from"./chunks/framework.K8kzz9Vz.js";const P=JSON.parse('{"title":"表态 (Reaction) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/reaction.md","filePath":"en-US/resources/reaction.md"}'),g={name:"en-US/resources/reaction.md"},m={id:"表态",tabindex:"-1"};function I(h,e,b,u,p,f){const a=l("badge");return c(),i("div",null,[t("h1",m,[e[1]||(e[1]=o("表态 (Reaction) ")),r(a,{type:"warning"},{default:s(()=>e[0]||(e[0]=[o("实验性")])),_:1}),e[2]||(e[2]=o()),e[3]||(e[3]=t("a",{class:"header-anchor",href:"#表态","aria-label":'Permalink to "表态 (Reaction) 实验性"'},"​",-1))]),e[4]||(e[4]=d('

API

bot.createReaction(channelId, messageId, emoji)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • 返回值: Promise<void>

向特定消息添加表态。

bot.deleteReaction(channelId, messageId, emoji, userId?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • userId: string 用户 ID
  • 返回值: Promise<void>

从特定消息删除某个用户添加的特定表态。如果没有传入用户 ID 则表示删除自己的表态。

bot.clearReaction(channelId, messageId, emoji?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • 返回值: Promise<void>

从特定消息清除某个特定表态。如果没有传入表态名称则表示清除所有表态。

bot.getReactionList(channelId, messageId, emoji, next?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • next: string 分页令牌
  • 返回值: Promise<List<User>>

获取添加特定消息的特定表态的用户列表。

',13))])}const j=n(g,[["render",I]]);export{P as __pageData,j as default}; diff --git a/assets/en-US_resources_reaction.md.C0mS_FzD.lean.js b/assets/en-US_resources_reaction.md.C0mS_FzD.lean.js new file mode 100644 index 0000000..ab094e9 --- /dev/null +++ b/assets/en-US_resources_reaction.md.C0mS_FzD.lean.js @@ -0,0 +1 @@ +import{_ as n,x as i,m as t,W as o,y as r,k as s,a7 as d,Q as l,h as c}from"./chunks/framework.K8kzz9Vz.js";const P=JSON.parse('{"title":"表态 (Reaction) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/reaction.md","filePath":"en-US/resources/reaction.md"}'),g={name:"en-US/resources/reaction.md"},m={id:"表态",tabindex:"-1"};function I(h,e,b,u,p,f){const a=l("badge");return c(),i("div",null,[t("h1",m,[e[1]||(e[1]=o("表态 (Reaction) ")),r(a,{type:"warning"},{default:s(()=>e[0]||(e[0]=[o("实验性")])),_:1}),e[2]||(e[2]=o()),e[3]||(e[3]=t("a",{class:"header-anchor",href:"#表态","aria-label":'Permalink to "表态 (Reaction) 实验性"'},"​",-1))]),e[4]||(e[4]=d('

API

bot.createReaction(channelId, messageId, emoji)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • 返回值: Promise<void>

向特定消息添加表态。

bot.deleteReaction(channelId, messageId, emoji, userId?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • userId: string 用户 ID
  • 返回值: Promise<void>

从特定消息删除某个用户添加的特定表态。如果没有传入用户 ID 则表示删除自己的表态。

bot.clearReaction(channelId, messageId, emoji?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • 返回值: Promise<void>

从特定消息清除某个特定表态。如果没有传入表态名称则表示清除所有表态。

bot.getReactionList(channelId, messageId, emoji, next?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • next: string 分页令牌
  • 返回值: Promise<List<User>>

获取添加特定消息的特定表态的用户列表。

',13))])}const j=n(g,[["render",I]]);export{P as __pageData,j as default}; diff --git a/assets/en-US_resources_role.md.1AfH6x9v.js b/assets/en-US_resources_role.md.1AfH6x9v.js new file mode 100644 index 0000000..13a0c3d --- /dev/null +++ b/assets/en-US_resources_role.md.1AfH6x9v.js @@ -0,0 +1,6 @@ +import{_ as s,x as o,m as l,W as i,y as a,k as d,a7 as r,Q as n,h as g}from"./chunks/framework.K8kzz9Vz.js";const B=JSON.parse('{"title":"群组角色 (GuildRole) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/role.md","filePath":"en-US/resources/role.md"}'),u={name:"en-US/resources/role.md"},h={id:"群组角色",tabindex:"-1"};function p(c,e,k,b,I,m){const t=n("badge");return g(),o("div",null,[l("h1",h,[e[1]||(e[1]=i("群组角色 (GuildRole) ")),a(t,{type:"warning"},{default:d(()=>e[0]||(e[0]=[i("实验性")])),_:1}),e[2]||(e[2]=i()),e[3]||(e[3]=l("a",{class:"header-anchor",href:"#群组角色","aria-label":'Permalink to "群组角色 (GuildRole) 实验性"'},"​",-1))]),e[4]||(e[4]=r(`

类型定义

ts
export interface GuildRole {
+  id: string
+  name: string
+  color: number
+  position: number
+}

API

bot.setGuildMemberRole(guildId, userId, roleId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

设置群组内用户的角色。

bot.unsetGuildMemberRole(guildId, userId, roleId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

取消群组内用户的角色。

bot.getGuildRoleList(guildId, next?)

  • guildId: string 群组 ID
  • next: string 分页令牌
  • 返回值: Promise<List<GuildRole>> 角色列表

获取群组角色列表。

bot.createGuildRole(guildId, data)

  • guildId: string 群组 ID
  • data: Partial<GuildRole> 角色信息
  • 返回值: Promise<string> 角色 ID

创建群组角色。

bot.modifyGuildRole(guildId, roleId, data)

  • guildId: string 群组 ID
  • roleId: string 角色 ID
  • data: Partial<GuildRole> 角色信息
  • 返回值: Promise<void>

修改群组角色。

bot.deleteGuildRole(guildId, roleId)

  • guildId: string 群组 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

删除群组角色。

`,21))])}const C=s(u,[["render",p]]);export{B as __pageData,C as default}; diff --git a/assets/en-US_resources_role.md.1AfH6x9v.lean.js b/assets/en-US_resources_role.md.1AfH6x9v.lean.js new file mode 100644 index 0000000..13a0c3d --- /dev/null +++ b/assets/en-US_resources_role.md.1AfH6x9v.lean.js @@ -0,0 +1,6 @@ +import{_ as s,x as o,m as l,W as i,y as a,k as d,a7 as r,Q as n,h as g}from"./chunks/framework.K8kzz9Vz.js";const B=JSON.parse('{"title":"群组角色 (GuildRole) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/role.md","filePath":"en-US/resources/role.md"}'),u={name:"en-US/resources/role.md"},h={id:"群组角色",tabindex:"-1"};function p(c,e,k,b,I,m){const t=n("badge");return g(),o("div",null,[l("h1",h,[e[1]||(e[1]=i("群组角色 (GuildRole) ")),a(t,{type:"warning"},{default:d(()=>e[0]||(e[0]=[i("实验性")])),_:1}),e[2]||(e[2]=i()),e[3]||(e[3]=l("a",{class:"header-anchor",href:"#群组角色","aria-label":'Permalink to "群组角色 (GuildRole) 实验性"'},"​",-1))]),e[4]||(e[4]=r(`

类型定义

ts
export interface GuildRole {
+  id: string
+  name: string
+  color: number
+  position: number
+}

API

bot.setGuildMemberRole(guildId, userId, roleId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

设置群组内用户的角色。

bot.unsetGuildMemberRole(guildId, userId, roleId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

取消群组内用户的角色。

bot.getGuildRoleList(guildId, next?)

  • guildId: string 群组 ID
  • next: string 分页令牌
  • 返回值: Promise<List<GuildRole>> 角色列表

获取群组角色列表。

bot.createGuildRole(guildId, data)

  • guildId: string 群组 ID
  • data: Partial<GuildRole> 角色信息
  • 返回值: Promise<string> 角色 ID

创建群组角色。

bot.modifyGuildRole(guildId, roleId, data)

  • guildId: string 群组 ID
  • roleId: string 角色 ID
  • data: Partial<GuildRole> 角色信息
  • 返回值: Promise<void>

修改群组角色。

bot.deleteGuildRole(guildId, roleId)

  • guildId: string 群组 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

删除群组角色。

`,21))])}const C=s(u,[["render",p]]);export{B as __pageData,C as default}; diff --git a/assets/en-US_resources_user.md.owA9OMRz.js b/assets/en-US_resources_user.md.owA9OMRz.js new file mode 100644 index 0000000..da3aa4c --- /dev/null +++ b/assets/en-US_resources_user.md.owA9OMRz.js @@ -0,0 +1,5 @@ +import{_ as s,x as a,a7 as i,h as t}from"./chunks/framework.K8kzz9Vz.js";const g=JSON.parse('{"title":"用户 (User)","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/user.md","filePath":"en-US/resources/user.md"}'),n={name:"en-US/resources/user.md"};function r(l,e,o,d,h,p){return t(),a("div",null,e[0]||(e[0]=[i(`

用户 (User)

类型定义

ts
export interface User {
+  id: string
+  name: string
+  avatar?: string
+}

API

bot.getSelf()

  • 返回值: Promise<User> 用户信息

获取机器人自己的信息。

bot.getUser(userId)

  • userId: string 用户 ID
  • 返回值: Promise<User> 用户信息

获取用户信息。

bot.getFriendList(next?)

  • next: string 分页令牌
  • 返回值: Promise<List<User>> 好友列表

获取机器人的好友列表。

bot.handleFriendRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理好友请求。

`,16)]))}const k=s(n,[["render",r]]);export{g as __pageData,k as default}; diff --git a/assets/en-US_resources_user.md.owA9OMRz.lean.js b/assets/en-US_resources_user.md.owA9OMRz.lean.js new file mode 100644 index 0000000..da3aa4c --- /dev/null +++ b/assets/en-US_resources_user.md.owA9OMRz.lean.js @@ -0,0 +1,5 @@ +import{_ as s,x as a,a7 as i,h as t}from"./chunks/framework.K8kzz9Vz.js";const g=JSON.parse('{"title":"用户 (User)","description":"","frontmatter":{},"headers":[],"relativePath":"en-US/resources/user.md","filePath":"en-US/resources/user.md"}'),n={name:"en-US/resources/user.md"};function r(l,e,o,d,h,p){return t(),a("div",null,e[0]||(e[0]=[i(`

用户 (User)

类型定义

ts
export interface User {
+  id: string
+  name: string
+  avatar?: string
+}

API

bot.getSelf()

  • 返回值: Promise<User> 用户信息

获取机器人自己的信息。

bot.getUser(userId)

  • userId: string 用户 ID
  • 返回值: Promise<User> 用户信息

获取用户信息。

bot.getFriendList(next?)

  • next: string 分页令牌
  • 返回值: Promise<List<User>> 好友列表

获取机器人的好友列表。

bot.handleFriendRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理好友请求。

`,16)]))}const k=s(n,[["render",r]]);export{g as __pageData,k as default}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 0000000..b6b603d Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 0000000..def40a4 Binary files /dev/null and b/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ diff --git a/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 new file mode 100644 index 0000000..e070c3d Binary files /dev/null and b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 0000000..a3c16ca Binary files /dev/null and b/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 0000000..2210a89 Binary files /dev/null and b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ diff --git a/assets/inter-italic-latin.C2AdPX0b.woff2 b/assets/inter-italic-latin.C2AdPX0b.woff2 new file mode 100644 index 0000000..790d62d Binary files /dev/null and b/assets/inter-italic-latin.C2AdPX0b.woff2 differ diff --git a/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/assets/inter-italic-vietnamese.BSbpV94h.woff2 new file mode 100644 index 0000000..1eec077 Binary files /dev/null and b/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 new file mode 100644 index 0000000..2cfe615 Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ diff --git a/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 new file mode 100644 index 0000000..e3886dd Binary files /dev/null and b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 0000000..36d6748 Binary files /dev/null and b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 0000000..2bed1e8 Binary files /dev/null and b/assets/inter-roman-greek.BBVDIX6e.woff2 differ diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 0000000..9a8d1e2 Binary files /dev/null and b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 0000000..07d3c53 Binary files /dev/null and b/assets/inter-roman-latin.Di8DUHzh.woff2 differ diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 0000000..57bdc22 Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/assets/style.B9CLIV_2.css b/assets/style.B9CLIV_2.css new file mode 100644 index 0000000..4e40bd6 --- /dev/null +++ b/assets/style.B9CLIV_2.css @@ -0,0 +1 @@ +.adapter-table{display:grid;grid-template-columns:repeat(3,1fr);grid-gap:1rem 1rem}.adapter-table a.adapter{display:flex;align-items:center;justify-content:center;width:100%;height:4rem;border-radius:12px;background-color:var(--vp-c-bg-soft);transition:all .3s ease;text-decoration:none;color:var(--vp-c-text);cursor:pointer;-webkit-user-select:none;user-select:none}.adapter-table .adapter:hover{background-color:var(--vp-c-bg-alt)}.el-scrollbar{--el-text-color-secondary: #909399;--el-scrollbar-opacity: .3;--el-scrollbar-bg-color: var(--el-text-color-secondary);--el-scrollbar-hover-opacity: .5;--el-scrollbar-hover-bg-color: var(--el-text-color-secondary);--el-transition-duration: .3s}.el-scrollbar{overflow:hidden;position:relative;height:100%}.el-scrollbar__wrap{overflow:auto;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:var(--el-scrollbar-bg-color, var(--el-text-color-secondary));transition:var(--el-transition-duration) background-color;opacity:var(--el-scrollbar-opacity, .3)}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color, var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity, .5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.root[data-v-53c99d69]{position:relative;z-index:1}.nested[data-v-53c99d69]{padding-right:16px;padding-left:16px}.outline-link[data-v-53c99d69]{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-53c99d69]:hover,.outline-link.active[data-v-53c99d69]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-53c99d69]{padding-left:13px}.VPDocAsideOutline[data-v-f610f197]{display:none}.VPDocAsideOutline.has-outline[data-v-f610f197]{display:block}.content[data-v-f610f197]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-f610f197]{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-f610f197]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-1bb0c8a8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-1bb0c8a8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-1bcd8184]{margin-top:64px}.edit-info[data-v-1bcd8184]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-1bcd8184]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-1bcd8184]{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-1bcd8184]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-1bcd8184]{margin-right:8px}.prev-next[data-v-1bcd8184]{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-1bcd8184]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-1bcd8184]{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-1bcd8184]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-1bcd8184]{margin-left:auto;text-align:right}.desc[data-v-1bcd8184]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-1bcd8184]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-e6f2a212]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-e6f2a212]{display:flex;justify-content:center}.VPDoc .aside[data-v-e6f2a212]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{max-width:1104px}}.container[data-v-e6f2a212]{margin:0 auto;width:100%}.aside[data-v-e6f2a212]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-e6f2a212]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-e6f2a212]{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-e6f2a212]::-webkit-scrollbar{display:none}.aside-curtain[data-v-e6f2a212]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-e6f2a212]{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-e6f2a212]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-e6f2a212]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-e6f2a212]{order:1;margin:0;min-width:640px}}.content-container[data-v-e6f2a212]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-e6f2a212]{max-width:688px}.spoiler[data-v-4b7f368a]{border-radius:4px;padding:1px 3px;margin:0 3px;text-shadow:none;transition:color .2s linear;background-color:var(--vp-custom-block-tip-text)}.spoiler[data-v-4b7f368a]:hover{color:var(--vp-c-bg)}.chat-message{position:relative;margin:1rem 0;opacity:0;transform:translate(-20%);transition:transform .3s ease-out,opacity .3s ease}.chat-message.shown{opacity:1;transform:translate(0)}.chat-message .avatar{width:2.8rem;height:2.8rem;position:absolute;border-radius:100%;transform:translateY(-1px);-webkit-user-select:none;user-select:none;pointer-events:none;text-align:center;line-height:2.8rem;font-size:1.6rem;color:#fff;font-family:Comic Sans MS}.chat-message .nickname{-webkit-user-select:none;user-select:none;position:relative;margin:0 0 .4rem 4.2rem;font-weight:700;font-size:.9rem}.chat-message:not(.no-padding) .message-box{padding:.5rem .7rem}.chat-message .message-box{position:relative;margin-left:4.2rem;width:fit-content;border-radius:.5rem;background-color:var(--vp-c-bg);word-break:break-all;line-height:26px!important}.chat-message .message-box>img{border-radius:.5rem}.chat-message .message-box img{vertical-align:middle}.chat-message .message-box p>img{margin:.2rem 0}.chat-message .message-box:before{content:"";position:absolute;right:100%;top:0;width:12px;height:12px;border:0 solid transparent;border-bottom-width:8px;border-bottom-color:currentColor;border-radius:0 0 0 32px;color:var(--vp-c-bg)}.chat-message .message-box p{margin:0!important;line-height:26px!important}.chat-message .message-box p.indent-1{padding-left:1rem}.chat-message .message-box p.indent-2{padding-left:2rem}.chat-message .message-box blockquote{font-size:.9rem;margin:0 0 .2rem;background-color:#f3f6f9;border:none;border-radius:.5rem;padding:.2rem .6rem;background-color:var(--vp-c-bg-alt);color:var(--vp-c-text-2)}.panel-view{position:relative;border-radius:6px;margin:1rem 0;overflow:auto hidden;background-color:var(--vp-c-bg-alt)}.panel-view.manager,.panel-view.container{background-color:#032f62}.panel-view .controls{display:initial;position:absolute;top:.8rem;width:100%}.panel-view .circle{position:absolute;top:2px;width:12px;height:12px;border-radius:6px}.panel-view .circle.red{left:17px;background-color:#ff5f56}.panel-view .circle.yellow{left:36px;background-color:#ffbd2e}.panel-view .circle.green{left:55px;background-color:#27c93f}.panel-view .title{text-align:center;width:100%;font-size:.9rem;line-height:1rem}.panel-view .title .tab{color:gray;cursor:pointer;transition:.3s ease}.panel-view .title .tab.active{color:#fff;cursor:default}.panel-view .title .title-text:not(:last-child):after{color:gray;content:" - "}.panel-view .title .tab+.tab:before{cursor:default;content:" | ";color:gray}.panel-view .content{padding:.2rem 1.2rem}.panel-view .content>p{font-size:.8rem;color:#909399;text-align:center}.panel-view.mini .controls{display:none}.panel-view:not(.mini) .content{padding-top:2rem}.tab-select{margin-top:16px}.tab-select .header span{display:inline-block;padding:4px 16px;font-size:12px;font-weight:500;cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--vp-c-text-2);background-color:var(--vp-code-block-bg);border-bottom:1px solid var(--vp-c-bg)}.tab-select .header span.active{color:var(--vp-c-text-1)}.tab-select .header span:first-child{border-top-left-radius:8px;border-bottom-left-radius:8px}.tab-select .header span:last-child{border-top-right-radius:8px;border-bottom-right-radius:8px}.tab-select .header span+span{border-left:1px solid var(--vp-c-bg)}@media (max-width: 639px){.tab-select.code .header{margin:0 -24px}}.tab-select.code .header span:first-child{border-bottom-left-radius:0}.tab-select.code .header span:last-child{border-bottom-right-radius:0}.tab-select.code .header+div{margin-top:0!important;border-top-left-radius:0!important}.tab-select.code .header+div span.lang{display:none}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.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;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,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;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.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;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,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:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}: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: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}: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-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{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.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 h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.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;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;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,.vp-doc h4>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;-webkit-user-select:none;user-select:none;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:0 0 4px!important;text-align:center;letter-spacing:1px!important;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-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-6ff51ddd]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-6ff51ddd]{padding:96px 32px 168px}}.code[data-v-6ff51ddd]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-6ff51ddd]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-6ff51ddd]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-6ff51ddd]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-6ff51ddd]{padding-top:20px}.link[data-v-6ff51ddd]{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-6ff51ddd]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.VPButton[data-v-93dc4167]{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-93dc4167]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-93dc4167]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-93dc4167]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-93dc4167]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-93dc4167]: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-93dc4167]: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-93dc4167]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-93dc4167]: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-93dc4167]: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-93dc4167]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-93dc4167]: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-93dc4167]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-b10c5094]{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-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-b10c5094]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-b10c5094]{flex-direction:row}}.main[data-v-b10c5094]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-b10c5094]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-b10c5094]{text-align:left}}@media (min-width: 960px){.main[data-v-b10c5094]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-b10c5094]{max-width:592px}}.name[data-v-b10c5094],.text[data-v-b10c5094]{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-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0 auto}.name[data-v-b10c5094]{color:var(--vp-home-hero-name-color)}.clip[data-v-b10c5094]{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-b10c5094],.text[data-v-b10c5094]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-b10c5094],.text[data-v-b10c5094]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0}}.tagline[data-v-b10c5094]{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-b10c5094]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-b10c5094]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-b10c5094]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-b10c5094]{margin:0}}.actions[data-v-b10c5094]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-b10c5094]{justify-content:center}@media (min-width: 640px){.actions[data-v-b10c5094]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-b10c5094]{justify-content:flex-start}}.action[data-v-b10c5094]{flex-shrink:0;padding:6px}.image[data-v-b10c5094]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-b10c5094]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-b10c5094]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-b10c5094]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-b10c5094]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-b10c5094]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-b10c5094]{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-b10c5094]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-b10c5094]{width:320px;height:320px}}[data-v-b10c5094] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-b10c5094] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-b10c5094] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-bd37d1a2]{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-bd37d1a2]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-bd37d1a2]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-bd37d1a2]>.VPImage{margin-bottom:20px}.icon[data-v-bd37d1a2]{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-bd37d1a2]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-bd37d1a2]{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-bd37d1a2]{padding-top:8px}.link-text-value[data-v-bd37d1a2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-bd37d1a2]{margin-left:6px}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.container[data-v-c141a4bd]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-c141a4bd]{padding:0 48px}}@media (min-width: 960px){.container[data-v-c141a4bd]{width:100%;padding:0 64px}}.vp-doc[data-v-c141a4bd] .VPHomeSponsors,.vp-doc[data-v-c141a4bd] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-c141a4bd] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-c141a4bd] .VPHomeSponsors a,.vp-doc[data-v-c141a4bd] .VPTeamPage a{text-decoration:none}.VPHome[data-v-07b1ad08]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-07b1ad08]{margin-bottom:128px}}.VPContent[data-v-9a6c75ad]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-9a6c75ad]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:0}@media (min-width: 960px){.VPContent[data-v-9a6c75ad]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-9a6c75ad]{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-566314d4]{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-566314d4]{display:none}.VPFooter[data-v-566314d4] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-566314d4] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-566314d4]{padding:32px}}.container[data-v-566314d4]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-566314d4],.copyright[data-v-566314d4]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-883964e0]{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-883964e0]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-883964e0]{color:var(--vp-c-text-1)}.icon[data-v-883964e0]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-883964e0]{font-size:14px}.icon[data-v-883964e0]{font-size:16px}}.open>.icon[data-v-883964e0]{transform:rotate(90deg)}.items[data-v-883964e0]{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-883964e0]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-883964e0]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-883964e0]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-883964e0]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-883964e0]{transition:all .2s ease-out}.flyout-leave-active[data-v-883964e0]{transition:all .15s ease-in}.flyout-enter-from[data-v-883964e0],.flyout-leave-to[data-v-883964e0]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-2488c25a]{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-2488c25a]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-2488c25a]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-2488c25a]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-2488c25a]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-2488c25a]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-2488c25a]{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-2488c25a]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-2488c25a]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-2488c25a]{display:none}}.menu-icon[data-v-2488c25a]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-2488c25a]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-2488c25a]{padding:12px 32px 11px}}.VPSwitch[data-v-b4ccac88]{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-b4ccac88]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-b4ccac88]{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-b4ccac88]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-b4ccac88] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-b4ccac88] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-be9742d9]{opacity:1}.moon[data-v-be9742d9],.dark .sun[data-v-be9742d9]{opacity:0}.dark .moon[data-v-be9742d9]{opacity:1}.dark .VPSwitchAppearance[data-v-be9742d9] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-3f90c1a5]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-3f90c1a5]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-7eeeb2dc]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-7eeeb2dc]{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-7eeeb2dc]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-7eeeb2dc]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-20ed86d6]{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-20ed86d6] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-20ed86d6] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-20ed86d6] .group:last-child{padding-bottom:0}.VPMenu[data-v-20ed86d6] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-20ed86d6] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-20ed86d6] .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-20ed86d6] .action{padding-left:24px}.VPFlyout[data-v-bfe7971f]{position:relative}.VPFlyout[data-v-bfe7971f]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-bfe7971f]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-bfe7971f]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-bfe7971f]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-bfe7971f]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-bfe7971f]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-bfe7971f],.button[aria-expanded=true]+.menu[data-v-bfe7971f]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-bfe7971f]{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-bfe7971f]{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-bfe7971f]{margin-right:0;font-size:16px}.text-icon[data-v-bfe7971f]{margin-left:4px;font-size:14px}.icon[data-v-bfe7971f]{font-size:20px;transition:fill .25s}.menu[data-v-bfe7971f]{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-60a9a2d3]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-60a9a2d3]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-60a9a2d3]>svg,.VPSocialLink[data-v-60a9a2d3]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-f953d92f]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-f953d92f]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-f953d92f]{display:none}}.trans-title[data-v-f953d92f]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-f953d92f],.item.social-links[data-v-f953d92f]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-f953d92f]{min-width:176px}.appearance-action[data-v-f953d92f]{margin-right:-2px}.social-links-list[data-v-f953d92f]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-815115f5]{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-815115f5],.VPNavBarMenuLink[data-v-815115f5]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-afb2845e]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-afb2845e]{display:flex}}/*! @docsearch/css 3.8.0 | 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-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 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-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--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:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}@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-Tree,.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] 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:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@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-Key--pressed{transform:none;box-shadow:none}.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}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-9f43907a]{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-9f43907a]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-9f43907a]{border-bottom-color:var(--vp-c-divider)}}[data-v-9f43907a] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-acee064b]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-acee064b]{display:flex;align-items:center}}.title[data-v-acee064b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-9fd4d1dd]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-9fd4d1dd]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:transparent}.VPNavBar[data-v-9fd4d1dd]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-9fd4d1dd]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-9fd4d1dd]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-9fd4d1dd]{padding:0}}.container[data-v-9fd4d1dd]{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-9fd4d1dd],.container>.content[data-v-9fd4d1dd]{pointer-events:none}.container[data-v-9fd4d1dd] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-9fd4d1dd]{max-width:100%}}.title[data-v-9fd4d1dd]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-9fd4d1dd]{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-9fd4d1dd]{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-9fd4d1dd]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{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-9fd4d1dd]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-9fd4d1dd]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-9fd4d1dd]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-9fd4d1dd]{column-gap:.5rem}}.menu+.translations[data-v-9fd4d1dd]:before,.menu+.appearance[data-v-9fd4d1dd]:before,.menu+.social-links[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before,.appearance+.social-links[data-v-9fd4d1dd]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before{margin-right:16px}.appearance+.social-links[data-v-9fd4d1dd]:before{margin-left:16px}.social-links[data-v-9fd4d1dd]{margin-right:-8px}.divider[data-v-9fd4d1dd]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-9fd4d1dd]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-a3e2920d]{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-a3e2920d]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-fa963d97]{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-fa963d97]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-e04f3e85]{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-e04f3e85]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-d99bfeec]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-d99bfeec]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-d99bfeec]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-d99bfeec]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-d99bfeec]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-d99bfeec]{transform:rotate(45deg)}.button[data-v-d99bfeec]{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-d99bfeec]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-d99bfeec]{transition:transform .25s}.group[data-v-d99bfeec]:first-child{padding-top:0}.group+.group[data-v-d99bfeec],.group+.item[data-v-d99bfeec]{padding-top:4px}.VPNavScreenTranslations[data-v-516e4bc3]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-516e4bc3]{height:auto}.title[data-v-516e4bc3]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-516e4bc3]{font-size:16px}.icon.lang[data-v-516e4bc3]{margin-right:8px}.icon.chevron[data-v-516e4bc3]{margin-left:4px}.list[data-v-516e4bc3]{padding:4px 0 0 24px}.link[data-v-516e4bc3]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-2dd6d0c7]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));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 .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active[data-v-2dd6d0c7]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active .container[data-v-2dd6d0c7]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to[data-v-2dd6d0c7]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to .container[data-v-2dd6d0c7]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-2dd6d0c7]{display:none}}.container[data-v-2dd6d0c7]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-2dd6d0c7],.menu+.appearance[data-v-2dd6d0c7],.translations+.appearance[data-v-2dd6d0c7]{margin-top:24px}.menu+.social-links[data-v-2dd6d0c7]{margin-top:16px}.appearance+.social-links[data-v-2dd6d0c7]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-edd2eed8]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-edd2eed8]{padding-bottom:10px}.item[data-v-edd2eed8]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-edd2eed8]{cursor:pointer}.indicator[data-v-edd2eed8]{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-edd2eed8],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-edd2eed8]{background-color:var(--vp-c-brand-1)}.link[data-v-edd2eed8]{display:flex;align-items:center;flex-grow:1}.text[data-v-edd2eed8]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-edd2eed8]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-edd2eed8],.VPSidebarItem.level-2 .text[data-v-edd2eed8],.VPSidebarItem.level-3 .text[data-v-edd2eed8],.VPSidebarItem.level-4 .text[data-v-edd2eed8],.VPSidebarItem.level-5 .text[data-v-edd2eed8]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-edd2eed8]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.caret[data-v-edd2eed8]{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-edd2eed8]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-edd2eed8]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-edd2eed8]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-edd2eed8]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-edd2eed8],.VPSidebarItem.level-2 .items[data-v-edd2eed8],.VPSidebarItem.level-3 .items[data-v-edd2eed8],.VPSidebarItem.level-4 .items[data-v-edd2eed8],.VPSidebarItem.level-5 .items[data-v-edd2eed8]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-edd2eed8]{display:none}.no-transition[data-v-51288d80] .caret-icon{transition:none}.group+.group[data-v-51288d80]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-51288d80]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-42c4c606]{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-42c4c606]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-42c4c606]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-42c4c606]{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-42c4c606]{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-42c4c606]{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-42c4c606]{outline:0}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-d8b57b2d]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-3dc26e1d]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-3dc26e1d]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{margin:128px 0}}.VPHomeSponsors[data-v-3dc26e1d]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 64px}}.container[data-v-3dc26e1d]{margin:0 auto;max-width:1152px}.love[data-v-3dc26e1d]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-3dc26e1d]{display:inline-block}.message[data-v-3dc26e1d]{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-3dc26e1d]{padding-top:32px}.action[data-v-3dc26e1d]{padding-top:40px;text-align:center}.VPTeamPage[data-v-a5329171]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-a5329171]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-a5329171-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-a5329171-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-a5329171-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:96px}}.VPTeamMembers[data-v-a5329171-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-a5329171-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-a5329171-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-acff304e]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-acff304e]{padding:32px}.VPTeamMembersItem.small .data[data-v-acff304e]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-acff304e]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-acff304e]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-acff304e]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-acff304e]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-acff304e]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-acff304e]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-acff304e]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-acff304e]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-acff304e]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-acff304e]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-acff304e]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-acff304e]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-acff304e]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-acff304e]{text-align:center}.avatar[data-v-acff304e]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-acff304e]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-acff304e]{margin:0;font-weight:600}.affiliation[data-v-acff304e]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-acff304e]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-acff304e]:hover{color:var(--vp-c-brand-1)}.desc[data-v-acff304e]{margin:0 auto}.desc[data-v-acff304e] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-acff304e]{display:flex;justify-content:center;height:56px}.sp-link[data-v-acff304e]{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-acff304e]:hover,.sp .sp-link.link[data-v-acff304e]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-acff304e]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPSidebar{position:fixed!important;padding:0 32px;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-c-bg);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease}.vp-sidebar-view{padding:32px 0;overflow-x:hidden}.VPSidebar.open{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar{width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-c-bg-alt);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}.vp-sidebar-view{padding-top:var(--vp-nav-height);padding-bottom:32px}}@media (min-width: 1440px){.VPSidebar{padding-left:max(32px,(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{margin-top:calc(var(--vp-nav-height) * -1);height:var(--vp-nav-height)}.el-scrollbar .VPSidebar{height:calc(100% - 64px);top:64px}}.vp-sidebar-nav{outline:0}.vp-sidebar-nav>.group+.group{margin-top:16px}.group+.group{border-top:1px solid var(--vp-c-divider);padding-top:16px}@media (min-width: 960px){.group{padding-top:16px;width:calc(var(--vp-sidebar-width) - 64px)}}.group .VPSidebarItem.level-0{padding-bottom:0}.group .VPSidebarItem.level-0>.item>.text{padding:0;margin:4px 0}.Layout[data-v-c1849dc6]{display:flex;flex-direction:column;min-height:100vh}.VPContent[data-v-c1849dc6]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.has-sidebar[data-v-c1849dc6]{margin:0}@media (min-width: 960px){.VPContent[data-v-c1849dc6]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-c1849dc6]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-c1849dc6]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.grid{display:grid}.m14\.386{margin:3.5965rem}.me{margin-inline-end:1rem}.block{display:block}.inline-block{display:inline-block}.hidden{display:none}.h1{height:.25rem}.h2{height:.5rem}.h3{height:.75rem}.h4{height:1rem}.h5{height:1.25rem}.h6{height:1.5rem}.flex{display:flex}.flex-shrink{flex-shrink:1}.flex-grow{flex-grow:1}.flex-wrap{flex-wrap:wrap}.transform{transform:translate(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skew(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.resize{resize:both}.break-all{word-break:break-all}.border{border-width:1px}.px{padding-left:1rem;padding-right:1rem}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.tab{-moz-tab-size:4;-o-tab-size:4;tab-size:4}.text-shadow{--un-text-shadow:0 0 1px var(--un-text-shadow-color, rgb(0 0 0 / .2)),0 0 1px var(--un-text-shadow-color, rgb(1 0 5 / .1));text-shadow:var(--un-text-shadow)}.outline{outline-style:solid}.blur{--un-blur:blur(8px);filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}.filter{filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.ease{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.VPSidebarItem.is-link{margin:4px 0}.VPSidebarItem .items{overflow:hidden}.VPSidebarItem .items:first-child .VPSidebarItem.is-link:first-child{padding-top:4px;padding-bottom:4px;line-height:24px;font-size:14px;margin:0}.VPSidebarItem .items:first-child .VPSidebarItem.is-link:first-child p.text{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem .items:first-child .VPSidebarItem.is-link:first-child.is-active p.text{color:var(--vp-c-brand)}.VPSidebarItem .item p.text{padding:0}@media (min-width: 1440px){.VPNavBar.has-sidebar .container .content{padding-right:0}.VPNavBar.has-sidebar .container .content .content-body{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px)}}@media (min-width: 960px){.VPNavBar.has-sidebar .title{background-color:var(--vp-sidebar-bg-color)}}.VPDocAsideOutline .outline-link{line-height:28px;font-size:13px}.VPLocalNav.has-sidebar{--vp-c-gutter: var(--vp-c-border)}@media (min-width: 960px) and (max-width: 1280px){.VPLocalNav.has-sidebar{border-bottom:none;background:transparent;--vp-z-index-local-nav: 35}.VPLocalNav.has-sidebar .container{top:0;position:fixed;height:var(--vp-nav-height);z-index:var(--vp-z-index-local-nav)}.VPLocalNav.has-sidebar .VPLocalNavOutlineDropdown button{font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPLocalNav.has-sidebar .VPLocalNavOutlineDropdown .items{top:60px;left:20px}}@media (max-width: 960px){.VPNav .VPNavBar .divider-line{background-color:var(--vp-c-border)}}@media (min-width: 960px){.VPNavBar .divider-line{background-color:transparent!important}.VPNavBar .divider-line:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}.layout-home .divider-line{display:none}:root{--shiki-token-text: #000000;--shiki-token-constant: #005CC5;--shiki-token-number: #005CC5;--shiki-token-string: #22863A;--shiki-token-comment: #6A737D;--shiki-token-keyword: #D73A49;--shiki-token-parameter: #E36209;--shiki-token-function: #6F42C1;--shiki-token-operator: #D73A49;--shiki-token-punctuation: #032F62;--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-lang: var(--vp-c-text-light-3);--vp-code-line-highlight-color: #0000000A}html.dark{--shiki-token-text: #ABB2BF;--shiki-token-constant: #E5C07B;--shiki-token-number: #D19A66;--shiki-token-string: #98C379;--shiki-token-comment: #7F848E;--shiki-token-keyword: #C678DD;--shiki-token-parameter: #E06C75;--shiki-token-function: #61AFEF;--shiki-token-operator: #56B6C2;--shiki-token-punctuation: #ABB2BF;--vp-code-line-highlight-color: #000000A0}html.dark{--vp-code-lang: var(--vp-c-text-dark-3)}.vp-doc [class*=language-]>span.lang{color:var(--vp-code-lang)}.vp-doc ol,.vp-doc ul{line-height:1.75;padding-left:1.5rem}.vp-doc li+li{margin-top:0}.vp-doc th,.vp-doc td{padding:.6em 1em}.vp-doc li>ol,.vp-doc li>ul{margin-top:0}.vp-doc h3+h3{margin-top:1rem}.vp-doc div[class*=language-]+div[class*=language-]{margin-top:0}.vp-doc sub,.vp-doc sup{line-height:0}.vp-doc blockquote>p{font-size:15px;line-height:1.7}.vp-doc .custom-block{font-size:15px;padding:1px 1.5rem;border-width:0;border-radius:0;border-left-width:4px;border-left-style:solid;position:relative}.vp-doc .custom-block .custom-block-title{display:none}.vp-doc .custom-block p{margin:1rem 0;line-height:1.7}.vp-doc .custom-block div[class*=language-]{margin:1rem 0}.vp-doc .custom-block:before{content:"!";position:absolute;top:20px;left:-12px;color:#fff;width:20px;height:20px;border-radius:100%;text-align:center;line-height:21px;font-weight:700;font-family:Dosis,Source Sans Pro,Helvetica Neue,Arial,sans-serif;font-size:14px}.vp-doc .custom-block.info:before{background-color:var(--vp-custom-block-info-border)}.vp-doc .custom-block.tip:before{background-color:var(--vp-custom-block-tip-border)}.vp-doc .custom-block.warning:before{background-color:var(--vp-custom-block-warning-border)}.vp-doc .custom-block.danger:before{background-color:var(--vp-custom-block-danger-border)}html:not(.dark) .dark-only{display:none}html.dark .light-only{display:none}mjx-container{font-size:.95em}p mjx-container,li mjx-container{display:inline-flex;vertical-align:middle}p mjx-container>svg,li mjx-container>svg{margin-top:-4px}:root{--vp-nav-height: 64px;--vp-custom-block-tip-text: var(--vp-c-brand-1);--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-success-text: var(--vp-c-green-1);--vp-custom-block-warning-text: var(--vp-c-yellow-1);--vp-custom-block-danger-text: var(--vp-c-red-1);--vp-custom-block-tip-border: var(--vp-c-brand-1);--vp-custom-block-info-border: var(--vp-c-gray-1);--vp-custom-block-success-border: var(--vp-c-green-1);--vp-custom-block-warning-border: var(--vp-c-yellow-1);--vp-custom-block-danger-border: var(--vp-c-red-1)}.DocSearch{--docsearch-primary-color: var(--vp-c-brand) !important}.el-scrollbar__bar{z-index:50}.outline{outline-style:none}.home[data-v-b7c0548e]{position:absolute;width:100%;top:0;left:0;height:100vh;overflow-y:auto;display:grid;grid-template-rows:repeat(1,100vh)}.footer[data-v-b7c0548e]{position:absolute;bottom:0;left:0;width:100%;text-align:center;padding:1rem 0;font-size:.8rem;color:var(--vp-text-light);text-decoration:none;transition:color .3s ease}.footer[data-v-b7c0548e]:hover{color:var(--vp-text)}.screen[data-v-b7c0548e]{padding:6rem;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center}h1[data-v-b7c0548e]{font-size:3rem;line-height:1.5}.desc[data-v-b7c0548e]{color:var(--vp-text-light);text-transform:uppercase;text-align:center;line-height:2;margin:1rem 0}.actions[data-v-b7c0548e]{margin:1.5rem 0;display:flex;flex-wrap:wrap;gap:2.2rem;justify-content:center}@media (max-width: 600px){.actions[data-v-b7c0548e]{margin:4rem 0 0;flex-direction:column}}.actions .action-button[data-v-b7c0548e]{flex:1 0 auto;-webkit-user-select:none;user-select:none;display:inline-block;font-size:1.05rem;line-height:1.4;padding:.5rem 2.2rem;border-width:2px;border-style:solid;border-radius:2rem;transition:color .3s ease,background-color .3s ease,border-color .3s ease;box-sizing:border-box;cursor:pointer}@media (max-width: 600px){.actions .action-button[data-v-b7c0548e]{padding:.5rem 4rem}}.actions .action-button.secondary[data-v-b7c0548e]{color:var(--vp-button-brand-hover-bg);border-color:var(--vp-button-brand-bg)}.actions .action-button.secondary[data-v-b7c0548e]:hover{color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}blockquote.route .badge{border-top-right-radius:0;border-bottom-right-radius:0}blockquote.route code{display:inline-flex;align-items:center;vertical-align:middle;height:20px;border-top-left-radius:0;border-bottom-left-radius:0}.vp-doc sup a{text-decoration:none} diff --git a/assets/zh-CN_advanced_bridge.md.BvgC5OVs.js b/assets/zh-CN_advanced_bridge.md.BvgC5OVs.js new file mode 100644 index 0000000..69de0de --- /dev/null +++ b/assets/zh-CN_advanced_bridge.md.BvgC5OVs.js @@ -0,0 +1 @@ +import{_ as e,x as t,a7 as r,h as d}from"./chunks/framework.K8kzz9Vz.js";const f=JSON.parse('{"title":"桥接","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/bridge.md","filePath":"zh-CN/advanced/bridge.md"}'),o={name:"zh-CN/advanced/bridge.md"};function n(i,a,s,c,h,l){return d(),t("div",null,a[0]||(a[0]=[r('

桥接

概述

桥接反射

',3)]))}const p=e(o,[["render",n]]);export{f as __pageData,p as default}; diff --git a/assets/zh-CN_advanced_bridge.md.BvgC5OVs.lean.js b/assets/zh-CN_advanced_bridge.md.BvgC5OVs.lean.js new file mode 100644 index 0000000..69de0de --- /dev/null +++ b/assets/zh-CN_advanced_bridge.md.BvgC5OVs.lean.js @@ -0,0 +1 @@ +import{_ as e,x as t,a7 as r,h as d}from"./chunks/framework.K8kzz9Vz.js";const f=JSON.parse('{"title":"桥接","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/bridge.md","filePath":"zh-CN/advanced/bridge.md"}'),o={name:"zh-CN/advanced/bridge.md"};function n(i,a,s,c,h,l){return d(),t("div",null,a[0]||(a[0]=[r('

桥接

概述

桥接反射

',3)]))}const p=e(o,[["render",n]]);export{f as __pageData,p as default}; diff --git a/assets/zh-CN_advanced_internal.md.BcT4DuVV.js b/assets/zh-CN_advanced_internal.md.BcT4DuVV.js new file mode 100644 index 0000000..54a6675 --- /dev/null +++ b/assets/zh-CN_advanced_internal.md.BcT4DuVV.js @@ -0,0 +1,7 @@ +import{_ as a,x as i,a7 as e,h as s}from"./chunks/framework.K8kzz9Vz.js";const k=JSON.parse('{"title":"跨平台","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/internal.md","filePath":"zh-CN/advanced/internal.md"}'),d={name:"zh-CN/advanced/internal.md"};function o(l,t,n,r,p,c){return s(),i("div",null,t[0]||(t[0]=[e(`

跨平台

作为一个跨平台的聊天协议,Satori 提供了访问任意平台原生接口的能力。这意味着,你可以大多数情况下编写通用代码,并在需要的时候使用原生接口来实现平台特定功能。

这些原生能力被统称为内部接口,涵盖了 API、事件、消息元素、路由等各个方面。

平台与适配器

Satori 协议的大多数 API 都需要传入 Satori-PlatformSatori-User-ID 请求头,这是为了区分发起请求的登录号。不同平台的登录号拥有不同的 login.platform,而同一平台的不同登录号则拥有不同的 login.user.id,由此这套机制实现了安全的隔离。

大多数聊天平台的 platform 字段都是直接由 SDK 设置的固定值。然而对于另一些允许自建的平台 (例如 Rocket Chat 和 Zulip),SDK 则通常需要让部署者自行设置 platform,用来区分不同的服务器。如果直接混用的话,可能导致数据碰撞等问题。

所以对于任何一个 Login,我们实际上存在两个不同的概念:

  • login.platform:聊天平台。通常来说,同一平台内的用户间具有相互发送消息的能力,而不同平台的用户间则没有。在 Satori 中,platform 也相当于一种命名空间,因此 SDK 需要保证同一平台内的 user.id, guild.id 等字段的唯一性。

  • login.adapter:适配器。适配器更多地是一个实现相关的概念,它决定了如何与平台进行通信。同一个适配器下通常会有相同的扩展 API、事件和消息元素。这个字段通常是 SDK 直接设置的,开发者可以用这个字段判断实现是否支持某些特性。

TIP

如果你读到这里仍然难以区分 platformadapter,可以记住以下规则:

  • 同一 platform 内 ID 相互兼容;
  • 同一 adapter 内 API 相互兼容;

这两个条件是充分但不必要的,换言之,即便两个 Login 所拥有的 ID 或者 API 兼容,也可以不使用相同的 platformadapter。这完全取决于 SDK 的实现和社区的约定。

TIP

需要注意的是,这两个概念实际上是多对多的,我们可以举出一些特殊场景:

  • 单适配器多平台:某平台允许用户自建服务器,此时两台独立的自建服务器拥有不同的数据,所有的 user.id, guild.id 等属于不同的命名空间,因此 platform 字段应该是不同的。但这两台服务器使用的通信方式相同,因此 adapter 字段应该是相同的。
  • 单平台多适配器:某平台同时有官方和非官方的 SDK,两套 SDK 使用的通信方式不同,因此 adapter 字段应该是不同的。但这两套 SDK 都是为了与同一平台通信,所有的 user.id, guild.id 等属于同一个命名空间,因此 platform 字段应该是相同的。

API 扩展

SDK 可以通过 /{path}/{version}/internal/{method} 路由代理平台原生 API。

例如,Discord 平台提供了 Restful API,那么你可以进行如下请求:

text
DELETE /v1/internal/channels/111222333
+Satori-Platform: discord
+Satori-User-ID: 1234567890

除了作为前缀的路由和额外的 Satori-PlatformSatori-User-ID 请求头之外,整个请求和响应的格式都与平台原生 API 一致。

事件扩展

平台原生事件

SDK 可以通过 internal 事件的 _type_data 属性代理平台原生事件。它的结构如下:

字段类型说明
idnumber事件 ID
typestring事件类型 (固定为 internal)
loginLogin登录信息
_typestring原生事件类型
_dataobject原生事件数据

标准事件的扩展字段

标准事件的平台原生字段也可以通过上述 _type_data 访问。它的结构如下:

字段类型说明
typestring事件类型 (不应该是 internal)
_typestring平台通用名称
_dataobject原生事件数据
其他字段其他标准事件字段

TIP

有些平台原生事件可以直接对应到标准事件。当这些事件触发时,SDK 可以同时触发标准事件和平台原生事件。这两个事件都带有 _type_data 字段,但这两个字段的值可能是不同的。

消息元素扩展

平台原生消息元素

平台可以提供原生消息元素,但需要加上适配器名称作为前缀。下面是一个例子:

html
<kook:card size="lg">
+  <kook:countdown end-time="1608819168000"/>
+</kook:card>

标准元素的扩展属性

标准元素的平台原生属性也可以通过加上适配器名称作为前缀的方式声明。下面是一个例子:

html
<!-- src 是 audio 元素的标准属性。 -->
+<!-- 但 cover 并未标准化,所以需要加前缀。 -->
+<audio src="url1" kook:cover="url2"/>

TIP

平台原生消息元素的属性是否需要前缀由 SDK 实现自行决定。如果某个消息元素希望在未来标准化,那么加上前缀可以降低迁移成本。如果没有标准化需要,那么去掉前缀在书写上更方便。

`,31)]))}const g=a(d,[["render",o]]);export{k as __pageData,g as default}; diff --git a/assets/zh-CN_advanced_internal.md.BcT4DuVV.lean.js b/assets/zh-CN_advanced_internal.md.BcT4DuVV.lean.js new file mode 100644 index 0000000..54a6675 --- /dev/null +++ b/assets/zh-CN_advanced_internal.md.BcT4DuVV.lean.js @@ -0,0 +1,7 @@ +import{_ as a,x as i,a7 as e,h as s}from"./chunks/framework.K8kzz9Vz.js";const k=JSON.parse('{"title":"跨平台","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/internal.md","filePath":"zh-CN/advanced/internal.md"}'),d={name:"zh-CN/advanced/internal.md"};function o(l,t,n,r,p,c){return s(),i("div",null,t[0]||(t[0]=[e(`

跨平台

作为一个跨平台的聊天协议,Satori 提供了访问任意平台原生接口的能力。这意味着,你可以大多数情况下编写通用代码,并在需要的时候使用原生接口来实现平台特定功能。

这些原生能力被统称为内部接口,涵盖了 API、事件、消息元素、路由等各个方面。

平台与适配器

Satori 协议的大多数 API 都需要传入 Satori-PlatformSatori-User-ID 请求头,这是为了区分发起请求的登录号。不同平台的登录号拥有不同的 login.platform,而同一平台的不同登录号则拥有不同的 login.user.id,由此这套机制实现了安全的隔离。

大多数聊天平台的 platform 字段都是直接由 SDK 设置的固定值。然而对于另一些允许自建的平台 (例如 Rocket Chat 和 Zulip),SDK 则通常需要让部署者自行设置 platform,用来区分不同的服务器。如果直接混用的话,可能导致数据碰撞等问题。

所以对于任何一个 Login,我们实际上存在两个不同的概念:

  • login.platform:聊天平台。通常来说,同一平台内的用户间具有相互发送消息的能力,而不同平台的用户间则没有。在 Satori 中,platform 也相当于一种命名空间,因此 SDK 需要保证同一平台内的 user.id, guild.id 等字段的唯一性。

  • login.adapter:适配器。适配器更多地是一个实现相关的概念,它决定了如何与平台进行通信。同一个适配器下通常会有相同的扩展 API、事件和消息元素。这个字段通常是 SDK 直接设置的,开发者可以用这个字段判断实现是否支持某些特性。

TIP

如果你读到这里仍然难以区分 platformadapter,可以记住以下规则:

  • 同一 platform 内 ID 相互兼容;
  • 同一 adapter 内 API 相互兼容;

这两个条件是充分但不必要的,换言之,即便两个 Login 所拥有的 ID 或者 API 兼容,也可以不使用相同的 platformadapter。这完全取决于 SDK 的实现和社区的约定。

TIP

需要注意的是,这两个概念实际上是多对多的,我们可以举出一些特殊场景:

  • 单适配器多平台:某平台允许用户自建服务器,此时两台独立的自建服务器拥有不同的数据,所有的 user.id, guild.id 等属于不同的命名空间,因此 platform 字段应该是不同的。但这两台服务器使用的通信方式相同,因此 adapter 字段应该是相同的。
  • 单平台多适配器:某平台同时有官方和非官方的 SDK,两套 SDK 使用的通信方式不同,因此 adapter 字段应该是不同的。但这两套 SDK 都是为了与同一平台通信,所有的 user.id, guild.id 等属于同一个命名空间,因此 platform 字段应该是相同的。

API 扩展

SDK 可以通过 /{path}/{version}/internal/{method} 路由代理平台原生 API。

例如,Discord 平台提供了 Restful API,那么你可以进行如下请求:

text
DELETE /v1/internal/channels/111222333
+Satori-Platform: discord
+Satori-User-ID: 1234567890

除了作为前缀的路由和额外的 Satori-PlatformSatori-User-ID 请求头之外,整个请求和响应的格式都与平台原生 API 一致。

事件扩展

平台原生事件

SDK 可以通过 internal 事件的 _type_data 属性代理平台原生事件。它的结构如下:

字段类型说明
idnumber事件 ID
typestring事件类型 (固定为 internal)
loginLogin登录信息
_typestring原生事件类型
_dataobject原生事件数据

标准事件的扩展字段

标准事件的平台原生字段也可以通过上述 _type_data 访问。它的结构如下:

字段类型说明
typestring事件类型 (不应该是 internal)
_typestring平台通用名称
_dataobject原生事件数据
其他字段其他标准事件字段

TIP

有些平台原生事件可以直接对应到标准事件。当这些事件触发时,SDK 可以同时触发标准事件和平台原生事件。这两个事件都带有 _type_data 字段,但这两个字段的值可能是不同的。

消息元素扩展

平台原生消息元素

平台可以提供原生消息元素,但需要加上适配器名称作为前缀。下面是一个例子:

html
<kook:card size="lg">
+  <kook:countdown end-time="1608819168000"/>
+</kook:card>

标准元素的扩展属性

标准元素的平台原生属性也可以通过加上适配器名称作为前缀的方式声明。下面是一个例子:

html
<!-- src 是 audio 元素的标准属性。 -->
+<!-- 但 cover 并未标准化,所以需要加前缀。 -->
+<audio src="url1" kook:cover="url2"/>

TIP

平台原生消息元素的属性是否需要前缀由 SDK 实现自行决定。如果某个消息元素希望在未来标准化,那么加上前缀可以降低迁移成本。如果没有标准化需要,那么去掉前缀在书写上更方便。

`,31)]))}const g=a(d,[["render",o]]);export{k as __pageData,g as default}; diff --git a/assets/zh-CN_advanced_meta.md.5SIn9XtM.js b/assets/zh-CN_advanced_meta.md.5SIn9XtM.js new file mode 100644 index 0000000..06f0ef8 --- /dev/null +++ b/assets/zh-CN_advanced_meta.md.5SIn9XtM.js @@ -0,0 +1 @@ +import{_ as n,x as s,m as e,W as o,y as d,k as l,a7 as r,Q as i,h as u}from"./chunks/framework.K8kzz9Vz.js";const y=JSON.parse('{"title":"元信息 可选 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/meta.md","filePath":"zh-CN/advanced/meta.md"}'),b={name:"zh-CN/advanced/meta.md"},h={id:"元信息",tabindex:"-1"},p={class:"route"},m={class:"route"},k={class:"route"};function f(c,t,P,x,g,q){const a=i("badge");return u(),s("div",null,[e("h1",h,[t[2]||(t[2]=o("元信息 ")),d(a,null,{default:l(()=>t[0]||(t[0]=[o("可选")])),_:1}),t[3]||(t[3]=o()),d(a,{type:"warning"},{default:l(()=>t[1]||(t[1]=[o("实验性")])),_:1}),t[4]||(t[4]=o()),t[5]||(t[5]=e("a",{class:"header-anchor",href:"#元信息","aria-label":'Permalink to "元信息 可选 实验性"'},"​",-1))]),t[12]||(t[12]=r('

TIP

这是一个可选功能。

WARNING

这是一个实验性功能。

元信息对象包含了与 SDK 状态相关、与具体的账号无关的信息,例如 代理路由 等。

元信息通过以下方式获取和更新:

  • 在 WebSocket 推送方式下,READY 信令将提供完整的元信息;
  • 在 WebHook 推送方式下,应用启动时应当通过 API 获取元信息;
  • 应用启动后,持续接收 META 信令和登录事件对元信息进行更新。

需要注意的是,META 信令不反映登录状态变化,也不会包含 logins 字段。

元信息 API 通过 /{path}/{version}/meta/{method} 路由提供。通信方式与 HTTP API 类似,但不需要 Satori-PlatformSatori-User-ID 请求头。

类型定义

Meta

字段类型描述
loginsLogin[]登录信息
proxy_urlsstring[]代理路由 列表

API

获取元信息

',12)),e("blockquote",p,[d(a,null,{default:l(()=>t[6]||(t[6]=[o("POST")])),_:1}),t[7]||(t[7]=e("code",null,"/meta",-1))]),t[13]||(t[13]=e("p",null,[o("返回一个 "),e("a",{href:"#meta"},"Meta"),o(" 对象。")],-1)),t[14]||(t[14]=e("h3",{id:"创建-webhook",tabindex:"-1"},[o("创建 WebHook "),e("a",{class:"header-anchor",href:"#创建-webhook","aria-label":'Permalink to "创建 WebHook"'},"​")],-1)),e("blockquote",m,[d(a,null,{default:l(()=>t[8]||(t[8]=[o("POST")])),_:1}),t[9]||(t[9]=e("code",null,"/meta/webhook.create",-1))]),t[15]||(t[15]=r('
字段类型描述
urlstringWebHook 地址
tokenstring?鉴权令牌

移除 WebHook

',2)),e("blockquote",k,[d(a,null,{default:l(()=>t[10]||(t[10]=[o("POST")])),_:1}),t[11]||(t[11]=e("code",null,"/meta/webhook.delete",-1))]),t[16]||(t[16]=e("table",{tabindex:"0"},[e("thead",null,[e("tr",null,[e("th",null,"字段"),e("th",null,"类型"),e("th",null,"描述")])]),e("tbody",null,[e("tr",null,[e("td",null,"url"),e("td",null,"string"),e("td",null,"WebHook 地址")])])],-1))])}const w=n(b,[["render",f]]);export{y as __pageData,w as default}; diff --git a/assets/zh-CN_advanced_meta.md.5SIn9XtM.lean.js b/assets/zh-CN_advanced_meta.md.5SIn9XtM.lean.js new file mode 100644 index 0000000..06f0ef8 --- /dev/null +++ b/assets/zh-CN_advanced_meta.md.5SIn9XtM.lean.js @@ -0,0 +1 @@ +import{_ as n,x as s,m as e,W as o,y as d,k as l,a7 as r,Q as i,h as u}from"./chunks/framework.K8kzz9Vz.js";const y=JSON.parse('{"title":"元信息 可选 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/meta.md","filePath":"zh-CN/advanced/meta.md"}'),b={name:"zh-CN/advanced/meta.md"},h={id:"元信息",tabindex:"-1"},p={class:"route"},m={class:"route"},k={class:"route"};function f(c,t,P,x,g,q){const a=i("badge");return u(),s("div",null,[e("h1",h,[t[2]||(t[2]=o("元信息 ")),d(a,null,{default:l(()=>t[0]||(t[0]=[o("可选")])),_:1}),t[3]||(t[3]=o()),d(a,{type:"warning"},{default:l(()=>t[1]||(t[1]=[o("实验性")])),_:1}),t[4]||(t[4]=o()),t[5]||(t[5]=e("a",{class:"header-anchor",href:"#元信息","aria-label":'Permalink to "元信息 可选 实验性"'},"​",-1))]),t[12]||(t[12]=r('

TIP

这是一个可选功能。

WARNING

这是一个实验性功能。

元信息对象包含了与 SDK 状态相关、与具体的账号无关的信息,例如 代理路由 等。

元信息通过以下方式获取和更新:

  • 在 WebSocket 推送方式下,READY 信令将提供完整的元信息;
  • 在 WebHook 推送方式下,应用启动时应当通过 API 获取元信息;
  • 应用启动后,持续接收 META 信令和登录事件对元信息进行更新。

需要注意的是,META 信令不反映登录状态变化,也不会包含 logins 字段。

元信息 API 通过 /{path}/{version}/meta/{method} 路由提供。通信方式与 HTTP API 类似,但不需要 Satori-PlatformSatori-User-ID 请求头。

类型定义

Meta

字段类型描述
loginsLogin[]登录信息
proxy_urlsstring[]代理路由 列表

API

获取元信息

',12)),e("blockquote",p,[d(a,null,{default:l(()=>t[6]||(t[6]=[o("POST")])),_:1}),t[7]||(t[7]=e("code",null,"/meta",-1))]),t[13]||(t[13]=e("p",null,[o("返回一个 "),e("a",{href:"#meta"},"Meta"),o(" 对象。")],-1)),t[14]||(t[14]=e("h3",{id:"创建-webhook",tabindex:"-1"},[o("创建 WebHook "),e("a",{class:"header-anchor",href:"#创建-webhook","aria-label":'Permalink to "创建 WebHook"'},"​")],-1)),e("blockquote",m,[d(a,null,{default:l(()=>t[8]||(t[8]=[o("POST")])),_:1}),t[9]||(t[9]=e("code",null,"/meta/webhook.create",-1))]),t[15]||(t[15]=r('
字段类型描述
urlstringWebHook 地址
tokenstring?鉴权令牌

移除 WebHook

',2)),e("blockquote",k,[d(a,null,{default:l(()=>t[10]||(t[10]=[o("POST")])),_:1}),t[11]||(t[11]=e("code",null,"/meta/webhook.delete",-1))]),t[16]||(t[16]=e("table",{tabindex:"0"},[e("thead",null,[e("tr",null,[e("th",null,"字段"),e("th",null,"类型"),e("th",null,"描述")])]),e("tbody",null,[e("tr",null,[e("td",null,"url"),e("td",null,"string"),e("td",null,"WebHook 地址")])])],-1))])}const w=n(b,[["render",f]]);export{y as __pageData,w as default}; diff --git a/assets/zh-CN_advanced_resource.md.C-_HwXQP.js b/assets/zh-CN_advanced_resource.md.C-_HwXQP.js new file mode 100644 index 0000000..532b0c5 --- /dev/null +++ b/assets/zh-CN_advanced_resource.md.C-_HwXQP.js @@ -0,0 +1,22 @@ +import{_ as t,x as p,m as e,W as s,y as o,k as i,a7 as l,Q as r,h as d}from"./chunks/framework.K8kzz9Vz.js";const x=JSON.parse('{"title":"资源链接 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/resource.md","filePath":"zh-CN/advanced/resource.md"}'),c={name:"zh-CN/advanced/resource.md"},u={id:"资源链接",tabindex:"-1"},h={class:"route"};function m(g,a,k,b,v,f){const n=r("badge");return d(),p("div",null,[e("h1",u,[a[1]||(a[1]=s("资源链接 ")),o(n,{type:"warning"},{default:i(()=>a[0]||(a[0]=[s("实验性")])),_:1}),a[2]||(a[2]=s()),a[3]||(a[3]=e("a",{class:"header-anchor",href:"#资源链接","aria-label":'Permalink to "资源链接 实验性"'},"​",-1))]),a[6]||(a[6]=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"这是一个实验性功能。")],-1)),a[7]||(a[7]=e("h2",{id:"api-upload-create",tabindex:"-1"},[s("文件上传 "),e("a",{class:"header-anchor",href:"#api-upload-create","aria-label":'Permalink to "文件上传 {#api-upload-create}"'},"​")],-1)),e("blockquote",h,[o(n,null,{default:i(()=>a[4]||(a[4]=[s("POST")])),_:1}),a[5]||(a[5]=e("code",null,"/upload.create",-1))]),a[8]||(a[8]=l(`

如果要发送的消息中含有图片或其他媒体资源,可以使用此 API 将文件上传至 Satori 服务器并转换为 URL,以便在消息编码中使用。

与其他 API 不同,上传文件的请求体遵循 multipart/form-data 格式。下面是一个示例:

text
POST /v1/upload.create
+Content-Type: multipart/form-data
+Satori-Platform: discord
+Satori-User-ID: 1234567890
+
+--boundary
+Content-Disposition: form-data; name="foo"; filename="image1.png"
+Content-Type: image/png
+
+binary-data
+--boundary
+Content-Disposition: form-data; name="bar"; filename="image2.gif"
+Content-Type: image/gif
+
+binary-data
+--boundary--

其中,Content-Disposition 中的 name 字段表示文件标识符 (必需且不能重复),filename 字段表示文件名 (可选);Content-Type 表示文件类型 (必需)。

返回值是一个字典类型,其中的每个键分别对应于请求体中的文件标识符,值是一个 URL 字符串,可以在消息编码中使用。下面是一个示例的返回值:

json
{
+  "foo": "internal:discord/1234567890/_tmp/3j6emd92-image1.png",
+  "bar": "internal:discord/1234567890/_tmp/reacpmeq-image2.gif"
+}

在实现此 API 时,如果平台已经支持了文件上传功能,可以直接使用平台提供的上传 API,返回平台的 URL 即可。如果平台不支持文件上传功能,应当回退到 SDK 提供的默认实现。

SDK 可以基于本地文件系统实现上传功能。上传到本地文件系统中的文件 URL 通过 internal: 协议进一步代理,且有一定的有效期。各实现可以根据自身情况调整有效期,推荐值为 5 分钟。

内部链接

internal: 称为内部链接协议,用于代理平台原生 API 或是无法直接通过公网访问的资源。

格式规范

内部链接的标准格式如下:

text
internal:{platform}/{user.id}/{path}

其中,platform 为平台名称,user.id 为登录账号,path 为资源路径。

SDK 可以根据需要自行设计资源路径,但以下划线 _ 开头的路径需要保留给 Satori 自身使用,拥有固定的语义。现有的保留路径有:

  • _tmp:用于 SDK 的默认文件上传实现;
  • _raw:用于代理平台原生 HTTP API。

API 代理

Satori 会将所有内部 API 访问重定向到 _raw 内部链接。换言之,以下两个请求是等价的:

text
DELETE /v1/internal/channel/111222333
+Satori-Platform: discord
+Satori-User-ID: 1234567890
text
DELETE /v1/proxy/internal:discord/1234567890/_raw/channel/111222333

因此,适配器开发者无需专门实现内部 API,只需实现 _raw 路径下的代理即可。

适用场景

上一节中已经提到,在不支持文件上传的平台上调用 /upload.create,你将获得内部链接。对平台原生 API 的访问同样通过内部链接进行。除此以外,还有一些内部链接的适用场景。

TIP

场景:通过平台 API 请求资源

某些平台使用 ID 标识资源文件 (例如 Lark)。当你接收到来自平台的消息时,拿到的是资源 ID 而非链接。此时你需要调用平台 API,将资源 ID 转换为链接,才能构造合法的消息元素。

为了避免在不必要的场合损失性能,更推荐的方式是直接将资源 ID 封装进内部链接,并立即构造消息元素。等到真正需要请求资源时再调用平台的 API。

TIP

场景:资源链接不宜直接公开

对于另一些平台,尽管其提供的资源链接是可用的,但这个链接中会明文包含机器人令牌,并非可以公开使用的链接 (例如 Telegram)。因此,对于这些平台中的资源,我们也不能直接使用其链接,同样需要将其封装进内部链接。此时内部链接就是单纯的代理。

不同方案对比

与内部链接相比,另一些实践则是不推荐的。下面的方案来源于一些经典聊天协议的实现。通过与这些方案进行对比,可以更好地理解内部链接的优势。

WARNING

不推荐:data: URL

一种不推荐的方案是直接下载资源,并转换为 data: 链接放入消息元素中。之所以不推荐使用,是因为这种方案有两大致命缺点:

  • 这些图片本来可以按需加载,但现在却被强制下载到本地,造成额外的带宽消耗;
  • 编码为 data: 会导致消息体积大幅增加,极大影响消息处理的性能。

WARNING

不推荐:本地代理

另一种方案是由 SDK 额外提供一个用于访问资源的路由 (比如下文介绍的代理路由),并将资源链接转换为能访问到该路由的 URL。相比内部链接,这种方案有两个缺点:

  • 这样生成的链接与 Satori 服务器自身的地址耦合,一旦 Satori 服务器更换域名或者端口,过去的链接将全部失效,不利于迁移和跨接等复杂场景;
  • 如果需要扩展其他需要用到资源的逻辑 (比如下载图片到本地),就会导致通过网络自己请求自己,而这些数据原本可以在内存或硬盘中传输,这显然引入了额外的性能损耗。

代理路由

假设你在开发基于 Satori 的聊天平台客户端,你希望可以直接将 Satori 协议中给出的资源链接用于 HTML,但很多情况下你都难以如愿:

  1. 该资源链接由平台生成,且含有防盗链机制,无法在跨域请求中访问;
  2. 该资源链接是一个内部链接,无法在 HTML 中直接访问。

为此,SDK 需要额外提供一个代理路由 /{path}/{version}/proxy/{url},用于访问这些资源链接。这个路由不需要 Satori-PlatformSatori-User-ID 请求头。

下面是两个典型的代理路由请求示例 (分别对应上述两种情况):

text
GET /v1/proxy/https://cdn.discordapp.com/attachments/bf6f121d.jpg
+GET /v1/proxy/internal:discord/1234567890/_tmp/3j6emd92-image1.png

在具体的应用场景中,代理路由可根据需要添加 Access-Control-Allow-Origin 等响应头,以限制或允许跨域请求。

为了辨别需要代理的路径以防滥用,Satori 还引入了 proxy_urls 属性。这个属性记录了所有需要代理的 (非内部) 资源链接前缀,应用侧可以根据这个属性来判断是否需要代理。

根据 url 的不同形式,SDK 提供的代理路由会有不同的行为:

  • 如果 url 不是合法的 URL,直接返回 400;
  • 如果 url 是一个内部链接 (即以 internal: 开头):
    • 如果链接不符合内部链接的格式,直接返回 400;
    • 解析链接中的 platformuser.id,并找到对应的登录号;
    • 如果登录号存在,则由该登录号的扩展逻辑进行返回;
    • 如果登录号不存在,直接返回 404;
  • 如果 url 以某个 proxy_urls 中的链接为前缀:
    • 在 SDK 侧下载该 url 并返回 (SDK 提供了该资源的代理);
  • 其他情况下:直接返回 403。

实践指南

综上所述,我们总结出了一套关于资源链接的最佳实践:

对于核心库开发者,你需要:

  1. 提供 REGISTER_INTERNAL_ROUTE 方法用于注册内部链接路由,以便适配器实现;
  2. 提供 DOWNLOAD_URL 方法用于将一个链接下载为数据,无论其是否为内部链接;
  3. 基于本地文件系统实现内置的 /upload.create API;
  4. 基于上述 DOWNLOAD_URL 方法实现代理路由。

对于适配器开发者,你需要:

  1. 在以下情况下,调用 REGISTER_INTERNAL_ROUTE 方法注册内部路由:
    • 平台符合内部链接的 适用场景
    • 平台提供了 HTTP API (此时只需在 _raw 路径下代理平台原生 API);
  2. 接收事件推送时:如果收到的资源链接符合内部链接的适用场景,将它们转化为内部链接;
  3. 发送消息时:根据平台行为和资源链接的形式,合理选择下载和发送资源的方式;
  4. 如果平台支持文件上传:实现 /upload.create API,覆盖 SDK 的默认实现;
`,45))])}const P=t(c,[["render",m]]);export{x as __pageData,P as default}; diff --git a/assets/zh-CN_advanced_resource.md.C-_HwXQP.lean.js b/assets/zh-CN_advanced_resource.md.C-_HwXQP.lean.js new file mode 100644 index 0000000..532b0c5 --- /dev/null +++ b/assets/zh-CN_advanced_resource.md.C-_HwXQP.lean.js @@ -0,0 +1,22 @@ +import{_ as t,x as p,m as e,W as s,y as o,k as i,a7 as l,Q as r,h as d}from"./chunks/framework.K8kzz9Vz.js";const x=JSON.parse('{"title":"资源链接 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/advanced/resource.md","filePath":"zh-CN/advanced/resource.md"}'),c={name:"zh-CN/advanced/resource.md"},u={id:"资源链接",tabindex:"-1"},h={class:"route"};function m(g,a,k,b,v,f){const n=r("badge");return d(),p("div",null,[e("h1",u,[a[1]||(a[1]=s("资源链接 ")),o(n,{type:"warning"},{default:i(()=>a[0]||(a[0]=[s("实验性")])),_:1}),a[2]||(a[2]=s()),a[3]||(a[3]=e("a",{class:"header-anchor",href:"#资源链接","aria-label":'Permalink to "资源链接 实验性"'},"​",-1))]),a[6]||(a[6]=e("div",{class:"warning custom-block"},[e("p",{class:"custom-block-title"},"WARNING"),e("p",null,"这是一个实验性功能。")],-1)),a[7]||(a[7]=e("h2",{id:"api-upload-create",tabindex:"-1"},[s("文件上传 "),e("a",{class:"header-anchor",href:"#api-upload-create","aria-label":'Permalink to "文件上传 {#api-upload-create}"'},"​")],-1)),e("blockquote",h,[o(n,null,{default:i(()=>a[4]||(a[4]=[s("POST")])),_:1}),a[5]||(a[5]=e("code",null,"/upload.create",-1))]),a[8]||(a[8]=l(`

如果要发送的消息中含有图片或其他媒体资源,可以使用此 API 将文件上传至 Satori 服务器并转换为 URL,以便在消息编码中使用。

与其他 API 不同,上传文件的请求体遵循 multipart/form-data 格式。下面是一个示例:

text
POST /v1/upload.create
+Content-Type: multipart/form-data
+Satori-Platform: discord
+Satori-User-ID: 1234567890
+
+--boundary
+Content-Disposition: form-data; name="foo"; filename="image1.png"
+Content-Type: image/png
+
+binary-data
+--boundary
+Content-Disposition: form-data; name="bar"; filename="image2.gif"
+Content-Type: image/gif
+
+binary-data
+--boundary--

其中,Content-Disposition 中的 name 字段表示文件标识符 (必需且不能重复),filename 字段表示文件名 (可选);Content-Type 表示文件类型 (必需)。

返回值是一个字典类型,其中的每个键分别对应于请求体中的文件标识符,值是一个 URL 字符串,可以在消息编码中使用。下面是一个示例的返回值:

json
{
+  "foo": "internal:discord/1234567890/_tmp/3j6emd92-image1.png",
+  "bar": "internal:discord/1234567890/_tmp/reacpmeq-image2.gif"
+}

在实现此 API 时,如果平台已经支持了文件上传功能,可以直接使用平台提供的上传 API,返回平台的 URL 即可。如果平台不支持文件上传功能,应当回退到 SDK 提供的默认实现。

SDK 可以基于本地文件系统实现上传功能。上传到本地文件系统中的文件 URL 通过 internal: 协议进一步代理,且有一定的有效期。各实现可以根据自身情况调整有效期,推荐值为 5 分钟。

内部链接

internal: 称为内部链接协议,用于代理平台原生 API 或是无法直接通过公网访问的资源。

格式规范

内部链接的标准格式如下:

text
internal:{platform}/{user.id}/{path}

其中,platform 为平台名称,user.id 为登录账号,path 为资源路径。

SDK 可以根据需要自行设计资源路径,但以下划线 _ 开头的路径需要保留给 Satori 自身使用,拥有固定的语义。现有的保留路径有:

  • _tmp:用于 SDK 的默认文件上传实现;
  • _raw:用于代理平台原生 HTTP API。

API 代理

Satori 会将所有内部 API 访问重定向到 _raw 内部链接。换言之,以下两个请求是等价的:

text
DELETE /v1/internal/channel/111222333
+Satori-Platform: discord
+Satori-User-ID: 1234567890
text
DELETE /v1/proxy/internal:discord/1234567890/_raw/channel/111222333

因此,适配器开发者无需专门实现内部 API,只需实现 _raw 路径下的代理即可。

适用场景

上一节中已经提到,在不支持文件上传的平台上调用 /upload.create,你将获得内部链接。对平台原生 API 的访问同样通过内部链接进行。除此以外,还有一些内部链接的适用场景。

TIP

场景:通过平台 API 请求资源

某些平台使用 ID 标识资源文件 (例如 Lark)。当你接收到来自平台的消息时,拿到的是资源 ID 而非链接。此时你需要调用平台 API,将资源 ID 转换为链接,才能构造合法的消息元素。

为了避免在不必要的场合损失性能,更推荐的方式是直接将资源 ID 封装进内部链接,并立即构造消息元素。等到真正需要请求资源时再调用平台的 API。

TIP

场景:资源链接不宜直接公开

对于另一些平台,尽管其提供的资源链接是可用的,但这个链接中会明文包含机器人令牌,并非可以公开使用的链接 (例如 Telegram)。因此,对于这些平台中的资源,我们也不能直接使用其链接,同样需要将其封装进内部链接。此时内部链接就是单纯的代理。

不同方案对比

与内部链接相比,另一些实践则是不推荐的。下面的方案来源于一些经典聊天协议的实现。通过与这些方案进行对比,可以更好地理解内部链接的优势。

WARNING

不推荐:data: URL

一种不推荐的方案是直接下载资源,并转换为 data: 链接放入消息元素中。之所以不推荐使用,是因为这种方案有两大致命缺点:

  • 这些图片本来可以按需加载,但现在却被强制下载到本地,造成额外的带宽消耗;
  • 编码为 data: 会导致消息体积大幅增加,极大影响消息处理的性能。

WARNING

不推荐:本地代理

另一种方案是由 SDK 额外提供一个用于访问资源的路由 (比如下文介绍的代理路由),并将资源链接转换为能访问到该路由的 URL。相比内部链接,这种方案有两个缺点:

  • 这样生成的链接与 Satori 服务器自身的地址耦合,一旦 Satori 服务器更换域名或者端口,过去的链接将全部失效,不利于迁移和跨接等复杂场景;
  • 如果需要扩展其他需要用到资源的逻辑 (比如下载图片到本地),就会导致通过网络自己请求自己,而这些数据原本可以在内存或硬盘中传输,这显然引入了额外的性能损耗。

代理路由

假设你在开发基于 Satori 的聊天平台客户端,你希望可以直接将 Satori 协议中给出的资源链接用于 HTML,但很多情况下你都难以如愿:

  1. 该资源链接由平台生成,且含有防盗链机制,无法在跨域请求中访问;
  2. 该资源链接是一个内部链接,无法在 HTML 中直接访问。

为此,SDK 需要额外提供一个代理路由 /{path}/{version}/proxy/{url},用于访问这些资源链接。这个路由不需要 Satori-PlatformSatori-User-ID 请求头。

下面是两个典型的代理路由请求示例 (分别对应上述两种情况):

text
GET /v1/proxy/https://cdn.discordapp.com/attachments/bf6f121d.jpg
+GET /v1/proxy/internal:discord/1234567890/_tmp/3j6emd92-image1.png

在具体的应用场景中,代理路由可根据需要添加 Access-Control-Allow-Origin 等响应头,以限制或允许跨域请求。

为了辨别需要代理的路径以防滥用,Satori 还引入了 proxy_urls 属性。这个属性记录了所有需要代理的 (非内部) 资源链接前缀,应用侧可以根据这个属性来判断是否需要代理。

根据 url 的不同形式,SDK 提供的代理路由会有不同的行为:

  • 如果 url 不是合法的 URL,直接返回 400;
  • 如果 url 是一个内部链接 (即以 internal: 开头):
    • 如果链接不符合内部链接的格式,直接返回 400;
    • 解析链接中的 platformuser.id,并找到对应的登录号;
    • 如果登录号存在,则由该登录号的扩展逻辑进行返回;
    • 如果登录号不存在,直接返回 404;
  • 如果 url 以某个 proxy_urls 中的链接为前缀:
    • 在 SDK 侧下载该 url 并返回 (SDK 提供了该资源的代理);
  • 其他情况下:直接返回 403。

实践指南

综上所述,我们总结出了一套关于资源链接的最佳实践:

对于核心库开发者,你需要:

  1. 提供 REGISTER_INTERNAL_ROUTE 方法用于注册内部链接路由,以便适配器实现;
  2. 提供 DOWNLOAD_URL 方法用于将一个链接下载为数据,无论其是否为内部链接;
  3. 基于本地文件系统实现内置的 /upload.create API;
  4. 基于上述 DOWNLOAD_URL 方法实现代理路由。

对于适配器开发者,你需要:

  1. 在以下情况下,调用 REGISTER_INTERNAL_ROUTE 方法注册内部路由:
    • 平台符合内部链接的 适用场景
    • 平台提供了 HTTP API (此时只需在 _raw 路径下代理平台原生 API);
  2. 接收事件推送时:如果收到的资源链接符合内部链接的适用场景,将它们转化为内部链接;
  3. 发送消息时:根据平台行为和资源链接的形式,合理选择下载和发送资源的方式;
  4. 如果平台支持文件上传:实现 /upload.create API,覆盖 SDK 的默认实现;
`,45))])}const P=t(c,[["render",m]]);export{x as __pageData,P as default}; diff --git a/assets/zh-CN_index.md.CYyt9X3k.js b/assets/zh-CN_index.md.CYyt9X3k.js new file mode 100644 index 0000000..268ee09 --- /dev/null +++ b/assets/zh-CN_index.md.CYyt9X3k.js @@ -0,0 +1 @@ +import{_ as e,x as t,h as r}from"./chunks/framework.K8kzz9Vz.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","links":{"starter":"/zh-CN/introduction.html"},"home":{"primary":"即刻起步","description":"THE UNIVERSAL MESSENGER PROTOCOL"}},"headers":[],"relativePath":"zh-CN/index.md","filePath":"zh-CN/index.md"}'),a={name:"zh-CN/index.md"};function n(o,i,s,c,d,m){return r(),t("div")}const _=e(a,[["render",n]]);export{h as __pageData,_ as default}; diff --git a/assets/zh-CN_index.md.CYyt9X3k.lean.js b/assets/zh-CN_index.md.CYyt9X3k.lean.js new file mode 100644 index 0000000..268ee09 --- /dev/null +++ b/assets/zh-CN_index.md.CYyt9X3k.lean.js @@ -0,0 +1 @@ +import{_ as e,x as t,h as r}from"./chunks/framework.K8kzz9Vz.js";const h=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","links":{"starter":"/zh-CN/introduction.html"},"home":{"primary":"即刻起步","description":"THE UNIVERSAL MESSENGER PROTOCOL"}},"headers":[],"relativePath":"zh-CN/index.md","filePath":"zh-CN/index.md"}'),a={name:"zh-CN/index.md"};function n(o,i,s,c,d,m){return r(),t("div")}const _=e(a,[["render",n]]);export{h as __pageData,_ as default}; diff --git a/assets/zh-CN_introduction.md.BDFENsOM.js b/assets/zh-CN_introduction.md.BDFENsOM.js new file mode 100644 index 0000000..cffe70d --- /dev/null +++ b/assets/zh-CN_introduction.md.BDFENsOM.js @@ -0,0 +1 @@ +import{_ as t,x as r,a7 as e,h as s}from"./chunks/framework.K8kzz9Vz.js";const S=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/introduction.md","filePath":"zh-CN/introduction.md"}'),o={name:"zh-CN/introduction.md"};function i(p,a,c,d,l,n){return s(),r("div",null,a[0]||(a[0]=[e('

介绍

Satori 是一个通用的聊天协议。我们希望 Satori 能够抹平不同聊天平台之间的差异,让开发者以更低的成本开发出跨平台、可扩展、高性能的聊天应用。

Satori 的名称来源于游戏东方 Project 中的角色 古明地觉 (Komeiji Satori)。古明地觉能够以心灵感应的方式与各种动物交流,取这个名字是希望 Satori 能够成为各个聊天平台之间的桥梁。

Satori 的开发团队长期从事聊天机器人开发,熟悉各种聊天平台的通信方式。经过长达 4 年的发展,Satori 有了健全的设计和完善的实现。目前,Satori 官方提供了超过 15 个聊天平台的适配器,完全覆盖了世界上主流的聊天平台:

这些适配器不仅为你带来了开箱即用的体验,也从实际上证明了 Satori 协议的通用性和扩展性。

不必担心使用 Satori 后会失去对聊天平台的控制。得益于 Satori 的内部接口机制,你完全可以大多数情况下编写通用代码,并在需要的时候使用内部接口来实现平台特定功能。

此外,Satori 还为规模化的场景提供了全套的解决方案。小到个人电脑上的聊天机器人,大到分布式集群上的聊天平台后端,Satori 都能满足你的需求。

',8)]))}const u=t(o,[["render",i]]);export{S as __pageData,u as default}; diff --git a/assets/zh-CN_introduction.md.BDFENsOM.lean.js b/assets/zh-CN_introduction.md.BDFENsOM.lean.js new file mode 100644 index 0000000..cffe70d --- /dev/null +++ b/assets/zh-CN_introduction.md.BDFENsOM.lean.js @@ -0,0 +1 @@ +import{_ as t,x as r,a7 as e,h as s}from"./chunks/framework.K8kzz9Vz.js";const S=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/introduction.md","filePath":"zh-CN/introduction.md"}'),o={name:"zh-CN/introduction.md"};function i(p,a,c,d,l,n){return s(),r("div",null,a[0]||(a[0]=[e('

介绍

Satori 是一个通用的聊天协议。我们希望 Satori 能够抹平不同聊天平台之间的差异,让开发者以更低的成本开发出跨平台、可扩展、高性能的聊天应用。

Satori 的名称来源于游戏东方 Project 中的角色 古明地觉 (Komeiji Satori)。古明地觉能够以心灵感应的方式与各种动物交流,取这个名字是希望 Satori 能够成为各个聊天平台之间的桥梁。

Satori 的开发团队长期从事聊天机器人开发,熟悉各种聊天平台的通信方式。经过长达 4 年的发展,Satori 有了健全的设计和完善的实现。目前,Satori 官方提供了超过 15 个聊天平台的适配器,完全覆盖了世界上主流的聊天平台:

这些适配器不仅为你带来了开箱即用的体验,也从实际上证明了 Satori 协议的通用性和扩展性。

不必担心使用 Satori 后会失去对聊天平台的控制。得益于 Satori 的内部接口机制,你完全可以大多数情况下编写通用代码,并在需要的时候使用内部接口来实现平台特定功能。

此外,Satori 还为规模化的场景提供了全套的解决方案。小到个人电脑上的聊天机器人,大到分布式集群上的聊天平台后端,Satori 都能满足你的需求。

',8)]))}const u=t(o,[["render",i]]);export{S as __pageData,u as default}; diff --git a/assets/zh-CN_protocol_api.md.9P_hL1dt.js b/assets/zh-CN_protocol_api.md.9P_hL1dt.js new file mode 100644 index 0000000..debab4d --- /dev/null +++ b/assets/zh-CN_protocol_api.md.9P_hL1dt.js @@ -0,0 +1,7 @@ +import{_ as r,x as i,a7 as a,m as d,W as t,y as s,k as c,Q as n,h as l}from"./chunks/framework.K8kzz9Vz.js";const A=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/api.md","filePath":"zh-CN/protocol/api.md"}'),p={name:"zh-CN/protocol/api.md"},h={id:"平台特性",tabindex:"-1"};function u(m,e,P,b,f,I){const o=n("badge");return l(),i("div",null,[e[4]||(e[4]=a(`

API

Satori 协议规定了一套基于 HTTP 的 API 服务,用于发送消息和调用其他功能。

HTTP API

这是一套 HTTP RPC 风格的 API,所有 URL 的形式均为 /{path}/{version}/{resource}.{method}。其中,path 为部署路径 (可以为空),version 为 API 的版本号,resource 是资源类型,method 为方法名。

目前 Satori 仅有 v1 一个版本。

绝大多数 API 的请求都使用 POST,参数通过 application/json 编码在请求体中。返回值也是 JSON 格式。作为特例,具有 文件上传 功能的 API 使用 multipart/form-data 编码。

请求头中需要包含 Satori-PlatformSatori-User-ID 字段,分别表示平台名称和平台账号。

一个合法的请求示例形如:

text
POST /v1/channel.get
+Content-Type: application/json
+Authorization: Bearer 1234567890
+Satori-Platform: discord
+Satori-User-ID: 1234567890
+
+{"channel_id": "1234567890"}

鉴权

鉴权通过 HTTP API 中的 Authorization 请求头来实现。其中涉及的鉴权令牌由 SDK 分发,本协议不做任何限制。

如果 SDK 没有配置鉴权,则应用无需提供上述请求头。

状态码

状态码描述
200 (OK)请求成功
400 (BAD REQUEST)请求格式错误
401 (UNAUTHORIZED)缺失鉴权
403 (FORBIDDEN)权限不足
404 (NOT FOUND)资源不存在
405 (METHOD NOT ALLOWED)请求方法不支持
5XX (SERVER ERROR)服务器错误

TIP

如果某个标准 API 没有被某个平台支持,则应该返回 404 而非 501 (NOT IMPLEMENTED)。只有当一个 API 被平台支持但是未被适配器实现时,才应该返回 501。

`,15)),d("h3",h,[e[1]||(e[1]=t("平台特性 ")),s(o,{type:"warning"},{default:c(()=>e[0]||(e[0]=[t("实验性")])),_:1}),e[2]||(e[2]=t()),e[3]||(e[3]=d("a",{class:"header-anchor",href:"#平台特性","aria-label":'Permalink to "平台特性 实验性"'},"​",-1))]),e[5]||(e[5]=a('

Login 对象中的 features 字段是一个字符串数组,用于表示平台的特性。这些特性可以用于判断平台是否支持某些 API。合法的平台特性包括:

  • API 可用性,如特性 message.delete 表示支持使用 message.delete 撤回消息。
  • API 额外特性,如特性 message.list.from 表示使用 message.list 查询消息列表时支持将消息 ID 作为分页令牌。
  • 平台额外特性,如特性 guild.plain 表示该平台的群组内只能存在一个消息频道。

目前仅有 API 名称本身是规范的用法。我们将在后续版本中提供更全面的标准特性列表。

进阶 API

除了标准 API 外,Satori 还提供了一些进阶功能。

  • /{path}/{version}/proxy 的子路由用于代理平台资源,请参见 代理路由
  • /{path}/{version}/meta 的子路由用于访问 SDK 相关接口,请参见 元信息 API
  • /{path}/{version}/internal 的子路由用于访问平台内部接口,请参见 内部 API

类型定义

分页列表

部分 API 可能会返回分页数据。这种情况下,响应会是一个 List 对象:

字段类型描述
dataarray数据
nextstring?下一页的令牌

你可以使用 next 令牌来获取下一页的数据。如果 next 为空,则表示没有更多数据了。

双向分页列表

极少数 API 返回可双向延伸的分页数据。这种情况下,响应会是一个 BidiList 对象:

字段类型描述
dataarray数据
prevstring?上一页的令牌
nextstring?下一页的令牌

在对应的 API 中,你可以通过 directionorder 参数来指定方向和排序。

direction 参数有三种不同的取值:

  • before:向前获取数据,此时 prevnext 相同,均表示上一页的令牌。
  • after:向后获取数据,此时 prevnext 相同,均表示下一页的令牌。
  • around:向两侧获取数据,此时 prev 表示上一页的令牌,next 表示下一页的令牌。

如果 prevnext 缺失,则表示在该方向上没有更多数据了。

order 参数有两种不同的取值:

  • asc:升序排列。
  • desc:降序排列。
',20))])}const g=r(p,[["render",u]]);export{A as __pageData,g as default}; diff --git a/assets/zh-CN_protocol_api.md.9P_hL1dt.lean.js b/assets/zh-CN_protocol_api.md.9P_hL1dt.lean.js new file mode 100644 index 0000000..debab4d --- /dev/null +++ b/assets/zh-CN_protocol_api.md.9P_hL1dt.lean.js @@ -0,0 +1,7 @@ +import{_ as r,x as i,a7 as a,m as d,W as t,y as s,k as c,Q as n,h as l}from"./chunks/framework.K8kzz9Vz.js";const A=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/api.md","filePath":"zh-CN/protocol/api.md"}'),p={name:"zh-CN/protocol/api.md"},h={id:"平台特性",tabindex:"-1"};function u(m,e,P,b,f,I){const o=n("badge");return l(),i("div",null,[e[4]||(e[4]=a(`

API

Satori 协议规定了一套基于 HTTP 的 API 服务,用于发送消息和调用其他功能。

HTTP API

这是一套 HTTP RPC 风格的 API,所有 URL 的形式均为 /{path}/{version}/{resource}.{method}。其中,path 为部署路径 (可以为空),version 为 API 的版本号,resource 是资源类型,method 为方法名。

目前 Satori 仅有 v1 一个版本。

绝大多数 API 的请求都使用 POST,参数通过 application/json 编码在请求体中。返回值也是 JSON 格式。作为特例,具有 文件上传 功能的 API 使用 multipart/form-data 编码。

请求头中需要包含 Satori-PlatformSatori-User-ID 字段,分别表示平台名称和平台账号。

一个合法的请求示例形如:

text
POST /v1/channel.get
+Content-Type: application/json
+Authorization: Bearer 1234567890
+Satori-Platform: discord
+Satori-User-ID: 1234567890
+
+{"channel_id": "1234567890"}

鉴权

鉴权通过 HTTP API 中的 Authorization 请求头来实现。其中涉及的鉴权令牌由 SDK 分发,本协议不做任何限制。

如果 SDK 没有配置鉴权,则应用无需提供上述请求头。

状态码

状态码描述
200 (OK)请求成功
400 (BAD REQUEST)请求格式错误
401 (UNAUTHORIZED)缺失鉴权
403 (FORBIDDEN)权限不足
404 (NOT FOUND)资源不存在
405 (METHOD NOT ALLOWED)请求方法不支持
5XX (SERVER ERROR)服务器错误

TIP

如果某个标准 API 没有被某个平台支持,则应该返回 404 而非 501 (NOT IMPLEMENTED)。只有当一个 API 被平台支持但是未被适配器实现时,才应该返回 501。

`,15)),d("h3",h,[e[1]||(e[1]=t("平台特性 ")),s(o,{type:"warning"},{default:c(()=>e[0]||(e[0]=[t("实验性")])),_:1}),e[2]||(e[2]=t()),e[3]||(e[3]=d("a",{class:"header-anchor",href:"#平台特性","aria-label":'Permalink to "平台特性 实验性"'},"​",-1))]),e[5]||(e[5]=a('

Login 对象中的 features 字段是一个字符串数组,用于表示平台的特性。这些特性可以用于判断平台是否支持某些 API。合法的平台特性包括:

  • API 可用性,如特性 message.delete 表示支持使用 message.delete 撤回消息。
  • API 额外特性,如特性 message.list.from 表示使用 message.list 查询消息列表时支持将消息 ID 作为分页令牌。
  • 平台额外特性,如特性 guild.plain 表示该平台的群组内只能存在一个消息频道。

目前仅有 API 名称本身是规范的用法。我们将在后续版本中提供更全面的标准特性列表。

进阶 API

除了标准 API 外,Satori 还提供了一些进阶功能。

  • /{path}/{version}/proxy 的子路由用于代理平台资源,请参见 代理路由
  • /{path}/{version}/meta 的子路由用于访问 SDK 相关接口,请参见 元信息 API
  • /{path}/{version}/internal 的子路由用于访问平台内部接口,请参见 内部 API

类型定义

分页列表

部分 API 可能会返回分页数据。这种情况下,响应会是一个 List 对象:

字段类型描述
dataarray数据
nextstring?下一页的令牌

你可以使用 next 令牌来获取下一页的数据。如果 next 为空,则表示没有更多数据了。

双向分页列表

极少数 API 返回可双向延伸的分页数据。这种情况下,响应会是一个 BidiList 对象:

字段类型描述
dataarray数据
prevstring?上一页的令牌
nextstring?下一页的令牌

在对应的 API 中,你可以通过 directionorder 参数来指定方向和排序。

direction 参数有三种不同的取值:

  • before:向前获取数据,此时 prevnext 相同,均表示上一页的令牌。
  • after:向后获取数据,此时 prevnext 相同,均表示下一页的令牌。
  • around:向两侧获取数据,此时 prev 表示上一页的令牌,next 表示下一页的令牌。

如果 prevnext 缺失,则表示在该方向上没有更多数据了。

order 参数有两种不同的取值:

  • asc:升序排列。
  • desc:降序排列。
',20))])}const g=r(p,[["render",u]]);export{A as __pageData,g as default}; diff --git a/assets/zh-CN_protocol_elements.md.PpF5nfM_.js b/assets/zh-CN_protocol_elements.md.PpF5nfM_.js new file mode 100644 index 0000000..c1ad544 --- /dev/null +++ b/assets/zh-CN_protocol_elements.md.PpF5nfM_.js @@ -0,0 +1,17 @@ +import{_ as h,x as n,a7 as e,m as i,W as a,y as d,k as l,Q as r,h as o}from"./chunks/framework.K8kzz9Vz.js";const q=JSON.parse('{"title":"标准元素","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/elements.md","filePath":"zh-CN/protocol/elements.md"}'),p={name:"zh-CN/protocol/elements.md"},k={tabindex:"0"},g={id:"button",tabindex:"-1"};function u(c,t,b,y,B,m){const s=r("badge");return o(),n("div",null,[t[17]||(t[17]=e('

标准元素

基础元素

基本元素是最常见的消息元素,它们能够在大多数平台上正常显示,是组成消息的基本单位。

提及用户 (at)

属性类型范围描述
idstring?收发目标用户的 ID
namestring?收发目标用户的名称
rolestring?收发目标角色
typestring?收发特殊操作,例如 all 表示 @全体成员,here 表示 @在线成员

<at> 元素用于提及某个或某些用户。

提及频道 (sharp)

属性类型范围描述
idstring收发目标频道的 ID
namestring?收发目标频道的名称

<sharp> 元素用于提及某个频道。

链接 (a)

属性类型范围描述
hrefstring收发链接的 URL

<a> 元素用于显示一个链接。当平台不支持链接时,建议显示为 content (href) 的形式。

资源元素

资源消息元素表示文本中存在的资源文件。不同的平台对资源文件的支持存在较大的差异。发送时只需提供 src。如果某个平台不支持特定的资源类型,适配器应该用 src 代替。如果某个平台不支持将资源消息元素和其他消息元素同时发送,适配器应该分多条发送,并返回最后一条消息的 ID。

',14)),i("table",k,[t[12]||(t[12]=i("thead",null,[i("tr",null,[i("th",null,"属性"),i("th",null,"类型"),i("th",null,"范围"),i("th",null,"描述")])],-1)),i("tbody",null,[t[10]||(t[10]=i("tr",null,[i("td",null,"src"),i("td",null,"string"),i("td",null,"收发"),i("td",null,"资源的 URL")],-1)),t[11]||(t[11]=i("tr",null,[i("td",null,"title"),i("td",null,"string?"),i("td",null,"收发"),i("td",null,"资源文件名称")],-1)),i("tr",null,[i("td",null,[t[1]||(t[1]=a("cache ")),d(s,{type:"warning"},{default:l(()=>t[0]||(t[0]=[a("实验性")])),_:1})]),t[2]||(t[2]=i("td",null,"boolean?",-1)),t[3]||(t[3]=i("td",null,"发",-1)),t[4]||(t[4]=i("td",null,"是否使用已缓存的文件",-1))]),i("tr",null,[i("td",null,[t[6]||(t[6]=a("timeout ")),d(s,{type:"warning"},{default:l(()=>t[5]||(t[5]=[a("实验性")])),_:1})]),t[7]||(t[7]=i("td",null,"string?",-1)),t[8]||(t[8]=i("td",null,"发",-1)),t[9]||(t[9]=i("td",null,"下载文件的最长时间 (毫秒)",-1))])])]),t[18]||(t[18]=e(`

图片 (img)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
widthnumber?图片宽度 (像素)
heightnumber?图片高度 (像素)

<img> 元素用于表示图片。

音频 (audio)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
durationnumber?音频长度 (秒)
posterstring?收发音频封面 URL

<audio> 元素用于表示语音。

视频 (video)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
widthnumber?视频宽度 (像素)
heightnumber?视频高度 (像素)
durationnumber?视频长度 (秒)
posterstring?收发视频封面 URL

<video> 元素用于表示视频。

文件 (file)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
posterstring?收发缩略图 URL

<file> 元素用于表示文件。

修饰元素

修饰元素用于修饰其中的内容。如果对应的平台不支持对应的元素,可以忽略这个元素本身,正常渲染其中的子元素。

粗体 (b, strong)

<b><strong> 元素用于将其中的内容以粗体显示。

斜体 (i, em)

<i><em> 元素用于将其中的内容以斜体显示。

下划线 (u, ins)

<u><ins> 元素用于为其中的内容附加下划线。

删除线 (s, del)

<s><del> 元素用于为其中的内容附加删除线。

剧透 (spl)

<spl> 元素用于将其中的内容标记为剧透 (默认会被隐藏,点击后才显示)。

代码 (code)

<code> 元素用于将其中的内容以等宽字体显示 (通常还会有特定的背景色)。

上标 (sup)

<sup> 元素用于将其中的内容以上标显示。

下标 (sub)

<sub> 元素用于将其中的内容以下标显示。

排版元素

换行 (br)

<br> 元素表示一个独立的换行。

段落 (p)

<p> 元素表示一个段落。在渲染时,它与相邻的元素之间会确保有一个换行。

消息 (message)

属性类型范围描述
idstring?消息的 ID
forwardboolean?是否为转发消息

<message> 元素的基本用法是表示一条消息。子元素对应于消息的内容。如果其没有子元素,则消息不会被发送。

当出现 <message> 元素时,之前的元素会被立即视为一条消息被发送。因此下面的两种写法是等价的:

html
<!-- 第一种写法:发送两条消息 -->
+<message>hello</message>
+<message>world</message>
+
+<!-- 第二种写法:用一条空消息隔开两段文本,实际上仍然会发送两条消息 -->
+hello<message/>world

部分平台允许你模拟其他用户发送消息:

html
<message>
+  <author id="123123123" name="Alice" avatar="url"/>
+  hello world
+</message>

在支持转发的平台上,你可以使用 forward 配合 id 属性来转发一条消息:

html
<message id="123456789" forward/>

在支持合并转发的平台上,你可以使用带有 forward 属性的 <message> 元素嵌套其他 <message> 元素来实现合并转发:

html
<message forward>
+  <message id="123456789"/>
+  <message id="987654321"/>
+  <!-- 合并转发里也可以嵌套模拟其他用户发送的消息 -->
+  <message>
+    <author id="123123123" name="Alice" avatar="url"/>
+    hello world
+  </message>
+</message>

元信息元素

元信息元素通常不会被渲染,但会影响到消息的发送行为。

引用 (quote)

<quote> 元素用于表示对消息引用。它的子元素会被渲染为引用的内容。理论上所有 <message> 元素的特性也可以用于 <quote> 元素,包括子元素 (构造引用消息) 和 forward 属性 (引用合并转发)。然而目前似乎并没有平台提供了这样的支持。

作者 (author)

属性类型范围描述
idstring?用户 ID
namestring?昵称
avatarstring?头像 URL

<author> 元素用于表示消息的作者。它的子元素会被渲染为作者的名字。

交互元素

交互元素用于显然消息中的可交互性内容。如果平台不支持此类元素且难以提供回退,可以直接忽略整个元素。实现侧应当根据平台特性,针对性地返回带有交互和不带有交互的消息。

`,59)),i("h3",g,[t[14]||(t[14]=a("按钮 (button) ")),d(s,{type:"warning"},{default:l(()=>t[13]||(t[13]=[a("实验性")])),_:1}),t[15]||(t[15]=a()),t[16]||(t[16]=i("a",{class:"header-anchor",href:"#button","aria-label":'Permalink to "按钮 (button) 实验性 {#button}"'},"​",-1))]),t[19]||(t[19]=e('
属性类型范围描述
idstring?按钮的 ID
typestring?按钮的类型
hrefstring?按钮的链接
textstring?待输入文本
themestring?按钮的样式

<button> 元素用于表示一个按钮。它的子元素会被渲染为按钮的文本。

按钮目前支持三种不同的类型:

  • 点击 action 类型的按钮时会触发一个 interaction/button 事件,该事件的 button 资源会包含上述 id
  • 点击 link 类型的按钮时会打开一个链接,该链接的地址为上述 href
  • 点击 input 类型的按钮时会在用户的输入框中填充上述 text

theme 仅建议使用下列值:

  • primary
  • secondary
  • success
  • warning
  • danger
  • info
',6))])}const F=h(p,[["render",u]]);export{q as __pageData,F as default}; diff --git a/assets/zh-CN_protocol_elements.md.PpF5nfM_.lean.js b/assets/zh-CN_protocol_elements.md.PpF5nfM_.lean.js new file mode 100644 index 0000000..c1ad544 --- /dev/null +++ b/assets/zh-CN_protocol_elements.md.PpF5nfM_.lean.js @@ -0,0 +1,17 @@ +import{_ as h,x as n,a7 as e,m as i,W as a,y as d,k as l,Q as r,h as o}from"./chunks/framework.K8kzz9Vz.js";const q=JSON.parse('{"title":"标准元素","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/elements.md","filePath":"zh-CN/protocol/elements.md"}'),p={name:"zh-CN/protocol/elements.md"},k={tabindex:"0"},g={id:"button",tabindex:"-1"};function u(c,t,b,y,B,m){const s=r("badge");return o(),n("div",null,[t[17]||(t[17]=e('

标准元素

基础元素

基本元素是最常见的消息元素,它们能够在大多数平台上正常显示,是组成消息的基本单位。

提及用户 (at)

属性类型范围描述
idstring?收发目标用户的 ID
namestring?收发目标用户的名称
rolestring?收发目标角色
typestring?收发特殊操作,例如 all 表示 @全体成员,here 表示 @在线成员

<at> 元素用于提及某个或某些用户。

提及频道 (sharp)

属性类型范围描述
idstring收发目标频道的 ID
namestring?收发目标频道的名称

<sharp> 元素用于提及某个频道。

链接 (a)

属性类型范围描述
hrefstring收发链接的 URL

<a> 元素用于显示一个链接。当平台不支持链接时,建议显示为 content (href) 的形式。

资源元素

资源消息元素表示文本中存在的资源文件。不同的平台对资源文件的支持存在较大的差异。发送时只需提供 src。如果某个平台不支持特定的资源类型,适配器应该用 src 代替。如果某个平台不支持将资源消息元素和其他消息元素同时发送,适配器应该分多条发送,并返回最后一条消息的 ID。

',14)),i("table",k,[t[12]||(t[12]=i("thead",null,[i("tr",null,[i("th",null,"属性"),i("th",null,"类型"),i("th",null,"范围"),i("th",null,"描述")])],-1)),i("tbody",null,[t[10]||(t[10]=i("tr",null,[i("td",null,"src"),i("td",null,"string"),i("td",null,"收发"),i("td",null,"资源的 URL")],-1)),t[11]||(t[11]=i("tr",null,[i("td",null,"title"),i("td",null,"string?"),i("td",null,"收发"),i("td",null,"资源文件名称")],-1)),i("tr",null,[i("td",null,[t[1]||(t[1]=a("cache ")),d(s,{type:"warning"},{default:l(()=>t[0]||(t[0]=[a("实验性")])),_:1})]),t[2]||(t[2]=i("td",null,"boolean?",-1)),t[3]||(t[3]=i("td",null,"发",-1)),t[4]||(t[4]=i("td",null,"是否使用已缓存的文件",-1))]),i("tr",null,[i("td",null,[t[6]||(t[6]=a("timeout ")),d(s,{type:"warning"},{default:l(()=>t[5]||(t[5]=[a("实验性")])),_:1})]),t[7]||(t[7]=i("td",null,"string?",-1)),t[8]||(t[8]=i("td",null,"发",-1)),t[9]||(t[9]=i("td",null,"下载文件的最长时间 (毫秒)",-1))])])]),t[18]||(t[18]=e(`

图片 (img)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
widthnumber?图片宽度 (像素)
heightnumber?图片高度 (像素)

<img> 元素用于表示图片。

音频 (audio)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
durationnumber?音频长度 (秒)
posterstring?收发音频封面 URL

<audio> 元素用于表示语音。

视频 (video)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
widthnumber?视频宽度 (像素)
heightnumber?视频高度 (像素)
durationnumber?视频长度 (秒)
posterstring?收发视频封面 URL

<video> 元素用于表示视频。

文件 (file)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
posterstring?收发缩略图 URL

<file> 元素用于表示文件。

修饰元素

修饰元素用于修饰其中的内容。如果对应的平台不支持对应的元素,可以忽略这个元素本身,正常渲染其中的子元素。

粗体 (b, strong)

<b><strong> 元素用于将其中的内容以粗体显示。

斜体 (i, em)

<i><em> 元素用于将其中的内容以斜体显示。

下划线 (u, ins)

<u><ins> 元素用于为其中的内容附加下划线。

删除线 (s, del)

<s><del> 元素用于为其中的内容附加删除线。

剧透 (spl)

<spl> 元素用于将其中的内容标记为剧透 (默认会被隐藏,点击后才显示)。

代码 (code)

<code> 元素用于将其中的内容以等宽字体显示 (通常还会有特定的背景色)。

上标 (sup)

<sup> 元素用于将其中的内容以上标显示。

下标 (sub)

<sub> 元素用于将其中的内容以下标显示。

排版元素

换行 (br)

<br> 元素表示一个独立的换行。

段落 (p)

<p> 元素表示一个段落。在渲染时,它与相邻的元素之间会确保有一个换行。

消息 (message)

属性类型范围描述
idstring?消息的 ID
forwardboolean?是否为转发消息

<message> 元素的基本用法是表示一条消息。子元素对应于消息的内容。如果其没有子元素,则消息不会被发送。

当出现 <message> 元素时,之前的元素会被立即视为一条消息被发送。因此下面的两种写法是等价的:

html
<!-- 第一种写法:发送两条消息 -->
+<message>hello</message>
+<message>world</message>
+
+<!-- 第二种写法:用一条空消息隔开两段文本,实际上仍然会发送两条消息 -->
+hello<message/>world

部分平台允许你模拟其他用户发送消息:

html
<message>
+  <author id="123123123" name="Alice" avatar="url"/>
+  hello world
+</message>

在支持转发的平台上,你可以使用 forward 配合 id 属性来转发一条消息:

html
<message id="123456789" forward/>

在支持合并转发的平台上,你可以使用带有 forward 属性的 <message> 元素嵌套其他 <message> 元素来实现合并转发:

html
<message forward>
+  <message id="123456789"/>
+  <message id="987654321"/>
+  <!-- 合并转发里也可以嵌套模拟其他用户发送的消息 -->
+  <message>
+    <author id="123123123" name="Alice" avatar="url"/>
+    hello world
+  </message>
+</message>

元信息元素

元信息元素通常不会被渲染,但会影响到消息的发送行为。

引用 (quote)

<quote> 元素用于表示对消息引用。它的子元素会被渲染为引用的内容。理论上所有 <message> 元素的特性也可以用于 <quote> 元素,包括子元素 (构造引用消息) 和 forward 属性 (引用合并转发)。然而目前似乎并没有平台提供了这样的支持。

作者 (author)

属性类型范围描述
idstring?用户 ID
namestring?昵称
avatarstring?头像 URL

<author> 元素用于表示消息的作者。它的子元素会被渲染为作者的名字。

交互元素

交互元素用于显然消息中的可交互性内容。如果平台不支持此类元素且难以提供回退,可以直接忽略整个元素。实现侧应当根据平台特性,针对性地返回带有交互和不带有交互的消息。

`,59)),i("h3",g,[t[14]||(t[14]=a("按钮 (button) ")),d(s,{type:"warning"},{default:l(()=>t[13]||(t[13]=[a("实验性")])),_:1}),t[15]||(t[15]=a()),t[16]||(t[16]=i("a",{class:"header-anchor",href:"#button","aria-label":'Permalink to "按钮 (button) 实验性 {#button}"'},"​",-1))]),t[19]||(t[19]=e('
属性类型范围描述
idstring?按钮的 ID
typestring?按钮的类型
hrefstring?按钮的链接
textstring?待输入文本
themestring?按钮的样式

<button> 元素用于表示一个按钮。它的子元素会被渲染为按钮的文本。

按钮目前支持三种不同的类型:

  • 点击 action 类型的按钮时会触发一个 interaction/button 事件,该事件的 button 资源会包含上述 id
  • 点击 link 类型的按钮时会打开一个链接,该链接的地址为上述 href
  • 点击 input 类型的按钮时会在用户的输入框中填充上述 text

theme 仅建议使用下列值:

  • primary
  • secondary
  • success
  • warning
  • danger
  • info
',6))])}const F=h(p,[["render",u]]);export{q as __pageData,F as default}; diff --git a/assets/zh-CN_protocol_events.md.Dh8okkMd.js b/assets/zh-CN_protocol_events.md.Dh8okkMd.js new file mode 100644 index 0000000..f884282 --- /dev/null +++ b/assets/zh-CN_protocol_events.md.Dh8okkMd.js @@ -0,0 +1 @@ +import{_ as l,x as h,a7 as o,m as r,W as e,y as a,k as c,Q as n,h as s}from"./chunks/framework.K8kzz9Vz.js";const v=JSON.parse('{"title":"事件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/events.md","filePath":"zh-CN/protocol/events.md"}'),i={name:"zh-CN/protocol/events.md"},b={id:"webhook",tabindex:"-1"};function p(u,t,m,f,k,g){const d=n("badge");return s(),h("div",null,[t[6]||(t[6]=o('

事件

Satori 协议规定了两套事件服务,分别基于 WebSocket 和 WebHook。

类型定义

OpCode

名称方向描述
EVENT0接收事件
PING1发送心跳
PONG2接收心跳回复
IDENTIFY3发送鉴权
READY4接收鉴权成功
META5接收元信息更新

Event

字段类型描述
snnumber序列号
typestring事件类型
timestampnumber事件的时间戳
loginLogin登录信息
argvArgv?交互指令
buttonButton?交互按钮
channelChannel?事件所属的频道
guildGuild?事件所属的群组
memberGuildMember?事件的目标成员
messageMessage?事件的消息
operatorUser?事件的操作者
roleGuildRole?事件的目标角色
userUser?事件的目标用户

事件分为普通事件与登录事件,其中登录事件特指与 Login 变化相关的事件 (如 login-added)。所有事件都采用上述数据结构,不过在细节上有所区别:

  • 普通事件中的 login 资源只会带有 sn, userplatform 三个属性;
  • 登录事件会带有完整的 login 资源,但可能不存在 userplatform
  • 登录事件不参与 会话恢复

事件中的各属性遵循 资源提升 规则。

WebSocket

WebSocket 服务用于在 Satori SDK 与应用之间维护一个持久的、有状态的链接。通过这个链接,Satori 应用可以实时接收 SDK 推送的事件。

WebSocket 服务的地址为 /{path}/{version}/events。其中,path 为部署路径 (可以为空),version 为 API 的版本号。

目前 Satori 仅有 v1 一个版本。

连接流程

总的来说,Satori 应用需要在连接后遵循以下步骤:

  1. 连接建立后,在 10s 内发送一个 IDENTIFY 信令,用于鉴权和恢复会话;
    SDK 收到后会回复一个 READY 信令,并开启事件推送;
  2. 连接建立后,每隔 10s 向 SDK 发送一次 PING 信令;
    SDK 收到后会回复一个 PONG 信令;
  3. 应用持续接收来自 SDK 的 EVENT 信令,用于接收事件。

信令的数据结构如下:

字段类型描述
opOpCode信令类型
bodyobject?信令数据

IDENTIFY 信令的 body 数据结构如下:

字段类型描述
tokenstring?鉴权令牌
snnumber?序列号

READY 信令的 body 数据结构如下:

字段类型描述
loginsLogin[]登录信息
proxy_urlsstring[]代理路由 列表

META 信令的 body 数据结构如下:

字段类型描述
proxy_urlsstring[]代理路由 列表

EVENT 信令的 body 数据结构参见 Event

鉴权

WebSocket 鉴权通过 IDENTIFY 信令的 token 字段来实现。其中涉及的鉴权令牌由 SDK 分发,本协议不做任何限制。

如果 SDK 没有配置鉴权,则应用无需提供上述字段。

会话恢复

当连接短暂中断时,Satori 应用可以通过 IDENTIFY 信令的 sn 字段来恢复会话。sn 字段的值为上一次连接中最后一个接收到的 EVENT 信令的 sn 字段。会话恢复后,SDK 会向应用推送所有在断开连接期间发生的事件。

登录事件将不会在会话恢复过程中推送,因为在 READY 信令中已经包含了最新的登录状态。

',32)),r("h2",b,[t[2]||(t[2]=e("WebHook ")),a(d,null,{default:c(()=>t[0]||(t[0]=[e("可选")])),_:1}),t[3]||(t[3]=e()),a(d,{type:"warning"},{default:c(()=>t[1]||(t[1]=[e("实验性")])),_:1}),t[4]||(t[4]=e()),t[5]||(t[5]=r("a",{class:"header-anchor",href:"#webhook","aria-label":'Permalink to "WebHook 可选 实验性"'},"​",-1))]),t[7]||(t[7]=o('

TIP

这是一个可选功能。

WebHook 服务是指,Satori SDK 在接收到平台事件时,向应用提供的 HTTP 地址推送事件。一个 SDK 应当可以配置多个 WebHook,并允许应用对发送者进行鉴权。这些 WebHook 的配置方式由 SDK 自身决定,本协议仅规范化了一组 API,不做强制要求。

事件推送以 POST 的形式进行。请求头包含 Satori-OpCode 字段,对应本次推送的 信令类型;请求体是一个 JSON 对象,对应本次推送的信令数据。例如,一次事件推送将会拥有 Satori-OpCode: 0 的请求头,以及一个符合 Event 结构的请求体。

WebHook 所涉及的信令仅包含 EVENT, META 两种。

应用收到 WebHook 请求时,如果能够顺利鉴权并处理请求,应当返回 2XX 的状态码。如果鉴权失败,应当返回 4XX 的状态码。如果处理失败,应当返回 5XX 的状态码。

反向鉴权

TIP

这里的鉴权与 API 与 WebSocket 中的鉴权逻辑类似,但方向相反。

Satori 应用可以要求 SDK 在发送 WebHook 请求时附带一个 Authorization 请求头,格式为 Bearer {token}。其中,token 由应用进行分发。

',8))])}const E=l(i,[["render",p]]);export{v as __pageData,E as default}; diff --git a/assets/zh-CN_protocol_events.md.Dh8okkMd.lean.js b/assets/zh-CN_protocol_events.md.Dh8okkMd.lean.js new file mode 100644 index 0000000..f884282 --- /dev/null +++ b/assets/zh-CN_protocol_events.md.Dh8okkMd.lean.js @@ -0,0 +1 @@ +import{_ as l,x as h,a7 as o,m as r,W as e,y as a,k as c,Q as n,h as s}from"./chunks/framework.K8kzz9Vz.js";const v=JSON.parse('{"title":"事件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/events.md","filePath":"zh-CN/protocol/events.md"}'),i={name:"zh-CN/protocol/events.md"},b={id:"webhook",tabindex:"-1"};function p(u,t,m,f,k,g){const d=n("badge");return s(),h("div",null,[t[6]||(t[6]=o('

事件

Satori 协议规定了两套事件服务,分别基于 WebSocket 和 WebHook。

类型定义

OpCode

名称方向描述
EVENT0接收事件
PING1发送心跳
PONG2接收心跳回复
IDENTIFY3发送鉴权
READY4接收鉴权成功
META5接收元信息更新

Event

字段类型描述
snnumber序列号
typestring事件类型
timestampnumber事件的时间戳
loginLogin登录信息
argvArgv?交互指令
buttonButton?交互按钮
channelChannel?事件所属的频道
guildGuild?事件所属的群组
memberGuildMember?事件的目标成员
messageMessage?事件的消息
operatorUser?事件的操作者
roleGuildRole?事件的目标角色
userUser?事件的目标用户

事件分为普通事件与登录事件,其中登录事件特指与 Login 变化相关的事件 (如 login-added)。所有事件都采用上述数据结构,不过在细节上有所区别:

  • 普通事件中的 login 资源只会带有 sn, userplatform 三个属性;
  • 登录事件会带有完整的 login 资源,但可能不存在 userplatform
  • 登录事件不参与 会话恢复

事件中的各属性遵循 资源提升 规则。

WebSocket

WebSocket 服务用于在 Satori SDK 与应用之间维护一个持久的、有状态的链接。通过这个链接,Satori 应用可以实时接收 SDK 推送的事件。

WebSocket 服务的地址为 /{path}/{version}/events。其中,path 为部署路径 (可以为空),version 为 API 的版本号。

目前 Satori 仅有 v1 一个版本。

连接流程

总的来说,Satori 应用需要在连接后遵循以下步骤:

  1. 连接建立后,在 10s 内发送一个 IDENTIFY 信令,用于鉴权和恢复会话;
    SDK 收到后会回复一个 READY 信令,并开启事件推送;
  2. 连接建立后,每隔 10s 向 SDK 发送一次 PING 信令;
    SDK 收到后会回复一个 PONG 信令;
  3. 应用持续接收来自 SDK 的 EVENT 信令,用于接收事件。

信令的数据结构如下:

字段类型描述
opOpCode信令类型
bodyobject?信令数据

IDENTIFY 信令的 body 数据结构如下:

字段类型描述
tokenstring?鉴权令牌
snnumber?序列号

READY 信令的 body 数据结构如下:

字段类型描述
loginsLogin[]登录信息
proxy_urlsstring[]代理路由 列表

META 信令的 body 数据结构如下:

字段类型描述
proxy_urlsstring[]代理路由 列表

EVENT 信令的 body 数据结构参见 Event

鉴权

WebSocket 鉴权通过 IDENTIFY 信令的 token 字段来实现。其中涉及的鉴权令牌由 SDK 分发,本协议不做任何限制。

如果 SDK 没有配置鉴权,则应用无需提供上述字段。

会话恢复

当连接短暂中断时,Satori 应用可以通过 IDENTIFY 信令的 sn 字段来恢复会话。sn 字段的值为上一次连接中最后一个接收到的 EVENT 信令的 sn 字段。会话恢复后,SDK 会向应用推送所有在断开连接期间发生的事件。

登录事件将不会在会话恢复过程中推送,因为在 READY 信令中已经包含了最新的登录状态。

',32)),r("h2",b,[t[2]||(t[2]=e("WebHook ")),a(d,null,{default:c(()=>t[0]||(t[0]=[e("可选")])),_:1}),t[3]||(t[3]=e()),a(d,{type:"warning"},{default:c(()=>t[1]||(t[1]=[e("实验性")])),_:1}),t[4]||(t[4]=e()),t[5]||(t[5]=r("a",{class:"header-anchor",href:"#webhook","aria-label":'Permalink to "WebHook 可选 实验性"'},"​",-1))]),t[7]||(t[7]=o('

TIP

这是一个可选功能。

WebHook 服务是指,Satori SDK 在接收到平台事件时,向应用提供的 HTTP 地址推送事件。一个 SDK 应当可以配置多个 WebHook,并允许应用对发送者进行鉴权。这些 WebHook 的配置方式由 SDK 自身决定,本协议仅规范化了一组 API,不做强制要求。

事件推送以 POST 的形式进行。请求头包含 Satori-OpCode 字段,对应本次推送的 信令类型;请求体是一个 JSON 对象,对应本次推送的信令数据。例如,一次事件推送将会拥有 Satori-OpCode: 0 的请求头,以及一个符合 Event 结构的请求体。

WebHook 所涉及的信令仅包含 EVENT, META 两种。

应用收到 WebHook 请求时,如果能够顺利鉴权并处理请求,应当返回 2XX 的状态码。如果鉴权失败,应当返回 4XX 的状态码。如果处理失败,应当返回 5XX 的状态码。

反向鉴权

TIP

这里的鉴权与 API 与 WebSocket 中的鉴权逻辑类似,但方向相反。

Satori 应用可以要求 SDK 在发送 WebHook 请求时附带一个 Authorization 请求头,格式为 Bearer {token}。其中,token 由应用进行分发。

',8))])}const E=l(i,[["render",p]]);export{v as __pageData,E as default}; diff --git a/assets/zh-CN_protocol_index.md.SoESnLsL.js b/assets/zh-CN_protocol_index.md.SoESnLsL.js new file mode 100644 index 0000000..de43f64 --- /dev/null +++ b/assets/zh-CN_protocol_index.md.SoESnLsL.js @@ -0,0 +1 @@ +import{_ as o,x as a,a7 as r,h as t}from"./chunks/framework.K8kzz9Vz.js";const m=JSON.parse('{"title":"总览","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/index.md","filePath":"zh-CN/protocol/index.md"}'),s={name:"zh-CN/protocol/index.md"};function c(n,e,d,l,i,p){return t(),a("div",null,e[0]||(e[0]=[r('

总览

Satori 协议的通信方式分为两块:

  • 一套基于 HTTP 的 API 服务,用于发送消息和调用其他功能;
  • 一套基于 WebSocket 或者 WebHook 的事件服务,用于接收消息和其他事件。

核心概念

在我们开始之前,先来了解一些与 Satori 相关的核心概念。

SDK 是指实现了 Satori 协议的软件。应用 (Application) 是指接入了 Satori 协议的软件。应用通过与 SDK 通信,以实现聊天平台的功能。

平台 (Platform) 是指聊天平台,比如 Discord、Telegram 等。同一平台内的用户间具有相互发送消息的能力,而不同平台的用户间则没有。对于 Rocket Chat 这一类可自建的聊天平台而言,每个独立的自建服务器都视为不同的平台。

消息 (Message) 是字面意义上的消息。通常是文本或富文本格式的,有时也会包含图片、语音等媒体资源。在 Koishi 中,消息通过消息元素进行统一编码。

频道 (Channel) 是消息的集合。一个频道包含了具备时间、逻辑顺序的一系列消息。频道又分为私聊频道和群聊频道,其中私聊频道有且仅有两人参与,而群聊频道可以有任意多人参与。

群组 (Guild) 是平台用户的集合。一个群组通常会同时包含一组用户和频道,并通过权限机制让其中的部分用户进行管理。在部分平台中,群组和群聊频道的概念恰好是重合的 (例如 QQ):一个群组内有且仅有一个群聊频道。私聊频道不属于任何群组。

可选字段

由于不同平台实现的差异,Satori 协议中的大部分字段都是可选的。可选字段的类型后面会有一个 ? 标记。

对于任意可选字段,相关 API 调用的结果中可能不含该字段,也可能该字段的值为 null。其中,前者表示该 API 并未提供这一字段,但可能由其他 API 提供;后者表示该 API 提供了这一字段,但其值为 null

资源

Satori 协议中的资源是指一类具有确定结构的对象。例如,用户频道消息 等都是资源。部分事件和 API 的返回值中会包含这些资源对象。

资源对象的某个字段可以是另一个资源对象,例如消息对象中的 user 字段就是一个用户对象。当资源对象出现多级嵌套时,内层的资源将会被统一提升到最外层。例如,当接收到消息事件时,事件体中可以访问到 message, member, user, channel 等资源,但 message 中就不再存在 memberuser 字段了。

',16)]))}const u=o(s,[["render",c]]);export{m as __pageData,u as default}; diff --git a/assets/zh-CN_protocol_index.md.SoESnLsL.lean.js b/assets/zh-CN_protocol_index.md.SoESnLsL.lean.js new file mode 100644 index 0000000..de43f64 --- /dev/null +++ b/assets/zh-CN_protocol_index.md.SoESnLsL.lean.js @@ -0,0 +1 @@ +import{_ as o,x as a,a7 as r,h as t}from"./chunks/framework.K8kzz9Vz.js";const m=JSON.parse('{"title":"总览","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/index.md","filePath":"zh-CN/protocol/index.md"}'),s={name:"zh-CN/protocol/index.md"};function c(n,e,d,l,i,p){return t(),a("div",null,e[0]||(e[0]=[r('

总览

Satori 协议的通信方式分为两块:

  • 一套基于 HTTP 的 API 服务,用于发送消息和调用其他功能;
  • 一套基于 WebSocket 或者 WebHook 的事件服务,用于接收消息和其他事件。

核心概念

在我们开始之前,先来了解一些与 Satori 相关的核心概念。

SDK 是指实现了 Satori 协议的软件。应用 (Application) 是指接入了 Satori 协议的软件。应用通过与 SDK 通信,以实现聊天平台的功能。

平台 (Platform) 是指聊天平台,比如 Discord、Telegram 等。同一平台内的用户间具有相互发送消息的能力,而不同平台的用户间则没有。对于 Rocket Chat 这一类可自建的聊天平台而言,每个独立的自建服务器都视为不同的平台。

消息 (Message) 是字面意义上的消息。通常是文本或富文本格式的,有时也会包含图片、语音等媒体资源。在 Koishi 中,消息通过消息元素进行统一编码。

频道 (Channel) 是消息的集合。一个频道包含了具备时间、逻辑顺序的一系列消息。频道又分为私聊频道和群聊频道,其中私聊频道有且仅有两人参与,而群聊频道可以有任意多人参与。

群组 (Guild) 是平台用户的集合。一个群组通常会同时包含一组用户和频道,并通过权限机制让其中的部分用户进行管理。在部分平台中,群组和群聊频道的概念恰好是重合的 (例如 QQ):一个群组内有且仅有一个群聊频道。私聊频道不属于任何群组。

可选字段

由于不同平台实现的差异,Satori 协议中的大部分字段都是可选的。可选字段的类型后面会有一个 ? 标记。

对于任意可选字段,相关 API 调用的结果中可能不含该字段,也可能该字段的值为 null。其中,前者表示该 API 并未提供这一字段,但可能由其他 API 提供;后者表示该 API 提供了这一字段,但其值为 null

资源

Satori 协议中的资源是指一类具有确定结构的对象。例如,用户频道消息 等都是资源。部分事件和 API 的返回值中会包含这些资源对象。

资源对象的某个字段可以是另一个资源对象,例如消息对象中的 user 字段就是一个用户对象。当资源对象出现多级嵌套时,内层的资源将会被统一提升到最外层。例如,当接收到消息事件时,事件体中可以访问到 message, member, user, channel 等资源,但 message 中就不再存在 memberuser 字段了。

',16)]))}const u=o(s,[["render",c]]);export{m as __pageData,u as default}; diff --git a/assets/zh-CN_protocol_message.md.Cu2tqxHC.js b/assets/zh-CN_protocol_message.md.Cu2tqxHC.js new file mode 100644 index 0000000..796e149 --- /dev/null +++ b/assets/zh-CN_protocol_message.md.Cu2tqxHC.js @@ -0,0 +1,7 @@ +import{_ as i,x as s,a7 as a,h as e}from"./chunks/framework.K8kzz9Vz.js";const c=JSON.parse('{"title":"消息编码","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/message.md","filePath":"zh-CN/protocol/message.md"}'),l={name:"zh-CN/protocol/message.md"};function n(h,t,d,o,p,k){return e(),s("div",null,t[0]||(t[0]=[a(`

消息编码

Satori 中的消息使用消息元素 (Message Element) 进行编码。消息元素的语法与 XHTML 类似。

语法

消息元素的语法与 HTML 类似,但是不完全相同。

字符

你可以在消息元素内使用任何字符。不过部分特殊字符需要转义:

原始字符转义写法
"&quot;
&&amp;
<&lt;
>&gt;

根据上下文的不同,有些字符可能不需要被转义或使用其他的转义方式。

除此以外,你可以使用十进制或十六进制转义任何字符。例如 ' 也可以被书写成 &#39;&#x27;

标签

使用一对尖括号包裹元素名,加上可选的属性、闭合指示符,就构成了一个标签。

元素名由小写字母、数字和连字符组成,且必须以字母开头。在元素名前后添加 / 表示这是一个结束标签或自闭合标签,没有 / 符号时则表示这是一个起始标签:

  • <tag> 一个起始标签
  • </tag> 一个结束标签
  • <tag/> 一个自闭合标签

属性

起始或自闭合标签的元素名后接受可选的属性列表。每个属性必须形如以下形式:

  • key
  • key="value" (此时 value 中的 " 需要被转义)
  • key='value' (此时 value 中的 ' 需要被转义)

下面是一段示例:

html
<tag foo="1" bar/>

元素

一个元素要么是自闭合标签,要么由一对同名的起始标签和结束标签构成。元素的内容指起始标签和结束标签中间的部分,可以包含文本内容或其他元素。对于自闭合标签,元素的内容为空。下面是一段示例:

html
<parent>
+  text content
+  <child/>
+</parent>

当存在未配对的元素时,将自动视为文本内容的一部分。文本内容前后如果存在包含换行符的连续空白字符,则会被忽略。这意味着下面两段代码是等价的:

html
<tag>
+  <foo> bar
+  <!-- comment -->
+</tag>
html
<tag>&lt;foo&gt; bar</tag>

注释

使用成对的 <!----> 插入一段注释。注释中的部分不会被渲染。

标准元素

关于 Satori 内置的消息元素,请参考 标准元素

`,28)]))}const g=i(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/zh-CN_protocol_message.md.Cu2tqxHC.lean.js b/assets/zh-CN_protocol_message.md.Cu2tqxHC.lean.js new file mode 100644 index 0000000..796e149 --- /dev/null +++ b/assets/zh-CN_protocol_message.md.Cu2tqxHC.lean.js @@ -0,0 +1,7 @@ +import{_ as i,x as s,a7 as a,h as e}from"./chunks/framework.K8kzz9Vz.js";const c=JSON.parse('{"title":"消息编码","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/protocol/message.md","filePath":"zh-CN/protocol/message.md"}'),l={name:"zh-CN/protocol/message.md"};function n(h,t,d,o,p,k){return e(),s("div",null,t[0]||(t[0]=[a(`

消息编码

Satori 中的消息使用消息元素 (Message Element) 进行编码。消息元素的语法与 XHTML 类似。

语法

消息元素的语法与 HTML 类似,但是不完全相同。

字符

你可以在消息元素内使用任何字符。不过部分特殊字符需要转义:

原始字符转义写法
"&quot;
&&amp;
<&lt;
>&gt;

根据上下文的不同,有些字符可能不需要被转义或使用其他的转义方式。

除此以外,你可以使用十进制或十六进制转义任何字符。例如 ' 也可以被书写成 &#39;&#x27;

标签

使用一对尖括号包裹元素名,加上可选的属性、闭合指示符,就构成了一个标签。

元素名由小写字母、数字和连字符组成,且必须以字母开头。在元素名前后添加 / 表示这是一个结束标签或自闭合标签,没有 / 符号时则表示这是一个起始标签:

  • <tag> 一个起始标签
  • </tag> 一个结束标签
  • <tag/> 一个自闭合标签

属性

起始或自闭合标签的元素名后接受可选的属性列表。每个属性必须形如以下形式:

  • key
  • key="value" (此时 value 中的 " 需要被转义)
  • key='value' (此时 value 中的 ' 需要被转义)

下面是一段示例:

html
<tag foo="1" bar/>

元素

一个元素要么是自闭合标签,要么由一对同名的起始标签和结束标签构成。元素的内容指起始标签和结束标签中间的部分,可以包含文本内容或其他元素。对于自闭合标签,元素的内容为空。下面是一段示例:

html
<parent>
+  text content
+  <child/>
+</parent>

当存在未配对的元素时,将自动视为文本内容的一部分。文本内容前后如果存在包含换行符的连续空白字符,则会被忽略。这意味着下面两段代码是等价的:

html
<tag>
+  <foo> bar
+  <!-- comment -->
+</tag>
html
<tag>&lt;foo&gt; bar</tag>

注释

使用成对的 <!----> 插入一段注释。注释中的部分不会被渲染。

标准元素

关于 Satori 内置的消息元素,请参考 标准元素

`,28)]))}const g=i(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/zh-CN_resources_channel.md.BTvowY65.js b/assets/zh-CN_resources_channel.md.BTvowY65.js new file mode 100644 index 0000000..ac50acb --- /dev/null +++ b/assets/zh-CN_resources_channel.md.BTvowY65.js @@ -0,0 +1 @@ +import{_ as o,x as h,a7 as r,m as d,y as n,k as l,W as a,Q as i,h as s}from"./chunks/framework.K8kzz9Vz.js";const S=JSON.parse('{"title":"频道 (Channel)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/channel.md","filePath":"zh-CN/resources/channel.md"}'),u={name:"zh-CN/resources/channel.md"},b={class:"route"},p={class:"route"},f={class:"route"},q={class:"route"},m={class:"route"},x={id:"禁言群组频道",tabindex:"-1"},y={class:"route"},g={class:"route"};function P(k,t,C,I,T,D){const e=i("badge");return s(),h("div",null,[t[18]||(t[18]=r('

频道 (Channel)

类型定义

Channel

字段类型描述
idstring频道 ID
typeChannelType频道类型
namestring?频道名称
parent_idstring?父频道 ID

ChannelType

名称描述
TEXT0文本频道
DIRECT1私聊频道
CATEGORY2分类频道
VOICE3语音频道

API

获取群组频道

',8)),d("blockquote",b,[n(e,null,{default:l(()=>t[0]||(t[0]=[a("POST")])),_:1}),t[1]||(t[1]=d("code",null,"/channel.get",-1))]),t[19]||(t[19]=r('
字段类型描述
channel_idstring频道 ID

根据 ID 获取频道。返回一个 Channel 对象。

获取群组频道列表

',3)),d("blockquote",p,[n(e,null,{default:l(()=>t[2]||(t[2]=[a("POST")])),_:1}),t[3]||(t[3]=d("code",null,"/channel.list",-1))]),t[20]||(t[20]=r('
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群组中的全部频道。返回一个 Channel分页列表

创建群组频道

',3)),d("blockquote",f,[n(e,null,{default:l(()=>t[4]||(t[4]=[a("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/channel.create",-1))]),t[21]||(t[21]=r('
字段类型描述
guild_idstring群组 ID
dataChannel频道数据

创建群组频道。返回一个 Channel 对象。

修改群组频道

',3)),d("blockquote",q,[n(e,null,{default:l(()=>t[6]||(t[6]=[a("POST")])),_:1}),t[7]||(t[7]=d("code",null,"/channel.update",-1))]),t[22]||(t[22]=r('
字段类型描述
channel_idstring频道 ID
dataChannel频道数据

修改群组频道。

删除群组频道

',3)),d("blockquote",m,[n(e,null,{default:l(()=>t[8]||(t[8]=[a("POST")])),_:1}),t[9]||(t[9]=d("code",null,"/channel.delete",-1))]),t[23]||(t[23]=d("table",{tabindex:"0"},[d("thead",null,[d("tr",null,[d("th",null,"字段"),d("th",null,"类型"),d("th",null,"描述")])]),d("tbody",null,[d("tr",null,[d("td",null,"channel_id"),d("td",null,"string"),d("td",null,"频道 ID")])])],-1)),t[24]||(t[24]=d("p",null,"删除群组频道。",-1)),d("h3",x,[t[11]||(t[11]=a("禁言群组频道 ")),n(e,{type:"warning"},{default:l(()=>t[10]||(t[10]=[a("实验性")])),_:1}),t[12]||(t[12]=a()),t[13]||(t[13]=d("a",{class:"header-anchor",href:"#禁言群组频道","aria-label":'Permalink to "禁言群组频道 实验性"'},"​",-1))]),d("blockquote",y,[n(e,null,{default:l(()=>t[14]||(t[14]=[a("POST")])),_:1}),t[15]||(t[15]=d("code",null,"/channel.mute",-1))]),t[25]||(t[25]=r('
字段类型描述
channel_idstring频道 ID
durationnumber禁言时长 (毫秒)

禁言群组频道。如果传入的禁言时长为 0 则表示解除禁言。

创建私聊频道

',3)),d("blockquote",g,[n(e,null,{default:l(()=>t[16]||(t[16]=[a("POST")])),_:1}),t[17]||(t[17]=d("code",null,"/user.channel.create",-1))]),t[26]||(t[26]=r('
字段类型描述
user_idstring用户 ID
guild_idstring?群组 ID

创建一个私聊频道。返回一个 Channel 对象。

',2))])}const N=o(u,[["render",P]]);export{S as __pageData,N as default}; diff --git a/assets/zh-CN_resources_channel.md.BTvowY65.lean.js b/assets/zh-CN_resources_channel.md.BTvowY65.lean.js new file mode 100644 index 0000000..ac50acb --- /dev/null +++ b/assets/zh-CN_resources_channel.md.BTvowY65.lean.js @@ -0,0 +1 @@ +import{_ as o,x as h,a7 as r,m as d,y as n,k as l,W as a,Q as i,h as s}from"./chunks/framework.K8kzz9Vz.js";const S=JSON.parse('{"title":"频道 (Channel)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/channel.md","filePath":"zh-CN/resources/channel.md"}'),u={name:"zh-CN/resources/channel.md"},b={class:"route"},p={class:"route"},f={class:"route"},q={class:"route"},m={class:"route"},x={id:"禁言群组频道",tabindex:"-1"},y={class:"route"},g={class:"route"};function P(k,t,C,I,T,D){const e=i("badge");return s(),h("div",null,[t[18]||(t[18]=r('

频道 (Channel)

类型定义

Channel

字段类型描述
idstring频道 ID
typeChannelType频道类型
namestring?频道名称
parent_idstring?父频道 ID

ChannelType

名称描述
TEXT0文本频道
DIRECT1私聊频道
CATEGORY2分类频道
VOICE3语音频道

API

获取群组频道

',8)),d("blockquote",b,[n(e,null,{default:l(()=>t[0]||(t[0]=[a("POST")])),_:1}),t[1]||(t[1]=d("code",null,"/channel.get",-1))]),t[19]||(t[19]=r('
字段类型描述
channel_idstring频道 ID

根据 ID 获取频道。返回一个 Channel 对象。

获取群组频道列表

',3)),d("blockquote",p,[n(e,null,{default:l(()=>t[2]||(t[2]=[a("POST")])),_:1}),t[3]||(t[3]=d("code",null,"/channel.list",-1))]),t[20]||(t[20]=r('
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群组中的全部频道。返回一个 Channel分页列表

创建群组频道

',3)),d("blockquote",f,[n(e,null,{default:l(()=>t[4]||(t[4]=[a("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/channel.create",-1))]),t[21]||(t[21]=r('
字段类型描述
guild_idstring群组 ID
dataChannel频道数据

创建群组频道。返回一个 Channel 对象。

修改群组频道

',3)),d("blockquote",q,[n(e,null,{default:l(()=>t[6]||(t[6]=[a("POST")])),_:1}),t[7]||(t[7]=d("code",null,"/channel.update",-1))]),t[22]||(t[22]=r('
字段类型描述
channel_idstring频道 ID
dataChannel频道数据

修改群组频道。

删除群组频道

',3)),d("blockquote",m,[n(e,null,{default:l(()=>t[8]||(t[8]=[a("POST")])),_:1}),t[9]||(t[9]=d("code",null,"/channel.delete",-1))]),t[23]||(t[23]=d("table",{tabindex:"0"},[d("thead",null,[d("tr",null,[d("th",null,"字段"),d("th",null,"类型"),d("th",null,"描述")])]),d("tbody",null,[d("tr",null,[d("td",null,"channel_id"),d("td",null,"string"),d("td",null,"频道 ID")])])],-1)),t[24]||(t[24]=d("p",null,"删除群组频道。",-1)),d("h3",x,[t[11]||(t[11]=a("禁言群组频道 ")),n(e,{type:"warning"},{default:l(()=>t[10]||(t[10]=[a("实验性")])),_:1}),t[12]||(t[12]=a()),t[13]||(t[13]=d("a",{class:"header-anchor",href:"#禁言群组频道","aria-label":'Permalink to "禁言群组频道 实验性"'},"​",-1))]),d("blockquote",y,[n(e,null,{default:l(()=>t[14]||(t[14]=[a("POST")])),_:1}),t[15]||(t[15]=d("code",null,"/channel.mute",-1))]),t[25]||(t[25]=r('
字段类型描述
channel_idstring频道 ID
durationnumber禁言时长 (毫秒)

禁言群组频道。如果传入的禁言时长为 0 则表示解除禁言。

创建私聊频道

',3)),d("blockquote",g,[n(e,null,{default:l(()=>t[16]||(t[16]=[a("POST")])),_:1}),t[17]||(t[17]=d("code",null,"/user.channel.create",-1))]),t[26]||(t[26]=r('
字段类型描述
user_idstring用户 ID
guild_idstring?群组 ID

创建一个私聊频道。返回一个 Channel 对象。

',2))])}const N=o(u,[["render",P]]);export{S as __pageData,N as default}; diff --git a/assets/zh-CN_resources_guild.md.D0qULpBF.js b/assets/zh-CN_resources_guild.md.D0qULpBF.js new file mode 100644 index 0000000..790d7ec --- /dev/null +++ b/assets/zh-CN_resources_guild.md.D0qULpBF.js @@ -0,0 +1 @@ +import{_ as i,x as u,a7 as a,m as d,y as r,k as l,Q as h,h as s,W as o}from"./chunks/framework.K8kzz9Vz.js";const v=JSON.parse('{"title":"群组 (Guild)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/guild.md","filePath":"zh-CN/resources/guild.md"}'),n={name:"zh-CN/resources/guild.md"},b={class:"route"},g={class:"route"},p={class:"route"};function m(q,t,c,f,x,P){const e=h("badge");return s(),u("div",null,[t[6]||(t[6]=a('

群组 (Guild)

类型定义

Guild

字段类型描述
idstring群组 ID
namestring?群组名称
avatarstring?群组头像

API

获取群组

',6)),d("blockquote",b,[r(e,null,{default:l(()=>t[0]||(t[0]=[o("POST")])),_:1}),t[1]||(t[1]=d("code",null,"/guild.get",-1))]),t[7]||(t[7]=a('
字段类型描述
guild_idstring群组 ID

根据 ID 获取。返回一个 Guild 对象。

获取群组列表

',3)),d("blockquote",g,[r(e,null,{default:l(()=>t[2]||(t[2]=[o("POST")])),_:1}),t[3]||(t[3]=d("code",null,"/guild.list",-1))]),t[8]||(t[8]=a('
字段类型描述
nextstring?分页令牌

获取当前用户加入的全部群组。返回一个 Guild分页列表

处理群组邀请

',3)),d("blockquote",p,[r(e,null,{default:l(()=>t[4]||(t[4]=[o("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/guild.approve",-1))]),t[9]||(t[9]=a('
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring备注信息

处理来自群组的邀请。

事件

guild-added

加入群组时触发。必需资源:guild

guild-updated

群组被修改时触发。必需资源:guild

guild-removed

退出群组时触发。必需资源:guild

guild-request

接收到新的入群邀请时触发。必需资源:guild

',11))])}const y=i(n,[["render",m]]);export{v as __pageData,y as default}; diff --git a/assets/zh-CN_resources_guild.md.D0qULpBF.lean.js b/assets/zh-CN_resources_guild.md.D0qULpBF.lean.js new file mode 100644 index 0000000..790d7ec --- /dev/null +++ b/assets/zh-CN_resources_guild.md.D0qULpBF.lean.js @@ -0,0 +1 @@ +import{_ as i,x as u,a7 as a,m as d,y as r,k as l,Q as h,h as s,W as o}from"./chunks/framework.K8kzz9Vz.js";const v=JSON.parse('{"title":"群组 (Guild)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/guild.md","filePath":"zh-CN/resources/guild.md"}'),n={name:"zh-CN/resources/guild.md"},b={class:"route"},g={class:"route"},p={class:"route"};function m(q,t,c,f,x,P){const e=h("badge");return s(),u("div",null,[t[6]||(t[6]=a('

群组 (Guild)

类型定义

Guild

字段类型描述
idstring群组 ID
namestring?群组名称
avatarstring?群组头像

API

获取群组

',6)),d("blockquote",b,[r(e,null,{default:l(()=>t[0]||(t[0]=[o("POST")])),_:1}),t[1]||(t[1]=d("code",null,"/guild.get",-1))]),t[7]||(t[7]=a('
字段类型描述
guild_idstring群组 ID

根据 ID 获取。返回一个 Guild 对象。

获取群组列表

',3)),d("blockquote",g,[r(e,null,{default:l(()=>t[2]||(t[2]=[o("POST")])),_:1}),t[3]||(t[3]=d("code",null,"/guild.list",-1))]),t[8]||(t[8]=a('
字段类型描述
nextstring?分页令牌

获取当前用户加入的全部群组。返回一个 Guild分页列表

处理群组邀请

',3)),d("blockquote",p,[r(e,null,{default:l(()=>t[4]||(t[4]=[o("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/guild.approve",-1))]),t[9]||(t[9]=a('
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring备注信息

处理来自群组的邀请。

事件

guild-added

加入群组时触发。必需资源:guild

guild-updated

群组被修改时触发。必需资源:guild

guild-removed

退出群组时触发。必需资源:guild

guild-request

接收到新的入群邀请时触发。必需资源:guild

',11))])}const y=i(n,[["render",m]]);export{v as __pageData,y as default}; diff --git a/assets/zh-CN_resources_interaction.md.CDJkLvci.js b/assets/zh-CN_resources_interaction.md.CDJkLvci.js new file mode 100644 index 0000000..6045481 --- /dev/null +++ b/assets/zh-CN_resources_interaction.md.CDJkLvci.js @@ -0,0 +1 @@ +import{_ as r,x as n,m as e,W as a,y as d,k as i,a7 as s,Q as c,h as l}from"./chunks/framework.K8kzz9Vz.js";const q=JSON.parse('{"title":"交互 (Interaction) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/interaction.md","filePath":"zh-CN/resources/interaction.md"}'),h={name:"zh-CN/resources/interaction.md"},b={id:"交互",tabindex:"-1"};function u(m,t,p,f,g,x){const o=c("badge");return l(),n("div",null,[e("h1",b,[t[1]||(t[1]=a("交互 (Interaction) ")),d(o,{type:"warning"},{default:i(()=>t[0]||(t[0]=[a("实验性")])),_:1}),t[2]||(t[2]=a()),t[3]||(t[3]=e("a",{class:"header-anchor",href:"#交互","aria-label":'Permalink to "交互 (Interaction) 实验性"'},"​",-1))]),t[4]||(t[4]=s('

TIP

交互功能主要通过机器人提供,并由用户在聊天应用中触发。如果你要实现或接入的聊天平台不支持机器人相关功能,那么可以直接忽略本节。

类型定义

Argv

字段类型描述
namestring指令名称
argumentsany[]参数
optionsobject选项

Button

字段类型描述
idstring按钮 ID

事件

interaction/button

类型为 action 的按钮被点击时触发。必需资源:button

interaction/command

调用斜线指令时触发。资源 argvmessage 中至少包含其一。

TIP

许多平台都支持斜线指令,但它们的实现方式各不相同。如果平台的斜线指令仅仅提供在前端,机器人无法直接判断一个事件是否为斜线指令调用,那么直接实现为普通消息事件即可。

',12))])}const v=r(h,[["render",u]]);export{q as __pageData,v as default}; diff --git a/assets/zh-CN_resources_interaction.md.CDJkLvci.lean.js b/assets/zh-CN_resources_interaction.md.CDJkLvci.lean.js new file mode 100644 index 0000000..6045481 --- /dev/null +++ b/assets/zh-CN_resources_interaction.md.CDJkLvci.lean.js @@ -0,0 +1 @@ +import{_ as r,x as n,m as e,W as a,y as d,k as i,a7 as s,Q as c,h as l}from"./chunks/framework.K8kzz9Vz.js";const q=JSON.parse('{"title":"交互 (Interaction) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/interaction.md","filePath":"zh-CN/resources/interaction.md"}'),h={name:"zh-CN/resources/interaction.md"},b={id:"交互",tabindex:"-1"};function u(m,t,p,f,g,x){const o=c("badge");return l(),n("div",null,[e("h1",b,[t[1]||(t[1]=a("交互 (Interaction) ")),d(o,{type:"warning"},{default:i(()=>t[0]||(t[0]=[a("实验性")])),_:1}),t[2]||(t[2]=a()),t[3]||(t[3]=e("a",{class:"header-anchor",href:"#交互","aria-label":'Permalink to "交互 (Interaction) 实验性"'},"​",-1))]),t[4]||(t[4]=s('

TIP

交互功能主要通过机器人提供,并由用户在聊天应用中触发。如果你要实现或接入的聊天平台不支持机器人相关功能,那么可以直接忽略本节。

类型定义

Argv

字段类型描述
namestring指令名称
argumentsany[]参数
optionsobject选项

Button

字段类型描述
idstring按钮 ID

事件

interaction/button

类型为 action 的按钮被点击时触发。必需资源:button

interaction/command

调用斜线指令时触发。资源 argvmessage 中至少包含其一。

TIP

许多平台都支持斜线指令,但它们的实现方式各不相同。如果平台的斜线指令仅仅提供在前端,机器人无法直接判断一个事件是否为斜线指令调用,那么直接实现为普通消息事件即可。

',12))])}const v=r(h,[["render",u]]);export{q as __pageData,v as default}; diff --git a/assets/zh-CN_resources_login.md.C353E7cy.js b/assets/zh-CN_resources_login.md.C353E7cy.js new file mode 100644 index 0000000..fe307c5 --- /dev/null +++ b/assets/zh-CN_resources_login.md.C353E7cy.js @@ -0,0 +1 @@ +import{_ as r,x as i,a7 as o,m as t,W as d,y as n,k as a,Q as s,h as u}from"./chunks/framework.K8kzz9Vz.js";const P=JSON.parse('{"title":"登录信息 (Login)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/login.md","filePath":"zh-CN/resources/login.md"}'),g={name:"zh-CN/resources/login.md"},p={tabindex:"0"},h={class:"route"};function b(m,l,f,c,q,k){const e=s("badge");return u(),i("div",null,[l[14]||(l[14]=o('

登录信息 (Login)

类型定义

Login

',3)),t("table",p,[l[11]||(l[11]=t("thead",null,[t("tr",null,[t("th",null,"字段"),t("th",null,"类型"),t("th",null,"描述")])],-1)),t("tbody",null,[t("tr",null,[l[4]||(l[4]=t("td",null,[t("code",null,"sn")],-1)),l[5]||(l[5]=t("td",null,"string",-1)),t("td",null,[l[1]||(l[1]=d("序列号")),l[2]||(l[2]=t("sup",null,[t("a",{href:"#login-sn"},"[1]")],-1)),l[3]||(l[3]=d()),n(e,{type:"warning"},{default:a(()=>l[0]||(l[0]=[d("实验性")])),_:1})])]),l[6]||(l[6]=t("tr",null,[t("td",null,[t("code",null,"adapter")]),t("td",null,"string"),t("td",null,[t("a",{href:"./../advanced/internal.html#platform-adapter"},"适配器名称")])],-1)),l[7]||(l[7]=t("tr",null,[t("td",null,[t("code",null,"platform")]),t("td",null,"string?"),t("td",null,"平台名称")],-1)),l[8]||(l[8]=t("tr",null,[t("td",null,[t("code",null,"user")]),t("td",null,[t("a",{href:"./user.html"},"User"),d("?")]),t("td",null,[d("用户对象"),t("sup",null,[t("a",{href:"#login-sn"},"[1]")])])],-1)),l[9]||(l[9]=t("tr",null,[t("td",null,[t("code",null,"status")]),t("td",null,[t("a",{href:"#loginstatus"},"LoginStatus"),d("?")]),t("td",null,"登录状态")],-1)),l[10]||(l[10]=t("tr",null,[t("td",null,[t("code",null,"features")]),t("td",null,"string[]?"),t("td",null,[t("a",{href:"./../protocol/api.html#平台特性"},"平台特性"),d(" 列表")])],-1))])]),l[15]||(l[15]=o('

TIP

[1] 关于序列号

login.sn 仅用于标识 Login 对象,与平台逻辑无关 (意味着任何平台相关的 API 调用都不需要传入这个 sn),也不进行持久化 (意味着两次连接中同一个登录号的 sn 可能是不同的,不同登录号的 sn 可能是相同的)。请尤其注意与 login.user.id 区分。

此外,对于桥接场景,则还需要对这个 ID 进行映射。具体的映射方式请参见 桥接

TIP

[2] 登录信息中的用户

login.user 并不一定是真实存在的平台用户,也可以是平台分配的机器人或者应用身份。

LoginStatus

名称描述
OFFLINE0离线
ONLINE1在线
CONNECT2连接中
DISCONNECT3断开连接
RECONNECT4重新连接

API

获取登录信息

',6)),t("blockquote",h,[n(e,null,{default:a(()=>l[12]||(l[12]=[d("POST")])),_:1}),l[13]||(l[13]=t("code",null,"/login.get",-1))]),l[16]||(l[16]=o('

获取登录信息。返回一个 Login 对象。

事件

login-added

登录被创建时触发。必需资源:login

login-removed

登录被删除时触发。必需资源:login

login-updated

登录信息更新时触发。必需资源:login

',8))])}const N=r(g,[["render",b]]);export{P as __pageData,N as default}; diff --git a/assets/zh-CN_resources_login.md.C353E7cy.lean.js b/assets/zh-CN_resources_login.md.C353E7cy.lean.js new file mode 100644 index 0000000..fe307c5 --- /dev/null +++ b/assets/zh-CN_resources_login.md.C353E7cy.lean.js @@ -0,0 +1 @@ +import{_ as r,x as i,a7 as o,m as t,W as d,y as n,k as a,Q as s,h as u}from"./chunks/framework.K8kzz9Vz.js";const P=JSON.parse('{"title":"登录信息 (Login)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/login.md","filePath":"zh-CN/resources/login.md"}'),g={name:"zh-CN/resources/login.md"},p={tabindex:"0"},h={class:"route"};function b(m,l,f,c,q,k){const e=s("badge");return u(),i("div",null,[l[14]||(l[14]=o('

登录信息 (Login)

类型定义

Login

',3)),t("table",p,[l[11]||(l[11]=t("thead",null,[t("tr",null,[t("th",null,"字段"),t("th",null,"类型"),t("th",null,"描述")])],-1)),t("tbody",null,[t("tr",null,[l[4]||(l[4]=t("td",null,[t("code",null,"sn")],-1)),l[5]||(l[5]=t("td",null,"string",-1)),t("td",null,[l[1]||(l[1]=d("序列号")),l[2]||(l[2]=t("sup",null,[t("a",{href:"#login-sn"},"[1]")],-1)),l[3]||(l[3]=d()),n(e,{type:"warning"},{default:a(()=>l[0]||(l[0]=[d("实验性")])),_:1})])]),l[6]||(l[6]=t("tr",null,[t("td",null,[t("code",null,"adapter")]),t("td",null,"string"),t("td",null,[t("a",{href:"./../advanced/internal.html#platform-adapter"},"适配器名称")])],-1)),l[7]||(l[7]=t("tr",null,[t("td",null,[t("code",null,"platform")]),t("td",null,"string?"),t("td",null,"平台名称")],-1)),l[8]||(l[8]=t("tr",null,[t("td",null,[t("code",null,"user")]),t("td",null,[t("a",{href:"./user.html"},"User"),d("?")]),t("td",null,[d("用户对象"),t("sup",null,[t("a",{href:"#login-sn"},"[1]")])])],-1)),l[9]||(l[9]=t("tr",null,[t("td",null,[t("code",null,"status")]),t("td",null,[t("a",{href:"#loginstatus"},"LoginStatus"),d("?")]),t("td",null,"登录状态")],-1)),l[10]||(l[10]=t("tr",null,[t("td",null,[t("code",null,"features")]),t("td",null,"string[]?"),t("td",null,[t("a",{href:"./../protocol/api.html#平台特性"},"平台特性"),d(" 列表")])],-1))])]),l[15]||(l[15]=o('

TIP

[1] 关于序列号

login.sn 仅用于标识 Login 对象,与平台逻辑无关 (意味着任何平台相关的 API 调用都不需要传入这个 sn),也不进行持久化 (意味着两次连接中同一个登录号的 sn 可能是不同的,不同登录号的 sn 可能是相同的)。请尤其注意与 login.user.id 区分。

此外,对于桥接场景,则还需要对这个 ID 进行映射。具体的映射方式请参见 桥接

TIP

[2] 登录信息中的用户

login.user 并不一定是真实存在的平台用户,也可以是平台分配的机器人或者应用身份。

LoginStatus

名称描述
OFFLINE0离线
ONLINE1在线
CONNECT2连接中
DISCONNECT3断开连接
RECONNECT4重新连接

API

获取登录信息

',6)),t("blockquote",h,[n(e,null,{default:a(()=>l[12]||(l[12]=[d("POST")])),_:1}),l[13]||(l[13]=t("code",null,"/login.get",-1))]),l[16]||(l[16]=o('

获取登录信息。返回一个 Login 对象。

事件

login-added

登录被创建时触发。必需资源:login

login-removed

登录被删除时触发。必需资源:login

login-updated

登录信息更新时触发。必需资源:login

',8))])}const N=r(g,[["render",b]]);export{P as __pageData,N as default}; diff --git a/assets/zh-CN_resources_member.md.DF6hYtD8.js b/assets/zh-CN_resources_member.md.DF6hYtD8.js new file mode 100644 index 0000000..73e435d --- /dev/null +++ b/assets/zh-CN_resources_member.md.DF6hYtD8.js @@ -0,0 +1 @@ +import{_ as i,x as u,a7 as a,m as e,y as o,k as l,W as d,Q as m,h as n}from"./chunks/framework.K8kzz9Vz.js";const D=JSON.parse('{"title":"群组成员 (GuildMember)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/member.md","filePath":"zh-CN/resources/member.md"}'),s={name:"zh-CN/resources/member.md"},b={class:"route"},h={class:"route"},g={class:"route"},p={id:"禁言群组成员",tabindex:"-1"},q={class:"route"},f={class:"route"};function x(k,t,c,P,y,v){const r=m("badge");return n(),u("div",null,[t[14]||(t[14]=a('

群组成员 (GuildMember)

类型定义

GuildMember

字段类型描述
userUser?用户对象
nickstring?用户在群组中的名称
avatarstring?用户在群组中的头像
joined_atnumber?加入时间

API

获取群组成员

',6)),e("blockquote",b,[o(r,null,{default:l(()=>t[0]||(t[0]=[d("POST")])),_:1}),t[1]||(t[1]=e("code",null,"/guild.member.get",-1))]),t[15]||(t[15]=a('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID

获取群成员信息。返回一个 GuildMember 对象。

获取群组成员列表

',3)),e("blockquote",h,[o(r,null,{default:l(()=>t[2]||(t[2]=[d("POST")])),_:1}),t[3]||(t[3]=e("code",null,"/guild.member.list",-1))]),t[16]||(t[16]=a('
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群成员列表。返回一个 GuildMember分页列表

踢出群组成员

',3)),e("blockquote",g,[o(r,null,{default:l(()=>t[4]||(t[4]=[d("POST")])),_:1}),t[5]||(t[5]=e("code",null,"/guild.member.kick",-1))]),t[17]||(t[17]=a('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
permanentboolean?是否永久踢出 (无法再次加入群组)

将某个用户踢出群组。

',2)),e("h3",p,[t[7]||(t[7]=d("禁言群组成员 ")),o(r,{type:"warning"},{default:l(()=>t[6]||(t[6]=[d("实验性")])),_:1}),t[8]||(t[8]=d()),t[9]||(t[9]=e("a",{class:"header-anchor",href:"#禁言群组成员","aria-label":'Permalink to "禁言群组成员 实验性"'},"​",-1))]),e("blockquote",q,[o(r,null,{default:l(()=>t[10]||(t[10]=[d("POST")])),_:1}),t[11]||(t[11]=e("code",null,"/guild.member.mute",-1))]),t[18]||(t[18]=a('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
durationnumber禁言时长 (毫秒)

将某个用户禁言。如果传入的禁言时长为 0 则表示解除禁言。

通过群组成员申请

',3)),e("blockquote",f,[o(r,null,{default:l(()=>t[12]||(t[12]=[d("POST")])),_:1}),t[13]||(t[13]=e("code",null,"/guild.member.approve",-1))]),t[19]||(t[19]=a('
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring?备注信息

处理加群请求。

事件

guild-member-added

群组成员增加时触发。必需资源:guildmemberuser

guild-member-updated

群组成员信息更新时触发。必需资源:guildmemberuser

guild-member-removed

群组成员移除时触发。必需资源:guildmemberuser

guild-member-request

接收到新的加群请求时触发。必需资源:guildmemberuser

',11))])}const N=i(s,[["render",x]]);export{D as __pageData,N as default}; diff --git a/assets/zh-CN_resources_member.md.DF6hYtD8.lean.js b/assets/zh-CN_resources_member.md.DF6hYtD8.lean.js new file mode 100644 index 0000000..73e435d --- /dev/null +++ b/assets/zh-CN_resources_member.md.DF6hYtD8.lean.js @@ -0,0 +1 @@ +import{_ as i,x as u,a7 as a,m as e,y as o,k as l,W as d,Q as m,h as n}from"./chunks/framework.K8kzz9Vz.js";const D=JSON.parse('{"title":"群组成员 (GuildMember)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/member.md","filePath":"zh-CN/resources/member.md"}'),s={name:"zh-CN/resources/member.md"},b={class:"route"},h={class:"route"},g={class:"route"},p={id:"禁言群组成员",tabindex:"-1"},q={class:"route"},f={class:"route"};function x(k,t,c,P,y,v){const r=m("badge");return n(),u("div",null,[t[14]||(t[14]=a('

群组成员 (GuildMember)

类型定义

GuildMember

字段类型描述
userUser?用户对象
nickstring?用户在群组中的名称
avatarstring?用户在群组中的头像
joined_atnumber?加入时间

API

获取群组成员

',6)),e("blockquote",b,[o(r,null,{default:l(()=>t[0]||(t[0]=[d("POST")])),_:1}),t[1]||(t[1]=e("code",null,"/guild.member.get",-1))]),t[15]||(t[15]=a('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID

获取群成员信息。返回一个 GuildMember 对象。

获取群组成员列表

',3)),e("blockquote",h,[o(r,null,{default:l(()=>t[2]||(t[2]=[d("POST")])),_:1}),t[3]||(t[3]=e("code",null,"/guild.member.list",-1))]),t[16]||(t[16]=a('
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群成员列表。返回一个 GuildMember分页列表

踢出群组成员

',3)),e("blockquote",g,[o(r,null,{default:l(()=>t[4]||(t[4]=[d("POST")])),_:1}),t[5]||(t[5]=e("code",null,"/guild.member.kick",-1))]),t[17]||(t[17]=a('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
permanentboolean?是否永久踢出 (无法再次加入群组)

将某个用户踢出群组。

',2)),e("h3",p,[t[7]||(t[7]=d("禁言群组成员 ")),o(r,{type:"warning"},{default:l(()=>t[6]||(t[6]=[d("实验性")])),_:1}),t[8]||(t[8]=d()),t[9]||(t[9]=e("a",{class:"header-anchor",href:"#禁言群组成员","aria-label":'Permalink to "禁言群组成员 实验性"'},"​",-1))]),e("blockquote",q,[o(r,null,{default:l(()=>t[10]||(t[10]=[d("POST")])),_:1}),t[11]||(t[11]=e("code",null,"/guild.member.mute",-1))]),t[18]||(t[18]=a('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
durationnumber禁言时长 (毫秒)

将某个用户禁言。如果传入的禁言时长为 0 则表示解除禁言。

通过群组成员申请

',3)),e("blockquote",f,[o(r,null,{default:l(()=>t[12]||(t[12]=[d("POST")])),_:1}),t[13]||(t[13]=e("code",null,"/guild.member.approve",-1))]),t[19]||(t[19]=a('
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring?备注信息

处理加群请求。

事件

guild-member-added

群组成员增加时触发。必需资源:guildmemberuser

guild-member-updated

群组成员信息更新时触发。必需资源:guildmemberuser

guild-member-removed

群组成员移除时触发。必需资源:guildmemberuser

guild-member-request

接收到新的加群请求时触发。必需资源:guildmemberuser

',11))])}const N=i(s,[["render",x]]);export{D as __pageData,N as default}; diff --git a/assets/zh-CN_resources_message.md.D-JsPVge.js b/assets/zh-CN_resources_message.md.D-JsPVge.js new file mode 100644 index 0000000..dd978ee --- /dev/null +++ b/assets/zh-CN_resources_message.md.D-JsPVge.js @@ -0,0 +1 @@ +import{_ as l,x as i,a7 as d,m as e,y as r,k as s,Q as n,h,W as o}from"./chunks/framework.K8kzz9Vz.js";const D=JSON.parse('{"title":"消息 (Message)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/message.md","filePath":"zh-CN/resources/message.md"}'),m={name:"zh-CN/resources/message.md"},c={class:"route"},u={class:"route"},g={class:"route"},b={class:"route"},p={class:"route"};function f(q,t,x,P,k,y){const a=n("badge");return h(),i("div",null,[t[10]||(t[10]=d('

消息 (Message)

类型定义

Message

字段类型描述
idstring消息 ID
contentstring消息内容
channelChannel?频道对象
guildGuild?群组对象
memberMember?群组成员对象
userUser?用户对象
created_atnumber?消息发送的时间戳
updated_atnumber?消息修改的时间戳

API

发送消息

',6)),e("blockquote",c,[r(a,null,{default:s(()=>t[0]||(t[0]=[o("POST")])),_:1}),t[1]||(t[1]=e("code",null,"/message.create",-1))]),t[11]||(t[11]=d('
字段类型描述
channel_idstring频道 ID
contentstring消息内容

发送消息。返回一个 Message 对象构成的数组。

获取消息

',3)),e("blockquote",u,[r(a,null,{default:s(()=>t[2]||(t[2]=[o("POST")])),_:1}),t[3]||(t[3]=e("code",null,"/message.get",-1))]),t[12]||(t[12]=d('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID

获取特定消息。返回一个 Message 对象。必需资源:channeluser

撤回消息

',3)),e("blockquote",g,[r(a,null,{default:s(()=>t[4]||(t[4]=[o("POST")])),_:1}),t[5]||(t[5]=e("code",null,"/message.delete",-1))]),t[13]||(t[13]=d('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID

撤回特定消息。

编辑消息

',3)),e("blockquote",b,[r(a,null,{default:s(()=>t[6]||(t[6]=[o("POST")])),_:1}),t[7]||(t[7]=e("code",null,"/message.update",-1))]),t[14]||(t[14]=d('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
contentstring消息内容

编辑特定消息。

获取消息列表

',3)),e("blockquote",p,[r(a,null,{default:s(()=>t[8]||(t[8]=[o("POST")])),_:1}),t[9]||(t[9]=e("code",null,"/message.list",-1))]),t[15]||(t[15]=d('
字段类型描述
channel_idstring频道 ID
nextstring?分页令牌
directionDirection?查询方向
limitnumber?消息数量限制
orderOrder?对结果排序

获取频道消息列表。返回一个 Message双向分页列表。必需资源:user

  • next 参数默认值为空,表示从最新消息开始查询。此时 direction 参数只能为 before
  • direction 参数默认为 before
  • order 参数默认为 asc (无论查询方向)。
  • limit 参数的默认值与平台默认值保持一致。如果平台 API 没有设定默认值,则可以自行设定,推荐值为 50。如果用户传入值超出平台要求的上限,则应当改为使用平台的上限值,而不是返回错误。开发者应当使用返回值中 prevnext 的存在性判断是否有更多数据,而非依赖于返回值中 data 的长度。

事件

message-created

当消息被创建时触发。必需资源:channelmessageuser

message-updated

当消息被编辑时触发。必需资源:channelmessageuser

message-deleted

当消息被删除时触发。必需资源:channelmessageuser

',10))])}const M=l(m,[["render",f]]);export{D as __pageData,M as default}; diff --git a/assets/zh-CN_resources_message.md.D-JsPVge.lean.js b/assets/zh-CN_resources_message.md.D-JsPVge.lean.js new file mode 100644 index 0000000..dd978ee --- /dev/null +++ b/assets/zh-CN_resources_message.md.D-JsPVge.lean.js @@ -0,0 +1 @@ +import{_ as l,x as i,a7 as d,m as e,y as r,k as s,Q as n,h,W as o}from"./chunks/framework.K8kzz9Vz.js";const D=JSON.parse('{"title":"消息 (Message)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/message.md","filePath":"zh-CN/resources/message.md"}'),m={name:"zh-CN/resources/message.md"},c={class:"route"},u={class:"route"},g={class:"route"},b={class:"route"},p={class:"route"};function f(q,t,x,P,k,y){const a=n("badge");return h(),i("div",null,[t[10]||(t[10]=d('

消息 (Message)

类型定义

Message

字段类型描述
idstring消息 ID
contentstring消息内容
channelChannel?频道对象
guildGuild?群组对象
memberMember?群组成员对象
userUser?用户对象
created_atnumber?消息发送的时间戳
updated_atnumber?消息修改的时间戳

API

发送消息

',6)),e("blockquote",c,[r(a,null,{default:s(()=>t[0]||(t[0]=[o("POST")])),_:1}),t[1]||(t[1]=e("code",null,"/message.create",-1))]),t[11]||(t[11]=d('
字段类型描述
channel_idstring频道 ID
contentstring消息内容

发送消息。返回一个 Message 对象构成的数组。

获取消息

',3)),e("blockquote",u,[r(a,null,{default:s(()=>t[2]||(t[2]=[o("POST")])),_:1}),t[3]||(t[3]=e("code",null,"/message.get",-1))]),t[12]||(t[12]=d('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID

获取特定消息。返回一个 Message 对象。必需资源:channeluser

撤回消息

',3)),e("blockquote",g,[r(a,null,{default:s(()=>t[4]||(t[4]=[o("POST")])),_:1}),t[5]||(t[5]=e("code",null,"/message.delete",-1))]),t[13]||(t[13]=d('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID

撤回特定消息。

编辑消息

',3)),e("blockquote",b,[r(a,null,{default:s(()=>t[6]||(t[6]=[o("POST")])),_:1}),t[7]||(t[7]=e("code",null,"/message.update",-1))]),t[14]||(t[14]=d('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
contentstring消息内容

编辑特定消息。

获取消息列表

',3)),e("blockquote",p,[r(a,null,{default:s(()=>t[8]||(t[8]=[o("POST")])),_:1}),t[9]||(t[9]=e("code",null,"/message.list",-1))]),t[15]||(t[15]=d('
字段类型描述
channel_idstring频道 ID
nextstring?分页令牌
directionDirection?查询方向
limitnumber?消息数量限制
orderOrder?对结果排序

获取频道消息列表。返回一个 Message双向分页列表。必需资源:user

  • next 参数默认值为空,表示从最新消息开始查询。此时 direction 参数只能为 before
  • direction 参数默认为 before
  • order 参数默认为 asc (无论查询方向)。
  • limit 参数的默认值与平台默认值保持一致。如果平台 API 没有设定默认值,则可以自行设定,推荐值为 50。如果用户传入值超出平台要求的上限,则应当改为使用平台的上限值,而不是返回错误。开发者应当使用返回值中 prevnext 的存在性判断是否有更多数据,而非依赖于返回值中 data 的长度。

事件

message-created

当消息被创建时触发。必需资源:channelmessageuser

message-updated

当消息被编辑时触发。必需资源:channelmessageuser

message-deleted

当消息被删除时触发。必需资源:channelmessageuser

',10))])}const M=l(m,[["render",f]]);export{D as __pageData,M as default}; diff --git a/assets/zh-CN_resources_reaction.md.DOsNec4_.js b/assets/zh-CN_resources_reaction.md.DOsNec4_.js new file mode 100644 index 0000000..d5a1051 --- /dev/null +++ b/assets/zh-CN_resources_reaction.md.DOsNec4_.js @@ -0,0 +1 @@ +import{_ as i,x as l,m as d,W as e,y as r,k as o,a7 as n,Q as s,h}from"./chunks/framework.K8kzz9Vz.js";const D=JSON.parse('{"title":"表态 (Reaction) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/reaction.md","filePath":"zh-CN/resources/reaction.md"}'),b={name:"zh-CN/resources/reaction.md"},u={id:"表态",tabindex:"-1"},m={class:"route"},p={class:"route"},g={class:"route"},f={class:"route"};function x(P,t,k,q,c,I){const a=s("badge");return h(),l("div",null,[d("h1",u,[t[1]||(t[1]=e("表态 (Reaction) ")),r(a,{type:"warning"},{default:o(()=>t[0]||(t[0]=[e("实验性")])),_:1}),t[2]||(t[2]=e()),t[3]||(t[3]=d("a",{class:"header-anchor",href:"#表态","aria-label":'Permalink to "表态 (Reaction) 实验性"'},"​",-1))]),t[12]||(t[12]=d("h2",{id:"api",tabindex:"-1"},[e("API "),d("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1)),t[13]||(t[13]=d("h3",{id:"添加表态",tabindex:"-1"},[e("添加表态 "),d("a",{class:"header-anchor",href:"#添加表态","aria-label":'Permalink to "添加表态"'},"​")],-1)),d("blockquote",m,[r(a,null,{default:o(()=>t[4]||(t[4]=[e("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/reaction.create",-1))]),t[14]||(t[14]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称

向特定消息添加表态。

删除表态

',3)),d("blockquote",p,[r(a,null,{default:o(()=>t[6]||(t[6]=[e("POST")])),_:1}),t[7]||(t[7]=d("code",null,"/reaction.delete",-1))]),t[15]||(t[15]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称
user_idstring?用户 ID

从特定消息删除某个用户添加的特定表态。如果没有传入用户 ID 则表示删除自己的表态。

清除表态

',3)),d("blockquote",g,[r(a,null,{default:o(()=>t[8]||(t[8]=[e("POST")])),_:1}),t[9]||(t[9]=d("code",null,"/reaction.clear",-1))]),t[16]||(t[16]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring?表态名称

从特定消息清除某个特定表态。如果没有传入表态名称则表示清除所有表态。

获取表态列表

',3)),d("blockquote",f,[r(a,null,{default:o(()=>t[10]||(t[10]=[e("POST")])),_:1}),t[11]||(t[11]=d("code",null,"/reaction.list",-1))]),t[17]||(t[17]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称
nextstring?分页令牌

获取添加特定消息的特定表态的用户列表。返回一个 User分页列表

事件

reaction-added

当表态被添加时触发。

reaction-removed

当表态被移除时触发。

',7))])}const N=i(b,[["render",x]]);export{D as __pageData,N as default}; diff --git a/assets/zh-CN_resources_reaction.md.DOsNec4_.lean.js b/assets/zh-CN_resources_reaction.md.DOsNec4_.lean.js new file mode 100644 index 0000000..d5a1051 --- /dev/null +++ b/assets/zh-CN_resources_reaction.md.DOsNec4_.lean.js @@ -0,0 +1 @@ +import{_ as i,x as l,m as d,W as e,y as r,k as o,a7 as n,Q as s,h}from"./chunks/framework.K8kzz9Vz.js";const D=JSON.parse('{"title":"表态 (Reaction) 实验性","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/reaction.md","filePath":"zh-CN/resources/reaction.md"}'),b={name:"zh-CN/resources/reaction.md"},u={id:"表态",tabindex:"-1"},m={class:"route"},p={class:"route"},g={class:"route"},f={class:"route"};function x(P,t,k,q,c,I){const a=s("badge");return h(),l("div",null,[d("h1",u,[t[1]||(t[1]=e("表态 (Reaction) ")),r(a,{type:"warning"},{default:o(()=>t[0]||(t[0]=[e("实验性")])),_:1}),t[2]||(t[2]=e()),t[3]||(t[3]=d("a",{class:"header-anchor",href:"#表态","aria-label":'Permalink to "表态 (Reaction) 实验性"'},"​",-1))]),t[12]||(t[12]=d("h2",{id:"api",tabindex:"-1"},[e("API "),d("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"​")],-1)),t[13]||(t[13]=d("h3",{id:"添加表态",tabindex:"-1"},[e("添加表态 "),d("a",{class:"header-anchor",href:"#添加表态","aria-label":'Permalink to "添加表态"'},"​")],-1)),d("blockquote",m,[r(a,null,{default:o(()=>t[4]||(t[4]=[e("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/reaction.create",-1))]),t[14]||(t[14]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称

向特定消息添加表态。

删除表态

',3)),d("blockquote",p,[r(a,null,{default:o(()=>t[6]||(t[6]=[e("POST")])),_:1}),t[7]||(t[7]=d("code",null,"/reaction.delete",-1))]),t[15]||(t[15]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称
user_idstring?用户 ID

从特定消息删除某个用户添加的特定表态。如果没有传入用户 ID 则表示删除自己的表态。

清除表态

',3)),d("blockquote",g,[r(a,null,{default:o(()=>t[8]||(t[8]=[e("POST")])),_:1}),t[9]||(t[9]=d("code",null,"/reaction.clear",-1))]),t[16]||(t[16]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring?表态名称

从特定消息清除某个特定表态。如果没有传入表态名称则表示清除所有表态。

获取表态列表

',3)),d("blockquote",f,[r(a,null,{default:o(()=>t[10]||(t[10]=[e("POST")])),_:1}),t[11]||(t[11]=d("code",null,"/reaction.list",-1))]),t[17]||(t[17]=n('
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称
nextstring?分页令牌

获取添加特定消息的特定表态的用户列表。返回一个 User分页列表

事件

reaction-added

当表态被添加时触发。

reaction-removed

当表态被移除时触发。

',7))])}const N=i(b,[["render",x]]);export{D as __pageData,N as default}; diff --git a/assets/zh-CN_resources_role.md.Cilb3pcM.js b/assets/zh-CN_resources_role.md.Cilb3pcM.js new file mode 100644 index 0000000..a6d0951 --- /dev/null +++ b/assets/zh-CN_resources_role.md.Cilb3pcM.js @@ -0,0 +1 @@ +import{_ as i,x as u,a7 as e,m as d,y as l,k as a,Q as h,h as n,W as o}from"./chunks/framework.K8kzz9Vz.js";const G=JSON.parse('{"title":"群组角色 (GuildRole)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/role.md","filePath":"zh-CN/resources/role.md"}'),s={name:"zh-CN/resources/role.md"},b={class:"route"},g={class:"route"},p={class:"route"},q={class:"route"},f={class:"route"},m={class:"route"};function x(P,t,k,c,y,I){const r=h("badge");return n(),u("div",null,[t[12]||(t[12]=e('

群组角色 (GuildRole)

类型定义

GuildRole

字段类型描述
idstring角色 ID
namestring?角色名称

API

设置群组成员角色

',6)),d("blockquote",b,[l(r,null,{default:a(()=>t[0]||(t[0]=[o("POST")])),_:1}),t[1]||(t[1]=d("code",null,"/guild.member.role.set",-1))]),t[13]||(t[13]=e('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
role_idstring角色 ID

设置群组内用户的角色。

取消群组成员角色

',3)),d("blockquote",g,[l(r,null,{default:a(()=>t[2]||(t[2]=[o("POST")])),_:1}),t[3]||(t[3]=d("code",null,"/guild.member.role.unset",-1))]),t[14]||(t[14]=e('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
role_idstring角色 ID

取消群组内用户的角色。

获取群组角色列表

',3)),d("blockquote",p,[l(r,null,{default:a(()=>t[4]||(t[4]=[o("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/guild.role.list",-1))]),t[15]||(t[15]=e('
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群组角色列表。返回一个 GuildRole分页列表

创建群组角色

',3)),d("blockquote",q,[l(r,null,{default:a(()=>t[6]||(t[6]=[o("POST")])),_:1}),t[7]||(t[7]=d("code",null,"/guild.role.create",-1))]),t[16]||(t[16]=e('
字段类型描述
guild_idstring群组 ID
roleGuildRole角色数据

创建群组角色。返回一个 GuildRole 对象。

修改群组角色

',3)),d("blockquote",f,[l(r,null,{default:a(()=>t[8]||(t[8]=[o("POST")])),_:1}),t[9]||(t[9]=d("code",null,"/guild.role.update",-1))]),t[17]||(t[17]=e('
字段类型描述
guild_idstring群组 ID
role_idstring角色 ID
roleGuildRole角色数据

修改群组角色。

删除群组角色

',3)),d("blockquote",m,[l(r,null,{default:a(()=>t[10]||(t[10]=[o("POST")])),_:1}),t[11]||(t[11]=d("code",null,"/guild.role.delete",-1))]),t[18]||(t[18]=e('
字段类型描述
guild_idstring群组 ID
role_idstring角色 ID

删除群组角色。

事件

guild-role-created

群组角色被创建时触发。必需资源:guildrole

guild-role-updated

群组角色被修改时触发。必需资源:guildrole

guild-role-deleted

群组角色被删除时触发。必需资源:guildrole

',9))])}const R=i(s,[["render",x]]);export{G as __pageData,R as default}; diff --git a/assets/zh-CN_resources_role.md.Cilb3pcM.lean.js b/assets/zh-CN_resources_role.md.Cilb3pcM.lean.js new file mode 100644 index 0000000..a6d0951 --- /dev/null +++ b/assets/zh-CN_resources_role.md.Cilb3pcM.lean.js @@ -0,0 +1 @@ +import{_ as i,x as u,a7 as e,m as d,y as l,k as a,Q as h,h as n,W as o}from"./chunks/framework.K8kzz9Vz.js";const G=JSON.parse('{"title":"群组角色 (GuildRole)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/role.md","filePath":"zh-CN/resources/role.md"}'),s={name:"zh-CN/resources/role.md"},b={class:"route"},g={class:"route"},p={class:"route"},q={class:"route"},f={class:"route"},m={class:"route"};function x(P,t,k,c,y,I){const r=h("badge");return n(),u("div",null,[t[12]||(t[12]=e('

群组角色 (GuildRole)

类型定义

GuildRole

字段类型描述
idstring角色 ID
namestring?角色名称

API

设置群组成员角色

',6)),d("blockquote",b,[l(r,null,{default:a(()=>t[0]||(t[0]=[o("POST")])),_:1}),t[1]||(t[1]=d("code",null,"/guild.member.role.set",-1))]),t[13]||(t[13]=e('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
role_idstring角色 ID

设置群组内用户的角色。

取消群组成员角色

',3)),d("blockquote",g,[l(r,null,{default:a(()=>t[2]||(t[2]=[o("POST")])),_:1}),t[3]||(t[3]=d("code",null,"/guild.member.role.unset",-1))]),t[14]||(t[14]=e('
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
role_idstring角色 ID

取消群组内用户的角色。

获取群组角色列表

',3)),d("blockquote",p,[l(r,null,{default:a(()=>t[4]||(t[4]=[o("POST")])),_:1}),t[5]||(t[5]=d("code",null,"/guild.role.list",-1))]),t[15]||(t[15]=e('
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群组角色列表。返回一个 GuildRole分页列表

创建群组角色

',3)),d("blockquote",q,[l(r,null,{default:a(()=>t[6]||(t[6]=[o("POST")])),_:1}),t[7]||(t[7]=d("code",null,"/guild.role.create",-1))]),t[16]||(t[16]=e('
字段类型描述
guild_idstring群组 ID
roleGuildRole角色数据

创建群组角色。返回一个 GuildRole 对象。

修改群组角色

',3)),d("blockquote",f,[l(r,null,{default:a(()=>t[8]||(t[8]=[o("POST")])),_:1}),t[9]||(t[9]=d("code",null,"/guild.role.update",-1))]),t[17]||(t[17]=e('
字段类型描述
guild_idstring群组 ID
role_idstring角色 ID
roleGuildRole角色数据

修改群组角色。

删除群组角色

',3)),d("blockquote",m,[l(r,null,{default:a(()=>t[10]||(t[10]=[o("POST")])),_:1}),t[11]||(t[11]=d("code",null,"/guild.role.delete",-1))]),t[18]||(t[18]=e('
字段类型描述
guild_idstring群组 ID
role_idstring角色 ID

删除群组角色。

事件

guild-role-created

群组角色被创建时触发。必需资源:guildrole

guild-role-updated

群组角色被修改时触发。必需资源:guildrole

guild-role-deleted

群组角色被删除时触发。必需资源:guildrole

',9))])}const R=i(s,[["render",x]]);export{G as __pageData,R as default}; diff --git a/assets/zh-CN_resources_user.md.D43f7KVt.js b/assets/zh-CN_resources_user.md.D43f7KVt.js new file mode 100644 index 0000000..f55858a --- /dev/null +++ b/assets/zh-CN_resources_user.md.D43f7KVt.js @@ -0,0 +1 @@ +import{_ as n,x as i,a7 as d,m as e,y as r,k as o,Q as l,h,W as s}from"./chunks/framework.K8kzz9Vz.js";const y=JSON.parse('{"title":"用户 (User)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/user.md","filePath":"zh-CN/resources/user.md"}'),u={name:"zh-CN/resources/user.md"},c={class:"route"},b={class:"route"},p={class:"route"};function m(f,t,k,q,x,P){const a=l("badge");return h(),i("div",null,[t[6]||(t[6]=d('

用户 (User)

类型定义

User

字段类型描述
idstring用户 ID
namestring?用户名称[1]
nickstring?用户昵称[1]
avatarstring?用户头像链接
is_botboolean?是否为机器人

TIP

[1] namenick 字段的区别

这两个字段都可以用于标识用户。在一些平台上 (例如 Telegram),一个用户存在多种不同概念的名称,因此 SDK 可以同时设置这两个字段。而另一些平台可能不存在这两个概念的对立关系,此时 SDK 只需要根据语义设置 namenick 中的一个即可。

在应用层实现上,nick 的优先级高于 name,因为昵称更容易被用户识别和理解。如果你正在开发基于 Satori 协议的客户端,在用户名的显示上应当优先使用 nick 字段,只有当 nick 为空时才使用 name 字段。

API

获取用户信息

',7)),e("blockquote",c,[r(a,null,{default:o(()=>t[0]||(t[0]=[s("POST")])),_:1}),t[1]||(t[1]=e("code",null,"/user.get",-1))]),t[7]||(t[7]=d('
字段类型描述
user_idstring用户 ID

获取用户信息。返回一个 User 对象。

获取好友列表

',3)),e("blockquote",b,[r(a,null,{default:o(()=>t[2]||(t[2]=[s("POST")])),_:1}),t[3]||(t[3]=e("code",null,"/friend.list",-1))]),t[8]||(t[8]=d('
字段类型描述
nextstring?分页令牌

获取好友列表。返回一个 User分页列表

处理好友申请

',3)),e("blockquote",p,[r(a,null,{default:o(()=>t[4]||(t[4]=[s("POST")])),_:1}),t[5]||(t[5]=e("code",null,"/friend.approve",-1))]),t[9]||(t[9]=d('
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring?备注信息

处理好友申请。

事件

friend-request

接收到新的好友申请时触发。必需资源:user

',5))])}const v=n(u,[["render",m]]);export{y as __pageData,v as default}; diff --git a/assets/zh-CN_resources_user.md.D43f7KVt.lean.js b/assets/zh-CN_resources_user.md.D43f7KVt.lean.js new file mode 100644 index 0000000..f55858a --- /dev/null +++ b/assets/zh-CN_resources_user.md.D43f7KVt.lean.js @@ -0,0 +1 @@ +import{_ as n,x as i,a7 as d,m as e,y as r,k as o,Q as l,h,W as s}from"./chunks/framework.K8kzz9Vz.js";const y=JSON.parse('{"title":"用户 (User)","description":"","frontmatter":{},"headers":[],"relativePath":"zh-CN/resources/user.md","filePath":"zh-CN/resources/user.md"}'),u={name:"zh-CN/resources/user.md"},c={class:"route"},b={class:"route"},p={class:"route"};function m(f,t,k,q,x,P){const a=l("badge");return h(),i("div",null,[t[6]||(t[6]=d('

用户 (User)

类型定义

User

字段类型描述
idstring用户 ID
namestring?用户名称[1]
nickstring?用户昵称[1]
avatarstring?用户头像链接
is_botboolean?是否为机器人

TIP

[1] namenick 字段的区别

这两个字段都可以用于标识用户。在一些平台上 (例如 Telegram),一个用户存在多种不同概念的名称,因此 SDK 可以同时设置这两个字段。而另一些平台可能不存在这两个概念的对立关系,此时 SDK 只需要根据语义设置 namenick 中的一个即可。

在应用层实现上,nick 的优先级高于 name,因为昵称更容易被用户识别和理解。如果你正在开发基于 Satori 协议的客户端,在用户名的显示上应当优先使用 nick 字段,只有当 nick 为空时才使用 name 字段。

API

获取用户信息

',7)),e("blockquote",c,[r(a,null,{default:o(()=>t[0]||(t[0]=[s("POST")])),_:1}),t[1]||(t[1]=e("code",null,"/user.get",-1))]),t[7]||(t[7]=d('
字段类型描述
user_idstring用户 ID

获取用户信息。返回一个 User 对象。

获取好友列表

',3)),e("blockquote",b,[r(a,null,{default:o(()=>t[2]||(t[2]=[s("POST")])),_:1}),t[3]||(t[3]=e("code",null,"/friend.list",-1))]),t[8]||(t[8]=d('
字段类型描述
nextstring?分页令牌

获取好友列表。返回一个 User分页列表

处理好友申请

',3)),e("blockquote",p,[r(a,null,{default:o(()=>t[4]||(t[4]=[s("POST")])),_:1}),t[5]||(t[5]=e("code",null,"/friend.approve",-1))]),t[9]||(t[9]=d('
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring?备注信息

处理好友申请。

事件

friend-request

接收到新的好友申请时触发。必需资源:user

',5))])}const v=n(u,[["render",m]]);export{y as __pageData,v as default}; diff --git a/en-US/index.html b/en-US/index.html new file mode 100644 index 0000000..28d4932 --- /dev/null +++ b/en-US/index.html @@ -0,0 +1,25 @@ + + + + + + Satori + + + + + + + + + + + + + + +
Skip to content

Satori

THE UNIVERSAL MESSENGER PROTOCOL

+ + + + \ No newline at end of file diff --git a/en-US/introduction.html b/en-US/introduction.html new file mode 100644 index 0000000..29cd920 --- /dev/null +++ b/en-US/introduction.html @@ -0,0 +1,25 @@ + + + + + + Introduction | Satori + + + + + + + + + + + + + + +
Skip to content

Introduction

+ + + + \ No newline at end of file diff --git a/en-US/protocol/api.html b/en-US/protocol/api.html new file mode 100644 index 0000000..2dc2203 --- /dev/null +++ b/en-US/protocol/api.html @@ -0,0 +1,25 @@ + + + + + + HTTP API | Satori + + + + + + + + + + + + + + +
Skip to content

HTTP API

Pagination

Some API may return a list of items. In this case, the response will be a List object:

FIELDTYPEDESCRIPTION
dataarraylist of items
nextstringtoken for the next page

You can use the next token to get the next page of items. If next is nullable, it means that there are no more items.

+ + + + \ No newline at end of file diff --git a/en-US/protocol/index.html b/en-US/protocol/index.html new file mode 100644 index 0000000..7566770 --- /dev/null +++ b/en-US/protocol/index.html @@ -0,0 +1,25 @@ + + + + + + Overview | Satori + + + + + + + + + + + + + + +
Skip to content

Overview

The Satori protocol is designed to be simple and easy to use. It is based around three layers of communication:

  • an HTTP API for bots to communicate with the server
  • a WebSocket API for bots to receive events from the server
  • a WebHook API for the server to send events to bots
+ + + + \ No newline at end of file diff --git a/en-US/protocol/message.html b/en-US/protocol/message.html new file mode 100644 index 0000000..a0072ca --- /dev/null +++ b/en-US/protocol/message.html @@ -0,0 +1,25 @@ + + + + + + Message | Satori + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en-US/protocol/webhook.html b/en-US/protocol/webhook.html new file mode 100644 index 0000000..0ddaaf3 --- /dev/null +++ b/en-US/protocol/webhook.html @@ -0,0 +1,25 @@ + + + + + + Webhook | Satori + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en-US/protocol/websocket.html b/en-US/protocol/websocket.html new file mode 100644 index 0000000..3c136cb --- /dev/null +++ b/en-US/protocol/websocket.html @@ -0,0 +1,25 @@ + + + + + + WebSocket | Satori + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/en-US/resources/channel.html b/en-US/resources/channel.html new file mode 100644 index 0000000..d97357a --- /dev/null +++ b/en-US/resources/channel.html @@ -0,0 +1,25 @@ + + + + + + Channel | Satori + + + + + + + + + + + + + + +
Skip to content

Channel

Definition

Channel

FIELDTYPEDESCRIPTION
idstringchannel ID
namestringchannel name

API

Get Channel

  • POST /v1/channel.get
FIELDTYPEDESCRIPTION
channel_idstringchannel ID

Get a channel by ID. Returns a channel object.

bot.getChannelList(guildId, next?)

  • POST /v1/channel.list
FIELDTYPEDESCRIPTION
guild_idstringguild ID
nextstringpagination token

Get channels in a guild. Returns a list of channel objects.

+ + + + \ No newline at end of file diff --git a/en-US/resources/guild.html b/en-US/resources/guild.html new file mode 100644 index 0000000..2d8ee72 --- /dev/null +++ b/en-US/resources/guild.html @@ -0,0 +1,25 @@ + + + + + + Guild | Satori + + + + + + + + + + + + + + +
Skip to content

Guild

Definition

Guild

FIELDTYPEDESCRIPTION
idstringguild ID
namestringguild name

API

bot.getGuild(guildId)

  • POST /v1/guild.get
FIELDTYPEDESCRIPTION
guild_idstringguild ID

Get a guild by ID. Returns a guild object.

bot.getGuildList(next?)

  • POST /v1/guild.list
FIELDTYPEDESCRIPTION
nextstringpagination token

Get guilds where the current user is a member. Returns a list of partial guild objects.

bot.handleGuildRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理来自群组的邀请。

+ + + + \ No newline at end of file diff --git a/en-US/resources/member.html b/en-US/resources/member.html new file mode 100644 index 0000000..46c51de --- /dev/null +++ b/en-US/resources/member.html @@ -0,0 +1,29 @@ + + + + + + 群组成员 (GuildMember) | Satori + + + + + + + + + + + + + + +
Skip to content

群组成员 (GuildMember)

类型定义

ts
interface GuildMember {
+  user: User
+  nick?: string
+  avatar?: string
+}

API

bot.getGuildMember(guildId, userId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • 返回值: Promise<GuildMember> 群成员信息

获取群成员信息。

bot.getGuildMemberList(guildId, next?)

  • guildId: string 群组 ID
  • next: string 分页令牌
  • 返回值: Promise<List<GuildMember>> 群成员列表

获取群成员列表。

bot.kickGuildMember(guildId, userId, permanent?)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • permanent: boolean 是否永久踢出 (用户无法再次加入群组)
  • 返回值: Promise<void>

将某个用户踢出群组。

bot.muteGuildMember(guildId, userId, duration?, reason?)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • duration: number 禁言时长 (毫秒)
  • reason: string 禁言说明
  • 返回值: Promise<void>

将某个用户禁言。如果传入的禁言时长为 0 则表示解除禁言。

bot.handleGuildMemberRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理加群请求。

+ + + + \ No newline at end of file diff --git a/en-US/resources/message.html b/en-US/resources/message.html new file mode 100644 index 0000000..990cd3f --- /dev/null +++ b/en-US/resources/message.html @@ -0,0 +1,32 @@ + + + + + + 消息 (Message) | Satori + + + + + + + + + + + + + + +
Skip to content

消息 (Message)

类型定义

ts
interface Message {
+  isDirect: boolean
+  channelId: string
+  messageId: string
+  userId: string
+  content: string
+  timestamp?: number
+}

API

bot.sendMessage(channelId, content, guildId?)

  • channelId: string 频道 ID
  • content: Fragment 要发送的内容
  • guildId: string 群组 ID
  • 返回值: Promise<string[]> 发送的消息 ID

向特定频道发送消息。

WARNING

只要你能够获取到会话对象,你就不应使用此 API,而应该使用 session.send()。一些平台会将主动发送的消息同被动接收后回复的消息区分开来,甚至可能限制主动消息的发送,因此使用 session.send() 总是有更好的可靠性。

TIP

bot.sendMessage() 既可以发送群聊消息,也可以发送私聊消息。当发送私聊消息时,其与 bot.sendPrivateMessage() 的区别在于前者传入的是频道 ID,而后者传入的是用户 ID。

bot.sendPrivateMessage(userId, content)

  • userId: string 对方 ID
  • content: Fragment 要发送的内容
  • 返回值: Promise<string[]> 发送的消息 ID

向特定用户发送私聊消息。

bot.getMessage(channelId, messageId)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • 返回值: Promise<Message>

获取特定消息。

bot.deleteMessage(channelId, messageId)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • 返回值: Promise<void>

撤回特定消息。

bot.editMessage(channelId, messageId, content)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • content: Fragment 要发送的内容
  • 返回值: Promise<void>

修改特定消息。

bot.getMessageList(channelId, next?)

  • channelId: string 频道 ID
  • next: string 分页令牌
  • 返回值: Promise<List<Message>> 消息列表

获取频道消息列表。

+ + + + \ No newline at end of file diff --git a/en-US/resources/reaction.html b/en-US/resources/reaction.html new file mode 100644 index 0000000..2bea90c --- /dev/null +++ b/en-US/resources/reaction.html @@ -0,0 +1,25 @@ + + + + + + 表态 (Reaction) 实验性 | Satori + + + + + + + + + + + + + + +
Skip to content

表态 (Reaction) 实验性

API

bot.createReaction(channelId, messageId, emoji)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • 返回值: Promise<void>

向特定消息添加表态。

bot.deleteReaction(channelId, messageId, emoji, userId?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • userId: string 用户 ID
  • 返回值: Promise<void>

从特定消息删除某个用户添加的特定表态。如果没有传入用户 ID 则表示删除自己的表态。

bot.clearReaction(channelId, messageId, emoji?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • 返回值: Promise<void>

从特定消息清除某个特定表态。如果没有传入表态名称则表示清除所有表态。

bot.getReactionList(channelId, messageId, emoji, next?)

  • channelId: string 频道 ID
  • messageId: string 消息 ID
  • emoji: string 表态名称
  • next: string 分页令牌
  • 返回值: Promise<List<User>>

获取添加特定消息的特定表态的用户列表。

+ + + + \ No newline at end of file diff --git a/en-US/resources/role.html b/en-US/resources/role.html new file mode 100644 index 0000000..70d488c --- /dev/null +++ b/en-US/resources/role.html @@ -0,0 +1,30 @@ + + + + + + 群组角色 (GuildRole) 实验性 | Satori + + + + + + + + + + + + + + +
Skip to content

群组角色 (GuildRole) 实验性

类型定义

ts
export interface GuildRole {
+  id: string
+  name: string
+  color: number
+  position: number
+}

API

bot.setGuildMemberRole(guildId, userId, roleId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

设置群组内用户的角色。

bot.unsetGuildMemberRole(guildId, userId, roleId)

  • guildId: string 群组 ID
  • userId: string 用户 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

取消群组内用户的角色。

bot.getGuildRoleList(guildId, next?)

  • guildId: string 群组 ID
  • next: string 分页令牌
  • 返回值: Promise<List<GuildRole>> 角色列表

获取群组角色列表。

bot.createGuildRole(guildId, data)

  • guildId: string 群组 ID
  • data: Partial<GuildRole> 角色信息
  • 返回值: Promise<string> 角色 ID

创建群组角色。

bot.modifyGuildRole(guildId, roleId, data)

  • guildId: string 群组 ID
  • roleId: string 角色 ID
  • data: Partial<GuildRole> 角色信息
  • 返回值: Promise<void>

修改群组角色。

bot.deleteGuildRole(guildId, roleId)

  • guildId: string 群组 ID
  • roleId: string 角色 ID
  • 返回值: Promise<void>

删除群组角色。

+ + + + \ No newline at end of file diff --git a/en-US/resources/user.html b/en-US/resources/user.html new file mode 100644 index 0000000..2b312ad --- /dev/null +++ b/en-US/resources/user.html @@ -0,0 +1,29 @@ + + + + + + 用户 (User) | Satori + + + + + + + + + + + + + + +
Skip to content

用户 (User)

类型定义

ts
export interface User {
+  id: string
+  name: string
+  avatar?: string
+}

API

bot.getSelf()

  • 返回值: Promise<User> 用户信息

获取机器人自己的信息。

bot.getUser(userId)

  • userId: string 用户 ID
  • 返回值: Promise<User> 用户信息

获取用户信息。

bot.getFriendList(next?)

  • next: string 分页令牌
  • 返回值: Promise<List<User>> 好友列表

获取机器人的好友列表。

bot.handleFriendRequest(messageId, approve, comment?)

  • messageId: string 请求 ID
  • approve: boolean 是否通过请求
  • comment: string 备注信息
  • 返回值: Promise<void>

处理好友请求。

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 0000000..afc1f29 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"en-us_index.md":"Byxaj5LD","en-us_introduction.md":"C9m_p_Hl","en-us_protocol_api.md":"CNy0V_5r","en-us_protocol_index.md":"CKnCis19","en-us_protocol_message.md":"YNq4Bb9W","en-us_protocol_webhook.md":"B2rAIltw","en-us_protocol_websocket.md":"C2-bu5ot","en-us_resources_channel.md":"CRWrGFlY","en-us_resources_guild.md":"DMqzKr6J","en-us_resources_member.md":"CSvkrGgF","en-us_resources_message.md":"CFI9AOBn","en-us_resources_reaction.md":"C0mS_FzD","en-us_resources_role.md":"1AfH6x9v","en-us_resources_user.md":"owA9OMRz","zh-cn_advanced_bridge.md":"BvgC5OVs","zh-cn_advanced_internal.md":"BcT4DuVV","zh-cn_advanced_meta.md":"5SIn9XtM","zh-cn_advanced_resource.md":"C-_HwXQP","zh-cn_index.md":"CYyt9X3k","zh-cn_introduction.md":"BDFENsOM","zh-cn_protocol_api.md":"9P_hL1dt","zh-cn_protocol_elements.md":"PpF5nfM_","zh-cn_protocol_events.md":"Dh8okkMd","zh-cn_protocol_index.md":"SoESnLsL","zh-cn_protocol_message.md":"Cu2tqxHC","zh-cn_resources_channel.md":"BTvowY65","zh-cn_resources_guild.md":"D0qULpBF","zh-cn_resources_interaction.md":"CDJkLvci","zh-cn_resources_login.md":"C353E7cy","zh-cn_resources_member.md":"DF6hYtD8","zh-cn_resources_message.md":"D-JsPVge","zh-cn_resources_reaction.md":"DOsNec4_","zh-cn_resources_role.md":"Cilb3pcM","zh-cn_resources_user.md":"D43f7KVt"} diff --git a/vp-icons.css b/vp-icons.css new file mode 100644 index 0000000..ddc5bd8 --- /dev/null +++ b/vp-icons.css @@ -0,0 +1 @@ +.vpi-social-github{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")} \ No newline at end of file diff --git a/zh-CN/advanced/bridge.html b/zh-CN/advanced/bridge.html new file mode 100644 index 0000000..e186bd8 --- /dev/null +++ b/zh-CN/advanced/bridge.html @@ -0,0 +1,25 @@ + + + + + + 桥接 | Satori + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zh-CN/advanced/internal.html b/zh-CN/advanced/internal.html new file mode 100644 index 0000000..768eca6 --- /dev/null +++ b/zh-CN/advanced/internal.html @@ -0,0 +1,31 @@ + + + + + + 跨平台 | Satori + + + + + + + + + + + + + + +
Skip to content

跨平台

作为一个跨平台的聊天协议,Satori 提供了访问任意平台原生接口的能力。这意味着,你可以大多数情况下编写通用代码,并在需要的时候使用原生接口来实现平台特定功能。

这些原生能力被统称为内部接口,涵盖了 API、事件、消息元素、路由等各个方面。

平台与适配器

Satori 协议的大多数 API 都需要传入 Satori-PlatformSatori-User-ID 请求头,这是为了区分发起请求的登录号。不同平台的登录号拥有不同的 login.platform,而同一平台的不同登录号则拥有不同的 login.user.id,由此这套机制实现了安全的隔离。

大多数聊天平台的 platform 字段都是直接由 SDK 设置的固定值。然而对于另一些允许自建的平台 (例如 Rocket Chat 和 Zulip),SDK 则通常需要让部署者自行设置 platform,用来区分不同的服务器。如果直接混用的话,可能导致数据碰撞等问题。

所以对于任何一个 Login,我们实际上存在两个不同的概念:

  • login.platform:聊天平台。通常来说,同一平台内的用户间具有相互发送消息的能力,而不同平台的用户间则没有。在 Satori 中,platform 也相当于一种命名空间,因此 SDK 需要保证同一平台内的 user.id, guild.id 等字段的唯一性。

  • login.adapter:适配器。适配器更多地是一个实现相关的概念,它决定了如何与平台进行通信。同一个适配器下通常会有相同的扩展 API、事件和消息元素。这个字段通常是 SDK 直接设置的,开发者可以用这个字段判断实现是否支持某些特性。

TIP

如果你读到这里仍然难以区分 platformadapter,可以记住以下规则:

  • 同一 platform 内 ID 相互兼容;
  • 同一 adapter 内 API 相互兼容;

这两个条件是充分但不必要的,换言之,即便两个 Login 所拥有的 ID 或者 API 兼容,也可以不使用相同的 platformadapter。这完全取决于 SDK 的实现和社区的约定。

TIP

需要注意的是,这两个概念实际上是多对多的,我们可以举出一些特殊场景:

  • 单适配器多平台:某平台允许用户自建服务器,此时两台独立的自建服务器拥有不同的数据,所有的 user.id, guild.id 等属于不同的命名空间,因此 platform 字段应该是不同的。但这两台服务器使用的通信方式相同,因此 adapter 字段应该是相同的。
  • 单平台多适配器:某平台同时有官方和非官方的 SDK,两套 SDK 使用的通信方式不同,因此 adapter 字段应该是不同的。但这两套 SDK 都是为了与同一平台通信,所有的 user.id, guild.id 等属于同一个命名空间,因此 platform 字段应该是相同的。

API 扩展

SDK 可以通过 /{path}/{version}/internal/{method} 路由代理平台原生 API。

例如,Discord 平台提供了 Restful API,那么你可以进行如下请求:

text
DELETE /v1/internal/channels/111222333
+Satori-Platform: discord
+Satori-User-ID: 1234567890

除了作为前缀的路由和额外的 Satori-PlatformSatori-User-ID 请求头之外,整个请求和响应的格式都与平台原生 API 一致。

事件扩展

平台原生事件

SDK 可以通过 internal 事件的 _type_data 属性代理平台原生事件。它的结构如下:

字段类型说明
idnumber事件 ID
typestring事件类型 (固定为 internal)
loginLogin登录信息
_typestring原生事件类型
_dataobject原生事件数据

标准事件的扩展字段

标准事件的平台原生字段也可以通过上述 _type_data 访问。它的结构如下:

字段类型说明
typestring事件类型 (不应该是 internal)
_typestring平台通用名称
_dataobject原生事件数据
其他字段其他标准事件字段

TIP

有些平台原生事件可以直接对应到标准事件。当这些事件触发时,SDK 可以同时触发标准事件和平台原生事件。这两个事件都带有 _type_data 字段,但这两个字段的值可能是不同的。

消息元素扩展

平台原生消息元素

平台可以提供原生消息元素,但需要加上适配器名称作为前缀。下面是一个例子:

html
<kook:card size="lg">
+  <kook:countdown end-time="1608819168000"/>
+</kook:card>

标准元素的扩展属性

标准元素的平台原生属性也可以通过加上适配器名称作为前缀的方式声明。下面是一个例子:

html
<!-- src 是 audio 元素的标准属性。 -->
+<!-- 但 cover 并未标准化,所以需要加前缀。 -->
+<audio src="url1" kook:cover="url2"/>

TIP

平台原生消息元素的属性是否需要前缀由 SDK 实现自行决定。如果某个消息元素希望在未来标准化,那么加上前缀可以降低迁移成本。如果没有标准化需要,那么去掉前缀在书写上更方便。

+ + + + \ No newline at end of file diff --git a/zh-CN/advanced/meta.html b/zh-CN/advanced/meta.html new file mode 100644 index 0000000..ed795c9 --- /dev/null +++ b/zh-CN/advanced/meta.html @@ -0,0 +1,25 @@ + + + + + + 元信息 可选 实验性 | Satori + + + + + + + + + + + + + + +
Skip to content

元信息 可选 实验性

TIP

这是一个可选功能。

WARNING

这是一个实验性功能。

元信息对象包含了与 SDK 状态相关、与具体的账号无关的信息,例如 代理路由 等。

元信息通过以下方式获取和更新:

  • 在 WebSocket 推送方式下,READY 信令将提供完整的元信息;
  • 在 WebHook 推送方式下,应用启动时应当通过 API 获取元信息;
  • 应用启动后,持续接收 META 信令和登录事件对元信息进行更新。

需要注意的是,META 信令不反映登录状态变化,也不会包含 logins 字段。

元信息 API 通过 /{path}/{version}/meta/{method} 路由提供。通信方式与 HTTP API 类似,但不需要 Satori-PlatformSatori-User-ID 请求头。

类型定义

Meta

字段类型描述
loginsLogin[]登录信息
proxy_urlsstring[]代理路由 列表

API

获取元信息

POST/meta

返回一个 Meta 对象。

创建 WebHook

POST/meta/webhook.create
字段类型描述
urlstringWebHook 地址
tokenstring?鉴权令牌

移除 WebHook

POST/meta/webhook.delete
字段类型描述
urlstringWebHook 地址
+ + + + \ No newline at end of file diff --git a/zh-CN/advanced/resource.html b/zh-CN/advanced/resource.html new file mode 100644 index 0000000..f413022 --- /dev/null +++ b/zh-CN/advanced/resource.html @@ -0,0 +1,46 @@ + + + + + + 资源链接 实验性 | Satori + + + + + + + + + + + + + + +
Skip to content

资源链接 实验性

WARNING

这是一个实验性功能。

文件上传

POST/upload.create

如果要发送的消息中含有图片或其他媒体资源,可以使用此 API 将文件上传至 Satori 服务器并转换为 URL,以便在消息编码中使用。

与其他 API 不同,上传文件的请求体遵循 multipart/form-data 格式。下面是一个示例:

text
POST /v1/upload.create
+Content-Type: multipart/form-data
+Satori-Platform: discord
+Satori-User-ID: 1234567890
+
+--boundary
+Content-Disposition: form-data; name="foo"; filename="image1.png"
+Content-Type: image/png
+
+binary-data
+--boundary
+Content-Disposition: form-data; name="bar"; filename="image2.gif"
+Content-Type: image/gif
+
+binary-data
+--boundary--

其中,Content-Disposition 中的 name 字段表示文件标识符 (必需且不能重复),filename 字段表示文件名 (可选);Content-Type 表示文件类型 (必需)。

返回值是一个字典类型,其中的每个键分别对应于请求体中的文件标识符,值是一个 URL 字符串,可以在消息编码中使用。下面是一个示例的返回值:

json
{
+  "foo": "internal:discord/1234567890/_tmp/3j6emd92-image1.png",
+  "bar": "internal:discord/1234567890/_tmp/reacpmeq-image2.gif"
+}

在实现此 API 时,如果平台已经支持了文件上传功能,可以直接使用平台提供的上传 API,返回平台的 URL 即可。如果平台不支持文件上传功能,应当回退到 SDK 提供的默认实现。

SDK 可以基于本地文件系统实现上传功能。上传到本地文件系统中的文件 URL 通过 internal: 协议进一步代理,且有一定的有效期。各实现可以根据自身情况调整有效期,推荐值为 5 分钟。

内部链接

internal: 称为内部链接协议,用于代理平台原生 API 或是无法直接通过公网访问的资源。

格式规范

内部链接的标准格式如下:

text
internal:{platform}/{user.id}/{path}

其中,platform 为平台名称,user.id 为登录账号,path 为资源路径。

SDK 可以根据需要自行设计资源路径,但以下划线 _ 开头的路径需要保留给 Satori 自身使用,拥有固定的语义。现有的保留路径有:

  • _tmp:用于 SDK 的默认文件上传实现;
  • _raw:用于代理平台原生 HTTP API。

API 代理

Satori 会将所有内部 API 访问重定向到 _raw 内部链接。换言之,以下两个请求是等价的:

text
DELETE /v1/internal/channel/111222333
+Satori-Platform: discord
+Satori-User-ID: 1234567890
text
DELETE /v1/proxy/internal:discord/1234567890/_raw/channel/111222333

因此,适配器开发者无需专门实现内部 API,只需实现 _raw 路径下的代理即可。

适用场景

上一节中已经提到,在不支持文件上传的平台上调用 /upload.create,你将获得内部链接。对平台原生 API 的访问同样通过内部链接进行。除此以外,还有一些内部链接的适用场景。

TIP

场景:通过平台 API 请求资源

某些平台使用 ID 标识资源文件 (例如 Lark)。当你接收到来自平台的消息时,拿到的是资源 ID 而非链接。此时你需要调用平台 API,将资源 ID 转换为链接,才能构造合法的消息元素。

为了避免在不必要的场合损失性能,更推荐的方式是直接将资源 ID 封装进内部链接,并立即构造消息元素。等到真正需要请求资源时再调用平台的 API。

TIP

场景:资源链接不宜直接公开

对于另一些平台,尽管其提供的资源链接是可用的,但这个链接中会明文包含机器人令牌,并非可以公开使用的链接 (例如 Telegram)。因此,对于这些平台中的资源,我们也不能直接使用其链接,同样需要将其封装进内部链接。此时内部链接就是单纯的代理。

不同方案对比

与内部链接相比,另一些实践则是不推荐的。下面的方案来源于一些经典聊天协议的实现。通过与这些方案进行对比,可以更好地理解内部链接的优势。

WARNING

不推荐:data: URL

一种不推荐的方案是直接下载资源,并转换为 data: 链接放入消息元素中。之所以不推荐使用,是因为这种方案有两大致命缺点:

  • 这些图片本来可以按需加载,但现在却被强制下载到本地,造成额外的带宽消耗;
  • 编码为 data: 会导致消息体积大幅增加,极大影响消息处理的性能。

WARNING

不推荐:本地代理

另一种方案是由 SDK 额外提供一个用于访问资源的路由 (比如下文介绍的代理路由),并将资源链接转换为能访问到该路由的 URL。相比内部链接,这种方案有两个缺点:

  • 这样生成的链接与 Satori 服务器自身的地址耦合,一旦 Satori 服务器更换域名或者端口,过去的链接将全部失效,不利于迁移和跨接等复杂场景;
  • 如果需要扩展其他需要用到资源的逻辑 (比如下载图片到本地),就会导致通过网络自己请求自己,而这些数据原本可以在内存或硬盘中传输,这显然引入了额外的性能损耗。

代理路由

假设你在开发基于 Satori 的聊天平台客户端,你希望可以直接将 Satori 协议中给出的资源链接用于 HTML,但很多情况下你都难以如愿:

  1. 该资源链接由平台生成,且含有防盗链机制,无法在跨域请求中访问;
  2. 该资源链接是一个内部链接,无法在 HTML 中直接访问。

为此,SDK 需要额外提供一个代理路由 /{path}/{version}/proxy/{url},用于访问这些资源链接。这个路由不需要 Satori-PlatformSatori-User-ID 请求头。

下面是两个典型的代理路由请求示例 (分别对应上述两种情况):

text
GET /v1/proxy/https://cdn.discordapp.com/attachments/bf6f121d.jpg
+GET /v1/proxy/internal:discord/1234567890/_tmp/3j6emd92-image1.png

在具体的应用场景中,代理路由可根据需要添加 Access-Control-Allow-Origin 等响应头,以限制或允许跨域请求。

为了辨别需要代理的路径以防滥用,Satori 还引入了 proxy_urls 属性。这个属性记录了所有需要代理的 (非内部) 资源链接前缀,应用侧可以根据这个属性来判断是否需要代理。

根据 url 的不同形式,SDK 提供的代理路由会有不同的行为:

  • 如果 url 不是合法的 URL,直接返回 400;
  • 如果 url 是一个内部链接 (即以 internal: 开头):
    • 如果链接不符合内部链接的格式,直接返回 400;
    • 解析链接中的 platformuser.id,并找到对应的登录号;
    • 如果登录号存在,则由该登录号的扩展逻辑进行返回;
    • 如果登录号不存在,直接返回 404;
  • 如果 url 以某个 proxy_urls 中的链接为前缀:
    • 在 SDK 侧下载该 url 并返回 (SDK 提供了该资源的代理);
  • 其他情况下:直接返回 403。

实践指南

综上所述,我们总结出了一套关于资源链接的最佳实践:

对于核心库开发者,你需要:

  1. 提供 REGISTER_INTERNAL_ROUTE 方法用于注册内部链接路由,以便适配器实现;
  2. 提供 DOWNLOAD_URL 方法用于将一个链接下载为数据,无论其是否为内部链接;
  3. 基于本地文件系统实现内置的 /upload.create API;
  4. 基于上述 DOWNLOAD_URL 方法实现代理路由。

对于适配器开发者,你需要:

  1. 在以下情况下,调用 REGISTER_INTERNAL_ROUTE 方法注册内部路由:
    • 平台符合内部链接的 适用场景
    • 平台提供了 HTTP API (此时只需在 _raw 路径下代理平台原生 API);
  2. 接收事件推送时:如果收到的资源链接符合内部链接的适用场景,将它们转化为内部链接;
  3. 发送消息时:根据平台行为和资源链接的形式,合理选择下载和发送资源的方式;
  4. 如果平台支持文件上传:实现 /upload.create API,覆盖 SDK 的默认实现;
+ + + + \ No newline at end of file diff --git a/zh-CN/index.html b/zh-CN/index.html new file mode 100644 index 0000000..632aa55 --- /dev/null +++ b/zh-CN/index.html @@ -0,0 +1,25 @@ + + + + + + Satori + + + + + + + + + + + + + + +
Skip to content

Satori

THE UNIVERSAL MESSENGER PROTOCOL

+ + + + \ No newline at end of file diff --git a/zh-CN/introduction.html b/zh-CN/introduction.html new file mode 100644 index 0000000..c0b4f13 --- /dev/null +++ b/zh-CN/introduction.html @@ -0,0 +1,25 @@ + + + + + + 介绍 | Satori + + + + + + + + + + + + + + +
Skip to content

介绍

Satori 是一个通用的聊天协议。我们希望 Satori 能够抹平不同聊天平台之间的差异,让开发者以更低的成本开发出跨平台、可扩展、高性能的聊天应用。

Satori 的名称来源于游戏东方 Project 中的角色 古明地觉 (Komeiji Satori)。古明地觉能够以心灵感应的方式与各种动物交流,取这个名字是希望 Satori 能够成为各个聊天平台之间的桥梁。

Satori 的开发团队长期从事聊天机器人开发,熟悉各种聊天平台的通信方式。经过长达 4 年的发展,Satori 有了健全的设计和完善的实现。目前,Satori 官方提供了超过 15 个聊天平台的适配器,完全覆盖了世界上主流的聊天平台:

这些适配器不仅为你带来了开箱即用的体验,也从实际上证明了 Satori 协议的通用性和扩展性。

不必担心使用 Satori 后会失去对聊天平台的控制。得益于 Satori 的内部接口机制,你完全可以大多数情况下编写通用代码,并在需要的时候使用内部接口来实现平台特定功能。

此外,Satori 还为规模化的场景提供了全套的解决方案。小到个人电脑上的聊天机器人,大到分布式集群上的聊天平台后端,Satori 都能满足你的需求。

+ + + + \ No newline at end of file diff --git a/zh-CN/protocol/api.html b/zh-CN/protocol/api.html new file mode 100644 index 0000000..eb44e8e --- /dev/null +++ b/zh-CN/protocol/api.html @@ -0,0 +1,31 @@ + + + + + + API | Satori + + + + + + + + + + + + + + +
Skip to content

API

Satori 协议规定了一套基于 HTTP 的 API 服务,用于发送消息和调用其他功能。

HTTP API

这是一套 HTTP RPC 风格的 API,所有 URL 的形式均为 /{path}/{version}/{resource}.{method}。其中,path 为部署路径 (可以为空),version 为 API 的版本号,resource 是资源类型,method 为方法名。

目前 Satori 仅有 v1 一个版本。

绝大多数 API 的请求都使用 POST,参数通过 application/json 编码在请求体中。返回值也是 JSON 格式。作为特例,具有 文件上传 功能的 API 使用 multipart/form-data 编码。

请求头中需要包含 Satori-PlatformSatori-User-ID 字段,分别表示平台名称和平台账号。

一个合法的请求示例形如:

text
POST /v1/channel.get
+Content-Type: application/json
+Authorization: Bearer 1234567890
+Satori-Platform: discord
+Satori-User-ID: 1234567890
+
+{"channel_id": "1234567890"}

鉴权

鉴权通过 HTTP API 中的 Authorization 请求头来实现。其中涉及的鉴权令牌由 SDK 分发,本协议不做任何限制。

如果 SDK 没有配置鉴权,则应用无需提供上述请求头。

状态码

状态码描述
200 (OK)请求成功
400 (BAD REQUEST)请求格式错误
401 (UNAUTHORIZED)缺失鉴权
403 (FORBIDDEN)权限不足
404 (NOT FOUND)资源不存在
405 (METHOD NOT ALLOWED)请求方法不支持
5XX (SERVER ERROR)服务器错误

TIP

如果某个标准 API 没有被某个平台支持,则应该返回 404 而非 501 (NOT IMPLEMENTED)。只有当一个 API 被平台支持但是未被适配器实现时,才应该返回 501。

平台特性 实验性

Login 对象中的 features 字段是一个字符串数组,用于表示平台的特性。这些特性可以用于判断平台是否支持某些 API。合法的平台特性包括:

  • API 可用性,如特性 message.delete 表示支持使用 message.delete 撤回消息。
  • API 额外特性,如特性 message.list.from 表示使用 message.list 查询消息列表时支持将消息 ID 作为分页令牌。
  • 平台额外特性,如特性 guild.plain 表示该平台的群组内只能存在一个消息频道。

目前仅有 API 名称本身是规范的用法。我们将在后续版本中提供更全面的标准特性列表。

进阶 API

除了标准 API 外,Satori 还提供了一些进阶功能。

  • /{path}/{version}/proxy 的子路由用于代理平台资源,请参见 代理路由
  • /{path}/{version}/meta 的子路由用于访问 SDK 相关接口,请参见 元信息 API
  • /{path}/{version}/internal 的子路由用于访问平台内部接口,请参见 内部 API

类型定义

分页列表

部分 API 可能会返回分页数据。这种情况下,响应会是一个 List 对象:

字段类型描述
dataarray数据
nextstring?下一页的令牌

你可以使用 next 令牌来获取下一页的数据。如果 next 为空,则表示没有更多数据了。

双向分页列表

极少数 API 返回可双向延伸的分页数据。这种情况下,响应会是一个 BidiList 对象:

字段类型描述
dataarray数据
prevstring?上一页的令牌
nextstring?下一页的令牌

在对应的 API 中,你可以通过 directionorder 参数来指定方向和排序。

direction 参数有三种不同的取值:

  • before:向前获取数据,此时 prevnext 相同,均表示上一页的令牌。
  • after:向后获取数据,此时 prevnext 相同,均表示下一页的令牌。
  • around:向两侧获取数据,此时 prev 表示上一页的令牌,next 表示下一页的令牌。

如果 prevnext 缺失,则表示在该方向上没有更多数据了。

order 参数有两种不同的取值:

  • asc:升序排列。
  • desc:降序排列。
+ + + + \ No newline at end of file diff --git a/zh-CN/protocol/elements.html b/zh-CN/protocol/elements.html new file mode 100644 index 0000000..0b04fad --- /dev/null +++ b/zh-CN/protocol/elements.html @@ -0,0 +1,41 @@ + + + + + + 标准元素 | Satori + + + + + + + + + + + + + + +
Skip to content

标准元素

基础元素

基本元素是最常见的消息元素,它们能够在大多数平台上正常显示,是组成消息的基本单位。

提及用户 (at)

属性类型范围描述
idstring?收发目标用户的 ID
namestring?收发目标用户的名称
rolestring?收发目标角色
typestring?收发特殊操作,例如 all 表示 @全体成员,here 表示 @在线成员

<at> 元素用于提及某个或某些用户。

提及频道 (sharp)

属性类型范围描述
idstring收发目标频道的 ID
namestring?收发目标频道的名称

<sharp> 元素用于提及某个频道。

链接 (a)

属性类型范围描述
hrefstring收发链接的 URL

<a> 元素用于显示一个链接。当平台不支持链接时,建议显示为 content (href) 的形式。

资源元素

资源消息元素表示文本中存在的资源文件。不同的平台对资源文件的支持存在较大的差异。发送时只需提供 src。如果某个平台不支持特定的资源类型,适配器应该用 src 代替。如果某个平台不支持将资源消息元素和其他消息元素同时发送,适配器应该分多条发送,并返回最后一条消息的 ID。

属性类型范围描述
srcstring收发资源的 URL
titlestring?收发资源文件名称
cache 实验性boolean?是否使用已缓存的文件
timeout 实验性string?下载文件的最长时间 (毫秒)

图片 (img)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
widthnumber?图片宽度 (像素)
heightnumber?图片高度 (像素)

<img> 元素用于表示图片。

音频 (audio)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
durationnumber?音频长度 (秒)
posterstring?收发音频封面 URL

<audio> 元素用于表示语音。

视频 (video)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
widthnumber?视频宽度 (像素)
heightnumber?视频高度 (像素)
durationnumber?视频长度 (秒)
posterstring?收发视频封面 URL

<video> 元素用于表示视频。

文件 (file)

除了上述通用属性外,还支持下面的属性:

属性类型范围描述
posterstring?收发缩略图 URL

<file> 元素用于表示文件。

修饰元素

修饰元素用于修饰其中的内容。如果对应的平台不支持对应的元素,可以忽略这个元素本身,正常渲染其中的子元素。

粗体 (b, strong)

<b><strong> 元素用于将其中的内容以粗体显示。

斜体 (i, em)

<i><em> 元素用于将其中的内容以斜体显示。

下划线 (u, ins)

<u><ins> 元素用于为其中的内容附加下划线。

删除线 (s, del)

<s><del> 元素用于为其中的内容附加删除线。

剧透 (spl)

<spl> 元素用于将其中的内容标记为剧透 (默认会被隐藏,点击后才显示)。

代码 (code)

<code> 元素用于将其中的内容以等宽字体显示 (通常还会有特定的背景色)。

上标 (sup)

<sup> 元素用于将其中的内容以上标显示。

下标 (sub)

<sub> 元素用于将其中的内容以下标显示。

排版元素

换行 (br)

<br> 元素表示一个独立的换行。

段落 (p)

<p> 元素表示一个段落。在渲染时,它与相邻的元素之间会确保有一个换行。

消息 (message)

属性类型范围描述
idstring?消息的 ID
forwardboolean?是否为转发消息

<message> 元素的基本用法是表示一条消息。子元素对应于消息的内容。如果其没有子元素,则消息不会被发送。

当出现 <message> 元素时,之前的元素会被立即视为一条消息被发送。因此下面的两种写法是等价的:

html
<!-- 第一种写法:发送两条消息 -->
+<message>hello</message>
+<message>world</message>
+
+<!-- 第二种写法:用一条空消息隔开两段文本,实际上仍然会发送两条消息 -->
+hello<message/>world

部分平台允许你模拟其他用户发送消息:

html
<message>
+  <author id="123123123" name="Alice" avatar="url"/>
+  hello world
+</message>

在支持转发的平台上,你可以使用 forward 配合 id 属性来转发一条消息:

html
<message id="123456789" forward/>

在支持合并转发的平台上,你可以使用带有 forward 属性的 <message> 元素嵌套其他 <message> 元素来实现合并转发:

html
<message forward>
+  <message id="123456789"/>
+  <message id="987654321"/>
+  <!-- 合并转发里也可以嵌套模拟其他用户发送的消息 -->
+  <message>
+    <author id="123123123" name="Alice" avatar="url"/>
+    hello world
+  </message>
+</message>

元信息元素

元信息元素通常不会被渲染,但会影响到消息的发送行为。

引用 (quote)

<quote> 元素用于表示对消息引用。它的子元素会被渲染为引用的内容。理论上所有 <message> 元素的特性也可以用于 <quote> 元素,包括子元素 (构造引用消息) 和 forward 属性 (引用合并转发)。然而目前似乎并没有平台提供了这样的支持。

作者 (author)

属性类型范围描述
idstring?用户 ID
namestring?昵称
avatarstring?头像 URL

<author> 元素用于表示消息的作者。它的子元素会被渲染为作者的名字。

交互元素

交互元素用于显然消息中的可交互性内容。如果平台不支持此类元素且难以提供回退,可以直接忽略整个元素。实现侧应当根据平台特性,针对性地返回带有交互和不带有交互的消息。

按钮 (button) 实验性

属性类型范围描述
idstring?按钮的 ID
typestring?按钮的类型
hrefstring?按钮的链接
textstring?待输入文本
themestring?按钮的样式

<button> 元素用于表示一个按钮。它的子元素会被渲染为按钮的文本。

按钮目前支持三种不同的类型:

  • 点击 action 类型的按钮时会触发一个 interaction/button 事件,该事件的 button 资源会包含上述 id
  • 点击 link 类型的按钮时会打开一个链接,该链接的地址为上述 href
  • 点击 input 类型的按钮时会在用户的输入框中填充上述 text

theme 仅建议使用下列值:

  • primary
  • secondary
  • success
  • warning
  • danger
  • info
+ + + + \ No newline at end of file diff --git a/zh-CN/protocol/events.html b/zh-CN/protocol/events.html new file mode 100644 index 0000000..c2c76fb --- /dev/null +++ b/zh-CN/protocol/events.html @@ -0,0 +1,25 @@ + + + + + + 事件 | Satori + + + + + + + + + + + + + + +
Skip to content

事件

Satori 协议规定了两套事件服务,分别基于 WebSocket 和 WebHook。

类型定义

OpCode

名称方向描述
EVENT0接收事件
PING1发送心跳
PONG2接收心跳回复
IDENTIFY3发送鉴权
READY4接收鉴权成功
META5接收元信息更新

Event

字段类型描述
snnumber序列号
typestring事件类型
timestampnumber事件的时间戳
loginLogin登录信息
argvArgv?交互指令
buttonButton?交互按钮
channelChannel?事件所属的频道
guildGuild?事件所属的群组
memberGuildMember?事件的目标成员
messageMessage?事件的消息
operatorUser?事件的操作者
roleGuildRole?事件的目标角色
userUser?事件的目标用户

事件分为普通事件与登录事件,其中登录事件特指与 Login 变化相关的事件 (如 login-added)。所有事件都采用上述数据结构,不过在细节上有所区别:

  • 普通事件中的 login 资源只会带有 sn, userplatform 三个属性;
  • 登录事件会带有完整的 login 资源,但可能不存在 userplatform
  • 登录事件不参与 会话恢复

事件中的各属性遵循 资源提升 规则。

WebSocket

WebSocket 服务用于在 Satori SDK 与应用之间维护一个持久的、有状态的链接。通过这个链接,Satori 应用可以实时接收 SDK 推送的事件。

WebSocket 服务的地址为 /{path}/{version}/events。其中,path 为部署路径 (可以为空),version 为 API 的版本号。

目前 Satori 仅有 v1 一个版本。

连接流程

总的来说,Satori 应用需要在连接后遵循以下步骤:

  1. 连接建立后,在 10s 内发送一个 IDENTIFY 信令,用于鉴权和恢复会话;
    SDK 收到后会回复一个 READY 信令,并开启事件推送;
  2. 连接建立后,每隔 10s 向 SDK 发送一次 PING 信令;
    SDK 收到后会回复一个 PONG 信令;
  3. 应用持续接收来自 SDK 的 EVENT 信令,用于接收事件。

信令的数据结构如下:

字段类型描述
opOpCode信令类型
bodyobject?信令数据

IDENTIFY 信令的 body 数据结构如下:

字段类型描述
tokenstring?鉴权令牌
snnumber?序列号

READY 信令的 body 数据结构如下:

字段类型描述
loginsLogin[]登录信息
proxy_urlsstring[]代理路由 列表

META 信令的 body 数据结构如下:

字段类型描述
proxy_urlsstring[]代理路由 列表

EVENT 信令的 body 数据结构参见 Event

鉴权

WebSocket 鉴权通过 IDENTIFY 信令的 token 字段来实现。其中涉及的鉴权令牌由 SDK 分发,本协议不做任何限制。

如果 SDK 没有配置鉴权,则应用无需提供上述字段。

会话恢复

当连接短暂中断时,Satori 应用可以通过 IDENTIFY 信令的 sn 字段来恢复会话。sn 字段的值为上一次连接中最后一个接收到的 EVENT 信令的 sn 字段。会话恢复后,SDK 会向应用推送所有在断开连接期间发生的事件。

登录事件将不会在会话恢复过程中推送,因为在 READY 信令中已经包含了最新的登录状态。

WebHook 可选 实验性

TIP

这是一个可选功能。

WebHook 服务是指,Satori SDK 在接收到平台事件时,向应用提供的 HTTP 地址推送事件。一个 SDK 应当可以配置多个 WebHook,并允许应用对发送者进行鉴权。这些 WebHook 的配置方式由 SDK 自身决定,本协议仅规范化了一组 API,不做强制要求。

事件推送以 POST 的形式进行。请求头包含 Satori-OpCode 字段,对应本次推送的 信令类型;请求体是一个 JSON 对象,对应本次推送的信令数据。例如,一次事件推送将会拥有 Satori-OpCode: 0 的请求头,以及一个符合 Event 结构的请求体。

WebHook 所涉及的信令仅包含 EVENT, META 两种。

应用收到 WebHook 请求时,如果能够顺利鉴权并处理请求,应当返回 2XX 的状态码。如果鉴权失败,应当返回 4XX 的状态码。如果处理失败,应当返回 5XX 的状态码。

反向鉴权

TIP

这里的鉴权与 API 与 WebSocket 中的鉴权逻辑类似,但方向相反。

Satori 应用可以要求 SDK 在发送 WebHook 请求时附带一个 Authorization 请求头,格式为 Bearer {token}。其中,token 由应用进行分发。

+ + + + \ No newline at end of file diff --git a/zh-CN/protocol/index.html b/zh-CN/protocol/index.html new file mode 100644 index 0000000..1c517ef --- /dev/null +++ b/zh-CN/protocol/index.html @@ -0,0 +1,25 @@ + + + + + + 总览 | Satori + + + + + + + + + + + + + + +
Skip to content

总览

Satori 协议的通信方式分为两块:

  • 一套基于 HTTP 的 API 服务,用于发送消息和调用其他功能;
  • 一套基于 WebSocket 或者 WebHook 的事件服务,用于接收消息和其他事件。

核心概念

在我们开始之前,先来了解一些与 Satori 相关的核心概念。

SDK 是指实现了 Satori 协议的软件。应用 (Application) 是指接入了 Satori 协议的软件。应用通过与 SDK 通信,以实现聊天平台的功能。

平台 (Platform) 是指聊天平台,比如 Discord、Telegram 等。同一平台内的用户间具有相互发送消息的能力,而不同平台的用户间则没有。对于 Rocket Chat 这一类可自建的聊天平台而言,每个独立的自建服务器都视为不同的平台。

消息 (Message) 是字面意义上的消息。通常是文本或富文本格式的,有时也会包含图片、语音等媒体资源。在 Koishi 中,消息通过消息元素进行统一编码。

频道 (Channel) 是消息的集合。一个频道包含了具备时间、逻辑顺序的一系列消息。频道又分为私聊频道和群聊频道,其中私聊频道有且仅有两人参与,而群聊频道可以有任意多人参与。

群组 (Guild) 是平台用户的集合。一个群组通常会同时包含一组用户和频道,并通过权限机制让其中的部分用户进行管理。在部分平台中,群组和群聊频道的概念恰好是重合的 (例如 QQ):一个群组内有且仅有一个群聊频道。私聊频道不属于任何群组。

可选字段

由于不同平台实现的差异,Satori 协议中的大部分字段都是可选的。可选字段的类型后面会有一个 ? 标记。

对于任意可选字段,相关 API 调用的结果中可能不含该字段,也可能该字段的值为 null。其中,前者表示该 API 并未提供这一字段,但可能由其他 API 提供;后者表示该 API 提供了这一字段,但其值为 null

资源

Satori 协议中的资源是指一类具有确定结构的对象。例如,用户频道消息 等都是资源。部分事件和 API 的返回值中会包含这些资源对象。

资源对象的某个字段可以是另一个资源对象,例如消息对象中的 user 字段就是一个用户对象。当资源对象出现多级嵌套时,内层的资源将会被统一提升到最外层。例如,当接收到消息事件时,事件体中可以访问到 message, member, user, channel 等资源,但 message 中就不再存在 memberuser 字段了。

+ + + + \ No newline at end of file diff --git a/zh-CN/protocol/message.html b/zh-CN/protocol/message.html new file mode 100644 index 0000000..0ac624c --- /dev/null +++ b/zh-CN/protocol/message.html @@ -0,0 +1,31 @@ + + + + + + 消息编码 | Satori + + + + + + + + + + + + + + +
Skip to content

消息编码

Satori 中的消息使用消息元素 (Message Element) 进行编码。消息元素的语法与 XHTML 类似。

语法

消息元素的语法与 HTML 类似,但是不完全相同。

字符

你可以在消息元素内使用任何字符。不过部分特殊字符需要转义:

原始字符转义写法
"&quot;
&&amp;
<&lt;
>&gt;

根据上下文的不同,有些字符可能不需要被转义或使用其他的转义方式。

除此以外,你可以使用十进制或十六进制转义任何字符。例如 ' 也可以被书写成 &#39;&#x27;

标签

使用一对尖括号包裹元素名,加上可选的属性、闭合指示符,就构成了一个标签。

元素名由小写字母、数字和连字符组成,且必须以字母开头。在元素名前后添加 / 表示这是一个结束标签或自闭合标签,没有 / 符号时则表示这是一个起始标签:

  • <tag> 一个起始标签
  • </tag> 一个结束标签
  • <tag/> 一个自闭合标签

属性

起始或自闭合标签的元素名后接受可选的属性列表。每个属性必须形如以下形式:

  • key
  • key="value" (此时 value 中的 " 需要被转义)
  • key='value' (此时 value 中的 ' 需要被转义)

下面是一段示例:

html
<tag foo="1" bar/>

元素

一个元素要么是自闭合标签,要么由一对同名的起始标签和结束标签构成。元素的内容指起始标签和结束标签中间的部分,可以包含文本内容或其他元素。对于自闭合标签,元素的内容为空。下面是一段示例:

html
<parent>
+  text content
+  <child/>
+</parent>

当存在未配对的元素时,将自动视为文本内容的一部分。文本内容前后如果存在包含换行符的连续空白字符,则会被忽略。这意味着下面两段代码是等价的:

html
<tag>
+  <foo> bar
+  <!-- comment -->
+</tag>
html
<tag>&lt;foo&gt; bar</tag>

注释

使用成对的 <!----> 插入一段注释。注释中的部分不会被渲染。

标准元素

关于 Satori 内置的消息元素,请参考 标准元素

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/channel.html b/zh-CN/resources/channel.html new file mode 100644 index 0000000..1f3a249 --- /dev/null +++ b/zh-CN/resources/channel.html @@ -0,0 +1,25 @@ + + + + + + 频道 (Channel) | Satori + + + + + + + + + + + + + + +
Skip to content

频道 (Channel)

类型定义

Channel

字段类型描述
idstring频道 ID
typeChannelType频道类型
namestring?频道名称
parent_idstring?父频道 ID

ChannelType

名称描述
TEXT0文本频道
DIRECT1私聊频道
CATEGORY2分类频道
VOICE3语音频道

API

获取群组频道

POST/channel.get
字段类型描述
channel_idstring频道 ID

根据 ID 获取频道。返回一个 Channel 对象。

获取群组频道列表

POST/channel.list
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群组中的全部频道。返回一个 Channel分页列表

创建群组频道

POST/channel.create
字段类型描述
guild_idstring群组 ID
dataChannel频道数据

创建群组频道。返回一个 Channel 对象。

修改群组频道

POST/channel.update
字段类型描述
channel_idstring频道 ID
dataChannel频道数据

修改群组频道。

删除群组频道

POST/channel.delete
字段类型描述
channel_idstring频道 ID

删除群组频道。

禁言群组频道 实验性

POST/channel.mute
字段类型描述
channel_idstring频道 ID
durationnumber禁言时长 (毫秒)

禁言群组频道。如果传入的禁言时长为 0 则表示解除禁言。

创建私聊频道

POST/user.channel.create
字段类型描述
user_idstring用户 ID
guild_idstring?群组 ID

创建一个私聊频道。返回一个 Channel 对象。

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/guild.html b/zh-CN/resources/guild.html new file mode 100644 index 0000000..b9fe25c --- /dev/null +++ b/zh-CN/resources/guild.html @@ -0,0 +1,25 @@ + + + + + + 群组 (Guild) | Satori + + + + + + + + + + + + + + +
Skip to content

群组 (Guild)

类型定义

Guild

字段类型描述
idstring群组 ID
namestring?群组名称
avatarstring?群组头像

API

获取群组

POST/guild.get
字段类型描述
guild_idstring群组 ID

根据 ID 获取。返回一个 Guild 对象。

获取群组列表

POST/guild.list
字段类型描述
nextstring?分页令牌

获取当前用户加入的全部群组。返回一个 Guild分页列表

处理群组邀请

POST/guild.approve
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring备注信息

处理来自群组的邀请。

事件

guild-added

加入群组时触发。必需资源:guild

guild-updated

群组被修改时触发。必需资源:guild

guild-removed

退出群组时触发。必需资源:guild

guild-request

接收到新的入群邀请时触发。必需资源:guild

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/interaction.html b/zh-CN/resources/interaction.html new file mode 100644 index 0000000..315c38d --- /dev/null +++ b/zh-CN/resources/interaction.html @@ -0,0 +1,25 @@ + + + + + + 交互 (Interaction) 实验性 | Satori + + + + + + + + + + + + + + +
Skip to content

交互 (Interaction) 实验性

TIP

交互功能主要通过机器人提供,并由用户在聊天应用中触发。如果你要实现或接入的聊天平台不支持机器人相关功能,那么可以直接忽略本节。

类型定义

Argv

字段类型描述
namestring指令名称
argumentsany[]参数
optionsobject选项

Button

字段类型描述
idstring按钮 ID

事件

interaction/button

类型为 action 的按钮被点击时触发。必需资源:button

interaction/command

调用斜线指令时触发。资源 argvmessage 中至少包含其一。

TIP

许多平台都支持斜线指令,但它们的实现方式各不相同。如果平台的斜线指令仅仅提供在前端,机器人无法直接判断一个事件是否为斜线指令调用,那么直接实现为普通消息事件即可。

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/login.html b/zh-CN/resources/login.html new file mode 100644 index 0000000..22070ef --- /dev/null +++ b/zh-CN/resources/login.html @@ -0,0 +1,25 @@ + + + + + + 登录信息 (Login) | Satori + + + + + + + + + + + + + + +
Skip to content
+ + + + \ No newline at end of file diff --git a/zh-CN/resources/member.html b/zh-CN/resources/member.html new file mode 100644 index 0000000..0bc90cb --- /dev/null +++ b/zh-CN/resources/member.html @@ -0,0 +1,25 @@ + + + + + + 群组成员 (GuildMember) | Satori + + + + + + + + + + + + + + +
Skip to content

群组成员 (GuildMember)

类型定义

GuildMember

字段类型描述
userUser?用户对象
nickstring?用户在群组中的名称
avatarstring?用户在群组中的头像
joined_atnumber?加入时间

API

获取群组成员

POST/guild.member.get
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID

获取群成员信息。返回一个 GuildMember 对象。

获取群组成员列表

POST/guild.member.list
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群成员列表。返回一个 GuildMember分页列表

踢出群组成员

POST/guild.member.kick
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
permanentboolean?是否永久踢出 (无法再次加入群组)

将某个用户踢出群组。

禁言群组成员 实验性

POST/guild.member.mute
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
durationnumber禁言时长 (毫秒)

将某个用户禁言。如果传入的禁言时长为 0 则表示解除禁言。

通过群组成员申请

POST/guild.member.approve
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring?备注信息

处理加群请求。

事件

guild-member-added

群组成员增加时触发。必需资源:guildmemberuser

guild-member-updated

群组成员信息更新时触发。必需资源:guildmemberuser

guild-member-removed

群组成员移除时触发。必需资源:guildmemberuser

guild-member-request

接收到新的加群请求时触发。必需资源:guildmemberuser

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/message.html b/zh-CN/resources/message.html new file mode 100644 index 0000000..b17c4fd --- /dev/null +++ b/zh-CN/resources/message.html @@ -0,0 +1,25 @@ + + + + + + 消息 (Message) | Satori + + + + + + + + + + + + + + +
Skip to content

消息 (Message)

类型定义

Message

字段类型描述
idstring消息 ID
contentstring消息内容
channelChannel?频道对象
guildGuild?群组对象
memberMember?群组成员对象
userUser?用户对象
created_atnumber?消息发送的时间戳
updated_atnumber?消息修改的时间戳

API

发送消息

POST/message.create
字段类型描述
channel_idstring频道 ID
contentstring消息内容

发送消息。返回一个 Message 对象构成的数组。

获取消息

POST/message.get
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID

获取特定消息。返回一个 Message 对象。必需资源:channeluser

撤回消息

POST/message.delete
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID

撤回特定消息。

编辑消息

POST/message.update
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
contentstring消息内容

编辑特定消息。

获取消息列表

POST/message.list
字段类型描述
channel_idstring频道 ID
nextstring?分页令牌
directionDirection?查询方向
limitnumber?消息数量限制
orderOrder?对结果排序

获取频道消息列表。返回一个 Message双向分页列表。必需资源:user

  • next 参数默认值为空,表示从最新消息开始查询。此时 direction 参数只能为 before
  • direction 参数默认为 before
  • order 参数默认为 asc (无论查询方向)。
  • limit 参数的默认值与平台默认值保持一致。如果平台 API 没有设定默认值,则可以自行设定,推荐值为 50。如果用户传入值超出平台要求的上限,则应当改为使用平台的上限值,而不是返回错误。开发者应当使用返回值中 prevnext 的存在性判断是否有更多数据,而非依赖于返回值中 data 的长度。

事件

message-created

当消息被创建时触发。必需资源:channelmessageuser

message-updated

当消息被编辑时触发。必需资源:channelmessageuser

message-deleted

当消息被删除时触发。必需资源:channelmessageuser

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/reaction.html b/zh-CN/resources/reaction.html new file mode 100644 index 0000000..6952741 --- /dev/null +++ b/zh-CN/resources/reaction.html @@ -0,0 +1,25 @@ + + + + + + 表态 (Reaction) 实验性 | Satori + + + + + + + + + + + + + + +
Skip to content

表态 (Reaction) 实验性

API

添加表态

POST/reaction.create
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称

向特定消息添加表态。

删除表态

POST/reaction.delete
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称
user_idstring?用户 ID

从特定消息删除某个用户添加的特定表态。如果没有传入用户 ID 则表示删除自己的表态。

清除表态

POST/reaction.clear
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring?表态名称

从特定消息清除某个特定表态。如果没有传入表态名称则表示清除所有表态。

获取表态列表

POST/reaction.list
字段类型描述
channel_idstring频道 ID
message_idstring消息 ID
emojistring表态名称
nextstring?分页令牌

获取添加特定消息的特定表态的用户列表。返回一个 User分页列表

事件

reaction-added

当表态被添加时触发。

reaction-removed

当表态被移除时触发。

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/role.html b/zh-CN/resources/role.html new file mode 100644 index 0000000..d8f3411 --- /dev/null +++ b/zh-CN/resources/role.html @@ -0,0 +1,25 @@ + + + + + + 群组角色 (GuildRole) | Satori + + + + + + + + + + + + + + +
Skip to content

群组角色 (GuildRole)

类型定义

GuildRole

字段类型描述
idstring角色 ID
namestring?角色名称

API

设置群组成员角色

POST/guild.member.role.set
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
role_idstring角色 ID

设置群组内用户的角色。

取消群组成员角色

POST/guild.member.role.unset
字段类型描述
guild_idstring群组 ID
user_idstring用户 ID
role_idstring角色 ID

取消群组内用户的角色。

获取群组角色列表

POST/guild.role.list
字段类型描述
guild_idstring群组 ID
nextstring?分页令牌

获取群组角色列表。返回一个 GuildRole分页列表

创建群组角色

POST/guild.role.create
字段类型描述
guild_idstring群组 ID
roleGuildRole角色数据

创建群组角色。返回一个 GuildRole 对象。

修改群组角色

POST/guild.role.update
字段类型描述
guild_idstring群组 ID
role_idstring角色 ID
roleGuildRole角色数据

修改群组角色。

删除群组角色

POST/guild.role.delete
字段类型描述
guild_idstring群组 ID
role_idstring角色 ID

删除群组角色。

事件

guild-role-created

群组角色被创建时触发。必需资源:guildrole

guild-role-updated

群组角色被修改时触发。必需资源:guildrole

guild-role-deleted

群组角色被删除时触发。必需资源:guildrole

+ + + + \ No newline at end of file diff --git a/zh-CN/resources/user.html b/zh-CN/resources/user.html new file mode 100644 index 0000000..754f45a --- /dev/null +++ b/zh-CN/resources/user.html @@ -0,0 +1,25 @@ + + + + + + 用户 (User) | Satori + + + + + + + + + + + + + + +
Skip to content

用户 (User)

类型定义

User

字段类型描述
idstring用户 ID
namestring?用户名称[1]
nickstring?用户昵称[1]
avatarstring?用户头像链接
is_botboolean?是否为机器人

TIP

[1] namenick 字段的区别

这两个字段都可以用于标识用户。在一些平台上 (例如 Telegram),一个用户存在多种不同概念的名称,因此 SDK 可以同时设置这两个字段。而另一些平台可能不存在这两个概念的对立关系,此时 SDK 只需要根据语义设置 namenick 中的一个即可。

在应用层实现上,nick 的优先级高于 name,因为昵称更容易被用户识别和理解。如果你正在开发基于 Satori 协议的客户端,在用户名的显示上应当优先使用 nick 字段,只有当 nick 为空时才使用 name 字段。

API

获取用户信息

POST/user.get
字段类型描述
user_idstring用户 ID

获取用户信息。返回一个 User 对象。

获取好友列表

POST/friend.list
字段类型描述
nextstring?分页令牌

获取好友列表。返回一个 User分页列表

处理好友申请

POST/friend.approve
字段类型描述
message_idstring请求 ID
approveboolean是否通过请求
commentstring?备注信息

处理好友申请。

事件

friend-request

接收到新的好友申请时触发。必需资源:user

+ + + + \ No newline at end of file