-1,w[1]=P<0||R-1||Y(w,"default"))&&l.push(p)}}}const f=[o,l];return ee(e)&&s.set(e,f),f}function Vs(e){return e[0]!=="$"}function qs(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function zs(e,t){return qs(e)===qs(t)}function Ys(e,t){return N(t)?t.findIndex(n=>zs(n,e)):D(t)&&zs(t,e)?0:-1}const li=e=>e[0]==="_"||e==="$stable",vs=e=>N(e)?e.map(Te):[Te(e)],wl=(e,t,n)=>{if(t._n)return t;const s=Ko((...r)=>vs(t(...r)),n);return s._c=!1,s},ci=(e,t,n)=>{const s=e._ctx;for(const r in e){if(li(r))continue;const i=e[r];if(D(i))t[r]=wl(r,i,s);else if(i!=null){const o=vs(i);t[r]=()=>o}}},ai=(e,t)=>{const n=vs(t);e.slots.default=()=>n},Cl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=J(t),on(t,"_",n)):ci(t,e.slots={})}else e.slots={},t&&ai(e,t);on(e.slots,Rn,1)},xl=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=te;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(oe(r,t),!n&&l===1&&delete r._):(i=!t.$stable,ci(t,r)),o=t}else t&&(ai(e,t),o={default:1});if(i)for(const l in r)!li(l)&&!(l in o)&&delete r[l]};function hn(e,t,n,s,r=!1){if(N(e)){e.forEach((g,w)=>hn(g,t&&(N(t)?t[w]:t),n,s,r));return}if(gt(s)&&!r)return;const i=s.shapeFlag&4?Pn(s.component)||s.component.proxy:s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,d=l.refs===te?l.refs={}:l.refs,p=l.setupState;if(f!=null&&f!==c&&(se(f)?(d[f]=null,Y(p,f)&&(p[f]=null)):ce(f)&&(f.value=null)),D(c))We(c,l,12,[o,d]);else{const g=se(c),w=ce(c);if(g||w){const R=()=>{if(e.f){const P=g?Y(p,c)?p[c]:d[c]:c.value;r?N(P)&&ns(P,i):N(P)?P.includes(i)||P.push(i):g?(d[c]=[i],Y(p,c)&&(p[c]=d[c])):(c.value=[i],e.k&&(d[e.k]=c.value))}else g?(d[c]=o,Y(p,c)&&(p[c]=o)):w&&(c.value=o,e.k&&(d[e.k]=o))};o?(R.id=-1,de(R,n)):R()}}}let Ue=!1;const Xt=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",Zt=e=>e.nodeType===8;function El(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,d=(_,y)=>{if(!y.hasChildNodes()){n(null,_,y),an(),y._vnode=_;return}Ue=!1,p(y.firstChild,_,null,null,null),an(),y._vnode=_,Ue&&console.error("Hydration completed but contains mismatches.")},p=(_,y,H,I,K,q=!1)=>{const k=Zt(_)&&_.data==="[",E=()=>P(_,y,H,I,K,k),{type:U,ref:j,shapeFlag:W,patchFlag:O}=y;let V=_.nodeType;y.el=_,O===-2&&(q=!1,y.dynamicChildren=null);let M=null;switch(U){case bt:V!==3?y.children===""?(c(y.el=r(""),o(_),_),M=_):M=E():(_.data!==y.children&&(Ue=!0,_.data=y.children),M=i(_));break;case be:V!==8||k?M=E():M=i(_);break;case Ft:if(k&&(_=i(_),V=_.nodeType),V===1||V===3){M=_;const ge=!y.children.length;for(let X=0;X{q=q||!!y.dynamicChildren;const{type:k,props:E,patchFlag:U,shapeFlag:j,dirs:W}=y,O=k==="input"&&W||k==="option";if(O||U!==-1){if(W&&Fe(y,null,H,"created"),E)if(O||!q||U&48)for(const M in E)(O&&M.endsWith("value")||Ut(M)&&!Rt(M))&&s(_,M,null,E[M],!1,void 0,H);else E.onClick&&s(_,"onClick",null,E.onClick,!1,void 0,H);let V;if((V=E&&E.onVnodeBeforeMount)&&ve(V,H,y),W&&Fe(y,null,H,"beforeMount"),((V=E&&E.onVnodeMounted)||W)&&zr(()=>{V&&ve(V,H,y),W&&Fe(y,null,H,"mounted")},I),j&16&&!(E&&(E.innerHTML||E.textContent))){let M=w(_.firstChild,y,_,H,I,K,q);for(;M;){Ue=!0;const ge=M;M=M.nextSibling,l(ge)}}else j&8&&_.textContent!==y.children&&(Ue=!0,_.textContent=y.children)}return _.nextSibling},w=(_,y,H,I,K,q,k)=>{k=k||!!y.dynamicChildren;const E=y.children,U=E.length;for(let j=0;j{const{slotScopeIds:k}=y;k&&(K=K?K.concat(k):k);const E=o(_),U=w(i(_),y,E,H,I,K,q);return U&&Zt(U)&&U.data==="]"?i(y.anchor=U):(Ue=!0,c(y.anchor=f("]"),E,U),U)},P=(_,y,H,I,K,q)=>{if(Ue=!0,y.el=null,q){const U=$(_);for(;;){const j=i(_);if(j&&j!==U)l(j);else break}}const k=i(_),E=o(_);return l(_),n(null,y,E,k,H,I,Xt(E),K),k},$=_=>{let y=0;for(;_;)if(_=i(_),_&&Zt(_)&&(_.data==="["&&y++,_.data==="]")){if(y===0)return i(_);y--}return _};return[d,p]}const de=zr;function Tl(e){return fi(e)}function Al(e){return fi(e,El)}function fi(e,t){const n=Bn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:d,parentNode:p,nextSibling:g,setScopeId:w=Pe,insertStaticContent:R}=e,P=(a,u,h,b=null,m=null,x=null,A=!1,C=null,T=!!u.dynamicChildren)=>{if(a===u)return;a&&!Ge(a,u)&&(b=kt(a),Ie(a,m,x,!0),a=null),u.patchFlag===-2&&(T=!1,u.dynamicChildren=null);const{type:v,ref:S,shapeFlag:F}=u;switch(v){case bt:$(a,u,h,b);break;case be:_(a,u,h,b);break;case Ft:a==null&&y(u,h,b,A);break;case he:O(a,u,h,b,m,x,A,C,T);break;default:F&1?K(a,u,h,b,m,x,A,C,T):F&6?V(a,u,h,b,m,x,A,C,T):(F&64||F&128)&&v.process(a,u,h,b,m,x,A,C,T,ot)}S!=null&&m&&hn(S,a&&a.ref,x,u||a,!u)},$=(a,u,h,b)=>{if(a==null)s(u.el=l(u.children),h,b);else{const m=u.el=a.el;u.children!==a.children&&f(m,u.children)}},_=(a,u,h,b)=>{a==null?s(u.el=c(u.children||""),h,b):u.el=a.el},y=(a,u,h,b)=>{[a.el,a.anchor]=R(a.children,u,h,b,a.el,a.anchor)},H=({el:a,anchor:u},h,b)=>{let m;for(;a&&a!==u;)m=g(a),s(a,h,b),a=m;s(u,h,b)},I=({el:a,anchor:u})=>{let h;for(;a&&a!==u;)h=g(a),r(a),a=h;r(u)},K=(a,u,h,b,m,x,A,C,T)=>{A=A||u.type==="svg",a==null?q(u,h,b,m,x,A,C,T):U(a,u,m,x,A,C,T)},q=(a,u,h,b,m,x,A,C)=>{let T,v;const{type:S,props:F,shapeFlag:L,transition:B,dirs:z}=a;if(T=a.el=o(a.type,x,F&&F.is,F),L&8?d(T,a.children):L&16&&E(a.children,T,null,b,m,x&&S!=="foreignObject",A,C),z&&Fe(a,null,b,"created"),k(T,a,a.scopeId,A,b),F){for(const Z in F)Z!=="value"&&!Rt(Z)&&i(T,Z,null,F[Z],x,a.children,b,m,Le);"value"in F&&i(T,"value",null,F.value),(v=F.onVnodeBeforeMount)&&ve(v,b,a)}z&&Fe(a,null,b,"beforeMount");const G=(!m||m&&!m.pendingBranch)&&B&&!B.persisted;G&&B.beforeEnter(T),s(T,u,h),((v=F&&F.onVnodeMounted)||G||z)&&de(()=>{v&&ve(v,b,a),G&&B.enter(T),z&&Fe(a,null,b,"mounted")},m)},k=(a,u,h,b,m)=>{if(h&&w(a,h),b)for(let x=0;x{for(let v=T;v{const C=u.el=a.el;let{patchFlag:T,dynamicChildren:v,dirs:S}=u;T|=a.patchFlag&16;const F=a.props||te,L=u.props||te;let B;h&&Je(h,!1),(B=L.onVnodeBeforeUpdate)&&ve(B,h,u,a),S&&Fe(u,a,h,"beforeUpdate"),h&&Je(h,!0);const z=m&&u.type!=="foreignObject";if(v?j(a.dynamicChildren,v,C,h,b,z,x):A||Q(a,u,C,null,h,b,z,x,!1),T>0){if(T&16)W(C,u,F,L,h,b,m);else if(T&2&&F.class!==L.class&&i(C,"class",null,L.class,m),T&4&&i(C,"style",F.style,L.style,m),T&8){const G=u.dynamicProps;for(let Z=0;Z{B&&ve(B,h,u,a),S&&Fe(u,a,h,"updated")},b)},j=(a,u,h,b,m,x,A)=>{for(let C=0;C{if(h!==b){if(h!==te)for(const C in h)!Rt(C)&&!(C in b)&&i(a,C,h[C],null,A,u.children,m,x,Le);for(const C in b){if(Rt(C))continue;const T=b[C],v=h[C];T!==v&&C!=="value"&&i(a,C,v,T,A,u.children,m,x,Le)}"value"in b&&i(a,"value",h.value,b.value)}},O=(a,u,h,b,m,x,A,C,T)=>{const v=u.el=a?a.el:l(""),S=u.anchor=a?a.anchor:l("");let{patchFlag:F,dynamicChildren:L,slotScopeIds:B}=u;B&&(C=C?C.concat(B):B),a==null?(s(v,h,b),s(S,h,b),E(u.children,h,S,m,x,A,C,T)):F>0&&F&64&&L&&a.dynamicChildren?(j(a.dynamicChildren,L,h,m,x,A,C),(u.key!=null||m&&u===m.subTree)&&ws(a,u,!0)):Q(a,u,h,S,m,x,A,C,T)},V=(a,u,h,b,m,x,A,C,T)=>{u.slotScopeIds=C,a==null?u.shapeFlag&512?m.ctx.activate(u,h,b,A,T):M(u,h,b,m,x,A,T):ge(a,u,T)},M=(a,u,h,b,m,x,A)=>{const C=a.component=$l(a,b,m);if(Dt(a)&&(C.ctx.renderer=ot),jl(C),C.asyncDep){if(m&&m.registerDep(C,X),!a.el){const T=C.subTree=re(be);_(null,T,u,h)}return}X(C,a,u,h,m,x,A)},ge=(a,u,h)=>{const b=u.component=a.component;if(Vo(a,u,h))if(b.asyncDep&&!b.asyncResolved){ne(b,u,h);return}else b.next=u,jo(b.update),b.update();else u.el=a.el,b.vnode=u},X=(a,u,h,b,m,x,A)=>{const C=()=>{if(a.isMounted){let{next:S,bu:F,u:L,parent:B,vnode:z}=a,G=S,Z;Je(a,!1),S?(S.el=z.el,ne(a,S,A)):S=z,F&&tn(F),(Z=S.props&&S.props.onVnodeBeforeUpdate)&&ve(Z,B,S,z),Je(a,!0);const ie=Fn(a),xe=a.subTree;a.subTree=ie,P(xe,ie,p(xe.el),kt(xe),a,m,x),S.el=ie.el,G===null&&qo(a,ie.el),L&&de(L,m),(Z=S.props&&S.props.onVnodeUpdated)&&de(()=>ve(Z,B,S,z),m)}else{let S;const{el:F,props:L}=u,{bm:B,m:z,parent:G}=a,Z=gt(u);if(Je(a,!1),B&&tn(B),!Z&&(S=L&&L.onVnodeBeforeMount)&&ve(S,G,u),Je(a,!0),F&&On){const ie=()=>{a.subTree=Fn(a),On(F,a.subTree,a,m,null)};Z?u.type.__asyncLoader().then(()=>!a.isUnmounted&&ie()):ie()}else{const ie=a.subTree=Fn(a);P(null,ie,h,b,a,m,x),u.el=ie.el}if(z&&de(z,m),!Z&&(S=L&&L.onVnodeMounted)){const ie=u;de(()=>ve(S,G,ie),m)}(u.shapeFlag&256||G&>(G.vnode)&&G.vnode.shapeFlag&256)&&a.a&&de(a.a,m),a.isMounted=!0,u=h=b=null}},T=a.effect=new cs(C,()=>vn(v),a.scope),v=a.update=()=>T.run();v.id=a.uid,Je(a,!0),v()},ne=(a,u,h)=>{u.component=a;const b=a.vnode.props;a.vnode=u,a.next=null,vl(a,u.props,b,h),xl(a,u.children,h),wt(),$s(),Ct()},Q=(a,u,h,b,m,x,A,C,T=!1)=>{const v=a&&a.children,S=a?a.shapeFlag:0,F=u.children,{patchFlag:L,shapeFlag:B}=u;if(L>0){if(L&128){Kt(v,F,h,b,m,x,A,C,T);return}else if(L&256){ze(v,F,h,b,m,x,A,C,T);return}}B&8?(S&16&&Le(v,m,x),F!==v&&d(h,F)):S&16?B&16?Kt(v,F,h,b,m,x,A,C,T):Le(v,m,x,!0):(S&8&&d(h,""),B&16&&E(F,h,b,m,x,A,C,T))},ze=(a,u,h,b,m,x,A,C,T)=>{a=a||ft,u=u||ft;const v=a.length,S=u.length,F=Math.min(v,S);let L;for(L=0;LS?Le(a,m,x,!0,!1,F):E(u,h,b,m,x,A,C,T,F)},Kt=(a,u,h,b,m,x,A,C,T)=>{let v=0;const S=u.length;let F=a.length-1,L=S-1;for(;v<=F&&v<=L;){const B=a[v],z=u[v]=T?Ke(u[v]):Te(u[v]);if(Ge(B,z))P(B,z,h,null,m,x,A,C,T);else break;v++}for(;v<=F&&v<=L;){const B=a[F],z=u[L]=T?Ke(u[L]):Te(u[L]);if(Ge(B,z))P(B,z,h,null,m,x,A,C,T);else break;F--,L--}if(v>F){if(v<=L){const B=L+1,z=BL)for(;v<=F;)Ie(a[v],m,x,!0),v++;else{const B=v,z=v,G=new Map;for(v=z;v<=L;v++){const me=u[v]=T?Ke(u[v]):Te(u[v]);me.key!=null&&G.set(me.key,v)}let Z,ie=0;const xe=L-z+1;let lt=!1,As=0;const xt=new Array(xe);for(v=0;v=xe){Ie(me,m,x,!0);continue}let Oe;if(me.key!=null)Oe=G.get(me.key);else for(Z=z;Z<=L;Z++)if(xt[Z-z]===0&&Ge(me,u[Z])){Oe=Z;break}Oe===void 0?Ie(me,m,x,!0):(xt[Oe-z]=v+1,Oe>=As?As=Oe:lt=!0,P(me,u[Oe],h,null,m,x,A,C,T),ie++)}const Rs=lt?Rl(xt):ft;for(Z=Rs.length-1,v=xe-1;v>=0;v--){const me=z+v,Oe=u[me],Ps=me+1{const{el:x,type:A,transition:C,children:T,shapeFlag:v}=a;if(v&6){Ye(a.component.subTree,u,h,b);return}if(v&128){a.suspense.move(u,h,b);return}if(v&64){A.move(a,u,h,ot);return}if(A===he){s(x,u,h);for(let F=0;FC.enter(x),m);else{const{leave:F,delayLeave:L,afterLeave:B}=C,z=()=>s(x,u,h),G=()=>{F(x,()=>{z(),B&&B()})};L?L(x,z,G):G()}else s(x,u,h)},Ie=(a,u,h,b=!1,m=!1)=>{const{type:x,props:A,ref:C,children:T,dynamicChildren:v,shapeFlag:S,patchFlag:F,dirs:L}=a;if(C!=null&&hn(C,null,h,a,!0),S&256){u.ctx.deactivate(a);return}const B=S&1&&L,z=!gt(a);let G;if(z&&(G=A&&A.onVnodeBeforeUnmount)&&ve(G,u,a),S&6)Li(a.component,h,b);else{if(S&128){a.suspense.unmount(h,b);return}B&&Fe(a,null,u,"beforeUnmount"),S&64?a.type.remove(a,u,h,m,ot,b):v&&(x!==he||F>0&&F&64)?Le(v,u,h,!1,!0):(x===he&&F&384||!m&&S&16)&&Le(T,u,h),b&&Es(a)}(z&&(G=A&&A.onVnodeUnmounted)||B)&&de(()=>{G&&ve(G,u,a),B&&Fe(a,null,u,"unmounted")},h)},Es=a=>{const{type:u,el:h,anchor:b,transition:m}=a;if(u===he){Si(h,b);return}if(u===Ft){I(a);return}const x=()=>{r(h),m&&!m.persisted&&m.afterLeave&&m.afterLeave()};if(a.shapeFlag&1&&m&&!m.persisted){const{leave:A,delayLeave:C}=m,T=()=>A(h,x);C?C(a.el,x,T):T()}else x()},Si=(a,u)=>{let h;for(;a!==u;)h=g(a),r(a),a=h;r(u)},Li=(a,u,h)=>{const{bum:b,scope:m,update:x,subTree:A,um:C}=a;b&&tn(b),m.stop(),x&&(x.active=!1,Ie(A,a,u,h)),C&&de(C,u),de(()=>{a.isUnmounted=!0},u),u&&u.pendingBranch&&!u.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===u.pendingId&&(u.deps--,u.deps===0&&u.resolve())},Le=(a,u,h,b=!1,m=!1,x=0)=>{for(let A=x;Aa.shapeFlag&6?kt(a.component.subTree):a.shapeFlag&128?a.suspense.next():g(a.anchor||a.el),Ts=(a,u,h)=>{a==null?u._vnode&&Ie(u._vnode,null,null,!0):P(u._vnode||null,a,u,null,null,null,h),$s(),an(),u._vnode=a},ot={p:P,um:Ie,m:Ye,r:Es,mt:M,mc:E,pc:Q,pbc:j,n:kt,o:e};let In,On;return t&&([In,On]=t(ot)),{render:Ts,hydrate:In,createApp:_l(Ts,In)}}function Je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function ws(e,t,n=!1){const s=e.children,r=t.children;if(N(s)&&N(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}const Pl=e=>e.__isTeleport,Ot=e=>e&&(e.disabled||e.disabled===""),Js=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Zn=(e,t)=>{const n=e&&e.to;return se(n)?t?t(n):null:n},Il={__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:d,pc:p,pbc:g,o:{insert:w,querySelector:R,createText:P,createComment:$}}=f,_=Ot(t.props);let{shapeFlag:y,children:H,dynamicChildren:I}=t;if(e==null){const K=t.el=P(""),q=t.anchor=P("");w(K,n,s),w(q,n,s);const k=t.target=Zn(t.props,R),E=t.targetAnchor=P("");k&&(w(E,k),o=o||Js(k));const U=(j,W)=>{y&16&&d(H,j,W,r,i,o,l,c)};_?U(n,q):k&&U(k,E)}else{t.el=e.el;const K=t.anchor=e.anchor,q=t.target=e.target,k=t.targetAnchor=e.targetAnchor,E=Ot(e.props),U=E?n:q,j=E?K:k;if(o=o||Js(q),I?(g(e.dynamicChildren,I,U,r,i,o,l),ws(e,t,!0)):c||p(e,t,U,j,r,i,o,l,!1),_)E||Qt(t,n,K,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const W=t.target=Zn(t.props,R);W&&Qt(t,W,null,f,0)}else E&&Qt(t,q,k,f,1)}ui(t)},remove(e,t,n,s,{um:r,o:{remove:i}},o){const{shapeFlag:l,children:c,anchor:f,targetAnchor:d,target:p,props:g}=e;if(p&&i(d),(o||!Ot(g))&&(i(f),l&16))for(let w=0;w0?Re||ft:null,Fl(),jt>0&&Re&&Re.push(e),e}function ia(e,t,n,s,r,i){return hi(mi(e,t,n,s,r,i,!0))}function pi(e,t,n,s,r){return hi(re(e,t,n,s,r,!0))}function pn(e){return e?e.__v_isVNode===!0:!1}function Ge(e,t){return e.type===t.type&&e.key===t.key}const Rn="__vInternal",gi=({key:e})=>e??null,sn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?se(e)||ce(e)||D(e)?{i:ae,r:e,k:t,f:!!n}:e:null);function mi(e,t=null,n=null,s=0,r=null,i=e===he?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&gi(t),ref:t&&sn(t),scopeId:Cn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ae};return l?(Cs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=se(n)?8:16),jt>0&&!o&&Re&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Re.push(c),c}const re=Ml;function Ml(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===ei)&&(e=be),pn(e)){const l=qe(e,t,!0);return n&&Cs(l,n),jt>0&&!i&&Re&&(l.shapeFlag&6?Re[Re.indexOf(e)]=l:Re.push(l)),l.patchFlag|=-2,l}if(Kl(e)&&(e=e.__vccOpts),t){t=Sl(t);let{class:l,style:c}=t;l&&!se(l)&&(t.class=os(l)),ee(c)&&(Ur(c)&&!N(c)&&(c=oe({},c)),t.style=is(c))}const o=se(e)?1:zo(e)?128:Pl(e)?64:ee(e)?4:D(e)?2:0;return mi(e,t,n,s,r,o,i,!0)}function Sl(e){return e?Ur(e)||Rn in e?oe({},e):e:null}function qe(e,t,n=!1){const{props:s,ref:r,patchFlag:i,children:o}=e,l=t?Ll(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&gi(l),ref:t&&t.ref?n&&r?N(r)?r.concat(sn(t)):[r,sn(t)]:sn(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==he?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qe(e.ssContent),ssFallback:e.ssFallback&&qe(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function _i(e=" ",t=0){return re(bt,null,e,t)}function oa(e,t){const n=re(Ft,null,e);return n.staticCount=t,n}function la(e="",t=!1){return t?(di(),pi(be,null,e)):re(be,null,e)}function Te(e){return e==null||typeof e=="boolean"?re(be):N(e)?re(he,null,e.slice()):typeof e=="object"?Ke(e):re(bt,null,String(e))}function Ke(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qe(e)}function Cs(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(N(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Cs(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Rn in t)?t._ctx=ae:r===3&&ae&&(ae.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else D(t)?(t={default:t,_ctx:ae},n=32):(t=String(t),s&64?(n=16,t=[_i(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ll(...e){const t={};for(let n=0;nle||ae;let xs,ct,Zs="__VUE_INSTANCE_SETTERS__";(ct=Bn()[Zs])||(ct=Bn()[Zs]=[]),ct.push(e=>le=e),xs=e=>{ct.length>1?ct.forEach(t=>t(e)):ct[0](e)};const yt=e=>{xs(e),e.scope.on()},rt=()=>{le&&le.scope.off(),xs(null)};function yi(e){return e.vnode.shapeFlag&4}let vt=!1;function jl(e,t=!1){vt=t;const{props:n,children:s}=e.vnode,r=yi(e);yl(e,n,r,t),Cl(e,s);const i=r?Ul(e,t):void 0;return vt=!1,i}function Ul(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Pt(new Proxy(e.ctx,al));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?wi(e):null;yt(e),wt();const i=We(s,e,0,[e.props,r]);if(Ct(),rt(),xr(i)){if(i.then(rt,rt),t)return i.then(o=>{Qs(e,o,t)}).catch(o=>{Bt(o,e,0)});e.asyncDep=i}else Qs(e,i,t)}else vi(e,t)}function Qs(e,t,n){D(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ee(t)&&(e.setupState=Dr(t)),vi(e,n)}let Gs;function vi(e,t,n){const s=e.type;if(!e.render){if(!t&&Gs&&!s.render){const r=s.template||ys(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=oe(oe({isCustomElement:i,delimiters:l},o),c);s.render=Gs(r,f)}}e.render=s.render||Pe}yt(e),wt(),ul(e),Ct(),rt()}function Bl(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return pe(e,"get","$attrs"),t[n]}}))}function wi(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return Bl(e)},slots:e.slots,emit:e.emit,expose:t}}function Pn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Dr(Pt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in It)return It[n](e)},has(t,n){return n in t||n in It}}))}function Dl(e,t=!0){return D(e)?e.displayName||e.name:e.name||t&&e.__name}function Kl(e){return D(e)&&"__vccOpts"in e}const Ee=(e,t)=>No(e,t,vt);function Qn(e,t,n){const s=arguments.length;return s===2?ee(t)&&!N(t)?pn(t)?re(e,null,[t]):re(e,t):re(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&pn(n)&&(n=[n]),re(e,t,n))}const kl=Symbol.for("v-scx"),Wl=()=>mt(kl),Vl="3.3.4",ql="http://www.w3.org/2000/svg",et=typeof document<"u"?document:null,er=et&&et.createElement("template"),zl={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?et.createElementNS(ql,e):et.createElement(e,n?{is:n}:void 0);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>et.createTextNode(e),createComment:e=>et.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>et.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{er.innerHTML=s?`${e} `:e;const l=er.content;if(s){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]}};function Yl(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}function Jl(e,t,n){const s=e.style,r=se(n);if(n&&!r){if(t&&!se(t))for(const i in t)n[i]==null&&Gn(s,i,"");for(const i in n)Gn(s,i,n[i])}else{const i=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(s.display=i)}}const tr=/\s*!important$/;function Gn(e,t,n){if(N(n))n.forEach(s=>Gn(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=Xl(e,t);tr.test(n)?e.setProperty(it(s),n.replace(tr,""),"important"):e[s]=n}}const nr=["Webkit","Moz","ms"],Nn={};function Xl(e,t){const n=Nn[t];if(n)return n;let s=Se(t);if(s!=="filter"&&s in e)return Nn[t]=s;s=_n(s);for(let r=0;rHn||(nc.then(()=>Hn=0),Hn=Date.now());function rc(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ce(ic(s,n.value),t,5,[s])};return n.value=e,n.attached=sc(),n}function ic(e,t){if(N(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 ir=/^on[a-z]/,oc=(e,t,n,s,r=!1,i,o,l,c)=>{t==="class"?Yl(e,s,r):t==="style"?Jl(e,n,s):Ut(t)?ts(t)||ec(e,t,n,s,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):lc(e,t,s,r))?Ql(e,t,s,i,o,l,c):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Zl(e,t,s,r))};function lc(e,t,n,s){return s?!!(t==="innerHTML"||t==="textContent"||t in e&&ir.test(t)&&D(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||ir.test(t)&&se(n)?!1:t in e}const Be="transition",Et="animation",Ci=(e,{slots:t})=>Qn(Qo,cc(e),t);Ci.displayName="Transition";const xi={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};Ci.props=oe({},Jr,xi);const Xe=(e,t=[])=>{N(e)?e.forEach(n=>n(...t)):e&&e(...t)},or=e=>e?N(e)?e.some(t=>t.length>1):e.length>1:!1;function cc(e){const t={};for(const O in e)O in xi||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:d=l,leaveFromClass:p=`${n}-leave-from`,leaveActiveClass:g=`${n}-leave-active`,leaveToClass:w=`${n}-leave-to`}=e,R=ac(r),P=R&&R[0],$=R&&R[1],{onBeforeEnter:_,onEnter:y,onEnterCancelled:H,onLeave:I,onLeaveCancelled:K,onBeforeAppear:q=_,onAppear:k=y,onAppearCancelled:E=H}=t,U=(O,V,M)=>{Ze(O,V?d:l),Ze(O,V?f:o),M&&M()},j=(O,V)=>{O._isLeaving=!1,Ze(O,p),Ze(O,w),Ze(O,g),V&&V()},W=O=>(V,M)=>{const ge=O?k:y,X=()=>U(V,O,M);Xe(ge,[V,X]),lr(()=>{Ze(V,O?c:i),De(V,O?d:l),or(ge)||cr(V,s,P,X)})};return oe(t,{onBeforeEnter(O){Xe(_,[O]),De(O,i),De(O,o)},onBeforeAppear(O){Xe(q,[O]),De(O,c),De(O,f)},onEnter:W(!1),onAppear:W(!0),onLeave(O,V){O._isLeaving=!0;const M=()=>j(O,V);De(O,p),dc(),De(O,g),lr(()=>{O._isLeaving&&(Ze(O,p),De(O,w),or(I)||cr(O,s,$,M))}),Xe(I,[O,M])},onEnterCancelled(O){U(O,!1),Xe(H,[O])},onAppearCancelled(O){U(O,!0),Xe(E,[O])},onLeaveCancelled(O){j(O),Xe(K,[O])}})}function ac(e){if(e==null)return null;if(ee(e))return[$n(e.enter),$n(e.leave)];{const t=$n(e);return[t,t]}}function $n(e){return Di(e)}function De(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Ze(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function lr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let fc=0;function cr(e,t,n,s){const r=e._endId=++fc,i=()=>{r===e._endId&&s()};if(n)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=uc(e,t);if(!o)return s();const f=o+"end";let d=0;const p=()=>{e.removeEventListener(f,g),i()},g=w=>{w.target===e&&++d>=c&&p()};setTimeout(()=>{d(n[R]||"").split(", "),r=s(`${Be}Delay`),i=s(`${Be}Duration`),o=ar(r,i),l=s(`${Et}Delay`),c=s(`${Et}Duration`),f=ar(l,c);let d=null,p=0,g=0;t===Be?o>0&&(d=Be,p=o,g=i.length):t===Et?f>0&&(d=Et,p=f,g=c.length):(p=Math.max(o,f),d=p>0?o>f?Be:Et:null,g=d?d===Be?i.length:c.length:0);const w=d===Be&&/\b(transform|all)(,|$)/.test(s(`${Be}Property`).toString());return{type:d,timeout:p,propCount:g,hasTransform:w}}function ar(e,t){for(;e.lengthfr(n)+fr(e[s])))}function fr(e){return Number(e.slice(0,-1).replace(",","."))*1e3}function dc(){return document.body.offsetHeight}const ur=e=>{const t=e.props["onUpdate:modelValue"]||!1;return N(t)?n=>tn(t,n):t};function hc(e){e.target.composing=!0}function dr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ca={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e._assign=ur(r);const i=s||r.props&&r.props.type==="number";at(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=Un(l)),e._assign(l)}),n&&at(e,"change",()=>{e.value=e.value.trim()}),t||(at(e,"compositionstart",hc),at(e,"compositionend",dr),at(e,"change",dr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},i){if(e._assign=ur(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||s&&e.value.trim()===t||(r||e.type==="number")&&Un(e.value)===t))return;const o=t??"";e.value!==o&&(e.value=o)}},pc=["ctrl","shift","alt","meta"],gc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>pc.some(n=>e[`${n}Key`]&&!t.includes(n))},aa=(e,t)=>(n,...s)=>{for(let r=0;rn=>{if(!("key"in n))return;const s=it(n.key);if(t.some(r=>r===s||mc[r]===s))return e(n)},Ei=oe({patchProp:oc},zl);let St,hr=!1;function _c(){return St||(St=Tl(Ei))}function bc(){return St=hr?St:Al(Ei),hr=!0,St}const ua=(...e)=>{const t=_c().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(!r)return;const i=t._component;!D(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.innerHTML="";const o=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},da=(...e)=>{const t=bc().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ti(s);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ti(e){return se(e)?document.querySelector(e):e}const ha=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},yc=window.__VP_SITE_DATA__,Ai=/^[a-z]+:/i,pa=/^pathname:\/\//,ga="vitepress-theme-appearance",Ri=/#.*$/,vc=/(index)?\.(md|html)$/,we=typeof document<"u",Pi={relativePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function wc(e,t,n=!1){if(t===void 0)return!1;if(e=pr(`/${e}`),n)return new RegExp(t).test(e);if(pr(t)!==e)return!1;const s=t.match(Ri);return s?(we?location.hash:"")===s[0]:!0}function pr(e){return decodeURI(e).replace(Ri,"").replace(vc,"")}function Cc(e){return Ai.test(e)}function xc(e,t){var s,r,i,o,l,c,f;const n=Object.keys(e.locales).find(d=>d!=="root"&&!Cc(d)&&wc(t,`/${d}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Oi(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Ii(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=Ec(e.title,s);return`${n}${r}`}function Ec(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Tc(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 Oi(e,t){return[...e.filter(n=>!Tc(t,n)),...t]}const Ac=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Rc=/^[a-z]:/i;function gr(e){const t=Rc.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Ac,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}function ma(e){return e.replace(/\\/g,"/")}const Pc=Symbol(),nt=Ao(yc);function _a(e){const t=Ee(()=>xc(nt.value,e.data.relativePath));return{site:t,theme:Ee(()=>t.value.themeConfig),page:Ee(()=>e.data),frontmatter:Ee(()=>e.data.frontmatter),params:Ee(()=>e.data.params),lang:Ee(()=>t.value.lang),dir:Ee(()=>t.value.dir),localeIndex:Ee(()=>t.value.localeIndex||"root"),title:Ee(()=>Ii(t.value,e.data)),description:Ee(()=>e.data.description||t.value.description),isDark:ht(!1)}}function ba(){const e=mt(Pc);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ic(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function mr(e){return Ai.test(e)||e.startsWith(".")?e:Ic(nt.value.base,e)}function Oc(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),we){const n="/fes.js/";t=gr(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),t=`${n}assets/${t}.${s}.js`}else t=`./${gr(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let rn=[];function ya(e){rn.push(e),An(()=>{rn=rn.filter(t=>t!==e)})}const Fc=Symbol(),_r="http://a.com",Mc=()=>({path:"/",component:null,data:Pi});function va(e,t){const n=yn(Mc()),s={route:n,go:r};async function r(l=we?location.href:"/"){var f,d;await((f=s.onBeforeRouteChange)==null?void 0:f.call(s,l));const c=new URL(l,_r);nt.value.cleanUrls||!c.pathname.endsWith("/")&&!c.pathname.endsWith(".html")&&(c.pathname+=".html",l=c.pathname+c.search+c.hash),we&&l!==location.href&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",l)),await o(l),await((d=s.onAfterRouteChanged)==null?void 0:d.call(s,l))}let i=null;async function o(l,c=0,f=!1){const d=new URL(l,_r),p=i=d.pathname;try{let g=await e(p);if(i===p){i=null;const{default:w,__pageData:R}=g;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=we?p:mr(p),n.component=Pt(w),n.data=Pt(R),we&&kr(()=>{let P=nt.value.base+R.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!nt.value.cleanUrls&&!P.endsWith("/")&&(P+=".html"),P!==d.pathname&&(d.pathname=P,l=P+d.search+d.hash,history.replaceState(null,"",l)),d.hash&&!c){let $=null;try{$=document.querySelector(decodeURIComponent(d.hash))}catch(_){console.warn(_)}if($){br($,d.hash);return}}window.scrollTo(0,c)})}}catch(g){if(!/fetch/.test(g.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(g),!f)try{const w=await fetch(nt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await o(l,c,!0);return}catch{}i===p&&(i=null,n.path=we?p:mr(p),n.component=t?Pt(t):null,n.data=Pi)}}return we&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const f=l.target.closest("a");if(f&&!f.closest(".vp-raw")&&(f instanceof SVGElement||!f.download)){const{target:d}=f,{href:p,origin:g,pathname:w,hash:R,search:P}=new URL(f.href instanceof SVGAnimatedString?f.href.animVal:f.href,f.baseURI),$=window.location,_=w.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&d!=="_blank"&&g===$.origin&&!(_&&_[0]!==".html")&&(l.preventDefault(),w===$.pathname&&P===$.search?R&&R!==$.hash&&(history.pushState(null,"",R),window.dispatchEvent(new Event("hashchange")),br(f,R,f.classList.contains("header-anchor"))):r(p))}},{capture:!0}),window.addEventListener("popstate",l=>{o(location.href,l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function Sc(){const e=mt(Fc);if(!e)throw new Error("useRouter() is called without provider.");return e}function Fi(){return Sc().route}function br(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.querySelector(decodeURIComponent(t))}catch(r){console.warn(r)}if(s){const r=nt.value.scrollOffset;let i=0;if(typeof r=="number")i=r;else if(typeof r=="string")i=yr(r);else if(Array.isArray(r))for(const c of r){const f=yr(c);if(f){i=f;break}}const o=parseInt(window.getComputedStyle(s).paddingTop,10),l=window.scrollY+s.getBoundingClientRect().top-i+o;!n||Math.abs(l-window.scrollY)>window.innerHeight?window.scrollTo(0,l):window.scrollTo({left:0,top:l,behavior:"smooth"})}}function yr(e){const t=document.querySelector(e);if(!t)return 0;const n=t.getBoundingClientRect().bottom;return n<0?0:n+24}const vr=()=>rn.forEach(e=>e()),wa=_s({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Fi();return()=>Qn(e.as,{style:{position:"relative"}},[t.component?Qn(t.component,{onVnodeMounted:vr,onVnodeUpdated:vr}):"404 Page Not Found"])}}),Lc="modulepreload",Nc=function(e){return"/fes.js/"+e},wr={},Ca=function(t,n,s){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Nc(i),i in wr)return;wr[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!s)for(let d=r.length-1;d>=0;d--){const p=r[d];if(p.href===i&&(!o||p.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const f=document.createElement("link");if(f.rel=o?"stylesheet":Lc,o||(f.as="script",f.crossOrigin=""),f.href=i,document.head.appendChild(f),o)return new Promise((d,p)=>{f.addEventListener("load",d),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})};function xa(e,t){let n=[],s=!0;const r=i=>{if(s){s=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=Hc(o);document.head.appendChild(l),n.push(l)})};Yo(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Ii(o,i),document.querySelector("meta[name=description]").setAttribute("content",l||o.description),r(Oi(o.head,jc(c)))})}function Hc([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),s}function $c(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function jc(e){return e.filter(t=>!$c(t))}const jn=new Set,Mi=()=>document.createElement("link"),Uc=e=>{const t=Mi();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Bc=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let Gt;const Dc=we&&(Gt=Mi())&&Gt.relList&&Gt.relList.supports&&Gt.relList.supports("prefetch")?Uc:Bc;function Ea(){if(!we||!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(!jn.has(c)){jn.add(c);const f=Oc(c);Dc(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{target:o}=i,{hostname:l,pathname:c}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),f=c.match(/\.\w+$/);f&&f[0]!==".html"||o!=="_blank"&&l===location.hostname&&(c!==location.pathname?n.observe(i):jn.add(c))})})};Tn(s);const r=Fi();nn(()=>r.path,s),An(()=>{n&&n.disconnect()})}const Ta=_s({setup(e,{slots:t}){const n=ht(!1);return Tn(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Aa(){if(we){const e=new Map;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);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+`
+`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Kc(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Kc(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 Ra(){we&&window.addEventListener("click",e=>{var n,s;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement,i=Array.from((r==null?void 0:r.querySelectorAll("input"))||[]).indexOf(t),o=r==null?void 0:r.querySelector('div[class*="language-"].active'),l=(s=r==null?void 0:r.querySelectorAll('div[class*="language-"]:not(.language-id)'))==null?void 0:s[i];o&&l&&o!==l&&(o.classList.remove("active"),l.classList.add("active"))}})}export{ya as $,Fi as A,An as B,mi as C,pi as D,Ko as E,he as F,la as G,Qc as H,Ll as I,re as J,is as K,Zc as L,Ca as M,Gc as N,Ai as O,pa as P,we as Q,ea as R,zc as S,Ci as T,Yc as U,oa as V,ga as W,mt as X,bl as Y,rl as Z,ha as _,_i as a,na as a0,fa as a1,Jc as a2,aa as a3,sa as a4,xa as a5,Fc as a6,_a as a7,Pc as a8,wa as a9,Ta as aa,nt as ab,da as ac,va as ad,Oc as ae,Ea as af,Aa as ag,Ra as ah,Qn as ai,Sc as aj,Gr as ak,Xc as al,ca as am,ra as an,Pt as ao,ua as ap,ma as aq,Po as b,ia as c,_s as d,Wc as e,qc as f,Xi as g,jr as h,Vc as i,ht as j,Tn as k,kr as l,bi as m,os as n,di as o,Ee as p,Yo as q,ta as r,ce as s,kc as t,ba as u,Ao as v,nn as w,Cc as x,mr as y,wc as z};
diff --git a/assets/chunks/theme.1ddd4103.js b/assets/chunks/theme.1ddd4103.js
deleted file mode 100644
index 059a23e48..000000000
--- a/assets/chunks/theme.1ddd4103.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import{d as y,o as a,c as i,r as _,a as O,t as I,n as B,_ as m,u as tt,b as l,e as Mt,f as Me,g as It,h as S,i as At,j as Nt,w as K,k as te,l as V,m as Ct,s as le,p as Tt,q as R,v as nt,x as Bt,P as xt,y as ce,z as ne,A as ue,B as Ie,C as d,F as N,D as P,E as p,G as g,T as Ae,H as q,I as Q,J as h,K as ot,L as Ot,M as Et,N as Z,O as Ht,Q as Dt,R as E,S as F,U as j,V as zt,W as Ge,X as Ne,Y as pe,Z as Ft,$ as ae,a0 as jt,a1 as Gt,a2 as Rt,a3 as Ut,a4 as Wt}from"./framework.85b09291.js";const Kt=y({__name:"VPBadge",props:{text:{},type:{}},setup(t){return(e,n)=>(a(),i("span",{class:B(["VPBadge",e.type??"tip"])},[_(e.$slots,"default",{},()=>[O(I(e.text),1)],!0)],2))}});const qt=m(Kt,[["__scopeId","data-v-cf8efb1e"]]),M=tt;function Ce(t){return At()?(Nt(t),!0):!1}function U(t){return typeof t=="function"?t():l(t)}const st=typeof window<"u",re=()=>{},Re=Yt();function Yt(){var t;return st&&((t=window==null?void 0:window.navigator)==null?void 0:t.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent)}function Jt(t,e){function n(...o){return new Promise((s,r)=>{Promise.resolve(t(()=>e.apply(this,o),{fn:e,thisArg:this,args:o})).then(s).catch(r)})}return n}const at=t=>t();function Xt(t,e={}){let n,o,s=re;const r=v=>{clearTimeout(v),s(),s=re};return v=>{const c=U(t),f=U(e.maxWait);return n&&r(n),c<=0||f!==void 0&&f<=0?(o&&(r(o),o=null),Promise.resolve(v())):new Promise((b,w)=>{s=e.rejectOnCancel?w:b,f&&!o&&(o=setTimeout(()=>{n&&r(n),o=null,b(v())},f)),n=setTimeout(()=>{o&&r(o),o=null,b(v())},c)})}}function Qt(t=at){const e=S(!0);function n(){e.value=!1}function o(){e.value=!0}const s=(...r)=>{e.value&&t(...r)};return{isActive:Me(e),pause:n,resume:o,eventFilter:s}}function rt(...t){if(t.length!==1)return Mt(...t);const e=t[0];return typeof e=="function"?Me(It(()=>({get:e,set:re}))):S(e)}var Ue=Object.getOwnPropertySymbols,Zt=Object.prototype.hasOwnProperty,en=Object.prototype.propertyIsEnumerable,tn=(t,e)=>{var n={};for(var o in t)Zt.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&Ue)for(var o of Ue(t))e.indexOf(o)<0&&en.call(t,o)&&(n[o]=t[o]);return n};function it(t,e,n={}){const o=n,{eventFilter:s=at}=o,r=tn(o,["eventFilter"]);return K(t,Jt(s,e),r)}var nn=Object.defineProperty,on=Object.defineProperties,sn=Object.getOwnPropertyDescriptors,fe=Object.getOwnPropertySymbols,lt=Object.prototype.hasOwnProperty,ct=Object.prototype.propertyIsEnumerable,We=(t,e,n)=>e in t?nn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,an=(t,e)=>{for(var n in e||(e={}))lt.call(e,n)&&We(t,n,e[n]);if(fe)for(var n of fe(e))ct.call(e,n)&&We(t,n,e[n]);return t},rn=(t,e)=>on(t,sn(e)),ln=(t,e)=>{var n={};for(var o in t)lt.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&fe)for(var o of fe(t))e.indexOf(o)<0&&ct.call(t,o)&&(n[o]=t[o]);return n};function Xl(t,e,n={}){const o=n,{debounce:s=0,maxWait:r=void 0}=o,u=ln(o,["debounce","maxWait"]);return it(t,e,rn(an({},u),{eventFilter:Xt(s,{maxWait:r})}))}var cn=Object.defineProperty,un=Object.defineProperties,dn=Object.getOwnPropertyDescriptors,he=Object.getOwnPropertySymbols,ut=Object.prototype.hasOwnProperty,dt=Object.prototype.propertyIsEnumerable,Ke=(t,e,n)=>e in t?cn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,_n=(t,e)=>{for(var n in e||(e={}))ut.call(e,n)&&Ke(t,n,e[n]);if(he)for(var n of he(e))dt.call(e,n)&&Ke(t,n,e[n]);return t},vn=(t,e)=>un(t,dn(e)),pn=(t,e)=>{var n={};for(var o in t)ut.call(t,o)&&e.indexOf(o)<0&&(n[o]=t[o]);if(t!=null&&he)for(var o of he(t))e.indexOf(o)<0&&dt.call(t,o)&&(n[o]=t[o]);return n};function fn(t,e,n={}){const o=n,{eventFilter:s}=o,r=pn(o,["eventFilter"]),{eventFilter:u,pause:v,resume:c,isActive:f}=Qt(s);return{stop:it(t,e,vn(_n({},r),{eventFilter:u})),pause:v,resume:c,isActive:f}}function Ql(t,e,n){let o;Ct(n)?o={evaluating:n}:o=n||{};const{lazy:s=!1,evaluating:r=void 0,shallow:u=!0,onError:v=re}=o,c=S(!s),f=u?le(e):S(e);let b=0;return te(async w=>{if(!c.value)return;b++;const $=b;let k=!1;r&&Promise.resolve().then(()=>{r.value=!0});try{const A=await t(C=>{w(()=>{r&&(r.value=!1),k||C()})});$===b&&(f.value=A)}catch(A){v(A)}finally{r&&$===b&&(r.value=!1),k=!0}}),s?V(()=>(c.value=!0,f.value)):f}function hn(t){var e;const n=U(t);return(e=n==null?void 0:n.$el)!=null?e:n}const W=st?window:void 0;function ie(...t){let e,n,o,s;if(typeof t[0]=="string"||Array.isArray(t[0])?([n,o,s]=t,e=W):[e,n,o,s]=t,!e)return re;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const r=[],u=()=>{r.forEach(b=>b()),r.length=0},v=(b,w,$,k)=>(b.addEventListener(w,$,k),()=>b.removeEventListener(w,$,k)),c=K(()=>[hn(e),U(s)],([b,w])=>{u(),b&&r.push(...n.flatMap($=>o.map(k=>v(b,$,k,w))))},{immediate:!0,flush:"post"}),f=()=>{c(),u()};return Ce(f),f}function mn(t){return typeof t=="function"?t:typeof t=="string"?e=>e.key===t:Array.isArray(t)?e=>t.includes(e.key):()=>!0}function gn(...t){let e,n,o={};t.length===3?(e=t[0],n=t[1],o=t[2]):t.length===2?typeof t[1]=="object"?(e=!0,n=t[0],o=t[1]):(e=t[0],n=t[1]):(e=!0,n=t[0]);const{target:s=W,eventName:r="keydown",passive:u=!1,dedupe:v=!1}=o,c=mn(e);return ie(s,r,b=>{b.repeat&&U(v)||c(b)&&n(b)},u)}function yn(){const t=S(!1);return Tt()&&R(()=>{t.value=!0}),t}function bn(t){const e=yn();return V(()=>(e.value,!!t()))}function Ve(t,e={}){const{window:n=W}=e,o=bn(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const r=S(!1),u=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",v):s.removeListener(v))},v=()=>{o.value&&(u(),s=n.matchMedia(rt(t).value),r.value=!!(s!=null&&s.matches),s&&("addEventListener"in s?s.addEventListener("change",v):s.addListener(v)))};return te(v),Ce(()=>u()),r}const _e=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ve="__vueuse_ssr_handlers__",$n=kn();function kn(){return ve in _e||(_e[ve]=_e[ve]||{}),_e[ve]}function Pn(t,e){return $n[t]||e}function wn(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}var Vn=Object.defineProperty,qe=Object.getOwnPropertySymbols,Sn=Object.prototype.hasOwnProperty,Ln=Object.prototype.propertyIsEnumerable,Ye=(t,e,n)=>e in t?Vn(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n,Je=(t,e)=>{for(var n in e||(e={}))Sn.call(e,n)&&Ye(t,n,e[n]);if(qe)for(var n of qe(e))Ln.call(e,n)&&Ye(t,n,e[n]);return t};const Mn={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},Xe="vueuse-storage";function _t(t,e,n,o={}){var s;const{flush:r="pre",deep:u=!0,listenToStorageChanges:v=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:b,window:w=W,eventFilter:$,onError:k=T=>{console.error(T)}}=o,A=(b?le:S)(e);if(!n)try{n=Pn("getDefaultStorage",()=>{var T;return(T=W)==null?void 0:T.localStorage})()}catch(T){k(T)}if(!n)return A;const C=U(e),L=wn(C),x=(s=o.serializer)!=null?s:Mn[L],{pause:z,resume:D}=fn(A,()=>Vt(A.value),{flush:r,deep:u,eventFilter:$});return w&&v&&(ie(w,"storage",Pe),ie(w,Xe,Lt)),Pe(),A;function Vt(T){try{if(T==null)n.removeItem(t);else{const H=x.write(T),J=n.getItem(t);J!==H&&(n.setItem(t,H),w&&w.dispatchEvent(new CustomEvent(Xe,{detail:{key:t,oldValue:J,newValue:H,storageArea:n}})))}}catch(H){k(H)}}function St(T){const H=T?T.newValue:n.getItem(t);if(H==null)return c&&C!==null&&n.setItem(t,x.write(C)),C;if(!T&&f){const J=x.read(H);return typeof f=="function"?f(J,C):L==="object"&&!Array.isArray(J)?Je(Je({},C),J):J}else return typeof H!="string"?H:x.read(H)}function Lt(T){Pe(T.detail)}function Pe(T){if(!(T&&T.storageArea!==n)){if(T&&T.key==null){A.value=C;return}if(!(T&&T.key!==t)){z();try{A.value=St(T)}catch(H){k(H)}finally{T?nt(D):D()}}}}}function Zl(t,e,n={}){const{window:o=W}=n;return _t(t,e,o==null?void 0:o.localStorage,n)}function vt(t){const e=window.getComputedStyle(t);if(e.overflowX==="scroll"||e.overflowY==="scroll"||e.overflowX==="auto"&&t.clientHeight1?!0:(e.preventDefault&&e.preventDefault(),!1)}function ec(t,e=!1){const n=S(e);let o=null,s;K(rt(t),v=>{if(v){const c=v;s=c.style.overflow,n.value&&(c.style.overflow="hidden")}},{immediate:!0});const r=()=>{const v=U(t);!v||n.value||(Re&&(o=ie(v,"touchmove",c=>{In(c)},{passive:!1})),v.style.overflow="hidden",n.value=!0)},u=()=>{const v=U(t);!v||!n.value||(Re&&(o==null||o()),v.style.overflow=s,n.value=!1)};return Ce(u),V({get(){return n.value},set(v){v?r():u()}})}function tc(t,e,n={}){const{window:o=W}=n;return _t(t,e,o==null?void 0:o.sessionStorage,n)}function An({window:t=W}={}){if(!t)return{x:S(0),y:S(0)};const e=S(t.scrollX),n=S(t.scrollY);return ie(t,"scroll",()=>{e.value=t.scrollX,n.value=t.scrollY},{capture:!1,passive:!0}),{x:e,y:n}}function Nn(t,e){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(t,e):(t(),o=!0,setTimeout(()=>{o=!1},e))}}function Se(t){return/^\//.test(t)?t:`/${t}`}function me(t){if(Bt(t))return t.replace(xt,"");const{site:e}=M(),{pathname:n,search:o,hash:s}=new URL(t,"http://example.com"),r=n.endsWith("/")||n.endsWith(".html")?t:t.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${o}${s}`);return ce(r)}function pt(t,e){if(Array.isArray(t))return t;if(t==null)return[];e=Se(e);const n=Object.keys(t).sort((o,s)=>s.split("/").length-o.split("/").length).find(o=>e.startsWith(Se(o)));return n?t[n]:[]}function Cn(t){const e=[];let n=0;for(const o in t){const s=t[o];if(s.items){n=e.push(s);continue}e[n]||e.push({items:[]}),e[n].items.push(s)}return e}function Tn(t){const e=[];function n(o){for(const s of o)s.text&&s.link&&e.push({text:s.text,link:s.link}),s.items&&n(s.items)}return n(t),e}function Le(t,e){return Array.isArray(e)?e.some(n=>Le(t,n)):ne(t,e.link)?!0:e.items?Le(t,e.items):!1}function G(){const t=ue(),{theme:e,frontmatter:n}=M(),o=Ve("(min-width: 960px)"),s=S(!1),r=V(()=>{const A=e.value.sidebar,C=t.data.relativePath;return A?pt(A,C):[]}),u=V(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),v=V(()=>c?n.value.aside==null?e.value.aside==="left":n.value.aside==="left":!1),c=V(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:e.value.aside!==!1),f=V(()=>u.value&&o.value),b=V(()=>u.value?Cn(r.value):[]);function w(){s.value=!0}function $(){s.value=!1}function k(){s.value?$():w()}return{isOpen:s,sidebar:r,sidebarGroups:b,hasSidebar:u,hasAside:c,leftAside:v,isSidebarEnabled:f,open:w,close:$,toggle:k}}function Bn(t,e){let n;te(()=>{n=t.value?document.activeElement:void 0}),R(()=>{window.addEventListener("keyup",o)}),Ie(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&t.value&&(e(),n==null||n.focus())}}function xn(t){const{page:e}=M(),n=S(!1),o=V(()=>t.value.collapsed!=null),s=V(()=>!!t.value.link),r=V(()=>ne(e.value.relativePath,t.value.link)),u=V(()=>r.value?!0:t.value.items?Le(e.value.relativePath,t.value.items):!1),v=V(()=>!!(t.value.items&&t.value.items.length));te(()=>{n.value=!!(o.value&&t.value.collapsed)}),te(()=>{(r.value||u.value)&&(n.value=!1)});function c(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:c}}const On=y({__name:"VPSkipLink",setup(t){const e=ue(),n=S();K(()=>e.path,()=>n.value.focus());function o({target:s}){const r=document.querySelector(decodeURIComponent(s.hash));if(r){const u=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",u)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",u),r.focus(),window.scrollTo(0,0)}}return(s,r)=>(a(),i(N,null,[d("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}});const En=m(On,[["__scopeId","data-v-59268664"]]),Hn={key:0,class:"VPBackdrop"},Dn=y({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(t){return(e,n)=>(a(),P(Ae,{name:"fade"},{default:p(()=>[e.show?(a(),i("div",Hn)):g("",!0)]),_:1}))}});const zn=m(Dn,[["__scopeId","data-v-c81aff69"]]);function Fn(){const t=S(!1);function e(){t.value=!0,window.addEventListener("resize",s)}function n(){t.value=!1,window.removeEventListener("resize",s)}function o(){t.value?n():e()}function s(){window.outerWidth>=768&&n()}const r=ue();return K(()=>r.path,n),{isScreenOpen:t,openScreen:e,closeScreen:n,toggleScreen:o}}function de({removeCurrent:t=!0,correspondingLink:e=!1}={}){const{site:n,localeIndex:o,page:s,theme:r}=M(),u=V(()=>{var c,f;return{label:(c=n.value.locales[o.value])==null?void 0:c.label,link:((f=n.value.locales[o.value])==null?void 0:f.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:V(()=>Object.entries(n.value.locales).flatMap(([c,f])=>t&&u.value.label===f.label?[]:{text:f.label,link:jn(f.link||(c==="root"?"/":`/${c}/`),r.value.i18nRouting!==!1&&e,s.value.relativePath.slice(u.value.link.length-1),!n.value.cleanUrls)})),currentLang:u}}function jn(t,e,n,o){return e?t.replace(/\/$/,"")+Se(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,o?".html":"")):t}const Gn=["src","alt"],Rn={inheritAttrs:!1},Un=y({...Rn,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),i(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,Gn)):(a(),i(N,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const ft=m(Un,[["__scopeId","data-v-74f25ba3"]]),Wn=["href"],Kn=y({__name:"VPNavBarTitle",setup(t){const{site:e,theme:n}=M(),{hasSidebar:o}=G(),{currentLang:s}=de();return(r,u)=>(a(),i("div",{class:B(["VPNavBarTitle",{"has-sidebar":l(o)}])},[d("a",{class:"title",href:l(me)(l(s).link)},[_(r.$slots,"nav-bar-title-before",{},void 0,!0),l(n).logo?(a(),P(ft,{key:0,class:"logo",image:l(n).logo},null,8,["image"])):g("",!0),l(n).siteTitle?(a(),i(N,{key:1},[O(I(l(n).siteTitle),1)],64)):l(n).siteTitle===void 0?(a(),i(N,{key:2},[O(I(l(e).title),1)],64)):g("",!0),_(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,Wn)],2))}});const qn=m(Kn,[["__scopeId","data-v-9f409f7c"]]);const Yn={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Jn={class:"DocSearch-Button-Container"},Xn=d("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Qn={class:"DocSearch-Button-Placeholder"},Zn=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1),Qe=y({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(t){return(e,n)=>(a(),i("button",Yn,[d("span",Jn,[Xn,d("span",Qn,I(e.placeholder),1)]),Zn]))}});const eo={id:"local-search"},to={key:1,id:"docsearch"},no=y({__name:"VPNavBarSearch",setup(t){const e=Ot(()=>Et(()=>import("./VPLocalSearchBox.1d883f69.js"),["assets/chunks/VPLocalSearchBox.1d883f69.js","assets/chunks/framework.85b09291.js"])),n=()=>null,{theme:o,localeIndex:s}=M(),r=S(!1),u=V(()=>{var k,A,C,L,x,z,D;const $=((k=o.value.search)==null?void 0:k.options)??o.value.algolia;return((x=(L=(C=(A=$==null?void 0:$.locales)==null?void 0:A[s.value])==null?void 0:C.translations)==null?void 0:L.button)==null?void 0:x.buttonText)||((D=(z=$==null?void 0:$.translations)==null?void 0:z.button)==null?void 0:D.buttonText)||"Search"});R(()=>{});function v(){r.value||(r.value=!0,setTimeout(c,16))}function c(){const $=new Event("keydown");$.key="k",$.metaKey=!0,window.dispatchEvent($),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||c()},16)}const f=S(!1);gn("k",$=>{($.ctrlKey||$.metaKey)&&($.preventDefault(),f.value=!0)});const b=S("'Meta'");R(()=>{b.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'"});const w="local";return($,k)=>{var A;return a(),i("div",{class:"VPNavBarSearch",style:ot({"--vp-meta-key":b.value})},[l(w)==="local"?(a(),i(N,{key:0},[f.value?(a(),P(l(e),{key:0,placeholder:u.value,onClose:k[0]||(k[0]=C=>f.value=!1)},null,8,["placeholder"])):g("",!0),d("div",eo,[h(Qe,{placeholder:u.value,onClick:k[1]||(k[1]=C=>f.value=!0)},null,8,["placeholder"])])],64)):l(w)==="algolia"?(a(),i(N,{key:1},[r.value?(a(),P(l(n),{key:0,algolia:((A=l(o).search)==null?void 0:A.options)??l(o).algolia},null,8,["algolia"])):(a(),i("div",to,[h(Qe,{placeholder:u.value,onClick:v},null,8,["placeholder"])]))],64)):g("",!0)],4)}}});const oo={},so={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},ao=d("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),ro=d("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),io=[ao,ro];function lo(t,e){return a(),i("svg",so,io)}const co=m(oo,[["render",lo]]),uo=y({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(t){const e=t,n=V(()=>e.tag??e.href?"a":"span"),o=V(()=>e.href&&Ht.test(e.href));return(s,r)=>(a(),P(Z(n.value),{class:B(["VPLink",{link:s.href}]),href:s.href?l(me)(s.href):void 0,target:s.target||(o.value?"_blank":void 0),rel:s.rel||(o.value?"noreferrer":void 0)},{default:p(()=>[_(s.$slots,"default",{},void 0,!0),o.value&&!s.noIcon?(a(),P(co,{key:0,class:"icon"})):g("",!0)]),_:3},8,["class","href","target","rel"]))}});const Y=m(uo,[["__scopeId","data-v-83901ecb"]]),_o=y({__name:"VPNavBarMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),P(Y,{class:B({VPNavBarMenuLink:!0,active:l(ne)(l(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:p(()=>[O(I(n.item.text),1)]),_:1},8,["class","href","target","rel"]))}});const vo=m(_o,[["__scopeId","data-v-eff41f9d"]]),Te=S();let ht=!1,we=0;function po(t){const e=S(!1);if(Dt){!ht&&fo(),we++;const n=K(Te,o=>{var s,r,u;o===t.el.value||(s=t.el.value)!=null&&s.contains(o)?(e.value=!0,(r=t.onFocus)==null||r.call(t)):(e.value=!1,(u=t.onBlur)==null||u.call(t))});Ie(()=>{n(),we--,we||ho()})}return Me(e)}function fo(){document.addEventListener("focusin",mt),ht=!0,Te.value=document.activeElement}function ho(){document.removeEventListener("focusin",mt)}function mt(){Te.value=document.activeElement}const mo={},go={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},yo=d("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),bo=[yo];function $o(t,e){return a(),i("svg",go,bo)}const gt=m(mo,[["render",$o]]),ko={},Po={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},wo=d("circle",{cx:"12",cy:"12",r:"2"},null,-1),Vo=d("circle",{cx:"19",cy:"12",r:"2"},null,-1),So=d("circle",{cx:"5",cy:"12",r:"2"},null,-1),Lo=[wo,Vo,So];function Mo(t,e){return a(),i("svg",Po,Lo)}const Io=m(ko,[["render",Mo]]),Ao={class:"VPMenuLink"},No=y({__name:"VPMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),i("div",Ao,[h(Y,{class:B({active:l(ne)(l(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:p(()=>[O(I(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const $e=m(No,[["__scopeId","data-v-5cbd515c"]]),Co={class:"VPMenuGroup"},To={key:0,class:"title"},Bo=y({__name:"VPMenuGroup",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),i("div",Co,[e.text?(a(),i("p",To,I(e.text),1)):g("",!0),(a(!0),i(N,null,E(e.items,o=>(a(),i(N,null,["link"in o?(a(),P($e,{key:0,item:o},null,8,["item"])):g("",!0)],64))),256))]))}});const xo=m(Bo,[["__scopeId","data-v-6f7e14e7"]]),Oo={class:"VPMenu"},Eo={key:0,class:"items"},Ho=y({__name:"VPMenu",props:{items:{}},setup(t){return(e,n)=>(a(),i("div",Oo,[e.items?(a(),i("div",Eo,[(a(!0),i(N,null,E(e.items,o=>(a(),i(N,{key:o.text},["link"in o?(a(),P($e,{key:0,item:o},null,8,["item"])):(a(),P(xo,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0),_(e.$slots,"default",{},void 0,!0)]))}});const Do=m(Ho,[["__scopeId","data-v-2548f0fa"]]),zo=["aria-expanded","aria-label"],Fo={key:0,class:"text"},jo={class:"menu"},Go=y({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(t){const e=S(!1),n=S();po({el:n,onBlur:o});function o(){e.value=!1}return(s,r)=>(a(),i("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=u=>e.value=!0),onMouseleave:r[2]||(r[2]=u=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:r[0]||(r[0]=u=>e.value=!e.value)},[s.button||s.icon?(a(),i("span",Fo,[s.icon?(a(),P(Z(s.icon),{key:0,class:"option-icon"})):g("",!0),O(" "+I(s.button)+" ",1),h(gt,{class:"text-icon"})])):(a(),P(Io,{key:1,class:"icon"}))],8,zo),d("div",jo,[h(Do,{items:s.items},{default:p(()=>[_(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const Be=m(Go,[["__scopeId","data-v-66a2feed"]]),Ro=y({__name:"VPNavBarMenuGroup",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),P(Be,{class:B({VPNavBarMenuGroup:!0,active:l(ne)(l(e).relativePath,n.item.activeMatch,!!n.item.activeMatch)}),button:n.item.text,items:n.item.items},null,8,["class","button","items"]))}}),Uo=t=>(F("data-v-59f637f9"),t=t(),j(),t),Wo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Ko=Uo(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),qo=y({__name:"VPNavBarMenu",setup(t){const{theme:e}=M();return(n,o)=>l(e).nav?(a(),i("nav",Wo,[Ko,(a(!0),i(N,null,E(l(e).nav,s=>(a(),i(N,{key:s.text},["link"in s?(a(),P(vo,{key:0,item:s},null,8,["item"])):(a(),P(Ro,{key:1,item:s},null,8,["item"]))],64))),128))])):g("",!0)}});const Yo=m(qo,[["__scopeId","data-v-59f637f9"]]),Jo={},Xo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Qo=d("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Zo=d("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),es=[Qo,Zo];function ts(t,e){return a(),i("svg",Xo,es)}const yt=m(Jo,[["render",ts]]),ns={class:"items"},os={class:"title"},ss=y({__name:"VPNavBarTranslations",setup(t){const{theme:e}=M(),{localeLinks:n,currentLang:o}=de({correspondingLink:!0});return(s,r)=>l(n).length&&l(o).label?(a(),P(Be,{key:0,class:"VPNavBarTranslations",icon:yt,label:l(e).langMenuLabel||"Change language"},{default:p(()=>[d("div",ns,[d("p",os,I(l(o).label),1),(a(!0),i(N,null,E(l(n),u=>(a(),P($e,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}});const as=m(ss,[["__scopeId","data-v-f2b2e4b1"]]);const rs={},is={class:"VPSwitch",type:"button",role:"switch"},ls={class:"check"},cs={key:0,class:"icon"};function us(t,e){return a(),i("button",is,[d("span",ls,[t.$slots.default?(a(),i("span",cs,[_(t.$slots,"default",{},void 0,!0)])):g("",!0)])])}const ds=m(rs,[["render",us],["__scopeId","data-v-5559e67f"]]),_s={},vs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ps=zt(' ',9),fs=[ps];function hs(t,e){return a(),i("svg",vs,fs)}const ms=m(_s,[["render",hs]]),gs={},ys={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},bs=d("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),$s=[bs];function ks(t,e){return a(),i("svg",ys,$s)}const Ps=m(gs,[["render",ks]]),ws={title:"toggle dark mode"},Vs=y({__name:"VPSwitchAppearance",setup(t){const{site:e,isDark:n}=M(),o=S(!1),s=typeof localStorage<"u"?r():()=>{};R(()=>{o.value=document.documentElement.classList.contains("dark")});function r(){const u=window.matchMedia("(prefers-color-scheme: dark)"),v=document.documentElement.classList;let c=localStorage.getItem(Ge),f=e.value.appearance==="dark"&&c==null||(c==="auto"||c==null?u.matches:c==="dark");u.onchange=$=>{c==="auto"&&w(f=$.matches)};function b(){w(f=!f),c=f?u.matches?"auto":"dark":u.matches?"light":"auto",localStorage.setItem(Ge,c)}function w($){const k=document.createElement("style");k.type="text/css",k.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) {
- -webkit-transition: none !important;
- -moz-transition: none !important;
- -o-transition: none !important;
- -ms-transition: none !important;
- transition: none !important;
-}`)),document.head.appendChild(k),o.value=$,v[$?"add":"remove"]("dark"),window.getComputedStyle(k).opacity,document.head.removeChild(k)}return b}return K(o,u=>{n.value=u}),(u,v)=>(a(),i("label",ws,[h(ds,{class:"VPSwitchAppearance","aria-checked":o.value,onClick:l(s)},{default:p(()=>[h(ms,{class:"sun"}),h(Ps,{class:"moon"})]),_:1},8,["aria-checked","onClick"])]))}});const xe=m(Vs,[["__scopeId","data-v-a115155e"]]),Ss={key:0,class:"VPNavBarAppearance"},Ls=y({__name:"VPNavBarAppearance",setup(t){const{site:e}=M();return(n,o)=>l(e).appearance?(a(),i("div",Ss,[h(xe)])):g("",!0)}});const Ms=m(Ls,[["__scopeId","data-v-0f013d30"]]),Is={discord:'Discord ',facebook:'Facebook ',github:'GitHub ',instagram:'Instagram ',linkedin:'LinkedIn ',mastodon:'Mastodon ',slack:'Slack ',twitter:'Twitter ',youtube:'YouTube '},As=["href","aria-label","innerHTML"],Ns=y({__name:"VPSocialLink",props:{icon:{},link:{}},setup(t){const e=t,n=V(()=>typeof e.icon=="object"?e.icon.svg:Is[e.icon]);return(o,s)=>(a(),i("a",{class:"VPSocialLink",href:o.link,"aria-label":typeof o.icon=="string"?o.icon:"",target:"_blank",rel:"noopener",innerHTML:n.value},null,8,As))}});const Cs=m(Ns,[["__scopeId","data-v-5ea6463d"]]),Ts={class:"VPSocialLinks"},Bs=y({__name:"VPSocialLinks",props:{links:{}},setup(t){return(e,n)=>(a(),i("div",Ts,[(a(!0),i(N,null,E(e.links,({link:o,icon:s})=>(a(),P(Cs,{key:o,icon:s,link:o},null,8,["icon","link"]))),128))]))}});const Oe=m(Bs,[["__scopeId","data-v-036d02a2"]]),xs=y({__name:"VPNavBarSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>l(e).socialLinks?(a(),P(Oe,{key:0,class:"VPNavBarSocialLinks",links:l(e).socialLinks},null,8,["links"])):g("",!0)}});const Os=m(xs,[["__scopeId","data-v-68be864b"]]),Es={key:0,class:"group translations"},Hs={class:"trans-title"},Ds={key:1,class:"group"},zs={class:"item appearance"},Fs={class:"label"},js={class:"appearance-action"},Gs={key:2,class:"group"},Rs={class:"item social-links"},Us=y({__name:"VPNavBarExtra",setup(t){const{site:e,theme:n}=M(),{localeLinks:o,currentLang:s}=de({correspondingLink:!0}),r=V(()=>o.value.length&&s.value.label||e.value.appearance||n.value.socialLinks);return(u,v)=>r.value?(a(),P(Be,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[l(o).length&&l(s).label?(a(),i("div",Es,[d("p",Hs,I(l(s).label),1),(a(!0),i(N,null,E(l(o),c=>(a(),P($e,{key:c.link,item:c},null,8,["item"]))),128))])):g("",!0),l(e).appearance?(a(),i("div",Ds,[d("div",zs,[d("p",Fs,I(l(n).darkModeSwitchLabel||"Appearance"),1),d("div",js,[h(xe)])])])):g("",!0),l(n).socialLinks?(a(),i("div",Gs,[d("div",Rs,[h(Oe,{class:"social-links-list",links:l(n).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}});const Ws=m(Us,[["__scopeId","data-v-22c4504f"]]),Ks=t=>(F("data-v-69d5f97f"),t=t(),j(),t),qs=["aria-expanded"],Ys=Ks(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),Js=[Ys],Xs=y({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(t){return(e,n)=>(a(),i("button",{type:"button",class:B(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>e.$emit("click"))},Js,10,qs))}});const Qs=m(Xs,[["__scopeId","data-v-69d5f97f"]]),Zs=t=>(F("data-v-518cc426"),t=t(),j(),t),ea={class:"container"},ta={class:"title"},na={class:"content"},oa=Zs(()=>d("div",{class:"curtain"},null,-1)),sa={class:"content-body"},aa=y({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(t){const{y:e}=An(),{hasSidebar:n}=G(),o=V(()=>({"has-sidebar":n.value,fill:e.value>0}));return(s,r)=>(a(),i("div",{class:B(["VPNavBar",o.value])},[d("div",ea,[d("div",ta,[h(qn,null,{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",na,[oa,d("div",sa,[_(s.$slots,"nav-bar-content-before",{},void 0,!0),h(no,{class:"search"}),h(Yo,{class:"menu"}),h(as,{class:"translations"}),h(Ms,{class:"appearance"}),h(Os,{class:"social-links"}),h(Ws,{class:"extra"}),_(s.$slots,"nav-bar-content-after",{},void 0,!0),h(Qs,{class:"hamburger",active:s.isScreenOpen,onClick:r[0]||(r[0]=u=>s.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const ra=m(aa,[["__scopeId","data-v-518cc426"]]);function ia(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1),ee=[],ye=!1,He=-1,oe=void 0,X=void 0,se=void 0,bt=function(e){return ee.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(e))})},be=function(e){var n=e||window.event;return bt(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},la=function(e){if(se===void 0){var n=!!e&&e.reserveScrollBarGap===!0,o=window.innerWidth-document.documentElement.clientWidth;if(n&&o>0){var s=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);se=document.body.style.paddingRight,document.body.style.paddingRight=s+o+"px"}}oe===void 0&&(oe=document.body.style.overflow,document.body.style.overflow="hidden")},ca=function(){se!==void 0&&(document.body.style.paddingRight=se,se=void 0),oe!==void 0&&(document.body.style.overflow=oe,oe=void 0)},ua=function(){return window.requestAnimationFrame(function(){if(X===void 0){X={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,n=e.scrollY,o=e.scrollX,s=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-o,setTimeout(function(){return window.requestAnimationFrame(function(){var r=s-window.innerHeight;r&&n>=s&&(document.body.style.top=-(n+r))})},300)}})},da=function(){if(X!==void 0){var e=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=X.position,document.body.style.top=X.top,document.body.style.left=X.left,window.scrollTo(n,e),X=void 0}},_a=function(e){return e?e.scrollHeight-e.scrollTop<=e.clientHeight:!1},va=function(e,n){var o=e.targetTouches[0].clientY-He;return bt(e.target)?!1:n&&n.scrollTop===0&&o>0||_a(n)&&o<0?be(e):(e.stopPropagation(),!0)},$t=function(e,n){if(!e){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!ee.some(function(s){return s.targetElement===e})){var o={targetElement:e,options:n||{}};ee=[].concat(ia(ee),[o]),ge?ua():la(n),ge&&(e.ontouchstart=function(s){s.targetTouches.length===1&&(He=s.targetTouches[0].clientY)},e.ontouchmove=function(s){s.targetTouches.length===1&&va(s,e)},ye||(document.addEventListener("touchmove",be,Ee?{passive:!1}:void 0),ye=!0))}},kt=function(){ge&&(ee.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),ye&&(document.removeEventListener("touchmove",be,Ee?{passive:!1}:void 0),ye=!1),He=-1),ge?da():ca(),ee=[]};const pa=y({__name:"VPNavScreenMenuLink",props:{text:{},link:{}},setup(t){const e=Ne("close-screen");return(n,o)=>(a(),P(Y,{class:"VPNavScreenMenuLink",href:n.link,onClick:l(e)},{default:p(()=>[O(I(n.text),1)]),_:1},8,["href","onClick"]))}});const fa=m(pa,[["__scopeId","data-v-4ffce36c"]]),ha={},ma={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ga=d("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),ya=[ga];function ba(t,e){return a(),i("svg",ma,ya)}const $a=m(ha,[["render",ba]]),ka=y({__name:"VPNavScreenMenuGroupLink",props:{text:{},link:{}},setup(t){const e=Ne("close-screen");return(n,o)=>(a(),P(Y,{class:"VPNavScreenMenuGroupLink",href:n.link,onClick:l(e)},{default:p(()=>[O(I(n.text),1)]),_:1},8,["href","onClick"]))}});const Pt=m(ka,[["__scopeId","data-v-c4e17519"]]),Pa={class:"VPNavScreenMenuGroupSection"},wa={key:0,class:"title"},Va=y({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),i("div",Pa,[e.text?(a(),i("p",wa,I(e.text),1)):g("",!0),(a(!0),i(N,null,E(e.items,o=>(a(),P(Pt,{key:o.text,text:o.text,link:o.link},null,8,["text","link"]))),128))]))}});const Sa=m(Va,[["__scopeId","data-v-4fa89b32"]]),La=["aria-controls","aria-expanded"],Ma={class:"button-text"},Ia=["id"],Aa={key:1,class:"group"},Na=y({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(t){const e=t,n=S(!1),o=V(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(r,u)=>(a(),i("div",{class:B(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[d("span",Ma,I(r.text),1),h($a,{class:"button-icon"})],8,La),d("div",{id:o.value,class:"items"},[(a(!0),i(N,null,E(r.items,v=>(a(),i(N,{key:v.text},["link"in v?(a(),i("div",{key:v.text,class:"item"},[h(Pt,{text:v.text,link:v.link},null,8,["text","link"])])):(a(),i("div",Aa,[h(Sa,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Ia)],2))}});const Ca=m(Na,[["__scopeId","data-v-00f16505"]]),Ta={key:0,class:"VPNavScreenMenu"},Ba=y({__name:"VPNavScreenMenu",setup(t){const{theme:e}=M();return(n,o)=>l(e).nav?(a(),i("nav",Ta,[(a(!0),i(N,null,E(l(e).nav,s=>(a(),i(N,{key:s.text},["link"in s?(a(),P(fa,{key:0,text:s.text,link:s.link},null,8,["text","link"])):(a(),P(Ca,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),xa={key:0,class:"VPNavScreenAppearance"},Oa={class:"text"},Ea=y({__name:"VPNavScreenAppearance",setup(t){const{site:e,theme:n}=M();return(o,s)=>l(e).appearance?(a(),i("div",xa,[d("p",Oa,I(l(n).darkModeSwitchLabel||"Appearance"),1),h(xe)])):g("",!0)}});const Ha=m(Ea,[["__scopeId","data-v-68e1df0b"]]),Da={class:"list"},za=y({__name:"VPNavScreenTranslations",setup(t){const{localeLinks:e,currentLang:n}=de({correspondingLink:!0}),o=S(!1);function s(){o.value=!o.value}return(r,u)=>l(e).length&&l(n).label?(a(),i("div",{key:0,class:B(["VPNavScreenTranslations",{open:o.value}])},[d("button",{class:"title",onClick:s},[h(yt,{class:"icon lang"}),O(" "+I(l(n).label)+" ",1),h(gt,{class:"icon chevron"})]),d("ul",Da,[(a(!0),i(N,null,E(l(e),v=>(a(),i("li",{key:v.link,class:"item"},[h(Y,{class:"link",href:v.link},{default:p(()=>[O(I(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}});const Fa=m(za,[["__scopeId","data-v-0143f4b2"]]),ja=y({__name:"VPNavScreenSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>l(e).socialLinks?(a(),P(Oe,{key:0,class:"VPNavScreenSocialLinks",links:l(e).socialLinks},null,8,["links"])):g("",!0)}}),Ga={class:"container"},Ra=y({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(t){const e=S(null);function n(){$t(e.value,{reserveScrollBarGap:!0})}function o(){kt()}return(s,r)=>(a(),P(Ae,{name:"fade",onEnter:n,onAfterLeave:o},{default:p(()=>[s.open?(a(),i("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e},[d("div",Ga,[_(s.$slots,"nav-screen-content-before",{},void 0,!0),h(Ba,{class:"menu"}),h(Fa,{class:"translations"}),h(Ha,{class:"appearance"}),h(ja,{class:"social-links"}),_(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}});const Ua=m(Ra,[["__scopeId","data-v-e795d3c5"]]),Wa={class:"VPNav"},Ka=y({__name:"VPNav",setup(t){const{isScreenOpen:e,closeScreen:n,toggleScreen:o}=Fn();return pe("close-screen",n),(s,r)=>(a(),i("header",Wa,[h(ra,{"is-screen-open":l(e),onToggleScreen:l(o)},{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Ua,{open:l(e)},{"nav-screen-content-before":p(()=>[_(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const qa=m(Ka,[["__scopeId","data-v-31544dc1"]]),Ya={},Ja={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Xa=d("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Qa=d("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Za=d("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),er=d("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),tr=[Xa,Qa,Za,er];function nr(t,e){return a(),i("svg",Ja,tr)}const or=m(Ya,[["render",nr]]);function sr(){const{hasSidebar:t}=G(),e=Ve("(min-width: 960px)"),n=Ve("(min-width: 1280px)");return{isAsideEnabled:V(()=>!n.value&&!e.value?!1:t.value?n.value:e.value)}}const ar=71;function De(t){return typeof t.outline=="object"&&!Array.isArray(t.outline)&&t.outline.label||t.outlineTitle||"On this page"}function ze(t){const e=[...document.querySelectorAll(".VPDoc h2,h3,h4,h5,h6")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{title:rr(n),link:"#"+n.id,level:o}});return ir(e,t)}function rr(t){let e="";for(const n of t.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor"))continue;e+=n.textContent}else n.nodeType===3&&(e+=n.textContent);return e.trim()}function ir(t,e){if(e===!1)return[];const n=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;t=t.filter(u=>u.level>=o&&u.level<=s);const r=[];e:for(let u=0;u=0;c--){const f=t[c];if(f.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),Ft(()=>{u(location.hash)}),Ie(()=>{window.removeEventListener("scroll",o)});function r(){if(!n.value)return;const v=[].slice.call(t.value.querySelectorAll(".outline-link")),c=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>v.some(A=>A.hash===k.hash&&k.offsetParent!==null)),f=window.scrollY,b=window.innerHeight,w=document.body.offsetHeight,$=Math.abs(f+b-w)<1;if(c.length&&$){u(c[c.length-1].hash);return}for(let k=0;k{const s=q("VPDocOutlineItem",!0);return a(),i("ul",{class:B(n.root?"root":"nested")},[(a(!0),i(N,null,E(n.headers,({children:r,link:u,title:v})=>(a(),i("li",null,[d("a",{class:"outline-link",href:u,onClick:e,title:v},I(v),9,ur),r!=null&&r.length?(a(),P(s,{key:0,headers:r},null,8,["headers"])):g("",!0)]))),256))],2)}}});const Fe=m(dr,[["__scopeId","data-v-9b110da6"]]),_r={},vr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},pr=d("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),fr=[pr];function hr(t,e){return a(),i("svg",vr,fr)}const je=m(_r,[["render",hr]]),mr=y({__name:"VPLocalNavOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=S(!1),s=S(0),r=S();ae(()=>{o.value=!1});function u(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-64,0)}function v(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),nt(()=>{o.value=!1}))}function c(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}const f=le([]);return ae(()=>{f.value=ze(e.value.outline??n.value.outline)}),(b,w)=>(a(),i("div",{class:"VPLocalNavOutlineDropdown",style:ot({"--vp-vh":s.value+"px"})},[f.value.length>0?(a(),i("button",{key:0,onClick:u,class:B({open:o.value})},[O(I(l(De)(l(n)))+" ",1),h(je,{class:"icon"})],2)):(a(),i("button",{key:1,onClick:c},I(l(n).returnToTopLabel||"Return to top"),1)),h(Ae,{name:"flyout"},{default:p(()=>[o.value?(a(),i("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:v},[d("a",{class:"top-link",href:"#",onClick:c},I(l(n).returnToTopLabel||"Return to top"),1),h(Fe,{headers:f.value},null,8,["headers"])],512)):g("",!0)]),_:1})],4))}});const gr=m(mr,[["__scopeId","data-v-7fc5e44e"]]),yr={key:0,class:"VPLocalNav"},br=["aria-expanded"],$r={class:"menu-text"},kr=y({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(t){const{theme:e}=M(),{hasSidebar:n}=G();return(o,s)=>l(n)?(a(),i("div",yr,[d("button",{class:"menu","aria-expanded":o.open,"aria-controls":"VPSidebarNav",onClick:s[0]||(s[0]=r=>o.$emit("open-menu"))},[h(or,{class:"menu-icon"}),d("span",$r,I(l(e).sidebarMenuLabel||"Menu"),1)],8,br),h(gr)])):g("",!0)}});const Pr=m(kr,[["__scopeId","data-v-a608b4c2"]]),wr=t=>(F("data-v-9b2ca4cb"),t=t(),j(),t),Vr=["role","tabindex"],Sr=wr(()=>d("div",{class:"indicator"},null,-1)),Lr=["onKeydown"],Mr={key:1,class:"items"},Ir=y({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(t){const e=t,{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:c}=xn(V(()=>e.item)),f=V(()=>v.value?"section":"div"),b=V(()=>s.value?"a":"div"),w=V(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),$=V(()=>s.value?void 0:"button"),k=V(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":r.value},{"has-active":u.value}]);function A(L){"key"in L&&L.key!=="Enter"||!e.item.link&&c()}function C(){e.item.link&&c()}return(L,x)=>{const z=q("VPSidebarItem",!0);return a(),P(Z(f.value),{class:B(["VPSidebarItem",k.value])},{default:p(()=>[L.item.text?(a(),i("div",Q({key:0,class:"item",role:$.value},jt(L.item.items?{click:A,keydown:A}:{},!0),{tabindex:L.item.items&&0}),[Sr,L.item.link?(a(),P(Y,{key:0,tag:b.value,class:"link",href:L.item.link},{default:p(()=>[(a(),P(Z(w.value),{class:"text",innerHTML:L.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"])):(a(),P(Z(w.value),{key:1,class:"text",innerHTML:L.item.text},null,8,["innerHTML"])),L.item.collapsed!=null?(a(),i("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Gt(C,["enter"]),tabindex:"0"},[h(je,{class:"caret-icon"})],40,Lr)):g("",!0)],16,Vr)):g("",!0),L.item.items&&L.item.items.length?(a(),i("div",Mr,[L.depth<5?(a(!0),i(N,{key:0},E(L.item.items,D=>(a(),P(z,{key:D.text,item:D,depth:L.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}});const Ar=m(Ir,[["__scopeId","data-v-9b2ca4cb"]]),wt=t=>(F("data-v-084bed16"),t=t(),j(),t),Nr=wt(()=>d("div",{class:"curtain"},null,-1)),Cr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Tr=wt(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Br=y({__name:"VPSidebar",props:{open:{type:Boolean}},setup(t){const e=t,{sidebarGroups:n,hasSidebar:o}=G();let s=S(null);function r(){$t(s.value,{reserveScrollBarGap:!0})}function u(){kt()}return Rt(async()=>{var v;e.open?(r(),(v=s.value)==null||v.focus()):u()}),(v,c)=>l(o)?(a(),i("aside",{key:0,class:B(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:s,onClick:c[0]||(c[0]=Ut(()=>{},["stop"]))},[Nr,d("nav",Cr,[Tr,_(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),i(N,null,E(l(n),f=>(a(),i("div",{key:f.text,class:"group"},[h(Ar,{item:f,depth:0},null,8,["item"])]))),128)),_(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}});const xr=m(Br,[["__scopeId","data-v-084bed16"]]),Or={},Er={class:"VPPage"};function Hr(t,e){const n=q("Content");return a(),i("div",Er,[_(t.$slots,"page-top"),h(n),_(t.$slots,"page-bottom")])}const Dr=m(Or,[["render",Hr]]),zr=y({__name:"VPButton",props:{tag:{},size:{},theme:{},text:{},href:{}},setup(t){const e=t,n=/^pathname:\/\//,o=/^[a-z]+:/i;function s(c){if(o.test(c))return c.replace(n,"");const{site:f}=tt(),{pathname:b,search:w,hash:$}=new URL(c,"http://example.com"),k=b.endsWith("/")||b.endsWith(".html")?c:c.replace(/(?:(^\.+)\/)?.*$/,`$1${b.replace(/(\.md)?$/,f.value.cleanUrls?"":".html")}${w}${$}`);return ce(k)}const r=V(()=>[e.size??"medium",e.theme??"brand"]),u=V(()=>e.href&&o.test(e.href)),v=V(()=>e.tag?e.tag:e.href?"a":"button");return(c,f)=>(a(),P(Z(v.value),{class:B(["VPButton",r.value]),href:c.href?s(c.href):void 0,target:u.value?"_blank":void 0,rel:u.value?"noreferrer":void 0},{default:p(()=>[O(I(c.text),1)]),_:1},8,["class","href","target","rel"]))}});const Fr=m(zr,[["__scopeId","data-v-1d13e4c0"]]),jr=["src","alt"],Gr={inheritAttrs:!1},Rr=y({...Gr,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),i(N,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),i("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:l(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,jr)):(a(),i(N,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const Ur=m(Rr,[["__scopeId","data-v-34de1ea9"]]),Wr=t=>(F("data-v-d5ff424d"),t=t(),j(),t),Kr={class:"VPHero"},qr={class:"container"},Yr={key:0,class:"image"},Jr={class:"image-container"},Xr=Wr(()=>d("div",{class:"image-bg"},null,-1)),Qr={class:"main"},Zr={key:0,class:"name"},ei={class:"clip"},ti={key:1,class:"text"},ni={key:2,class:"tagline"},oi={key:0,class:"actions"},si=y({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(t){const e=Ne("hero-image-slot-exists");return(n,o)=>(a(),i("div",Kr,[d("div",qr,[n.image||l(e)?(a(),i("div",Yr,[d("div",Jr,[Xr,_(n.$slots,"home-hero-image",{},()=>[n.image?(a(),P(Ur,{key:0,class:"image-src",image:n.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0),d("div",Qr,[_(n.$slots,"home-hero-info",{},()=>[n.name?(a(),i("h1",Zr,[d("span",ei,I(n.name),1)])):g("",!0),n.text?(a(),i("p",ti,I(n.text),1)):g("",!0),n.tagline?(a(),i("p",ni,I(n.tagline),1)):g("",!0)],!0),n.actions?(a(),i("div",oi,[(a(!0),i(N,null,E(n.actions,s=>(a(),i("div",{key:s.link,class:"action"},[h(Fr,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):g("",!0)])])]))}});const ai=m(si,[["__scopeId","data-v-d5ff424d"]]),ri=y({__name:"VPHomeHero",setup(t){const{frontmatter:e}=M();return(n,o)=>l(e).hero?(a(),P(ai,{key:0,class:"VPHomeHero",name:l(e).hero.name,text:l(e).hero.text,tagline:l(e).hero.tagline,image:l(e).hero.image,actions:l(e).hero.actions},{"home-hero-info":p(()=>[_(n.$slots,"home-hero-info")]),"home-hero-image":p(()=>[_(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),ii={},li={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ci=d("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),ui=[ci];function di(t,e){return a(),i("svg",li,ui)}const _i=m(ii,[["render",di]]),vi={class:"box"},pi=["innerHTML"],fi=["innerHTML"],hi=["innerHTML"],mi={key:3,class:"link-text"},gi={class:"link-text-value"},yi=y({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{}},setup(t){return(e,n)=>(a(),P(Y,{class:"VPFeature",href:e.link,"no-icon":!0},{default:p(()=>[d("article",vi,[typeof e.icon=="object"?(a(),P(ft,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(a(),i("div",{key:1,class:"icon",innerHTML:e.icon},null,8,pi)):g("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,fi),e.details?(a(),i("p",{key:2,class:"details",innerHTML:e.details},null,8,hi)):g("",!0),e.linkText?(a(),i("div",mi,[d("p",gi,[O(I(e.linkText)+" ",1),h(_i,{class:"link-text-icon"})])])):g("",!0)])]),_:1},8,["href"]))}});const bi=m(yi,[["__scopeId","data-v-4046fee8"]]),$i={key:0,class:"VPFeatures"},ki={class:"container"},Pi={class:"items"},wi=y({__name:"VPFeatures",props:{features:{}},setup(t){const e=t,n=V(()=>{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%2===0)return"grid-4"}else return});return(o,s)=>o.features?(a(),i("div",$i,[d("div",ki,[d("div",Pi,[(a(!0),i(N,null,E(o.features,r=>(a(),i("div",{key:r.title,class:B(["item",[n.value]])},[h(bi,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):g("",!0)}});const Vi=m(wi,[["__scopeId","data-v-53e5a929"]]),Si=y({__name:"VPHomeFeatures",setup(t){const{frontmatter:e}=M();return(n,o)=>l(e).features?(a(),P(Vi,{key:0,class:"VPHomeFeatures",features:l(e).features},null,8,["features"])):g("",!0)}}),Li={class:"VPHome"},Mi=y({__name:"VPHome",setup(t){return(e,n)=>{const o=q("Content");return a(),i("div",Li,[_(e.$slots,"home-hero-before",{},void 0,!0),h(ri,null,{"home-hero-info":p(()=>[_(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),_(e.$slots,"home-hero-after",{},void 0,!0),_(e.$slots,"home-features-before",{},void 0,!0),h(Si),_(e.$slots,"home-features-after",{},void 0,!0),h(o)])}}});const Ii=m(Mi,[["__scopeId","data-v-688bb46e"]]),Ai=t=>(F("data-v-9849bdbb"),t=t(),j(),t),Ni={class:"content"},Ci={class:"outline-title"},Ti={"aria-labelledby":"doc-outline-aria-label"},Bi=Ai(()=>d("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),xi=y({__name:"VPDocAsideOutline",setup(t){const{frontmatter:e,theme:n}=M(),o=le([]);ae(()=>{o.value=ze(e.value.outline??n.value.outline)});const s=S(),r=S();return lr(s,r),(u,v)=>(a(),i("div",{class:B(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s},[d("div",Ni,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",Ci,I(l(De)(l(n))),1),d("nav",Ti,[Bi,h(Fe,{headers:o.value,root:!0},null,8,["headers"])])])],2))}});const Oi=m(xi,[["__scopeId","data-v-9849bdbb"]]),Ei={class:"VPDocAsideCarbonAds"},Hi=y({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(t){const e=()=>null;return(n,o)=>(a(),i("div",Ei,[h(l(e),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),Di=t=>(F("data-v-0bcb2506"),t=t(),j(),t),zi={class:"VPDocAside"},Fi=Di(()=>d("div",{class:"spacer"},null,-1)),ji=y({__name:"VPDocAside",setup(t){const{theme:e}=M();return(n,o)=>(a(),i("div",zi,[_(n.$slots,"aside-top",{},void 0,!0),_(n.$slots,"aside-outline-before",{},void 0,!0),h(Oi),_(n.$slots,"aside-outline-after",{},void 0,!0),Fi,_(n.$slots,"aside-ads-before",{},void 0,!0),l(e).carbonAds?(a(),P(Hi,{key:0,"carbon-ads":l(e).carbonAds},null,8,["carbon-ads"])):g("",!0),_(n.$slots,"aside-ads-after",{},void 0,!0),_(n.$slots,"aside-bottom",{},void 0,!0)]))}});const Gi=m(ji,[["__scopeId","data-v-0bcb2506"]]);function Ri(){const{theme:t,page:e}=M();return V(()=>{const{text:n="Edit this page",pattern:o=""}=t.value.editLink||{},{relativePath:s}=e.value;let r;return typeof o=="function"?r=o({relativePath:s}):r=o.replace(/:path/g,s),{url:r,text:n}})}function Ui(){const{page:t,theme:e,frontmatter:n}=M();return V(()=>{var u,v,c,f;const o=pt(e.value.sidebar,t.value.relativePath),s=Tn(o),r=s.findIndex(b=>ne(t.value.relativePath,b.link));return{prev:n.value.prev===!1?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((u=s[r-1])==null?void 0:u.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((v=s[r-1])==null?void 0:v.link)},next:n.value.next===!1?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((c=s[r+1])==null?void 0:c.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((f=s[r+1])==null?void 0:f.link)}}})}const Wi={},Ki={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},qi=d("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Yi=d("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Ji=[qi,Yi];function Xi(t,e){return a(),i("svg",Ki,Ji)}const Qi=m(Wi,[["render",Xi]]),Zi={class:"VPLastUpdated"},el=["datetime"],tl=y({__name:"VPDocFooterLastUpdated",setup(t){const{theme:e,page:n,lang:o}=M(),s=V(()=>new Date(n.value.lastUpdated)),r=V(()=>s.value.toISOString()),u=S("");return R(()=>{te(()=>{u.value=s.value.toLocaleString(o.value)})}),(v,c)=>(a(),i("p",Zi,[O(I(l(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},I(u.value),9,el)]))}});const nl=m(tl,[["__scopeId","data-v-551d4203"]]),ol={key:0,class:"VPDocFooter"},sl={key:0,class:"edit-info"},al={key:0,class:"edit-link"},rl={key:1,class:"last-updated"},il={key:1,class:"prev-next"},ll={class:"pager"},cl=["href"],ul=["innerHTML"],dl=["innerHTML"],_l=["href"],vl=["innerHTML"],pl=["innerHTML"],fl=y({__name:"VPDocFooter",setup(t){const{theme:e,page:n,frontmatter:o}=M(),s=Ri(),r=Ui(),u=V(()=>e.value.editLink&&o.value.editLink!==!1),v=V(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),c=V(()=>u.value||v.value||r.value.prev||r.value.next);return(f,b)=>{var w,$,k,A,C,L,x;return c.value?(a(),i("footer",ol,[_(f.$slots,"doc-footer-before",{},void 0,!0),u.value||v.value?(a(),i("div",sl,[u.value?(a(),i("div",al,[h(Y,{class:"edit-link-button",href:l(s).url,"no-icon":!0},{default:p(()=>[h(Qi,{class:"edit-link-icon","aria-label":"edit icon"}),O(" "+I(l(s).text),1)]),_:1},8,["href"])])):g("",!0),v.value?(a(),i("div",rl,[h(nl)])):g("",!0)])):g("",!0),(w=l(r).prev)!=null&&w.link||($=l(r).next)!=null&&$.link?(a(),i("div",il,[d("div",ll,[(k=l(r).prev)!=null&&k.link?(a(),i("a",{key:0,class:"pager-link prev",href:l(me)(l(r).prev.link)},[d("span",{class:"desc",innerHTML:((A=l(e).docFooter)==null?void 0:A.prev)||"Previous page"},null,8,ul),d("span",{class:"title",innerHTML:l(r).prev.text},null,8,dl)],8,cl)):g("",!0)]),d("div",{class:B(["pager",{"has-prev":(C=l(r).prev)==null?void 0:C.link}])},[(L=l(r).next)!=null&&L.link?(a(),i("a",{key:0,class:"pager-link next",href:l(me)(l(r).next.link)},[d("span",{class:"desc",innerHTML:((x=l(e).docFooter)==null?void 0:x.next)||"Next page"},null,8,vl),d("span",{class:"title",innerHTML:l(r).next.text},null,8,pl)],8,_l)):g("",!0)],2)])):g("",!0)])):g("",!0)}}});const hl=m(fl,[["__scopeId","data-v-30350303"]]),ml={key:0,class:"VPDocOutlineDropdown"},gl={key:0,class:"items"},yl=y({__name:"VPDocOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=S(!1);ae(()=>{o.value=!1});const s=le([]);return ae(()=>{s.value=ze(e.value.outline??n.value.outline)}),(r,u)=>s.value.length>0?(a(),i("div",ml,[d("button",{onClick:u[0]||(u[0]=v=>o.value=!o.value),class:B({open:o.value})},[O(I(l(De)(l(n)))+" ",1),h(je,{class:"icon"})],2),o.value?(a(),i("div",gl,[h(Fe,{headers:s.value},null,8,["headers"])])):g("",!0)])):g("",!0)}});const bl=m(yl,[["__scopeId","data-v-24406196"]]),$l=t=>(F("data-v-6dc480e6"),t=t(),j(),t),kl={class:"container"},Pl=$l(()=>d("div",{class:"aside-curtain"},null,-1)),wl={class:"aside-container"},Vl={class:"aside-content"},Sl={class:"content"},Ll={class:"content-container"},Ml={class:"main"},Il=y({__name:"VPDoc",setup(t){const e=ue(),{hasSidebar:n,hasAside:o,leftAside:s}=G(),r=V(()=>e.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(u,v)=>{const c=q("Content");return a(),i("div",{class:B(["VPDoc",{"has-sidebar":l(n),"has-aside":l(o)}])},[_(u.$slots,"doc-top",{},void 0,!0),d("div",kl,[l(o)?(a(),i("div",{key:0,class:B(["aside",{"left-aside":l(s)}])},[Pl,d("div",wl,[d("div",Vl,[h(Gi,null,{"aside-top":p(()=>[_(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",Sl,[d("div",Ll,[_(u.$slots,"doc-before",{},void 0,!0),h(bl),d("main",Ml,[h(c,{class:B(["vp-doc",r.value])},null,8,["class"])]),h(hl,null,{"doc-footer-before":p(()=>[_(u.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),_(u.$slots,"doc-after",{},void 0,!0)])])]),_(u.$slots,"doc-bottom",{},void 0,!0)],2)}}});const Al=m(Il,[["__scopeId","data-v-6dc480e6"]]),ke=t=>(F("data-v-74f06403"),t=t(),j(),t),Nl={class:"NotFound"},Cl=ke(()=>d("p",{class:"code"},"404",-1)),Tl=ke(()=>d("h1",{class:"title"},"PAGE NOT FOUND",-1)),Bl=ke(()=>d("div",{class:"divider"},null,-1)),xl=ke(()=>d("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),Ol={class:"action"},El=["href"],Hl=y({__name:"NotFound",setup(t){const{site:e}=M(),{localeLinks:n}=de({removeCurrent:!1}),o=S("/");return R(()=>{var r;const s=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((r=n.value.find(({link:u})=>u.startsWith(s)))==null?void 0:r.link)||n.value[0].link)}),(s,r)=>(a(),i("div",Nl,[Cl,Tl,Bl,xl,d("div",Ol,[d("a",{class:"link",href:l(ce)(o.value),"aria-label":"go to home"}," Take me home ",8,El)])]))}});const Dl=m(Hl,[["__scopeId","data-v-74f06403"]]),zl=y({__name:"VPContent",setup(t){const{page:e,frontmatter:n}=M(),{hasSidebar:o}=G();return(s,r)=>(a(),i("div",{class:B(["VPContent",{"has-sidebar":l(o),"is-home":l(n).layout==="home"}]),id:"VPContent"},[l(e).isNotFound?_(s.$slots,"not-found",{key:0},()=>[h(Dl)],!0):l(n).layout==="page"?(a(),P(Dr,{key:1},{"page-top":p(()=>[_(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):l(n).layout==="home"?(a(),P(Ii,{key:2},{"home-hero-before":p(()=>[_(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):(a(),P(Al,{key:3},{"doc-top":p(()=>[_(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[_(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[_(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[_(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[_(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const Fl=m(zl,[["__scopeId","data-v-7706de2c"]]),jl={class:"container"},Gl=["innerHTML"],Rl=["innerHTML"],Ul=y({__name:"VPFooter",setup(t){const{theme:e}=M(),{hasSidebar:n}=G();return(o,s)=>l(e).footer?(a(),i("footer",{key:0,class:B(["VPFooter",{"has-sidebar":l(n)}])},[d("div",jl,[l(e).footer.message?(a(),i("p",{key:0,class:"message",innerHTML:l(e).footer.message},null,8,Gl)):g("",!0),l(e).footer.copyright?(a(),i("p",{key:1,class:"copyright",innerHTML:l(e).footer.copyright},null,8,Rl)):g("",!0)])],2)):g("",!0)}});const Wl=m(Ul,[["__scopeId","data-v-3bd6857d"]]),Kl={key:0,class:"Layout"},ql=y({__name:"Layout",setup(t){const{isOpen:e,open:n,close:o}=G(),s=ue();K(()=>s.path,o),Bn(e,o),pe("close-sidebar",o),pe("is-sidebar-open",e);const{frontmatter:r}=M(),u=Wt(),v=V(()=>!!u["home-hero-image"]);return pe("hero-image-slot-exists",v),(c,f)=>{const b=q("Content");return l(r).layout!==!1?(a(),i("div",Kl,[_(c.$slots,"layout-top",{},void 0,!0),h(En),h(zn,{class:"backdrop",show:l(e),onClick:l(o)},null,8,["show","onClick"]),h(qa,null,{"nav-bar-title-before":p(()=>[_(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(c.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[_(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Pr,{open:l(e),onOpenMenu:l(n)},null,8,["open","onOpenMenu"]),h(xr,{open:l(e)},{"sidebar-nav-before":p(()=>[_(c.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[_(c.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(Fl,null,{"page-top":p(()=>[_(c.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(c.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[_(c.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[_(c.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(c.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(c.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(c.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(c.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(c.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[_(c.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(c.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(c.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[_(c.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(c.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[_(c.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(c.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(c.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(c.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(c.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(c.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(Wl),_(c.$slots,"layout-bottom",{},void 0,!0)])):(a(),P(b,{key:1}))}}});const Yl=m(ql,[["__scopeId","data-v-d3edc1d3"]]);const nc={Layout:Yl,enhanceApp:({app:t})=>{t.component("Badge",qt)}};function oc(t,e){const{localeIndex:n}=M();function o(s){var k,A;const r=s.split("."),u=t&&typeof t=="object",v=u&&((A=(k=t.locales)==null?void 0:k[n.value])==null?void 0:A.translations)||null,c=u&&t.translations||null;let f=v,b=c,w=e;const $=r.pop();for(const C of r){let L=null;const x=w==null?void 0:w[C];x&&(L=w=x);const z=b==null?void 0:b[C];z&&(L=b=z);const D=f==null?void 0:f[C];D&&(L=f=D),x||(w=L),z||(b=L),D||(f=L)}return(f==null?void 0:f[$])??(b==null?void 0:b[$])??(w==null?void 0:w[$])??""}return o}export{tc as a,Zl as b,Ql as c,oc as d,ie as e,ec as f,gn as o,nc as t,M as u,Xl as w};
diff --git a/assets/chunks/theme.b4975081.js b/assets/chunks/theme.b4975081.js
new file mode 100644
index 000000000..2a0628fe6
--- /dev/null
+++ b/assets/chunks/theme.b4975081.js
@@ -0,0 +1,7 @@
+import{d as y,o as a,c as l,r as _,a as x,t as I,n as B,_ as m,u as Je,b as c,g as yt,e as bt,f as $t,h as Me,i as kt,j as L,w as K,k as W,l as Ie,m as Qe,p as P,q as te,s as wt,v as le,x as Pt,P as Vt,y as ce,z as ne,A as ue,B as Te,C as d,F as A,D as V,E as p,G as g,T as Ae,H as q,I as Q,J as h,K as Ze,L as St,M as Lt,N as Z,O as Mt,Q as It,R as H,S as G,U as R,V as Tt,W as je,X as Ce,Y as he,Z as At,$ as ae,a0 as Ct,a1 as Nt,a2 as Bt,a3 as xt,a4 as Et}from"./framework.b31a4d00.js";const Ht=y({__name:"VPBadge",props:{text:{},type:{}},setup(t){return(e,n)=>(a(),l("span",{class:B(["VPBadge",e.type??"tip"])},[_(e.$slots,"default",{},()=>[x(I(e.text),1)],!0)],2))}});const Dt=m(Ht,[["__scopeId","data-v-775cd04d"]]),M=Je;function Ne(t){return yt()?(bt(t),!0):!1}function F(t){return typeof t=="function"?t():c(t)}const et=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const zt=Object.prototype.toString,Ot=t=>zt.call(t)==="[object Object]",re=()=>{},Ue=Ft();function Ft(){var t,e;return et&&((t=window==null?void 0:window.navigator)==null?void 0:t.userAgent)&&(/iP(ad|hone|od)/.test(window.navigator.userAgent)||((e=window==null?void 0:window.navigator)==null?void 0:e.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Gt(t,e){function n(...o){return new Promise((s,r)=>{Promise.resolve(t(()=>e.apply(this,o),{fn:e,thisArg:this,args:o})).then(s).catch(r)})}return n}const tt=t=>t();function Rt(t,e={}){let n,o,s=re;const r=v=>{clearTimeout(v),s(),s=re};return v=>{const i=F(t),f=F(e.maxWait);return n&&r(n),i<=0||f!==void 0&&f<=0?(o&&(r(o),o=null),Promise.resolve(v())):new Promise((b,w)=>{s=e.rejectOnCancel?w:b,f&&!o&&(o=setTimeout(()=>{n&&r(n),o=null,b(v())},f)),n=setTimeout(()=>{o&&r(o),o=null,b(v())},i)})}}function Wt(t=tt){const e=L(!0);function n(){e.value=!1}function o(){e.value=!0}const s=(...r)=>{e.value&&t(...r)};return{isActive:Me(e),pause:n,resume:o,eventFilter:s}}function jt(t){return t||Qe()}function Ut(...t){if(t.length!==1)return $t(...t);const e=t[0];return typeof e=="function"?Me(kt(()=>({get:e,set:re}))):L(e)}function nt(t,e,n={}){const{eventFilter:o=tt,...s}=n;return K(t,Gt(o,e),s)}function Kt(t,e,n={}){const{eventFilter:o,...s}=n,{eventFilter:r,pause:u,resume:v,isActive:i}=Wt(o);return{stop:nt(t,e,{...s,eventFilter:r}),pause:u,resume:v,isActive:i}}function qt(t,e=!0,n){const o=jt(n);o?W(t,o):e?t():Ie(t)}function Ml(t,e,n={}){const{debounce:o=0,maxWait:s=void 0,...r}=n;return nt(t,e,{...r,eventFilter:Rt(o,{maxWait:s})})}function Il(t,e,n){let o;wt(n)?o={evaluating:n}:o=n||{};const{lazy:s=!1,evaluating:r=void 0,shallow:u=!0,onError:v=re}=o,i=L(!s),f=u?le(e):L(e);let b=0;return te(async w=>{if(!i.value)return;b++;const $=b;let k=!1;r&&Promise.resolve().then(()=>{r.value=!0});try{const T=await t(C=>{w(()=>{r&&(r.value=!1),k||C()})});$===b&&(f.value=T)}catch(T){v(T)}finally{r&&$===b&&(r.value=!1),k=!0}}),s?P(()=>(i.value=!0,f.value)):f}function Yt(t){var e;const n=F(t);return(e=n==null?void 0:n.$el)!=null?e:n}const U=et?window:void 0;function ie(...t){let e,n,o,s;if(typeof t[0]=="string"||Array.isArray(t[0])?([n,o,s]=t,e=U):[e,n,o,s]=t,!e)return re;Array.isArray(n)||(n=[n]),Array.isArray(o)||(o=[o]);const r=[],u=()=>{r.forEach(b=>b()),r.length=0},v=(b,w,$,k)=>(b.addEventListener(w,$,k),()=>b.removeEventListener(w,$,k)),i=K(()=>[Yt(e),F(s)],([b,w])=>{if(u(),!b)return;const $=Ot(w)?{...w}:w;r.push(...n.flatMap(k=>o.map(T=>v(b,k,T,$))))},{immediate:!0,flush:"post"}),f=()=>{i(),u()};return Ne(f),f}function Xt(t){return typeof t=="function"?t:typeof t=="string"?e=>e.key===t:Array.isArray(t)?e=>t.includes(e.key):()=>!0}function Jt(...t){let e,n,o={};t.length===3?(e=t[0],n=t[1],o=t[2]):t.length===2?typeof t[1]=="object"?(e=!0,n=t[0],o=t[1]):(e=t[0],n=t[1]):(e=!0,n=t[0]);const{target:s=U,eventName:r="keydown",passive:u=!1,dedupe:v=!1}=o,i=Xt(e);return ie(s,r,b=>{b.repeat&&F(v)||i(b)&&n(b)},u)}function Qt(){const t=L(!1);return Qe()&&W(()=>{t.value=!0}),t}function Zt(t){const e=Qt();return P(()=>(e.value,!!t()))}function Ve(t,e={}){const{window:n=U}=e,o=Zt(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const r=L(!1),u=f=>{r.value=f.matches},v=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",u):s.removeListener(u))},i=te(()=>{o.value&&(v(),s=n.matchMedia(F(t)),"addEventListener"in s?s.addEventListener("change",u):s.addListener(u),r.value=s.matches)});return Ne(()=>{i(),v(),s=void 0}),r}const ve=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},pe="__vueuse_ssr_handlers__",en=tn();function tn(){return pe in ve||(ve[pe]=ve[pe]||{}),ve[pe]}function nn(t,e){return en[t]||e}function on(t){return t==null?"any":t instanceof Set?"set":t instanceof Map?"map":t instanceof Date?"date":typeof t=="boolean"?"boolean":typeof t=="string"?"string":typeof t=="object"?"object":Number.isNaN(t)?"any":"number"}const sn={boolean:{read:t=>t==="true",write:t=>String(t)},object:{read:t=>JSON.parse(t),write:t=>JSON.stringify(t)},number:{read:t=>Number.parseFloat(t),write:t=>String(t)},any:{read:t=>t,write:t=>String(t)},string:{read:t=>t,write:t=>String(t)},map:{read:t=>new Map(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t.entries()))},set:{read:t=>new Set(JSON.parse(t)),write:t=>JSON.stringify(Array.from(t))},date:{read:t=>new Date(t),write:t=>t.toISOString()}},Ke="vueuse-storage";function ot(t,e,n,o={}){var s;const{flush:r="pre",deep:u=!0,listenToStorageChanges:v=!0,writeDefaults:i=!0,mergeDefaults:f=!1,shallow:b,window:w=U,eventFilter:$,onError:k=N=>{console.error(N)},initOnMounted:T}=o,C=(b?le:L)(typeof e=="function"?e():e);if(!n)try{n=nn("getDefaultStorage",()=>{var N;return(N=U)==null?void 0:N.localStorage})()}catch(N){k(N)}if(!n)return C;const S=F(e),E=on(S),D=(s=o.serializer)!=null?s:sn[E],{pause:O,resume:We}=Kt(C,()=>ht(C.value),{flush:r,deep:u,eventFilter:$});return w&&v&&qt(()=>{ie(w,"storage",_e),ie(w,Ke,gt),T&&_e()}),T||_e(),C;function ht(N){try{if(N==null)n.removeItem(t);else{const z=D.write(N),X=n.getItem(t);X!==z&&(n.setItem(t,z),w&&w.dispatchEvent(new CustomEvent(Ke,{detail:{key:t,oldValue:X,newValue:z,storageArea:n}})))}}catch(z){k(z)}}function mt(N){const z=N?N.newValue:n.getItem(t);if(z==null)return i&&S!=null&&n.setItem(t,D.write(S)),S;if(!N&&f){const X=D.read(z);return typeof f=="function"?f(X,S):E==="object"&&!Array.isArray(X)?{...S,...X}:X}else return typeof z!="string"?z:D.read(z)}function gt(N){_e(N.detail)}function _e(N){if(!(N&&N.storageArea!==n)){if(N&&N.key==null){C.value=S;return}if(!(N&&N.key!==t)){O();try{(N==null?void 0:N.newValue)!==D.write(C.value)&&(C.value=mt(N))}catch(z){k(z)}finally{N?Ie(We):We()}}}}}function we(t){return typeof Window<"u"&&t instanceof Window?t.document.documentElement:typeof Document<"u"&&t instanceof Document?t.documentElement:t}function Tl(t,e,n={}){const{window:o=U}=n;return ot(t,e,o==null?void 0:o.localStorage,n)}function st(t){const e=window.getComputedStyle(t);if(e.overflowX==="scroll"||e.overflowY==="scroll"||e.overflowX==="auto"&&t.clientWidth1?!0:(e.preventDefault&&e.preventDefault(),!1)}const fe=new WeakMap;function Al(t,e=!1){const n=L(e);let o=null,s;K(Ut(t),v=>{const i=we(F(v));if(i){const f=i;fe.get(f)||fe.set(f,s),n.value&&(f.style.overflow="hidden")}},{immediate:!0});const r=()=>{const v=we(F(t));!v||n.value||(Ue&&(o=ie(v,"touchmove",i=>{an(i)},{passive:!1})),v.style.overflow="hidden",n.value=!0)},u=()=>{var v;const i=we(F(t));!i||!n.value||(Ue&&(o==null||o()),i.style.overflow=(v=fe.get(i))!=null?v:"",fe.delete(i),n.value=!1)};return Ne(u),P({get(){return n.value},set(v){v?r():u()}})}function Cl(t,e,n={}){const{window:o=U}=n;return ot(t,e,o==null?void 0:o.sessionStorage,n)}function rn(t={}){const{window:e=U,behavior:n="auto"}=t;if(!e)return{x:L(0),y:L(0)};const o=L(e.scrollX),s=L(e.scrollY),r=P({get(){return o.value},set(v){scrollTo({left:v,behavior:n})}}),u=P({get(){return s.value},set(v){scrollTo({top:v,behavior:n})}});return ie(e,"scroll",()=>{o.value=e.scrollX,s.value=e.scrollY},{capture:!1,passive:!0}),{x:r,y:u}}function ln(t,e){let n,o=!1;return()=>{n&&clearTimeout(n),o?n=setTimeout(t,e):(t(),o=!0,setTimeout(()=>{o=!1},e))}}function Se(t){return/^\//.test(t)?t:`/${t}`}function me(t){if(Pt(t))return t.replace(Vt,"");const{site:e}=M(),{pathname:n,search:o,hash:s}=new URL(t,"http://example.com"),r=n.endsWith("/")||n.endsWith(".html")?t:t.replace(/(?:(^\.+)\/)?.*$/,`$1${n.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${o}${s}`);return ce(r)}function at(t,e){if(Array.isArray(t))return t;if(t==null)return[];e=Se(e);const n=Object.keys(t).sort((o,s)=>s.split("/").length-o.split("/").length).find(o=>e.startsWith(Se(o)));return n?t[n]:[]}function cn(t){const e=[];let n=0;for(const o in t){const s=t[o];if(s.items){n=e.push(s);continue}e[n]||e.push({items:[]}),e[n].items.push(s)}return e}function un(t){const e=[];function n(o){for(const s of o)s.text&&s.link&&e.push({text:s.text,link:s.link}),s.items&&n(s.items)}return n(t),e}function Le(t,e){return Array.isArray(e)?e.some(n=>Le(t,n)):ne(t,e.link)?!0:e.items?Le(t,e.items):!1}function j(){const t=ue(),{theme:e,frontmatter:n}=M(),o=Ve("(min-width: 960px)"),s=L(!1),r=P(()=>{const T=e.value.sidebar,C=t.data.relativePath;return T?at(T,C):[]}),u=P(()=>n.value.sidebar!==!1&&r.value.length>0&&n.value.layout!=="home"),v=P(()=>i?n.value.aside==null?e.value.aside==="left":n.value.aside==="left":!1),i=P(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:e.value.aside!==!1),f=P(()=>u.value&&o.value),b=P(()=>u.value?cn(r.value):[]);function w(){s.value=!0}function $(){s.value=!1}function k(){s.value?$():w()}return{isOpen:s,sidebar:r,sidebarGroups:b,hasSidebar:u,hasAside:i,leftAside:v,isSidebarEnabled:f,open:w,close:$,toggle:k}}function dn(t,e){let n;te(()=>{n=t.value?document.activeElement:void 0}),W(()=>{window.addEventListener("keyup",o)}),Te(()=>{window.removeEventListener("keyup",o)});function o(s){s.key==="Escape"&&t.value&&(e(),n==null||n.focus())}}function _n(t){const{page:e}=M(),n=L(!1),o=P(()=>t.value.collapsed!=null),s=P(()=>!!t.value.link),r=P(()=>ne(e.value.relativePath,t.value.link)),u=P(()=>r.value?!0:t.value.items?Le(e.value.relativePath,t.value.items):!1),v=P(()=>!!(t.value.items&&t.value.items.length));te(()=>{n.value=!!(o.value&&t.value.collapsed)}),te(()=>{(r.value||u.value)&&(n.value=!1)});function i(){o.value&&(n.value=!n.value)}return{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:i}}const vn=y({__name:"VPSkipLink",setup(t){const e=ue(),n=L();K(()=>e.path,()=>n.value.focus());function o({target:s}){const r=document.querySelector(decodeURIComponent(s.hash));if(r){const u=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",u)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",u),r.focus(),window.scrollTo(0,0)}}return(s,r)=>(a(),l(A,null,[d("span",{ref_key:"backToTop",ref:n,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}});const pn=m(vn,[["__scopeId","data-v-2d2e5156"]]),fn={key:0,class:"VPBackdrop"},hn=y({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(t){return(e,n)=>(a(),V(Ae,{name:"fade"},{default:p(()=>[e.show?(a(),l("div",fn)):g("",!0)]),_:1}))}});const mn=m(hn,[["__scopeId","data-v-aba4aac2"]]);function gn(){const t=L(!1);function e(){t.value=!0,window.addEventListener("resize",s)}function n(){t.value=!1,window.removeEventListener("resize",s)}function o(){t.value?n():e()}function s(){window.outerWidth>=768&&n()}const r=ue();return K(()=>r.path,n),{isScreenOpen:t,openScreen:e,closeScreen:n,toggleScreen:o}}function de({removeCurrent:t=!0,correspondingLink:e=!1}={}){const{site:n,localeIndex:o,page:s,theme:r}=M(),u=P(()=>{var i,f;return{label:(i=n.value.locales[o.value])==null?void 0:i.label,link:((f=n.value.locales[o.value])==null?void 0:f.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:P(()=>Object.entries(n.value.locales).flatMap(([i,f])=>t&&u.value.label===f.label?[]:{text:f.label,link:yn(f.link||(i==="root"?"/":`/${i}/`),r.value.i18nRouting!==!1&&e,s.value.relativePath.slice(u.value.link.length-1),!n.value.cleanUrls)})),currentLang:u}}function yn(t,e,n,o){return e?t.replace(/\/$/,"")+Se(n.replace(/(^|\/)?index.md$/,"$1").replace(/\.md$/,o?".html":"")):t}const bn=["src","alt"],$n={inheritAttrs:!1},kn=y({...$n,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),l("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:c(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,bn)):(a(),l(A,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const rt=m(kn,[["__scopeId","data-v-21926a76"]]),wn=["href"],Pn=y({__name:"VPNavBarTitle",setup(t){const{site:e,theme:n}=M(),{hasSidebar:o}=j(),{currentLang:s}=de();return(r,u)=>(a(),l("div",{class:B(["VPNavBarTitle",{"has-sidebar":c(o)}])},[d("a",{class:"title",href:c(me)(c(s).link)},[_(r.$slots,"nav-bar-title-before",{},void 0,!0),c(n).logo?(a(),V(rt,{key:0,class:"logo",image:c(n).logo},null,8,["image"])):g("",!0),c(n).siteTitle?(a(),l(A,{key:1},[x(I(c(n).siteTitle),1)],64)):c(n).siteTitle===void 0?(a(),l(A,{key:2},[x(I(c(e).title),1)],64)):g("",!0),_(r.$slots,"nav-bar-title-after",{},void 0,!0)],8,wn)],2))}});const Vn=m(Pn,[["__scopeId","data-v-e846412e"]]);const Sn={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Ln={class:"DocSearch-Button-Container"},Mn=d("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[d("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),In={class:"DocSearch-Button-Placeholder"},Tn=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1),qe=y({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(t){return(e,n)=>(a(),l("button",Sn,[d("span",Ln,[Mn,d("span",In,I(e.placeholder),1)]),Tn]))}});const An={id:"local-search"},Cn={key:1,id:"docsearch"},Nn=y({__name:"VPNavBarSearch",setup(t){const e=St(()=>Lt(()=>import("./VPLocalSearchBox.3e2ff172.js"),["assets/chunks/VPLocalSearchBox.3e2ff172.js","assets/chunks/framework.b31a4d00.js"])),n=()=>null,{theme:o,localeIndex:s}=M(),r=L(!1),u=P(()=>{var k,T,C,S,E,D,O;const $=((k=o.value.search)==null?void 0:k.options)??o.value.algolia;return((E=(S=(C=(T=$==null?void 0:$.locales)==null?void 0:T[s.value])==null?void 0:C.translations)==null?void 0:S.button)==null?void 0:E.buttonText)||((O=(D=$==null?void 0:$.translations)==null?void 0:D.button)==null?void 0:O.buttonText)||"Search"});W(()=>{});function v(){r.value||(r.value=!0,setTimeout(i,16))}function i(){const $=new Event("keydown");$.key="k",$.metaKey=!0,window.dispatchEvent($),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||i()},16)}const f=L(!1);Jt("k",$=>{($.ctrlKey||$.metaKey)&&($.preventDefault(),f.value=!0)});const b=L("'Meta'");W(()=>{b.value=/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"'⌘'":"'Ctrl'"});const w="local";return($,k)=>{var T;return a(),l("div",{class:"VPNavBarSearch",style:Ze({"--vp-meta-key":b.value})},[c(w)==="local"?(a(),l(A,{key:0},[f.value?(a(),V(c(e),{key:0,placeholder:u.value,onClose:k[0]||(k[0]=C=>f.value=!1)},null,8,["placeholder"])):g("",!0),d("div",An,[h(qe,{placeholder:u.value,onClick:k[1]||(k[1]=C=>f.value=!0)},null,8,["placeholder"])])],64)):c(w)==="algolia"?(a(),l(A,{key:1},[r.value?(a(),V(c(n),{key:0,algolia:((T=c(o).search)==null?void 0:T.options)??c(o).algolia},null,8,["algolia"])):(a(),l("div",Cn,[h(qe,{placeholder:u.value,onClick:v},null,8,["placeholder"])]))],64)):g("",!0)],4)}}});const Bn={},xn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",height:"24px",viewBox:"0 0 24 24",width:"24px"},En=d("path",{d:"M0 0h24v24H0V0z",fill:"none"},null,-1),Hn=d("path",{d:"M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z"},null,-1),Dn=[En,Hn];function zn(t,e){return a(),l("svg",xn,Dn)}const On=m(Bn,[["render",zn]]),Fn=y({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(t){const e=t,n=P(()=>e.tag??e.href?"a":"span"),o=P(()=>e.href&&Mt.test(e.href));return(s,r)=>(a(),V(Z(n.value),{class:B(["VPLink",{link:s.href}]),href:s.href?c(me)(s.href):void 0,target:s.target||(o.value?"_blank":void 0),rel:s.rel||(o.value?"noreferrer":void 0)},{default:p(()=>[_(s.$slots,"default",{},void 0,!0),o.value&&!s.noIcon?(a(),V(On,{key:0,class:"icon"})):g("",!0)]),_:3},8,["class","href","target","rel"]))}});const Y=m(Fn,[["__scopeId","data-v-15014769"]]),Gn=y({__name:"VPNavBarMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),V(Y,{class:B({VPNavBarMenuLink:!0,active:c(ne)(c(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel,tabindex:"0"},{default:p(()=>[x(I(n.item.text),1)]),_:1},8,["class","href","target","rel"]))}});const Rn=m(Gn,[["__scopeId","data-v-a55142e6"]]),Be=L();let it=!1,Pe=0;function Wn(t){const e=L(!1);if(It){!it&&jn(),Pe++;const n=K(Be,o=>{var s,r,u;o===t.el.value||(s=t.el.value)!=null&&s.contains(o)?(e.value=!0,(r=t.onFocus)==null||r.call(t)):(e.value=!1,(u=t.onBlur)==null||u.call(t))});Te(()=>{n(),Pe--,Pe||Un()})}return Me(e)}function jn(){document.addEventListener("focusin",lt),it=!0,Be.value=document.activeElement}function Un(){document.removeEventListener("focusin",lt)}function lt(){Be.value=document.activeElement}const Kn={},qn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Yn=d("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),Xn=[Yn];function Jn(t,e){return a(),l("svg",qn,Xn)}const ct=m(Kn,[["render",Jn]]),Qn={},Zn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},eo=d("circle",{cx:"12",cy:"12",r:"2"},null,-1),to=d("circle",{cx:"19",cy:"12",r:"2"},null,-1),no=d("circle",{cx:"5",cy:"12",r:"2"},null,-1),oo=[eo,to,no];function so(t,e){return a(),l("svg",Zn,oo)}const ao=m(Qn,[["render",so]]),ro={class:"VPMenuLink"},io=y({__name:"VPMenuLink",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),l("div",ro,[h(Y,{class:B({active:c(ne)(c(e).relativePath,n.item.activeMatch||n.item.link,!!n.item.activeMatch)}),href:n.item.link,target:n.item.target,rel:n.item.rel},{default:p(()=>[x(I(n.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const $e=m(io,[["__scopeId","data-v-d28afc9d"]]),lo={class:"VPMenuGroup"},co={key:0,class:"title"},uo=y({__name:"VPMenuGroup",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),l("div",lo,[e.text?(a(),l("p",co,I(e.text),1)):g("",!0),(a(!0),l(A,null,H(e.items,o=>(a(),l(A,null,["link"in o?(a(),V($e,{key:0,item:o},null,8,["item"])):g("",!0)],64))),256))]))}});const _o=m(uo,[["__scopeId","data-v-1bddbdf0"]]),vo={class:"VPMenu"},po={key:0,class:"items"},fo=y({__name:"VPMenu",props:{items:{}},setup(t){return(e,n)=>(a(),l("div",vo,[e.items?(a(),l("div",po,[(a(!0),l(A,null,H(e.items,o=>(a(),l(A,{key:o.text},["link"in o?(a(),V($e,{key:0,item:o},null,8,["item"])):(a(),V(_o,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):g("",!0),_(e.$slots,"default",{},void 0,!0)]))}});const ho=m(fo,[["__scopeId","data-v-14225c89"]]),mo=["aria-expanded","aria-label"],go={key:0,class:"text"},yo={class:"menu"},bo=y({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(t){const e=L(!1),n=L();Wn({el:n,onBlur:o});function o(){e.value=!1}return(s,r)=>(a(),l("div",{class:"VPFlyout",ref_key:"el",ref:n,onMouseenter:r[1]||(r[1]=u=>e.value=!0),onMouseleave:r[2]||(r[2]=u=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":s.label,onClick:r[0]||(r[0]=u=>e.value=!e.value)},[s.button||s.icon?(a(),l("span",go,[s.icon?(a(),V(Z(s.icon),{key:0,class:"option-icon"})):g("",!0),x(" "+I(s.button)+" ",1),h(ct,{class:"text-icon"})])):(a(),V(ao,{key:1,class:"icon"}))],8,mo),d("div",yo,[h(ho,{items:s.items},{default:p(()=>[_(s.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const xe=m(bo,[["__scopeId","data-v-405aaae9"]]),$o=y({__name:"VPNavBarMenuGroup",props:{item:{}},setup(t){const{page:e}=M();return(n,o)=>(a(),V(xe,{class:B({VPNavBarMenuGroup:!0,active:c(ne)(c(e).relativePath,n.item.activeMatch,!!n.item.activeMatch)}),button:n.item.text,items:n.item.items},null,8,["class","button","items"]))}}),ko=t=>(G("data-v-6d4a3966"),t=t(),R(),t),wo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Po=ko(()=>d("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),Vo=y({__name:"VPNavBarMenu",setup(t){const{theme:e}=M();return(n,o)=>c(e).nav?(a(),l("nav",wo,[Po,(a(!0),l(A,null,H(c(e).nav,s=>(a(),l(A,{key:s.text},["link"in s?(a(),V(Rn,{key:0,item:s},null,8,["item"])):(a(),V($o,{key:1,item:s},null,8,["item"]))],64))),128))])):g("",!0)}});const So=m(Vo,[["__scopeId","data-v-6d4a3966"]]),Lo={},Mo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Io=d("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),To=d("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Ao=[Io,To];function Co(t,e){return a(),l("svg",Mo,Ao)}const ut=m(Lo,[["render",Co]]),No={class:"items"},Bo={class:"title"},xo=y({__name:"VPNavBarTranslations",setup(t){const{theme:e}=M(),{localeLinks:n,currentLang:o}=de({correspondingLink:!0});return(s,r)=>c(n).length&&c(o).label?(a(),V(xe,{key:0,class:"VPNavBarTranslations",icon:ut,label:c(e).langMenuLabel||"Change language"},{default:p(()=>[d("div",No,[d("p",Bo,I(c(o).label),1),(a(!0),l(A,null,H(c(n),u=>(a(),V($e,{key:u.link,item:u},null,8,["item"]))),128))])]),_:1},8,["label"])):g("",!0)}});const Eo=m(xo,[["__scopeId","data-v-fd46d125"]]);const Ho={},Do={class:"VPSwitch",type:"button",role:"switch"},zo={class:"check"},Oo={key:0,class:"icon"};function Fo(t,e){return a(),l("button",Do,[d("span",zo,[t.$slots.default?(a(),l("span",Oo,[_(t.$slots,"default",{},void 0,!0)])):g("",!0)])])}const Go=m(Ho,[["render",Fo],["__scopeId","data-v-48d1a158"]]),Ro={},Wo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},jo=Tt(' ',9),Uo=[jo];function Ko(t,e){return a(),l("svg",Wo,Uo)}const qo=m(Ro,[["render",Ko]]),Yo={},Xo={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Jo=d("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),Qo=[Jo];function Zo(t,e){return a(),l("svg",Xo,Qo)}const es=m(Yo,[["render",Zo]]),ts={title:"toggle dark mode"},ns=y({__name:"VPSwitchAppearance",setup(t){const{site:e,isDark:n}=M(),o=L(!1),s=typeof localStorage<"u"?r():()=>{};W(()=>{o.value=document.documentElement.classList.contains("dark")});function r(){const u=window.matchMedia("(prefers-color-scheme: dark)"),v=document.documentElement.classList;let i=localStorage.getItem(je),f=e.value.appearance==="dark"&&i==null||(i==="auto"||i==null?u.matches:i==="dark");u.onchange=$=>{i==="auto"&&w(f=$.matches)};function b(){w(f=!f),i=f?u.matches?"auto":"dark":u.matches?"light":"auto",localStorage.setItem(je,i)}function w($){const k=document.createElement("style");k.type="text/css",k.appendChild(document.createTextNode(`:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) {
+ -webkit-transition: none !important;
+ -moz-transition: none !important;
+ -o-transition: none !important;
+ -ms-transition: none !important;
+ transition: none !important;
+}`)),document.head.appendChild(k),o.value=$,v[$?"add":"remove"]("dark"),window.getComputedStyle(k).opacity,document.head.removeChild(k)}return b}return K(o,u=>{n.value=u}),(u,v)=>(a(),l("label",ts,[h(Go,{class:"VPSwitchAppearance","aria-checked":o.value,onClick:c(s)},{default:p(()=>[h(qo,{class:"sun"}),h(es,{class:"moon"})]),_:1},8,["aria-checked","onClick"])]))}});const Ee=m(ns,[["__scopeId","data-v-cd2add99"]]),os={key:0,class:"VPNavBarAppearance"},ss=y({__name:"VPNavBarAppearance",setup(t){const{site:e}=M();return(n,o)=>c(e).appearance?(a(),l("div",os,[h(Ee)])):g("",!0)}});const as=m(ss,[["__scopeId","data-v-5db6483e"]]),rs={discord:'Discord ',facebook:'Facebook ',github:'GitHub ',instagram:'Instagram ',linkedin:'LinkedIn ',mastodon:'Mastodon ',slack:'Slack ',twitter:'Twitter ',youtube:'YouTube '},is=["href","aria-label","innerHTML"],ls=y({__name:"VPSocialLink",props:{icon:{},link:{}},setup(t){const e=t,n=P(()=>typeof e.icon=="object"?e.icon.svg:rs[e.icon]);return(o,s)=>(a(),l("a",{class:"VPSocialLink",href:o.link,"aria-label":typeof o.icon=="string"?o.icon:"",target:"_blank",rel:"noopener",innerHTML:n.value},null,8,is))}});const cs=m(ls,[["__scopeId","data-v-c4402a71"]]),us={class:"VPSocialLinks"},ds=y({__name:"VPSocialLinks",props:{links:{}},setup(t){return(e,n)=>(a(),l("div",us,[(a(!0),l(A,null,H(e.links,({link:o,icon:s})=>(a(),V(cs,{key:o,icon:s,link:o},null,8,["icon","link"]))),128))]))}});const He=m(ds,[["__scopeId","data-v-d7bdad6c"]]),_s=y({__name:"VPNavBarSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>c(e).socialLinks?(a(),V(He,{key:0,class:"VPNavBarSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}});const vs=m(_s,[["__scopeId","data-v-f70744fe"]]),ps={key:0,class:"group translations"},fs={class:"trans-title"},hs={key:1,class:"group"},ms={class:"item appearance"},gs={class:"label"},ys={class:"appearance-action"},bs={key:2,class:"group"},$s={class:"item social-links"},ks=y({__name:"VPNavBarExtra",setup(t){const{site:e,theme:n}=M(),{localeLinks:o,currentLang:s}=de({correspondingLink:!0}),r=P(()=>o.value.length&&s.value.label||e.value.appearance||n.value.socialLinks);return(u,v)=>r.value?(a(),V(xe,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[c(o).length&&c(s).label?(a(),l("div",ps,[d("p",fs,I(c(s).label),1),(a(!0),l(A,null,H(c(o),i=>(a(),V($e,{key:i.link,item:i},null,8,["item"]))),128))])):g("",!0),c(e).appearance?(a(),l("div",hs,[d("div",ms,[d("p",gs,I(c(n).darkModeSwitchLabel||"Appearance"),1),d("div",ys,[h(Ee)])])])):g("",!0),c(n).socialLinks?(a(),l("div",bs,[d("div",$s,[h(He,{class:"social-links-list",links:c(n).socialLinks},null,8,["links"])])])):g("",!0)]),_:1})):g("",!0)}});const ws=m(ks,[["__scopeId","data-v-3ce128b5"]]),Ps=t=>(G("data-v-1cde4ba9"),t=t(),R(),t),Vs=["aria-expanded"],Ss=Ps(()=>d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)),Ls=[Ss],Ms=y({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(t){return(e,n)=>(a(),l("button",{type:"button",class:B(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:n[0]||(n[0]=o=>e.$emit("click"))},Ls,10,Vs))}});const Is=m(Ms,[["__scopeId","data-v-1cde4ba9"]]),Ts=t=>(G("data-v-c6988a15"),t=t(),R(),t),As={class:"container"},Cs={class:"title"},Ns={class:"content"},Bs=Ts(()=>d("div",{class:"curtain"},null,-1)),xs={class:"content-body"},Es=y({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(t){const{y:e}=rn(),{hasSidebar:n}=j(),o=P(()=>({"has-sidebar":n.value,fill:e.value>0}));return(s,r)=>(a(),l("div",{class:B(["VPNavBar",o.value])},[d("div",As,[d("div",Cs,[h(Vn,null,{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Ns,[Bs,d("div",xs,[_(s.$slots,"nav-bar-content-before",{},void 0,!0),h(Nn,{class:"search"}),h(So,{class:"menu"}),h(Eo,{class:"translations"}),h(as,{class:"appearance"}),h(vs,{class:"social-links"}),h(ws,{class:"extra"}),_(s.$slots,"nav-bar-content-after",{},void 0,!0),h(Is,{class:"hamburger",active:s.isScreenOpen,onClick:r[0]||(r[0]=u=>s.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const Hs=m(Es,[["__scopeId","data-v-c6988a15"]]);function Ds(t){if(Array.isArray(t)){for(var e=0,n=Array(t.length);e1),ee=[],ye=!1,ze=-1,oe=void 0,J=void 0,se=void 0,dt=function(e){return ee.some(function(n){return!!(n.options.allowTouchMove&&n.options.allowTouchMove(e))})},be=function(e){var n=e||window.event;return dt(n.target)||n.touches.length>1?!0:(n.preventDefault&&n.preventDefault(),!1)},zs=function(e){if(se===void 0){var n=!!e&&e.reserveScrollBarGap===!0,o=window.innerWidth-document.documentElement.clientWidth;if(n&&o>0){var s=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right"),10);se=document.body.style.paddingRight,document.body.style.paddingRight=s+o+"px"}}oe===void 0&&(oe=document.body.style.overflow,document.body.style.overflow="hidden")},Os=function(){se!==void 0&&(document.body.style.paddingRight=se,se=void 0),oe!==void 0&&(document.body.style.overflow=oe,oe=void 0)},Fs=function(){return window.requestAnimationFrame(function(){if(J===void 0){J={position:document.body.style.position,top:document.body.style.top,left:document.body.style.left};var e=window,n=e.scrollY,o=e.scrollX,s=e.innerHeight;document.body.style.position="fixed",document.body.style.top=-n,document.body.style.left=-o,setTimeout(function(){return window.requestAnimationFrame(function(){var r=s-window.innerHeight;r&&n>=s&&(document.body.style.top=-(n+r))})},300)}})},Gs=function(){if(J!==void 0){var e=-parseInt(document.body.style.top,10),n=-parseInt(document.body.style.left,10);document.body.style.position=J.position,document.body.style.top=J.top,document.body.style.left=J.left,window.scrollTo(n,e),J=void 0}},Rs=function(e){return e?e.scrollHeight-e.scrollTop<=e.clientHeight:!1},Ws=function(e,n){var o=e.targetTouches[0].clientY-ze;return dt(e.target)?!1:n&&n.scrollTop===0&&o>0||Rs(n)&&o<0?be(e):(e.stopPropagation(),!0)},_t=function(e,n){if(!e){console.error("disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.");return}if(!ee.some(function(s){return s.targetElement===e})){var o={targetElement:e,options:n||{}};ee=[].concat(Ds(ee),[o]),ge?Fs():zs(n),ge&&(e.ontouchstart=function(s){s.targetTouches.length===1&&(ze=s.targetTouches[0].clientY)},e.ontouchmove=function(s){s.targetTouches.length===1&&Ws(s,e)},ye||(document.addEventListener("touchmove",be,De?{passive:!1}:void 0),ye=!0))}},vt=function(){ge&&(ee.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),ye&&(document.removeEventListener("touchmove",be,De?{passive:!1}:void 0),ye=!1),ze=-1),ge?Gs():Os(),ee=[]};const js=y({__name:"VPNavScreenMenuLink",props:{text:{},link:{}},setup(t){const e=Ce("close-screen");return(n,o)=>(a(),V(Y,{class:"VPNavScreenMenuLink",href:n.link,onClick:c(e)},{default:p(()=>[x(I(n.text),1)]),_:1},8,["href","onClick"]))}});const Us=m(js,[["__scopeId","data-v-938fe13a"]]),Ks={},qs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ys=d("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),Xs=[Ys];function Js(t,e){return a(),l("svg",qs,Xs)}const Qs=m(Ks,[["render",Js]]),Zs=y({__name:"VPNavScreenMenuGroupLink",props:{text:{},link:{}},setup(t){const e=Ce("close-screen");return(n,o)=>(a(),V(Y,{class:"VPNavScreenMenuGroupLink",href:n.link,onClick:c(e)},{default:p(()=>[x(I(n.text),1)]),_:1},8,["href","onClick"]))}});const pt=m(Zs,[["__scopeId","data-v-b210310e"]]),ea={class:"VPNavScreenMenuGroupSection"},ta={key:0,class:"title"},na=y({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(t){return(e,n)=>(a(),l("div",ea,[e.text?(a(),l("p",ta,I(e.text),1)):g("",!0),(a(!0),l(A,null,H(e.items,o=>(a(),V(pt,{key:o.text,text:o.text,link:o.link},null,8,["text","link"]))),128))]))}});const oa=m(na,[["__scopeId","data-v-79ee7596"]]),sa=["aria-controls","aria-expanded"],aa={class:"button-text"},ra=["id"],ia={key:1,class:"group"},la=y({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(t){const e=t,n=L(!1),o=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function s(){n.value=!n.value}return(r,u)=>(a(),l("div",{class:B(["VPNavScreenMenuGroup",{open:n.value}])},[d("button",{class:"button","aria-controls":o.value,"aria-expanded":n.value,onClick:s},[d("span",aa,I(r.text),1),h(Qs,{class:"button-icon"})],8,sa),d("div",{id:o.value,class:"items"},[(a(!0),l(A,null,H(r.items,v=>(a(),l(A,{key:v.text},["link"in v?(a(),l("div",{key:v.text,class:"item"},[h(pt,{text:v.text,link:v.link},null,8,["text","link"])])):(a(),l("div",ia,[h(oa,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,ra)],2))}});const ca=m(la,[["__scopeId","data-v-0834805b"]]),ua={key:0,class:"VPNavScreenMenu"},da=y({__name:"VPNavScreenMenu",setup(t){const{theme:e}=M();return(n,o)=>c(e).nav?(a(),l("nav",ua,[(a(!0),l(A,null,H(c(e).nav,s=>(a(),l(A,{key:s.text},["link"in s?(a(),V(Us,{key:0,text:s.text,link:s.link},null,8,["text","link"])):(a(),V(ca,{key:1,text:s.text||"",items:s.items},null,8,["text","items"]))],64))),128))])):g("",!0)}}),_a={key:0,class:"VPNavScreenAppearance"},va={class:"text"},pa=y({__name:"VPNavScreenAppearance",setup(t){const{site:e,theme:n}=M();return(o,s)=>c(e).appearance?(a(),l("div",_a,[d("p",va,I(c(n).darkModeSwitchLabel||"Appearance"),1),h(Ee)])):g("",!0)}});const fa=m(pa,[["__scopeId","data-v-e7237d4b"]]),ha={class:"list"},ma=y({__name:"VPNavScreenTranslations",setup(t){const{localeLinks:e,currentLang:n}=de({correspondingLink:!0}),o=L(!1);function s(){o.value=!o.value}return(r,u)=>c(e).length&&c(n).label?(a(),l("div",{key:0,class:B(["VPNavScreenTranslations",{open:o.value}])},[d("button",{class:"title",onClick:s},[h(ut,{class:"icon lang"}),x(" "+I(c(n).label)+" ",1),h(ct,{class:"icon chevron"})]),d("ul",ha,[(a(!0),l(A,null,H(c(e),v=>(a(),l("li",{key:v.link,class:"item"},[h(Y,{class:"link",href:v.link},{default:p(()=>[x(I(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):g("",!0)}});const ga=m(ma,[["__scopeId","data-v-23ae19cc"]]),ya=y({__name:"VPNavScreenSocialLinks",setup(t){const{theme:e}=M();return(n,o)=>c(e).socialLinks?(a(),V(He,{key:0,class:"VPNavScreenSocialLinks",links:c(e).socialLinks},null,8,["links"])):g("",!0)}}),ba={class:"container"},$a=y({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(t){const e=L(null);function n(){_t(e.value,{reserveScrollBarGap:!0})}function o(){vt()}return(s,r)=>(a(),V(Ae,{name:"fade",onEnter:n,onAfterLeave:o},{default:p(()=>[s.open?(a(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e},[d("div",ba,[_(s.$slots,"nav-screen-content-before",{},void 0,!0),h(da,{class:"menu"}),h(ga,{class:"translations"}),h(fa,{class:"appearance"}),h(ya,{class:"social-links"}),_(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):g("",!0)]),_:3}))}});const ka=m($a,[["__scopeId","data-v-f7d0ee9a"]]),wa={class:"VPNav"},Pa=y({__name:"VPNav",setup(t){const{isScreenOpen:e,closeScreen:n,toggleScreen:o}=gn();return he("close-screen",n),(s,r)=>(a(),l("header",wa,[h(Hs,{"is-screen-open":c(e),onToggleScreen:c(o)},{"nav-bar-title-before":p(()=>[_(s.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(s.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(s.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(s.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(ka,{open:c(e)},{"nav-screen-content-before":p(()=>[_(s.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(s.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])]))}});const Va=m(Pa,[["__scopeId","data-v-10c2e836"]]),Sa={},La={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ma=d("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Ia=d("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Ta=d("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Aa=d("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Ca=[Ma,Ia,Ta,Aa];function Na(t,e){return a(),l("svg",La,Ca)}const Ba=m(Sa,[["render",Na]]);function xa(){const{hasSidebar:t}=j(),e=Ve("(min-width: 960px)"),n=Ve("(min-width: 1280px)");return{isAsideEnabled:P(()=>!n.value&&!e.value?!1:t.value?n.value:e.value)}}const Ea=71;function Oe(t){return typeof t.outline=="object"&&!Array.isArray(t.outline)&&t.outline.label||t.outlineTitle||"On this page"}function Fe(t){const e=[...document.querySelectorAll(".VPDoc h2,h3,h4,h5,h6")].filter(n=>n.id&&n.hasChildNodes()).map(n=>{const o=Number(n.tagName[1]);return{title:Ha(n),link:"#"+n.id,level:o}});return Da(e,t)}function Ha(t){let e="";for(const n of t.childNodes)if(n.nodeType===1){if(n.classList.contains("VPBadge")||n.classList.contains("header-anchor"))continue;e+=n.textContent}else n.nodeType===3&&(e+=n.textContent);return e.trim()}function Da(t,e){if(e===!1)return[];const n=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,s]=typeof n=="number"?[n,n]:n==="deep"?[2,6]:n;t=t.filter(u=>u.level>=o&&u.level<=s);const r=[];e:for(let u=0;u=0;i--){const f=t[i];if(f.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),At(()=>{u(location.hash)}),Te(()=>{window.removeEventListener("scroll",o)});function r(){if(!n.value)return;const v=[].slice.call(t.value.querySelectorAll(".outline-link")),i=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(k=>v.some(T=>T.hash===k.hash&&k.offsetParent!==null)),f=window.scrollY,b=window.innerHeight,w=document.body.offsetHeight,$=Math.abs(f+b-w)<1;if(i.length&&$){u(i[i.length-1].hash);return}for(let k=0;k{const s=q("VPDocOutlineItem",!0);return a(),l("ul",{class:B(n.root?"root":"nested")},[(a(!0),l(A,null,H(n.headers,({children:r,link:u,title:v})=>(a(),l("li",null,[d("a",{class:"outline-link",href:u,onClick:e,title:v},I(v),9,Fa),r!=null&&r.length?(a(),V(s,{key:0,headers:r},null,8,["headers"])):g("",!0)]))),256))],2)}}});const Ge=m(Ga,[["__scopeId","data-v-36b4bfdb"]]),Ra={},Wa={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ja=d("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),Ua=[ja];function Ka(t,e){return a(),l("svg",Wa,Ua)}const Re=m(Ra,[["render",Ka]]),qa=y({__name:"VPLocalNavOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=L(!1),s=L(0),r=L();ae(()=>{o.value=!1});function u(){o.value=!o.value,s.value=window.innerHeight+Math.min(window.scrollY-64,0)}function v(b){b.target.classList.contains("outline-link")&&(r.value&&(r.value.style.transition="none"),Ie(()=>{o.value=!1}))}function i(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}const f=le([]);return ae(()=>{f.value=Fe(e.value.outline??n.value.outline)}),(b,w)=>(a(),l("div",{class:"VPLocalNavOutlineDropdown",style:Ze({"--vp-vh":s.value+"px"})},[f.value.length>0?(a(),l("button",{key:0,onClick:u,class:B({open:o.value})},[x(I(c(Oe)(c(n)))+" ",1),h(Re,{class:"icon"})],2)):(a(),l("button",{key:1,onClick:i},I(c(n).returnToTopLabel||"Return to top"),1)),h(Ae,{name:"flyout"},{default:p(()=>[o.value?(a(),l("div",{key:0,ref_key:"items",ref:r,class:"items",onClick:v},[d("a",{class:"top-link",href:"#",onClick:i},I(c(n).returnToTopLabel||"Return to top"),1),h(Ge,{headers:f.value},null,8,["headers"])],512)):g("",!0)]),_:1})],4))}});const Ya=m(qa,[["__scopeId","data-v-596c6466"]]),Xa={key:0,class:"VPLocalNav"},Ja=["aria-expanded"],Qa={class:"menu-text"},Za=y({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(t){const{theme:e}=M(),{hasSidebar:n}=j();return(o,s)=>c(n)?(a(),l("div",Xa,[d("button",{class:"menu","aria-expanded":o.open,"aria-controls":"VPSidebarNav",onClick:s[0]||(s[0]=r=>o.$emit("open-menu"))},[h(Ba,{class:"menu-icon"}),d("span",Qa,I(c(e).sidebarMenuLabel||"Menu"),1)],8,Ja),h(Ya)])):g("",!0)}});const er=m(Za,[["__scopeId","data-v-772b017f"]]),tr=t=>(G("data-v-f8e6bbce"),t=t(),R(),t),nr=["role","tabindex"],or=tr(()=>d("div",{class:"indicator"},null,-1)),sr=["onKeydown"],ar={key:1,class:"items"},rr=y({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(t){const e=t,{collapsed:n,collapsible:o,isLink:s,isActiveLink:r,hasActiveLink:u,hasChildren:v,toggle:i}=_n(P(()=>e.item)),f=P(()=>v.value?"section":"div"),b=P(()=>s.value?"a":"div"),w=P(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),$=P(()=>s.value?void 0:"button"),k=P(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:n.value},{"is-link":s.value},{"is-active":r.value},{"has-active":u.value}]);function T(S){"key"in S&&S.key!=="Enter"||!e.item.link&&i()}function C(){e.item.link&&i()}return(S,E)=>{const D=q("VPSidebarItem",!0);return a(),V(Z(f.value),{class:B(["VPSidebarItem",k.value])},{default:p(()=>[S.item.text?(a(),l("div",Q({key:0,class:"item",role:$.value},Ct(S.item.items?{click:T,keydown:T}:{},!0),{tabindex:S.item.items&&0}),[or,S.item.link?(a(),V(Y,{key:0,tag:b.value,class:"link",href:S.item.link},{default:p(()=>[(a(),V(Z(w.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href"])):(a(),V(Z(w.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null?(a(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:Nt(C,["enter"]),tabindex:"0"},[h(Re,{class:"caret-icon"})],40,sr)):g("",!0)],16,nr)):g("",!0),S.item.items&&S.item.items.length?(a(),l("div",ar,[S.depth<5?(a(!0),l(A,{key:0},H(S.item.items,O=>(a(),V(D,{key:O.text,item:O,depth:S.depth+1},null,8,["item","depth"]))),128)):g("",!0)])):g("",!0)]),_:1},8,["class"])}}});const ir=m(rr,[["__scopeId","data-v-f8e6bbce"]]),ft=t=>(G("data-v-b7ba390f"),t=t(),R(),t),lr=ft(()=>d("div",{class:"curtain"},null,-1)),cr={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},ur=ft(()=>d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),dr=y({__name:"VPSidebar",props:{open:{type:Boolean}},setup(t){const e=t,{sidebarGroups:n,hasSidebar:o}=j();let s=L(null);function r(){_t(s.value,{reserveScrollBarGap:!0})}function u(){vt()}return Bt(async()=>{var v;e.open?(r(),(v=s.value)==null||v.focus()):u()}),(v,i)=>c(o)?(a(),l("aside",{key:0,class:B(["VPSidebar",{open:v.open}]),ref_key:"navEl",ref:s,onClick:i[0]||(i[0]=xt(()=>{},["stop"]))},[lr,d("nav",cr,[ur,_(v.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),l(A,null,H(c(n),f=>(a(),l("div",{key:f.text,class:"group"},[h(ir,{item:f,depth:0},null,8,["item"])]))),128)),_(v.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):g("",!0)}});const _r=m(dr,[["__scopeId","data-v-b7ba390f"]]),vr={},pr={class:"VPPage"};function fr(t,e){const n=q("Content");return a(),l("div",pr,[_(t.$slots,"page-top"),h(n),_(t.$slots,"page-bottom")])}const hr=m(vr,[["render",fr]]),mr=y({__name:"VPButton",props:{tag:{},size:{},theme:{},text:{},href:{}},setup(t){const e=t,n=/^pathname:\/\//,o=/^[a-z]+:/i;function s(i){if(o.test(i))return i.replace(n,"");const{site:f}=Je(),{pathname:b,search:w,hash:$}=new URL(i,"http://example.com"),k=b.endsWith("/")||b.endsWith(".html")?i:i.replace(/(?:(^\.+)\/)?.*$/,`$1${b.replace(/(\.md)?$/,f.value.cleanUrls?"":".html")}${w}${$}`);return ce(k)}const r=P(()=>[e.size??"medium",e.theme??"brand"]),u=P(()=>e.href&&o.test(e.href)),v=P(()=>e.tag?e.tag:e.href?"a":"button");return(i,f)=>(a(),V(Z(v.value),{class:B(["VPButton",r.value]),href:i.href?s(i.href):void 0,target:u.value?"_blank":void 0,rel:u.value?"noreferrer":void 0},{default:p(()=>[x(I(i.text),1)]),_:1},8,["class","href","target","rel"]))}});const gr=m(mr,[["__scopeId","data-v-1d13e4c0"]]),yr=["src","alt"],br={inheritAttrs:!1},$r=y({...br,__name:"VPImage",props:{image:{},alt:{}},setup(t){return(e,n)=>{const o=q("VPImage",!0);return e.image?(a(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),l("img",Q({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:c(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,yr)):(a(),l(A,{key:1},[h(o,Q({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(o,Q({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):g("",!0)}}});const kr=m($r,[["__scopeId","data-v-34de1ea9"]]),wr=t=>(G("data-v-d5ff424d"),t=t(),R(),t),Pr={class:"VPHero"},Vr={class:"container"},Sr={key:0,class:"image"},Lr={class:"image-container"},Mr=wr(()=>d("div",{class:"image-bg"},null,-1)),Ir={class:"main"},Tr={key:0,class:"name"},Ar={class:"clip"},Cr={key:1,class:"text"},Nr={key:2,class:"tagline"},Br={key:0,class:"actions"},xr=y({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(t){const e=Ce("hero-image-slot-exists");return(n,o)=>(a(),l("div",Pr,[d("div",Vr,[n.image||c(e)?(a(),l("div",Sr,[d("div",Lr,[Mr,_(n.$slots,"home-hero-image",{},()=>[n.image?(a(),V(kr,{key:0,class:"image-src",image:n.image},null,8,["image"])):g("",!0)],!0)])])):g("",!0),d("div",Ir,[_(n.$slots,"home-hero-info",{},()=>[n.name?(a(),l("h1",Tr,[d("span",Ar,I(n.name),1)])):g("",!0),n.text?(a(),l("p",Cr,I(n.text),1)):g("",!0),n.tagline?(a(),l("p",Nr,I(n.tagline),1)):g("",!0)],!0),n.actions?(a(),l("div",Br,[(a(!0),l(A,null,H(n.actions,s=>(a(),l("div",{key:s.link,class:"action"},[h(gr,{tag:"a",size:"medium",theme:s.theme,text:s.text,href:s.link},null,8,["theme","text","href"])]))),128))])):g("",!0)])])]))}});const Er=m(xr,[["__scopeId","data-v-d5ff424d"]]),Hr=y({__name:"VPHomeHero",setup(t){const{frontmatter:e}=M();return(n,o)=>c(e).hero?(a(),V(Er,{key:0,class:"VPHomeHero",name:c(e).hero.name,text:c(e).hero.text,tagline:c(e).hero.tagline,image:c(e).hero.image,actions:c(e).hero.actions},{"home-hero-info":p(()=>[_(n.$slots,"home-hero-info")]),"home-hero-image":p(()=>[_(n.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):g("",!0)}}),Dr={},zr={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Or=d("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Fr=[Or];function Gr(t,e){return a(),l("svg",zr,Fr)}const Rr=m(Dr,[["render",Gr]]),Wr={class:"box"},jr=["innerHTML"],Ur=["innerHTML"],Kr=["innerHTML"],qr={key:3,class:"link-text"},Yr={class:"link-text-value"},Xr=y({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{}},setup(t){return(e,n)=>(a(),V(Y,{class:"VPFeature",href:e.link,"no-icon":!0},{default:p(()=>[d("article",Wr,[typeof e.icon=="object"?(a(),V(rt,{key:0,image:e.icon,alt:e.icon.alt,height:e.icon.height,width:e.icon.width},null,8,["image","alt","height","width"])):e.icon?(a(),l("div",{key:1,class:"icon",innerHTML:e.icon},null,8,jr)):g("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Ur),e.details?(a(),l("p",{key:2,class:"details",innerHTML:e.details},null,8,Kr)):g("",!0),e.linkText?(a(),l("div",qr,[d("p",Yr,[x(I(e.linkText)+" ",1),h(Rr,{class:"link-text-icon"})])])):g("",!0)])]),_:1},8,["href"]))}});const Jr=m(Xr,[["__scopeId","data-v-4c7e9883"]]),Qr={key:0,class:"VPFeatures"},Zr={class:"container"},ei={class:"items"},ti=y({__name:"VPFeatures",props:{features:{}},setup(t){const e=t,n=P(()=>{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%2===0)return"grid-4"}else return});return(o,s)=>o.features?(a(),l("div",Qr,[d("div",Zr,[d("div",ei,[(a(!0),l(A,null,H(o.features,r=>(a(),l("div",{key:r.title,class:B(["item",[n.value]])},[h(Jr,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText},null,8,["icon","title","details","link","link-text"])],2))),128))])])])):g("",!0)}});const ni=m(ti,[["__scopeId","data-v-50ddc7fc"]]),oi=y({__name:"VPHomeFeatures",setup(t){const{frontmatter:e}=M();return(n,o)=>c(e).features?(a(),V(ni,{key:0,class:"VPHomeFeatures",features:c(e).features},null,8,["features"])):g("",!0)}}),si={class:"VPHome"},ai=y({__name:"VPHome",setup(t){return(e,n)=>{const o=q("Content");return a(),l("div",si,[_(e.$slots,"home-hero-before",{},void 0,!0),h(Hr,null,{"home-hero-info":p(()=>[_(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),_(e.$slots,"home-hero-after",{},void 0,!0),_(e.$slots,"home-features-before",{},void 0,!0),h(oi),_(e.$slots,"home-features-after",{},void 0,!0),h(o)])}}});const ri=m(ai,[["__scopeId","data-v-59138ad7"]]),ii=t=>(G("data-v-a28777cb"),t=t(),R(),t),li={class:"content"},ci={class:"outline-title"},ui={"aria-labelledby":"doc-outline-aria-label"},di=ii(()=>d("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),_i=y({__name:"VPDocAsideOutline",setup(t){const{frontmatter:e,theme:n}=M(),o=le([]);ae(()=>{o.value=Fe(e.value.outline??n.value.outline)});const s=L(),r=L();return za(s,r),(u,v)=>(a(),l("div",{class:B(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:s},[d("div",li,[d("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),d("div",ci,I(c(Oe)(c(n))),1),d("nav",ui,[di,h(Ge,{headers:o.value,root:!0},null,8,["headers"])])])],2))}});const vi=m(_i,[["__scopeId","data-v-a28777cb"]]),pi={class:"VPDocAsideCarbonAds"},fi=y({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(t){const e=()=>null;return(n,o)=>(a(),l("div",pi,[h(c(e),{"carbon-ads":n.carbonAds},null,8,["carbon-ads"])]))}}),hi=t=>(G("data-v-c111cd2e"),t=t(),R(),t),mi={class:"VPDocAside"},gi=hi(()=>d("div",{class:"spacer"},null,-1)),yi=y({__name:"VPDocAside",setup(t){const{theme:e}=M();return(n,o)=>(a(),l("div",mi,[_(n.$slots,"aside-top",{},void 0,!0),_(n.$slots,"aside-outline-before",{},void 0,!0),h(vi),_(n.$slots,"aside-outline-after",{},void 0,!0),gi,_(n.$slots,"aside-ads-before",{},void 0,!0),c(e).carbonAds?(a(),V(fi,{key:0,"carbon-ads":c(e).carbonAds},null,8,["carbon-ads"])):g("",!0),_(n.$slots,"aside-ads-after",{},void 0,!0),_(n.$slots,"aside-bottom",{},void 0,!0)]))}});const bi=m(yi,[["__scopeId","data-v-c111cd2e"]]);function $i(){const{theme:t,page:e}=M();return P(()=>{const{text:n="Edit this page",pattern:o=""}=t.value.editLink||{},{relativePath:s}=e.value;let r;return typeof o=="function"?r=o({relativePath:s}):r=o.replace(/:path/g,s),{url:r,text:n}})}function ki(){const{page:t,theme:e,frontmatter:n}=M();return P(()=>{var u,v,i,f;const o=at(e.value.sidebar,t.value.relativePath),s=un(o),r=s.findIndex(b=>ne(t.value.relativePath,b.link));return{prev:n.value.prev===!1?void 0:{text:(typeof n.value.prev=="string"?n.value.prev:typeof n.value.prev=="object"?n.value.prev.text:void 0)??((u=s[r-1])==null?void 0:u.text),link:(typeof n.value.prev=="object"?n.value.prev.link:void 0)??((v=s[r-1])==null?void 0:v.link)},next:n.value.next===!1?void 0:{text:(typeof n.value.next=="string"?n.value.next:typeof n.value.next=="object"?n.value.next.text:void 0)??((i=s[r+1])==null?void 0:i.text),link:(typeof n.value.next=="object"?n.value.next.link:void 0)??((f=s[r+1])==null?void 0:f.link)}}})}const wi={},Pi={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Vi=d("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Si=d("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Li=[Vi,Si];function Mi(t,e){return a(),l("svg",Pi,Li)}const Ii=m(wi,[["render",Mi]]),Ti={class:"VPLastUpdated"},Ai=["datetime"],Ci=y({__name:"VPDocFooterLastUpdated",setup(t){const{theme:e,page:n,lang:o}=M(),s=P(()=>new Date(n.value.lastUpdated)),r=P(()=>s.value.toISOString()),u=L("");return W(()=>{te(()=>{u.value=s.value.toLocaleString(o.value)})}),(v,i)=>(a(),l("p",Ti,[x(I(c(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:r.value},I(u.value),9,Ai)]))}});const Ni=m(Ci,[["__scopeId","data-v-ee6f969b"]]),Bi={key:0,class:"VPDocFooter"},xi={key:0,class:"edit-info"},Ei={key:0,class:"edit-link"},Hi={key:1,class:"last-updated"},Di={key:1,class:"prev-next"},zi={class:"pager"},Oi=["href"],Fi=["innerHTML"],Gi=["innerHTML"],Ri=["href"],Wi=["innerHTML"],ji=["innerHTML"],Ui=y({__name:"VPDocFooter",setup(t){const{theme:e,page:n,frontmatter:o}=M(),s=$i(),r=ki(),u=P(()=>e.value.editLink&&o.value.editLink!==!1),v=P(()=>n.value.lastUpdated&&o.value.lastUpdated!==!1),i=P(()=>u.value||v.value||r.value.prev||r.value.next);return(f,b)=>{var w,$,k,T,C,S,E;return i.value?(a(),l("footer",Bi,[_(f.$slots,"doc-footer-before",{},void 0,!0),u.value||v.value?(a(),l("div",xi,[u.value?(a(),l("div",Ei,[h(Y,{class:"edit-link-button",href:c(s).url,"no-icon":!0},{default:p(()=>[h(Ii,{class:"edit-link-icon","aria-label":"edit icon"}),x(" "+I(c(s).text),1)]),_:1},8,["href"])])):g("",!0),v.value?(a(),l("div",Hi,[h(Ni)])):g("",!0)])):g("",!0),(w=c(r).prev)!=null&&w.link||($=c(r).next)!=null&&$.link?(a(),l("div",Di,[d("div",zi,[(k=c(r).prev)!=null&&k.link?(a(),l("a",{key:0,class:"pager-link prev",href:c(me)(c(r).prev.link)},[d("span",{class:"desc",innerHTML:((T=c(e).docFooter)==null?void 0:T.prev)||"Previous page"},null,8,Fi),d("span",{class:"title",innerHTML:c(r).prev.text},null,8,Gi)],8,Oi)):g("",!0)]),d("div",{class:B(["pager",{"has-prev":(C=c(r).prev)==null?void 0:C.link}])},[(S=c(r).next)!=null&&S.link?(a(),l("a",{key:0,class:"pager-link next",href:c(me)(c(r).next.link)},[d("span",{class:"desc",innerHTML:((E=c(e).docFooter)==null?void 0:E.next)||"Next page"},null,8,Wi),d("span",{class:"title",innerHTML:c(r).next.text},null,8,ji)],8,Ri)):g("",!0)],2)])):g("",!0)])):g("",!0)}}});const Ki=m(Ui,[["__scopeId","data-v-89b3d043"]]),qi={key:0,class:"VPDocOutlineDropdown"},Yi={key:0,class:"items"},Xi=y({__name:"VPDocOutlineDropdown",setup(t){const{frontmatter:e,theme:n}=M(),o=L(!1);ae(()=>{o.value=!1});const s=le([]);return ae(()=>{s.value=Fe(e.value.outline??n.value.outline)}),(r,u)=>s.value.length>0?(a(),l("div",qi,[d("button",{onClick:u[0]||(u[0]=v=>o.value=!o.value),class:B({open:o.value})},[x(I(c(Oe)(c(n)))+" ",1),h(Re,{class:"icon"})],2),o.value?(a(),l("div",Yi,[h(Ge,{headers:s.value},null,8,["headers"])])):g("",!0)])):g("",!0)}});const Ji=m(Xi,[["__scopeId","data-v-268a60d6"]]),Qi=t=>(G("data-v-9ca33bd6"),t=t(),R(),t),Zi={class:"container"},el=Qi(()=>d("div",{class:"aside-curtain"},null,-1)),tl={class:"aside-container"},nl={class:"aside-content"},ol={class:"content"},sl={class:"content-container"},al={class:"main"},rl=y({__name:"VPDoc",setup(t){const e=ue(),{hasSidebar:n,hasAside:o,leftAside:s}=j(),r=P(()=>e.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(u,v)=>{const i=q("Content");return a(),l("div",{class:B(["VPDoc",{"has-sidebar":c(n),"has-aside":c(o)}])},[_(u.$slots,"doc-top",{},void 0,!0),d("div",Zi,[c(o)?(a(),l("div",{key:0,class:B(["aside",{"left-aside":c(s)}])},[el,d("div",tl,[d("div",nl,[h(bi,null,{"aside-top":p(()=>[_(u.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(u.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(u.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(u.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(u.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(u.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):g("",!0),d("div",ol,[d("div",sl,[_(u.$slots,"doc-before",{},void 0,!0),h(Ji),d("main",al,[h(i,{class:B(["vp-doc",r.value])},null,8,["class"])]),h(Ki,null,{"doc-footer-before":p(()=>[_(u.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),_(u.$slots,"doc-after",{},void 0,!0)])])]),_(u.$slots,"doc-bottom",{},void 0,!0)],2)}}});const il=m(rl,[["__scopeId","data-v-9ca33bd6"]]),ke=t=>(G("data-v-4aaa5124"),t=t(),R(),t),ll={class:"NotFound"},cl=ke(()=>d("p",{class:"code"},"404",-1)),ul=ke(()=>d("h1",{class:"title"},"PAGE NOT FOUND",-1)),dl=ke(()=>d("div",{class:"divider"},null,-1)),_l=ke(()=>d("blockquote",{class:"quote"}," But if you don't change your direction, and if you keep looking, you may end up where you are heading. ",-1)),vl={class:"action"},pl=["href"],fl=y({__name:"NotFound",setup(t){const{site:e}=M(),{localeLinks:n}=de({removeCurrent:!1}),o=L("/");return W(()=>{var r;const s=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");n.value.length&&(o.value=((r=n.value.find(({link:u})=>u.startsWith(s)))==null?void 0:r.link)||n.value[0].link)}),(s,r)=>(a(),l("div",ll,[cl,ul,dl,_l,d("div",vl,[d("a",{class:"link",href:c(ce)(o.value),"aria-label":"go to home"}," Take me home ",8,pl)])]))}});const hl=m(fl,[["__scopeId","data-v-4aaa5124"]]),ml=y({__name:"VPContent",setup(t){const{page:e,frontmatter:n}=M(),{hasSidebar:o}=j();return(s,r)=>(a(),l("div",{class:B(["VPContent",{"has-sidebar":c(o),"is-home":c(n).layout==="home"}]),id:"VPContent"},[c(e).isNotFound?_(s.$slots,"not-found",{key:0},()=>[h(hl)],!0):c(n).layout==="page"?(a(),V(hr,{key:1},{"page-top":p(()=>[_(s.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(s.$slots,"page-bottom",{},void 0,!0)]),_:3})):c(n).layout==="home"?(a(),V(ri,{key:2},{"home-hero-before":p(()=>[_(s.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(s.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(s.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(s.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(s.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(s.$slots,"home-features-after",{},void 0,!0)]),_:3})):(a(),V(il,{key:3},{"doc-top":p(()=>[_(s.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(s.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[_(s.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(s.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(s.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[_(s.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[_(s.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(s.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(s.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(s.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[_(s.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const gl=m(ml,[["__scopeId","data-v-13c861a7"]]),yl={class:"container"},bl=["innerHTML"],$l=["innerHTML"],kl=y({__name:"VPFooter",setup(t){const{theme:e}=M(),{hasSidebar:n}=j();return(o,s)=>c(e).footer?(a(),l("footer",{key:0,class:B(["VPFooter",{"has-sidebar":c(n)}])},[d("div",yl,[c(e).footer.message?(a(),l("p",{key:0,class:"message",innerHTML:c(e).footer.message},null,8,bl)):g("",!0),c(e).footer.copyright?(a(),l("p",{key:1,class:"copyright",innerHTML:c(e).footer.copyright},null,8,$l)):g("",!0)])],2)):g("",!0)}});const wl=m(kl,[["__scopeId","data-v-0c8ff5c9"]]),Pl={key:0,class:"Layout"},Vl=y({__name:"Layout",setup(t){const{isOpen:e,open:n,close:o}=j(),s=ue();K(()=>s.path,o),dn(e,o),he("close-sidebar",o),he("is-sidebar-open",e);const{frontmatter:r}=M(),u=Et(),v=P(()=>!!u["home-hero-image"]);return he("hero-image-slot-exists",v),(i,f)=>{const b=q("Content");return c(r).layout!==!1?(a(),l("div",Pl,[_(i.$slots,"layout-top",{},void 0,!0),h(pn),h(mn,{class:"backdrop",show:c(e),onClick:c(o)},null,8,["show","onClick"]),h(Va,null,{"nav-bar-title-before":p(()=>[_(i.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[_(i.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[_(i.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[_(i.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[_(i.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[_(i.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(er,{open:c(e),onOpenMenu:c(n)},null,8,["open","onOpenMenu"]),h(_r,{open:c(e)},{"sidebar-nav-before":p(()=>[_(i.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[_(i.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(gl,null,{"page-top":p(()=>[_(i.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[_(i.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[_(i.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[_(i.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[_(i.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[_(i.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[_(i.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[_(i.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[_(i.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[_(i.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[_(i.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[_(i.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[_(i.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[_(i.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[_(i.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[_(i.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[_(i.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[_(i.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[_(i.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[_(i.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(wl),_(i.$slots,"layout-bottom",{},void 0,!0)])):(a(),V(b,{key:1}))}}});const Sl=m(Vl,[["__scopeId","data-v-600cd4bc"]]);const Nl={Layout:Sl,enhanceApp:({app:t})=>{t.component("Badge",Dt)}};function Bl(t,e){const{localeIndex:n}=M();function o(s){var k,T;const r=s.split("."),u=t&&typeof t=="object",v=u&&((T=(k=t.locales)==null?void 0:k[n.value])==null?void 0:T.translations)||null,i=u&&t.translations||null;let f=v,b=i,w=e;const $=r.pop();for(const C of r){let S=null;const E=w==null?void 0:w[C];E&&(S=w=E);const D=b==null?void 0:b[C];D&&(S=b=D);const O=f==null?void 0:f[C];O&&(S=f=O),E||(w=S),D||(b=S),O||(f=S)}return(f==null?void 0:f[$])??(b==null?void 0:b[$])??(w==null?void 0:w[$])??""}return o}export{Cl as a,Tl as b,Il as c,Bl as d,ie as e,Al as f,Jt as o,Nl as t,M as u,Ml as w};
diff --git a/assets/guide_builder.md.da64d858.js b/assets/guide_builder.md.7aef2181.js
similarity index 95%
rename from assets/guide_builder.md.da64d858.js
rename to assets/guide_builder.md.7aef2181.js
index 6ade10346..560b6b699 100644
--- a/assets/guide_builder.md.da64d858.js
+++ b/assets/guide_builder.md.7aef2181.js
@@ -1 +1 @@
-import{_ as e,o as a,c as t,V as i}from"./chunks/framework.85b09291.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i('Vite 和 Webpack 双构建 Fes.js@3.0.x
版本支持 Vite 和 Webpack 两种构建方式,不再内置构建方式,需要开发者自行选择:
选用 Vite 构建,安装 npm i @fesjs/builder-vite
依赖即可。 选用 Webpack 构建,安装 npm i @fesjs/builder-webpack
依赖即可。 使用差异 由于 Fes.js 在 Vite 和 Webpack 上做了一层封装,开发者关心的构建配置不会太多。从使用上来说,主要存在以下几个差异点:
配置 Webpack 和 Vite 构建在配置方面有一些差异,具体可以查看配置 。
静态文件处理 由于 Vite 的限制,不支持 require
语法,具体 Vite 的用法可以查看官网
html 模版 html 模版比较常规的需求,例如模版变量,Webpack 和 Vite 之间没什么差异。如果有其他特殊的需求, Webpack 可以使用 html-webpack-plugin ,Vite 使用vite-plugin-html 进行个性化配置。
TIP
fes3.0+ html 模版文件从 public/index.html
挪到项目根目录。
',12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default};
+import{_ as e,o as a,c as t,V as i}from"./chunks/framework.b31a4d00.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i('Vite 和 Webpack 双构建 Fes.js@3.0.x
版本支持 Vite 和 Webpack 两种构建方式,不再内置构建方式,需要开发者自行选择:
选用 Vite 构建,安装 npm i @fesjs/builder-vite
依赖即可。 选用 Webpack 构建,安装 npm i @fesjs/builder-webpack
依赖即可。 使用差异 由于 Fes.js 在 Vite 和 Webpack 上做了一层封装,开发者关心的构建配置不会太多。从使用上来说,主要存在以下几个差异点:
配置 Webpack 和 Vite 构建在配置方面有一些差异,具体可以查看配置 。
静态文件处理 由于 Vite 的限制,不支持 require
语法,具体 Vite 的用法可以查看官网
html 模版 html 模版比较常规的需求,例如模版变量,Webpack 和 Vite 之间没什么差异。如果有其他特殊的需求, Webpack 可以使用 html-webpack-plugin ,Vite 使用vite-plugin-html 进行个性化配置。
TIP
fes3.0+ html 模版文件从 public/index.html
挪到项目根目录。
',12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default};
diff --git a/assets/guide_builder.md.da64d858.lean.js b/assets/guide_builder.md.7aef2181.lean.js
similarity index 65%
rename from assets/guide_builder.md.da64d858.lean.js
rename to assets/guide_builder.md.7aef2181.lean.js
index 4344481aa..72767817e 100644
--- a/assets/guide_builder.md.da64d858.lean.js
+++ b/assets/guide_builder.md.7aef2181.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as t,V as i}from"./chunks/framework.85b09291.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i("",12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default};
+import{_ as e,o as a,c as t,V as i}from"./chunks/framework.b31a4d00.js";const m=JSON.parse('{"title":"Vite 和 Webpack 双构建","description":"","frontmatter":{},"headers":[],"relativePath":"guide/builder.md"}'),r={name:"guide/builder.md"},l=i("",12),c=[l];function o(s,n,h,p,d,b){return a(),t("div",null,c)}const _=e(r,[["render",o]]);export{m as __pageData,_ as default};
diff --git a/assets/guide_config.md.25bc06f2.lean.js b/assets/guide_config.md.25bc06f2.lean.js
deleted file mode 100644
index ded0f3cc5..000000000
--- a/assets/guide_config.md.25bc06f2.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l("",21),e=[o];function c(t,r,D,F,y,C){return a(),n("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default};
diff --git a/assets/guide_config.md.25bc06f2.js b/assets/guide_config.md.62eccd9f.js
similarity index 63%
rename from assets/guide_config.md.25bc06f2.js
rename to assets/guide_config.md.62eccd9f.js
index 153c439bc..0ac9f5823 100644
--- a/assets/guide_config.md.25bc06f2.js
+++ b/assets/guide_config.md.62eccd9f.js
@@ -1,53 +1,53 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l(`编译时配置 Fes.js 约定 .fes.js
文件为项目编译需要编译时配置文件,可以引入 node
端依赖项,不要引入浏览器端依赖项。
一份常见的配置示例如下(更多配置项请查阅配置 ):
js import { defineBuildConfig } from ' @fesjs/fes ' ;
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l(`编译时配置 Fes.js 约定 .fes.js
文件为项目编译需要编译时配置文件,可以引入 node
端依赖项,不要引入浏览器端依赖项。
一份常见的配置示例如下(更多配置项请查阅配置 ):
js import { defineBuildConfig } from ' @fesjs/fes ' ;
-export default defineBuildConfig ( {
- publicPath : ' / ' ,
- mock : {
- prefix : ' /v2 ' ,
- },
- proxy : {
- ' /v2 ' : {
- target : ' https://api.douban.com/ ' ,
- changeOrigin : true ,
- },
- },
- layout : {
- title : ' Fes.js ' ,
- footer : ' Created by MumbelFe ' ,
- multiTabs : false ,
- menus : [
- {
- name : ' index ' ,
- },
- {
- name : ' onepiece ' ,
- },
- {
- name : ' store ' ,
- },
- {
- name : ' simpleList ' ,
- },
- ] ,
- },
-} ) ;
本地临时配置文件 可以新建 .fes.local.js
作为本地临时配置文件。这份配置会和 .fes.js
做 deep merge
后形成最终配置。
js // .fes.js
-export default { mock : false };
+export default defineBuildConfig ( {
+ publicPath : ' / ' ,
+ mock : {
+ prefix : ' /v2 ' ,
+ },
+ proxy : {
+ ' /v2 ' : {
+ target : ' https://api.douban.com/ ' ,
+ changeOrigin : true ,
+ },
+ },
+ layout : {
+ title : ' Fes.js ' ,
+ footer : ' Created by MumbelFe ' ,
+ multiTabs : false ,
+ menus : [
+ {
+ name : ' index ' ,
+ },
+ {
+ name : ' onepiece ' ,
+ },
+ {
+ name : ' store ' ,
+ },
+ {
+ name : ' simpleList ' ,
+ },
+ ] ,
+ },
+} ) ;
本地临时配置文件 可以新建 .fes.local.js
作为本地临时配置文件。这份配置会和 .fes.js
做 deep merge
后形成最终配置。
js // .fes.js
+export default { mock : false };
// .fes.local.js
-export default {
- mock : true ,
- devServer : { port : 8000 }
+export default {
+ mock : true ,
+ devServer : { port : 8000 }
};
最终的配置是:
js {
mock : true ,
devServer : { port : 8000 }
};
WARNING
.fes.local.js
是本地验证使用的临时配置,仅在 fes dev
时有效,请将其添加到 .gitignore
,不要提交到 git
仓库中。
多环境多份配置 可以通过环境变量 FES_ENV
区分不同环境,来指定当前环境的配置文件,这份配置会和 .fes.js
做 deep merge
后形成最终配。
比如配置如下:
js // .fes.js
-export default { mock : false };
+export default { mock : false };
// .fes.uat.js
-export default {
- mock : true ,
- devServer : { port : 8000 }
-};
当我们运行:
这时候会命中 .fes.uat.js
这份环境配置,最终配置是:
js {
+export default {
+ mock : true ,
+ devServer : { port : 8000 }
+};
当我们运行:
这时候会命中 .fes.uat.js
这份环境配置,最终配置是:
js {
mock : true ,
devServer : { port : 8000 }
-};
优先级 本地临时配置 > 环境配置 > 基础配置
TIP
如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的 。
`,21),e=[o];function c(t,r,D,F,y,C){return a(),n("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default};
+};
优先级 本地临时配置 > 环境配置 > 基础配置
TIP
如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的 。
`,21),e=[o];function c(t,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",c]]);export{d as __pageData,E as default};
diff --git a/assets/guide_config.md.62eccd9f.lean.js b/assets/guide_config.md.62eccd9f.lean.js
new file mode 100644
index 000000000..68c102688
--- /dev/null
+++ b/assets/guide_config.md.62eccd9f.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"编译时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/config.md"}'),p={name:"guide/config.md"},o=l("",21),e=[o];function c(t,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",c]]);export{d as __pageData,E as default};
diff --git a/assets/guide_contributing.md.1734fd0c.js b/assets/guide_contributing.md.8666fd37.js
similarity index 94%
rename from assets/guide_contributing.md.1734fd0c.js
rename to assets/guide_contributing.md.8666fd37.js
index 1c4577ae3..992fb37e0 100644
--- a/assets/guide_contributing.md.1734fd0c.js
+++ b/assets/guide_contributing.md.8666fd37.js
@@ -1 +1 @@
-import{o as e,c as a,V as s}from"./chunks/framework.85b09291.js";const o=s('贡献指南 包概览 项目仓库借助于 pnpm 工作区 来实现 Monorepo ,在 packages
目录下存放多个互相关联的独立包。
@fesjs/create-fes-app
: 创建项目模板模块。提供create-fes-app
命令,提供创建多种类型项目模板的能力。
@fesjs/compiler
: 编译时插件管理模块。定义插件的生命周期、插件配置、插件通讯机制等。
@fesjs/runtime
: 运行时插件模块。集成了 vue-router,定义运行时插件生命周期、插件通讯机制。
@fesjs/preset-build-in
: 内置插件集。包含dev
、build
等命令,集成 webpack5+babel,提供方便编写插件的 API,入口文件处理,路由处理等能力。
@fesjs/fes-template
: 适用于 PC 类型的模板项目。
@fesjs/fes-template-h5
: 适用于 H5 类型的模板项目。
@fesjs/plugin-${name}
: 官方插件。
@fesjs/fes
: 入口模块。提供fes
命令和 API 入口,封装@fesjs/compiler
+ @fesjs/runtime
+ @fesjs/preset-build-in
,用户只需要安装此依赖和其他插件。
开发准备 开发要求:
本项目开发使用的一些主要工具:
克隆仓库:
bash git clone https://github.com/WeBankFinTech/fes.js.git
进入fes.js
目录,安装依赖:
贡献文档 文档代码在docs
目录,基于 vitepress 实现。
第一步:启动服务 第二步:修改 md 文件 菜单配置在/docs/.vitpress/configs/sidebar/zh.ts
中,可以通过此配置找到对应想修改的文档。
如果想添加图片,则可以先把图片添加至/docs/.vitpress/public
,在代码中使用:
html < img :src = " withBase('framework.png') " alt = " 架构 " />
第三步:查看更新 当 md 文档保存后,文档会自动更新,在http://localhost:8080/
查看。
贡献源码 Fes.js
统一使用ES Module
规范编写源码,代码会在 node 端和浏览器端执行,所以源码需要编译后才能发布成包,再被执行。
启动编译服务 当我们修改build.config.js
中配置的包代码时,会把src
目录的源码编译后到lib
目录。
修改源码 在了解Fes.js
设计前提下,修改核心代码或者插件代码。
验证修改内容 根据需求选择模板项目来验证修改内容,比如选择fes-template
:
查看需待验证包是否已经添加到模板项目的依赖中,如果没有则在模板项目的 package.json 中添加包依赖,添加后在根目录执行pnpm
关联依赖 启动模板项目的开发服务 bash cd packages/fes-template \npnpm dev
在项目模板中添加代码验证修改内容 打开localhost:8000
查看结果 快速调试技巧 每次修改插件或者核心代码后,等待自动编译完,需要在模板目录重新执行fes dev
,比较费时费力。
可以先在模板的 .fes
目录中找到对应临时代码,更改逻辑,验证完后再将变更逻辑保存到正式文件中。
WARNING
直接修改临时文件切莫重新执行fes dev
,修改会被覆盖。
提交 PR fork 项目! 创建你的功能分支: git checkout -b my-new-feature 本地提交新代码: git commit -am 'Add some feature' 推送本地到服务器分支: git push origin my-new-feature 创建一个 PR ',41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default};
+import{o as e,c as a,V as s}from"./chunks/framework.b31a4d00.js";const o=s('贡献指南 包概览 项目仓库借助于 pnpm 工作区 来实现 Monorepo ,在 packages
目录下存放多个互相关联的独立包。
@fesjs/create-fes-app
: 创建项目模板模块。提供create-fes-app
命令,提供创建多种类型项目模板的能力。
@fesjs/compiler
: 编译时插件管理模块。定义插件的生命周期、插件配置、插件通讯机制等。
@fesjs/runtime
: 运行时插件模块。集成了 vue-router,定义运行时插件生命周期、插件通讯机制。
@fesjs/preset-build-in
: 内置插件集。包含dev
、build
等命令,集成 webpack5+babel,提供方便编写插件的 API,入口文件处理,路由处理等能力。
@fesjs/fes-template
: 适用于 PC 类型的模板项目。
@fesjs/fes-template-h5
: 适用于 H5 类型的模板项目。
@fesjs/plugin-${name}
: 官方插件。
@fesjs/fes
: 入口模块。提供fes
命令和 API 入口,封装@fesjs/compiler
+ @fesjs/runtime
+ @fesjs/preset-build-in
,用户只需要安装此依赖和其他插件。
开发准备 开发要求:
本项目开发使用的一些主要工具:
克隆仓库:
bash git clone https://github.com/WeBankFinTech/fes.js.git
进入fes.js
目录,安装依赖:
贡献文档 文档代码在docs
目录,基于 vitepress 实现。
第一步:启动服务 第二步:修改 md 文件 菜单配置在/docs/.vitpress/configs/sidebar/zh.ts
中,可以通过此配置找到对应想修改的文档。
如果想添加图片,则可以先把图片添加至/docs/.vitpress/public
,在代码中使用:
html < img :src = " withBase('framework.png') " alt = " 架构 " />
第三步:查看更新 当 md 文档保存后,文档会自动更新,在http://localhost:8080/
查看。
贡献源码 Fes.js
统一使用ES Module
规范编写源码,代码会在 node 端和浏览器端执行,所以源码需要编译后才能发布成包,再被执行。
启动编译服务 当我们修改build.config.js
中配置的包代码时,会把src
目录的源码编译后到lib
目录。
修改源码 在了解Fes.js
设计前提下,修改核心代码或者插件代码。
验证修改内容 根据需求选择模板项目来验证修改内容,比如选择fes-template
:
查看需待验证包是否已经添加到模板项目的依赖中,如果没有则在模板项目的 package.json 中添加包依赖,添加后在根目录执行pnpm
关联依赖 启动模板项目的开发服务 bash cd packages/fes-template \npnpm dev
在项目模板中添加代码验证修改内容 打开localhost:8000
查看结果 快速调试技巧 每次修改插件或者核心代码后,等待自动编译完,需要在模板目录重新执行fes dev
,比较费时费力。
可以先在模板的 .fes
目录中找到对应临时代码,更改逻辑,验证完后再将变更逻辑保存到正式文件中。
WARNING
直接修改临时文件切莫重新执行fes dev
,修改会被覆盖。
提交 PR fork 项目! 创建你的功能分支: git checkout -b my-new-feature 本地提交新代码: git commit -am 'Add some feature' 推送本地到服务器分支: git push origin my-new-feature 创建一个 PR ',41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default};
diff --git a/assets/guide_contributing.md.1734fd0c.lean.js b/assets/guide_contributing.md.8666fd37.lean.js
similarity index 81%
rename from assets/guide_contributing.md.1734fd0c.lean.js
rename to assets/guide_contributing.md.8666fd37.lean.js
index 56c0b06a8..2a5fa1a50 100644
--- a/assets/guide_contributing.md.1734fd0c.lean.js
+++ b/assets/guide_contributing.md.8666fd37.lean.js
@@ -1 +1 @@
-import{o as e,c as a,V as s}from"./chunks/framework.85b09291.js";const o=s("",41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default};
+import{o as e,c as a,V as s}from"./chunks/framework.b31a4d00.js";const o=s("",41),l=[o],i=JSON.parse('{"title":"贡献指南","description":"","frontmatter":{},"headers":[],"relativePath":"guide/contributing.md"}'),t={name:"guide/contributing.md"},d=Object.assign(t,{setup(p){return(n,r)=>(e(),a("div",null,l))}});export{i as __pageData,d as default};
diff --git a/assets/guide_css.md.e9f5916f.js b/assets/guide_css.md.db5fc79d.js
similarity index 78%
rename from assets/guide_css.md.e9f5916f.js
rename to assets/guide_css.md.db5fc79d.js
index d9f2d03c4..7ccb1d198 100644
--- a/assets/guide_css.md.e9f5916f.js
+++ b/assets/guide_css.md.db5fc79d.js
@@ -1,12 +1,12 @@
-import{_ as s,o as a,c as l,V as e}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e(`使用 css TIP
本文档以 css 为示例,把后缀换成 .less
同样适用。
全局样式 Fes.js 中约定 src/global.css
为全局样式,如果存在此文件,会被自动引入到入口文件最前面。
比如用于覆盖样式,
css . layout-content {
- max-width : 1000px ;
+import{_ as s,o as a,c as l,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e(`使用 css TIP
本文档以 css 为示例,把后缀换成 .less
同样适用。
全局样式 Fes.js 中约定 src/global.css
为全局样式,如果存在此文件,会被自动引入到入口文件最前面。
比如用于覆盖样式,
css . layout-content {
+ max-width : 1000px ;
}
组件内样式 vue < style >
-. layout-content {
- max-width : 1000px ;
+. layout-content {
+ max-width : 1000px ;
}
</ style >
引入第三方样式 可以直接通过 import
引入第三方组件,当然最好在入口文件app.js
中引入
js // src/app.js
-import ' bootstrap/dist/css/bootstrap.css '
CSS Modules 支持 Vue
的 CSS Modules 用法,可以直接使用:
vue < style module >
-. layout-content {
- max-width : 1000px ;
-}
如果想直接引入CSS文件的话,则CSS文件名需要包含.module
,比如:
js import style from ' @/styles/index.module.css '
-console . log (style)
CSS 预处理器 Fes.js 内置支持 less
,不支持 sass
和 stylus
,但如果有需求,可以通过 chainWebpack
配置或者 fes-plugin
插件的形式支持。
`,18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const h=s(n,[["render",t]]);export{C as __pageData,h as default};
+import ' bootstrap/dist/css/bootstrap.css '
CSS Modules 支持 Vue
的 CSS Modules 用法,可以直接使用:
vue < style module >
+. layout-content {
+ max-width : 1000px ;
+}
如果想直接引入CSS文件的话,则CSS文件名需要包含.module
,比如:
js import style from ' @/styles/index.module.css '
+console . log (style)
CSS 预处理器 Fes.js 内置支持 less
,不支持 sass
和 stylus
,但如果有需求,可以通过 chainWebpack
配置或者 fes-plugin
插件的形式支持。
`,18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const u=s(n,[["render",t]]);export{h as __pageData,u as default};
diff --git a/assets/guide_css.md.db5fc79d.lean.js b/assets/guide_css.md.db5fc79d.lean.js
new file mode 100644
index 000000000..7a97be90b
--- /dev/null
+++ b/assets/guide_css.md.db5fc79d.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as l,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e("",18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const u=s(n,[["render",t]]);export{h as __pageData,u as default};
diff --git a/assets/guide_css.md.e9f5916f.lean.js b/assets/guide_css.md.e9f5916f.lean.js
deleted file mode 100644
index e356902ed..000000000
--- a/assets/guide_css.md.e9f5916f.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as l,V as e}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"使用 css","description":"","frontmatter":{},"headers":[],"relativePath":"guide/css.md"}'),n={name:"guide/css.md"},o=e("",18),p=[o];function t(c,r,i,d,y,D){return a(),l("div",null,p)}const h=s(n,[["render",t]]);export{C as __pageData,h as default};
diff --git a/assets/guide_directory-structure.md.b9d44484.lean.js b/assets/guide_directory-structure.md.b9d44484.lean.js
deleted file mode 100644
index b40f91d36..000000000
--- a/assets/guide_directory-structure.md.b9d44484.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o("",32),e=[p];function t(c,D,r,F,y,C){return a(),n("div",null,e)}const i=s(l,[["render",t]]);export{A as __pageData,i as default};
diff --git a/assets/guide_directory-structure.md.b9d44484.js b/assets/guide_directory-structure.md.f0919b75.js
similarity index 70%
rename from assets/guide_directory-structure.md.b9d44484.js
rename to assets/guide_directory-structure.md.f0919b75.js
index 09ea5d58f..f0d8b6e5f 100644
--- a/assets/guide_directory-structure.md.b9d44484.js
+++ b/assets/guide_directory-structure.md.f0919b75.js
@@ -1,66 +1,66 @@
-import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o(`目录结构 在快速上手 中,大家对框架应该有初步的印象,接下来我们了解下目录结构。Fes.js 遵循 约定优于配置
的原则,一个基础的 Fes.js 项目大致是这样的:
fes-template
-├── package.json
-├── tsconfig.json
-├── mock.js
-├── .fes.js
-├── .env
-├── index.html
-├── dist
-├── public
-│ └── logo.png
-└── src
- ├── .fes
- └── pages
- │ └── index.vue
- └── app.js
package.json json {
- " name " : " @fesjs/template " ,
- " version " : " 2.0.0 " ,
- " description " : " fes项目模版 " ,
- " scripts " : {
- " build " : " fes build " ,
- " prod " : " FES_ENV=prod fes build " ,
- " analyze " : " ANALYZE=1 fes build " ,
- " dev " : " fes dev " ,
- " test " : " fes test "
- },
- " keywords " : [ " 管理端 " , " fes " , " fast " , " easy " , " strong " ],
- " files " : [ " .eslintrc.js " , " .gitignore " , " .fes.js " , " .fes.prod.js " , " mock.js " , " package.json " , " README.md " , " tsconfig.json " , " /src " , " /config " ],
- " repository " : {
- " type " : " git " ,
- " url " : " git+https://github.com/WeBankFinTech/fes.js.git " ,
- " directory " : " packages/fes-template "
- },
- " author " : " harrywan " ,
- " license " : " MIT " ,
- " bugs " : {
- " url " : " https://github.com/WeBankFinTech/fes.js/issues "
- },
- " homepage " : " https://github.com/WeBankFinTech/fes.js#readme " ,
- " publishConfig " : {
- " access " : " public "
- },
- " devDependencies " : {
- " @webank/eslint-config-webank " : " 1.2.1 "
- },
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/builder-webpack " : " ^3.0.0 " ,
- " @fesjs/plugin-access " : " ^3.0.0 " ,
- " @fesjs/plugin-layout " : " ^5.0.0 " ,
- " @fesjs/plugin-model " : " ^3.0.0 " ,
- " @fesjs/plugin-enums " : " ^3.0.0 " ,
- " @fesjs/plugin-jest " : " ^3.0.0 " ,
- " @fesjs/plugin-vuex " : " ^3.0.0 " ,
- " @fesjs/plugin-request " : " ^3.0.0 " ,
- " @fesjs/plugin-qiankun " : " ^3.0.0 " ,
- " @fesjs/plugin-sass " : " ^3.0.0 " ,
- " @fesjs/plugin-monaco-editor " : " ^3.0.0 " ,
- " @fesjs/plugin-windicss " : " ^3.0.0 " ,
- " @fesjs/fes-design " : " ^0.7.23 " ,
- " vue " : " ^3.2.47 " ,
- " vuex " : " ^4.0.0 "
- },
- " private " : true
-}
其中@fesjs/fes
是 Fes.js 核心依赖,另外以 @fesjs/preset-
、@fesjs/plugin-
、@webank/fes-preset-
、@webank/fes-plugin-
、fes-preset-
和 fes-plugin-
开头的依赖会被自动注册为插件或插件集。@fesjs/builder-
开头的会被注册为构建器。
tsconfig.json 解决 @fesjs/fes
和使用 @
的 API 提示
.fes.js 配置文件,包含 Fes.js 内置功能和安装的其他插件配置。
mock.js mock
数据的配置文件。
.env 定义环境变量。
比如 .env
文件内容如下:
等同于 node 端运行时,设置如下:
process.env.PORT = '8888';
-process.env.FES_ENV = 'prod';
dist 目录 执行 fes build
后,产物默认会存放在这里。
public 目录 此目录下所有文件为静态资源,会被复制到输出路径。
index.html 默认的 html
模板文件,如果删除此 html
则会使用内置的 html
模板文件。
src 目录 .fes 目录 临时文件目录,比如入口文件、路由等,都会被临时生成到这里。
WARNING
不要提交 .fes
目录到 git
仓库,他们会在 fes dev
和 fes build
时被删除并重新生成。
pages 目录 所有路由组件文件存放在这里。
app.js 运行时配置文件,可以在这里扩展运行时的能力,比如修改路由等。
`,32),e=[p];function t(c,D,r,F,y,C){return a(),n("div",null,e)}const i=s(l,[["render",t]]);export{A as __pageData,i as default};
+import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const i=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o(`目录结构 在快速上手 中,大家对框架应该有初步的印象,接下来我们了解下目录结构。Fes.js 遵循 约定优于配置
的原则,一个基础的 Fes.js 项目大致是这样的:
fes-template
+├── package.json
+├── tsconfig.json
+├── mock.js
+├── .fes.js
+├── .env
+├── index.html
+├── dist
+├── public
+│ └── logo.png
+└── src
+ ├── .fes
+ └── pages
+ │ └── index.vue
+ └── app.js
package.json json {
+ " name " : " @fesjs/template " ,
+ " version " : " 2.0.0 " ,
+ " description " : " fes项目模版 " ,
+ " scripts " : {
+ " build " : " fes build " ,
+ " prod " : " FES_ENV=prod fes build " ,
+ " analyze " : " ANALYZE=1 fes build " ,
+ " dev " : " fes dev " ,
+ " test " : " fes test "
+ },
+ " keywords " : [ " 管理端 " , " fes " , " fast " , " easy " , " strong " ],
+ " files " : [ " .eslintrc.js " , " .gitignore " , " .fes.js " , " .fes.prod.js " , " mock.js " , " package.json " , " README.md " , " tsconfig.json " , " /src " , " /config " ],
+ " repository " : {
+ " type " : " git " ,
+ " url " : " git+https://github.com/WeBankFinTech/fes.js.git " ,
+ " directory " : " packages/fes-template "
+ },
+ " author " : " harrywan " ,
+ " license " : " MIT " ,
+ " bugs " : {
+ " url " : " https://github.com/WeBankFinTech/fes.js/issues "
+ },
+ " homepage " : " https://github.com/WeBankFinTech/fes.js#readme " ,
+ " publishConfig " : {
+ " access " : " public "
+ },
+ " devDependencies " : {
+ " @webank/eslint-config-webank " : " 1.2.1 "
+ },
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/builder-webpack " : " ^3.0.0 " ,
+ " @fesjs/plugin-access " : " ^3.0.0 " ,
+ " @fesjs/plugin-layout " : " ^5.0.0 " ,
+ " @fesjs/plugin-model " : " ^3.0.0 " ,
+ " @fesjs/plugin-enums " : " ^3.0.0 " ,
+ " @fesjs/plugin-jest " : " ^3.0.0 " ,
+ " @fesjs/plugin-vuex " : " ^3.0.0 " ,
+ " @fesjs/plugin-request " : " ^3.0.0 " ,
+ " @fesjs/plugin-qiankun " : " ^3.0.0 " ,
+ " @fesjs/plugin-sass " : " ^3.0.0 " ,
+ " @fesjs/plugin-monaco-editor " : " ^3.0.0 " ,
+ " @fesjs/plugin-windicss " : " ^3.0.0 " ,
+ " @fesjs/fes-design " : " ^0.7.23 " ,
+ " vue " : " ^3.2.47 " ,
+ " vuex " : " ^4.0.0 "
+ },
+ " private " : true
+}
其中@fesjs/fes
是 Fes.js 核心依赖,另外以 @fesjs/preset-
、@fesjs/plugin-
、@webank/fes-preset-
、@webank/fes-plugin-
、fes-preset-
和 fes-plugin-
开头的依赖会被自动注册为插件或插件集。@fesjs/builder-
开头的会被注册为构建器。
tsconfig.json 解决 @fesjs/fes
和使用 @
的 API 提示
.fes.js 配置文件,包含 Fes.js 内置功能和安装的其他插件配置。
mock.js mock
数据的配置文件。
.env 定义环境变量。
比如 .env
文件内容如下:
等同于 node 端运行时,设置如下:
process.env.PORT = '8888';
+process.env.FES_ENV = 'prod';
dist 目录 执行 fes build
后,产物默认会存放在这里。
public 目录 此目录下所有文件为静态资源,会被复制到输出路径。
index.html 默认的 html
模板文件,如果删除此 html
则会使用内置的 html
模板文件。
src 目录 .fes 目录 临时文件目录,比如入口文件、路由等,都会被临时生成到这里。
WARNING
不要提交 .fes
目录到 git
仓库,他们会在 fes dev
和 fes build
时被删除并重新生成。
pages 目录 所有路由组件文件存放在这里。
app.js 运行时配置文件,可以在这里扩展运行时的能力,比如修改路由等。
`,32),e=[p];function t(c,D,r,F,y,u){return a(),n("div",null,e)}const q=s(l,[["render",t]]);export{i as __pageData,q as default};
diff --git a/assets/guide_directory-structure.md.f0919b75.lean.js b/assets/guide_directory-structure.md.f0919b75.lean.js
new file mode 100644
index 000000000..955c60d58
--- /dev/null
+++ b/assets/guide_directory-structure.md.f0919b75.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const i=JSON.parse('{"title":"目录结构","description":"","frontmatter":{},"headers":[],"relativePath":"guide/directory-structure.md"}'),l={name:"guide/directory-structure.md"},p=o("",32),e=[p];function t(c,D,r,F,y,u){return a(),n("div",null,e)}const q=s(l,[["render",t]]);export{i as __pageData,q as default};
diff --git a/assets/guide_env.md.524e7c55.js b/assets/guide_env.md.524e7c55.js
deleted file mode 100644
index 226d70d02..000000000
--- a/assets/guide_env.md.524e7c55.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import{_ as a,o as s,c as e,V as o}from"./chunks/framework.85b09291.js";const b=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o(`环境变量 在构建或者代码在端上运行中需要一些跟区分于环境的变量,用于配置构建流程或者运行时过程,这时候我们可以配置环境变量。
配置环境变量 命令行添加 比如:
bash # OS X, Linux
-PORT = 3000 fes dev
-
-# Windows (cmd.exe)
-set PORT= 3000 && fes dev
如果要同时考虑 OS X 和 Windows,可借助三方工具 cross-env
.env
文件配置 Fes.js 中约定根目录下以 .env
开头的文件为环境变量配置文件。
比如:
然后执行
会以 3000 端口启动 dev server。
本地临时配置 可以新建 .env.local
,这份配置会和 .env
做合并后形成最终配置。
环境配置 可以通过环境变量 FES_ENV
区分不同环境来指定配置,这时候必须在执行命令前添加 FES_ENV
保证执行加载环境变量配置文件逻辑前 FES_ENV
已设置。
举个 🌰 :
如果存在 .env.sit
文件,则会将 .env.sit
的配置和 .env
做合并后形成最终配置。
配置优先级 本地临时配置 > 环境配置 > 基础配置
TIP
如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的 。
编译时配置列表 编译时配置是在构建过程需要的变量,开放给用户配置。
FES_ENV 指定当前的环境,不同环境各自的配置文件。
TIP
FES_ENV
在会在加载.env
前使用,所以只能用命令行方式配置。
FES_PRESETS 添加额外的插件集入口
FES_PLUGINS 添加额外的插件入口
PORT fes dev
时服务指定的端口号,默认是 8000
HOST 默认是 localhost
。
HTTPS 默认是 false
。
WATCH 设为 none 时不监听文件变更。比如:
BABEL_CACHE 默认开启 Babel 编译缓存,值为 none 时禁用缓存。
ANALYZE 用于分析 bundle 构成,默认关闭。
比如:
ANALYZE_MODE 默认是server
ANALYZE_PORT 默认是8888
CLEAR_OUTPUT 仅仅在 build
时生效。如果设置为 none
,就不会在构建前清除 Output
文件内容。
RM_TMPDIR 仅仅在 build
时生效。如果设置为 none
,就不会在构建后清除 .fes
临时文件内容。
process.env 运行时配置需要以 FES_APP_
开头,比如在 .env
中配置:
在代码中使用:
js console . log (process . env . FES_APP_KEY) ;
-// 输出 123456789
除了用户自定义的以FES_APP_
开头的变量,还提供如下配置:
NODE_ENV :Node 环境变量
FES_ENV :Fes.js 环境变量
BASE_URL :等同于 publicPath
`,64),p=[l];function t(c,r,i,d,h,C){return s(),e("div",null,p)}const y=a(n,[["render",t]]);export{b as __pageData,y as default};
diff --git a/assets/guide_env.md.524e7c55.lean.js b/assets/guide_env.md.524e7c55.lean.js
deleted file mode 100644
index 135aceebc..000000000
--- a/assets/guide_env.md.524e7c55.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as a,o as s,c as e,V as o}from"./chunks/framework.85b09291.js";const b=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o("",64),p=[l];function t(c,r,i,d,h,C){return s(),e("div",null,p)}const y=a(n,[["render",t]]);export{b as __pageData,y as default};
diff --git a/assets/guide_env.md.666aaef8.js b/assets/guide_env.md.666aaef8.js
new file mode 100644
index 000000000..6b98a2eff
--- /dev/null
+++ b/assets/guide_env.md.666aaef8.js
@@ -0,0 +1,8 @@
+import{_ as a,o as s,c as e,V as o}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o(`环境变量 在构建或者代码在端上运行中需要一些跟区分于环境的变量,用于配置构建流程或者运行时过程,这时候我们可以配置环境变量。
配置环境变量 命令行添加 比如:
bash # OS X, Linux
+PORT = 3000 fes dev
+
+# Windows (cmd.exe)
+set PORT= 3000 && fes dev
如果要同时考虑 OS X 和 Windows,可借助三方工具 cross-env
.env
文件配置 Fes.js 中约定根目录下以 .env
开头的文件为环境变量配置文件。
比如:
然后执行
会以 3000 端口启动 dev server。
本地临时配置 可以新建 .env.local
,这份配置会和 .env
做合并后形成最终配置。
环境配置 可以通过环境变量 FES_ENV
区分不同环境来指定配置,这时候必须在执行命令前添加 FES_ENV
保证执行加载环境变量配置文件逻辑前 FES_ENV
已设置。
举个 🌰 :
如果存在 .env.sit
文件,则会将 .env.sit
的配置和 .env
做合并后形成最终配置。
配置优先级 本地临时配置 > 环境配置 > 基础配置
TIP
如果多份配置中存在相同的配置项,则优先级高的会覆盖优先级低的 。
编译时配置列表 编译时配置是在构建过程需要的变量,开放给用户配置。
FES_ENV 指定当前的环境,不同环境各自的配置文件。
TIP
FES_ENV
在会在加载.env
前使用,所以只能用命令行方式配置。
FES_PRESETS 添加额外的插件集入口
FES_PLUGINS 添加额外的插件入口
PORT fes dev
时服务指定的端口号,默认是 8000
HOST 默认是 localhost
。
HTTPS 默认是 false
。
WATCH 设为 none 时不监听文件变更。比如:
BABEL_CACHE 默认开启 Babel 编译缓存,值为 none 时禁用缓存。
ANALYZE 用于分析 bundle 构成,默认关闭。
比如:
ANALYZE_MODE 默认是server
ANALYZE_PORT 默认是8888
CLEAR_OUTPUT 仅仅在 build
时生效。如果设置为 none
,就不会在构建前清除 Output
文件内容。
RM_TMPDIR 仅仅在 build
时生效。如果设置为 none
,就不会在构建后清除 .fes
临时文件内容。
process.env 运行时配置需要以 FES_APP_
开头,比如在 .env
中配置:
在代码中使用:
js console . log (process . env . FES_APP_KEY) ;
+// 输出 123456789
除了用户自定义的以FES_APP_
开头的变量,还提供如下配置:
NODE_ENV :Node 环境变量
FES_ENV :Fes.js 环境变量
BASE_URL :等同于 publicPath
`,64),p=[l];function t(c,r,i,d,h,u){return s(),e("div",null,p)}const E=a(n,[["render",t]]);export{y as __pageData,E as default};
diff --git a/assets/guide_env.md.666aaef8.lean.js b/assets/guide_env.md.666aaef8.lean.js
new file mode 100644
index 000000000..e766079ff
--- /dev/null
+++ b/assets/guide_env.md.666aaef8.lean.js
@@ -0,0 +1 @@
+import{_ as a,o as s,c as e,V as o}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"环境变量","description":"","frontmatter":{},"headers":[],"relativePath":"guide/env.md"}'),n={name:"guide/env.md"},l=o("",64),p=[l];function t(c,r,i,d,h,u){return s(),e("div",null,p)}const E=a(n,[["render",t]]);export{y as __pageData,E as default};
diff --git a/assets/guide_faq.md.bcfd6a77.js b/assets/guide_faq.md.79254e2b.js
similarity index 80%
rename from assets/guide_faq.md.bcfd6a77.js
rename to assets/guide_faq.md.79254e2b.js
index 33075169d..73caa0e78 100644
--- a/assets/guide_faq.md.bcfd6a77.js
+++ b/assets/guide_faq.md.79254e2b.js
@@ -1,2 +1,2 @@
-import{_ as e,o as a,c as o,V as t}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t(`常见问题 为什么代码提示不生效? 需要先运行一次fes dev
检查tsconfig.json,include
包含当前编辑文件,compilerOptions.path
包含 "@/*": ["./src/*"],
-"@@/*": ["./src/.fes/*"]
`,4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default};
+import{_ as e,o as a,c as o,V as t}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t(`常见问题 为什么代码提示不生效? 需要先运行一次fes dev
检查tsconfig.json,include
包含当前编辑文件,compilerOptions.path
包含 "@/*": ["./src/*"],
+"@@/*": ["./src/.fes/*"]
`,4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default};
diff --git a/assets/guide_faq.md.bcfd6a77.lean.js b/assets/guide_faq.md.79254e2b.lean.js
similarity index 63%
rename from assets/guide_faq.md.bcfd6a77.lean.js
rename to assets/guide_faq.md.79254e2b.lean.js
index 02acb2704..af15cfa5c 100644
--- a/assets/guide_faq.md.bcfd6a77.lean.js
+++ b/assets/guide_faq.md.79254e2b.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as o,V as t}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t("",4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default};
+import{_ as e,o as a,c as o,V as t}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"常见问题","description":"","frontmatter":{},"headers":[],"relativePath":"guide/faq.md"}'),s={name:"guide/faq.md"},n=t("",4),c=[n];function l(i,r,d,p,_,u){return a(),o("div",null,c)}const q=e(s,[["render",l]]);export{f as __pageData,q as default};
diff --git a/assets/guide_getting-started.md.1a6721fe.js b/assets/guide_getting-started.md.1a6721fe.js
deleted file mode 100644
index 1b4d689e4..000000000
--- a/assets/guide_getting-started.md.1a6721fe.js
+++ /dev/null
@@ -1,60 +0,0 @@
-import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.85b09291.js";const t=p(`快速上手 依赖环境 首先得有 Node.js ,并确保 node 版本是 12.13 或以上。
bash # 打印 node 版本
-node -v
-v12.13.0
推荐使用 pnpm 管理 npm 依赖
bash # 全局安装 pnpm
-npm i pnpm -g
创建项目 这一章节会帮助你从头搭建一个简单的 Fes.js 前端应用。
步骤 1 创建工作空间 如果工作空间不存在,则先创建:
bash # 创建目录 workspace
-mkdir workspace
-# 进入目录 workspace
-cd workspace
如果工作空间已存在,则直接进入
bash # 进入目录 workspace
-cd workspace
步骤 2 在工作空间创建项目 如果项目文件夹 workspace/myapp
已经存在,会提示目录已存在:
`,16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),C=s("code",null,"Overwrite",-1),y=s("code",null,"Merge",-1),d=s("code",null,"workspace/myapp",-1),A=s("code",null,"template",-1),D=["src"],h=p(`你可以选默认适用于中后台前端应用的 PC
类型,也可以选适用于移动端的 H5
类型。
步骤 3 安装依赖 启动项目 Fes.js 会在 http://localhost:8000
启动一个热重载的开发服务器。当你修改你的 .vue 文件时,浏览器中的内容也会自动更新。
`,6),u=["src"],b=p(`部署发布 构建 构建产物默认生成到 ./dist 下,然后通过 tree 命令查看。
base tree ./dist
-
-dist
-├── chunk-vendors.27cd4686.js
-├── chunk-vendors.a5f5de67.css
-├── index.11411d43.css
-├── index.d72f1ba2.js
-├── index.html
-├── logo.png
-└── static
- └── logo.0f85bba0.png
本地验证 发布之前,可以通过 serve 做本地验证,验证结果应该跟执行 fes dev
的结果一样。
部署 本地验证完,就可以部署了。你需要把 dist 目录部署到服务器上。
`,9),_=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),m={name:"guide/getting-started.md"},f=Object.assign(m,{setup(g){return(E,F)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),C,a(" 或者 "),y,a(" 或者项目目录 "),d,a(" 不存在,会提示选取一个 "),A,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,D)]),h,s("img",{src:n(l)("home.png"),alt:"home"},null,8,u),b]))}});export{_ as __pageData,f as default};
diff --git a/assets/guide_getting-started.md.1a6721fe.lean.js b/assets/guide_getting-started.md.1a6721fe.lean.js
deleted file mode 100644
index 580f2285d..000000000
--- a/assets/guide_getting-started.md.1a6721fe.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.85b09291.js";const t=p("",16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),C=s("code",null,"Overwrite",-1),y=s("code",null,"Merge",-1),d=s("code",null,"workspace/myapp",-1),A=s("code",null,"template",-1),D=["src"],h=p("",6),u=["src"],b=p("",9),_=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),m={name:"guide/getting-started.md"},f=Object.assign(m,{setup(g){return(E,F)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),C,a(" 或者 "),y,a(" 或者项目目录 "),d,a(" 不存在,会提示选取一个 "),A,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,D)]),h,s("img",{src:n(l)("home.png"),alt:"home"},null,8,u),b]))}});export{_ as __pageData,f as default};
diff --git a/assets/guide_getting-started.md.768bd20d.js b/assets/guide_getting-started.md.768bd20d.js
new file mode 100644
index 000000000..a9c5e9b41
--- /dev/null
+++ b/assets/guide_getting-started.md.768bd20d.js
@@ -0,0 +1,60 @@
+import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.b31a4d00.js";const t=p(`快速上手 依赖环境 首先得有 Node.js ,并确保 node 版本是 12.13 或以上。
bash # 打印 node 版本
+node -v
+v12.13.0
推荐使用 pnpm 管理 npm 依赖
bash # 全局安装 pnpm
+npm i pnpm -g
创建项目 这一章节会帮助你从头搭建一个简单的 Fes.js 前端应用。
步骤 1 创建工作空间 如果工作空间不存在,则先创建:
bash # 创建目录 workspace
+mkdir workspace
+# 进入目录 workspace
+cd workspace
如果工作空间已存在,则直接进入
bash # 进入目录 workspace
+cd workspace
步骤 2 在工作空间创建项目 如果项目文件夹 workspace/myapp
已经存在,会提示目录已存在:
`,16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),y=s("code",null,"Overwrite",-1),d=s("code",null,"Merge",-1),B=s("code",null,"workspace/myapp",-1),E=s("code",null,"template",-1),h=["src"],D=p(`你可以选默认适用于中后台前端应用的 PC
类型,也可以选适用于移动端的 H5
类型。
步骤 3 安装依赖 启动项目 Fes.js 会在 http://localhost:8000
启动一个热重载的开发服务器。当你修改你的 .vue 文件时,浏览器中的内容也会自动更新。
`,6),C=["src"],b=p(`部署发布 构建 构建产物默认生成到 ./dist 下,然后通过 tree 命令查看。
base tree ./dist
+
+dist
+├── chunk-vendors.27cd4686.js
+├── chunk-vendors.a5f5de67.css
+├── index.11411d43.css
+├── index.d72f1ba2.js
+├── index.html
+├── logo.png
+└── static
+ └── logo.0f85bba0.png
本地验证 发布之前,可以通过 serve 做本地验证,验证结果应该跟执行 fes dev
的结果一样。
部署 本地验证完,就可以部署了。你需要把 dist 目录部署到服务器上。
`,9),v=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),u={name:"guide/getting-started.md"},_=Object.assign(u,{setup(m){return(A,g)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),y,a(" 或者 "),d,a(" 或者项目目录 "),B,a(" 不存在,会提示选取一个 "),E,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,h)]),D,s("img",{src:n(l)("home.png"),alt:"home"},null,8,C),b]))}});export{v as __pageData,_ as default};
diff --git a/assets/guide_getting-started.md.768bd20d.lean.js b/assets/guide_getting-started.md.768bd20d.lean.js
new file mode 100644
index 000000000..2f36128b6
--- /dev/null
+++ b/assets/guide_getting-started.md.768bd20d.lean.js
@@ -0,0 +1 @@
+import{o as e,c as o,C as s,b as n,a,V as p,y as l}from"./chunks/framework.b31a4d00.js";const t=p("",16),c=["src"],r=s("p",null,"你可以选择:",-1),i=s("ul",null,[s("li",null,[s("code",null,"Overwrite"),a(" 删除项目文件夹,重新创建项目。")]),s("li",null,[s("code",null,"Merge"),a(" 保留原项目文件夹,存在相同文件则用模板文件覆盖当前目录文件。")])],-1),y=s("code",null,"Overwrite",-1),d=s("code",null,"Merge",-1),B=s("code",null,"workspace/myapp",-1),E=s("code",null,"template",-1),h=["src"],D=p("",6),C=["src"],b=p("",9),v=JSON.parse('{"title":"快速上手","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md"}'),u={name:"guide/getting-started.md"},_=Object.assign(u,{setup(m){return(A,g)=>(e(),o("div",null,[t,s("img",{src:n(l)("pickTemplateTip.png"),alt:"目录已存在提示"},null,8,c),r,i,s("p",null,[a("当选择 "),y,a(" 或者 "),d,a(" 或者项目目录 "),B,a(" 不存在,会提示选取一个 "),E,a(": "),s("img",{src:n(l)("pickTemplate.png"),alt:"选择模板类型"},null,8,h)]),D,s("img",{src:n(l)("home.png"),alt:"home"},null,8,C),b]))}});export{v as __pageData,_ as default};
diff --git a/assets/guide_image.md.68538628.js b/assets/guide_image.md.2e74f65f.js
similarity index 86%
rename from assets/guide_image.md.68538628.js
rename to assets/guide_image.md.2e74f65f.js
index b84b2311b..491ad0841 100644
--- a/assets/guide_image.md.68538628.js
+++ b/assets/guide_image.md.2e74f65f.js
@@ -1,15 +1,15 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n(`使用图片 使用图片 假设在 src/images
目录下有 logo.png
。
Vue 里使用图片 vue < template >
- < img src = " @/images/logo.png\` " />
-</ template >
JS 里使用图片 js import imageUrl from ' @/images/logo.png\` ' ;
CSS 里使用图片 css . logo {
- background : url ( ' @/images/logo.png ' );
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n(`使用图片 使用图片 假设在 src/images
目录下有 logo.png
。
Vue 里使用图片 vue < template >
+ < img src = " @/images/logo.png\` " />
+</ template >
JS 里使用图片 js import imageUrl from ' @/images/logo.png\` ' ;
CSS 里使用图片 css . logo {
+ background : url ( ' @/images/logo.png ' );
}
注意:
这是 webpack
的规则,如果切到其他打包工具,可能会有变化 less
中同样适用public
文件夹 有些内容不需要经过 webpack
模块化处理,则可以将这些内容放在 public
文件夹,构建后会直接复制到 dist
目录,所以你需要通过BASE_URL
来引入它们。
在 HTML 模板中使用 在 index.html
中需要设置:
html < link rel = " icon " href = " <%= BASE_URL %>favicon.ico " />
在.vue 文件中使用 vue < template >
- < img :src = " \`\${publicPath}my-image.png\` " />
+ < img :src = " \`\${publicPath}my-image.png\` " />
</ template >
< script >
-export default {
- setup () {
+export default {
+ setup () {
return {
- publicPath : process . env . BASE_URL ,
+ publicPath : process . env . BASE_URL ,
};
},
};
diff --git a/assets/guide_image.md.68538628.lean.js b/assets/guide_image.md.2e74f65f.lean.js
similarity index 64%
rename from assets/guide_image.md.68538628.lean.js
rename to assets/guide_image.md.2e74f65f.lean.js
index a3827fc01..6896d2fa8 100644
--- a/assets/guide_image.md.68538628.lean.js
+++ b/assets/guide_image.md.2e74f65f.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n("",18),e=[p];function t(c,r,D,i,F,y){return a(),l("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"使用图片","description":"","frontmatter":{},"headers":[],"relativePath":"guide/image.md"}'),o={name:"guide/image.md"},p=n("",18),e=[p];function t(c,r,D,i,F,y){return a(),l("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
diff --git a/assets/guide_index.md.72257f62.js b/assets/guide_index.md.d93ea205.js
similarity index 91%
rename from assets/guide_index.md.72257f62.js
rename to assets/guide_index.md.d93ea205.js
index ba1cd9866..efce44e58 100644
--- a/assets/guide_index.md.72257f62.js
+++ b/assets/guide_index.md.d93ea205.js
@@ -1,5 +1,5 @@
-import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.85b09291.js";const o=t('介绍 痛点 在开发一个前端项目之前,我们可能需要做如下准备工作:
搭建开发环境 约定代码规范 封装 API 请求 配置路由 实现布局、菜单、导航 实现登录 权限管理 ... 除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。
Fes.js 是什么? Fes.js 是一个好用的前端应用解决方案。Fes.js 以 Vue 3.0 和路由为基础,同时支持配置式路由和约定式路由,并以此进行功能扩展。配以覆盖编译时和运行时生命周期完善的插件体系,支持各种功能扩展和业务需求。
它主要具备以下特点:
🚀 快速 ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。
🧨 简单 ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。
💪 健壮 ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。
📦 可扩展 ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。
📡 面向未来 ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。
Fes.js 如何工作? 架构 ',11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"")],-1),d=["src"],h=t(`.fes 临时文件 .fes 临时目录是整个 Fes.js 项目的发动机,你的入口文件、路由等等都在这里,这些是由 fes 内部插件及三方插件生成的。
你通常会在 .fes 下看到以下目录
+ .fes
- + core # 内部插件生成
- + pluginA # 外部插件生成
- + presetB # 外部插件生成
- + fes.js # 入口文件
临时文件是 Fes.js 中非常重要的一部分,框架或插件会根据你的代码生成临时文件,这些原来需要放在项目里的脏乱差的部分都被藏在了这里。
你可以在这里调试代码,但不要在 .git 仓库里提交他,因为他的临时性,每次启动 fes 时都会被删除并重新生成。
为什么不是 ...? Vue CLI Vue CLI 是基于 Vue.js 进行快速开发的完整系统,提供交互式脚手架、丰富的官方插件,并且可通过插件进行扩展,他在打包层把体验做到了极致,但是不包含路由,不是框架。所以,如果大家想基于他修改部分配置,或者希望在打包层之外也做技术收敛时,就会遇到困难。
UMI UMI 是个很好的选择,Fes.js 很多功能是借鉴 UMI 做的。UMI 是基于 React 封装的应用级框架,贯彻着函数式编程的思维。而 Vue 有所不同,虽然 Vue 3.0 向函数式迈了一大步,但大家可能依然喜欢编写 .vue
文件,而非 .jsx
文件。两种思维方式会导致部分 API 设计上有所差异,虽然 UMI 有 plugin-vue
,但不太 "vue"。推荐喜欢 React 的同学使用 UMI。
`,11),b=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(f,m)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{b as __pageData,j as default};
+import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.b31a4d00.js";const o=t('介绍 痛点 在开发一个前端项目之前,我们可能需要做如下准备工作:
搭建开发环境 约定代码规范 封装 API 请求 配置路由 实现布局、菜单、导航 实现登录 权限管理 ... 除了准备工作之外,还会遇到很多相似的业务类型,比如中后台应用大多都是工作台、增删改查、权限、图表等。如果每次项目都完全手动处理一遍,不仅耗费时间,久而久之可能会存在多种技术栈、开发规范,导致开发流程不统一,历史项目越来越难维护。所以我们需要一套完整的解决方案,管理开发到部署整个流程。
Fes.js 是什么? Fes.js 是一个好用的前端应用解决方案。Fes.js 以 Vue 3.0 和路由为基础,同时支持配置式路由和约定式路由,并以此进行功能扩展。配以覆盖编译时和运行时生命周期完善的插件体系,支持各种功能扩展和业务需求。
它主要具备以下特点:
🚀 快速 ,内置了路由、开发、构建等,并且提供测试、布局、权限、国际化、状态管理、API 请求、数据字典、SvgIcon 等插件,可以满足大部分日常开发需求。
🧨 简单 ,基于 Vue.js 3.0,上手简单。贯彻“约定优于配置”思想,设计插件上尽可能用约定替代配置,同时提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的 API 入口,一致化的体验,学习起来更轻松。
💪 健壮 ,只需要关心页面内容,减少写 BUG 的机会!提供单元测试、覆盖测试能力保障项目质量。
📦 可扩展 ,借鉴 Umi 实现了完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。
📡 面向未来 ,在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 提升构建性能和实现微服务,未来会探索 vite 等新技术。
Fes.js 如何工作? 架构 ',11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"")],-1),d=["src"],h=t(`.fes 临时文件 .fes 临时目录是整个 Fes.js 项目的发动机,你的入口文件、路由等等都在这里,这些是由 fes 内部插件及三方插件生成的。
你通常会在 .fes 下看到以下目录
+ .fes
+ + core # 内部插件生成
+ + pluginA # 外部插件生成
+ + presetB # 外部插件生成
+ + fes.js # 入口文件
临时文件是 Fes.js 中非常重要的一部分,框架或插件会根据你的代码生成临时文件,这些原来需要放在项目里的脏乱差的部分都被藏在了这里。
你可以在这里调试代码,但不要在 .git 仓库里提交他,因为他的临时性,每次启动 fes 时都会被删除并重新生成。
为什么不是 ...? Vue CLI Vue CLI 是基于 Vue.js 进行快速开发的完整系统,提供交互式脚手架、丰富的官方插件,并且可通过插件进行扩展,他在打包层把体验做到了极致,但是不包含路由,不是框架。所以,如果大家想基于他修改部分配置,或者希望在打包层之外也做技术收敛时,就会遇到困难。
UMI UMI 是个很好的选择,Fes.js 很多功能是借鉴 UMI 做的。UMI 是基于 React 封装的应用级框架,贯彻着函数式编程的思维。而 Vue 有所不同,虽然 Vue 3.0 向函数式迈了一大步,但大家可能依然喜欢编写 .vue
文件,而非 .jsx
文件。两种思维方式会导致部分 API 设计上有所差异,虽然 UMI 有 plugin-vue
,但不太 "vue"。推荐喜欢 React 的同学使用 UMI。
`,11),g=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(b,f)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{g as __pageData,j as default};
diff --git a/assets/guide_index.md.72257f62.lean.js b/assets/guide_index.md.d93ea205.lean.js
similarity index 79%
rename from assets/guide_index.md.72257f62.lean.js
rename to assets/guide_index.md.d93ea205.lean.js
index 114805334..ce2ba31b2 100644
--- a/assets/guide_index.md.72257f62.lean.js
+++ b/assets/guide_index.md.d93ea205.lean.js
@@ -1 +1 @@
-import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.85b09291.js";const o=t("",11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"")],-1),d=["src"],h=t("",11),b=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(f,m)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{b as __pageData,j as default};
+import{o as i,c as n,C as e,b as a,a as l,V as t,y as s}from"./chunks/framework.b31a4d00.js";const o=t("",11),r=["src"],c=e("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),p=e("h3",{id:"插件和插件集",tabindex:"-1"},[l("插件和插件集 "),e("a",{class:"header-anchor",href:"#插件和插件集","aria-label":'Permalink to "插件和插件集"'},"")],-1),d=["src"],h=t("",11),g=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"guide/index.md"}'),u={name:"guide/index.md"},j=Object.assign(u,{setup(_){return(b,f)=>(i(),n("div",null,[o,e("img",{src:a(s)("framework.png"),alt:"架构"},null,8,r),c,p,e("p",null,[e("img",{src:a(s)("plugins.png"),alt:"插件",title:"插件",style:{width:"500px"},class:"medium-zoom-image"},null,8,d)]),l(" Fes.js 支持插件和插件集,通过这张图应该很好理解到他们的关系,通过插件集我们把插件收敛依赖然后支持不同的业务类型。 "),h]))}});export{g as __pageData,j as default};
diff --git a/assets/guide_mock.md.1451d115.lean.js b/assets/guide_mock.md.1451d115.lean.js
deleted file mode 100644
index 4e2135cef..000000000
--- a/assets/guide_mock.md.1451d115.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l("",23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default};
diff --git a/assets/guide_mock.md.1451d115.js b/assets/guide_mock.md.8a0d04da.js
similarity index 87%
rename from assets/guide_mock.md.1451d115.js
rename to assets/guide_mock.md.8a0d04da.js
index 30f52fd82..014636526 100644
--- a/assets/guide_mock.md.1451d115.js
+++ b/assets/guide_mock.md.8a0d04da.js
@@ -1,14 +1,14 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l(`Mock 数据 Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。
约定式 Mock 文件 Fes.js 约定 ./mock.js
为 mock 文件。
比如:
.
-├── mock.js
-└── src
- └── pages
- └── index.vue
编写 Mock 文件 可以参考如下 🌰:
js export default function ({ cgiMock , mockjs , utils }) {
- const { Random } = mockjs ;
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l(`Mock 数据 Mock 数据是前端开发过程中必不可少的一环,是分离前后端开发的关键链路。通过预先跟服务器端约定好的接口,模拟请求数据甚至逻辑,能够让前端开发独立自主,不会被服务端的开发所阻塞。
约定式 Mock 文件 Fes.js 约定 ./mock.js
为 mock 文件。
比如:
.
+├── mock.js
+└── src
+ └── pages
+ └── index.vue
编写 Mock 文件 可以参考如下 🌰:
js export default function ({ cgiMock , mockjs , utils }) {
+ const { Random } = mockjs ;
// 测试 proxy 与 mock 用例集合
- cgiMock ( ' /movie/in_theaters_mock ' , ( req , res ) => {
- res . send (
- JSON . stringify ( {
+ cgiMock ( ' /movie/in_theaters_mock ' , ( req , res ) => {
+ res . send (
+ JSON . stringify ( {
code : ' 0 ' ,
msg : '' ,
result : {
@@ -17,9 +17,9 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
} ) ,
) ;
} ) ;
- cgiMock ( ' /movie/test_mock ' , ( req , res ) => {
- res . send (
- JSON . stringify ( {
+ cgiMock ( ' /movie/test_mock ' , ( req , res ) => {
+ res . send (
+ JSON . stringify ( {
code : ' 0 ' ,
msg : '' ,
result : {
@@ -30,9 +30,9 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
} ) ;
// 测试用例: mock.js change,重现请求,需要能拉最新的数据
- cgiMock ( ' /watchtest ' , ( req , res ) => {
- res . send (
- JSON . stringify ( {
+ cgiMock ( ' /watchtest ' , ( req , res ) => {
+ res . send (
+ JSON . stringify ( {
code : ' 0 ' ,
msg : '' ,
result : {
@@ -58,36 +58,36 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
} ) ;
// 利用 mock.js 产生随机文本
- cgiMock ( ' /text ' , Random . cparagraph ()) ;
+ cgiMock ( ' /text ' , Random . cparagraph ()) ;
// 返回一个字符串 利用 mock.js 产生随机字符
cgiMock (
' /random ' ,
- mockjs . mock ( {
+ mockjs . mock ( {
' string|1-10 ' : ' ★ ' ,
} ) ,
) ;
// 正则匹配url, 返回一个字符串
- cgiMock ( / \\/ abc | \\/ xyz / , ' regexp test! ' ) ;
+ cgiMock ( / \\/ abc | \\/ xyz / , ' regexp test! ' ) ;
// option.result 参数如果是一个函数, 可以实现自定义返回内容, 接收的参数是是经过 express 封装的 req 和 res 对象.
- cgiMock ( / \\/ function $ / , ( req , res ) => {
- res . send ( ' function test ' ) ;
+ cgiMock ( / \\/ function $ / , ( req , res ) => {
+ res . send ( ' function test ' ) ;
} ) ;
// 返回文本 readFileSync
- cgiMock ( ' /file ' , utils . file ( ' ./package.json ' )) ;
+ cgiMock ( ' /file ' , utils . file ( ' ./package.json ' )) ;
// 更复杂的规则配置
cgiMock ( {
- url : / \\/ who / ,
+ url : / \\/ who / ,
method : ' GET ' ,
- result ( req , res ) {
- if ( req . query . name === ' kwan ' ) {
- res . json ( { kwan : ' 孤独患者 ' } ) ;
+ result ( req , res ) {
+ if ( req . query . name === ' kwan ' ) {
+ res . json ( { kwan : ' 孤独患者 ' } ) ;
} else {
- res . send ( ' Nooooooooooo ' ) ;
+ res . send ( ' Nooooooooooo ' ) ;
}
},
headers : {
@@ -106,31 +106,31 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
} ) ;
// 携带参数的请求
- cgiMock ( ' /v2/audit/list ' , ( req , res ) => {
- const { currentPage , pageSize , isAudited } = req . body ;
- res . send ( {
+ cgiMock ( ' /v2/audit/list ' , ( req , res ) => {
+ const { currentPage , pageSize , isAudited } = req . body ;
+ res . send ( {
code : ' 0 ' ,
msg : '' ,
data : {
- currentPage ,
- pageSize ,
+ currentPage ,
+ pageSize ,
totalPage : 2 ,
totalCount : 12 ,
- pageData : Array . from ( { length : pageSize }, () => ( {
- title : Random . title () ,
- authorName : Random . cname () ,
- authorId : Random . name () ,
- createTime : Date . now () ,
- updateTime : Date . now () ,
- readCount : Random . integer ( 60 , 1000 ) ,
- favoriteCount : Random . integer ( 1 , 50 ) ,
+ pageData : Array . from ( { length : pageSize }, () => ( {
+ title : Random . title () ,
+ authorName : Random . cname () ,
+ authorId : Random . name () ,
+ createTime : Date . now () ,
+ updateTime : Date . now () ,
+ readCount : Random . integer ( 60 , 1000 ) ,
+ favoriteCount : Random . integer ( 1 , 50 ) ,
postId : ' 12323 ' ,
serviceTag : ' 业务类型 ' ,
productTag : ' 产品类型 ' ,
requestTag : ' 需求类型 ' ,
handleTag : ' 已采纳 ' ,
postType : ' voice ' ,
- postStatus : isAudited ? ' pass ' : ' auditing ' ,
+ postStatus : isAudited ? ' pass ' : ' auditing ' ,
auditStatus : ' audit1 ' ,
} )) ,
},
@@ -138,19 +138,19 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
} ) ;
// multipart/form-data 类型
- cgiMock ( ' /v2/upload ' , ( req , res ) => {
- res . send ( {
+ cgiMock ( ' /v2/upload ' , ( req , res ) => {
+ res . send ( {
code : ' 0 ' ,
msg : ' 文件上传成功 ' ,
} ) ;
} ) ;
-}
cgiMock 参数 创建一个 mock 接口,参数非常灵活,参考上面的 demo 即可。
mockjs 参数 Mock.js 是常用的辅助生成模拟数据的三方库,借助他可以提升我们的 mock 数据能力。
比如:
js export default function ({ cgiMock , mockjs , utils }) {
+}
cgiMock 参数 创建一个 mock 接口,参数非常灵活,参考上面的 demo 即可。
mockjs 参数 Mock.js 是常用的辅助生成模拟数据的三方库,借助他可以提升我们的 mock 数据能力。
比如:
js export default function ({ cgiMock , mockjs , utils }) {
cgiMock (
' /random ' ,
- mockjs . mock ( {
+ mockjs . mock ( {
' string|1-10 ' : ' ★ ' ,
} ) ,
) ;
-}
utils 参数 工具函数:
utils.file(path),从项目根目录根据 path 寻找文件,返回文件流。 配置 Mock 详见配置 mock 。
关闭 Mock 可以通过配置关闭。
js export default {
- mock : false ,
-};
`,23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const d=s(p,[["render",c]]);export{A as __pageData,d as default};
+}
utils 参数 工具函数:
utils.file(path),从项目根目录根据 path 寻找文件,返回文件流。 配置 Mock 详见配置 mock 。
关闭 Mock 可以通过配置关闭。
js export default {
+ mock : false ,
+};
`,23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const E=s(p,[["render",c]]);export{B as __pageData,E as default};
diff --git a/assets/guide_mock.md.8a0d04da.lean.js b/assets/guide_mock.md.8a0d04da.lean.js
new file mode 100644
index 000000000..4e7b263da
--- /dev/null
+++ b/assets/guide_mock.md.8a0d04da.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"Mock 数据","description":"","frontmatter":{},"headers":[],"relativePath":"guide/mock.md"}'),p={name:"guide/mock.md"},o=l("",23),e=[o];function c(t,F,r,y,D,i){return n(),a("div",null,e)}const E=s(p,[["render",c]]);export{B as __pageData,E as default};
diff --git a/assets/guide_plugin.md.bcd330ad.js b/assets/guide_plugin.md.7d7f4c03.js
similarity index 67%
rename from assets/guide_plugin.md.bcd330ad.js
rename to assets/guide_plugin.md.7d7f4c03.js
index c920a448e..23ae8f2d4 100644
--- a/assets/guide_plugin.md.bcd330ad.js
+++ b/assets/guide_plugin.md.7d7f4c03.js
@@ -1,14 +1,14 @@
-import{_ as s,o as a,c as e,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=o(`插件 插件的 id 和 key 每个插件都会对应一个 id
和一个 key
,id
是路径的简写,key
是进一步简化后用于配置的唯一值 。
比如插件 /node_modules/@fesjs/plugin-foo/index.js
,通常来说,其 id
为 @fesjs/plugin-foo
,key
为 foo
。
TIP
id 一般用不上,对于普通开发者 key 用来配置插件,而插件开发者可以使用 key 判断是否安装某个插件。
启动插件 有多种方式引入插件
package.json 依赖 Fes.js 会自动检测 dependencies
和 devDependencies
里的 fes 插件,比如:
json {
- " dependencies " : {
- " @fesjs/plugin-request " : " ^3.0.0 "
- }
-}
那么 @fesjs/plugin-request
会自动被注册,无需在配置里重复声明。
配置 在配置里可通过 presets
和 plugins
配置插件,比如:
js export default {
- presets : [ ' ./preset ' , ' foo/presets ' ] ,
- plugins : [ ' ./plugin ' ] ,
-};
通常用于几种情况:
项目相对路径的插件 非 npm 包入口文件的插件 WARNING
请不要配置 npm 包的插件,否则会报重复注册的错误
环境变量 还可通过环境变量 FES_PRESETS
和 FES_PLUGINS
注册额外插件。
比如:
bash FES_PRESETS = /a/b/preset.js fes dev
禁用插件 通过配置插件的 key
为 false
,比如:
js export default {
- mock : false ,
-};
Mock 插件的 key
是 mock
,我们在配置文件中配置 mock
为 false
,则会禁用 Mock 插件及其功能。
配置插件 通过插件的 key
来配置插件,比如:
js export default {
- mock : {
- prefix : ' /v2 ' ,
- },
-};
这里的 mock
是 Mock 插件 的 key。
`,29),p=[l];function c(t,r,i,d,D,y){return a(),e("div",null,p)}const u=s(n,[["render",c]]);export{C as __pageData,u as default};
+import{_ as s,o as a,c as o,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=e(`插件 插件的 id 和 key 每个插件都会对应一个 id
和一个 key
,id
是路径的简写,key
是进一步简化后用于配置的唯一值 。
比如插件 /node_modules/@fesjs/plugin-foo/index.js
,通常来说,其 id
为 @fesjs/plugin-foo
,key
为 foo
。
TIP
id 一般用不上,对于普通开发者 key 用来配置插件,而插件开发者可以使用 key 判断是否安装某个插件。
启动插件 有多种方式引入插件
package.json 依赖 Fes.js 会自动检测 dependencies
和 devDependencies
里的 fes 插件,比如:
json {
+ " dependencies " : {
+ " @fesjs/plugin-request " : " ^3.0.0 "
+ }
+}
那么 @fesjs/plugin-request
会自动被注册,无需在配置里重复声明。
配置 在配置里可通过 presets
和 plugins
配置插件,比如:
js export default {
+ presets : [ ' ./preset ' , ' foo/presets ' ] ,
+ plugins : [ ' ./plugin ' ] ,
+};
通常用于几种情况:
项目相对路径的插件 非 npm 包入口文件的插件 WARNING
请不要配置 npm 包的插件,否则会报重复注册的错误
环境变量 还可通过环境变量 FES_PRESETS
和 FES_PLUGINS
注册额外插件。
比如:
bash FES_PRESETS = /a/b/preset.js fes dev
禁用插件 通过配置插件的 key
为 false
,比如:
js export default {
+ mock : false ,
+};
Mock 插件的 key
是 mock
,我们在配置文件中配置 mock
为 false
,则会禁用 Mock 插件及其功能。
配置插件 通过插件的 key
来配置插件,比如:
js export default {
+ mock : {
+ prefix : ' /v2 ' ,
+ },
+};
这里的 mock
是 Mock 插件 的 key。
`,29),p=[l];function c(t,r,i,d,D,y){return a(),o("div",null,p)}const h=s(n,[["render",c]]);export{u as __pageData,h as default};
diff --git a/assets/guide_plugin.md.7d7f4c03.lean.js b/assets/guide_plugin.md.7d7f4c03.lean.js
new file mode 100644
index 000000000..224be57c5
--- /dev/null
+++ b/assets/guide_plugin.md.7d7f4c03.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as o,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=e("",29),p=[l];function c(t,r,i,d,D,y){return a(),o("div",null,p)}const h=s(n,[["render",c]]);export{u as __pageData,h as default};
diff --git a/assets/guide_plugin.md.bcd330ad.lean.js b/assets/guide_plugin.md.bcd330ad.lean.js
deleted file mode 100644
index dba23b698..000000000
--- a/assets/guide_plugin.md.bcd330ad.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as e,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"guide/plugin.md"}'),n={name:"guide/plugin.md"},l=o("",29),p=[l];function c(t,r,i,d,D,y){return a(),e("div",null,p)}const u=s(n,[["render",c]]);export{C as __pageData,u as default};
diff --git a/assets/guide_public.md.2615d6f5.js b/assets/guide_public.md.84526512.js
similarity index 84%
rename from assets/guide_public.md.2615d6f5.js
rename to assets/guide_public.md.84526512.js
index a37e677e8..7d4925d47 100644
--- a/assets/guide_public.md.2615d6f5.js
+++ b/assets/guide_public.md.84526512.js
@@ -1,11 +1,11 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l(`静态资源 有些内容不需要经过 webpack
模块化处理,则可以将这些内容放在 public
文件夹,构建后会直接复制到 dist
目录,所以你需要通过BASE_URL
来引入它们。
在 HTML 模板中使用 在 index.html
中需要设置:
html < link rel = " icon " href = " <%= BASE_URL %>favicon.ico " />
在.vue 和 js 文件中使用 vue < template >
- < img :src = " \`\${publicPath}my-image.png\` " />
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l(`静态资源 有些内容不需要经过 webpack
模块化处理,则可以将这些内容放在 public
文件夹,构建后会直接复制到 dist
目录,所以你需要通过BASE_URL
来引入它们。
在 HTML 模板中使用 在 index.html
中需要设置:
html < link rel = " icon " href = " <%= BASE_URL %>favicon.ico " />
在.vue 和 js 文件中使用 vue < template >
+ < img :src = " \`\${publicPath}my-image.png\` " />
</ template >
< script >
-export default {
- setup () {
+export default {
+ setup () {
return {
- publicPath : process . env . BASE_URL ,
+ publicPath : process . env . BASE_URL ,
};
},
};
diff --git a/assets/guide_public.md.2615d6f5.lean.js b/assets/guide_public.md.84526512.lean.js
similarity index 64%
rename from assets/guide_public.md.2615d6f5.lean.js
rename to assets/guide_public.md.84526512.lean.js
index 838b039d1..38265a99b 100644
--- a/assets/guide_public.md.2615d6f5.lean.js
+++ b/assets/guide_public.md.84526512.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l("",7),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"静态资源","description":"","frontmatter":{},"headers":[],"relativePath":"guide/public.md"}'),o={name:"guide/public.md"},p=l("",7),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const h=s(o,[["render",t]]);export{u as __pageData,h as default};
diff --git a/assets/guide_route.md.bc8f1b03.js b/assets/guide_route.md.11dd4240.js
similarity index 64%
rename from assets/guide_route.md.bc8f1b03.js
rename to assets/guide_route.md.11dd4240.js
index 944c456a4..3a8bf0e58 100644
--- a/assets/guide_route.md.bc8f1b03.js
+++ b/assets/guide_route.md.11dd4240.js
@@ -1,158 +1,158 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l(`路由 像 Vue 、React 这类框架是用组件化搭建页面,路由解决的是路径到组件的匹配问题。Fes.js 基于 Vue Router
实现的路由,想了解更多的同学可以看看官方文档 。
路由配置 在配置文件 .fes.js
中通过 router
进行配置。
js export default {
- router : {
- routes : [] ,
- mode : ' hash ' ,
- },
-};
routes routes
是配置添加到路由的初始路由列表,格式为路由信息的数组。具体使用参考 Vue Router 文档 中关于路由配置、路由匹配相关内容。
mode 创建历史记录的类型:
默认是hash
模式。
约定式路由 约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。
约定规范 比如以下文件结构:
pages
-├── index.vue # 根路由页面 路径为 /
-├── [...slug].vue # 模糊匹配 路径为 /:slug(.*)
-├── a.vue # 路径 /a
-├── b # 文件夹b
-│ ├── index.vue # 路径 /b
-│ ├── [slug].vue # 动态路由 /b/:slug
-│ ├── c.vue # 路径 /b/c
-│ └── layout.vue # /b 路径下所有页面公共的布局组件
-└── layout.vue # 根路由下所有页面共用的布局组件
编译后会得到以下路由配置:
js [
- {
- path : ' / ' ,
- component : require ( ' @/pages/layout ' ) . default ,
- count : 5 ,
- children : [
- {
- path : ' /a ' ,
- component : require ( ' @/pages/a ' ) . default ,
- name : ' a ' ,
- meta : {},
- count : 7 ,
- },
- {
- path : ' /b ' ,
- component : require ( ' @/pages/b/layout ' ) . default ,
- count : 7 ,
- children : [
- {
- path : ' /b/c ' ,
- component : require ( ' @/pages/b/c ' ) . default ,
- name : ' b_c ' ,
- meta : {},
- count : 14 ,
- },
- {
- path : ' /b/:id ' ,
- component : require ( ' @/pages/b/@id ' ) . default ,
- name : ' b__id ' ,
- meta : {},
- count : 13 ,
- },
- {
- path : ' /b ' ,
- component : require ( ' @/pages/b/index ' ) . default ,
- name : ' b_index ' ,
- meta : {},
- count : 7 ,
- },
- ] ,
- },
- {
- path : ' / ' ,
- component : require ( ' @/pages/index ' ) . default ,
- name : ' index ' ,
- meta : {},
- count : 5 ,
- },
- {
- path : ' /:pathMatch(.*) ' ,
- component : require ( ' @/pages/* ' ) . default ,
- name : ' FUZZYMATCH ' ,
- meta : {},
- count : 3 ,
- },
- ] ,
- },
-] ;
需要注意的是,满足以下任意规则的文件不会被注册为路由 :
不是 .vue .jsx
文件 components
目录中的文件动态路由 Fes.js 里约定名称为 [slug]
格式的文件或文件夹映射为动态路由。 比如:
src/pages/users/[id].vue
会成为 /users/:id
src/pages/users/[id]/settings.vue
会成为 /users/:id/settings
WARNING
@slug
形式下版本会弃用,请替换为[slug]
~
模糊匹配 Fes.js 里约定名称为 [...slug]
格式的文件或文件夹映射为动态路由中的模糊匹配形式。 比如:
src/pages/users/[...].vue
会成为 /users/:pathMatch(.*)
src/pages/users/[...id].vue
会成为 /users/:id(.*)
src/pages/users/[...id]/settings.vue
会成为 /users/:id(.*)/settings
WARNING
*
形式下版本会弃用,请替换为[...slug]
~
嵌套路由 Fes.js 里约定目录下有 layout.vue
时会生成嵌套路由,以 layout.vue
为该目录的公共父组件,layout.vue
中必须实现 RouterView
比如以下目录结构:
pages
-└── users
- ├── layout.vue
- ├── index.vue
- └── list.vue
会生成路由:
js [
- {
- path : ' /users ' ,
- component : require ( ' @/pages/users/layout ' ) . default ,
- children : [
- { path : ' /users ' , component : require ( ' @/pages/users/index ' ) . default },
- { path : ' /users/list ' , component : require ( ' @/pages/users/list ' ) . default },
- ] ,
- },
-] ;
模糊匹配 Fes.js 下约定文件名为 *
的路由是模糊匹配路由,可以用此特性实现 404 路由 。
比如以下目录结构:
pages
-├── index.vue # 根路由页面 路径为 /
-└── *.vue # 模糊匹配 路径为 *
会生成路由:
js [
- {
- path : ' / ' ,
- component : require ( ' @/pages/index ' ) . default ,
- count : 5 ,
- },
- {
- path : ' /:pathMatch(.*) ' ,
- component : require ( ' @/pages/** ' ) . default ,
- count : 3 ,
- },
-] ;
这样,如果访问 /foo
,/
不能匹配,会 fallback 到 *
路由,通过 src/pages/*.vue
进行渲染。
智能路由 可以看到,编译后路由都会有 count
属性,这是我们根据精准匹配优先算法原则设计出路由排名算法,对匹配到的路由打分:
路由的路径每个子项得到 4 分 子项为静态细分(/list
)再加 3 分 子项为动态细分(/:orderId
)再加 2 分 根段(/
)再 1 分 通配符(*
)匹配到的减去 1 分 当我们跳转路由时,如果 URL 匹配到多个路由,则选择分数最高的路由。
扩展路由元信息 我们在定义路由时可以配置meta
字段,用来记录一些跟路由相关的信息:
js const router = new VueRouter ( {
- routes : [
- {
- path : ' /foo ' ,
- component : Foo ,
- children : [
- {
- path : ' bar ' ,
- component : Bar ,
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l(`路由 像 Vue 、React 这类框架是用组件化搭建页面,路由解决的是路径到组件的匹配问题。Fes.js 基于 Vue Router
实现的路由,想了解更多的同学可以看看官方文档 。
路由配置 在配置文件 .fes.js
中通过 router
进行配置。
js export default {
+ router : {
+ routes : [] ,
+ mode : ' hash ' ,
+ },
+};
routes routes
是配置添加到路由的初始路由列表,格式为路由信息的数组。具体使用参考 Vue Router 文档 中关于路由配置、路由匹配相关内容。
mode 创建历史记录的类型:
默认是hash
模式。
约定式路由 约定式路由也叫文件路由,就是不需要手写配置,文件系统即路由,通过目录和文件及其命名分析出路由配置。
约定规范 比如以下文件结构:
pages
+├── index.vue # 根路由页面 路径为 /
+├── [...slug].vue # 模糊匹配 路径为 /:slug(.*)
+├── a.vue # 路径 /a
+├── b # 文件夹b
+│ ├── index.vue # 路径 /b
+│ ├── [slug].vue # 动态路由 /b/:slug
+│ ├── c.vue # 路径 /b/c
+│ └── layout.vue # /b 路径下所有页面公共的布局组件
+└── layout.vue # 根路由下所有页面共用的布局组件
编译后会得到以下路由配置:
js [
+ {
+ path : ' / ' ,
+ component : require ( ' @/pages/layout ' ) . default ,
+ count : 5 ,
+ children : [
+ {
+ path : ' /a ' ,
+ component : require ( ' @/pages/a ' ) . default ,
+ name : ' a ' ,
+ meta : {},
+ count : 7 ,
+ },
+ {
+ path : ' /b ' ,
+ component : require ( ' @/pages/b/layout ' ) . default ,
+ count : 7 ,
+ children : [
+ {
+ path : ' /b/c ' ,
+ component : require ( ' @/pages/b/c ' ) . default ,
+ name : ' b_c ' ,
+ meta : {},
+ count : 14 ,
+ },
+ {
+ path : ' /b/:id ' ,
+ component : require ( ' @/pages/b/@id ' ) . default ,
+ name : ' b__id ' ,
+ meta : {},
+ count : 13 ,
+ },
+ {
+ path : ' /b ' ,
+ component : require ( ' @/pages/b/index ' ) . default ,
+ name : ' b_index ' ,
+ meta : {},
+ count : 7 ,
+ },
+ ] ,
+ },
+ {
+ path : ' / ' ,
+ component : require ( ' @/pages/index ' ) . default ,
+ name : ' index ' ,
+ meta : {},
+ count : 5 ,
+ },
+ {
+ path : ' /:pathMatch(.*) ' ,
+ component : require ( ' @/pages/* ' ) . default ,
+ name : ' FUZZYMATCH ' ,
+ meta : {},
+ count : 3 ,
+ },
+ ] ,
+ },
+] ;
需要注意的是,满足以下任意规则的文件不会被注册为路由 :
不是 .vue .jsx
文件 components
目录中的文件动态路由 Fes.js 里约定名称为 [slug]
格式的文件或文件夹映射为动态路由。 比如:
src/pages/users/[id].vue
会成为 /users/:id
src/pages/users/[id]/settings.vue
会成为 /users/:id/settings
WARNING
@slug
形式下版本会弃用,请替换为[slug]
~
模糊匹配 Fes.js 里约定名称为 [...slug]
格式的文件或文件夹映射为动态路由中的模糊匹配形式。 比如:
src/pages/users/[...].vue
会成为 /users/:pathMatch(.*)
src/pages/users/[...id].vue
会成为 /users/:id(.*)
src/pages/users/[...id]/settings.vue
会成为 /users/:id(.*)/settings
WARNING
*
形式下版本会弃用,请替换为[...slug]
~
嵌套路由 Fes.js 里约定目录下有 layout.vue
时会生成嵌套路由,以 layout.vue
为该目录的公共父组件,layout.vue
中必须实现 RouterView
比如以下目录结构:
pages
+└── users
+ ├── layout.vue
+ ├── index.vue
+ └── list.vue
会生成路由:
js [
+ {
+ path : ' /users ' ,
+ component : require ( ' @/pages/users/layout ' ) . default ,
+ children : [
+ { path : ' /users ' , component : require ( ' @/pages/users/index ' ) . default },
+ { path : ' /users/list ' , component : require ( ' @/pages/users/list ' ) . default },
+ ] ,
+ },
+] ;
模糊匹配 Fes.js 下约定文件名为 *
的路由是模糊匹配路由,可以用此特性实现 404 路由 。
比如以下目录结构:
pages
+├── index.vue # 根路由页面 路径为 /
+└── *.vue # 模糊匹配 路径为 *
会生成路由:
js [
+ {
+ path : ' / ' ,
+ component : require ( ' @/pages/index ' ) . default ,
+ count : 5 ,
+ },
+ {
+ path : ' /:pathMatch(.*) ' ,
+ component : require ( ' @/pages/** ' ) . default ,
+ count : 3 ,
+ },
+] ;
这样,如果访问 /foo
,/
不能匹配,会 fallback 到 *
路由,通过 src/pages/*.vue
进行渲染。
智能路由 可以看到,编译后路由都会有 count
属性,这是我们根据精准匹配优先算法原则设计出路由排名算法,对匹配到的路由打分:
路由的路径每个子项得到 4 分 子项为静态细分(/list
)再加 3 分 子项为动态细分(/:orderId
)再加 2 分 根段(/
)再 1 分 通配符(*
)匹配到的减去 1 分 当我们跳转路由时,如果 URL 匹配到多个路由,则选择分数最高的路由。
扩展路由元信息 我们在定义路由时可以配置meta
字段,用来记录一些跟路由相关的信息:
js const router = new VueRouter ( {
+ routes : [
+ {
+ path : ' /foo ' ,
+ component : Foo ,
+ children : [
+ {
+ path : ' bar ' ,
+ component : Bar ,
// a meta field
- meta : { requiresAuth : true },
- },
- ] ,
- },
- ] ,
-} ) ;
我们使用defineRouteMeta
配置 meta
:
js import { defineRouteMeta } from ' @fesjs/fes ' ;
-defineRouteMeta ( {
- name : ' store ' ,
- title : ' vuex测试 ' ,
-} ) ;
当然在单文件组件中,还可以通过<config></config>
配置 meta
:
vue < config >
-{
- "name": "store",
- "title": "vuex测试"
-}
-</ config >
TIP
推荐使用defineRouteMeta
,有更好的提示。
路由元信息在编译后会附加到路由配置中:
js [
- {
- path : ' /a ' ,
- component : require ( ' @/pages/a ' ) . default ,
- meta : {
- " name " : " store " ,
- " title " : " vuex测试 "
- }
- },
-]
路由跳转 想学习更多,可以查看 Vue Router 官方文档 。
声明式 vue < template >
- < router-link to = " /home " > Home </ router-link >
-</ template >
命令式 页面跳转 API 由 router
实例提供,查看 Vue Rouer 文档 了解更多。
js import { useRouter } from ' @fesjs/fes ' ;
+ meta : { requiresAuth : true },
+ },
+ ] ,
+ },
+ ] ,
+} ) ;
我们使用defineRouteMeta
配置 meta
:
js import { defineRouteMeta } from ' @fesjs/fes ' ;
+defineRouteMeta ( {
+ name : ' store ' ,
+ title : ' vuex测试 ' ,
+} ) ;
当然在单文件组件中,还可以通过<config></config>
配置 meta
:
vue < config >
+{
+ "name": "store",
+ "title": "vuex测试"
+}
+</ config >
TIP
推荐使用defineRouteMeta
,有更好的提示。
路由元信息在编译后会附加到路由配置中:
js [
+ {
+ path : ' /a ' ,
+ component : require ( ' @/pages/a ' ) . default ,
+ meta : {
+ " name " : " store " ,
+ " title " : " vuex测试 "
+ }
+ },
+]
路由跳转 想学习更多,可以查看 Vue Router 官方文档 。
声明式 vue < template >
+ < router-link to = " /home " > Home </ router-link >
+</ template >
命令式 页面跳转 API 由 router
实例提供,查看 Vue Rouer 文档 了解更多。
js import { useRouter } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const router = useRouter () ;
+export default {
+ setup () {
+ const router = useRouter () ;
// 这三种形式是等价的
- router . push ( ' /users/posva#bio ' ) ;
- router . push ( { path : ' /users/posva ' , hash : ' #bio ' } ) ;
- router . push ( { name : ' users ' , params : { username : ' posva ' }, hash : ' #bio ' } ) ;
+ router . push ( ' /users/posva#bio ' ) ;
+ router . push ( { path : ' /users/posva ' , hash : ' #bio ' } ) ;
+ router . push ( { name : ' users ' , params : { username : ' posva ' }, hash : ' #bio ' } ) ;
// 只改变 hash
- router . push ( { hash : ' #bio ' } ) ;
+ router . push ( { hash : ' #bio ' } ) ;
// 只改变 query
- router . push ( { query : { page : ' 2 ' } } ) ;
+ router . push ( { query : { page : ' 2 ' } } ) ;
// 只改变 param
- router . push ( { params : { username : ' jolyne ' } } ) ;
+ router . push ( { params : { username : ' jolyne ' } } ) ;
// 跳转到上一个路由
- router . goBack () ;
+ router . goBack () ;
// \b跳转到前一个历史记录
- router . go ( 1 ) ;
+ router . go ( 1 ) ;
// 替换历史堆栈中的记录
- router . replace ( ' /new ' ) ;
+ router . replace ( ' /new ' ) ;
},
-};
`,62),e=[o];function t(c,r,D,F,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default};
+};
`,62),e=[o];function t(c,r,D,F,y,B){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default};
diff --git a/assets/guide_route.md.11dd4240.lean.js b/assets/guide_route.md.11dd4240.lean.js
new file mode 100644
index 000000000..96028a9d0
--- /dev/null
+++ b/assets/guide_route.md.11dd4240.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l("",62),e=[o];function t(c,r,D,F,y,B){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default};
diff --git a/assets/guide_route.md.bc8f1b03.lean.js b/assets/guide_route.md.bc8f1b03.lean.js
deleted file mode 100644
index cbd9d76cc..000000000
--- a/assets/guide_route.md.bc8f1b03.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"路由","description":"","frontmatter":{},"headers":[],"relativePath":"guide/route.md"}'),p={name:"guide/route.md"},o=l("",62),e=[o];function t(c,r,D,F,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default};
diff --git a/assets/guide_runtime-config.md.99433914.js b/assets/guide_runtime-config.md.8d7d4f16.js
similarity index 67%
rename from assets/guide_runtime-config.md.99433914.js
rename to assets/guide_runtime-config.md.8d7d4f16.js
index 1681ff08e..a5704f02f 100644
--- a/assets/guide_runtime-config.md.99433914.js
+++ b/assets/guide_runtime-config.md.8d7d4f16.js
@@ -1,67 +1,67 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l(`运行时配置 Fes.js 约定 src/app.js
为运行时配置文件。运行时配置和配置的区别是他跑在浏览器端,因此我们可以在这里写函数、引入浏览器端依赖项等等,注意不要引入 node 端依赖项。
运行时为啥需要配置? Fes.js 框架跟传统开发模式不一样。传统开发模式中用户编写 entry 文件,而 Fes.js 中 entry 文件由框架生成,用户就不必要编写胶水代码。内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义。
例如:
plugin-access 插件定义运行时配置项:
js api . addRuntimePluginKey ( () => ' access ' ) ;
plugin-access 插件读取配置项:
js const runtimeConfig = plugin . applyPlugins ( {
- key : ' access ' ,
- type : ApplyPluginsType . modify ,
- initialValue : {},
-} ) ;
而用户则只需要配置:
js // app.js
-import { defineRuntimeConfig } from ' @fesjs/fes ' ;
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l(`运行时配置 Fes.js 约定 src/app.js
为运行时配置文件。运行时配置和配置的区别是他跑在浏览器端,因此我们可以在这里写函数、引入浏览器端依赖项等等,注意不要引入 node 端依赖项。
运行时为啥需要配置? Fes.js 框架跟传统开发模式不一样。传统开发模式中用户编写 entry 文件,而 Fes.js 中 entry 文件由框架生成,用户就不必要编写胶水代码。内置插件和其他插件提供的一些运行时功能提供用户或者其他插件自定义。
例如:
plugin-access 插件定义运行时配置项:
js api . addRuntimePluginKey ( () => ' access ' ) ;
plugin-access 插件读取配置项:
js const runtimeConfig = plugin . applyPlugins ( {
+ key : ' access ' ,
+ type : ApplyPluginsType . modify ,
+ initialValue : {},
+} ) ;
而用户则只需要配置:
js // app.js
+import { defineRuntimeConfig } from ' @fesjs/fes ' ;
-export default defineRuntimeConfig ( {
- access : memo => ( {
- ... memo
- unAccessHandler ( {
- router , to , from , next
- } ) {
+export default defineRuntimeConfig ( {
+ access : memo => ( {
+ ... memo
+ unAccessHandler ( {
+ router , to , from , next
+ } ) {
// 处理逻辑
- },
- noFoundHandler ({
- router , to , from , next
- }) {
+ },
+ noFoundHandler ({
+ router , to , from , next
+ }) {
// 处理逻辑
},
- } ) ,
-} ) ;
配置智能提示 配置可以单独导出,也可以通过 defineRuntimeConfig
工具函数获取类型提示。
方式一(推荐,有类型提示):
js // app.js
-import { defineRuntimeConfig } from ' @fesjs/fes ' ;
+ } ) ,
+} ) ;
配置智能提示 配置可以单独导出,也可以通过 defineRuntimeConfig
工具函数获取类型提示。
方式一(推荐,有类型提示):
js // app.js
+import { defineRuntimeConfig } from ' @fesjs/fes ' ;
-export default defineRuntimeConfig ( {
- access : memo => ( {
- ... memo
- unAccessHandler ( {
- router , to , from , next
- } ) {
+export default defineRuntimeConfig ( {
+ access : memo => ( {
+ ... memo
+ unAccessHandler ( {
+ router , to , from , next
+ } ) {
// 处理逻辑
- },
- noFoundHandler ({
- router , to , from , next
- }) {
+ },
+ noFoundHandler ({
+ router , to , from , next
+ }) {
// 处理逻辑
},
- } ) ,
+ } ) ,
// ...其他配置项
-} ) ;
方式二:
js // app.js
-export const access = memo => ( {
- ... memo
- unAccessHandler ( {
- router , to , from , next
- } ) {
+} ) ;
方式二:
js // app.js
+export const access = memo => ( {
+ ... memo
+ unAccessHandler ( {
+ router , to , from , next
+ } ) {
// 处理逻辑
- },
- noFoundHandler ({
- router , to , from , next
- }) {
+ },
+ noFoundHandler ({
+ router , to , from , next
+ }) {
// 处理逻辑
},
-} ) ;
配置项 beforeRender beforeRender(lastOpts)
在渲染之前执行,执行action
过程中显示 loading
配置的组件,执行结果作为参数 initialState
传给 modifyClientRenderOpts
。
示例:
js // app.js
-import { access } from ' @fesjs/fes ' ;
-import PageLoading from ' @/components/PageLoading ' ;
-import UserCenter from ' @/components/UserCenter ' ;
+} ) ;
配置项 beforeRender beforeRender(lastOpts)
在渲染之前执行,执行action
过程中显示 loading
配置的组件,执行结果作为参数 initialState
传给 modifyClientRenderOpts
。
示例:
js // app.js
+import { access } from ' @fesjs/fes ' ;
+import PageLoading from ' @/components/PageLoading ' ;
+import UserCenter from ' @/components/UserCenter ' ;
-export function beforeRender ( lastOpts ) {
+export function beforeRender ( lastOpts ) {
return {
- ... lastOpts ,
+ ... lastOpts ,
loading : < PageLoading />,
action () {
- const { setRole } = access ;
- return new Promise ( ( resolve ) => {
+ const { setRole } = access ;
+ return new Promise ( ( resolve ) => {
setTimeout ( () => {
setRole ( ' admin ' ) ;
resolve ( {
@@ -71,53 +71,53 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
} ) ;
},
};
-}
patchRoutes patchRoutes({routes })
WARNING
准备删除此API,推荐使用modifyRoute
修改路由。
比如在最前面添加一个 /foo 路由:
js export function patchRoutes ({ routes }) {
- routes . unshift ( {
+}
patchRoutes patchRoutes({routes })
WARNING
准备删除此API,推荐使用modifyRoute
修改路由。
比如在最前面添加一个 /foo 路由:
js export function patchRoutes ({ routes }) {
+ routes . unshift ( {
path : ' /foo ' ,
- component : require ( ' @/extraRoutes/foo ' ) . default ,
+ component : require ( ' @/extraRoutes/foo ' ) . default ,
} ) ;
-}
modifyRoute modifyRoute({base, createHistory, routes})
修改路由配置信息。
比如在最前面添加一个 /foo 路由:
js export function modifyRoute ( memo ) {
+}
modifyRoute modifyRoute({base, createHistory, routes})
修改路由配置信息。
比如在最前面添加一个 /foo 路由:
js export function modifyRoute ( memo ) {
return {
- ... memo ,
+ ... memo ,
routes : [
{
path : ' /foo ' ,
- component : require ( ' @/extraRoutes/foo ' ) . default ,
+ component : require ( ' @/extraRoutes/foo ' ) . default ,
},
- ... memo . routes
+ ... memo . routes
]
}
-}
比如修改 base:
js export function modifyRoute ( memo ) {
+}
比如修改 base:
js export function modifyRoute ( memo ) {
return {
- ... memo ,
- base : window . location . href
+ ... memo ,
+ base : window . location . href
}
-}
比如改为使用createMemoryHistory:
js export function modifyRoute ( memo ) {
+}
比如改为使用createMemoryHistory:
js export function modifyRoute ( memo ) {
return {
- ... memo ,
- createHistory : createMemoryHistory
+ ... memo ,
+ createHistory : createMemoryHistory
}
-}
modifyClientRenderOpts modifyClientRenderOpts(lastOpts)
修改 clientRender
参数。参数是一个对象:
routes,路由配置信息 rootElement, 渲染的根节点,默认是 #app
,可通过配置 mountElementId
修改。 initialState, 初始化数据,beforeRender
运行得到的数据。 比如在微前端里动态修改渲染根节点:
js let isSubApp = false ;
-export function modifyClientRenderOpts ( lastOpts ) {
+}
modifyClientRenderOpts modifyClientRenderOpts(lastOpts)
修改 clientRender
参数。参数是一个对象:
routes,路由配置信息 rootElement, 渲染的根节点,默认是 #app
,可通过配置 mountElementId
修改。 initialState, 初始化数据,beforeRender
运行得到的数据。 比如在微前端里动态修改渲染根节点:
js let isSubApp = false ;
+export function modifyClientRenderOpts ( lastOpts ) {
return {
- ... lastOpts ,
- rootElement : isSubApp ? ' sub-root ' : lastOpts . rootElement ,
+ ... lastOpts ,
+ rootElement : isSubApp ? ' sub-root ' : lastOpts . rootElement ,
};
-}
rootContainer rootContainer(LastRootContainer, args)
修改交给 Vue 渲染时的根组件,默认是 <RouterView></RouterView>
。
LastRootContainer,上一个插件修改后的结果。 args,包含: routes,全量路由配置 plugin,运行时插件机制 比如在可以包一层 DIV:
js export function rootContainer ( container ) {
+}
rootContainer rootContainer(LastRootContainer, args)
修改交给 Vue 渲染时的根组件,默认是 <RouterView></RouterView>
。
LastRootContainer,上一个插件修改后的结果。 args,包含: routes,全量路由配置 plugin,运行时插件机制 比如在可以包一层 DIV:
js export function rootContainer ( container ) {
return () => {
return (
< div >
- < RouterView ></ RouterView >
- </ div >
+ < RouterView ></ RouterView >
+ </ div >
) ;
};
-}
onAppCreated onAppCreated({app})
创建 app 实例后触发。
比如用于安装 Vue 插件:
js import { createRouter } from ' vue-router ' ;
+}
onAppCreated onAppCreated({app})
创建 app 实例后触发。
比如用于安装 Vue 插件:
js import { createRouter } from ' vue-router ' ;
-export function onAppCreated ({ app }) {
- const router = createRouter () ;
- app . use ( router ) ;
-}
render render(oldRender: Function)
覆写 render。
比如用于渲染之前做权限校验。
onRouterCreated onRouterCreated({router})
生成 router 时触发。
比如用于收集切换路由的记录:
js export function onRouterCreated ({ router }) {
- router . afterEach ( ( to , from ) => {
- console . log ( to ) ;
+export function onAppCreated ({ app }) {
+ const router = createRouter () ;
+ app . use ( router ) ;
+}
render render(oldRender: Function)
覆写 render。
比如用于渲染之前做权限校验。
onRouterCreated onRouterCreated({router})
生成 router 时触发。
比如用于收集切换路由的记录:
js export function onRouterCreated ({ router }) {
+ router . afterEach ( ( to , from ) => {
+ console . log ( to ) ;
} ) ;
-}
更多配置项 Fes.js 允许插件注册运行时配置,如果你使用插件,肯定会在插件里找到更多运行时的配置项。
`,67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+}
更多配置项 Fes.js 允许插件注册运行时配置,如果你使用插件,肯定会在插件里找到更多运行时的配置项。
`,67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default};
diff --git a/assets/guide_runtime-config.md.8d7d4f16.lean.js b/assets/guide_runtime-config.md.8d7d4f16.lean.js
new file mode 100644
index 000000000..a36180d94
--- /dev/null
+++ b/assets/guide_runtime-config.md.8d7d4f16.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l("",67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default};
diff --git a/assets/guide_runtime-config.md.99433914.lean.js b/assets/guide_runtime-config.md.99433914.lean.js
deleted file mode 100644
index 8a291dfae..000000000
--- a/assets/guide_runtime-config.md.99433914.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"运行时配置","description":"","frontmatter":{},"headers":[],"relativePath":"guide/runtime-config.md"}'),p={name:"guide/runtime-config.md"},o=l("",67),e=[o];function t(c,r,y,D,F,i){return n(),a("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/guide_template.md.d4004323.js b/assets/guide_template.md.0f61d40d.js
similarity index 82%
rename from assets/guide_template.md.d4004323.js
rename to assets/guide_template.md.0f61d40d.js
index 3f836c684..17a84d599 100644
--- a/assets/guide_template.md.d4004323.js
+++ b/assets/guide_template.md.0f61d40d.js
@@ -1,19 +1,19 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n(`HTML 模板 Fes.js 默认模板内容是:
TIP
fes3.0+ html 模版文件从 public/index.html
挪到项目根目录。
html <! DOCTYPE html >
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n(`HTML 模板 Fes.js 默认模板内容是:
TIP
fes3.0+ html 模版文件从 public/index.html
挪到项目根目录。
html <! DOCTYPE html >
< html >
- < head >
- < meta charset = " utf-8 " />
- < meta http-equiv = " X-UA-Compatible " content = " IE=edge " />
- < meta name = " viewport " content = " width=device-width,initial-scale=1.0 " />
- < title > <%= title %> </ title >
- </ head >
- < body >
- < div id = " <%= mountElementId %> " ></ div >
- </ body >
+ < head >
+ < meta charset = " utf-8 " />
+ < meta http-equiv = " X-UA-Compatible " content = " IE=edge " />
+ < meta name = " viewport " content = " width=device-width,initial-scale=1.0 " />
+ < title > <%= title %> </ title >
+ </ head >
+ < body >
+ < div id = " <%= mountElementId %> " ></ div >
+ </ body >
</ html >
修改页面标题 js // .fes.js
-export default {
- title : ' 这是页面标题 ' ,
-};
页面的标题会设置成 这是页面标题
。
模板变量 模版中可以使用的变量:
NODE_ENV
: Node.js 环境变量FES_ENV
: Fes.js 环境变量BASE_URL
: publicPath.env.**
: 文件中以 FES_APP_
开头的变量举个 🌰 :
env # .env
-FES_APP_HELLO_WORLD=hello world
html < link rel = " icon " href = " <%= BASE_URL %>favicon.ico " />
+export default {
+ title : ' 这是页面标题 ' ,
+};
页面的标题会设置成 这是页面标题
。
模板变量 模版中可以使用的变量:
NODE_ENV
: Node.js 环境变量FES_ENV
: Fes.js 环境变量BASE_URL
: publicPath.env.**
: 文件中以 FES_APP_
开头的变量举个 🌰 :
env # .env
+FES_APP_HELLO_WORLD=hello world
html < link rel = " icon " href = " <%= BASE_URL %>favicon.ico " />
< body >
- < div > <%= FES_APP_HELLO_WORLD %> </ div >
-</ body >
`,13),t=[p];function e(c,D,r,F,y,i){return a(),l("div",null,t)}const A=s(o,[["render",e]]);export{C as __pageData,A as default};
+ < div > <%= FES_APP_HELLO_WORLD %> </ div >
+</ body >
`,13),t=[p];function e(c,r,D,F,y,i){return a(),l("div",null,t)}const u=s(o,[["render",e]]);export{h as __pageData,u as default};
diff --git a/assets/guide_template.md.0f61d40d.lean.js b/assets/guide_template.md.0f61d40d.lean.js
new file mode 100644
index 000000000..942b1849a
--- /dev/null
+++ b/assets/guide_template.md.0f61d40d.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n("",13),t=[p];function e(c,r,D,F,y,i){return a(),l("div",null,t)}const u=s(o,[["render",e]]);export{h as __pageData,u as default};
diff --git a/assets/guide_template.md.d4004323.lean.js b/assets/guide_template.md.d4004323.lean.js
deleted file mode 100644
index dcb355457..000000000
--- a/assets/guide_template.md.d4004323.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"HTML 模板","description":"","frontmatter":{},"headers":[],"relativePath":"guide/template.md"}'),o={name:"guide/template.md"},p=n("",13),t=[p];function e(c,D,r,F,y,i){return a(),l("div",null,t)}const A=s(o,[["render",e]]);export{C as __pageData,A as default};
diff --git a/assets/guide_upgrade3.md.aa1339b5.js b/assets/guide_upgrade3.md.1e41a4e9.js
similarity index 96%
rename from assets/guide_upgrade3.md.aa1339b5.js
rename to assets/guide_upgrade3.md.1e41a4e9.js
index f03be5983..c7ea96716 100644
--- a/assets/guide_upgrade3.md.aa1339b5.js
+++ b/assets/guide_upgrade3.md.1e41a4e9.js
@@ -1 +1 @@
-import{_ as e,o as a,c as r,V as l}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l('从 2.0.x 迁移到 3.0.x 版本 3.0.x 的 break 编译时的 base 配置,移到了 router.base 下。 webpack-dev-server 从 v3.x
升级到了 v4.x
,如果遇到配置不兼容,可以查看webpack-dev-server 3.x 升级 4.x 。layout 插件 有一些属性变更request 插件 有一些参数变更继续使用 Webpack 添加 Webpack 构建依赖包: npm i @fesjs/builder-webpack -D
。 如果设置了 publicPath: './'
,请更改为 publicPath: ''
如果有,将 public/index.html
文件挪到项目根目录,移除 html-webpack-plugin 相关配置,具体模版变量使用请查看HTML 模版 。 换成 Vite 安装依赖包 npm i @fesjs/builder-vite
。 将 Webpack 相关的配置换成 Vite,具体可查看配置 。 将 html 模版文件从 public/index.html
挪到项目根目录,如果有相应的 html-webpack-plugin 配置,需要改成 vite-plugin-html 的写法。 将 require
等 Vite 不支持的代码,改写成 Vite 支持的方式。 插件 插件都需要升级到 3.0.x
版本,新版添加了兼容builder
的逻辑,但是提供的接口和配置没有变化,只需要升级版本即可使用。
',10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default};
+import{_ as e,o as a,c as r,V as l}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l('从 2.0.x 迁移到 3.0.x 版本 3.0.x 的 break 编译时的 base 配置,移到了 router.base 下。 webpack-dev-server 从 v3.x
升级到了 v4.x
,如果遇到配置不兼容,可以查看webpack-dev-server 3.x 升级 4.x 。layout 插件 有一些属性变更request 插件 有一些参数变更继续使用 Webpack 添加 Webpack 构建依赖包: npm i @fesjs/builder-webpack -D
。 如果设置了 publicPath: './'
,请更改为 publicPath: ''
如果有,将 public/index.html
文件挪到项目根目录,移除 html-webpack-plugin 相关配置,具体模版变量使用请查看HTML 模版 。 换成 Vite 安装依赖包 npm i @fesjs/builder-vite
。 将 Webpack 相关的配置换成 Vite,具体可查看配置 。 将 html 模版文件从 public/index.html
挪到项目根目录,如果有相应的 html-webpack-plugin 配置,需要改成 vite-plugin-html 的写法。 将 require
等 Vite 不支持的代码,改写成 Vite 支持的方式。 插件 插件都需要升级到 3.0.x
版本,新版添加了兼容builder
的逻辑,但是提供的接口和配置没有变化,只需要升级版本即可使用。
',10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default};
diff --git a/assets/guide_upgrade3.md.aa1339b5.lean.js b/assets/guide_upgrade3.md.1e41a4e9.lean.js
similarity index 66%
rename from assets/guide_upgrade3.md.aa1339b5.lean.js
rename to assets/guide_upgrade3.md.1e41a4e9.lean.js
index 9a2670408..8e5d9f986 100644
--- a/assets/guide_upgrade3.md.aa1339b5.lean.js
+++ b/assets/guide_upgrade3.md.1e41a4e9.lean.js
@@ -1 +1 @@
-import{_ as e,o as a,c as r,V as l}from"./chunks/framework.85b09291.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l("",10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default};
+import{_ as e,o as a,c as r,V as l}from"./chunks/framework.b31a4d00.js";const f=JSON.parse('{"title":"从 2.0.x 迁移到 3.0.x","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrade3.md"}'),i={name:"guide/upgrade3.md"},t=l("",10),o=[t];function c(n,d,h,u,p,s){return a(),r("div",null,o)}const m=e(i,[["render",c]]);export{f as __pageData,m as default};
diff --git a/assets/index.md.8e92f132.js b/assets/index.md.1030e364.js
similarity index 81%
rename from assets/index.md.8e92f132.js
rename to assets/index.md.1030e364.js
index 3e6093056..86b741e9c 100644
--- a/assets/index.md.8e92f132.js
+++ b/assets/index.md.1030e364.js
@@ -1,15 +1,15 @@
-import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-LuSWR",id:"tab-7PAooLU",checked:"checked"}),s("label",{for:"tab-7PAooLU"},"pnpm"),s("input",{type:"radio",name:"group-LuSWR",id:"tab-33BlPOE"}),s("label",{for:"tab-33BlPOE"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
+import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.b31a4d00.js";const F=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-jLzma6x",checked:"checked"}),s("label",{for:"tab-jLzma6x"},"pnpm"),s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-vopF9YV"}),s("label",{for:"tab-vopF9YV"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function C(u,m,f,g,b,A){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const E=a(p,[["render",C]]);export{D as __pageData,E as default};
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function m(u,B,E,f,g,b){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const _=a(p,[["render",m]]);export{F as __pageData,_ as default};
diff --git a/assets/index.md.8e92f132.lean.js b/assets/index.md.1030e364.lean.js
similarity index 81%
rename from assets/index.md.8e92f132.lean.js
rename to assets/index.md.1030e364.lean.js
index 3e6093056..86b741e9c 100644
--- a/assets/index.md.8e92f132.lean.js
+++ b/assets/index.md.1030e364.lean.js
@@ -1,15 +1,15 @@
-import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-LuSWR",id:"tab-7PAooLU",checked:"checked"}),s("label",{for:"tab-7PAooLU"},"pnpm"),s("input",{type:"radio",name:"group-LuSWR",id:"tab-33BlPOE"}),s("label",{for:"tab-33BlPOE"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
+import{_ as a,H as t,o as n,c as o,J as c,E as i,C as s,a as e}from"./chunks/framework.b31a4d00.js";const F=JSON.parse('{"title":"Fes.js","description":"","frontmatter":{"layout":"home","title":"Fes.js","hero":{"name":"Fes.js","tagline":"一个好用的前端应用解决方案","image":{"src":"/logo.png","alt":"VitePress"},"actions":[{"text":"快速上手","link":"/guide/getting-started.html","theme":"brand"},{"text":"项目简介","link":"/guide/","theme":"alt"}]},"features":[{"title":"Fast","details":"Fes.js 内置路由、构建、插件管理,提供测试、布局、权限、国际化、状态管理、请求、数据字典、SVG等插件,可以满足大部分日常开发需求。"},{"title":"Easy","details":"基于Vue.js 3.0,上手非常简单。贯彻 “约定优于配置” 思想,在设计插件上尽可能用约定替代配置,依然提供统一的插件配置入口,简单简洁又不失灵活。提供一致性的API入口,一致化的体验,学习起来更轻松。"},{"title":"Strong","details":"仅仅需要关心页面内容,减少犯错的机会!提供单元测试、覆盖测试的能力保障项目质量。"},{"title":"可扩展","details":"借鉴 UMI 实现完整的生命周期和插件化机制,插件可以管理项目的编译时和运行时,能力均可以通过插件封装进来,在 Fes.js 中协调有序的运行。"},{"title":"面向未来","details":"在满足需求的同时,我们也不会停止对新技术的探索。已使用 Vue3.0 来提升应用性能,已使用 webpack5 和 vite 提升构建性能和实现微服务。"},{"title":"令人愉悦","details":"我们的主要重点是开发人员体验。我们喜欢 Fes.js,并且会不断改进框架,所以您也喜欢它!期待有吸引力的解决方案,描述性的错误消息,强大的默认值和详细的文档。如果有问题或疑问,我们有用的社区将为您提供帮助。"}]},"headers":[],"relativePath":"index.md"}'),p={name:"index.md"},r=s("h2",{id:"像数-1-2-3-一样容易",tabindex:"-1"},[e("像数 1, 2, 3 一样容易 "),s("a",{class:"header-anchor",href:"#像数-1-2-3-一样容易","aria-label":'Permalink to "像数 1, 2, 3 一样容易"'},"")],-1),d=s("div",{class:"vp-code-group"},[s("div",{class:"tabs"},[s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-jLzma6x",checked:"checked"}),s("label",{for:"tab-jLzma6x"},"pnpm"),s("input",{type:"radio",name:"group-Gm4Sn",id:"tab-vopF9YV"}),s("label",{for:"tab-vopF9YV"},"npm")]),s("div",{class:"blocks"},[s("div",{class:"language-bash active"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"create"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"i")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"pnpm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])]),s("div",{class:"language-bash"},[s("button",{title:"Copy Code",class:"copy"}),s("span",{class:"lang"},"bash"),s("pre",{class:"shiki material-theme-palenight"},[s("code",null,[s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 创建模板")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npx"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"@fesjs/create-fes-app"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"myapp")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 安装依赖")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(`
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"install")]),e(`
`),s("span",{class:"line"}),e(`
`),s("span",{class:"line"},[s("span",{style:{color:"#676E95","font-style":"italic"}},"# 运行")]),e(`
-`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#A6ACCD"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function C(u,m,f,g,b,A){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const E=a(p,[["render",C]]);export{D as __pageData,E as default};
+`),s("span",{class:"line"},[s("span",{style:{color:"#FFCB6B"}},"npm"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"run"),s("span",{style:{color:"#BABED8"}}," "),s("span",{style:{color:"#C3E88D"}},"dev")])])])])])],-1),y=s("h2",{id:"反馈",tabindex:"-1"},[e("反馈 "),s("a",{class:"header-anchor",href:"#反馈","aria-label":'Permalink to "反馈"'},"")],-1),h=s("table",null,[s("thead",null,[s("tr",null,[s("th",null,"Github Issue"),s("th",null,"Fes.js 开源运营小助手")])]),s("tbody",null,[s("tr",null,[s("td",null,[s("a",{href:"https://github.com/WeBankFinTech/fes.js/issues",target:"_blank",rel:"noreferrer"},"@fesjs/fes.js/issues")]),s("td",null,[s("img",{src:"https://cos-1254145788.cos.ap-guangzhou.myqcloud.com/WechatIMG104.jpeg",height:"250"})])])])],-1);function m(u,B,E,f,g,b){const l=t("HomeContent");return n(),o("div",null,[c(l,null,{default:i(()=>[r,d,y,h]),_:1})])}const _=a(p,[["render",m]]);export{F as __pageData,_ as default};
diff --git a/assets/reference_api.md.fb7e1612.js b/assets/reference_api.md.5e62d83f.js
similarity index 86%
rename from assets/reference_api.md.fb7e1612.js
rename to assets/reference_api.md.5e62d83f.js
index e2a8fc45e..010be92bf 100644
--- a/assets/reference_api.md.fb7e1612.js
+++ b/assets/reference_api.md.5e62d83f.js
@@ -1 +1 @@
-import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default};
+import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default};
diff --git a/assets/reference_api.md.fb7e1612.lean.js b/assets/reference_api.md.5e62d83f.lean.js
similarity index 86%
rename from assets/reference_api.md.fb7e1612.lean.js
rename to assets/reference_api.md.5e62d83f.lean.js
index e2a8fc45e..010be92bf 100644
--- a/assets/reference_api.md.fb7e1612.lean.js
+++ b/assets/reference_api.md.5e62d83f.lean.js
@@ -1 +1 @@
-import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default};
+import{_ as a,o as t,c as r,C as e,a as o}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/api.md"}'),s={name:"reference/api.md"},c=e("h1",{id:"api",tabindex:"-1"},[o("API "),e("a",{class:"header-anchor",href:"#api","aria-label":'Permalink to "API"'},"")],-1),n=[c];function i(d,p,_,l,f,h){return t(),r("div",null,n)}const x=a(s,[["render",i]]);export{u as __pageData,x as default};
diff --git a/assets/reference_api_index.md.9ffa99a5.js b/assets/reference_api_index.md.72b9ecff.js
similarity index 73%
rename from assets/reference_api_index.md.9ffa99a5.js
rename to assets/reference_api_index.md.72b9ecff.js
index 6affe20f5..fa3722d0b 100644
--- a/assets/reference_api_index.md.9ffa99a5.js
+++ b/assets/reference_api_index.md.72b9ecff.js
@@ -1,65 +1,65 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l(`API Fes.js 统一了 API 的出口,所有运行时 API(包含 Fes.js 内置 API 和插件提供的 API)全部通过@fesjs/fes
导出。
js import { someApi } from ' @fesjs/fes ' ;
基础 API plugin 运行时插件接口,是 Fes.js 内置的跑在浏览器里的一套插件体系。
js import { plugin , ApplyPluginsType } from ' @fesjs/fes ' ;
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l(`API Fes.js 统一了 API 的出口,所有运行时 API(包含 Fes.js 内置 API 和插件提供的 API)全部通过@fesjs/fes
导出。
js import { someApi } from ' @fesjs/fes ' ;
基础 API plugin 运行时插件接口,是 Fes.js 内置的跑在浏览器里的一套插件体系。
js import { plugin , ApplyPluginsType } from ' @fesjs/fes ' ;
// 注册插件
-plugin . register ( {
- apply : { dva : { foo : 1 } },
- path : ' foo ' ,
-} ) ;
-plugin . register ( {
- apply : { dva : { bar : 1 } },
- path : ' bar ' ,
-} ) ;
+plugin . register ( {
+ apply : { dva : { foo : 1 } },
+ path : ' foo ' ,
+} ) ;
+plugin . register ( {
+ apply : { dva : { bar : 1 } },
+ path : ' bar ' ,
+} ) ;
// 执行插件
// 得到 { foo: 1, bar: 1 }
-plugin . applyPlugins ( {
- key : ' dva ' ,
- type : ApplyPluginsType . modify ,
- initialValue : {},
- args : {},
- async : false ,
-} ) ;
plugin.register 参数包含: apply 插件文件导出的内容 path 插件文件路径 plugin.applyPlugins 参数包含: key,坑位的 key type,执行方式类型,详见 ApplyPluginsType initialValue,初始值 args,参数 async,是否异步执行且返回 Promise ApplyPluginsType 运行时插件执行类型,enum 类型,包含三个属性:
compose,用于合并执行多个函数,函数可决定前序函数的执行时机 modify,用于修改值 event,用于执行事件,前面没有依赖关系 定义页面的元信息
defineBuildConfig 定义构建配置
defineRuntimeConfig 定义运行时配置
路由 API Fes.js 路由基于 Vue Router 4.0 ,想了解更多的同学可以看看官方文档。
getRouter 返回当前 router
实例。
js import { getRouter } from ' @fesjs/fes ' ;
-const router = getRouter () ;
-router . push () ;
getHistory 返回当前路由的 History
useRoute 返回当前 route
实例,相当于在模板内使用 $route
。必须在 setup
函数内调用。
js import { useRoute } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const route = useRoute () ;
+plugin . applyPlugins ( {
+ key : ' dva ' ,
+ type : ApplyPluginsType . modify ,
+ initialValue : {},
+ args : {},
+ async : false ,
+} ) ;
plugin.register 参数包含: apply 插件文件导出的内容 path 插件文件路径 plugin.applyPlugins 参数包含: key,坑位的 key type,执行方式类型,详见 ApplyPluginsType initialValue,初始值 args,参数 async,是否异步执行且返回 Promise ApplyPluginsType 运行时插件执行类型,enum 类型,包含三个属性:
compose,用于合并执行多个函数,函数可决定前序函数的执行时机 modify,用于修改值 event,用于执行事件,前面没有依赖关系 定义页面的元信息
defineBuildConfig 定义构建配置
defineRuntimeConfig 定义运行时配置
路由 API Fes.js 路由基于 Vue Router 4.0 ,想了解更多的同学可以看看官方文档。
getRouter 返回当前 router
实例。
js import { getRouter } from ' @fesjs/fes ' ;
+const router = getRouter () ;
+router . push () ;
getHistory 返回当前路由的 History
useRoute 返回当前 route
实例,相当于在模板内使用 $route
。必须在 setup
函数内调用。
js import { useRoute } from ' @fesjs/fes ' ;
+export default {
+ setup () {
+ const route = useRoute () ;
},
-};
useRouter 返回 router
实例,相当于在模板语法中使用 $router
。必须在 setup
函数内调用。
js import { useRouter } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const router = useRouter () ;
+};
useRouter 返回 router
实例,相当于在模板语法中使用 $router
。必须在 setup
函数内调用。
js import { useRouter } from ' @fesjs/fes ' ;
+export default {
+ setup () {
+ const router = useRouter () ;
},
-};
onBeforeRouteUpdate 添加导航守卫,在当前路由即将更新时触发。类似于之前的beforeRouteUpdate
,但是可用于任何组件。卸载组件时,将移除守卫。
js import { onBeforeRouteUpdate } from ' @fesjs/fes ' ;
-export default {
- setup () {
- onBeforeRouteUpdate ( ( to , from , next ) => {} ) ;
+};
onBeforeRouteUpdate 添加导航守卫,在当前路由即将更新时触发。类似于之前的beforeRouteUpdate
,但是可用于任何组件。卸载组件时,将移除守卫。
js import { onBeforeRouteUpdate } from ' @fesjs/fes ' ;
+export default {
+ setup () {
+ onBeforeRouteUpdate ( ( to , from , next ) => {} ) ;
},
-};
onBeforeRouteLeave 添加导航守卫,在当前路由即将离开时触发。类似于之前的beforeRouteLeave
,但可用于任何组件。卸载组件时,将移除守卫。
js import { onBeforeRouteLeave } from ' @fesjs/fes ' ;
-export default {
- setup () {
- onBeforeRouteLeave ( ( to , from , next ) => {} ) ;
+};
onBeforeRouteLeave 添加导航守卫,在当前路由即将离开时触发。类似于之前的beforeRouteLeave
,但可用于任何组件。卸载组件时,将移除守卫。
js import { onBeforeRouteLeave } from ' @fesjs/fes ' ;
+export default {
+ setup () {
+ onBeforeRouteLeave ( ( to , from , next ) => {} ) ;
},
-};
createWebHashHistory 创建一个 hash 历史记录。对于没有主机的 web 应用程序 (例如 file://),或当配置服务器不能处理任意 URL 时这非常有用。注意:如果 SEO 对你很重要,你应该使用 createWebHistory
。
createWebHistory 创建 HTML5 历史记录。单页应用程序最常见的历史记录。必须通过 http 服务打开页面地址 。
createMemoryHistory 创建一个基于内存的历史记录。这个历史记录的主要目的是处理 SSR。它在一个特殊的位置开始,这个位置无处不在。如果用户不在浏览器上下文中,它们可以通过调用 router.push() 或 router.replace() 将该位置替换为启动位置。
createRouter 创建一个路由器实例,该实例可用于 Vue 应用程序。查看路由器选项 ,了解可以传递的所有属性的列表。
RouterLink 使用自定义组件路由器链接来创建链接,而不是使用常规标签。这使得 Vue 路由器无需重新加载页面即可更改 URL、处理 URL 生成及其编码。
html < router-link to = " /about " > Go to About </ router-link >
可以查看官方文档 了解更多 RouterLink 的 Porps。查看官方文档 了解 RouterLink 的作用域插槽。
useLink 返回的结果跟 RouterLink 的作用域插槽的属性一致,查看官方 API 了解更多。
js import { RouterLink , useLink } from ' @fesjs/fes ' ;
+};
createWebHashHistory 创建一个 hash 历史记录。对于没有主机的 web 应用程序 (例如 file://),或当配置服务器不能处理任意 URL 时这非常有用。注意:如果 SEO 对你很重要,你应该使用 createWebHistory
。
createWebHistory 创建 HTML5 历史记录。单页应用程序最常见的历史记录。必须通过 http 服务打开页面地址 。
createMemoryHistory 创建一个基于内存的历史记录。这个历史记录的主要目的是处理 SSR。它在一个特殊的位置开始,这个位置无处不在。如果用户不在浏览器上下文中,它们可以通过调用 router.push() 或 router.replace() 将该位置替换为启动位置。
createRouter 创建一个路由器实例,该实例可用于 Vue 应用程序。查看路由器选项 ,了解可以传递的所有属性的列表。
RouterLink 使用自定义组件路由器链接来创建链接,而不是使用常规标签。这使得 Vue 路由器无需重新加载页面即可更改 URL、处理 URL 生成及其编码。
html < router-link to = " /about " > Go to About </ router-link >
可以查看官方文档 了解更多 RouterLink 的 Porps。查看官方文档 了解 RouterLink 的作用域插槽。
useLink 返回的结果跟 RouterLink 的作用域插槽的属性一致,查看官方 API 了解更多。
js import { RouterLink , useLink } from ' @fesjs/fes ' ;
-export default {
- name : ' AppLink ' ,
+export default {
+ name : ' AppLink ' ,
- props : {
+ props : {
// add @ts-ignore if using TypeScript
- ... RouterLink . props ,
- inactiveClass : String ,
- },
+ ... RouterLink . props ,
+ inactiveClass : String ,
+ },
- setup ( props ) {
+ setup ( props ) {
// \`props\` contains \`to\` and any other prop that can be passed to <router-link>
- const { navigate , href , route , isActive , isExactActive } = useLink ( props ) ;
+ const { navigate , href , route , isActive , isExactActive } = useLink ( props ) ;
// profit!
- return { isExternalLink };
+ return { isExternalLink };
},
};
RouterView router-view 将显示当前 URL 的对应的路由组件。你可以把它放在任何地方,以适应你的布局。
html < router-view ></ router-view >
< router-view v-slot = " { Component, route } " >
- < component :is = " Component " />
-</ router-view >
可以查看官方文档 了解更多 RouterView 的 Porps。查看官方文档 了解 RouterView 的作用域插槽。
其他 Router Methods 查看vue-router 官方文档 了解更多。
`,65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default};
+ < component :is = " Component " />
+</ router-view >
可以查看官方文档 了解更多 RouterView 的 Porps。查看官方文档 了解 RouterView 的作用域插槽。
其他 Router Methods 查看vue-router 官方文档 了解更多。
`,65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{B as __pageData,d as default};
diff --git a/assets/reference_api_index.md.9ffa99a5.lean.js b/assets/reference_api_index.md.72b9ecff.lean.js
similarity index 51%
rename from assets/reference_api_index.md.9ffa99a5.lean.js
rename to assets/reference_api_index.md.72b9ecff.lean.js
index ce95db2b5..b8b1c4df9 100644
--- a/assets/reference_api_index.md.9ffa99a5.lean.js
+++ b/assets/reference_api_index.md.72b9ecff.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l("",65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default};
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"API","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/api/index.md"}'),o={name:"reference/api/index.md"},p=l("",65),e=[p];function t(r,c,y,D,i,F){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{B as __pageData,d as default};
diff --git a/assets/reference_cli_index.md.071789d9.lean.js b/assets/reference_cli_index.md.071789d9.lean.js
deleted file mode 100644
index ec306b0ae..000000000
--- a/assets/reference_cli_index.md.071789d9.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),e={name:"reference/cli/index.md"},p=l("",34),o=[p];function t(c,i,r,C,d,y){return a(),n("div",null,o)}const u=s(e,[["render",t]]);export{h as __pageData,u as default};
diff --git a/assets/reference_cli_index.md.071789d9.js b/assets/reference_cli_index.md.1ce50e93.js
similarity index 58%
rename from assets/reference_cli_index.md.071789d9.js
rename to assets/reference_cli_index.md.1ce50e93.js
index 62a006b9f..76319f1af 100644
--- a/assets/reference_cli_index.md.071789d9.js
+++ b/assets/reference_cli_index.md.1ce50e93.js
@@ -1,71 +1,71 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),e={name:"reference/cli/index.md"},p=l(`命令行工具 create-fes-app 通过 create-fes-app
命令创建项目模板,输入create-fes-app -h
则可以看到如下信息:
Usage: create-fes-app <name>
-
-Options:
- -v, --version Output the current version
- -h, --help Display help for command
- -f, --force Overwrite target directory if it exists
- -m, --merge Merge target directory if it exists
可以在本机安装后使用:
pnpm npm
bash # 全局安装
-pnpm global add @fesjs/create-fes-app
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),l={name:"reference/cli/index.md"},p=e(`命令行工具 create-fes-app 通过 create-fes-app
命令创建项目模板,输入create-fes-app -h
则可以看到如下信息:
Usage: create-fes-app <name>
+
+Options:
+ -v, --version Output the current version
+ -h, --help Display help for command
+ -f, --force Overwrite target directory if it exists
+ -m, --merge Merge target directory if it exists
可以在本机安装后使用:
推荐使用 pnpm create
和 npx
方式创建模板,一直使用最新的模板:
推荐使用 pnpm create
和 npx
方式创建模板,一直使用最新的模板:
fes 需要在项目根目录执行 fes
命令,输入fes -h
则可以看到如下信息:
Usage: fes <command> [options]
-
-一个好用的前端应用解决方案
-
-Options:
- -v, --vers output the current version
- -h, --help display help for command
-
-Commands:
- build build application for production
- dev [options] start a local http service for development
- help show command helps
- info print debugging information about your environment
- webpack [options] inspect webpack configurations
-
- Run fes <command> --help for detailed usage of given command.
fes dev 启动本地开发服务器进行项目的开发调试。
Usage: fes dev [options]
-
-start a local http service for development
-
-Options:
- --port http service port, like 8000
- --https whether to turn on the https service
- -h, --help display help for command
比如:
fes build 编译构建 web 产物。
Usage: fes build [options]
-
-build application for production
-
-Options:
- -h, --help display help for command
比如:
fes help 打印帮助文档。 比如:
fes info 打印当前项目的有用的环境信息,用来帮助定位问题。
Usage: fes info [options]
-
-print debugging information about your environment
-
-Options:
- -h, --help display help for command
比如:
fes webpack 查看项目使用的 webpack 配置。
Usage: fes webpack [options]
-
-inspect webpack configurations
-
-Options:
- --rule <ruleName> inspect a specific module rule
- --plugin <pluginName> inspect a specific plugin
- --rules list all module rule names
- --plugins list all plugin names
- --verbose show full function definitions in output
- -h, --help display help for command
比如:
`,34),o=[p];function t(c,i,r,C,d,y){return a(),n("div",null,o)}const u=s(e,[["render",t]]);export{h as __pageData,u as default};
+npm run dev
fes 需要在项目根目录执行 fes
命令,输入fes -h
则可以看到如下信息:
Usage: fes <command> [options]
+
+一个好用的前端应用解决方案
+
+Options:
+ -v, --vers output the current version
+ -h, --help display help for command
+
+Commands:
+ build build application for production
+ dev [options] start a local http service for development
+ help show command helps
+ info print debugging information about your environment
+ webpack [options] inspect webpack configurations
+
+ Run fes <command> --help for detailed usage of given command.
fes dev 启动本地开发服务器进行项目的开发调试。
Usage: fes dev [options]
+
+start a local http service for development
+
+Options:
+ --port http service port, like 8000
+ --https whether to turn on the https service
+ -h, --help display help for command
比如:
fes build 编译构建 web 产物。
Usage: fes build [options]
+
+build application for production
+
+Options:
+ -h, --help display help for command
比如:
fes help 打印帮助文档。 比如:
fes info 打印当前项目的有用的环境信息,用来帮助定位问题。
Usage: fes info [options]
+
+print debugging information about your environment
+
+Options:
+ -h, --help display help for command
比如:
fes webpack 查看项目使用的 webpack 配置。
Usage: fes webpack [options]
+
+inspect webpack configurations
+
+Options:
+ --rule <ruleName> inspect a specific module rule
+ --plugin <pluginName> inspect a specific plugin
+ --rules list all module rule names
+ --plugins list all plugin names
+ --verbose show full function definitions in output
+ -h, --help display help for command
比如:
`,34),o=[p];function t(c,i,r,d,b,y){return a(),n("div",null,o)}const f=s(l,[["render",t]]);export{u as __pageData,f as default};
diff --git a/assets/reference_cli_index.md.1ce50e93.lean.js b/assets/reference_cli_index.md.1ce50e93.lean.js
new file mode 100644
index 000000000..2f71f3db9
--- /dev/null
+++ b/assets/reference_cli_index.md.1ce50e93.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"命令行工具","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/cli/index.md"}'),l={name:"reference/cli/index.md"},p=e("",34),o=[p];function t(c,i,r,d,b,y){return a(),n("div",null,o)}const f=s(l,[["render",t]]);export{u as __pageData,f as default};
diff --git a/assets/reference_config_index.md.d3e13751.js b/assets/reference_config_index.md.94262ec5.js
similarity index 75%
rename from assets/reference_config_index.md.d3e13751.js
rename to assets/reference_config_index.md.94262ec5.js
index 5555d41a7..9fbb9b7eb 100644
--- a/assets/reference_config_index.md.d3e13751.js
+++ b/assets/reference_config_index.md.94262ec5.js
@@ -1,107 +1,107 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n(`配置文件 Fes.js 内置了比较通用的构建方式,如果没有个性化需求,不需要修改构建相关的配置。
配置文件解析 Fes.js 会自动解析项目根目录下的 .fes.js
文件。
最基础的配置文件是这样的:
js // .fes.js
-export default {};
可以通过环境变量 FES_ENV
进行环境差异化配置,当我们运行 FES_ENV=prod fes dev
时,Fes.js 会找到 .fes.js
和 .fes.prod.js
(可选) 的配置文件进行 deepmerge
。
配置智能提示 可以通过 defineBuildConfig
工具函数获取类型提示:
js import { defineBuildConfig } from ' @fesjs/fes ' ;
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n(`配置文件 Fes.js 内置了比较通用的构建方式,如果没有个性化需求,不需要修改构建相关的配置。
配置文件解析 Fes.js 会自动解析项目根目录下的 .fes.js
文件。
最基础的配置文件是这样的:
js // .fes.js
+export default {};
可以通过环境变量 FES_ENV
进行环境差异化配置,当我们运行 FES_ENV=prod fes dev
时,Fes.js 会找到 .fes.js
和 .fes.prod.js
(可选) 的配置文件进行 deepmerge
。
配置智能提示 可以通过 defineBuildConfig
工具函数获取类型提示:
js import { defineBuildConfig } from ' @fesjs/fes ' ;
-export default defineBuildConfig ( {} ) ;
共享配置 alias 类型: object
默认值: {}
详情:
配置别名,对引用路径进行映射。
示例:
js export default {
- alias : {
- main : ' src/assets/styles/main ' ,
- },
+export default defineBuildConfig ( {} ) ;
共享配置 alias 类型: object
默认值: {}
详情:
配置别名,对引用路径进行映射。
示例:
js export default {
+ alias : {
+ main : ' src/assets/styles/main ' ,
+ },
};
然后 import('main')
,实际上是 import('src/assets/styles/main')
。
autoprefixer js {
flexbox : ' no-2009 ' ;
-}
base 2.1.x 已废弃
2.1.x 版本请使用 router.base 代替
builder 类型: string
默认值: 如果装了多个构建,需要通过 builder 指定具体使用哪个 详情: 比如 dev 用 vite,构建用 webpack 示例: js export default {
- builder : ' webpack ' ,
-};
define 类型: object
默认值: {}
详情: 用于提供给代码中可用的变量。 示例: js export default {
- define : {
- __DEV__ : ' development ' ,
- },
-};
然后你代码里写 console.log(__DEV__)
,会被编译成 console.log('development')
。
dynamicImport 类型: boolean
默认值: false
详情:
路由是否按需加载
inlineLimit globalCSS mock 类型: object || boolean
默认值: {}
详情:
配置 mock 属性。
当 mock 为 boolean
类型时,true
表示打开 mock,false
表示关闭 mock。 当 mock 为 object
类型时,默认打开 mock。也可以通过子属性 prefix
添加过滤条件,满足条件的走 mock 文件。 示例:
js export default {
- mock : {
- prefix : ' /api/auth ' ,
- },
-};
然后所有以 /api/users
开始的请求,就能进入 mock.js 文件处理,mock.js 示例 。
mountElementId 类型: string
默认值: app
详情:
指定渲染到的 HTML 元素 id。
outputPath 类型: string
默认值: dist
详情:
指定输出路径。
TIP
不允许设定为 src
、public
、pages
等约定目录。
plugins js export default {
- plugins : [
+}
base 2.1.x 已废弃
2.1.x 版本请使用 router.base 代替
builder 类型: string
默认值: 如果装了多个构建,需要通过 builder 指定具体使用哪个 详情: 比如 dev 用 vite,构建用 webpack 示例: js export default {
+ builder : ' webpack ' ,
+};
define 类型: object
默认值: {}
详情: 用于提供给代码中可用的变量。 示例: js export default {
+ define : {
+ __DEV__ : ' development ' ,
+ },
+};
然后你代码里写 console.log(__DEV__)
,会被编译成 console.log('development')
。
dynamicImport 类型: boolean
默认值: false
详情:
路由是否按需加载
inlineLimit globalCSS mock 类型: object || boolean
默认值: {}
详情:
配置 mock 属性。
当 mock 为 boolean
类型时,true
表示打开 mock,false
表示关闭 mock。 当 mock 为 object
类型时,默认打开 mock。也可以通过子属性 prefix
添加过滤条件,满足条件的走 mock 文件。 示例:
js export default {
+ mock : {
+ prefix : ' /api/auth ' ,
+ },
+};
然后所有以 /api/users
开始的请求,就能进入 mock.js 文件处理,mock.js 示例 。
mountElementId 类型: string
默认值: app
详情:
指定渲染到的 HTML 元素 id。
outputPath 类型: string
默认值: dist
详情:
指定输出路径。
TIP
不允许设定为 src
、public
、pages
等约定目录。
plugins js export default {
+ plugins : [
// npm 依赖
- ' fes-plugin-hello ' ,
+ ' fes-plugin-hello ' ,
// 相对路径
- ' ./plugin ' ,
+ ' ./plugin ' ,
// 绝对路径
- \`\${ __dirname } /plugin.js \` ,
- ] ,
-};
proxy 类型: object
默认值: {}
详情:
配置代理能力。
示例:
js export default {
- proxy : {
- ' /v2 ' : {
- target : ' https://api.douban.com/ ' ,
- changeOrigin : true ,
- },
- },
-};
然后访问 /v2/movie/in_theaters_proxy
就能访问到 http://api.douban.com/v2/movie/in_theaters_proxy 的数据。
publicPath router singular targets terserOptions js const defaultTerserOptions = {
- compress : {
+ \`\${ __dirname } /plugin.js \` ,
+ ] ,
+};
proxy 类型: object
默认值: {}
详情:
配置代理能力。
示例:
js export default {
+ proxy : {
+ ' /v2 ' : {
+ target : ' https://api.douban.com/ ' ,
+ changeOrigin : true ,
+ },
+ },
+};
然后访问 /v2/movie/in_theaters_proxy
就能访问到 http://api.douban.com/v2/movie/in_theaters_proxy 的数据。
publicPath router singular targets terserOptions js const defaultTerserOptions = {
+ compress : {
// turn off flags with small gains to speed up minification
- arrows : false ,
- collapse_vars : false , // 0.3kb
- comparisons : false ,
- computed_props : false ,
- hoist_funs : false ,
- hoist_props : false ,
- hoist_vars : false ,
- inline : false ,
- loops : false ,
- negate_iife : false ,
- properties : false ,
- reduce_funcs : false ,
- reduce_vars : false ,
- switches : false ,
- toplevel : false ,
- typeofs : false ,
+ arrows : false ,
+ collapse_vars : false , // 0.3kb
+ comparisons : false ,
+ computed_props : false ,
+ hoist_funs : false ,
+ hoist_props : false ,
+ hoist_vars : false ,
+ inline : false ,
+ loops : false ,
+ negate_iife : false ,
+ properties : false ,
+ reduce_funcs : false ,
+ reduce_vars : false ,
+ switches : false ,
+ toplevel : false ,
+ typeofs : false ,
// a few flags with noticeable gains/speed ratio
// numbers based on out of the box vendor bundle
- booleans : true , // 0.7kb
- if_return : true , // 0.4kb
- sequences : true , // 0.7kb
- unused : true , // 2.3kb
+ booleans : true , // 0.7kb
+ if_return : true , // 0.4kb
+ sequences : true , // 0.7kb
+ unused : true , // 2.3kb
// required features to drop conditional branches
- conditionals : true ,
- dead_code : true ,
- evaluate : true ,
- },
- mangle : {
- safari10 : true ,
- },
+ conditionals : true ,
+ dead_code : true ,
+ evaluate : true ,
+ },
+ mangle : {
+ safari10 : true ,
+ },
};
title webpack 专属配置 analyze js {
- analyzerMode : process . env . ANALYZE_MODE || ' server ' ,
- analyzerPort : process . env . ANALYZE_PORT || 8888 ,
- openAnalyzer : process . env . ANALYZE_OPEN !== ' none ' ,
+ analyzerMode : process . env . ANALYZE_MODE || ' server ' ,
+ analyzerPort : process . env . ANALYZE_PORT || 8888 ,
+ openAnalyzer : process . env . ANALYZE_OPEN !== ' none ' ,
// generate stats file while ANALYZE_DUMP exist
- generateStatsFile : !! process . env . ANALYZE_DUMP ,
- statsFilename : process . env . ANALYZE_DUMP || ' stats.json ' ,
- logLevel : process . env . ANALYZE_LOG_LEVEL || ' info ' ,
+ generateStatsFile : !! process . env . ANALYZE_DUMP ,
+ statsFilename : process . env . ANALYZE_DUMP || ' stats.json ' ,
+ logLevel : process . env . ANALYZE_LOG_LEVEL || ' info ' ,
defaultSizes : ' parsed ' // stat // gzip
-}
chainWebpack 示例:
js export default {
- chainWebpack ( memo , { env , webpack }) {
+}
chainWebpack 示例:
js export default {
+ chainWebpack ( memo , { env , webpack }) {
// 删除 fes 内置插件
- memo . plugins . delete ( ' copy ' ) ;
+ memo . plugins . delete ( ' copy ' ) ;
},
-};
cssLoader copy js export default {
- copy : {
- from : ' /src/assets/images ' ,
- to : ' assets/images ' ,
- },
-};
上面示例中,实现了将 cwd
路径中的 /src/assets/images
文件夹,在编译完成后,copy
到输出路径下的 assets/images
文件夹。
devServer cssLoader copy js export default {
+ copy : {
+ from : ' /src/assets/images ' ,
+ to : ' assets/images ' ,
+ },
+};
上面示例中,实现了将 cwd
路径中的 /src/assets/images
文件夹,在编译完成后,copy
到输出路径下的 assets/images
文件夹。
devServer js export default {
// 配置 mini-css-extract-plugin
- extraCSS : {
- loader : {
- publicPath : ( resourcePath , context ) => \`\${ path . relative (path . dirname (resourcePath) , context) } / \` ,
- },
- },
-};
exportStatic 配置 html
的输出形式,默认只输出 index.html
。
如果开启 exportStatic
,则会针对每个路由输出 html
文件。
比如以下路由,
不开启 exportStatic
时,输出,
设置 exportStatic: {}
后,输出,
- index.html
-- users.html
-- list.html
externals 示例:
js export default {
- externals : {
- vue : ' window.Vue ' ,
- },
-};
配置额外的 babel
插件。
js export default {
- extraBabelPlugins : [[ ' import ' , { libraryName : ' ant-design-vue ' , libraryDirectory : ' es ' , style : ' css ' } ]] ,
-};
配置额外的 babel
插件集。
html lessLoader postcssLoader vueLoader Vite 专属配置 viteOption viteVuePlugin viteVueJsx viteLegacy viteHtml 更多配置项 Fes.js 允许插件注册配置,如果你使用插件,肯定会在插件里找到更多配置项。
`,134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const A=s(o,[["render",t]]);export{C as __pageData,A as default};
+ extraCSS : {
+ loader : {
+ publicPath : ( resourcePath , context ) => \`\${ path . relative (path . dirname (resourcePath) , context) } / \` ,
+ },
+ },
+};
exportStatic 配置 html
的输出形式,默认只输出 index.html
。
如果开启 exportStatic
,则会针对每个路由输出 html
文件。
比如以下路由,
不开启 exportStatic
时,输出,
设置 exportStatic: {}
后,输出,
- index.html
+- users.html
+- list.html
externals 示例:
js export default {
+ externals : {
+ vue : ' window.Vue ' ,
+ },
+};
配置额外的 babel
插件。
js export default {
+ extraBabelPlugins : [[ ' import ' , { libraryName : ' ant-design-vue ' , libraryDirectory : ' es ' , style : ' css ' } ]] ,
+};
配置额外的 babel
插件集。
html lessLoader postcssLoader vueLoader Vite 专属配置 viteOption viteVuePlugin viteVueJsx viteLegacy viteHtml 更多配置项 Fes.js 允许插件注册配置,如果你使用插件,肯定会在插件里找到更多配置项。
`,134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const B=s(o,[["render",t]]);export{u as __pageData,B as default};
diff --git a/assets/reference_config_index.md.94262ec5.lean.js b/assets/reference_config_index.md.94262ec5.lean.js
new file mode 100644
index 000000000..c16bf1cec
--- /dev/null
+++ b/assets/reference_config_index.md.94262ec5.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n("",134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const B=s(o,[["render",t]]);export{u as __pageData,B as default};
diff --git a/assets/reference_config_index.md.d3e13751.lean.js b/assets/reference_config_index.md.d3e13751.lean.js
deleted file mode 100644
index 49e186481..000000000
--- a/assets/reference_config_index.md.d3e13751.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"","description":"","frontmatter":{"aside":"left","outline":[2,3]},"headers":[],"relativePath":"reference/config/index.md"}'),o={name:"reference/config/index.md"},e=n("",134),p=[e];function t(c,r,i,D,y,F){return a(),l("div",null,p)}const A=s(o,[["render",t]]);export{C as __pageData,A as default};
diff --git a/assets/reference_plugin_dev_api.md.b4efeb0f.js b/assets/reference_plugin_dev_api.md.2d7e42be.js
similarity index 67%
rename from assets/reference_plugin_dev_api.md.b4efeb0f.js
rename to assets/reference_plugin_dev_api.md.2d7e42be.js
index 7cd3d24c6..191b6dc61 100644
--- a/assets/reference_plugin_dev_api.md.b4efeb0f.js
+++ b/assets/reference_plugin_dev_api.md.2d7e42be.js
@@ -1,97 +1,97 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l(`插件 API 属性 api.paths 一些关键的路径:
cwd,执行命令的绝对路径 absNodeModulesPath,nodeModule 的绝对路径 absOutputPath,输出 build
产物的绝对路径 absSrcPath,src
目录的绝对路径 absPagesPath,pages
目录的绝对路径 absTmpPath,.fes
临时文件目录的绝对路径 api.cwd 执行命令的绝对路径
api.pkg package.json
的内容
api.configInstance config
实例
userConfig 用户配置
config 插件配置可被修改,此为最终的配置
env process.env
args 环境变量
核心方法 describe 注册阶段执行,用于描述插件或插件集的 id、key、配置信息、启用方式等。
用法:describe({ id?: string, key?: string, config?: { default, schema, onChange } }, enableBy?)
例如:
js api . describe ( {
- key : ' esbuild ' ,
- config : {
- schema ( joi ) {
- return joi . object () ;
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l(`插件 API 属性 api.paths 一些关键的路径:
cwd,执行命令的绝对路径 absNodeModulesPath,nodeModule 的绝对路径 absOutputPath,输出 build
产物的绝对路径 absSrcPath,src
目录的绝对路径 absPagesPath,pages
目录的绝对路径 absTmpPath,.fes
临时文件目录的绝对路径 api.cwd 执行命令的绝对路径
api.pkg package.json
的内容
api.configInstance config
实例
userConfig 用户配置
config 插件配置可被修改,此为最终的配置
env process.env
args 环境变量
核心方法 describe 注册阶段执行,用于描述插件或插件集的 id、key、配置信息、启用方式等。
用法:describe({ id?: string, key?: string, config?: { default, schema, onChange } }, enableBy?)
例如:
js api . describe ( {
+ key : ' esbuild ' ,
+ config : {
+ schema ( joi ) {
+ return joi . object () ;
},
- default : {},
- },
- enableBy : api . EnableBy . config ,
-} ) ;
注:
config.default
为配置的默认值,用户没有配置时取这个config.schema
用于声明配置的类型,基于 joi ,如果你希望用户进行配置,这个是必须的,否则用户的配置无效config.onChange
是 dev
阶段配置被修改后的处理机制,默认会重启 dev 进程,也可以修改为 api.ConfigChangeType.regenerateTmpFiles 只重新生成临时文件,还可以通过函数的格式自定义enableBy
为启用方式,默认是注册启用,可更改为 api.EnableBy.config
,还可以用自定义函数的方式决定其启用时机(动态生效)register 为 api.applyPlugins 注册可供其使用的 hook。
用法:register({ key: string, fn: Function, pluginId?: string, before?: string, stage?: number })
参数:
key:唯一 id fn:hook 函数,当执行api.applyPlugins
时,此函数被执行。 pluginId:插件 id,如果配置了插件 id,则只有此插件未被禁用时,才会执行。 js // 可同步
-api . register ( {
- key : ' foo ' ,
- fn () {
+ default : {},
+ },
+ enableBy : api . EnableBy . config ,
+} ) ;
注:
config.default
为配置的默认值,用户没有配置时取这个config.schema
用于声明配置的类型,基于 joi ,如果你希望用户进行配置,这个是必须的,否则用户的配置无效config.onChange
是 dev
阶段配置被修改后的处理机制,默认会重启 dev 进程,也可以修改为 api.ConfigChangeType.regenerateTmpFiles 只重新生成临时文件,还可以通过函数的格式自定义enableBy
为启用方式,默认是注册启用,可更改为 api.EnableBy.config
,还可以用自定义函数的方式决定其启用时机(动态生效)register 为 api.applyPlugins 注册可供其使用的 hook。
用法:register({ key: string, fn: Function, pluginId?: string, before?: string, stage?: number })
参数:
key:唯一 id fn:hook 函数,当执行api.applyPlugins
时,此函数被执行。 pluginId:插件 id,如果配置了插件 id,则只有此插件未被禁用时,才会执行。 js // 可同步
+api . register ( {
+ key : ' foo ' ,
+ fn () {
return ' a ' ;
},
-} ) ;
+} ) ;
// 可异步
-api . register ( {
- key : ' foo ' ,
- async fn () {
+api . register ( {
+ key : ' foo ' ,
+ async fn () {
await delay ( 100 ) ;
return ' b ' ;
},
-} ) ;
注意:
fn 支持同步和异步,异步通过 Promise,返回值为 Promise 即为异步 fn 里的内容需结合 api.appyPlugins
的 type
参数来看,如果是 api.ApplyPluginsType.add
,需有返回值,这些返回值最终会被合成一个数组。如果是 api.ApplyPluginsType.modify
,需对第一个参数做修改,并返回它,它会作为下个 hook 的参数。 如果是 api.ApplyPluginsType.event
,无需返回值 stage 和 before 都是用于调整执行顺序的,参考 tapable stage 默认是 0,设为 -1 或更少会提前执行,设为 1 或更多会后置执行 applyPlugins 取得 register 注册的 hooks 执行后的数据。
用法:applyPlugins({ key: string, type: api.ApplyPluginsType, initialValue?: any, args?: any })
参数:
key:唯一 id type:hook 的类型。 initialValue:初始值。 args:参数,hook 函数执行时,args 会作为参数传入。 例如:
js const foo = await api . applyPlugins ( {
- key : ' foo ' ,
- type : api . ApplyPluginsType . add ,
- initialValue : [] ,
-} ) ;
-console . log (foo) ; // ['a', 'b']
api.ApplyPluginsType 编译时插件 hook 执行类型,enum 类型,包含三个属性:
compose,用于合并执行多个函数,函数可决定前序函数的执行时机 modify,用于修改值 event,用于执行事件,前面没有依赖关系 registerMethod 往 api
上注册方法。如果有提供 fn
,则执行 fn
定义的函数。
用法:registerMethod({ name: string, fn?: Function, exitsError?: boolean })
例如:
js api . registerMethod ( {
- name : ' writeTmpFile ' ,
- fn ({ path , content }) {
- assert ( api . stage >= api . ServiceStage . pluginReady , ' api.writeTmpFile() should not execute in register stage. ' ) ;
- const absPath = join ( api . paths . absTmpPath , path ) ;
- api . utils . mkdirp . sync ( dirname ( absPath )) ;
- if ( ! existsSync ( absPath ) || readFileSync ( absPath , ' utf-8 ' ) !== content ) {
- writeFileSync ( absPath , content , ' utf-8 ' ) ;
+} ) ;
注意:
fn 支持同步和异步,异步通过 Promise,返回值为 Promise 即为异步 fn 里的内容需结合 api.appyPlugins
的 type
参数来看,如果是 api.ApplyPluginsType.add
,需有返回值,这些返回值最终会被合成一个数组。如果是 api.ApplyPluginsType.modify
,需对第一个参数做修改,并返回它,它会作为下个 hook 的参数。 如果是 api.ApplyPluginsType.event
,无需返回值 stage 和 before 都是用于调整执行顺序的,参考 tapable stage 默认是 0,设为 -1 或更少会提前执行,设为 1 或更多会后置执行 applyPlugins 取得 register 注册的 hooks 执行后的数据。
用法:applyPlugins({ key: string, type: api.ApplyPluginsType, initialValue?: any, args?: any })
参数:
key:唯一 id type:hook 的类型。 initialValue:初始值。 args:参数,hook 函数执行时,args 会作为参数传入。 例如:
js const foo = await api . applyPlugins ( {
+ key : ' foo ' ,
+ type : api . ApplyPluginsType . add ,
+ initialValue : [] ,
+} ) ;
+console . log (foo) ; // ['a', 'b']
api.ApplyPluginsType 编译时插件 hook 执行类型,enum 类型,包含三个属性:
compose,用于合并执行多个函数,函数可决定前序函数的执行时机 modify,用于修改值 event,用于执行事件,前面没有依赖关系 registerMethod 往 api
上注册方法。如果有提供 fn
,则执行 fn
定义的函数。
用法:registerMethod({ name: string, fn?: Function, exitsError?: boolean })
例如:
js api . registerMethod ( {
+ name : ' writeTmpFile ' ,
+ fn ({ path , content }) {
+ assert ( api . stage >= api . ServiceStage . pluginReady , ' api.writeTmpFile() should not execute in register stage. ' ) ;
+ const absPath = join ( api . paths . absTmpPath , path ) ;
+ api . utils . mkdirp . sync ( dirname ( absPath )) ;
+ if ( ! existsSync ( absPath ) || readFileSync ( absPath , ' utf-8 ' ) !== content ) {
+ writeFileSync ( absPath , content , ' utf-8 ' ) ;
}
},
-} ) ;
然后在插件中可以使用:
registerCommand 注册命令,基于 commander 实现的机制。
用法:registerCommand({ command: string, description: string, fn: Function, options?: Object })
参数:
command description,描述文字,输入 --help
会打印 fn,命令执行的函数,参数有: rawArgv,原始参数 args,参数 options,执行命令时附带的的参数配置 program,commander 对象 options,参数配置,基于 commander 。 例如:
js api . registerCommand ( {
- command : ' webpack ' ,
- description : ' inspect webpack configurations ' ,
- options : [
- {
- name : ' --rule <ruleName> ' ,
- description : ' inspect a specific module rule ' ,
- },
- {
- name : ' --plugin <pluginName> ' ,
- description : ' inspect a specific plugin ' ,
- },
- {
- name : ' --rules ' ,
- description : ' list all module rule names ' ,
- },
- {
- name : ' --plugins ' ,
- description : ' list all plugin names ' ,
- },
- {
- name : ' --verbose ' ,
- description : ' show full function definitions in output ' ,
- },
- ] ,
- async fn ({ rawArgv , args , options , program }) {},
-} ) ;
当项目引入此插件后,使用:
registerPresets 注册插件集,参数为路径数组。
用法:registerPresets(presets: string[])
例如:
js api . registerPresets ([ { id : ' preset_2 ' , key : ' preset2 ' , apply : () => () => {} }, require . resolve ( ' ./preset_3 ' )]) ;
registerPlugins 注册插件,参数为路径数组。
用法:registerPlugins(plugins: string[])
例如:
js api . registerPlugins ([ { id : ' preset_2 ' , key : ' preset2 ' , apply : () => () => {} }, require . resolve ( ' ./preset_3 ' )]) ;
hasPlugins 判断是否有注册某个插件,插件的 id 规则:
id 默认为包名 内置插件以 @@
为前缀,比如 @@/registerMethod
用法:hasPlugins(pluginIds: string[])
例如
js // 判断是否有注册 @fesjs/plugin-locale
-api . hasPlugins ([ ' @fesjs/plugin-locale ' ]) ;
TIP
如果在注册阶段使用,只能判断在他之前是否有注册某个插件。
hasPresets 判断是否有注册某个插件集。
用法:hasPresets(presetIds: string[])
例如
js // 判断是否有注册
-api . hasPlugins ([ ' @fesjs/preset-xxx ' ]) ;
TIP
如果在注册阶段使用,只能判断在他之前是否有注册某个插件集。
skipPlugins 声明哪些插件需要被禁用,参数为插件 id 的数组。
用法:hasPresets(presetIds: string[])
例如:
js // 禁用 plugin-model 插件
-api . skipPlugins ([ ' @fesjs/plugin-model ' ]) ;
扩展方法 通过 api.registerMethod() 扩展的方法。
addPluginExports 把插件需要导出的运行时 API 写入@fesjs/fes
。
js api . addPluginExports ( () => [
- {
- specifiers : [ ' access ' , ' useAccess ' ] ,
- source : absoluteFilePath ,
- },
-]) ;
这样用户使用时:
js import { access , useAccess } from ' @fesjs/fes ' ;
addCoreExports 提供给其他插件运行时需要的 API。
js api . addCoreExports ( () => [
- {
- specifiers : [ ' getRoutes ' ] ,
- source : absCoreFilePath ,
- },
-]) ;
使用:
js import { getHistory , destroyRouter } from ' @@/core/coreExports ' ;
addRuntimePlugin 添加运行时插件,返回值格式为表示文件路径的字符串。
例如:
js api . addRuntimePlugin ( () => join (__dirname , ' ./runtime ' )) ;
addRuntimePluginKey 添加插件提供的运行时配置的 key,返回值格式为字符串。
例如:
js api . addRuntimePluginKey ( () => ' some ' ) ;
则用户可以:
js // app.js
-const some = function () {
+} ) ;
然后在插件中可以使用:
registerCommand 注册命令,基于 commander 实现的机制。
用法:registerCommand({ command: string, description: string, fn: Function, options?: Object })
参数:
command description,描述文字,输入 --help
会打印 fn,命令执行的函数,参数有: rawArgv,原始参数 args,参数 options,执行命令时附带的的参数配置 program,commander 对象 options,参数配置,基于 commander 。 例如:
js api . registerCommand ( {
+ command : ' webpack ' ,
+ description : ' inspect webpack configurations ' ,
+ options : [
+ {
+ name : ' --rule <ruleName> ' ,
+ description : ' inspect a specific module rule ' ,
+ },
+ {
+ name : ' --plugin <pluginName> ' ,
+ description : ' inspect a specific plugin ' ,
+ },
+ {
+ name : ' --rules ' ,
+ description : ' list all module rule names ' ,
+ },
+ {
+ name : ' --plugins ' ,
+ description : ' list all plugin names ' ,
+ },
+ {
+ name : ' --verbose ' ,
+ description : ' show full function definitions in output ' ,
+ },
+ ] ,
+ async fn ({ rawArgv , args , options , program }) {},
+} ) ;
当项目引入此插件后,使用:
registerPresets 注册插件集,参数为路径数组。
用法:registerPresets(presets: string[])
例如:
js api . registerPresets ([ { id : ' preset_2 ' , key : ' preset2 ' , apply : () => () => {} }, require . resolve ( ' ./preset_3 ' )]) ;
registerPlugins 注册插件,参数为路径数组。
用法:registerPlugins(plugins: string[])
例如:
js api . registerPlugins ([ { id : ' preset_2 ' , key : ' preset2 ' , apply : () => () => {} }, require . resolve ( ' ./preset_3 ' )]) ;
hasPlugins 判断是否有注册某个插件,插件的 id 规则:
id 默认为包名 内置插件以 @@
为前缀,比如 @@/registerMethod
用法:hasPlugins(pluginIds: string[])
例如
js // 判断是否有注册 @fesjs/plugin-locale
+api . hasPlugins ([ ' @fesjs/plugin-locale ' ]) ;
TIP
如果在注册阶段使用,只能判断在他之前是否有注册某个插件。
hasPresets 判断是否有注册某个插件集。
用法:hasPresets(presetIds: string[])
例如
js // 判断是否有注册
+api . hasPlugins ([ ' @fesjs/preset-xxx ' ]) ;
TIP
如果在注册阶段使用,只能判断在他之前是否有注册某个插件集。
skipPlugins 声明哪些插件需要被禁用,参数为插件 id 的数组。
用法:hasPresets(presetIds: string[])
例如:
js // 禁用 plugin-model 插件
+api . skipPlugins ([ ' @fesjs/plugin-model ' ]) ;
扩展方法 通过 api.registerMethod() 扩展的方法。
addPluginExports 把插件需要导出的运行时 API 写入@fesjs/fes
。
js api . addPluginExports ( () => [
+ {
+ specifiers : [ ' access ' , ' useAccess ' ] ,
+ source : absoluteFilePath ,
+ },
+]) ;
这样用户使用时:
js import { access , useAccess } from ' @fesjs/fes ' ;
addCoreExports 提供给其他插件运行时需要的 API。
js api . addCoreExports ( () => [
+ {
+ specifiers : [ ' getRoutes ' ] ,
+ source : absCoreFilePath ,
+ },
+]) ;
使用:
js import { getHistory , destroyRouter } from ' @@/core/coreExports ' ;
addRuntimePlugin 添加运行时插件,返回值格式为表示文件路径的字符串。
例如:
js api . addRuntimePlugin ( () => join (__dirname , ' ./runtime ' )) ;
addRuntimePluginKey 添加插件提供的运行时配置的 key,返回值格式为字符串。
例如:
js api . addRuntimePluginKey ( () => ' some ' ) ;
则用户可以:
js // app.js
+const some = function () {
return {};
-};
addEntryImportsAhead 在入口文件现有 import 的前面添加 import。
例如:
js api . addEntryImportsAhead ( () => [ { source : ' anypackage ' } ]) ;
addEntryImports 在入口文件现有 import 的后面添加 import。
例如:
js api . addEntryImport ( () => {
+};
addEntryImportsAhead 在入口文件现有 import 的前面添加 import。
例如:
js api . addEntryImportsAhead ( () => [ { source : ' anypackage ' } ]) ;
addEntryImports 在入口文件现有 import 的后面添加 import。
例如:
js api . addEntryImport ( () => {
return [
{
source : ' /modulePath/xxx.js ' ,
specifier : ' moduleName ' ,
},
] ;
-} ) ;
addEntryCodeAhead 在入口文件最前面(import 之后)添加代码。
例如:
js api . addEntryCodeAhead (
- () => \`\${ globalCSSFile
- . map ( file => \` require(' \${ winPath ( relative (absTmpPath , file)) } '); \` )
- . join ( '' ) }\`
addEntryCode 在入口文件最后添加代码。
例如:
js api . addEntryCode ( () => {
+} ) ;
addEntryCodeAhead 在入口文件最前面(import 之后)添加代码。
例如:
js api . addEntryCodeAhead (
+ () => \`\${ globalCSSFile
+ . map ( file => \` require(' \${ winPath ( relative (absTmpPath , file)) } '); \` )
+ . join ( '' ) }\`
addEntryCode 在入口文件最后添加代码。
例如:
js api . addEntryCode ( () => {
return \` console.log('works!') \` ;
-} ) ;
addHTMLHeadScripts 在 HTML 头部添加脚本。
例如:
js api . addHTMLHeadScripts ( () => {
+} ) ;
addHTMLHeadScripts 在 HTML 头部添加脚本。
例如:
js api . addHTMLHeadScripts ( () => {
return [
{
content : '' ,
@@ -99,60 +99,60 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
// ...attrs
},
] ;
-} ) ;
addBeforeMiddlewares 添加在 webpack compiler
中间件之前的中间件,返回值格式为 express
中间件。
例如:
js api . addBeforeMiddlewares ( () => {
- return ( req , res , next ) => {
+} ) ;
addBeforeMiddlewares 添加在 webpack compiler
中间件之前的中间件,返回值格式为 express
中间件。
例如:
js api . addBeforeMiddlewares ( () => {
+ return ( req , res , next ) => {
if ( false ) {
- res . end ( ' end ' ) ;
+ res . end ( ' end ' ) ;
} else {
next () ;
}
};
-} ) ;
addMiddlewares 添加在 webpack compiler
中间件之后的中间件,返回值格式为 express
中间件。
addTmpGenerateWatcherPaths 添加重新生成临时文件的监听路径。
例如:
js api . addTmpGenerateWatcherPaths ( () => [ ' ./app.js ' ]) ;
chainWebpack 通过 [webpack-chain] 的方式修改 webpack 配置。
例如:
js api . chainWebpack ( ( memo ) => {
- memo . resolve . alias . set ( ' vue-i18n ' , ' vue-i18n/dist/vue-i18n.esm-bundler.js ' ) ;
-} ) ;
copyTmpFiles 批量写临时文件。
例如:
js api . copyTmpFiles ( {
- namespace ,
- path : join (__dirname , ' runtime ' ) ,
- ignore : [ ' .tpl ' ] ,
-} ) ;
参数:
namespace:复制到临时文件夹下的目标目录 path:需要复制的文件目录 ignore:需要排除的文件 TIP
不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack
的重新编译
getPort 获取端口号,dev 时有效。
getHostname 获取 hostname,dev 时有效。
getServer 获取 devServer,dev 时有效。
getRoutes 获取 api.modifyRoutes
修改过后的路由信息。
getRoutesJSON 获取格式化后的路由信息
modifyRoutes 修改路由。
例如:
js // 把BaseLayout插入到路由配置中,作为根路由
-api . modifyRoutes ( ( routes ) => [
- {
- path : ' / ' ,
- component : winPath ( join (api . paths . absTmpPath || '' , absFilePath)) ,
- children : routes ,
- },
-]) ;
modifyBundleConfigOpts 修改获取 bundleConfig 的函数参数。
例如:
js api . modifyBundleConfigOpts ( ( memo ) => {
- memo . miniCSSExtractPluginPath = require . resolve ( ' mini-css-extract-plugin ' ) ;
- memo . miniCSSExtractPluginLoaderPath = require . resolve ( ' mini-css-extract-plugin/dist/loader ' ) ;
- return memo ;
-} ) ;
modifyBundleConfig 修改 bundle 配置。
js api . modifyBundleConfig ( ( bundleConfig ) => {
+} ) ;
addMiddlewares 添加在 webpack compiler
中间件之后的中间件,返回值格式为 express
中间件。
addTmpGenerateWatcherPaths 添加重新生成临时文件的监听路径。
例如:
js api . addTmpGenerateWatcherPaths ( () => [ ' ./app.js ' ]) ;
chainWebpack 通过 [webpack-chain] 的方式修改 webpack 配置。
例如:
js api . chainWebpack ( ( memo ) => {
+ memo . resolve . alias . set ( ' vue-i18n ' , ' vue-i18n/dist/vue-i18n.esm-bundler.js ' ) ;
+} ) ;
copyTmpFiles 批量写临时文件。
例如:
js api . copyTmpFiles ( {
+ namespace ,
+ path : join (__dirname , ' runtime ' ) ,
+ ignore : [ ' .tpl ' ] ,
+} ) ;
参数:
namespace:复制到临时文件夹下的目标目录 path:需要复制的文件目录 ignore:需要排除的文件 TIP
不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack
的重新编译
getPort 获取端口号,dev 时有效。
getHostname 获取 hostname,dev 时有效。
getServer 获取 devServer,dev 时有效。
getRoutes 获取 api.modifyRoutes
修改过后的路由信息。
getRoutesJSON 获取格式化后的路由信息
modifyRoutes 修改路由。
例如:
js // 把BaseLayout插入到路由配置中,作为根路由
+api . modifyRoutes ( ( routes ) => [
+ {
+ path : ' / ' ,
+ component : winPath ( join (api . paths . absTmpPath || '' , absFilePath)) ,
+ children : routes ,
+ },
+]) ;
modifyBundleConfigOpts 修改获取 bundleConfig 的函数参数。
例如:
js api . modifyBundleConfigOpts ( ( memo ) => {
+ memo . miniCSSExtractPluginPath = require . resolve ( ' mini-css-extract-plugin ' ) ;
+ memo . miniCSSExtractPluginLoaderPath = require . resolve ( ' mini-css-extract-plugin/dist/loader ' ) ;
+ return memo ;
+} ) ;
modifyBundleConfig 修改 bundle 配置。
js api . modifyBundleConfig ( ( bundleConfig ) => {
// do something
- return bundleConfig ;
-} ) ;
modifyBabelOpts 修改 babel 配置项。
例如:
js api . modifyBabelOpts ( ( babelOpts ) => {
- if ( api . config . babelPluginImport ) {
- api . config . babelPluginImport . forEach ( ( config ) => {
- babelOpts . plugins . push ([ ' import ' , config ]) ;
+ return bundleConfig ;
+} ) ;
modifyBabelOpts 修改 babel 配置项。
例如:
js api . modifyBabelOpts ( ( babelOpts ) => {
+ if ( api . config . babelPluginImport ) {
+ api . config . babelPluginImport . forEach ( ( config ) => {
+ babelOpts . plugins . push ([ ' import ' , config ]) ;
} ) ;
}
- return babelOpts ;
-} ) ;
modifyBabelPresetOpts 修改 babel 插件的配置。
例如:
js api . modifyBabelPresetOpts ( ( opts ) => {
+ return babelOpts ;
+} ) ;
modifyBabelPresetOpts 修改 babel 插件的配置。
例如:
js api . modifyBabelPresetOpts ( ( opts ) => {
return {
- ... opts ,
+ ... opts ,
};
-} ) ;
modifyPaths 修改 paths 对象。
modifyDefaultConfig 修改默认配置。 例如:
js api . modifyDefaultConfig ( ( memo ) => {
+} ) ;
modifyPaths 修改 paths 对象。
modifyDefaultConfig 修改默认配置。 例如:
js api . modifyDefaultConfig ( ( memo ) => {
return {
- ... memo ,
- ... defaultOptions ,
+ ... memo ,
+ ... defaultOptions ,
};
-} ) ;
modifyConfig 修改最终配置。
例如:
js api . modifyConfig ( ( memo ) => {
+} ) ;
modifyConfig 修改最终配置。
例如:
js api . modifyConfig ( ( memo ) => {
return {
- ... memo ,
- ... defaultOptions ,
+ ... memo ,
+ ... defaultOptions ,
};
-} ) ;
modifyPublicPathStr 修改 publicPath 字符串。
例如:
js api . modifyPublicPathStr ( () => {
- return api . config . publicPath || ' / ' ;
-} ) ;
onPluginReady 在插件初始化完成触发。在 onStart 之前,此时还没有 config 和 paths,他们尚未解析好。
onStart 在命令注册函数执行前触发。可以使用 config 和 paths。
onExit dev 退出时触发。
onGenerateFiles 生成临时文件,触发时机在 webpack 编译之前。
restartServer 重启 devServer,dev 时有效。
writeTmpFile 写临时文件。
例如:
js api . writeTmpFile ( {
- path : absoluteFilePath ,
- content : Mustache . render ( readFileSync ( join (__dirname , ' runtime/core.tpl ' ) , ' utf-8 ' ) , {
- REPLACE_ROLES : JSON . stringify (roles) ,
- } ) ,
-} ) ;
参数:
path:相对于临时文件夹的路径 content:文件内容 TIP
不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译
`,211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+} ) ;
modifyPublicPathStr 修改 publicPath 字符串。
例如:
js api . modifyPublicPathStr ( () => {
+ return api . config . publicPath || ' / ' ;
+} ) ;
onPluginReady 在插件初始化完成触发。在 onStart 之前,此时还没有 config 和 paths,他们尚未解析好。
onStart 在命令注册函数执行前触发。可以使用 config 和 paths。
onExit dev 退出时触发。
onGenerateFiles 生成临时文件,触发时机在 webpack 编译之前。
restartServer 重启 devServer,dev 时有效。
writeTmpFile 写临时文件。
例如:
js api . writeTmpFile ( {
+ path : absoluteFilePath ,
+ content : Mustache . render ( readFileSync ( join (__dirname , ' runtime/core.tpl ' ) , ' utf-8 ' ) , {
+ REPLACE_ROLES : JSON . stringify (roles) ,
+ } ) ,
+} ) ;
参数:
path:相对于临时文件夹的路径 content:文件内容 TIP
不能在注册阶段使用,通常放在 api.onGenerateFiles() 里,这样能在需要时重新生成临时文件 临时文件的写入做了缓存处理,如果内容一致,不会做写的操作,以减少触发 webpack 的重新编译
`,211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{d as __pageData,A as default};
diff --git a/assets/reference_plugin_dev_api.md.b4efeb0f.lean.js b/assets/reference_plugin_dev_api.md.2d7e42be.lean.js
similarity index 50%
rename from assets/reference_plugin_dev_api.md.b4efeb0f.lean.js
rename to assets/reference_plugin_dev_api.md.2d7e42be.lean.js
index dfe8e2018..ee98b8486 100644
--- a/assets/reference_plugin_dev_api.md.b4efeb0f.lean.js
+++ b/assets/reference_plugin_dev_api.md.2d7e42be.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l("",211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"插件 API","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/api.md"}'),p={name:"reference/plugin/dev/api.md"},o=l("",211),e=[o];function t(c,r,y,D,F,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{d as __pageData,A as default};
diff --git a/assets/reference_plugin_dev_index.md.eb394b31.js b/assets/reference_plugin_dev_index.md.1a7b2210.js
similarity index 82%
rename from assets/reference_plugin_dev_index.md.eb394b31.js
rename to assets/reference_plugin_dev_index.md.1a7b2210.js
index 4fd0deb7c..064bcd746 100644
--- a/assets/reference_plugin_dev_index.md.eb394b31.js
+++ b/assets/reference_plugin_dev_index.md.1a7b2210.js
@@ -1,12 +1,12 @@
-import{_ as s,o as a,c as e,V as n}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n(`插件介绍 开始 一个插件是一个 npm
包,它能够为 Fes.js 创建的项目添加额外的功能,这些功能包括:
项目的 webpack 配置。 修改项目的 babel 配置。 添加新的 fes 命令 - 例如 @fes/plugin-jest
添加了 fes test
命令,允许开发者运行单元测试。 集成 Vue 的插件。 修改路由配置 提供运行时 API ... 插件的入口是一个函数,函数会以 API 对象作为第一个参数:
js export default ( api ) => {
- api . describe ( {
+import{_ as s,o as a,c as e,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n(`插件介绍 开始 一个插件是一个 npm
包,它能够为 Fes.js 创建的项目添加额外的功能,这些功能包括:
项目的 webpack 配置。 修改项目的 babel 配置。 添加新的 fes 命令 - 例如 @fes/plugin-jest
添加了 fes test
命令,允许开发者运行单元测试。 集成 Vue 的插件。 修改路由配置 提供运行时 API ... 插件的入口是一个函数,函数会以 API 对象作为第一个参数:
js export default ( api ) => {
+ api . describe ( {
key : ' esbuild ' ,
config : {
- schema ( joi ) {
- return joi . object () ;
+ schema ( joi ) {
+ return joi . object () ;
},
default : {},
},
- enableBy : api . EnableBy . config ,
+ enableBy : api . EnableBy . config ,
} ) ;
-};
API 对象是构建流程管理 Service 类的实例,api 提供一些有用的方法帮助你开发插件。
api.describe
用来描述插件:
key , 插件的 key
,可以理解为插件的名称,在 .fes.js
中用 key
配置此插件。config ,插件的配置信息: schema,定义配置的类型 default,默认配置 enableBy , 是否开启插件,可配置某些场景下禁用插件。创建插件 第一步:安装create-fes-app
bash npm i -g @fesjs/create-fes-app
第二步:创建插件项目 bash create-fes-app pluginName
在询问Pick an template
时选择Plugin
!
第三步:进入插件目录 & 安装依赖 bash cd pluginName & pnpm i
第四步:启动编译 第五步:使用插件 API 完成你的插件!(可以参考其他插件理解 api 用法和场景) 发布到 npm 以 @fesjs/preset-
、@fesjs/plugin-
、@webank/fes-preset-
、@webank/fes-plugin-
、fes-preset-
和 fes-plugin-
开头的依赖会被 Fes.js 自动注册为插件或插件集。
所以编写好的插件想发布到 npm 供其他人使用,包名必须是 fes-preset-
和 fes-plugin-
开头。
`,23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const C=s(l,[["render",t]]);export{h as __pageData,C as default};
+};
API 对象是构建流程管理 Service 类的实例,api 提供一些有用的方法帮助你开发插件。
api.describe
用来描述插件:
key , 插件的 key
,可以理解为插件的名称,在 .fes.js
中用 key
配置此插件。config ,插件的配置信息: schema,定义配置的类型 default,默认配置 enableBy , 是否开启插件,可配置某些场景下禁用插件。创建插件 第一步:安装create-fes-app
bash npm i -g @fesjs/create-fes-app
第二步:创建插件项目 bash create-fes-app pluginName
在询问Pick an template
时选择Plugin
!
第三步:进入插件目录 & 安装依赖 bash cd pluginName & pnpm i
第四步:启动编译 第五步:使用插件 API 完成你的插件!(可以参考其他插件理解 api 用法和场景) 发布到 npm 以 @fesjs/preset-
、@fesjs/plugin-
、@webank/fes-preset-
、@webank/fes-plugin-
、fes-preset-
和 fes-plugin-
开头的依赖会被 Fes.js 自动注册为插件或插件集。
所以编写好的插件想发布到 npm 供其他人使用,包名必须是 fes-preset-
和 fes-plugin-
开头。
`,23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const u=s(l,[["render",t]]);export{h as __pageData,u as default};
diff --git a/assets/reference_plugin_dev_index.md.eb394b31.lean.js b/assets/reference_plugin_dev_index.md.1a7b2210.lean.js
similarity index 50%
rename from assets/reference_plugin_dev_index.md.eb394b31.lean.js
rename to assets/reference_plugin_dev_index.md.1a7b2210.lean.js
index c991964e1..05254d68e 100644
--- a/assets/reference_plugin_dev_index.md.eb394b31.lean.js
+++ b/assets/reference_plugin_dev_index.md.1a7b2210.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as e,V as n}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n("",23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const C=s(l,[["render",t]]);export{h as __pageData,C as default};
+import{_ as s,o as a,c as e,V as n}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"插件介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/dev/index.md"}'),l={name:"reference/plugin/dev/index.md"},o=n("",23),p=[o];function t(c,r,i,d,y,F){return a(),e("div",null,p)}const u=s(l,[["render",t]]);export{h as __pageData,u as default};
diff --git a/assets/reference_plugin_index.md.ff230c53.js b/assets/reference_plugin_index.md.ee42a061.js
similarity index 98%
rename from assets/reference_plugin_index.md.ff230c53.js
rename to assets/reference_plugin_index.md.ee42a061.js
index 2df5544e8..d5187ef24 100644
--- a/assets/reference_plugin_index.md.ff230c53.js
+++ b/assets/reference_plugin_index.md.ee42a061.js
@@ -1 +1 @@
-import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.85b09291.js";const l=d('介绍 插件列表 架构 ',4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default};
+import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.b31a4d00.js";const l=d('介绍 插件列表 架构 ',4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default};
diff --git a/assets/reference_plugin_index.md.ff230c53.lean.js b/assets/reference_plugin_index.md.ee42a061.lean.js
similarity index 89%
rename from assets/reference_plugin_index.md.ff230c53.lean.js
rename to assets/reference_plugin_index.md.ee42a061.lean.js
index a79027bcb..2846709d2 100644
--- a/assets/reference_plugin_index.md.ff230c53.lean.js
+++ b/assets/reference_plugin_index.md.ee42a061.lean.js
@@ -1 +1 @@
-import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.85b09291.js";const l=d("",4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default};
+import{o as e,c as s,C as t,b as a,V as d,y as r}from"./chunks/framework.b31a4d00.js";const l=d("",4),n=["src"],i=t("p",null,"Fes.js 把大家常用的技术栈封装成一个个插件进行整理,收敛到一起,让大家只用 Fes.js 就可以完成 80% 的日常工作。",-1),f=JSON.parse('{"title":"介绍","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/index.md"}'),o={name:"reference/plugin/index.md"},g=Object.assign(o,{setup(u){return(c,h)=>(e(),s("div",null,[l,t("img",{src:a(r)("framework.png"),alt:"架构"},null,8,n),i]))}});export{f as __pageData,g as default};
diff --git a/assets/reference_plugin_plugins_access.md.4e4ed6f5.lean.js b/assets/reference_plugin_plugins_access.md.4e4ed6f5.lean.js
deleted file mode 100644
index 02a31faad..000000000
--- a/assets/reference_plugin_plugins_access.md.4e4ed6f5.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l("",72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const d=s(o,[["render",c]]);export{C as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_access.md.4e4ed6f5.js b/assets/reference_plugin_plugins_access.md.ba03251a.js
similarity index 77%
rename from assets/reference_plugin_plugins_access.md.4e4ed6f5.js
rename to assets/reference_plugin_plugins_access.md.ba03251a.js
index 582062d91..ede328fb2 100644
--- a/assets/reference_plugin_plugins_access.md.4e4ed6f5.js
+++ b/assets/reference_plugin_plugins_access.md.ba03251a.js
@@ -1,92 +1,92 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l(`@fesjs/plugin-access 介绍 对于前端应用来说,权限就是页面、页面元素是否可见。
资源 Fes.js 把页面、页面元素统一叫做资源,用资源 ID 来识别区分他们:
页面的资源 ID 默认是页面的路由 path
。比如页面 pages/a.vue
的路由 path
是 /a
。当页面访问 /a
时会渲染当前页面,/a
也就是页面的 accessId
。 页面元素的资源 ID 没有默认值,需要自定义。 vue < template >
- < access :id = " accessId " > accessOnepicess1 </ access >
- < div v-access = " accessId " > accessOnepicess2 </ div >
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l(`@fesjs/plugin-access 介绍 对于前端应用来说,权限就是页面、页面元素是否可见。
资源 Fes.js 把页面、页面元素统一叫做资源,用资源 ID 来识别区分他们:
页面的资源 ID 默认是页面的路由 path
。比如页面 pages/a.vue
的路由 path
是 /a
。当页面访问 /a
时会渲染当前页面,/a
也就是页面的 accessId
。 页面元素的资源 ID 没有默认值,需要自定义。 vue < template >
+ < access :id = " accessId " > accessOnepicess1 </ access >
+ < div v-access = " accessId " > accessOnepicess2 </ div >
</ template >
< script >
-export default {
- setup () {
+export default {
+ setup () {
return {
accessId : ' accessOnepicess ' ,
};
},
};
-</ script >
匹配规则 全等匹配 资源的匹配规则默认是使用全等匹配,比如页面 pages/a.vue
对应路由 path
是 /a
,则 /a
就是页面的资源 ID。如果我们设置:
js access . setAccess ([ ' /a ' ]) ;
由于权限列表中包含/a
,则表示拥有此页面权限。
模糊匹配 页面@id.vue
会映射为动态路由/:id
,想匹配此页面有两种办法:
access.setAccess(['/:id']) access.setAccess(['/*']) 第二种是模糊匹配,*
表示任意路径。比如角色admin
需要全部权限,则可以:
js export default {
- access : {
- roles : {
- admin : [ ' * ' ] ,
- },
- },
+</ script >
匹配规则 全等匹配 资源的匹配规则默认是使用全等匹配,比如页面 pages/a.vue
对应路由 path
是 /a
,则 /a
就是页面的资源 ID。如果我们设置:
js access . setAccess ([ ' /a ' ]) ;
由于权限列表中包含/a
,则表示拥有此页面权限。
模糊匹配 页面@id.vue
会映射为动态路由/:id
,想匹配此页面有两种办法:
access.setAccess(['/:id']) access.setAccess(['/*']) 第二种是模糊匹配,*
表示任意路径。比如角色admin
需要全部权限,则可以:
js export default {
+ access : {
+ roles : {
+ admin : [ ' * ' ] ,
+ },
+ },
};
角色 通常我们会用角色来控制权限,相应的 Fes.js 用角色定义一组资源。当访问 Fes.js 应用时,使用插件提供的 API 设置用户的角色,角色对应的资源才可见,非角色对应的资源不可见。
当然有时候业务比较复杂,角色对应的权限是动态的。不要怕!插件提供粒度更细的 API 来设置当前用户能访问的资源。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-access " : " ^3.0.0 "
- }
-}
编译时配置 在执行 fes dev
或者 fes build
时,通过此配置生成运行时的代码,在配置文件.fes.js
中配置:
js export default {
- access : {
- roles : {
- admin : [ ' / ' , ' /onepiece ' , ' /store ' ] ,
- },
- },
-};
roles 运行时配置 在 app.js
中配置
unAccessHandler 比如:
js export const access = {
- unAccessHandler ({ to , next }) {
- const accesssIds = accessApi . getAccess () ;
- if ( to . path === ' /404 ' ) {
- accessApi . setAccess ( accesssIds . concat ([ ' /404 ' ])) ;
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-access " : " ^3.0.0 "
+ }
+}
编译时配置 在执行 fes dev
或者 fes build
时,通过此配置生成运行时的代码,在配置文件.fes.js
中配置:
js export default {
+ access : {
+ roles : {
+ admin : [ ' / ' , ' /onepiece ' , ' /store ' ] ,
+ },
+ },
+};
roles 运行时配置 在 app.js
中配置
unAccessHandler 比如:
js export const access = {
+ unAccessHandler ({ to , next }) {
+ const accesssIds = accessApi . getAccess () ;
+ if ( to . path === ' /404 ' ) {
+ accessApi . setAccess ( accesssIds . concat ([ ' /404 ' ])) ;
return next ( ' /404 ' ) ;
}
- if ( ! accesssIds . includes ( ' /403 ' )) {
- accessApi . setAccess ( accesssIds . concat ([ ' /403 ' ])) ;
+ if ( ! accesssIds . includes ( ' /403 ' )) {
+ accessApi . setAccess ( accesssIds . concat ([ ' /403 ' ])) ;
}
next ( ' /403 ' ) ;
},
-};
noFoundHandler 比如:
js export const access = {
- noFoundHandler ({ next }) {
- const accesssIds = accessApi . getAccess () ;
- if ( ! accesssIds . includes ( ' /404 ' )) {
- accessApi . setAccess ( accesssIds . concat ([ ' /404 ' ])) ;
+};
noFoundHandler 比如:
js export const access = {
+ noFoundHandler ({ next }) {
+ const accesssIds = accessApi . getAccess () ;
+ if ( ! accesssIds . includes ( ' /404 ' )) {
+ accessApi . setAccess ( accesssIds . concat ([ ' /404 ' ])) ;
}
next ( ' /404 ' ) ;
},
-};
ignoreAccess 类型 :Array<string>
默认值 :null
详情 :
配置需要忽略权限校验的页面。
比如:
js export const access = {
- ignoreAccess : [ ' /login ' ] ,
-};
API access 插件 API 通过 @fesjs/fes
导出:
js import { access } from ' @fesjs/fes ' ;
access.hasAccess 类型 :( accessId: string | number ) => Promise<boolean>详情 : 判断某个资源是否可见。参数 : 返回值 :是否有权限access.isDataReady 类型 :() => boolean详情 :可以用异步数据来设置权限,isDataReady
用来判断异步数据是否已经加载完毕。参数 :null返回值 :Booleanjs import { access } from ' @fesjs/fes ' ;
-console . log (access . isDataReady ()) ;
access.setRole 类型 :函数详情 :设置当前的角色。参数 : roleId,角色 Id,有两种类型: String,对应着 roles
配置对象中的 key
。 Promise,Promise resolve 的结果应对应着 roles
配置对象中的 key
。 js import { access } from ' @fesjs/fes ' ;
-access . setRole ( ' admin ' ) ;
access.getRole js import { access } from ' @fesjs/fes ' ;
-access . getRole () ;
access.setAccess 类型 :函数详情 :设置当前的角色。参数 : accessIds,资源 Id 数组,有两种类型: Array,数组项对应着 roles
配置对象中的 key
。 Promise,Promise resolve 的结果应该是Array<accessId>
。 js import { access } from ' @fesjs/fes ' ;
-access . setAccess ([ ' /a ' , ' /b ' , ' /c ' ]) ;
access.getAccess 类型 :函数详情 :返回当前可见的资源列表。参数 :nulljs import { access } from ' @fesjs/fes ' ;
-access . getAccess () ;
useAccess vue < template >
- < div v-if = " accessOnepicess " > accessOnepicess </ div >
+};
ignoreAccess 类型 :Array<string>
默认值 :null
详情 :
配置需要忽略权限校验的页面。
比如:
js export const access = {
+ ignoreAccess : [ ' /login ' ] ,
+};
API access 插件 API 通过 @fesjs/fes
导出:
js import { access } from ' @fesjs/fes ' ;
access.hasAccess 类型 :( accessId: string | number ) => Promise<boolean>详情 : 判断某个资源是否可见。参数 : 返回值 :是否有权限access.isDataReady 类型 :() => boolean详情 :可以用异步数据来设置权限,isDataReady
用来判断异步数据是否已经加载完毕。参数 :null返回值 :Booleanjs import { access } from ' @fesjs/fes ' ;
+console . log (access . isDataReady ()) ;
access.setRole 类型 :函数详情 :设置当前的角色。参数 : roleId,角色 Id,有两种类型: String,对应着 roles
配置对象中的 key
。 Promise,Promise resolve 的结果应对应着 roles
配置对象中的 key
。 js import { access } from ' @fesjs/fes ' ;
+access . setRole ( ' admin ' ) ;
access.getRole js import { access } from ' @fesjs/fes ' ;
+access . getRole () ;
access.setAccess 类型 :函数详情 :设置当前的角色。参数 : accessIds,资源 Id 数组,有两种类型: Array,数组项对应着 roles
配置对象中的 key
。 Promise,Promise resolve 的结果应该是Array<accessId>
。 js import { access } from ' @fesjs/fes ' ;
+access . setAccess ([ ' /a ' , ' /b ' , ' /c ' ]) ;
access.getAccess 类型 :函数详情 :返回当前可见的资源列表。参数 :nulljs import { access } from ' @fesjs/fes ' ;
+access . getAccess () ;
useAccess vue < template >
+ < div v-if = " accessOnepicess " > accessOnepicess </ div >
</ template >
< script >
-import { useAccess } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const accessOnepicess = useAccess ( ' /onepiece1 ' ) ;
+import { useAccess } from ' @fesjs/fes ' ;
+export default {
+ setup () {
+ const accessOnepicess = useAccess ( ' /onepiece1 ' ) ;
return {
- accessOnepicess ,
+ accessOnepicess ,
};
},
};
</ script >
v-access 在指令 v-access
中传入 accessId
,则当 accessId
拥有权限时显示 DOM,当没有权限时隐藏此 DOM。
vue < template >
- < div v-access = " accessId " > accessOnepicess </ div >
+ < div v-access = " accessId " > accessOnepicess </ div >
</ template >
< script >
-export default {
- setup () {
+export default {
+ setup () {
return {
accessId : ' accessOnepicess ' ,
};
},
};
</ script >
组件 Access 组件 Access
中传入 accessId
,则当 accessId
拥有权限时渲染此组件,当没有权限时隐藏此组件。
vue < template >
- < access :id = " accessId " > accessOnepicess </ access >
+ < access :id = " accessId " > accessOnepicess </ access >
</ template >
< script >
-export default {
- setup () {
+export default {
+ setup () {
return {
accessId : ' accessOnepicess ' ,
};
},
};
-</ script >
`,72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const d=s(o,[["render",c]]);export{C as __pageData,d as default};
+</ script >
`,72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const A=s(o,[["render",c]]);export{B as __pageData,A as default};
diff --git a/assets/reference_plugin_plugins_access.md.ba03251a.lean.js b/assets/reference_plugin_plugins_access.md.ba03251a.lean.js
new file mode 100644
index 000000000..a53eb4adf
--- /dev/null
+++ b/assets/reference_plugin_plugins_access.md.ba03251a.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-access","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/access.md"}'),o={name:"reference/plugin/plugins/access.md"},p=l("",72),e=[p];function c(t,r,F,D,y,i){return a(),n("div",null,e)}const A=s(o,[["render",c]]);export{B as __pageData,A as default};
diff --git a/assets/reference_plugin_plugins_editor.md.e47cffc2.js b/assets/reference_plugin_plugins_editor.md.59115d8d.js
similarity index 73%
rename from assets/reference_plugin_plugins_editor.md.e47cffc2.js
rename to assets/reference_plugin_plugins_editor.md.59115d8d.js
index 39c0db9be..7d9c96999 100644
--- a/assets/reference_plugin_plugins_editor.md.e47cffc2.js
+++ b/assets/reference_plugin_plugins_editor.md.59115d8d.js
@@ -1,41 +1,41 @@
-import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o(`@fesjs/plugin-monaco-editor 介绍 我们会遇到需要编辑代码的场景,比如编辑json
、javascript
、python
等等,Monaco Editor 是 \b 一个好用而且强大的的代码编辑器库,引入Monaco Editor
有一定的成本,插件实现了胶水代码,提供轻松引入的能力。目前内置的 Monaco Editor
版本是 1.9.1
。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-monaco-editor " : " ^3.0.0 "
- }
-}
编译时配置 在执行 fes dev
或者 fes build
时,通过此配置生成运行时的代码,在配置文件.fes.js
中配置:
js export default {
- monacoEditor : {
- languages : [ ' javascript ' , ' typescript ' , ' html ' , ' json ' ] ,
- },
-};
我们通过 monaco-editor-webpack-plugin
集成 Monaco Editor
的 ESM
版本,所以编辑时其实就是 monaco-editor-webpack-plugin
的配置,具体配置项参考文档 。
filename 类型 :自定义 worker 脚本名称默认值 :'[name].worker.js'
publicPath 类型 :自定义 worker 脚本的路径默认值 :''
languages 类型 :需要支持的语言类型
默认值 :['abap', 'apex', 'azcli', 'bat', 'bicep', 'cameligo', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dart', 'dockerfile', 'ecl', 'elixir', 'fsharp', 'go', 'graphql', 'handlebars', 'hcl', 'html', 'ini', 'java', 'javascript', 'json', 'julia', 'kotlin', 'less', 'lexon', 'liquid', 'lua', 'm3', 'markdown', 'mips', 'msdax', 'mysql', 'objective-c', 'pascal', 'pascaligo', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'qsharp', 'r', 'razor', 'redis', 'redshift', 'restructuredtext', 'ruby', 'rust', 'sb', 'scala', 'scheme', 'scss', 'shell', 'solidity', 'sophia', 'sparql', 'sql', 'st', 'swift', 'systemverilog', 'tcl', 'twig', 'typescript', 'vb', 'xml', 'yaml']
详情 :默认是全部,但是编译后包体积会非常大,建议用到什么语言则配置什么语言。特别某些语言依赖其他语言,例如javascript
依赖typescript
,需要使用javascript
时需要配置为:
js export default {
- monacoEditor : {
- languages : [ ' javascript ' , ' typescript ' ] ,
- },
-};
API monaco 编辑器的全局对象,提供扩展语言,自定义主题等等 API,具体用法请查看monaco 官方文档。
js import { monaco } from ' @fesjs/fes ' ;
+import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o(`@fesjs/plugin-monaco-editor 介绍 我们会遇到需要编辑代码的场景,比如编辑json
、javascript
、python
等等,Monaco Editor 是 \b 一个好用而且强大的的代码编辑器库,引入Monaco Editor
有一定的成本,插件实现了胶水代码,提供轻松引入的能力。目前内置的 Monaco Editor
版本是 1.9.1
。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-monaco-editor " : " ^3.0.0 "
+ }
+}
编译时配置 在执行 fes dev
或者 fes build
时,通过此配置生成运行时的代码,在配置文件.fes.js
中配置:
js export default {
+ monacoEditor : {
+ languages : [ ' javascript ' , ' typescript ' , ' html ' , ' json ' ] ,
+ },
+};
我们通过 monaco-editor-webpack-plugin
集成 Monaco Editor
的 ESM
版本,所以编辑时其实就是 monaco-editor-webpack-plugin
的配置,具体配置项参考文档 。
filename 类型 :自定义 worker 脚本名称默认值 :'[name].worker.js'
publicPath 类型 :自定义 worker 脚本的路径默认值 :''
languages 类型 :需要支持的语言类型
默认值 :['abap', 'apex', 'azcli', 'bat', 'bicep', 'cameligo', 'clojure', 'coffee', 'cpp', 'csharp', 'csp', 'css', 'dart', 'dockerfile', 'ecl', 'elixir', 'fsharp', 'go', 'graphql', 'handlebars', 'hcl', 'html', 'ini', 'java', 'javascript', 'json', 'julia', 'kotlin', 'less', 'lexon', 'liquid', 'lua', 'm3', 'markdown', 'mips', 'msdax', 'mysql', 'objective-c', 'pascal', 'pascaligo', 'perl', 'pgsql', 'php', 'postiats', 'powerquery', 'powershell', 'pug', 'python', 'qsharp', 'r', 'razor', 'redis', 'redshift', 'restructuredtext', 'ruby', 'rust', 'sb', 'scala', 'scheme', 'scss', 'shell', 'solidity', 'sophia', 'sparql', 'sql', 'st', 'swift', 'systemverilog', 'tcl', 'twig', 'typescript', 'vb', 'xml', 'yaml']
详情 :默认是全部,但是编译后包体积会非常大,建议用到什么语言则配置什么语言。特别某些语言依赖其他语言,例如javascript
依赖typescript
,需要使用javascript
时需要配置为:
js export default {
+ monacoEditor : {
+ languages : [ ' javascript ' , ' typescript ' ] ,
+ },
+};
API monaco 编辑器的全局对象,提供扩展语言,自定义主题等等 API,具体用法请查看monaco 官方文档。
js import { monaco } from ' @fesjs/fes ' ;
-monaco . editor . defineTheme ( ' myCoolTheme ' , {
- base : ' vs ' ,
- inherit : false ,
- rules : [
- { token : ' custom-info ' , foreground : ' 808080 ' },
- { token : ' custom-error ' , foreground : ' ff0000 ' , fontStyle : ' bold ' },
- { token : ' custom-notice ' , foreground : ' FFA500 ' },
- { token : ' custom-date ' , foreground : ' 008800 ' },
- ] ,
-} ) ;
组件 MonacoEditor vue < template >
- < MonacoEditor v-model = " json " language = " json " height = " 400px " check > </ MonacoEditor >
+monaco . editor . defineTheme ( ' myCoolTheme ' , {
+ base : ' vs ' ,
+ inherit : false ,
+ rules : [
+ { token : ' custom-info ' , foreground : ' 808080 ' },
+ { token : ' custom-error ' , foreground : ' ff0000 ' , fontStyle : ' bold ' },
+ { token : ' custom-notice ' , foreground : ' FFA500 ' },
+ { token : ' custom-date ' , foreground : ' 008800 ' },
+ ] ,
+} ) ;
组件 MonacoEditor vue < template >
+ < MonacoEditor v-model = " json " language = " json " height = " 400px " check > </ MonacoEditor >
</ template >
< script >
-import { MonacoEditor } from ' @fesjs/fes ' ;
-export default {
- components : {
- MonacoEditor ,
- },
- setup () {
- const json = ref ( '' ) ;
+import { MonacoEditor } from ' @fesjs/fes ' ;
+export default {
+ components : {
+ MonacoEditor ,
+ },
+ setup () {
+ const json = ref ( '' ) ;
return {
- json ,
+ json ,
};
},
};
-</ script >
props 属性 说明 类型 默认值 theme 编辑器的主题,使用其他主题需要先使用monaco.editor.defineTheme
定义主题 string defaultTheme
language 编辑器的语言 string - height 编辑器的高度 string 100%
width 编辑器的宽度 string 100%
modelValue(v-model) 编辑器的代码 string - readOnly 是否只读 boolean false
options 编辑器的配置对象 object {}
check 是否检查代码,如果检查不通过则不更新数据,目前只支持json
boolean false
events 事件名称 说明 回调参数 onload 编辑器初始化后触发 ({monaco, editor, editorModel}) => void scrollChange 滚动时触发 (e) => void
`,27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(l,[["render",t]]);export{C as __pageData,A as default};
+</ script >
props 属性 说明 类型 默认值 theme 编辑器的主题,使用其他主题需要先使用monaco.editor.defineTheme
定义主题 string defaultTheme
language 编辑器的语言 string - height 编辑器的高度 string 100%
width 编辑器的宽度 string 100%
modelValue(v-model) 编辑器的代码 string - readOnly 是否只读 boolean false
options 编辑器的配置对象 object {}
check 是否检查代码,如果检查不通过则不更新数据,目前只支持json
boolean false
events 事件名称 说明 回调参数 onload 编辑器初始化后触发 ({monaco, editor, editorModel}) => void scrollChange 滚动时触发 (e) => void
`,27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{B as __pageData,h as default};
diff --git a/assets/reference_plugin_plugins_editor.md.59115d8d.lean.js b/assets/reference_plugin_plugins_editor.md.59115d8d.lean.js
new file mode 100644
index 000000000..10403438e
--- /dev/null
+++ b/assets/reference_plugin_plugins_editor.md.59115d8d.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as o}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o("",27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const h=s(l,[["render",t]]);export{B as __pageData,h as default};
diff --git a/assets/reference_plugin_plugins_editor.md.e47cffc2.lean.js b/assets/reference_plugin_plugins_editor.md.e47cffc2.lean.js
deleted file mode 100644
index f2c990975..000000000
--- a/assets/reference_plugin_plugins_editor.md.e47cffc2.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as o}from"./chunks/framework.85b09291.js";const C=JSON.parse('{"title":"@fesjs/plugin-monaco-editor","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/editor.md"}'),l={name:"reference/plugin/plugins/editor.md"},p=o("",27),e=[p];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(l,[["render",t]]);export{C as __pageData,A as default};
diff --git a/assets/reference_plugin_plugins_enums.md.920bbaba.lean.js b/assets/reference_plugin_plugins_enums.md.920bbaba.lean.js
deleted file mode 100644
index 3c80b4cd1..000000000
--- a/assets/reference_plugin_plugins_enums.md.920bbaba.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l("",44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_enums.md.920bbaba.js b/assets/reference_plugin_plugins_enums.md.9c0c3064.js
similarity index 75%
rename from assets/reference_plugin_plugins_enums.md.920bbaba.js
rename to assets/reference_plugin_plugins_enums.md.9c0c3064.js
index 74edf2942..6ea4e100d 100644
--- a/assets/reference_plugin_plugins_enums.md.920bbaba.js
+++ b/assets/reference_plugin_plugins_enums.md.9c0c3064.js
@@ -1,36 +1,36 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l(`@fesjs/plugin-enums 介绍 日常业务开发中,有很多场景会使用到枚举值,比如 select-options、table-column。
该插件提供统一的枚举存取及丰富的函数来处理枚举。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-enums " : " ^3.0.0 "
- }
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l(`@fesjs/plugin-enums 介绍 日常业务开发中,有很多场景会使用到枚举值,比如 select-options、table-column。
该插件提供统一的枚举存取及丰富的函数来处理枚举。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-enums " : " ^3.0.0 "
+ }
}
配置 静态配置 在 .fes.js
中配置:
js // 配置格式:[[key, value], ...]
-export default {
- enums : {
- status : [
- [ ' 0 ' , ' 无效的 ' ] ,
- [ ' 1 ' , ' 有效的 ' ] ,
- ] ,
- },
-};
动态配置 在业务代码中
js import { enums } from ' @fesjs/fes ' ;
+export default {
+ enums : {
+ status : [
+ [ ' 0 ' , ' 无效的 ' ] ,
+ [ ' 1 ' , ' 有效的 ' ] ,
+ ] ,
+ },
+};
动态配置 在业务代码中
js import { enums } from ' @fesjs/fes ' ;
// 动态添加
-enums . push ( ' status ' , [[ ' 0 ' , ' 无效的 ' ] , [ ' 1 ' , ' 有效的 ' ]]
-enums . get ( ' status ' , ' 1 ' ) // 有效的
场景使用 vue < template >
- < div >
- <!-- 遍历枚举status -->
- < div v-for = " item in enumsGet('status') " :key = " item.key " > {{ item.value }}:{{ item.key }} </ div >
- <!-- 遍历枚举扩展后的roles -->
- < div v-for = " item in roles " :key = " item.key " > {{ item.name }}:{{ item.disabled }} </ div >
- <!-- 获取枚举roles为2的英文名 -->
- < div > {{ enumsGet('roles', '2', { dir: 'eName' }) }} </ div >
- </ div >
+enums . push ( ' status ' , [[ ' 0 ' , ' 无效的 ' ] , [ ' 1 ' , ' 有效的 ' ]]
+enums . get ( ' status ' , ' 1 ' ) // 有效的
场景使用 vue < template >
+ < div >
+ <!-- 遍历枚举status -->
+ < div v-for = " item in enumsGet('status') " :key = " item.key " > {{ item.value }}:{{ item.key }} </ div >
+ <!-- 遍历枚举扩展后的roles -->
+ < div v-for = " item in roles " :key = " item.key " > {{ item.name }}:{{ item.disabled }} </ div >
+ <!-- 获取枚举roles为2的英文名 -->
+ < div > {{ enumsGet('roles', '2', { dir: 'eName' }) }} </ div >
+ </ div >
</ template >
< script >
-import { enums } from ' @fesjs/fes ' ;
+import { enums } from ' @fesjs/fes ' ;
-export default {
- setup () {
+export default {
+ setup () {
// 动态添加枚举,枚举项是对象,并指定key的属性名为id
- enums . push (
+ enums . push (
' roles ' ,
[
{
@@ -55,7 +55,7 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
{ keyName : ' id ' },
) ;
// 导出定制格式的roles,扩展枚举项新的属性name、disabled
- const roles = enums . get ( ' roles ' , {
+ const roles = enums . get ( ' roles ' , {
extend : [
{
key : ' name ' ,
@@ -64,60 +64,60 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
{
key : ' disabled ' ,
// 传入函数,获取结果值
- transfer : ( item ) => item . value . perm . some ( ( i ) => i >= 2 ) ,
+ transfer : ( item ) => item . value . perm . some ( ( i ) => i >= 2 ) ,
},
] ,
} ) ;
- console . log ( roles ) ;
+ console . log ( roles ) ;
// [{key: '1', name: '系统管理员', disabled: true, value: {...}}, ....]
return {
- enumsGet : enums . get ,
- roles ,
+ enumsGet : enums . get ,
+ roles ,
};
},
};
-</ script >
API get get(name: string)
获取指定名字的枚举
get(name: string, key: string)
获取指定名字及键枚举默认值
get(name: string, opt: {extend: Array<Object>})
获取指定名字的自定义格式枚举,查看 extend 配置
get(name: string, key: string, opt: {dir: string})
获取指定名字及键枚举dir 规则 的值
js get ( ' status ' ) ;
-get ( ' status ' , ' 1 ' ) ;
-get ( ' status ' , {
- extend : [
- {
- key : ' name ' ,
- dir : ' value ' ,
- },
- {
- key : ' disabled ' ,
- transfer : ( item ) => item === ' 0 ' ,
- },
- ] ,
-} ) ;
-get ( ' status ' , ' 1 ' , { dir : ' value ' } ) ;
push 动态添加枚举,重复添加会覆盖
push(name: string, _enum: Array<Array>)
push(name: string, _enum: Array<Object>, opt?: Object)
opt.keyName 指定 key 的取值属性,默认是 key opt.valueName 指定 value 的取值属性 枚举项为数组,枚举项的[0]解析为 key,枚举项的[1]解析为 value
枚举项为对象时,根据 opt 配置 keyName、valueName 取枚举项属性值分别作为 key 和 value,如果valueName未设置则value就是枚举项
remove 移除指定的枚举
concat 基于现有的枚举,连接上新的枚举后返回新的枚举
concat(name: string, _enum: Array<Array|Object>, opt?: Object))
opt.keyName 指定 key 的取值属性,默认是 key opt.valueName 指定 value 的取值属性 opt.before 是否添加在现有的之前,默认是 false opt.extend:返回的枚举extend 配置 convert 将传入的枚举格式转换为{key, value}的形式
convert(name: string, _enum: Array<Array|Object>, opt?: Object))
opt.keyName 指定 key 的取值属性,默认是 key opt.valueName 指定 value 的取值属性 extend 配置 扩展枚举项属性的配置
extend: Array<Object>
_ key
指定扩展的属性名 _ dir
指定该属性的取值路径 * transfer(item: {key: any, value: any})
转换函数,参数未枚举项,返回就是该属性的值TIP
同时设置dir 和 transfer,transfer 优先
js get ( ' status ' , {
- extend : [
- {
- key : ' name ' ,
- dir : ' value ' ,
- },
- {
- key : ' disabled ' ,
- transfer : ( item ) => item . key === ' 0 ' ,
- },
- ] ,
-} ) ;
dir 规则 dir 是指定枚举项 value 的取值方式,规则如下:
对象属性 A
、A.B
数组 [0]
、[0][1]
混合 A[0]
、[0].A
、A[0].B
js // 假如枚举项value的结构如下
-const user = {
- age : 18 ,
- name : ' aring ' ,
- role : [
- {
- id : 1 ,
- name : ' 管理员 '
- },
- {
- id : 2 ,
- name : ' 业务操作员 '
- }
- ]
+</ script >
API get get(name: string)
获取指定名字的枚举
get(name: string, key: string)
获取指定名字及键枚举默认值
get(name: string, opt: {extend: Array<Object>})
获取指定名字的自定义格式枚举,查看 extend 配置
get(name: string, key: string, opt: {dir: string})
获取指定名字及键枚举dir 规则 的值
js get ( ' status ' ) ;
+get ( ' status ' , ' 1 ' ) ;
+get ( ' status ' , {
+ extend : [
+ {
+ key : ' name ' ,
+ dir : ' value ' ,
+ },
+ {
+ key : ' disabled ' ,
+ transfer : ( item ) => item === ' 0 ' ,
+ },
+ ] ,
+} ) ;
+get ( ' status ' , ' 1 ' , { dir : ' value ' } ) ;
push 动态添加枚举,重复添加会覆盖
push(name: string, _enum: Array<Array>)
push(name: string, _enum: Array<Object>, opt?: Object)
opt.keyName 指定 key 的取值属性,默认是 key opt.valueName 指定 value 的取值属性 枚举项为数组,枚举项的[0]解析为 key,枚举项的[1]解析为 value
枚举项为对象时,根据 opt 配置 keyName、valueName 取枚举项属性值分别作为 key 和 value,如果valueName未设置则value就是枚举项
remove 移除指定的枚举
concat 基于现有的枚举,连接上新的枚举后返回新的枚举
concat(name: string, _enum: Array<Array|Object>, opt?: Object))
opt.keyName 指定 key 的取值属性,默认是 key opt.valueName 指定 value 的取值属性 opt.before 是否添加在现有的之前,默认是 false opt.extend:返回的枚举extend 配置 convert 将传入的枚举格式转换为{key, value}的形式
convert(name: string, _enum: Array<Array|Object>, opt?: Object))
opt.keyName 指定 key 的取值属性,默认是 key opt.valueName 指定 value 的取值属性 extend 配置 扩展枚举项属性的配置
extend: Array<Object>
_ key
指定扩展的属性名 _ dir
指定该属性的取值路径 * transfer(item: {key: any, value: any})
转换函数,参数未枚举项,返回就是该属性的值TIP
同时设置dir 和 transfer,transfer 优先
js get ( ' status ' , {
+ extend : [
+ {
+ key : ' name ' ,
+ dir : ' value ' ,
+ },
+ {
+ key : ' disabled ' ,
+ transfer : ( item ) => item . key === ' 0 ' ,
+ },
+ ] ,
+} ) ;
dir 规则 dir 是指定枚举项 value 的取值方式,规则如下:
对象属性 A
、A.B
数组 [0]
、[0][1]
混合 A[0]
、[0].A
、A[0].B
js // 假如枚举项value的结构如下
+const user = {
+ age : 18 ,
+ name : ' aring ' ,
+ role : [
+ {
+ id : 1 ,
+ name : ' 管理员 '
+ },
+ {
+ id : 2 ,
+ name : ' 业务操作员 '
+ }
+ ]
}
// 那么规则解析是:
-dir value
-' age ' => 18
-' role[0] ' => { id : 1 , name : ' 管理员 ' }
-' role[1].id ' => 2
TIP
枚举项 value 如果是基本类型,则规则不生效,value 就是当前值
`,44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+dir value
+' age ' => 18
+' role[0] ' => { id : 1 , name : ' 管理员 ' }
+' role[1].id ' => 2
TIP
枚举项 value 如果是基本类型,则规则不生效,value 就是当前值
`,44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default};
diff --git a/assets/reference_plugin_plugins_enums.md.9c0c3064.lean.js b/assets/reference_plugin_plugins_enums.md.9c0c3064.lean.js
new file mode 100644
index 000000000..8a62026ea
--- /dev/null
+++ b/assets/reference_plugin_plugins_enums.md.9c0c3064.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-enums","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/enums.md"}'),p={name:"reference/plugin/plugins/enums.md"},o=l("",44),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default};
diff --git a/assets/reference_plugin_plugins_icon.md.8e1a0033.js b/assets/reference_plugin_plugins_icon.md.f2cb3f94.js
similarity index 86%
rename from assets/reference_plugin_plugins_icon.md.8e1a0033.js
rename to assets/reference_plugin_plugins_icon.md.f2cb3f94.js
index 9ff7bd205..713b35624 100644
--- a/assets/reference_plugin_plugins_icon.md.8e1a0033.js
+++ b/assets/reference_plugin_plugins_icon.md.f2cb3f94.js
@@ -1,6 +1,6 @@
-import{_ as s,o as a,c as t,V as e}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e(`@fesjs/plugin-icon 介绍 提供以 component
的方式,直接使用 svg icon 的能力。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-icon " : " ^3.0.0 "
- }
+import{_ as s,o as a,c as t,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e(`@fesjs/plugin-icon 介绍 提供以 component
的方式,直接使用 svg icon 的能力。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-icon " : " ^3.0.0 "
+ }
}
使用 新建 src/icons
目录,将 svg 文件放入其中,在 component
中引用:
jsx < fes-icon type = " iconName " />
属性 属性 说明 类型 type svg 文件名 string
spin 是否无限旋转 boolean
rotate 旋转角度 number
`,11),o=[l];function p(c,r,i,d,D,y){return a(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_icon.md.8e1a0033.lean.js b/assets/reference_plugin_plugins_icon.md.f2cb3f94.lean.js
similarity index 68%
rename from assets/reference_plugin_plugins_icon.md.8e1a0033.lean.js
rename to assets/reference_plugin_plugins_icon.md.f2cb3f94.lean.js
index 83d7aac9a..a87982dad 100644
--- a/assets/reference_plugin_plugins_icon.md.8e1a0033.lean.js
+++ b/assets/reference_plugin_plugins_icon.md.f2cb3f94.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as t,V as e}from"./chunks/framework.85b09291.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e("",11),o=[l];function p(c,r,i,d,D,y){return a(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
+import{_ as s,o as a,c as t,V as e}from"./chunks/framework.b31a4d00.js";const h=JSON.parse('{"title":"@fesjs/plugin-icon","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/icon.md"}'),n={name:"reference/plugin/plugins/icon.md"},l=e("",11),o=[l];function p(c,r,i,d,D,y){return a(),t("div",null,o)}const u=s(n,[["render",p]]);export{h as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.lean.js b/assets/reference_plugin_plugins_jest.md.4b1c2ebf.lean.js
deleted file mode 100644
index d1e9092ec..000000000
--- a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as n,c as a,V as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e("",26),p=[t];function o(c,r,i,A,C,y){return n(),a("div",null,p)}const u=s(l,[["render",o]]);export{D as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.js b/assets/reference_plugin_plugins_jest.md.d574f7ac.js
similarity index 55%
rename from assets/reference_plugin_plugins_jest.md.4b1c2ebf.js
rename to assets/reference_plugin_plugins_jest.md.d574f7ac.js
index a3d294f2d..cf4a4c0ac 100644
--- a/assets/reference_plugin_plugins_jest.md.4b1c2ebf.js
+++ b/assets/reference_plugin_plugins_jest.md.d574f7ac.js
@@ -1,299 +1,299 @@
-import{_ as s,o as n,c as a,V as e}from"./chunks/framework.85b09291.js";const D=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e(`@fesjs/plugin-jest 集成 Jest 测试框架,目前只支持单元测试和覆盖测试。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-jest " : " ^3.0.0 "
- }
-}
约定 项目根目录下 tests
和 __tests__
文件夹中的 js
或者 jsx
文件为测试文件。 需要覆盖测试的文件范围是src/index.{js,jsx,ts,tsx,vue}
例如测试文件 add.js
:
fes-template
-├── __tests__
-│ └── add.js
-└── src
- ├── .fes
- └── utils
- └── sum.js
内容如下:
js import sum from ' @/utils/sum ' ;
-test ( ' adds 1 + 2 to equal 3 ' , () => {
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e(`@fesjs/plugin-jest 集成 Jest 测试框架,目前只支持单元测试和覆盖测试。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-jest " : " ^3.0.0 "
+ }
+}
约定 项目根目录下 tests
和 __tests__
文件夹中的 js
或者 jsx
文件为测试文件。 需要覆盖测试的文件范围是src/index.{js,jsx,ts,tsx,vue}
例如测试文件 add.js
:
fes-template
+├── __tests__
+│ └── add.js
+└── src
+ ├── .fes
+ └── utils
+ └── sum.js
内容如下:
js import sum from ' @/utils/sum ' ;
+test ( ' adds 1 + 2 to equal 3 ' , () => {
expect ( sum ( 1 , 2 )) . toBe ( 3 ) ;
-} ) ;
命令 在 fes
上注册 test
命令:
配置 插件实现 Jest 的全部配置,具体请查看 文档-configuration 。 也可以使用 -h
打印配置帮助信息:
args 变量 打印配置帮助信息:
$ fes test -h
-Usage: fes test [options]
-
-run unit tests with jest
-
-Options:
- --all The opposite of \`onlyChanged\`. If \`onlyChanged\`
- is set by default, running jest with \`--all\`
- will force Jest to run all tests instead of
- running only tests related to changed files.
- --automock Automock all files by default.
- -b --bail Exit the test suite immediately after \`n\`
- number of failing tests.
- --browser Respect the "browser" field in package.json
- when resolving modules. Some packages export
- different versions based on whether they are
- operating in node.js or a browser.
- --cache Whether to use the transform cache. Disable the
- cache using --no-cache.
- --cacheDirectory The directory where Jest should store its
- cached dependency information.
- --changedFilesWithAncestor Runs tests related to the current changes and
- the changes made in the last commit. Behaves
- similarly to \`--onlyChanged\`.
- --changedSince Runs tests related to the changes since the
- provided branch. If the current branch has
- diverged from the given branch, then only
- changes made locally will be tested. Behaves
- similarly to \`--onlyChanged\`.
- --ci Whether to run Jest in continuous integration
- (CI) mode. This option is on by default in most
- popular CI environments. It will prevent
- snapshots from being written unless explicitly
- requested.
- --clearCache Clears the configured Jest cache directory and
- then exits. Default directory can be found by
- calling jest --showConfig
- --clearMocks Automatically clear mock calls and instances
- between every test. Equivalent to calling
- jest.clearAllMocks() between each test.
- --collectCoverage Alias for --coverage.
- --collectCoverageFrom A glob pattern relative to <rootDir> matching
- the files that coverage info needs to be
- collected from.
- --collectCoverageOnlyFrom Explicit list of paths coverage will be
- restricted to.
- --color Forces test results output color highlighting
- (even if stdout is not a TTY). Set to false if
- you would like to have no colors.
- --colors Alias for \`--color\`.
- -c --config The path to a jest config file specifying how
- to find and execute tests. If no rootDir is set
- in the config, the directory containing the
- config file is assumed to be the rootDir for
- the project.This can also be a JSON encoded
- value which Jest will use as configuration.
- --coverage Indicates that test coverage information should
- be collected and reported in the output.
- --coverageDirectory The directory where Jest should output its
- coverage files.
- --coveragePathIgnorePatterns An array of regexp pattern strings that are
- matched against all file paths before executing
- the test. If the file pathmatches any of the
- patterns, coverage information will be skipped.
- --coverageProvider Select between Babel and V8 to collect coverage
- --coverageReporters A list of reporter names that Jest uses when
- writing coverage reports. Any istanbul reporter
- can be used.
- --coverageThreshold A JSON string with which will be used to
- configure minimum threshold enforcement for
- coverage results
- --debug Print debugging info about your jest config.
- --detectLeaks **EXPERIMENTAL**: Detect memory leaks in tests.
- After executing a test, it will try to garbage
- collect the global object used, and fail if it
- was leaked
- --detectOpenHandles Print out remaining open handles preventing
- Jest from exiting at the end of a test run.
- Implies \`runInBand\`.
- --env The test environment used for all tests. This
- can point to any file or node module. Examples:
- \`jsdom\`, \`node\` or \`path/to/my-environment.js\`
- --errorOnDeprecated Make calling deprecated APIs throw helpful
- error messages.
- -e --expand Use this flag to show full diffs instead of a
- patch.
- --filter Path to a module exporting a filtering
- function. This method receives a list of tests
- which can be manipulated to exclude tests from
- running. Especially useful when used in
- conjunction with a testing infrastructure to
- filter known broken tests.
- --findRelatedTests Find related tests for a list of source files
- that were passed in as arguments. Useful for
- pre-commit hook integration to run the minimal
- amount of tests necessary.
- --forceExit Force Jest to exit after all tests have
- completed running. This is useful when
- resources set up by test code cannot be
- adequately cleaned up.
- --globalSetup The path to a module that runs before All
- Tests.
- --globalTeardown The path to a module that runs after All Tests.
- --globals A JSON string with map of global variables that
- need to be available in all test environments.
- --haste A JSON string with map of variables for the
- haste module system
- --init Generate a basic configuration file
- --injectGlobals Should Jest inject global variables or not
- --json Prints the test results in JSON. This mode will
- send all other test output and user messages to
- stderr.
- --lastCommit Run all tests affected by file changes in the
- last commit made. Behaves similarly to
- \`--onlyChanged\`.
- --listTests Lists all tests Jest will run given the
- arguments and exits. Most useful in a CI system
- together with \`--findRelatedTests\` to determine
- the tests Jest will run based on specific files
- --logHeapUsage Logs the heap usage after every test. Useful to
- debug memory leaks. Use together with
- \`--runInBand\` and \`--expose-gc\` in node.
- --mapCoverage Maps code coverage reports against original source code when transformers supply source maps.
-
- DEPRECATED
- --maxConcurrency Specifies the maximum number of tests that are
- allowed to runconcurrently. This only affects
- tests using \`test.concurrent\`.
- -w --maxWorkers Specifies the maximum number of workers the
- worker-pool will spawn for running tests. This
- defaults to the number of the cores available
- on your machine. (its usually best not to
- override this default)
- --moduleDirectories An array of directory names to be searched
- recursively up from the requiring module's
- location.
- --moduleFileExtensions An array of file extensions your modules use.
- If you require modules without specifying a
- file extension, these are the extensions Jest
- will look for.
- --moduleNameMapper A JSON string with a map from regular
- expressions to module names or to arrays of
- module names that allow to stub out resources,
- like images or styles with a single module
- --modulePathIgnorePatterns An array of regexp pattern strings that are
- matched against all module paths before those
- paths are to be considered "visible" to the
- module loader.
- --modulePaths An alternative API to setting the NODE_PATH env
- variable, modulePaths is an array of absolute
- paths to additional locations to search when
- resolving modules.
- --noStackTrace Disables stack trace in test results output
- --notify Activates notifications for test results.
- --notifyMode Specifies when notifications will appear for
- test results.
- -o --onlyChanged Attempts to identify which tests to run based
- on which files have changed in the current
- repository. Only works if you're running tests
- in a git or hg repository at the moment.
- -f --onlyFailures Run tests that failed in the previous
- execution.
- --outputFile Write test results to a file when the --json
- option is also specified.
- --passWithNoTests Will not fail if no tests are found (for
- example while using \`--testPathPattern\`.)
- --preset A preset that is used as a base for Jest's
- configuration.
- --prettierPath The path to the "prettier" module used for
- inline snapshots.
- --projects A list of projects that use Jest to run all
- tests of all projects in a single instance of
- Jest.
- --reporters A list of custom reporters for the test suite.
- --resetMocks Automatically reset mock state between every
- test. Equivalent to calling
- jest.resetAllMocks() between each test.
- --resetModules If enabled, the module registry for every test
- file will be reset before running each
- individual test.
- --resolver A JSON string which allows the use of a custom
- resolver.
- --restoreMocks Automatically restore mock state and
- implementation between every test. Equivalent
- to calling jest.restoreAllMocks() between each
- test.
- --rootDir The root directory that Jest should scan for
- tests and modules within.
- --roots A list of paths to directories that Jest should
- use to search for files in.
- -i --runInBand Run all tests serially in the current process
- (rather than creating a worker pool of child
- processes that run tests). This is sometimes
- useful for debugging, but such use cases are
- pretty rare.
- --runTestsByPath Used when provided patterns are exact file
- paths. This avoids converting them into a
- regular expression and matching it against
- every single file.
- --runner Allows to use a custom runner instead of Jest's
- default test runner.
- --selectProjects Run only the tests of the specified
- projects.Jest uses the attribute \`displayName\`
- in the configuration to identify each project.
- --setupFiles A list of paths to modules that run some code
- to configure or set up the testing environment
- before each test.
- --setupFilesAfterEnv A list of paths to modules that run some code
- to configure or set up the testing framework
- before each test
- --showConfig Print your jest config and then exits.
- --silent Prevent tests from printing messages through
- the console.
- --skipFilter Disables the filter provided by --filter.
- Useful for CI jobs, or local enforcement when
- fixing tests.
- --snapshotSerializers A list of paths to snapshot serializer modules
- Jest should use for snapshot testing.
- --testEnvironment Alias for --env
- --testEnvironmentOptions Test environment options that will be passed to
- the testEnvironment. The relevant options
- depend on the environment.
- --testFailureExitCode Exit code of \`jest\` command if the test run
- failed
- --testLocationInResults Add \`location\` information to the test results
- --testMatch The glob patterns Jest uses to detect test
- files.
- -t --testNamePattern Run only tests with a name that matches the
- regex pattern.
- --testPathIgnorePatterns An array of regexp pattern strings that are
- matched against all test paths before executing
- the test. If the test path matches any of the
- patterns, it will be skipped.
- --testPathPattern A regexp pattern string that is matched against
- all tests paths before executing the test.
- --testRegex A string or array of string regexp patterns
- that Jest uses to detect test files.
- --testResultsProcessor Allows the use of a custom results processor.
- This processor must be a node module that
- exports a function expecting as the first
- argument the result object.
- --testRunner Allows to specify a custom test runner. The
- default is \`jasmine2\`. A path to a custom test
- runner can be provided:
- \`<rootDir>/path/to/testRunner.js\`.
- --testSequencer Allows to specify a custom test sequencer. The
- default is \`@jest/test-sequencer\`. A path to a
- custom test sequencer can be provided:
- \`<rootDir>/path/to/testSequencer.js\`
- --testTimeout This option sets the default timeouts of test
- cases.
- --testURL This option sets the URL for the jsdom
- environment.
- --timers Setting this value to fake allows the use of
- fake timers for functions such as setTimeout.
- --transform A JSON string which maps from regular
- expressions to paths to transformers.
- --transformIgnorePatterns An array of regexp pattern strings that are
- matched against all source file paths before
- transformation.
- --unmockedModulePathPatterns An array of regexp pattern strings that are
- matched against all modules before the module
- loader will automatically return a mock for
- them.
- -u --updateSnapshot Use this flag to re-record snapshots. Can be
- used together with a test suite pattern or with
- \`--testNamePattern\` to re-record snapshot for
- test matching the pattern
- --useStderr Divert all output to stderr.
- --verbose Display individual test results with the test
- suite hierarchy.
- --watch Watch files for changes and rerun tests related
- to changed files. If you want to re-run all
- tests when a file has changed, use the
- \`--watchAll\` option.
- --watchAll Watch files for changes and rerun all tests. If
- you want to re-run only the tests related to
- the changed files, use the \`--watch\` option.
- --watchPathIgnorePatterns An array of regexp pattern strings that are
- matched against all paths before trigger test
- re-run in watch mode. If the test path matches
- any of the patterns, it will be skipped.
- --watchman Whether to use watchman for file crawling.
- Disable using --no-watchman.
- -h, --help display help for command
比如覆盖测试:
配置文件 除了插件内置的默认配置之外,插件遵循 Jest
的配置文件规范,约定项目根目录下的 jest.config.js
为用户配置文件,约定 packages.json
的 jest
属性内容也是配置。
优先级 args
配置 > package.json
中的 jest
> jest.config.js
> 默认配置
`,26),p=[t];function o(c,r,i,A,C,y){return n(),a("div",null,p)}const u=s(l,[["render",o]]);export{D as __pageData,u as default};
+} ) ;
命令 在 fes
上注册 test
命令:
配置 插件实现 Jest 的全部配置,具体请查看 文档-configuration 。 也可以使用 -h
打印配置帮助信息:
args 变量 打印配置帮助信息:
$ fes test -h
+Usage: fes test [options]
+
+run unit tests with jest
+
+Options:
+ --all The opposite of \`onlyChanged\`. If \`onlyChanged\`
+ is set by default, running jest with \`--all\`
+ will force Jest to run all tests instead of
+ running only tests related to changed files.
+ --automock Automock all files by default.
+ -b --bail Exit the test suite immediately after \`n\`
+ number of failing tests.
+ --browser Respect the "browser" field in package.json
+ when resolving modules. Some packages export
+ different versions based on whether they are
+ operating in node.js or a browser.
+ --cache Whether to use the transform cache. Disable the
+ cache using --no-cache.
+ --cacheDirectory The directory where Jest should store its
+ cached dependency information.
+ --changedFilesWithAncestor Runs tests related to the current changes and
+ the changes made in the last commit. Behaves
+ similarly to \`--onlyChanged\`.
+ --changedSince Runs tests related to the changes since the
+ provided branch. If the current branch has
+ diverged from the given branch, then only
+ changes made locally will be tested. Behaves
+ similarly to \`--onlyChanged\`.
+ --ci Whether to run Jest in continuous integration
+ (CI) mode. This option is on by default in most
+ popular CI environments. It will prevent
+ snapshots from being written unless explicitly
+ requested.
+ --clearCache Clears the configured Jest cache directory and
+ then exits. Default directory can be found by
+ calling jest --showConfig
+ --clearMocks Automatically clear mock calls and instances
+ between every test. Equivalent to calling
+ jest.clearAllMocks() between each test.
+ --collectCoverage Alias for --coverage.
+ --collectCoverageFrom A glob pattern relative to <rootDir> matching
+ the files that coverage info needs to be
+ collected from.
+ --collectCoverageOnlyFrom Explicit list of paths coverage will be
+ restricted to.
+ --color Forces test results output color highlighting
+ (even if stdout is not a TTY). Set to false if
+ you would like to have no colors.
+ --colors Alias for \`--color\`.
+ -c --config The path to a jest config file specifying how
+ to find and execute tests. If no rootDir is set
+ in the config, the directory containing the
+ config file is assumed to be the rootDir for
+ the project.This can also be a JSON encoded
+ value which Jest will use as configuration.
+ --coverage Indicates that test coverage information should
+ be collected and reported in the output.
+ --coverageDirectory The directory where Jest should output its
+ coverage files.
+ --coveragePathIgnorePatterns An array of regexp pattern strings that are
+ matched against all file paths before executing
+ the test. If the file pathmatches any of the
+ patterns, coverage information will be skipped.
+ --coverageProvider Select between Babel and V8 to collect coverage
+ --coverageReporters A list of reporter names that Jest uses when
+ writing coverage reports. Any istanbul reporter
+ can be used.
+ --coverageThreshold A JSON string with which will be used to
+ configure minimum threshold enforcement for
+ coverage results
+ --debug Print debugging info about your jest config.
+ --detectLeaks **EXPERIMENTAL**: Detect memory leaks in tests.
+ After executing a test, it will try to garbage
+ collect the global object used, and fail if it
+ was leaked
+ --detectOpenHandles Print out remaining open handles preventing
+ Jest from exiting at the end of a test run.
+ Implies \`runInBand\`.
+ --env The test environment used for all tests. This
+ can point to any file or node module. Examples:
+ \`jsdom\`, \`node\` or \`path/to/my-environment.js\`
+ --errorOnDeprecated Make calling deprecated APIs throw helpful
+ error messages.
+ -e --expand Use this flag to show full diffs instead of a
+ patch.
+ --filter Path to a module exporting a filtering
+ function. This method receives a list of tests
+ which can be manipulated to exclude tests from
+ running. Especially useful when used in
+ conjunction with a testing infrastructure to
+ filter known broken tests.
+ --findRelatedTests Find related tests for a list of source files
+ that were passed in as arguments. Useful for
+ pre-commit hook integration to run the minimal
+ amount of tests necessary.
+ --forceExit Force Jest to exit after all tests have
+ completed running. This is useful when
+ resources set up by test code cannot be
+ adequately cleaned up.
+ --globalSetup The path to a module that runs before All
+ Tests.
+ --globalTeardown The path to a module that runs after All Tests.
+ --globals A JSON string with map of global variables that
+ need to be available in all test environments.
+ --haste A JSON string with map of variables for the
+ haste module system
+ --init Generate a basic configuration file
+ --injectGlobals Should Jest inject global variables or not
+ --json Prints the test results in JSON. This mode will
+ send all other test output and user messages to
+ stderr.
+ --lastCommit Run all tests affected by file changes in the
+ last commit made. Behaves similarly to
+ \`--onlyChanged\`.
+ --listTests Lists all tests Jest will run given the
+ arguments and exits. Most useful in a CI system
+ together with \`--findRelatedTests\` to determine
+ the tests Jest will run based on specific files
+ --logHeapUsage Logs the heap usage after every test. Useful to
+ debug memory leaks. Use together with
+ \`--runInBand\` and \`--expose-gc\` in node.
+ --mapCoverage Maps code coverage reports against original source code when transformers supply source maps.
+
+ DEPRECATED
+ --maxConcurrency Specifies the maximum number of tests that are
+ allowed to runconcurrently. This only affects
+ tests using \`test.concurrent\`.
+ -w --maxWorkers Specifies the maximum number of workers the
+ worker-pool will spawn for running tests. This
+ defaults to the number of the cores available
+ on your machine. (its usually best not to
+ override this default)
+ --moduleDirectories An array of directory names to be searched
+ recursively up from the requiring module's
+ location.
+ --moduleFileExtensions An array of file extensions your modules use.
+ If you require modules without specifying a
+ file extension, these are the extensions Jest
+ will look for.
+ --moduleNameMapper A JSON string with a map from regular
+ expressions to module names or to arrays of
+ module names that allow to stub out resources,
+ like images or styles with a single module
+ --modulePathIgnorePatterns An array of regexp pattern strings that are
+ matched against all module paths before those
+ paths are to be considered "visible" to the
+ module loader.
+ --modulePaths An alternative API to setting the NODE_PATH env
+ variable, modulePaths is an array of absolute
+ paths to additional locations to search when
+ resolving modules.
+ --noStackTrace Disables stack trace in test results output
+ --notify Activates notifications for test results.
+ --notifyMode Specifies when notifications will appear for
+ test results.
+ -o --onlyChanged Attempts to identify which tests to run based
+ on which files have changed in the current
+ repository. Only works if you're running tests
+ in a git or hg repository at the moment.
+ -f --onlyFailures Run tests that failed in the previous
+ execution.
+ --outputFile Write test results to a file when the --json
+ option is also specified.
+ --passWithNoTests Will not fail if no tests are found (for
+ example while using \`--testPathPattern\`.)
+ --preset A preset that is used as a base for Jest's
+ configuration.
+ --prettierPath The path to the "prettier" module used for
+ inline snapshots.
+ --projects A list of projects that use Jest to run all
+ tests of all projects in a single instance of
+ Jest.
+ --reporters A list of custom reporters for the test suite.
+ --resetMocks Automatically reset mock state between every
+ test. Equivalent to calling
+ jest.resetAllMocks() between each test.
+ --resetModules If enabled, the module registry for every test
+ file will be reset before running each
+ individual test.
+ --resolver A JSON string which allows the use of a custom
+ resolver.
+ --restoreMocks Automatically restore mock state and
+ implementation between every test. Equivalent
+ to calling jest.restoreAllMocks() between each
+ test.
+ --rootDir The root directory that Jest should scan for
+ tests and modules within.
+ --roots A list of paths to directories that Jest should
+ use to search for files in.
+ -i --runInBand Run all tests serially in the current process
+ (rather than creating a worker pool of child
+ processes that run tests). This is sometimes
+ useful for debugging, but such use cases are
+ pretty rare.
+ --runTestsByPath Used when provided patterns are exact file
+ paths. This avoids converting them into a
+ regular expression and matching it against
+ every single file.
+ --runner Allows to use a custom runner instead of Jest's
+ default test runner.
+ --selectProjects Run only the tests of the specified
+ projects.Jest uses the attribute \`displayName\`
+ in the configuration to identify each project.
+ --setupFiles A list of paths to modules that run some code
+ to configure or set up the testing environment
+ before each test.
+ --setupFilesAfterEnv A list of paths to modules that run some code
+ to configure or set up the testing framework
+ before each test
+ --showConfig Print your jest config and then exits.
+ --silent Prevent tests from printing messages through
+ the console.
+ --skipFilter Disables the filter provided by --filter.
+ Useful for CI jobs, or local enforcement when
+ fixing tests.
+ --snapshotSerializers A list of paths to snapshot serializer modules
+ Jest should use for snapshot testing.
+ --testEnvironment Alias for --env
+ --testEnvironmentOptions Test environment options that will be passed to
+ the testEnvironment. The relevant options
+ depend on the environment.
+ --testFailureExitCode Exit code of \`jest\` command if the test run
+ failed
+ --testLocationInResults Add \`location\` information to the test results
+ --testMatch The glob patterns Jest uses to detect test
+ files.
+ -t --testNamePattern Run only tests with a name that matches the
+ regex pattern.
+ --testPathIgnorePatterns An array of regexp pattern strings that are
+ matched against all test paths before executing
+ the test. If the test path matches any of the
+ patterns, it will be skipped.
+ --testPathPattern A regexp pattern string that is matched against
+ all tests paths before executing the test.
+ --testRegex A string or array of string regexp patterns
+ that Jest uses to detect test files.
+ --testResultsProcessor Allows the use of a custom results processor.
+ This processor must be a node module that
+ exports a function expecting as the first
+ argument the result object.
+ --testRunner Allows to specify a custom test runner. The
+ default is \`jasmine2\`. A path to a custom test
+ runner can be provided:
+ \`<rootDir>/path/to/testRunner.js\`.
+ --testSequencer Allows to specify a custom test sequencer. The
+ default is \`@jest/test-sequencer\`. A path to a
+ custom test sequencer can be provided:
+ \`<rootDir>/path/to/testSequencer.js\`
+ --testTimeout This option sets the default timeouts of test
+ cases.
+ --testURL This option sets the URL for the jsdom
+ environment.
+ --timers Setting this value to fake allows the use of
+ fake timers for functions such as setTimeout.
+ --transform A JSON string which maps from regular
+ expressions to paths to transformers.
+ --transformIgnorePatterns An array of regexp pattern strings that are
+ matched against all source file paths before
+ transformation.
+ --unmockedModulePathPatterns An array of regexp pattern strings that are
+ matched against all modules before the module
+ loader will automatically return a mock for
+ them.
+ -u --updateSnapshot Use this flag to re-record snapshots. Can be
+ used together with a test suite pattern or with
+ \`--testNamePattern\` to re-record snapshot for
+ test matching the pattern
+ --useStderr Divert all output to stderr.
+ --verbose Display individual test results with the test
+ suite hierarchy.
+ --watch Watch files for changes and rerun tests related
+ to changed files. If you want to re-run all
+ tests when a file has changed, use the
+ \`--watchAll\` option.
+ --watchAll Watch files for changes and rerun all tests. If
+ you want to re-run only the tests related to
+ the changed files, use the \`--watch\` option.
+ --watchPathIgnorePatterns An array of regexp pattern strings that are
+ matched against all paths before trigger test
+ re-run in watch mode. If the test path matches
+ any of the patterns, it will be skipped.
+ --watchman Whether to use watchman for file crawling.
+ Disable using --no-watchman.
+ -h, --help display help for command
比如覆盖测试:
配置文件 除了插件内置的默认配置之外,插件遵循 Jest
的配置文件规范,约定项目根目录下的 jest.config.js
为用户配置文件,约定 packages.json
的 jest
属性内容也是配置。
优先级 args
配置 > package.json
中的 jest
> jest.config.js
> 默认配置
`,26),p=[t];function o(c,r,i,b,d,y){return a(),n("div",null,p)}const f=s(l,[["render",o]]);export{u as __pageData,f as default};
diff --git a/assets/reference_plugin_plugins_jest.md.d574f7ac.lean.js b/assets/reference_plugin_plugins_jest.md.d574f7ac.lean.js
new file mode 100644
index 000000000..42223462c
--- /dev/null
+++ b/assets/reference_plugin_plugins_jest.md.d574f7ac.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-jest","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/jest.md"}'),l={name:"reference/plugin/plugins/jest.md"},t=e("",26),p=[t];function o(c,r,i,b,d,y){return a(),n("div",null,p)}const f=s(l,[["render",o]]);export{u as __pageData,f as default};
diff --git a/assets/reference_plugin_plugins_layout.md.c5c38247.js b/assets/reference_plugin_plugins_layout.md.fc5542e1.js
similarity index 76%
rename from assets/reference_plugin_plugins_layout.md.c5c38247.js
rename to assets/reference_plugin_plugins_layout.md.fc5542e1.js
index 1687ac1ab..43271142a 100644
--- a/assets/reference_plugin_plugins_layout.md.c5c38247.js
+++ b/assets/reference_plugin_plugins_layout.md.fc5542e1.js
@@ -1,106 +1,106 @@
-import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.85b09291.js";const t=o(`@fesjs/plugin-layout 介绍 为了进一步降低研发成本,我们将布局利用 fes.js
插件的方式内置,只需通过简单的配置即可拥有布局,包括导航以及侧边栏。从而做到用户无需关心布局。
侧边栏菜单数据根据路由中的配置自动生成。 布局,提供 side
、 top
、mixin
、left-right
四种布局。 主题,提供 light
、dark
两种主题。 默认实现对路由的 404、403 处理。 搭配 @fesjs/plugin-access 插件使用,可以完成对路由的权限控制。 搭配 @fesjs/plugin-locale 插件使用,提供切换语言的能力。 支持自定义头部或者侧边栏区域。 菜单支持配置 icon。 菜单标题支持国际化。 可配置页面是否需要 layout。 启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-layout " : " ^5.0.0 "
- }
-}
布局类型 配置参数是 navigation
, 布局有三种类型 side
、mixin
、top
和 left-right
, 默认是 side
。
side `,10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"")],-1),d=["src"],C=o(`页面个性化 可以为页面单独设置布局类型:
js import { defineRouteMeta } from ' @fesjs/fes ' ;
+import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.b31a4d00.js";const t=o(`@fesjs/plugin-layout 介绍 为了进一步降低研发成本,我们将布局利用 fes.js
插件的方式内置,只需通过简单的配置即可拥有布局,包括导航以及侧边栏。从而做到用户无需关心布局。
侧边栏菜单数据根据路由中的配置自动生成。 布局,提供 side
、 top
、mixin
、left-right
四种布局。 主题,提供 light
、dark
两种主题。 默认实现对路由的 404、403 处理。 搭配 @fesjs/plugin-access 插件使用,可以完成对路由的权限控制。 搭配 @fesjs/plugin-locale 插件使用,提供切换语言的能力。 支持自定义头部或者侧边栏区域。 菜单支持配置 icon。 菜单标题支持国际化。 可配置页面是否需要 layout。 启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-layout " : " ^5.0.0 "
+ }
+}
布局类型 配置参数是 navigation
, 布局有三种类型 side
、mixin
、top
和 left-right
, 默认是 side
。
side `,10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"")],-1),d=["src"],B=o(`页面个性化 可以为页面单独设置布局类型:
js import { defineRouteMeta } from ' @fesjs/fes ' ;
-defineRouteMeta ( {
- layout : {
- navigation : null,
- },
-} ) ;
当设置为 null
时,页面不使用布局。
页面缓存 支持配置页面缓存,通过定义路由元信息 开启缓存:
js import { defineRouteMeta } from ' @fesjs/fes ' ;
+defineRouteMeta ( {
+ layout : {
+ navigation : null,
+ },
+} ) ;
当设置为 null
时,页面不使用布局。
页面缓存 支持配置页面缓存,通过定义路由元信息 开启缓存:
js import { defineRouteMeta } from ' @fesjs/fes ' ;
-defineRouteMeta ( {
- ' keep-alive ' : true ,
-} ) ;
处理嵌套路由 Fes.js 里约定目录下有 layout.vue
时会生成嵌套路由,以 layout.vue
为该目录的公共父组件,layout.vue 中必须实现 <RouterView/>
。如果嵌套路由下的页面设置了 keep-alive
,则需要用 <Page/>
替换 <RouterView/>
,<Page/>
实现了页面缓存。
vue < template >
- < Page />
+defineRouteMeta ( {
+ ' keep-alive ' : true ,
+} ) ;
处理嵌套路由 Fes.js 里约定目录下有 layout.vue
时会生成嵌套路由,以 layout.vue
为该目录的公共父组件,layout.vue 中必须实现 <RouterView/>
。如果嵌套路由下的页面设置了 keep-alive
,则需要用 <Page/>
替换 <RouterView/>
,<Page/>
实现了页面缓存。
vue < template >
+ < Page />
</ template >
< script >
-import { Page } from ' @fesjs/fes ' ;
-export default {
- components : {
- Page ,
- },
+import { Page } from ' @fesjs/fes ' ;
+export default {
+ components : {
+ Page ,
+ },
};
-</ script >
配置 编译时配置方式 在 .fes.js
中配置:
js export default {
- layout : {
+</ script >
配置 编译时配置方式 在 .fes.js
中配置:
js export default {
+ layout : {
// 标题
- title : ' Fes.js ' ,
+ title : ' Fes.js ' ,
// 底部文字
- footer : ' Created by MumbleFE ' ,
+ footer : ' Created by MumbleFE ' ,
// 主题light
- theme : ' dark ' ,
- menus : [ {
- name : ' index '
- }, {
- name : ' onepiece '
- }, {
- name : ' store '
- }, {
- name : ' simpleList '
- } ] ,
+ theme : ' dark ' ,
+ menus : [ {
+ name : ' index '
+ }, {
+ name : ' onepiece '
+ }, {
+ name : ' store '
+ }, {
+ name : ' simpleList '
+ } ] ,
- },
-};
运行时配置方式 在 app.js
中配置:
js import UserCenter from ' @/components/UserCenter ' ;
-export const layout = {
- renderCustom : () => < UserCenter />,
- menus : [
- {
- name : ' index ' ,
- },
- ] ,
-};
在fes.js
中,运行时配置有定义对象和函数两种方式,当使用函数配置layout
时,layoutConfig
是编译时配置结果,initialState
是 beforeRender.action
执行后创建的应用初始状态数据。 。
js export function layout ( layoutConfig , { initialState }) {
+ },
+};
运行时配置方式 在 app.js
中配置:
js import UserCenter from ' @/components/UserCenter ' ;
+export const layout = {
+ renderCustom : () => < UserCenter />,
+ menus : [
+ {
+ name : ' index ' ,
+ },
+ ] ,
+};
在fes.js
中,运行时配置有定义对象和函数两种方式,当使用函数配置layout
时,layoutConfig
是编译时配置结果,initialState
是 beforeRender.action
执行后创建的应用初始状态数据。 。
js export function layout ( layoutConfig , { initialState }) {
return {
renderCustom : () => < UserCenter />,
menus : () => {
- const menusRef = ref ( layoutConfig . menus ) ;
+ const menusRef = ref ( layoutConfig . menus ) ;
watch (
- () => initialState . userName ,
+ () => initialState . userName ,
() => {
- menusRef . value = [
+ menusRef . value = [
{
name : ' store ' ,
},
] ;
},
) ;
- return menusRef ;
+ return menusRef ;
},
};
-}
最终配置结果是运行时配置跟编译时配置合并的结果,运行时配置优先于编译时配置。
实际上运行配置能做的事情更多,推荐用运行时配置方式。
类型 :String
默认值 :null
详情 :页面底部的文字。
theme 类型 :String
默认值 :dark
详情 :主题,可选有 dark
、light
navigation navigationOnError 类型 :Boolean
默认值 :false
详情 :是否固定头部,不跟随页面滚动。
类型 :Boolean
默认值 :true
详情 :是否固定 sidebar,不跟随页面滚动。
title logo js export const layout = {
- logo : \`\${ process . env . BASE_URL } logo.png \` ,
-};
multiTabs 类型 :boolean
默认值 :false
详情 :是否开启多页。
TIP
函数类型仅在运行时可用,可以实现动态变更菜单。
sideWidth 类型 :Number
默认值 :200
详情 :sidebar 的宽度
renderCustom 类型 : ()=> VNodes
默认值 :null
详情 : 自定义区域内容,仅运行时。
unAccessHandler 类型 :({ to, from, next})=> void
默认值 :null
详情 :仅运行时,当进入某个路由时,如果路由对应的页面不属于可见资源列表,则会暂停进入,调用 unAccessHandler
函数。
参数
router:createRouter 创建的路由实例 to: 准备进入的路由 from:离开的路由 next: next 函数 比如:
js export const layout = {
+ unAccessHandler ({ to , next }) {
+ const accesssIds = accessApi . getAccess () ;
+ if ( to . path === ' /404 ' ) {
+ accessApi . setAccess ( accesssIds . concat ([ ' /404 ' ])) ;
return next ( ' /404 ' ) ;
}
- if ( ! accesssIds . includes ( ' /403 ' )) {
- accessApi . setAccess ( accesssIds . concat ([ ' /403 ' ])) ;
+ if ( ! accesssIds . includes ( ' /403 ' )) {
+ accessApi . setAccess ( accesssIds . concat ([ ' /403 ' ])) ;
}
next ( ' /403 ' ) ;
},
-};
noFoundHandler 类型 :({ to, from, next})=> void
默认值 :null
详情 :仅运行时,当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler
函数。
参数
router:createRouter 创建的路由实例 to: 准备进入的路由 from:离开的路由 next: next 函数 比如:
js export const layout = {
- noFoundHandler ({ next }) {
- const accesssIds = accessApi . getAccess () ;
- if ( ! accesssIds . includes ( ' /404 ' )) {
- accessApi . setAccess ( accesssIds . concat ([ ' /404 ' ])) ;
+};
noFoundHandler 类型 :({ to, from, next})=> void
默认值 :null
详情 :仅运行时,当进入某个路由时,如果路由对应的页面不存在,则会调用 noFoundHandler
函数。
参数
router:createRouter 创建的路由实例 to: 准备进入的路由 from:离开的路由 next: next 函数 比如:
js export const layout = {
+ noFoundHandler ({ next }) {
+ const accesssIds = accessApi . getAccess () ;
+ if ( ! accesssIds . includes ( ' /404 ' )) {
+ accessApi . setAccess ( accesssIds . concat ([ ' /404 ' ])) ;
}
next ( ' /404 ' ) ;
},
-};
API useTabTitle 类型定义如下:
ts function useTabTitle ( title : string | Ref < string >): void ;
当使用多页签模式时,在页面中使用 useTabTitle
可以自定义页面标签:
vue < script setup >
-import { useRoute , useTabTitle } from ' @fesjs/fes ' ;
+};
API useTabTitle 类型定义如下:
ts function useTabTitle ( title : string | Ref < string >): void ;
当使用多页签模式时,在页面中使用 useTabTitle
可以自定义页面标签:
vue < script setup >
+import { useRoute , useTabTitle } from ' @fesjs/fes ' ;
-const titleRef = useTabTitle ( \` 详情- \${ route . params ?. id }\` ) ;
+const titleRef = useTabTitle ( \` 详情- \${ route . params ?. id }\` ) ;
// 如果要更新
-titleRef . value = ' changed ' ;
-</ script >
4.x 升级到 5.x 个性化 layout 配置改为使用传入 navigation customHeader 改为 renderCustom fixedHeader 改为 isFixedHeader menusConfig 改为 menuProps fixedSideBar 改为 isFixedSidebar 去掉运行时 logo、header、sidebar 三个区域显示配置,请改为使用 navigation: left-right `,65),m=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),A={name:"reference/plugin/plugins/layout.md"},b=Object.assign(A,{setup(u){return(g,h)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),C]))}});export{m as __pageData,b as default};
+titleRef . value = ' changed ' ;
+</ script >
4.x 升级到 5.x 个性化 layout 配置改为使用传入 navigation customHeader 改为 renderCustom fixedHeader 改为 isFixedHeader menusConfig 改为 menuProps fixedSideBar 改为 isFixedSidebar 去掉运行时 logo、header、sidebar 三个区域显示配置,请改为使用 navigation: left-right `,65),f=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),u={name:"reference/plugin/plugins/layout.md"},m=Object.assign(u,{setup(g){return(h,A)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),B]))}});export{f as __pageData,m as default};
diff --git a/assets/reference_plugin_plugins_layout.md.c5c38247.lean.js b/assets/reference_plugin_plugins_layout.md.fc5542e1.lean.js
similarity index 68%
rename from assets/reference_plugin_plugins_layout.md.c5c38247.lean.js
rename to assets/reference_plugin_plugins_layout.md.fc5542e1.lean.js
index b86a7083b..778795db2 100644
--- a/assets/reference_plugin_plugins_layout.md.c5c38247.lean.js
+++ b/assets/reference_plugin_plugins_layout.md.fc5542e1.lean.js
@@ -1 +1 @@
-import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.85b09291.js";const t=o("",10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"")],-1),d=["src"],C=o("",65),m=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),A={name:"reference/plugin/plugins/layout.md"},b=Object.assign(A,{setup(u){return(g,h)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),C]))}});export{m as __pageData,b as default};
+import{o as p,c as e,C as s,b as a,V as o,a as l,y as n}from"./chunks/framework.b31a4d00.js";const t=o("",10),c=["src"],r=s("h3",{id:"top",tabindex:"-1"},[l("top "),s("a",{class:"header-anchor",href:"#top","aria-label":'Permalink to "top"'},"")],-1),i=["src"],F=s("h3",{id:"mixin",tabindex:"-1"},[l("mixin "),s("a",{class:"header-anchor",href:"#mixin","aria-label":'Permalink to "mixin"'},"")],-1),D=["src"],y=s("h3",{id:"left-right",tabindex:"-1"},[l("left-right "),s("a",{class:"header-anchor",href:"#left-right","aria-label":'Permalink to "left-right"'},"")],-1),d=["src"],B=o("",65),f=JSON.parse('{"title":"@fesjs/plugin-layout","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/layout.md"}'),u={name:"reference/plugin/plugins/layout.md"},m=Object.assign(u,{setup(g){return(h,A)=>(p(),e("div",null,[t,s("img",{src:a(n)("side.png"),alt:"side"},null,8,c),r,s("img",{src:a(n)("top.png"),alt:"top"},null,8,i),F,s("img",{src:a(n)("mixin.png"),alt:"mixin"},null,8,D),y,s("img",{src:a(n)("left-right.png"),alt:"left-right"},null,8,d),B]))}});export{f as __pageData,m as default};
diff --git a/assets/reference_plugin_plugins_locale.md.f2ad7111.js b/assets/reference_plugin_plugins_locale.md.c271ad1f.js
similarity index 69%
rename from assets/reference_plugin_plugins_locale.md.f2ad7111.js
rename to assets/reference_plugin_plugins_locale.md.c271ad1f.js
index 7841b64d8..959a7e826 100644
--- a/assets/reference_plugin_plugins_locale.md.f2ad7111.js
+++ b/assets/reference_plugin_plugins_locale.md.c271ad1f.js
@@ -1,74 +1,74 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n(`@fesjs/plugin-locale 介绍 国际化插件,基于 Vue I18n ,用于解决 i18n 问题。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-locale " : " ^3.0.0 "
- }
-}
配置 约定式配置 Fes.js 约定如下目录,项目就拥有了 zh-CN
与 en-US
国际化语言切换:
src
- ├── locales
- │ ├── zh-CN.js
- │ └── en-US.js
- └── pages
- │ └── index.vue
- └── app.js
多语言文件的命名规范:<lang>-<COUNTRY>.js
多语言文件的内容规范:键值组成的字面量,如下:
js // src/locales/zh-CN.js
-export default {
- menu : {
- interface : ' 接口 ' ,
- },
- overview : ' 概述 ' ,
- i18n : {
- internationalization : ' 国际化,基于 ' ,
- achieve : ' 实现。 ' ,
- ui : ' UI组件 ' ,
- },
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n(`@fesjs/plugin-locale 介绍 国际化插件,基于 Vue I18n ,用于解决 i18n 问题。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-locale " : " ^3.0.0 "
+ }
+}
配置 约定式配置 Fes.js 约定如下目录,项目就拥有了 zh-CN
与 en-US
国际化语言切换:
src
+ ├── locales
+ │ ├── zh-CN.js
+ │ └── en-US.js
+ └── pages
+ │ └── index.vue
+ └── app.js
多语言文件的命名规范:<lang>-<COUNTRY>.js
多语言文件的内容规范:键值组成的字面量,如下:
js // src/locales/zh-CN.js
+export default {
+ menu : {
+ interface : ' 接口 ' ,
+ },
+ overview : ' 概述 ' ,
+ i18n : {
+ internationalization : ' 国际化,基于 ' ,
+ achieve : ' 实现。 ' ,
+ ui : ' UI组件 ' ,
+ },
};
js // src/locales/en-US.js
-export default {
- menu : {
- interface : ' interface ' ,
- },
- overview : ' Overview ' ,
- i18n : {
- internationalization : ' internationalization,base on ' ,
- achieve : ' to achieve. ' ,
- ui : ' UI components ' ,
- },
-};
想了解更多语言信息配置、匹配规则,请参考 Vue I18n 文档。
多层配置 如果国际化内容较多,希望模块化配置,则可以这样:
src
- ├── locales
- │ ├── zh-CN.js
- │ └── en-US.js
- | └── system
- | ├── zh-CN.js
- │ └── en-US.js
- └── pages
- │ └── index.vue
- └── app.js
插件会把相同语言的配置合并在一起!
编译时配置 在执行 fes dev
或者 fes build
时,通过此配置生成运行时的代码,在配置文件.fes.js
中配置:
js export default {
- locale : {},
-};
默认配置为:
js export default {
- locale : {
- locale : ' zh-CN ' , // default locale
- fallbackLocale : ' zh-CN ' , // set fallback locale
- baseNavigator : true , // 开启浏览器语言检测
- legacy : false , // 用户是否需要 Legacy API 模式
- },
-};
所有配置项如下:
locale 类型 :String
默认值 :zh-CN
详情 :当前的语言。
fallbackLocale baseNavigator 类型 :Boolean
默认值 :true
详情 :开启浏览器语言检测。
默认情况下,当前语言环境的识别按照:localStorage
中 fes_locale
值 > 浏览器检测 > default
设置的默认语言 > zh-CN
中文。
legacy 类型 :Boolean
默认值 :false
详情 :用户是否需要 Legacy API 模式
运行时配置 暂无。
API locale 插件 API 通过 @fesjs/fes
导出:
js import { locale } from ' @fesjs/fes ' ;
locale.messages locale.setLocale 类型 :Function
详情 :设置当前的语言。参数 : locale,语言的名称,应该是符合 <lang>-<COUNTRY>
规范的名称。 返回值 :null
js import { locale } from ' @fesjs/fes ' ;
-locale . setLocale ( { locale : ' en-US ' } ) ;
locale.addLocale 类型 :Function
详情 :手动添加语言配置。参数 : locale,语言的名称,符合 <lang>-<COUNTRY>
规范的名称。 messages, 语言信息。 返回值 :null
js import { locale } from ' @fesjs/fes ' ;
-locale . addLocale ( { locale : ' ja-JP ' , messages : { test : ' テスト ' } } ) ;
locale.getAllLocales 类型 :Function
详情 :获取当前获得所有国际化文件的列表,默认会在 locales 文件夹下寻找类似 en-US.js
文件。参数 :null返回值 :Array
js import { locale } from ' @fesjs/fes ' ;
-console . log (locale . getAllLocales ()) ;
+export default {
+ menu : {
+ interface : ' interface ' ,
+ },
+ overview : ' Overview ' ,
+ i18n : {
+ internationalization : ' internationalization,base on ' ,
+ achieve : ' to achieve. ' ,
+ ui : ' UI components ' ,
+ },
+};
想了解更多语言信息配置、匹配规则,请参考 Vue I18n 文档。
多层配置 如果国际化内容较多,希望模块化配置,则可以这样:
src
+ ├── locales
+ │ ├── zh-CN.js
+ │ └── en-US.js
+ | └── system
+ | ├── zh-CN.js
+ │ └── en-US.js
+ └── pages
+ │ └── index.vue
+ └── app.js
插件会把相同语言的配置合并在一起!
编译时配置 在执行 fes dev
或者 fes build
时,通过此配置生成运行时的代码,在配置文件.fes.js
中配置:
js export default {
+ locale : {},
+};
默认配置为:
js export default {
+ locale : {
+ locale : ' zh-CN ' , // default locale
+ fallbackLocale : ' zh-CN ' , // set fallback locale
+ baseNavigator : true , // 开启浏览器语言检测
+ legacy : false , // 用户是否需要 Legacy API 模式
+ },
+};
所有配置项如下:
locale 类型 :String
默认值 :zh-CN
详情 :当前的语言。
fallbackLocale baseNavigator 类型 :Boolean
默认值 :true
详情 :开启浏览器语言检测。
默认情况下,当前语言环境的识别按照:localStorage
中 fes_locale
值 > 浏览器检测 > default
设置的默认语言 > zh-CN
中文。
legacy 类型 :Boolean
默认值 :false
详情 :用户是否需要 Legacy API 模式
运行时配置 暂无。
API locale 插件 API 通过 @fesjs/fes
导出:
js import { locale } from ' @fesjs/fes ' ;
locale.messages locale.setLocale 类型 :Function
详情 :设置当前的语言。参数 : locale,语言的名称,应该是符合 <lang>-<COUNTRY>
规范的名称。 返回值 :null
js import { locale } from ' @fesjs/fes ' ;
+locale . setLocale ( { locale : ' en-US ' } ) ;
locale.addLocale 类型 :Function
详情 :手动添加语言配置。参数 : locale,语言的名称,符合 <lang>-<COUNTRY>
规范的名称。 messages, 语言信息。 返回值 :null
js import { locale } from ' @fesjs/fes ' ;
+locale . addLocale ( { locale : ' ja-JP ' , messages : { test : ' テスト ' } } ) ;
locale.getAllLocales 类型 :Function
详情 :获取当前获得所有国际化文件的列表,默认会在 locales 文件夹下寻找类似 en-US.js
文件。参数 :null返回值 :Array
js import { locale } from ' @fesjs/fes ' ;
+console . log (locale . getAllLocales ()) ;
// ["en-US", "id-ID", "ja-JP", "pt-BR", "zh-CN", "zh-TW"]
useI18n Composition API, 只能在 setup
函数中使用,更多细节参考 Vue I18n 。 \b 举个 🌰:
vue < template >
- < form >
- < label > {{ t('language') }} </ label >
- </ form >
- < p > message: {{ t('hello') }} </ p >
+ < form >
+ < label > {{ t('language') }} </ label >
+ </ form >
+ < p > message: {{ t('hello') }} </ p >
</ template >
< script >
-import { useI18n } from ' @fesjs/fes '
+import { useI18n } from ' @fesjs/fes '
-export default {
- setup () {
- const { t } = useI18n ()
+export default {
+ setup () {
+ const { t } = useI18n ()
// Something to do ...
- return { ..., t }
+ return { ..., t }
}
}
-</ script >
useI18n()
返回结果是 Composer ,提供类似 t
、n
、d
等转换函数,在模板中使用。
`,55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default};
+</ script >
useI18n()
返回结果是 Composer ,提供类似 t
、n
、d
等转换函数,在模板中使用。
`,55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_locale.md.c271ad1f.lean.js b/assets/reference_plugin_plugins_locale.md.c271ad1f.lean.js
new file mode 100644
index 000000000..6f537e6b9
--- /dev/null
+++ b/assets/reference_plugin_plugins_locale.md.c271ad1f.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as l,V as n}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n("",55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_locale.md.f2ad7111.lean.js b/assets/reference_plugin_plugins_locale.md.f2ad7111.lean.js
deleted file mode 100644
index 10bb2b7e4..000000000
--- a/assets/reference_plugin_plugins_locale.md.f2ad7111.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as l,V as n}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-locale","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/locale.md"}'),o={name:"reference/plugin/plugins/locale.md"},p=n("",55),e=[p];function t(c,r,D,y,F,i){return a(),l("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_login.md.50fc66a2.lean.js b/assets/reference_plugin_plugins_login.md.50fc66a2.lean.js
deleted file mode 100644
index b7851693d..000000000
--- a/assets/reference_plugin_plugins_login.md.50fc66a2.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l("",8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_login.md.50fc66a2.js b/assets/reference_plugin_plugins_login.md.c4b18ed3.js
similarity index 70%
rename from assets/reference_plugin_plugins_login.md.50fc66a2.js
rename to assets/reference_plugin_plugins_login.md.c4b18ed3.js
index 4a438b09c..3b993c04a 100644
--- a/assets/reference_plugin_plugins_login.md.50fc66a2.js
+++ b/assets/reference_plugin_plugins_login.md.c4b18ed3.js
@@ -1,16 +1,16 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l(`@fesjs/plugin-login 介绍 管理自定义 login 页面,包括 login 页面权限问题,跳转登陆问题。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-login " : " ^3.0.0 "
- }
-}
运行时配置 js import { defineRuntimeConfig } from ' @fesjs/fes ' ;
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l(`@fesjs/plugin-login 介绍 管理自定义 login 页面,包括 login 页面权限问题,跳转登陆问题。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-login " : " ^3.0.0 "
+ }
+}
运行时配置 js import { defineRuntimeConfig } from ' @fesjs/fes ' ;
-export default defineRuntimeConfig ( {
- login : {
- loginPath : ' /login ' , // 登陆页面路径,默认 /login,也可以用路由的 name
- hasLogin () {
+export default defineRuntimeConfig ( {
+ login : {
+ loginPath : ' /login ' , // 登陆页面路径,默认 /login,也可以用路由的 name
+ hasLogin () {
// 进入页面前判断是否登陆的逻辑,每次跳转非登陆页面都会检测,直到为 true,支持异步
return true ;
},
- },
-} ) ;
`,8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{A as __pageData,u as default};
+ },
+} ) ;
`,8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{u as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_login.md.c4b18ed3.lean.js b/assets/reference_plugin_plugins_login.md.c4b18ed3.lean.js
new file mode 100644
index 000000000..a8d0c70fd
--- /dev/null
+++ b/assets/reference_plugin_plugins_login.md.c4b18ed3.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-login","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/login.md"}'),o={name:"reference/plugin/plugins/login.md"},p=l("",8),e=[p];function t(c,r,D,i,F,y){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{u as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_model.md.0ebb79f4.lean.js b/assets/reference_plugin_plugins_model.md.0ebb79f4.lean.js
deleted file mode 100644
index 82c8d4487..000000000
--- a/assets/reference_plugin_plugins_model.md.0ebb79f4.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l("",22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_model.md.0ebb79f4.js b/assets/reference_plugin_plugins_model.md.ef7fdf24.js
similarity index 80%
rename from assets/reference_plugin_plugins_model.md.0ebb79f4.js
rename to assets/reference_plugin_plugins_model.md.ef7fdf24.js
index 0cf44b175..cd2c3a3fa 100644
--- a/assets/reference_plugin_plugins_model.md.0ebb79f4.js
+++ b/assets/reference_plugin_plugins_model.md.ef7fdf24.js
@@ -1,38 +1,38 @@
-import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l(`@fesjs/plugin-model 启用方式 在 package.json 中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-model " : " ^3.0.0 "
- }
-}
介绍 一种简易的数据管理方案。我们知道 Vue 的理念是用响应式数据驱动 UI 更新,提供 reactive
、 ref
等 API 把数据变成响应式的。我们使用Provide / Inject
特性,在应用实例中共享响应式数据。
我们约定src/models
目录下的文件为项目定义的 model
文件。每个文件需要默认导出一个 function
。
文件名则对应最终 model
的 name
,你可以通过插件提供的 API
来消费 model
中的数据。
Model 文件 src/models/useAuthModel.js
js import { reactive } from ' vue ' ;
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l(`@fesjs/plugin-model 启用方式 在 package.json 中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-model " : " ^3.0.0 "
+ }
+}
介绍 一种简易的数据管理方案。我们知道 Vue 的理念是用响应式数据驱动 UI 更新,提供 reactive
、 ref
等 API 把数据变成响应式的。我们使用Provide / Inject
特性,在应用实例中共享响应式数据。
我们约定src/models
目录下的文件为项目定义的 model
文件。每个文件需要默认导出一个 function
。
文件名则对应最终 model
的 name
,你可以通过插件提供的 API
来消费 model
中的数据。
Model 文件 src/models/useAuthModel.js
js import { reactive } from ' vue ' ;
-export default function useAuthModel () {
- const user = reactive ( {} ) ;
+export default function useAuthModel () {
+ const user = reactive ( {} ) ;
- const signin = () => {
+ const signin = () => {
// todo
};
- const signout = () => {
+ const signout = () => {
// todo
};
return {
- user ,
- signin ,
- signout ,
+ user ,
+ signin ,
+ signout ,
};
}
在组件中使用 Model vue < script >
-import { useModel } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const { user , signin , signout } = useModel ( ' useAuthModel ' ) ;
+import { useModel } from ' @fesjs/fes ' ;
+export default {
+ setup () {
+ const { user , signin , signout } = useModel ( ' useAuthModel ' ) ;
},
};
-</ script >
@@initialState 在beforeRender
的返回的内容会写入@@initialState
js export const beforeRender = {
- loading : < PageLoading />,
- action () {
- const { setRole } = access ;
- return new Promise ( ( resolve ) => {
+</ script >
@@initialState 在beforeRender
的返回的内容会写入@@initialState
js export const beforeRender = {
+ loading : < PageLoading />,
+ action () {
+ const { setRole } = access ;
+ return new Promise ( ( resolve ) => {
setTimeout ( () => {
setRole ( ' admin ' ) ;
// 初始化应用的全局状态,可以通过 useModel('@@initialState') 获取,具体用法看@/components/UserCenter 文件
@@ -43,18 +43,18 @@ import{_ as s,o as n,c as a,V as l}from"./chunks/framework.85b09291.js";const A=
} ) ;
},
};
然后我们可以在其他组件中使用:
vue < template >
- < div class = " right " > {{ initialState.userName }} </ div >
+ < div class = " right " > {{ initialState.userName }} </ div >
</ template >
< script >
-import { useModel } from ' @fesjs/fes ' ;
+import { useModel } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const initialState = useModel ( ' @@initialState ' ) ;
+export default {
+ setup () {
+ const initialState = useModel ( ' @@initialState ' ) ;
return {
- initialState ,
+ initialState ,
};
},
};
</ script >
-< style scope ></ style >
API useModel useModel(name)
类型 :函数详情 : 获取 Model 数据,\b 也就是 Model 文件默认导出函数执行的结果。参数 : `,22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default};
+< style scope ></ style >
API useModel useModel(name)
类型 :函数详情 : 获取 Model 数据,\b 也就是 Model 文件默认导出函数执行的结果。参数 : `,22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_model.md.ef7fdf24.lean.js b/assets/reference_plugin_plugins_model.md.ef7fdf24.lean.js
new file mode 100644
index 000000000..f6712bd43
--- /dev/null
+++ b/assets/reference_plugin_plugins_model.md.ef7fdf24.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as n,c as a,V as l}from"./chunks/framework.b31a4d00.js";const B=JSON.parse('{"title":"@fesjs/plugin-model","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/model.md"}'),o={name:"reference/plugin/plugins/model.md"},p=l("",22),e=[p];function t(c,r,F,y,D,i){return n(),a("div",null,e)}const u=s(o,[["render",t]]);export{B as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_pinia.md.f23c8887.js b/assets/reference_plugin_plugins_pinia.md.c7ff2416.js
similarity index 73%
rename from assets/reference_plugin_plugins_pinia.md.f23c8887.js
rename to assets/reference_plugin_plugins_pinia.md.c7ff2416.js
index a7bcf13e0..bb07e25db 100644
--- a/assets/reference_plugin_plugins_pinia.md.f23c8887.js
+++ b/assets/reference_plugin_plugins_pinia.md.c7ff2416.js
@@ -1,36 +1,36 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l(`@fesjs/plugin-pinia 介绍 集成 pinia ,提供状态管理的能力,封装一些胶水代码,可以直接定义 store 使用。
为了防止 Fes.js
与 pinia
提供的 API 冲突,Fes.js
不提供任何 pinia
的 API,相关 API 直接从 pinia
导出:
js import { defineStore } from ' pinia ' ;
约定 plugin
定义放在 stores
目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。
└── src
- ├── pages
- │ └── index.vue
- └── stores
- │ ├── plugin-logger.js
- │ ├── user.js
- └── app.js
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-pinia " : " ^3.0.0 " ,
- " pinia " : " ^2.0.11 "
- }
-}
API pinia createPinia
执行后创建的实例。
js import { pinia } from ' @fesjs/fes ' ;
使用 定义 store 我们在 src/store/main.js
中:
js import { defineStore } from ' pinia ' ;
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l(`@fesjs/plugin-pinia 介绍 集成 pinia ,提供状态管理的能力,封装一些胶水代码,可以直接定义 store 使用。
为了防止 Fes.js
与 pinia
提供的 API 冲突,Fes.js
不提供任何 pinia
的 API,相关 API 直接从 pinia
导出:
js import { defineStore } from ' pinia ' ;
约定 plugin
定义放在 stores
目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。
└── src
+ ├── pages
+ │ └── index.vue
+ └── stores
+ │ ├── plugin-logger.js
+ │ ├── user.js
+ └── app.js
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-pinia " : " ^3.0.0 " ,
+ " pinia " : " ^2.0.11 "
+ }
+}
API pinia createPinia
执行后创建的实例。
js import { pinia } from ' @fesjs/fes ' ;
使用 定义 store 我们在 src/store/main.js
中:
js import { defineStore } from ' pinia ' ;
// useStore could be anything like useUser, useCart
// the first argument is a unique id of the store across your application
-export const useStore = defineStore ( ' main ' , {
+export const useStore = defineStore ( ' main ' , {
// other options...
-} ) ;
setup js import { useStore } from ' @/store/main ' ;
-export default {
- setup () {
- const store = useStore () ;
+} ) ;
setup js import { useStore } from ' @/store/main ' ;
+export default {
+ setup () {
+ const store = useStore () ;
},
-};
非 setup 比如在 app.js 中:
js import { pinia } from ' @fesjs/fes ' ;
+};
非 setup 比如在 app.js 中:
js import { pinia } from ' @fesjs/fes ' ;
-export const beforeRender = {
- loading : < PageLoading />,
- action () {
- const { setRole } = accessApi ;
- return new Promise ( ( resolve ) => {
+export const beforeRender = {
+ loading : < PageLoading />,
+ action () {
+ const { setRole } = accessApi ;
+ return new Promise ( ( resolve ) => {
setTimeout ( () => {
- const store = useStore ( pinia ) ;
- store . $patch ( {
+ const store = useStore ( pinia ) ;
+ store . $patch ( {
userName : ' 李雷 ' ,
role : ' admin ' ,
} ) ;
@@ -38,4 +38,4 @@ import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=
}, 1000 ) ;
} ) ;
},
-};
`,23),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+};
`,23),e=[o];function t(c,r,F,y,D,i){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{d as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_pinia.md.c7ff2416.lean.js b/assets/reference_plugin_plugins_pinia.md.c7ff2416.lean.js
new file mode 100644
index 000000000..2d0785968
--- /dev/null
+++ b/assets/reference_plugin_plugins_pinia.md.c7ff2416.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l("",23),e=[o];function t(c,r,F,y,D,i){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{d as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_pinia.md.f23c8887.lean.js b/assets/reference_plugin_plugins_pinia.md.f23c8887.lean.js
deleted file mode 100644
index 4745bef2c..000000000
--- a/assets/reference_plugin_plugins_pinia.md.f23c8887.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-pinia","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/pinia.md"}'),p={name:"reference/plugin/plugins/pinia.md"},o=l("",23),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.lean.js b/assets/reference_plugin_plugins_qiankun.md.a2eacef5.lean.js
deleted file mode 100644
index 7946f1873..000000000
--- a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l("",55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.js b/assets/reference_plugin_plugins_qiankun.md.ec18784c.js
similarity index 70%
rename from assets/reference_plugin_plugins_qiankun.md.a2eacef5.js
rename to assets/reference_plugin_plugins_qiankun.md.ec18784c.js
index d5518e1ad..375b4fc45 100644
--- a/assets/reference_plugin_plugins_qiankun.md.a2eacef5.js
+++ b/assets/reference_plugin_plugins_qiankun.md.ec18784c.js
@@ -1,170 +1,170 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l(`@fesjs/plugin-qiankun Fes.js plugin for qiankun ,参考@umijs/plugin-qiankun 实现,喜欢 React 的同学推荐直接用 Umi。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-qiankun " : " ^3.0.0 "
- }
-}
介绍 有一种痛叫接手老项目,技术栈老旧,内容多,还要继续维护~
可能目前迁移、升级老项目最好的解决方案就是微前端。plugin-qiankun
是基于 qiankun
实现的 Fes.js 微前端解决方案。
主应用配置 第一步:注册子应用 js export default {
- qiankun : {
- main : {
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l(`@fesjs/plugin-qiankun Fes.js plugin for qiankun ,参考@umijs/plugin-qiankun 实现,喜欢 React 的同学推荐直接用 Umi。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-qiankun " : " ^3.0.0 "
+ }
+}
介绍 有一种痛叫接手老项目,技术栈老旧,内容多,还要继续维护~
可能目前迁移、升级老项目最好的解决方案就是微前端。plugin-qiankun
是基于 qiankun
实现的 Fes.js 微前端解决方案。
主应用配置 第一步:注册子应用 js export default {
+ qiankun : {
+ main : {
// 注册子应用信息
- apps : [
- {
- name : ' app1 ' , // 唯一 id
- entry : ' //localhost:8001 ' , // html entry
- props : {}, // 传递给子应用的数据
- },
- {
- name : ' app2 ' , // 唯一 id
- entry : ' //localhost:8002 ' , // html entry
- },
- ] ,
- },
- },
-};
当使用 vite
构建时需注意,name 必须跟子应用 package.json
的 name
保持一致。
第二步:装载子应用 使用路由绑定的方式 WARNING
主应用和子应用需要自行适配路由路径!!!待完善...
假设我们的系统之前有这样的一些路由:
js export default {
- router : {
- routes : [
- {
- path : ' / ' ,
- component : () => import ( ' @/src/.fes/plugin-layout/index.js ' ) ,
- children : [
- {
- path : ' /onepiece ' ,
- component : () => import ( ' @/pages/onepiece ' ) ,
- name : ' onepiece ' ,
- meta : {
- name : ' onepiece ' ,
- title : ' onepiece ' ,
- },
- },
- ] ,
- },
- ] ,
- },
-};
我们现在想在 /son
加载子应用 app1
,只需要增加这样一些配置即可:
js export default {
- router : {
- routes : [
- {
- path : ' / ' ,
- component : () => import ( ' @/src/.fes/plugin-layout/index.js ' ) ,
- children : [
- {
- path : ' /onepiece ' ,
- component : () => import ( ' @/pages/onepiece ' ) ,
- name : ' onepiece ' ,
- meta : {
- name : ' onepiece ' ,
- title : ' onepiece ' ,
- },
- },
- {
- path : ' /son ' ,
- meta : {
- name : ' son ' ,
- },
- },
- ] ,
- },
- ] ,
- },
+ apps : [
+ {
+ name : ' app1 ' , // 唯一 id
+ entry : ' //localhost:8001 ' , // html entry
+ props : {}, // 传递给子应用的数据
+ },
+ {
+ name : ' app2 ' , // 唯一 id
+ entry : ' //localhost:8002 ' , // html entry
+ },
+ ] ,
+ },
+ },
+};
当使用 vite
构建时需注意,name 必须跟子应用 package.json
的 name
保持一致。
第二步:装载子应用 使用路由绑定的方式 WARNING
主应用和子应用需要自行适配路由路径!!!待完善...
假设我们的系统之前有这样的一些路由:
js export default {
+ router : {
+ routes : [
+ {
+ path : ' / ' ,
+ component : () => import ( ' @/src/.fes/plugin-layout/index.js ' ) ,
+ children : [
+ {
+ path : ' /onepiece ' ,
+ component : () => import ( ' @/pages/onepiece ' ) ,
+ name : ' onepiece ' ,
+ meta : {
+ name : ' onepiece ' ,
+ title : ' onepiece ' ,
+ },
+ },
+ ] ,
+ },
+ ] ,
+ },
+};
我们现在想在 /son
加载子应用 app1
,只需要增加这样一些配置即可:
js export default {
+ router : {
+ routes : [
+ {
+ path : ' / ' ,
+ component : () => import ( ' @/src/.fes/plugin-layout/index.js ' ) ,
+ children : [
+ {
+ path : ' /onepiece ' ,
+ component : () => import ( ' @/pages/onepiece ' ) ,
+ name : ' onepiece ' ,
+ meta : {
+ name : ' onepiece ' ,
+ title : ' onepiece ' ,
+ },
+ },
+ {
+ path : ' /son ' ,
+ meta : {
+ name : ' son ' ,
+ },
+ },
+ ] ,
+ },
+ ] ,
+ },
};
在src/pages
目录新建 son.vue
:
vue < config >
-{
- "name": "son",
- "title": "子应用",
- "microApp": "app1"
-}
+{
+ "name": "son",
+ "title": "子应用",
+ "microApp": "app1"
+}
</ config >
使用 <MicroApp />
组件的方式 TIP
建议使用这种方式来引入不带路由的子应用。 否则请自行关注子应用依赖的路由跟当前浏览器 url 是否能正确匹配上,否则很容易出现子应用加载了,但是页面没有渲染出来的情况。
vue < template >
- < MicroApp :name = " name " />
+ < MicroApp :name = " name " />
</ template >
< script >
-import { MicroApp } from ' @fesjs/fes ' ;
+import { MicroApp } from ' @fesjs/fes ' ;
-export default {
- components : { MicroApp },
- setup () {
- const name = ' app1 ' ;
+export default {
+ components : { MicroApp },
+ setup () {
+ const name = ' app1 ' ;
return {
- name ,
+ name ,
};
},
};
</ script >
使用 <MicroAppWithMemoHistory />
组件的方式 如果我们的路由使用 history
模式,那么在使用乾坤时还算方便,主应用和子应用的路由根据 base 可以很方便的匹配起来,而且不存在冲突。但是当我们使用 hash
模式时,就问题很大,主应用和子应用的路由必须一样才可以匹配上,用起来贼不方便。而且不能在一个页面上同时加载多个子应用,路由存在冲突!这时候,<MicroAppWithMemoHistory />
出现了,完美解决上面的问题。
<MicroAppWithMemoHistory />
相比 <MicroApp />
,需要多传入 url
参数,用于指定加载子应用什么路由页面。
vue < template >
- < MicroApp :name = " name " url = " / " />
+ < MicroApp :name = " name " url = " / " />
</ template >
< script >
-import { MicroApp } from ' @fesjs/fes ' ;
+import { MicroApp } from ' @fesjs/fes ' ;
-export default {
- components : { MicroApp },
- setup () {
- const name = ' app1 ' ;
+export default {
+ components : { MicroApp },
+ setup () {
+ const name = ' app1 ' ;
return {
- name ,
+ name ,
};
},
};
-</ script >
子应用配置 第一步:插件注册 js export default {
- qiankun : {
- micro : {},
- },
-};
如果使用 vite
构建,当执行 dev
时需要额外配置:
js export default {
- qiankun : {
- micro : {
- useDevMode : true ,
- },
- },
-};
第二步:配置运行时生命周期钩子(可选) 插件会自动为你创建好 qiankun
子应用需要的生命周期钩子,但是如果你想在生命周期期间加一些自定义逻辑,可以在子应用的 src/app.js
里导出 qiankun
对象,并实现每一个生命周期钩子,其中钩子函数的入参 props
由主应用自动注入。
js export const qiankun = {
+</ script >
子应用配置 第一步:插件注册 js export default {
+ qiankun : {
+ micro : {},
+ },
+};
如果使用 vite
构建,当执行 dev
时需要额外配置:
js export default {
+ qiankun : {
+ micro : {
+ useDevMode : true ,
+ },
+ },
+};
第二步:配置运行时生命周期钩子(可选) 插件会自动为你创建好 qiankun
子应用需要的生命周期钩子,但是如果你想在生命周期期间加一些自定义逻辑,可以在子应用的 src/app.js
里导出 qiankun
对象,并实现每一个生命周期钩子,其中钩子函数的入参 props
由主应用自动注入。
js export const qiankun = {
// 应用加载之前
- async bootstrap ( props ) {
- console . log ( ' app1 bootstrap ' , props ) ;
+ async bootstrap ( props ) {
+ console . log ( ' app1 bootstrap ' , props ) ;
},
// 应用 render 之前触发
- async mount ( props ) {
- console . log ( ' app1 mount ' , props ) ;
+ async mount ( props ) {
+ console . log ( ' app1 mount ' , props ) ;
},
// 当 props 更新时触发
- async update ( props ) {
- console . log ( ' app1 update ' , props ) ;
+ async update ( props ) {
+ console . log ( ' app1 update ' , props ) ;
},
// 应用卸载之后触发
- async unmount ( props ) {
- console . log ( ' app1 unmount ' , props ) ;
+ async unmount ( props ) {
+ console . log ( ' app1 unmount ' , props ) ;
},
};
父子应用通讯 有两种方式实现
确保已经安装了 @fesjs/plugin-model
:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-model " : " ^3.0.0 "
- }
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-model " : " ^3.0.0 "
+ }
}
主应用传递 props 如果使用 MicroApp
组件模式消费子应用,直接通过 props 传递即可: vue < template >
- < MicroApp :name = " name " :user = " user " />
+ < MicroApp :name = " name " :user = " user " />
</ template >
< script >
-import { MicroApp } from ' @fesjs/fes ' ;
+import { MicroApp } from ' @fesjs/fes ' ;
-export default {
- components : { MicroApp },
- setup () {
- const name = ' app1 ' ;
- const user = ref ( '' ) ;
+export default {
+ components : { MicroApp },
+ setup () {
+ const name = ' app1 ' ;
+ const user = ref ( '' ) ;
return {
- name ,
- user ,
+ name ,
+ user ,
};
},
};
-</ script >
如果使用路由绑定式消费子应用,那么约定src/models/qiankunStateForMicro.js
的模型数据将作为 props
船体给子应用,如: js import { reactive } from ' vue ' ;
+</ script >
如果使用路由绑定式消费子应用,那么约定src/models/qiankunStateForMicro.js
的模型数据将作为 props
船体给子应用,如: js import { reactive } from ' vue ' ;
-export default () => {
- const state = reactive ( { c : 1 } ) ;
+export default () => {
+ const state = reactive ( { c : 1 } ) ;
return {
- state ,
+ state ,
};
};
子应用消费 props 子应用中会自动生成一个全局名为 qiankunStateFromMain
的 model
, 可以在任意组件中获取主应用透传的 props
的值。
vue < script >
-export default {
- setup () {
- const mainState = useModel ( ' qiankunStateFromMain ' ) ;
+export default {
+ setup () {
+ const mainState = useModel ( ' qiankunStateFromMain ' ) ;
return {
- mainState ,
+ mainState ,
};
},
};
-</ script >
基于 props 传递 主应用使用 props 的模式传递数据(参考主应用装载子应用配置一节) 子应用在生命周期钩子中获取 props 消费数据(参考子应用运行时配置一节) MicroApp 属性 说明 类型 默认值 name 子应用名称,传入qiankun.main.apps
配置中的name
String - settings 子应用配置信息 Object {} props 传入子应用的参数 Object {} lifeCycles 子应用生命周期钩子 Object {} cacheName 子应用缓存名称,配置后根据name
+cacheName
缓存子应用实例 Object -
MicroAppWithMemoHistory 属性 说明 类型 默认值 name 子应用名称,传入qiankun.main.apps
配置中的name
String - settings 子应用配置信息 Object {} props 传入子应用的参数 Object {} lifeCycles 子应用生命周期钩子 Object {} cacheName 子应用缓存名称,配置后根据name
+cacheName
缓存子应用实例 Object - url 子应用的路由地址 String -
`,55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+</ script >
基于 props 传递 主应用使用 props 的模式传递数据(参考主应用装载子应用配置一节) 子应用在生命周期钩子中获取 props 消费数据(参考子应用运行时配置一节) MicroApp 属性 说明 类型 默认值 name 子应用名称,传入qiankun.main.apps
配置中的name
String - settings 子应用配置信息 Object {} props 传入子应用的参数 Object {} lifeCycles 子应用生命周期钩子 Object {} cacheName 子应用缓存名称,配置后根据name
+cacheName
缓存子应用实例 Object -
MicroAppWithMemoHistory 属性 说明 类型 默认值 name 子应用名称,传入qiankun.main.apps
配置中的name
String - settings 子应用配置信息 Object {} props 传入子应用的参数 Object {} lifeCycles 子应用生命周期钩子 Object {} cacheName 子应用缓存名称,配置后根据name
+cacheName
缓存子应用实例 Object - url 子应用的路由地址 String -
`,55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_qiankun.md.ec18784c.lean.js b/assets/reference_plugin_plugins_qiankun.md.ec18784c.lean.js
new file mode 100644
index 000000000..dee0a69cb
--- /dev/null
+++ b/assets/reference_plugin_plugins_qiankun.md.ec18784c.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-qiankun","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/qiankun.md"}'),p={name:"reference/plugin/plugins/qiankun.md"},o=l("",55),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_request-4.md.ab5eb474.js b/assets/reference_plugin_plugins_request-4.md.58780b87.js
similarity index 63%
rename from assets/reference_plugin_plugins_request-4.md.ab5eb474.js
rename to assets/reference_plugin_plugins_request-4.md.58780b87.js
index 8ab77f59a..d2c6a14f7 100644
--- a/assets/reference_plugin_plugins_request-4.md.ab5eb474.js
+++ b/assets/reference_plugin_plugins_request-4.md.58780b87.js
@@ -1,127 +1,127 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l(`@fesjs/plugin-request 基于 fetch 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-request " : " ^4.0.0-beta.0 "
- }
-}
运行时配置 入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 fetch 所有的参数。
js import { defineRuntimeConfig } from ' @fesjs/fes ' ;
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l(`@fesjs/plugin-request 基于 fetch 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-request " : " ^4.0.0-beta.0 "
+ }
+}
运行时配置 入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 fetch 所有的参数。
js import { defineRuntimeConfig } from ' @fesjs/fes ' ;
-export default defineRuntimeConfig ( {
- request : {
- baseURL : '' ,
- timeout : 10000 , // 默认 10s
- method : ' POST ' , // 默认 post
- mergeRequest : false , // 是否合并请求
- responseType : null, // 可选 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData',默认根据 content-type 处理
- credentials : ' include ' , // 默认 include, 'include' | 'same-origin' | 'omit'
- headers : {}, // 传给服务器的 header
- cacheData : false , // 是否缓存
- requestInterceptor : ( config : Config ) => Config ,
- responseInterceptor : ( response : RequestResponse ) => RequestResponse ,
- transformData ( data , response ) {
+export default defineRuntimeConfig ( {
+ request : {
+ baseURL : '' ,
+ timeout : 10000 , // 默认 10s
+ method : ' POST ' , // 默认 post
+ mergeRequest : false , // 是否合并请求
+ responseType : null, // 可选 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData',默认根据 content-type 处理
+ credentials : ' include ' , // 默认 include, 'include' | 'same-origin' | 'omit'
+ headers : {}, // 传给服务器的 header
+ cacheData : false , // 是否缓存
+ requestInterceptor : ( config : Config ) => Config ,
+ responseInterceptor : ( response : RequestResponse ) => RequestResponse ,
+ transformData ( data , response ) {
// 处理响应内容异常
- if ( isPlainObject ( data )) {
- if ( data . code === ' 10000 ' ) {
- return Promise . reject ( data ) ;
+ if ( isPlainObject ( data )) {
+ if ( data . code === ' 10000 ' ) {
+ return Promise . reject ( data ) ;
}
- return data ?. result ? data . result : data ;
+ return data ?. result ? data . result : data ;
}
- return data ;
+ return data ;
},
// http 异常,和插件异常
- errorHandler ( error ) {
+ errorHandler ( error ) {
// 处理业务异常,例如上述 transformData 抛出的异常
- if ( error . code ) {
- console . log ( error . msg )
- } else if ( error . response ) {
+ if ( error . code ) {
+ console . log ( error . msg )
+ } else if ( error . response ) {
// 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
- console . log ( \` 服务异常: \${ error . response . status }\` )
+ console . log ( \` 服务异常: \${ error . response . status }\` )
} else {
// 请求异常
- console . log ( error . msg || error . message || \` 请求失败 \` )
+ console . log ( error . msg || error . message || \` 请求失败 \` )
}
},
// 支持其他 fetch 配置
- ... otherConfigs ,
- },
-} ) ;
API request 类型 :函数
详情 :请求后端接口
参数 :
url: 后端接口 url data: 参数 options: 配置支持 fetch 所有的参数,和插件扩展参数。 返回值 : Promise
useRequest request 的封装,返回响应式 loading
、error
、 data
使用 发起一个普通 post 请求 js import { request } from ' @fesjs/fes ' ;
+ ... otherConfigs ,
+ },
+} ) ;
API request 类型 :函数
详情 :请求后端接口
参数 :
url: 后端接口 url data: 参数 options: 配置支持 fetch 所有的参数,和插件扩展参数。 返回值 : Promise
useRequest request 的封装,返回响应式 loading
、error
、 data
使用 发起一个普通 post 请求 js import { request } from ' @fesjs/fes ' ;
-request ( ' /api/login ' , {
- username : ' robby ' ,
- password : ' 123456 ' ,
-} )
- . then ( ( res ) => {
+request ( ' /api/login ' , {
+ username : ' robby ' ,
+ password : ' 123456 ' ,
+} )
+ . then ( ( res ) => {
// do something
- } )
- . catch ( ( err ) => {
+ } )
+ . catch ( ( err ) => {
// 处理异常
- } ) ;
merge 重复请求 连续发送多个请求,会被合并成一个请求,不会报 REPEAT
接口错误。
当发生 REPEAT
请求异常,并且确保自身代码合理的情况下,可以使用该配置。
js import { request } from ' @fesjs/fes ' ;
+ } ) ;
merge 重复请求 连续发送多个请求,会被合并成一个请求,不会报 REPEAT
接口错误。
当发生 REPEAT
请求异常,并且确保自身代码合理的情况下,可以使用该配置。
js import { request } from ' @fesjs/fes ' ;
-request (
- ' /api/login ' ,
- {
- username : ' robby ' ,
- password : ' 123456 ' ,
- },
- {
- mergeRequest : true , // 在一个请求没有回来前,重复发送的请求会合并成一个请求
- },
-)
- . then ( ( res ) => {
+request (
+ ' /api/login ' ,
+ {
+ username : ' robby ' ,
+ password : ' 123456 ' ,
+ },
+ {
+ mergeRequest : true , // 在一个请求没有回来前,重复发送的请求会合并成一个请求
+ },
+)
+ . then ( ( res ) => {
// do something
- } )
- . catch ( ( err ) => {
+ } )
+ . catch ( ( err ) => {
// 处理异常
- } ) ;
请求缓存 js import { request } from ' @fesjs/fes ' ;
+ } ) ;
请求缓存 js import { request } from ' @fesjs/fes ' ;
-request (
- ' /api/login ' ,
- {
- username : ' robby ' ,
- password : ' 123456 ' ,
- },
- {
- cacheData : {
- cacheType : ' ram ' , // ram: 内存,session: sessionStorage,local:localStorage
- cacheTime : 1000 * 60 * 3 , // 缓存时间:默认3min
- },
- },
-)
- . then ( ( res ) => {
+request (
+ ' /api/login ' ,
+ {
+ username : ' robby ' ,
+ password : ' 123456 ' ,
+ },
+ {
+ cacheData : {
+ cacheType : ' ram ' , // ram: 内存,session: sessionStorage,local:localStorage
+ cacheTime : 1000 * 60 * 3 , // 缓存时间:默认3min
+ },
+ },
+)
+ . then ( ( res ) => {
// do something
- } )
- . catch ( ( err ) => {
+ } )
+ . catch ( ( err ) => {
// 处理异常
- } ) ;
若 cacheData
传 true
,则默认使用 ram
缓存类型,缓存时间 3min。
请求 abort javascript import { request } from ' @fesjs/fes ' ;
+ } ) ;
若 cacheData
传 true
,则默认使用 ram
缓存类型,缓存时间 3min。
请求 abort javascript import { request } from ' @fesjs/fes ' ;
-const controller = new AbortController () ;
-request ( ' /url/abort ' , null, {
- signal : controller . signal ,
-} ) . then ( ( response ) => {
- console . log ( ' process response: ' + response ) ;
-} ) ;
+const controller = new AbortController () ;
+request ( ' /url/abort ' , null, {
+ signal : controller . signal ,
+} ) . then ( ( response ) => {
+ console . log ( ' process response: ' + response ) ;
+} ) ;
// cancel the request
-controller . abort () ;
javascript import { rawRequest } from ' @fesjs/fes ' ;
+controller . abort () ;
javascript import { rawRequest } from ' @fesjs/fes ' ;
-const controller = new AbortController () ;
-rawRequest ( ' /url/abort ' , null, {
- signal : controller . signal ,
-} ) . then ( ( response ) => {
- console . log ( ' process headers: ' + response . headers ) ;
-} ) ;
+const controller = new AbortController () ;
+rawRequest ( ' /url/abort ' , null, {
+ signal : controller . signal ,
+} ) . then ( ( response ) => {
+ console . log ( ' process headers: ' + response . headers ) ;
+} ) ;
// cancel the request
-controller . abort () ;
结合 use 使用 js import { useRequest } from ' @fesjs/fes ' ;
+controller . abort () ;
结合 use 使用 js import { useRequest } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const { loading , data , error } = useRequest ( ' /api/login ' , {
+export default {
+ setup () {
+ const { loading , data , error } = useRequest ( ' /api/login ' , {
username : ' robby ' ,
password : ' 123456 ' ,
} ) ;
return {
- loading ,
- data ,
- error ,
+ loading ,
+ data ,
+ error ,
};
},
-};
3.x 升级到 4.x 缓存参数 cache 改成 cacheData(避免与 fetch 原本的 cache 冲突) dataHandler 改成 transformData requestInterceptors 改为 requestInterceptor,不在支持数组,只支持函数 responseInterceptors 改为 responseInterceptor,不在支持数组,只支持函数 其他 axios 特有的配置不在支持 `,31),e=[o];function t(c,r,D,y,F,C){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{i as __pageData,d as default};
+};
3.x 升级到 4.x 缓存参数 cache 改成 cacheData(避免与 fetch 原本的 cache 冲突) dataHandler 改成 transformData requestInterceptors 改为 requestInterceptor,不在支持数组,只支持函数 responseInterceptors 改为 responseInterceptor,不在支持数组,只支持函数 其他 axios 特有的配置不在支持 `,31),e=[o];function t(c,r,D,y,F,B){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_request-4.md.58780b87.lean.js b/assets/reference_plugin_plugins_request-4.md.58780b87.lean.js
new file mode 100644
index 000000000..0472a195f
--- /dev/null
+++ b/assets/reference_plugin_plugins_request-4.md.58780b87.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l("",31),e=[o];function t(c,r,D,y,F,B){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_request-4.md.ab5eb474.lean.js b/assets/reference_plugin_plugins_request-4.md.ab5eb474.lean.js
deleted file mode 100644
index c7499c94f..000000000
--- a/assets/reference_plugin_plugins_request-4.md.ab5eb474.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request-4.md"}'),p={name:"reference/plugin/plugins/request-4.md"},o=l("",31),e=[o];function t(c,r,D,y,F,C){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{i as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_request.md.6bcdc264.lean.js b/assets/reference_plugin_plugins_request.md.6bcdc264.lean.js
deleted file mode 100644
index cde54781b..000000000
--- a/assets/reference_plugin_plugins_request.md.6bcdc264.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l("",28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_request.md.6bcdc264.js b/assets/reference_plugin_plugins_request.md.e603d17b.js
similarity index 67%
rename from assets/reference_plugin_plugins_request.md.6bcdc264.js
rename to assets/reference_plugin_plugins_request.md.e603d17b.js
index fe618c468..3e5204014 100644
--- a/assets/reference_plugin_plugins_request.md.6bcdc264.js
+++ b/assets/reference_plugin_plugins_request.md.e603d17b.js
@@ -1,124 +1,124 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l(`@fesjs/plugin-request 基于 axios 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。
4.x 版本请点击
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-request " : " ^3.0.0 "
- }
-}
运行时配置 入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 axios 所有的参数。
js import { defineRuntimeConfig } from ' @fesjs/fes ' ;
-import { isPlainObject } from ' lodash-es ' ;
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l(`@fesjs/plugin-request 基于 axios 封装的 request,内置防止重复请求、请求缓存、错误处理等功能。
4.x 版本请点击
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-request " : " ^3.0.0 "
+ }
+}
运行时配置 入口文件的全局配置,具体请求的配置参数会覆盖全局配置,支持 axios 所有的参数。
js import { defineRuntimeConfig } from ' @fesjs/fes ' ;
+import { isPlainObject } from ' lodash-es ' ;
-export default defineRuntimeConfig ( {
- request : {
+export default defineRuntimeConfig ( {
+ request : {
// API 前缀
- baseURL : '' ,
- dataHandler ( data , response ) {
- if ( isPlainObject ( data )) {
+ baseURL : '' ,
+ dataHandler ( data , response ) {
+ if ( isPlainObject ( data )) {
// 处理响应内容异常
- if ( data . code !== ' 0 ' ) {
- if ( data . code === ' 10000 ' )
- FMesseage . error ( ' hello world ' ) ;
+ if ( data . code !== ' 0 ' ) {
+ if ( data . code === ' 10000 ' )
+ FMesseage . error ( ' hello world ' ) ;
- if ( data . code === ' 20000 ' )
- FMesseage . error ( ' hello world ' ) ;
+ if ( data . code === ' 20000 ' )
+ FMesseage . error ( ' hello world ' ) ;
- throw new Error ( response ) ;
+ throw new Error ( response ) ;
}
// 响应数据格式化
- return data ?. result ? data . result : data ;
+ return data ?. result ? data . result : data ;
}
- return data ;
+ return data ;
},
// http 异常,和插件异常
- errorHandler ( error ) {
- if ( error . response ) {
+ errorHandler ( error ) {
+ if ( error . response ) {
// 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
- console . log ( error . response . data ) ;
- console . log ( error . response . status ) ;
- console . log ( error . response . headers ) ;
+ console . log ( error . response . data ) ;
+ console . log ( error . response . status ) ;
+ console . log ( error . response . headers ) ;
}
- else if ( error . request ) {
+ else if ( error . request ) {
// 请求已经成功发起,但没有收到响应
// \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
// 而在node.js中是 http.ClientRequest 的实例
- console . log ( error . request ) ;
+ console . log ( error . request ) ;
}
- else if ( error . type ) {
+ else if ( error . type ) {
// 插件异常
- console . log ( error . msg ) ;
+ console . log ( error . msg ) ;
}
else {
// 发送请求时出了点问题
- console . log ( ' Error ' , error . message ) ;
+ console . log ( ' Error ' , error . message ) ;
}
- console . log ( error . config ) ;
+ console . log ( error . config ) ;
},
// 请求拦截器
- requestInterceptors : [] ,
+ requestInterceptors : [] ,
// 响应拦截器
- responseInterceptors : [] ,
+ responseInterceptors : [] ,
// 支持其他 axios 配置
- ... otherConfigs ,
- },
-} ) ;
API request 类型 :函数
详情 :请求后端接口
参数 :
url: 后端接口 url data: 参数 options: 配置支持 axios 所有的参数,和插件扩展参数。 返回值 : Promise
useRequest request 的封装,返回响应式 loading
、error
、 data
使用 发起一个普通 post 请求 js import { request } from ' @fesjs/fes ' ;
+ ... otherConfigs ,
+ },
+} ) ;
API request 类型 :函数
详情 :请求后端接口
参数 :
url: 后端接口 url data: 参数 options: 配置支持 axios 所有的参数,和插件扩展参数。 返回值 : Promise
useRequest request 的封装,返回响应式 loading
、error
、 data
使用 发起一个普通 post 请求 js import { request } from ' @fesjs/fes ' ;
-request ( ' /api/login ' , {
- username : ' robby ' ,
- password : ' 123456 ' ,
-} )
- . then ( ( res ) => {
+request ( ' /api/login ' , {
+ username : ' robby ' ,
+ password : ' 123456 ' ,
+} )
+ . then ( ( res ) => {
// do something
- } )
- . catch ( ( err ) => {
+ } )
+ . catch ( ( err ) => {
// 处理异常
- } ) ;
merge 重复请求 连续发送多个请求,会被合并成一个请求,不会报 REPEAT
接口错误。
当发生 REPEAT
请求异常,并且确保自身代码合理的情况下,可以使用该配置。
js import { request } from ' @fesjs/fes ' ;
+ } ) ;
merge 重复请求 连续发送多个请求,会被合并成一个请求,不会报 REPEAT
接口错误。
当发生 REPEAT
请求异常,并且确保自身代码合理的情况下,可以使用该配置。
js import { request } from ' @fesjs/fes ' ;
-request (
- ' /api/login ' ,
- {
- username : ' robby ' ,
- password : ' 123456 ' ,
- },
- {
- mergeRequest : true , // 在一个请求没有回来前,重复发送的请求会合并成一个请求
- },
-)
- . then ( ( res ) => {
+request (
+ ' /api/login ' ,
+ {
+ username : ' robby ' ,
+ password : ' 123456 ' ,
+ },
+ {
+ mergeRequest : true , // 在一个请求没有回来前,重复发送的请求会合并成一个请求
+ },
+)
+ . then ( ( res ) => {
// do something
- } )
- . catch ( ( err ) => {
+ } )
+ . catch ( ( err ) => {
// 处理异常
- } ) ;
请求缓存 js import { request } from ' @fesjs/fes ' ;
+ } ) ;
请求缓存 js import { request } from ' @fesjs/fes ' ;
-request (
- ' /api/login ' ,
- {
- username : ' robby ' ,
- password : ' 123456 ' ,
- },
- {
- cache : {
- cacheType : ' ram ' , // ram: 内存,session: sessionStorage,local:localStorage
- cacheTime : 1000 * 60 * 3 , // 缓存时间:默认3min
- },
- },
-)
- . then ( ( res ) => {
+request (
+ ' /api/login ' ,
+ {
+ username : ' robby ' ,
+ password : ' 123456 ' ,
+ },
+ {
+ cache : {
+ cacheType : ' ram ' , // ram: 内存,session: sessionStorage,local:localStorage
+ cacheTime : 1000 * 60 * 3 , // 缓存时间:默认3min
+ },
+ },
+)
+ . then ( ( res ) => {
// do something
- } )
- . catch ( ( err ) => {
+ } )
+ . catch ( ( err ) => {
// 处理异常
- } ) ;
若 cache
传 true
,则默认使用 ram
缓存类型,缓存时间 3min。
结合 use 使用 js import { useRequest } from ' @fesjs/fes ' ;
+ } ) ;
若 cache
传 true
,则默认使用 ram
缓存类型,缓存时间 3min。
结合 use 使用 js import { useRequest } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const { loading , data , error } = useRequest ( ' /api/login ' , {
+export default {
+ setup () {
+ const { loading , data , error } = useRequest ( ' /api/login ' , {
username : ' robby ' ,
password : ' 123456 ' ,
} ) ;
return {
- loading ,
- data ,
- error ,
+ loading ,
+ data ,
+ error ,
};
},
-};
2.x 升级到 3.x 删除 dataField 配置,通过 dataHandler 实现类似功能,详情看上文案例 errorHandler 改成了函数了,异常处理逻辑,查看上文案例 废弃 base 参数,用 baseURL 移除 skipErrorHandler 参数,目前还做了兼容,最好用 dataHandler 和 errorHandler 代替 `,28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+};
2.x 升级到 3.x 删除 dataField 配置,通过 dataHandler 实现类似功能,详情看上文案例 errorHandler 改成了函数了,异常处理逻辑,查看上文案例 废弃 base 参数,用 baseURL 移除 skipErrorHandler 参数,目前还做了兼容,最好用 dataHandler 和 errorHandler 代替 `,28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default};
diff --git a/assets/reference_plugin_plugins_request.md.e603d17b.lean.js b/assets/reference_plugin_plugins_request.md.e603d17b.lean.js
new file mode 100644
index 000000000..89c84bd89
--- /dev/null
+++ b/assets/reference_plugin_plugins_request.md.e603d17b.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const E=JSON.parse('{"title":"@fesjs/plugin-request","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/request.md"}'),p={name:"reference/plugin/plugins/request.md"},o=l("",28),e=[o];function t(c,r,D,F,y,i){return a(),n("div",null,e)}const A=s(p,[["render",t]]);export{E as __pageData,A as default};
diff --git a/assets/reference_plugin_plugins_sass.md.ad29d499.js b/assets/reference_plugin_plugins_sass.md.aea91d6e.js
similarity index 84%
rename from assets/reference_plugin_plugins_sass.md.ad29d499.js
rename to assets/reference_plugin_plugins_sass.md.aea91d6e.js
index eab40dee7..1e3453ad4 100644
--- a/assets/reference_plugin_plugins_sass.md.ad29d499.js
+++ b/assets/reference_plugin_plugins_sass.md.aea91d6e.js
@@ -1,6 +1,6 @@
-import{_ as s,o as a,c as e,V as l}from"./chunks/framework.85b09291.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l(`@fesjs/plugin-sass 介绍 Fes.js 默认只支持 less
,通过此插件扩展支持 sass
。
webpack 构建 sass 插件
如果使用 Vite 构建,直接装 sass
依赖即可,不需要安装此插件。
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-sass " : " ^3.0.0 "
- }
-}
global css 添加 src/global.scss
和 src/global.sass
为全局 CSS 入口,添加一些通用样式内容。
Vue 单文件组件 Vue 单文件组件的 <style></style>
添加 lang='scss'
,例如:
vue < style lang = " scss " ></ style >
`,12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default};
+import{_ as s,o as a,c as e,V as l}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l(`@fesjs/plugin-sass 介绍 Fes.js 默认只支持 less
,通过此插件扩展支持 sass
。
webpack 构建 sass 插件
如果使用 Vite 构建,直接装 sass
依赖即可,不需要安装此插件。
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-sass " : " ^3.0.0 "
+ }
+}
global css 添加 src/global.scss
和 src/global.sass
为全局 CSS 入口,添加一些通用样式内容。
Vue 单文件组件 Vue 单文件组件的 <style></style>
添加 lang='scss'
,例如:
vue < style lang = " scss " ></ style >
`,12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default};
diff --git a/assets/reference_plugin_plugins_sass.md.ad29d499.lean.js b/assets/reference_plugin_plugins_sass.md.aea91d6e.lean.js
similarity index 68%
rename from assets/reference_plugin_plugins_sass.md.ad29d499.lean.js
rename to assets/reference_plugin_plugins_sass.md.aea91d6e.lean.js
index 12ae1bd40..116430c84 100644
--- a/assets/reference_plugin_plugins_sass.md.ad29d499.lean.js
+++ b/assets/reference_plugin_plugins_sass.md.aea91d6e.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as e,V as l}from"./chunks/framework.85b09291.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l("",12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default};
+import{_ as s,o as a,c as e,V as l}from"./chunks/framework.b31a4d00.js";const y=JSON.parse('{"title":"@fesjs/plugin-sass","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/sass.md"}'),o={name:"reference/plugin/plugins/sass.md"},n=l("",12),p=[n];function t(c,r,i,D,d,F){return a(),e("div",null,p)}const h=s(o,[["render",t]]);export{y as __pageData,h as default};
diff --git a/assets/reference_plugin_plugins_swc.md.b42a6e35.js b/assets/reference_plugin_plugins_swc.md.f887c1f1.js
similarity index 68%
rename from assets/reference_plugin_plugins_swc.md.b42a6e35.js
rename to assets/reference_plugin_plugins_swc.md.f887c1f1.js
index 13b5fea22..f7ceda3c9 100644
--- a/assets/reference_plugin_plugins_swc.md.b42a6e35.js
+++ b/assets/reference_plugin_plugins_swc.md.f887c1f1.js
@@ -1,14 +1,14 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l(`@fesjs/plugin-swc 介绍 webpack 启用 swc,构建速度更快!
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-swc " : " ^3.0.0 "
- },
-}
编译时配置 传对象时使用swc进行编译和压缩,loader配置 ,默认usage模式。
js export default {
- swc : {
- loader : {
- env : {
- coreJs : ' 3.27 ' ,
- },
- }
- },
-}
`,9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default};
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l(`@fesjs/plugin-swc 介绍 webpack 启用 swc,构建速度更快!
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-swc " : " ^3.0.0 "
+ },
+}
编译时配置 传对象时使用swc进行编译和压缩,loader配置 ,默认usage模式。
js export default {
+ swc : {
+ loader : {
+ env : {
+ coreJs : ' 3.27 ' ,
+ },
+ }
+ },
+}
`,9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{d as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_swc.md.b42a6e35.lean.js b/assets/reference_plugin_plugins_swc.md.f887c1f1.lean.js
similarity index 51%
rename from assets/reference_plugin_plugins_swc.md.b42a6e35.lean.js
rename to assets/reference_plugin_plugins_swc.md.f887c1f1.lean.js
index d0aeec3ca..4228b154a 100644
--- a/assets/reference_plugin_plugins_swc.md.b42a6e35.lean.js
+++ b/assets/reference_plugin_plugins_swc.md.f887c1f1.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l("",9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const d=s(o,[["render",t]]);export{A as __pageData,d as default};
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-swc","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/swc.md"}'),o={name:"reference/plugin/plugins/swc.md"},p=l("",9),e=[p];function t(c,r,D,F,i,y){return a(),n("div",null,e)}const u=s(o,[["render",t]]);export{d as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_vuex.md.0b177022.lean.js b/assets/reference_plugin_plugins_vuex.md.0b177022.lean.js
deleted file mode 100644
index d84da4575..000000000
--- a/assets/reference_plugin_plugins_vuex.md.0b177022.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l("",35),e=[o];function t(c,r,F,D,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default};
diff --git a/assets/reference_plugin_plugins_vuex.md.0b177022.js b/assets/reference_plugin_plugins_vuex.md.3806c06f.js
similarity index 67%
rename from assets/reference_plugin_plugins_vuex.md.0b177022.js
rename to assets/reference_plugin_plugins_vuex.md.3806c06f.js
index a0662def5..e016cd2de 100644
--- a/assets/reference_plugin_plugins_vuex.md.0b177022.js
+++ b/assets/reference_plugin_plugins_vuex.md.3806c06f.js
@@ -1,114 +1,114 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const i=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l(`@fesjs/plugin-vuex TIP
vue3+ 官方推荐使用pinia ,不在推荐使用 vuex。
介绍 集成 vuex 插件
增强 vuex,导出所有的mutations
、actions
和getter
的事件类型,编辑器提示
约定模式,module 和 plugin 定义放在 stores 目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。
└── src
- ├── pages
- │ └── index.vue
- └── stores
- │ └── foo
- │ │ └── bar.js
- │ ├── counter.js
- │ ├── plugin-logger.js
- │ ├── user.js
- └── app.js
TIP
为了防止fesjs
与vuex
的 export 冲突,fesjs 不提供导出 vuex 的任何 api。你可以直接使用 vuex 的 api
js import { useStore } from ' vuex ' ;
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-vuex " : " ^3.0.0 "
- }
-}
配置 在 .fes.js
中配置:
js export default {
- vuex : {
- strict : true , // 开启严格模式
- },
-};
场景使用 先定义在 stores 下定义 user 模块,包含嵌套模块
stores/user.js
js export default {
- namespaced : true ,
- state : () => ( {
- name : ' aring ' ,
- age : 20 ,
- } ) ,
- actions : {
- login () {
- return new Promise ( ( reslove ) => {
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l(`@fesjs/plugin-vuex TIP
vue3+ 官方推荐使用pinia ,不在推荐使用 vuex。
介绍 集成 vuex 插件
增强 vuex,导出所有的mutations
、actions
和getter
的事件类型,编辑器提示
约定模式,module 和 plugin 定义放在 stores 目录下,文件名包含 plugin 被解析为插件,无需额外配置,定义即可用。
└── src
+ ├── pages
+ │ └── index.vue
+ └── stores
+ │ └── foo
+ │ │ └── bar.js
+ │ ├── counter.js
+ │ ├── plugin-logger.js
+ │ ├── user.js
+ └── app.js
TIP
为了防止fesjs
与vuex
的 export 冲突,fesjs 不提供导出 vuex 的任何 api。你可以直接使用 vuex 的 api
js import { useStore } from ' vuex ' ;
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-vuex " : " ^3.0.0 "
+ }
+}
配置 在 .fes.js
中配置:
js export default {
+ vuex : {
+ strict : true , // 开启严格模式
+ },
+};
场景使用 先定义在 stores 下定义 user 模块,包含嵌套模块
stores/user.js
js export default {
+ namespaced : true ,
+ state : () => ( {
+ name : ' aring ' ,
+ age : 20 ,
+ } ) ,
+ actions : {
+ login () {
+ return new Promise ( ( reslove ) => {
setTimeout ( () => {
- console . log ( ' login ' ) ;
+ console . log ( ' login ' ) ;
reslove ( ' OK ' ) ;
}, 1000 ) ;
} ) ;
},
- },
- modules : {
- address : {
- state : () => ( {
- province : ' 广东省 ' ,
- city : ' 深圳市 ' ,
- zone : ' 南山区 ' ,
- } ) ,
- getters : {
- address ( state ) {
- return state . province + state . city + state . zone ;
+ },
+ modules : {
+ address : {
+ state : () => ( {
+ province : ' 广东省 ' ,
+ city : ' 深圳市 ' ,
+ zone : ' 南山区 ' ,
+ } ) ,
+ getters : {
+ address ( state ) {
+ return state . province + state . city + state . zone ;
},
- },
- },
- },
-};
stores/foo/bar.js
js export default {
- namespaced : true ,
- state : () => ( {
- count : 0 ,
- } ) ,
- mutations : {
- increment ( state ) {
- state . count ++;
+ },
+ },
+ },
+};
stores/foo/bar.js
js export default {
+ namespaced : true ,
+ state : () => ( {
+ count : 0 ,
+ } ) ,
+ mutations : {
+ increment ( state ) {
+ state . count ++;
},
- },
- getters : {
- doubleCount ( state ) {
- return state . count * 2 ;
+ },
+ getters : {
+ doubleCount ( state ) {
+ return state . count * 2 ;
},
- },
- actions : {
- asyncIncrement ({ commit }) {
+ },
+ actions : {
+ asyncIncrement ({ commit }) {
setTimeout ( () => {
commit ( ' increment ' ) ;
}, 2000 ) ;
},
- },
+ },
};
TIP
导出的mutations
、actions
和getter
的事件类型,将会按文件命名;
如ACTION_TYPES.user.login
指向 user 模块中 actions 的 login 方法
如GETTER_TYPES.user.address
指向 user 模块中嵌套的 address getter
如MUTATION_TYPES.fooBar.increment
指向 foo/bar 模块中 mutations 的 increment 方法
在 vue 文件中使用 store
vue < template >
- < div >
- < h4 > Vuex </ h4 >
- < div >< button :disabled = " disabled " @click = " login " > async login </ button ></ div >
- < div >
- < button @click = " fooBarIncrement " > foo/bar:{{ fooBarDoubleCount }} </ button >
- </ div >
- < div > {{ address }} </ div >
- </ div >
+ < div >
+ < h4 > Vuex </ h4 >
+ < div >< button :disabled = " disabled " @click = " login " > async login </ button ></ div >
+ < div >
+ < button @click = " fooBarIncrement " > foo/bar:{{ fooBarDoubleCount }} </ button >
+ </ div >
+ < div > {{ address }} </ div >
+ </ div >
</ template >
< config >
-{
- "name": "store",
- "title": "vuex测试"
-}
+{
+ "name": "store",
+ "title": "vuex测试"
+}
</ config >
< script >
-import { computed , ref } from ' vue ' ;
-import { useStore } from ' vuex ' ;
-import { MUTATION_TYPES , GETTER_TYPES , ACTION_TYPES } from ' @fesjs/fes ' ;
+import { computed , ref } from ' vue ' ;
+import { useStore } from ' vuex ' ;
+import { MUTATION_TYPES , GETTER_TYPES , ACTION_TYPES } from ' @fesjs/fes ' ;
-export default {
- setup () {
- const store = useStore () ;
- console . log ( ' store==> ' , store ) ;
- const disabled = ref ( false ) ;
+export default {
+ setup () {
+ const store = useStore () ;
+ console . log ( ' store==> ' , store ) ;
+ const disabled = ref ( false ) ;
// 可以利用导出的事件类型,不再通过字符传入(store.getters['user/address'])
return {
- address : computed ( () => store . getters [ GETTER_TYPES . user . address ]) ,
- disabled ,
+ address : computed ( () => store . getters [ GETTER_TYPES . user . address ]) ,
+ disabled ,
login : () => {
- disabled . value = true ;
- store . dispatch ( ACTION_TYPES . user . login ) . then ( ( res ) => {
- window . alert ( res ) ;
- disabled . value = false ;
+ disabled . value = true ;
+ store . dispatch ( ACTION_TYPES . user . login ) . then ( ( res ) => {
+ window . alert ( res ) ;
+ disabled . value = false ;
} ) ;
},
- fooBarIncrement : () => store . commit ( MUTATION_TYPES . fooBar . increment ) , // foo/bar目录会解析成驼峰fooBar
- fooBarDoubleCount : computed ( () => store . getters [ GETTER_TYPES . fooBar . doubleCount ]) ,
+ fooBarIncrement : () => store . commit ( MUTATION_TYPES . fooBar . increment ) , // foo/bar目录会解析成驼峰fooBar
+ fooBarDoubleCount : computed ( () => store . getters [ GETTER_TYPES . fooBar . doubleCount ]) ,
};
},
};
-</ script >
TIP
由于该插件注册在 onAppCreated 中,如果在 onAppCreated 及之前使用 useStore 时,获取不到 vuex 实例
fesjs
导出了 vuex 实例store
,如在 app.js 文件中
js import { store , GETTER_TYPES } from ' @fesjs/fes ' ;
-console . log (store . getters[GETTER_TYPES . user . address]) ;
vuex 插件 stores 文件夹下的文件名包含 plugin 被解析为插件,vuex 插件写法参考官方文档
API store MUTATION_TYPES 类型 Object
mutation 的所有事件类型 GETTER_TYPES ACTION_TYPES `,35),e=[o];function t(c,r,F,D,y,C){return a(),n("div",null,e)}const u=s(p,[["render",t]]);export{i as __pageData,u as default};
+</ script >
TIP
由于该插件注册在 onAppCreated 中,如果在 onAppCreated 及之前使用 useStore 时,获取不到 vuex 实例
fesjs
导出了 vuex 实例store
,如在 app.js 文件中
js import { store , GETTER_TYPES } from ' @fesjs/fes ' ;
+console . log (store . getters[GETTER_TYPES . user . address]) ;
vuex 插件 stores 文件夹下的文件名包含 plugin 被解析为插件,vuex 插件写法参考官方文档
API store MUTATION_TYPES 类型 Object
mutation 的所有事件类型 GETTER_TYPES ACTION_TYPES `,35),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_vuex.md.3806c06f.lean.js b/assets/reference_plugin_plugins_vuex.md.3806c06f.lean.js
new file mode 100644
index 000000000..8be5afed8
--- /dev/null
+++ b/assets/reference_plugin_plugins_vuex.md.3806c06f.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const A=JSON.parse('{"title":"@fesjs/plugin-vuex","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/vuex.md"}'),p={name:"reference/plugin/plugins/vuex.md"},o=l("",35),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{A as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_watermark.md.ff5893bf.js b/assets/reference_plugin_plugins_watermark.md.95337b01.js
similarity index 73%
rename from assets/reference_plugin_plugins_watermark.md.ff5893bf.js
rename to assets/reference_plugin_plugins_watermark.md.95337b01.js
index 9f34605de..ff9ddbb90 100644
--- a/assets/reference_plugin_plugins_watermark.md.ff5893bf.js
+++ b/assets/reference_plugin_plugins_watermark.md.95337b01.js
@@ -1,30 +1,30 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l(`@fesjs/plugin-watermark 介绍 给页面添加水印效果
启用方式 在 package.json
中引入依赖:
json {
- " dependencies " : {
- " @fesjs/fes " : " ^3.0.0 " ,
- " @fesjs/plugin-watermark " : " ^3.0.0 "
- }
-}
编译时配置 js export default {
- watermark : {
- disabled : false ,
- },
-};
disabled 是否禁用水印,默认是false
。
可以在开发环境关闭水印:
js export default {
- watermark : {
- disabled : true ,
- },
-};
API createWatermark 创建水印功能,通过 @fesjs/fes
导入 API:
js import { createWatermark , destroyWatermark } from ' @fesjs/fes ' ;
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l(`@fesjs/plugin-watermark 介绍 给页面添加水印效果
启用方式 在 package.json
中引入依赖:
json {
+ " dependencies " : {
+ " @fesjs/fes " : " ^3.0.0 " ,
+ " @fesjs/plugin-watermark " : " ^3.0.0 "
+ }
+}
编译时配置 js export default {
+ watermark : {
+ disabled : false ,
+ },
+};
disabled 是否禁用水印,默认是false
。
可以在开发环境关闭水印:
js export default {
+ watermark : {
+ disabled : true ,
+ },
+};
API createWatermark 创建水印功能,通过 @fesjs/fes
导入 API:
js import { createWatermark , destroyWatermark } from ' @fesjs/fes ' ;
-createWatermark ( { content : ' 我是水印 ' } ) ; // 生成水印
-destroyWatermark () ; // 销毁水印
默认参数是:
js {
- ( content = ' 请勿外传 ' ) ,
- ( container = document . body ) ,
- ( width = 300 ) ,
- ( height = 300 ) ,
- ( textAlign = ' center ' ) ,
- ( textBaseline = ' middle ' ) ,
- ( fontSize = ' 14px ' ) ,
- ( fontFamily = ' Microsoft Yahei ' ) ,
- ( fillStyle = ' rgba(184, 184, 184, 0.3) ' ) ,
- ( rotate = 25 ) ,
- ( zIndex = 99999 ) ,
- ( timestamp = ' YYYY-MM-DD HH:mm ' ) ;
-}
如果不需要时间戳,则可以设置timestamp
为false
。
`,19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
+createWatermark ( { content : ' 我是水印 ' } ) ; // 生成水印
+destroyWatermark () ; // 销毁水印
默认参数是:
js {
+ ( content = ' 请勿外传 ' ) ,
+ ( container = document . body ) ,
+ ( width = 300 ) ,
+ ( height = 300 ) ,
+ ( textAlign = ' center ' ) ,
+ ( textBaseline = ' middle ' ) ,
+ ( fontSize = ' 14px ' ) ,
+ ( fontFamily = ' Microsoft Yahei ' ) ,
+ ( fillStyle = ' rgba(184, 184, 184, 0.3) ' ) ,
+ ( rotate = 25 ) ,
+ ( zIndex = 99999 ) ,
+ ( timestamp = ' YYYY-MM-DD HH:mm ' ) ;
+}
如果不需要时间戳,则可以设置timestamp
为false
。
`,19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_watermark.md.95337b01.lean.js b/assets/reference_plugin_plugins_watermark.md.95337b01.lean.js
new file mode 100644
index 000000000..0bae85017
--- /dev/null
+++ b/assets/reference_plugin_plugins_watermark.md.95337b01.lean.js
@@ -0,0 +1 @@
+import{_ as s,o as a,c as n,V as l}from"./chunks/framework.b31a4d00.js";const d=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l("",19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const E=s(p,[["render",t]]);export{d as __pageData,E as default};
diff --git a/assets/reference_plugin_plugins_watermark.md.ff5893bf.lean.js b/assets/reference_plugin_plugins_watermark.md.ff5893bf.lean.js
deleted file mode 100644
index cf4b23ec4..000000000
--- a/assets/reference_plugin_plugins_watermark.md.ff5893bf.lean.js
+++ /dev/null
@@ -1 +0,0 @@
-import{_ as s,o as a,c as n,V as l}from"./chunks/framework.85b09291.js";const A=JSON.parse('{"title":"@fesjs/plugin-watermark","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/watermark.md"}'),p={name:"reference/plugin/plugins/watermark.md"},o=l("",19),e=[o];function t(c,r,F,D,y,i){return a(),n("div",null,e)}const d=s(p,[["render",t]]);export{A as __pageData,d as default};
diff --git a/assets/reference_plugin_plugins_windicss.md.76a2f583.js b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.js
similarity index 75%
rename from assets/reference_plugin_plugins_windicss.md.76a2f583.js
rename to assets/reference_plugin_plugins_windicss.md.8deb5ce9.js
index 7504d649b..f4f4223b3 100644
--- a/assets/reference_plugin_plugins_windicss.md.76a2f583.js
+++ b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.js
@@ -1,9 +1,9 @@
-import{_ as s,o as a,c as n,V as e}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e(`@fesjs/plugin-windicss 介绍 windicss
支持
启用方式 在 package.json
中引入依赖:
json {
- " devDependencies " : {
- " @fesjs/plugin-windicss " : " ^2.0.0 "
- }
-}
配置 在 .fes.js
配置文件中添加自定义配置,详细配置请看 :
js export default {
- windicss : {
- root : ' ./ ' ,
- },
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e(`@fesjs/plugin-windicss 介绍 windicss
支持
启用方式 在 package.json
中引入依赖:
json {
+ " devDependencies " : {
+ " @fesjs/plugin-windicss " : " ^2.0.0 "
+ }
+}
配置 在 .fes.js
配置文件中添加自定义配置,详细配置请看 :
js export default {
+ windicss : {
+ root : ' ./ ' ,
+ },
};
`,10),p=[o];function t(c,r,i,D,d,F){return a(),n("div",null,p)}const h=s(l,[["render",t]]);export{u as __pageData,h as default};
diff --git a/assets/reference_plugin_plugins_windicss.md.76a2f583.lean.js b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.lean.js
similarity index 68%
rename from assets/reference_plugin_plugins_windicss.md.76a2f583.lean.js
rename to assets/reference_plugin_plugins_windicss.md.8deb5ce9.lean.js
index 002002b31..f234642fb 100644
--- a/assets/reference_plugin_plugins_windicss.md.76a2f583.lean.js
+++ b/assets/reference_plugin_plugins_windicss.md.8deb5ce9.lean.js
@@ -1 +1 @@
-import{_ as s,o as a,c as n,V as e}from"./chunks/framework.85b09291.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e("",10),p=[o];function t(c,r,i,D,d,F){return a(),n("div",null,p)}const h=s(l,[["render",t]]);export{u as __pageData,h as default};
+import{_ as s,o as a,c as n,V as e}from"./chunks/framework.b31a4d00.js";const u=JSON.parse('{"title":"@fesjs/plugin-windicss","description":"","frontmatter":{},"headers":[],"relativePath":"reference/plugin/plugins/windicss.md"}'),l={name:"reference/plugin/plugins/windicss.md"},o=e("",10),p=[o];function t(c,r,i,D,d,F){return a(),n("div",null,p)}const h=s(l,[["render",t]]);export{u as __pageData,h as default};
diff --git a/assets/style.989bd2a0.css b/assets/style.989bd2a0.css
new file mode 100644
index 000000000..9c27fb2fa
--- /dev/null
+++ b/assets/style.989bd2a0.css
@@ -0,0 +1 @@
+@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-gray: #8e8e93;--vp-c-text-light-1: rgba(60, 60, 67);--vp-c-text-light-2: rgba(60, 60, 67, .75);--vp-c-text-light-3: rgba(60, 60, 67, .33);--vp-c-text-dark-1: rgba(255, 255, 245, .86);--vp-c-text-dark-2: rgba(235, 235, 245, .6);--vp-c-text-dark-3: rgba(235, 235, 245, .38);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d97706;--vp-c-yellow-light: #f59e0b;--vp-c-yellow-lighter: #fbbf24;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5);--vp-c-sponsor: #db2777}:root{--vp-c-bg: #ffffff;--vp-c-bg-elv: #ffffff;--vp-c-bg-elv-up: #ffffff;--vp-c-bg-elv-down: #f6f6f7;--vp-c-bg-elv-mute: #f6f6f7;--vp-c-bg-soft: #f6f6f7;--vp-c-bg-soft-up: #f9f9fa;--vp-c-bg-soft-down: #e3e3e5;--vp-c-bg-soft-mute: #e3e3e5;--vp-c-bg-alt: #f6f6f7;--vp-c-border: rgba(60, 60, 67, .29);--vp-c-divider: rgba(60, 60, 67, .12);--vp-c-gutter: rgba(60, 60, 67, .12);--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white);--vp-c-text-1: var(--vp-c-text-light-1);--vp-c-text-2: var(--vp-c-text-light-2);--vp-c-text-3: var(--vp-c-text-light-3);--vp-c-text-inverse-1: var(--vp-c-text-dark-1);--vp-c-text-inverse-2: var(--vp-c-text-dark-2);--vp-c-text-inverse-3: var(--vp-c-text-dark-3);--vp-c-text-code: #476582;--vp-c-brand: var(--vp-c-green);--vp-c-brand-light: var(--vp-c-green-light);--vp-c-brand-lighter: var(--vp-c-green-lighter);--vp-c-brand-dark: var(--vp-c-green-dark);--vp-c-brand-darker: var(--vp-c-green-darker);--vp-c-mute: #f6f6f7;--vp-c-mute-light: #f9f9fc;--vp-c-mute-lighter: #ffffff;--vp-c-mute-dark: #e3e3e5;--vp-c-mute-darker: #d7d7d9}.dark{--vp-c-bg: #1e1e20;--vp-c-bg-elv: #252529;--vp-c-bg-elv-up: #313136;--vp-c-bg-elv-down: #1e1e20;--vp-c-bg-elv-mute: #313136;--vp-c-bg-soft: #252529;--vp-c-bg-soft-up: #313136;--vp-c-bg-soft-down: #1e1e20;--vp-c-bg-soft-mute: #313136;--vp-c-bg-alt: #161618;--vp-c-border: rgba(82, 82, 89, .68);--vp-c-divider: rgba(82, 82, 89, .32);--vp-c-gutter: #000000;--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black);--vp-c-text-1: var(--vp-c-text-dark-1);--vp-c-text-2: var(--vp-c-text-dark-2);--vp-c-text-3: var(--vp-c-text-dark-3);--vp-c-text-inverse-1: var(--vp-c-text-light-1);--vp-c-text-inverse-2: var(--vp-c-text-light-2);--vp-c-text-inverse-3: var(--vp-c-text-light-3);--vp-c-text-code: #c9def1;--vp-c-mute: #313136;--vp-c-mute-light: #3a3a3c;--vp-c-mute-lighter: #505053;--vp-c-mute-dark: #2c2c30;--vp-c-mute-darker: #252529}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-local-nav: 10;--vp-z-index-nav: 20;--vp-z-index-layout-top: 30;--vp-z-index-backdrop: 40;--vp-z-index-sidebar: 50;--vp-z-index-footer: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-block-color: var(--vp-c-text-dark-1);--vp-code-block-bg: #292b30;--vp-code-block-bg-light: #1e1e20;--vp-code-block-divider-color: #000000;--vp-code-line-highlight-color: rgba(0, 0, 0, .5);--vp-code-line-number-color: var(--vp-c-text-dark-3);--vp-code-line-diff-add-color: var(--vp-c-green-dimm-2);--vp-code-line-diff-add-symbol-color: var(--vp-c-green);--vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red);--vp-code-line-warning-color: var(--vp-c-yellow-dimm-2);--vp-code-line-error-color: var(--vp-c-red-dimm-2);--vp-code-copy-code-border-color: transparent;--vp-code-copy-code-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-dark-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-bar-color: var(--vp-c-brand)}.dark{--vp-code-block-bg: #161618}:root{--vp-button-brand-border: var(--vp-c-brand-lighter);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-lighter);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-dark);--vp-button-brand-active-border: var(--vp-c-brand-lighter);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-darker);--vp-button-alt-border: var(--vp-c-border);--vp-button-alt-text: var(--vp-c-neutral);--vp-button-alt-bg: var(--vp-c-mute);--vp-button-alt-hover-border: var(--vp-c-border);--vp-button-alt-hover-text: var(--vp-c-neutral);--vp-button-alt-hover-bg: var(--vp-c-mute-dark);--vp-button-alt-active-border: var(--vp-c-border);--vp-button-alt-active-text: var(--vp-c-neutral);--vp-button-alt-active-bg: var(--vp-c-mute-darker);--vp-button-sponsor-border: var(--vp-c-gray-light-3);--vp-button-sponsor-text: var(--vp-c-text-light-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}.dark{--vp-button-sponsor-border: var(--vp-c-gray-dark-1);--vp-button-sponsor-text: var(--vp-c-text-dark-2)}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: var(--vp-c-border);--vp-custom-block-info-text: var(--vp-c-text-2);--vp-custom-block-info-bg: var(--vp-c-bg-soft-up);--vp-custom-block-info-code-bg: var(--vp-c-bg-soft);--vp-custom-block-tip-border: var(--vp-c-green);--vp-custom-block-tip-text: var(--vp-c-green-dark);--vp-custom-block-tip-bg: var(--vp-c-bg-soft-up);--vp-custom-block-tip-code-bg: var(--vp-c-bg-soft);--vp-custom-block-warning-border: var(--vp-c-yellow);--vp-custom-block-warning-text: var(--vp-c-yellow);--vp-custom-block-warning-bg: var(--vp-c-bg-soft-up);--vp-custom-block-warning-code-bg: var(--vp-c-bg-soft);--vp-custom-block-danger-border: var(--vp-c-red);--vp-custom-block-danger-text: var(--vp-c-red);--vp-custom-block-danger-bg: var(--vp-c-bg-soft-up);--vp-custom-block-danger-code-bg: var(--vp-c-bg-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-details-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-hover-border-color: var(--vp-c-gray);--vp-input-switch-bg-color: var(--vp-c-mute)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg)}: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);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: var(--vp-c-border);--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-bg-soft-up);--vp-badge-tip-border: var(--vp-c-green-dark);--vp-badge-tip-text: var(--vp-c-green);--vp-badge-tip-bg: var(--vp-c-green-dimm-1);--vp-badge-warning-border: var(--vp-c-yellow-dark);--vp-badge-warning-text: var(--vp-c-yellow);--vp-badge-warning-bg: var(--vp-c-yellow-dimm-1);--vp-badge-danger-border: var(--vp-c-red-dark);--vp-badge-danger-text: var(--vp-c-red);--vp-badge-danger-bg: var(--vp-c-red-dimm-1)}: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);--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);--vp-local-search-highlight-bg: var(--vp-c-green-lighter);--vp-local-search-highlight-text: var(--vp-c-black)}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}.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.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning 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 code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600}.custom-block a:hover{text-decoration:underline}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden}.vp-code-group .tabs:after{position:absolute;right:0;bottom:0;left:0;height:1px;background-color:var(--vp-code-tab-divider);content:""}@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:absolute;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:10;height:1px;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-]{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{display:block}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{float:left;margin-left:-.87em;padding-right:.23em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;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 p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.vp-doc a:hover{text-decoration:underline}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block a{color:inherit;font-weight:600}.vp-doc .custom-block a:hover{text-decoration:underline}.vp-doc .custom-block code{font-size:var(--vp-custom-block-code-font-size);font-weight:700;color:inherit}.vp-doc .custom-block div[class*=language-]{margin:8px 0}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;color:var(--vp-c-text-code);background-color:var(--vp-c-mute);transition:color .5s,background-color .5s}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc a>code{color:var(--vp-c-brand);transition:color .25s}.vp-doc a:hover>code{color:var(--vp-c-brand-dark)}.vp-doc div[class*=language-]{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-]{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;left:-65px;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;width:64px;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:"Copied"}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-c-text-dark-3);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}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-bg-soft-down)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-775cd04d]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:10px;padding:0 8px;line-height:18px;font-size:12px;font-weight:600;transform:translateY(-2px)}h1 .VPBadge[data-v-775cd04d],h2 .VPBadge[data-v-775cd04d],h3 .VPBadge[data-v-775cd04d],h4 .VPBadge[data-v-775cd04d],h5 .VPBadge[data-v-775cd04d],h6 .VPBadge[data-v-775cd04d]{vertical-align:top}h2 .VPBadge[data-v-775cd04d]{border-radius:11px;line-height:20px}.VPBadge.info[data-v-775cd04d]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-775cd04d]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-775cd04d]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-775cd04d]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPSkipLink[data-v-2d2e5156]{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);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-2d2e5156]:focus{height:auto;width:auto;clip:auto;clip-path:none}.dark .VPSkipLink[data-v-2d2e5156]{color:var(--vp-c-green)}@media (min-width: 1280px){.VPSkipLink[data-v-2d2e5156]{top:14px;left:16px}}.VPBackdrop[data-v-aba4aac2]{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-aba4aac2],.VPBackdrop.fade-leave-to[data-v-aba4aac2]{opacity:0}.VPBackdrop.fade-leave-active[data-v-aba4aac2]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-aba4aac2]{display:none}}html:not(.dark) .VPImage.dark[data-v-21926a76]{display:none}.dark .VPImage.light[data-v-21926a76]{display:none}.title[data-v-e846412e]{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}.title[data-v-e846412e]:hover{opacity:.6}@media (min-width: 960px){.title[data-v-e846412e]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-e846412e]{border-bottom-color:var(--vp-c-divider)}}[data-v-e846412e] .logo{margin-right:8px;height:24px}/*! @docsearch/css 3.5.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.DocSearch{--docsearch-primary-color: var(--vp-c-brand);--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-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 .DocSearch{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-bg-soft-mute);--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:32px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand);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:1px;letter-spacing:-12px;color:transparent}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:var(--vp-meta-key);font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-bg-soft-mute)}.DocSearch-Screen-Icon>svg{margin:auto}.icon[data-v-15014769]{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;fill:var(--vp-c-text-3);transition:fill .25s;flex-shrink:0}.VPNavBarMenuLink[data-v-a55142e6]{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-a55142e6],.VPNavBarMenuLink[data-v-a55142e6]:hover{color:var(--vp-c-brand)}.VPMenuGroup+.VPMenuLink[data-v-d28afc9d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-d28afc9d]{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-d28afc9d]:hover{color:var(--vp-c-brand);background-color:var(--vp-c-bg-elv-mute)}.link.active[data-v-d28afc9d]{color:var(--vp-c-brand)}.VPMenuGroup[data-v-1bddbdf0]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-1bddbdf0]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-1bddbdf0]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-1bddbdf0]{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-14225c89]{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-14225c89] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-14225c89] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-14225c89] .group:last-child{padding-bottom:0}.VPMenu[data-v-14225c89] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-14225c89] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-14225c89] .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-14225c89] .action{padding-left:24px}.VPFlyout[data-v-405aaae9]{position:relative}.VPFlyout[data-v-405aaae9]:hover{color:var(--vp-c-brand);transition:color .25s}.VPFlyout:hover .text[data-v-405aaae9]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-405aaae9]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-405aaae9]{color:var(--vp-c-brand)}.VPFlyout.active:hover .text[data-v-405aaae9]{color:var(--vp-c-brand-dark)}.VPFlyout:hover .menu[data-v-405aaae9],.button[aria-expanded=true]+.menu[data-v-405aaae9]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-405aaae9]{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-405aaae9]{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-405aaae9]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-405aaae9]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-405aaae9]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-405aaae9]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPNavBarMenu[data-v-6d4a3966]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-6d4a3966]{display:flex}}.VPNavBarTranslations[data-v-fd46d125]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-fd46d125]{display:flex;align-items:center}}.title[data-v-fd46d125]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPSwitch[data-v-48d1a158]{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}.VPSwitch[data-v-48d1a158]:hover{border-color:var(--vp-input-hover-border-color)}.check[data-v-48d1a158]{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}.icon[data-v-48d1a158]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-48d1a158] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-48d1a158] svg{fill:var(--vp-c-text-1);transition:opacity .25s}.sun[data-v-cd2add99]{opacity:1}.moon[data-v-cd2add99],.dark .sun[data-v-cd2add99]{opacity:0}.dark .moon[data-v-cd2add99]{opacity:1}.dark .VPSwitchAppearance[data-v-cd2add99] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-5db6483e]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-5db6483e]{display:flex;align-items:center}}.VPSocialLink[data-v-c4402a71]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-c4402a71]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-c4402a71]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-d7bdad6c]{display:flex;flex-wrap:wrap;justify-content:center}.VPNavBarSocialLinks[data-v-f70744fe]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-f70744fe]{display:flex;align-items:center}}.VPNavBarExtra[data-v-3ce128b5]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-3ce128b5]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-3ce128b5]{display:none}}.trans-title[data-v-3ce128b5]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-3ce128b5],.item.social-links[data-v-3ce128b5]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-3ce128b5]{min-width:176px}.appearance-action[data-v-3ce128b5]{margin-right:-2px}.social-links-list[data-v-3ce128b5]{margin:-4px -8px}.VPNavBarHamburger[data-v-1cde4ba9]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-1cde4ba9]{display:none}}.container[data-v-1cde4ba9]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-1cde4ba9]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-1cde4ba9]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-1cde4ba9]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-1cde4ba9]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-1cde4ba9]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-1cde4ba9]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-1cde4ba9],.VPNavBarHamburger.active:hover .middle[data-v-1cde4ba9],.VPNavBarHamburger.active:hover .bottom[data-v-1cde4ba9]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-1cde4ba9],.middle[data-v-1cde4ba9],.bottom[data-v-1cde4ba9]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-1cde4ba9]{top:0;left:0;transform:translate(0)}.middle[data-v-1cde4ba9]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-1cde4ba9]{top:12px;left:0;transform:translate(4px)}.VPNavBar[data-v-c6988a15]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);transition:border-color .5s,background-color .5s;pointer-events:none;white-space:nowrap}.VPNavBar.has-sidebar[data-v-c6988a15]{border-bottom-color:var(--vp-c-gutter)}@media (min-width: 768px){.VPNavBar[data-v-c6988a15]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-c6988a15]{border-bottom-color:transparent;padding:0}.VPNavBar.fill[data-v-c6988a15]:not(.has-sidebar){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-c6988a15]{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-c6988a15],.container>.content[data-v-c6988a15]{pointer-events:none}.container[data-v-c6988a15] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-c6988a15]{max-width:100%}}.title[data-v-c6988a15]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-c6988a15]{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-c6988a15]{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-c6988a15]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-c6988a15]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-c6988a15]{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-c6988a15]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .content-body[data-v-c6988a15],.VPNavBar.fill .content-body[data-v-c6988a15]{position:relative;background-color:var(--vp-nav-bg-color)}}.menu+.translations[data-v-c6988a15]:before,.menu+.appearance[data-v-c6988a15]:before,.menu+.social-links[data-v-c6988a15]:before,.translations+.appearance[data-v-c6988a15]:before,.appearance+.social-links[data-v-c6988a15]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-c6988a15]:before,.translations+.appearance[data-v-c6988a15]:before{margin-right:16px}.appearance+.social-links[data-v-c6988a15]:before{margin-left:16px}.social-links[data-v-c6988a15]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-c6988a15]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-c6988a15]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-c6988a15]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenMenuLink[data-v-938fe13a]{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-938fe13a]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupLink[data-v-b210310e]{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-b210310e]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupSection[data-v-79ee7596]{display:block}.title[data-v-79ee7596]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-0834805b]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-0834805b]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-0834805b]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-0834805b]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-0834805b]{padding-bottom:6px;color:var(--vp-c-brand)}.VPNavScreenMenuGroup.open .button-icon[data-v-0834805b]{transform:rotate(45deg)}.button[data-v-0834805b]{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-0834805b]:hover{color:var(--vp-c-brand)}.button-icon[data-v-0834805b]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-0834805b]:first-child{padding-top:0}.group+.group[data-v-0834805b],.group+.item[data-v-0834805b]{padding-top:4px}.VPNavScreenAppearance[data-v-e7237d4b]{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-e7237d4b]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenTranslations[data-v-23ae19cc]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-23ae19cc]{height:auto}.title[data-v-23ae19cc]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-23ae19cc]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-23ae19cc]{margin-right:8px}.icon.chevron[data-v-23ae19cc]{margin-left:4px}.list[data-v-23ae19cc]{padding:4px 0 0 24px}.link[data-v-23ae19cc]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-f7d0ee9a]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-f7d0ee9a],.VPNavScreen.fade-leave-active[data-v-f7d0ee9a]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-f7d0ee9a],.VPNavScreen.fade-leave-active .container[data-v-f7d0ee9a]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-f7d0ee9a],.VPNavScreen.fade-leave-to[data-v-f7d0ee9a]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-f7d0ee9a],.VPNavScreen.fade-leave-to .container[data-v-f7d0ee9a]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-f7d0ee9a]{display:none}}.container[data-v-f7d0ee9a]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-f7d0ee9a],.menu+.appearance[data-v-f7d0ee9a],.translations+.appearance[data-v-f7d0ee9a]{margin-top:24px}.menu+.social-links[data-v-f7d0ee9a]{margin-top:16px}.appearance+.social-links[data-v-f7d0ee9a]{margin-top:16px}.VPNav[data-v-10c2e836]{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-10c2e836]{position:fixed}}.root[data-v-36b4bfdb]{position:relative;z-index:1}.nested[data-v-36b4bfdb]{padding-left:13px}.outline-link[data-v-36b4bfdb]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:500}.outline-link[data-v-36b4bfdb]:hover,.outline-link.active[data-v-36b4bfdb]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-36b4bfdb]{padding-left:13px}.VPLocalNavOutlineDropdown[data-v-596c6466]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-596c6466]{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-596c6466]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-596c6466]{color:var(--vp-c-text-1)}.icon[data-v-596c6466]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-596c6466] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-596c6466]{transform:rotate(90deg)}.items[data-v-596c6466]{position:absolute;left:20px;right:20px;top:64px;background-color:var(--vp-local-nav-bg-color);padding:4px 10px 16px;border:1px solid var(--vp-c-divider);border-radius:8px;max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.top-link[data-v-596c6466]{display:block;color:var(--vp-c-brand);font-size:13px;font-weight:500;padding:6px 0;margin:0 13px 10px;border-bottom:1px solid var(--vp-c-divider)}.flyout-enter-active[data-v-596c6466]{transition:all .2s ease-out}.flyout-leave-active[data-v-596c6466]{transition:all .15s ease-in}.flyout-enter-from[data-v-596c6466],.flyout-leave-to[data-v-596c6466]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-772b017f]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;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);transition:border-color .5s,background-color .5s}@media (min-width: 960px){.VPLocalNav[data-v-772b017f]{display:none}}.menu[data-v-772b017f]{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-772b017f]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-772b017f]{padding:0 32px}}.menu-icon[data-v-772b017f]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-772b017f]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-772b017f]{padding:12px 32px 11px}}.VPSidebarItem.level-0[data-v-f8e6bbce]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-f8e6bbce]{padding-bottom:10px}.item[data-v-f8e6bbce]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-f8e6bbce]{cursor:pointer}.indicator[data-v-f8e6bbce]{position:absolute;top:6px;bottom:6px;left:-17px;width:1px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-f8e6bbce],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-f8e6bbce],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-f8e6bbce],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-f8e6bbce]{background-color:var(--vp-c-brand)}.link[data-v-f8e6bbce]{display:flex;align-items:center;flex-grow:1}.text[data-v-f8e6bbce]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-f8e6bbce]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-f8e6bbce],.VPSidebarItem.level-2 .text[data-v-f8e6bbce],.VPSidebarItem.level-3 .text[data-v-f8e6bbce],.VPSidebarItem.level-4 .text[data-v-f8e6bbce],.VPSidebarItem.level-5 .text[data-v-f8e6bbce]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-f8e6bbce],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-f8e6bbce]{color:var(--vp-c-brand)}.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-f8e6bbce],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-f8e6bbce]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-f8e6bbce],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-f8e6bbce]{color:var(--vp-c-brand)}.caret[data-v-f8e6bbce]{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}.item:hover .caret[data-v-f8e6bbce]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-f8e6bbce]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-f8e6bbce]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-f8e6bbce]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-f8e6bbce],.VPSidebarItem.level-2 .items[data-v-f8e6bbce],.VPSidebarItem.level-3 .items[data-v-f8e6bbce],.VPSidebarItem.level-4 .items[data-v-f8e6bbce],.VPSidebarItem.level-5 .items[data-v-f8e6bbce]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-f8e6bbce]{display:none}.VPSidebar[data-v-b7ba390f]{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-b7ba390f]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-b7ba390f]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-b7ba390f]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-b7ba390f]{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-b7ba390f]{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-b7ba390f]{outline:0}.group+.group[data-v-b7ba390f]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-b7ba390f]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPButton[data-v-1d13e4c0]{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-1d13e4c0]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1d13e4c0]{border-radius:4px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1d13e4c0]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1d13e4c0]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1d13e4c0]: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-1d13e4c0]: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-1d13e4c0]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1d13e4c0]: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-1d13e4c0]: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-1d13e4c0]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1d13e4c0]: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-1d13e4c0]: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-34de1ea9]{display:none}.dark .VPImage.light[data-v-34de1ea9]{display:none}.VPHero[data-v-d5ff424d]{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) + 42px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 64px 64px}}.container[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0 auto;max-width:1152px}.main[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;align-items:center;z-index:10;flex-shrink:0}.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.name[data-v-d5ff424d]{color:#fff}.clip[data-v-d5ff424d]{background:#fff;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:#fff}@media (min-width: 640px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{line-height:64px;font-size:56px}}.tagline[data-v-d5ff424d]{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)}@media (min-width: 640px){.tagline[data-v-d5ff424d]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-d5ff424d]{line-height:36px;font-size:24px}}.actions[data-v-d5ff424d]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}@media (min-width: 640px){.actions[data-v-d5ff424d]{padding-top:32px}}.action[data-v-d5ff424d]{flex-shrink:0;padding:6px}.image-container[data-v-d5ff424d]{position:relative;margin:0 auto;height:320px}@media (min-width: 640px){.image-container[data-v-d5ff424d]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-d5ff424d]{display:flex;justify-content:center;align-items:center;height:200px}}.image-bg[data-v-d5ff424d]{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-d5ff424d]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-d5ff424d]{width:320px;height:320px}}[data-v-d5ff424d] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-d5ff424d] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-d5ff424d] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-4c7e9883]{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-4c7e9883]:hover{border-color:var(--vp-c-brand);background-color:var(--vp-c-bg-soft-up)}.box[data-v-4c7e9883]{display:flex;flex-direction:column;padding:24px;height:100%}.VPFeature[data-v-4c7e9883] .VPImage{width:48px;height:48px;margin-bottom:20px}.icon[data-v-4c7e9883]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-bg-soft-down);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-4c7e9883]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-4c7e9883]{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-4c7e9883]{padding-top:8px}.link-text-value[data-v-4c7e9883]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.link-text-icon[data-v-4c7e9883]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-50ddc7fc]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-50ddc7fc]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-50ddc7fc]{padding:0 64px}}.container[data-v-50ddc7fc]{margin:0 auto;max-width:1152px}.items[data-v-50ddc7fc]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-50ddc7fc]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-50ddc7fc],.item.grid-4[data-v-50ddc7fc],.item.grid-6[data-v-50ddc7fc]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-50ddc7fc],.item.grid-4[data-v-50ddc7fc]{width:50%}.item.grid-3[data-v-50ddc7fc],.item.grid-6[data-v-50ddc7fc]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-50ddc7fc]{width:25%}}.VPHome[data-v-59138ad7]{padding-bottom:96px}.VPHome[data-v-59138ad7] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-59138ad7]{padding-bottom:128px}}.VPDocAsideOutline[data-v-a28777cb]{display:none}.VPDocAsideOutline.has-outline[data-v-a28777cb]{display:block}.content[data-v-a28777cb]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-a28777cb]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:1px;height:18px;background-color:var(--vp-c-brand);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-a28777cb]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-c111cd2e]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-c111cd2e]{flex-grow:1}.VPDocAside[data-v-c111cd2e] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-c111cd2e] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-c111cd2e] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-ee6f969b]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-ee6f969b]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-89b3d043]{margin-top:64px}.edit-info[data-v-89b3d043]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-89b3d043]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-89b3d043]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.edit-link-button[data-v-89b3d043]:hover{color:var(--vp-c-brand-dark)}.edit-link-icon[data-v-89b3d043]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-89b3d043]{border-top:1px solid var(--vp-c-divider);padding-top:24px}@media (min-width: 640px){.prev-next[data-v-89b3d043]{display:flex}}.pager.has-prev[data-v-89b3d043]{padding-top:8px}@media (min-width: 640px){.pager[data-v-89b3d043]{display:flex;flex-direction:column;flex-shrink:0;width:50%}.pager.has-prev[data-v-89b3d043]{padding-top:0;padding-left:16px}}.pager-link[data-v-89b3d043]{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-89b3d043]:hover{border-color:var(--vp-c-brand)}.pager-link.next[data-v-89b3d043]{margin-left:auto;text-align:right}.desc[data-v-89b3d043]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-89b3d043]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.VPDocOutlineDropdown[data-v-268a60d6]{margin-bottom:42px}.VPDocOutlineDropdown button[data-v-268a60d6]{display:block;font-size:14px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;border:1px solid var(--vp-c-border);padding:4px 12px;border-radius:8px}.VPDocOutlineDropdown button[data-v-268a60d6]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-268a60d6]{color:var(--vp-c-text-1)}.icon[data-v-268a60d6]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-268a60d6] .outline-link{font-size:13px}.open>.icon[data-v-268a60d6]{transform:rotate(90deg)}.items[data-v-268a60d6]{margin-top:10px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-9ca33bd6]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-9ca33bd6]{display:none}@media (min-width: 960px) and (max-width: 1280px){.VPDoc .VPDocOutlineDropdown[data-v-9ca33bd6]{display:block}}@media (min-width: 768px){.VPDoc[data-v-9ca33bd6]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-9ca33bd6]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-9ca33bd6]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-9ca33bd6]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-9ca33bd6]{display:flex;justify-content:center}.VPDoc .aside[data-v-9ca33bd6]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-9ca33bd6]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-9ca33bd6]{max-width:1104px}}.container[data-v-9ca33bd6]{margin:0 auto;width:100%}.aside[data-v-9ca33bd6]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-9ca33bd6]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-9ca33bd6]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-9ca33bd6]::-webkit-scrollbar{display:none}.aside-curtain[data-v-9ca33bd6]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-9ca33bd6]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-9ca33bd6]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-9ca33bd6]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-9ca33bd6]{order:1;margin:0;min-width:640px}}.content-container[data-v-9ca33bd6]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-9ca33bd6]{max-width:688px}.NotFound[data-v-4aaa5124]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-4aaa5124]{padding:96px 32px 168px}}.code[data-v-4aaa5124]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-4aaa5124]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-4aaa5124]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-4aaa5124]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-4aaa5124]{padding-top:20px}.link[data-v-4aaa5124]{display:inline-block;border:1px solid var(--vp-c-brand);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:border-color .25s,color .25s}.link[data-v-4aaa5124]:hover{border-color:var(--vp-c-brand-dark);color:var(--vp-c-brand-dark)}.VPContent[data-v-13c861a7]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-13c861a7]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-13c861a7]{margin:0}@media (min-width: 960px){.VPContent[data-v-13c861a7]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-13c861a7]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-13c861a7]{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-0c8ff5c9]{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-0c8ff5c9]{display:none}@media (min-width: 768px){.VPFooter[data-v-0c8ff5c9]{padding:32px}}.container[data-v-0c8ff5c9]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-0c8ff5c9],.copyright[data-v-0c8ff5c9]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.message[data-v-0c8ff5c9]{order:2}.copyright[data-v-0c8ff5c9]{order:1}.Layout[data-v-600cd4bc]{display:flex;flex-direction:column;min-height:100vh}.VPButton[data-v-79e98743]{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-79e98743]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-79e98743]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-79e98743]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-79e98743]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-79e98743]: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-79e98743]: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-79e98743]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-79e98743]: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-79e98743]: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-79e98743]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-79e98743]: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-79e98743]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}.VPHomeSponsors[data-v-92f672cb]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-92f672cb]{margin:0 auto;max-width:1152px}.love[data-v-92f672cb]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-92f672cb]{width:28px;height:28px;fill:currentColor}.message[data-v-92f672cb]{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-92f672cb]{padding-top:32px}.action[data-v-92f672cb]{padding-top:40px;text-align:center}.VPTeamPage[data-v-da163320]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-da163320]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-da163320-s],.VPTeamMembers+.VPTeamPageSection[data-v-da163320-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-da163320-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-da163320-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-da163320-s],.VPTeamMembers+.VPTeamPageSection[data-v-da163320-s]{margin-top:96px}}.VPTeamMembers[data-v-da163320-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-da163320-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-da163320-s]{padding:0 64px}}.VPTeamPageTitle[data-v-f7951656]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-f7951656]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-f7951656]{padding:80px 64px 48px}}.title[data-v-f7951656]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-f7951656]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-f7951656]{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-f7951656]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-a8e3c2f0]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-a8e3c2f0]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-a8e3c2f0]{padding:0 64px}}.title[data-v-a8e3c2f0]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-a8e3c2f0]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-a8e3c2f0]{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-a8e3c2f0]{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-a8e3c2f0]{padding-top:40px}.VPTeamMembersItem[data-v-b7d9836d]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-b7d9836d]{padding:32px}.VPTeamMembersItem.small .data[data-v-b7d9836d]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-b7d9836d]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-b7d9836d]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-b7d9836d]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-b7d9836d]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-b7d9836d]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-b7d9836d]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-b7d9836d]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-b7d9836d]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-b7d9836d]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-b7d9836d]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-b7d9836d]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-b7d9836d]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-b7d9836d]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-b7d9836d]{text-align:center}.avatar[data-v-b7d9836d]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-b7d9836d]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-b7d9836d]{margin:0;font-weight:600}.affiliation[data-v-b7d9836d]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-b7d9836d]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-b7d9836d]:hover{color:var(--vp-c-brand)}.desc[data-v-b7d9836d]{margin:0 auto}.links[data-v-b7d9836d]{display:flex;justify-content:center;height:56px}.sp-link[data-v-b7d9836d]{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-b7d9836d]:hover,.sp .sp-link.link[data-v-b7d9836d]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-b7d9836d]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-f5dcb5b0]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-f5dcb5b0]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-f5dcb5b0]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-f5dcb5b0]{max-width:876px}.VPTeamMembers.medium .container[data-v-f5dcb5b0]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-f5dcb5b0]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-f5dcb5b0]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-f5dcb5b0]{max-width:760px}.container[data-v-f5dcb5b0]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPFeatures[data-v-0d1d9f22]{position:relative;padding:0 24px;margin-top:32px}@media (min-width: 640px){.VPFeatures[data-v-0d1d9f22]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-0d1d9f22]{padding:0 64px}}.container[data-v-0d1d9f22]{margin:0 auto;max-width:1152px}.fes-home img{height:320px}:root{--vp-c-brand: #5384ff;--vp-button-brand-border: #5384ff;--vp-button-brand-hover-border: #5384ff;--vp-button-brand-hover-bg: #759dff;--vp-local-search-highlight-bg: #7da6ff;--vp-c-brand-light: #747bff}.VPLocalSearchBox[data-v-35dc4a32]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-35dc4a32]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-35dc4a32]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 768px){.shell[data-v-35dc4a32]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-35dc4a32]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 768px){.search-bar[data-v-35dc4a32]{padding:0 8px}}.search-bar[data-v-35dc4a32]:focus-within{border-color:var(--vp-c-brand)}.search-icon[data-v-35dc4a32]{margin:8px}@media (max-width: 768px){.search-icon[data-v-35dc4a32]{display:none}}.search-input[data-v-35dc4a32]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 768px){.search-input[data-v-35dc4a32]{padding:6px 4px}}.search-actions[data-v-35dc4a32]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-35dc4a32]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-35dc4a32]{display:none}}.search-actions button[data-v-35dc4a32]{padding:8px}.search-actions button[data-v-35dc4a32]:hover,.toggle-layout-button.detailed-list[data-v-35dc4a32]{color:var(--vp-c-brand)}.search-keyboard-shortcuts[data-v-35dc4a32]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-35dc4a32]{display:flex;align-items:center;gap:4px}@media (max-width: 768px){.search-keyboard-shortcuts[data-v-35dc4a32]{display:none}}.search-keyboard-shortcuts kbd[data-v-35dc4a32]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-35dc4a32]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-35dc4a32]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border)}.result>div[data-v-35dc4a32]{margin:12px;width:100%;overflow:hidden}@media (max-width: 768px){.result>div[data-v-35dc4a32]{margin:8px}}.titles[data-v-35dc4a32]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-35dc4a32]{display:flex;align-items:center;gap:4px}.title.main[data-v-35dc4a32]{font-weight:500}.title-icon[data-v-35dc4a32]{opacity:.5;font-weight:500;color:var(--vp-c-brand)}.title svg[data-v-35dc4a32]{opacity:.5}.result.selected[data-v-35dc4a32]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-35dc4a32]{position:relative}.excerpt[data-v-35dc4a32]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-35dc4a32]{opacity:1}.excerpt[data-v-35dc4a32] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-35dc4a32] mark,.excerpt[data-v-35dc4a32] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-35dc4a32] .vp-code-group .tabs{display:none}.excerpt[data-v-35dc4a32] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-35dc4a32]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-35dc4a32]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-35dc4a32],.result.selected .title-icon[data-v-35dc4a32]{color:var(--vp-c-brand)!important}.no-results[data-v-35dc4a32]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-35dc4a32]{flex:none}
diff --git a/assets/style.9b2080ed.css b/assets/style.9b2080ed.css
deleted file mode 100644
index 71c715b9c..000000000
--- a/assets/style.9b2080ed.css
+++ /dev/null
@@ -1 +0,0 @@
-@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic.5f2c6c8c.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-cyrillic-ext.e75737ce.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek.d5a6d92a.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-greek-ext.ab0619bc.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin.2ed14f66.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-latin-ext.0030eebd.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url(/fes.js/assets/inter-roman-vietnamese.14ce25a6.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic.ea42a392.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-cyrillic-ext.33bd5a8e.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek.8f4463c4.woff2) format("woff2");unicode-range:U+0370-03FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-greek-ext.4fbe9427.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin.bd3b6f56.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-latin-ext.bd8920cc.woff2) format("woff2");unicode-range:U+0100-024F,U+0259,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter var;font-weight:100 900;font-display:swap;font-style:italic;font-named-instance:"Italic";src:url(/fes.js/assets/inter-italic-vietnamese.6ce511fb.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+1EA0-1EF9,U+20AB}@font-face{font-family:Chinese Quotes;src:local("PingFang SC Regular"),local("PingFang SC"),local("SimHei"),local("Source Han Sans SC");unicode-range:U+2018,U+2019,U+201C,U+201D}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-gray: #8e8e93;--vp-c-text-light-1: rgba(60, 60, 67);--vp-c-text-light-2: rgba(60, 60, 67, .75);--vp-c-text-light-3: rgba(60, 60, 67, .33);--vp-c-text-dark-1: rgba(255, 255, 245, .86);--vp-c-text-dark-2: rgba(235, 235, 245, .6);--vp-c-text-dark-3: rgba(235, 235, 245, .38);--vp-c-green: #10b981;--vp-c-green-light: #34d399;--vp-c-green-lighter: #6ee7b7;--vp-c-green-dark: #059669;--vp-c-green-darker: #047857;--vp-c-green-dimm-1: rgba(16, 185, 129, .05);--vp-c-green-dimm-2: rgba(16, 185, 129, .2);--vp-c-green-dimm-3: rgba(16, 185, 129, .5);--vp-c-yellow: #d97706;--vp-c-yellow-light: #f59e0b;--vp-c-yellow-lighter: #fbbf24;--vp-c-yellow-dark: #b45309;--vp-c-yellow-darker: #92400e;--vp-c-yellow-dimm-1: rgba(234, 179, 8, .05);--vp-c-yellow-dimm-2: rgba(234, 179, 8, .2);--vp-c-yellow-dimm-3: rgba(234, 179, 8, .5);--vp-c-red: #f43f5e;--vp-c-red-light: #fb7185;--vp-c-red-lighter: #fda4af;--vp-c-red-dark: #e11d48;--vp-c-red-darker: #be123c;--vp-c-red-dimm-1: rgba(244, 63, 94, .05);--vp-c-red-dimm-2: rgba(244, 63, 94, .2);--vp-c-red-dimm-3: rgba(244, 63, 94, .5);--vp-c-sponsor: #db2777}:root{--vp-c-bg: #ffffff;--vp-c-bg-elv: #ffffff;--vp-c-bg-elv-up: #ffffff;--vp-c-bg-elv-down: #f6f6f7;--vp-c-bg-elv-mute: #f6f6f7;--vp-c-bg-soft: #f6f6f7;--vp-c-bg-soft-up: #f9f9fa;--vp-c-bg-soft-down: #e3e3e5;--vp-c-bg-soft-mute: #e3e3e5;--vp-c-bg-alt: #f6f6f7;--vp-c-border: rgba(60, 60, 67, .29);--vp-c-divider: rgba(60, 60, 67, .12);--vp-c-gutter: rgba(60, 60, 67, .12);--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white);--vp-c-text-1: var(--vp-c-text-light-1);--vp-c-text-2: var(--vp-c-text-light-2);--vp-c-text-3: var(--vp-c-text-light-3);--vp-c-text-inverse-1: var(--vp-c-text-dark-1);--vp-c-text-inverse-2: var(--vp-c-text-dark-2);--vp-c-text-inverse-3: var(--vp-c-text-dark-3);--vp-c-text-code: #476582;--vp-c-brand: var(--vp-c-green);--vp-c-brand-light: var(--vp-c-green-light);--vp-c-brand-lighter: var(--vp-c-green-lighter);--vp-c-brand-dark: var(--vp-c-green-dark);--vp-c-brand-darker: var(--vp-c-green-darker);--vp-c-mute: #f6f6f7;--vp-c-mute-light: #f9f9fc;--vp-c-mute-lighter: #ffffff;--vp-c-mute-dark: #e3e3e5;--vp-c-mute-darker: #d7d7d9}.dark{--vp-c-bg: #1e1e20;--vp-c-bg-elv: #252529;--vp-c-bg-elv-up: #313136;--vp-c-bg-elv-down: #1e1e20;--vp-c-bg-elv-mute: #313136;--vp-c-bg-soft: #252529;--vp-c-bg-soft-up: #313136;--vp-c-bg-soft-down: #1e1e20;--vp-c-bg-soft-mute: #313136;--vp-c-bg-alt: #161618;--vp-c-border: rgba(82, 82, 89, .68);--vp-c-divider: rgba(82, 82, 89, .32);--vp-c-gutter: #000000;--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black);--vp-c-text-1: var(--vp-c-text-dark-1);--vp-c-text-2: var(--vp-c-text-dark-2);--vp-c-text-3: var(--vp-c-text-dark-3);--vp-c-text-inverse-1: var(--vp-c-text-light-1);--vp-c-text-inverse-2: var(--vp-c-text-light-2);--vp-c-text-inverse-3: var(--vp-c-text-light-3);--vp-c-text-code: #c9def1;--vp-c-mute: #313136;--vp-c-mute-light: #3a3a3c;--vp-c-mute-lighter: #505053;--vp-c-mute-dark: #2c2c30;--vp-c-mute-darker: #252529}:root{--vp-font-family-base: "Chinese Quotes", "Inter var", "Inter", ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Helvetica, Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-local-nav: 10;--vp-z-index-nav: 20;--vp-z-index-layout-top: 30;--vp-z-index-backdrop: 40;--vp-z-index-sidebar: 50;--vp-z-index-footer: 60}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E")}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-block-color: var(--vp-c-text-dark-1);--vp-code-block-bg: #292b30;--vp-code-block-bg-light: #1e1e20;--vp-code-block-divider-color: #000000;--vp-code-line-highlight-color: rgba(0, 0, 0, .5);--vp-code-line-number-color: var(--vp-c-text-dark-3);--vp-code-line-diff-add-color: var(--vp-c-green-dimm-2);--vp-code-line-diff-add-symbol-color: var(--vp-c-green);--vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2);--vp-code-line-diff-remove-symbol-color: var(--vp-c-red);--vp-code-line-warning-color: var(--vp-c-yellow-dimm-2);--vp-code-line-error-color: var(--vp-c-red-dimm-2);--vp-code-copy-code-border-color: transparent;--vp-code-copy-code-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-code-block-bg-light);--vp-code-copy-code-active-text: var(--vp-c-text-dark-2);--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-dark-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-text-color: var(--vp-c-text-dark-1);--vp-code-tab-active-bar-color: var(--vp-c-brand)}.dark{--vp-code-block-bg: #161618}:root{--vp-button-brand-border: var(--vp-c-brand-lighter);--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand);--vp-button-brand-hover-border: var(--vp-c-brand-lighter);--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-dark);--vp-button-brand-active-border: var(--vp-c-brand-lighter);--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-darker);--vp-button-alt-border: var(--vp-c-border);--vp-button-alt-text: var(--vp-c-neutral);--vp-button-alt-bg: var(--vp-c-mute);--vp-button-alt-hover-border: var(--vp-c-border);--vp-button-alt-hover-text: var(--vp-c-neutral);--vp-button-alt-hover-bg: var(--vp-c-mute-dark);--vp-button-alt-active-border: var(--vp-c-border);--vp-button-alt-active-text: var(--vp-c-neutral);--vp-button-alt-active-bg: var(--vp-c-mute-darker);--vp-button-sponsor-border: var(--vp-c-gray-light-3);--vp-button-sponsor-text: var(--vp-c-text-light-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}.dark{--vp-button-sponsor-border: var(--vp-c-gray-dark-1);--vp-button-sponsor-text: var(--vp-c-text-dark-2)}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: var(--vp-c-border);--vp-custom-block-info-text: var(--vp-c-text-2);--vp-custom-block-info-bg: var(--vp-c-bg-soft-up);--vp-custom-block-info-code-bg: var(--vp-c-bg-soft);--vp-custom-block-tip-border: var(--vp-c-green);--vp-custom-block-tip-text: var(--vp-c-green-dark);--vp-custom-block-tip-bg: var(--vp-c-bg-soft-up);--vp-custom-block-tip-code-bg: var(--vp-c-bg-soft);--vp-custom-block-warning-border: var(--vp-c-yellow);--vp-custom-block-warning-text: var(--vp-c-yellow);--vp-custom-block-warning-bg: var(--vp-c-bg-soft-up);--vp-custom-block-warning-code-bg: var(--vp-c-bg-soft);--vp-custom-block-danger-border: var(--vp-c-red);--vp-custom-block-danger-text: var(--vp-c-red);--vp-custom-block-danger-bg: var(--vp-c-bg-soft-up);--vp-custom-block-danger-code-bg: var(--vp-c-bg-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-details-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-hover-border-color: var(--vp-c-gray);--vp-input-switch-bg-color: var(--vp-c-mute)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg)}: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);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: var(--vp-c-border);--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-bg-soft-up);--vp-badge-tip-border: var(--vp-c-green-dark);--vp-badge-tip-text: var(--vp-c-green);--vp-badge-tip-bg: var(--vp-c-green-dimm-1);--vp-badge-warning-border: var(--vp-c-yellow-dark);--vp-badge-warning-text: var(--vp-c-yellow);--vp-badge-warning-bg: var(--vp-c-yellow-dimm-1);--vp-badge-danger-border: var(--vp-c-red-dark);--vp-badge-danger-text: var(--vp-c-red);--vp-badge-danger-bg: var(--vp-c-red-dimm-1)}: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);--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);--vp-local-search-highlight-bg: var(--vp-c-green-lighter);--vp-local-search-highlight-text: var(--vp-c-black)}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);direction:ltr;font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}.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.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning 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 code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600}.custom-block a:hover{text-decoration:underline}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.dark .vp-code-light{display:none}html:not(.dark) .vp-code-dark{display:none}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden}.vp-code-group .tabs:after{position:absolute;right:0;bottom:0;left:0;height:1px;background-color:var(--vp-code-tab-divider);content:""}@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:absolute;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:10;height:1px;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-]{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{display:block}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc .header-anchor{float:left;margin-left:-.87em;padding-right:.23em;font-weight:500;user-select:none;opacity:0;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 p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s}.vp-doc blockquote>p{margin:0;font-size:16px;color:var(--vp-c-text-2);transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand);text-decoration-style:dotted;transition:color .25s}.vp-doc a:hover{text-decoration:underline}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block a{color:inherit;font-weight:600}.vp-doc .custom-block a:hover{text-decoration:underline}.vp-doc .custom-block code{font-size:var(--vp-custom-block-code-font-size);font-weight:700;color:inherit}.vp-doc .custom-block div[class*=language-]{margin:8px 0}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;color:var(--vp-c-text-code);background-color:var(--vp-c-mute);transition:color .5s,background-color .5s}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code{font-size:.9em}.vp-doc a>code{color:var(--vp-c-brand);transition:color .25s}.vp-doc a:hover>code{color:var(--vp-c-brand-dark)}.vp-doc div[class*=language-]{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-]{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;left:-65px;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;width:64px;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:"Copied"}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-c-text-dark-3);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}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin-bottom:4px;text-align:center;letter-spacing:1px;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-bg-soft-down)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge[data-v-cf8efb1e]{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:10px;padding:0 8px;line-height:18px;font-size:12px;font-weight:600;transform:translateY(-2px)}h1 .VPBadge[data-v-cf8efb1e],h2 .VPBadge[data-v-cf8efb1e],h3 .VPBadge[data-v-cf8efb1e],h4 .VPBadge[data-v-cf8efb1e],h5 .VPBadge[data-v-cf8efb1e],h6 .VPBadge[data-v-cf8efb1e]{vertical-align:top}h2 .VPBadge[data-v-cf8efb1e]{border-radius:11px;line-height:20px}.VPBadge.info[data-v-cf8efb1e]{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip[data-v-cf8efb1e]{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning[data-v-cf8efb1e]{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger[data-v-cf8efb1e]{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPSkipLink[data-v-59268664]{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);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-59268664]:focus{height:auto;width:auto;clip:auto;clip-path:none}.dark .VPSkipLink[data-v-59268664]{color:var(--vp-c-green)}@media (min-width: 1280px){.VPSkipLink[data-v-59268664]{top:14px;left:16px}}.VPBackdrop[data-v-c81aff69]{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-c81aff69],.VPBackdrop.fade-leave-to[data-v-c81aff69]{opacity:0}.VPBackdrop.fade-leave-active[data-v-c81aff69]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-c81aff69]{display:none}}html:not(.dark) .VPImage.dark[data-v-74f25ba3]{display:none}.dark .VPImage.light[data-v-74f25ba3]{display:none}.title[data-v-9f409f7c]{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}.title[data-v-9f409f7c]:hover{opacity:.6}@media (min-width: 960px){.title[data-v-9f409f7c]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-9f409f7c]{border-bottom-color:var(--vp-c-divider)}}[data-v-9f409f7c] .logo{margin-right:8px;height:24px}/*! @docsearch/css 3.3.3 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{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{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;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;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;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{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:rgba(0,0,0,.2);transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{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;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{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;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.DocSearch{--docsearch-primary-color: var(--vp-c-brand);--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-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 .DocSearch{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-bg-soft-mute);--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:32px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand);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:1px;letter-spacing:-12px;color:transparent}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:var(--vp-meta-key);font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-bg-soft-mute)}.DocSearch-Screen-Icon>svg{margin:auto}.icon[data-v-83901ecb]{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;fill:var(--vp-c-text-3);transition:fill .25s;flex-shrink:0}.VPNavBarMenuLink[data-v-eff41f9d]{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-eff41f9d],.VPNavBarMenuLink[data-v-eff41f9d]:hover{color:var(--vp-c-brand)}.VPMenuGroup+.VPMenuLink[data-v-5cbd515c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-5cbd515c]{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-5cbd515c]:hover{color:var(--vp-c-brand);background-color:var(--vp-c-bg-elv-mute)}.link.active[data-v-5cbd515c]{color:var(--vp-c-brand)}.VPMenuGroup[data-v-6f7e14e7]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-6f7e14e7]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-6f7e14e7]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-6f7e14e7]{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-2548f0fa]{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-2548f0fa] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-2548f0fa] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-2548f0fa] .group:last-child{padding-bottom:0}.VPMenu[data-v-2548f0fa] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-2548f0fa] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-2548f0fa] .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-2548f0fa] .action{padding-left:24px}.VPFlyout[data-v-66a2feed]{position:relative}.VPFlyout[data-v-66a2feed]:hover{color:var(--vp-c-brand);transition:color .25s}.VPFlyout:hover .text[data-v-66a2feed]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-66a2feed]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-66a2feed]{color:var(--vp-c-brand)}.VPFlyout.active:hover .text[data-v-66a2feed]{color:var(--vp-c-brand-dark)}.VPFlyout:hover .menu[data-v-66a2feed],.button[aria-expanded=true]+.menu[data-v-66a2feed]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-66a2feed]{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-66a2feed]{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-66a2feed]{margin-right:0;width:16px;height:16px;fill:currentColor}.text-icon[data-v-66a2feed]{margin-left:4px;width:14px;height:14px;fill:currentColor}.icon[data-v-66a2feed]{width:20px;height:20px;fill:currentColor;transition:fill .25s}.menu[data-v-66a2feed]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPNavBarMenu[data-v-59f637f9]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-59f637f9]{display:flex}}.VPNavBarTranslations[data-v-f2b2e4b1]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-f2b2e4b1]{display:flex;align-items:center}}.title[data-v-f2b2e4b1]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPSwitch[data-v-5559e67f]{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}.VPSwitch[data-v-5559e67f]:hover{border-color:var(--vp-input-hover-border-color)}.check[data-v-5559e67f]{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}.icon[data-v-5559e67f]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-5559e67f] svg{position:absolute;top:3px;left:3px;width:12px;height:12px;fill:var(--vp-c-text-2)}.dark .icon[data-v-5559e67f] svg{fill:var(--vp-c-text-1);transition:opacity .25s}.sun[data-v-a115155e]{opacity:1}.moon[data-v-a115155e],.dark .sun[data-v-a115155e]{opacity:0}.dark .moon[data-v-a115155e]{opacity:1}.dark .VPSwitchAppearance[data-v-a115155e] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-0f013d30]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-0f013d30]{display:flex;align-items:center}}.VPSocialLink[data-v-5ea6463d]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-5ea6463d]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-5ea6463d]>svg{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-036d02a2]{display:flex;flex-wrap:wrap;justify-content:center}.VPNavBarSocialLinks[data-v-68be864b]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-68be864b]{display:flex;align-items:center}}.VPNavBarExtra[data-v-22c4504f]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-22c4504f]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-22c4504f]{display:none}}.trans-title[data-v-22c4504f]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-22c4504f],.item.social-links[data-v-22c4504f]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-22c4504f]{min-width:176px}.appearance-action[data-v-22c4504f]{margin-right:-2px}.social-links-list[data-v-22c4504f]{margin:-4px -8px}.VPNavBarHamburger[data-v-69d5f97f]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-69d5f97f]{display:none}}.container[data-v-69d5f97f]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-69d5f97f]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-69d5f97f]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-69d5f97f]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-69d5f97f]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-69d5f97f]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-69d5f97f]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-69d5f97f],.VPNavBarHamburger.active:hover .middle[data-v-69d5f97f],.VPNavBarHamburger.active:hover .bottom[data-v-69d5f97f]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-69d5f97f],.middle[data-v-69d5f97f],.bottom[data-v-69d5f97f]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-69d5f97f]{top:0;left:0;transform:translate(0)}.middle[data-v-69d5f97f]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-69d5f97f]{top:12px;left:0;transform:translate(4px)}.VPNavBar[data-v-518cc426]{position:relative;border-bottom:1px solid transparent;padding:0 8px 0 24px;height:var(--vp-nav-height);transition:border-color .5s,background-color .5s;pointer-events:none;white-space:nowrap}.VPNavBar.has-sidebar[data-v-518cc426]{border-bottom-color:var(--vp-c-gutter)}@media (min-width: 768px){.VPNavBar[data-v-518cc426]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar[data-v-518cc426]{border-bottom-color:transparent;padding:0}.VPNavBar.fill[data-v-518cc426]:not(.has-sidebar){border-bottom-color:var(--vp-c-gutter);background-color:var(--vp-nav-bg-color)}}.container[data-v-518cc426]{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-518cc426],.container>.content[data-v-518cc426]{pointer-events:none}.container[data-v-518cc426] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-518cc426]{max-width:100%}}.title[data-v-518cc426]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-518cc426]{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-518cc426]{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-518cc426]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-518cc426]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-518cc426]{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-518cc426]{display:flex;justify-content:flex-end;align-items:center;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .content-body[data-v-518cc426],.VPNavBar.fill .content-body[data-v-518cc426]{position:relative;background-color:var(--vp-nav-bg-color)}}.menu+.translations[data-v-518cc426]:before,.menu+.appearance[data-v-518cc426]:before,.menu+.social-links[data-v-518cc426]:before,.translations+.appearance[data-v-518cc426]:before,.appearance+.social-links[data-v-518cc426]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-518cc426]:before,.translations+.appearance[data-v-518cc426]:before{margin-right:16px}.appearance+.social-links[data-v-518cc426]:before{margin-left:16px}.social-links[data-v-518cc426]{margin-right:-8px}@media (min-width: 960px){.VPNavBar.has-sidebar .curtain[data-v-518cc426]{position:absolute;right:0;bottom:-31px;width:calc(100% - var(--vp-sidebar-width));height:32px}.VPNavBar.has-sidebar .curtain[data-v-518cc426]:before{display:block;width:100%;height:32px;background:linear-gradient(var(--vp-c-bg),transparent 70%);content:""}}@media (min-width: 1440px){.VPNavBar.has-sidebar .curtain[data-v-518cc426]{width:calc(100% - ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)))}}.VPNavScreenMenuLink[data-v-4ffce36c]{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-4ffce36c]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupLink[data-v-c4e17519]{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-c4e17519]:hover{color:var(--vp-c-brand)}.VPNavScreenMenuGroupSection[data-v-4fa89b32]{display:block}.title[data-v-4fa89b32]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-00f16505]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-00f16505]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-00f16505]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-00f16505]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-00f16505]{padding-bottom:6px;color:var(--vp-c-brand)}.VPNavScreenMenuGroup.open .button-icon[data-v-00f16505]{transform:rotate(45deg)}.button[data-v-00f16505]{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-00f16505]:hover{color:var(--vp-c-brand)}.button-icon[data-v-00f16505]{width:14px;height:14px;fill:var(--vp-c-text-2);transition:fill .5s,transform .25s}.group[data-v-00f16505]:first-child{padding-top:0}.group+.group[data-v-00f16505],.group+.item[data-v-00f16505]{padding-top:4px}.VPNavScreenAppearance[data-v-68e1df0b]{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-68e1df0b]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenTranslations[data-v-0143f4b2]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-0143f4b2]{height:auto}.title[data-v-0143f4b2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-0143f4b2]{width:16px;height:16px;fill:currentColor}.icon.lang[data-v-0143f4b2]{margin-right:8px}.icon.chevron[data-v-0143f4b2]{margin-left:4px}.list[data-v-0143f4b2]{padding:4px 0 0 24px}.link[data-v-0143f4b2]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-e795d3c5]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 1px);right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .5s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-e795d3c5],.VPNavScreen.fade-leave-active[data-v-e795d3c5]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-e795d3c5],.VPNavScreen.fade-leave-active .container[data-v-e795d3c5]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-e795d3c5],.VPNavScreen.fade-leave-to[data-v-e795d3c5]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-e795d3c5],.VPNavScreen.fade-leave-to .container[data-v-e795d3c5]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-e795d3c5]{display:none}}.container[data-v-e795d3c5]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-e795d3c5],.menu+.appearance[data-v-e795d3c5],.translations+.appearance[data-v-e795d3c5]{margin-top:24px}.menu+.social-links[data-v-e795d3c5]{margin-top:16px}.appearance+.social-links[data-v-e795d3c5]{margin-top:16px}.VPNav[data-v-31544dc1]{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-31544dc1]{position:fixed}}.root[data-v-9b110da6]{position:relative;z-index:1}.nested[data-v-9b110da6]{padding-left:13px}.outline-link[data-v-9b110da6]{display:block;line-height:28px;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s;font-weight:500}.outline-link[data-v-9b110da6]:hover,.outline-link.active[data-v-9b110da6]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-9b110da6]{padding-left:13px}.VPLocalNavOutlineDropdown[data-v-7fc5e44e]{padding:12px 20px 11px}.VPLocalNavOutlineDropdown button[data-v-7fc5e44e]{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-7fc5e44e]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-7fc5e44e]{color:var(--vp-c-text-1)}.icon[data-v-7fc5e44e]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-7fc5e44e] .outline-link{font-size:14px;padding:2px 0}.open>.icon[data-v-7fc5e44e]{transform:rotate(90deg)}.items[data-v-7fc5e44e]{position:absolute;left:20px;right:20px;top:64px;background-color:var(--vp-local-nav-bg-color);padding:4px 10px 16px;border:1px solid var(--vp-c-divider);border-radius:8px;max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}.top-link[data-v-7fc5e44e]{display:block;color:var(--vp-c-brand);font-size:13px;font-weight:500;padding:6px 0;margin:0 13px 10px;border-bottom:1px solid var(--vp-c-divider)}.flyout-enter-active[data-v-7fc5e44e]{transition:all .2s ease-out}.flyout-leave-active[data-v-7fc5e44e]{transition:all .15s ease-in}.flyout-enter-from[data-v-7fc5e44e],.flyout-leave-to[data-v-7fc5e44e]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-a608b4c2]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);display:flex;justify-content:space-between;align-items:center;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);transition:border-color .5s,background-color .5s}@media (min-width: 960px){.VPLocalNav[data-v-a608b4c2]{display:none}}.menu[data-v-a608b4c2]{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-a608b4c2]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-a608b4c2]{padding:0 32px}}.menu-icon[data-v-a608b4c2]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPOutlineDropdown[data-v-a608b4c2]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-a608b4c2]{padding:12px 32px 11px}}.VPSidebarItem.level-0[data-v-9b2ca4cb]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-9b2ca4cb]{padding-bottom:10px}.item[data-v-9b2ca4cb]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-9b2ca4cb]{cursor:pointer}.indicator[data-v-9b2ca4cb]{position:absolute;top:6px;bottom:6px;left:-17px;width:1px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-9b2ca4cb],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-9b2ca4cb],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-9b2ca4cb],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-9b2ca4cb]{background-color:var(--vp-c-brand)}.link[data-v-9b2ca4cb]{display:flex;align-items:center;flex-grow:1}.text[data-v-9b2ca4cb]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-9b2ca4cb]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-9b2ca4cb],.VPSidebarItem.level-2 .text[data-v-9b2ca4cb],.VPSidebarItem.level-3 .text[data-v-9b2ca4cb],.VPSidebarItem.level-4 .text[data-v-9b2ca4cb],.VPSidebarItem.level-5 .text[data-v-9b2ca4cb]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-9b2ca4cb],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-9b2ca4cb]{color:var(--vp-c-brand)}.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-9b2ca4cb]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-9b2ca4cb],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-9b2ca4cb]{color:var(--vp-c-brand)}.caret[data-v-9b2ca4cb]{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}.item:hover .caret[data-v-9b2ca4cb]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-9b2ca4cb]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-9b2ca4cb]{width:18px;height:18px;fill:currentColor;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-9b2ca4cb]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-9b2ca4cb],.VPSidebarItem.level-2 .items[data-v-9b2ca4cb],.VPSidebarItem.level-3 .items[data-v-9b2ca4cb],.VPSidebarItem.level-4 .items[data-v-9b2ca4cb],.VPSidebarItem.level-5 .items[data-v-9b2ca4cb]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-9b2ca4cb]{display:none}.VPSidebar[data-v-084bed16]{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-084bed16]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-084bed16]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-084bed16]{z-index:1;padding-top:var(--vp-nav-height);padding-bottom:128px;width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-084bed16]{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-084bed16]{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-084bed16]{outline:0}.group+.group[data-v-084bed16]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-084bed16]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPButton[data-v-1d13e4c0]{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-1d13e4c0]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-1d13e4c0]{border-radius:4px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-1d13e4c0]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-1d13e4c0]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-1d13e4c0]: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-1d13e4c0]: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-1d13e4c0]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-1d13e4c0]: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-1d13e4c0]: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-1d13e4c0]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-1d13e4c0]: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-1d13e4c0]: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-34de1ea9]{display:none}.dark .VPImage.light[data-v-34de1ea9]{display:none}.VPHero[data-v-d5ff424d]{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) + 42px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-d5ff424d]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 42px) 64px 64px}}.container[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0 auto;max-width:1152px}.main[data-v-d5ff424d]{position:relative;display:flex;flex-direction:column;align-items:center;z-index:10;flex-shrink:0}.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.name[data-v-d5ff424d]{color:#fff}.clip[data-v-d5ff424d]{background:#fff;-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:#fff}@media (min-width: 640px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-d5ff424d],.text[data-v-d5ff424d]{line-height:64px;font-size:56px}}.tagline[data-v-d5ff424d]{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)}@media (min-width: 640px){.tagline[data-v-d5ff424d]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-d5ff424d]{line-height:36px;font-size:24px}}.actions[data-v-d5ff424d]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}@media (min-width: 640px){.actions[data-v-d5ff424d]{padding-top:32px}}.action[data-v-d5ff424d]{flex-shrink:0;padding:6px}.image-container[data-v-d5ff424d]{position:relative;margin:0 auto;height:320px}@media (min-width: 640px){.image-container[data-v-d5ff424d]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-d5ff424d]{display:flex;justify-content:center;align-items:center;height:200px}}.image-bg[data-v-d5ff424d]{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-d5ff424d]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-d5ff424d]{width:320px;height:320px}}[data-v-d5ff424d] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-d5ff424d] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-d5ff424d] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-4046fee8]{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-4046fee8]:hover{border-color:var(--vp-c-brand);background-color:var(--vp-c-bg-soft-up)}.box[data-v-4046fee8]{display:flex;flex-direction:column;padding:24px;height:100%}.VPFeature[data-v-4046fee8] .VPImage{width:48px;height:48px;margin-bottom:20px}.icon[data-v-4046fee8]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-bg-soft-down);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-4046fee8]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-4046fee8]{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-4046fee8]{padding-top:8px}.link-text-value[data-v-4046fee8]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand)}.link-text-icon[data-v-4046fee8]{display:inline-block;margin-left:6px;width:14px;height:14px;fill:currentColor}.VPFeatures[data-v-53e5a929]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-53e5a929]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-53e5a929]{padding:0 64px}}.container[data-v-53e5a929]{margin:0 auto;max-width:1152px}.items[data-v-53e5a929]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-53e5a929]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-53e5a929],.item.grid-4[data-v-53e5a929],.item.grid-6[data-v-53e5a929]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-53e5a929],.item.grid-4[data-v-53e5a929]{width:50%}.item.grid-3[data-v-53e5a929],.item.grid-6[data-v-53e5a929]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-53e5a929]{width:25%}}.VPHome[data-v-688bb46e]{padding-bottom:96px}.VPHome[data-v-688bb46e] .VPHomeSponsors{margin-top:112px;margin-bottom:-128px}@media (min-width: 768px){.VPHome[data-v-688bb46e]{padding-bottom:128px}}.VPDocAsideOutline[data-v-9849bdbb]{display:none}.VPDocAsideOutline.has-outline[data-v-9849bdbb]{display:block}.content[data-v-9849bdbb]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-9849bdbb]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:1px;height:18px;background-color:var(--vp-c-brand);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-9849bdbb]{letter-spacing:.4px;line-height:28px;font-size:13px;font-weight:600}.VPDocAside[data-v-0bcb2506]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-0bcb2506]{flex-grow:1}.VPDocAside[data-v-0bcb2506] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-0bcb2506] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-0bcb2506] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-551d4203]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-551d4203]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-30350303]{margin-top:64px}.edit-info[data-v-30350303]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-30350303]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-30350303]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.edit-link-button[data-v-30350303]:hover{color:var(--vp-c-brand-dark)}.edit-link-icon[data-v-30350303]{margin-right:8px;width:14px;height:14px;fill:currentColor}.prev-next[data-v-30350303]{border-top:1px solid var(--vp-c-divider);padding-top:24px}@media (min-width: 640px){.prev-next[data-v-30350303]{display:flex}}.pager.has-prev[data-v-30350303]{padding-top:8px}@media (min-width: 640px){.pager[data-v-30350303]{display:flex;flex-direction:column;flex-shrink:0;width:50%}.pager.has-prev[data-v-30350303]{padding-top:0;padding-left:16px}}.pager-link[data-v-30350303]{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-30350303]:hover{border-color:var(--vp-c-brand)}.pager-link.next[data-v-30350303]{margin-left:auto;text-align:right}.desc[data-v-30350303]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-30350303]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:color .25s}.VPDocOutlineDropdown[data-v-24406196]{margin-bottom:42px}.VPDocOutlineDropdown button[data-v-24406196]{display:block;font-size:14px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;border:1px solid var(--vp-c-border);padding:4px 12px;border-radius:8px}.VPDocOutlineDropdown button[data-v-24406196]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPDocOutlineDropdown button.open[data-v-24406196]{color:var(--vp-c-text-1)}.icon[data-v-24406196]{display:inline-block;vertical-align:middle;margin-left:2px;width:14px;height:14px;fill:currentColor}[data-v-24406196] .outline-link{font-size:13px}.open>.icon[data-v-24406196]{transform:rotate(90deg)}.items[data-v-24406196]{margin-top:10px;border-left:1px solid var(--vp-c-divider)}.VPDoc[data-v-6dc480e6]{padding:32px 24px 96px;width:100%}.VPDoc .VPDocOutlineDropdown[data-v-6dc480e6]{display:none}@media (min-width: 960px) and (max-width: 1280px){.VPDoc .VPDocOutlineDropdown[data-v-6dc480e6]{display:block}}@media (min-width: 768px){.VPDoc[data-v-6dc480e6]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-6dc480e6]{padding:32px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-6dc480e6]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-6dc480e6]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-6dc480e6]{display:flex;justify-content:center}.VPDoc .aside[data-v-6dc480e6]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-6dc480e6]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-6dc480e6]{max-width:1104px}}.container[data-v-6dc480e6]{margin:0 auto;width:100%}.aside[data-v-6dc480e6]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-6dc480e6]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-6dc480e6]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 32px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-6dc480e6]::-webkit-scrollbar{display:none}.aside-curtain[data-v-6dc480e6]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-6dc480e6]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 32px));padding-bottom:32px}.content[data-v-6dc480e6]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-6dc480e6]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-6dc480e6]{order:1;margin:0;min-width:640px}}.content-container[data-v-6dc480e6]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-6dc480e6]{max-width:688px}.NotFound[data-v-74f06403]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-74f06403]{padding:96px 32px 168px}}.code[data-v-74f06403]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-74f06403]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-74f06403]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-74f06403]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-74f06403]{padding-top:20px}.link[data-v-74f06403]{display:inline-block;border:1px solid var(--vp-c-brand);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand);transition:border-color .25s,color .25s}.link[data-v-74f06403]:hover{border-color:var(--vp-c-brand-dark);color:var(--vp-c-brand-dark)}.VPContent[data-v-7706de2c]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-7706de2c]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-7706de2c]{margin:0}@media (min-width: 960px){.VPContent[data-v-7706de2c]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-7706de2c]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-7706de2c]{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-3bd6857d]{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-3bd6857d]{display:none}@media (min-width: 768px){.VPFooter[data-v-3bd6857d]{padding:32px}}.container[data-v-3bd6857d]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-3bd6857d],.copyright[data-v-3bd6857d]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.message[data-v-3bd6857d]{order:2}.copyright[data-v-3bd6857d]{order:1}.Layout[data-v-d3edc1d3]{display:flex;flex-direction:column;min-height:100vh}.VPButton[data-v-2413ec49]{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-2413ec49]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-2413ec49]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-2413ec49]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-2413ec49]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-2413ec49]: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-2413ec49]: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-2413ec49]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-2413ec49]: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-2413ec49]: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-2413ec49]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-2413ec49]: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-2413ec49]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}.VPHomeSponsors[data-v-a2f74886]{border-top:1px solid var(--vp-c-gutter);padding:88px 24px 96px;background-color:var(--vp-c-bg)}.container[data-v-a2f74886]{margin:0 auto;max-width:1152px}.love[data-v-a2f74886]{margin:0 auto;width:28px;height:28px;color:var(--vp-c-text-3)}.icon[data-v-a2f74886]{width:28px;height:28px;fill:currentColor}.message[data-v-a2f74886]{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-a2f74886]{padding-top:32px}.action[data-v-a2f74886]{padding-top:40px;text-align:center}.VPTeamPage[data-v-034fbacb]{padding-bottom:96px}@media (min-width: 768px){.VPTeamPage[data-v-034fbacb]{padding-bottom:128px}}.VPTeamPageSection+.VPTeamPageSection[data-v-034fbacb-s],.VPTeamMembers+.VPTeamPageSection[data-v-034fbacb-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-034fbacb-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-034fbacb-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-034fbacb-s],.VPTeamMembers+.VPTeamPageSection[data-v-034fbacb-s]{margin-top:96px}}.VPTeamMembers[data-v-034fbacb-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-034fbacb-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-034fbacb-s]{padding:0 64px}}.VPTeamPageTitle[data-v-e69ac2b6]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-e69ac2b6]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-e69ac2b6]{padding:80px 64px 48px}}.title[data-v-e69ac2b6]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-e69ac2b6]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-e69ac2b6]{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-e69ac2b6]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-c3f1bc3a]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-c3f1bc3a]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-c3f1bc3a]{padding:0 64px}}.title[data-v-c3f1bc3a]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-c3f1bc3a]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-c3f1bc3a]{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-c3f1bc3a]{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-c3f1bc3a]{padding-top:40px}.VPTeamMembersItem[data-v-b6b4375f]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-b6b4375f]{padding:32px}.VPTeamMembersItem.small .data[data-v-b6b4375f]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-b6b4375f]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-b6b4375f]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-b6b4375f]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-b6b4375f]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-b6b4375f]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-b6b4375f]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-b6b4375f]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-b6b4375f]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-b6b4375f]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-b6b4375f]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-b6b4375f]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-b6b4375f]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-b6b4375f]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-b6b4375f]{text-align:center}.avatar[data-v-b6b4375f]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-b6b4375f]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-b6b4375f]{margin:0;font-weight:600}.affiliation[data-v-b6b4375f]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-b6b4375f]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-b6b4375f]:hover{color:var(--vp-c-brand)}.desc[data-v-b6b4375f]{margin:0 auto}.links[data-v-b6b4375f]{display:flex;justify-content:center;height:56px}.sp-link[data-v-b6b4375f]{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-b6b4375f]:hover,.sp .sp-link.link[data-v-b6b4375f]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-b6b4375f]{margin-right:8px;width:16px;height:16px;fill:currentColor}.VPTeamMembers.small .container[data-v-a352b5d3]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-a352b5d3]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-a352b5d3]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-a352b5d3]{max-width:876px}.VPTeamMembers.medium .container[data-v-a352b5d3]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-a352b5d3]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-a352b5d3]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-a352b5d3]{max-width:760px}.container[data-v-a352b5d3]{display:grid;gap:24px;margin:0 auto;max-width:1152px}.VPFeatures[data-v-0d1d9f22]{position:relative;padding:0 24px;margin-top:32px}@media (min-width: 640px){.VPFeatures[data-v-0d1d9f22]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-0d1d9f22]{padding:0 64px}}.container[data-v-0d1d9f22]{margin:0 auto;max-width:1152px}.fes-home img{height:320px}:root{--vp-c-brand: #5384ff;--vp-button-brand-border: #5384ff;--vp-button-brand-hover-border: #5384ff;--vp-button-brand-hover-bg: #759dff;--vp-local-search-highlight-bg: #7da6ff;--vp-c-brand-light: #747bff}.VPLocalSearchBox[data-v-193b2532]{position:fixed;z-index:100;inset:0;display:flex}.backdrop[data-v-193b2532]{position:absolute;inset:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-193b2532]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 768px){.shell[data-v-193b2532]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-193b2532]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 768px){.search-bar[data-v-193b2532]{padding:0 8px}}.search-bar[data-v-193b2532]:focus-within{border-color:var(--vp-c-brand)}.search-icon[data-v-193b2532]{margin:8px}@media (max-width: 768px){.search-icon[data-v-193b2532]{display:none}}.search-input[data-v-193b2532]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 768px){.search-input[data-v-193b2532]{padding:6px 4px}}.search-actions[data-v-193b2532]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-193b2532]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-193b2532]{display:none}}.search-actions button[data-v-193b2532]{padding:8px}.search-actions button[data-v-193b2532]:hover,.toggle-layout-button.detailed-list[data-v-193b2532]{color:var(--vp-c-brand)}.search-keyboard-shortcuts[data-v-193b2532]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-193b2532]{display:flex;align-items:center;gap:4px}@media (max-width: 768px){.search-keyboard-shortcuts[data-v-193b2532]{display:none}}.search-keyboard-shortcuts kbd[data-v-193b2532]{background:rgba(128,128,128,.1);border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-193b2532]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-193b2532]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border)}.result>div[data-v-193b2532]{margin:12px;width:100%;overflow:hidden}@media (max-width: 768px){.result>div[data-v-193b2532]{margin:8px}}.titles[data-v-193b2532]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-193b2532]{display:flex;align-items:center;gap:4px}.title.main[data-v-193b2532]{font-weight:500}.title-icon[data-v-193b2532]{opacity:.5;font-weight:500;color:var(--vp-c-brand)}.title svg[data-v-193b2532]{opacity:.5}.result.selected[data-v-193b2532]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-193b2532]{position:relative}.excerpt[data-v-193b2532]{opacity:75%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;opacity:.5;margin-top:4px}.result.selected .excerpt[data-v-193b2532]{opacity:1}.excerpt[data-v-193b2532] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-193b2532] mark,.excerpt[data-v-193b2532] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-193b2532] .vp-code-group .tabs{display:none}.excerpt[data-v-193b2532] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-193b2532]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-193b2532]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-193b2532],.result.selected .title-icon[data-v-193b2532]{color:var(--vp-c-brand)!important}.no-results[data-v-193b2532]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-193b2532]{flex:none}
diff --git a/guide/builder.html b/guide/builder.html
index 49635e1cb..55cc1b0f7 100644
--- a/guide/builder.html
+++ b/guide/builder.html
@@ -5,18 +5,18 @@
Vite 和 Webpack 双构建 | Fes.js
-
-
+
+
-
-
-
+
+
+
-
-
diff --git a/guide/config.html b/guide/config.html
index 43b7ac48a..13185df4f 100644
--- a/guide/config.html
+++ b/guide/config.html
@@ -5,70 +5,70 @@
编译时配置 | Fes.js
-
-
+
+
-
-
-
+
+
+
-